@kaydash9999/banker-plugins 0.17.0 → 0.18.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.
@@ -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.17.0"
9
+ "version": "0.18.0"
10
10
  },
11
11
  "plugins": [
12
12
  {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "banker",
3
- "version": "0.17.0",
3
+ "version": "0.18.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,49 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.18.0] - 2026-10-14
4
+
5
+ ### Added
6
+ - `anti-drm` 스킬. 망분리 PC 의 DRM 이 암호화하는 확장자 대신 대체 확장자로 파일을 만들게 하는 규칙을 켜고 끈다. 기본 금지 확장자는 `.txt` `.pdf` `.ppt` `.pptx` `.doc` `.docx` `.hwp` `.hwpx` `.xls` `.xlsx` `.csv`, 대체 확장자는 `.md` `.html` `.tsv` 다.
7
+ - 인자는 `on`(기본), `off`, `status`, `config` 다. 처음 켤 때 금지 확장자, 대체 확장자, TSV 구분자(탭, 쉼표)를 묻고 `~/.config/banker/anti-drm.json` 에 둔다. 두 런타임이 이 설정을 함께 쓴다.
8
+ - 설정 파일은 64KiB 이하의 일반 파일만 읽는다. 소유자는 이 계정이나, root 만 쓸 수 있는 root 여야 한다. 목록은 각각 64개까지 받는다. 그 자리에 anti-drm 이 쓰지 않은 파일이 있으면 `anti-drm.json.bak` 에 한 번 남기고, 폴더, FIFO, 64KiB 를 넘거나 읽을 수 없는 파일은 덮어쓰지 않는다. 메시지의 경로에서 제어 문자와 서식 문자는 `?` 로 바꾼다.
9
+ - 규칙은 `tone-compact` 와 같은 자리에 둔다. Claude Code 는 `rules/banker-anti-drm.md`, Codex 는 AGENTS.md 의 `USER:OMX:POLICY` 블록이다.
10
+ - 금지 확장자 산출물을 요청받으면 암호화되면 다시 읽지 못한다는 것과 함께 둘 대체 확장자 원본은 DRM 이 보호하지 않는다는 것을 알리고, 확인받은 뒤 만든다. 원본은 대체 확장자로 함께 둔다.
11
+ - 이미 DRM 이 걸린 파일을 풀거나 변환하지 않고, 읽을 수 없으면 알리기만 한다(평문 사본을 요청하지 않음). 에이전트가 새로 만드는 파일의 확장자만 정하며 조직의 보안 규정이 우선한다. `.md` 와 `.json` 은 anti-drm 이 쓰는 형식이라 금지할 수 없다.
12
+
13
+ ### Changed
14
+ - banker 스킬의 작업 파일이 `.txt` 를 쓰지 않는다. DRM 이 `.txt` 를 암호화하는 PC 에서도 동작하도록 `.md` 로 바꿨다.
15
+ - `ralph-qa`: 임시 폴더의 파일 목록과 오류 출력
16
+ - `ultra-chain`: 기준선 `05-baseline.md`, 시험 출력 `qa/local-r<k>.md`, 대조 출력 `visual/compare-r<k>.md`. 이전에 시작한 실행 폴더의 `05-baseline.txt` 는 그대로 읽는다.
17
+ - `lineage` 3.0.3: 요약 캐시와 detect-secrets 검사용 임시 파일. 3.0.2 까지 쓴 `.txt` 캐시도 읽는다. detect-secrets 는 두 확장자를 같은 형식으로 검사한다.
18
+ - `3d-intro-build`: 결과물의 엔진 MIT 고지 `scrub-engine.LICENSE.md`
19
+ - `3d-intro-setup`: 콘솔 샘플 파일 `sample.md`
20
+ - `front-qa`: 기본 스펙 파일 `docs/note.md`. 없으면 `docs/note.txt` 를 읽는다.
21
+ - `tone-compact` 의 규칙 파일과 Codex 블록을 넣고 빼는 코드를 공통 모듈 `instruction-toggle.mjs` 로 옮겼다. `anti-drm` 이 같은 사본을 쓴다. 블록 안에 다른 관리 표시 줄이 있으면(손으로 짝을 다시 맞춘 경우) 넣고 빼기를 거부해 남의 글을 자르지 않는다. 메시지의 경로와 오류 문구에서 제어 문자와 서식 문자를 `?` 로 바꾼다. 출력과 동작은 그대로다. 다만 `AGENTS.override.md` 에 banker 블록만 있으면 내용이 없는 파일로 보고, 다른 banker 블록 때문에 Codex 가 AGENTS.md 를 읽지 않으면 상태와 `on` 결과에서 알린다.
22
+
23
+ ## [0.17.1] - 2026-10-14
24
+
25
+ ### Fixed
26
+ - `omc-patch` 의 `--revert` 가 헬퍼는 있는데 백업(`.omcbak`)이 없는 파일을 말없이 건너뛰던 것. 이제 `패치는 있는데 백업이 없어 되돌리지 못했습니다` 로 이름을 대고, 원본을 되찾는 방법을 보인다.
27
+ - `omc-patch` 가 헬퍼 이름만 있고 선언을 찾지 못한 파일, 선언이 첫 사용보다 뒤인 파일을 패치됨으로 보던 것. 둘 다 `헬퍼 자리 결함` 으로 센다. 선언이 뒤에 있으면 첫 사용이 먼저 돌아 ReferenceError 가 난다(끌어올려지는 function 선언은 제외).
28
+ - `omc-patch` 가 링크를 따라 플러그인 폴더 밖에 쓸 수 있던 것. 모든 모드에서 쓸 파일이 링크로 폴더 밖을 가리키거나 백업 자리가 링크면 쓰지 않고 실패로 센다. 그래서 되돌리기도 종료 코드 1 과 `되돌리기를 끝내지 못했습니다.` 로 끝날 수 있다. 되돌리기는 링크로 심은 hooks.json 수동 백업 후보도 쓰지 않는다.
29
+ - `omc-patch` 의 `--root` 가 다른 플러그인 폴더도 받던 것. 이름표(`.claude-plugin/plugin.json` 의 name, 없으면 `package.json` 의 name)가 OMC 가 아니면 멈춘다. 이름표가 없는 폴더는 통과한다.
30
+ - `omc-patch` 가 `--check` 와 `--revert` 를 함께 받으면 되돌리기로 파일을 쓰던 것. 이제 아무것도 하지 않고 종료 코드 1 로 멈춘다.
31
+ - `omc-patch` 의 git 호출이 셸의 `GIT_DIR` 같은 변수를 물려받던 것. git 훅처럼 그 변수를 내보낸 셸에서 부르면 마켓플레이스가 아니라 그 저장소의 origin 을 고정했다. 이제 git 이 다른 저장소로 옮겨 갈 때 지우는 변수(`git rev-parse --local-env-vars`)를 지우고 부른다.
32
+ - `omc-patch` 가 마켓플레이스의 `.git` 이 깨졌을 때(중단된 clone 등) 위쪽 저장소의 origin 을 고정하던 것. git 이 마켓플레이스 밖으로 올라가 dotfiles 로 관리하는 `~/.claude` 같은 저장소를 골랐다. 이제 마켓플레이스 바로 위 폴더를 `GIT_CEILING_DIRECTORIES` 로 막는다.
33
+ - `omc-patch` 의 되돌리기가 되돌리지 못한 것이 남아도 `되돌리기 완료.` 와 종료 코드 0 으로 끝나던 것. 백업이 없는 패치 파일, 손 수정, 되돌리지 못한 hooks.json(수동 백업이 여러 개이거나, 후보가 링크뿐일 때)을 세어 `되돌리기를 끝내지 못했습니다. 되돌리지 못한 것 N건.` 과 종료 코드 1 로 끝낸다. 끝 줄의 건수는 `실패 N건` 까지 링크로 같은 폴더를 가리키는 판 폴더가 여럿이어도 파일마다 한 번 센다. 링크라서 쓰지 않은 후보는 이름을 댄다.
34
+ - `omc-patch` 의 되돌리기가 hooks.json 에 PostToolUse 가 그대로인데도 수동 백업을 찾던 것. 후보가 하나면 지금 내용을 그 백업으로 덮어썼고, 여럿이면 되돌릴 것이 없는데도 경고를 냈다.
35
+ - `omc-patch` 의 되돌리기가 `PINNED` 내용이 `null` 이면 TypeError 로 멈추던 것.
36
+ - `omc-patch` 의 되돌리기가 origin 이 고정 상태가 아니면 `PINNED` 의 값으로 origin 을 쓰던 것. 다른 기기의 값은 쓰지 않는다고 알리면서도 썼고, host 가 없는 기록은 그 검사도 지나갔다. 원래 URL 은 고정한 origin(`omc-pinned://` 뒤)에 있으므로, 이제 거기서만 되돌리고 `PINNED` 는 기록으로만 본다.
37
+ - `omc-patch` 가 파일에서 읽은 값(`PINNED` 의 host, hooks.json 수동 백업과 훅 스크립트의 파일 이름, `--check` 가 보이는 origin)을 그대로 출력하던 것. 줄바꿈이 든 값이 도구가 낸 것 같은 `[!]` 줄을 만들 수 있었다. 이제 줄바꿈, 제어 문자, 글자 순서를 바꾸는 유니코드 서식 문자를 `?` 로 바꾼다.
38
+ - `update-banker` 가 적은 `claude plugin update` 옵션. Claude Code 2.1.296 의 help 에 맞춰 `--json`, `-y/--yes`, `--accept-command` 를 더하고 `--scope` 기본값을 auto-detect 로 고쳤다.
39
+
40
+ ### Changed
41
+ - `omc-patch` 의 안내 문구. 헬퍼 자리 결함에는 인자 없는 `--revert`(모든 판, 고정 해제) 대신 `--revert --root "<활성 폴더>"` 를 안내한다. `--no-update` 진단은 `인자 없이` 대신 `--check 없이 --no-update 로` 다시 실행하라고 안내한다. 그래서 스킬의 대체 규칙 두 개를 지웠다.
42
+ - `omc-patch` 도구의 함수를 나눠 함수 규칙(50줄, 복잡도 10)을 지킨다. npm 에 올라간 OMC 32개 판(4.14.0~5.7.1)에서 옛 도구와 진단, 패치 결과, 되돌리기, `--scan` 결과가 바이트까지 같다.
43
+ - 도구 머리 주석이 `--root` 를 활성 캐시 폴더에도 쓴다고 적고, 런처와 README 는 킷 배포 폴더에만 있다고 적는다.
44
+ - 이번 수정 뒤에도 npm 의 OMC 33개 판(4.14.0~5.7.2)에서 깨끗한 폴더의 진단, 적용, 재진단, `--scan`, 되돌리기 출력과 결과 파일이 0.17.0 의 도구와 바이트까지 같다. 패치하지 않은 파일 41,411개의 `--scan` 결과도 같다.
45
+ - `omc-patch` 시험이 개발자의 전역, 시스템 git 설정, 템플릿 훅, 셸의 저장소 변수(`GIT_DIR` 등)를 읽지 않는다. git 2.32 미만도 전역 설정을 읽지 않게 `HOME` 을 바꾼다. git 훅에서 시험을 돌려도 개발자의 저장소를 건드리지 않는다.
46
+
3
47
  ## [0.17.0] - 2026-10-14
4
48
 
5
49
  ### Fixed
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  [빠른 시작](#빠른-시작) · [워크플로 예시](#워크플로-사용-예시) · [구성](#구성) · [설치 상세](#설치-상세-npm--codex) · [설정 변경 지점](#설정-변경-지점-claude-code--codex) · [요구사항](#요구사항) · [업데이트 / 제거](#업데이트--제거) · [업데이트 확인](#업데이트-확인-및-사용량-카운팅) · [라이선스 / 서드파티](#라이선스--서드파티)
10
10
 
11
- banker는 QA·보안 감사·문서·아키텍처·위키·미디어 작업과 의존성·개발환경(OS별) 설치를 아우르는 **스킬 61개 + 커맨드 2개**(총 63개 구성요소)와 Claude Code 즉시 명령 `/graceful-pause`, `/progress` 를 묶은 Claude Code 플러그인입니다.\
11
+ banker는 QA·보안 감사·문서·아키텍처·위키·미디어 작업과 의존성·개발환경(OS별) 설치를 아우르는 **스킬 62개 + 커맨드 2개**(총 64개 구성요소)와 Claude Code 즉시 명령 `/graceful-pause`, `/progress` 를 묶은 Claude Code 플러그인입니다.\
12
12
  설치하면 스킬과 커맨드가 `/banker:<이름>` 네임스페이스로 노출됩니다.\
13
13
  이 저장소 자체가 Claude Code 마켓플레이스(`.claude-plugin/marketplace.json`)이자 플러그인(`.claude-plugin/plugin.json`, name `banker`)이며, 도구에 무관한 스킬은 Codex CLI에도 설치됩니다.
14
14
 
@@ -61,6 +61,7 @@ Claude Code는 `/banker:<이름>`, Codex는 `banker-<이름>` 으로 호출합
61
61
  | `/graceful-pause` | 작업 도중 방향을 바꾸거나 끼어들고 싶을 때 | 작업 중에 입력해도 바로 전달. 실행 중인 도구 호출이 끝나면 그 단계까지만 마무리하고 멈춘 뒤 지시를 기다림 (Claude Code) |
62
62
  | `/progress` | 지금 작업이 어디까지 왔는지 보고 싶을 때 | 진행 상황 패널을 켜고 끔. 세션이 쓰거나 읽은 계획 파일 전체가 위에 접고 펴는 목록으로, 할 일 목록(없으면 요청)과 그 도구 호출이 아래에 보임. 화살표나 제목을 누르면 펼쳐짐 (Claude Code) |
63
63
  | `tone-compact` | 답변을 짧은 한글 개조식으로 받고 싶을 때 | 문체 규칙을 켜 두면 끌 때까지 모든 세션에 적용 |
64
+ | `anti-drm` | 망분리 PC 의 DRM 이 `.txt`, `.csv` 같은 파일을 암호화해 에이전트가 읽지 못할 때 | 금지 확장자 대신 `.md`, `.html`, `.tsv` 로 만들게 하는 규칙을 켜 두면 끌 때까지 모든 세션에 적용 |
64
65
  | `omc-patch` | OMC 자동 업데이트 뒤 훅이 느려지거나 훅 프로세스가 쌓일 때, project-memory 가 안 될 때 | 사라진 훅 패치를 다시 적용하고 OMC 자동 업데이트를 고정 |
65
66
  | `remains` | 작업 뒤에 남은 버그, 하자, 미검증 항목을 한눈에 보고 싶을 때 | 남은 항목을 표로 정리하고, 등록한 테스트박스에서 시험까지 돌림 |
66
67
  | `trouble-shooting` | 문제가 생겨 원인과 해결방법을 정리해야 할 때 | 현상, 문제점, 원인, 해결방법, 조치계획을 표로 간결히 보고(`--no-plan` 은 해결방법까지) |
@@ -135,6 +136,7 @@ Claude Code 2.1.296 은 Claude 5 모델(Opus 5.5 등)에 작업 목록 도구(Ta
135
136
  | `cleansing-memory` | 메모리 파일을 문서화된 threshold 내로 정리(중복 최신본화·무손실 압축) |
136
137
  | `payload-mon` | 상태표시줄 ctx 옆에 요청 payload 추정치(32MB 한도 대비, 8MB부터) 표시 켜기·끄기 |
137
138
  | `tone-compact` | 답변과 새 문서를 ASD-STE100 기반 한글 개조식(표·목록·원어 발음 표기·장식 기호 금지)으로 쓰는 문체 규칙 켜기·끄기(on 기본, 끌 때까지 유지) |
139
+ | `anti-drm` | DRM 이 암호화하는 확장자(기본 11개: 텍스트·오피스·한글·PDF·CSV) 대신 대체 확장자(`.md`·`.html`·`.tsv`)로 파일을 만들게 하는 규칙 켜기·끄기(on 기본, 처음 켤 때 금지 확장자와 대체 확장자를 물음, `config` 로 변경, 끌 때까지 유지) |
138
140
  | `omc-patch` | OMC 자동 업데이트 뒤 사라진 훅 패치를 재적용하고 OMC 마켓플레이스 자동 업데이트를 고정(진단·확인·적용·검증·되돌리기). 옛 킷이 블록 안에 넣은 헬퍼(project-memory 꺼짐)를 찾아 고치고, project-memory 훅이 실제로 일하는지 임시 폴더에서 확인 |
139
141
  | `remains` | 남은 버그, 하자, 미검증 항목을 찾아 표로 보여 줌. 테스트박스(`~/.config/banker/test-boxes.json`)가 등록돼 있으면 각 OS 에서 시험을 돌려 확인(읽기와 시험만, 고치지 않음) |
140
142
  | `trouble-shooting` | 문제를 조사해 현상, 문제점, 원인, 해결방법, 조치계획을 표 하나로 간결히 보고(문제마다 한 행, `--no-plan` 은 해결방법까지, 고치지 않고 보고만) |
@@ -195,7 +197,7 @@ banker uninstall # 제거
195
197
 
196
198
  - `--scope project` 로 프로젝트 로컬(`./.codex`)에 설치하고, `--dry-run` 으로 미리 볼 수 있습니다.
197
199
  - non-root 전용입니다(전역 sudo 설치 시 root 소유 파일을 방지). postinstall이 없으므로 `banker setup` 을 직접 실행합니다.
198
- - Codex에는 스킬 61개가 `~/.codex/skills/banker-<name>/` 에, 커맨드 2개가 `~/.codex/prompts/banker-<name>.md` 에 설치됩니다(`codex/manifest.json`). \
200
+ - Codex에는 스킬 62개가 `~/.codex/skills/banker-<name>/` 에, 커맨드 2개가 `~/.codex/prompts/banker-<name>.md` 에 설치됩니다(`codex/manifest.json`). \
199
201
  디렉터리명과 일치하도록 프론트매터 `name:` 이 `banker-<name>` 으로 재작성되어 Codex가 `banker-<name>` 으로 인식합니다.
200
202
  - OMC/Claude 에 결합됐던 오케스트레이터·설치·유틸 표면(all-in-one·ultra-chain·ultra-init·front-qa·setup·setup-omc·setup-omc-hud·setup-stitch·omc-reference·compact-copy)은 본문이 **런타임 인식**이라 Codex에서도 동작합니다.
201
203
  - `payload-mon` 은 Codex에서 실행해도 같은 머신의 Claude Code HUD 래퍼만 켜고 끕니다. \
@@ -204,7 +206,7 @@ banker uninstall # 제거
204
206
  - Codex에선 OMC 대신 **oh-my-codex(OMX)** 의 동명 스킬(ralplan·ralph·ultraqa·hud 등)과 `codex mcp`·내장 `/copy` 를 사용합니다(Codex는 `omx setup` 전제).
205
207
  - OMC 5 는 `ultraqa` 를 삭제했습니다. 그래서 Claude Code 의 `all-in-one`·`ultra-init` QA 게이트는 `verify` 순환으로 돌고, Codex 는 OMX `ultraqa` 를 그대로 씁니다.
206
208
  - 설치기는 `~/.codex/AGENTS.md` 를 건드리지 않습니다(omx가 재생성하므로 `~/.codex/skills/` 자동 검색에 의존). \
207
- 예외는 사용자가 켠 `tone-compact` 하나입니다. 그 파일 끝에 `USER:OMX:POLICY` 로 감싼 블록 1개를 넣고, `off` 로 뺍니다. \
209
+ 예외는 사용자가 켠 `tone-compact` 와 `anti-drm` 입니다. 각각 그 파일 끝에 `USER:OMX:POLICY` 로 감싼 블록 1개를 넣고, `off` 로 뺍니다. \
208
210
  `omx setup --merge-agents` 와 기본 `omx setup` 은 이 블록을 남깁니다. `--force` 나 team 모드를 끈 `omx setup` 처럼 AGENTS.md 를 새로 만들면 사라지므로, 그 뒤 `on` 을 다시 실행합니다.
209
211
 
210
212
  ## 설정 변경 지점 (Claude Code · Codex)
@@ -243,6 +245,7 @@ banker uninstall # 제거
243
245
  | `smart-compact` | `statusLine.command` 래핑 + `UserPromptSubmit` 훅 추가 (백업·멱등) | `~/.codex/` 대응 |
244
246
  | `payload-mon` | `hud/omc-hud-custom.mjs` 에 표시 블록 1개 삽입(`.payload-mon.bak` 백업·멱등·`node --check` 검증) + 래퍼 옆 `hud/payload-mon/` 에 모듈 사본 (`off` 로 원복) | — (Codex에서 실행해도 Claude Code HUD 만 다룸) |
245
247
  | `tone-compact` | `rules/banker-tone-compact.md` 생성 (`off` 로 삭제) | `AGENTS.md`(내용이 있는 `AGENTS.override.md` 우선) 끝에 `USER:OMX:POLICY` 로 감싼 블록 1개(`.tone-compact.bak` 백업·멱등, `off` 로 원복) |
248
+ | `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` 로 원복) |
246
249
  | `omc-patch` | 활성 OMC 버전의 `scripts/*.mjs` 와 `hooks/hooks.json` 수정(`.omcbak` 백업, `PostToolUse` 훅 제거) + OMC 마켓플레이스 `origin` 을 `omc-pinned://` 로 고정(기록 `~/.claude/omc-local-patches/PINNED`, `revert` 로 원복). 헬퍼 자리 결함은 활성 폴더만 되돌린 뒤 다시 패치. project-memory 확인은 임시 폴더에서만 하고 끝나면 지움 | — (Codex에서 실행해도 Claude Code 의 OMC 캐시만 다룸) |
247
250
  | `remains` | 설정 파일 미변경. `~/.config/banker/test-boxes.json` 은 읽기만 함(사용자가 만들거나, 사용자가 준 정보로 확인받고 만듦). 처음 접속하는 박스의 호스트 키가 `~/.ssh/known_hosts` 에 더해짐. 테스트박스에는 임시 폴더를 만들고 끝나면 지움(시간 초과나 중단 때는 시작한 프로세스를 먼저 끝냄, 못 지우면 결과에 표시) | 동일 |
248
251
  | `motion-graphic-setup` | 설정 파일 미패치 (Node/ffmpeg 확보 + `npx hyperframes` 설치만) | 동일 (`config.toml` 미변경) |
@@ -301,6 +304,10 @@ Codex는 재설치할 때마다 기존 `banker-*` 를 먼저 정리하므로 옛
301
304
  > 규칙 파일과 블록은 플러그인 밖(`~/.claude/rules/`, `~/.codex/AGENTS.md`)에 있어서, 플러그인을 지워도 남아 계속 적용됩니다.\
302
305
  > 이미 지웠다면 `~/.claude/rules/banker-tone-compact.md` 를 지우고, AGENTS.md 에서 `<!-- banker:tone-compact:start -->` 부터 `<!-- banker:tone-compact:end -->` 까지와 그 바깥의 `USER:OMX:POLICY` 표시 두 줄을 지우면 됩니다.
303
306
 
307
+ > `anti-drm` 을 켰다면 제거 전에 런타임마다 `off` 를 실행하세요(Claude Code `/banker:anti-drm off`, Codex `banker-anti-drm` 에 `off`).\
308
+ > 규칙 파일과 블록은 플러그인 밖에 있어서, 플러그인을 지워도 남아 계속 적용됩니다.\
309
+ > 이미 지웠다면 `~/.claude/rules/banker-anti-drm.md` 를 지우고, AGENTS.md 에서 `<!-- banker:anti-drm:start -->` 부터 `<!-- banker:anti-drm:end -->` 까지와 그 바깥의 `USER:OMX:POLICY` 표시 두 줄을 지우면 됩니다. 설정 파일 `~/.config/banker/anti-drm.json` 과, 있으면 옆의 `anti-drm.json.bak` 도 지우세요.
310
+
304
311
  > `omc-patch` 를 적용했다면 제거 전에 `/banker:omc-patch revert`(Codex는 `banker-omc-patch` 에 `revert`)를 실행하세요.\
305
312
  > 훅 패치와 마켓플레이스 고정은 플러그인 밖(`~/.claude/plugins/`)에 있어서, 플러그인을 지워도 남고 OMC 도 계속 자동 업데이트되지 않습니다.\
306
313
  > 이미 지웠다면 `~/.claude/plugins/marketplaces/omc` 의 origin 에서 `omc-pinned://` 를 뗀 주소로 `git remote set-url origin <주소>` 를 실행하고, 활성 버전 폴더의 `scripts/*.mjs.omcbak` 과 `hooks/hooks.json.omcbak` 을 원래 이름으로 되돌린 뒤 `~/.claude/omc-local-patches/PINNED` 를 지우면 됩니다.
@@ -65,11 +65,12 @@
65
65
  { "name": "3d-intro-setup", "type": "skill", "target": "both", "reason": "collects Azure creds (direct or console-sample parse) to untracked env + FREE preflight; installs Node/ffmpeg; runtime-agnostic", "supportingFiles": ["references/azure-adapter.mjs", "references/video-pool.mjs"] },
66
66
  { "name": "3d-intro-build", "type": "skill", "target": "both", "reason": "scroll-scrub 3D intro: gpt-image stills, WAN key pool video with Sora-2 fallback (forward-chaining, or the optional hold-and-flight mode), a review page for every paid stage, a page with no inline script or style (strict CSP), optional scene-by-scene navigation and glass panel, and a Playwright measurement for the independent check; vendored scroll-world engine (MIT) left unmodified; cross-platform Node", "supportingFiles": ["references/azure-adapter.mjs", "references/video-pool.mjs", "references/scrub-engine.js", "references/index-template.html", "references/prompts.md", "references/LICENSE", "references/NOTICE.md", "references/preview-lib.mjs", "references/serve.mjs", "references/assemble.mjs", "references/curate.mjs", "references/intro-fixes.css", "references/panel-glass.css", "references/step-nav.js", "references/step-nav.css", "references/verify-intro.mjs", "references/verify.md"], "caveat": "the independent check (verify-intro.mjs) needs Node Playwright with Chromium (setup-playwright); the hold-and-flight mode needs WAN keys and is not yet confirmed by a paid smoke" },
67
67
  { "name": "payload-mon", "type": "skill", "target": "both", "reason": "toggles an estimated API request payload segment (bytes against Claude Code's 32MB request limit) in the OMC custom HUD statusline, beside ctx; pure Node, no deps", "supportingFiles": ["scripts/payload-mon.mjs", "scripts/payload-size.mjs"], "caveat": "measures Claude Code sessions only (the 32MB limit and the transcript format are Claude Code's); run from Codex it still manages the same machine's Claude Code HUD wrapper but never measures Codex's own requests. Needs the OMC custom HUD wrapper (setup-omc-hud); the wrapper imports a module copy kept beside it because plugin install paths are versioned and retired on update" },
68
- { "name": "tone-compact", "type": "skill", "target": "both", "reason": "turns compact Korean writing rules (ASD-STE100 based: lists and tables, transliterated terms, no decorative symbols) on or off across sessions; pure Node, no deps", "supportingFiles": ["scripts/tone-compact.mjs"], "caveat": "per runtime: Claude Code gets <config>/rules/banker-tone-compact.md; Codex gets one marked block at the end of $CODEX_HOME/AGENTS.override.md (when it has content of its own) or AGENTS.md, wrapped in USER:OMX:POLICY so omx setup --merge-agents and a plain omx setup with team mode on keep it (--force, a confirmed overwrite or a plain omx setup with team mode off replace the file; run on again). Turning it on in one runtime leaves the other as it is" },
68
+ { "name": "tone-compact", "type": "skill", "target": "both", "reason": "turns compact Korean writing rules (ASD-STE100 based: lists and tables, transliterated terms, no decorative symbols) on or off across sessions; pure Node, no deps", "supportingFiles": ["scripts/tone-compact.mjs", "scripts/instruction-toggle.mjs"], "caveat": "per runtime: Claude Code gets <config>/rules/banker-tone-compact.md; Codex gets one marked block at the end of $CODEX_HOME/AGENTS.override.md (when it has content of its own) or AGENTS.md, wrapped in USER:OMX:POLICY so omx setup --merge-agents and a plain omx setup with team mode on keep it (--force, a confirmed overwrite or a plain omx setup with team mode off replace the file; run on again). Turning it on in one runtime leaves the other as it is" },
69
69
  { "name": "omc-patch", "type": "skill", "target": "both", "reason": "re-applies local OMC hook patches after an OMC auto-update and pins the OMC marketplace origin; finds a timeout helper an older kit left inside a block (hooks such as project-memory silently off) and fixes it by reverting the active folder and patching again; probes the project-memory hook in a scratch project; pure Node, no deps", "supportingFiles": ["scripts/omc-patch.mjs", "scripts/probe-pm.mjs"], "caveat": "acts on the Claude Code OMC plugin cache under ~/.claude even when run from Codex; TARGET_VERSION 5.7.0 is hard-coded in the tool and only a plain apply uses it; the skill passes --no-update on every apply and check; --root touches one plugin folder only and never the marketplace pin" },
70
70
  { "name": "remains", "type": "skill", "target": "both", "reason": "finds remaining bugs, defects and unverified items and shows them in one table; runs the project's tests on registered SSH test boxes; pure Node, no deps", "supportingFiles": ["scripts/boxes.mjs"], "caveat": "box runs need ssh, scp and git on this machine and key-only SSH logins; boxes are registered in ~/.config/banker/test-boxes.json; read and test only, never fixes or pushes" },
71
71
  { "name": "trouble-shooting", "type": "skill", "target": "both", "reason": "investigates a problem and reports symptom, problem, cause, fix and action plan in one table, one row per problem; --no-plan stops at the fix; report only, never fixes", "supportingFiles": [] },
72
72
  { "name": "ultra-chain", "type": "skill", "target": "both", "reason": "orchestrates nine stages in order: deep-research, ultra-interview, ralplan --deliberate followed by a ralph-qa plan quorum of 3+ reviewers (ralplan has two reviewers and no way to add more), a mock the user approves, ralph --critic=critic (Codex: OMX ralph plus a critic loop, since OMX ralph has no --critic), tests on the registered OS boxes fed to a ralph-qa quorum, visual review (machine diff against the mock, screenshots, an independent verdict), a process report rendered from its own ledger, and local sharing; Claude=OMC 5, Codex=OMX; body runtime-aware; pure Node helpers, no deps", "supportingFiles": ["references/chain-ledger.mjs", "references/chain-report.mjs", "references/capture.mjs", "references/serve.mjs", "references/preview-lib.mjs"], "caveat": "uses the sibling banker skills deep-research, ultra-interview, ralph-qa and remains (boxes.mjs); box runs need ssh, scp and git with key-only logins in ~/.config/banker/test-boxes.json; screenshots need Playwright with Chromium; serve.mjs and preview-lib.mjs are byte-identical copies of 3d-intro-build's (scripts/sync-adapter.js); never pushes, opens a PR or posts outside without an explicit request" },
73
+ { "name": "anti-drm", "type": "skill", "target": "both", "reason": "turns on or off rules that steer the agent away from the file extensions a network-separated PC's DRM encrypts (default .txt .pdf .ppt .pptx .doc .docx .hwp .hwpx .xls .xlsx .csv) toward replacements (.md .html .tsv); asks the extensions on first use and keeps them in ~/.config/banker/anti-drm.json; pure Node, no deps", "supportingFiles": ["scripts/anti-drm.mjs", "scripts/instruction-toggle.mjs"], "caveat": "the same places as tone-compact (shared module instruction-toggle.mjs): Claude Code gets <config>/rules/banker-anti-drm.md; Codex gets one marked block wrapped in USER:OMX:POLICY at the end of AGENTS.md, or AGENTS.override.md when it has content of its own. The settings are shared by both runtimes; on and off act on one runtime, while config and on with settings refresh every runtime that holds the rules. It never decrypts or converts files DRM already protects; it only picks the extensions of files the agent newly creates. The organization's security rules come first" },
73
74
 
74
75
  { "name": "front-qa", "type": "command", "target": "both", "reason": "ralplan->ralph frontend-QA pipeline; Claude=OMC, Codex=OMX", "supportingFiles": [] },
75
76
  { "name": "setup", "type": "command", "target": "both", "reason": "installer orchestrator; Claude AskUserQuestion multi-select, Codex prompt-based selection", "supportingFiles": [] }
@@ -7,7 +7,7 @@ The generator (`banker setup --codex`) applies the rules below for `target: both
7
7
  |---|---|---|
8
8
  | `skills/<name>/SKILL.md` (+ subtree) | `~/.codex/skills/banker-<name>/` (whole dir) | **COPY subtree** (Windows: no symlink), then **rewrite the frontmatter `name:` to `banker-<name>`**. Codex discovers skills by directory and requires `name:` == directory name, so the prefix must be applied to both (leaving `name: <name>` while the dir is `banker-<name>` makes Codex skip the skill). `description` is left as-is. |
9
9
  | `commands/<name>.md` | `~/.codex/prompts/banker-<name>.md` | Near-identical (frontmatter `description`+`argument-hint`). Codex prompts are flat → the `banker-` prefix lives in the filename; invoked as `/banker-<name>`. |
10
- | (none) | `~/.codex/AGENTS.md` | **NOT TOUCHED by setup.** omx regenerates it (clobber risk, `:7`/`:253`); `omx setup --merge-agents` keeps only `<!-- USER:OMX:POLICY:START -->`…`END` blocks on a rewrite; `--force`, a confirmed overwrite, and a plain `omx setup` with team mode off replace the file whole; a plain `omx setup` with team mode on only refreshes the model table. Rely on `~/.codex/skills/` auto-discovery. The one runtime writer is the `tone-compact` skill, at the user's request, inside such a block. |
10
+ | (none) | `~/.codex/AGENTS.md` | **NOT TOUCHED by setup.** omx regenerates it (clobber risk, `:7`/`:253`); `omx setup --merge-agents` keeps only `<!-- USER:OMX:POLICY:START -->`…`END` blocks on a rewrite; `--force`, a confirmed overwrite, and a plain `omx setup` with team mode off replace the file whole; a plain `omx setup` with team mode on only refreshes the model table. Rely on `~/.codex/skills/` auto-discovery. The runtime writers are the `tone-compact` and `anti-drm` skills, at the user's request, each inside such a block. |
11
11
 
12
12
  ## Naming
13
13
  - Codex skill dir **and** frontmatter `name:`: `banker-<name>` (avoids collision with omx/system skills; kept in sync so Codex discovers it).
@@ -43,6 +43,7 @@ The generator (`banker setup --codex`) applies the rules below for `target: both
43
43
  - `obsidizer` — OMC-managed trees respect the 9-field frontmatter whitelist + reserved files + no-rename + bare `[[slug]]` links only; `aliases` are written in generic vaults only; Canvas sidecars and body-inline `::` are durable in-place; no `wiki_*` write dependency, `wiki_lint` read-only for verification. `--enable` is Claude-only (plugin-declared PostToolUse hook); Codex has no MCP tool hooks → honest no-op.
44
44
  - `payload-mon` — needs the OMC custom HUD wrapper (`setup-omc-hud`). It measures Claude Code sessions only; from Codex it manages the same machine's Claude Code HUD wrapper and never measures Codex's own requests.
45
45
  - `tone-compact` — per runtime: Claude Code loads `<config>/rules/banker-tone-compact.md`; Codex reads one marked block at the end of `$CODEX_HOME/AGENTS.override.md` (when it has content of its own) or `AGENTS.md`, wrapped in `USER:OMX:POLICY` so `omx setup --merge-agents` keeps it (`--force` or team mode off replaces the file; run `on` again). Turning it on in one runtime leaves the other as it is.
46
+ - `anti-drm` — the same places as `tone-compact` through the same shared module (`instruction-toggle.mjs`, a byte-identical copy in each skill): `<config>/rules/banker-anti-drm.md` for Claude Code, one `USER:OMX:POLICY`-wrapped block in the instructions file Codex reads. The settings (`~/.config/banker/anti-drm.json`) are shared by both runtimes; `on` and `off` act on one runtime, while `config` and `on` with settings refresh every runtime that holds the rules.
46
47
  - `omc-patch` — acts on the Claude Code OMC plugin cache (`~/.claude/plugins/`) even when run from Codex; Codex's own OMX is untouched. The skill always passes `--no-update` (a plain apply would switch the active OMC to the tool's hard-coded `TARGET_VERSION`). `--revert --root` restores only the active plugin folder when an older kit left the timeout helper inside a block, and `scripts/probe-pm.mjs` runs OMC's project-memory hook in a temp scratch project with its own home and state folder.
47
48
  - `remains` — the same procedure in both runtimes; box runs go through `scripts/boxes.mjs` (Codex: `~/.codex/skills/banker-remains/scripts/boxes.mjs`), which needs `ssh`, `scp` and `git` on the machine and key-only logins to the boxes in `~/.config/banker/test-boxes.json`. It reads and runs tests only: no fix, no commit, no push.
48
49
  - `ultra-chain` — the same nine stages in both runtimes. Claude=OMC 5 (`ralplan --deliberate`, `ralph --critic=critic`); Codex=OMX (`$ralplan --deliberate`, then `$ralph` with the skill's own critic loop through `spawn_agent`, because OMX `ralph` has no `--critic`). Both add a `ralph-qa` plan quorum after ralplan (two reviewers, no option to add more), run OS tests through the sibling `remains/scripts/boxes.mjs` (Codex: `banker-remains`), judge screenshots with a fresh agent (OMX 0.20.2's `visual-verdict` is a deprecated stub), and render the process report from the skill's own ledger (`lineage` reads Claude Code sessions only). Box runs need `ssh`, `scp` and `git`; screenshots need Playwright with Chromium; under Codex's `workspace-write` sandbox the ssh calls and the review seats' home writes may ask for approval.
@@ -60,6 +61,7 @@ The generator (`banker setup --codex`) applies the rules below for `target: both
60
61
  - `payload-mon` → 다루는 신호가 Claude Code 의 것이다. 32MB 요청 한도와 세션 파일 형식이 Claude Code 기준이라 **Codex 자신의 요청 크기는 재지 않는다.** Codex 에서 실행하면 같은 머신의 Claude Code HUD 래퍼(`omc-hud-custom.mjs`)를 켜고 끄는 것만 하고, `status` 의 현재 세션 추정치는 Claude Code 세션에서만 나온다. OMX `hud` 는 건드리지 않는다.
61
62
  - HUD 래퍼가 불러오는 추정 모듈은 스킬 폴더가 아니라 래퍼 옆에 둔 사본이다. Claude Code 플러그인 설치 경로(`plugins/cache/<마켓>/<플러그인>/<버전>/`)는 업데이트 때 옛 버전 폴더가 정리되므로, 그 경로를 래퍼에 박으면 다음 업데이트 뒤 표시가 소리 없이 사라진다. Codex 설치 경로에는 버전이 없지만 같은 사본 방식을 쓴다.
62
63
 
63
- 추가 스킬 `tone-compact` 도 `both`·런타임 인식:
64
+ 추가 스킬 `tone-compact`, `anti-drm` 도 `both`·런타임 인식:
64
65
  - `tone-compact` → 켜짐 상태를 두는 곳이 런타임마다 다르다. Claude Code 는 사용자 규칙 폴더(`<설정 폴더>/rules/`)의 banker 전용 파일 하나를 쓰고 지운다. 세션 시작과 compaction 뒤에 다시 읽히는 곳이다. Codex 는 전역 지침 파일 끝에 블록 하나를 넣고 뺀다. 파일은 `AGENTS.override.md` 에 내용이 있으면 그쪽, 없으면 `AGENTS.md` 다. `omx setup --merge-agents` 가 생성형 AGENTS.md 를 다시 쓸 때 `USER:OMX:POLICY` 블록만 남기므로 그 표시로 감싼다(`--force` 나 team 모드를 끈 `omx setup` 은 파일을 통째로 바꾸므로 그 뒤 `on` 을 다시 실행). 전역 파일은 32KiB 한도에 잘리지 않는다(35.6KB 로 실측).
66
+ - `anti-drm` → `tone-compact` 와 같은 자리에 규칙을 둔다(공통 모듈 `instruction-toggle.mjs` 의 같은 사본). 금지 확장자와 대체 확장자 설정은 `~/.config/banker/anti-drm.json` 하나를 두 런타임이 함께 쓴다.
65
67
  - `ready-compact` → 노트 위치만 런타임마다 다르다. Claude Code 는 자동 메모리 폴더(`MEMORY.md` 포인터가 새 세션에도 로드됨), Codex 는 자동 메모리가 없어 작업 폴더의 `.omx/handoffs/`(OMX 의 handoff 관례). 출력은 양쪽 모두 프롬프트 본문만이라 내장 `/copy` 한 번으로 복사된다. `--hand-off` 는 새 세션에 이 대화가 없다는 전제로 결정과 이유, 작업 위치, 진행 중인 모드와 백그라운드 작업까지 노트에 옮긴다.
@@ -1,11 +1,11 @@
1
1
  ---
2
- description: "스펙 파일(기본 `docs/note.txt`)을 바탕으로 프론트엔드를 구현하고, 레퍼런스 구현과 같은지 엄격하게 QA 하는 워크플로(`ralplan`, `ralph`, `/loop`)."
3
- argument-hint: "[스펙 파일 경로. 생략하면 docs/note.txt]"
2
+ description: "스펙 파일(기본 `docs/note.md`)을 바탕으로 프론트엔드를 구현하고, 레퍼런스 구현과 같은지 엄격하게 QA 하는 워크플로(`ralplan`, `ralph`, `/loop`)."
3
+ argument-hint: "[스펙 파일 경로. 생략하면 docs/note.md]"
4
4
  ---
5
5
 
6
6
  # /front-qa — 스펙 기반 프론트엔드 구현 + 엄격 QA
7
7
 
8
- `$1`(없으면 `docs/note.txt`)의 요구사항을 React 프론트엔드(`$FRONTEND_DIR`, 예: `apps/web`)에 구현하고,
8
+ `$1`(없으면 `docs/note.md`. 그 파일이 없고 `docs/note.txt` 가 있으면 그 파일)의 요구사항을 React 프론트엔드(`$FRONTEND_DIR`, 예: `apps/web`)에 구현하고,
9
9
  **레퍼런스 구현(reference implementation — 예: 이전 Streamlit/타 빌드)과 엄격 비교 + 스펙 지시 정확 준수**를 검증한다. 모든 항목 해결까지 진행.
10
10
 
11
11
  ## 0. 전제조건: OMC (없으면 설치부터)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaydash9999/banker-plugins",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "banker — Claude Code + Codex CLI plugin (QA, audit, docs, architecture, wiki skills). Install via Claude Code marketplace, or `npm i -g @kaydash9999/banker-plugins` then `banker setup`.",
5
5
  "bin": {
6
6
  "banker": "bin/banker.js"
@@ -296,7 +296,7 @@ node references/verify-intro.mjs http://localhost:<port>/ --out <projectDir>/ver
296
296
 
297
297
  - 백업을 먼저 한다. 백업은 프로젝트의 `backup/` 아래에 둔다. `/tmp` 는 쓰지 않는다.
298
298
  - `site/` 의 파일을 사이트의 정적 폴더로 옮긴다. `#world` 를 본문 위에 두고, `stepNav.end` 는 본문 시작 요소를 가리킨다.
299
- - 사이트 CSP 에 `connect-src 'self'`, `media-src 'self' blob:`, `style-src` 의 `styleHash` 를 더한다. 인라인을 허용하지 않아도 된다. `scrub-engine.LICENSE.txt`(엔진의 MIT 고지)도 함께 옮긴다.
299
+ - 사이트 CSP 에 `connect-src 'self'`, `media-src 'self' blob:`, `style-src` 의 `styleHash` 를 더한다. 인라인을 허용하지 않아도 된다. `scrub-engine.LICENSE.md`(엔진의 MIT 고지)도 함께 옮긴다.
300
300
  - 배포 뒤 운영 주소에 `verify-intro.mjs` 를 다시 돌려 결과를 대조해 보고한다.
301
301
 
302
302
  ---
@@ -8,7 +8,7 @@
8
8
  * index.html (head of index-template.html; no inline script or style)
9
9
  * scrub-engine.js (copied verbatim from references/)
10
10
  * scrub-engine.css (the CSS the engine injects, taken from scrub-engine.js unchanged)
11
- * scrub-engine.LICENSE.txt (scroll-world's MIT notice, which ships with the engine files)
11
+ * scrub-engine.LICENSE.md (scroll-world's MIT notice, which ships with the engine files)
12
12
  * theme.css (the template's --sw-* tokens, set from the manifest theme)
13
13
  * intro-fixes.css (layout, button text and overflow fixes for the engine, every page)
14
14
  * intro.js (the mountScrollWorld config and call)
@@ -231,12 +231,12 @@ const escAttr = (s) => String(s).replace(/[&<>"]/g, (c) => ({ '&': '&amp;', '<':
231
231
 
232
232
  // Heads the copied engine rules: they are scroll-world's (MIT), whose notice ships beside them.
233
233
  const ENGINE_NOTICE = '/* scroll-world (https://github.com/oso95/scroll-world), MIT License, (c) 2026 cyw.\n'
234
- + ' The rules scrub-engine.js injects, copied unchanged. Notice: scrub-engine.LICENSE.txt */\n';
234
+ + ' The rules scrub-engine.js injects, copied unchanged. Notice: scrub-engine.LICENSE.md */\n';
235
235
 
236
236
  function writeStatic(out, manifest, template) {
237
237
  const engineSource = fs.readFileSync(path.join(HERE, 'scrub-engine.js'), 'utf8');
238
238
  fs.copyFileSync(path.join(HERE, 'scrub-engine.js'), path.join(out, 'scrub-engine.js'));
239
- fs.copyFileSync(path.join(HERE, 'LICENSE'), path.join(out, 'scrub-engine.LICENSE.txt'));
239
+ fs.copyFileSync(path.join(HERE, 'LICENSE'), path.join(out, 'scrub-engine.LICENSE.md'));
240
240
  const css = engineCss(engineSource);
241
241
  fs.writeFileSync(path.join(out, 'scrub-engine.css'), ENGINE_NOTICE + css);
242
242
  const style = /<style>([\s\S]*?)<\/style>/.exec(template);
@@ -152,7 +152,7 @@ AZURE_IMAGE_API_KEY=<Image 리소스 키>
152
152
  ### 모드 (b) — 콘솔 샘플 파일
153
153
  Azure AI Foundry/AI Hub 콘솔의 "Sample code"/"View code" 패널이 주는 curl 또는 Python 스니펫에는 원문 키가 들어 있다. 사람이 이것을 **채팅에 붙이지 않고** 비공개 파일에 저장한다:
154
154
  ```bash
155
- mkdir -p ~/.config/banker/3d-intro && (umask 077 && touch ~/.config/banker/3d-intro/sample.txt) # 사람이 이 파일에 샘플을 붙여 저장
155
+ mkdir -p ~/.config/banker/3d-intro && (umask 077 && touch ~/.config/banker/3d-intro/sample.md) # 사람이 이 파일에 샘플을 붙여 저장
156
156
  ```
157
157
  에이전트는 그 파일을 읽어 키를 화면에 내지 않고 키 파일에 바로 합친 뒤 샘플 파일을 지운다. 리소스마다 마지막 인자를 `sora`, `image`, `wan:<n>` 중 하나로 준다:
158
158
  ```bash
@@ -178,8 +178,8 @@ node -e "
178
178
  const replaced = old && add[names.apiKey] && old !== add[names.apiKey] ? redact(old) : null;
179
179
  console.log(JSON.stringify({ file: target, endpoint: p.endpoint, deployment: p.deployment, apiVersion: p.apiVersion, apiKey: redact(p.apiKey), replaced }));
180
180
  })();
181
- " "$HOME/.config/banker/3d-intro/sample.txt" sora
182
- rm -f "$HOME/.config/banker/3d-intro/sample.txt"
181
+ " "$HOME/.config/banker/3d-intro/sample.md" sora
182
+ rm -f "$HOME/.config/banker/3d-intro/sample.md"
183
183
  ```
184
184
  파싱 결과(저장한 파일, 엔드포인트, 배포명, apiVersion, 길이만 보이는 key)를 사람에게 보여 주고 확인받는다.
185
185
  `replaced` 에 길이가 보이면 파일에 있던 다른 키를 이 샘플의 키로 바꾼 것이다. 교체(로테이션)가 아니었다면 사람이 키 파일의 키 줄을 다시 적는다.
@@ -0,0 +1,230 @@
1
+ ---
2
+ name: anti-drm
3
+ description: "망분리 DRM 이 암호화하는 확장자(.txt, .csv 등) 대신 .md, .html, .tsv 로 파일을 만들게 하는 규칙을 켜고 끔. 처음 켤 때 금지 확장자와 대체 확장자를 물음. 인자가 없으면 `on`. `off` 할 때까지 모든 세션에 유지. 'anti-drm'/'DRM 확장자 피해'/'망분리 DRM' 시 사용."
4
+ argument-hint: "on | off | status | config"
5
+ ---
6
+
7
+ # anti-drm: DRM 이 암호화하는 확장자 피하기
8
+
9
+ - 망분리 PC 의 DRM 은 정해진 확장자의 파일을 암호화함
10
+ - 암호화된 파일은 에이전트와 개발 도구가 읽지 못함
11
+ - 이 스킬은 그 확장자 대신 대체 확장자로 파일을 만들게 하는 규칙을 켜고 끔
12
+ - 이미 DRM 이 걸린 파일을 풀거나 변환하지 않음. 에이전트가 새로 만드는 파일의 확장자만 정함
13
+ - 조직의 보안 규정이 이 스킬의 규칙보다 우선함
14
+
15
+ 인자: `$ARGUMENTS`
16
+ - `on`, `off`, `status`, `config` 중 하나. 비어 있으면 `on`
17
+ - Codex: 사용자 메시지에서 읽음
18
+
19
+ ## 실행
20
+
21
+ 1. 인자 확인
22
+ - 네 값 밖: 실행하지 않고 사용법 안내
23
+ - 사용자 입력을 셸 명령에 그대로 붙이지 않음
24
+ 2. 스크립트
25
+
26
+ ```bash
27
+ node "<이 스킬 디렉터리 절대경로>/scripts/anti-drm.mjs" <명령> [옵션]
28
+ ```
29
+
30
+ | 런타임 | `--runtime` | 스킬 디렉터리 |
31
+ |---|---|---|
32
+ | Claude Code | `claude` | 스킬 맨 위 "Base directory for this skill:" 경로 |
33
+ | Codex | `codex` | `~/.codex/skills/banker-anti-drm/` 의 절대경로. 프로젝트 범위 설치면 `./.codex/skills/banker-anti-drm/` |
34
+
35
+ 3. 아래 인자별 절차를 따름
36
+
37
+ ## 인자별 절차
38
+
39
+ ### `on`
40
+
41
+ 1. `status` 를 실행해 `- 설정:` 줄을 봄
42
+ 2. 그 줄에 따라 실행
43
+
44
+ | `- 설정:` 줄 | 다음 |
45
+ |---|---|
46
+ | `없음` | 아래 "질문" 을 한 뒤 `on --runtime <런타임> --deny "<금지 목록>" --alt "<대체 목록>" --tsv <tab 또는 comma>` |
47
+ | 파일 경로 | `on --runtime <런타임>` |
48
+ | `올바르지 않음` | 이유를 전하고 `config` 절차를 따름 |
49
+
50
+ 3. 성공하면 출력의 `적용할 규칙:` 아래 규칙을 이 세션에 바로 적용. 다음 세션부터는 자동 적용
51
+
52
+ ### `off`
53
+
54
+ 1. `off --runtime <런타임>` 실행
55
+ 2. 성공하면 이 세션에서 규칙 적용을 멈춤
56
+ 3. 설정 파일은 남음. 다시 켤 때 묻지 않음
57
+
58
+ ### `status`
59
+
60
+ - `status` 를 실행하고 출력을 그대로 전달
61
+
62
+ ### `config`
63
+
64
+ 1. `status` 로 지금 설정을 봄
65
+ 2. 지금 값을 함께 보이며 아래 "질문" 을 함
66
+ 3. `config --deny "<금지 목록>" --alt "<대체 목록>" --tsv <tab 또는 comma>` 실행
67
+ 4. 이 런타임이 켜져 있으면 출력의 `적용할 규칙:` 아래 규칙을 이 세션에 바로 적용
68
+
69
+ ## 질문
70
+
71
+ - Claude Code: `AskUserQuestion` 한 번에 세 질문
72
+ - Codex: 같은 세 질문을 한 메시지로 묻고 답을 기다림
73
+ - `config` 에서는 질문 문구에 지금 값을 넣음 (예: `지금: .txt .pdf`)
74
+
75
+ ### 질문 1. 금지 확장자 (여러 개 선택)
76
+
77
+ - 문서: `.txt` `.doc` `.docx` `.hwp` `.hwpx`
78
+ - PDF와 발표: `.pdf` `.ppt` `.pptx`
79
+ - 표: `.xls` `.xlsx` `.csv`
80
+ - 직접 입력: 더할 확장자 또는 전체 목록
81
+ - 권고: 세 묶음 모두
82
+
83
+ ### 질문 2. 대체 확장자 (여러 개 선택)
84
+
85
+ - `.md`: 글과 메모
86
+ - `.html`: 서식 문서와 발표 자료
87
+ - `.tsv`: 표 데이터
88
+ - 직접 입력
89
+ - 권고: 셋 모두
90
+
91
+ ### 질문 3. TSV 구분자 (하나 선택)
92
+
93
+ - 질문 2 에서 `.tsv` 를 고른 경우에만 적용
94
+ - 탭(권고): 표준 TSV
95
+ - 쉼표: CSV 내용을 그대로 쓰고 확장자만 `.tsv`. 읽고 쓰는 코드에 구분자 쉼표를 명시해야 함
96
+
97
+ ### 답 처리
98
+
99
+ 1. 고른 묶음의 확장자와 직접 입력한 값을 합침
100
+ 2. 직접 입력은 쉼표나 공백으로 나눔
101
+ 3. 낱말마다 `^\.?[A-Za-z0-9]+$` 를 만족해야 함. 아니면 그 값을 보이고 다시 물음
102
+ 4. 금지와 대체에 같은 확장자가 있으면 다시 물음
103
+ 5. 셸에는 정규화한 확장자만 넘김
104
+ - 소문자로 바꿈
105
+ - 앞에 점이 없으면 붙임
106
+ - 쉼표로 이어 큰따옴표로 감쌈. 예: `--deny ".txt,.pdf"`
107
+ 6. 스크립트가 거부하면 그 메시지를 전하고 다시 물음
108
+
109
+ ## 종료 코드
110
+
111
+ | 코드 | 뜻 | 처리 |
112
+ |---|---|---|
113
+ | 0 | 완료. 이미 그 상태였던 경우 포함 | 결과 전달 |
114
+ | 1 | 거부 또는 사용법 오류. 설정 값을 준 `on` 과 `config` 는 설정을 저장한 뒤 갱신하지 못한 런타임이 있어도 1 | 메시지 그대로 전달 |
115
+ | 2 | 예기치 못한 오류 | 메시지 전달 후 `status` 로 확인 |
116
+
117
+ - 출력이 비어 있으면 실행 실패. 성공으로 보고하지 않음
118
+
119
+ ## 규칙 틀
120
+
121
+ - 아래 구간은 스크립트가 설정으로 채우는 틀
122
+ - `{{map}}` 은 금지 확장자마다 대신 쓸 확장자를 적은 표가 됨
123
+ - `{{alts}}` 는 대체 확장자마다 쓰는 곳을 적은 표가 됨
124
+ - 이 세션에는 스크립트가 출력한 `적용할 규칙:` 아래 규칙을 적용함
125
+
126
+ <!-- anti-drm:rules:start -->
127
+ # 파일 확장자 규칙 (banker anti-drm)
128
+
129
+ - anti-drm 이 켜져 있는 동안 적용
130
+ - anti-drm 에 `off` 를 실행한 뒤에는 이 규칙이 맥락에 남아 있어도 적용하지 않음
131
+ - 이 PC 의 DRM 은 아래 금지 확장자 파일을 암호화함. 암호화된 파일은 에이전트와 개발 도구가 읽지 못함
132
+
133
+ ## 확장자 대응
134
+
135
+ - 확장자는 대소문자를 구분하지 않음
136
+
137
+ {{map}}
138
+
139
+ ## 대체 확장자
140
+
141
+ {{alts}}
142
+
143
+ ## 새 파일
144
+
145
+ - 새로 만드는 파일에 금지 확장자를 쓰지 않음. 위 표의 대체 확장자로 만듦
146
+ - 다음 파일도 같음
147
+ - 작업 파일과 임시 파일
148
+ - 로그와 시험 데이터
149
+ - 셸 리다이렉션과 스크립트가 만드는 파일
150
+ - 다른 스킬의 절차에 적힌 파일. 그 파일을 읽는 명령의 이름도 함께 바꿈
151
+
152
+ ## 금지 확장자 산출물
153
+
154
+ - 대상
155
+ - 사용자가 금지 확장자 파일을 명시해 요청함
156
+ - 다른 스킬의 산출물이 금지 확장자임
157
+ - 처리 순서
158
+ 1. 두 가지를 알림
159
+ - DRM 이 암호화하면 에이전트가 다시 읽지 못함
160
+ - 함께 둘 대체 확장자 원본은 DRM 이 보호하지 않음
161
+ 2. 사용자 확인 뒤 만듦
162
+ 3. 확인받았으면 내용 원본도 대체 확장자 파일로 함께 둠. 고칠 때는 원본을 고친 뒤 다시 만듦
163
+ 4. 만든 금지 확장자 파일은 다시 읽지 않음. 검증은 원본으로 함
164
+
165
+ ## 이미 있는 파일
166
+
167
+ - 금지 확장자 파일의 이름을 바꾸지 않음
168
+ - 읽은 내용이 깨진 바이너리면 DRM 이 암호화한 파일로 봄
169
+ - 풀거나 다른 형식으로 바꾸려 하지 않음
170
+ - 읽을 수 없다고 사용자에게 알림. 평문 사본을 요청하거나 권하지 않음
171
+ - 금지 확장자 파일을 고치기 전에 사용자에게 알림. 저장하면 암호화될 수 있음
172
+ - 도구가 이름을 정한 파일은 이름을 유지함 (예: `requirements.txt`)
173
+ - 새로 만들어야 하면 먼저 알림
174
+ - 대체 수단이 있으면 제안함 (예: `pyproject.toml`)
175
+ - 사용자가 요청한 프로그램의 출력 형식은 요청대로 둠. 금지 확장자를 만드는 코드면 알리기만 함
176
+
177
+ ## 범위
178
+
179
+ - 이 규칙은 에이전트가 새로 만드는 파일의 확장자만 정함
180
+ - 이미 DRM 이 걸린 파일을 풀거나 다른 형식으로 바꾸지 않음
181
+ - 조직의 보안 규정이 이 규칙보다 우선함
182
+ <!-- anti-drm:rules:end -->
183
+
184
+ ## 동작
185
+
186
+ | 런타임 | `on` | `off` |
187
+ |---|---|---|
188
+ | Claude Code | `<설정 폴더>/rules/banker-anti-drm.md` 생성. 세션 시작과 compaction 뒤에 자동 로드 | 파일 삭제 |
189
+ | Codex | Codex 가 읽는 전역 지침 파일 끝에 블록 1개 추가 | 그 블록만 제거. 켜기 전 내용으로 복원 |
190
+
191
+ - 설정 파일
192
+ - 위치: `~/.config/banker/anti-drm.json`. `BANKER_ANTI_DRM_CONFIG` 로 바꿈
193
+ - 두 런타임이 함께 씀
194
+ - `off` 는 지우지 않음
195
+ - `.md` 와 `.json` 은 금지할 수 없음. 규칙 파일과 설정 파일의 형식
196
+ - 목록은 각각 64개까지
197
+ - 읽는 파일: 64KiB 이하의 일반 파일만. 소유자는 이 계정, 또는 root 만 쓸 수 있는 root
198
+ - 폴더, FIFO, 64KiB 를 넘는 파일, 읽을 수 없는 파일은 덮어쓰지 않음
199
+ - anti-drm 이 쓰지 않은 파일이 그 자리에 있으면 `anti-drm.json.bak` 에 한 번 남김 (이 계정만 읽기 가능)
200
+ - 설정 폴더
201
+ - Claude Code: `$CLAUDE_CONFIG_DIR`, 없으면 `~/.claude`
202
+ - Codex: `$CODEX_HOME`, 없으면 `~/.codex`
203
+ - Codex 지침 파일
204
+ - `AGENTS.override.md` 에 banker 블록 말고도 내용이 있으면 그 파일
205
+ - 그 밖에는 `AGENTS.md`
206
+ - Codex 블록은 `USER:OMX:POLICY` 표시로 감쌈
207
+ - 블록이 남음: `omx setup --merge-agents`, 기본 `omx setup`(team 모드 켜짐)
208
+ - 블록이 사라짐: `omx setup --force`, 덮어쓰기 확인, team 모드를 끈 `omx setup`. 그 뒤 `on` 다시 실행
209
+ - Codex 파일 변경 전 내용: `<파일>.anti-drm.bak` (이 계정만 읽기 가능)
210
+ - `tone-compact` 블록과 같은 파일에 있어도 서로 건드리지 않음
211
+ - `on`, `off` 는 그 런타임만 바꿈
212
+ - 설정 값을 준 `on` 과 `config` 는 규칙이 들어 있는 다른 런타임도 새 규칙으로 바꿈
213
+ - UTF-8 이 아닌 지침 파일(CP949, UTF-16): 손대지 않고 거부
214
+
215
+ ## 문제 해결
216
+
217
+ | 메시지 | 조치 |
218
+ |---|---|
219
+ | 설정이 없습니다 | "질문" 으로 설정을 정해 `on` 에 넘김 |
220
+ | 설정 파일이 올바르지 않습니다 | `config` 로 다시 만듦. 다른 사용자 소유면 그 파일을 치운 뒤 실행 |
221
+ | 일반 파일이 아니라 설정을 저장하지 않았습니다 | 설정 경로의 폴더나 특수 파일을 치움. 또는 `BANKER_ANTI_DRM_CONFIG` 값 확인 |
222
+ | 64KiB 보다 큰 파일이라, 읽을 수 없는 파일이라 설정을 저장하지 않았습니다 | 그 자리의 파일이 설정 파일인지 확인. 권한을 고치거나 옮긴 뒤 다시 실행 |
223
+ | anti-drm 이 쓰는 형식이라 금지할 수 없습니다 | 금지 목록에서 `.md`, `.json` 을 뺌 |
224
+ | 같은 이름의 다른 파일이 있음 | `rules/banker-anti-drm.md` 가 banker 파일이 아님. 이름 변경 또는 삭제 뒤 다시 실행 |
225
+ | 표시의 짝이 맞지 않음 | 지침 파일에 anti-drm 표시 줄이 한쪽만 있거나 문장 속에 있음. 또는 블록 안에 다른 표시 줄이 있음. 짝을 새로 맞추지 말고 남은 표시 줄을 지운 뒤 다시 실행 |
226
+ | 다른 banker 블록만 있어 Codex 가 AGENTS.md 를 읽지 않음 | 메시지가 말한 스킬에서 `on` 실행 |
227
+ | 설정 폴더가 없음 | 해당 런타임 미설치. 또는 설정 폴더 환경 변수 값 확인 |
228
+ | 규칙이 지금 설정이나 이 버전과 다름 | `on` 한 번 실행 |
229
+ | UTF-8 이 아닌 파일 | 지침 파일을 UTF-8 로 바꾼 뒤 다시 실행 |
230
+ | 쓸 권한이 없음 | 해당 파일과 폴더 권한 확인 |