oh-my-customcode 1.1.37 → 1.1.39

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.37",
244
+ version: "1.1.39",
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.37",
2034
+ version: "1.1.39",
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.37",
6
+ "version": "1.1.39",
7
7
  "description": "Batteries-included agent harness for Claude Code",
8
8
  "type": "module",
9
9
  "bin": {
@@ -261,12 +261,16 @@
261
261
  "type": "command",
262
262
  "command": "bash .claude/hooks/scripts/auto-continue-guard.sh"
263
263
  },
264
+ {
265
+ "type": "command",
266
+ "command": "bash .claude/hooks/scripts/r007-r008-drift-advisor.sh"
267
+ },
264
268
  {
265
269
  "type": "prompt",
266
270
  "prompt": "A background subagent just completed. If it FAILED, do NOT auto-continue \u2014 report the failure and wait for user input."
267
271
  }
268
272
  ],
269
- "description": "Record agent outcomes + auto-continue workflow on subagent completion"
273
+ "description": "Record agent outcomes + auto-continue workflow + R007/R008 drift advisory on subagent completion (autonomous-loop re-entry, #1545)"
270
274
  }
271
275
  ],
272
276
  "CwdChanged": [
@@ -1,5 +1,12 @@
1
1
  #!/usr/bin/env bash
2
- # r007-r008-drift-advisor.sh — UserPromptSubmit hook: PROACTIVE R007/R008 drift advisory (#1229)
2
+ # r007-r008-drift-advisor.sh — PROACTIVE R007/R008 drift advisory (#1229, #1545)
3
+ #
4
+ # Wired to TWO trigger points:
5
+ # 1. UserPromptSubmit — fires before Claude responds to a user-typed prompt (#1229).
6
+ # 2. SubagentStop — fires when a background subagent (Agent tool) completes, covering
7
+ # autonomous-loop re-entry (e.g. /fsd) where the orchestrator resumes WITHOUT a
8
+ # UserPromptSubmit event. Prior to #1545, autonomous-loop re-entry had zero R007/R008
9
+ # advisory coverage since UserPromptSubmit never fires in that path.
3
10
  #
4
11
  # Inspects the LAST completed assistant turn in the session transcript for R007/R008
5
12
  # compliance BEFORE Claude responds. If the previous turn drifted (missing identification
@@ -10,6 +17,9 @@
10
17
  #
11
18
  # Advisory-only: ALWAYS exits 0, ALWAYS passes stdin through to stdout, NEVER blocks.
12
19
  # Performance: parses ONLY the last assistant turn (not the whole transcript).
20
+ # Input-schema note: session_id/transcript_path are COMMON fields present on both
21
+ # UserPromptSubmit and SubagentStop hook payloads, so the detection logic below is
22
+ # event-agnostic and required no functional changes for the SubagentStop wiring.
13
23
  #
14
24
  # 환경변수 override (테스트/디버깅용):
15
25
  # OMCUSTOM_R007_ADVISOR=off — advisory 완전 비활성화 (pass-through)
@@ -24,7 +24,7 @@
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").
27
+ > **파이프 뒤 `$?`는 마지막 명령의 exit code (#1492, zsh 변형 #1540)**: `script.sh | tail -N; echo $?`처럼 검증 스크립트를 파이프에 연결한 뒤 `$?`로 읽으면 파이프라인 **마지막 명령**(`tail`)의 종료코드를 얻는다 — 스크립트 자체가 실패(exit 1)해도 `tail`이 성공(exit 0)하면 `$?=0`으로 "통과"를 오판한다. **1차 지침**: 검증 스크립트는 파이프 없이 단독 실행한다. 부득이 파이프를 써야 한다면, 원본 exit code를 읽는 문법은 **셸마다 다르다** — bash는 `${PIPESTATUS[0]}`(대문자, 0-indexed), zsh는 `$pipestatus[1]`(소문자, 1-indexed)이며 서로 호환되지 않는다. **이 저장소의 기본 셸이자 Claude Code Bash 도구 실행 셸은 zsh**이므로, bash 문법 `${PIPESTATUS[0]}`을 그대로 쓰면 zsh에서는 미정의 변수로 취급되어 **오류 없이 빈 값**을 반환한다 — 조건문에서 빈 값은 거짓으로 평가돼 "검증 통과"처럼 보이는 조용한 오판을 재생산한다. 셸을 사전 확인(`echo $SHELL` / `$BASH_VERSION` 존재 여부)한 뒤 해당 셸의 문법을 쓴다. **주의**: `${PIPESTATUS[0]}` 자체는 R023 Workflow JS 템플릿 리터럴 이스케이프 이슈(#1438, `${...}`를 JS가 평가해 ReferenceError)와 별개 문제 — 본 항목은 셸에서 파이프 뒤 exit code를 읽는 각도다. Origin: #1492 (Session 132 회고 찐빠 #3); zsh 변형은 #1540 (Session 138 회고 찐빠 #6) — `gh run watch ... | tail` 뒤 `${PIPESTATUS[0]}`가 zsh에서 빈 값을 반환해 CI 결론을 재실측해야 했음. Cross-ref: R020 ("command executed" ≠ "succeeded").
28
28
 
29
29
  > **계수/매칭 방법 확인 (#1521)**: 카운트를 대조하기 전에 **비교 대상이 무엇을 어떻게 세는지** 먼저 확인한다 — 같은 지표라도 계수 방법이 다르면 값이 달라진다. 대표 함정 3종: (a) glob(`ls *.md`, 최상위만) vs 재귀 `find`(하위 디렉토리 포함), (b) 부분 문자열 grep(`grep "sdd"`가 `sdd-dev`까지 매칭), (c) 확장자 필터(`--include='*.md'`가 `CLAUDE.md.en`을 미매칭). 검증 스크립트와 대조할 때는 **스크립트의 실제 계수 로직을 읽고** 같은 방법으로 센다. 위 `ls | tail` 시계열 오판(#1417)과 동류로, 도구의 기본 동작을 확인하지 않은 채 결과를 해석해 오탐에 이르는 패턴이다. Origin: #1521 (2026-07-20 세션에서 3회 반복; 두 서브에이전트가 독립적으로 동일 오탐에 도달).
30
30
 
@@ -210,7 +210,11 @@ steps:
210
210
  - Detect file types in scope and route to matching agent
211
211
  - Use specialized agents (lang-*, be-*, fe-*, infra-*) over general-purpose
212
212
  4. TDD via superpowers:test-driven-development when tests apply
213
- 5. Commit via mgr-gitnerd with `Fixes #<N>` trailer in body
213
+ 5. Commit via mgr-gitnerd with `Refs #<N>` trailer in body — NEVER `Fixes`/`Closes`/`Resolves` (#1542).
214
+ ⚠ implement-stage commits land directly on develop (no PR gate here). A close-keyword trailer on a
215
+ develop-bound commit auto-closes the issue on push — BEFORE release/tag/publish (observed v1.1.38,
216
+ 07:49:26Z). Close keywords belong ONLY in the release-stage PR body (see release step 3.b) — auto-tag.yml
217
+ greps the PR body, not commit messages, to decide which issues to close.
214
218
  6. On success: remove in-progress, add verify-ready
215
219
  7. On failure: remove in-progress, add needs-review, comment error summary
216
220
 
@@ -299,21 +303,38 @@ steps:
299
303
  Reference: issue #1141 (v0.135.0 follow-up), mgr-gitnerd MEMORY.md.
300
304
 
301
305
  1. Version bump (mandatory):
302
- Orchestrator delegates to mgr-updater (R010). mgr-updater executes the following atomic edits:
303
- Determine NEW version per semver rules below.
306
+ Orchestrator delegates to mgr-updater (R010) for the file edits below; mgr-gitnerd (R010) for branch/commit/push.
307
+ Determine NEW version per semver rules below FIRST — before touching any file.
308
+
309
+ ⚠ Branch-before-bump (#1542, observed v1.1.38): for npm project with auto-tag.yml (this repo), the
310
+ version-bump commit MUST be created ON release/v{NEW}, and MUST NOT be pushed to develop directly.
311
+ Pushing the bump commit to develop before branching leaves develop and release/v{NEW} pointing at the
312
+ SAME commit → PR diff=0 → `gh pr create` fails with "GraphQL: No commits between develop and
313
+ release/v{NEW}". Evidence: PR #1538 (v1.1.37) and PR #1534 (v1.1.36) each contain exactly ONE commit
314
+ (the bump commit) — proof the bump belongs on the release branch, never on develop directly.
315
+
304
316
  npm project (package.json exists):
305
- a. package.json: jq '.version = "<NEW>"' package.json > package.json.tmp && mv package.json.tmp package.json
317
+ a. mgr-gitnerd: git checkout develop && git pull origin develop
318
+ (R017 Pre-Branch Freshness Gate — ensures local develop holds every merged feature commit before branching)
319
+ b. mgr-gitnerd creates release/v{NEW} branch from develop and checks it out — BEFORE any edit in c–i below.
320
+ (This is the step that used to run AFTER the bump in step 3.a of the old ordering — moving it here
321
+ is the #1542 fix. Do NOT perform steps c–i on develop.)
322
+ c. package.json: jq '.version = "<NEW>"' package.json > package.json.tmp && mv package.json.tmp package.json [on release/v{NEW}]
306
323
  # ⚠ jq '.version=...' PRESERVES the manifest structure {version, lastUpdated, omcustomMinClaudeCode, components[]}.
307
324
  # Edit ONLY the .version field — do NOT overwrite templates/manifest.json wholesale (e.g. a source-hash path→hash map).
308
325
  # Recover a corrupted manifest: git show HEAD:templates/manifest.json | jq '.version="<NEW>"' > templates/manifest.json (#1423/#1154).
309
- b. templates/manifest.json: jq '.version = "<NEW>"' templates/manifest.json > templates/manifest.json.tmp && mv templates/manifest.json.tmp templates/manifest.json
310
- c. bun run build — run standalone (NO pipe), read exit code directly ($? after a pipe is the last command's, R005/#1492).
311
- This regenerates .omcustom.lock.json (generatorVersion/templateVersion) to <NEW> via scripts/sync-source-lockfile.ts.
312
- d. git status --short — enumerate ALL tracked drift (`^ M`) the build produced; stage EVERY one (esp. .omcustom.lock.json) before commit.
313
- (#1531 — .omcustom.lock.json missed staging across 4 consecutive releases after v1.1.29; root cause was no build step between version bump and commit.)
314
- e. mgr-gitnerd commit: "chore(release): bump to v<NEW>" — MUST include the drift from step d
315
- f. mgr-gitnerd push develop
316
- g. mandatory verification (with existence guard for partial-update safety):
326
+ d. templates/manifest.json: jq '.version = "<NEW>"' templates/manifest.json > templates/manifest.json.tmp && mv templates/manifest.json.tmp templates/manifest.json [on release/v{NEW}]
327
+ e. bun run build — run standalone (NO pipe), read exit code directly ($? after a pipe is the last command's, R005/#1492).
328
+ This regenerates .omcustom.lock.json (generatorVersion/templateVersion) to <NEW> via scripts/sync-source-lockfile.ts. [on release/v{NEW}]
329
+ f. git status --short — enumerate ALL tracked drift (`^ M`) the build produced; stage EVERY one (esp. .omcustom.lock.json) before commit.
330
+ (#1531 — .omcustom.lock.json missed staging across 4 consecutive releases after v1.1.29; root cause was no build step between version bump and commit.) [on release/v{NEW}]
331
+ g. mgr-gitnerd commit: "chore(release): bump to v<NEW>" — MUST include the drift from step f.
332
+ ⚠ do NOT add Closes/Fixes/Resolves keywords to this commit message (#1542) — this commit merges into
333
+ develop later via the release PR; a close keyword here bypasses the PR-body mechanism auto-tag.yml
334
+ relies on (see step 3.b below). Use `Refs #N` if a cross-reference is needed.
335
+ h. mgr-gitnerd push release/v{NEW} to origin — NEVER push this commit to develop directly. Pushing to
336
+ develop here reproduces the diff=0 PR failure this reordering fixes (#1542).
337
+ i. mandatory verification (with existence guard for partial-update safety), run on release/v{NEW}:
317
338
  [ -f scripts/verify-version-sync.sh ] && bash scripts/verify-version-sync.sh || echo "::warning::verify-version-sync.sh not found, version sync verification skipped"
318
339
  (verify-version-sync.sh 가 exit 1 시 release 단계 halt)
319
340
 
@@ -328,9 +349,10 @@ steps:
328
349
  2. Release notes via omcustom-release-notes skill
329
350
  3. Adapt release mechanism to project (determines how steps 3-5 execute):
330
351
  - npm project with auto-tag.yml (this repo — release/v* PR pattern):
331
- a. mgr-gitnerd creates release/v{NEW} branch from develop with the version-bump commit
352
+ a. release/v{NEW} branch + version-bump commit were already created in step 1.b–1.h above — do NOT
353
+ re-create the branch or re-run the bump here; this step only opens the PR against the existing branch.
332
354
  b. mgr-gitnerd creates PR: gh pr create --base develop --head release/v{NEW} --title "chore(release): bump to v{NEW}" --body "<MUST include 'Closes #N' for EVERY issue this release resolves>"
333
- ⚠ auto-tag.yml closes issues by grep'ing Closes/Fixes/Resolves keywords in the PR BODY — NOT by milestone membership. If the keywords are missing, no issues close and the workflow still reports success (#1531).
355
+ ⚠ auto-tag.yml closes issues by grep'ing Closes/Fixes/Resolves keywords in the PR BODY — NOT by milestone membership NOR by commit message trailers. If the keywords are missing, no issues close and the workflow still reports success (#1531). Commit-message close keywords are explicitly forbidden during `implement` and step 1.g above (#1542) — the PR body is the ONLY place a close keyword should appear.
334
356
  Before creating the PR (whether via inline --body or --body-file), confirm the body text actually contains a Closes line per issue.
335
357
  c. mgr-gitnerd merges PR (admin merge required due to branch protection)
336
358
  d. DO NOT manually git tag or gh release create.
@@ -824,5 +824,10 @@ harness-eval이 task를 실행하면 agent-eval-framework가 4-metric을 측정
824
824
  | 가이드 | 경로 | 관련성 |
825
825
  |--------|------|--------|
826
826
  | harness-engineering | `guides/harness-engineering/` | 평가 하네스 인프라 설계 |
827
- | monitoring-setup | `guides/monitoring-setup/` | OTEL 통합 (향후 tracing 보강) |
828
827
  | multi-agent-debate-patterns | `guides/multi-agent-debate-patterns/` | 다중 에이전트 평가 패턴 |
828
+
829
+ ### 관련 스킬
830
+
831
+ | 스킬 | 경로 | 관련성 |
832
+ |------|------|--------|
833
+ | monitoring-setup | `.claude/skills/monitoring-setup/` | OTEL 통합 (향후 tracing 보강) |
@@ -224,7 +224,7 @@ External plugin (JuliusBrussee/caveman, 41.6k stars, MIT) that rewrites Claude r
224
224
  - `.claude/rules/SHOULD-ecomode.md` — Layer 2 R013 specification
225
225
  - `.claude/skills/token-efficiency-audit/SKILL.md` — Layer 3 HOW: audit and apply
226
226
  - `.claude/skills/monitoring-setup/SKILL.md` — Measure effectiveness via OTel metrics
227
- - `.claude/skills/update-config/` — Generic settings.json manipulation (broader scope)
227
+ - CC bundled `update-config` skill — Generic settings.json manipulation (broader scope; not a project-local skill)
228
228
  - `.claude/skills/playwright-compress/SKILL.md` — Layer 4 MCP output compression hook
229
229
  - `.claude/hooks/scripts/playwright-compress.sh` — Layer 4 hook script
230
230
  - `https://github.com/JuliusBrussee/caveman` — Layer 5 caveman plugin (external)
@@ -3,11 +3,11 @@
3
3
  > Updated: 2026-07-02
4
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
- > **Note (compat 노트 이관)**: 이 파일은 v2.1.159까지의 호환성 노트를 보존합니다. v2.1.160+ 이후 CC 호환성 노트는 `.claude/rules/` 각 규칙(R001/R002/R006/R010/R012 등)에 인라인으로 축적(이관)되었으므로, 최신 compat 노트는 해당 규칙 파일을 참조하세요.
6
+ > **Note (compat 노트 이관)**: 이 파일은 v2.1.160까지의 호환성 노트를 보존합니다. v2.1.161+ 이후 CC 호환성 노트는 `.claude/rules/` 각 규칙(R001/R002/R006/R010/R012 등)에 인라인으로 축적(이관)되었으므로, 최신 compat 노트는 해당 규칙 파일을 참조하세요.
7
7
 
8
8
  ## Compatibility Baseline
9
9
 
10
- oh-my-customcode v1.1.1 targets Claude Code v2.1.197+ (Sonnet 5 = CC 기본 모델). 이 파일에 정리된 v2.1.117-159 항목은 하위호환이며 config 변경이 불필요합니다.
10
+ oh-my-customcode v1.1.9 targets Claude Code v2.1.201+ (Sonnet 5 = CC 기본 모델). 이 파일에 정리된 v2.1.117-160 항목은 하위호환이며 config 변경이 불필요합니다.
11
11
 
12
12
  ## v2.1.117 (2026-04-22)
13
13
 
@@ -78,6 +78,10 @@ R016 Continuous Improvement 루프를 강화하며, 내부 구조(agent-memory +
78
78
  삭제 경로가 불명확)를 profile 전환으로 해소합니다.
79
79
  cross-harness export 거부(#1176)로 발생하는 진입로 공백을 부분 보완합니다.
80
80
 
81
+ > **후속 (v1.1.29, #1484)**: manifest profiles는 CLI 미배선(vestigial)으로 확정되어
82
+ > 제거되었습니다. 이 흡수 결정 자체는 당시 문서화되었으나, 실제 CLI 배선(`--profile`
83
+ > 플래그 실행 경로)은 이뤄지지 않았습니다.
84
+
81
85
  ---
82
86
 
83
87
  ## 3. 거부된 패턴 — Cross-harness Export (#1176)
@@ -136,7 +140,9 @@ multi-target 전환의 결과:
136
140
  | 기존 harness 자산 재활용 | 멀티 harness 사용자 |
137
141
  | ECC와 기능 중복 | zero-sum 경쟁 |
138
142
 
139
- 신규 사용자 진입로 문제는 `manifest-install --profile`(#1177)으로 부분 해소됩니다.
143
+ 신규 사용자 진입로 문제는 `manifest-install --profile`(#1177)으로 부분 해소되는
144
+ 것으로 판단되었으나, 해당 profile 기능은 이후 CLI 미배선(vestigial)이 확인되어
145
+ v1.1.29(#1484)에서 제거되었습니다.
140
146
  멀티 harness 사용자는 ECC를 직접 사용하는 것이 더 효과적입니다.
141
147
 
142
148
  ---
@@ -161,7 +167,8 @@ multi-target 전환의 결과:
161
167
 
162
168
  4. **진입로 문제 대체 해소**
163
169
  #1177 `manifest-install --profile`이 신규 사용자 진입 비용을 낮추는 대안으로
164
- 이미 흡수되었습니다.
170
+ 당시 흡수되었습니다(단, v1.1.29/#1484에서 CLI 미배선 확인 후 제거됨 — 위
171
+ §2-3 후속 노트 참조).
165
172
 
166
173
  ---
167
174
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.37",
2
+ "version": "1.1.39",
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)",
@@ -210,7 +210,11 @@ steps:
210
210
  - Detect file types in scope and route to matching agent
211
211
  - Use specialized agents (lang-*, be-*, fe-*, infra-*) over general-purpose
212
212
  4. TDD via superpowers:test-driven-development when tests apply
213
- 5. Commit via mgr-gitnerd with `Fixes #<N>` trailer in body
213
+ 5. Commit via mgr-gitnerd with `Refs #<N>` trailer in body — NEVER `Fixes`/`Closes`/`Resolves` (#1542).
214
+ ⚠ implement-stage commits land directly on develop (no PR gate here). A close-keyword trailer on a
215
+ develop-bound commit auto-closes the issue on push — BEFORE release/tag/publish (observed v1.1.38,
216
+ 07:49:26Z). Close keywords belong ONLY in the release-stage PR body (see release step 3.b) — auto-tag.yml
217
+ greps the PR body, not commit messages, to decide which issues to close.
214
218
  6. On success: remove in-progress, add verify-ready
215
219
  7. On failure: remove in-progress, add needs-review, comment error summary
216
220
 
@@ -299,21 +303,38 @@ steps:
299
303
  Reference: issue #1141 (v0.135.0 follow-up), mgr-gitnerd MEMORY.md.
300
304
 
301
305
  1. Version bump (mandatory):
302
- Orchestrator delegates to mgr-updater (R010). mgr-updater executes the following atomic edits:
303
- Determine NEW version per semver rules below.
306
+ Orchestrator delegates to mgr-updater (R010) for the file edits below; mgr-gitnerd (R010) for branch/commit/push.
307
+ Determine NEW version per semver rules below FIRST — before touching any file.
308
+
309
+ ⚠ Branch-before-bump (#1542, observed v1.1.38): for npm project with auto-tag.yml (this repo), the
310
+ version-bump commit MUST be created ON release/v{NEW}, and MUST NOT be pushed to develop directly.
311
+ Pushing the bump commit to develop before branching leaves develop and release/v{NEW} pointing at the
312
+ SAME commit → PR diff=0 → `gh pr create` fails with "GraphQL: No commits between develop and
313
+ release/v{NEW}". Evidence: PR #1538 (v1.1.37) and PR #1534 (v1.1.36) each contain exactly ONE commit
314
+ (the bump commit) — proof the bump belongs on the release branch, never on develop directly.
315
+
304
316
  npm project (package.json exists):
305
- a. package.json: jq '.version = "<NEW>"' package.json > package.json.tmp && mv package.json.tmp package.json
317
+ a. mgr-gitnerd: git checkout develop && git pull origin develop
318
+ (R017 Pre-Branch Freshness Gate — ensures local develop holds every merged feature commit before branching)
319
+ b. mgr-gitnerd creates release/v{NEW} branch from develop and checks it out — BEFORE any edit in c–i below.
320
+ (This is the step that used to run AFTER the bump in step 3.a of the old ordering — moving it here
321
+ is the #1542 fix. Do NOT perform steps c–i on develop.)
322
+ c. package.json: jq '.version = "<NEW>"' package.json > package.json.tmp && mv package.json.tmp package.json [on release/v{NEW}]
306
323
  # ⚠ jq '.version=...' PRESERVES the manifest structure {version, lastUpdated, omcustomMinClaudeCode, components[]}.
307
324
  # Edit ONLY the .version field — do NOT overwrite templates/manifest.json wholesale (e.g. a source-hash path→hash map).
308
325
  # Recover a corrupted manifest: git show HEAD:templates/manifest.json | jq '.version="<NEW>"' > templates/manifest.json (#1423/#1154).
309
- b. templates/manifest.json: jq '.version = "<NEW>"' templates/manifest.json > templates/manifest.json.tmp && mv templates/manifest.json.tmp templates/manifest.json
310
- c. bun run build — run standalone (NO pipe), read exit code directly ($? after a pipe is the last command's, R005/#1492).
311
- This regenerates .omcustom.lock.json (generatorVersion/templateVersion) to <NEW> via scripts/sync-source-lockfile.ts.
312
- d. git status --short — enumerate ALL tracked drift (`^ M`) the build produced; stage EVERY one (esp. .omcustom.lock.json) before commit.
313
- (#1531 — .omcustom.lock.json missed staging across 4 consecutive releases after v1.1.29; root cause was no build step between version bump and commit.)
314
- e. mgr-gitnerd commit: "chore(release): bump to v<NEW>" — MUST include the drift from step d
315
- f. mgr-gitnerd push develop
316
- g. mandatory verification (with existence guard for partial-update safety):
326
+ d. templates/manifest.json: jq '.version = "<NEW>"' templates/manifest.json > templates/manifest.json.tmp && mv templates/manifest.json.tmp templates/manifest.json [on release/v{NEW}]
327
+ e. bun run build — run standalone (NO pipe), read exit code directly ($? after a pipe is the last command's, R005/#1492).
328
+ This regenerates .omcustom.lock.json (generatorVersion/templateVersion) to <NEW> via scripts/sync-source-lockfile.ts. [on release/v{NEW}]
329
+ f. git status --short — enumerate ALL tracked drift (`^ M`) the build produced; stage EVERY one (esp. .omcustom.lock.json) before commit.
330
+ (#1531 — .omcustom.lock.json missed staging across 4 consecutive releases after v1.1.29; root cause was no build step between version bump and commit.) [on release/v{NEW}]
331
+ g. mgr-gitnerd commit: "chore(release): bump to v<NEW>" — MUST include the drift from step f.
332
+ ⚠ do NOT add Closes/Fixes/Resolves keywords to this commit message (#1542) — this commit merges into
333
+ develop later via the release PR; a close keyword here bypasses the PR-body mechanism auto-tag.yml
334
+ relies on (see step 3.b below). Use `Refs #N` if a cross-reference is needed.
335
+ h. mgr-gitnerd push release/v{NEW} to origin — NEVER push this commit to develop directly. Pushing to
336
+ develop here reproduces the diff=0 PR failure this reordering fixes (#1542).
337
+ i. mandatory verification (with existence guard for partial-update safety), run on release/v{NEW}:
317
338
  [ -f scripts/verify-version-sync.sh ] && bash scripts/verify-version-sync.sh || echo "::warning::verify-version-sync.sh not found, version sync verification skipped"
318
339
  (verify-version-sync.sh 가 exit 1 시 release 단계 halt)
319
340
 
@@ -328,9 +349,10 @@ steps:
328
349
  2. Release notes via omcustom-release-notes skill
329
350
  3. Adapt release mechanism to project (determines how steps 3-5 execute):
330
351
  - npm project with auto-tag.yml (this repo — release/v* PR pattern):
331
- a. mgr-gitnerd creates release/v{NEW} branch from develop with the version-bump commit
352
+ a. release/v{NEW} branch + version-bump commit were already created in step 1.b–1.h above — do NOT
353
+ re-create the branch or re-run the bump here; this step only opens the PR against the existing branch.
332
354
  b. mgr-gitnerd creates PR: gh pr create --base develop --head release/v{NEW} --title "chore(release): bump to v{NEW}" --body "<MUST include 'Closes #N' for EVERY issue this release resolves>"
333
- ⚠ auto-tag.yml closes issues by grep'ing Closes/Fixes/Resolves keywords in the PR BODY — NOT by milestone membership. If the keywords are missing, no issues close and the workflow still reports success (#1531).
355
+ ⚠ auto-tag.yml closes issues by grep'ing Closes/Fixes/Resolves keywords in the PR BODY — NOT by milestone membership NOR by commit message trailers. If the keywords are missing, no issues close and the workflow still reports success (#1531). Commit-message close keywords are explicitly forbidden during `implement` and step 1.g above (#1542) — the PR body is the ONLY place a close keyword should appear.
334
356
  Before creating the PR (whether via inline --body or --body-file), confirm the body text actually contains a Closes line per issue.
335
357
  c. mgr-gitnerd merges PR (admin merge required due to branch protection)
336
358
  d. DO NOT manually git tag or gh release create.