oh-my-customcode 1.1.18 → 1.1.20

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: "1.1.18",
244
+ version: "1.1.20",
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: "1.1.18",
2034
+ version: "1.1.20",
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": "1.1.18",
6
+ "version": "1.1.20",
7
7
  "description": "Batteries-included agent harness for Claude Code",
8
8
  "type": "module",
9
9
  "bin": {
@@ -24,6 +24,8 @@
24
24
 
25
25
  > **`ls | tail` 시계열 오판 (#1417)**: `ls`는 파일명을 알파벳/사전순으로 정렬하므로 `ls <dir> | tail`로 "가장 최근 파일"을 판단하면 오판한다(파일명 순서 ≠ mtime 순서). 시계열 최신 판단은 `ls -t`, `find <dir> -newermt <ts>`, 또는 stat/timestamp 기반 정렬을 명시한다. `tail`만으로 "최신" 단정 금지. Origin: #1417 (외부 통화녹음 진단 세션 — `ls TPhoneCallRecords | tail -6`이 알파벳순이라 최신을 6/18로 오판 → `find -newermt`로 6/19~20 파일 발견해 정정).
26
26
 
27
+ > **파이프 뒤 `$?`는 마지막 명령의 exit code (#1492)**: `script.sh | tail -N; echo $?`처럼 검증 스크립트를 파이프에 연결한 뒤 `$?`로 읽으면 파이프라인 **마지막 명령**(`tail`)의 종료코드를 얻는다 — 스크립트 자체가 실패(exit 1)해도 `tail`이 성공(exit 0)하면 `$?=0`으로 "통과"를 오판한다. 검증 스크립트는 파이프 없이 단독 실행하거나 `${PIPESTATUS[0]}`으로 원본 exit code를 읽는다. **주의**: `${PIPESTATUS[0]}` 자체는 R023 Workflow JS 템플릿 리터럴 이스케이프 이슈(#1438, `${...}`를 JS가 평가해 ReferenceError)와 별개 문제 — 본 항목은 셸에서 파이프 뒤 exit code를 읽는 각도다. Origin: #1492 (Session 132 회고 찐빠 #3). Cross-ref: R020 ("command executed" ≠ "succeeded").
28
+
27
29
  > **v2.1.206+**: `/doctor`에 checked-in CLAUDE.md에서 코드베이스로부터 파생 가능한 내용을 잘라내도록 제안하는 체크가 추가되었습니다 — R005 "Context Optimization via HTML Comments"의 컨텍스트 절감 원칙과 정합(모델 불필요 메타데이터 축소).
28
30
 
29
31
  > **v2.1.208+**: Fixed several tool-reliability bugs: env vars like `CLAUDE_CODE_MAX_OUTPUT_TOKENS` silently used only the mantissa of scientific-notation values (`1e6` became `1`); Edit now succeeds on a file modified after being read, as long as the target text still matches uniquely; Read no longer misreports empty files as "shorter than offset"; Grep no longer silently returns "No files found" for invalid regex, no longer under-reports paginated count-mode totals; and Glob no longer crashes on a null byte in pattern/path/cwd.
@@ -73,17 +73,19 @@ Never accept "pre-existing" without direct base-branch evidence. A false "pre-ex
73
73
 
74
74
  ### Verification-Delegation Non-Termination (검증 위임 판정 종료 보장)
75
75
 
76
- 구조 검증(mgr-sauron R017)·판정·품질 게이트를 서브에이전트에 위임할 때, 위임 프롬프트에 **"최종 PASS/FAIL 판정 없이 turn을 종료하지 말라"**를 명시해야 한다. 이를 누락하면 검증 에이전트가 판정 직전(예: source-hash 대조 중)에서 turn을 종료해, 오케스트레이터가 판정 없는 불완전 보고를 받는다.
76
+ 구조 검증(mgr-sauron R017)·판정·품질 게이트를 서브에이전트에 위임할 때, 위임 프롬프트에 **"최종 PASS/FAIL 판정 없이 turn을 종료하지 말라"**를 명시한다 — 단 이 clause는 **보조 수단**일 뿐 1차 방어선이 아니다. clause를 명시해도 mid-step 종료가 5회 재발했다(v1.1.13/14/17/18/19, 아래 Origin 참조). **1차 방어선은 오케스트레이터의 직접 ground-truth 실측**이다.
77
77
 
78
- mid-step 종료가 발생하면 판정을 그대로 신뢰하지 말고(R020 Core Rule) SendMessage로 해당 에이전트를 resume하여 최종 판정을 받는다.
78
+ mid-step 종료는 예상 가능한 정상 실패 모드로 취급한다 — 발생 시 즉시 ground-truth를 실측해 실제 진행 상태를 확인한다. **증상만으로 결과를 넘겨짚지 않는다**: 같은 "...중" 한 줄 종료라도 실측 결과는 다를 수 있다(예: "merging now" 후 종료 → 실측 시 PR 이미 MERGED, resume 불필요 / "CI 실행 중" 후 종료 → 실측 시 PR OPEN 미머지, resume 필요). 미완이면 SendMessage로 resume하되, 오케스트레이터가 실측한 값(예: "CI 전부 통과, mergeStateStatus=CLEAN")을 resume 메시지에 동봉해 에이전트가 재폴링 후 재종료하는 루프를 끊는다.
79
79
 
80
80
  | Anti-pattern | Required |
81
81
  |--------------|----------|
82
- | 검증/판정 위임 프롬프트에 종료 조건 미명시 → 판정 없이 mid-step 종료 | 위임 프롬프트에 "판정 없이 turn 종료 금지" 명시 + mid-step 종료 시 SendMessage resume |
82
+ | 위임 프롬프트 clause 명시만으로 판정을 신뢰 | clause는 보조 수단; 오케스트레이터가 항상 직접 ground-truth 실측 |
83
+ | mid-step 종료 증상(예: "merging now")으로 결과를 넘겨짚음 | 매번 `gh pr view`/`gh run list` 등으로 실측 후 완료/미완료 판정 |
84
+ | resume 시 빈 재촉만 전달 | 실측값을 resume 메시지에 동봉해 재폴링 루프 차단 |
83
85
 
84
- Origin: #1443 (Session 126 회고 찐빠 #1) — v1.1.3 R017 검증에서 mgr-sauron이 source-hash 대조 중 판정 없이 종료 → resume 후 PASS. v1.1.4에서 "판정 반드시 출력" 명시로 1회 완료(대조 실증).
86
+ Origin: #1443 (Session 126 회고 찐빠 #1) — v1.1.3 R017 검증에서 mgr-sauron이 source-hash 대조 중 판정 없이 종료 → resume 후 PASS. v1.1.4에서 "판정 반드시 출력" 명시로 1회 완료(대조 실증). **5회 재발 확인(#1492, Session 132)**: v1.1.13/14/17(clause 명시에도 재발) → v1.1.18(완료조건 6항목+종료금지 명시에도 "merging now" 한 줄 남기고 종료, 실측 결과 이미 완료) → v1.1.19(위임 프롬프트에 "4회 무시됨"까지 명시했으나 "CI 실행 중" 한 줄 남기고 종료, 실측 결과 미완료). Session 132에서 2회 모두 오케스트레이터 직접 실측으로 복구 — clause 강화가 아니라 실측 습관화가 유일하게 실증된 방어선.
85
87
 
86
- Cross-reference: R018 (Member Completion Verification), `feedback_release_delegation_phasing` (release delegation phasing을 verification 위임에도 확장).
88
+ Cross-reference: R018 (Member Completion Verification), `feedback_release_delegation_phasing`, `feedback_orchestrator_direct_verify` (release delegation phasing을 verification 위임에도 확장).
87
89
 
88
90
  > **v2.1.199+**: subagent가 API 오류(usage limit reached 등)를 성공 결과로 오보하던 문제가 수정되어 이제 오류가 parent agent에 정확히 보고됩니다. 플랫폼 수정으로 false-success 자가보고 빈도는 줄지만, "actual outcome ≠ attempt" ground-truth 검증 원칙(R020 Core Rule)은 여전히 유지된다 — subagent 보고를 그대로 신뢰하지 말고 `git status`/`grep`/validation script로 재확인한다.
89
91
 
@@ -102,6 +102,18 @@ Any change to: agents, agent frontmatter, skills, guides, routing patterns, rule
102
102
  2. 테스트가 읽는 파일의 git tracked 상태를 확인했는가? (`git ls-files` 대조)
103
103
  3. 임시 skip된 검증 스크립트/테스트가 남아있지 않은가?
104
104
 
105
+ ### Restore-From-Deletion Regression Check (Origin: #1492)
106
+
107
+ 삭제된 파일/워크플로우/자산을 복원(restore)할 때, 삭제 이전에 그 파일에 적용된 **머지된 수정이 유실되지 않는지** 확인한다. 복원은 "되살리기"가 아니라 **최신 상태로의 재구성**이어야 한다.
108
+
109
+ | 확인 항목 | 명령 |
110
+ |-----------|------|
111
+ | 삭제 이전 수정 이력 | `git log --oneline -- <path>` (삭제 커밋 이전 커밋들 확인) |
112
+ | 복원 소스 시점 | 복원 대상이 **삭제 직전 커밋**인지 확인 — 더 오래된 버전/외부 사본이면 회귀 |
113
+ | 관련 PR 반영 여부 | 과거 수정 PR의 핵심 변경을 `grep`으로 재확인 |
114
+
115
+ Origin: #1492 (Session 132) — cc-release-monitor 워크플로우 삭제(#1454, 세션127) 후 복원(세션129)이 삭제 직전 이전 버전을 되살려 머지된 수정(#1451, `textwrap.dedent` 제거)이 소실. 약 8일간 결함 상태로 이슈 자동생성(#1489/#1490에 8칸 선행 들여쓰기+절단). Cross-ref: R020 (Read-Before-Characterize), R023 (Sample-Value Assembly — 문법 검증으로는 미노출, 샘플 조립 검증으로만 드러남).
116
+
105
117
  ## Pre-Branch Freshness Gate (Origin: #1433 #1, ≥3회 재발)
106
118
 
107
119
  세션 중 원격 머지(`gh pr merge` 등)가 발생한 뒤 새 릴리즈/작업 브랜치를 분기하기 전, 반드시 `git checkout develop && git pull origin develop`로 로컬 develop을 최신화한다. stale 로컬 develop에서 분기하면 새 브랜치가 이미 머지된 변경(직전 릴리즈)을 누락해 PR이 CONFLICTING 상태가 되고, merge+충돌해결+재CI 사이클이 강제된다. advisory 메모리(`feedback_session_memory_git_stale`)만으로는 ≥3회 재발을 막지 못해 R017 필수 게이트로 승격한다.
@@ -109,10 +109,10 @@ Build dependency graph:
109
109
  Count skills with context: fork in frontmatter:
110
110
  grep "context: fork" .claude/skills/*/SKILL.md
111
111
 
112
- If count > 10:
113
- ERROR: "Context fork cap exceeded: {count}/10"
112
+ If count > 12:
113
+ ERROR: "Context fork cap exceeded: {count}/12"
114
114
  If count >= 8:
115
- WARN: "Context fork usage high: {count}/10 — only {10-count} slots remaining"
115
+ WARN: "Context fork usage high: {count}/12 — only {12-count} slots remaining"
116
116
  ```
117
117
 
118
118
  All structural lints are **advisory** (WARN level) except circular dependencies and fork cap exceeded (ERROR level — should block commit).
@@ -29,7 +29,6 @@ jobs:
29
29
  import re
30
30
  import subprocess
31
31
  import sys
32
- import textwrap
33
32
 
34
33
  GH_TOKEN = os.environ["GH_TOKEN"]
35
34
  REPO = os.environ["GITHUB_REPOSITORY"]
@@ -120,39 +119,35 @@ jobs:
120
119
  skipped += 1
121
120
  continue
122
121
 
123
- # Truncate release body
124
- MAX_BODY = 2000
122
+ # Truncate release body (GitHub issue body hard limit: 65536 chars;
123
+ # MAX_BODY leaves a safety margin for the fixed template text below)
124
+ MAX_BODY = 60000
125
125
  if not body_raw:
126
126
  release_summary = "_릴리즈 노트가 제공되지 않았습니다._"
127
127
  elif len(body_raw) > MAX_BODY:
128
- release_summary = body_raw[:MAX_BODY] + "... (truncated)"
128
+ release_summary = (
129
+ body_raw[:MAX_BODY]
130
+ + "\n\n... (truncated — 전문은 위 Link 참조)"
131
+ )
129
132
  else:
130
133
  release_summary = body_raw
131
134
 
132
- issue_body = textwrap.dedent(f"""\
133
- # Claude Code {version}
134
-
135
- **Release:** {version}
136
- **Published:** {published_at}
137
- **Link:** {html_url}
138
-
139
- ## 릴리즈 요약
140
-
141
- {release_summary}
142
-
143
- ---
144
-
145
- ## 액션 아이템
146
-
147
- - [ ] oh-my-customcode 영향도 관점에서 릴리즈 노트 검토
148
- - [ ] 새 Claude Code 기능이 에이전트에 영향을 주면 에이전트 정의 갱신
149
- - [ ] 현재 oh-my-customcode 버전과의 호환성 테스트
150
- - [ ] 새 기능이 관련되면 CLAUDE.md 갱신
151
-
152
- ---
153
-
154
- _이 이슈는 cc-release-monitor GitHub Actions 워크플로우가 자동 생성했습니다._\
155
- """)
135
+ issue_body = (
136
+ f"# Claude Code {version}\n\n"
137
+ f"**Release:** {version}\n"
138
+ f"**Published:** {published_at}\n"
139
+ f"**Link:** {html_url}\n\n"
140
+ "## 릴리즈 요약\n\n"
141
+ f"{release_summary}\n\n"
142
+ "---\n\n"
143
+ "## 액션 아이템\n\n"
144
+ "- [ ] oh-my-customcode 영향도 관점에서 릴리즈 노트 검토\n"
145
+ "- [ ] 새 Claude Code 기능이 에이전트에 영향을 주면 에이전트 정의 갱신\n"
146
+ "- [ ] 현재 oh-my-customcode 버전과의 호환성 테스트\n"
147
+ "- [ ] 새 기능이 관련되면 CLAUDE.md 갱신\n\n"
148
+ "---\n\n"
149
+ "_이 이슈는 cc-release-monitor GitHub Actions 워크플로우가 자동 생성했습니다._\n"
150
+ )
156
151
 
157
152
  create = subprocess.run(
158
153
  [
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.18",
2
+ "version": "1.1.20",
3
3
  "lastUpdated": "2026-07-14T00:00:00.000Z",
4
4
  "omcustomMinClaudeCode": "2.1.121",
5
5
  "omcustomMinClaudeCodeReason": "Sensitive-path direct Write/Edit on .claude/** under bypassPermissions (R010 deprecation, #1101)",