claudeos-core 1.6.2 → 1.7.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.
- package/CHANGELOG.md +26 -0
- package/README.de.md +655 -653
- package/README.es.md +657 -655
- package/README.fr.md +657 -655
- package/README.hi.md +656 -654
- package/README.ja.md +675 -673
- package/README.ko.md +692 -690
- package/README.md +712 -710
- package/README.ru.md +656 -654
- package/README.vi.md +656 -654
- package/README.zh-CN.md +656 -654
- package/bin/commands/init.js +386 -357
- package/package.json +1 -1
- package/pass-prompts/templates/common/pass3-footer.md +23 -3
- package/pass-prompts/templates/node-vite/pass1.md +117 -0
- package/pass-prompts/templates/node-vite/pass2.md +78 -0
- package/pass-prompts/templates/node-vite/pass3.md +103 -0
- package/plan-installer/domain-grouper.js +75 -73
- package/plan-installer/index.js +129 -126
- package/plan-installer/scanners/scan-frontend.js +264 -254
- package/plan-installer/scanners/scan-node.js +57 -46
- package/plan-installer/scanners/scan-python.js +64 -55
- package/plan-installer/stack-detector.js +466 -454
- package/plan-installer/structure-scanner.js +65 -65
package/README.vi.md
CHANGED
|
@@ -1,654 +1,656 @@
|
|
|
1
|
-
# ClaudeOS-Core
|
|
2
|
-
|
|
3
|
-
**Công cụ duy nhất đọc mã nguồn trước, xác nhận stack và pattern bằng phân tích deterministic, sau đó tạo quy tắc Claude Code phù hợp chính xác với dự án của bạn.**
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
npx claudeos-core init
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
ClaudeOS-Core đọc codebase của bạn, trích xuất mọi pattern tìm thấy và tạo ra bộ Standards, Rules, Skills và Guides hoàn chỉnh được tùy chỉnh cho _dự án của bạn_. Sau đó, khi bạn nói với Claude Code "Tạo CRUD cho đơn hàng", nó sẽ tạo ra code khớp chính xác với các pattern hiện có của bạn.
|
|
10
|
-
|
|
11
|
-
[🇺🇸 English](./README.md) · [🇰🇷 한국어](./README.ko.md) · [🇨🇳 中文](./README.zh-CN.md) · [🇯🇵 日本語](./README.ja.md) · [🇪🇸 Español](./README.es.md) · [🇮🇳 हिन्दी](./README.hi.md) · [🇷🇺 Русский](./README.ru.md) · [🇫🇷 Français](./README.fr.md) · [🇩🇪 Deutsch](./README.de.md)
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Tại sao ClaudeOS-Core?
|
|
16
|
-
|
|
17
|
-
> Con người mô tả dự án → LLM tạo tài liệu
|
|
18
|
-
|
|
19
|
-
ClaudeOS-Core:
|
|
20
|
-
|
|
21
|
-
> Code phân tích source → Code xây dựng prompt tùy chỉnh → LLM tạo tài liệu → Code xác minh đầu ra
|
|
22
|
-
|
|
23
|
-
### Vấn đề cốt lõi: LLM đoán. Code xác nhận.
|
|
24
|
-
|
|
25
|
-
Khi bạn yêu cầu Claude "phân tích dự án này", nó **đoán** stack, ORM, cấu trúc domain.
|
|
26
|
-
|
|
27
|
-
**ClaudeOS-Core không đoán.** Claude Node.js:
|
|
28
|
-
|
|
29
|
-
- `build.gradle` / `package.json` / `pyproject.toml` → **confirmed**
|
|
30
|
-
- directory scan → **confirmed**
|
|
31
|
-
- Java 5 patterns, Kotlin CQRS/BFF, Next.js App Router/FSD → **classified**
|
|
32
|
-
- domain groups → **split**
|
|
33
|
-
- stack-specific prompt → **assembled**
|
|
34
|
-
|
|
35
|
-
### Kết quả
|
|
36
|
-
|
|
37
|
-
Các tool khác tạo tài liệu "tốt một cách chung chung".
|
|
38
|
-
ClaudeOS-Core tạo tài liệu biết rằng dự án sử dụng `ApiResponse.ok()` (không phải `ResponseEntity.success()`), MyBatis XML mapper nằm ở `src/main/resources/mybatis/mappers/` — vì nó đã đọc code thực tế.
|
|
39
|
-
|
|
40
|
-
### Before & After
|
|
41
|
-
|
|
42
|
-
**Không có ClaudeOS-Core**:
|
|
43
|
-
```
|
|
44
|
-
❌ JPA repository (MyBatis)
|
|
45
|
-
❌ ResponseEntity.success() (ApiResponse.ok())
|
|
46
|
-
❌ order/controller/ (controller/order/)
|
|
47
|
-
→ 20 min fix per file
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**Có ClaudeOS-Core**:
|
|
51
|
-
```
|
|
52
|
-
✅ MyBatis mapper + XML (build.gradle)
|
|
53
|
-
✅ ApiResponse.ok() (source code)
|
|
54
|
-
✅ controller/order/ (Pattern A)
|
|
55
|
-
→ immediate match
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Sự khác biệt này tích lũy. 10 task/ngày × 20 phút tiết kiệm = **hơn 3 giờ/ngày**.
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## Stack Được Hỗ Trợ
|
|
63
|
-
|
|
64
|
-
| Stack | Phát Hiện | Độ Sâu Phân Tích |
|
|
65
|
-
|---|---|---|
|
|
66
|
-
| **Java / Spring Boot** | `build.gradle`, `pom.xml`, 5 package patterns | 10 danh mục, 59 mục con |
|
|
67
|
-
| **Kotlin / Spring Boot** | `build.gradle.kts`, kotlin plugin, `settings.gradle.kts`, CQRS/BFF auto-detect | 12 danh mục, 95 mục con |
|
|
68
|
-
| **Node.js / Express** | `package.json` | 9 danh mục, 57 mục con |
|
|
69
|
-
| **Node.js / NestJS** | `package.json` (`@nestjs/core`) | 10 danh mục, 68 mục con |
|
|
70
|
-
| **Next.js / React** | `package.json`, `next.config.*`, hỗ trợ FSD | 9 danh mục, 55 mục con |
|
|
71
|
-
| **Vue / Nuxt** | `package.json`, `nuxt.config.*`, Composition API | 9 danh mục, 58 mục con |
|
|
72
|
-
| **Python / Django** | `requirements.txt`, `pyproject.toml` | 10 danh mục, 55 mục con |
|
|
73
|
-
| **Python / FastAPI** | `requirements.txt`, `pyproject.toml` | 10 danh mục, 58 mục con |
|
|
74
|
-
| **Node.js / Fastify** | `package.json` | 10 danh mục, 62 mục con |
|
|
75
|
-
| **
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
|
88
|
-
|
|
|
89
|
-
|
|
|
90
|
-
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
|
103
|
-
|
|
|
104
|
-
|
|
|
105
|
-
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
- **
|
|
113
|
-
- **
|
|
114
|
-
- **
|
|
115
|
-
- **
|
|
116
|
-
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
npx claudeos-core init --lang
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
Chỉ
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
- `
|
|
227
|
-
- `
|
|
228
|
-
- `
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
node claudeos-core-tools/
|
|
285
|
-
node claudeos-core-tools/
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
"
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
├── [
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
│ ├──
|
|
322
|
-
│
|
|
323
|
-
│
|
|
324
|
-
|
|
325
|
-
│
|
|
326
|
-
|
|
327
|
-
│
|
|
328
|
-
|
|
329
|
-
│
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
│
|
|
333
|
-
|
|
334
|
-
└──
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
**Pass
|
|
342
|
-
|
|
343
|
-
**Pass
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
│
|
|
354
|
-
├── .
|
|
355
|
-
│
|
|
356
|
-
|
|
357
|
-
│
|
|
358
|
-
│ ├──
|
|
359
|
-
│ ├──
|
|
360
|
-
│ ├──
|
|
361
|
-
│
|
|
362
|
-
│
|
|
363
|
-
|
|
364
|
-
│
|
|
365
|
-
|
|
366
|
-
│ ├──
|
|
367
|
-
│ ├──
|
|
368
|
-
│ ├──
|
|
369
|
-
│ ├──
|
|
370
|
-
│
|
|
371
|
-
│
|
|
372
|
-
└──
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
|
384
|
-
|
|
385
|
-
|
|
|
386
|
-
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
npx claudeos-core
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
|
409
|
-
|
|
410
|
-
| **
|
|
411
|
-
| **
|
|
412
|
-
| **
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
|
425
|
-
|
|
426
|
-
|
|
|
427
|
-
| `.claude/rules/
|
|
428
|
-
| `.claude/rules/
|
|
429
|
-
| `.claude/rules/
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
`
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
|
447
|
-
|
|
448
|
-
| `claudeos-core/
|
|
449
|
-
| `claudeos-core/
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
"
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
#
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
|
496
|
-
|
|
497
|
-
| **
|
|
498
|
-
| **
|
|
499
|
-
| **
|
|
500
|
-
| **
|
|
501
|
-
| **
|
|
502
|
-
| **
|
|
503
|
-
| **
|
|
504
|
-
| **
|
|
505
|
-
| **
|
|
506
|
-
| **
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
├──
|
|
562
|
-
├──
|
|
563
|
-
├──
|
|
564
|
-
├── node-
|
|
565
|
-
├── node-
|
|
566
|
-
├──
|
|
567
|
-
├──
|
|
568
|
-
├──
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
- `
|
|
584
|
-
- `
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
- Dependency từ `
|
|
597
|
-
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
- `
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
│
|
|
611
|
-
│
|
|
612
|
-
│
|
|
613
|
-
│
|
|
614
|
-
├──
|
|
615
|
-
│
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
**"
|
|
627
|
-
|
|
628
|
-
**"
|
|
629
|
-
|
|
630
|
-
**
|
|
631
|
-
|
|
632
|
-
**
|
|
633
|
-
|
|
634
|
-
**"
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
1
|
+
# ClaudeOS-Core
|
|
2
|
+
|
|
3
|
+
**Công cụ duy nhất đọc mã nguồn trước, xác nhận stack và pattern bằng phân tích deterministic, sau đó tạo quy tắc Claude Code phù hợp chính xác với dự án của bạn.**
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx claudeos-core init
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
ClaudeOS-Core đọc codebase của bạn, trích xuất mọi pattern tìm thấy và tạo ra bộ Standards, Rules, Skills và Guides hoàn chỉnh được tùy chỉnh cho _dự án của bạn_. Sau đó, khi bạn nói với Claude Code "Tạo CRUD cho đơn hàng", nó sẽ tạo ra code khớp chính xác với các pattern hiện có của bạn.
|
|
10
|
+
|
|
11
|
+
[🇺🇸 English](./README.md) · [🇰🇷 한국어](./README.ko.md) · [🇨🇳 中文](./README.zh-CN.md) · [🇯🇵 日本語](./README.ja.md) · [🇪🇸 Español](./README.es.md) · [🇮🇳 हिन्दी](./README.hi.md) · [🇷🇺 Русский](./README.ru.md) · [🇫🇷 Français](./README.fr.md) · [🇩🇪 Deutsch](./README.de.md)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Tại sao ClaudeOS-Core?
|
|
16
|
+
|
|
17
|
+
> Con người mô tả dự án → LLM tạo tài liệu
|
|
18
|
+
|
|
19
|
+
ClaudeOS-Core:
|
|
20
|
+
|
|
21
|
+
> Code phân tích source → Code xây dựng prompt tùy chỉnh → LLM tạo tài liệu → Code xác minh đầu ra
|
|
22
|
+
|
|
23
|
+
### Vấn đề cốt lõi: LLM đoán. Code xác nhận.
|
|
24
|
+
|
|
25
|
+
Khi bạn yêu cầu Claude "phân tích dự án này", nó **đoán** stack, ORM, cấu trúc domain.
|
|
26
|
+
|
|
27
|
+
**ClaudeOS-Core không đoán.** Claude Node.js:
|
|
28
|
+
|
|
29
|
+
- `build.gradle` / `package.json` / `pyproject.toml` → **confirmed**
|
|
30
|
+
- directory scan → **confirmed**
|
|
31
|
+
- Java 5 patterns, Kotlin CQRS/BFF, Next.js App Router/FSD → **classified**
|
|
32
|
+
- domain groups → **split**
|
|
33
|
+
- stack-specific prompt → **assembled**
|
|
34
|
+
|
|
35
|
+
### Kết quả
|
|
36
|
+
|
|
37
|
+
Các tool khác tạo tài liệu "tốt một cách chung chung".
|
|
38
|
+
ClaudeOS-Core tạo tài liệu biết rằng dự án sử dụng `ApiResponse.ok()` (không phải `ResponseEntity.success()`), MyBatis XML mapper nằm ở `src/main/resources/mybatis/mappers/` — vì nó đã đọc code thực tế.
|
|
39
|
+
|
|
40
|
+
### Before & After
|
|
41
|
+
|
|
42
|
+
**Không có ClaudeOS-Core**:
|
|
43
|
+
```
|
|
44
|
+
❌ JPA repository (MyBatis)
|
|
45
|
+
❌ ResponseEntity.success() (ApiResponse.ok())
|
|
46
|
+
❌ order/controller/ (controller/order/)
|
|
47
|
+
→ 20 min fix per file
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Có ClaudeOS-Core**:
|
|
51
|
+
```
|
|
52
|
+
✅ MyBatis mapper + XML (build.gradle)
|
|
53
|
+
✅ ApiResponse.ok() (source code)
|
|
54
|
+
✅ controller/order/ (Pattern A)
|
|
55
|
+
→ immediate match
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Sự khác biệt này tích lũy. 10 task/ngày × 20 phút tiết kiệm = **hơn 3 giờ/ngày**.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Stack Được Hỗ Trợ
|
|
63
|
+
|
|
64
|
+
| Stack | Phát Hiện | Độ Sâu Phân Tích |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| **Java / Spring Boot** | `build.gradle`, `pom.xml`, 5 package patterns | 10 danh mục, 59 mục con |
|
|
67
|
+
| **Kotlin / Spring Boot** | `build.gradle.kts`, kotlin plugin, `settings.gradle.kts`, CQRS/BFF auto-detect | 12 danh mục, 95 mục con |
|
|
68
|
+
| **Node.js / Express** | `package.json` | 9 danh mục, 57 mục con |
|
|
69
|
+
| **Node.js / NestJS** | `package.json` (`@nestjs/core`) | 10 danh mục, 68 mục con |
|
|
70
|
+
| **Next.js / React** | `package.json`, `next.config.*`, hỗ trợ FSD | 9 danh mục, 55 mục con |
|
|
71
|
+
| **Vue / Nuxt** | `package.json`, `nuxt.config.*`, Composition API | 9 danh mục, 58 mục con |
|
|
72
|
+
| **Python / Django** | `requirements.txt`, `pyproject.toml` | 10 danh mục, 55 mục con |
|
|
73
|
+
| **Python / FastAPI** | `requirements.txt`, `pyproject.toml` | 10 danh mục, 58 mục con |
|
|
74
|
+
| **Node.js / Fastify** | `package.json` | 10 danh mục, 62 mục con |
|
|
75
|
+
| **Vite / React SPA** | `package.json`, `vite.config.*` | 9 danh mục, 55 mục con |
|
|
76
|
+
| **Angular** | `package.json`, `angular.json` | 12 danh mục, 78 mục con |
|
|
77
|
+
|
|
78
|
+
Tự động phát hiện: ngôn ngữ & phiên bản, framework & phiên bản (bao gồm Vite như SPA framework), ORM (MyBatis, JPA, Exposed, Prisma, TypeORM, SQLAlchemy, v.v.), database (PostgreSQL, MySQL, Oracle, MongoDB, SQLite), package manager (Gradle, Maven, npm, yarn, pnpm, pip, poetry), kiến trúc (CQRS, BFF — phát hiện từ tên module), cấu trúc multi-module (từ settings.gradle), monorepo (Turborepo, pnpm-workspace, Lerna, npm/yarn workspaces).
|
|
79
|
+
|
|
80
|
+
**Bạn không cần chỉ định gì cả. Tất cả được phát hiện tự động.**
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
### Phát Hiện Domain Java (5 pattern với fallback)
|
|
84
|
+
|
|
85
|
+
| Ưu tiên | Pattern | Cấu trúc | Ví dụ |
|
|
86
|
+
|---|---|---|---|
|
|
87
|
+
| A | Layer trước | `controller/{domain}/` | `controller/user/UserController.java` |
|
|
88
|
+
| B | Domain trước | `{domain}/controller/` | `user/controller/UserController.java` |
|
|
89
|
+
| D | Module prefix | `{module}/{domain}/controller/` | `front/member/controller/MemberController.java` |
|
|
90
|
+
| E | DDD/Hexagonal | `{domain}/adapter/in/web/` | `user/adapter/in/web/UserController.java` |
|
|
91
|
+
| C | Phẳng | `controller/*.java` | `controller/UserController.java` → trích `user` từ tên class |
|
|
92
|
+
|
|
93
|
+
Các domain chỉ có service (không có controller) cũng được phát hiện qua thư mục `service/`, `dao/`, `aggregator/`, `facade/`, `usecase/`, `orchestrator/`, `mapper/`, `repository/`. Bỏ qua: `common`, `config`, `util`, `core`, `front`, `admin`, `v1`, `v2`, v.v.
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
### Phát Hiện Domain Kotlin Multi-Module
|
|
97
|
+
|
|
98
|
+
Dành cho dự án Kotlin với cấu trúc Gradle multi-module (ví dụ: CQRS monorepo):
|
|
99
|
+
|
|
100
|
+
| Bước | Hành Động | Ví Dụ |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| 1 | Quét `settings.gradle.kts` tìm `include()` | Tìm thấy 14 module |
|
|
103
|
+
| 2 | Phát hiện loại module từ tên | `reservation-command-server` → type: `command` |
|
|
104
|
+
| 3 | Trích xuất domain từ tên module | `reservation-command-server` → domain: `reservation` |
|
|
105
|
+
| 4 | Nhóm cùng domain qua các module | `reservation-command-server` + `common-query-server` → 1 domain |
|
|
106
|
+
| 5 | Phát hiện kiến trúc | Có module `command` + `query` → CQRS |
|
|
107
|
+
|
|
108
|
+
Loại module hỗ trợ: `command`, `query`, `bff`, `integration`, `standalone`, `library`. Thư viện chia sẻ (`shared-lib`, `integration-lib`) được phát hiện như domain đặc biệt.
|
|
109
|
+
|
|
110
|
+
### Phát Hiện Domain Frontend
|
|
111
|
+
|
|
112
|
+
- **App Router**: `app/{domain}/page.tsx` (Next.js)
|
|
113
|
+
- **Pages Router**: `pages/{domain}/index.tsx`
|
|
114
|
+
- **FSD (Feature-Sliced Design)**: `features/*/`, `widgets/*/`, `entities/*/`
|
|
115
|
+
- **RSC/Client split**: Phát hiện pattern `client.tsx`, theo dõi tách Server/Client
|
|
116
|
+
- **Đường dẫn lồng nhau không chuẩn**: Phát hiện pages, components và FSD layers dưới `src/*/pages/`, `src/*/components/`, `src/*/features/` (ví dụ: `src/admin/pages/dashboard/`)
|
|
117
|
+
- **Config fallback**: Phát hiện Next.js/Vite/Nuxt từ file config (hỗ trợ monorepo)
|
|
118
|
+
- **Fallback thư mục sâu**: Với dự án React/CRA/Vite/Vue/RN, quét `**/components/*/`, `**/views/*/`, `**/screens/*/`, `**/containers/*/`, `**/pages/*/`, `**/routes/*/`, `**/modules/*/`, `**/domains/*/` ở mọi độ sâu
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Bắt Đầu Nhanh
|
|
123
|
+
|
|
124
|
+
### Yêu Cầu
|
|
125
|
+
|
|
126
|
+
- **Node.js** v18+
|
|
127
|
+
- **Claude Code CLI** (đã cài đặt & xác thực)
|
|
128
|
+
|
|
129
|
+
### Cài Đặt
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
cd /your/project/root
|
|
133
|
+
|
|
134
|
+
# Cách A: npx (khuyến nghị — không cần cài đặt)
|
|
135
|
+
npx claudeos-core init
|
|
136
|
+
|
|
137
|
+
# Cách B: cài đặt global
|
|
138
|
+
npm install -g claudeos-core
|
|
139
|
+
claudeos-core init
|
|
140
|
+
|
|
141
|
+
# Cách C: devDependency của dự án
|
|
142
|
+
npm install --save-dev claudeos-core
|
|
143
|
+
npx claudeos-core init
|
|
144
|
+
|
|
145
|
+
# Cách D: git clone (cho phát triển/đóng góp)
|
|
146
|
+
git clone https://github.com/claudeos-core/claudeos-core.git claudeos-core-tools
|
|
147
|
+
|
|
148
|
+
# Đa nền tảng (PowerShell, CMD, Bash, Zsh — mọi terminal)
|
|
149
|
+
node claudeos-core-tools/bin/cli.js init
|
|
150
|
+
|
|
151
|
+
# Chỉ Linux/macOS (chỉ Bash)
|
|
152
|
+
bash claudeos-core-tools/bootstrap.sh
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Ngôn ngữ đầu ra (10 ngôn ngữ)
|
|
156
|
+
|
|
157
|
+
Khi chạy `init` không có `--lang`, bộ chọn tương tác bằng phím mũi tên hoặc phím số sẽ xuất hiện:
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
╔══════════════════════════════════════════════════╗
|
|
161
|
+
║ Select generated document language (required) ║
|
|
162
|
+
╚══════════════════════════════════════════════════╝
|
|
163
|
+
|
|
164
|
+
Các file được tạo (CLAUDE.md, Standards, Rules,
|
|
165
|
+
Skills, Guides) sẽ được viết bằng tiếng Việt.
|
|
166
|
+
|
|
167
|
+
1. en — English
|
|
168
|
+
...
|
|
169
|
+
❯ 6. vi — Tiếng Việt (Vietnamese)
|
|
170
|
+
...
|
|
171
|
+
|
|
172
|
+
↑↓ Move 1-0 Jump Enter Select ESC Cancel
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Mô tả thay đổi sang ngôn ngữ tương ứng khi di chuyển. Bỏ qua bộ chọn:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
npx claudeos-core init --lang vi # Tiếng Việt
|
|
179
|
+
npx claudeos-core init --lang en # English
|
|
180
|
+
npx claudeos-core init --lang ko # 한국어
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
> **Lưu ý:** Chỉ thay đổi ngôn ngữ của file tài liệu được tạo. Phân tích mã (Pass 1–2) luôn chạy bằng tiếng Anh; chỉ kết quả tạo (Pass 3) được viết bằng ngôn ngữ đã chọn.
|
|
184
|
+
|
|
185
|
+
Chỉ vậy thôi. Sau 5–18 phút, tất cả tài liệu được tạo và sẵn sàng sử dụng. CLI hiển thị thanh tiến trình với phần trăm, thời gian đã trôi và thời gian còn lại ước tính cho mỗi Pass.
|
|
186
|
+
|
|
187
|
+
### Cài Đặt Thủ Công Từng Bước
|
|
188
|
+
|
|
189
|
+
Nếu bạn muốn kiểm soát hoàn toàn từng giai đoạn — hoặc nếu pipeline tự động thất bại ở bước nào đó — bạn có thể chạy từng bước thủ công. Điều này cũng hữu ích để hiểu cách ClaudeOS-Core hoạt động bên trong.
|
|
190
|
+
|
|
191
|
+
#### Step 1: Clone và cài đặt dependencies
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
cd /your/project/root
|
|
195
|
+
|
|
196
|
+
git clone https://github.com/claudeos-core/claudeos-core.git claudeos-core-tools
|
|
197
|
+
cd claudeos-core-tools && npm install && cd ..
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
#### Step 2: Tạo cấu trúc thư mục
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# Rules
|
|
204
|
+
mkdir -p .claude/rules/{00.core,10.backend,20.frontend,30.security-db,40.infra,50.sync}
|
|
205
|
+
|
|
206
|
+
# Standards
|
|
207
|
+
mkdir -p claudeos-core/standard/{00.core,10.backend-api,20.frontend-ui,30.security-db,40.infra,50.verification,90.optional}
|
|
208
|
+
|
|
209
|
+
# Skills
|
|
210
|
+
mkdir -p claudeos-core/skills/{00.shared,10.backend-crud/scaffold-crud-feature,20.frontend-page/scaffold-page-feature,50.testing,90.experimental}
|
|
211
|
+
|
|
212
|
+
# Guide, Plan, Database, MCP, Generated
|
|
213
|
+
mkdir -p claudeos-core/guide/{01.onboarding,02.usage,03.troubleshooting,04.architecture}
|
|
214
|
+
mkdir -p claudeos-core/{plan,database,mcp-guide,generated}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
#### Step 3: Chạy plan-installer (phân tích dự án)
|
|
218
|
+
|
|
219
|
+
Quét dự án, phát hiện stack, tìm domain, chia nhóm và tạo prompt.
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
node claudeos-core-tools/plan-installer/index.js
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Đầu ra (`claudeos-core/generated/`):**
|
|
226
|
+
- `project-analysis.json` — stack phát hiện, domain, thông tin frontend
|
|
227
|
+
- `domain-groups.json` — nhóm domain cho Pass 1
|
|
228
|
+
- `pass1-backend-prompt.md` / `pass1-frontend-prompt.md` — prompt phân tích
|
|
229
|
+
- `pass2-prompt.md` — prompt hợp nhất
|
|
230
|
+
- `pass3-prompt.md` — prompt tạo
|
|
231
|
+
|
|
232
|
+
Bạn có thể kiểm tra các file này để xác minh độ chính xác phát hiện trước khi tiếp tục.
|
|
233
|
+
|
|
234
|
+
#### Step 4: Pass 1 — Phân tích code sâu theo nhóm domain
|
|
235
|
+
|
|
236
|
+
Chạy Pass 1 cho mỗi nhóm domain. Kiểm tra `domain-groups.json` để biết số nhóm.
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
# Check groups
|
|
240
|
+
cat claudeos-core/generated/domain-groups.json | node -e "
|
|
241
|
+
const g = JSON.parse(require('fs').readFileSync('/dev/stdin','utf-8'));
|
|
242
|
+
g.groups.forEach((g,i) => console.log('Group '+(i+1)+': ['+g.domains.join(', ')+'] ('+g.type+', ~'+g.estimatedFiles+' files)'));
|
|
243
|
+
"
|
|
244
|
+
|
|
245
|
+
# Run Pass 1 for group 1:
|
|
246
|
+
cp claudeos-core/generated/pass1-backend-prompt.md /tmp/_pass1.md
|
|
247
|
+
DOMAIN_LIST="user, order, product" PASS_NUM=1 \
|
|
248
|
+
perl -pi -e 's/\{\{DOMAIN_GROUP\}\}/$ENV{DOMAIN_LIST}/g; s/\{\{PASS_NUM\}\}/$ENV{PASS_NUM}/g' /tmp/_pass1.md
|
|
249
|
+
cat /tmp/_pass1.md | claude -p --dangerously-skip-permissions
|
|
250
|
+
|
|
251
|
+
# Đối với nhóm frontend, sử dụng pass1-frontend-prompt.md
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**Xác minh:** `ls claudeos-core/generated/pass1-*.json` phải hiển thị một JSON cho mỗi nhóm.
|
|
255
|
+
|
|
256
|
+
#### Step 5: Pass 2 — Hợp nhất kết quả phân tích
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
cat claudeos-core/generated/pass2-prompt.md \
|
|
260
|
+
| claude -p --dangerously-skip-permissions
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
**Xác minh:** `claudeos-core/generated/pass2-merged.json` phải tồn tại với 9+ key cấp cao nhất.
|
|
264
|
+
|
|
265
|
+
#### Step 6: Pass 3 — Tạo tất cả tài liệu
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
cat claudeos-core/generated/pass3-prompt.md \
|
|
269
|
+
| claude -p --dangerously-skip-permissions
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Xác minh:** `CLAUDE.md` phải tồn tại ở thư mục gốc dự án.
|
|
273
|
+
|
|
274
|
+
#### Step 7: Chạy công cụ xác thực
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
# Tạo metadata (bắt buộc trước các kiểm tra khác)
|
|
278
|
+
node claudeos-core-tools/manifest-generator/index.js
|
|
279
|
+
|
|
280
|
+
# Chạy tất cả kiểm tra
|
|
281
|
+
node claudeos-core-tools/health-checker/index.js
|
|
282
|
+
|
|
283
|
+
# Hoặc chạy kiểm tra riêng lẻ:
|
|
284
|
+
node claudeos-core-tools/plan-validator/index.js --check # Plan ↔ disk
|
|
285
|
+
node claudeos-core-tools/sync-checker/index.js # Sync status
|
|
286
|
+
node claudeos-core-tools/content-validator/index.js # Content quality
|
|
287
|
+
node claudeos-core-tools/pass-json-validator/index.js # JSON format
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
#### Step 8: Xác minh kết quả
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
find .claude claudeos-core -type f | grep -v node_modules | grep -v '/generated/' | wc -l
|
|
294
|
+
head -30 CLAUDE.md
|
|
295
|
+
ls .claude/rules/*/
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
> **Mẹo:** Nếu bước nào thất bại, bạn có thể chạy lại chỉ bước đó. Kết quả Pass 1/2 được cache — nếu `pass1-N.json` hoặc `pass2-merged.json` đã tồn tại, pipeline tự động sẽ bỏ qua. Dùng `npx claudeos-core init --force` để xóa kết quả trước và bắt đầu lại từ đầu.
|
|
299
|
+
|
|
300
|
+
### Bắt Đầu Sử Dụng
|
|
301
|
+
|
|
302
|
+
```
|
|
303
|
+
# Trong Claude Code — chỉ cần nói tự nhiên:
|
|
304
|
+
"Tạo CRUD cho domain đơn hàng"
|
|
305
|
+
"Thêm API xác thực người dùng"
|
|
306
|
+
"Refactor code này theo pattern của dự án"
|
|
307
|
+
|
|
308
|
+
# Claude Code tự động tham chiếu Standards, Rules và Skills đã tạo.
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Cách Hoạt Động — Pipeline 3-Pass
|
|
314
|
+
|
|
315
|
+
```
|
|
316
|
+
npx claudeos-core init
|
|
317
|
+
│
|
|
318
|
+
├── [1] npm install ← Cài dependencies (~10s)
|
|
319
|
+
├── [2] Cấu trúc thư mục ← Tạo folders (~1s)
|
|
320
|
+
├── [3] plan-installer (Node.js) ← Quét dự án (~5s)
|
|
321
|
+
│ ├── Tự động phát hiện stack (hỗ trợ multi-stack)
|
|
322
|
+
│ ├── Trích xuất danh sách domain (gắn tag: backend/frontend)
|
|
323
|
+
│ ├── Phân chia nhóm domain (theo loại)
|
|
324
|
+
│ └── Chọn prompt theo stack (theo loại)
|
|
325
|
+
│
|
|
326
|
+
├── [4] Pass 1 × N (claude -p) ← Phân tích code chuyên sâu (~2-8 phút)
|
|
327
|
+
│ ├── ⚙️ Nhóm backend → prompt phân tích backend
|
|
328
|
+
│ └── 🎨 Nhóm frontend → prompt phân tích frontend
|
|
329
|
+
│
|
|
330
|
+
├── [5] Pass 2 × 1 (claude -p) ← Hợp nhất phân tích (~1 phút)
|
|
331
|
+
│ └── Tổng hợp TẤT CẢ kết quả Pass 1 (backend + frontend)
|
|
332
|
+
│
|
|
333
|
+
├── [6] Pass 3 × 1 (claude -p) ← Tạo toàn bộ file (~3-5 phút)
|
|
334
|
+
│ └── Prompt kết hợp (mục tiêu backend + frontend)
|
|
335
|
+
│
|
|
336
|
+
└── [7] Xác thực ← Tự động chạy health checker
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Tại Sao 3 Pass?
|
|
340
|
+
|
|
341
|
+
**Pass 1** là pass duy nhất đọc mã nguồn. Nó chọn file đại diện cho mỗi domain và trích xuất pattern trên 55–95 danh mục phân tích (theo stack). Với dự án lớn, Pass 1 chạy nhiều lần — mỗi nhóm domain một lần. Trong dự án multi-stack (ví dụ: Java backend + React frontend), backend và frontend sử dụng **prompt phân tích riêng biệt** phù hợp với từng stack.
|
|
342
|
+
|
|
343
|
+
**Pass 2** hợp nhất tất cả kết quả Pass 1 thành phân tích thống nhất: pattern chung (100% chia sẻ), pattern đa số (50%+ chia sẻ), pattern riêng domain, anti-pattern theo mức độ nghiêm trọng và các mối quan tâm xuyên suốt (đặt tên, bảo mật, DB, testing, logging, hiệu suất).
|
|
344
|
+
|
|
345
|
+
**Pass 3** lấy phân tích đã hợp nhất và tạo toàn bộ hệ sinh thái file. Nó không bao giờ đọc mã nguồn — chỉ đọc JSON phân tích. Trong chế độ multi-stack, prompt tạo file kết hợp mục tiêu backend và frontend để tạo cả hai bộ tiêu chuẩn trong một pass duy nhất.
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
## Cấu Trúc File Được Tạo
|
|
350
|
+
|
|
351
|
+
```
|
|
352
|
+
your-project/
|
|
353
|
+
│
|
|
354
|
+
├── CLAUDE.md ← Điểm vào Claude Code
|
|
355
|
+
│
|
|
356
|
+
├── .claude/
|
|
357
|
+
│ └── rules/ ← Rules kích hoạt bằng Glob
|
|
358
|
+
│ ├── 00.core/
|
|
359
|
+
│ ├── 10.backend/
|
|
360
|
+
│ ├── 20.frontend/
|
|
361
|
+
│ ├── 30.security-db/
|
|
362
|
+
│ ├── 40.infra/
|
|
363
|
+
│ └── 50.sync/ ← Rules nhắc nhở đồng bộ
|
|
364
|
+
│
|
|
365
|
+
├── claudeos-core/ ← Thư mục đầu ra chính
|
|
366
|
+
│ ├── generated/ ← JSON phân tích + prompt động
|
|
367
|
+
│ ├── standard/ ← Tiêu chuẩn code (15-19 file)
|
|
368
|
+
│ ├── skills/ ← Skills scaffolding CRUD
|
|
369
|
+
│ ├── guide/ ← Onboarding, FAQ, troubleshooting (9 file)
|
|
370
|
+
│ ├── plan/ ← Master Plans (backup/khôi phục)
|
|
371
|
+
│ ├── database/ ← Schema DB, hướng dẫn migration
|
|
372
|
+
│ └── mcp-guide/ ← Hướng dẫn tích hợp MCP server
|
|
373
|
+
│
|
|
374
|
+
└── claudeos-core-tools/ ← Bộ công cụ này (không chỉnh sửa)
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
Mỗi file tiêu chuẩn bao gồm ví dụ ✅ đúng, ví dụ ❌ sai và bảng tóm tắt rules — tất cả được trích xuất từ pattern code thực tế của bạn, không phải template chung.
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## Tự Động Mở Rộng Theo Quy Mô Dự Án
|
|
382
|
+
|
|
383
|
+
| Quy Mô | Số Domain | Số Lần Pass 1 | Tổng `claude -p` | Thời Gian Ước Tính |
|
|
384
|
+
|---|---|---|---|---|
|
|
385
|
+
| Nhỏ | 1–4 | 1 | 3 | ~5 phút |
|
|
386
|
+
| Trung Bình | 5–8 | 2 | 4 | ~8 phút |
|
|
387
|
+
| Lớn | 9–16 | 3–4 | 5–6 | ~12 phút |
|
|
388
|
+
| Rất Lớn | 17+ | 5+ | 7+ | ~18 phút+ |
|
|
389
|
+
|
|
390
|
+
Với dự án multi-stack (ví dụ: Java + React), domain backend và frontend được đếm chung. Dự án có 6 domain backend + 4 frontend = tổng 10, mở rộng theo mức "Lớn".
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## Công Cụ Xác Thực
|
|
395
|
+
|
|
396
|
+
ClaudeOS-Core bao gồm 5 công cụ xác thực tích hợp, chạy tự động sau khi tạo:
|
|
397
|
+
|
|
398
|
+
```bash
|
|
399
|
+
# Chạy tất cả kiểm tra cùng lúc (khuyến nghị)
|
|
400
|
+
npx claudeos-core health
|
|
401
|
+
|
|
402
|
+
# Lệnh riêng lẻ
|
|
403
|
+
npx claudeos-core validate # So sánh Plan ↔ đĩa
|
|
404
|
+
npx claudeos-core refresh # Đồng bộ Đĩa → Plan
|
|
405
|
+
npx claudeos-core restore # Khôi phục Plan → Đĩa
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
| Công Cụ | Chức Năng |
|
|
409
|
+
|---|---|
|
|
410
|
+
| **manifest-generator** | Xây dựng JSON metadata (rule-manifest, sync-map, plan-manifest) |
|
|
411
|
+
| **plan-validator** | So sánh khối `<file>` của Master Plan với đĩa — 3 chế độ: check, refresh, restore |
|
|
412
|
+
| **sync-checker** | Phát hiện file chưa đăng ký (trên đĩa nhưng không trong plan) và mục mồ côi |
|
|
413
|
+
| **content-validator** | Xác thực chất lượng file — file trống, thiếu ví dụ ✅/❌, phần bắt buộc |
|
|
414
|
+
| **pass-json-validator** | Xác thực cấu trúc JSON Pass 1–3, khóa bắt buộc và tính đầy đủ của phần |
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## Claude Code Sử Dụng Tài Liệu Như Thế Nào
|
|
419
|
+
|
|
420
|
+
Đây là cách Claude Code thực sự đọc tài liệu được ClaudeOS-Core tạo ra:
|
|
421
|
+
|
|
422
|
+
### File được đọc tự động
|
|
423
|
+
|
|
424
|
+
| File | Thời điểm | Đảm bảo |
|
|
425
|
+
|---|---|---|
|
|
426
|
+
| `CLAUDE.md` | Mỗi lần bắt đầu cuộc trò chuyện | Luôn luôn |
|
|
427
|
+
| `.claude/rules/00.core/*` | Khi chỉnh sửa file (`paths: ["**/*"]`) | Luôn luôn |
|
|
428
|
+
| `.claude/rules/10.backend/*` | Khi chỉnh sửa file (`paths: ["**/*"]`) | Luôn luôn |
|
|
429
|
+
| `.claude/rules/30.security-db/*` | Khi chỉnh sửa file (`paths: ["**/*"]`) | Luôn luôn |
|
|
430
|
+
| `.claude/rules/40.infra/*` | Chỉ khi chỉnh sửa file config/infra (paths giới hạn) | Có điều kiện |
|
|
431
|
+
| `.claude/rules/50.sync/*` | Chỉ khi chỉnh sửa file claudeos-core (paths giới hạn) | Có điều kiện |
|
|
432
|
+
|
|
433
|
+
### File được đọc theo yêu cầu qua tham chiếu trong quy tắc
|
|
434
|
+
|
|
435
|
+
Mỗi file quy tắc liên kết đến standard tương ứng trong phần `## Reference`. Claude chỉ đọc standard liên quan đến tác vụ hiện tại:
|
|
436
|
+
|
|
437
|
+
- `claudeos-core/standard/**` — Pattern coding, ví dụ ✅/❌, quy tắc đặt tên
|
|
438
|
+
- `claudeos-core/database/**` — DB schema (cho query, mapper, migration)
|
|
439
|
+
|
|
440
|
+
`00.standard-reference.md` đóng vai trò thư mục để khám phá các standard không có quy tắc tương ứng.
|
|
441
|
+
|
|
442
|
+
### File KHÔNG đọc (tiết kiệm context)
|
|
443
|
+
|
|
444
|
+
Được loại trừ rõ ràng qua phần `DO NOT Read` của quy tắc standard-reference:
|
|
445
|
+
|
|
446
|
+
| Thư mục | Lý do loại trừ |
|
|
447
|
+
|---|---|
|
|
448
|
+
| `claudeos-core/plan/` | Backup Master Plan (~340KB). Dùng `npx claudeos-core refresh` để đồng bộ. |
|
|
449
|
+
| `claudeos-core/generated/` | JSON metadata build. Không dùng cho coding. |
|
|
450
|
+
| `claudeos-core/guide/` | Hướng dẫn onboarding cho người dùng. |
|
|
451
|
+
| `claudeos-core/mcp-guide/` | Tài liệu MCP server. Không dùng cho coding. |
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## Quy Trình Làm Việc Hàng Ngày
|
|
456
|
+
|
|
457
|
+
### Sau Khi Cài Đặt
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
# Sử dụng Claude Code bình thường — nó tự động tham chiếu tiêu chuẩn:
|
|
461
|
+
"Tạo CRUD cho domain đơn hàng"
|
|
462
|
+
"Thêm API cập nhật hồ sơ người dùng"
|
|
463
|
+
"Refactor code này theo pattern của dự án"
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Sau Khi Chỉnh Sửa Thủ Công Standards
|
|
467
|
+
|
|
468
|
+
```bash
|
|
469
|
+
# Sau khi chỉnh sửa file standard hoặc rules:
|
|
470
|
+
npx claudeos-core refresh
|
|
471
|
+
|
|
472
|
+
# Xác minh mọi thứ nhất quán
|
|
473
|
+
npx claudeos-core health
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
### Khi Tài Liệu Bị Hỏng
|
|
477
|
+
|
|
478
|
+
```bash
|
|
479
|
+
# Khôi phục mọi thứ từ Master Plan
|
|
480
|
+
npx claudeos-core restore
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### Tích Hợp CI/CD
|
|
484
|
+
|
|
485
|
+
```yaml
|
|
486
|
+
# Ví dụ GitHub Actions
|
|
487
|
+
- run: npx claudeos-core validate
|
|
488
|
+
# Mã thoát 1 chặn PR
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
---
|
|
492
|
+
|
|
493
|
+
## Khác Biệt Gì?
|
|
494
|
+
|
|
495
|
+
| | ClaudeOS-Core | Everything Claude Code (50K+ ⭐) | Harness | specs-generator | Claude `/init` |
|
|
496
|
+
|---|---|---|---|---|---|
|
|
497
|
+
| **Approach** | Code analyzes first, then LLM generates | Pre-built config presets | LLM designs agent teams | LLM generates spec docs | LLM writes CLAUDE.md |
|
|
498
|
+
| **Reads your source code** | ✅ Deterministic static analysis | ❌ | ❌ | ❌ (LLM reads) | ❌ (LLM reads) |
|
|
499
|
+
| **Stack detection** | Code confirms (ORM, DB, build tool, pkg manager) | N/A (stack-agnostic) | LLM guesses | LLM guesses | LLM guesses |
|
|
500
|
+
| **Domain detection** | Code confirms (Java 5 patterns, Kotlin CQRS, Next.js FSD) | N/A | LLM guesses | N/A | N/A |
|
|
501
|
+
| **Same project → Same result** | ✅ Deterministic analysis | ✅ (static files) | ❌ (LLM varies) | ❌ (LLM varies) | ❌ (LLM varies) |
|
|
502
|
+
| **Large project handling** | Domain group splitting (4 domains / 40 files per group) | N/A | No splitting | No splitting | Context window limit |
|
|
503
|
+
| **Output** | CLAUDE.md + Rules + Standards + Skills + Guides + Plans (40-50+ files) | Agents + Skills + Commands + Hooks | Agents + Skills | 6 spec documents | CLAUDE.md (1 file) |
|
|
504
|
+
| **Output location** | `.claude/rules/` (auto-loaded by Claude Code) | `.claude/` various | `.claude/agents/` + `.claude/skills/` | `.claude/steering/` + `specs/` | `CLAUDE.md` |
|
|
505
|
+
| **Post-generation verification** | ✅ 5 automated validators | ❌ | ❌ | ❌ | ❌ |
|
|
506
|
+
| **Multi-language output** | ✅ 10 languages | ❌ | ❌ | ❌ | ❌ |
|
|
507
|
+
| **Multi-stack** | ✅ Backend + Frontend simultaneous | ❌ Stack-agnostic | ❌ | ❌ | Partial |
|
|
508
|
+
| **Agent orchestration** | ❌ | ✅ 28 agents | ✅ 6 patterns | ❌ | ❌ |
|
|
509
|
+
|
|
510
|
+
### Key difference
|
|
511
|
+
|
|
512
|
+
**Other tools give Claude "generally good instructions." ClaudeOS-Core gives Claude "instructions extracted from your actual code."**
|
|
513
|
+
|
|
514
|
+
### Complementary, not competing
|
|
515
|
+
|
|
516
|
+
ClaudeOS-Core: **project-specific rules**. Other tools: **agent orchestration**.
|
|
517
|
+
Use both together.
|
|
518
|
+
|
|
519
|
+
---
|
|
520
|
+
## FAQ
|
|
521
|
+
|
|
522
|
+
**H: Nó có sửa đổi mã nguồn của tôi không?**
|
|
523
|
+
Không. Chỉ tạo `CLAUDE.md`, `.claude/rules/` và `claudeos-core/`. Code hiện có của bạn không bao giờ bị sửa đổi.
|
|
524
|
+
|
|
525
|
+
**H: Chi phí bao nhiêu?**
|
|
526
|
+
Gọi `claude -p` từ 3–7 lần. Nằm trong phạm vi sử dụng bình thường của Claude Code.
|
|
527
|
+
|
|
528
|
+
**H: Có nên commit file được tạo vào Git không?**
|
|
529
|
+
Khuyến nghị. Team của bạn có thể chia sẻ cùng tiêu chuẩn Claude Code. Cân nhắc thêm `claudeos-core/generated/` vào `.gitignore` (JSON phân tích có thể tạo lại).
|
|
530
|
+
|
|
531
|
+
**H: Dự án multi-stack (ví dụ: Java backend + React frontend) thì sao?**
|
|
532
|
+
Hỗ trợ hoàn toàn. ClaudeOS-Core tự phát hiện cả hai stack, gắn tag domain là `backend` hoặc `frontend`, và sử dụng prompt phân tích riêng cho từng loại. Pass 2 hợp nhất tất cả, Pass 3 tạo tiêu chuẩn cho cả backend và frontend trong một pass duy nhất.
|
|
533
|
+
|
|
534
|
+
**H: Chạy lại thì sao?**
|
|
535
|
+
Nếu kết quả Pass 1/2 trước đó tồn tại, prompt tương tác cho phép bạn chọn: **Continue** (tiếp tục từ nơi dừng lại) hoặc **Fresh** (xóa tất cả và bắt đầu lại). Dùng `--force` để bỏ qua prompt và luôn bắt đầu lại từ đầu. Pass 3 luôn chạy lại. Phiên bản trước có thể khôi phục từ Master Plans.
|
|
536
|
+
|
|
537
|
+
**H: Có hoạt động với Turborepo / pnpm workspaces / Lerna monorepo không?**
|
|
538
|
+
Có. ClaudeOS-Core phát hiện `turbo.json`, `pnpm-workspace.yaml`, `lerna.json`, hoặc `package.json#workspaces` và tự động quét file `package.json` của sub-package để tìm dependency framework/ORM/DB. Quét domain bao gồm pattern `apps/*/src/` và `packages/*/src/`. Chạy từ thư mục gốc monorepo.
|
|
539
|
+
|
|
540
|
+
**H: NestJS có template riêng hay dùng chung với Express?**
|
|
541
|
+
NestJS sử dụng template `node-nestjs` chuyên dụng với các danh mục phân tích riêng cho NestJS: decorator `@Module`, `@Injectable`, `@Controller`, Guards, Pipes, Interceptors, DI container, pattern CQRS, và `Test.createTestingModule`. Dự án Express sử dụng template `node-express` riêng biệt.
|
|
542
|
+
|
|
543
|
+
**H: Dự án Vue / Nuxt thì sao?**
|
|
544
|
+
Vue/Nuxt sử dụng template `vue-nuxt` chuyên dụng bao gồm Composition API, `<script setup>`, defineProps/defineEmits, Pinia stores, `useFetch`/`useAsyncData`, Nitro server routes, và `@nuxt/test-utils`. Dự án Next.js/React sử dụng template `node-nextjs`.
|
|
545
|
+
|
|
546
|
+
**H: Có hỗ trợ Kotlin không?**
|
|
547
|
+
Có. ClaudeOS-Core tự động phát hiện Kotlin từ `build.gradle.kts` hoặc kotlin plugin trong `build.gradle`. Sử dụng template chuyên dụng `kotlin-spring` để phân tích các pattern đặc thù của Kotlin (data class, sealed class, coroutine, extension function, MockK, v.v.).
|
|
548
|
+
|
|
549
|
+
**H: Kiến trúc CQRS / BFF thì sao?**
|
|
550
|
+
Hỗ trợ đầy đủ cho các dự án Kotlin multi-module. ClaudeOS-Core đọc `settings.gradle.kts`, phát hiện loại module (command, query, bff, integration) từ tên module, và nhóm các module Command/Query cùng domain lại. Các standard được tạo bao gồm quy tắc riêng cho command controller vs query controller, pattern BFF/Feign và quy ước giao tiếp giữa các module.
|
|
551
|
+
|
|
552
|
+
**H: Gradle multi-module monorepo thì sao?**
|
|
553
|
+
ClaudeOS-Core quét tất cả submodule (`**/src/main/kotlin/**/*.kt`) bất kể độ sâu lồng nhau. Loại module được suy luận từ quy ước đặt tên (ví dụ: `reservation-command-server` → domain: `reservation`, type: `command`). Thư viện chia sẻ (`shared-lib`, `integration-lib`) cũng được phát hiện.
|
|
554
|
+
|
|
555
|
+
---
|
|
556
|
+
|
|
557
|
+
## Cấu Trúc Template
|
|
558
|
+
|
|
559
|
+
```
|
|
560
|
+
pass-prompts/templates/
|
|
561
|
+
├── common/ # Header/footer chung
|
|
562
|
+
├── java-spring/ # Java / Spring Boot
|
|
563
|
+
├── kotlin-spring/ # Kotlin / Spring Boot (CQRS, BFF, multi-module)
|
|
564
|
+
├── node-express/ # Node.js / Express
|
|
565
|
+
├── node-nestjs/ # Node.js / NestJS (Module, DI, Guard, Pipe, Interceptor)
|
|
566
|
+
├── node-fastify/ # Node.js / Fastify
|
|
567
|
+
├── node-nextjs/ # Next.js / React
|
|
568
|
+
├── vue-nuxt/ # Vue / Nuxt (Composition API, Pinia, Nitro)
|
|
569
|
+
├── angular/ # Angular
|
|
570
|
+
├── python-django/ # Python / Django (DRF)
|
|
571
|
+
└── python-fastapi/ # Python / FastAPI
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
`plan-installer` tự phát hiện stack của bạn, sau đó lắp ráp prompt theo loại. NestJS và Vue/Nuxt sử dụng template chuyên dụng với các danh mục phân tích riêng cho từng framework (ví dụ: `@Module`/`@Injectable`/Guards cho NestJS, `<script setup>`/Pinia/useFetch cho Vue). Với dự án multi-stack, `pass1-backend-prompt.md` và `pass1-frontend-prompt.md` được tạo riêng, trong khi `pass3-prompt.md` kết hợp mục tiêu tạo file của cả hai stack.
|
|
575
|
+
|
|
576
|
+
---
|
|
577
|
+
|
|
578
|
+
## Hỗ Trợ Monorepo
|
|
579
|
+
|
|
580
|
+
ClaudeOS-Core tự động phát hiện thiết lập monorepo JS/TS và quét các sub-package để tìm dependency.
|
|
581
|
+
|
|
582
|
+
**Monorepo marker được hỗ trợ** (tự động phát hiện):
|
|
583
|
+
- `turbo.json` (Turborepo)
|
|
584
|
+
- `pnpm-workspace.yaml` (pnpm workspaces)
|
|
585
|
+
- `lerna.json` (Lerna)
|
|
586
|
+
- `package.json#workspaces` (npm/yarn workspaces)
|
|
587
|
+
|
|
588
|
+
**Chạy từ thư mục gốc monorepo** — ClaudeOS-Core đọc `apps/*/package.json` và `packages/*/package.json` để tìm dependency framework/ORM/DB trong các sub-package:
|
|
589
|
+
|
|
590
|
+
```bash
|
|
591
|
+
cd my-monorepo
|
|
592
|
+
npx claudeos-core init
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
**Những gì được phát hiện:**
|
|
596
|
+
- Dependency từ `apps/web/package.json` (ví dụ: `next`, `react`) → frontend stack
|
|
597
|
+
- Dependency từ `apps/api/package.json` (ví dụ: `express`, `prisma`) → backend stack
|
|
598
|
+
- Dependency từ `packages/db/package.json` (ví dụ: `drizzle-orm`) → ORM/DB
|
|
599
|
+
- Đường dẫn workspace tùy chỉnh từ `pnpm-workspace.yaml` (ví dụ: `services/*`)
|
|
600
|
+
|
|
601
|
+
**Quét domain cũng bao gồm cấu trúc monorepo:**
|
|
602
|
+
- `apps/api/src/modules/*/` và `apps/api/src/*/` cho domain backend
|
|
603
|
+
- `apps/web/app/*/`, `apps/web/src/app/*/`, `apps/web/pages/*/` cho domain frontend
|
|
604
|
+
- `packages/*/src/*/` cho domain package chia sẻ
|
|
605
|
+
|
|
606
|
+
```
|
|
607
|
+
my-monorepo/ ← Chạy ở đây: npx claudeos-core init
|
|
608
|
+
├── turbo.json ← Tự động phát hiện là Turborepo
|
|
609
|
+
├── apps/
|
|
610
|
+
│ ├── web/ ← Next.js phát hiện từ apps/web/package.json
|
|
611
|
+
│ │ ├── app/dashboard/ ← Domain frontend được phát hiện
|
|
612
|
+
│ │ └── package.json ← { "dependencies": { "next": "^14" } }
|
|
613
|
+
│ └── api/ ← Express phát hiện từ apps/api/package.json
|
|
614
|
+
│ ├── src/modules/users/ ← Domain backend được phát hiện
|
|
615
|
+
│ └── package.json ← { "dependencies": { "express": "^4" } }
|
|
616
|
+
├── packages/
|
|
617
|
+
│ ├── db/ ← Drizzle phát hiện từ packages/db/package.json
|
|
618
|
+
│ └── ui/
|
|
619
|
+
└── package.json ← { "workspaces": ["apps/*", "packages/*"] }
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
> **Lưu ý:** Với monorepo Kotlin/Java, phát hiện multi-module sử dụng `settings.gradle.kts` (xem [Phát Hiện Domain Kotlin Multi-Module](#phát-hiện-domain-kotlin-multi-module) ở trên) và không yêu cầu JS monorepo marker.
|
|
623
|
+
|
|
624
|
+
## Xử Lý Sự Cố
|
|
625
|
+
|
|
626
|
+
**"claude: command not found"** — Claude Code CLI chưa được cài đặt hoặc không nằm trong PATH. Xem [tài liệu Claude Code](https://code.claude.com/docs/en/overview).
|
|
627
|
+
|
|
628
|
+
**"npm install failed"** — Phiên bản Node.js có thể quá thấp. Yêu cầu v18+.
|
|
629
|
+
|
|
630
|
+
**"0 domains detected"** — Cấu trúc dự án có thể không chuẩn. Xem pattern phát hiện trong [tài liệu tiếng Hàn](./README.ko.md#트러블슈팅) cho stack của bạn.
|
|
631
|
+
|
|
632
|
+
**Dự án Kotlin "phát hiện 0 domain"** — Đảm bảo thư mục gốc có `build.gradle.kts` (hoặc `build.gradle` với kotlin plugin), và file nguồn nằm dưới `**/src/main/kotlin/`. Với dự án multi-module, `settings.gradle.kts` phải chứa câu lệnh `include()`. Dự án Kotlin đơn module (không có `settings.gradle`) cũng được hỗ trợ — domain được trích xuất từ cấu trúc package/class dưới `src/main/kotlin/`.
|
|
633
|
+
|
|
634
|
+
**"Ngôn ngữ phát hiện là java thay vì kotlin"** — ClaudeOS-Core kiểm tra `build.gradle(.kts)` gốc trước, sau đó kiểm tra file build của submodule. Đảm bảo ít nhất một file chứa `kotlin("jvm")` hoặc `org.jetbrains.kotlin`.
|
|
635
|
+
|
|
636
|
+
**"Không phát hiện CQRS"** — Phát hiện kiến trúc phụ thuộc vào tên module chứa từ khóa `command` và `query`. Nếu module của bạn dùng tên khác, có thể điều chỉnh thủ công các prompt đã tạo.
|
|
637
|
+
|
|
638
|
+
---
|
|
639
|
+
|
|
640
|
+
## Đóng Góp
|
|
641
|
+
|
|
642
|
+
Chào đón mọi đóng góp! Các lĩnh vực cần hỗ trợ nhất:
|
|
643
|
+
|
|
644
|
+
- **Template stack mới** — Ruby/Rails, Go/Gin, PHP/Laravel, Rust/Axum
|
|
645
|
+
- **Hỗ trợ monorepo sâu** — Root sub-project riêng, phát hiện workspace
|
|
646
|
+
- **Độ phủ test** — Mở rộng bộ test (hiện tại 269 test bao gồm tất cả scanner, phát hiện stack, nhóm domain, phân tích plan, tạo prompt, bộ chọn CLI, phát hiện monorepo, công cụ xác thực và phát hiện Vite SPA)
|
|
647
|
+
|
|
648
|
+
---
|
|
649
|
+
|
|
650
|
+
## Tác Giả
|
|
651
|
+
|
|
652
|
+
Được tạo bởi **claudeos-core** — [GitHub](https://github.com/claudeos-core) · [Email](mailto:claudeoscore@gmail.com)
|
|
653
|
+
|
|
654
|
+
## Giấy Phép
|
|
655
|
+
|
|
656
|
+
ISC
|