oh-my-customcode 0.51.2 → 0.53.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
@@ -13,7 +13,7 @@
13
13
 
14
14
  **[한국어 문서 (Korean)](./README_ko.md)**
15
15
 
16
- 45 agents. 91 skills. 21 rules. One command.
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
@@ -52,6 +52,10 @@ oh-my-customcode is built on two ideas:
52
52
 
53
53
  Skills are source. Agents are compiled output. Sauron verifies the build. This separation means skills evolve independently of agents, and agents can be recompiled from updated skills at any time.
54
54
 
55
+ <p align="center">
56
+ <img src="assets/diagrams/05-compilation-metaphor.png" alt="Compilation Metaphor" width="700" />
57
+ </p>
58
+
55
59
  **2. If it can't be done, make it work.**
56
60
 
57
61
  When no specialist exists for a task, oh-my-customcode does not fail. It creates one.
@@ -85,6 +89,10 @@ User (natural language)
85
89
 
86
90
  Four routing skills cover the full domain:
87
91
 
92
+ <p align="center">
93
+ <img src="assets/diagrams/01-system-architecture.png" alt="System Architecture" width="700" />
94
+ </p>
95
+
88
96
  | Routing Skill | Routes To |
89
97
  |--------------|-----------|
90
98
  | secretary-routing | Manager agents (mgr-*), system agents (sys-*) |
@@ -138,7 +146,7 @@ Each agent declares its tools, model, memory scope, and limitations in YAML fron
138
146
 
139
147
  ---
140
148
 
141
- ### Skills (91)
149
+ ### Skills (92)
142
150
 
143
151
  | Category | Count | Includes |
144
152
  |----------|-------|----------|
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.51.2",
9326
+ version: "0.53.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.51.2",
1671
+ version: "0.53.0",
1672
1672
  description: "Batteries-included agent harness for Claude Code",
1673
1673
  type: "module",
1674
1674
  bin: {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "oh-my-customcode",
3
3
  "workspaces": ["packages/*"],
4
- "version": "0.51.2",
4
+ "version": "0.53.0",
5
5
  "description": "Batteries-included agent harness for Claude Code",
6
6
  "type": "module",
7
7
  "bin": {
@@ -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 Blocked Agents
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
@@ -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 패턴) |
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.51.2",
2
+ "version": "0.53.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": 91
21
+ "files": 92
22
22
  },
23
23
  {
24
24
  "name": "guides",