oh-my-customcode 1.1.19 → 1.1.21
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 +4 -0
- package/templates/.claude/rules/MUST-agent-design.md +2 -0
- package/templates/.claude/rules/MUST-completion-verification.md +7 -5
- package/templates/.claude/rules/MUST-enforcement-policy.md +2 -0
- package/templates/.claude/rules/MUST-permissions.md +2 -0
- package/templates/.claude/rules/MUST-sync-verification.md +12 -0
- package/templates/.claude/rules/SHOULD-memory-integration.md +2 -0
- 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,10 +24,14 @@
|
|
|
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.
|
|
30
32
|
|
|
33
|
+
> **v2.1.210+**: Bash/PowerShell 명령이 timeout으로 auto-background될 때의 메시지가 개선되어 모델이 hang과 명시적 background 요청을 구분할 수 있으며, auto-background된 명령 내 `cd`는 적용되지 않고 tool result가 working directory 불변을 명시합니다 — auto-background 이후 cwd 의존 후속 명령은 절대 경로로 수행합니다. 또한 Grep content mode가 결과 끝을 지난 페이지네이션에서 "No matches found"를 반환하던 문제가 수정되었습니다(v2.1.208 Grep 페이지네이션 수정의 연장) — 구버전에서 이 응답은 "패턴 미존재"가 아니라 "페이지 끝"일 수 있습니다.
|
|
34
|
+
|
|
31
35
|
### Capability-Aware Tool Scheduling
|
|
32
36
|
|
|
33
37
|
When dispatching parallel tool calls, consider per-tool capabilities to optimize scheduling:
|
|
@@ -428,6 +428,8 @@ Key optional fields: `scope`, `context`, `version`, `effort`, `model`, `agent`,
|
|
|
428
428
|
> **v2.1.199+**: 스택된 slash-skill 호출(`/skill-a /skill-b do XYZ`)이 이제 leading skill을 최대 5개까지 모두 로드합니다(이전에는 첫 번째만 로드). oh-my-customcode의 라우팅 스킬 체이닝(예: `/omcustom:fsd`가 여러 스킬을 연쇄 호출하는 패턴)에서 다중 스킬 스택 호출 시 컨텍스트 손실이 줄어듭니다. 또한 subagent 조회 중 `/model`·`/fast`를 입력하면 lead의 model picker가 열리며 notice가 표시됩니다.
|
|
429
429
|
-->
|
|
430
430
|
|
|
431
|
+
> **v2.1.210+**: 스킬/커맨드 본문에서 인자 없이 호출된(unmatched) `$1`/`$2` positional placeholder가 조용히 제거되던(silently stripped) 동작이 수정되어 이제 리터럴 `$1`로 verbatim 보존됩니다 — 인자 부재 시 `$1`이 확장된 프롬프트에 그대로 남아 지시가 깨지므로, silent stripping에 옵션-인자 처리를 의존하지 말고 인자 부재 케이스를 명시 처리(default text / `$ARGUMENTS` guard / `argument-hint`)해야 합니다. (위 v2.1.163+ `\$1` escape는 항상 리터럴 `$` 출력용 별개 메커니즘으로 이번 변경 대상이 아니며, 이번 수정은 치환 의도의 bare `$1`이 unmatched일 때만 적용됩니다.)
|
|
432
|
+
|
|
431
433
|
<!-- DETAIL: Skill Optional Fields (full yaml block)
|
|
432
434
|
```yaml
|
|
433
435
|
scope: core # core | harness | package (default: core)
|
|
@@ -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
|
|
|
@@ -21,6 +21,8 @@ oh-my-customcode uses an **advisory-first enforcement model**. Most rules are en
|
|
|
21
21
|
|
|
22
22
|
> **v2.1.199+**: SessionStart/Setup/SubagentStart hook이 exit code 2로 종료할 때 stderr를 조용히 숨기던 문제가 수정되어 이제 오류가 표시됩니다. Hard Block/Advisory 계층(위 Enforcement Tiers 표)의 훅 실패 관측성을 강화합니다 — cf. v2.1.163 `additionalContext` 구조화 피드백.
|
|
23
23
|
|
|
24
|
+
> **v2.1.210+**: hook callback timeout이 모델에 user rejection으로 오보고되어 unattended 세션이 정지 대기하던 문제가 수정되었습니다. R021 advisory 훅(PostToolUse/UserPromptSubmit/Stop 등)이 매 턴 발화하고 /fsd 등 장기 무인 루프가 이에 의존하므로, hook timeout이 더 이상 phantom rejection으로 무인 세션을 중단시키지 않습니다 — cf. v2.1.199 훅 실패 관측성.
|
|
25
|
+
|
|
24
26
|
## Why Advisory-First
|
|
25
27
|
|
|
26
28
|
1. **Agent flexibility**: Hard blocks can trap agents in unrecoverable states
|
|
@@ -69,6 +69,8 @@ Use a `"*"` deny rule in `settings.json` to enforce a deny-by-default posture, t
|
|
|
69
69
|
|
|
70
70
|
> **v2.1.207+**: Auto mode가 Bedrock/Vertex/Foundry에서 `CLAUDE_CODE_ENABLE_AUTO_MODE` opt-in 없이 사용 가능해졌습니다(설정 `disableAutoMode`로 비활성화 가능). 또한 `-p`/SDK 비대화 실행의 remote managed settings가 consent 다이얼로그 없이 동의로 기록되던 문제가 수정되었습니다. Tier-3/4 권한 흐름 관련.
|
|
71
71
|
|
|
72
|
+
> **v2.1.210+**: `Write(path)`/`NotebookEdit(path)`/`Glob(path)` 형태의 permission rule은 시작 시 경고를 발생시킵니다 — 파일 쓰기 rule은 `Edit(path)`, 읽기 rule은 `Read(path)` matcher로 작성합니다. 위 Tier 표의 Write/NotebookEdit/Glob은 도구명일 뿐 path-scoped rule matcher가 아닙니다(위 v2.1.166 unknown-tool startup warning 연장선).
|
|
73
|
+
|
|
72
74
|
## Agent Tool Permission Mode
|
|
73
75
|
|
|
74
76
|
> Canonical source: R010 (MUST-orchestrator-coordination.md) "Universal bypassPermissions" owns the full requirement, rationale, self-check, and version history. Core rule: always pass `mode: "bypassPermissions"` explicitly on every Agent tool call — the Agent tool's default `mode` (`acceptEdits`) overrides agent frontmatter `permissionMode` and causes prompts during unattended execution. Skills that spawn agents MUST include this in their Agent tool call instructions. See R010 for details.
|
|
@@ -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 필수 게이트로 승격한다.
|
|
@@ -471,3 +471,5 @@ References: #1226 (item 3), #1227.
|
|
|
471
471
|
|
|
472
472
|
- Memory write failure is **non-blocking**: MUST NOT prevent session from ending
|
|
473
473
|
- If sys-memory-keeper fails to write MEMORY.md: log warning, confirm to user anyway
|
|
474
|
+
|
|
475
|
+
> **v2.1.210+**: MEMORY.md 인덱스가 read limit을 초과하게 만드는 memory write는 이제 silent truncation 대신 명시적 오류를 반환합니다. write 실패는 여전히 non-blocking이지만, 오류 수신 시 log-warning으로 끝내지 말고 예산 초과 처리(Attention-Weight Tiering — Cold 항목 archive 이동)로 축소 후 재시도합니다 — 이전의 silent truncation을 가정하고 oversize write를 던지면 업데이트가 반영되지 않습니다.
|
|
@@ -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