oh-my-customcode 0.4.0 → 0.6.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 +2 -2
- package/dist/cli/index.js +7 -67
- package/dist/index.js +21 -12
- package/package.json +1 -1
- package/templates/.claude/rules/MUST-orchestrator-coordination.md +13 -16
- package/templates/.claude/rules/SHOULD-agent-teams.md +137 -0
- package/templates/.claude/rules/index.yaml +60 -36
- package/templates/CLAUDE.md.en +17 -1
- package/templates/CLAUDE.md.ko +17 -1
- package/templates/manifest.json +2 -2
- package/templates/examples/code-review.yaml +0 -66
- package/templates/pipelines/examples/code-review.yaml +0 -66
- package/templates/pipelines/index.yaml +0 -18
package/README.md
CHANGED
|
@@ -138,7 +138,7 @@ Comprehensive reference documentation covering:
|
|
|
138
138
|
- Best practices and patterns
|
|
139
139
|
- Sub-agent orchestration
|
|
140
140
|
|
|
141
|
-
### Rules (
|
|
141
|
+
### Rules (18)
|
|
142
142
|
|
|
143
143
|
| Priority | Count | Purpose |
|
|
144
144
|
|----------|-------|---------|
|
|
@@ -170,7 +170,7 @@ After `omcustom init`:
|
|
|
170
170
|
your-project/
|
|
171
171
|
├── CLAUDE.md # Entry point for Claude
|
|
172
172
|
└── .claude/
|
|
173
|
-
├── rules/ # Behavior rules (
|
|
173
|
+
├── rules/ # Behavior rules (18 total)
|
|
174
174
|
├── hooks/ # Event hooks
|
|
175
175
|
├── contexts/ # Context files
|
|
176
176
|
├── agents/ # All agents (flat structure, 34 total)
|
package/dist/cli/index.js
CHANGED
|
@@ -12314,24 +12314,6 @@ async function checkHooks(targetDir) {
|
|
|
12314
12314
|
fixable: false
|
|
12315
12315
|
};
|
|
12316
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
12317
|
async function checkContexts(targetDir) {
|
|
12336
12318
|
const contextsDir = path.join(targetDir, ".claude", "contexts");
|
|
12337
12319
|
const exists2 = await isDirectory(contextsDir);
|
|
@@ -12384,7 +12366,6 @@ async function fixSingleIssue(check, targetDir) {
|
|
|
12384
12366
|
Skills: () => createMissingDirectory(path.join(targetDir, ".claude", "skills")),
|
|
12385
12367
|
Guides: () => createMissingDirectory(path.join(targetDir, "guides")),
|
|
12386
12368
|
Hooks: () => createMissingDirectory(path.join(targetDir, ".claude", "hooks")),
|
|
12387
|
-
Pipelines: () => createMissingDirectory(path.join(targetDir, "pipelines")),
|
|
12388
12369
|
Contexts: () => createMissingDirectory(path.join(targetDir, ".claude", "contexts")),
|
|
12389
12370
|
Symlinks: async () => {
|
|
12390
12371
|
if (!check.details || check.details.length === 0)
|
|
@@ -12441,7 +12422,6 @@ async function doctorCommand(options = {}) {
|
|
|
12441
12422
|
checkIndexFiles(targetDir),
|
|
12442
12423
|
checkGuides(targetDir),
|
|
12443
12424
|
checkHooks(targetDir),
|
|
12444
|
-
checkPipelines(targetDir),
|
|
12445
12425
|
checkContexts(targetDir)
|
|
12446
12426
|
]);
|
|
12447
12427
|
if (options.fix) {
|
|
@@ -12907,25 +12887,12 @@ function migrateConfig(config) {
|
|
|
12907
12887
|
}
|
|
12908
12888
|
|
|
12909
12889
|
// src/core/installer.ts
|
|
12910
|
-
var DIRECTORY_STRUCTURE = [
|
|
12911
|
-
".claude",
|
|
12912
|
-
".claude/rules",
|
|
12913
|
-
".claude/hooks",
|
|
12914
|
-
".claude/contexts",
|
|
12915
|
-
".claude/agents",
|
|
12916
|
-
".claude/skills",
|
|
12917
|
-
"guides",
|
|
12918
|
-
"pipelines",
|
|
12919
|
-
"pipelines/templates",
|
|
12920
|
-
"pipelines/examples"
|
|
12921
|
-
];
|
|
12922
12890
|
var COMPONENT_PATHS = {
|
|
12923
12891
|
"claude-md": "",
|
|
12924
12892
|
rules: ".claude/rules",
|
|
12925
12893
|
agents: ".claude/agents",
|
|
12926
12894
|
skills: ".claude/skills",
|
|
12927
12895
|
guides: "guides",
|
|
12928
|
-
pipelines: "pipelines",
|
|
12929
12896
|
hooks: ".claude/hooks",
|
|
12930
12897
|
contexts: ".claude/contexts"
|
|
12931
12898
|
};
|
|
@@ -13017,8 +12984,6 @@ async function install(options) {
|
|
|
13017
12984
|
await handleBackup(options.targetDir, !!options.backup, result);
|
|
13018
12985
|
await checkAndWarnExisting(options.targetDir, !!options.force, !!options.backup, result);
|
|
13019
12986
|
await verifyTemplateDirectory();
|
|
13020
|
-
await createDirectoryStructure(options.targetDir);
|
|
13021
|
-
debug("install.directories_created");
|
|
13022
12987
|
await installAllComponents(options.targetDir, options, result);
|
|
13023
12988
|
await installClaudeMdWithTracking(options.targetDir, options, result);
|
|
13024
12989
|
await updateInstallConfig(options.targetDir, options, result.installedComponents);
|
|
@@ -13031,14 +12996,8 @@ async function install(options) {
|
|
|
13031
12996
|
}
|
|
13032
12997
|
return result;
|
|
13033
12998
|
}
|
|
13034
|
-
async function createDirectoryStructure(targetDir) {
|
|
13035
|
-
for (const dir2 of DIRECTORY_STRUCTURE) {
|
|
13036
|
-
const fullPath = join3(targetDir, dir2);
|
|
13037
|
-
await ensureDirectory(fullPath);
|
|
13038
|
-
}
|
|
13039
|
-
}
|
|
13040
12999
|
function getAllComponents() {
|
|
13041
|
-
return ["rules", "agents", "skills", "guides", "
|
|
13000
|
+
return ["rules", "agents", "skills", "guides", "hooks", "contexts"];
|
|
13042
13001
|
}
|
|
13043
13002
|
async function installComponent(targetDir, component, options) {
|
|
13044
13003
|
const templatePath = COMPONENT_PATHS[component];
|
|
@@ -13088,7 +13047,7 @@ async function backupExisting(sourcePath, backupDir) {
|
|
|
13088
13047
|
return backupPath;
|
|
13089
13048
|
}
|
|
13090
13049
|
async function checkExistingPaths(targetDir) {
|
|
13091
|
-
const pathsToCheck = ["CLAUDE.md", ".claude", "guides"
|
|
13050
|
+
const pathsToCheck = ["CLAUDE.md", ".claude", "guides"];
|
|
13092
13051
|
const existingPaths = [];
|
|
13093
13052
|
for (const relativePath of pathsToCheck) {
|
|
13094
13053
|
const fullPath = join3(targetDir, relativePath);
|
|
@@ -13126,7 +13085,7 @@ async function checkExistingInstallation(targetDir) {
|
|
|
13126
13085
|
const claudeDir = join4(targetDir, ".claude");
|
|
13127
13086
|
return fileExists(claudeDir);
|
|
13128
13087
|
}
|
|
13129
|
-
var CLAUDE_SUBDIR_COMPONENTS = new Set(["rules", "hooks", "contexts"]);
|
|
13088
|
+
var CLAUDE_SUBDIR_COMPONENTS = new Set(["rules", "hooks", "contexts", "agents", "skills"]);
|
|
13130
13089
|
function componentToPath(targetDir, component) {
|
|
13131
13090
|
if (component === "claude-md") {
|
|
13132
13091
|
return join4(targetDir, "CLAUDE.md");
|
|
@@ -13541,30 +13500,13 @@ async function getContexts(targetDir) {
|
|
|
13541
13500
|
return [];
|
|
13542
13501
|
}
|
|
13543
13502
|
}
|
|
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
|
-
}
|
|
13560
13503
|
var COMPONENT_GETTERS = {
|
|
13561
13504
|
agents: getAgents,
|
|
13562
13505
|
skills: getSkills,
|
|
13563
13506
|
guides: getGuides,
|
|
13564
13507
|
rules: getRules,
|
|
13565
13508
|
hooks: getHooks,
|
|
13566
|
-
contexts: getContexts
|
|
13567
|
-
pipelines: getPipelines
|
|
13509
|
+
contexts: getContexts
|
|
13568
13510
|
};
|
|
13569
13511
|
function displayComponents(components, type, format) {
|
|
13570
13512
|
if (format === "json") {
|
|
@@ -13576,14 +13518,13 @@ function displayComponents(components, type, format) {
|
|
|
13576
13518
|
}
|
|
13577
13519
|
}
|
|
13578
13520
|
async function handleListAll(targetDir, format) {
|
|
13579
|
-
const [agents, skills, guides, rules, hooks, contexts
|
|
13521
|
+
const [agents, skills, guides, rules, hooks, contexts] = await Promise.all([
|
|
13580
13522
|
getAgents(targetDir),
|
|
13581
13523
|
getSkills(targetDir),
|
|
13582
13524
|
getGuides(targetDir),
|
|
13583
13525
|
getRules(targetDir),
|
|
13584
13526
|
getHooks(targetDir),
|
|
13585
|
-
getContexts(targetDir)
|
|
13586
|
-
getPipelines(targetDir)
|
|
13527
|
+
getContexts(targetDir)
|
|
13587
13528
|
]);
|
|
13588
13529
|
if (format !== "json") {
|
|
13589
13530
|
displayComponents(agents, "agents", format);
|
|
@@ -13592,9 +13533,8 @@ async function handleListAll(targetDir, format) {
|
|
|
13592
13533
|
displayComponents(rules, "rules", format);
|
|
13593
13534
|
displayComponents(hooks, "hooks", format);
|
|
13594
13535
|
displayComponents(contexts, "contexts", format);
|
|
13595
|
-
displayComponents(pipelines, "pipelines", format);
|
|
13596
13536
|
}
|
|
13597
|
-
return [...agents, ...skills, ...guides, ...rules, ...hooks, ...contexts
|
|
13537
|
+
return [...agents, ...skills, ...guides, ...rules, ...hooks, ...contexts];
|
|
13598
13538
|
}
|
|
13599
13539
|
async function listCommand(type = "all", options = {}) {
|
|
13600
13540
|
const targetDir = process.cwd();
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
8
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
|
+
for (let key of __getOwnPropNames(mod))
|
|
11
|
+
if (!__hasOwnProp.call(to, key))
|
|
12
|
+
__defProp(to, key, {
|
|
13
|
+
get: () => mod[key],
|
|
14
|
+
enumerable: true
|
|
15
|
+
});
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
2
18
|
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
3
19
|
|
|
4
20
|
// src/core/config.ts
|
|
@@ -408,10 +424,7 @@ var DIRECTORY_STRUCTURE = [
|
|
|
408
424
|
".claude/contexts",
|
|
409
425
|
".claude/agents",
|
|
410
426
|
".claude/skills",
|
|
411
|
-
"guides"
|
|
412
|
-
"pipelines",
|
|
413
|
-
"pipelines/templates",
|
|
414
|
-
"pipelines/examples"
|
|
427
|
+
"guides"
|
|
415
428
|
];
|
|
416
429
|
var COMPONENT_PATHS = {
|
|
417
430
|
"claude-md": "",
|
|
@@ -419,7 +432,6 @@ var COMPONENT_PATHS = {
|
|
|
419
432
|
agents: ".claude/agents",
|
|
420
433
|
skills: ".claude/skills",
|
|
421
434
|
guides: "guides",
|
|
422
|
-
pipelines: "pipelines",
|
|
423
435
|
hooks: ".claude/hooks",
|
|
424
436
|
contexts: ".claude/contexts"
|
|
425
437
|
};
|
|
@@ -511,8 +523,6 @@ async function install(options) {
|
|
|
511
523
|
await handleBackup(options.targetDir, !!options.backup, result);
|
|
512
524
|
await checkAndWarnExisting(options.targetDir, !!options.force, !!options.backup, result);
|
|
513
525
|
await verifyTemplateDirectory();
|
|
514
|
-
await createDirectoryStructure(options.targetDir);
|
|
515
|
-
debug("install.directories_created");
|
|
516
526
|
await installAllComponents(options.targetDir, options, result);
|
|
517
527
|
await installClaudeMdWithTracking(options.targetDir, options, result);
|
|
518
528
|
await updateInstallConfig(options.targetDir, options, result.installedComponents);
|
|
@@ -559,7 +569,7 @@ async function getTemplateManifest() {
|
|
|
559
569
|
};
|
|
560
570
|
}
|
|
561
571
|
function getAllComponents() {
|
|
562
|
-
return ["rules", "agents", "skills", "guides", "
|
|
572
|
+
return ["rules", "agents", "skills", "guides", "hooks", "contexts"];
|
|
563
573
|
}
|
|
564
574
|
async function installComponent(targetDir, component, options) {
|
|
565
575
|
const templatePath = COMPONENT_PATHS[component];
|
|
@@ -609,7 +619,7 @@ async function backupExisting(sourcePath, backupDir) {
|
|
|
609
619
|
return backupPath;
|
|
610
620
|
}
|
|
611
621
|
async function checkExistingPaths(targetDir) {
|
|
612
|
-
const pathsToCheck = ["CLAUDE.md", ".claude", "guides"
|
|
622
|
+
const pathsToCheck = ["CLAUDE.md", ".claude", "guides"];
|
|
613
623
|
const existingPaths = [];
|
|
614
624
|
for (const relativePath of pathsToCheck) {
|
|
615
625
|
const fullPath = join3(targetDir, relativePath);
|
|
@@ -764,7 +774,7 @@ async function preserveCustomizations(targetDir, customizations) {
|
|
|
764
774
|
return preserved;
|
|
765
775
|
}
|
|
766
776
|
function getAllUpdateComponents() {
|
|
767
|
-
return ["rules", "agents", "skills", "guides", "
|
|
777
|
+
return ["rules", "agents", "skills", "guides", "hooks", "contexts"];
|
|
768
778
|
}
|
|
769
779
|
async function getLatestVersion() {
|
|
770
780
|
const manifestPath = resolveTemplatePath("manifest.json");
|
|
@@ -812,7 +822,6 @@ function getComponentPath(component) {
|
|
|
812
822
|
agents: ".claude/agents",
|
|
813
823
|
skills: ".claude/skills",
|
|
814
824
|
guides: "guides",
|
|
815
|
-
pipelines: "pipelines",
|
|
816
825
|
hooks: ".claude/hooks",
|
|
817
826
|
contexts: ".claude/contexts"
|
|
818
827
|
};
|
|
@@ -823,7 +832,7 @@ async function backupInstallation(targetDir) {
|
|
|
823
832
|
const backupDir = join4(targetDir, `.omcustom-backup-${timestamp}`);
|
|
824
833
|
const fs = await import("node:fs/promises");
|
|
825
834
|
await ensureDirectory(backupDir);
|
|
826
|
-
const dirsToBackup = [".claude", "guides"
|
|
835
|
+
const dirsToBackup = [".claude", "guides"];
|
|
827
836
|
for (const dir of dirsToBackup) {
|
|
828
837
|
const srcPath = join4(targetDir, dir);
|
|
829
838
|
if (await fileExists(srcPath)) {
|
package/package.json
CHANGED
|
@@ -426,36 +426,33 @@ CORRECT:
|
|
|
426
426
|
╚══════════════════════════════════════════════════════════════════╝
|
|
427
427
|
```
|
|
428
428
|
|
|
429
|
-
##
|
|
429
|
+
## Agent Teams Integration
|
|
430
430
|
|
|
431
431
|
```
|
|
432
432
|
╔══════════════════════════════════════════════════════════════════╗
|
|
433
|
-
║ AGENT TEAMS (
|
|
433
|
+
║ AGENT TEAMS (ACTIVE WHEN ENABLED) ║
|
|
434
434
|
║ ║
|
|
435
|
-
║
|
|
436
|
-
║
|
|
435
|
+
║ When CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 is set: ║
|
|
436
|
+
║ → Actively use Agent Teams for qualifying tasks ║
|
|
437
|
+
║ → See R018 (SHOULD-agent-teams.md) for decision matrix ║
|
|
437
438
|
║ ║
|
|
438
439
|
║ Agent Teams enable: ║
|
|
439
440
|
║ - Peer-to-peer messaging between agents ║
|
|
440
441
|
║ - Shared task lists ║
|
|
441
442
|
║ - Complex collaborative workflows ║
|
|
442
443
|
║ ║
|
|
443
|
-
║
|
|
444
|
-
║ -
|
|
445
|
-
║ -
|
|
446
|
-
║ -
|
|
444
|
+
║ WHEN Agent Teams IS ENABLED: ║
|
|
445
|
+
║ - Use for research, review, debugging tasks (3+ agents) ║
|
|
446
|
+
║ - Use for tasks requiring inter-agent communication ║
|
|
447
|
+
║ - Use for shared state management ║
|
|
447
448
|
║ ║
|
|
448
|
-
║ WHEN
|
|
449
|
-
║ -
|
|
450
|
-
║ - Agents need to communicate with each other ║
|
|
451
|
-
║ - Shared state management required ║
|
|
452
|
-
║ ║
|
|
453
|
-
║ WHEN TO KEEP Task tool (DEFAULT): ║
|
|
449
|
+
║ WHEN Agent Teams IS NOT ENABLED (or for simple tasks): ║
|
|
450
|
+
║ - Use Task tool + routing skills (stable default) ║
|
|
454
451
|
║ - Focused, independent sub-tasks ║
|
|
455
452
|
║ - Cost-sensitive operations ║
|
|
456
|
-
║ - Predictable execution flow ║
|
|
457
453
|
║ ║
|
|
458
|
-
║
|
|
454
|
+
║ Both approaches coexist. Agent Teams adds coordination ║
|
|
455
|
+
║ richness, not replacement of Task tool. ║
|
|
459
456
|
╚══════════════════════════════════════════════════════════════════╝
|
|
460
457
|
```
|
|
461
458
|
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# [SHOULD] Agent Teams Rules
|
|
2
|
+
|
|
3
|
+
> **Priority**: SHOULD - Actively use when available
|
|
4
|
+
> **ID**: R018
|
|
5
|
+
> **Condition**: Agent Teams feature is enabled locally
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
When Claude Code's Agent Teams feature is enabled on the local machine, actively leverage it for tasks that benefit from multi-agent collaboration, shared state, and peer-to-peer communication.
|
|
10
|
+
|
|
11
|
+
## Detection
|
|
12
|
+
|
|
13
|
+
Agent Teams availability is determined by:
|
|
14
|
+
- Environment variable: `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`
|
|
15
|
+
- The presence of TeamCreate, SendMessage, TaskCreate/TaskList (team variants) tools
|
|
16
|
+
|
|
17
|
+
When detected, Agent Teams becomes the **preferred coordination method** for qualifying tasks.
|
|
18
|
+
|
|
19
|
+
## Decision Matrix
|
|
20
|
+
|
|
21
|
+
| Scenario | Task Tool | Agent Teams | Preferred |
|
|
22
|
+
|----------|-----------|-------------|-----------|
|
|
23
|
+
| Simple independent subtasks | Low cost | Overkill | **Task Tool** |
|
|
24
|
+
| Multi-step with shared state | Limited | Native support | **Agent Teams** |
|
|
25
|
+
| Research requiring discussion | No peer comm | Peer messaging | **Agent Teams** |
|
|
26
|
+
| Cost-sensitive batch ops | Lower tokens | Higher tokens | **Task Tool** |
|
|
27
|
+
| Complex debugging across modules | Isolated context | Shared context | **Agent Teams** |
|
|
28
|
+
| Code review + fix cycle | Sequential | Collaborative | **Agent Teams** |
|
|
29
|
+
| Single file operations | Fast | Overhead | **Task Tool** |
|
|
30
|
+
|
|
31
|
+
## When to Use Agent Teams
|
|
32
|
+
|
|
33
|
+
### SHOULD Use Agent Teams For
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Tasks requiring 3+ agents that need to coordinate
|
|
37
|
+
Research tasks where agents need to share findings
|
|
38
|
+
Debugging sessions spanning multiple modules
|
|
39
|
+
Review + implementation cycles
|
|
40
|
+
Any task where inter-agent communication adds value
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### SHOULD Keep Task Tool For
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
Independent parallel subtasks (no shared state)
|
|
47
|
+
Single-agent delegations
|
|
48
|
+
Cost-sensitive batch operations
|
|
49
|
+
Simple file operations
|
|
50
|
+
When Agent Teams is not available
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Team Composition Guidelines
|
|
54
|
+
|
|
55
|
+
### Standard Team Patterns
|
|
56
|
+
|
|
57
|
+
#### Research Team
|
|
58
|
+
```
|
|
59
|
+
TeamCreate("research-team")
|
|
60
|
+
+-- researcher-1: Explore codebase area A
|
|
61
|
+
+-- researcher-2: Explore codebase area B
|
|
62
|
+
+-- synthesizer: Aggregate findings
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
#### Development Team
|
|
66
|
+
```
|
|
67
|
+
TeamCreate("dev-team")
|
|
68
|
+
+-- implementer: Write code
|
|
69
|
+
+-- reviewer: Review changes
|
|
70
|
+
+-- tester: Validate changes
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
#### Debug Team
|
|
74
|
+
```
|
|
75
|
+
TeamCreate("debug-team")
|
|
76
|
+
+-- investigator-1: Trace issue in module A
|
|
77
|
+
+-- investigator-2: Trace issue in module B
|
|
78
|
+
+-- fixer: Apply fixes based on findings
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Team Lifecycle
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
1. TeamCreate -> Create team with purpose
|
|
85
|
+
2. TaskCreate -> Define tasks for team members
|
|
86
|
+
3. Task(team_name) -> Spawn team members
|
|
87
|
+
4. SendMessage -> Coordinate between members
|
|
88
|
+
5. TaskUpdate -> Track progress
|
|
89
|
+
6. SendMessage(shutdown_request) -> Graceful shutdown
|
|
90
|
+
7. TeamDelete -> Cleanup
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Fallback Behavior
|
|
94
|
+
|
|
95
|
+
When Agent Teams is NOT available:
|
|
96
|
+
- All team-qualifying tasks fall back to Task tool
|
|
97
|
+
- R009 (Parallel Execution) governs parallel spawning
|
|
98
|
+
- R010 (Orchestrator Coordination) governs delegation
|
|
99
|
+
- No degradation in capability, only in coordination richness
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
+------------------------------------------------------------------+
|
|
103
|
+
| GRACEFUL DEGRADATION |
|
|
104
|
+
| |
|
|
105
|
+
| Agent Teams Available: |
|
|
106
|
+
| Complex task -> TeamCreate -> coordinated agents |
|
|
107
|
+
| |
|
|
108
|
+
| Agent Teams NOT Available: |
|
|
109
|
+
| Complex task -> Task tool -> parallel independent agents |
|
|
110
|
+
| |
|
|
111
|
+
| Both approaches produce results. |
|
|
112
|
+
| Agent Teams adds coordination, not capability. |
|
|
113
|
+
+------------------------------------------------------------------+
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Integration with Existing Rules
|
|
117
|
+
|
|
118
|
+
| Rule | Integration |
|
|
119
|
+
|------|-------------|
|
|
120
|
+
| R009 (Parallel) | Task tool parallel = fallback when no Agent Teams |
|
|
121
|
+
| R010 (Orchestrator) | Agent Teams = alternative coordination model |
|
|
122
|
+
| R012 (HUD) | Team status displayed in HUD |
|
|
123
|
+
| R013 (Ecomode) | Team communications respect ecomode |
|
|
124
|
+
|
|
125
|
+
## Cost Awareness
|
|
126
|
+
|
|
127
|
+
Agent Teams consume more tokens due to:
|
|
128
|
+
- Full context per team member
|
|
129
|
+
- Inter-agent message passing
|
|
130
|
+
- Shared task list overhead
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
Rule of thumb:
|
|
134
|
+
If task takes < 3 minutes with Task tool -> Use Task tool
|
|
135
|
+
If task needs inter-agent communication -> Use Agent Teams
|
|
136
|
+
If unsure -> Start with Task tool, escalate to Agent Teams if needed
|
|
137
|
+
```
|
|
@@ -24,49 +24,26 @@ rules:
|
|
|
24
24
|
priority: MUST
|
|
25
25
|
scope: all
|
|
26
26
|
|
|
27
|
-
# SHOULD - Strongly recommended
|
|
28
|
-
- id: R003
|
|
29
|
-
name: interaction
|
|
30
|
-
title: Interaction Rules
|
|
31
|
-
path: ./SHOULD-interaction.md
|
|
32
|
-
priority: SHOULD
|
|
33
|
-
scope: all
|
|
34
|
-
|
|
35
|
-
- id: R004
|
|
36
|
-
name: error-handling
|
|
37
|
-
title: Error Handling Rules
|
|
38
|
-
path: ./SHOULD-error-handling.md
|
|
39
|
-
priority: SHOULD
|
|
40
|
-
scope: all
|
|
41
|
-
|
|
42
27
|
- id: R007
|
|
43
28
|
name: agent-identification
|
|
44
29
|
title: Agent Identification Rules
|
|
45
|
-
path: ./
|
|
46
|
-
priority:
|
|
30
|
+
path: ./MUST-agent-identification.md
|
|
31
|
+
priority: MUST
|
|
47
32
|
scope: all
|
|
48
33
|
|
|
49
34
|
- id: R008
|
|
50
35
|
name: tool-identification
|
|
51
36
|
title: Tool Usage Identification Rules
|
|
52
|
-
path: ./
|
|
53
|
-
priority:
|
|
54
|
-
scope: all
|
|
55
|
-
|
|
56
|
-
# MAY - Optional
|
|
57
|
-
- id: R005
|
|
58
|
-
name: optimization
|
|
59
|
-
title: Optimization Guide
|
|
60
|
-
path: ./MAY-optimization.md
|
|
61
|
-
priority: MAY
|
|
37
|
+
path: ./MUST-tool-identification.md
|
|
38
|
+
priority: MUST
|
|
62
39
|
scope: all
|
|
63
40
|
|
|
64
41
|
- id: R009
|
|
65
42
|
name: parallel-execution
|
|
66
43
|
title: Parallel Execution Rules
|
|
67
|
-
path: ./
|
|
68
|
-
priority:
|
|
69
|
-
scope:
|
|
44
|
+
path: ./MUST-parallel-execution.md
|
|
45
|
+
priority: MUST
|
|
46
|
+
scope: all
|
|
70
47
|
|
|
71
48
|
# Agent Design - MUST
|
|
72
49
|
- id: R006
|
|
@@ -84,6 +61,45 @@ rules:
|
|
|
84
61
|
priority: MUST
|
|
85
62
|
scope: agents
|
|
86
63
|
|
|
64
|
+
# Intent Transparency - MUST
|
|
65
|
+
- id: R015
|
|
66
|
+
name: intent-transparency
|
|
67
|
+
title: Intent Transparency Rules
|
|
68
|
+
path: ./MUST-intent-transparency.md
|
|
69
|
+
priority: MUST
|
|
70
|
+
scope: orchestrator
|
|
71
|
+
|
|
72
|
+
# Continuous Improvement - MUST
|
|
73
|
+
- id: R016
|
|
74
|
+
name: continuous-improvement
|
|
75
|
+
title: Continuous Improvement Rules
|
|
76
|
+
path: ./MUST-continuous-improvement.md
|
|
77
|
+
priority: MUST
|
|
78
|
+
scope: all
|
|
79
|
+
|
|
80
|
+
# Sync Verification - MUST
|
|
81
|
+
- id: R017
|
|
82
|
+
name: sync-verification
|
|
83
|
+
title: Sync Verification Rules
|
|
84
|
+
path: ./MUST-sync-verification.md
|
|
85
|
+
priority: MUST
|
|
86
|
+
scope: all
|
|
87
|
+
|
|
88
|
+
# SHOULD - Strongly recommended
|
|
89
|
+
- id: R003
|
|
90
|
+
name: interaction
|
|
91
|
+
title: Interaction Rules
|
|
92
|
+
path: ./SHOULD-interaction.md
|
|
93
|
+
priority: SHOULD
|
|
94
|
+
scope: all
|
|
95
|
+
|
|
96
|
+
- id: R004
|
|
97
|
+
name: error-handling
|
|
98
|
+
title: Error Handling Rules
|
|
99
|
+
path: ./SHOULD-error-handling.md
|
|
100
|
+
priority: SHOULD
|
|
101
|
+
scope: all
|
|
102
|
+
|
|
87
103
|
# Memory Integration - SHOULD
|
|
88
104
|
- id: R011
|
|
89
105
|
name: memory-integration
|
|
@@ -108,10 +124,18 @@ rules:
|
|
|
108
124
|
priority: SHOULD
|
|
109
125
|
scope: all
|
|
110
126
|
|
|
111
|
-
#
|
|
112
|
-
- id:
|
|
113
|
-
name:
|
|
114
|
-
title:
|
|
115
|
-
path: ./
|
|
116
|
-
priority:
|
|
127
|
+
# Agent Teams - SHOULD
|
|
128
|
+
- id: R018
|
|
129
|
+
name: agent-teams
|
|
130
|
+
title: Agent Teams Rules
|
|
131
|
+
path: ./SHOULD-agent-teams.md
|
|
132
|
+
priority: SHOULD
|
|
117
133
|
scope: orchestrator
|
|
134
|
+
|
|
135
|
+
# MAY - Optional
|
|
136
|
+
- id: R005
|
|
137
|
+
name: optimization
|
|
138
|
+
title: Optimization Guide
|
|
139
|
+
path: ./MAY-optimization.md
|
|
140
|
+
priority: MAY
|
|
141
|
+
scope: all
|
package/templates/CLAUDE.md.en
CHANGED
|
@@ -129,6 +129,7 @@ Flow:
|
|
|
129
129
|
| R012 | HUD Statusline | Real-time status display |
|
|
130
130
|
| R013 | Ecomode | Token efficiency for batch ops |
|
|
131
131
|
| R015 | Intent Transparency | **MUST** - Transparent agent routing |
|
|
132
|
+
| R018 | Agent Teams | Active use of Agent Teams when enabled |
|
|
132
133
|
|
|
133
134
|
### MAY (Optional)
|
|
134
135
|
| ID | Rule | Description |
|
|
@@ -169,7 +170,7 @@ project/
|
|
|
169
170
|
+-- .claude/
|
|
170
171
|
| +-- agents/ # Subagent definitions (34 files)
|
|
171
172
|
| +-- skills/ # Skills (41 directories)
|
|
172
|
-
| +-- rules/ # Global rules (R000-
|
|
173
|
+
| +-- rules/ # Global rules (R000-R018)
|
|
173
174
|
| +-- hooks/ # Hook scripts (memory, HUD)
|
|
174
175
|
| +-- contexts/ # Context files (ecomode)
|
|
175
176
|
+-- guides/ # Reference docs (13 topics)
|
|
@@ -200,6 +201,21 @@ The main conversation acts as the sole orchestrator. Subagents cannot spawn othe
|
|
|
200
201
|
| System | 2 | sys-memory-keeper, sys-naggy |
|
|
201
202
|
| **Total** | **34** | |
|
|
202
203
|
|
|
204
|
+
## Agent Teams
|
|
205
|
+
|
|
206
|
+
When Claude Code's Agent Teams feature is enabled (`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`), actively use it for qualifying tasks.
|
|
207
|
+
|
|
208
|
+
| Feature | Subagents (Default) | Agent Teams |
|
|
209
|
+
|---------|---------------------|-------------|
|
|
210
|
+
| Communication | Results to caller only | Peer-to-peer mailbox |
|
|
211
|
+
| Coordination | Orchestrator manages | Shared task list |
|
|
212
|
+
| Best for | Focused tasks | Research, review, debugging |
|
|
213
|
+
| Token cost | Lower | Higher |
|
|
214
|
+
|
|
215
|
+
**When enabled, actively use Agent Teams for complex collaborative tasks.**
|
|
216
|
+
See R018 (SHOULD-agent-teams.md) for the decision matrix.
|
|
217
|
+
Task tool + routing skills remain the fallback for simple/cost-sensitive tasks.
|
|
218
|
+
|
|
203
219
|
## Quick Reference
|
|
204
220
|
|
|
205
221
|
```bash
|
package/templates/CLAUDE.md.ko
CHANGED
|
@@ -129,6 +129,7 @@ oh-my-customcode로 구동됩니다.
|
|
|
129
129
|
| R012 | HUD 상태줄 | 실시간 상태 표시 |
|
|
130
130
|
| R013 | Ecomode | 배치 작업 토큰 효율성 |
|
|
131
131
|
| R015 | 의도 투명성 | **필수** - 투명한 에이전트 라우팅 |
|
|
132
|
+
| R018 | Agent Teams | 활성화 시 Agent Teams 적극 사용 |
|
|
132
133
|
|
|
133
134
|
### MAY (선택)
|
|
134
135
|
| ID | 규칙 | 설명 |
|
|
@@ -169,7 +170,7 @@ project/
|
|
|
169
170
|
+-- .claude/
|
|
170
171
|
| +-- agents/ # 서브에이전트 정의 (34 파일)
|
|
171
172
|
| +-- skills/ # 스킬 (41 디렉토리)
|
|
172
|
-
| +-- rules/ # 전역 규칙 (R000-
|
|
173
|
+
| +-- rules/ # 전역 규칙 (R000-R018)
|
|
173
174
|
| +-- hooks/ # 훅 스크립트 (메모리, HUD)
|
|
174
175
|
| +-- contexts/ # 컨텍스트 파일 (ecomode)
|
|
175
176
|
+-- guides/ # 레퍼런스 문서 (13 토픽)
|
|
@@ -200,6 +201,21 @@ project/
|
|
|
200
201
|
| System | 2 | sys-memory-keeper, sys-naggy |
|
|
201
202
|
| **총계** | **34** | |
|
|
202
203
|
|
|
204
|
+
## Agent Teams
|
|
205
|
+
|
|
206
|
+
Claude Code의 Agent Teams 기능이 활성화되어 있으면 (`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`), 적격한 작업에 적극적으로 사용합니다.
|
|
207
|
+
|
|
208
|
+
| 기능 | 서브에이전트 (기본) | Agent Teams |
|
|
209
|
+
|------|---------------------|-------------|
|
|
210
|
+
| 통신 | 호출자에게 결과만 반환 | 피어 투 피어 메시지 |
|
|
211
|
+
| 조율 | 오케스트레이터가 관리 | 공유 작업 목록 |
|
|
212
|
+
| 적합한 작업 | 집중된 작업 | 리서치, 리뷰, 디버깅 |
|
|
213
|
+
| 토큰 비용 | 낮음 | 높음 |
|
|
214
|
+
|
|
215
|
+
**활성화 시, 복잡한 협업 작업에 Agent Teams를 적극 사용합니다.**
|
|
216
|
+
결정 매트릭스는 R018 (SHOULD-agent-teams.md)을 참조하세요.
|
|
217
|
+
단순/비용 민감 작업에는 Task tool + 라우팅 스킬이 폴백으로 유지됩니다.
|
|
218
|
+
|
|
203
219
|
## 빠른 참조
|
|
204
220
|
|
|
205
221
|
```bash
|
package/templates/manifest.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "0.2.0",
|
|
3
|
-
"lastUpdated": "2026-02-
|
|
3
|
+
"lastUpdated": "2026-02-08T07:00:00.000Z",
|
|
4
4
|
"components": [
|
|
5
5
|
{
|
|
6
6
|
"name": "rules",
|
|
7
7
|
"path": ".claude/rules",
|
|
8
8
|
"description": "Agent behavior rules and guidelines",
|
|
9
|
-
"files":
|
|
9
|
+
"files": 19
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"name": "agents",
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# Code Review Pipeline
|
|
2
|
-
# Full code review workflow with language detection
|
|
3
|
-
|
|
4
|
-
name: code-review
|
|
5
|
-
description: Full code review workflow with automatic language detection
|
|
6
|
-
|
|
7
|
-
inputs:
|
|
8
|
-
- name: file_path
|
|
9
|
-
required: true
|
|
10
|
-
description: Path to the file to review
|
|
11
|
-
|
|
12
|
-
- name: focus
|
|
13
|
-
required: false
|
|
14
|
-
description: Focus area (style, security, performance, all)
|
|
15
|
-
default: all
|
|
16
|
-
|
|
17
|
-
steps:
|
|
18
|
-
# Step 1: Detect programming language
|
|
19
|
-
- id: detect_language
|
|
20
|
-
agent: secretary
|
|
21
|
-
action: detect_language
|
|
22
|
-
input:
|
|
23
|
-
file: "${file_path}"
|
|
24
|
-
output: language
|
|
25
|
-
description: Detect the programming language of the file
|
|
26
|
-
|
|
27
|
-
# Step 2: Code analysis by language expert
|
|
28
|
-
- id: analyze
|
|
29
|
-
agent: "${language}-expert"
|
|
30
|
-
action: analyze_code
|
|
31
|
-
input:
|
|
32
|
-
file: "${file_path}"
|
|
33
|
-
focus: "${focus}"
|
|
34
|
-
output: analysis
|
|
35
|
-
description: Analyze code using language-specific best practices
|
|
36
|
-
|
|
37
|
-
# Step 3: Security review
|
|
38
|
-
- id: security_check
|
|
39
|
-
agent: qa-lead
|
|
40
|
-
action: security_review
|
|
41
|
-
input:
|
|
42
|
-
file: "${file_path}"
|
|
43
|
-
findings: "${analysis}"
|
|
44
|
-
output: security
|
|
45
|
-
description: Check for security vulnerabilities
|
|
46
|
-
on_error: continue
|
|
47
|
-
|
|
48
|
-
# Step 4: Generate final report
|
|
49
|
-
- id: report
|
|
50
|
-
agent: documenter
|
|
51
|
-
action: generate_report
|
|
52
|
-
input:
|
|
53
|
-
file: "${file_path}"
|
|
54
|
-
language: "${language}"
|
|
55
|
-
analysis: "${analysis}"
|
|
56
|
-
security: "${security}"
|
|
57
|
-
output: report
|
|
58
|
-
description: Generate comprehensive review report
|
|
59
|
-
|
|
60
|
-
error_handling:
|
|
61
|
-
default: stop
|
|
62
|
-
|
|
63
|
-
metadata:
|
|
64
|
-
author: oh-my-customcode
|
|
65
|
-
version: 1.0.0
|
|
66
|
-
tags: [code-review, quality, security]
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# Code Review Pipeline
|
|
2
|
-
# Full code review workflow with language detection
|
|
3
|
-
|
|
4
|
-
name: code-review
|
|
5
|
-
description: Full code review workflow with automatic language detection
|
|
6
|
-
|
|
7
|
-
inputs:
|
|
8
|
-
- name: file_path
|
|
9
|
-
required: true
|
|
10
|
-
description: Path to the file to review
|
|
11
|
-
|
|
12
|
-
- name: focus
|
|
13
|
-
required: false
|
|
14
|
-
description: Focus area (style, security, performance, all)
|
|
15
|
-
default: all
|
|
16
|
-
|
|
17
|
-
steps:
|
|
18
|
-
# Step 1: Detect programming language
|
|
19
|
-
- id: detect_language
|
|
20
|
-
agent: secretary
|
|
21
|
-
action: detect_language
|
|
22
|
-
input:
|
|
23
|
-
file: "${file_path}"
|
|
24
|
-
output: language
|
|
25
|
-
description: Detect the programming language of the file
|
|
26
|
-
|
|
27
|
-
# Step 2: Code analysis by language expert
|
|
28
|
-
- id: analyze
|
|
29
|
-
agent: "${language}-expert"
|
|
30
|
-
action: analyze_code
|
|
31
|
-
input:
|
|
32
|
-
file: "${file_path}"
|
|
33
|
-
focus: "${focus}"
|
|
34
|
-
output: analysis
|
|
35
|
-
description: Analyze code using language-specific best practices
|
|
36
|
-
|
|
37
|
-
# Step 3: Security review
|
|
38
|
-
- id: security_check
|
|
39
|
-
agent: qa-lead
|
|
40
|
-
action: security_review
|
|
41
|
-
input:
|
|
42
|
-
file: "${file_path}"
|
|
43
|
-
findings: "${analysis}"
|
|
44
|
-
output: security
|
|
45
|
-
description: Check for security vulnerabilities
|
|
46
|
-
on_error: continue
|
|
47
|
-
|
|
48
|
-
# Step 4: Generate final report
|
|
49
|
-
- id: report
|
|
50
|
-
agent: arch-documenter
|
|
51
|
-
action: generate_report
|
|
52
|
-
input:
|
|
53
|
-
file: "${file_path}"
|
|
54
|
-
language: "${language}"
|
|
55
|
-
analysis: "${analysis}"
|
|
56
|
-
security: "${security}"
|
|
57
|
-
output: report
|
|
58
|
-
description: Generate comprehensive review report
|
|
59
|
-
|
|
60
|
-
error_handling:
|
|
61
|
-
default: stop
|
|
62
|
-
|
|
63
|
-
metadata:
|
|
64
|
-
author: oh-my-customcode
|
|
65
|
-
version: 1.0.0
|
|
66
|
-
tags: [code-review, quality, security]
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# Pipeline Registry
|
|
2
|
-
|
|
3
|
-
description: Registry of available pipelines for sequential workflows
|
|
4
|
-
|
|
5
|
-
pipelines:
|
|
6
|
-
- name: code-review
|
|
7
|
-
path: ./examples/code-review.yaml
|
|
8
|
-
description: Full code review workflow with language detection
|
|
9
|
-
|
|
10
|
-
templates:
|
|
11
|
-
- name: pipeline-template
|
|
12
|
-
path: ./templates/pipeline-template.yaml
|
|
13
|
-
description: Base template for creating new pipelines
|
|
14
|
-
|
|
15
|
-
usage:
|
|
16
|
-
run: "pipeline:run <name> --input key=value"
|
|
17
|
-
list: "pipeline:list"
|
|
18
|
-
create: "Use templates/pipeline-template.yaml as base"
|