oh-my-customcode 0.175.0 → 0.177.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/dist/cli/index.js CHANGED
@@ -241,7 +241,7 @@ var init_package = __esm(() => {
241
241
  workspaces: [
242
242
  "packages/*"
243
243
  ],
244
- version: "0.175.0",
244
+ version: "0.177.0",
245
245
  description: "Batteries-included agent harness for Claude Code",
246
246
  type: "module",
247
247
  bin: {
package/dist/index.js CHANGED
@@ -2031,7 +2031,7 @@ var package_default = {
2031
2031
  workspaces: [
2032
2032
  "packages/*"
2033
2033
  ],
2034
- version: "0.175.0",
2034
+ version: "0.177.0",
2035
2035
  description: "Batteries-included agent harness for Claude Code",
2036
2036
  type: "module",
2037
2037
  bin: {
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "workspaces": [
4
4
  "packages/*"
5
5
  ],
6
- "version": "0.175.0",
6
+ "version": "0.177.0",
7
7
  "description": "Batteries-included agent harness for Claude Code",
8
8
  "type": "module",
9
9
  "bin": {
@@ -12,6 +12,8 @@
12
12
 
13
13
  > **Tool-availability assumption (#1307 찐빠 #3)**: On first exploration, do NOT assume a tool (e.g., `Glob`) is available without confirming. Prefer `Bash` (`find`/`grep`) for initial search when the available-tool set is unconfirmed, to avoid "No such tool available" round-trips.
14
14
 
15
+ > **Platform tool variants (#1327 찐빠 #5)**: tool names differ by platform — e.g., macOS lacks GNU `timeout` (use `gtimeout` from coreutils). Confirm platform-specific tool availability before use.
16
+
15
17
  ### Capability-Aware Tool Scheduling
16
18
 
17
19
  When dispatching parallel tool calls, consider per-tool capabilities to optimize scheduling:
@@ -96,6 +96,10 @@ Never accept "pre-existing" without direct base-branch evidence. A false "pre-ex
96
96
  | "UI changes done" / "CSS updated" | type-check passes but browser render not verified; visual output unknown | Start dev server, open browser, confirm visual output; capture screenshot or describe what was seen |
97
97
  -->
98
98
 
99
+ ### Tool-Call Payload Completeness
100
+
101
+ 도구 호출의 required 파라미터는 invoke 전에 확인한다(완료 선언 후가 아니라 호출 시점의 전제조건). announce(prefix)만 출력하고 payload 의 required 필드를 누락하는 패턴은 R008 "Required-Parameter Completeness Check"가 canonical owner다. Reference: #1324.
102
+
99
103
  ## Completion Contract Format — [Contract] + [Done] with criterion/evidence pairs. See template via Read tool.
100
104
 
101
105
  <!-- DETAIL: Completion Contract Format
@@ -209,6 +213,20 @@ Session 108에서 `auto-dev.yaml` 4곳을 canonical 통일할 때, repo-root `./
209
213
 
210
214
  Origin: #1290 (session 109 retrospective).
211
215
 
216
+ ### Config-Schema-Before-Edit
217
+
218
+ > Origin: #1327 찐빠 #2 — a provider switch (to DeepSeek) planned a 3-command edit (auth + provider + default) but omitted `base_url`, which stayed pointed at the previous provider (openrouter.ai) — traffic would have mis-routed. The config's base_url override-precedence was never read before planning the edits.
219
+
220
+ Before planning edits to a configuration (provider switch, endpoint/base_url override, credential injection, multi-key precedence), READ the full config schema and its override-precedence chain first. Do NOT plan partial edits before understanding which fields override which.
221
+
222
+ This applies when a change touches a field that participates in an override/precedence/inheritance chain (e.g. provider + base_url, multi-key fallback, layered defaults). A single independent field edit (flip a flag, bump a timeout) does NOT require a full-schema read.
223
+
224
+ | Anti-pattern | Required |
225
+ |--------------|----------|
226
+ | Plan a provider/endpoint switch as N commands without reading the config's override chain | Read the full config schema (which field wins, defaults, inheritance) → enumerate EVERY field the switch touches (incl. base_url) → then plan |
227
+
228
+ Sibling discipline to Read-Before-Characterize (that rule governs diagnosis — don't label before reading; this one governs edit-planning completeness — enumerate every interdependent field before editing). Cross-ref: R023 (verification ladder — config completeness is a Tier-1 deterministic pre-check).
229
+
212
230
  ### Degraded-Output Re-Verification Gate (529 / buffering)
213
231
 
214
232
  When tool outputs show degradation signs — 529 errors, duplicated or truncated output, or a Read returning empty on a file that is known non-empty — you MUST re-verify any fact via a deterministic second source BEFORE any destructive or permanent action (recovery-agent dispatch, issue edit, commit, file restore). Do NOT characterize state ("corruption", "오염", "loop") from a single degraded read.
@@ -122,6 +122,21 @@ The Git Push Continuation pattern (first-time strict / follow-up relaxed, scoped
122
122
 
123
123
  Cross-references: R001 (safety — destructive operation pre-checks still apply), R002 (permission tiers). Reference issues: #1230, #1226 (item 2).
124
124
 
125
+ ## User-Provided Input Precedence
126
+
127
+ > Origin: #1327 찐빠 #1 — the user created a NEW GitHub OAuth App and provided fresh credentials, but a script's "reuse existing github IdP if present" logic kept the OLD IdP/client_id, so login flowed through the stale credential. The freshly-provided input was silently ignored.
128
+
129
+ When the user EXPLICITLY provides new input (credentials, config values, IdP, API keys, endpoints), applying that new input takes precedence over idempotent "reuse existing" logic. After applying, VERIFY the change took effect — but compare ONLY non-secret identifiers (client_id, endpoint URL, key fingerprint/last-4), NEVER echo secret values into the transcript (R001). For secret material, verify via a side-effect probe (e.g., a test auth call succeeds) rather than value comparison.
130
+
131
+ | Anti-pattern | Required |
132
+ |--------------|----------|
133
+ | "An existing X is present → reuse it" when the user just supplied a new X | Apply the user-supplied X; treat reuse-logic as a fallback only when the user supplied nothing |
134
+ | User-supplied X EQUALS the existing X | Reuse is correct (idempotent no-op) — do NOT re-provision |
135
+ | User supplies only a SUBSET of fields | Apply the supplied fields; reuse existing values only for the unsupplied fields |
136
+ | Apply new credential, assume it took effect | Verify post-apply via non-secret identifier match or a side-effect probe — never echo secret values (R001) |
137
+
138
+ Cross-reference: R001 (credential guardrails — never echo secret values), R020 (verify actual outcome).
139
+
125
140
  ## Agent Triggers
126
141
 
127
142
  Defined in `.claude/skills/intent-detection/patterns/agent-triggers.yaml`. Each agent has keywords, file patterns, actions, and base confidence.
@@ -40,6 +40,23 @@ Before delegating ANY destructive git command (the table above), the orchestrato
40
40
 
41
41
  Enumerate ALL affected work — intended uncommitted edits (rule changes, new skills/guides) count too, not just the symptom the user named. Prefer a non-destructive alternative (`git stash`) when the user's goal (e.g., "reach remote state") can be met without permanent loss.
42
42
 
43
+ ### Infra/Resource Deletion Blast-Radius (generalized)
44
+
45
+ > Origin: #1327 찐빠 #3 — a Cloudflare tunnel was deleted after confirming only the user-named hostname (hermes.baekenough.com) + active-connection=0; the full set of DNS records / endpoints the tunnel served was never enumerated.
46
+
47
+ The git blast-radius enumeration above generalizes to ALL infra/resource deletion (tunnels, DNS records, k8s resources, load balancers, security groups). Before deleting a shared infra resource, enumerate EVERY endpoint/hostname/route the resource serves — not just the one the user named.
48
+
49
+ | Resource | Enumerate before delete |
50
+ |----------|-------------------------|
51
+ | Tunnel (cloudflared, etc.) | All hostnames/DNS records routed through the tunnel (`cloudflared tunnel info` + full DNS record scan), not just the named hostname |
52
+ | DNS record / zone | All services resolving via the record |
53
+ | k8s resource (Service, Ingress, etc.) | All selectors/endpoints/routes it backs |
54
+ | Load balancer / Security group | All targets/rules attached |
55
+
56
+ Present the full served-endpoint list for explicit approval before deletion. Active-connection=0 on one hostname does NOT prove the resource is unused by others.
57
+
58
+ Prefer a reversible action (disable/detach/stop) over delete when the goal can be met without permanent teardown — infra deletions (tunnel/DNS/k8s) are frequently NOT recoverable. Note whether the deletion is recoverable before proceeding.
59
+
43
60
  ## Credential & Privileged-Scope Guardrails
44
61
 
45
62
  > Origin: #1266 ① (Critical) — a subagent dumped `.env` and Gmail OAuth credentials into the transcript (Credential Exploration) and ran an unauthorized credential-rotation flow that caused a dashboard data outage.
@@ -51,6 +68,8 @@ Enumerate ALL affected work — intended uncommitted edits (rule changes, new sk
51
68
  | Chaining an approved privileged action into adjacent unrequested ones | Each privileged op requires its own authorization trace |
52
69
  | Irreversible shared-infra action (prod pod exec, shared-ns secret delete, tunnel create) without scope re-confirmation | Re-confirm scope with the user before irreversible / shared-infra actions |
53
70
 
71
+ > **Ask-before-scan (#1327 찐빠 #4)**: When a credential/token is needed, request it from the user BEFORE running BLIND/DISCOVERY credential scans (`env | grep`, repo-wide token greps), which trip the Credential Exploration classifier. Reading a SPECIFIC file the user named to obtain a value is not a discovery scan and is fine. If a scan trips the classifier, do not retry it (R010 Subagent Scope-Creep STOP Protocol).
72
+
54
73
  Cross-reference: R010 Subagent Scope-Creep STOP Protocol, R002 (permission tiers).
55
74
 
56
75
  ## Required Before Destructive Operations
@@ -31,6 +31,17 @@ Incorrect parallel: tool_call(url1), tool_call(url2), tool_call(cmd) — no iden
31
31
  Correct parallel: list ALL [agent][model] → Tool/Fetching/Running lines FIRST, then all tool_calls
32
32
  -->
33
33
 
34
+ ### Required-Parameter Completeness Check
35
+
36
+ R008 prefix(announce)와 실제 도구 호출은 분리된 단계다. prefix 를 출력한 뒤 호출 payload 에서 도구 스키마상 required 파라미터를 누락하면 호출이 실패하거나 빈 동작이 된다. 호출 직전, prefix 존재뿐 아니라 required 파라미터가 모두 채워졌는지 확인한다.
37
+
38
+ | Anti-pattern | Required |
39
+ |--------------|----------|
40
+ | `[agent][model] → Tool: AskUserQuestion` prefix 만 출력하고 `questions` 파라미터 없이/빈 배열로 호출 | prefix + `questions` 배열(최소 1개) 모두 채워 호출 |
41
+ | announce 후 payload 의 required 필드 누락 (announce-payload separation gap) | announce 와 동일 메시지에서 required 필드 완비 호출 |
42
+
43
+ Cross-reference: R020 (action-completeness precondition — invoke 전에 required 파라미터 확인). Reference issue: #1324 (찐빠: AskUserQuestion `questions`-missing recurrence).
44
+
34
45
  ## Models
35
46
 
36
47
  | Model | Use |
@@ -117,8 +128,9 @@ Agent(description: "[2] Python code review", subagent_type: "lang-python-expert"
117
128
 
118
129
  1. 이 호출 위에 `[agent-name][model] → Tool: <tool-name>` 라인이 있는가?
119
130
  2. agent-name 과 model 이 현재 컨텍스트와 일치하는가?
131
+ 3. 이 호출에 도구 스키마상 required 파라미터가 모두 채워져 있는가? (예: AskUserQuestion 는 `questions` 배열이 비어 있지 않아야 함) prefix(announce)만 출력하고 실제 호출 payload 의 required 필드를 누락하면 안 된다.
120
132
 
121
- 체크 실패 시 즉시 prefix 추가 후 호출.
133
+ 체크 실패 시 즉시 prefix/필수 파라미터를 보완한 후 호출.
122
134
 
123
135
  ### Common Multi-Turn Violation
124
136
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.175.0",
2
+ "version": "0.177.0",
3
3
  "lastUpdated": "2026-05-20T00:00:00.000Z",
4
4
  "omcustomMinClaudeCode": "2.1.121",
5
5
  "omcustomMinClaudeCodeReason": "Sensitive-path direct Write/Edit on .claude/** under bypassPermissions (R010 deprecation, #1101)",