oh-my-customcode 0.162.1 → 0.164.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 +4800 -4865
- package/dist/index.js +3 -3
- package/package.json +3 -3
- package/templates/.claude/rules/SHOULD-memory-integration.md +69 -0
- package/templates/.claude/skills/pipeline/workflows/auto-dev.yaml +42 -15
- package/templates/.claude/skills/scout/SKILL.md +23 -1
- package/templates/.claude/statusline.sh +132 -9
- package/templates/guides/claude-code/15-version-compatibility.md +91 -2
- package/templates/manifest.json +1 -1
- package/templates/workflows/auto-dev.yaml +309 -29
package/dist/index.js
CHANGED
|
@@ -2031,7 +2031,7 @@ var package_default = {
|
|
|
2031
2031
|
workspaces: [
|
|
2032
2032
|
"packages/*"
|
|
2033
2033
|
],
|
|
2034
|
-
version: "0.
|
|
2034
|
+
version: "0.164.0",
|
|
2035
2035
|
description: "Batteries-included agent harness for Claude Code",
|
|
2036
2036
|
type: "module",
|
|
2037
2037
|
bin: {
|
|
@@ -2074,12 +2074,12 @@ var package_default = {
|
|
|
2074
2074
|
dependencies: {
|
|
2075
2075
|
"@clack/prompts": "^1.1.0",
|
|
2076
2076
|
"@inquirer/prompts": "^8.3.2",
|
|
2077
|
-
commander: "^
|
|
2077
|
+
commander: "^15.0.0",
|
|
2078
2078
|
i18next: "^26.0.2",
|
|
2079
2079
|
yaml: "^2.8.2"
|
|
2080
2080
|
},
|
|
2081
2081
|
devDependencies: {
|
|
2082
|
-
"@anthropic-ai/sdk": "^0.
|
|
2082
|
+
"@anthropic-ai/sdk": "^0.100.1",
|
|
2083
2083
|
"@biomejs/biome": "^2.3.12",
|
|
2084
2084
|
"@types/bun": "^1.3.6",
|
|
2085
2085
|
"@types/js-yaml": "^4.0.9",
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"workspaces": [
|
|
4
4
|
"packages/*"
|
|
5
5
|
],
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.164.0",
|
|
7
7
|
"description": "Batteries-included agent harness for Claude Code",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"bin": {
|
|
@@ -46,12 +46,12 @@
|
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@clack/prompts": "^1.1.0",
|
|
48
48
|
"@inquirer/prompts": "^8.3.2",
|
|
49
|
-
"commander": "^
|
|
49
|
+
"commander": "^15.0.0",
|
|
50
50
|
"i18next": "^26.0.2",
|
|
51
51
|
"yaml": "^2.8.2"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@anthropic-ai/sdk": "^0.
|
|
54
|
+
"@anthropic-ai/sdk": "^0.100.1",
|
|
55
55
|
"@biomejs/biome": "^2.3.12",
|
|
56
56
|
"@types/bun": "^1.3.6",
|
|
57
57
|
"@types/js-yaml": "^4.0.9",
|
|
@@ -267,6 +267,75 @@ User Model data feeds into intent-detection (R015) and routing skill confidence
|
|
|
267
267
|
|
|
268
268
|
-->
|
|
269
269
|
|
|
270
|
+
## Attention-Weight Memory Tiering
|
|
271
|
+
|
|
272
|
+
> Origin: #1279 (Dual-Brain scout:internalize 부분 내재화 — attention-weight tiering만)
|
|
273
|
+
|
|
274
|
+
메모리 항목은 신뢰도(confidence)와 접근성(attention weight)의 **두 축**으로 관리한다. 이 두 축은 직교한다.
|
|
275
|
+
|
|
276
|
+
| 축 | 태그 예시 | 의미 | 관리 주체 |
|
|
277
|
+
|----|-----------|------|-----------|
|
|
278
|
+
| 신뢰도 | `[confidence: high/medium/low]` | 검증 수준 — 얼마나 믿을 수 있는가 | Confidence Lifecycle (위 DETAIL) |
|
|
279
|
+
| Attention Weight | `[tier: hot/warm/cold/archived]` | 접근성 — 얼마나 자주/최근 참조했는가 | Tiering (이 섹션) |
|
|
280
|
+
|
|
281
|
+
### 4-Tier 정의
|
|
282
|
+
|
|
283
|
+
| Tier | 의미 | 기준 (attention weight) | 위치/처리 |
|
|
284
|
+
|------|------|------------------------|----------|
|
|
285
|
+
| **Hot** | 현재 세션 활성 컨텍스트 | 최근 접근 + 고빈도 (이번 세션 내 2회 이상 참조) | `MEMORY.md` 상단 200줄 내 최우선 배치 |
|
|
286
|
+
| **Warm** | 최근 관련 패턴 | 중간 빈도/최근성 (최근 3세션 내 1회 이상 참조) | `MEMORY.md` 본문 (Hot 이후 배치) |
|
|
287
|
+
| **Cold** | 드물게 참조 | 저빈도 (3세션 이상 미참조, 아직 가치 있음) | archive 파일 (`sessions_archive_*.md`) — MEMORY.md 인덱스만 유지 |
|
|
288
|
+
| **Archived** | 비활성 | 장기 미접근 (Temporal Decay 90일+ 기준 충족) | 별도 archive, 인덱스 참조만 |
|
|
289
|
+
|
|
290
|
+
### Attention Weight 산정 신호
|
|
291
|
+
|
|
292
|
+
| 신호 | 가중치 |
|
|
293
|
+
|------|--------|
|
|
294
|
+
| 이번 세션 내 직접 참조 횟수 | 높음 |
|
|
295
|
+
| 최근성 (마지막 접근 세션과의 거리) | 중간 |
|
|
296
|
+
| 세션 간 재확인 횟수 (confidence re-verification 횟수와 동일) | 중간 |
|
|
297
|
+
| 사용자 명시 중요도 (`[permanent]` 태그) | 높음 — 강등 면제 |
|
|
298
|
+
|
|
299
|
+
### Tier 승강 규칙
|
|
300
|
+
|
|
301
|
+
```
|
|
302
|
+
접근 시 승격: Cold → Warm → Hot (해당 세션에서 참조 발생 시)
|
|
303
|
+
미접근 시 강등:
|
|
304
|
+
Hot → Warm (1세션 미접근)
|
|
305
|
+
Warm → Cold (3세션 미접근)
|
|
306
|
+
Cold → Archived (Temporal Decay 90일+ 기준 충족 시 — 두 조건 모두 충족 시 강등)
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
강등은 세션 종료 시 sys-memory-keeper가 수행한다. 승격은 참조 발생 시 즉시 적용한다.
|
|
310
|
+
|
|
311
|
+
### 200줄 MEMORY.md 예산과의 연계
|
|
312
|
+
|
|
313
|
+
| Tier | MEMORY.md 상주 여부 | 처리 |
|
|
314
|
+
|------|---------------------|------|
|
|
315
|
+
| Hot | 상주 (상단 배치 우선) | 직접 본문 |
|
|
316
|
+
| Warm | 상주 (Hot 이후 배치) | 직접 본문 |
|
|
317
|
+
| Cold | 미상주 | archive 파일에 이동, MEMORY.md에 `[archive: sessions_archive_*.md]` 인덱스만 유지 |
|
|
318
|
+
| Archived | 미상주 | 별도 archive, 인덱스 참조만 |
|
|
319
|
+
|
|
320
|
+
예산 초과 시 처리 우선순위: Cold 항목 → archive 이동, Warm 하위 항목 → Cold 강등, Hot은 마지막에 처리.
|
|
321
|
+
|
|
322
|
+
### Temporal Decay와의 상호작용
|
|
323
|
+
|
|
324
|
+
Temporal Decay(시간 경과 기반)와 Attention-Weight Tiering(접근 빈도 기반)은 **독립적으로 동작하되 함께 적용**한다.
|
|
325
|
+
|
|
326
|
+
| 상황 | 결과 |
|
|
327
|
+
|------|------|
|
|
328
|
+
| 고빈도 접근 + 오래된 timestamp | Tier=Hot이지만 confidence 강등 가능 — re-verify 필요 |
|
|
329
|
+
| 저빈도 접근 + 최신 timestamp | Tier=Cold지만 confidence는 high 유지 가능 |
|
|
330
|
+
| 저빈도 접근 + 오래된 timestamp (90일+) | Tier=Archived + `[REVIEW NEEDED]` — 두 메커니즘 모두 강등 신호 |
|
|
331
|
+
| `[permanent]` 태그 | Temporal Decay 면제, Tiering 강등도 면제 |
|
|
332
|
+
|
|
333
|
+
### sys-memory-keeper 책임
|
|
334
|
+
|
|
335
|
+
- 세션 시작: MEMORY.md 스캔 → Cold 항목 archive 이동 여부 평가
|
|
336
|
+
- 세션 종료: 이번 세션 참조 여부 기반 tier 재평가 → archive 이동 실행
|
|
337
|
+
- archive 이동 시: `sessions_archive_*.md`에 append, MEMORY.md에 인덱스 라인 유지
|
|
338
|
+
|
|
270
339
|
## Mid-Session Immediate Save
|
|
271
340
|
|
|
272
341
|
Save memory IMMEDIATELY upon surprising discovery — do not defer to session end.
|
|
@@ -112,46 +112,73 @@ steps:
|
|
|
112
112
|
|
|
113
113
|
- name: compression-mode-eval
|
|
114
114
|
prompt: |
|
|
115
|
-
Evaluate
|
|
115
|
+
Evaluate the pipeline compression mode (G6). Three tiers exist:
|
|
116
|
+
docs-only (heaviest compression) → lite (intermediate) → standard (no compression).
|
|
116
117
|
|
|
117
|
-
##
|
|
118
|
+
## Reference
|
|
118
119
|
|
|
119
|
-
|
|
120
|
+
.claude/skills/pipeline/labels.md — "Compression Eligibility" section
|
|
120
121
|
|
|
121
|
-
|
|
122
|
+
## Tier 1 — docs-only
|
|
123
|
+
|
|
124
|
+
Conditions (BOTH must hold):
|
|
122
125
|
1. scope size ≤ 3 (number of issues in release manifest)
|
|
123
126
|
2. ALL scoped issues have labels ∩ {documentation, automated, claude-code-release, enhancement-yaml-only} ≠ ∅
|
|
124
127
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
If BOTH conditions met → set compression_mode=docs-only
|
|
128
|
+
If met → set compression_mode=docs-only
|
|
128
129
|
- triage step: skip professor-triage skill; perform direct manifest summary instead
|
|
129
130
|
- plan step: skip release-plan skill; single-response plan instead
|
|
130
131
|
- deep-plan step: skip deep-plan skill; single-response implementation notes instead
|
|
131
132
|
- deep-verify step: skip deep-verify skill; perform self-review checklist instead
|
|
132
133
|
- Log: "[compression-mode] docs-only compression activated (scope={n}, all docs/yaml labels)"
|
|
133
134
|
|
|
134
|
-
|
|
135
|
+
## Tier 2 — lite (intermediate)
|
|
136
|
+
|
|
137
|
+
Evaluate ONLY if docs-only NOT met. Conditions (ALL must hold):
|
|
138
|
+
1. scope size ≤ 7
|
|
139
|
+
2. ALL scoped issues are low-risk: for EVERY issue,
|
|
140
|
+
labels ∩ {documentation, automated, claude-code-release, feedback, professor, enhancement} ≠ ∅
|
|
141
|
+
3. NO scoped issue carries a breaking-change or decision-needed label
|
|
142
|
+
4. No code logic change is expected — work is docs/rule/skill/config/script-centric
|
|
143
|
+
(verify against each issue body; if any issue implies application code logic change, FAIL the lite check)
|
|
144
|
+
|
|
145
|
+
If met → set compression_mode=lite
|
|
146
|
+
- triage step: MAY replace professor-triage skill spawn with orchestrator integrated analysis
|
|
147
|
+
- plan step: MAY replace release-plan skill spawn with orchestrator integrated analysis
|
|
148
|
+
- deep-plan step: MAY replace deep-plan skill spawn with orchestrator integrated analysis
|
|
149
|
+
- deep-verify step: perform via mgr-sauron R017 structural verification + core self-check
|
|
150
|
+
(instead of full deep-verify skill spawn)
|
|
151
|
+
- implement / verify-build / release / ci-check / post-release-followup: execute normally (no compression)
|
|
152
|
+
- MANDATORY justification log (REQUIRED whenever a skill stage is replaced by integrated analysis):
|
|
153
|
+
"[compression-mode] lite — skill 단계 통합 분석 대체. 정당화: scope={n}, 모든 이슈 저위험(라벨 {labels}), 구현 대상 이슈 본문 명시 {issue_refs}"
|
|
154
|
+
- If the justification cannot be stated concretely (e.g., a stage cannot be safely integrated),
|
|
155
|
+
do NOT compress that stage — fall back to full skill spawn for it.
|
|
156
|
+
|
|
157
|
+
## Tier 3 — standard (fallback)
|
|
158
|
+
|
|
159
|
+
If neither docs-only nor lite met → set compression_mode=standard
|
|
135
160
|
- All pipeline steps execute normally with full skill spawns
|
|
136
|
-
- Log: "[compression-mode] standard mode (scope={n}, mixed labels or
|
|
161
|
+
- Log: "[compression-mode] standard mode (scope={n}, mixed/high-risk labels, large scope, or code logic change)"
|
|
162
|
+
|
|
163
|
+
## Output
|
|
137
164
|
|
|
138
|
-
|
|
139
|
-
description: "Evaluate docs-only
|
|
165
|
+
compression_mode ∈ {docs-only, lite, standard} as pipeline state for downstream steps.
|
|
166
|
+
description: "Evaluate compression tier (docs-only/lite/standard); set compression_mode state"
|
|
140
167
|
depends_on: scope-selection
|
|
141
168
|
|
|
142
169
|
- name: triage
|
|
143
170
|
skill: professor-triage
|
|
144
|
-
description: "Cross-analysis triage with priority assessment (scoped to release manifest) — skipped if
|
|
171
|
+
description: "Cross-analysis triage with priority assessment (scoped to release manifest) — skipped if docs-only, integrated-analysis allowed if lite"
|
|
145
172
|
depends_on: compression-mode-eval
|
|
146
173
|
|
|
147
174
|
- name: plan
|
|
148
175
|
skill: release-plan
|
|
149
|
-
description: "Release unit plan from triaged issues — skipped if
|
|
176
|
+
description: "Release unit plan from triaged issues — skipped if docs-only, integrated-analysis allowed if lite"
|
|
150
177
|
depends_on: triage
|
|
151
178
|
|
|
152
179
|
- name: deep-plan
|
|
153
180
|
skill: deep-plan
|
|
154
|
-
description: "Research-validated implementation plan (research → plan → verify) — skipped if
|
|
181
|
+
description: "Research-validated implementation plan (research → plan → verify) — skipped if docs-only, integrated-analysis allowed if lite"
|
|
155
182
|
depends_on: plan
|
|
156
183
|
|
|
157
184
|
- name: implement
|
|
@@ -229,7 +256,7 @@ steps:
|
|
|
229
256
|
|
|
230
257
|
- name: deep-verify
|
|
231
258
|
skill: deep-verify
|
|
232
|
-
description: "Multi-angle release quality verification — self-review checklist
|
|
259
|
+
description: "Multi-angle release quality verification — self-review checklist if docs-only; mgr-sauron R017 + core self-check if lite"
|
|
233
260
|
depends_on: verify-build
|
|
234
261
|
|
|
235
262
|
- name: release
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: scout
|
|
3
3
|
description: Analyze external URL to evaluate fit with oh-my-customcode project and auto-create GitHub issue with verdict
|
|
4
4
|
scope: core
|
|
5
|
-
version: 1.0.
|
|
5
|
+
version: 1.0.1
|
|
6
6
|
user-invocable: true
|
|
7
7
|
argument-hint: "<url>"
|
|
8
8
|
---
|
|
@@ -29,6 +29,15 @@ Analyze an external URL (tech blog, tool, library, methodology) to evaluate its
|
|
|
29
29
|
|
|
30
30
|
## Pre-flight Guards
|
|
31
31
|
|
|
32
|
+
### Pre-flight Execution Checklist (MANDATORY before Phase 1)
|
|
33
|
+
|
|
34
|
+
**Both guards MUST be executed before entering Phase 1.** Skipping either guard is a workflow violation.
|
|
35
|
+
|
|
36
|
+
- [ ] Guard 1: URL Validity check passed (abort if invalid)
|
|
37
|
+
- [ ] Guard 2: Duplicate Scout check passed (warn and confirm if duplicate found)
|
|
38
|
+
|
|
39
|
+
Proceed to Phase 1 only after both checkboxes are satisfied.
|
|
40
|
+
|
|
32
41
|
### Guard 1: URL Validity (GATE)
|
|
33
42
|
|
|
34
43
|
Before any work, validate the URL:
|
|
@@ -52,6 +61,8 @@ gh issue list --state all --label "scout:internalize,scout:integrate,scout:skip"
|
|
|
52
61
|
|
|
53
62
|
If found: `[Pre-flight] WARN: Similar URL already scouted in issue #N. Proceed anyway? [Y/n]`
|
|
54
63
|
|
|
64
|
+
> **Why mandatory?** Guard 2 생략으로 인해 동일 도메인 중복 scout 이슈가 생성된 사례 발생 (세션 회고 #1281). 중복 triage 낭비를 방지하기 위해 Pre-flight 체크리스트로 승격.
|
|
65
|
+
|
|
55
66
|
## Display Format
|
|
56
67
|
|
|
57
68
|
Before execution, show the plan:
|
|
@@ -67,6 +78,8 @@ Before execution, show the plan:
|
|
|
67
78
|
실행하시겠습니까? [Y/n]
|
|
68
79
|
```
|
|
69
80
|
|
|
81
|
+
> **암묵 승인 시 필수**: "되면 /scout으로 보고", "실행해줘" 등 묵시적 승인인 경우에도 위 plan 요약을 **반드시 1줄 이상 표시한 뒤 진행**한다 (R015 intent transparency). plan 표시 없이 바로 Phase 1으로 진입하는 것은 위반.
|
|
82
|
+
|
|
70
83
|
## Workflow
|
|
71
84
|
|
|
72
85
|
### Phase 1: Fetch & Summarize
|
|
@@ -90,6 +103,13 @@ Before execution, show the plan:
|
|
|
90
103
|
|
|
91
104
|
### Phase 3: Fit Analysis
|
|
92
105
|
|
|
106
|
+
> **MUST**: Agent tool 호출 시 반드시 `mode: "bypassPermissions"` 파라미터를 포함해야 한다 (R010 Universal bypassPermissions). CC Agent tool의 기본값은 `acceptEdits`이며, 이는 agent frontmatter의 `permissionMode`를 덮어쓴다. `mode` 누락 시 Bash/WebFetch 권한 프롬프트가 발생하여 비대화형 실행이 중단된다.
|
|
107
|
+
>
|
|
108
|
+
> ```
|
|
109
|
+
> ❌ Agent(subagent_type: "general-purpose", prompt: "...")
|
|
110
|
+
> ✓ Agent(subagent_type: "general-purpose", mode: "bypassPermissions", prompt: "...")
|
|
111
|
+
> ```
|
|
112
|
+
|
|
93
113
|
Spawn 1 sonnet agent with `mode: "bypassPermissions"` and the following analysis prompt.
|
|
94
114
|
|
|
95
115
|
**Inputs**:
|
|
@@ -141,6 +161,8 @@ Return a structured verdict:
|
|
|
141
161
|
|
|
142
162
|
### Phase 4: Issue Creation
|
|
143
163
|
|
|
164
|
+
> **NOTE**: Phase 4는 orchestrator가 직접 `gh issue create` (Bash)로 처리한다. 만약 이슈 생성을 Agent(mgr-gitnerd 등)에 위임할 경우, 해당 Agent tool 호출에도 반드시 `mode: "bypassPermissions"`를 포함해야 한다 (R010).
|
|
165
|
+
|
|
144
166
|
1. Ensure scout labels exist (defensive, idempotent):
|
|
145
167
|
```bash
|
|
146
168
|
gh label create "scout:internalize" --color "0E8A16" --description "Scout: should be internalized" 2>/dev/null || true
|
|
@@ -15,8 +15,29 @@
|
|
|
15
15
|
# "rate_limits": { (v2.1.80+, optional)
|
|
16
16
|
# "five_hour": { "used_percentage": 10, "resets_at": 1773979200 },
|
|
17
17
|
# "seven_day": { "used_percentage": 90, "resets_at": 1773979200 }
|
|
18
|
-
# }
|
|
18
|
+
# },
|
|
19
|
+
# "output_style": "korean-engineer", (v2.1.145+, optional)
|
|
20
|
+
# "gh": { (v2.1.145+, optional, #1197)
|
|
21
|
+
# "repo": "owner/repo",
|
|
22
|
+
# "pr_number": 1234,
|
|
23
|
+
# "pr_state": "OPEN"
|
|
24
|
+
# },
|
|
25
|
+
# "agents": [ (v2.1.145+, optional, #1195)
|
|
26
|
+
# { "name": "researcher-1", "status": "running" },
|
|
27
|
+
# { "name": "researcher-2", "status": "running" }
|
|
28
|
+
# ]
|
|
19
29
|
# }
|
|
30
|
+
#
|
|
31
|
+
# External status line providers (#1275):
|
|
32
|
+
# Set STATUSLINE_EXTRA_PROVIDERS to a colon-separated list of provider
|
|
33
|
+
# script paths. Each is executed after the main status line and its output
|
|
34
|
+
# is appended on its own line. Providers run fail-safe (errors never affect
|
|
35
|
+
# the main line) with stdin redirected from /dev/null. Interpreter is chosen
|
|
36
|
+
# by extension: .mjs/.js -> node, .sh -> bash, otherwise executed directly
|
|
37
|
+
# if the file is executable. Unset by default (no behavior change).
|
|
38
|
+
#
|
|
39
|
+
# Example:
|
|
40
|
+
# export STATUSLINE_EXTRA_PROVIDERS="$HOME/.claude/hud/claudenews-hud.mjs:/opt/hud/extra.sh"
|
|
20
41
|
|
|
21
42
|
# ---------------------------------------------------------------------------
|
|
22
43
|
# 1. Color detection
|
|
@@ -66,22 +87,35 @@ fi
|
|
|
66
87
|
|
|
67
88
|
# ---------------------------------------------------------------------------
|
|
68
89
|
# 4. Single jq call — extract all fields as TSV
|
|
69
|
-
# Fields: model_name, project_dir, ctx_pct, ctx_size, cost_usd,
|
|
90
|
+
# Fields: model_name, project_dir, ctx_pct, ctx_size, cost_usd,
|
|
91
|
+
# rl_5h_pct, rl_7d_pct, rl_5h_resets, rl_7d_resets,
|
|
92
|
+
# gh_repo, gh_pr_number, gh_pr_state, agent_count (v2.1.145+)
|
|
70
93
|
# ---------------------------------------------------------------------------
|
|
71
|
-
|
|
94
|
+
# Note: empty string fields are emitted as sentinel "_" to prevent
|
|
95
|
+
# bash `read` from collapsing leading empty TSV fields (bash 3.2 IFS quirk).
|
|
96
|
+
IFS=$'\t' read -r model_name project_dir ctx_pct ctx_size cost_usd rl_5h_pct rl_7d_pct rl_5h_resets rl_7d_resets gh_repo gh_pr_number gh_pr_state agent_count <<< "$(
|
|
72
97
|
printf '%s' "$json" | jq -r '[
|
|
73
98
|
(.model.display_name // "unknown"),
|
|
74
|
-
(.workspace.current_dir // ""),
|
|
99
|
+
((.workspace.current_dir // "") | if . == "" then "_" else . end),
|
|
75
100
|
(if .context_window.used != null and .context_window.total != null and .context_window.total > 0 then (.context_window.used / .context_window.total * 100) elif .context_window.used_percentage != null then .context_window.used_percentage else 0 end),
|
|
76
101
|
(.context_window.context_window_size // 0),
|
|
77
102
|
(.cost.total_cost_usd // 0),
|
|
78
103
|
(.rate_limits.five_hour.used_percentage // -1),
|
|
79
104
|
(.rate_limits.seven_day.used_percentage // -1),
|
|
80
105
|
(.rate_limits.five_hour.resets_at // -1),
|
|
81
|
-
(.rate_limits.seven_day.resets_at // -1)
|
|
106
|
+
(.rate_limits.seven_day.resets_at // -1),
|
|
107
|
+
((.gh.repo // "") | if . == "" then "_" else . end),
|
|
108
|
+
(.gh.pr_number // -1),
|
|
109
|
+
((.gh.pr_state // "") | if . == "" then "_" else . end),
|
|
110
|
+
(if (.agents | type) == "array" then (.agents | length) else -1 end)
|
|
82
111
|
] | @tsv'
|
|
83
112
|
)"
|
|
84
113
|
|
|
114
|
+
# Convert sentinel "_" back to empty string for downstream code
|
|
115
|
+
[[ "$project_dir" == "_" ]] && project_dir=""
|
|
116
|
+
[[ "$gh_repo" == "_" ]] && gh_repo=""
|
|
117
|
+
[[ "$gh_pr_state" == "_" ]] && gh_pr_state=""
|
|
118
|
+
|
|
85
119
|
# ---------------------------------------------------------------------------
|
|
86
120
|
# 4b. Cost & context data bridge — write to temp file for hooks
|
|
87
121
|
# ---------------------------------------------------------------------------
|
|
@@ -229,10 +263,30 @@ if [[ -n "$git_branch" && -n "$project_dir" ]]; then
|
|
|
229
263
|
fi
|
|
230
264
|
|
|
231
265
|
# ---------------------------------------------------------------------------
|
|
232
|
-
# 8. PR number —
|
|
266
|
+
# 8. PR number — prefer v2.1.145 native gh.* JSON fields; fall back to gh CLI cache
|
|
233
267
|
# ---------------------------------------------------------------------------
|
|
234
268
|
pr_display=""
|
|
235
|
-
|
|
269
|
+
|
|
270
|
+
# 8a. Native gh.* fields (CC v2.1.145+, #1197) — zero-cost, no subprocess
|
|
271
|
+
if [[ "$gh_pr_number" =~ ^[0-9]+$ ]] && [[ "$gh_pr_number" -gt 0 ]]; then
|
|
272
|
+
case "$gh_pr_state" in
|
|
273
|
+
OPEN) pr_state_label="open" ;;
|
|
274
|
+
CLOSED) pr_state_label="closed" ;;
|
|
275
|
+
MERGED) pr_state_label="merged" ;;
|
|
276
|
+
DRAFT) pr_state_label="draft" ;;
|
|
277
|
+
"") pr_state_label="" ;;
|
|
278
|
+
*) # bash 3.2 compatible lowercase via tr
|
|
279
|
+
pr_state_label="$(printf '%s' "$gh_pr_state" | tr '[:upper:]' '[:lower:]')" ;;
|
|
280
|
+
esac
|
|
281
|
+
if [[ -n "$pr_state_label" ]]; then
|
|
282
|
+
pr_display="PR #${gh_pr_number} (${pr_state_label})"
|
|
283
|
+
else
|
|
284
|
+
pr_display="PR #${gh_pr_number}"
|
|
285
|
+
fi
|
|
286
|
+
fi
|
|
287
|
+
|
|
288
|
+
# 8b. Fallback — gh CLI with per-branch cache (pre-v2.1.145 or repos without native gh.*)
|
|
289
|
+
if [[ -z "$pr_display" ]] && [[ -n "$git_branch" ]] && command -v gh >/dev/null 2>&1; then
|
|
236
290
|
cache_file="/tmp/statusline-pr-${project_name}"
|
|
237
291
|
cached_branch=""
|
|
238
292
|
cached_pr=""
|
|
@@ -337,6 +391,15 @@ if [[ -n "$wl_countdown" && -n "$wl_display" ]]; then
|
|
|
337
391
|
wl_display="${wl_display} ${wl_countdown}"
|
|
338
392
|
fi
|
|
339
393
|
|
|
394
|
+
# ---------------------------------------------------------------------------
|
|
395
|
+
# 9d. Active agents count (CC v2.1.145+, #1195)
|
|
396
|
+
# Only displayed when 1+ agents are active. agent_count=-1 means field absent.
|
|
397
|
+
# ---------------------------------------------------------------------------
|
|
398
|
+
agent_display=""
|
|
399
|
+
if [[ "$agent_count" =~ ^[0-9]+$ ]] && [[ "$agent_count" -ge 1 ]]; then
|
|
400
|
+
agent_display="A:${agent_count}"
|
|
401
|
+
fi
|
|
402
|
+
|
|
340
403
|
# ---------------------------------------------------------------------------
|
|
341
404
|
# 10. Assemble and output the status line
|
|
342
405
|
# ---------------------------------------------------------------------------
|
|
@@ -366,21 +429,81 @@ if [[ -n "$wl_display" ]]; then
|
|
|
366
429
|
wl_segment=" | ${wl_color}${wl_display}${COLOR_RESET}"
|
|
367
430
|
fi
|
|
368
431
|
|
|
432
|
+
# Build the agents segment (with separator) if present
|
|
433
|
+
agent_segment=""
|
|
434
|
+
if [[ -n "$agent_display" ]]; then
|
|
435
|
+
agent_segment=" | ${agent_display}"
|
|
436
|
+
fi
|
|
437
|
+
|
|
369
438
|
if [[ -n "$git_branch" ]]; then
|
|
370
|
-
printf "${cost_color}%s${COLOR_RESET} | %s | %s%s%s%s | ${ctx_color}%s${COLOR_RESET}\n" \
|
|
439
|
+
printf "${cost_color}%s${COLOR_RESET} | %s | %s%s%s%s%s | ${ctx_color}%s${COLOR_RESET}\n" \
|
|
371
440
|
"$cost_display" \
|
|
372
441
|
"$project_name" \
|
|
373
442
|
"$branch_display" \
|
|
374
443
|
"$pr_segment" \
|
|
375
444
|
"$rl_segment" \
|
|
376
445
|
"$wl_segment" \
|
|
446
|
+
"$agent_segment" \
|
|
377
447
|
"$ctx_display"
|
|
378
448
|
else
|
|
379
|
-
printf "${cost_color}%s${COLOR_RESET} | %s%s%s%s | ${ctx_color}%s${COLOR_RESET}\n" \
|
|
449
|
+
printf "${cost_color}%s${COLOR_RESET} | %s%s%s%s%s | ${ctx_color}%s${COLOR_RESET}\n" \
|
|
380
450
|
"$cost_display" \
|
|
381
451
|
"$project_name" \
|
|
382
452
|
"$pr_segment" \
|
|
383
453
|
"$rl_segment" \
|
|
384
454
|
"$wl_segment" \
|
|
455
|
+
"$agent_segment" \
|
|
385
456
|
"$ctx_display"
|
|
386
457
|
fi
|
|
458
|
+
|
|
459
|
+
# ---------------------------------------------------------------------------
|
|
460
|
+
# 11. External status line providers (#1275)
|
|
461
|
+
# Merge output from external HUD/status providers (e.g. claudenews) so they
|
|
462
|
+
# coexist with the internal status line instead of being shadowed by the
|
|
463
|
+
# project's statusLine.command. Opt-in via STATUSLINE_EXTRA_PROVIDERS
|
|
464
|
+
# (colon-separated paths). Unset = no behavior change (backward compatible).
|
|
465
|
+
#
|
|
466
|
+
# Each provider runs fail-safe:
|
|
467
|
+
# - existence (-f) + interpreter availability checked before running
|
|
468
|
+
# - stdin redirected from /dev/null (statusline stdin already consumed)
|
|
469
|
+
# - stderr suppressed; failures never affect the main status line
|
|
470
|
+
# - output appended only when non-empty, on its own line
|
|
471
|
+
# Interpreter by extension: .mjs/.js -> node, .sh -> bash,
|
|
472
|
+
# otherwise executed directly if the file is executable.
|
|
473
|
+
# ---------------------------------------------------------------------------
|
|
474
|
+
if [[ -n "${STATUSLINE_EXTRA_PROVIDERS}" ]]; then
|
|
475
|
+
# bash 3.2 compatible split on ':' without arrays/mapfile
|
|
476
|
+
_saved_ifs="$IFS"
|
|
477
|
+
IFS=':'
|
|
478
|
+
set -f # disable globbing while iterating raw paths
|
|
479
|
+
for _provider in ${STATUSLINE_EXTRA_PROVIDERS}; do
|
|
480
|
+
[[ -z "$_provider" ]] && continue
|
|
481
|
+
[[ -f "$_provider" ]] || continue
|
|
482
|
+
|
|
483
|
+
_provider_out=""
|
|
484
|
+
case "$_provider" in
|
|
485
|
+
*.mjs|*.js)
|
|
486
|
+
if command -v node >/dev/null 2>&1; then
|
|
487
|
+
_provider_out="$(node "$_provider" </dev/null 2>/dev/null)"
|
|
488
|
+
fi
|
|
489
|
+
;;
|
|
490
|
+
*.sh)
|
|
491
|
+
if command -v bash >/dev/null 2>&1; then
|
|
492
|
+
_provider_out="$(bash "$_provider" </dev/null 2>/dev/null)"
|
|
493
|
+
fi
|
|
494
|
+
;;
|
|
495
|
+
*)
|
|
496
|
+
# No known interpreter — run directly only if executable
|
|
497
|
+
if [[ -x "$_provider" ]]; then
|
|
498
|
+
_provider_out="$("$_provider" </dev/null 2>/dev/null)"
|
|
499
|
+
fi
|
|
500
|
+
;;
|
|
501
|
+
esac
|
|
502
|
+
|
|
503
|
+
if [[ -n "$_provider_out" ]]; then
|
|
504
|
+
printf '%s\n' "$_provider_out"
|
|
505
|
+
fi
|
|
506
|
+
done
|
|
507
|
+
set +f
|
|
508
|
+
IFS="$_saved_ifs"
|
|
509
|
+
fi
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Claude Code Version Compatibility
|
|
2
2
|
|
|
3
|
-
> Updated: 2026-
|
|
4
|
-
> Source: Claude Code release notes (#967, #968, #969, #1126 auto-detected by claude-native skill, #1137, #1158, #1242, #1243, #1244, #1245)
|
|
3
|
+
> Updated: 2026-06-02
|
|
4
|
+
> Source: Claude Code release notes (#967, #968, #969, #1126 auto-detected by claude-native skill, #1137, #1158, #1242, #1243, #1244, #1245, #1276, #1280)
|
|
5
5
|
|
|
6
6
|
## Compatibility Baseline
|
|
7
7
|
|
|
@@ -495,6 +495,8 @@ docs/superpowers/plans/**
|
|
|
495
495
|
| v2.1.153 | statusline `COLUMNS`/`LINES` env (R012), `skipLfs` marketplace option, `claude agents` autocomplete improvement. | P3 follow-up |
|
|
496
496
|
| v2.1.154 | Opus 4.8 + `opus48` alias (R006), dynamic workflows (R009/R018), lean system prompt default, `CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE` deprecated 06/01. | P3 follow-up |
|
|
497
497
|
| v2.1.156 | Opus 4.8 thinking-block API-error fix — no harness change needed. | None |
|
|
498
|
+
| v2.1.159 | 내부 인프라 개선만, 사용자 대면 변경 없음. 조치 불필요. | None |
|
|
499
|
+
| v2.1.160 | `acceptEdits` 환경은 build-tool config 파일 쓰기 시 추가 prompt 인지 필요. bypassPermissions 사용 시 영향 없음. single-file grep → read-before-edit 충족(토큰 효율 개선). | `acceptEdits` 환경 주의 |
|
|
498
500
|
| #1241 | Agent tool malformed-parsing on long/special-char prompts — mitigations documented in Known Platform Issues. | See below |
|
|
499
501
|
|
|
500
502
|
## v2.1.144 (2026-05-19) — 호환성 점검
|
|
@@ -1104,6 +1106,91 @@ Claude가 스스로 판단할 수 있는 상황에서는 multiple-choice prompt
|
|
|
1104
1106
|
| Claude-managed worktree 종료 시 자동 unlock (`git worktree remove/prune` 가능) | 워크트리 정리 자동화 | R006 worktree 참조 |
|
|
1105
1107
|
| 다수 버그 수정 (이미지 처리, sandbox 권한, `claude agents` 세션, `--resume`) | 안정성 향상 | 영향 없음 |
|
|
1106
1108
|
|
|
1109
|
+
## v2.1.160 (2026-06-02) — 호환성 점검
|
|
1110
|
+
|
|
1111
|
+
> Issue: #1280
|
|
1112
|
+
|
|
1113
|
+
### shell startup 파일 및 build-tool config 파일 쓰기 전 prompt 추가
|
|
1114
|
+
|
|
1115
|
+
`.zshenv`, `.zlogin`, `.bash_login` 등 shell startup 파일과 `~/.config/git/` 쓰기 전 확인 prompt가 추가되었습니다. 의도치 않은 shell 명령 실행 방지가 목적입니다.
|
|
1116
|
+
|
|
1117
|
+
**oh-my-customcode 연관**: R001 안전 규칙과 정합. `bypassPermissions` 모드에서는 이 prompt가 우회됩니다 — R010 Universal bypassPermissions를 사용하는 워크플로우에는 영향 없음.
|
|
1118
|
+
|
|
1119
|
+
### `acceptEdits` 모드에서 build-tool config 파일 쓰기 전 prompt (R002/R006)
|
|
1120
|
+
|
|
1121
|
+
`acceptEdits` 모드에서 code-execution 권한을 부여할 수 있는 build-tool config 파일(`.npmrc`, `.yarnrc*`, `bunfig.toml`, `.bazelrc`, `.pre-commit-config.yaml`, `.devcontainer/` 등) 쓰기 전 확인 prompt가 추가되었습니다.
|
|
1122
|
+
|
|
1123
|
+
**oh-my-customcode 연관**: R002 권한 티어 및 R006 `acceptEdits` 모드 동작과 직접 연관됩니다. **`bypassPermissions` 모드를 사용하는 경우(R010 Universal bypassPermissions) 이 prompt는 우회됩니다** — 기존 oh-my-customcode 서브에이전트 워크플로우에 영향 없음. `acceptEdits` 모드로 운영하는 환경에서는 위 파일 타입 쓰기 시 추가 확인이 발생합니다.
|
|
1124
|
+
|
|
1125
|
+
### single-file `grep` 명령이 read-before-edit 체크 충족 (R023/도구 효율)
|
|
1126
|
+
|
|
1127
|
+
single-file `grep`/`egrep`/`fgrep` 명령 실행이 해당 파일에 대한 read-before-edit 체크를 충족합니다. Edit 이전에 별도 Read 호출 없이 `grep` 결과만으로도 사전 읽기 조건을 만족합니다.
|
|
1128
|
+
|
|
1129
|
+
**oh-my-customcode 연관**: R023 Verification Ladder의 Tier 1(결정론적 검사) 시프트-레프트 원칙과 정합됩니다. `grep`으로 파일 내용을 확인한 후 Edit를 사용하는 워크플로우에서 불필요한 Read 호출이 줄어들어 토큰 효율이 개선됩니다.
|
|
1130
|
+
|
|
1131
|
+
### `claude agents` 완료 세션 복원 시 chat history 유실 수정
|
|
1132
|
+
|
|
1133
|
+
`claude agents`에서 완료된 세션 복원 시 chat history가 유실되고 원본 prompt가 재실행되던 버그가 수정되었습니다.
|
|
1134
|
+
|
|
1135
|
+
**oh-my-customcode 연관**: R018 Agent Teams 장시간 세션 복원 신뢰성이 향상됩니다.
|
|
1136
|
+
|
|
1137
|
+
### 야간 retire 후 재연결된 background 세션 conversation 유실 수정
|
|
1138
|
+
|
|
1139
|
+
야간 retire 후 재연결된 background 세션에서 conversation이 유실되던 버그가 수정되었습니다.
|
|
1140
|
+
|
|
1141
|
+
**oh-my-customcode 연관**: R011 native auto-memory 세션 지속성 및 R018 Agent Teams 장기 실행 세션 안정성이 향상됩니다.
|
|
1142
|
+
|
|
1143
|
+
### `claude --bg` cold-start "socket missing" 오류 수정
|
|
1144
|
+
|
|
1145
|
+
`claude --bg` cold-start 시 "socket missing" 오류가 발생하던 버그가 수정되었습니다.
|
|
1146
|
+
|
|
1147
|
+
**oh-my-customcode 연관**: R010 Universal bypassPermissions + `/bg` 플로우의 초기 기동 안정성이 개선됩니다.
|
|
1148
|
+
|
|
1149
|
+
### WSL copy-on-select Windows 클립보드 수정
|
|
1150
|
+
|
|
1151
|
+
WSL 환경에서 copy-on-select 시 Windows 클립보드가 정상 동작하도록 수정되었습니다 (PowerShell interop).
|
|
1152
|
+
|
|
1153
|
+
**oh-my-customcode 연관**: macOS 개발 환경에는 직접 영향 없음.
|
|
1154
|
+
|
|
1155
|
+
### oh-my-customcode 연관 평가
|
|
1156
|
+
|
|
1157
|
+
| 변경 | oh-my-customcode 영향 | 조치 |
|
|
1158
|
+
|------|----------------------|------|
|
|
1159
|
+
| shell startup + `~/.config/git/` 쓰기 prompt | R001 안전 강화. bypassPermissions 모드는 우회 | None (bypassPermissions 사용 시 영향 없음) |
|
|
1160
|
+
| `acceptEdits` build-tool config 파일 쓰기 prompt | R002/R006 연관. bypassPermissions 모드는 우회 | **`acceptEdits` 환경**은 대상 파일 타입 쓰기 시 확인 발생 |
|
|
1161
|
+
| single-file `grep` → read-before-edit 충족 | R023 Tier 1 시프트-레프트, 토큰 효율 개선 | None (자동 적용, 도구 사용 패턴 최적화 가능) |
|
|
1162
|
+
| `claude agents` 완료 세션 복원 chat history 유실 수정 | R018 세션 복원 신뢰성 | None |
|
|
1163
|
+
| background 세션 conversation 유실 수정 | R011/R018 장기 세션 안정성 | None |
|
|
1164
|
+
| `claude --bg` cold-start fix | R010 `/bg` 기동 안정성 | None |
|
|
1165
|
+
| WSL 클립보드 수정 | macOS 환경 영향 없음 | None |
|
|
1166
|
+
|
|
1167
|
+
**Action items**:
|
|
1168
|
+
- **`acceptEdits` 모드 환경**: `.npmrc`, `bunfig.toml`, `.devcontainer/` 등 build-tool config 파일 쓰기 워크플로우에서 추가 확인 prompt 발생 여부 인지 필요. `bypassPermissions` 모드 전환으로 해소 가능 (R010 권고).
|
|
1169
|
+
- 본 릴리스에서 코드 변경 없음 (docs-only)
|
|
1170
|
+
|
|
1171
|
+
---
|
|
1172
|
+
|
|
1173
|
+
## v2.1.159 (2026-05-31) — 호환성 점검
|
|
1174
|
+
|
|
1175
|
+
> Issue: #1276
|
|
1176
|
+
|
|
1177
|
+
### 내부 인프라 개선
|
|
1178
|
+
|
|
1179
|
+
내부 인프라 개선으로, 사용자 대면 변경 사항은 없습니다.
|
|
1180
|
+
|
|
1181
|
+
**oh-my-customcode 연관**: 코드 및 문서 변경 불필요. 추적 기록용 docs-only 항목입니다.
|
|
1182
|
+
|
|
1183
|
+
### oh-my-customcode 연관 평가
|
|
1184
|
+
|
|
1185
|
+
| 변경 | oh-my-customcode 영향 | 조치 |
|
|
1186
|
+
|------|----------------------|------|
|
|
1187
|
+
| 내부 인프라 개선 | 사용자 대면 변경 없음 | 조치 불필요 |
|
|
1188
|
+
|
|
1189
|
+
**Action items**:
|
|
1190
|
+
- 코드 및 문서 변경 불필요 (추적 기록용 docs-only)
|
|
1191
|
+
|
|
1192
|
+
---
|
|
1193
|
+
|
|
1107
1194
|
## v2.1.156 (2026-05-29) — 호환성 점검
|
|
1108
1195
|
|
|
1109
1196
|
> Issue: #1245 — CC v2.1.156 tracking
|
|
@@ -1165,6 +1252,8 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
|
|
|
1165
1252
|
- #1243 — Claude Code v2.1.153 compatibility documentation
|
|
1166
1253
|
- #1244 — Claude Code v2.1.154 compatibility documentation
|
|
1167
1254
|
- #1245 — Claude Code v2.1.156 compatibility documentation
|
|
1255
|
+
- #1276 — Claude Code v2.1.159 compatibility documentation
|
|
1256
|
+
- #1280 — Claude Code v2.1.160 compatibility documentation
|
|
1168
1257
|
- `.claude/skills/claude-native/` — auto-generation source
|
|
1169
1258
|
- `.claude/rules/SHOULD-hud-statusline.md` — R012 statusline integration
|
|
1170
1259
|
- `.claude/rules/MUST-agent-design.md` — R006 agent frontmatter spec
|
package/templates/manifest.json
CHANGED