oh-my-customcode 0.2.0 → 0.3.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/README.md +28 -0
- package/dist/cli/index.js +178 -5
- package/dist/index.js +4 -5
- package/package.json +1 -1
- package/templates/.claude/rules/MUST-orchestrator-coordination.md +36 -0
- package/templates/CLAUDE.md.en +90 -93
- package/templates/CLAUDE.md.ko +88 -90
package/README.md
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
[](https://github.com/baekenough/oh-my-customcode/actions/workflows/ci.yml)
|
|
8
8
|
|
|
9
|
+
**[한국어 문서 (Korean)](./README_ko.md)**
|
|
10
|
+
|
|
9
11
|
**The easiest way to customize Claude Code with agents, skills, and rules.**
|
|
10
12
|
|
|
11
13
|
Like oh-my-zsh transformed shell customization, oh-my-customcode makes personalizing your Claude Code experience simple, powerful, and fun.
|
|
@@ -228,6 +230,32 @@ bun run build # Build for production
|
|
|
228
230
|
- Node.js >= 18.0.0
|
|
229
231
|
- Claude Code CLI
|
|
230
232
|
|
|
233
|
+
### Sync Verification
|
|
234
|
+
|
|
235
|
+
oh-my-customcode templates are synced from [baekgom-agents](https://github.com/baekenough/baekgom-agents). To verify templates are in sync:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# Local verification (requires baekgom-agents checkout)
|
|
239
|
+
./scripts/verify-sync.sh /path/to/baekgom-agents
|
|
240
|
+
|
|
241
|
+
# Or using environment variable
|
|
242
|
+
BAEKGOM_AGENTS_PATH=/path/to/baekgom-agents ./scripts/verify-sync.sh
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
The verification checks 7 content directories:
|
|
246
|
+
- `.claude/agents/` (34 agents)
|
|
247
|
+
- `.claude/skills/` (42 skills)
|
|
248
|
+
- `.claude/rules/` (18 rules)
|
|
249
|
+
- `.claude/hooks/`
|
|
250
|
+
- `.claude/contexts/`
|
|
251
|
+
- `guides/`
|
|
252
|
+
- `pipelines/`
|
|
253
|
+
|
|
254
|
+
CI automatically runs sync verification on:
|
|
255
|
+
- Push to main (when templates change)
|
|
256
|
+
- Weekly schedule (Monday 00:00 UTC)
|
|
257
|
+
- Manual workflow dispatch
|
|
258
|
+
|
|
231
259
|
---
|
|
232
260
|
|
|
233
261
|
## Contributing
|
package/dist/cli/index.js
CHANGED
|
@@ -12260,6 +12260,105 @@ async function checkSkills(targetDir) {
|
|
|
12260
12260
|
fixable: false
|
|
12261
12261
|
};
|
|
12262
12262
|
}
|
|
12263
|
+
async function checkGuides(targetDir) {
|
|
12264
|
+
const guidesDir = path.join(targetDir, "guides");
|
|
12265
|
+
const exists2 = await isDirectory(guidesDir);
|
|
12266
|
+
if (!exists2) {
|
|
12267
|
+
return {
|
|
12268
|
+
name: "Guides",
|
|
12269
|
+
status: "fail",
|
|
12270
|
+
message: "guides/ directory not found",
|
|
12271
|
+
fixable: true
|
|
12272
|
+
};
|
|
12273
|
+
}
|
|
12274
|
+
const topicCount = await countDirectories(guidesDir);
|
|
12275
|
+
if (topicCount === 0) {
|
|
12276
|
+
return {
|
|
12277
|
+
name: "Guides",
|
|
12278
|
+
status: "warn",
|
|
12279
|
+
message: "guides/ directory is empty (0 topics found)",
|
|
12280
|
+
fixable: false
|
|
12281
|
+
};
|
|
12282
|
+
}
|
|
12283
|
+
return {
|
|
12284
|
+
name: "Guides",
|
|
12285
|
+
status: "pass",
|
|
12286
|
+
message: `Guides OK (${topicCount} topics)`,
|
|
12287
|
+
fixable: false
|
|
12288
|
+
};
|
|
12289
|
+
}
|
|
12290
|
+
async function checkHooks(targetDir) {
|
|
12291
|
+
const hooksDir = path.join(targetDir, ".claude", "hooks");
|
|
12292
|
+
const exists2 = await isDirectory(hooksDir);
|
|
12293
|
+
if (!exists2) {
|
|
12294
|
+
return {
|
|
12295
|
+
name: "Hooks",
|
|
12296
|
+
status: "fail",
|
|
12297
|
+
message: ".claude/hooks/ directory not found",
|
|
12298
|
+
fixable: true
|
|
12299
|
+
};
|
|
12300
|
+
}
|
|
12301
|
+
const hookFiles = await findFiles(hooksDir, /\.(sh|json|yaml)$/);
|
|
12302
|
+
if (hookFiles.length === 0) {
|
|
12303
|
+
return {
|
|
12304
|
+
name: "Hooks",
|
|
12305
|
+
status: "warn",
|
|
12306
|
+
message: ".claude/hooks/ directory is empty",
|
|
12307
|
+
fixable: false
|
|
12308
|
+
};
|
|
12309
|
+
}
|
|
12310
|
+
return {
|
|
12311
|
+
name: "Hooks",
|
|
12312
|
+
status: "pass",
|
|
12313
|
+
message: `Hooks OK (${hookFiles.length} files)`,
|
|
12314
|
+
fixable: false
|
|
12315
|
+
};
|
|
12316
|
+
}
|
|
12317
|
+
async function checkPipelines(targetDir) {
|
|
12318
|
+
const pipelinesDir = path.join(targetDir, "pipelines");
|
|
12319
|
+
const exists2 = await isDirectory(pipelinesDir);
|
|
12320
|
+
if (!exists2) {
|
|
12321
|
+
return {
|
|
12322
|
+
name: "Pipelines",
|
|
12323
|
+
status: "fail",
|
|
12324
|
+
message: "pipelines/ directory not found",
|
|
12325
|
+
fixable: true
|
|
12326
|
+
};
|
|
12327
|
+
}
|
|
12328
|
+
return {
|
|
12329
|
+
name: "Pipelines",
|
|
12330
|
+
status: "pass",
|
|
12331
|
+
message: "Pipelines OK",
|
|
12332
|
+
fixable: false
|
|
12333
|
+
};
|
|
12334
|
+
}
|
|
12335
|
+
async function checkContexts(targetDir) {
|
|
12336
|
+
const contextsDir = path.join(targetDir, ".claude", "contexts");
|
|
12337
|
+
const exists2 = await isDirectory(contextsDir);
|
|
12338
|
+
if (!exists2) {
|
|
12339
|
+
return {
|
|
12340
|
+
name: "Contexts",
|
|
12341
|
+
status: "fail",
|
|
12342
|
+
message: ".claude/contexts/ directory not found",
|
|
12343
|
+
fixable: true
|
|
12344
|
+
};
|
|
12345
|
+
}
|
|
12346
|
+
const contextFiles = await findFiles(contextsDir, /\.md$/);
|
|
12347
|
+
if (contextFiles.length === 0) {
|
|
12348
|
+
return {
|
|
12349
|
+
name: "Contexts",
|
|
12350
|
+
status: "warn",
|
|
12351
|
+
message: ".claude/contexts/ directory is empty",
|
|
12352
|
+
fixable: false
|
|
12353
|
+
};
|
|
12354
|
+
}
|
|
12355
|
+
return {
|
|
12356
|
+
name: "Contexts",
|
|
12357
|
+
status: "pass",
|
|
12358
|
+
message: `Contexts OK (${contextFiles.length} files)`,
|
|
12359
|
+
fixable: false
|
|
12360
|
+
};
|
|
12361
|
+
}
|
|
12263
12362
|
async function fixBrokenSymlinks(_targetDir, brokenSymlinks) {
|
|
12264
12363
|
let fixed = 0;
|
|
12265
12364
|
for (const symlink of brokenSymlinks) {
|
|
@@ -12283,6 +12382,10 @@ async function fixSingleIssue(check, targetDir) {
|
|
|
12283
12382
|
Rules: () => createMissingDirectory(path.join(targetDir, ".claude", "rules")),
|
|
12284
12383
|
Agents: () => createMissingDirectory(path.join(targetDir, ".claude", "agents")),
|
|
12285
12384
|
Skills: () => createMissingDirectory(path.join(targetDir, ".claude", "skills")),
|
|
12385
|
+
Guides: () => createMissingDirectory(path.join(targetDir, "guides")),
|
|
12386
|
+
Hooks: () => createMissingDirectory(path.join(targetDir, ".claude", "hooks")),
|
|
12387
|
+
Pipelines: () => createMissingDirectory(path.join(targetDir, "pipelines")),
|
|
12388
|
+
Contexts: () => createMissingDirectory(path.join(targetDir, ".claude", "contexts")),
|
|
12286
12389
|
Symlinks: async () => {
|
|
12287
12390
|
if (!check.details || check.details.length === 0)
|
|
12288
12391
|
return false;
|
|
@@ -12335,7 +12438,11 @@ async function doctorCommand(options = {}) {
|
|
|
12335
12438
|
checkAgents(targetDir),
|
|
12336
12439
|
checkSkills(targetDir),
|
|
12337
12440
|
checkSymlinks(targetDir),
|
|
12338
|
-
checkIndexFiles(targetDir)
|
|
12441
|
+
checkIndexFiles(targetDir),
|
|
12442
|
+
checkGuides(targetDir),
|
|
12443
|
+
checkHooks(targetDir),
|
|
12444
|
+
checkPipelines(targetDir),
|
|
12445
|
+
checkContexts(targetDir)
|
|
12339
12446
|
]);
|
|
12340
12447
|
if (options.fix) {
|
|
12341
12448
|
const hasFixableIssues = checks.some((c) => c.status === "fail" && c.fixable);
|
|
@@ -13393,11 +13500,71 @@ ${type} (${components.length}):`);
|
|
|
13393
13500
|
function formatAsJson(components) {
|
|
13394
13501
|
console.log(JSON.stringify(components, null, 2));
|
|
13395
13502
|
}
|
|
13503
|
+
async function getHooks(targetDir) {
|
|
13504
|
+
const hooksDir = join5(targetDir, ".claude", "hooks");
|
|
13505
|
+
if (!await fileExists(hooksDir))
|
|
13506
|
+
return [];
|
|
13507
|
+
try {
|
|
13508
|
+
const hookFiles = await listFiles(hooksDir, { recursive: true, pattern: "*.sh" });
|
|
13509
|
+
const hookConfigs = await listFiles(hooksDir, { recursive: true, pattern: "*.json" });
|
|
13510
|
+
const hookYamls = await listFiles(hooksDir, { recursive: true, pattern: "*.yaml" });
|
|
13511
|
+
const allFiles = [...hookFiles, ...hookConfigs, ...hookYamls];
|
|
13512
|
+
return allFiles.map((hookPath) => ({
|
|
13513
|
+
name: basename2(hookPath),
|
|
13514
|
+
type: "hook",
|
|
13515
|
+
path: relative(targetDir, hookPath)
|
|
13516
|
+
})).sort((a, b) => a.name.localeCompare(b.name));
|
|
13517
|
+
} catch {
|
|
13518
|
+
return [];
|
|
13519
|
+
}
|
|
13520
|
+
}
|
|
13521
|
+
async function getContexts(targetDir) {
|
|
13522
|
+
const contextsDir = join5(targetDir, ".claude", "contexts");
|
|
13523
|
+
if (!await fileExists(contextsDir))
|
|
13524
|
+
return [];
|
|
13525
|
+
try {
|
|
13526
|
+
const mdFiles = await listFiles(contextsDir, { recursive: false, pattern: "*.md" });
|
|
13527
|
+
const yamlFiles = await listFiles(contextsDir, { recursive: false, pattern: "*.yaml" });
|
|
13528
|
+
const allFiles = [...mdFiles, ...yamlFiles];
|
|
13529
|
+
const contexts = await Promise.all(allFiles.map(async (ctxPath) => {
|
|
13530
|
+
const ext = ctxPath.endsWith(".md") ? ".md" : ".yaml";
|
|
13531
|
+
const description = ext === ".md" ? await tryExtractMarkdownDescription(ctxPath, { maxLength: 100 }) : undefined;
|
|
13532
|
+
return {
|
|
13533
|
+
name: basename2(ctxPath, ext),
|
|
13534
|
+
type: "context",
|
|
13535
|
+
path: relative(targetDir, ctxPath),
|
|
13536
|
+
description
|
|
13537
|
+
};
|
|
13538
|
+
}));
|
|
13539
|
+
return contexts.sort((a, b) => a.name.localeCompare(b.name));
|
|
13540
|
+
} catch {
|
|
13541
|
+
return [];
|
|
13542
|
+
}
|
|
13543
|
+
}
|
|
13544
|
+
async function getPipelines(targetDir) {
|
|
13545
|
+
const pipelinesDir = join5(targetDir, "pipelines");
|
|
13546
|
+
if (!await fileExists(pipelinesDir))
|
|
13547
|
+
return [];
|
|
13548
|
+
try {
|
|
13549
|
+
const pipelineFiles = await listFiles(pipelinesDir, { recursive: true, pattern: "*.yaml" });
|
|
13550
|
+
return pipelineFiles.map((pipePath) => ({
|
|
13551
|
+
name: basename2(pipePath, ".yaml"),
|
|
13552
|
+
type: "pipeline",
|
|
13553
|
+
category: relative(join5(targetDir, "pipelines"), dirname2(pipePath)) || "root",
|
|
13554
|
+
path: relative(targetDir, pipePath)
|
|
13555
|
+
})).sort((a, b) => a.name.localeCompare(b.name));
|
|
13556
|
+
} catch {
|
|
13557
|
+
return [];
|
|
13558
|
+
}
|
|
13559
|
+
}
|
|
13396
13560
|
var COMPONENT_GETTERS = {
|
|
13397
13561
|
agents: getAgents,
|
|
13398
13562
|
skills: getSkills,
|
|
13399
13563
|
guides: getGuides,
|
|
13400
|
-
rules: getRules
|
|
13564
|
+
rules: getRules,
|
|
13565
|
+
hooks: getHooks,
|
|
13566
|
+
contexts: getContexts,
|
|
13567
|
+
pipelines: getPipelines
|
|
13401
13568
|
};
|
|
13402
13569
|
function displayComponents(components, type, format) {
|
|
13403
13570
|
if (format === "json") {
|
|
@@ -13409,19 +13576,25 @@ function displayComponents(components, type, format) {
|
|
|
13409
13576
|
}
|
|
13410
13577
|
}
|
|
13411
13578
|
async function handleListAll(targetDir, format) {
|
|
13412
|
-
const [agents, skills, guides, rules] = await Promise.all([
|
|
13579
|
+
const [agents, skills, guides, rules, hooks, contexts, pipelines] = await Promise.all([
|
|
13413
13580
|
getAgents(targetDir),
|
|
13414
13581
|
getSkills(targetDir),
|
|
13415
13582
|
getGuides(targetDir),
|
|
13416
|
-
getRules(targetDir)
|
|
13583
|
+
getRules(targetDir),
|
|
13584
|
+
getHooks(targetDir),
|
|
13585
|
+
getContexts(targetDir),
|
|
13586
|
+
getPipelines(targetDir)
|
|
13417
13587
|
]);
|
|
13418
13588
|
if (format !== "json") {
|
|
13419
13589
|
displayComponents(agents, "agents", format);
|
|
13420
13590
|
displayComponents(skills, "skills", format);
|
|
13421
13591
|
displayComponents(guides, "guides", format);
|
|
13422
13592
|
displayComponents(rules, "rules", format);
|
|
13593
|
+
displayComponents(hooks, "hooks", format);
|
|
13594
|
+
displayComponents(contexts, "contexts", format);
|
|
13595
|
+
displayComponents(pipelines, "pipelines", format);
|
|
13423
13596
|
}
|
|
13424
|
-
return [...agents, ...skills, ...guides, ...rules];
|
|
13597
|
+
return [...agents, ...skills, ...guides, ...rules, ...hooks, ...contexts, ...pipelines];
|
|
13425
13598
|
}
|
|
13426
13599
|
async function listCommand(type = "all", options = {}) {
|
|
13427
13600
|
const targetDir = process.cwd();
|
package/dist/index.js
CHANGED
|
@@ -780,7 +780,7 @@ async function preserveCustomizations(targetDir, customizations) {
|
|
|
780
780
|
return preserved;
|
|
781
781
|
}
|
|
782
782
|
function getAllUpdateComponents() {
|
|
783
|
-
return ["rules", "agents", "skills", "guides", "pipelines", "
|
|
783
|
+
return ["rules", "agents", "skills", "guides", "pipelines", "hooks", "contexts"];
|
|
784
784
|
}
|
|
785
785
|
async function getLatestVersion() {
|
|
786
786
|
const manifestPath = resolveTemplatePath("manifest.json");
|
|
@@ -825,11 +825,10 @@ async function updateComponent(targetDir, component, customizations, options) {
|
|
|
825
825
|
function getComponentPath(component) {
|
|
826
826
|
const paths = {
|
|
827
827
|
rules: ".claude/rules",
|
|
828
|
-
agents: "agents",
|
|
829
|
-
skills: "skills",
|
|
828
|
+
agents: ".claude/agents",
|
|
829
|
+
skills: ".claude/skills",
|
|
830
830
|
guides: "guides",
|
|
831
831
|
pipelines: "pipelines",
|
|
832
|
-
commands: "commands",
|
|
833
832
|
hooks: ".claude/hooks",
|
|
834
833
|
contexts: ".claude/contexts"
|
|
835
834
|
};
|
|
@@ -840,7 +839,7 @@ async function backupInstallation(targetDir) {
|
|
|
840
839
|
const backupDir = join4(targetDir, `.omcustom-backup-${timestamp}`);
|
|
841
840
|
const fs = await import("node:fs/promises");
|
|
842
841
|
await ensureDirectory(backupDir);
|
|
843
|
-
const dirsToBackup = [".claude", "
|
|
842
|
+
const dirsToBackup = [".claude", "guides", "pipelines"];
|
|
844
843
|
for (const dir of dirsToBackup) {
|
|
845
844
|
const srcPath = join4(targetDir, dir);
|
|
846
845
|
if (await fileExists(srcPath)) {
|
package/package.json
CHANGED
|
@@ -263,6 +263,42 @@ CORRECT:
|
|
|
263
263
|
╚══════════════════════════════════════════════════════════════════╝
|
|
264
264
|
```
|
|
265
265
|
|
|
266
|
+
## CRITICAL: Use Specialized Agents for Documentation & Spec Writing
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
╔══════════════════════════════════════════════════════════════════╗
|
|
270
|
+
║ DOCUMENTATION/SPEC WORK MUST USE SPECIALIZED AGENTS ║
|
|
271
|
+
║ ║
|
|
272
|
+
║ Document Type → Required Agent ║
|
|
273
|
+
║ ───────────────────────────────────────────────── ║
|
|
274
|
+
║ Architecture docs/ADR → arch-documenter ║
|
|
275
|
+
║ API specification (OpenAPI) → arch-documenter ║
|
|
276
|
+
║ Technical design docs → arch-documenter ║
|
|
277
|
+
║ Frontend UI/page specs → fe-vercel-agent / fe-* agents ║
|
|
278
|
+
║ Component design specs → fe-vercel-agent / fe-* agents ║
|
|
279
|
+
║ CI/CD pipeline specs → mgr-gitnerd ║
|
|
280
|
+
║ GitHub repository config → mgr-gitnerd ║
|
|
281
|
+
║ Docker/infra specs → infra-docker-expert ║
|
|
282
|
+
║ AWS architecture specs → infra-aws-expert ║
|
|
283
|
+
║ Database schema specs → db-supabase-expert ║
|
|
284
|
+
║ Test strategy/plans → qa-planner ║
|
|
285
|
+
║ Test case documentation → qa-writer ║
|
|
286
|
+
║ ║
|
|
287
|
+
║ WRONG: ║
|
|
288
|
+
║ orchestrator → Task(general-purpose) → writes API spec ║
|
|
289
|
+
║ ║
|
|
290
|
+
║ CORRECT: ║
|
|
291
|
+
║ orchestrator → Task(arch-documenter) → writes API spec ║
|
|
292
|
+
║ ║
|
|
293
|
+
║ general-purpose should ONLY be used when: ║
|
|
294
|
+
║ - No specialized agent exists for the document type ║
|
|
295
|
+
║ - Document is truly generic (meeting notes, simple lists) ║
|
|
296
|
+
║ ║
|
|
297
|
+
║ RULE: If the document requires domain expertise to write ║
|
|
298
|
+
║ correctly, it MUST be delegated to the domain expert. ║
|
|
299
|
+
╚══════════════════════════════════════════════════════════════════╝
|
|
300
|
+
```
|
|
301
|
+
|
|
266
302
|
## CRITICAL: Sub-agent Model Specification
|
|
267
303
|
|
|
268
304
|
```
|
package/templates/CLAUDE.md.en
CHANGED
|
@@ -89,12 +89,15 @@ When 2 or more tasks are INDEPENDENT:
|
|
|
89
89
|
Detection: If tasks don't share state or have dependencies -> PARALLEL
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
### 4.
|
|
92
|
+
### 4. Orchestrator Coordination (ENFORCED for multi-agent tasks)
|
|
93
93
|
```
|
|
94
94
|
When task requires multiple agents:
|
|
95
|
-
->
|
|
96
|
-
->
|
|
97
|
-
->
|
|
95
|
+
-> Main conversation (orchestrator) MUST coordinate
|
|
96
|
+
-> Main conversation assigns tasks to appropriate agents
|
|
97
|
+
-> Main conversation aggregates results
|
|
98
|
+
|
|
99
|
+
Flow:
|
|
100
|
+
User -> Main conversation -> [agent-1, agent-2, agent-3] -> Main conversation -> User
|
|
98
101
|
```
|
|
99
102
|
|
|
100
103
|
---
|
|
@@ -106,15 +109,14 @@ When task requires multiple agents:
|
|
|
106
109
|
### MUST (Never violate)
|
|
107
110
|
| ID | Rule | Description |
|
|
108
111
|
|----|------|-------------|
|
|
109
|
-
| R000 | Language Policy |
|
|
112
|
+
| R000 | Language Policy | Korean I/O, English files, delegation model |
|
|
110
113
|
| R001 | Safety Rules | Prohibited actions, required checks |
|
|
111
114
|
| R002 | Permission Rules | Tool tiers, file access scope |
|
|
112
115
|
| R006 | Agent Design | Agent structure, separation of concerns |
|
|
113
116
|
| R007 | Agent Identification | **ENFORCED** - Display agent/skill in ALL responses |
|
|
114
117
|
| R008 | Tool Identification | **ENFORCED** - Display agent when using ANY tool |
|
|
115
|
-
| R009 | Parallel Execution | **ENFORCED** - Parallel execution
|
|
116
|
-
| R010 |
|
|
117
|
-
| R015 | Intent Transparency | **MUST** - Transparent agent routing |
|
|
118
|
+
| R009 | Parallel Execution | **ENFORCED** - Parallel execution, large task decomposition |
|
|
119
|
+
| R010 | Orchestrator Coordination | **ENFORCED** - Orchestrator coordination, session continuity, direct action prohibition |
|
|
118
120
|
| R016 | Continuous Improvement | **ENFORCED** - Update rules when violations occur |
|
|
119
121
|
| R017 | Sync Verification | **ENFORCED** - Verify sync before structural changes |
|
|
120
122
|
|
|
@@ -123,10 +125,11 @@ When task requires multiple agents:
|
|
|
123
125
|
|----|------|-------------|
|
|
124
126
|
| R003 | Interaction Rules | Response principles, status format |
|
|
125
127
|
| R004 | Error Handling | Error levels, recovery strategy |
|
|
126
|
-
| R011 | Memory Integration | Session persistence |
|
|
128
|
+
| R011 | Memory Integration | Session persistence with claude-mem |
|
|
127
129
|
| R012 | HUD Statusline | Real-time status display |
|
|
128
130
|
| R013 | Ecomode | Token efficiency for batch ops |
|
|
129
131
|
| R014 | Pipeline Mode | Sequential workflow execution |
|
|
132
|
+
| R015 | Intent Transparency | **MUST** - Transparent agent routing |
|
|
130
133
|
|
|
131
134
|
### MAY (Optional)
|
|
132
135
|
| ID | Rule | Description |
|
|
@@ -135,98 +138,70 @@ When task requires multiple agents:
|
|
|
135
138
|
|
|
136
139
|
## Commands
|
|
137
140
|
|
|
138
|
-
Commands
|
|
141
|
+
### Slash Commands (from Skills)
|
|
139
142
|
|
|
140
|
-
### System Commands
|
|
141
143
|
| Command | Description |
|
|
142
144
|
|---------|-------------|
|
|
145
|
+
| `/create-agent` | Create a new agent |
|
|
146
|
+
| `/update-docs` | Sync documentation with project structure |
|
|
147
|
+
| `/update-external` | Update agents from external sources |
|
|
148
|
+
| `/audit-agents` | Audit agent dependencies |
|
|
149
|
+
| `/fix-refs` | Fix broken references |
|
|
150
|
+
| `/dev-review` | Review code for best practices |
|
|
151
|
+
| `/dev-refactor` | Refactor code |
|
|
152
|
+
| `/memory-save` | Save session context to claude-mem |
|
|
153
|
+
| `/memory-recall` | Search and recall memories |
|
|
154
|
+
| `/pipeline-run` | Execute a defined pipeline |
|
|
155
|
+
| `/pipeline-list` | List available pipelines |
|
|
156
|
+
| `/npm-publish` | Publish package to npm registry |
|
|
157
|
+
| `/npm-version` | Manage semantic versions |
|
|
158
|
+
| `/npm-audit` | Audit dependencies |
|
|
159
|
+
| `/optimize-analyze` | Analyze bundle and performance |
|
|
160
|
+
| `/optimize-bundle` | Optimize bundle size |
|
|
161
|
+
| `/optimize-report` | Generate optimization report |
|
|
162
|
+
| `/sauron-watch` | Full R017 verification |
|
|
143
163
|
| `/lists` | Show all available commands |
|
|
144
164
|
| `/status` | Show system status |
|
|
145
165
|
| `/help` | Show help information |
|
|
146
166
|
|
|
147
|
-
### Manager Commands
|
|
148
|
-
| Command | Description |
|
|
149
|
-
|---------|-------------|
|
|
150
|
-
| `/mgr-creator:agent` | Create a new agent |
|
|
151
|
-
| `/mgr-updater:docs` | Sync documentation with project structure |
|
|
152
|
-
| `/mgr-supplier:audit` | Audit agent dependencies |
|
|
153
|
-
| `/mgr-supplier:fix` | Fix broken references |
|
|
154
|
-
| `/sys-naggy:list` | Show all TODO items |
|
|
155
|
-
| `/sys-naggy:add` | Add a new TODO item |
|
|
156
|
-
| `/sys-naggy:done` | Mark TODO item as complete |
|
|
157
|
-
| `/mgr-gitnerd:commit` | Create a git commit |
|
|
158
|
-
| `/mgr-gitnerd:branch` | Create or switch branches |
|
|
159
|
-
| `/mgr-gitnerd:pr` | Create a pull request |
|
|
160
|
-
| `/mgr-gitnerd:sync` | Sync with remote repository |
|
|
161
|
-
| `/mgr-sync-checker:check` | Run full synchronization check |
|
|
162
|
-
| `/mgr-sauron:watch` | Full R017 verification |
|
|
163
|
-
| `/mgr-sauron:quick` | Quick verification |
|
|
164
|
-
|
|
165
|
-
### Dev Commands
|
|
166
|
-
| Command | Description |
|
|
167
|
-
|---------|-------------|
|
|
168
|
-
| `/dev:review` | Review code for best practices |
|
|
169
|
-
| `/dev:refactor` | Refactor code |
|
|
170
|
-
|
|
171
|
-
### Tooling Commands
|
|
172
|
-
| Command | Description |
|
|
173
|
-
|---------|-------------|
|
|
174
|
-
| `/tool-npm-expert:publish` | Publish package to npm registry |
|
|
175
|
-
| `/tool-npm-expert:version` | Manage semantic versions |
|
|
176
|
-
| `/tool-optimizer:analyze` | Analyze bundle and performance |
|
|
177
|
-
| `/tool-optimizer:bundle` | Optimize bundle size |
|
|
178
|
-
|
|
179
|
-
### Memory Commands
|
|
180
|
-
| Command | Description |
|
|
181
|
-
|---------|-------------|
|
|
182
|
-
| `/sys-memory-keeper:save` | Save session context |
|
|
183
|
-
| `/sys-memory-keeper:recall` | Search and recall memories |
|
|
184
|
-
|
|
185
|
-
### Pipeline Commands
|
|
186
|
-
| Command | Description |
|
|
187
|
-
|---------|-------------|
|
|
188
|
-
| `/pipeline:run` | Execute a defined pipeline |
|
|
189
|
-
| `/pipeline:list` | List available pipelines |
|
|
190
|
-
|
|
191
167
|
## Project Structure
|
|
192
168
|
|
|
193
169
|
```
|
|
194
170
|
project/
|
|
195
171
|
+-- CLAUDE.md # Entry point
|
|
196
172
|
+-- .claude/
|
|
173
|
+
| +-- agents/ # Subagent definitions (34 files)
|
|
174
|
+
| +-- skills/ # Skills (42 directories)
|
|
197
175
|
| +-- rules/ # Global rules (R000-R017)
|
|
198
|
-
| +-- hooks/ # Hook scripts
|
|
199
|
-
| +-- contexts/ # Context files
|
|
200
|
-
|
|
201
|
-
| | +-- lang-golang-expert/
|
|
202
|
-
| | +-- lang-python-expert/
|
|
203
|
-
| | +-- be-fastapi-expert/
|
|
204
|
-
| | +-- fe-vercel-agent/
|
|
205
|
-
| | +-- mgr-creator/
|
|
206
|
-
| | +-- sys-memory-keeper/
|
|
207
|
-
| | +-- ... (34 total)
|
|
208
|
-
| +-- skills/ # Skill definitions
|
|
209
|
-
| | +-- routing/
|
|
210
|
-
| | +-- development/
|
|
211
|
-
| | +-- backend/
|
|
212
|
-
| | +-- infrastructure/
|
|
213
|
-
| | +-- system/
|
|
214
|
-
+-- guides/ # Reference docs
|
|
176
|
+
| +-- hooks/ # Hook scripts (memory, HUD)
|
|
177
|
+
| +-- contexts/ # Context files (ecomode)
|
|
178
|
+
+-- guides/ # Reference docs (13 topics)
|
|
215
179
|
+-- pipelines/ # Pipeline definitions
|
|
180
|
+
| +-- templates/
|
|
181
|
+
| +-- examples/
|
|
216
182
|
```
|
|
217
183
|
|
|
184
|
+
## Orchestration
|
|
185
|
+
|
|
186
|
+
Orchestration is handled by routing skills in the main conversation:
|
|
187
|
+
- **secretary-routing**: Routes management tasks to manager agents
|
|
188
|
+
- **dev-lead-routing**: Routes development tasks to language/framework experts
|
|
189
|
+
- **qa-lead-routing**: Coordinates QA workflow
|
|
190
|
+
|
|
191
|
+
The main conversation acts as the sole orchestrator. Subagents cannot spawn other subagents.
|
|
192
|
+
|
|
218
193
|
## Agents Summary
|
|
219
194
|
|
|
220
195
|
| Type | Count | Agents |
|
|
221
196
|
|------|-------|--------|
|
|
222
|
-
| Language | 6 | lang-golang-expert, lang-python-expert, lang-rust-expert, lang-kotlin-expert, lang-typescript-expert, lang-java21-expert |
|
|
223
|
-
| Backend | 5 | be-fastapi-expert, be-springboot-expert, be-go-backend-expert, be-express-expert, be-nestjs-expert |
|
|
224
|
-
| Frontend | 3 | fe-vercel-agent, fe-vuejs-agent, fe-svelte-agent |
|
|
225
|
-
| Tooling | 3 | tool-npm-expert, tool-optimizer, tool-bun-expert |
|
|
226
|
-
| Database | 1 | db-supabase-expert |
|
|
227
|
-
| Architect | 2 | arch-documenter, arch-speckit-agent |
|
|
228
|
-
|
|
|
229
|
-
| QA | 3 | qa-planner, qa-writer, qa-engineer |
|
|
197
|
+
| SW Engineer/Language | 6 | lang-golang-expert, lang-python-expert, lang-rust-expert, lang-kotlin-expert, lang-typescript-expert, lang-java21-expert |
|
|
198
|
+
| SW Engineer/Backend | 5 | be-fastapi-expert, be-springboot-expert, be-go-backend-expert, be-express-expert, be-nestjs-expert |
|
|
199
|
+
| SW Engineer/Frontend | 3 | fe-vercel-agent, fe-vuejs-agent, fe-svelte-agent |
|
|
200
|
+
| SW Engineer/Tooling | 3 | tool-npm-expert, tool-optimizer, tool-bun-expert |
|
|
201
|
+
| SW Engineer/Database | 1 | db-supabase-expert |
|
|
202
|
+
| SW Architect | 2 | arch-documenter, arch-speckit-agent |
|
|
203
|
+
| Infra Engineer | 2 | infra-docker-expert, infra-aws-expert |
|
|
204
|
+
| QA Team | 3 | qa-planner, qa-writer, qa-engineer |
|
|
230
205
|
| Manager | 6 | mgr-creator, mgr-updater, mgr-supplier, mgr-gitnerd, mgr-sync-checker, mgr-sauron |
|
|
231
206
|
| System | 2 | sys-memory-keeper, sys-naggy |
|
|
232
207
|
| Tutor | 1 | tutor-go |
|
|
@@ -238,23 +213,45 @@ project/
|
|
|
238
213
|
# Show all commands
|
|
239
214
|
/lists
|
|
240
215
|
|
|
241
|
-
#
|
|
242
|
-
/
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
/mgr-creator:agent my-agent --type language
|
|
216
|
+
# Agent management
|
|
217
|
+
/create-agent my-agent
|
|
218
|
+
/update-docs
|
|
219
|
+
/audit-agents
|
|
246
220
|
|
|
247
|
-
#
|
|
248
|
-
/dev
|
|
221
|
+
# Code review
|
|
222
|
+
/dev-review src/main.go
|
|
249
223
|
|
|
250
224
|
# Memory management
|
|
251
|
-
/
|
|
252
|
-
/
|
|
225
|
+
/memory-save
|
|
226
|
+
/memory-recall authentication
|
|
253
227
|
|
|
254
228
|
# Pipeline execution
|
|
255
|
-
/pipeline
|
|
256
|
-
/pipeline
|
|
229
|
+
/pipeline-list
|
|
230
|
+
/pipeline-run code-review --input file_path=src/main.go
|
|
257
231
|
|
|
258
|
-
#
|
|
259
|
-
|
|
232
|
+
# Verification
|
|
233
|
+
/sauron-watch
|
|
260
234
|
```
|
|
235
|
+
|
|
236
|
+
## Git Workflow (MUST follow)
|
|
237
|
+
|
|
238
|
+
| Branch | Purpose |
|
|
239
|
+
|--------|---------|
|
|
240
|
+
| `develop` | Main development branch (default) |
|
|
241
|
+
| `feature/*` | New features -> PR to develop |
|
|
242
|
+
| `release/*` | Release preparation -> **npm publish here only** |
|
|
243
|
+
| `hotfix/*` | Critical fixes -> tag -> publish -> merge to develop |
|
|
244
|
+
|
|
245
|
+
**Publishing flow:**
|
|
246
|
+
```
|
|
247
|
+
develop → release/x.y.z → npm publish → merge back to develop
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Key rules:**
|
|
251
|
+
- Create feature branches from `develop`
|
|
252
|
+
- **npm publish MUST only happen from release branch**
|
|
253
|
+
- Use conventional commits: `feat:`, `fix:`, `docs:`, `chore:`
|
|
254
|
+
- Include "Closes #N" in commit message to auto-close issues
|
|
255
|
+
- Pre-commit hooks run tests automatically
|
|
256
|
+
|
|
257
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed workflow.
|
package/templates/CLAUDE.md.ko
CHANGED
|
@@ -92,9 +92,12 @@ oh-my-customcode로 구동됩니다.
|
|
|
92
92
|
### 4. 오케스트레이터 조율 (다중 에이전트 작업 시 강제)
|
|
93
93
|
```
|
|
94
94
|
작업에 여러 에이전트가 필요할 때:
|
|
95
|
-
->
|
|
96
|
-
->
|
|
97
|
-
->
|
|
95
|
+
-> 메인 대화 (오케스트레이터)가 반드시 조율
|
|
96
|
+
-> 메인 대화가 적절한 에이전트에 작업 할당
|
|
97
|
+
-> 메인 대화가 결과 집계
|
|
98
|
+
|
|
99
|
+
흐름:
|
|
100
|
+
사용자 -> 메인 대화 -> [agent-1, agent-2, agent-3] -> 메인 대화 -> 사용자
|
|
98
101
|
```
|
|
99
102
|
|
|
100
103
|
---
|
|
@@ -106,15 +109,14 @@ oh-my-customcode로 구동됩니다.
|
|
|
106
109
|
### MUST (절대 위반 금지)
|
|
107
110
|
| ID | 규칙 | 설명 |
|
|
108
111
|
|----|------|------|
|
|
109
|
-
| R000 | 언어 정책 | 한국어 입출력, 영어
|
|
112
|
+
| R000 | 언어 정책 | 한국어 입출력, 영어 파일, 위임 모델 |
|
|
110
113
|
| R001 | 안전 규칙 | 금지된 작업, 필수 확인 |
|
|
111
114
|
| R002 | 권한 규칙 | 도구 티어, 파일 접근 범위 |
|
|
112
115
|
| R006 | 에이전트 설계 | 에이전트 구조, 관심사 분리 |
|
|
113
116
|
| R007 | 에이전트 식별 | **강제** - 모든 응답에 에이전트/스킬 표시 |
|
|
114
117
|
| R008 | 도구 식별 | **강제** - 모든 도구 사용 시 에이전트 표시 |
|
|
115
|
-
| R009 | 병렬 실행 | **강제** -
|
|
116
|
-
| R010 | 오케스트레이터 조율 | **강제** -
|
|
117
|
-
| R015 | 의도 투명성 | **필수** - 투명한 에이전트 라우팅 |
|
|
118
|
+
| R009 | 병렬 실행 | **강제** - 병렬 실행, 대규모 작업 분해 |
|
|
119
|
+
| R010 | 오케스트레이터 조율 | **강제** - 오케스트레이터 조율, 세션 연속성, 직접 실행 금지 |
|
|
118
120
|
| R016 | 지속적 개선 | **강제** - 위반 발생 시 규칙 업데이트 |
|
|
119
121
|
| R017 | 동기화 검증 | **강제** - 구조 변경 전 검증 |
|
|
120
122
|
|
|
@@ -123,10 +125,11 @@ oh-my-customcode로 구동됩니다.
|
|
|
123
125
|
|----|------|------|
|
|
124
126
|
| R003 | 상호작용 규칙 | 응답 원칙, 상태 형식 |
|
|
125
127
|
| R004 | 오류 처리 | 오류 수준, 복구 전략 |
|
|
126
|
-
| R011 | 메모리 통합 | 세션 지속성 |
|
|
128
|
+
| R011 | 메모리 통합 | claude-mem을 통한 세션 지속성 |
|
|
127
129
|
| R012 | HUD 상태줄 | 실시간 상태 표시 |
|
|
128
130
|
| R013 | Ecomode | 배치 작업 토큰 효율성 |
|
|
129
131
|
| R014 | 파이프라인 모드 | 순차 워크플로우 실행 |
|
|
132
|
+
| R015 | 의도 투명성 | **필수** - 투명한 에이전트 라우팅 |
|
|
130
133
|
|
|
131
134
|
### MAY (선택)
|
|
132
135
|
| ID | 규칙 | 설명 |
|
|
@@ -135,97 +138,70 @@ oh-my-customcode로 구동됩니다.
|
|
|
135
138
|
|
|
136
139
|
## 커맨드
|
|
137
140
|
|
|
138
|
-
|
|
141
|
+
### 슬래시 커맨드 (스킬 기반)
|
|
139
142
|
|
|
140
|
-
### 시스템 커맨드
|
|
141
143
|
| 커맨드 | 설명 |
|
|
142
144
|
|--------|------|
|
|
145
|
+
| `/create-agent` | 새 에이전트 생성 |
|
|
146
|
+
| `/update-docs` | 프로젝트 구조와 문서 동기화 |
|
|
147
|
+
| `/update-external` | 외부 소스에서 에이전트 업데이트 |
|
|
148
|
+
| `/audit-agents` | 에이전트 의존성 감사 |
|
|
149
|
+
| `/fix-refs` | 깨진 참조 수정 |
|
|
150
|
+
| `/dev-review` | 코드 베스트 프랙티스 리뷰 |
|
|
151
|
+
| `/dev-refactor` | 코드 리팩토링 |
|
|
152
|
+
| `/memory-save` | 세션 컨텍스트를 claude-mem에 저장 |
|
|
153
|
+
| `/memory-recall` | 메모리 검색 및 리콜 |
|
|
154
|
+
| `/pipeline-run` | 정의된 파이프라인 실행 |
|
|
155
|
+
| `/pipeline-list` | 사용 가능한 파이프라인 목록 |
|
|
156
|
+
| `/npm-publish` | npm 레지스트리에 패키지 배포 |
|
|
157
|
+
| `/npm-version` | 시맨틱 버전 관리 |
|
|
158
|
+
| `/npm-audit` | 의존성 감사 |
|
|
159
|
+
| `/optimize-analyze` | 번들 및 성능 분석 |
|
|
160
|
+
| `/optimize-bundle` | 번들 크기 최적화 |
|
|
161
|
+
| `/optimize-report` | 최적화 리포트 생성 |
|
|
162
|
+
| `/sauron-watch` | 전체 R017 검증 |
|
|
143
163
|
| `/lists` | 모든 사용 가능한 커맨드 표시 |
|
|
144
164
|
| `/status` | 시스템 상태 표시 |
|
|
145
165
|
| `/help` | 도움말 표시 |
|
|
146
166
|
|
|
147
|
-
### 매니저 커맨드
|
|
148
|
-
| 커맨드 | 설명 |
|
|
149
|
-
|--------|------|
|
|
150
|
-
| `/mgr-creator:agent` | 새 에이전트 생성 |
|
|
151
|
-
| `/mgr-updater:docs` | 프로젝트 구조와 문서 동기화 |
|
|
152
|
-
| `/mgr-supplier:audit` | 에이전트 의존성 감사 |
|
|
153
|
-
| `/mgr-supplier:fix` | 깨진 참조 수정 |
|
|
154
|
-
| `/sys-naggy:list` | 모든 TODO 항목 표시 |
|
|
155
|
-
| `/sys-naggy:add` | 새 TODO 항목 추가 |
|
|
156
|
-
| `/sys-naggy:done` | TODO 항목 완료 처리 |
|
|
157
|
-
| `/mgr-gitnerd:commit` | git 커밋 생성 |
|
|
158
|
-
| `/mgr-gitnerd:branch` | 브랜치 생성/전환 |
|
|
159
|
-
| `/mgr-gitnerd:pr` | 풀 리퀘스트 생성 |
|
|
160
|
-
| `/mgr-gitnerd:sync` | 원격 저장소와 동기화 |
|
|
161
|
-
| `/mgr-sync-checker:check` | 전체 동기화 검사 실행 |
|
|
162
|
-
| `/mgr-sauron:watch` | 전체 R017 검증 |
|
|
163
|
-
| `/mgr-sauron:quick` | 빠른 검증 |
|
|
164
|
-
|
|
165
|
-
### 개발 커맨드
|
|
166
|
-
| 커맨드 | 설명 |
|
|
167
|
-
|--------|------|
|
|
168
|
-
| `/dev:review` | 코드 베스트 프랙티스 리뷰 |
|
|
169
|
-
| `/dev:refactor` | 코드 리팩토링 |
|
|
170
|
-
|
|
171
|
-
### 툴링 커맨드
|
|
172
|
-
| 커맨드 | 설명 |
|
|
173
|
-
|--------|------|
|
|
174
|
-
| `/tool-npm-expert:publish` | npm 레지스트리에 패키지 배포 |
|
|
175
|
-
| `/tool-npm-expert:version` | 시맨틱 버전 관리 |
|
|
176
|
-
| `/tool-optimizer:analyze` | 번들 및 성능 분석 |
|
|
177
|
-
| `/tool-optimizer:bundle` | 번들 크기 최적화 |
|
|
178
|
-
|
|
179
|
-
### 메모리 커맨드
|
|
180
|
-
| 커맨드 | 설명 |
|
|
181
|
-
|--------|------|
|
|
182
|
-
| `/sys-memory-keeper:save` | 세션 컨텍스트 저장 |
|
|
183
|
-
| `/sys-memory-keeper:recall` | 메모리 검색 및 리콜 |
|
|
184
|
-
|
|
185
|
-
### 파이프라인 커맨드
|
|
186
|
-
| 커맨드 | 설명 |
|
|
187
|
-
|--------|------|
|
|
188
|
-
| `/pipeline:run` | 정의된 파이프라인 실행 |
|
|
189
|
-
| `/pipeline:list` | 사용 가능한 파이프라인 목록 |
|
|
190
|
-
|
|
191
167
|
## 프로젝트 구조
|
|
192
168
|
|
|
193
169
|
```
|
|
194
170
|
project/
|
|
195
171
|
+-- CLAUDE.md # 진입점
|
|
196
172
|
+-- .claude/
|
|
173
|
+
| +-- agents/ # 서브에이전트 정의 (34 파일)
|
|
174
|
+
| +-- skills/ # 스킬 (42 디렉토리)
|
|
197
175
|
| +-- rules/ # 전역 규칙 (R000-R017)
|
|
198
|
-
| +-- hooks/ # 훅 스크립트
|
|
199
|
-
| +-- contexts/ # 컨텍스트 파일
|
|
200
|
-
|
|
201
|
-
| | +-- lang-* # 언어 전문가 (6)
|
|
202
|
-
| | +-- be-* # 백엔드 전문가 (5)
|
|
203
|
-
| | +-- fe-* # 프론트엔드 전문가 (3)
|
|
204
|
-
| | +-- tool-* # 툴링 전문가 (3)
|
|
205
|
-
| | +-- db-* # 데이터베이스 전문가 (1)
|
|
206
|
-
| | +-- arch-* # 아키텍트 (2)
|
|
207
|
-
| | +-- infra-* # 인프라 전문가 (2)
|
|
208
|
-
| | +-- qa-* # QA 팀 (3)
|
|
209
|
-
| | +-- mgr-* # 매니저 (6)
|
|
210
|
-
| | +-- sys-* # 시스템 (2)
|
|
211
|
-
| | +-- tutor-* # 튜터 (1)
|
|
212
|
-
| +-- skills/ # 스킬 (routing/, execution/)
|
|
213
|
-
+-- guides/ # 레퍼런스 문서 (12)
|
|
176
|
+
| +-- hooks/ # 훅 스크립트 (메모리, HUD)
|
|
177
|
+
| +-- contexts/ # 컨텍스트 파일 (ecomode)
|
|
178
|
+
+-- guides/ # 레퍼런스 문서 (13 토픽)
|
|
214
179
|
+-- pipelines/ # 파이프라인 정의
|
|
180
|
+
| +-- templates/
|
|
181
|
+
| +-- examples/
|
|
215
182
|
```
|
|
216
183
|
|
|
184
|
+
## 오케스트레이션
|
|
185
|
+
|
|
186
|
+
오케스트레이션은 메인 대화의 라우팅 스킬로 처리됩니다:
|
|
187
|
+
- **secretary-routing**: 매니저 에이전트로 관리 작업 라우팅
|
|
188
|
+
- **dev-lead-routing**: 언어/프레임워크 전문가에게 개발 작업 라우팅
|
|
189
|
+
- **qa-lead-routing**: QA 워크플로우 조율
|
|
190
|
+
|
|
191
|
+
메인 대화가 유일한 오케스트레이터 역할을 합니다. 서브에이전트는 다른 서브에이전트를 생성할 수 없습니다.
|
|
192
|
+
|
|
217
193
|
## 에이전트 요약
|
|
218
194
|
|
|
219
195
|
| 타입 | 수량 | 에이전트 |
|
|
220
196
|
|------|------|----------|
|
|
221
|
-
| Language | 6 | lang-golang-expert, lang-python-expert, lang-rust-expert, lang-kotlin-expert, lang-typescript-expert, lang-java21-expert |
|
|
222
|
-
| Backend | 5 | be-fastapi-expert, be-springboot-expert, be-go-backend-expert, be-express-expert, be-nestjs-expert |
|
|
223
|
-
| Frontend | 3 | fe-vercel-agent, fe-vuejs-agent, fe-svelte-agent |
|
|
224
|
-
| Tooling | 3 | tool-npm-expert, tool-optimizer, tool-bun-expert |
|
|
225
|
-
| Database | 1 | db-supabase-expert |
|
|
226
|
-
| Architect | 2 | arch-documenter, arch-speckit-agent |
|
|
227
|
-
|
|
|
228
|
-
| QA | 3 | qa-planner, qa-writer, qa-engineer |
|
|
197
|
+
| SW Engineer/Language | 6 | lang-golang-expert, lang-python-expert, lang-rust-expert, lang-kotlin-expert, lang-typescript-expert, lang-java21-expert |
|
|
198
|
+
| SW Engineer/Backend | 5 | be-fastapi-expert, be-springboot-expert, be-go-backend-expert, be-express-expert, be-nestjs-expert |
|
|
199
|
+
| SW Engineer/Frontend | 3 | fe-vercel-agent, fe-vuejs-agent, fe-svelte-agent |
|
|
200
|
+
| SW Engineer/Tooling | 3 | tool-npm-expert, tool-optimizer, tool-bun-expert |
|
|
201
|
+
| SW Engineer/Database | 1 | db-supabase-expert |
|
|
202
|
+
| SW Architect | 2 | arch-documenter, arch-speckit-agent |
|
|
203
|
+
| Infra Engineer | 2 | infra-docker-expert, infra-aws-expert |
|
|
204
|
+
| QA Team | 3 | qa-planner, qa-writer, qa-engineer |
|
|
229
205
|
| Manager | 6 | mgr-creator, mgr-updater, mgr-supplier, mgr-gitnerd, mgr-sync-checker, mgr-sauron |
|
|
230
206
|
| System | 2 | sys-memory-keeper, sys-naggy |
|
|
231
207
|
| Tutor | 1 | tutor-go |
|
|
@@ -237,23 +213,45 @@ project/
|
|
|
237
213
|
# 모든 커맨드 표시
|
|
238
214
|
/lists
|
|
239
215
|
|
|
240
|
-
#
|
|
241
|
-
/
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
/mgr-creator:agent my-agent --type lang
|
|
216
|
+
# 에이전트 관리
|
|
217
|
+
/create-agent my-agent
|
|
218
|
+
/update-docs
|
|
219
|
+
/audit-agents
|
|
245
220
|
|
|
246
221
|
# 코드 리뷰
|
|
247
|
-
/dev
|
|
222
|
+
/dev-review src/main.go
|
|
248
223
|
|
|
249
224
|
# 메모리 관리
|
|
250
|
-
/
|
|
251
|
-
/
|
|
225
|
+
/memory-save
|
|
226
|
+
/memory-recall authentication
|
|
252
227
|
|
|
253
228
|
# 파이프라인 실행
|
|
254
|
-
/pipeline
|
|
255
|
-
/pipeline
|
|
229
|
+
/pipeline-list
|
|
230
|
+
/pipeline-run code-review --input file_path=src/main.go
|
|
231
|
+
|
|
232
|
+
# 검증
|
|
233
|
+
/sauron-watch
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Git 워크플로우 (반드시 준수)
|
|
237
|
+
|
|
238
|
+
| 브랜치 | 용도 |
|
|
239
|
+
|--------|------|
|
|
240
|
+
| `develop` | 메인 개발 브랜치 (기본) |
|
|
241
|
+
| `feature/*` | 새 기능 -> develop으로 PR |
|
|
242
|
+
| `release/*` | 릴리스 준비 -> **npm 배포는 여기서만** |
|
|
243
|
+
| `hotfix/*` | 긴급 수정 -> 태그 -> 배포 -> develop 머지 |
|
|
256
244
|
|
|
257
|
-
|
|
258
|
-
@lang-golang-expert 이것 리뷰해줘
|
|
245
|
+
**퍼블리싱 흐름:**
|
|
259
246
|
```
|
|
247
|
+
develop → release/x.y.z → npm publish → develop 머지
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**핵심 규칙:**
|
|
251
|
+
- `develop`에서 feature 브랜치 생성
|
|
252
|
+
- **npm publish는 반드시 release 브랜치에서만**
|
|
253
|
+
- Conventional commits 사용: `feat:`, `fix:`, `docs:`, `chore:`
|
|
254
|
+
- 커밋 메시지에 "Closes #N" 포함시 이슈 자동 종료
|
|
255
|
+
- Pre-commit 훅이 테스트 자동 실행
|
|
256
|
+
|
|
257
|
+
자세한 워크플로우는 [CONTRIBUTING.md](CONTRIBUTING.md) 참조.
|