@kaydash9999/banker-plugins 0.20.2 → 0.21.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.
Files changed (102) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +203 -1
  4. package/PRIVACY.md +34 -4
  5. package/README.md +46 -15
  6. package/bin/banker.js +228 -51
  7. package/bin/lib/codex-hooks.mjs +249 -0
  8. package/bin/lib/telemetry-config.mjs +33 -16
  9. package/codex/manifest.json +14 -11
  10. package/codex/skills/graceful-pause/SKILL.md +30 -0
  11. package/codex/skills/progress/SKILL.md +42 -0
  12. package/codex/skills/progress/scripts/progress-plan.mjs +722 -0
  13. package/codex/skills/progress/scripts/progress.mjs +295 -0
  14. package/codex/transform-matrix.md +19 -14
  15. package/commands/setup.md +23 -0
  16. package/hooks/obsidize-hook.mjs +116 -4
  17. package/hooks/progress-plan.mjs +1 -1
  18. package/hooks/progress.mjs +143 -38
  19. package/hooks/register.mjs +13 -3
  20. package/hooks/telemetry-count-codex.mjs +222 -0
  21. package/hooks/update-checkin.mjs +15 -7
  22. package/hooks/update-fetch.mjs +15 -9
  23. package/hooks/update-notify.mjs +30 -17
  24. package/package.json +1 -1
  25. package/skills/3d-intro-build/SKILL.md +11 -5
  26. package/skills/3d-intro-build/references/azure-adapter.mjs +374 -81
  27. package/skills/3d-intro-build/references/curate.mjs +48 -14
  28. package/skills/3d-intro-build/references/preview-lib.mjs +51 -15
  29. package/skills/3d-intro-build/references/prompts.md +4 -4
  30. package/skills/3d-intro-build/references/serve.mjs +6 -1
  31. package/skills/3d-intro-build/references/verify-intro.mjs +16 -9
  32. package/skills/3d-intro-build/references/video-pool.mjs +250 -135
  33. package/skills/3d-intro-setup/SKILL.md +41 -10
  34. package/skills/3d-intro-setup/references/azure-adapter.mjs +374 -81
  35. package/skills/3d-intro-setup/references/video-pool.mjs +250 -135
  36. package/skills/anti-drm/SKILL.md +6 -3
  37. package/skills/anti-drm/scripts/anti-drm.mjs +49 -12
  38. package/skills/anti-drm/scripts/instruction-toggle.mjs +105 -20
  39. package/skills/append_wiki/SKILL.md +34 -8
  40. package/skills/audit-mock/SKILL.md +1 -1
  41. package/skills/audit-security/SKILL.md +64 -2
  42. package/skills/compact-wiki/SKILL.md +37 -6
  43. package/skills/deep-research/SKILL.md +11 -0
  44. package/skills/docs-setup/SKILL.md +37 -7
  45. package/skills/lfm/SKILL.md +148 -0
  46. package/skills/lineage/SKILL.md +25 -15
  47. package/skills/lineage/lineage.py +564 -301
  48. package/skills/motion-graphic-make/SKILL.md +1 -1
  49. package/skills/motion-graphic-make/references/curate.mjs +48 -14
  50. package/skills/motion-graphic-make/references/preview-lib.mjs +51 -15
  51. package/skills/motion-graphic-make/references/serve.mjs +6 -1
  52. package/skills/motion-graphic-setup/SKILL.md +58 -13
  53. package/skills/obsidizer/SKILL.md +30 -11
  54. package/skills/obsidizer/obsidize.mjs +50 -12
  55. package/skills/omc-patch/SKILL.md +86 -23
  56. package/skills/omc-patch/scripts/omc-patch.mjs +460 -116
  57. package/skills/payload-mon/SKILL.md +6 -2
  58. package/skills/payload-mon/scripts/payload-mon.mjs +88 -12
  59. package/skills/payload-mon/scripts/payload-size.mjs +4 -1
  60. package/skills/pdf-vision-extract/SKILL.md +11 -6
  61. package/skills/ralph-qa/SKILL.md +125 -151
  62. package/skills/ralph-qa/references/gemini-seat.mjs +67 -19
  63. package/skills/ralph-qa/references/payload-scan.mjs +22 -7
  64. package/skills/ralph-qa/references/seat-payload.mjs +646 -0
  65. package/skills/ralph-qa/references/seat-run.mjs +956 -0
  66. package/skills/ralph-qa/references/seat-spawn.mjs +205 -0
  67. package/skills/ralph-qa/references/verifier-probe.mjs +57 -16
  68. package/skills/rfp-author/SKILL.md +5 -3
  69. package/skills/rfp-author/references/vendor-rfp-structure.md +1 -1
  70. package/skills/setup-bypass-permissions/SKILL.md +27 -9
  71. package/skills/setup-bypass-permissions/scripts/codex-bypass.mjs +135 -0
  72. package/skills/setup-bypass-permissions/scripts/codex-config.mjs +210 -0
  73. package/skills/setup-harness-factory/SKILL.md +17 -1
  74. package/skills/setup-insane-search/SKILL.md +16 -0
  75. package/skills/setup-java/SKILL.md +20 -1
  76. package/skills/setup-lsp/SKILL.md +56 -13
  77. package/skills/setup-mcp/SKILL.md +73 -4
  78. package/skills/setup-node/SKILL.md +31 -6
  79. package/skills/setup-omc/SKILL.md +24 -0
  80. package/skills/setup-omc-hud/SKILL.md +42 -9
  81. package/skills/setup-omc-hud/assets/apply-hud.mjs +242 -27
  82. package/skills/setup-omc-hud/assets/codex-config.mjs +210 -0
  83. package/skills/setup-omc-hud/assets/codex-status-line.mjs +90 -0
  84. package/skills/setup-omc-hud/assets/omc-hud-custom.mjs +81 -14
  85. package/skills/setup-omc-hud/scripts/claude-update-last.mjs +5 -3
  86. package/skills/setup-playwright/SKILL.md +45 -2
  87. package/skills/setup-pwsh/SKILL.md +19 -0
  88. package/skills/setup-python/SKILL.md +45 -7
  89. package/skills/setup-sandbox/SKILL.md +30 -5
  90. package/skills/setup-stitch/SKILL.md +22 -0
  91. package/skills/setup-tmux/SKILL.md +24 -4
  92. package/skills/smart-compact/SKILL.md +58 -12
  93. package/skills/smart-compact/scripts/codex-gate.mjs +384 -0
  94. package/skills/tone-compact/SKILL.md +2 -1
  95. package/skills/tone-compact/scripts/instruction-toggle.mjs +105 -20
  96. package/skills/ultra-chain/SKILL.md +12 -7
  97. package/skills/ultra-chain/references/preview-lib.mjs +51 -15
  98. package/skills/ultra-chain/references/serve.mjs +6 -1
  99. package/skills/ultra-interview/SKILL.md +14 -2
  100. package/skills/update-banker/SKILL.md +19 -3
  101. package/skills/vertical-pptx/SKILL.md +6 -3
  102. package/skills/vertical-pptx-setup/SKILL.md +76 -20
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Claude Code skills + commands — QA, audit, docs, architecture, dependency setup, and wiki; the banker plugin marketplace.",
9
- "version": "0.20.2"
9
+ "version": "0.21.0"
10
10
  },
11
11
  "plugins": [
12
12
  {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "banker",
3
- "version": "0.20.2",
3
+ "version": "0.21.0",
4
4
  "description": "Claude Code plugin: QA/audit/docs/architecture skills + commands, a /banker:setup installer for OS dependencies (playwright, etc.), and wiki compaction.",
5
5
  "author": {
6
6
  "name": "smallOpenSource",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,207 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.21.0] - 2026-10-28
4
+
5
+ ### Added
6
+ - 새 스킬 `lfm`(learn from master): 어떤 분야의 최고 전문가 그룹이 실제로 일하는 방식을 그들이 공개한 1차 자료로 조사한다. 근거 있는 그룹 3~5곳, 관점별 자료(작업 순서, 역할, 품질 기준, 검토, 도구, 실패와 대응), 공통 관행과 반대 근거, 계획 적용 항목(`M-1` …의 적용, 조정, 제외와 이유)을 낸다. 웹 조사를 못 하면 모델 지식으로 채우지 않고 "웹 조사 불가" 로 끝난다. Claude Code 와 Codex(Linux 0.144.5, Windows 0.160.1)에서 실제로 불러 확인했다.
7
+ - `ultra-interview`, `ultra-chain`, `deep-research`, `rfp-author` 의 리서치가 그 분야 전문가 그룹의 작업 방식도 조사해 계획에 쓴다. ultra-chain 은 1단계에서 `01-masters.md` 를 남기고, 3단계 계획이 `M-n` 마다 판정과 이유를 적으며 계획 검토자가 이를 본다. rfp-author 는 조사 결과를 내부 추적용 `references/expert-practices.md` 에만 두고 벤더 발송본에는 넣지 않는다.
8
+ - Codex 에서 모든 구성요소가 동작한다.
9
+ - 명령 `front-qa`, `setup` 이 Codex 스킬(`$banker-front-qa`, `$banker-setup`)로도 설치된다. Codex 0.144 이상에는 사용자 프롬프트가 없다.
10
+ - Codex 전용 스킬 `graceful-pause`(작업 중 보내면 실행 중인 도구 호출이 끝난 뒤 멈춤)와 `progress`(지금 세션의 계획 파일 트리, `update_plan` 단계, 최근 도구 호출. tmux 안이면 `--pane` 으로 오른쪽 칸 갱신).
11
+ - `banker setup --codex` 가 Codex 훅을 설치한다: 업데이트 알림(`SessionStart`), 사용량 카운팅(`Stop`, 턴마다 한 번). 사본은 `$CODEX_HOME/hooks-custom/banker/`, 묶음은 이벤트 맨 뒤, Windows 는 PowerShell 형식. `banker hooks status|enable|disable`, `banker uninstall --codex`. Codex 를 다시 열 때 Hooks need review 나 `/hooks` 에서 신뢰해야 돈다.
12
+ - `obsidizer --enable` 이 Codex 에서 `omx_wiki/.obsidizer` 와 `PostToolUse`(matcher `Bash`) 훅으로 동작한다. `omx wiki` 의 ingest, add 셸 호출 뒤에만, CLI 출력 JSON 이 이름 붙인 일반 페이지만, 검사한 `omx_wiki/` 를 cwd 로 고정한 정규화기(`--page --vault=<dev>:<ino>`)로 고친다.
13
+ - `lineage` 3.1.1 이 Codex 기록(rollout)을 읽는다(0.144 와 0.160 형식). Codex 안에서는 `CODEX_THREAD_ID` 로 지금 세션을 찾고, `--all-sessions` 는 이 폴더의 rollout 을 하위 에이전트 기록을 빼고 합친다.
14
+ - `setup-bypass-permissions` 에 대상 `codex`(`config.toml` 의 `approval_policy = "never"`, `sandbox_mode = "danger-full-access"`, 켜기 전 값 기록과 `off` 원복, 조직 정책과 기본 프로필 확인).
15
+ - `setup-omc-hud` 의 Codex 대상이 `[tui] status_line` 을 OMX 프리셋으로 켜고 끈다(없을 때만 넣고 banker 가 넣은 줄만 뺌).
16
+ - Codex 기록 형식이 바뀌어도 결과가 조용히 비지 않는다: lineage 는 사용자 턴 0 이면 Codex 버전과 함께 exit 2, progress 는 경고 줄, 카운팅 훅은 다음 세션 시작 때 경고 한 번. `banker doctor` 가 최신 rollout 의 형식을 점검한다(Codex 를 업데이트한 뒤 확인용).
17
+
18
+ ### Changed
19
+ - `banker setup --codex` 가 `CODEX_HOME` 을 따른다(상대 경로는 Codex 처럼 지금 폴더 기준). Codex 홈이 지금 폴더나 그 저장소 안이면 샌드박스가 고칠 수 있어 훅을 설치하지 않는다.
20
+ - Codex 사용량 카운팅은 이 Codex 에 설치된 banker 스킬 이름만 센다. 체크인 형식 `{version, os, counts}` 는 그대로이고 세션 id 와 턴 id 는 보내지 않는다(PRIVACY.md 에 Codex 절).
21
+ - 위키(`append_wiki`, `compact-wiki`)는 Codex 에서 `omx wiki` CLI 와 `omx_wiki/` 를 쓰고, Windows PowerShell 5.1 의 인자 전달을 맞춘다. `smart-compact` 는 Codex 에서 토큰 사용량을 rollout 으로 재는 훅을 쓴다. `payload-mon`, `omc-patch`, `setup-omc-hud`, `smart-compact` 는 `~/.codex` 나 `~/.claude` 쓰기를 명령별 승인이나 사용자의 `!` 명령으로 하고, 설정 폴더를 통째로 여는 `--add-dir` 은 권하지 않는다.
22
+
23
+ ### Notes
24
+ - Codex 에서 지금도 Claude Code 와 다른 것: `payload-mon` 은 Codex 자신의 요청 크기를 재지 않고, `omc-patch` 는 OMX 를 패치하지 않으며, `progress` 는 상시 패널이 아니고(Windows 는 옆 칸 없음), `graceful-pause` 는 실행 중인 도구 호출이 끝난 뒤 멈춘다.
25
+ - Windows 에서 SSH 로 접속한 세션은 Codex 샌드박스가 어떤 명령도 실행하지 못한다(Codex 쪽 제약). 데스크톱 세션에서는 샌드박스를 켠 채 확인했다.
26
+
27
+ ## [0.20.5] - 2026-10-21
28
+
29
+ ### Changed
30
+ - `ralph-qa` 의 외부 좌석 전송을 node 실행기(`references/seat-run.mjs`, 명령 init, untracked, prepare, check, send, cleanup, put)로 옮긴다. SKILL 은 판단(좌석과 모델, 새 파일과 관련 범위 고르기, 짧은 부분, 가림, 512 KiB 질문, 나누기)과 결과 읽기만 남기고, bash 블록과 PowerShell 산문의 좌석 명령, git 사슬, 시간 상한, 정리는 실행기가 한다. 좌석의 인자와 env 는 0.20.4 명령과 글자 그대로 같고 시험이 고정한다.
31
+ - 사용자에게 달라지는 것: PowerShell 에서도 좌석마다 600초 상한이 서고(전에는 없었다), 상한과 멈춤에 좌석의 프로세스 묶음(Windows 는 트리)이 함께 끝나며, 좌석이 스스로 끝나도 그 묶음에 남은 프로세스를 끝내 늦게 쓰는 gemini 기록이 남지 않는다. send 가 돌아오면 그 좌석의 gemini 기록, opencode 세션, 사본이 지워져 있다. send 는 실행기가 띄운 둘째 node 가 맡아, 실행기 node 만 끝나도(`kill -9`, 작업 관리자) 좌석을 끝내고 정리한다. Windows Git Bash 의 `/c/...` 꼴 경로도 `--repo`, `--dir` 로 받는다.
32
+ - 남의 저장소(압축본에 딸려 온 `.git`)를 볼 때: 2단계의 git 은 저장소의 훅, 저장소 설정의 filter, 하위 모듈 안의 git status 를 돌리지 않고 망에 닿지 않는다(부분 clone 의 지연 받기 포함). 사용자 설정의 filter(예: git-lfs)는 그대로 쓴다. git 폴더가 이 저장소의 것이 아니면(`.git` 파일이나 링크, `commondir`, `core.worktree`, `refs` 나 `objects` 안의 링크, `objects/info/alternates` 가 다른 저장소를 가리킴) 다른 저장소의 파일이 실리지 않게 `not-a-repo` 로 멈춘다. 그래서 `clone --shared`, `--reference`, `--separate-git-dir` 저장소는 보내지 않는다. 하위 모듈의 더러움(`-dirty`)은 보이지 않는다. 같은 폴더의 send 둘은 하나만 보낸다. Windows 프로브는 `.cmd` CLI 를 System32 의 cmd.exe 로 돌리고 지금 폴더의 `node` 를 찾지 않는다.
33
+ - 보내기 직전 고른 모델로 프로브를 다시 불러 MCP 서버와 관리 설정을 그때의 설정으로 확인한다(모델은 다시 정하지 않는다). 새 파일은 정확한 이름으로 맞춰, 줄바꿈이 든 이름은 멈추지 않고 보내지도 않는다. git 은 PATH 의 절대 경로로 저장소 밖 폴더에서 돌고 fsmonitor 를 끈다. 멈춤과 좌석 결과는 JSON 의 `stop`, `status`, `why` 로 나오고 같은 JSON 이 `<d>/result-<명령>.md` 에 남는다.
34
+ - 유지보수자용: step2-chain, seat-folders 시험을 seat-payload, seat-run, seat-spawn 시험(가짜 좌석 CLI `scripts/test-fixtures/seat-stub.mjs`)으로 옮긴다. smoke 의 S23 묶음을 S25 묶음(실행기 명령, 멈춤과 결과 집합, 장치, Node 16.7 API, 손으로 짠 명령 없음)으로 바꾼다.
35
+ - `lineage` SKILL 은 `--redact-mode` 나 `--redact-extra` 를 바꿔 `--rulebase` 를 다시 돌릴 때 `--rebuild-summaries` 를 함께 주라고 적는다. 그대로 다시 돌리면 앞서 만든 요약을 다시 써, mask 로 만든 요약이 기본 실행에도 mask 로 남는다.
36
+ - 유지보수자용: lineage 시험의 시간 상한이 CPU 시간을 읽는 까닭을 도우미 하나에 적는다. 파일 시스템 인코딩이 ASCII 인 설정에서도 lineage 시험이 오류 없이 돈다. smoke 는 subTest 로 실패한 시험의 이름도 한 번씩 보인다.
37
+ - `ralph-qa` SKILL 이 `TaskStop` 이 좌석 프로세스 트리를 멈춘다는 문장을 실측한 Linux, macOS 로 좁힌다. Windows(Git Bash)에서는 좌석의 시간 상한이 트리를 끝내고, PowerShell 판에서 트리까지 멈추는지는 재지 못했다고 적는다.
38
+ - 유지보수자용: setup-omc-hud 시험의 쓰지 않는 도우미 셋을 지우고 설치 스크립트의 가져오기 순서를 맞춘다. 중간에 멈추는 설치의 시험은 쓰기 오류를 일으키는 preload 로 돈다.
39
+ - 유지보수자용: azure-adapter 와 video-pool 이 따로 들던 시간 상수와 오류 도우미를 adapter 하나에 둔다. 임시 파일의 `wx` 지킴을 고정하는 시험을 더한다.
40
+ - `setup-omc-hud` SKILL 이 `settings.json` 을 새 파일로 바꿔 넣을 때 손으로 준 ACL, 확장 속성(Windows 는 대체 데이터 스트림), SELinux 라벨이 새 파일에도 백업에도 따라오지 않는다고 적는다(세 OS 실측).
41
+ - `omc-patch` SKILL 은 명령의 자리 표시에 도구 출력이나 `find` 가 낸 값을 넣을 때 bash, PowerShell 모두 작은따옴표로 감싸고, 값에 작은따옴표(PowerShell 은 `‘` `’` `‚` `‛` 도)나 줄바꿈이 있으면 명령을 만들지 않는다고 적는다. 백업 없는 패치의 원본을 임시 tar 로 되찾는 명령은 한 줄로 바꿔, 임시 폴더를 만들지 못하면 git 도 tar 도 돌리지 않고 다 쓴 폴더는 지운다.
42
+ - 유지보수자용: omc-patch 시험의 git 은 https, ssh 전송을 받지 않는다(`GIT_ALLOW_PROTOCOL=file:http`). 고정물의 `example.invalid` origin 으로 이름 서버에 묻는 일이 생기지 않는다. 시험 env 에 커밋 정보(이름, 이메일)를 줘, fetch 의 reflog 가 이 PC 의 호스트 이름을 이름 서버에 묻지 않는다. 태그 받기의 두 KILL(TERM 을 무시하는 git, 스스로 끝난 git 이 남긴 프로세스)을 지키는 시험을 더한다.
43
+ - `anti-drm` 설정 자리가 링크면 `status` 가 설정 줄에 링크가 가리키는 곳을 함께 보이고, 그 파일의 틀린 값은 글 대신 형식과 길이만 보인다(`(string, 12자)`). 링크를 따라 읽는 설계는 그대로다. `on` 의 "이 자리를 덮어쓰지 않습니다" 안내는 링크가 아닌 자리에만 붙는다(링크는 설정을 다시 주면 새 파일로 바뀐다).
44
+ - 유지보수자용: smoke 와 gen-skill-changes 시험이 `Object.hasOwn` 없이 돈다(engines 하한 Node 16.7). 두 시험의 npm 은 임시 HOME 과 로그 자리를 써, 사용자 `.npmrc` 의 `logs-max=0`, `logs-dir` 에서 거짓 FAIL 이 나지 않고 로그가 임시 폴더 밖에 생기지 않는다. smoke 의 표준 입력 판정이 공백 든 자리 표시(`<입력 파일 경로>`)를 재지정으로 보지 않는다.
45
+ - 유지보수자용: 저장소의 글 파일에 날 숨은 글자가 없는지 보는 시험(`scripts/hidden-chars.test.mjs`)을 더하고, 시험 셋의 날 글자 6자를 이스케이프로 바꾼다. PowerShell 을 띄우는 시험은 모두 임시 홈 env 를 준다는 시험을 더하고, 그 env 가 모듈 분석 캐시 자리(`PSModuleAnalysisCachePath`)도 옮긴다.
46
+ - 설치 스킬과 확인 블록을 둔 스킬 18개, `/banker:setup` 의 네트워크 확인
47
+ - 확인 블록의 첫 줄이 Codex sandbox 가 네트워크를 막는 때(`CODEX_SANDBOX_NETWORK_DISABLED=1`)를 알리고, 그때는 '오프라인' 이 아니라 'sandbox 가 네트워크를 막음' 으로 보고한다.
48
+ - `npm ping` 을 15초 감시 함수(`in15`) 안에서 부른다. 감시는 호출자의 출력을 쥐지 않아, 확인이 끝나면 바로 돌아온다. 패킷을 버리는 망에서 npm 은 OS 의 연결 재시도가 끝날 때까지 약 130초를 기다렸다(`--fetch-timeout` 은 받는 중의 쉼만 잰다). 빈 캐시 대안은 ping 이 감시에 걸렸으면 하지 않는다. 두 npm 확인 모두 `--no-update-notifier` 를 준다.
49
+ - 확인이 실패하면 명령, 종료 코드, stderr 첫 줄을 보고에 붙인다. curl 의 종료 60 과 npm 의 인증서 오류는 '오프라인' 이 아니라 인증서 문제로 보고하고 `NODE_EXTRA_CA_CERTS` 를 안내한다.
50
+ - curl 확인 줄은 `--ssl-no-revoke` 를 준다. Windows 의 `curl.exe` 와 Git Bash 의 curl 은 Schannel 이라, 폐지 목록 서버에 닿지 못하는 망에서 종료 60 으로 끝났다(Windows 박스 실측). 다른 curl 은 이 깃발을 받고 무시한다(macOS, Rocky 8 실측). PowerShell 에서는 `Get-Command curl.exe` 로 먼저 찾는다(없으면 앞 명령의 `$LASTEXITCODE` 가 남는다).
51
+ - dnf 와 apt 가 막힌 망에서 기다리는 시간(실측 121초, 247초)과 `apt-get update` 가 받지 못해도 종료 0 이라는 것을 적는다. 시간 제한은 관리자 설정을 따른다.
52
+ - pip 설정 읽기가 판 붙은 python(3.13, 3.12, 3.11)의 pip 도 본다. Rocky 8 의 기본 pip(9.0.3)은 `config` 명령이 없다.
53
+ - `/banker:setup` 이 부르는 스킬은 같은 실행 안에서 이미 돌린 같은 확인 줄의 결과를 다시 쓴다.
54
+ - `setup-mcp` 의 오프라인 등록은 macOS, Linux 에서 설치한 실행 파일을 절대 경로로 등록한다. Windows 는 `cmd /c` 와 이름이다. 서버를 띄우는 런타임의 PATH 에 node 가 없을 때(GUI, IDE)는 node 도 절대 경로로 등록하라고 적는다.
55
+ - `setup-node` 확인에 github.com(nvm 의 install.sh 가 git 이 있으면 거기서 clone 한다)을, `setup-playwright` 확인에 브라우저 내려받기 서버(`cdn.playwright.dev`, 미러 변수를 따름. chromium 미러만 주면 ffmpeg 의 기본 서버도)를, `motion-graphic-setup` 확인에 RPM Fusion 을 더한다.
56
+ - `vertical-pptx` 의 스크래치 설치는 새 임시 폴더에서 돌아 프로젝트 트리와 그 `.npmrc` 를 건드리지 않는다. 이 스킬과 `pdf-vision-extract` 는 오프라인이면 설치하지 않는다고 적는다. `audit-security` 1단계에 원천 확인과 Go 도구 받기 꼴(https 만, `~/.local/bin` 을 만듦)을 둔다.
57
+ - 유지보수자용: smoke 가 판 질의(`npx --version`, `curl -V`)를 내려받기로 세지 않는다. 새 단언 airgap-4l, 4m, 4n, 4o, 4p, 4q, 9d, 12 가 위 꼴을 지킨다.
58
+
59
+ ### Fixed
60
+ - `lineage` 3.0.10: detect-secrets 가 설치된 환경에서 검사용 임시 파일을 쓰다 실패하면(디스크가 가득 참, UTF-8 이 담지 못하는 글자) 그 파일이 임시 폴더에 남던 것. 그 파일에는 detect-secrets 가 가리기 전의 글이 들 수 있었다.
61
+ - `ralph-qa` 3단계 검사기가 `--from-literal=DB_PASSWORD=…`, `--env=…`, `(DB_PASSWORD=… psql)` 의 비밀번호 낱말을 놓치던 것. 셸의 `PWD`, `OLDPWD` 가 경로를 담은 줄을 비밀번호로 가리던 것도 고친다(이름이 PWD 로 끝나기만 하는 키와 경로가 아닌 값은 그대로 잡는다).
62
+ - `ralph-qa` 프로브가 codex 설정의 `[[mcp_servers.<이름>]]`(표 배열, 따옴표 친 꼴 포함)를 MCP 서버가 없는 것으로 읽어 좌석을 세우던 것. codex 는 그 설정을 읽지 못하고 멈춘다. 이제 서버 목록을 못 읽은 것으로 보고 좌석을 세우지 않는다.
63
+ - `ralph-qa` 2단계의 관련 코드 범위가 파일 밖(시작이 마지막 줄을 넘음, 0, 끝이 시작 앞)이면 bash 는 빈 범위를, PowerShell 은 빈 줄이나 엉뚱한 줄을 붙이던 것. 이제 둘 다 `관련 범위가 파일 밖이다` 로 멈추고, PowerShell 도 끝이 파일을 넘으면 있는 줄까지만 붙인다.
64
+ - `ralph-qa` 의 here-document 구분자가 고정 이름(`RALPHQA_EOF`)이라 그 이름의 줄이 든 본문이 거기서 끊기던 것. 이제 실행마다 무작위 id 를 붙인다. PowerShell here-string 은 `'@` 로 시작하는 줄이 있으면 쓰지 않고 그 좌석을 `cli-call-failed` 로 둔다.
65
+ - `setup-omc-hud` 래퍼가 홈 폴더를 알 수 없으면(HOME 도 계정 항목도 없음) 상태표시줄 없이 끝나던 것. 이제 래퍼 옆의 로더로 그리고 계정 칸만 뺀다.
66
+ - 래퍼가 로더나 `payload-mon` 사본 자리에 일반 파일이 없을 때 첫 자리를 불러, FIFO 면 끝나지 않고 폴더면 Node 오류 여러 줄을 내던 것. 이제 로더가 없으면 `[OMC HUD] omc-hud.mjs not found: <경로>` 한 줄을 내고, PL 사본이 없으면 PL 칸만 뺀다.
67
+ - 설치 스크립트가 설치할 자리의 FIFO 에서 끝없이 기다리거나, 파일 자리의 폴더(폴더 자리의 파일)에서 로더를 쓴 뒤 중간에 멈추던 것. 이제 아무것도 읽거나 쓰기 전에 그 자리를 알리고 멈춘다.
68
+ - 설치 스크립트가 이전 statusLine 명령을 알리는 줄에 그 명령 속 토큰과 비밀번호를 그대로 찍던 것. 이제 그 명령의 첫 낱말(앞의 변수 대입은 건너뜀)과 길이만 보인다(원문은 백업에만).
69
+ - 하드 링크인 `settings.json` 을 제자리에 쓸 때 다른 이름(스냅샷 등)도 바뀐다는 것을 알리지 않던 것. 이제 `[..] settings.json has N other name(s)` 줄로 알린다.
70
+ - `payload-mon` 이 모듈 사본을 쓰는 사이 사본 폴더가 바뀌었다 돌아오면 사본이 없는데도 켰다고 하던 것, 바뀐 자리에 원래 있던 다른 래퍼의 사본을 거두며 지우던 것, Windows 에서 파일 ID 가 2^53 을 넘어 다른 폴더를 같은 폴더로 볼 수 있던 것.
71
+ - `payload-mon` 의 기록 캐시가 Windows 에서 파일 ID 를 Number 로 견줘, 바뀐 기록을 옛 위치부터 이어 셀 수 있던 것.
72
+ - `3d-intro-build` 미리보기와 검토 서버가 HEAD 요청에도 파일을 끝까지 읽고, 선언보다 짧아진 파일이면 헤더 없이 연결만 닫던 것. 이제 HEAD 는 헤더만 보낸다.
73
+ - 남의 저장소가 추적하는 프로젝트 키 파일(`.env.3d-intro.local`)에 셋업이 사용자의 키를 쓰던 것(다음 커밋에 실림). 이제 `persistCreds` 가 거부하고, `resolveCreds` 는 `_tracked` 로 알려 빌드가 멈춘다(빌드 0단계의 코드와 `generateClip` 이 그 값으로는 아무것도 보내지 않고 멈춘다).
74
+ - 코드 없는 WAN 401 하나로 키를 영구히 빼던 것. 이제 403 처럼 24시간 쉰다(`InvalidApiKey` 는 그대로 뺀다).
75
+ - `pollVideo`, `wanPollTask`, `generateClip` 을 폴링 간격 0 으로 부르면 쉬지 않고 요청하던 것(30분에 약 140만 회). 이제 실제 타이머의 기다림은 1초 아래로 내려가지 않는다.
76
+ - Sora 가 `Retry-After` 없이 429 를 낼 때 `maxRateWaitMs` 를 넘는 240초를 기다리던 것. 이제 다음 기다림이 상한을 넘으면 `rate` 로 멈춘다.
77
+ - 읽기가 멈춘 테이크 하나가 검토 페이지 전체를 붙잡던 것. 이제 5초까지 기다리고 그 테이크는 `읽는 중` 으로 보인다. 같은 크기로 금방 다시 쓴 파일이나 Windows 에서 파일 ID 가 Number 로 겹치는 파일의 sha256 이 옛 값으로 나오던 것도 고친다.
78
+ - 상태 파일에 적힌 주소와 PID 만 믿고 그 호스트에 묻고 이 기기의 그 PID 에 신호를 보내던 것. 이제 기록된 주소가 이 기기일 때만 묻고 끈다(`127.` 로 시작하는 DNS 이름은 이 기기가 아니다). 다른 설정으로 도는 서버를 알리는 줄은 그 폴더를 따옴표 친 한 조각으로 보인다.
79
+ - 키 파일의 줄 끝이 CR 뿐이면 한 줄로 읽혀 키가 다른 값(endpoint)에 들어가고, 쓸 때 다른 키 줄이 사라지던 것. 이제 CR, LF, CRLF 를 모두 줄 끝으로 읽고 그 파일의 줄 끝을 지킨다.
80
+ - 프로젝트가 `decisions.json.tmp`, `curate.server.json` 자리에 심은 링크를 따라 프로젝트 밖 파일을 쓰던 것. 이제 무작위 이름의 새 파일에 쓴 뒤 바꿔 넣는다.
81
+ - `omc-patch` 인자 없는 apply 의 태그 받기가 시간 제한(120초)에 git 하나만 끝내, git 이 띄운 보조 프로세스(`git remote-http` 등)가 연결을 http 는 30초, TLS 는 300초까지 더 붙들던 것. 이제 시간 제한이나 Ctrl+C 에 그 보조 프로세스까지 함께 끝낸다.
82
+ - 인자 없는 apply 가 `installed_plugins.json.omcbak` 자리가 폴더, FIFO, 링크일 때 백업 없이 판을 바꾸고 `완료. 실패 0건.` 이라 하던 것. 이제 판을 바꾸지 않고 `installed_plugins.json 을 바꾸지 않음` 으로 멈춘다.
83
+ - fsync 를 받지 않는 파일 시스템(`EINVAL`, `ENOTSUP`)에서 훅을 하나도 패치하지 못하던 것. 이제 디스크로 내리기만 건너뛰고 rename 으로 바꾼다(azure-adapter 와 같은 규칙).
84
+ - 태그를 받지 못한 까닭 줄과 `--check` 의 origin 줄, 고정 실패, 고정 해제 실패, origin 을 읽지 못함 줄이 주소의 경로, 조각, `;` 매개변수를 그대로 싣던 것. 이제 기본 상류(GitHub 의 OMC 저장소, scheme 이 있는 주소)는 가린 꼴 그대로(쿼리는 이름 없는 토큰까지 통째로 `?***`), 그 밖의 주소(미러)는 scheme 과 host 까지만 싣는다. git 의 줄에 든 주소는 가리기 전의 주소로 꼴을 정해, 경로나 쿼리 속 `@` 뒤의 글이 host 로 보이지 않는다.
85
+ - Windows 에서 마켓플레이스 폴더(남의 저장소 사본)에 든 `git.exe` 가 git 대신 돌 수 있던 것. Windows 는 이름만 준 프로그램을 일하는 폴더에서 먼저 찾는다. 이제 모든 git 을 홈 폴더에서 `-C <마켓플레이스>` 로 돌린다.
86
+ - 쿼리 값 가림이 git 이 주소를 닫는 `'` 와 `:` 까지 먹어 고정 실패 줄과 까닭 줄이 깨져 보이던 것.
87
+ - 백업 없는 패치를 되돌리는 안내가 판과 이름을 따옴표 밖에, 폴더 경로를 큰따옴표 안에 넣어 `$` 가 든 홈 폴더(PowerShell)에서 다른 경로가 되던 것. 이제 작은따옴표로 감싸고, 작은따옴표가 든 경로는 큰따옴표로, 둘 다 맞지 않으면 명령 없이 경로만 보인다.
88
+ - `/progress` 패널이 늦게 온 계획 읽기의 도착 순서에 따라 다른 계획을 보이던 것(검토 문서 둘을 나란히 쓰면 둘째 것이 보이는 등). 이제 읽기를 손댄 순서의 자리에 끼워, 손댄 순서대로 왔을 때와 같은 계획을 보인다. 끝내 오지 않는 읽기는 16개까지만 기다린다. 같은 닿음 뒤에 시작한 다시 읽기 둘(셸 명령으로 계획 파일을 고친 턴)은 늦게 와도 나중에 시작한 쪽이 남는다.
89
+ - `/progress` 패널이 TodoWrite 목록을 하나씩 지워 잘라, 2만 개에 3.7초 걸리던 것. 이제 결과가 같은 한 번 자르기다.
90
+ - 작업 id 에 제어 글자가 있거나 1만 자를 넘으면 엔진이 그 줄의 key 를 버리던 것. 이제 그런 id 는 엔진이 받는 key 로 바꾼다(보통 id 는 그대로 `k-<id>`). 작업 설명과 진행 문구는 패널이 읽는 4,096자까지만 상태에 둔다(5MB 설명을 그대로 두던 것).
91
+ - 엔진의 다시 그리기가 던지면 session.end, turn.start, turn.complete 아래의 훅이 돌지 않을 수 있던 것.
92
+ - `tone-compact`, `anti-drm` 의 잠금이 쓰기 실패 뒤, 그 사이 같은 inode 번호를 받은 다른 실행의 잠금을 지울 수 있던 것. 이제 이 실행의 토큰만 든 잠금만 지운다.
93
+ - 경로 표시가 글자 위나 둘레에 그리는 표지(취소선, 빗금, 동그라미)를 그대로 두어 `AGENTS.md` 가 다른 이름처럼 보일 수 있던 것. 분해된 이름에서 기호를 만드는 U+0338 은 그대로 둔다.
94
+ - 32MiB 를 넘는 AGENTS.md 를 읽어 같은 크기의 `.bak` 를 만들고, 2GiB 를 넘으면 오류로 멈추던 것. 이제 읽지 않고 `32MiB 보다 큰 파일이라 그대로 두었습니다` 로 거부하고 status 도 그렇게 알린다.
95
+ - `anti-drm on` 이 설정 자리가 폴더, FIFO, 64KiB 보다 큰 파일, 읽을 수 없는 파일일 때 설정을 다시 주라고 안내하던 것(다시 주어도 거부됨). 이제 옮기거나 권한을 고친 뒤 다시 실행하라고 한다.
96
+ - Windows 에서 `tone-compact`, `anti-drm` 이 규칙 파일이나 설정 파일 자리의 폴더로 가는 링크를 새 파일로 바꾸지 못하던 것(Windows 는 그런 링크 위로 이름을 바꾸지 않음). 이제 그 링크를 지운 뒤 바꿔 넣는다. 링크가 가리키던 폴더는 그대로다.
97
+ - `banker telemetry status` 가 시도 시각이 지금보다 뒤일 때, 하루가 안 된 마지막 체크가 확인을 쉬게 하는데도 다음 세션에 다시 시도한다고 하던 것. 이제 훅과 같은 규칙으로 말한다.
98
+ - `obsidizer` 가 fsync 를 받지 않는 파일 시스템(`EINVAL`, `ENOTSUP`)에서 실행 전체를 멈추던 것. 이제 그 쪽은 디스크로 내리기를 건너뛰고 rename 으로 통째 바꾼다.
99
+ - `motion-graphic-setup` 의 RHEL8 블록이 Node 22 원천(AppStream 22 스트림, NodeSource)을 둘 다 갖추지 못해도 배포판의 옛 `nodejs` 를 sudo 로 깔던 것.
100
+ - `setup-python` 의 PowerShell 블록이 uv 설치 스크립트의 실패(0 이 아닌 종료)를 알리지 않던 것.
101
+ - `vertical-pptx-setup` 의 업스트림 tarball 블록이 받기만 하고 풀기와 정리는 문장으로 남겨, 수백 MB 의 tarball 이 이름 모를 임시 폴더에 남던 것. 이제 블록 하나가 받기, 풀기, 추출, 정리까지 한다. 배포판 경로의 글롭(`$SP/*.rpm`)은 `find` 로 바꾼다(zsh 는 맞는 것이 없는 글롭에서 멈춘다).
102
+ - `setup-lsp` 의 Spring Boot LS 블록이 셸에 `set -euo pipefail` 과 EXIT trap 을 남겨, 같은 셸의 다음 실패가 셸을 끝내거나 셸이 끝날 때 다른 `T` 를 지우던 것. 이제 블록이 서브셸에서 돈다.
103
+ - `update-banker` 0단계가 `npm ping` 이 실패해도 이어서 `npm view` 로 또 기다리던 것. 이제 ping 이 0 일 때만 부른다.
104
+ - 유지보수자용: update-notify 의 FIFO 캐시 시험이 뒤의 체크인을 기다리지 않아 지연에 따라 실패하고, 이미 지운 임시 폴더를 되살리던 것.
105
+
106
+ ## [0.20.4] - 2026-10-21
107
+
108
+ ### Changed
109
+ - 유지보수자용: setup-omc-hud 와 payload-mon 의 링크 시험이 Windows 에서도 돈다(폴더는 정션, 파일 링크는 만들 수 있는 계정에서). 시험 빈틈 6묶음을 메운다.
110
+ - 유지보수자용: ralph-qa 3단계 검사기의 선형 시간 시험을 꼴마다 CPU 시간으로 재, 동시에 돌려도 흔들리지 않게 한다. scan 예외의 exit 2, 같은 폴더의 두 번째 시도, 상한의 생존 단언 같은 시험 빈틈을 메운다.
111
+ - 유지보수자용: 3d-intro 의 Sora 모의 시험 묶음과 특성 시험을 더하고, 복잡도 10 을 넘던 함수 13개를 동작 그대로 나눈다. 미리보기 확인 시험이 위쪽 폴더의 `node_modules/playwright` 에 걸리지 않게 한다.
112
+ - 유지보수자용: smoke 와 gen-skill-changes 시험의 npm 캐시와 로그를 임시 폴더로 둔다(실제 `~/.npm` 에 쓰지 않음). 지침 토글과 a4p 시험의 빈틈(남의 파일로 가는 규칙 링크, 바꿔치기 순서, Windows 의 링크 시험, 파이썬 3.9 바닥)을 메우고 50줄 넘는 시험 함수를 나눈다.
113
+ - 유지보수자용: lineage 의 `redact`, `render_markdown`, `render_rows`, `main` 을 동작 그대로 작은 함수로 나눈다(특성 시험 20개, 나누기 전 코드로 구한 골든 해시, 차등 비교). CPU 를 쓰는 lineage 시간 상한 시험 8개는 CPU 시간으로 재 부하에서 흔들리지 않게 하고, smoke 는 실패한 lineage 시험의 이름을 보인다. 캐시 읽기 64KiB 경계, LF 쓰기, 숫자 도구 이름의 시험 빈틈을 메운다.
114
+ - README 와 PRIVACY 에 오프라인 절을 둔다. 네트워크가 필요한 스킬과 네트워크 없이 끝나는 모습, 세션 시작 훅이 실패 뒤 하루 쉬는 것, 훅은 `HTTPS_PROXY` 를 따르지 않는다는 것을 적는다.
115
+ - 유지보수자용: smoke 에 오프라인 단언을 더한다. 내려받기 전 원천 확인, 파이프로 바로 실행 금지, 시간 제한과 정체 감지, 개인 임시 폴더, 확인 명령의 홈 폴더 실행과 머리만 받기, setup-mcp 오프라인 등록, audit-security 와 deep-research 의 결과 판정이다.
116
+ - 유지보수자용: 마지막 정리 묶음의 시험 빈틈을 메운다. setup-omc-hud 설치 스크립트의 갈래 다섯, omc-patch 의 검토자 변이 일곱, ralph-qa 프로브의 지킴 둘, lineage 의 나누기 뒤 지킬 것 다섯, smoke 의 airgap 단언 일곱(줄 이음 파이프, `env` 를 거친 셸, 맨 curl 주소, 원천 호스트마다 확인 등). progress-plan 시험의 날 숨은 글자를 이스케이프 꼴로, verify-intro 와 a4p 시험이 실제 HOME 에 쓰지 않게 한다. pwsh 를 부르는 시험은 임시 HOME 에서 텔레메트리와 업데이트 확인을 끄고 돌고(그 고정물을 지키는 시험 포함), omc-patch 시험은 개발자의 askpass 도우미를 부르지 않는다.
117
+
118
+ ### Fixed
119
+ - `setup-omc-hud` 설치 스크립트가 이전 statusLine 명령을 알리는 줄에서 방향 제어 같은 보이지 않는 글자를 그대로 찍던 것. `?` 로 바꾼다.
120
+ - 설치 스크립트가 `settings.json` 을 제자리에 덮어써, 중간에 끊기면 반쯤 쓴 파일이 남을 수 있던 것. 이제 새 파일로 바꿔 넣는다(심볼릭 링크면 링크가 가리키는 파일). 새 파일로 바꿀 수 없는 파일, 하드 링크인 파일, 새 파일이면 소유자나 그룹이 바뀌는 파일은 전처럼 제자리에 쓴다. 디스크가 가득 차 새 파일을 쓰지 못하면 원래 파일을 그대로 둔다.
121
+ - 래퍼 v4 가 형제 파일 자리에 같은 이름의 폴더가 있으면 그것을 불러오려다 상태표시줄 대신 오류를 내던 것. 이제 일반 파일이 있는 자리를 쓴다.
122
+ - 다른 스크립트가 링크 경로로 래퍼 v4 를 불러오면 링크 옆의 로더를 찾지 못하던 것. 이제 설정 폴더의 `hud/` 도 찾는다.
123
+ - `CLAUDE_CONFIG_DIR` 가 상대경로면 래퍼의 계정 표시가 지금 작업 폴더 기준이던 것. 이제 Claude Code 를 시작한 폴더(statusline 입력의 `workspace.project_dir`) 기준으로 읽는다.
124
+ - `payload-mon` 이 모듈 사본을 쓰는 사이 사본 폴더가 링크로 바뀌면 그 너머에 쓰고도 성공이라 하던 것. 이제 거부하고 쓴 사본을 거둔다.
125
+ - `omc-patch` 되돌리기가 `scripts/` 없는 판 폴더나 객체인 고정 기록 `host` 에서 처리하지 못한 오류로 멈추던 것. 쓰기 전용 `hooks.json` 을 "쓰지 못함" 이라 하거나 그 되돌리기를 "완료" 라 하던 것도 고친다.
126
+ - `omc-patch` 되돌리기가 낡은 `.omcbak` 으로 새 원본을 덮던 것(같은 판 폴더에 새 원본이 깔린 뒤). 이제 알리고 그 파일을 실패로 세며, 적용은 백업을 지금 원본으로 바꾼다. 적용은 읽을 수 없는 백업이 있으면 그 파일을 패치하지 않고 `읽지 못함: <이름> 의 백업 (<코드>)` 으로 알린다(전에는 "쓰지 못함" 이라 했다).
127
+ - `omc-patch` 가 활성 판을 확인하지 못해 추정한 판에 적용하던 것과, 그때 `--check` 가 "모두 적용" 이라 하던 것. 이제 적용은 훅을 건드리기 전에 멈추고 `--check` 는 종료 1 이다.
128
+ - `omc-patch --check` 가 못 읽은 훅을 "다시 실행" 으로 안내하고 종료 0 이던 것(이제 종료 1). 못 읽거나 JSON 이 아닌 고정 기록에도 옛 URL 칸이 있다고 단정하던 것.
129
+ - `omc-patch` 출력에서 비밀번호에 날 `/` 가 든 URL 이 가려지지 않던 것과, 고정 해제 실패 줄에 사용자 이름이나 비밀번호 조각이 나오던 것. 이제 `//` 뒤 마지막 `@` 까지 가린다. 경로에 `@` 가 든 URL 은 호스트도 가려진다.
130
+ - 패치한 훅의 import 가 10초 시간 제한에 걸려도 아무 기록이 없던 것. 이제 훅의 stderr 에 한 줄 남긴다. 패치한 훅의 바이트가 바뀐다. 이미 패치한 훅은 그대로 `적용됨` 으로 보인다. 새 헬퍼는 되돌린 뒤 다시 적용하거나 새 OMC 판에 적용할 때 들어간다. stderr 를 읽는 쪽이 닫혀 그 줄을 쓰지 못해도 훅은 하던 일을 이어 가고 종료 코드는 그대로다.
131
+ - 고정 기록의 `version` 이 패치한 판이 아니던 것, 못 읽은 옛 기록의 하드 링크 다른 이름을 알리지 않던 것, 훅과 `hooks.json` 의 백업 자리가 일반 파일이 아닐 때(FIFO, 폴더) 백업 없이 "완료" 라 하던 것, 시험용 `OMC_PATCH_INSTALLED` 를 적용도 받던 것(이제 `--check` 만), 임시 파일과 기록 폴더가 만들 때 기본 권한이던 것.
132
+ - 인자 없는 적용의 판 전환 줄이 바꾸기 전 판을 잘못 적던 것, 마켓플레이스 폴더나 git 이 없어도 태그를 찾을 수 없다고 알리던 것, `installed_plugins.json` 의 거짓 값에서 이유 없이 멈추던 것.
133
+ - 손 복구 안내가 헬퍼 이름만 보고 무관한 파일에 덮어쓰라 하던 것. 이제 링크 너머 파일이 지금 이 도구가 만드는 패치본과 같을 때만 덮어쓰라 하고, 아니면 같지 않거나 읽어 확인할 수 없다고 알린다.
134
+ - `omc-patch` SKILL 의 PowerShell 블록이 Windows PowerShell 5.1 의 한글 사용자 폴더에서 깨지던 것, 다른 이름 찾기 안내가 범위 없이 찾던 것, 임시 tar 이름이 정해지지 않던 것, 홈 폴더가 링크면 다른 이름 찾기가 아무것도 찾지 못하던 것.
135
+ - `ralph-qa` 2단계가 목록 밖 자료를 외부 좌석에 싣던 길들. 관련 코드 범위에 출처 확인이 없던 것, 이름에 줄바꿈이 든 새 파일이 목록 비교를 통과하던 것, 사용자의 `diff.context`, `diff.interHunkContext`, `GIT_DIFF_OPTS` 가 문맥을 늘리던 것. 이제 관련 범위는 추적 파일이나 목록의 새 파일에서만 `=== <파일>:<시작>-<끝>` 머리 줄과 함께 떼고, 줄바꿈 든 이름에서 멈추며, 문맥은 3줄이다.
136
+ - `ralph-qa` 2단계에서 attributes 의 `diff` 속성이 바이너리 파일을 글로 펼치면 그 바이트가 나가던 것. 이제 diff 에 NUL 바이트가 있으면 붙이기 전에 멈춘다. `-diff`, `binary` 로 가려 둔 파일은 그대로 가려진다.
137
+ - `ralph-qa` 2단계가 split index 저장소의 `.git` 에 공유 인덱스 파일을 남기던 것.
138
+ - `ralph-qa` 3단계 검사기가 `*_FILE` 키가 앞에 있는 줄이나 `env`, `docker -e` 의 `KEY=값` 낱말 비밀번호를 놓치던 것(0.15.0 은 잡던 꼴 포함), SKILL 이 시키는 가림 `[REDACTED]` 를 다시 잡아 가림과 재검사가 끝나지 않던 것. 값에 붙은 가림은 계속 잡는다.
139
+ - `ralph-qa` 프로브가 TOML 따옴표 키의 이스케이프(`"sandbox\u005Fmode"`)를 풀지 않아 관리 파일의 거부와 MCP 끄기를 놓치던 것. 이제 그런 설정이면 codex 좌석을 세우지 않고, 끝까지 못 읽은 설정은 파일과 줄을 알린다. opencode 의 models.dev 사본이 비었을 때 그 까닭도 알린다.
140
+ - `ralph-qa` 의 gemini 기록 정리가 두 프로젝트 폴더가 같은 이름을 가진 사용자 기록 폴더를 지우던 것.
141
+ - `ralph-qa` 5단계 상한(`timeout -k 10 600`)이 TERM 을 견딘 작업 프로세스를 남기던 것. 이제 `timeout -s KILL 600` 이다. Git Bash 에서 Windows 의 `timeout` 이 잡히면 `/usr/bin/timeout` 을 쓴다. 6단계는 끊긴 실행의 opencode 세션을 링크를 푼 경로(macOS `/private/var`)와 Windows 경로 꼴로도 찾는다.
142
+ - `ralph-qa` 의 PowerShell 2단계가 bash 와 달라 보낼 수 없던 것(`unsent.md`, 기준 파일, 닫는 표지, BOM 없는 쓰기, `[ ]` 든 경로의 `2>`, Windows PowerShell 5.1 의 UTF-16 err 파일). "보낼 diff 가 없다" 갈래에 따를 명령이 없던 것, 긴 목록과 따옴표로 찍힌 이름의 안내, 512 KiB 상한의 범위(나누기 전 전체)와 분할 절차, 출처 독립 좌석이 보내지 않은 새 파일 목록을 받지 못하던 것.
143
+ - `3d-intro-build` 에서 Sora 가 제출을 계속 429 로 거절하면 "요청 형식 오류(설정을 고침)" 로 알리고 서버의 `Retry-After` 를 무시하던 것. 이제 kind `rate`(만든 job 없음)로 멈추고, 기다림은 `Retry-After`(1초에서 10분)를 따른다. `Retry-After` 가 `maxRateWaitMs`(기본 120초)보다 길면 기다리지 않고 바로 `rate` 로 멈춘다(`err.retryAfterMs`).
144
+ - WAN 제출이 풀이 모르는 코드의 5xx 를 받으면 다른 키로 다시 제출하던 것(task 가 생겼다면 두 번 과금). 이제 `submit_unknown` 으로 멈춘다.
145
+ - 영상을 받는 도중이나 API 응답을 읽는 도중 연결이 끊기면, 다시 받지 않고 바로 실패하거나 빈 200 으로 보던 것. 이제 연결 오류로 보고 내려받기는 다시 받는다. 이미지 생성의 v1 응답이 끊기면 classic 경로로 다시 호출해 두 번 과금될 수 있던 것도 막는다.
146
+ - Azure 요청에 시간 제한이 없어 응답하지 않는 서버에 약 300초씩 매달리고, 폴링이 "30분" 이라면서 몇 시간을 기다릴 수 있던 것. 이제 요청마다 상한(API 120초, 내려받기 600초, 이미지 생성 300초)이 있고, WAN, Sora 폴링은 정한 시간에 끝나며 끝 문구는 실제로 폴링한 시간을 말한다.
147
+ - Node 22, 24 에서 `NODE_USE_ENV_PROXY=1` 이나 `--use-env-proxy` 를 켜면 이 기기의 `http://` 로 보내는 키가 env 프록시를 거쳐 평문으로 나가던 것. 이제 보내기 전에 막는다(`EPROXYKEY`). `NO_PROXY` 에 그 호스트나 `호스트:포트` 를 적으면 직접 보낸다. 영상 단계는 그런 WAN 항목을 건너뛰고, 모두 그렇거나 Sora endpoint 가 그렇다면 Sora 로 넘어가지 않고 `invalid_request` 로 멈춘다.
148
+ - `persistCreds` 가 키 파일의 주석, `export` 줄을 지우고 제자리에 써서, 중간에 끊기면 잘린 키 파일이 남을 수 있던 것. 이제 바꿀 이름의 줄만 바꾸거나 끝에 더하고(다른 인코딩의 글자와 줄마다의 줄 끝은 바이트 그대로), 새 파일로 통째 바꿔 써서 오류로 끊기면 원래 파일이 남는다. 하드 링크, 소유자가 다른 파일, 새 파일을 만들 수 없는 폴더의 파일은 전처럼 제자리에 쓴다. 홈 키 파일과 설정 파일의 링크는 가리키는 파일에 쓰고, 그 밖의 키 파일이 링크면(저장소가 함께 가져올 수 있는 프로젝트 키 파일) 쓰지 않는다. 폴더, 파이프, 빈 링크는 거부한다. `fsync` 를 못 하는 파일 시스템(EINVAL, ENOTSUP)에서도 새 파일로 바꿔 넣는다.
149
+ - 미리보기와 검토 서버가 보내는 사이 줄어든 파일의 연결을 열어 둬 브라우저가 기다리던 것, 검토 서버가 링크 검사와 열기 사이에 바뀐 경로의 파일을 보내던 것.
150
+ - 리다이렉트를 거부한 제출을 "연결이 끊겼다" 로 알리던 것, `prompts.md` 가 `createVideo` 를 직접 부르게 안내하던 것, 셋업 SKILL 의 설치 폴더 문장이 앞 절과 다르던 것, 비용 승인 안내가 키 소진만 말하던 것, FAILED task 재제출이 과금되지 않는다는 확인하지 못한 전제를 사실처럼 적던 것.
151
+ - 셋업 프리플라이트가 요청 시간 초과를 `(23)` 으로 찍던 것. 이제 `TimeoutError` 다.
152
+ - `/progress` 의 검토 문서(약한 계획)를 같은 문서의 늦게 온 옛 읽기나 다시 읽기가 새 글로 덮던 것(0.19.1 에서 생김). 없는 작업 id 를 읽을 때마다 쌓이던 표지는 1,000개까지만 둔다(패널의 작업 표지는 그대로). 작업 id 와 모르는 상태 이름이 정화 없이 그려져, `constructor` 같은 이름이 함수 글로 나오던 것.
153
+ - 텔레메트리의 응답 본문 수집이 한도를 1바이트 넘는 응답에서 결과를 두 번 넘기던 것.
154
+ - tone-compact, anti-drm 이 Codex 잠금 파일을 만든 뒤 쓰기나 닫기에서 네트워크 공유의 ESTALE 을 받으면 빈 잠금이 남아, 1분 동안 이 실행과 다른 실행, 다른 스킬이 "다른 banker 지침 작업이 끝나지 않아" 로 거부하던 것. 이제 그 잠금을 거두고, 거두지 못하면 ESTALE 을 알린다.
155
+ - 백업 자리(`<파일>.tone-compact.bak`, `<파일>.anti-drm.bak`)에 폴더가 있으면 Windows 는 "쓸 권한이 없어", POSIX 는 종료 2 의 "예기치 못한 오류" 로 끝나던 것. 이제 두 OS 모두 종료 1 과 "일반 파일이 아니라 그대로 두었습니다".
156
+ - anti-drm `on` 이 설정 파일 오류에 "config 로 다시 만드세요" 라 안내해 켜기를 두 번 하게 하던 것. 이제 금지 확장자와 대체 확장자를 `on` 에 함께 주라고 안내한다.
157
+ - `lineage` 3.0.9: `!` 명령 뒤 Claude Code 가 쓴 출력 턴을 "검토자가 뺀 사용자 입력 턴" WARN 에 세던 것. 이제 Claude Code 가 쓰는 두 꼴(`<bash-stdout>` 블록 뒤 `<bash-stderr>` 블록, 실패하면 `<bash-stderr>` 블록 하나)만 가리기 전 글로 보고 빼며, 그 밖의 사용자 글은 그대로 센다.
158
+ - `lineage` 가 3.0.8 에서 쪼갠 키를 이어 가리도록 바뀐 뒤에도 그 전에 만든 규칙 요약 캐시와 검토 결정 캐시를 다시 써, 키 조각이 새 페이지(`--rulebase` 페이지와 그 게이트 샘플, 기본 흐름의 검토자 요약)에 실리던 것. 요약기 버전이 4 가 되어 규칙 요약은 한 번 새로 만들고, 쪼갠 키가 든 턴은 한 번 다시 검토한다.
159
+ - `lineage` 페이지 제목(`<title>`, `<h1>`)의 방향 제어 글자가 날것으로 들어가던 것. 이제 본문처럼 `[U+202E]` 같은 표지로 넣는다.
160
+ - `lineage` SKILL 이 `--rulebase` 를 "2.x 동작" 이라 하고 비밀 없는 턴은 2.x 와 같다고 하던 것(검토자 패턴과 방향 제어 표지로 다를 수 있음), 묶음이 에이전트 이름과 세션 이름을 그대로 둔다고 하던 것(키워드를 가림), 출력 파일명이 비밀 모양 슬러그에서 sid 로 바뀌는 것을 적지 않던 것, 3.0.2 의 `.txt` 요약 캐시를 아직 읽는다고 하던 것.
161
+ - 네트워크가 없는 PC 에서 세션을 열 때마다 업데이트 확인과 체크인을 다시 시도하던 것. 이제 실패한 시각을 남기고 24시간 동안 다시 시도하지 않는다. `banker telemetry status` 는 마지막 시도와 실패를 보이고, 확인에 성공한 적이 없으면 "비교 불가 (확인에 성공한 적이 없어 최신 버전 정보 없음)" 라 한다. 캐시 파일이 `null` 이면 `telemetry status` 가 오류로 끝나던 것도 고친다.
162
+ - `update-banker` 가 레지스트리에 닿지 못해도 npm 캐시의 옛 판을 최신으로 읽던 것. 이제 먼저 `npm ping` 으로 보고, 닿지 못하면 어느 채널도 바꾸지 않고 멈춘다. `npm view` 는 재시도 대기(약 70초) 없이 끝난다. ping 에 답하지 않는 사내 미러는 빈 캐시로 한 번 더 묻는다. npm 명령은 홈 폴더에서 불러 지금 폴더에 있는 프로젝트의 `.npmrc`(레지스트리, 토큰)를 따르지 않는다.
163
+ - 설치 스크립트를 받아 셸로 바로 넘기던 곳(setup-node, setup-python, motion-graphic-setup, setup-sandbox)이 받기에 실패해도 종료 0 으로 성공처럼 보이던 것. 이제 개인 임시 폴더에 받고 받았을 때만 실행한다. setup-node 는 nvm 판을 알 수 없으면 멈추고, nvm 이 깔렸을 때만 셸 설정에 줄을 더한다.
164
+ - 내려받는 설치 스킬 17개와 `/banker:setup` 이 네트워크 없는 곳에서 명령마다 기다리던 것(npm 은 약 70초, curl 과 git 은 끝없이). 이제 먼저 원천에 10초 안에 닿는지 보고, 닿지 않으면 그 원천에서 받는 단계는 하지 않고 "오프라인이라 설치하지 않음" 으로 알린다. OS 패키지 관리자 단계는 자기 미러를 쓰므로 그대로 시도한다. npm 이 아직 없는 새 PC 는 오프라인이 아니라 확인하지 못한 것으로 본다. 사내 미러는 그 미러로 본다. npm 은 홈 폴더의 npm 설정(`npm ping` 에 답하지 않으면 그 스킬의 패키지를 빈 캐시로 한 번 더 물음), pip 은 자기 설정의 색인이고, 색인 주소의 사용자 정보(`사용자:토큰@`)는 떼고 묻는다. `/banker:setup` 의 확인은 알림으로만 쓰고, 건너뛸지는 각 스킬의 확인이 정한다. 남은 curl, wget, git clone 에는 시간 제한이 있고, 큰 파일은 총 시간 대신 정체를 감지해 느려도 받는 중이면 끊지 않는다.
165
+ - tmux, jdtls, Spring Boot LS, LibreOffice 를 정해진 `/tmp` 이름으로 받아, 다른 사용자가 먼저 둔 파일을 풀거나 root 로 빌드할 수 있던 것. 이제 개인 임시 폴더에 받는다. `plantuml.jar` 는 다 받았을 때만 그 이름을 얻어, 끊긴 조각이 설치된 것으로 보이지 않는다. setup-python 의 PowerShell 은 GUID 이름의 새 폴더에 받는다. vertical-pptx-setup 은 LibreOffice 자동화 프로파일도 개인 임시 폴더로 안내한다(짐작할 수 있는 `/tmp` 이름이면 남이 먼저 만든 프로파일로 돌 수 있음).
166
+ - setup-mcp 의 `npx -y` 서버가 네트워크 없는 곳에서 세션마다 약 70초 뒤 실패하던 것. 이제 오프라인 경로를 적는다. 판을 고정해 설치한 실행 파일을 직접 등록하고(같은 이름의 옛 등록은 먼저 지움), 네트워크 서비스인 서버(context7, fetch, tavily)는 등록하지 않는다.
167
+ - 3d-intro-setup, motion-graphic-setup 이 `ffmpeg-static` 을 오프라인 폴백으로 안내하던 것(npm 설치라 네트워크가 필요하다). 오프라인이면 미리 받아 둔 ffmpeg 를 `FFMPEG_PATH` 로 준다.
168
+ - motion-graphic 이 hyperframes 를 `npx` 로만 불러, 네트워크가 없으면 설치 확인이 약 70초 뒤 "미설치" 로 읽히던 것. 이제 전역 설치가 있으면 그것을 부르고, `npx` 는 네트워크 확인 뒤에만 쓴다. setup-stitch 는 Stitch 가 네트워크 없이 쓸 수 없는 원격 서비스라고 적는다.
169
+ - audit-security 가 네트워크 없이 돈 스캔(오류뿐인 JSON, 빈 결과)을 취약점 0건으로 셀 수 있던 것. 이제 출력이 JSON 이고 분석한 대상이 1개 이상일 때만 결과로 읽는다. 아니면 리포트 Unknown 에 "미커버(네트워크 없음 또는 대상 없음)" 와 종료 코드, stderr 첫 줄을 적는다. 오프라인 DB 로 돌리면 DB 의 기준일을 적는다.
170
+ - audit-security 가 도구 결과를 감사 대상 저장소 안의 `.audit/` 에 두라고 안내해, 저장소가 그 자리에 심은 링크를 따라 남의 파일을 덮을 수 있던 것. 이제 저장소 밖의 작업 폴더(`RESEARCH_DIR`, 없으면 개인 임시 폴더)에 두고 그 경로를 리포트에 적는다.
171
+ - deep-research 가 웹 도구가 모두 실패해도 출처 없는 보고서를 내던 것. 이제 "웹 조사 불가" 로 끝낸다. ultra-chain 은 그 단계를 skipped(네트워크 없음)로 남기고, 주장이 0개면 조사 게이트를 지나지 않는다. ultra-interview 도 검색 호출이 모두 실패하면 조사하지 못했다고 보고한다.
172
+ - `omc-patch` 의 인자 없는 적용이 연결만 받고 답하지 않는 origin(연결을 붙잡는 방화벽, TLS 블랙홀)에서 끝없이 멈추던 것. 이제 태그 받기를 120초에 끊고(받는 속도가 초당 1000바이트 밑으로 30초면 git 이 먼저 끊음) 자격 증명을 터미널에서 묻지 않는다. 태그가 없으면 받지 못한 까닭(시간 초과, git 의 오류 줄, 이 도구가 고정한 origin)을 함께 알린다. origin 에 사용자 정보가 있거나, git 의 오류 줄에 사용자 정보가 든 주소가 남거나(전역 `insteadOf` 가 더한 것), 프록시 주소의 사용자 정보에 날 `/` `?` `#` `\` 가 있으면 git 의 오류 문구는 싣지 않고 종료 코드만 알린다(그런 주소에서는 curl 이나 git 의 문구에 사용자 이름과 비밀번호 조각이 실릴 수 있음). 스킬은 `--no-update` 만 써 이 길을 지나지 않는다.
173
+ - `ralph-qa` 2단계의 관련 코드 범위가 추적한 링크, 목록에 적은 새 링크, 링크인 폴더 아래의 파일을 따라 저장소 밖 내용을 싣던 것. 이제 그런 파일에서는 떼지 않고 멈춘다. PowerShell 의 목록 확인이 `./` 로 시작하는 줄에서 멈추던 것(bash 는 통과)도 고친다.
174
+ - `ralph-qa` 의 gemini 기록 정리가 두 프로젝트 폴더가 같은 이름을 주장해 지우지 않은 기록 폴더를 알리지 않던 것. 이제 JSON 의 `skipped` 와 stderr 한 줄로 알린다.
175
+ - `ralph-qa` 프로브의 알림이 이스케이프 따옴표 키를 까닭으로 말하지 않던 것, models.dev 사본이 비었을 때 오프라인에서는 돌아오지 않는다는 것을 말하지 않던 것.
176
+ - `3d-intro-setup` 의 `.gitignore` 줄이 강제로 끊긴 쓰기가 남긴 키 사본(`.env.3d-intro.local.<hex>.tmp`)을 무시하지 못하던 것, 줄 끝 없는 마지막 줄에 붙어 그 줄의 규칙(예: `.env`)을 깨던 것. 이제 `.env.3d-intro.local*` 줄을 줄을 바꾼 뒤 더한다. `.gitignore` 나 프로젝트 키 파일이 링크면(저장소가 심은 링크로 그 저장소의 `.git/config` 같은 파일에 줄이 붙지 않게) 쓰지 않고 알린다.
177
+ - `pollVideo` 를 `intervalMs: 0` 과 `timeoutMs` 없이 부르면 서버에 묻지 않고 null 을 내던 것. 이제 마감 하한 120초로 묻는다. `pollVideo`, `wanPollTask` 가 보내기 전에 막힌 키(EINSECURE, EPROXYKEY)로 마감까지 헛 폴링하던 것도 이제 바로 끝낸다.
178
+ - 미리보기와 검토 서버가 NTFS 의 64비트 파일 ID 를 Number 로 견줘 다른 파일을 같다고 볼 수 있던 것. 이제 BigInt 로 견준다.
179
+ - `azFetch` 결과의 `error` 가 원래 오류 그대로라 키를 인용한 메시지(undici 의 머리 값 오류)를 호출자가 찍으면 키가 보이던 것. 이제 `name`, `code`, `cause.code` 만 담는다.
180
+ - 시계가 되돌려진 PC 에서 미래 시각의 업데이트 확인 기록이 그 시각까지 확인과 체크인을 멈추던 것. 이제 지금보다 뒤의 시각은 쉼으로 세지 않는다.
181
+ - 설치 스킬의 PyPI 확인(bash)이 색인 주소의 경로나 질의에 든 토큰을 curl 인자에 실어 같은 PC 의 다른 사용자가 `ps` 로 볼 수 있던 것. 이제 주소를 curl 의 표준 입력 설정으로 넘긴다. Windows PowerShell 의 확인은 사용자 정보를 뗀 주소를 `curl.exe` 인자로 준다. pip 이 설정을 읽지 못하면(pip 이 없거나 10 미만) 그렇게 알린다.
182
+ - 설치 스킬과 문서 스킬의 `python -c`, `python -m`, 표준 입력 스크립트가 지금 폴더를 import 경로 맨 앞에 둬, 남의 저장소 폴더에서 그 저장소의 `pip/`, `json.py`, `pptx.py` 를 사용자 권한으로 실행할 수 있던 것. 이제 홈 폴더에서 실행한다(읽는 파일은 절대 경로).
183
+ - audit-mock 이 작업 폴더로 감사 대상 저장소 안의 `.audit/` 를 안내하던 것(audit-security 와 같은 결함). 이제 저장소 밖의 작업 폴더를 쓴다.
184
+ - setup-lsp 의 Spring Boot LS 폴더 비우기가 zsh 에서 빈 폴더의 `*` 에 "no matches found" 로 멈추던 것.
185
+ - 내려받는 원천인데 설치 스킬의 확인 줄이 없던 넷(nvm 판 조회의 `api.github.com`, Spring Boot LS 의 VSIX 호스트 둘, RHEL 의 NodeSource 저장소)에 확인 줄을 더한다.
186
+ - `lineage` SKILL 이 "요약기를 고치면 캐시가 자동 무효화된다" 고 하던 것(요약기 버전을 올릴 때만 맞음). 이제 요약기나 가림을 바꾼 판은 `SUMMARIZER_VERSION` 을 올린다고 적는다.
187
+
188
+ ## [0.20.3] - 2026-10-20
189
+
190
+ ### Changed
191
+ - 유지보수자용: 시험 빈틈 9개(CRLF 설치본 재설치, 블록 정규식 동일성, BOM 이 붙은 `settings.json` 의 오류 위치 등)를 메운다.
192
+
193
+ ### Fixed
194
+ - `claude-update-last` 의 `on`, `off` 가 BOM 으로 시작하는 래퍼를 "node --check 실패" 로 거부하던 것. 그 래퍼는 node 로 정상 실행된다.
195
+ - 래퍼 파일만 다른 폴더로 링크하면(dotfiles 등) 상태표시줄에 Node 오류만 나오던 것. 설치 스크립트는 로더(`omc-hud.mjs`)를 링크 옆에 쓰는데, 래퍼 v4 는 링크가 가리키는 파일 옆에서만 찾았다. 이제 두 자리를 모두 찾는다. `setup-omc-hud` 를 다시 설치하면 적용된다. 0.20.2 의 "링크 래퍼의 PL 칸" 고침은 로더도 링크가 가리키는 폴더에 있을 때만 효과가 있었다.
196
+ - `NODE_OPTIONS=--preserve-symlinks-main` 이면 링크한 래퍼에서 `PL:` 칸이 사라지는데 payload-mon `status` 는 켜짐이라 하던 것. 이것도 `setup-omc-hud` 를 다시 설치하면 적용된다.
197
+ - `setup-omc-hud` 의 렌더 확인이 상태표시줄 대신 Node 오류가 나올 때 `[..]` 와 Node 내부 머리글(`node:internal/...`)만 보이던 것. 이제 `[!!]` 와 `Error` 줄을 보인다. 상태표시줄 명령이 실패할 때도 `Error` 줄을 먼저 보인다.
198
+ - 렌더 확인이 OMC 가 입력 없이 아무것도 내지 않을 때와, 옛 판이 그리는데 설치한 판이 오류 없이 돌 때 "OMC 설치 탓" 으로 단정하던 것. 이제 `[..]` 로 본 것만 알린다.
199
+ - 렌더 확인이 PATH 앞쪽의 실행할 수 없는 `node` 파일을 골라 확인을 건너뛰던 것. 이제 셸처럼 다음 것을 쓴다. Windows 에서 `node.cmd` 만 있을 때 "node 없음" 으로 알리던 것도 고친다. 이제 Git Bash 가 그것을 돌리지 못한다고 알린다.
200
+ - 렌더 확인이 OMC 출력의 제어 글자(터미널 제어 순서 등)를 그대로 찍던 것. `?` 로 바꾼다.
201
+ - 짝 없는 payload-mon 표시 줄이 많이 든 큰 래퍼에서 설치 스크립트와 payload-mon 이 수십 초 걸리던 것(2MB 에 28초).
202
+ - 블록 안쪽을 손으로 고친 래퍼를 다시 설치할 때 백업 없이 바꾸던 것. 도구가 쓴 그대로의 블록만 다를 때만 백업을 건너뛴다.
203
+ - `payload-mon` 이 링크인 사본 폴더(`payload-mon/`) 너머에 모듈 사본을 쓰고 `off` 때 지우던 것. 이제 `on` 은 거부하고 이유를 알리며, `off` 는 그 안을 지우지 않고 그렇다고 알린다. `status` 도 `on` 을 권하는 대신 이유를 적는다.
204
+
3
205
  ## [0.20.2] - 2026-10-19
4
206
 
5
207
  ### Added
@@ -127,7 +329,7 @@
127
329
  - `tone-compact`, `anti-drm`: 남은 잠금을 정리하다 네트워크 공유가 `ESTALE` 을 내면 이미 사라진 잠금으로 본다. 예전에는 종료 2 로 멈췄다.
128
330
  - `/progress`: `/clear` 를 하면 패널이 바로 빈 목록을 그린다. 예전에는 다음 프롬프트까지 옛 단계가 남아 보였다.
129
331
  - `/progress`: 계획을 건드린 뒤 검토 문서(약한 계획)를 건드리면, 두 읽기가 거꾸로 끝나도 계획이 그대로다. 세션이 읽기만 한 단계 없는 계획은 체크박스가 있는 검토 문서를 대신한다.
130
- - `/progress`: 작업 도구 읽기(TaskGet, TaskList)가 겹쳐 돌아도 나중에 시작한 읽기가 이긴다. 작업이 없다는 TaskGet 과 작업을 뺀 TaskList(판에 없던 작업 포함)도 그렇다. 예전에는 늦게 끝난 옛 읽기가 지워진 작업을 되살릴 수 있었다.
332
+ - `/progress`: 작업 도구 읽기(TaskGet, TaskList)가 겹쳐 돌아도 나중에 시작한 읽기가 이긴다. 작업이 없다는 TaskGet 과 작업을 뺀 TaskList(패널에 없던 작업 포함)도 그렇다. 예전에는 늦게 끝난 옛 읽기가 지워진 작업을 되살릴 수 있었다.
131
333
 
132
334
  ## [0.19.0] - 2026-10-15
133
335
 
package/PRIVACY.md CHANGED
@@ -6,8 +6,9 @@
6
6
 
7
7
  이 문서는 두 개의 독립된 기능을 설명합니다.\
8
8
  하나는 새 버전이 나왔을 때 알려주는 **업데이트 알림**이고, 다른 하나는 유지보수자가 사용량을 파악하기 위한 **익명 사용량 카운팅**입니다.\
9
- 두 기능 모두 기본값은 켜짐(default-on)이며, 각각 독립적으로 끌 수 있습니다.\
10
- 이 기능은 Claude Code 런타임에서만 동작합니다. Codex CLI는 샌드박스가 네트워크 접근을 차단하므로 알림과 카운팅 둘 다 동작하지 않습니다.
9
+ 두 기능 모두 기본값은 켜짐(default-on)이며, 따로 끌 수 있습니다.\
10
+ 다만 사용량 체크인은 업데이트 확인과 함께 보내므로, 업데이트 알림을 끄면(`BANKER_NO_UPDATE_CHECK`) 체크인 전송도 멈춥니다. 그때 카운팅 기록은 이 기기에만 쌓이다가 5,000줄에서 멈춥니다.\
11
+ Claude Code 와 Codex CLI 모두에서 동작합니다. Codex 에서는 `banker setup --codex` 가 Codex 훅으로 설치하며, 수집 범위는 아래 "Codex CLI" 절에 있습니다.
11
12
 
12
13
  ## 현재 상태
13
14
 
@@ -22,7 +23,8 @@
22
23
  update-notifier·Homebrew 등 다른 CLI 도구가 쓰는 것과 같은 방식입니다.
23
24
 
24
25
  기본값은 켜짐입니다.\
25
- 환경변수 `BANKER_NO_UPDATE_CHECK` 를 설정하거나 config의 `updateCheck` 를 `false` 로 두면 끌 수 있습니다.
26
+ 환경변수 `BANKER_NO_UPDATE_CHECK` 를 설정하거나 config의 `updateCheck` 를 `false` 로 두면 끌 수 있습니다.\
27
+ 조회에 성공하면 24시간, 실패해도(네트워크 없음 등) 24시간 동안 다시 조회하지 않습니다.
26
28
 
27
29
  ### 개인화 (선택적 강화)
28
30
 
@@ -38,7 +40,7 @@ update-notifier·Homebrew 등 다른 CLI 도구가 쓰는 것과 같은 방식
38
40
 
39
41
  ## 사용량 카운팅
40
42
 
41
- 하루 1회, 유지보수자가 운영하는 외부 엔드포인트(banker 패키지 밖에서 별도로 운영되는 serverless)로 익명 체크인을 전송합니다.\
43
+ 하루 1회(보내지 못한 날도 24시간 뒤에 다시 시도), 유지보수자가 운영하는 외부 엔드포인트(banker 패키지 밖에서 별도로 운영되는 serverless)로 익명 체크인을 전송합니다.\
42
44
  플러그인은 기본 카운팅 엔드포인트(`banker.banker-plugins.workers.dev`)를 내장하므로, count-default-on 이라 설치 즉시 활성입니다.\
43
45
  `BANKER_TELEMETRY_ENDPOINT` 환경변수로 자가호스팅 엔드포인트를 지정하거나 override 할 수 있습니다.
44
46
 
@@ -82,6 +84,26 @@ update-notifier·Homebrew 등 다른 CLI 도구가 쓰는 것과 같은 방식
82
84
  세 훅 모두 트리거될 때마다 짧게 실행되는 node 프로세스를 하나씩 기동합니다(수십 ms 수준).\
83
85
  opt-out 하더라도 훅의 등록 자체는 남고, 각 스크립트 내부의 게이트가 즉시 무동작으로 반환합니다.
84
86
 
87
+ ## Codex CLI
88
+
89
+ `banker setup --codex` 가 Codex 사용자 범위(`~/.codex/hooks.json`)에 훅 두 개를 넣습니다.\
90
+ 훅 스크립트는 `~/.codex/hooks-custom/banker/` 사본에서 돌고, Codex 를 다시 열 때 뜨는 Hooks need review 창이나 `/hooks` 에서 사용자가 신뢰해야 돌기 시작합니다.\
91
+ `banker uninstall --codex` 가 둘 다 지우고, `banker hooks disable update` 나 `banker hooks disable count` 로 하나씩 끌 수 있습니다.
92
+
93
+ - `SessionStart`: 세션 시작 시 1회, Claude Code 와 같은 캐시로 업데이트 알림을 확인합니다. 알림은 TUI 에 경고 줄로 보입니다.
94
+ - `Stop`: 턴이 끝날 때 1회, 이번 턴에 쓴 banker 스킬 이름을 셉니다. 도구 호출마다 돌지 않습니다.
95
+
96
+ Codex 카운팅이 읽는 것과 남기는 것은 다음과 같습니다.
97
+
98
+ - 읽는 것: 훅 입력이 알려 주는 이 세션의 Codex 기록 파일(rollout)에서 이번 턴 부분만. 그중 도구 호출 기록과, `$banker-<이름>` 으로 부른 스킬을 Codex 가 넣은 머리 줄의 `skills/banker-<이름>/SKILL.md` 경로만 봅니다. 이 Codex 에 설치된 banker 스킬 이름만 셉니다.
99
+ - 보지 않는 것: 사용자가 입력한 글, 모델의 답, 도구 결과, 스킬 본문.
100
+ - 로컬에 남기는 것: Claude Code 와 같은 `usage-log`, `used-skills.json` 의 스킬 이름과 시간대, 같은 턴을 두 번 세지 않게 하는 최근 턴 키(`codex-count-turns`, Codex 세션 ID 와 턴 ID, 최근 100개).
101
+ - 로컬에 남기는 것(추가): 이 훅이 기록 형식을 읽지 못한 Codex 버전(`codex-shape-miss.json`, 버전과 알림 여부만). 다음 세션 시작 때 경고를 한 번 보이는 데만 쓰고 전송하지 않습니다.
102
+ - 전송하는 것: Claude Code 와 같은 체크인 `{version, os, counts}` 입니다. 세션 ID 와 턴 ID 는 전송하지 않습니다.
103
+
104
+ Codex 훅은 Codex 샌드박스 밖에서 돌므로, 샌드박스가 네트워크를 막아도 업데이트 조회와 체크인은 Claude Code 와 같이 나갑니다.\
105
+ 끄는 방법(`BANKER_NO_TELEMETRY`, `BANKER_NO_UPDATE_CHECK`, `banker telemetry off`)도 같습니다.
106
+
85
107
  ## 전송 안전
86
108
 
87
109
  - 업데이트 알림 조회는 GET 요청이며 페이로드가 없습니다.
@@ -89,6 +111,14 @@ opt-out 하더라도 훅의 등록 자체는 남고, 각 스크립트 내부의
89
111
  - 네트워크 조회·전송은 세션을 막지 않도록 분리 실행되며, 포그라운드 훅은 캐시 읽기만 하고 즉시 반환합니다.
90
112
  - 어떤 네트워크 오류도 삼키며(fail-closed), 항상 정상 종료합니다.
91
113
 
114
+ ## 네트워크 없는 곳(airgap)
115
+
116
+ - 업데이트 조회와 체크인은 세션 시작 뒤 따로 돌아 세션을 기다리게 하지 않습니다. 요청마다 무활동 10초, 전체 30초에서 끊습니다.
117
+ - 실패하면 실패한 시각(`triedAt`)만 이 기기의 `update-check.json` 에 남기고, 24시간 동안 다시 시도하지 않습니다. `banker telemetry status` 가 그 시각을 "마지막 시도" 로 보입니다.
118
+ - 처음부터 시도하지 않게 하려면 `BANKER_NO_UPDATE_CHECK=1` 을 둡니다. 업데이트 조회와 체크인 전송이 함께 멈춥니다.
119
+ - 훅은 `HTTPS_PROXY`, `HTTP_PROXY` 를 따르지 않습니다(Node 가 `NODE_USE_ENV_PROXY=1` 일 때만 따름). 프록시를 거쳐야만 밖에 닿는 망에서는 실패로 기록되고 24시간 쉽니다.
120
+ - 오프라인 설치와 네트워크가 필요한 스킬은 README 의 "오프라인에서 쓰기" 절에 있습니다.
121
+
92
122
  ## 법적 상태
93
123
 
94
124
  **EU ePrivacy는 양면을 그대로 남깁니다.**
package/README.md CHANGED
@@ -6,10 +6,10 @@
6
6
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
7
  [![npm downloads](https://img.shields.io/npm/dm/@kaydash9999/banker-plugins)](https://www.npmjs.com/package/@kaydash9999/banker-plugins) [![GitHub stars](https://img.shields.io/github/stars/smallOpenSource/banker_plugins)](https://github.com/smallOpenSource/banker_plugins)
8
8
 
9
- [빠른 시작](#빠른-시작) · [워크플로 예시](#워크플로-사용-예시) · [구성](#구성) · [설치 상세](#설치-상세-npm--codex) · [설정 변경 지점](#설정-변경-지점-claude-code--codex) · [요구사항](#요구사항) · [업데이트 / 제거](#업데이트--제거) · [업데이트 확인](#업데이트-확인-및-사용량-카운팅) · [라이선스 / 서드파티](#라이선스--서드파티)
9
+ [빠른 시작](#빠른-시작) · [워크플로 예시](#워크플로-사용-예시) · [구성](#구성) · [설치 상세](#설치-상세-npm--codex) · [설정 변경 지점](#설정-변경-지점-claude-code--codex) · [요구사항](#요구사항) · [업데이트 / 제거](#업데이트--제거) · [업데이트 확인](#업데이트-확인-및-사용량-카운팅) · [오프라인](#오프라인에서-쓰기) · [라이선스 / 서드파티](#라이선스--서드파티)
10
10
 
11
11
  □ banker는 다음을 포함하는 Claude Code 및 Codex CLI 플러그인입니다.
12
- - QA·보안 감사·문서·아키텍처·위키·미디어 작업과 의존성·개발환경(OS별) 설치를 아우르는 **스킬 63개 + 커맨드 2개**(총 65개 구성요소)
12
+ - QA·보안 감사·문서·아키텍처·위키·미디어 작업과 의존성·개발환경(OS별) 설치를 아우르는 **스킬 64개 + 커맨드 2개**(총 66개 구성요소)
13
13
  - Claude Code 즉시 명령 `/graceful-pause`, `/progress`
14
14
 
15
15
  □ 설치하면 스킬과 커맨드가 `/banker:<이름>` 네임스페이스로 노출됩니다.
@@ -82,8 +82,8 @@ Claude Code는 `/banker:<이름>`, Codex는 `banker-<이름>` 으로 호출합
82
82
  |---|---|
83
83
  | `/banker:front-qa` | 스펙(note) 기반 프론트엔드 구현 + parity QA |
84
84
  | `/banker:setup` | 구성요소·의존성 설치 오케스트레이터 (multi-select) |
85
- | `/graceful-pause` | 작업 중에도 바로 실행되는 정지 요청. 지금 단계만 끝내고 멈춘 뒤 보고하고 지시를 기다림 (Claude Code 2.1.289 이상, mod. Codex 미지원) |
86
- | `/progress` | 진행 상황 패널을 켜고 끔(`show` 기본 토글, `on`, `off`). 맨 위는 이 세션이 쓰거나 읽은 마지막 계획 파일(`.omc/plans/*.md`, `docs/superpowers/plans/*.md`, `~/.claude/plans/*.md`, ralph `prd.json`, ultragoal `goals.json`) 전체. Notion 토글 목록처럼 제목이 그 아래 내용을, 목록 항목이 하위 항목을, 표와 코드 블록이 행과 줄을 품고, 처음에는 큰 제목만 접힌 채 보임. 체크박스는 완료와 대기, 제목은 그 아래 체크 수(`2/5`). 그 아래 단계는 할 일 목록(Claude 의 작업 목록이나 `mcp__banker__todo`), 없으면 이 세션의 요청이고, 하위 목록은 그 단계가 진행 중일 때 한 도구 호출 한 단계까지. 작업 중에도 바로 실행됨(2.1.289 이상에서 확인) (mod. Codex 미지원) |
85
+ | `/graceful-pause` | 작업 중에도 바로 실행되는 정지 요청. 지금 단계만 끝내고 멈춘 뒤 보고하고 지시를 기다림 (Claude Code 2.1.289 이상, mod. Codex 는 작업 중에 `$banker-graceful-pause` 를 보내면 실행 중인 도구 호출이 끝난 뒤 멈춤) |
86
+ | `/progress` | 진행 상황 패널을 켜고 끔(`show` 기본 토글, `on`, `off`). 맨 위는 이 세션이 쓰거나 읽은 마지막 계획 파일(`.omc/plans/*.md`, `docs/superpowers/plans/*.md`, `~/.claude/plans/*.md`, ralph `prd.json`, ultragoal `goals.json`) 전체. Notion 토글 목록처럼 제목이 그 아래 내용을, 목록 항목이 하위 항목을, 표와 코드 블록이 행과 줄을 품고, 처음에는 큰 제목만 접힌 채 보임. 체크박스는 완료와 대기, 제목은 그 아래 체크 수(`2/5`). 그 아래 단계는 할 일 목록(Claude 의 작업 목록이나 `mcp__banker__todo`), 없으면 이 세션의 요청이고, 하위 목록은 그 단계가 진행 중일 때 한 도구 호출 한 단계까지. 작업 중에도 바로 실행됨(2.1.289 이상에서 확인) (mod. Codex 는 `$banker-progress` 스킬이 지금 세션의 계획 트리, `update_plan` 단계, 최근 도구 호출을 텍스트로 보이고, tmux 안이면 `--pane` 으로 오른쪽 칸에 갱신) |
87
87
 
88
88
  Claude Code 2.1.296 은 Claude 5 모델(Opus 5.5 등)에 작업 목록 도구(TaskCreate, TodoWrite)를 주지 않습니다. 그래서 `/progress` 를 켜면 모델에게 할 일 도구 `mcp__banker__todo` 를 줍니다(다음 요청부터). 모델이 여러 단계 작업을 시작할 때 할 일 목록을 보내면 그 목록이 단계가 됩니다. 한 단계로 끝나는 일에는 쓰지 않으므로 그때는 요청이 단계입니다. 내장 작업 목록 도구가 있는 세션(옛 모델, `CLAUDE_CODE_ENABLE_TODO_TOOLS=1`)에는 이 도구를 더하지 않습니다. 도구는 `/progress off` 뒤에도 세션이 끝날 때까지 남고, 그동안 부르면 패널이 꺼져 있다고 답합니다.
89
89
 
@@ -120,7 +120,8 @@ Claude Code 2.1.296 은 Claude 5 모델(Opus 5.5 등)에 작업 목록 도구(Ta
120
120
 
121
121
  > `obsidizer` 는 banker 최초의 플러그인 선언 hook(`hooks/hooks.json`)을 함께 설치합니다.\
122
122
  > banker가 활성화되어 있으면 이 hook은 **항상 등록**되어 위키 쓰기(`wiki_ingest`/`wiki_add`)마다 node 프로세스를 띄웁니다(플래그 확인이 그 안에서 일어나므로 `--enable` 전에도 쓰기당 약 30ms).\
123
- > `--enable` 전에는 아무것도 쓰지 않는 순수 no-op입니다.
123
+ > `--enable` 전에는 아무것도 쓰지 않는 순수 no-op입니다.\
124
+ > Codex 에는 위키 MCP 가 없어 `--enable` 이 `omx_wiki/.obsidizer` 를 쓰고 Codex 사용자 범위에 `PostToolUse`(matcher `Bash`) 훅을 설치합니다(`banker hooks enable obsidize`, 샌드박스 밖 실행 승인 필요). 이 훅은 `--enable` 한 때만 설치되고, 설치된 동안 셸 호출마다 node 프로세스를 띄워 `omx wiki` 의 ingest, add 일 때만 정규화합니다.
124
125
 
125
126
  ### 스킬: 워크플로 · 유틸
126
127
 
@@ -136,6 +137,7 @@ Claude Code 2.1.296 은 Claude 5 모델(Opus 5.5 등)에 작업 목록 도구(Ta
136
137
  | `ralph-qa` | 세션 모델로 띄운 독립 검토 에이전트 3개 이상이 합의할 때까지 검증 반복. `--codex`·`--gemini`·`--opencode` 를 주면 그 CLI 에서 가장 뛰어난 모델이 좌석으로 합류 |
137
138
  | `smart-compact` | 컨텍스트 임계 초과 시 위키·resume 저장 게이트 자동 무장 |
138
139
  | `deep-research` | 다중 소스 팬아웃 + 적대적 검증 인용 리서치 |
140
+ | `lfm` | learn from master. 그 분야 최고 전문가 그룹이 일하는 방식을 1차 자료로 조사해 계획 적용 항목으로 정리(ultra-interview, ultra-chain, deep-research, rfp-author 의 리서치에서도 씀) |
139
141
  | `ultra-interview` | 리서치 선행으로 사람 질문 최소화, 모호성 3% 이하까지 인터뷰 |
140
142
  | `interval-report` | 장기 수행 중간 보고를 `docs/intermission.md` 로 갱신(경과·잔여·단일 표) |
141
143
  | `summary-wiki` | 위키를 `docs/` 단일 파일 개조식으로 요약(지식 동기화 검토용, 읽기 전용) |
@@ -205,7 +207,11 @@ banker uninstall # 제거
205
207
 
206
208
  - `--scope project` 로 프로젝트 로컬(`./.codex`)에 설치하고, `--dry-run` 으로 미리 볼 수 있습니다.
207
209
  - non-root 전용입니다(전역 sudo 설치 시 root 소유 파일을 방지). postinstall이 없으므로 `banker setup` 을 직접 실행합니다.
208
- - Codex에는 스킬 63개가 `~/.codex/skills/banker-<name>/` 에, 커맨드 2개가 `~/.codex/prompts/banker-<name>.md` 에 설치됩니다(`codex/manifest.json`). \
210
+ - Codex에는 스킬 64개와 Codex 전용 스킬 2개(`graceful-pause`, `progress`)가 `~/.codex/skills/banker-<name>/` 에, 커맨드 2개가 `~/.codex/prompts/banker-<name>.md` 에 설치됩니다(`codex/manifest.json`). \
211
+ `CODEX_HOME` 을 설정했으면 `~/.codex` 대신 그 폴더에 설치합니다(Codex 가 읽는 곳). \
212
+ `lineage`, `progress`, 사용량 카운팅은 Codex 의 대화 기록(rollout)을 읽습니다. Codex 는 이 형식을 공개 약속으로 내놓지 않아 업데이트로 바뀔 수 있습니다. \
213
+ Codex 를 업데이트한 뒤에는 `banker doctor` 로 형식을 점검합니다. 읽지 못하면 lineage 는 빈 페이지 대신 오류로 멈추고, progress 는 경고 줄을 보이며, 카운팅은 다음 세션 시작 때 경고를 한 번 보입니다. \
214
+ Codex 0.144 이상에는 사용자 프롬프트가 없으므로 커맨드 2개는 스킬로도 설치되어 `$banker-front-qa`, `$banker-setup` 으로 부릅니다. \
209
215
  디렉터리명과 일치하도록 프론트매터 `name:` 이 `banker-<name>` 으로 재작성되어 Codex가 `banker-<name>` 으로 인식합니다.
210
216
  - OMC/Claude 에 결합됐던 오케스트레이터·설치·유틸 표면(all-in-one·ultra-chain·ultra-init·front-qa·setup·setup-omc·setup-omc-hud·setup-stitch·omc-reference·compact-copy)은 본문이 **런타임 인식**이라 Codex에서도 동작합니다.
211
217
  - `payload-mon` 은 Codex에서 실행해도 같은 머신의 Claude Code HUD 래퍼만 켜고 끕니다. \
@@ -228,6 +234,7 @@ banker uninstall # 제거
228
234
  |---|---|---|
229
235
  | Claude Code | 플러그인 레지스트리 | `claude plugin marketplace add` + 설치 → `/banker:*` (`settings.json` 직접수정 없음) |
230
236
  | Codex CLI | `~/.codex/skills/banker-*/`, `~/.codex/prompts/banker-*.md` | 기존 `banker-*` 정리 후 복사(멱등). `AGENTS.md`·`config.toml` 미변경 |
237
+ | Codex CLI | `~/.codex/hooks.json`, `~/.codex/hooks-custom/banker/` | 업데이트 알림(`SessionStart`)과 사용량 카운팅(`Stop`) 훅. 사본은 작업 폴더 밖에 두고, 이벤트마다 맨 뒤에 묶음 1개를 더하며, 쓰기 전 `hooks.json.banker.bak` 백업. `banker hooks status`, `banker hooks enable <이름>`, `banker hooks disable <이름>` 으로 확인하고 켜고 끔. Codex 를 다시 열 때 Hooks need review 창이나 `/hooks` 에서 신뢰해야 돎. Codex 홈(`CODEX_HOME`)이 지금 폴더나 그 저장소 안이면 샌드박스가 고칠 수 있어 훅을 설치하지 않음 |
231
238
 
232
239
  **플러그인 자체 훅 — `hooks/hooks.json` (설치 시 Claude Code에서 자동 발화)**
233
240
 
@@ -247,10 +254,10 @@ banker uninstall # 제거
247
254
  | `setup-mcp` | `claude mcp add` (context7·seq-thinking·filesystem·git·fetch) | `[mcp_servers.*]` |
248
255
  | `setup-lsp` | LSP MCP 등록 | `[mcp_servers.lsp_bridge]` |
249
256
  | `setup-stitch` | `claude mcp add stitch` | `codex mcp add stitch` |
250
- | `setup-omc-hud` | `statusLine`(바뀔 때 `settings.json` 백업) + `hud/omc-hud-custom.mjs`, `hud/omc-hud.mjs`, `.omc/hud-config.json`(바뀐 파일은 `.backup.<시각>` 백업) + payload-mon 켜기. 옛 판이 넣은 갱신 안내 블록은 `off` 로 원복 | — (Codex는 OMX `hud`) |
257
+ | `setup-omc-hud` | `statusLine`(바뀔 때 `settings.json` 백업) + `hud/omc-hud-custom.mjs`, `hud/omc-hud.mjs`, `.omc/hud-config.json`(바뀐 파일은 `.backup.<시각>` 백업) + payload-mon 켜기. 옛 판이 넣은 갱신 안내 블록은 `off` 로 원복 | 대상이 Codex 면 `~/.codex/config.toml` 의 `[tui] status_line` 이 없을 때만 OMX 프리셋으로 넣고 `# banker:status-line` 표시(`config.toml.banker-hud.bak` 백업). OMX 나 사용자가 둔 줄은 그대로, `off` 는 banker 줄만 뺌. Claude Code 쪽을 고르면 왼쪽과 같음 |
251
258
  | `setup-pwsh` | `env.CLAUDE_CODE_GIT_BASH_PATH` (병합) | — (네이티브 셸, 배선 불필요) |
252
259
  | `setup-harness-factory` | `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` (env 영속) | — |
253
- | `smart-compact` | `statusLine.command` 래핑 + `UserPromptSubmit` 훅 추가 (백업·멱등) | `~/.codex/` 대응 |
260
+ | `smart-compact` | `statusLine.command` 래핑 + `UserPromptSubmit` 훅 추가 (백업·멱등) | `hooks.json` 의 `UserPromptSubmit` 맨 뒤에 훅 묶음 1개 + `smart-compact.json`(임계값), `smart-compact-state.json`(세션 상태). 훅 사본 `hooks-custom/banker-smart-compact-gate.mjs`. `hooks.json` 을 바꿀 때마다 직전 내용을 `hooks.json.smart-compact.bak` 에 백업, 멱등. `off` 는 이 훅과 사본, 설정만 지움. 새 훅은 `/hooks` 에서 신뢰해야 돎 |
254
261
  | `payload-mon` | `hud/omc-hud-custom.mjs` 에 표시 블록 1개 삽입(`.payload-mon.bak` 백업·멱등·`node --check` 검증) + 래퍼 옆 `hud/payload-mon/` 에 모듈 사본 (`off` 로 원복) | — (Codex에서 실행해도 Claude Code HUD 만 다룸) |
255
262
  | `tone-compact` | `rules/banker-tone-compact.md` 생성 (`off` 로 삭제) | `AGENTS.md`(내용이 있는 `AGENTS.override.md` 우선) 끝에 `USER:OMX:POLICY` 로 감싼 블록 1개(`.tone-compact.bak` 백업·멱등, `off` 로 원복) |
256
263
  | `anti-drm` | `rules/banker-anti-drm.md` 생성 (`off` 로 삭제) + 설정 `~/.config/banker/anti-drm.json`(두 런타임 공용, `off` 뒤에도 남음, anti-drm 이 쓰지 않은 파일이 있었으면 `.bak`) | `AGENTS.md`(내용이 있는 `AGENTS.override.md` 우선) 끝에 `USER:OMX:POLICY` 로 감싼 블록 1개(`.anti-drm.bak` 백업·멱등, `off` 로 원복) |
@@ -258,9 +265,9 @@ banker uninstall # 제거
258
265
  | `remains` | 설정 파일 미변경. `~/.config/banker/test-boxes.json` 은 읽기만 함(사용자가 만들거나, 사용자가 준 정보로 확인받고 만듦). 처음 접속하는 박스의 호스트 키가 `~/.ssh/known_hosts` 에 더해짐. 테스트박스에는 임시 폴더를 만들고 끝나면 지움(시간 초과나 중단 때는 시작한 프로세스를 먼저 끝냄, 못 지우면 결과에 표시) | 동일 |
259
266
  | `motion-graphic-setup` | 설정 파일 미패치 (Node/ffmpeg 확보 + `npx hyperframes` 설치만) | 동일 (`config.toml` 미변경) |
260
267
  | `3d-intro-setup` | `settings.json` 미패치 — 크레덴셜을 untracked env 파일에 기록(`.env.3d-intro.local` 또는 `~/.config/banker/3d-intro/env`) | 동일 (`config.toml` 미변경) |
261
- | `setup-bypass-permissions` | `permissions.defaultMode` = `bypassPermissions` (켜기 전 내용은 `settings.json.bypass-permissions.bak`, 되돌리기 기록은 `settings.json.bypass-permissions.json`, `off` 로 원복. 관리 정책, 설정 파일의 금지 키, root 계정이면 거부) | Codex 에서 실행해도 같은 머신의 Claude Code 설정을 바꿈 (Codex 승인 정책은 미변경) |
268
+ | `setup-bypass-permissions` | `permissions.defaultMode` = `bypassPermissions` (켜기 전 내용은 `settings.json.bypass-permissions.bak`, 되돌리기 기록은 `settings.json.bypass-permissions.json`, `off` 로 원복. 관리 정책, 설정 파일의 금지 키, root 계정이면 거부) | 대상 `codex` 면 `~/.codex/config.toml` 최상위의 `approval_policy` = `"never"`, `sandbox_mode` = `"danger-full-access"` (켜기 전 원본 `config.toml.bypass-permissions.bak`, 되돌리기 기록 `config.toml.bypass-permissions.json`, `off` 로 원복. 조직 정책이 막으면 거부). 대상 `claude` 면 Codex 에서 실행해도 Claude Code 설정을 바꿈 |
262
269
 
263
- `obsidizer` 는 `settings.json` 대신 `<위키디렉터리>/.obsidizer` 플래그 파일로만 켜고 끕니다.
270
+ `obsidizer` 는 `settings.json` 대신 `<위키디렉터리>/.obsidizer` 플래그 파일로만 켜고 끕니다. Codex 는 `omx_wiki/.obsidizer` 플래그에 더해 `~/.codex/hooks.json` 에 훅 묶음 1개를 더합니다.
264
271
 
265
272
  ## 요구사항
266
273
 
@@ -273,8 +280,8 @@ banker uninstall # 제거
273
280
  - `omc-patch`: Node 18 이상과 `git`(OMC 마켓플레이스 고정과 확인에 사용).
274
281
  - `remains`: 테스트박스를 쓰려면 이 머신에 `ssh`, `scp`, `git`, 박스에 `tar` 와 시험에 필요한 런타임(예: Node)이 있어야 하고, SSH 키로 암호 없이 접속돼야 합니다.
275
282
  - `ultra-chain`: 위 OMC(Codex 는 OMX), 웹 조사 수단, 시각 검토의 캡처에는 Node 용 playwright 패키지와 Chromium, OS 시험에는 `remains` 와 같은 테스트박스 조건.
276
- - `/graceful-pause`: Claude Code 2.1.289 이상(mod). 그보다 오래된 Claude Code 는 명령을 등록하지 않고 한 줄로 알리며, Codex 에는 이 명령이 없습니다.
277
- - `/progress`: mod 를 지원하는 Claude Code(2.1.286 과 2.1.296 에서 확인). 작업 중 즉시 실행은 2.1.289 이상에서 확인했습니다. mod 가 없는 Claude Code(2.1.250 에서 확인)에서는 "mod 를 지원하지않는 claude code 버전입니다" 만 보이고 모델은 호출되지 않습니다. Codex 에는 이 명령이 없습니다.
283
+ - `/graceful-pause`: Claude Code 2.1.289 이상(mod). 그보다 오래된 Claude Code 는 명령을 등록하지 않고 한 줄로 알립니다. Codex 는 스킬 `$banker-graceful-pause` 입니다(0.144.5 에서 확인).
284
+ - `/progress`: mod 를 지원하는 Claude Code(2.1.286 과 2.1.296 에서 확인). 작업 중 즉시 실행은 2.1.289 이상에서 확인했습니다. mod 가 없는 Claude Code(2.1.250 에서 확인)에서는 "mod 를 지원하지않는 claude code 버전입니다" 만 보이고 모델은 호출되지 않습니다. Codex 는 스킬 `$banker-progress` 입니다(상시 패널이 아니라 부를 때마다 보임, tmux 칸은 선택).
278
285
  - `lineage`: Python 3.7+ (표준 라이브러리만 사용). RHEL8/Rocky8은 기본 `python3` 가 3.6이라 `setup-python` 등으로 3.11을 설치해 지정해야 합니다.
279
286
 
280
287
  ## 업데이트 / 제거
@@ -305,7 +312,7 @@ Codex는 재설치할 때마다 기존 `banker-*` 를 먼저 정리하므로 옛
305
312
  > 0.19.5 이하의 `setup-omc-hud` 가 옛 래퍼에 넣은 Claude 갱신 안내 블록은 제거 전에 `/banker:setup-omc-hud off` 로 뺄 수 있습니다.\
306
313
  > 이미 지웠다면 HUD를 재설치하거나, `// >>> claude-update-last >>>` 부터 `// <<< claude-update-last <<<` 까지 지우면 됩니다. 블록을 남겨 두어도 상태표시줄은 깨지지 않습니다.
307
314
 
308
- > `setup-bypass-permissions` 로 바꾼 권한 모드는 `settings.json` 에 남아, 플러그인을 지워도 모든 세션에서 확인 없이 도구가 실행됩니다. 제거 전에 `/banker:setup-bypass-permissions off` 를 실행하세요.\
315
+ > `setup-bypass-permissions` 로 바꾼 권한 모드는 `settings.json`(Codex 대상은 `~/.codex/config.toml`)에 남아, 플러그인을 지워도 모든 세션에서 확인 없이 도구가 실행됩니다. 제거 전에 `/banker:setup-bypass-permissions off` 를 실행하세요(Codex 는 `$banker-setup-bypass-permissions off codex`).\
309
316
  > 이미 지웠다면 설정 폴더(`$CLAUDE_CONFIG_DIR`, 없으면 `~/.claude`)의 `settings.json` 에서 `permissions.defaultMode` 를 지우거나 원래 값으로 되돌리면 됩니다. 옆의 `settings.json.bypass-permissions.bak` 과 `settings.json.bypass-permissions.json` 도 지우세요. 백업에는 설정의 비밀 값이 들어 있을 수 있습니다.\
310
317
  > root 계정에서 이 모드 때문에 Claude Code 가 시작되지 않으면 `claude --permission-mode default` 로 시작한 뒤 `off` 를 실행하세요.
311
318
 
@@ -337,13 +344,14 @@ banker는 기본값(default-on)으로 두 가지를 합니다.\
337
344
  끄기:
338
345
 
339
346
  ```bash
340
- export BANKER_NO_UPDATE_CHECK=1 # 업데이트 알림만 끄기
347
+ export BANKER_NO_UPDATE_CHECK=1 # 업데이트 알림 끄기(체크인 전송도 함께 멈춤)
341
348
  export BANKER_NO_TELEMETRY=1 # 사용량 카운팅만 끄기
342
349
  ```
343
350
 
344
351
  카운팅은 `banker telemetry off` 로도 끌 수 있습니다.\
345
352
  플러그인은 기본 카운팅 엔드포인트(`banker.banker-plugins.workers.dev`)를 내장하므로 count-default-on 이라 설치 즉시 활성이며, `BANKER_TELEMETRY_ENDPOINT` 환경변수로 자가호스팅/override 할 수 있습니다.\
346
- Codex CLI는 샌드박스가 네트워크를 차단하므로 알림·카운팅 둘 다 동작하지 않습니다.
353
+ Codex CLI 에서는 `banker setup --codex` 가 같은 일을 Codex 훅 `SessionStart`(알림 확인)와 `Stop`(턴이 끝날 때 이번 턴에 쓴 banker 스킬 집계)으로 설치합니다. 도구 호출마다 돌지 않고 턴마다 한 번 돕니다. \
354
+ Codex 를 다시 열 때 Hooks need review 창이나 `/hooks` 에서 신뢰해야 돌고, 훅은 Codex 샌드박스 밖에서 돌므로 샌드박스가 네트워크를 막아도 동작합니다. 끄는 방법은 같습니다.
347
355
 
348
356
  무엇을 수집하고 누가 수신하는지는 [PRIVACY.md](PRIVACY.md)에 정리했습니다.
349
357
 
@@ -357,6 +365,29 @@ Codex CLI는 샌드박스가 네트워크를 차단하므로 알림·카운팅
357
365
  | <https://banker.banker-plugins.workers.dev/stats> | 집계 데이터 JSON |
358
366
  | <https://banker.banker-plugins.workers.dev/health> | 헬스 체크 (`ok`) |
359
367
 
368
+ ## 오프라인에서 쓰기
369
+
370
+ 네트워크가 없는 곳에서도 banker 를 설치하고 쓸 수 있습니다.\
371
+ 설치는 네트워크가 되는 곳에서 받은 묶음 하나로 끝납니다. banker 는 의존성이 없어 더 받을 것이 없습니다.
372
+
373
+ ```bash
374
+ npm pack @kaydash9999/banker-plugins # 네트워크가 되는 곳에서. kaydash9999-banker-plugins-<판>.tgz 가 생김
375
+ npm i -g ./kaydash9999-banker-plugins-<판>.tgz # 옮긴 뒤
376
+ banker setup
377
+ ```
378
+
379
+ - 세션 시작 훅의 업데이트 조회와 체크인은 따로 돌아 세션을 기다리게 하지 않습니다. 실패하면 24시간 동안 다시 시도하지 않고, 아예 시도하지 않게 하려면 `BANKER_NO_UPDATE_CHECK=1` 을 둡니다.
380
+ - 훅은 `HTTPS_PROXY`, `HTTP_PROXY` 를 따르지 않습니다(Node 가 `NODE_USE_ENV_PROXY=1` 일 때만 따름). 프록시를 거쳐야만 밖에 닿는 망에서는 훅의 확인이 실패로 기록됩니다(`banker telemetry status` 의 "마지막 시도").
381
+ - 네트워크가 필요한 스킬과 네트워크 없이 끝나는 모습
382
+ - 내려받는 설치 스킬(`setup-omc-hud`, `setup-bypass-permissions` 를 뺀 `setup-*`, `docs-setup`, `vertical-pptx-setup`, `motion-graphic-setup`, `3d-intro-setup`): 웹 원천(npm, PyPI, GitHub 등)은 먼저 닿는지 보고, 닿지 못하면 받지 않고 "오프라인이라 설치하지 않음" 으로 알립니다. OS 패키지 관리자(dnf, apt, brew, winget)의 단계는 그 관리자의 미러 설정을 따르므로 미리 판정하지 않고 시도합니다. 단 `setup-pwsh` 는 winget 이 유일한 원천이라 그 원천을 먼저 봅니다.
383
+ - `update-banker`: 레지스트리에 닿지 못하면 어느 채널도 바꾸지 않고 멈춥니다.
384
+ - `audit-security` 의 의존성 취약점 조회: 결과로 읽을 수 없는 도구는 0건이 아니라 "미커버" 로 적습니다.
385
+ - `deep-research`, `lfm`, 이를 부르는 `ultra-chain` 1단계, `ultra-interview` 와 `rfp-author` 의 조사: 웹 도구가 모두 실패하면 조사하지 못했다고 알립니다. `lfm` 은 모델이 아는 관행으로 표를 채우지 않고 "웹 조사 불가" 로 끝납니다.
386
+ - `npx` 로 부르는 도구(`motion-graphic-make` 의 hyperframes 등): 전역 설치가 없으면 패키지를 받으려 해, 네트워크가 없으면 약 70초 뒤 실패합니다. 오프라인에서는 전역 설치한 실행 파일을 부릅니다.
387
+ - 유료 API 를 부르는 `3d-intro-build`(요청마다 시간 제한), `ralph-qa` 의 외부 좌석(codex, gemini, opencode, 좌석마다 600초)
388
+ - `vertical-pptx`, `pdf-vision-extract` 가 빠진 도구를 설치하라고 안내할 때, `nothing-design` 의 글꼴(Google Fonts. 받지 못하면 대체 글꼴로 보임)
389
+ - 네트워크를 쓰지 않는 스킬(예: `lineage`, `setup-omc-hud`, `tone-compact`, `anti-drm`, `payload-mon`)은 네트워크 없이 그대로 씁니다.
390
+
360
391
  ## 라이선스 / 서드파티
361
392
 
362
393
  banker 자체는 **MIT** ([LICENSE](LICENSE)). Owner: [smallOpenSource](https://github.com/smallOpenSource).