@kaydash9999/banker-plugins 0.20.1 → 0.20.5
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +195 -1
- package/PRIVACY.md +13 -3
- package/README.md +27 -4
- package/bin/banker.js +84 -40
- package/bin/lib/telemetry-config.mjs +31 -16
- package/codex/manifest.json +1 -1
- package/codex/transform-matrix.md +1 -1
- package/commands/setup.md +23 -0
- package/hooks/progress.mjs +143 -38
- package/hooks/register.mjs +13 -3
- package/hooks/update-checkin.mjs +15 -7
- package/hooks/update-fetch.mjs +15 -9
- package/hooks/update-notify.mjs +2 -9
- package/package.json +1 -1
- package/skills/3d-intro-build/SKILL.md +11 -5
- package/skills/3d-intro-build/references/azure-adapter.mjs +374 -81
- package/skills/3d-intro-build/references/curate.mjs +48 -14
- package/skills/3d-intro-build/references/preview-lib.mjs +51 -15
- package/skills/3d-intro-build/references/prompts.md +4 -4
- package/skills/3d-intro-build/references/serve.mjs +6 -1
- package/skills/3d-intro-build/references/verify-intro.mjs +16 -9
- package/skills/3d-intro-build/references/video-pool.mjs +250 -135
- package/skills/3d-intro-setup/SKILL.md +41 -10
- package/skills/3d-intro-setup/references/azure-adapter.mjs +374 -81
- package/skills/3d-intro-setup/references/video-pool.mjs +250 -135
- package/skills/anti-drm/SKILL.md +6 -3
- package/skills/anti-drm/scripts/anti-drm.mjs +49 -12
- package/skills/anti-drm/scripts/instruction-toggle.mjs +105 -20
- package/skills/audit-mock/SKILL.md +1 -1
- package/skills/audit-security/SKILL.md +64 -2
- package/skills/deep-research/SKILL.md +5 -0
- package/skills/docs-setup/SKILL.md +37 -7
- package/skills/lineage/SKILL.md +12 -12
- package/skills/lineage/lineage.py +399 -300
- package/skills/motion-graphic-make/SKILL.md +1 -1
- package/skills/motion-graphic-make/references/curate.mjs +48 -14
- package/skills/motion-graphic-make/references/preview-lib.mjs +51 -15
- package/skills/motion-graphic-make/references/serve.mjs +6 -1
- package/skills/motion-graphic-setup/SKILL.md +58 -13
- package/skills/obsidizer/SKILL.md +1 -1
- package/skills/obsidizer/obsidize.mjs +8 -1
- package/skills/omc-patch/SKILL.md +80 -23
- package/skills/omc-patch/scripts/omc-patch.mjs +460 -116
- package/skills/payload-mon/SKILL.md +5 -2
- package/skills/payload-mon/scripts/payload-mon.mjs +137 -30
- package/skills/payload-mon/scripts/payload-size.mjs +4 -1
- package/skills/pdf-vision-extract/SKILL.md +11 -6
- package/skills/ralph-qa/SKILL.md +125 -151
- package/skills/ralph-qa/references/gemini-seat.mjs +67 -19
- package/skills/ralph-qa/references/payload-scan.mjs +22 -7
- package/skills/ralph-qa/references/seat-payload.mjs +646 -0
- package/skills/ralph-qa/references/seat-run.mjs +956 -0
- package/skills/ralph-qa/references/seat-spawn.mjs +205 -0
- package/skills/ralph-qa/references/verifier-probe.mjs +57 -16
- package/skills/setup-harness-factory/SKILL.md +17 -1
- package/skills/setup-insane-search/SKILL.md +16 -0
- package/skills/setup-java/SKILL.md +20 -1
- package/skills/setup-lsp/SKILL.md +56 -13
- package/skills/setup-mcp/SKILL.md +73 -4
- package/skills/setup-node/SKILL.md +31 -6
- package/skills/setup-omc/SKILL.md +24 -0
- package/skills/setup-omc-hud/SKILL.md +13 -5
- package/skills/setup-omc-hud/assets/apply-hud.mjs +381 -27
- package/skills/setup-omc-hud/assets/omc-hud-custom.mjs +81 -14
- package/skills/setup-omc-hud/scripts/claude-update-last.mjs +5 -3
- package/skills/setup-playwright/SKILL.md +45 -2
- package/skills/setup-pwsh/SKILL.md +19 -0
- package/skills/setup-python/SKILL.md +45 -7
- package/skills/setup-sandbox/SKILL.md +30 -5
- package/skills/setup-stitch/SKILL.md +22 -0
- package/skills/setup-tmux/SKILL.md +24 -4
- package/skills/tone-compact/SKILL.md +2 -1
- package/skills/tone-compact/scripts/instruction-toggle.mjs +105 -20
- package/skills/ultra-chain/SKILL.md +4 -3
- package/skills/ultra-chain/references/preview-lib.mjs +51 -15
- package/skills/ultra-chain/references/serve.mjs +6 -1
- package/skills/ultra-interview/SKILL.md +1 -0
- package/skills/update-banker/SKILL.md +19 -3
- package/skills/vertical-pptx/SKILL.md +6 -3
- package/skills/vertical-pptx-setup/SKILL.md +76 -20
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "banker",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.5",
|
|
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,199 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.20.5] - 2026-10-21
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- `ralph-qa` 의 외부 좌석 전송을 node 실행기(`references/seat-run.mjs`, 명령 init, untracked, prepare, check, send, cleanup, put)로 옮긴다. SKILL 은 판단(좌석과 모델, 새 파일과 관련 범위 고르기, 짧은 부분, 가림, 512 KiB 질문, 나누기)과 결과 읽기만 남기고, bash 블록과 PowerShell 산문의 좌석 명령, git 사슬, 시간 상한, 정리는 실행기가 한다. 좌석의 인자와 env 는 0.20.4 명령과 글자 그대로 같고 시험이 고정한다.
|
|
7
|
+
- 사용자에게 달라지는 것: PowerShell 에서도 좌석마다 600초 상한이 서고(전에는 없었다), 상한과 멈춤에 좌석의 프로세스 묶음(Windows 는 트리)이 함께 끝나며, 좌석이 스스로 끝나도 그 묶음에 남은 프로세스를 끝내 늦게 쓰는 gemini 기록이 남지 않는다. send 가 돌아오면 그 좌석의 gemini 기록, opencode 세션, 사본이 지워져 있다. send 는 실행기가 띄운 둘째 node 가 맡아, 실행기 node 만 끝나도(`kill -9`, 작업 관리자) 좌석을 끝내고 정리한다. Windows Git Bash 의 `/c/...` 꼴 경로도 `--repo`, `--dir` 로 받는다.
|
|
8
|
+
- 남의 저장소(압축본에 딸려 온 `.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` 를 찾지 않는다.
|
|
9
|
+
- 보내기 직전 고른 모델로 프로브를 다시 불러 MCP 서버와 관리 설정을 그때의 설정으로 확인한다(모델은 다시 정하지 않는다). 새 파일은 정확한 이름으로 맞춰, 줄바꿈이 든 이름은 멈추지 않고 보내지도 않는다. git 은 PATH 의 절대 경로로 저장소 밖 폴더에서 돌고 fsmonitor 를 끈다. 멈춤과 좌석 결과는 JSON 의 `stop`, `status`, `why` 로 나오고 같은 JSON 이 `<d>/result-<명령>.md` 에 남는다.
|
|
10
|
+
- 유지보수자용: step2-chain, seat-folders 시험을 seat-payload, seat-run, seat-spawn 시험(가짜 좌석 CLI `scripts/test-fixtures/seat-stub.mjs`)으로 옮긴다. smoke 의 S23 묶음을 S25 묶음(실행기 명령, 멈춤과 결과 집합, 장치, Node 16.7 API, 손으로 짠 명령 없음)으로 바꾼다.
|
|
11
|
+
- `lineage` SKILL 은 `--redact-mode` 나 `--redact-extra` 를 바꿔 `--rulebase` 를 다시 돌릴 때 `--rebuild-summaries` 를 함께 주라고 적는다. 그대로 다시 돌리면 앞서 만든 요약을 다시 써, mask 로 만든 요약이 기본 실행에도 mask 로 남는다.
|
|
12
|
+
- 유지보수자용: lineage 시험의 시간 상한이 CPU 시간을 읽는 까닭을 도우미 하나에 적는다. 파일 시스템 인코딩이 ASCII 인 설정에서도 lineage 시험이 오류 없이 돈다. smoke 는 subTest 로 실패한 시험의 이름도 한 번씩 보인다.
|
|
13
|
+
- `ralph-qa` SKILL 이 `TaskStop` 이 좌석 프로세스 트리를 멈춘다는 문장을 실측한 Linux, macOS 로 좁힌다. Windows(Git Bash)에서는 좌석의 시간 상한이 트리를 끝내고, PowerShell 판에서 트리까지 멈추는지는 재지 못했다고 적는다.
|
|
14
|
+
- 유지보수자용: setup-omc-hud 시험의 쓰지 않는 도우미 셋을 지우고 설치 스크립트의 가져오기 순서를 맞춘다. 중간에 멈추는 설치의 시험은 쓰기 오류를 일으키는 preload 로 돈다.
|
|
15
|
+
- 유지보수자용: azure-adapter 와 video-pool 이 따로 들던 시간 상수와 오류 도우미를 adapter 하나에 둔다. 임시 파일의 `wx` 지킴을 고정하는 시험을 더한다.
|
|
16
|
+
- `setup-omc-hud` SKILL 이 `settings.json` 을 새 파일로 바꿔 넣을 때 손으로 준 ACL, 확장 속성(Windows 는 대체 데이터 스트림), SELinux 라벨이 새 파일에도 백업에도 따라오지 않는다고 적는다(세 OS 실측).
|
|
17
|
+
- `omc-patch` SKILL 은 명령의 자리 표시에 도구 출력이나 `find` 가 낸 값을 넣을 때 bash, PowerShell 모두 작은따옴표로 감싸고, 값에 작은따옴표(PowerShell 은 `‘` `’` `‚` `‛` 도)나 줄바꿈이 있으면 명령을 만들지 않는다고 적는다. 백업 없는 패치의 원본을 임시 tar 로 되찾는 명령은 한 줄로 바꿔, 임시 폴더를 만들지 못하면 git 도 tar 도 돌리지 않고 다 쓴 폴더는 지운다.
|
|
18
|
+
- 유지보수자용: omc-patch 시험의 git 은 https, ssh 전송을 받지 않는다(`GIT_ALLOW_PROTOCOL=file:http`). 고정물의 `example.invalid` origin 으로 이름 서버에 묻는 일이 생기지 않는다. 시험 env 에 커밋 정보(이름, 이메일)를 줘, fetch 의 reflog 가 이 PC 의 호스트 이름을 이름 서버에 묻지 않는다. 태그 받기의 두 KILL(TERM 을 무시하는 git, 스스로 끝난 git 이 남긴 프로세스)을 지키는 시험을 더한다.
|
|
19
|
+
- `anti-drm` 설정 자리가 링크면 `status` 가 설정 줄에 링크가 가리키는 곳을 함께 보이고, 그 파일의 틀린 값은 글 대신 형식과 길이만 보인다(`(string, 12자)`). 링크를 따라 읽는 설계는 그대로다. `on` 의 "이 자리를 덮어쓰지 않습니다" 안내는 링크가 아닌 자리에만 붙는다(링크는 설정을 다시 주면 새 파일로 바뀐다).
|
|
20
|
+
- 유지보수자용: smoke 와 gen-skill-changes 시험이 `Object.hasOwn` 없이 돈다(engines 하한 Node 16.7). 두 시험의 npm 은 임시 HOME 과 로그 자리를 써, 사용자 `.npmrc` 의 `logs-max=0`, `logs-dir` 에서 거짓 FAIL 이 나지 않고 로그가 임시 폴더 밖에 생기지 않는다. smoke 의 표준 입력 판정이 공백 든 자리 표시(`<입력 파일 경로>`)를 재지정으로 보지 않는다.
|
|
21
|
+
- 유지보수자용: 저장소의 글 파일에 날 숨은 글자가 없는지 보는 시험(`scripts/hidden-chars.test.mjs`)을 더하고, 시험 셋의 날 글자 6자를 이스케이프로 바꾼다. PowerShell 을 띄우는 시험은 모두 임시 홈 env 를 준다는 시험을 더하고, 그 env 가 모듈 분석 캐시 자리(`PSModuleAnalysisCachePath`)도 옮긴다.
|
|
22
|
+
- 설치 스킬과 확인 블록을 둔 스킬 18개, `/banker:setup` 의 네트워크 확인
|
|
23
|
+
- 확인 블록의 첫 줄이 Codex sandbox 가 네트워크를 막는 때(`CODEX_SANDBOX_NETWORK_DISABLED=1`)를 알리고, 그때는 '오프라인' 이 아니라 'sandbox 가 네트워크를 막음' 으로 보고한다.
|
|
24
|
+
- `npm ping` 을 15초 감시 함수(`in15`) 안에서 부른다. 감시는 호출자의 출력을 쥐지 않아, 확인이 끝나면 바로 돌아온다. 패킷을 버리는 망에서 npm 은 OS 의 연결 재시도가 끝날 때까지 약 130초를 기다렸다(`--fetch-timeout` 은 받는 중의 쉼만 잰다). 빈 캐시 대안은 ping 이 감시에 걸렸으면 하지 않는다. 두 npm 확인 모두 `--no-update-notifier` 를 준다.
|
|
25
|
+
- 확인이 실패하면 명령, 종료 코드, stderr 첫 줄을 보고에 붙인다. curl 의 종료 60 과 npm 의 인증서 오류는 '오프라인' 이 아니라 인증서 문제로 보고하고 `NODE_EXTRA_CA_CERTS` 를 안내한다.
|
|
26
|
+
- curl 확인 줄은 `--ssl-no-revoke` 를 준다. Windows 의 `curl.exe` 와 Git Bash 의 curl 은 Schannel 이라, 폐지 목록 서버에 닿지 못하는 망에서 종료 60 으로 끝났다(Windows 박스 실측). 다른 curl 은 이 깃발을 받고 무시한다(macOS, Rocky 8 실측). PowerShell 에서는 `Get-Command curl.exe` 로 먼저 찾는다(없으면 앞 명령의 `$LASTEXITCODE` 가 남는다).
|
|
27
|
+
- dnf 와 apt 가 막힌 망에서 기다리는 시간(실측 121초, 247초)과 `apt-get update` 가 받지 못해도 종료 0 이라는 것을 적는다. 시간 제한은 관리자 설정을 따른다.
|
|
28
|
+
- pip 설정 읽기가 판 붙은 python(3.13, 3.12, 3.11)의 pip 도 본다. Rocky 8 의 기본 pip(9.0.3)은 `config` 명령이 없다.
|
|
29
|
+
- `/banker:setup` 이 부르는 스킬은 같은 실행 안에서 이미 돌린 같은 확인 줄의 결과를 다시 쓴다.
|
|
30
|
+
- `setup-mcp` 의 오프라인 등록은 macOS, Linux 에서 설치한 실행 파일을 절대 경로로 등록한다. Windows 는 `cmd /c` 와 이름이다. 서버를 띄우는 런타임의 PATH 에 node 가 없을 때(GUI, IDE)는 node 도 절대 경로로 등록하라고 적는다.
|
|
31
|
+
- `setup-node` 확인에 github.com(nvm 의 install.sh 가 git 이 있으면 거기서 clone 한다)을, `setup-playwright` 확인에 브라우저 내려받기 서버(`cdn.playwright.dev`, 미러 변수를 따름. chromium 미러만 주면 ffmpeg 의 기본 서버도)를, `motion-graphic-setup` 확인에 RPM Fusion 을 더한다.
|
|
32
|
+
- `vertical-pptx` 의 스크래치 설치는 새 임시 폴더에서 돌아 프로젝트 트리와 그 `.npmrc` 를 건드리지 않는다. 이 스킬과 `pdf-vision-extract` 는 오프라인이면 설치하지 않는다고 적는다. `audit-security` 1단계에 원천 확인과 Go 도구 받기 꼴(https 만, `~/.local/bin` 을 만듦)을 둔다.
|
|
33
|
+
- 유지보수자용: smoke 가 판 질의(`npx --version`, `curl -V`)를 내려받기로 세지 않는다. 새 단언 airgap-4l, 4m, 4n, 4o, 4p, 4q, 9d, 12 가 위 꼴을 지킨다.
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
- `lineage` 3.0.10: detect-secrets 가 설치된 환경에서 검사용 임시 파일을 쓰다 실패하면(디스크가 가득 참, UTF-8 이 담지 못하는 글자) 그 파일이 임시 폴더에 남던 것. 그 파일에는 detect-secrets 가 가리기 전의 글이 들 수 있었다.
|
|
37
|
+
- `ralph-qa` 3단계 검사기가 `--from-literal=DB_PASSWORD=…`, `--env=…`, `(DB_PASSWORD=… psql)` 의 비밀번호 낱말을 놓치던 것. 셸의 `PWD`, `OLDPWD` 가 경로를 담은 줄을 비밀번호로 가리던 것도 고친다(이름이 PWD 로 끝나기만 하는 키와 경로가 아닌 값은 그대로 잡는다).
|
|
38
|
+
- `ralph-qa` 프로브가 codex 설정의 `[[mcp_servers.<이름>]]`(표 배열, 따옴표 친 꼴 포함)를 MCP 서버가 없는 것으로 읽어 좌석을 세우던 것. codex 는 그 설정을 읽지 못하고 멈춘다. 이제 서버 목록을 못 읽은 것으로 보고 좌석을 세우지 않는다.
|
|
39
|
+
- `ralph-qa` 2단계의 관련 코드 범위가 파일 밖(시작이 마지막 줄을 넘음, 0, 끝이 시작 앞)이면 bash 는 빈 범위를, PowerShell 은 빈 줄이나 엉뚱한 줄을 붙이던 것. 이제 둘 다 `관련 범위가 파일 밖이다` 로 멈추고, PowerShell 도 끝이 파일을 넘으면 있는 줄까지만 붙인다.
|
|
40
|
+
- `ralph-qa` 의 here-document 구분자가 고정 이름(`RALPHQA_EOF`)이라 그 이름의 줄이 든 본문이 거기서 끊기던 것. 이제 실행마다 무작위 id 를 붙인다. PowerShell here-string 은 `'@` 로 시작하는 줄이 있으면 쓰지 않고 그 좌석을 `cli-call-failed` 로 둔다.
|
|
41
|
+
- `setup-omc-hud` 래퍼가 홈 폴더를 알 수 없으면(HOME 도 계정 항목도 없음) 상태표시줄 없이 끝나던 것. 이제 래퍼 옆의 로더로 그리고 계정 칸만 뺀다.
|
|
42
|
+
- 래퍼가 로더나 `payload-mon` 사본 자리에 일반 파일이 없을 때 첫 자리를 불러, FIFO 면 끝나지 않고 폴더면 Node 오류 여러 줄을 내던 것. 이제 로더가 없으면 `[OMC HUD] omc-hud.mjs not found: <경로>` 한 줄을 내고, PL 사본이 없으면 PL 칸만 뺀다.
|
|
43
|
+
- 설치 스크립트가 설치할 자리의 FIFO 에서 끝없이 기다리거나, 파일 자리의 폴더(폴더 자리의 파일)에서 로더를 쓴 뒤 중간에 멈추던 것. 이제 아무것도 읽거나 쓰기 전에 그 자리를 알리고 멈춘다.
|
|
44
|
+
- 설치 스크립트가 이전 statusLine 명령을 알리는 줄에 그 명령 속 토큰과 비밀번호를 그대로 찍던 것. 이제 그 명령의 첫 낱말(앞의 변수 대입은 건너뜀)과 길이만 보인다(원문은 백업에만).
|
|
45
|
+
- 하드 링크인 `settings.json` 을 제자리에 쓸 때 다른 이름(스냅샷 등)도 바뀐다는 것을 알리지 않던 것. 이제 `[..] settings.json has N other name(s)` 줄로 알린다.
|
|
46
|
+
- `payload-mon` 이 모듈 사본을 쓰는 사이 사본 폴더가 바뀌었다 돌아오면 사본이 없는데도 켰다고 하던 것, 바뀐 자리에 원래 있던 다른 래퍼의 사본을 거두며 지우던 것, Windows 에서 파일 ID 가 2^53 을 넘어 다른 폴더를 같은 폴더로 볼 수 있던 것.
|
|
47
|
+
- `payload-mon` 의 기록 캐시가 Windows 에서 파일 ID 를 Number 로 견줘, 바뀐 기록을 옛 위치부터 이어 셀 수 있던 것.
|
|
48
|
+
- `3d-intro-build` 미리보기와 검토 서버가 HEAD 요청에도 파일을 끝까지 읽고, 선언보다 짧아진 파일이면 헤더 없이 연결만 닫던 것. 이제 HEAD 는 헤더만 보낸다.
|
|
49
|
+
- 남의 저장소가 추적하는 프로젝트 키 파일(`.env.3d-intro.local`)에 셋업이 사용자의 키를 쓰던 것(다음 커밋에 실림). 이제 `persistCreds` 가 거부하고, `resolveCreds` 는 `_tracked` 로 알려 빌드가 멈춘다(빌드 0단계의 코드와 `generateClip` 이 그 값으로는 아무것도 보내지 않고 멈춘다).
|
|
50
|
+
- 코드 없는 WAN 401 하나로 키를 영구히 빼던 것. 이제 403 처럼 24시간 쉰다(`InvalidApiKey` 는 그대로 뺀다).
|
|
51
|
+
- `pollVideo`, `wanPollTask`, `generateClip` 을 폴링 간격 0 으로 부르면 쉬지 않고 요청하던 것(30분에 약 140만 회). 이제 실제 타이머의 기다림은 1초 아래로 내려가지 않는다.
|
|
52
|
+
- Sora 가 `Retry-After` 없이 429 를 낼 때 `maxRateWaitMs` 를 넘는 240초를 기다리던 것. 이제 다음 기다림이 상한을 넘으면 `rate` 로 멈춘다.
|
|
53
|
+
- 읽기가 멈춘 테이크 하나가 검토 페이지 전체를 붙잡던 것. 이제 5초까지 기다리고 그 테이크는 `읽는 중` 으로 보인다. 같은 크기로 금방 다시 쓴 파일이나 Windows 에서 파일 ID 가 Number 로 겹치는 파일의 sha256 이 옛 값으로 나오던 것도 고친다.
|
|
54
|
+
- 상태 파일에 적힌 주소와 PID 만 믿고 그 호스트에 묻고 이 기기의 그 PID 에 신호를 보내던 것. 이제 기록된 주소가 이 기기일 때만 묻고 끈다(`127.` 로 시작하는 DNS 이름은 이 기기가 아니다). 다른 설정으로 도는 서버를 알리는 줄은 그 폴더를 따옴표 친 한 조각으로 보인다.
|
|
55
|
+
- 키 파일의 줄 끝이 CR 뿐이면 한 줄로 읽혀 키가 다른 값(endpoint)에 들어가고, 쓸 때 다른 키 줄이 사라지던 것. 이제 CR, LF, CRLF 를 모두 줄 끝으로 읽고 그 파일의 줄 끝을 지킨다.
|
|
56
|
+
- 프로젝트가 `decisions.json.tmp`, `curate.server.json` 자리에 심은 링크를 따라 프로젝트 밖 파일을 쓰던 것. 이제 무작위 이름의 새 파일에 쓴 뒤 바꿔 넣는다.
|
|
57
|
+
- `omc-patch` 인자 없는 apply 의 태그 받기가 시간 제한(120초)에 git 하나만 끝내, git 이 띄운 보조 프로세스(`git remote-http` 등)가 연결을 http 는 30초, TLS 는 300초까지 더 붙들던 것. 이제 시간 제한이나 Ctrl+C 에 그 보조 프로세스까지 함께 끝낸다.
|
|
58
|
+
- 인자 없는 apply 가 `installed_plugins.json.omcbak` 자리가 폴더, FIFO, 링크일 때 백업 없이 판을 바꾸고 `완료. 실패 0건.` 이라 하던 것. 이제 판을 바꾸지 않고 `installed_plugins.json 을 바꾸지 않음` 으로 멈춘다.
|
|
59
|
+
- fsync 를 받지 않는 파일 시스템(`EINVAL`, `ENOTSUP`)에서 훅을 하나도 패치하지 못하던 것. 이제 디스크로 내리기만 건너뛰고 rename 으로 바꾼다(azure-adapter 와 같은 규칙).
|
|
60
|
+
- 태그를 받지 못한 까닭 줄과 `--check` 의 origin 줄, 고정 실패, 고정 해제 실패, origin 을 읽지 못함 줄이 주소의 경로, 조각, `;` 매개변수를 그대로 싣던 것. 이제 기본 상류(GitHub 의 OMC 저장소, scheme 이 있는 주소)는 가린 꼴 그대로(쿼리는 이름 없는 토큰까지 통째로 `?***`), 그 밖의 주소(미러)는 scheme 과 host 까지만 싣는다. git 의 줄에 든 주소는 가리기 전의 주소로 꼴을 정해, 경로나 쿼리 속 `@` 뒤의 글이 host 로 보이지 않는다.
|
|
61
|
+
- Windows 에서 마켓플레이스 폴더(남의 저장소 사본)에 든 `git.exe` 가 git 대신 돌 수 있던 것. Windows 는 이름만 준 프로그램을 일하는 폴더에서 먼저 찾는다. 이제 모든 git 을 홈 폴더에서 `-C <마켓플레이스>` 로 돌린다.
|
|
62
|
+
- 쿼리 값 가림이 git 이 주소를 닫는 `'` 와 `:` 까지 먹어 고정 실패 줄과 까닭 줄이 깨져 보이던 것.
|
|
63
|
+
- 백업 없는 패치를 되돌리는 안내가 판과 이름을 따옴표 밖에, 폴더 경로를 큰따옴표 안에 넣어 `$` 가 든 홈 폴더(PowerShell)에서 다른 경로가 되던 것. 이제 작은따옴표로 감싸고, 작은따옴표가 든 경로는 큰따옴표로, 둘 다 맞지 않으면 명령 없이 경로만 보인다.
|
|
64
|
+
- `/progress` 패널이 늦게 온 계획 읽기의 도착 순서에 따라 다른 계획을 보이던 것(검토 문서 둘을 나란히 쓰면 둘째 것이 보이는 등). 이제 읽기를 손댄 순서의 자리에 끼워, 손댄 순서대로 왔을 때와 같은 계획을 보인다. 끝내 오지 않는 읽기는 16개까지만 기다린다. 같은 닿음 뒤에 시작한 다시 읽기 둘(셸 명령으로 계획 파일을 고친 턴)은 늦게 와도 나중에 시작한 쪽이 남는다.
|
|
65
|
+
- `/progress` 패널이 TodoWrite 목록을 하나씩 지워 잘라, 2만 개에 3.7초 걸리던 것. 이제 결과가 같은 한 번 자르기다.
|
|
66
|
+
- 작업 id 에 제어 글자가 있거나 1만 자를 넘으면 엔진이 그 줄의 key 를 버리던 것. 이제 그런 id 는 엔진이 받는 key 로 바꾼다(보통 id 는 그대로 `k-<id>`). 작업 설명과 진행 문구는 패널이 읽는 4,096자까지만 상태에 둔다(5MB 설명을 그대로 두던 것).
|
|
67
|
+
- 엔진의 다시 그리기가 던지면 session.end, turn.start, turn.complete 아래의 훅이 돌지 않을 수 있던 것.
|
|
68
|
+
- `tone-compact`, `anti-drm` 의 잠금이 쓰기 실패 뒤, 그 사이 같은 inode 번호를 받은 다른 실행의 잠금을 지울 수 있던 것. 이제 이 실행의 토큰만 든 잠금만 지운다.
|
|
69
|
+
- 경로 표시가 글자 위나 둘레에 그리는 표지(취소선, 빗금, 동그라미)를 그대로 두어 `AGENTS.md` 가 다른 이름처럼 보일 수 있던 것. 분해된 이름에서 기호를 만드는 U+0338 은 그대로 둔다.
|
|
70
|
+
- 32MiB 를 넘는 AGENTS.md 를 읽어 같은 크기의 `.bak` 를 만들고, 2GiB 를 넘으면 오류로 멈추던 것. 이제 읽지 않고 `32MiB 보다 큰 파일이라 그대로 두었습니다` 로 거부하고 status 도 그렇게 알린다.
|
|
71
|
+
- `anti-drm on` 이 설정 자리가 폴더, FIFO, 64KiB 보다 큰 파일, 읽을 수 없는 파일일 때 설정을 다시 주라고 안내하던 것(다시 주어도 거부됨). 이제 옮기거나 권한을 고친 뒤 다시 실행하라고 한다.
|
|
72
|
+
- Windows 에서 `tone-compact`, `anti-drm` 이 규칙 파일이나 설정 파일 자리의 폴더로 가는 링크를 새 파일로 바꾸지 못하던 것(Windows 는 그런 링크 위로 이름을 바꾸지 않음). 이제 그 링크를 지운 뒤 바꿔 넣는다. 링크가 가리키던 폴더는 그대로다.
|
|
73
|
+
- `banker telemetry status` 가 시도 시각이 지금보다 뒤일 때, 하루가 안 된 마지막 체크가 확인을 쉬게 하는데도 다음 세션에 다시 시도한다고 하던 것. 이제 훅과 같은 규칙으로 말한다.
|
|
74
|
+
- `obsidizer` 가 fsync 를 받지 않는 파일 시스템(`EINVAL`, `ENOTSUP`)에서 실행 전체를 멈추던 것. 이제 그 쪽은 디스크로 내리기를 건너뛰고 rename 으로 통째 바꾼다.
|
|
75
|
+
- `motion-graphic-setup` 의 RHEL8 블록이 Node 22 원천(AppStream 22 스트림, NodeSource)을 둘 다 갖추지 못해도 배포판의 옛 `nodejs` 를 sudo 로 깔던 것.
|
|
76
|
+
- `setup-python` 의 PowerShell 블록이 uv 설치 스크립트의 실패(0 이 아닌 종료)를 알리지 않던 것.
|
|
77
|
+
- `vertical-pptx-setup` 의 업스트림 tarball 블록이 받기만 하고 풀기와 정리는 문장으로 남겨, 수백 MB 의 tarball 이 이름 모를 임시 폴더에 남던 것. 이제 블록 하나가 받기, 풀기, 추출, 정리까지 한다. 배포판 경로의 글롭(`$SP/*.rpm`)은 `find` 로 바꾼다(zsh 는 맞는 것이 없는 글롭에서 멈춘다).
|
|
78
|
+
- `setup-lsp` 의 Spring Boot LS 블록이 셸에 `set -euo pipefail` 과 EXIT trap 을 남겨, 같은 셸의 다음 실패가 셸을 끝내거나 셸이 끝날 때 다른 `T` 를 지우던 것. 이제 블록이 서브셸에서 돈다.
|
|
79
|
+
- `update-banker` 0단계가 `npm ping` 이 실패해도 이어서 `npm view` 로 또 기다리던 것. 이제 ping 이 0 일 때만 부른다.
|
|
80
|
+
- 유지보수자용: update-notify 의 FIFO 캐시 시험이 뒤의 체크인을 기다리지 않아 지연에 따라 실패하고, 이미 지운 임시 폴더를 되살리던 것.
|
|
81
|
+
|
|
82
|
+
## [0.20.4] - 2026-10-21
|
|
83
|
+
|
|
84
|
+
### Changed
|
|
85
|
+
- 유지보수자용: setup-omc-hud 와 payload-mon 의 링크 시험이 Windows 에서도 돈다(폴더는 정션, 파일 링크는 만들 수 있는 계정에서). 시험 빈틈 6묶음을 메운다.
|
|
86
|
+
- 유지보수자용: ralph-qa 3단계 검사기의 선형 시간 시험을 꼴마다 CPU 시간으로 재, 동시에 돌려도 흔들리지 않게 한다. scan 예외의 exit 2, 같은 폴더의 두 번째 시도, 상한의 생존 단언 같은 시험 빈틈을 메운다.
|
|
87
|
+
- 유지보수자용: 3d-intro 의 Sora 모의 시험 묶음과 특성 시험을 더하고, 복잡도 10 을 넘던 함수 13개를 동작 그대로 나눈다. 미리보기 확인 시험이 위쪽 폴더의 `node_modules/playwright` 에 걸리지 않게 한다.
|
|
88
|
+
- 유지보수자용: smoke 와 gen-skill-changes 시험의 npm 캐시와 로그를 임시 폴더로 둔다(실제 `~/.npm` 에 쓰지 않음). 지침 토글과 a4p 시험의 빈틈(남의 파일로 가는 규칙 링크, 바꿔치기 순서, Windows 의 링크 시험, 파이썬 3.9 바닥)을 메우고 50줄 넘는 시험 함수를 나눈다.
|
|
89
|
+
- 유지보수자용: lineage 의 `redact`, `render_markdown`, `render_rows`, `main` 을 동작 그대로 작은 함수로 나눈다(특성 시험 20개, 나누기 전 코드로 구한 골든 해시, 차등 비교). CPU 를 쓰는 lineage 시간 상한 시험 8개는 CPU 시간으로 재 부하에서 흔들리지 않게 하고, smoke 는 실패한 lineage 시험의 이름을 보인다. 캐시 읽기 64KiB 경계, LF 쓰기, 숫자 도구 이름의 시험 빈틈을 메운다.
|
|
90
|
+
- README 와 PRIVACY 에 오프라인 절을 둔다. 네트워크가 필요한 스킬과 네트워크 없이 끝나는 모습, 세션 시작 훅이 실패 뒤 하루 쉬는 것, 훅은 `HTTPS_PROXY` 를 따르지 않는다는 것을 적는다.
|
|
91
|
+
- 유지보수자용: smoke 에 오프라인 단언을 더한다. 내려받기 전 원천 확인, 파이프로 바로 실행 금지, 시간 제한과 정체 감지, 개인 임시 폴더, 확인 명령의 홈 폴더 실행과 머리만 받기, setup-mcp 오프라인 등록, audit-security 와 deep-research 의 결과 판정이다.
|
|
92
|
+
- 유지보수자용: 마지막 정리 묶음의 시험 빈틈을 메운다. setup-omc-hud 설치 스크립트의 갈래 다섯, omc-patch 의 검토자 변이 일곱, ralph-qa 프로브의 지킴 둘, lineage 의 나누기 뒤 지킬 것 다섯, smoke 의 airgap 단언 일곱(줄 이음 파이프, `env` 를 거친 셸, 맨 curl 주소, 원천 호스트마다 확인 등). progress-plan 시험의 날 숨은 글자를 이스케이프 꼴로, verify-intro 와 a4p 시험이 실제 HOME 에 쓰지 않게 한다. pwsh 를 부르는 시험은 임시 HOME 에서 텔레메트리와 업데이트 확인을 끄고 돌고(그 고정물을 지키는 시험 포함), omc-patch 시험은 개발자의 askpass 도우미를 부르지 않는다.
|
|
93
|
+
|
|
94
|
+
### Fixed
|
|
95
|
+
- `setup-omc-hud` 설치 스크립트가 이전 statusLine 명령을 알리는 줄에서 방향 제어 같은 보이지 않는 글자를 그대로 찍던 것. `?` 로 바꾼다.
|
|
96
|
+
- 설치 스크립트가 `settings.json` 을 제자리에 덮어써, 중간에 끊기면 반쯤 쓴 파일이 남을 수 있던 것. 이제 새 파일로 바꿔 넣는다(심볼릭 링크면 링크가 가리키는 파일). 새 파일로 바꿀 수 없는 파일, 하드 링크인 파일, 새 파일이면 소유자나 그룹이 바뀌는 파일은 전처럼 제자리에 쓴다. 디스크가 가득 차 새 파일을 쓰지 못하면 원래 파일을 그대로 둔다.
|
|
97
|
+
- 래퍼 v4 가 형제 파일 자리에 같은 이름의 폴더가 있으면 그것을 불러오려다 상태표시줄 대신 오류를 내던 것. 이제 일반 파일이 있는 자리를 쓴다.
|
|
98
|
+
- 다른 스크립트가 링크 경로로 래퍼 v4 를 불러오면 링크 옆의 로더를 찾지 못하던 것. 이제 설정 폴더의 `hud/` 도 찾는다.
|
|
99
|
+
- `CLAUDE_CONFIG_DIR` 가 상대경로면 래퍼의 계정 표시가 지금 작업 폴더 기준이던 것. 이제 Claude Code 를 시작한 폴더(statusline 입력의 `workspace.project_dir`) 기준으로 읽는다.
|
|
100
|
+
- `payload-mon` 이 모듈 사본을 쓰는 사이 사본 폴더가 링크로 바뀌면 그 너머에 쓰고도 성공이라 하던 것. 이제 거부하고 쓴 사본을 거둔다.
|
|
101
|
+
- `omc-patch` 되돌리기가 `scripts/` 없는 판 폴더나 객체인 고정 기록 `host` 에서 처리하지 못한 오류로 멈추던 것. 쓰기 전용 `hooks.json` 을 "쓰지 못함" 이라 하거나 그 되돌리기를 "완료" 라 하던 것도 고친다.
|
|
102
|
+
- `omc-patch` 되돌리기가 낡은 `.omcbak` 으로 새 원본을 덮던 것(같은 판 폴더에 새 원본이 깔린 뒤). 이제 알리고 그 파일을 실패로 세며, 적용은 백업을 지금 원본으로 바꾼다. 적용은 읽을 수 없는 백업이 있으면 그 파일을 패치하지 않고 `읽지 못함: <이름> 의 백업 (<코드>)` 으로 알린다(전에는 "쓰지 못함" 이라 했다).
|
|
103
|
+
- `omc-patch` 가 활성 판을 확인하지 못해 추정한 판에 적용하던 것과, 그때 `--check` 가 "모두 적용" 이라 하던 것. 이제 적용은 훅을 건드리기 전에 멈추고 `--check` 는 종료 1 이다.
|
|
104
|
+
- `omc-patch --check` 가 못 읽은 훅을 "다시 실행" 으로 안내하고 종료 0 이던 것(이제 종료 1). 못 읽거나 JSON 이 아닌 고정 기록에도 옛 URL 칸이 있다고 단정하던 것.
|
|
105
|
+
- `omc-patch` 출력에서 비밀번호에 날 `/` 가 든 URL 이 가려지지 않던 것과, 고정 해제 실패 줄에 사용자 이름이나 비밀번호 조각이 나오던 것. 이제 `//` 뒤 마지막 `@` 까지 가린다. 경로에 `@` 가 든 URL 은 호스트도 가려진다.
|
|
106
|
+
- 패치한 훅의 import 가 10초 시간 제한에 걸려도 아무 기록이 없던 것. 이제 훅의 stderr 에 한 줄 남긴다. 패치한 훅의 바이트가 바뀐다. 이미 패치한 훅은 그대로 `적용됨` 으로 보인다. 새 헬퍼는 되돌린 뒤 다시 적용하거나 새 OMC 판에 적용할 때 들어간다. stderr 를 읽는 쪽이 닫혀 그 줄을 쓰지 못해도 훅은 하던 일을 이어 가고 종료 코드는 그대로다.
|
|
107
|
+
- 고정 기록의 `version` 이 패치한 판이 아니던 것, 못 읽은 옛 기록의 하드 링크 다른 이름을 알리지 않던 것, 훅과 `hooks.json` 의 백업 자리가 일반 파일이 아닐 때(FIFO, 폴더) 백업 없이 "완료" 라 하던 것, 시험용 `OMC_PATCH_INSTALLED` 를 적용도 받던 것(이제 `--check` 만), 임시 파일과 기록 폴더가 만들 때 기본 권한이던 것.
|
|
108
|
+
- 인자 없는 적용의 판 전환 줄이 바꾸기 전 판을 잘못 적던 것, 마켓플레이스 폴더나 git 이 없어도 태그를 찾을 수 없다고 알리던 것, `installed_plugins.json` 의 거짓 값에서 이유 없이 멈추던 것.
|
|
109
|
+
- 손 복구 안내가 헬퍼 이름만 보고 무관한 파일에 덮어쓰라 하던 것. 이제 링크 너머 파일이 지금 이 도구가 만드는 패치본과 같을 때만 덮어쓰라 하고, 아니면 같지 않거나 읽어 확인할 수 없다고 알린다.
|
|
110
|
+
- `omc-patch` SKILL 의 PowerShell 블록이 Windows PowerShell 5.1 의 한글 사용자 폴더에서 깨지던 것, 다른 이름 찾기 안내가 범위 없이 찾던 것, 임시 tar 이름이 정해지지 않던 것, 홈 폴더가 링크면 다른 이름 찾기가 아무것도 찾지 못하던 것.
|
|
111
|
+
- `ralph-qa` 2단계가 목록 밖 자료를 외부 좌석에 싣던 길들. 관련 코드 범위에 출처 확인이 없던 것, 이름에 줄바꿈이 든 새 파일이 목록 비교를 통과하던 것, 사용자의 `diff.context`, `diff.interHunkContext`, `GIT_DIFF_OPTS` 가 문맥을 늘리던 것. 이제 관련 범위는 추적 파일이나 목록의 새 파일에서만 `=== <파일>:<시작>-<끝>` 머리 줄과 함께 떼고, 줄바꿈 든 이름에서 멈추며, 문맥은 3줄이다.
|
|
112
|
+
- `ralph-qa` 2단계에서 attributes 의 `diff` 속성이 바이너리 파일을 글로 펼치면 그 바이트가 나가던 것. 이제 diff 에 NUL 바이트가 있으면 붙이기 전에 멈춘다. `-diff`, `binary` 로 가려 둔 파일은 그대로 가려진다.
|
|
113
|
+
- `ralph-qa` 2단계가 split index 저장소의 `.git` 에 공유 인덱스 파일을 남기던 것.
|
|
114
|
+
- `ralph-qa` 3단계 검사기가 `*_FILE` 키가 앞에 있는 줄이나 `env`, `docker -e` 의 `KEY=값` 낱말 비밀번호를 놓치던 것(0.15.0 은 잡던 꼴 포함), SKILL 이 시키는 가림 `[REDACTED]` 를 다시 잡아 가림과 재검사가 끝나지 않던 것. 값에 붙은 가림은 계속 잡는다.
|
|
115
|
+
- `ralph-qa` 프로브가 TOML 따옴표 키의 이스케이프(`"sandbox\u005Fmode"`)를 풀지 않아 관리 파일의 거부와 MCP 끄기를 놓치던 것. 이제 그런 설정이면 codex 좌석을 세우지 않고, 끝까지 못 읽은 설정은 파일과 줄을 알린다. opencode 의 models.dev 사본이 비었을 때 그 까닭도 알린다.
|
|
116
|
+
- `ralph-qa` 의 gemini 기록 정리가 두 프로젝트 폴더가 같은 이름을 가진 사용자 기록 폴더를 지우던 것.
|
|
117
|
+
- `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 경로 꼴로도 찾는다.
|
|
118
|
+
- `ralph-qa` 의 PowerShell 2단계가 bash 와 달라 보낼 수 없던 것(`unsent.md`, 기준 파일, 닫는 표지, BOM 없는 쓰기, `[ ]` 든 경로의 `2>`, Windows PowerShell 5.1 의 UTF-16 err 파일). "보낼 diff 가 없다" 갈래에 따를 명령이 없던 것, 긴 목록과 따옴표로 찍힌 이름의 안내, 512 KiB 상한의 범위(나누기 전 전체)와 분할 절차, 출처 독립 좌석이 보내지 않은 새 파일 목록을 받지 못하던 것.
|
|
119
|
+
- `3d-intro-build` 에서 Sora 가 제출을 계속 429 로 거절하면 "요청 형식 오류(설정을 고침)" 로 알리고 서버의 `Retry-After` 를 무시하던 것. 이제 kind `rate`(만든 job 없음)로 멈추고, 기다림은 `Retry-After`(1초에서 10분)를 따른다. `Retry-After` 가 `maxRateWaitMs`(기본 120초)보다 길면 기다리지 않고 바로 `rate` 로 멈춘다(`err.retryAfterMs`).
|
|
120
|
+
- WAN 제출이 풀이 모르는 코드의 5xx 를 받으면 다른 키로 다시 제출하던 것(task 가 생겼다면 두 번 과금). 이제 `submit_unknown` 으로 멈춘다.
|
|
121
|
+
- 영상을 받는 도중이나 API 응답을 읽는 도중 연결이 끊기면, 다시 받지 않고 바로 실패하거나 빈 200 으로 보던 것. 이제 연결 오류로 보고 내려받기는 다시 받는다. 이미지 생성의 v1 응답이 끊기면 classic 경로로 다시 호출해 두 번 과금될 수 있던 것도 막는다.
|
|
122
|
+
- Azure 요청에 시간 제한이 없어 응답하지 않는 서버에 약 300초씩 매달리고, 폴링이 "30분" 이라면서 몇 시간을 기다릴 수 있던 것. 이제 요청마다 상한(API 120초, 내려받기 600초, 이미지 생성 300초)이 있고, WAN, Sora 폴링은 정한 시간에 끝나며 끝 문구는 실제로 폴링한 시간을 말한다.
|
|
123
|
+
- Node 22, 24 에서 `NODE_USE_ENV_PROXY=1` 이나 `--use-env-proxy` 를 켜면 이 기기의 `http://` 로 보내는 키가 env 프록시를 거쳐 평문으로 나가던 것. 이제 보내기 전에 막는다(`EPROXYKEY`). `NO_PROXY` 에 그 호스트나 `호스트:포트` 를 적으면 직접 보낸다. 영상 단계는 그런 WAN 항목을 건너뛰고, 모두 그렇거나 Sora endpoint 가 그렇다면 Sora 로 넘어가지 않고 `invalid_request` 로 멈춘다.
|
|
124
|
+
- `persistCreds` 가 키 파일의 주석, `export` 줄을 지우고 제자리에 써서, 중간에 끊기면 잘린 키 파일이 남을 수 있던 것. 이제 바꿀 이름의 줄만 바꾸거나 끝에 더하고(다른 인코딩의 글자와 줄마다의 줄 끝은 바이트 그대로), 새 파일로 통째 바꿔 써서 오류로 끊기면 원래 파일이 남는다. 하드 링크, 소유자가 다른 파일, 새 파일을 만들 수 없는 폴더의 파일은 전처럼 제자리에 쓴다. 홈 키 파일과 설정 파일의 링크는 가리키는 파일에 쓰고, 그 밖의 키 파일이 링크면(저장소가 함께 가져올 수 있는 프로젝트 키 파일) 쓰지 않는다. 폴더, 파이프, 빈 링크는 거부한다. `fsync` 를 못 하는 파일 시스템(EINVAL, ENOTSUP)에서도 새 파일로 바꿔 넣는다.
|
|
125
|
+
- 미리보기와 검토 서버가 보내는 사이 줄어든 파일의 연결을 열어 둬 브라우저가 기다리던 것, 검토 서버가 링크 검사와 열기 사이에 바뀐 경로의 파일을 보내던 것.
|
|
126
|
+
- 리다이렉트를 거부한 제출을 "연결이 끊겼다" 로 알리던 것, `prompts.md` 가 `createVideo` 를 직접 부르게 안내하던 것, 셋업 SKILL 의 설치 폴더 문장이 앞 절과 다르던 것, 비용 승인 안내가 키 소진만 말하던 것, FAILED task 재제출이 과금되지 않는다는 확인하지 못한 전제를 사실처럼 적던 것.
|
|
127
|
+
- 셋업 프리플라이트가 요청 시간 초과를 `(23)` 으로 찍던 것. 이제 `TimeoutError` 다.
|
|
128
|
+
- `/progress` 의 검토 문서(약한 계획)를 같은 문서의 늦게 온 옛 읽기나 다시 읽기가 새 글로 덮던 것(0.19.1 에서 생김). 없는 작업 id 를 읽을 때마다 쌓이던 표지는 1,000개까지만 둔다(패널의 작업 표지는 그대로). 작업 id 와 모르는 상태 이름이 정화 없이 그려져, `constructor` 같은 이름이 함수 글로 나오던 것.
|
|
129
|
+
- 텔레메트리의 응답 본문 수집이 한도를 1바이트 넘는 응답에서 결과를 두 번 넘기던 것.
|
|
130
|
+
- tone-compact, anti-drm 이 Codex 잠금 파일을 만든 뒤 쓰기나 닫기에서 네트워크 공유의 ESTALE 을 받으면 빈 잠금이 남아, 1분 동안 이 실행과 다른 실행, 다른 스킬이 "다른 banker 지침 작업이 끝나지 않아" 로 거부하던 것. 이제 그 잠금을 거두고, 거두지 못하면 ESTALE 을 알린다.
|
|
131
|
+
- 백업 자리(`<파일>.tone-compact.bak`, `<파일>.anti-drm.bak`)에 폴더가 있으면 Windows 는 "쓸 권한이 없어", POSIX 는 종료 2 의 "예기치 못한 오류" 로 끝나던 것. 이제 두 OS 모두 종료 1 과 "일반 파일이 아니라 그대로 두었습니다".
|
|
132
|
+
- anti-drm `on` 이 설정 파일 오류에 "config 로 다시 만드세요" 라 안내해 켜기를 두 번 하게 하던 것. 이제 금지 확장자와 대체 확장자를 `on` 에 함께 주라고 안내한다.
|
|
133
|
+
- `lineage` 3.0.9: `!` 명령 뒤 Claude Code 가 쓴 출력 턴을 "검토자가 뺀 사용자 입력 턴" WARN 에 세던 것. 이제 Claude Code 가 쓰는 두 꼴(`<bash-stdout>` 블록 뒤 `<bash-stderr>` 블록, 실패하면 `<bash-stderr>` 블록 하나)만 가리기 전 글로 보고 빼며, 그 밖의 사용자 글은 그대로 센다.
|
|
134
|
+
- `lineage` 가 3.0.8 에서 쪼갠 키를 이어 가리도록 바뀐 뒤에도 그 전에 만든 규칙 요약 캐시와 검토 결정 캐시를 다시 써, 키 조각이 새 페이지(`--rulebase` 페이지와 그 게이트 샘플, 기본 흐름의 검토자 요약)에 실리던 것. 요약기 버전이 4 가 되어 규칙 요약은 한 번 새로 만들고, 쪼갠 키가 든 턴은 한 번 다시 검토한다.
|
|
135
|
+
- `lineage` 페이지 제목(`<title>`, `<h1>`)의 방향 제어 글자가 날것으로 들어가던 것. 이제 본문처럼 `[U+202E]` 같은 표지로 넣는다.
|
|
136
|
+
- `lineage` SKILL 이 `--rulebase` 를 "2.x 동작" 이라 하고 비밀 없는 턴은 2.x 와 같다고 하던 것(검토자 패턴과 방향 제어 표지로 다를 수 있음), 묶음이 에이전트 이름과 세션 이름을 그대로 둔다고 하던 것(키워드를 가림), 출력 파일명이 비밀 모양 슬러그에서 sid 로 바뀌는 것을 적지 않던 것, 3.0.2 의 `.txt` 요약 캐시를 아직 읽는다고 하던 것.
|
|
137
|
+
- 네트워크가 없는 PC 에서 세션을 열 때마다 업데이트 확인과 체크인을 다시 시도하던 것. 이제 실패한 시각을 남기고 24시간 동안 다시 시도하지 않는다. `banker telemetry status` 는 마지막 시도와 실패를 보이고, 확인에 성공한 적이 없으면 "비교 불가 (확인에 성공한 적이 없어 최신 버전 정보 없음)" 라 한다. 캐시 파일이 `null` 이면 `telemetry status` 가 오류로 끝나던 것도 고친다.
|
|
138
|
+
- `update-banker` 가 레지스트리에 닿지 못해도 npm 캐시의 옛 판을 최신으로 읽던 것. 이제 먼저 `npm ping` 으로 보고, 닿지 못하면 어느 채널도 바꾸지 않고 멈춘다. `npm view` 는 재시도 대기(약 70초) 없이 끝난다. ping 에 답하지 않는 사내 미러는 빈 캐시로 한 번 더 묻는다. npm 명령은 홈 폴더에서 불러 지금 폴더에 있는 프로젝트의 `.npmrc`(레지스트리, 토큰)를 따르지 않는다.
|
|
139
|
+
- 설치 스크립트를 받아 셸로 바로 넘기던 곳(setup-node, setup-python, motion-graphic-setup, setup-sandbox)이 받기에 실패해도 종료 0 으로 성공처럼 보이던 것. 이제 개인 임시 폴더에 받고 받았을 때만 실행한다. setup-node 는 nvm 판을 알 수 없으면 멈추고, nvm 이 깔렸을 때만 셸 설정에 줄을 더한다.
|
|
140
|
+
- 내려받는 설치 스킬 17개와 `/banker:setup` 이 네트워크 없는 곳에서 명령마다 기다리던 것(npm 은 약 70초, curl 과 git 은 끝없이). 이제 먼저 원천에 10초 안에 닿는지 보고, 닿지 않으면 그 원천에서 받는 단계는 하지 않고 "오프라인이라 설치하지 않음" 으로 알린다. OS 패키지 관리자 단계는 자기 미러를 쓰므로 그대로 시도한다. npm 이 아직 없는 새 PC 는 오프라인이 아니라 확인하지 못한 것으로 본다. 사내 미러는 그 미러로 본다. npm 은 홈 폴더의 npm 설정(`npm ping` 에 답하지 않으면 그 스킬의 패키지를 빈 캐시로 한 번 더 물음), pip 은 자기 설정의 색인이고, 색인 주소의 사용자 정보(`사용자:토큰@`)는 떼고 묻는다. `/banker:setup` 의 확인은 알림으로만 쓰고, 건너뛸지는 각 스킬의 확인이 정한다. 남은 curl, wget, git clone 에는 시간 제한이 있고, 큰 파일은 총 시간 대신 정체를 감지해 느려도 받는 중이면 끊지 않는다.
|
|
141
|
+
- tmux, jdtls, Spring Boot LS, LibreOffice 를 정해진 `/tmp` 이름으로 받아, 다른 사용자가 먼저 둔 파일을 풀거나 root 로 빌드할 수 있던 것. 이제 개인 임시 폴더에 받는다. `plantuml.jar` 는 다 받았을 때만 그 이름을 얻어, 끊긴 조각이 설치된 것으로 보이지 않는다. setup-python 의 PowerShell 은 GUID 이름의 새 폴더에 받는다. vertical-pptx-setup 은 LibreOffice 자동화 프로파일도 개인 임시 폴더로 안내한다(짐작할 수 있는 `/tmp` 이름이면 남이 먼저 만든 프로파일로 돌 수 있음).
|
|
142
|
+
- setup-mcp 의 `npx -y` 서버가 네트워크 없는 곳에서 세션마다 약 70초 뒤 실패하던 것. 이제 오프라인 경로를 적는다. 판을 고정해 설치한 실행 파일을 직접 등록하고(같은 이름의 옛 등록은 먼저 지움), 네트워크 서비스인 서버(context7, fetch, tavily)는 등록하지 않는다.
|
|
143
|
+
- 3d-intro-setup, motion-graphic-setup 이 `ffmpeg-static` 을 오프라인 폴백으로 안내하던 것(npm 설치라 네트워크가 필요하다). 오프라인이면 미리 받아 둔 ffmpeg 를 `FFMPEG_PATH` 로 준다.
|
|
144
|
+
- motion-graphic 이 hyperframes 를 `npx` 로만 불러, 네트워크가 없으면 설치 확인이 약 70초 뒤 "미설치" 로 읽히던 것. 이제 전역 설치가 있으면 그것을 부르고, `npx` 는 네트워크 확인 뒤에만 쓴다. setup-stitch 는 Stitch 가 네트워크 없이 쓸 수 없는 원격 서비스라고 적는다.
|
|
145
|
+
- audit-security 가 네트워크 없이 돈 스캔(오류뿐인 JSON, 빈 결과)을 취약점 0건으로 셀 수 있던 것. 이제 출력이 JSON 이고 분석한 대상이 1개 이상일 때만 결과로 읽는다. 아니면 리포트 Unknown 에 "미커버(네트워크 없음 또는 대상 없음)" 와 종료 코드, stderr 첫 줄을 적는다. 오프라인 DB 로 돌리면 DB 의 기준일을 적는다.
|
|
146
|
+
- audit-security 가 도구 결과를 감사 대상 저장소 안의 `.audit/` 에 두라고 안내해, 저장소가 그 자리에 심은 링크를 따라 남의 파일을 덮을 수 있던 것. 이제 저장소 밖의 작업 폴더(`RESEARCH_DIR`, 없으면 개인 임시 폴더)에 두고 그 경로를 리포트에 적는다.
|
|
147
|
+
- deep-research 가 웹 도구가 모두 실패해도 출처 없는 보고서를 내던 것. 이제 "웹 조사 불가" 로 끝낸다. ultra-chain 은 그 단계를 skipped(네트워크 없음)로 남기고, 주장이 0개면 조사 게이트를 지나지 않는다. ultra-interview 도 검색 호출이 모두 실패하면 조사하지 못했다고 보고한다.
|
|
148
|
+
- `omc-patch` 의 인자 없는 적용이 연결만 받고 답하지 않는 origin(연결을 붙잡는 방화벽, TLS 블랙홀)에서 끝없이 멈추던 것. 이제 태그 받기를 120초에 끊고(받는 속도가 초당 1000바이트 밑으로 30초면 git 이 먼저 끊음) 자격 증명을 터미널에서 묻지 않는다. 태그가 없으면 받지 못한 까닭(시간 초과, git 의 오류 줄, 이 도구가 고정한 origin)을 함께 알린다. origin 에 사용자 정보가 있거나, git 의 오류 줄에 사용자 정보가 든 주소가 남거나(전역 `insteadOf` 가 더한 것), 프록시 주소의 사용자 정보에 날 `/` `?` `#` `\` 가 있으면 git 의 오류 문구는 싣지 않고 종료 코드만 알린다(그런 주소에서는 curl 이나 git 의 문구에 사용자 이름과 비밀번호 조각이 실릴 수 있음). 스킬은 `--no-update` 만 써 이 길을 지나지 않는다.
|
|
149
|
+
- `ralph-qa` 2단계의 관련 코드 범위가 추적한 링크, 목록에 적은 새 링크, 링크인 폴더 아래의 파일을 따라 저장소 밖 내용을 싣던 것. 이제 그런 파일에서는 떼지 않고 멈춘다. PowerShell 의 목록 확인이 `./` 로 시작하는 줄에서 멈추던 것(bash 는 통과)도 고친다.
|
|
150
|
+
- `ralph-qa` 의 gemini 기록 정리가 두 프로젝트 폴더가 같은 이름을 주장해 지우지 않은 기록 폴더를 알리지 않던 것. 이제 JSON 의 `skipped` 와 stderr 한 줄로 알린다.
|
|
151
|
+
- `ralph-qa` 프로브의 알림이 이스케이프 따옴표 키를 까닭으로 말하지 않던 것, models.dev 사본이 비었을 때 오프라인에서는 돌아오지 않는다는 것을 말하지 않던 것.
|
|
152
|
+
- `3d-intro-setup` 의 `.gitignore` 줄이 강제로 끊긴 쓰기가 남긴 키 사본(`.env.3d-intro.local.<hex>.tmp`)을 무시하지 못하던 것, 줄 끝 없는 마지막 줄에 붙어 그 줄의 규칙(예: `.env`)을 깨던 것. 이제 `.env.3d-intro.local*` 줄을 줄을 바꾼 뒤 더한다. `.gitignore` 나 프로젝트 키 파일이 링크면(저장소가 심은 링크로 그 저장소의 `.git/config` 같은 파일에 줄이 붙지 않게) 쓰지 않고 알린다.
|
|
153
|
+
- `pollVideo` 를 `intervalMs: 0` 과 `timeoutMs` 없이 부르면 서버에 묻지 않고 null 을 내던 것. 이제 마감 하한 120초로 묻는다. `pollVideo`, `wanPollTask` 가 보내기 전에 막힌 키(EINSECURE, EPROXYKEY)로 마감까지 헛 폴링하던 것도 이제 바로 끝낸다.
|
|
154
|
+
- 미리보기와 검토 서버가 NTFS 의 64비트 파일 ID 를 Number 로 견줘 다른 파일을 같다고 볼 수 있던 것. 이제 BigInt 로 견준다.
|
|
155
|
+
- `azFetch` 결과의 `error` 가 원래 오류 그대로라 키를 인용한 메시지(undici 의 머리 값 오류)를 호출자가 찍으면 키가 보이던 것. 이제 `name`, `code`, `cause.code` 만 담는다.
|
|
156
|
+
- 시계가 되돌려진 PC 에서 미래 시각의 업데이트 확인 기록이 그 시각까지 확인과 체크인을 멈추던 것. 이제 지금보다 뒤의 시각은 쉼으로 세지 않는다.
|
|
157
|
+
- 설치 스킬의 PyPI 확인(bash)이 색인 주소의 경로나 질의에 든 토큰을 curl 인자에 실어 같은 PC 의 다른 사용자가 `ps` 로 볼 수 있던 것. 이제 주소를 curl 의 표준 입력 설정으로 넘긴다. Windows PowerShell 의 확인은 사용자 정보를 뗀 주소를 `curl.exe` 인자로 준다. pip 이 설정을 읽지 못하면(pip 이 없거나 10 미만) 그렇게 알린다.
|
|
158
|
+
- 설치 스킬과 문서 스킬의 `python -c`, `python -m`, 표준 입력 스크립트가 지금 폴더를 import 경로 맨 앞에 둬, 남의 저장소 폴더에서 그 저장소의 `pip/`, `json.py`, `pptx.py` 를 사용자 권한으로 실행할 수 있던 것. 이제 홈 폴더에서 실행한다(읽는 파일은 절대 경로).
|
|
159
|
+
- audit-mock 이 작업 폴더로 감사 대상 저장소 안의 `.audit/` 를 안내하던 것(audit-security 와 같은 결함). 이제 저장소 밖의 작업 폴더를 쓴다.
|
|
160
|
+
- setup-lsp 의 Spring Boot LS 폴더 비우기가 zsh 에서 빈 폴더의 `*` 에 "no matches found" 로 멈추던 것.
|
|
161
|
+
- 내려받는 원천인데 설치 스킬의 확인 줄이 없던 넷(nvm 판 조회의 `api.github.com`, Spring Boot LS 의 VSIX 호스트 둘, RHEL 의 NodeSource 저장소)에 확인 줄을 더한다.
|
|
162
|
+
- `lineage` SKILL 이 "요약기를 고치면 캐시가 자동 무효화된다" 고 하던 것(요약기 버전을 올릴 때만 맞음). 이제 요약기나 가림을 바꾼 판은 `SUMMARIZER_VERSION` 을 올린다고 적는다.
|
|
163
|
+
|
|
164
|
+
## [0.20.3] - 2026-10-20
|
|
165
|
+
|
|
166
|
+
### Changed
|
|
167
|
+
- 유지보수자용: 시험 빈틈 9개(CRLF 설치본 재설치, 블록 정규식 동일성, BOM 이 붙은 `settings.json` 의 오류 위치 등)를 메운다.
|
|
168
|
+
|
|
169
|
+
### Fixed
|
|
170
|
+
- `claude-update-last` 의 `on`, `off` 가 BOM 으로 시작하는 래퍼를 "node --check 실패" 로 거부하던 것. 그 래퍼는 node 로 정상 실행된다.
|
|
171
|
+
- 래퍼 파일만 다른 폴더로 링크하면(dotfiles 등) 상태표시줄에 Node 오류만 나오던 것. 설치 스크립트는 로더(`omc-hud.mjs`)를 링크 옆에 쓰는데, 래퍼 v4 는 링크가 가리키는 파일 옆에서만 찾았다. 이제 두 자리를 모두 찾는다. `setup-omc-hud` 를 다시 설치하면 적용된다. 0.20.2 의 "링크 래퍼의 PL 칸" 고침은 로더도 링크가 가리키는 폴더에 있을 때만 효과가 있었다.
|
|
172
|
+
- `NODE_OPTIONS=--preserve-symlinks-main` 이면 링크한 래퍼에서 `PL:` 칸이 사라지는데 payload-mon `status` 는 켜짐이라 하던 것. 이것도 `setup-omc-hud` 를 다시 설치하면 적용된다.
|
|
173
|
+
- `setup-omc-hud` 의 렌더 확인이 상태표시줄 대신 Node 오류가 나올 때 `[..]` 와 Node 내부 머리글(`node:internal/...`)만 보이던 것. 이제 `[!!]` 와 `Error` 줄을 보인다. 상태표시줄 명령이 실패할 때도 `Error` 줄을 먼저 보인다.
|
|
174
|
+
- 렌더 확인이 OMC 가 입력 없이 아무것도 내지 않을 때와, 옛 판이 그리는데 설치한 판이 오류 없이 돌 때 "OMC 설치 탓" 으로 단정하던 것. 이제 `[..]` 로 본 것만 알린다.
|
|
175
|
+
- 렌더 확인이 PATH 앞쪽의 실행할 수 없는 `node` 파일을 골라 확인을 건너뛰던 것. 이제 셸처럼 다음 것을 쓴다. Windows 에서 `node.cmd` 만 있을 때 "node 없음" 으로 알리던 것도 고친다. 이제 Git Bash 가 그것을 돌리지 못한다고 알린다.
|
|
176
|
+
- 렌더 확인이 OMC 출력의 제어 글자(터미널 제어 순서 등)를 그대로 찍던 것. `?` 로 바꾼다.
|
|
177
|
+
- 짝 없는 payload-mon 표시 줄이 많이 든 큰 래퍼에서 설치 스크립트와 payload-mon 이 수십 초 걸리던 것(2MB 에 28초).
|
|
178
|
+
- 블록 안쪽을 손으로 고친 래퍼를 다시 설치할 때 백업 없이 바꾸던 것. 도구가 쓴 그대로의 블록만 다를 때만 백업을 건너뛴다.
|
|
179
|
+
- `payload-mon` 이 링크인 사본 폴더(`payload-mon/`) 너머에 모듈 사본을 쓰고 `off` 때 지우던 것. 이제 `on` 은 거부하고 이유를 알리며, `off` 는 그 안을 지우지 않고 그렇다고 알린다. `status` 도 `on` 을 권하는 대신 이유를 적는다.
|
|
180
|
+
|
|
181
|
+
## [0.20.2] - 2026-10-19
|
|
182
|
+
|
|
183
|
+
### Added
|
|
184
|
+
- `setup-omc-hud` 설치 스크립트가 끝에 상태표시줄 래퍼를 입력 없이 한 번 돌려, OMC 를 불러오는지와 어느 판이 그리는지 알린다(`Render check`). 새 OMC 판이 불러오기에 실패해 옛 판으로 넘어가면 그 이유와 함께 알린다. 네트워크는 쓰지 않고, 설치 결과(종료 코드)는 바꾸지 않는다.
|
|
185
|
+
|
|
186
|
+
### Changed
|
|
187
|
+
- 유지보수자용: payload-mon `status` 의 모듈 사본 없음 분기와 래퍼 v4 판별 꼴(주석의 `PL:` 글자)을 시험하고, 난수 대체 시험의 주석을 바로잡는다.
|
|
188
|
+
|
|
189
|
+
### Fixed
|
|
190
|
+
- `setup-omc-hud` 를 다시 설치할 때마다 래퍼와 `settings.json` 의 백업이 하나씩 쌓이던 것. payload-mon, claude-update-last 블록만 다른 래퍼와 바뀌는 내용이 없는 `settings.json` 은 이제 백업하지 않는다.
|
|
191
|
+
- `setup-omc-hud` 설치 스크립트가 빈 `settings.json` 을 "JSON 객체가 아님" 으로 거부하던 것. Claude Code 처럼 `{}` 로 읽는다.
|
|
192
|
+
- `setup-omc-hud` 설치 스크립트가 주석이나 끝 쉼표가 든 `settings.json` 을 거부할 때 이유를 말하지 않던 것. 이제 그 이유와, Claude Code 도 이 파일을 읽지 못한다는 것을 알린다. Node 가 위치를 알려 주면 줄과 칸도 적는다. 파일 내용은 출력에 넣지 않는다.
|
|
193
|
+
- `payload-mon` 의 `on`, `off` 가 BOM 으로 시작하는 래퍼를 "node --check 실패" 로 거부하던 것. 그 래퍼는 node 로 정상 실행된다.
|
|
194
|
+
- `payload-mon` 블록이 CRLF 래퍼에 LF 줄끝으로 들어가던 것. 이제 래퍼의 줄끝을 따른다. 편집기가 래퍼 전체를 CRLF 로 저장한 뒤 `status` 가 "켜짐이 불완전" 이라 하던 것도 고친다. Windows 에서 Git 기본 설정으로 받은 설치본이 이런 꼴일 수 있다.
|
|
195
|
+
- 래퍼 파일만 다른 폴더로 링크하면(dotfiles 등) 래퍼 v4 의 `PL:` 칸이 보이지 않는데 `on` 과 `status` 는 PL 칸을 안내하던 것. 모듈 사본을 링크가 가리키는 파일 옆에 둔다. 0.20.1 로 켠 이런 설치는 `status` 가 불완전으로 알리고, `on` 한 번으로 고쳐진다.
|
|
196
|
+
|
|
3
197
|
## [0.20.1] - 2026-10-19
|
|
4
198
|
|
|
5
199
|
### Changed
|
|
@@ -111,7 +305,7 @@
|
|
|
111
305
|
- `tone-compact`, `anti-drm`: 남은 잠금을 정리하다 네트워크 공유가 `ESTALE` 을 내면 이미 사라진 잠금으로 본다. 예전에는 종료 2 로 멈췄다.
|
|
112
306
|
- `/progress`: `/clear` 를 하면 패널이 바로 빈 목록을 그린다. 예전에는 다음 프롬프트까지 옛 단계가 남아 보였다.
|
|
113
307
|
- `/progress`: 계획을 건드린 뒤 검토 문서(약한 계획)를 건드리면, 두 읽기가 거꾸로 끝나도 계획이 그대로다. 세션이 읽기만 한 단계 없는 계획은 체크박스가 있는 검토 문서를 대신한다.
|
|
114
|
-
- `/progress`: 작업 도구 읽기(TaskGet, TaskList)가 겹쳐 돌아도 나중에 시작한 읽기가 이긴다. 작업이 없다는 TaskGet 과 작업을 뺀 TaskList(
|
|
308
|
+
- `/progress`: 작업 도구 읽기(TaskGet, TaskList)가 겹쳐 돌아도 나중에 시작한 읽기가 이긴다. 작업이 없다는 TaskGet 과 작업을 뺀 TaskList(패널에 없던 작업 포함)도 그렇다. 예전에는 늦게 끝난 옛 읽기가 지워진 작업을 되살릴 수 있었다.
|
|
115
309
|
|
|
116
310
|
## [0.19.0] - 2026-10-15
|
|
117
311
|
|
package/PRIVACY.md
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
이 문서는 두 개의 독립된 기능을 설명합니다.\
|
|
8
8
|
하나는 새 버전이 나왔을 때 알려주는 **업데이트 알림**이고, 다른 하나는 유지보수자가 사용량을 파악하기 위한 **익명 사용량 카운팅**입니다.\
|
|
9
|
-
두 기능 모두 기본값은 켜짐(default-on)이며,
|
|
9
|
+
두 기능 모두 기본값은 켜짐(default-on)이며, 따로 끌 수 있습니다.\
|
|
10
|
+
다만 사용량 체크인은 업데이트 확인과 함께 보내므로, 업데이트 알림을 끄면(`BANKER_NO_UPDATE_CHECK`) 체크인 전송도 멈춥니다. 그때 카운팅 기록은 이 기기에만 쌓이다가 5,000줄에서 멈춥니다.\
|
|
10
11
|
이 기능은 Claude Code 런타임에서만 동작합니다. Codex CLI는 샌드박스가 네트워크 접근을 차단하므로 알림과 카운팅 둘 다 동작하지 않습니다.
|
|
11
12
|
|
|
12
13
|
## 현재 상태
|
|
@@ -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
|
|
43
|
+
하루 1회(보내지 못한 날도 24시간 뒤에 다시 시도), 유지보수자가 운영하는 외부 엔드포인트(banker 패키지 밖에서 별도로 운영되는 serverless)로 익명 체크인을 전송합니다.\
|
|
42
44
|
플러그인은 기본 카운팅 엔드포인트(`banker.banker-plugins.workers.dev`)를 내장하므로, count-default-on 이라 설치 즉시 활성입니다.\
|
|
43
45
|
`BANKER_TELEMETRY_ENDPOINT` 환경변수로 자가호스팅 엔드포인트를 지정하거나 override 할 수 있습니다.
|
|
44
46
|
|
|
@@ -89,6 +91,14 @@ opt-out 하더라도 훅의 등록 자체는 남고, 각 스크립트 내부의
|
|
|
89
91
|
- 네트워크 조회·전송은 세션을 막지 않도록 분리 실행되며, 포그라운드 훅은 캐시 읽기만 하고 즉시 반환합니다.
|
|
90
92
|
- 어떤 네트워크 오류도 삼키며(fail-closed), 항상 정상 종료합니다.
|
|
91
93
|
|
|
94
|
+
## 네트워크 없는 곳(airgap)
|
|
95
|
+
|
|
96
|
+
- 업데이트 조회와 체크인은 세션 시작 뒤 따로 돌아 세션을 기다리게 하지 않습니다. 요청마다 무활동 10초, 전체 30초에서 끊습니다.
|
|
97
|
+
- 실패하면 실패한 시각(`triedAt`)만 이 기기의 `update-check.json` 에 남기고, 24시간 동안 다시 시도하지 않습니다. `banker telemetry status` 가 그 시각을 "마지막 시도" 로 보입니다.
|
|
98
|
+
- 처음부터 시도하지 않게 하려면 `BANKER_NO_UPDATE_CHECK=1` 을 둡니다. 업데이트 조회와 체크인 전송이 함께 멈춥니다.
|
|
99
|
+
- 훅은 `HTTPS_PROXY`, `HTTP_PROXY` 를 따르지 않습니다(Node 가 `NODE_USE_ENV_PROXY=1` 일 때만 따름). 프록시를 거쳐야만 밖에 닿는 망에서는 실패로 기록되고 24시간 쉽니다.
|
|
100
|
+
- 오프라인 설치와 네트워크가 필요한 스킬은 README 의 "오프라인에서 쓰기" 절에 있습니다.
|
|
101
|
+
|
|
92
102
|
## 법적 상태
|
|
93
103
|
|
|
94
104
|
**EU ePrivacy는 양면을 그대로 남깁니다.**
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
[](https://www.npmjs.com/package/@kaydash9999/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
12
|
- QA·보안 감사·문서·아키텍처·위키·미디어 작업과 의존성·개발환경(OS별) 설치를 아우르는 **스킬 63개 + 커맨드 2개**(총 65개 구성요소)
|
|
@@ -180,7 +180,7 @@ USER_RESOURCES 가이드의 공통 요소를 OS별·런타임별(Claude Code/Cod
|
|
|
180
180
|
| `setup-omc` | oh-my-claudecode(OMC) 설치·갱신 (Codex는 OMX) |
|
|
181
181
|
| `setup-harness-factory` | revfactory/harness 팀 아키텍처 팩토리 설치·구성·사용안내 (Codex=meta-harness) |
|
|
182
182
|
| `setup-playwright` | Playwright + headless 브라우저 (RHEL8/Rocky8·non-root·no-conda 폴백) |
|
|
183
|
-
| `setup-omc-hud` | omc_hud 상태표시줄(래퍼 v4). 스킬에 든 파일로 오프라인 설치, 모든 OS 같은
|
|
183
|
+
| `setup-omc-hud` | omc_hud 상태표시줄(래퍼 v4). 스킬에 든 파일로 오프라인 설치, 모든 OS 같은 명령, 설치 직후 렌더 확인 |
|
|
184
184
|
| `setup-insane-search` | insane-search 플러그인 설치 (Claude·Codex) |
|
|
185
185
|
| `setup-stitch` | Stitch 디자인 MCP 프록시 등록(RockyLinux8 proxy) |
|
|
186
186
|
| `docs-setup` | arch-diagram·pdf-vision-extract 의존성(pptx·pymupdf·plantuml) 설치 |
|
|
@@ -247,7 +247,7 @@ banker uninstall # 제거
|
|
|
247
247
|
| `setup-mcp` | `claude mcp add` (context7·seq-thinking·filesystem·git·fetch) | `[mcp_servers.*]` |
|
|
248
248
|
| `setup-lsp` | LSP MCP 등록 | `[mcp_servers.lsp_bridge]` |
|
|
249
249
|
| `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`) |
|
|
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`) |
|
|
251
251
|
| `setup-pwsh` | `env.CLAUDE_CODE_GIT_BASH_PATH` (병합) | — (네이티브 셸, 배선 불필요) |
|
|
252
252
|
| `setup-harness-factory` | `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` (env 영속) | — |
|
|
253
253
|
| `smart-compact` | `statusLine.command` 래핑 + `UserPromptSubmit` 훅 추가 (백업·멱등) | `~/.codex/` 대응 |
|
|
@@ -337,7 +337,7 @@ banker는 기본값(default-on)으로 두 가지를 합니다.\
|
|
|
337
337
|
끄기:
|
|
338
338
|
|
|
339
339
|
```bash
|
|
340
|
-
export BANKER_NO_UPDATE_CHECK=1 # 업데이트
|
|
340
|
+
export BANKER_NO_UPDATE_CHECK=1 # 업데이트 알림 끄기(체크인 전송도 함께 멈춤)
|
|
341
341
|
export BANKER_NO_TELEMETRY=1 # 사용량 카운팅만 끄기
|
|
342
342
|
```
|
|
343
343
|
|
|
@@ -357,6 +357,29 @@ Codex CLI는 샌드박스가 네트워크를 차단하므로 알림·카운팅
|
|
|
357
357
|
| <https://banker.banker-plugins.workers.dev/stats> | 집계 데이터 JSON |
|
|
358
358
|
| <https://banker.banker-plugins.workers.dev/health> | 헬스 체크 (`ok`) |
|
|
359
359
|
|
|
360
|
+
## 오프라인에서 쓰기
|
|
361
|
+
|
|
362
|
+
네트워크가 없는 곳에서도 banker 를 설치하고 쓸 수 있습니다.\
|
|
363
|
+
설치는 네트워크가 되는 곳에서 받은 묶음 하나로 끝납니다. banker 는 의존성이 없어 더 받을 것이 없습니다.
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
npm pack @kaydash9999/banker-plugins # 네트워크가 되는 곳에서. kaydash9999-banker-plugins-<판>.tgz 가 생김
|
|
367
|
+
npm i -g ./kaydash9999-banker-plugins-<판>.tgz # 옮긴 뒤
|
|
368
|
+
banker setup
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
- 세션 시작 훅의 업데이트 조회와 체크인은 따로 돌아 세션을 기다리게 하지 않습니다. 실패하면 24시간 동안 다시 시도하지 않고, 아예 시도하지 않게 하려면 `BANKER_NO_UPDATE_CHECK=1` 을 둡니다.
|
|
372
|
+
- 훅은 `HTTPS_PROXY`, `HTTP_PROXY` 를 따르지 않습니다(Node 가 `NODE_USE_ENV_PROXY=1` 일 때만 따름). 프록시를 거쳐야만 밖에 닿는 망에서는 훅의 확인이 실패로 기록됩니다(`banker telemetry status` 의 "마지막 시도").
|
|
373
|
+
- 네트워크가 필요한 스킬과 네트워크 없이 끝나는 모습
|
|
374
|
+
- 내려받는 설치 스킬(`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 이 유일한 원천이라 그 원천을 먼저 봅니다.
|
|
375
|
+
- `update-banker`: 레지스트리에 닿지 못하면 어느 채널도 바꾸지 않고 멈춥니다.
|
|
376
|
+
- `audit-security` 의 의존성 취약점 조회: 결과로 읽을 수 없는 도구는 0건이 아니라 "미커버" 로 적습니다.
|
|
377
|
+
- `deep-research`, 이를 부르는 `ultra-chain` 1단계, `ultra-interview` 의 조사: 웹 도구가 모두 실패하면 조사하지 못했다고 알립니다.
|
|
378
|
+
- `npx` 로 부르는 도구(`motion-graphic-make` 의 hyperframes 등): 전역 설치가 없으면 패키지를 받으려 해, 네트워크가 없으면 약 70초 뒤 실패합니다. 오프라인에서는 전역 설치한 실행 파일을 부릅니다.
|
|
379
|
+
- 유료 API 를 부르는 `3d-intro-build`(요청마다 시간 제한), `ralph-qa` 의 외부 좌석(codex, gemini, opencode, 좌석마다 600초)
|
|
380
|
+
- `vertical-pptx`, `pdf-vision-extract` 가 빠진 도구를 설치하라고 안내할 때, `nothing-design` 의 글꼴(Google Fonts. 받지 못하면 대체 글꼴로 보임)
|
|
381
|
+
- 네트워크를 쓰지 않는 스킬(예: `lineage`, `setup-omc-hud`, `tone-compact`, `anti-drm`, `payload-mon`)은 네트워크 없이 그대로 씁니다.
|
|
382
|
+
|
|
360
383
|
## 라이선스 / 서드파티
|
|
361
384
|
|
|
362
385
|
banker 자체는 **MIT** ([LICENSE](LICENSE)). Owner: [smallOpenSource](https://github.com/smallOpenSource).
|
package/bin/banker.js
CHANGED
|
@@ -26,6 +26,12 @@ function version() {
|
|
|
26
26
|
}
|
|
27
27
|
function log(...a) { console.log(...a); }
|
|
28
28
|
function warn(...a) { console.error(...a); }
|
|
29
|
+
// 캐시에 적힌 밀리초 시각의 ISO 글, 없거나 날짜로 바꿀 수 없으면(깨진 캐시) ''.
|
|
30
|
+
function isoTime(t) {
|
|
31
|
+
if (typeof t !== 'number' || !Number.isFinite(t)) return '';
|
|
32
|
+
const d = new Date(t);
|
|
33
|
+
return Number.isNaN(d.getTime()) ? '' : d.toISOString();
|
|
34
|
+
}
|
|
29
35
|
|
|
30
36
|
// GitHub 저장소에 별을 단다 (gh CLI 인증 사용). star 는 repo 쓰기 권한이 필요 없어 인증된 어느 계정으로도
|
|
31
37
|
// 가능하다. gh 미설치/미인증/실패는 {ok:false, reason} 로 반환해 호출부가 URL 안내로 폴백하게 한다.
|
|
@@ -311,52 +317,90 @@ const TELEMETRY_USAGE = `Usage: banker telemetry <on|off|status>
|
|
|
311
317
|
|
|
312
318
|
async function telemetryCmd(sub) {
|
|
313
319
|
const tc = await loadTelemetry();
|
|
314
|
-
if (sub === 'on' || sub === 'off')
|
|
315
|
-
const cfg = tc.readConfig();
|
|
316
|
-
if (sub === 'off') cfg.telemetry = false; // opt-out 저장
|
|
317
|
-
else delete cfg.telemetry; // opt-out 해제: 기본-on 으로 복귀
|
|
318
|
-
if (!tc.writeConfig(cfg)) {
|
|
319
|
-
warn('banker: 설정을 저장하지 못했습니다 (config 쓰기 실패).');
|
|
320
|
-
process.exitCode = 1;
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
if (sub === 'off') {
|
|
324
|
-
log('카운팅을 껐습니다 (off). config.telemetry=false 로 opt-out 을 저장했습니다.');
|
|
325
|
-
} else {
|
|
326
|
-
log('카운팅 opt-out 을 해제했습니다 (on). 기본값(켜짐)으로 복귀합니다.');
|
|
327
|
-
if (!tc.endpoint()) log('참고: 엔드포인트가 설정되어 있지 않아 지금은 아무것도 전송하지 않습니다.');
|
|
328
|
-
}
|
|
329
|
-
return;
|
|
330
|
-
}
|
|
320
|
+
if (sub === 'on' || sub === 'off') return telemetrySwitch(tc, sub);
|
|
331
321
|
if (sub === 'status') {
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
const envOptOut = !(v === undefined || v === '' || v === '0' || v === 'false');
|
|
335
|
-
const cfgOptOut = cfg.telemetry === false;
|
|
336
|
-
log('banker 상태:');
|
|
337
|
-
log('[카운팅] 익명 사용량 카운팅 (기본값: 켜짐 · count-default-on)');
|
|
338
|
-
log(` 엔드포인트 설정: ${tc.endpoint() != null ? '설정됨' : '미설정'}`);
|
|
339
|
-
log(` opt-out(BANKER_NO_TELEMETRY): ${envOptOut ? '적용됨' : '미적용'}`);
|
|
340
|
-
log(` opt-out(config.telemetry=false): ${cfgOptOut ? '적용됨' : '미적용'}`);
|
|
341
|
-
log(` 실효 상태(effective): ${tc.countingActive() ? 'enabled' : 'disabled'}`);
|
|
342
|
-
log(' 참고: 엔드포인트가 설정되어 있고 opt-out 이 아닐 때(env·config 둘 다 아님)만 실제로 전송됩니다.');
|
|
343
|
-
|
|
344
|
-
let cache = {};
|
|
345
|
-
try { cache = JSON.parse(tc.readRegular(tc.UPDATE_CHECK_PATH)); } catch { /* 캐시 없음/malformed/일반 파일 아님(FIFO 를 기다리지 않음) */ }
|
|
346
|
-
const installed = tc.installedVersion();
|
|
347
|
-
const cmp = (cache.latest && installed) ? tc.compareVersions(cache.latest, installed) : null;
|
|
348
|
-
log('[업데이트 체크] 새 버전 알림 (기본값: 켜짐)');
|
|
349
|
-
log(` opt-out(BANKER_NO_UPDATE_CHECK/config.updateCheck=false): ${tc.noUpdateCheck() ? '적용됨' : '미적용'}`);
|
|
350
|
-
log(` 마지막 체크: ${cache.checkedAt ? new Date(cache.checkedAt).toISOString() : '없음'}`);
|
|
351
|
-
log(` 캐시된 최신 버전: ${cache.latest || '없음'} / 설치된 버전: ${installed || '알 수 없음'}`);
|
|
352
|
-
log(cmp === null ? ' 비교 불가 (캐시 없음 또는 malformed)'
|
|
353
|
-
: cmp > 0 ? ` 업데이트 있음 (${installed} → ${cache.latest})`
|
|
354
|
-
: ' 최신 버전 사용 중');
|
|
322
|
+
printCountingStatus(tc);
|
|
323
|
+
printUpdateCheckStatus(tc);
|
|
355
324
|
return;
|
|
356
325
|
}
|
|
357
326
|
log(TELEMETRY_USAGE); // 알 수 없는 하위명령: 사용법 출력
|
|
358
327
|
}
|
|
359
328
|
|
|
329
|
+
// `telemetry on|off`: config 에 opt-out 을 저장하거나(off) 지워 기본값(켜짐)으로 돌아간다(on).
|
|
330
|
+
function telemetrySwitch(tc, sub) {
|
|
331
|
+
const cfg = tc.readConfig();
|
|
332
|
+
if (sub === 'off') cfg.telemetry = false; // opt-out 저장
|
|
333
|
+
else delete cfg.telemetry; // opt-out 해제: 기본-on 으로 복귀
|
|
334
|
+
if (!tc.writeConfig(cfg)) {
|
|
335
|
+
warn('banker: 설정을 저장하지 못했습니다 (config 쓰기 실패).');
|
|
336
|
+
process.exitCode = 1;
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
if (sub === 'off') {
|
|
340
|
+
log('카운팅을 껐습니다 (off). config.telemetry=false 로 opt-out 을 저장했습니다.');
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
log('카운팅 opt-out 을 해제했습니다 (on). 기본값(켜짐)으로 복귀합니다.');
|
|
344
|
+
if (!tc.endpoint()) log('참고: 엔드포인트가 설정되어 있지 않아 지금은 아무것도 전송하지 않습니다.');
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// `telemetry status` 의 카운팅 절: 엔드포인트, 두 opt-out, 그 결과.
|
|
348
|
+
function printCountingStatus(tc) {
|
|
349
|
+
const cfg = tc.readConfig();
|
|
350
|
+
const v = process.env.BANKER_NO_TELEMETRY;
|
|
351
|
+
const envOptOut = !(v === undefined || v === '' || v === '0' || v === 'false');
|
|
352
|
+
log('banker 상태:');
|
|
353
|
+
log('[카운팅] 익명 사용량 카운팅 (기본값: 켜짐 · count-default-on)');
|
|
354
|
+
log(` 엔드포인트 설정: ${tc.endpoint() != null ? '설정됨' : '미설정'}`);
|
|
355
|
+
log(` opt-out(BANKER_NO_TELEMETRY): ${envOptOut ? '적용됨' : '미적용'}`);
|
|
356
|
+
log(` opt-out(config.telemetry=false): ${cfg.telemetry === false ? '적용됨' : '미적용'}`);
|
|
357
|
+
log(` 실효 상태(effective): ${tc.countingActive() ? 'enabled' : 'disabled'}`);
|
|
358
|
+
log(' 참고: 엔드포인트가 설정되어 있고 opt-out 이 아닐 때(env·config 둘 다 아님)만 실제로 전송됩니다.');
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// `telemetry status` 의 업데이트 확인 절: opt-out, 마지막 확인과 실패한 시도, 캐시의 최신 버전과 설치 버전.
|
|
362
|
+
function printUpdateCheckStatus(tc) {
|
|
363
|
+
const cache = readUpdateCacheFile(tc);
|
|
364
|
+
const installed = tc.installedVersion();
|
|
365
|
+
log('[업데이트 체크] 새 버전 알림 (기본값: 켜짐)');
|
|
366
|
+
log(` opt-out(BANKER_NO_UPDATE_CHECK/config.updateCheck=false): ${tc.noUpdateCheck() ? '적용됨' : '미적용'}`);
|
|
367
|
+
printLastChecks(tc, cache);
|
|
368
|
+
log(` 캐시된 최신 버전: ${cache.latest || '없음'} / 설치된 버전: ${installed || '알 수 없음'}`);
|
|
369
|
+
log(versionVerdict(tc, cache, installed));
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// update-check 캐시 객체. 없음, malformed, 객체가 아닌 JSON, 일반 파일 아님(FIFO 를 기다리지 않음)은 {}.
|
|
373
|
+
function readUpdateCacheFile(tc) {
|
|
374
|
+
try {
|
|
375
|
+
const cache = JSON.parse(tc.readRegular(tc.UPDATE_CHECK_PATH));
|
|
376
|
+
return cache && typeof cache === 'object' && !Array.isArray(cache) ? cache : {};
|
|
377
|
+
} catch {
|
|
378
|
+
return {};
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// 마지막 확인 시각, 그리고 그 뒤에 실패한 시도가 있으면 그 시각과 다음 시도. 다음 시도는 훅이 쓰는 updateCheckDue 로
|
|
383
|
+
// 정한다: 지금보다 뒤의 시도 시각은 쉼으로 세지 않지만, 하루가 안 된 마지막 체크는 여전히 쉬게 한다.
|
|
384
|
+
function printLastChecks(tc, cache) {
|
|
385
|
+
log(` 마지막 체크: ${isoTime(cache.checkedAt) || '없음'}`);
|
|
386
|
+
if (isoTime(cache.triedAt) && !(cache.triedAt <= cache.checkedAt)) log(` 마지막 시도: ${isoTime(cache.triedAt)} (실패. ${nextTry(tc, cache)})`);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// 실패한 시도 뒤 다음 시도가 언제인지, 훅이 쓰는 updateCheckDue 와 같은 규칙으로.
|
|
390
|
+
function nextTry(tc, cache) {
|
|
391
|
+
if (!(cache.triedAt > Date.now())) return '그 뒤 24시간은 다시 시도하지 않습니다';
|
|
392
|
+
return tc.updateCheckDue(cache) ? '시각이 지금보다 뒤라 다음 세션 시작에 다시 시도합니다'
|
|
393
|
+
: '시각이 지금보다 뒤라 쉼으로 세지 않지만, 마지막 체크에서 24시간이 지나야 다시 시도합니다';
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// 캐시의 최신 버전과 설치 버전을 견준 한 줄.
|
|
397
|
+
function versionVerdict(tc, cache, installed) {
|
|
398
|
+
if (!cache.latest && Object.keys(cache).length) return ' 비교 불가 (확인에 성공한 적이 없어 최신 버전 정보 없음)';
|
|
399
|
+
const cmp = (cache.latest && installed) ? tc.compareVersions(cache.latest, installed) : null;
|
|
400
|
+
if (cmp === null) return ' 비교 불가 (캐시 없음 또는 malformed)';
|
|
401
|
+
return cmp > 0 ? ` 업데이트 있음 (${installed} → ${cache.latest})` : ' 최신 버전 사용 중';
|
|
402
|
+
}
|
|
403
|
+
|
|
360
404
|
const HELP = `banker v${version()} — install the banker plugin into Claude Code and/or Codex CLI
|
|
361
405
|
|
|
362
406
|
Usage:
|