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 +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/templates/.claude/rules/MAY-optimization.md +2 -0
- package/templates/.claude/rules/MUST-completion-verification.md +7 -5
- package/templates/.claude/rules/MUST-sync-verification.md +12 -0
- package/templates/.claude/skills/sauron-watch/SKILL.md +3 -3
- package/templates/.github/workflows/cc-release-monitor.yml +23 -28
- package/templates/manifest.json +1 -1
package/dist/cli/index.js
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -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을 종료하지 말라"**를
|
|
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
|
|
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
|
-
|
|
|
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 >
|
|
113
|
-
ERROR: "Context fork cap exceeded: {count}/
|
|
112
|
+
If count > 12:
|
|
113
|
+
ERROR: "Context fork cap exceeded: {count}/12"
|
|
114
114
|
If count >= 8:
|
|
115
|
-
WARN: "Context fork usage high: {count}/
|
|
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
|
|
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 =
|
|
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 =
|
|
133
|
-
# Claude Code {version}
|
|
134
|
-
|
|
135
|
-
**
|
|
136
|
-
**
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
[
|
package/templates/manifest.json
CHANGED