oh-my-customcode 0.51.2 → 0.52.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 +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/templates/.claude/hooks/hooks.json +10 -0
- package/templates/.claude/hooks/scripts/feedback-collector.sh +74 -0
- package/templates/.claude/rules/MUST-agent-teams.md +39 -1
- package/templates/.claude/skills/omcustom-improve-report/SKILL.md +65 -0
- package/templates/CLAUDE.md +1 -0
- package/templates/manifest.json +2 -2
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
**[한국어 문서 (Korean)](./README_ko.md)**
|
|
15
15
|
|
|
16
|
-
45 agents.
|
|
16
|
+
45 agents. 92 skills. 21 rules. One command.
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
19
|
npm install -g oh-my-customcode && cd your-project && omcustom init
|
|
@@ -138,7 +138,7 @@ Each agent declares its tools, model, memory scope, and limitations in YAML fron
|
|
|
138
138
|
|
|
139
139
|
---
|
|
140
140
|
|
|
141
|
-
### Skills (
|
|
141
|
+
### Skills (92)
|
|
142
142
|
|
|
143
143
|
| Category | Count | Includes |
|
|
144
144
|
|----------|-------|----------|
|
package/dist/cli/index.js
CHANGED
|
@@ -9323,7 +9323,7 @@ var init_package = __esm(() => {
|
|
|
9323
9323
|
package_default = {
|
|
9324
9324
|
name: "oh-my-customcode",
|
|
9325
9325
|
workspaces: ["packages/*"],
|
|
9326
|
-
version: "0.
|
|
9326
|
+
version: "0.52.0",
|
|
9327
9327
|
description: "Batteries-included agent harness for Claude Code",
|
|
9328
9328
|
type: "module",
|
|
9329
9329
|
bin: {
|
package/dist/index.js
CHANGED
|
@@ -1668,7 +1668,7 @@ import { join as join6 } from "node:path";
|
|
|
1668
1668
|
var package_default = {
|
|
1669
1669
|
name: "oh-my-customcode",
|
|
1670
1670
|
workspaces: ["packages/*"],
|
|
1671
|
-
version: "0.
|
|
1671
|
+
version: "0.52.0",
|
|
1672
1672
|
description: "Batteries-included agent harness for Claude Code",
|
|
1673
1673
|
type: "module",
|
|
1674
1674
|
bin: {
|
package/package.json
CHANGED
|
@@ -324,6 +324,16 @@
|
|
|
324
324
|
],
|
|
325
325
|
"description": "Batch-save agent outcomes to eval-core DB on session end (advisory, exit 0)"
|
|
326
326
|
},
|
|
327
|
+
{
|
|
328
|
+
"matcher": "*",
|
|
329
|
+
"hooks": [
|
|
330
|
+
{
|
|
331
|
+
"type": "command",
|
|
332
|
+
"command": "bash .claude/hooks/scripts/feedback-collector.sh"
|
|
333
|
+
}
|
|
334
|
+
],
|
|
335
|
+
"description": "Auto-extract failure patterns from session outcomes (advisory, exit 0)"
|
|
336
|
+
},
|
|
327
337
|
{
|
|
328
338
|
"matcher": "*",
|
|
329
339
|
"hooks": [
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# feedback-collector.sh — Auto-extract failure patterns from session outcomes
|
|
3
|
+
# Advisory-only: always exits 0, never blocks session end
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# Pass through stdin (Stop hook protocol)
|
|
8
|
+
cat > /dev/null
|
|
9
|
+
|
|
10
|
+
# Dependencies check
|
|
11
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
12
|
+
command -v sqlite3 >/dev/null 2>&1 || exit 0
|
|
13
|
+
|
|
14
|
+
# PID scoping
|
|
15
|
+
OUTCOMES_FILE="/tmp/.claude-task-outcomes-${PPID}"
|
|
16
|
+
[ -f "$OUTCOMES_FILE" ] || exit 0
|
|
17
|
+
|
|
18
|
+
# DB path
|
|
19
|
+
DB_PATH="${HOME}/.config/oh-my-customcode/eval-core.sqlite"
|
|
20
|
+
[ -f "$DB_PATH" ] || exit 0
|
|
21
|
+
|
|
22
|
+
# Count failures per agent type
|
|
23
|
+
declare -A FAILURE_COUNTS
|
|
24
|
+
declare -A TOTAL_COUNTS
|
|
25
|
+
|
|
26
|
+
while IFS= read -r line; do
|
|
27
|
+
agent_type=$(echo "$line" | jq -r '.agent_type // empty' 2>/dev/null) || continue
|
|
28
|
+
outcome=$(echo "$line" | jq -r '.outcome // empty' 2>/dev/null) || continue
|
|
29
|
+
[ -z "$agent_type" ] && continue
|
|
30
|
+
|
|
31
|
+
TOTAL_COUNTS[$agent_type]=$(( ${TOTAL_COUNTS[$agent_type]:-0} + 1 ))
|
|
32
|
+
if [ "$outcome" = "failure" ]; then
|
|
33
|
+
FAILURE_COUNTS[$agent_type]=$(( ${FAILURE_COUNTS[$agent_type]:-0} + 1 ))
|
|
34
|
+
fi
|
|
35
|
+
done < "$OUTCOMES_FILE"
|
|
36
|
+
|
|
37
|
+
# Detect repeated failure agents (3+ failures)
|
|
38
|
+
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
39
|
+
INSERTED=0
|
|
40
|
+
|
|
41
|
+
for agent_type in "${!FAILURE_COUNTS[@]}"; do
|
|
42
|
+
count=${FAILURE_COUNTS[$agent_type]}
|
|
43
|
+
total=${TOTAL_COUNTS[$agent_type]:-0}
|
|
44
|
+
[ "$count" -lt 3 ] && continue
|
|
45
|
+
|
|
46
|
+
# Determine confidence
|
|
47
|
+
if [ "$count" -ge 5 ]; then
|
|
48
|
+
confidence="high"
|
|
49
|
+
elif [ "$count" -ge 3 ]; then
|
|
50
|
+
confidence="medium"
|
|
51
|
+
else
|
|
52
|
+
confidence="low"
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
# Determine action type
|
|
56
|
+
if [ "$count" -ge 5 ]; then
|
|
57
|
+
action_type="escalate"
|
|
58
|
+
else
|
|
59
|
+
action_type="augment"
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
failure_rate=$(awk "BEGIN {printf \"%.2f\", $count/$total}")
|
|
63
|
+
description="Agent '${agent_type}' failed ${count}/${total} times (${failure_rate} failure rate) in session"
|
|
64
|
+
|
|
65
|
+
sqlite3 "$DB_PATH" "INSERT INTO improvementActions (targetType, targetName, actionType, description, confidence, feedbackSource, status, createdAt) VALUES ('agent', '${agent_type}', '${action_type}', '${description}', '${confidence}', 'outcome_derived', 'proposed', '${TIMESTAMP}');" 2>/dev/null || true
|
|
66
|
+
|
|
67
|
+
INSERTED=$((INSERTED + 1))
|
|
68
|
+
done
|
|
69
|
+
|
|
70
|
+
if [ "$INSERTED" -gt 0 ]; then
|
|
71
|
+
echo "[feedback-collector] Extracted ${INSERTED} failure pattern(s) from session outcomes" >&2
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
exit 0
|
|
@@ -135,6 +135,12 @@ The skill's steps are followed, but agent spawning uses Teams when criteria are
|
|
|
135
135
|
Agent(researcher-1) → Analysis 1 ┐
|
|
136
136
|
Agent(researcher-2) → Analysis 2 ├─ ALL spawned together
|
|
137
137
|
Agent(researcher-3) → Analysis 3 ┘
|
|
138
|
+
|
|
139
|
+
❌ WRONG: Completed member modifies other member's files
|
|
140
|
+
svelte-projects completes task → browses TaskList → edits agent-teams-advisor.sh (hook-fixer's scope)
|
|
141
|
+
|
|
142
|
+
✓ CORRECT: Completed member reports and waits
|
|
143
|
+
svelte-projects completes task → SendMessage("Task complete") → waits silently
|
|
138
144
|
```
|
|
139
145
|
|
|
140
146
|
## Cost Guidelines
|
|
@@ -205,12 +211,14 @@ When a team member is blocked by task dependencies:
|
|
|
205
211
|
| Silent wait | Agent already spawned, short wait expected | Minimal overhead |
|
|
206
212
|
| Reassign | Agent blocked >2 min with no progress | Reuse agent for unblocked work |
|
|
207
213
|
|
|
208
|
-
### Prompt Guidelines for
|
|
214
|
+
### Prompt Guidelines for Team Members
|
|
209
215
|
|
|
210
216
|
When spawning agents that may be blocked:
|
|
211
217
|
1. Include explicit instruction: "If your task is blocked, wait silently. Do NOT send periodic status messages."
|
|
212
218
|
2. Set check interval: "Check TaskList once per minute, not continuously."
|
|
213
219
|
3. Prefer deferred spawn when the dependency resolution time is unpredictable.
|
|
220
|
+
4. Post-completion instruction: "After completing your task, report via SendMessage and wait. Do NOT explore or modify files outside your scope."
|
|
221
|
+
5. Explicit scope boundary: "Your scope is limited to: {file list or directory}. Do NOT modify files outside this scope."
|
|
214
222
|
|
|
215
223
|
### Anti-Pattern: Idle Polling
|
|
216
224
|
|
|
@@ -225,6 +233,36 @@ When spawning agents that may be blocked:
|
|
|
225
233
|
docker-dev spawned with: "Wait silently if blocked. Check TaskList once per minute."
|
|
226
234
|
```
|
|
227
235
|
|
|
236
|
+
## Post-Completion Scope Constraint
|
|
237
|
+
|
|
238
|
+
When a team member completes its assigned task:
|
|
239
|
+
|
|
240
|
+
| Behavior | Correct | Wrong |
|
|
241
|
+
|----------|---------|-------|
|
|
242
|
+
| Task completed | Report completion via SendMessage, wait silently | Browse TaskList for other work |
|
|
243
|
+
| No more tasks | Exit or wait for team shutdown | Explore/modify files outside original scope |
|
|
244
|
+
| See unfinished work | Report to team lead, do NOT self-assign | Edit files that belong to other members |
|
|
245
|
+
|
|
246
|
+
### Self-Check (After Task Completion)
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
╔══════════════════════════════════════════════════════════════════╗
|
|
250
|
+
║ AFTER COMPLETING YOUR ASSIGNED TASK: ║
|
|
251
|
+
║ ║
|
|
252
|
+
║ 1. Did I complete ONLY my assigned task? ║
|
|
253
|
+
║ YES → Report completion ║
|
|
254
|
+
║ NO → Revert scope-violation changes ║
|
|
255
|
+
║ ║
|
|
256
|
+
║ 2. Are there files modified outside my task scope? ║
|
|
257
|
+
║ YES → This is a violation — revert ║
|
|
258
|
+
║ NO → Good ║
|
|
259
|
+
║ ║
|
|
260
|
+
║ 3. Am I about to explore/modify files for "other tasks"? ║
|
|
261
|
+
║ YES → STOP. Report to team lead instead ║
|
|
262
|
+
║ NO → Good. Wait silently or exit ║
|
|
263
|
+
╚══════════════════════════════════════════════════════════════════╝
|
|
264
|
+
```
|
|
265
|
+
|
|
228
266
|
## Lifecycle
|
|
229
267
|
|
|
230
268
|
```
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: omcustom-improve-report
|
|
3
|
+
description: Read-only report of improvement suggestions from eval-core analysis engine
|
|
4
|
+
scope: harness
|
|
5
|
+
user-invocable: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Improve Report
|
|
9
|
+
|
|
10
|
+
Display improvement suggestions from eval-core analysis engine as read-only report. No file modifications, no GitHub mutations.
|
|
11
|
+
|
|
12
|
+
## Purpose
|
|
13
|
+
|
|
14
|
+
Surface actionable improvement suggestions gathered by the eval-core analysis engine. Reads from eval-core's local database and renders insights as structured markdown. Useful for understanding routing quality, skill effectiveness, and agent usage patterns.
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
/omcustom:improve-report
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Workflow
|
|
23
|
+
|
|
24
|
+
### Step 1: Check eval-core availability
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
command -v eval-core 2>/dev/null || ls node_modules/.bin/eval-core 2>/dev/null
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
If not found → skip to Step 4 (fallback).
|
|
31
|
+
|
|
32
|
+
### Step 2: Run analysis
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
eval-core analyze --format markdown
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Step 3: Data sufficiency check
|
|
39
|
+
|
|
40
|
+
Count sessions recorded from the output metadata:
|
|
41
|
+
|
|
42
|
+
| Sessions recorded | Confidence | Behavior |
|
|
43
|
+
|-------------------|------------|----------|
|
|
44
|
+
| < 5 | `[confidence: low]` | Show results with message: "최소 5세션 이상의 데이터가 필요합니다. 현재 데이터로도 초기 분석은 가능하지만, 정확도는 제한적입니다." |
|
|
45
|
+
| 5–20 | `[confidence: medium]` | Show results with medium confidence note |
|
|
46
|
+
| > 20 | `[confidence: high]` | Show results normally |
|
|
47
|
+
|
|
48
|
+
### Step 4: Display
|
|
49
|
+
|
|
50
|
+
If output contains data → display as structured markdown with confidence annotation prepended.
|
|
51
|
+
|
|
52
|
+
If command not found OR output is empty:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
[omcustom:improve-report] 데이터 없음
|
|
56
|
+
eval-core가 설치되어 있지 않거나 아직 충분한 세션 데이터가 수집되지 않았습니다.
|
|
57
|
+
eval-core를 설치하거나 더 많은 세션을 진행한 후 다시 실행하세요.
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Notes
|
|
61
|
+
|
|
62
|
+
- **Read-only**: No file modifications, no GitHub issue creation, no external mutations
|
|
63
|
+
- **R010 compliant**: Only executes Bash for read-only analysis — no write operations delegated
|
|
64
|
+
- **Graceful fallback**: Falls back silently if eval-core or its DB doesn't exist
|
|
65
|
+
- **Confidence-aware**: Reports data sufficiency alongside results per R011 conventions
|
package/templates/CLAUDE.md
CHANGED
|
@@ -101,6 +101,7 @@ oh-my-customcode로 구동됩니다.
|
|
|
101
101
|
| `/omcustom:update-external` | 외부 소스에서 에이전트 업데이트 |
|
|
102
102
|
| `/omcustom:audit-agents` | 에이전트 의존성 감사 |
|
|
103
103
|
| `/omcustom:fix-refs` | 깨진 참조 수정 |
|
|
104
|
+
| `/omcustom:improve-report` | eval-core 기반 개선 현황 리포트 |
|
|
104
105
|
| `/omcustom-takeover` | 기존 에이전트/스킬에서 canonical spec 추출 |
|
|
105
106
|
| `/adversarial-review` | 공격자 관점 보안 코드 리뷰 |
|
|
106
107
|
| `/ambiguity-gate` | 요청 모호성 분석 및 명확화 질문 (ouroboros 패턴) |
|
package/templates/manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
2
|
+
"version": "0.52.0",
|
|
3
3
|
"lastUpdated": "2026-03-16T00:00:00.000Z",
|
|
4
4
|
"components": [
|
|
5
5
|
{
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"name": "skills",
|
|
19
19
|
"path": ".claude/skills",
|
|
20
20
|
"description": "Reusable skill modules (includes slash commands)",
|
|
21
|
-
"files":
|
|
21
|
+
"files": 92
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"name": "guides",
|