oh-my-customcode 0.3.2 → 0.5.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 +14 -67
- package/dist/cli/index.js +8 -68
- package/dist/index.js +23 -14
- package/package.json +6 -1
- package/templates/.claude/agents/arch-documenter.md +3 -0
- package/templates/.claude/agents/arch-speckit-agent.md +3 -0
- package/templates/.claude/agents/be-express-expert.md +3 -0
- package/templates/.claude/agents/be-fastapi-expert.md +4 -0
- package/templates/.claude/agents/be-go-backend-expert.md +4 -0
- package/templates/.claude/agents/be-nestjs-expert.md +3 -0
- package/templates/.claude/agents/be-springboot-expert.md +4 -0
- package/templates/.claude/agents/db-supabase-expert.md +2 -0
- package/templates/.claude/agents/fe-svelte-agent.md +3 -0
- package/templates/.claude/agents/fe-vercel-agent.md +6 -0
- package/templates/.claude/agents/fe-vuejs-agent.md +3 -0
- package/templates/.claude/agents/infra-aws-expert.md +4 -0
- package/templates/.claude/agents/infra-docker-expert.md +4 -0
- package/templates/.claude/agents/lang-golang-expert.md +4 -0
- package/templates/.claude/agents/lang-java21-expert.md +3 -0
- package/templates/.claude/agents/lang-kotlin-expert.md +4 -0
- package/templates/.claude/agents/lang-python-expert.md +4 -0
- package/templates/.claude/agents/lang-rust-expert.md +4 -0
- package/templates/.claude/agents/lang-typescript-expert.md +4 -0
- package/templates/.claude/agents/mgr-claude-code-bible.md +246 -0
- package/templates/.claude/agents/mgr-creator.md +6 -0
- package/templates/.claude/agents/mgr-gitnerd.md +4 -1
- package/templates/.claude/agents/mgr-sauron.md +34 -25
- package/templates/.claude/agents/mgr-supplier.md +4 -0
- package/templates/.claude/agents/mgr-sync-checker.md +4 -0
- package/templates/.claude/agents/mgr-updater.md +4 -0
- package/templates/.claude/agents/qa-engineer.md +3 -0
- package/templates/.claude/agents/qa-planner.md +3 -0
- package/templates/.claude/agents/qa-writer.md +3 -0
- package/templates/.claude/agents/sys-memory-keeper.md +14 -8
- package/templates/.claude/agents/sys-naggy.md +3 -0
- package/templates/.claude/agents/tool-bun-expert.md +3 -0
- package/templates/.claude/agents/tool-npm-expert.md +6 -0
- package/templates/.claude/agents/tool-optimizer.md +6 -0
- package/templates/.claude/hooks/hooks.json +3 -37
- package/templates/.claude/install-hooks.sh +1 -1
- package/templates/.claude/rules/MUST-agent-design.md +37 -0
- package/templates/.claude/rules/MUST-orchestrator-coordination.md +61 -0
- package/templates/.claude/rules/MUST-parallel-execution.md +85 -14
- package/templates/.claude/rules/MUST-sync-verification.md +13 -0
- package/templates/.claude/rules/MUST-tool-identification.md +23 -0
- package/templates/.claude/rules/SHOULD-hud-statusline.md +26 -10
- package/templates/.claude/rules/SHOULD-memory-integration.md +96 -78
- package/templates/.claude/rules/index.yaml +1 -9
- package/templates/.claude/skills/aws-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/claude-code-bible/SKILL.md +180 -0
- package/templates/.claude/skills/claude-code-bible/scripts/fetch-docs.js +244 -0
- package/templates/.claude/skills/docker-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/fastapi-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/go-backend-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/go-best-practices/CLAUDE.md +9 -0
- package/templates/.claude/skills/go-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/help/SKILL.md +1 -1
- package/templates/.claude/skills/intent-detection/SKILL.md +1 -0
- package/templates/.claude/skills/intent-detection/patterns/agent-triggers.yaml +8 -8
- package/templates/.claude/skills/kotlin-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/lists/SKILL.md +2 -2
- package/templates/.claude/skills/memory-management/SKILL.md +8 -7
- package/templates/.claude/skills/memory-recall/SKILL.md +5 -5
- package/templates/.claude/skills/memory-save/SKILL.md +4 -4
- package/templates/.claude/skills/python-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/react-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/result-aggregation/SKILL.md +1 -0
- package/templates/.claude/skills/rust-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/springboot-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/status/SKILL.md +2 -2
- package/templates/.claude/skills/supabase-postgres-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/typescript-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/web-design-guidelines/SKILL.md +1 -0
- package/templates/.claude/skills/writing-clearly-and-concisely/SKILL.md +64 -0
- package/templates/CLAUDE.md.en +40 -13
- package/templates/CLAUDE.md.ko +40 -13
- package/templates/guides/elements-of-style/elements-of-style.html +2609 -0
- package/templates/guides/index.yaml +1 -1
- package/templates/index.yaml +1 -1
- package/templates/manifest.json +5 -11
- package/templates/.claude/agents/tutor-go.md +0 -125
- package/templates/.claude/hooks/hud/index.yaml +0 -27
- package/templates/.claude/hooks/hud/update-status.sh +0 -32
- package/templates/.claude/hooks/index.yaml +0 -46
- package/templates/.claude/hooks/memory-persistence/pre-compact.sh +0 -37
- package/templates/.claude/hooks/memory-persistence/session-end.sh +0 -64
- package/templates/.claude/hooks/memory-persistence/session-start.sh +0 -41
- package/templates/.claude/hooks/strategic-compact/suggest-compact.sh +0 -50
- package/templates/.claude/rules/SHOULD-pipeline-mode.md +0 -165
- package/templates/.claude/skills/pipeline-execution/SKILL.md +0 -188
- package/templates/.claude/skills/pipeline-list/SKILL.md +0 -74
- package/templates/.claude/skills/pipeline-run/SKILL.md +0 -143
- 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/templates/pipelines/templates/pipeline-template.yaml +0 -50
- package/templates/templates/pipeline-template.yaml +0 -50
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ Like oh-my-zsh transformed shell customization, oh-my-customcode makes personali
|
|
|
16
16
|
|
|
17
17
|
| Feature | Description |
|
|
18
18
|
|---------|-------------|
|
|
19
|
-
| **Batteries Included** | 34 agents,
|
|
19
|
+
| **Batteries Included** | 34 agents, 41 skills, 14 guides - ready to use out of the box |
|
|
20
20
|
| **Sub-Agent Model** | Supports hierarchical agent orchestration with specialized roles |
|
|
21
21
|
| **Dead Simple Customization** | Create a folder + markdown file = new agent or skill |
|
|
22
22
|
| **Mix and Match** | Use built-in components, create your own, or combine both |
|
|
@@ -94,45 +94,19 @@ Claude Code selects the appropriate model and parallelizes independent tasks (up
|
|
|
94
94
|
|---------|-------|-------------|
|
|
95
95
|
| `/create-agent <name>` | mgr-creator | Create a new agent |
|
|
96
96
|
| `/update-docs` | mgr-updater | Sync docs with project structure |
|
|
97
|
-
| `/audit-
|
|
98
|
-
| `/
|
|
99
|
-
| `/
|
|
100
|
-
| `/sync-check` | mgr-sync-checker | Full synchronization check |
|
|
101
|
-
|
|
102
|
-
### Custom Pipelines
|
|
103
|
-
|
|
104
|
-
Define repeatable multi-agent workflows:
|
|
105
|
-
|
|
106
|
-
```yaml
|
|
107
|
-
# .claude/skills/pipelines/deploy-review.yaml
|
|
108
|
-
name: deploy-review
|
|
109
|
-
steps:
|
|
110
|
-
- id: security_scan
|
|
111
|
-
agent: qa-planner
|
|
112
|
-
action: security_review
|
|
113
|
-
|
|
114
|
-
- id: performance_check
|
|
115
|
-
agent: tool-optimizer
|
|
116
|
-
action: analyze_performance
|
|
117
|
-
|
|
118
|
-
- id: migration_review
|
|
119
|
-
agent: db-migration-expert
|
|
120
|
-
action: review_migrations
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
Run it: `/run-pipeline deploy-review`
|
|
97
|
+
| `/audit-agents` | mgr-supplier | Verify agent dependencies |
|
|
98
|
+
| `/dev-review` | lang-* experts | Review code with expert agents |
|
|
99
|
+
| `/sauron-watch` | mgr-sauron | Full synchronization check |
|
|
124
100
|
|
|
125
101
|
---
|
|
126
102
|
|
|
127
103
|
## What's Included
|
|
128
104
|
|
|
129
|
-
> **Templates synced from [baekgom-agents](https://github.com/baekenough/baekgom-agents)** - Battle-tested agent system with sub-agent orchestration support.
|
|
130
|
-
|
|
131
105
|
### Agents (34)
|
|
132
106
|
|
|
133
107
|
| Category | Count | Agents |
|
|
134
108
|
|----------|-------|--------|
|
|
135
|
-
| **Managers** |
|
|
109
|
+
| **Managers** | 7 | mgr-creator, mgr-updater, mgr-supplier, mgr-gitnerd, mgr-sync-checker, mgr-sauron, mgr-claude-code-bible |
|
|
136
110
|
| **System** | 2 | sys-memory-keeper, sys-naggy |
|
|
137
111
|
| **Languages** | 6 | lang-golang-expert, lang-python-expert, lang-rust-expert, lang-kotlin-expert, lang-typescript-expert, lang-java21-expert |
|
|
138
112
|
| **Frontend** | 3 | fe-vercel-agent, fe-vuejs-agent, fe-svelte-agent |
|
|
@@ -142,10 +116,9 @@ Run it: `/run-pipeline deploy-review`
|
|
|
142
116
|
| **Architecture** | 2 | arch-documenter, arch-speckit-agent |
|
|
143
117
|
| **Infrastructure** | 2 | infra-docker-expert, infra-aws-expert |
|
|
144
118
|
| **QA** | 3 | qa-planner, qa-writer, qa-engineer |
|
|
145
|
-
| **Tutor** | 1 | tutor-go |
|
|
146
119
|
| **Total** | **34** | |
|
|
147
120
|
|
|
148
|
-
### Skills (
|
|
121
|
+
### Skills (41)
|
|
149
122
|
|
|
150
123
|
Includes slash commands and capabilities:
|
|
151
124
|
|
|
@@ -156,7 +129,7 @@ Includes slash commands and capabilities:
|
|
|
156
129
|
- **Orchestration** (2): Pipeline execution, intent detection
|
|
157
130
|
- **Slash Commands** (20+): /create-agent, /code-review, /audit-dependencies, /sync-check, /commit, /pr, and more
|
|
158
131
|
|
|
159
|
-
### Guides (
|
|
132
|
+
### Guides (14)
|
|
160
133
|
|
|
161
134
|
Comprehensive reference documentation covering:
|
|
162
135
|
- Agent creation and management
|
|
@@ -165,13 +138,13 @@ Comprehensive reference documentation covering:
|
|
|
165
138
|
- Best practices and patterns
|
|
166
139
|
- Sub-agent orchestration
|
|
167
140
|
|
|
168
|
-
### Rules (
|
|
141
|
+
### Rules (17)
|
|
169
142
|
|
|
170
143
|
| Priority | Count | Purpose |
|
|
171
144
|
|----------|-------|---------|
|
|
172
|
-
| **MUST** |
|
|
173
|
-
| **SHOULD** |
|
|
174
|
-
| **MAY** |
|
|
145
|
+
| **MUST** | 11 | Safety, permissions, agent design (enforced) |
|
|
146
|
+
| **SHOULD** | 5 | Interactions, error handling (recommended) |
|
|
147
|
+
| **MAY** | 1 | Optimization guidelines (optional) |
|
|
175
148
|
|
|
176
149
|
---
|
|
177
150
|
|
|
@@ -197,7 +170,7 @@ After `omcustom init`:
|
|
|
197
170
|
your-project/
|
|
198
171
|
├── CLAUDE.md # Entry point for Claude
|
|
199
172
|
└── .claude/
|
|
200
|
-
├── rules/ # Behavior rules (
|
|
173
|
+
├── rules/ # Behavior rules (17 total)
|
|
201
174
|
├── hooks/ # Event hooks
|
|
202
175
|
├── contexts/ # Context files
|
|
203
176
|
├── agents/ # All agents (flat structure, 34 total)
|
|
@@ -205,13 +178,13 @@ your-project/
|
|
|
205
178
|
│ ├── be-fastapi-expert/
|
|
206
179
|
│ ├── mgr-creator/
|
|
207
180
|
│ └── ...
|
|
208
|
-
├── skills/ # All skills (
|
|
181
|
+
├── skills/ # All skills (41 total, includes slash commands)
|
|
209
182
|
│ ├── development/
|
|
210
183
|
│ ├── backend/
|
|
211
184
|
│ ├── infrastructure/
|
|
212
185
|
│ ├── system/
|
|
213
186
|
│ └── orchestration/
|
|
214
|
-
└── guides/ # Reference docs (
|
|
187
|
+
└── guides/ # Reference docs (14 total)
|
|
215
188
|
```
|
|
216
189
|
|
|
217
190
|
---
|
|
@@ -230,32 +203,6 @@ bun run build # Build for production
|
|
|
230
203
|
- Node.js >= 18.0.0
|
|
231
204
|
- Claude Code CLI
|
|
232
205
|
|
|
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
|
-
|
|
259
206
|
---
|
|
260
207
|
|
|
261
208
|
## Contributing
|
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) {
|
|
@@ -12828,7 +12808,7 @@ function getDefaultConfig() {
|
|
|
12828
12808
|
componentVersions: {},
|
|
12829
12809
|
agents: {},
|
|
12830
12810
|
preferences: getDefaultPreferences(),
|
|
12831
|
-
sourceRepo: "https://github.com/baekenough/
|
|
12811
|
+
sourceRepo: "https://github.com/baekenough/oh-my-customcode",
|
|
12832
12812
|
autoUpdate: {
|
|
12833
12813
|
enabled: false,
|
|
12834
12814
|
checkIntervalHours: 24,
|
|
@@ -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
|
|
@@ -321,7 +337,7 @@ function getDefaultConfig() {
|
|
|
321
337
|
componentVersions: {},
|
|
322
338
|
agents: {},
|
|
323
339
|
preferences: getDefaultPreferences(),
|
|
324
|
-
sourceRepo: "https://github.com/baekenough/
|
|
340
|
+
sourceRepo: "https://github.com/baekenough/oh-my-customcode",
|
|
325
341
|
autoUpdate: {
|
|
326
342
|
enabled: false,
|
|
327
343
|
checkIntervalHours: 24,
|
|
@@ -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);
|
|
@@ -555,11 +565,11 @@ async function getTemplateManifest() {
|
|
|
555
565
|
description: `${name} component`,
|
|
556
566
|
files: 0
|
|
557
567
|
})),
|
|
558
|
-
source: "https://github.com/baekenough/
|
|
568
|
+
source: "https://github.com/baekenough/oh-my-customcode"
|
|
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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oh-my-customcode",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Batteries-included agent harness for Claude Code",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -46,8 +46,13 @@
|
|
|
46
46
|
"yaml": "^2.8.2"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
+
"@anthropic-ai/sdk": "^0.39.0",
|
|
49
50
|
"@biomejs/biome": "^2.3.12",
|
|
50
51
|
"@types/bun": "^1.3.6",
|
|
52
|
+
"@types/js-yaml": "^4.0.9",
|
|
53
|
+
"@types/nodemailer": "^6.4.17",
|
|
54
|
+
"js-yaml": "^4.1.0",
|
|
55
|
+
"nodemailer": "^6.10.1",
|
|
51
56
|
"typescript": "^5.7.3",
|
|
52
57
|
"vitepress": "^1.6.3"
|
|
53
58
|
},
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
name: arch-documenter
|
|
3
3
|
description: Use for generating architecture documentation, API specifications (OpenAPI), Architecture Decision Records (ADRs), technical diagrams (Mermaid/PlantUML), and README maintenance
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills: []
|
|
5
8
|
tools:
|
|
6
9
|
- Read
|
|
7
10
|
- Write
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
name: arch-speckit-agent
|
|
3
3
|
description: Use for spec-driven development, transforming requirements into executable specifications, defining project constitution, creating technical plans, and generating TDD task lists
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills: []
|
|
5
8
|
tools:
|
|
6
9
|
- Read
|
|
7
10
|
- Write
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
name: be-express-expert
|
|
3
3
|
description: Expert Express.js developer for production-ready Node.js APIs following security best practices and 12-factor app principles. Use for Express.js APIs, REST API architectures, middleware chains, authentication/authorization, security hardening, and Node.js performance optimization.
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills: []
|
|
5
8
|
tools:
|
|
6
9
|
- Read
|
|
7
10
|
- Write
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
name: be-fastapi-expert
|
|
3
3
|
description: Expert FastAPI developer for building high-performance async Python APIs. Use for FastAPI projects, Python async/await patterns, Pydantic models, API architecture design, and performance optimization.
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills:
|
|
8
|
+
- fastapi-best-practices
|
|
5
9
|
tools:
|
|
6
10
|
- Read
|
|
7
11
|
- Write
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
name: be-go-backend-expert
|
|
3
3
|
description: Expert Go backend developer for production-ready services following Uber style guide and standard layout. Use for Go backend services, HTTP/gRPC servers, microservices in Go, concurrent systems, and Go performance optimization.
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills:
|
|
8
|
+
- go-backend-best-practices
|
|
5
9
|
tools:
|
|
6
10
|
- Read
|
|
7
11
|
- Write
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
name: be-nestjs-expert
|
|
3
3
|
description: Expert NestJS developer for opinionated, scalable Node.js applications with TypeScript. Use for NestJS projects, decorator-based patterns (@Injectable, @Module, @Controller), enterprise API architectures, authentication/authorization guards, DTO validation, and modular architecture.
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills: []
|
|
5
8
|
tools:
|
|
6
9
|
- Read
|
|
7
10
|
- Write
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
name: be-springboot-expert
|
|
3
3
|
description: Expert Spring Boot 3.5.x developer for enterprise-grade Java 21 applications. Use for Spring Boot projects, Java/Kotlin enterprise apps, RESTful APIs, microservices architecture, Spring Data, security patterns, virtual threads, and GraalVM native images.
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills:
|
|
8
|
+
- springboot-best-practices
|
|
5
9
|
tools:
|
|
6
10
|
- Read
|
|
7
11
|
- Write
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
name: db-supabase-expert
|
|
3
3
|
description: Supabase and PostgreSQL expert. Use when working with Supabase projects, writing SQL queries, designing database schemas, configuring Row-Level Security (RLS), optimizing Postgres performance, or managing connection pooling. Handles .sql files and Supabase configuration.
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: user
|
|
6
|
+
effort: high
|
|
5
7
|
tools:
|
|
6
8
|
- Read
|
|
7
9
|
- Write
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
name: fe-vercel-agent
|
|
3
3
|
description: Use for React/Next.js optimization, web design review (accessibility, UX), Vercel deployment automation, and bundle size optimization
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: medium
|
|
7
|
+
skills:
|
|
8
|
+
- react-best-practices
|
|
9
|
+
- web-design-guidelines
|
|
10
|
+
- vercel-deploy
|
|
5
11
|
tools:
|
|
6
12
|
- Read
|
|
7
13
|
- Write
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
name: infra-aws-expert
|
|
3
3
|
description: Use for AWS architecture design with Well-Architected Framework, infrastructure as code (CloudFormation/CDK/Terraform), VPC networking, IAM security, and cost optimization
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: user
|
|
6
|
+
effort: high
|
|
7
|
+
skills:
|
|
8
|
+
- aws-best-practices
|
|
5
9
|
tools:
|
|
6
10
|
- Read
|
|
7
11
|
- Write
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
name: infra-docker-expert
|
|
3
3
|
description: Use for creating optimized Dockerfiles, multi-stage builds, container security hardening, Docker Compose configurations, and image size optimization
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: user
|
|
6
|
+
effort: medium
|
|
7
|
+
skills:
|
|
8
|
+
- docker-best-practices
|
|
5
9
|
tools:
|
|
6
10
|
- Read
|
|
7
11
|
- Write
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
name: lang-golang-expert
|
|
3
3
|
description: Expert Go developer for writing idiomatic, performant Go code. Use for Go files (*.go, go.mod, go.sum), Go-related keywords, implementing concurrent systems, reviewing Go code, and optimizing Go applications.
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills:
|
|
8
|
+
- go-best-practices
|
|
5
9
|
tools:
|
|
6
10
|
- Read
|
|
7
11
|
- Write
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
name: lang-java21-expert
|
|
3
3
|
description: Expert Java 21 developer for modern Java with Virtual Threads, Pattern Matching, Record Patterns, and Sequenced Collections. Use for Java files (*.java, pom.xml, build.gradle), Java-related keywords, high-concurrency systems, data-centric APIs with Records, and migrating from older Java versions.
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills: []
|
|
5
8
|
tools:
|
|
6
9
|
- Read
|
|
7
10
|
- Write
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
name: lang-kotlin-expert
|
|
3
3
|
description: Expert Kotlin developer for writing idiomatic, concise, null-safe Kotlin code. Use for Kotlin files (*.kt, *.kts), Kotlin-related keywords, Android development, Kotlin multiplatform projects, and migrating Java to Kotlin.
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills:
|
|
8
|
+
- kotlin-best-practices
|
|
5
9
|
tools:
|
|
6
10
|
- Read
|
|
7
11
|
- Write
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
name: lang-python-expert
|
|
3
3
|
description: Expert Python developer for writing Pythonic, clean code following PEP 8. Use for Python files (*.py, requirements.txt, pyproject.toml), Python-related keywords, designing Python APIs, reviewing Python code, and optimizing Python applications.
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills:
|
|
8
|
+
- python-best-practices
|
|
5
9
|
tools:
|
|
6
10
|
- Read
|
|
7
11
|
- Write
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
name: lang-rust-expert
|
|
3
3
|
description: Expert Rust developer for writing safe, performant, idiomatic Rust code. Use for Rust files (*.rs, Cargo.toml), Rust-related keywords, designing safe APIs, debugging ownership/lifetime issues, and implementing high-performance systems.
|
|
4
4
|
model: sonnet
|
|
5
|
+
memory: project
|
|
6
|
+
effort: high
|
|
7
|
+
skills:
|
|
8
|
+
- rust-best-practices
|
|
5
9
|
tools:
|
|
6
10
|
- Read
|
|
7
11
|
- Write
|