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 CHANGED
@@ -6,6 +6,8 @@
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
7
  [![CI](https://github.com/baekenough/oh-my-customcode/actions/workflows/ci.yml/badge.svg)](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", "commands", "hooks", "contexts"];
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", "agents", "skills", "guides", "pipelines", "commands"];
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-customcode",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Batteries-included agent harness for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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
  ```
@@ -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. Agent Routing (ENFORCED for multi-agent tasks)
92
+ ### 4. Orchestrator Coordination (ENFORCED for multi-agent tasks)
93
93
  ```
94
94
  When task requires multiple agents:
95
- -> Routing skills analyze request and route to appropriate agents
96
- -> Agents execute tasks based on their expertise
97
- -> Results are aggregated and returned
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 | English I/O and files |
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 for independent tasks |
116
- | R010 | Agent Routing | **ENFORCED** - Agent routing for multi-agent tasks |
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 use `/slash-command` format.
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
- | +-- agents/ # Flat agent directory
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
- | Infrastructure | 2 | infra-docker-expert, infra-aws-expert |
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
- # Audit dependencies
242
- /mgr-supplier:audit
243
-
244
- # Create new agent
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
- # Review code
248
- /dev:review src/main.go
221
+ # Code review
222
+ /dev-review src/main.go
249
223
 
250
224
  # Memory management
251
- /sys-memory-keeper:save
252
- /sys-memory-keeper:recall authentication
225
+ /memory-save
226
+ /memory-recall authentication
253
227
 
254
228
  # Pipeline execution
255
- /pipeline:list
256
- /pipeline:run code-review --input file_path=src/main.go
229
+ /pipeline-list
230
+ /pipeline-run code-review --input file_path=src/main.go
257
231
 
258
- # Override intent detection
259
- @lang-golang-expert review this
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.
@@ -92,9 +92,12 @@ oh-my-customcode로 구동됩니다.
92
92
  ### 4. 오케스트레이터 조율 (다중 에이전트 작업 시 강제)
93
93
  ```
94
94
  작업에 여러 에이전트가 필요할 때:
95
- -> secretary (오케스트레이터)가 반드시 조율
96
- -> secretary가 적절한 에이전트에 작업 할당
97
- -> secretary가 결과 집계
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
- 형식: `/slash-command [인자]`
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
- | +-- agents/ # 에이전트 (플랫 구조)
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
- | Infrastructure | 2 | infra-docker-expert, infra-aws-expert |
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
- /mgr-supplier:audit
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:review src/main.go
222
+ /dev-review src/main.go
248
223
 
249
224
  # 메모리 관리
250
- /sys-memory-keeper:save
251
- /sys-memory-keeper:recall authentication
225
+ /memory-save
226
+ /memory-recall authentication
252
227
 
253
228
  # 파이프라인 실행
254
- /pipeline:list
255
- /pipeline:run code-review --input file_path=src/main.go
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) 참조.