@kaydash9999/banker-plugins 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +52 -0
- package/README.md +28 -8
- package/codex/manifest.json +8 -1
- package/codex/transform-matrix.md +2 -2
- package/commands/setup.md +2 -0
- package/package.json +6 -1
- package/skills/3d-intro-build/SKILL.md +214 -0
- package/skills/3d-intro-build/references/LICENSE +21 -0
- package/skills/3d-intro-build/references/NOTICE.md +32 -0
- package/skills/3d-intro-build/references/assemble.mjs +252 -0
- package/skills/3d-intro-build/references/azure-adapter.mjs +495 -0
- package/skills/3d-intro-build/references/curate.mjs +301 -0
- package/skills/3d-intro-build/references/index-template.html +73 -0
- package/skills/3d-intro-build/references/prompts.md +171 -0
- package/skills/3d-intro-build/references/scrub-engine.js +448 -0
- package/skills/3d-intro-build/references/serve.mjs +123 -0
- package/skills/3d-intro-setup/SKILL.md +196 -0
- package/skills/3d-intro-setup/references/azure-adapter.mjs +495 -0
- package/skills/lineage/SKILL.md +126 -134
- package/skills/lineage/lineage.py +1041 -354
- package/skills/motion-graphic-make/SKILL.md +57 -0
- package/skills/motion-graphic-setup/SKILL.md +141 -0
- package/skills/ralph-qa/SKILL.md +253 -77
- package/skills/ralph-qa/references/verifier-probe.mjs +860 -0
- package/skills/refresh-readme/SKILL.md +3 -3
- package/skills/vertical-pptx/SKILL.md +409 -0
- package/skills/vertical-pptx/build_a4p.js +923 -0
- package/skills/vertical-pptx/build_a4p.py +916 -0
- package/skills/vertical-pptx/verify_a4p.mjs +2168 -0
- package/skills/vertical-pptx-setup/SKILL.md +223 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "banker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.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,57 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.13.0] - 2026-08-12
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- **`ralph-qa` 의 검증자 구성을 "우선순위 사다리"에서 "백본 + 좌석"으로 뒤집었다.**\
|
|
7
|
+
이전에는 Codex CLI → 다른 모델 `curl` → 다중 에이전트 순으로 **사용 가능한 첫 경로 하나**만 썼고, 다중 에이전트는 다른-LLM 경로가 전무할 때만 도는 최종 수단이었다. 이제 **다중 에이전트 백본(`model: opus`, `--agents` 기본 3)이 조건 없이 항상 돌고**, 설치돼 있으면서 실제 유효성이 관측된 외부 LLM(Codex CLI · Gemini CLI · GPT/Gemini API)만 **각 1좌석**으로 합류한다. 외부 좌석의 부재는 실패나 열화가 아니라 "모델 축이 이번 실행에서 안 덮였다"는 커버리지 사실이다.\
|
|
8
|
+
유효성은 **0토큰 HTTP 프리플라이트**(`references/verifier-probe.mjs`, provider `GET /models`)로 판정한다 — 설치 여부(`command -v`)와 유효 여부는 다르고, `codex login status`·`~/.codex/auth.json` 은 **거짓 음성**이라 근거로 쓰지 않는다(둘 다 미로그인이라 답하면서 codex 가 정상 동작하는 경우가 있다). 검증 실호출을 프로브로 쓰면 왕복 1회에 2만 토큰이 넘게 든다.\
|
|
9
|
+
정족수는 좌석 **생애주기 전체**에 단조성을 건다: `내부 좌석 ≥ 1 ∧ 내부 과반 ∧ 실증된 외부 비-APPROVE 0 ∧ 미해소 blocker 0 ∧ ERROR 0 ∧ 좌석 상실 0`. 좌석 식별자를 `(종류, 렌즈)` 로 정의하고 반복 간 `S_k ⊆ S_{k+1}` 을 요구해 **좌석을 새로 굴려 반대를 지우는 경로**를 닫았고, 종결에 `INCONCLUSIVE` 를 더해 좌석이 사라지는 모든 경우를 APPROVE 밖으로 배출한다. `INCONCLUSIVE` 는 통과가 아니며 원인별 다음 행동이 규정된다.
|
|
10
|
+
- **`--effort` 를 외부 좌석(api·codex) 전용으로 축소했다.** 이전 표기는 전 경로에 적용되는 것처럼 보였지만 실제로는 아무 데도 전달되지 않았다.\
|
|
11
|
+
백본 쪽 사정은 이렇다: **호출 단위** 지정 경로는 없고(Agent 도구 스키마에 effort 파라미터가 없다), effort 는 **에이전트 정의의 프론트매터**(`effort:`)나 세션 설정에서 온다. banker 는 에이전트를 배포하지 않으므로(`.claude-plugin/plugin.json` 에 `agents` 키 없음) 백본이 띄우는 것은 남의 정의이고, 따라서 이 스킬이 백본 effort 를 정할 수 없다. 백본에 실제로 영향을 주는 손잡이는 호출 전 **세션 effort** 뿐이며 SKILL.md 가 그렇게 안내한다.\
|
|
12
|
+
플래그 표에 `전송 경로`·`확인 수준` 두 열을 두어, 전송 경로 칸을 채울 수 없는 능력은 표에 적지 못하게 했다.
|
|
13
|
+
- **백본의 모델을 선호 순서로 고르고, 실제로 쓴 것을 보고하게 했다.** ① Opus 계열 최신 → ② 없으면 가용한 것 중 가장 적합한 추론 모델 → ③ 그마저 없으면 기본값.\
|
|
14
|
+
**추론 강도는 이 사다리에 없다** — Agent 도구 스키마에 effort 파라미터가 없어 호출 단위로 지정할 수 없고, 강도는 세션 설정에서 물려받는다. 최대 강도가 필요하면 호출 전에 세션 강도를 올리는 것이 유일한 손잡이다.\
|
|
15
|
+
보고에 `백본(선언): model=<실제 쓴 모델> — 모델 선호 <1|2|3>순위 · strength=세션 상속` 줄이 강제된다. 목표를 약속으로 적고 실제를 감추지 않기 위한 것이다.
|
|
16
|
+
- **외부 좌석끼리도 모델이 겹치지 않게 했다.** 저자의 codex 설정(`~/.codex/config.toml` 의 `model`)은 api 좌석의 선호 모델 출처이기도 해서, 그대로 두면 `external:api:<X>` 와 `external:codex`(같은 `<X>`)가 나란히 앉는다 — 좌석은 2인데 모델 축에서는 하나다. 승인 게이트가 넓어지지는 않지만(좌석이 늘면 APPROVE 는 더 어려워진다) 보고의 "외부 2" 가 두 개의 독립 검사로 읽히므로, 이 스킬이 defect 로 다루는 보고 정직성 문제다.\
|
|
17
|
+
이제 codex 좌석이 서면 api 좌석은 **codex 가 돌릴 모델의 계열을 피해서** 고른다. 사다리는 `다른 계열 → 같은 계열의 다른 모델 → 같은 모델` 이고 내려간 단은 `modelPick` 으로 보고된다. codex 의 모델을 확인하지 못하면 fail-closed 로 codex 런타임 계열을 피한다.\
|
|
18
|
+
대가는 명시한다 — 자동 선택은 카탈로그 순서를 따를 뿐 성능순이 아니라서 회피 결과가 더 작은 모델일 수 있다. 능력이 더 중요하면 `--model` 로 고정하며, 그 값이 회피보다 우선한다. 또한 `GET /models` 200 은 카탈로그 접근만 증명하므로, 고른 모델이 첫 호출에서 거절되면 **좌석 확정 전**이라 다음 후보로 갈아탄다(확정 후의 실패는 `ERROR` 이고 모델을 바꾸면 좌석 상실이다).
|
|
19
|
+
- **`--external=auto|off` 를 신설**하고 `--agents` 를 백본 상시 파라미터로 승격했다. 폐기한 플래그는 없다.
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
- **gemini 모델 크리덴셜 좌석(`external:gemini-api`)을 CLI 좌석과 분리했다.** 처음 구현은 gemini 좌석을 CLI 존재 여부로 먼저 걸러서, 유효한 키가 있어도 CLI 가 없으면 좌석이 0이 되고 사유가 `cli-absent` 로 나갔다 — 그리고 그 토큰은 "모델 축이 환경 탓에 안 덮였다"로 매핑된다. **환경이 유효한 크리덴셜을 제공했는데 환경 탓으로 보고**하는 것이라, 이 스킬이 막겠다고 선언한 허위 커버리지였다. 이제 두 경로는 별개 좌석이고, 크리덴셜이 있으면 `cli-absent` 를 쓰지 않는다(생존 판정 실패는 `probe-unseated status=<code>`, 전송 수단 부재는 `no-transport`).
|
|
23
|
+
- `skills/ralph-qa/references/verifier-probe.mjs` — 의존성 0 · `node:http` 기반 유효성 프로브. provider 해석(`~/.codex/config.toml`), 0토큰 생존 판정, 상수 계열 필터(미분류는 fail-closed 제외), 전송 수단 탐지(`curl` → `python3` urllib ≥3.6 → `none`), 관측값(`observed`)과 선언값(`declared`) 분리 출력.
|
|
24
|
+
|
|
25
|
+
## [0.12.0] - 2026-08-09
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
- **모션 그래픽 스킬 쌍(무료 · hyperframes)을 추가했다.**\
|
|
29
|
+
`motion-graphic-setup` 은 Node≥22 와 ffmpeg 를 OS별로 확보한 뒤 `npx hyperframes` 로 도구를 준비한다.\
|
|
30
|
+
`motion-graphic-make` 는 렌더 파이프라인을 소유하지 않는 얇은 래퍼로, 10초 내외 내레이션 없는 모션 그래픽 제작을 hyperframes 의 `/motion-graphics` 워크플로에 위임한다.
|
|
31
|
+
- **3D 인트로 스킬 쌍(유료 · Azure Sora-2 + gpt-image-2)을 추가했다.**\
|
|
32
|
+
`3d-intro-setup` 은 Node/ffmpeg 확보와 Azure 크레덴셜 저장, 무과금 프리플라이트까지만 담당해 과금 없이 연결을 검증한다.\
|
|
33
|
+
`3d-intro-build` 는 gpt-image-2 스틸과 Sora-2 forward-chaining 영상으로 스크롤-스크럽 3D 인트로 사이트를 제작한다.
|
|
34
|
+
- **scroll-world 스크럽 엔진(MIT)을 `3d-intro-build/references` 에 번들로 포함했다.**\
|
|
35
|
+
스크롤에 맞춰 3D 씬을 재생하는 이 엔진(`scrub-engine.js`·`index-template.html`)은 [oso95/scroll-world](https://github.com/oso95/scroll-world) 에서 그대로 벤더링했고, 원본 MIT 고지(`LICENSE`·`NOTICE.md`)를 함께 넣었다.
|
|
36
|
+
- **ffmpeg · hyperframes · Azure 는 사용자가 직접 공급하는 런타임 의존성이며 banker 가 번들하지 않는다.**\
|
|
37
|
+
hyperframes 는 `npx` 로 설치(Apache-2.0)하고, ffmpeg 는 OS 패키지로 확보하며, Azure(OpenAI · Sora-2 · gpt-image-2 · FLUX.2-pro)는 사용자 크레덴셜로 호출한다(과금은 사용자 부담).
|
|
38
|
+
- **A4 세로 PPTX 스킬 쌍 `vertical-pptx` · `vertical-pptx-setup` 을 추가했다.**\
|
|
39
|
+
`vertical-pptx` 는 A4 세로(210×297mm) 규격 PPTX 를 생성·점검·수리하고, 16:9 덱을 A4 세로로 변환한다(인쇄용 세로형 슬라이드).\
|
|
40
|
+
`vertical-pptx-setup` 은 빌더 의존성(pptxgenjs·python-pptx)과 시각 검증용 LibreOffice 를 OS·권한 감지 후 설치한다(root 없으면 홈 프리픽스로 추출).
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
- **🔴 `lineage` 세션 export 스킬을 전면 개편했다(2.0.0 · BREAKING).**\
|
|
44
|
+
실측(6세션·62MB·4,645레코드) 대조에서 산출물의 2/3가 대화가 아니었고 일부는 하네스 주입이 사용자 발언으로 오표시됐다 — 이를 바로잡되 진짜 사용자 발언은 한 건도 잃지 않도록 다시 만들었다.\
|
|
45
|
+
래퍼 없는 하네스 주입(스킬 본문·compaction 요약·에이전트 보고·이미지 노트)을 **위치가 아니라 형태로** 걸러 내고(위치 기반이 지우던 사용자 정정·인용 질문은 보존), 서브에이전트·동료 보고는 별도 회색 버블로 분리한다(발신자명 표시·idle 알림 폐기).\
|
|
46
|
+
Claude 본문을 **무의존 마크다운으로 렌더**한다(헤딩·리스트·표·코드펜스·인용·강조·링크; `html.escape` **후에만** 변환하고 코드/링크를 먼저 도려내 마크업/서식 주입을 차단, 링크는 `https?://` 만).\
|
|
47
|
+
연속된 assistant 레코드를 `--hide-tool-only` 앞에서 병합해 그동안 한 번도 표시되지 않던 `🔧 도구 N건` 을 살리고, 요약을 head+tail 로 뽑아 "무엇을 시작했다"가 아니라 결론을 담게 했다(요약기 버전을 캐시 키에 넣어 알고리즘 변경 시 자동 무효화).\
|
|
48
|
+
여러 세션을 레코드 단위 시간순 한 줄기로 합치는 `--all-sessions` 를 추가했다.\
|
|
49
|
+
단축키를 한글 IME·`Ctrl`/`Cmd`/`Alt` 안전하게 고치고(`e.code` 우선이라 브라우저 기본 동작을 가로채지 않음), 날짜·세션전환·compaction 을 형태가 다른 알약으로 구분(대비 개선·헤더가 스크롤에 따라 갱신), 범례를 우하단 `?` 오버레이로 옮겼다(배경 클릭으로만 닫힘·`aria-modal`).\
|
|
50
|
+
`self_verify` 가 렌더러 출력의 모든 태그를 HTMLParser 스택으로 검사(void 요소 14종 인지)해 개수는 맞지만 어긋난 마크업까지 배포 전에 잡는다.\
|
|
51
|
+
경로 인코딩을 바로잡았다: cwd 의 모든 비영숫자를 `-` 로 매핑(`_` 포함·Windows 경로 포함) — 이전엔 `/` 만 치환해 밑줄이 든 경로에서 자동탐색이 실패했다. 비-UTF8 세션 파일 하나가 전체 export 를 실패시키던 문제도 그 파일만 건너뛰게 고쳤다.\
|
|
52
|
+
**BREAKING — 기본값 반전 3건**: 첫 로드 **접힘**(펼치려면 `--open`), 마크다운 렌더 **기본 ON**(끄려면 `--no-markdown`), 하네스 노이즈 필터 **기본 ON**(남기려면 `--keep-trivia`). 400자 초과 사용자 메시지도 접힌다. 1.x 동작을 원하면 `--open --no-markdown --keep-trivia`.\
|
|
53
|
+
표준 라이브러리만 쓰는 `test_lineage.py`(회귀 143 단언·외부 의존 0)를 추가해 `scripts/smoke-test.js` 가 인터프리터 ≥3.7 을 자동 탐지해 CI 에서 돌리고(EL8 기본 python3=3.6 은 skip), npm 패키지에서는 제외한다.
|
|
54
|
+
|
|
3
55
|
## [0.11.0] - 2026-08-08
|
|
4
56
|
|
|
5
57
|
### Changed
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# banker-plugins
|
|
2
2
|
|
|
3
|
-
> Claude Code와 Codex CLI를 위한 QA
|
|
3
|
+
> Claude Code와 Codex CLI를 위한 QA·감사·문서·아키텍처·위키·미디어 스킬 모음.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@kaydash9999/banker-plugins)
|
|
6
6
|
[](LICENSE)
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
[빠른 시작](#빠른-시작) · [워크플로 예시](#워크플로-사용-예시) · [구성](#구성) · [설치 상세](#설치-상세-npm--codex) · [설정 변경 지점](#설정-변경-지점-claude-code--codex) · [요구사항](#요구사항) · [업데이트 / 제거](#업데이트--제거) · [업데이트 확인](#업데이트-확인-및-사용량-카운팅) · [라이선스 / 서드파티](#라이선스--서드파티)
|
|
10
10
|
|
|
11
|
-
banker는 QA·보안
|
|
11
|
+
banker는 QA·보안 감사·문서·아키텍처·위키·미디어 작업과 의존성·개발환경(OS별) 설치를 아우르는 **스킬 54개 + 커맨드 2개**(총 56개 구성요소)를 묶은 Claude Code 플러그인입니다.\
|
|
12
12
|
설치하면 스킬과 커맨드가 `/banker:<이름>` 네임스페이스로 노출됩니다.\
|
|
13
13
|
이 저장소 자체가 Claude Code 마켓플레이스(`.claude-plugin/marketplace.json`)이자 플러그인(`.claude-plugin/plugin.json`, name `banker`)이며, 도구에 무관한 스킬은 Codex CLI에도 설치됩니다.
|
|
14
14
|
|
|
@@ -52,7 +52,7 @@ Claude Code는 `/banker:<이름>`, Codex는 `banker-<이름>` 으로 호출합
|
|
|
52
52
|
| `ultra-init` | 프로젝트 기획이 충분히 구체적일 때 | 데모를 구현 |
|
|
53
53
|
| `curation` | 질문에 답하기 어렵거나 의사결정이 어려울 때 | 합리적 선택지 제공 (`--perf` 옵션 = 품질 우선) |
|
|
54
54
|
| `all-in-one` | 요건이 명확한 단계에서 | 계획 → 구현 → 검증 |
|
|
55
|
-
| `ralph-qa` | 검증이 충분하지 않을 때 | 다중 Agent
|
|
55
|
+
| `ralph-qa` | 검증이 충분하지 않을 때 | 다중 Agent 백본 + 유효한 외부 LLM 좌석 |
|
|
56
56
|
| `smart-compact` | 컨텍스트 임계 초과로 맥락 단절이 걱정될 때 | 맥락을 더 잘 이어서 진행 |
|
|
57
57
|
| `refresh-readme` | 프로젝트 배포 전 | README 최신화 |
|
|
58
58
|
| `summary-wiki` | Agent가 아는 정보를 확인하고 싶을 때 | 요약 리포트 |
|
|
@@ -84,12 +84,13 @@ Claude Code는 `/banker:<이름>`, Codex는 `banker-<이름>` 으로 호출합
|
|
|
84
84
|
| 스킬 | 설명 |
|
|
85
85
|
|---|---|
|
|
86
86
|
| `arch-diagram` | 시스템 아키텍처 구성도 (PlantUML + 편집가능 PPTX) |
|
|
87
|
+
| `vertical-pptx` | A4 세로(210x297mm) 규격 PPTX 생성·점검·수리, 16:9 덱의 A4 세로 변환 |
|
|
87
88
|
| `make-notion-guide` | API 호출 가이드를 노션 양식 문서로 작성 |
|
|
88
89
|
| `pdf-vision-extract` | 비주얼 PDF를 고해상도 PNG로 변환(비전 입력) |
|
|
89
90
|
| `nothing-design` | Nothing 스타일 UI 디자인 적용 |
|
|
90
91
|
| `rfp-author` | 외주 제안요청서(RFP) 저작 (범용 프레임워크) |
|
|
91
92
|
| `humanizer` | AI 글 흔적 제거(자연스러운 문체로 윤문) |
|
|
92
|
-
| `lineage` | 세션 대화를 카카오톡 스타일 단일 HTML로 export |
|
|
93
|
+
| `lineage` | 세션 대화를 카카오톡 스타일 단일 HTML로 export (마크다운 렌더·하네스 노이즈 필터·다중 세션 병합) |
|
|
93
94
|
| `append_wiki` | 프로젝트 위키 문서 추가/보강 |
|
|
94
95
|
| `compact-wiki` | 위키 중복 제거·supersede·병합 (무손실) |
|
|
95
96
|
| `obsidizer` | AI 위키를 의미보존 Obsidian 그래프로 정규화·상호링크·백링크 |
|
|
@@ -110,7 +111,7 @@ Claude Code는 `/banker:<이름>`, Codex는 `banker-<이름>` 으로 호출합
|
|
|
110
111
|
| `refresh-git-ignore` | `.gitignore` 비파괴·반복가능 갱신 |
|
|
111
112
|
| `omc-reference` | OMC/OMX 에이전트·툴·스킬 레퍼런스(양 런타임 병기) |
|
|
112
113
|
| `curation` | 의사결정을 선택지·권고·확신수준으로 큐레이션(--perf=품질 우선) |
|
|
113
|
-
| `ralph-qa` |
|
|
114
|
+
| `ralph-qa` | 다중 Agent 백본이 항상 돌고, 실제로 유효한 외부 LLM 만 좌석으로 합류해 독립 검증 반복 |
|
|
114
115
|
| `smart-compact` | 컨텍스트 임계 초과 시 위키·resume 저장 게이트 자동 무장 |
|
|
115
116
|
| `deep-research` | 다중 소스 팬아웃 + 적대적 검증 인용 리서치 |
|
|
116
117
|
| `ultra-interview` | 리서치 선행으로 사람 질문 최소화, 모호성 3% 이하까지 인터뷰 |
|
|
@@ -120,6 +121,13 @@ Claude Code는 `/banker:<이름>`, Codex는 `banker-<이름>` 으로 호출합
|
|
|
120
121
|
| `refresh-readme` | 코드와 어긋난 README 를 현재 상태에 맞게 갱신(드리프트 해소) |
|
|
121
122
|
| `cleansing-memory` | 메모리 파일을 문서화된 threshold 내로 정리(중복 최신본화·무손실 압축) |
|
|
122
123
|
|
|
124
|
+
### 스킬: 미디어 (모션 그래픽 · 3D 인트로)
|
|
125
|
+
|
|
126
|
+
| 스킬 | 설명 |
|
|
127
|
+
|---|---|
|
|
128
|
+
| `motion-graphic-make` | 10초 내외 내레이션 없는 무료 모션 그래픽 제작 (hyperframes 위임) |
|
|
129
|
+
| `3d-intro-build` | 스크롤-스크럽 3D 인트로 사이트 제작 (Azure gpt-image-2 스틸 + Sora-2 영상, 유료) |
|
|
130
|
+
|
|
123
131
|
### 스킬: 개발환경 setup (OS별 · 런타임별)
|
|
124
132
|
|
|
125
133
|
USER_RESOURCES 가이드의 공통 요소를 OS별·런타임별(Claude Code/Codex)로 구성하는 얇은 실행 유닛.\
|
|
@@ -147,6 +155,9 @@ USER_RESOURCES 가이드의 공통 요소를 OS별·런타임별(Claude Code/Cod
|
|
|
147
155
|
| `setup-insane-search` | insane-search 플러그인 설치 (Claude·Codex) |
|
|
148
156
|
| `setup-stitch` | Stitch 디자인 MCP 프록시 등록(RockyLinux8 proxy) |
|
|
149
157
|
| `docs-setup` | arch-diagram·pdf-vision-extract 의존성(pptx·pymupdf·plantuml) 설치 |
|
|
158
|
+
| `vertical-pptx-setup` | vertical-pptx 의존성(pptxgenjs·python-pptx) + 시각 검증용 LibreOffice (OS·권한 적응형) |
|
|
159
|
+
| `motion-graphic-setup` | hyperframes(무료 모션 그래픽 CLI) 전제조건 설치 (Node≥22 + ffmpeg) |
|
|
160
|
+
| `3d-intro-setup` | 3D 인트로용 Azure 크레덴셜·의존성 설치 + 무과금 프리플라이트 (Node/ffmpeg) |
|
|
150
161
|
|
|
151
162
|
## 설치 상세 (npm · Codex)
|
|
152
163
|
|
|
@@ -164,7 +175,7 @@ banker uninstall # 제거
|
|
|
164
175
|
|
|
165
176
|
- `--scope project` 로 프로젝트 로컬(`./.codex`)에 설치하고, `--dry-run` 으로 미리 볼 수 있습니다.
|
|
166
177
|
- non-root 전용입니다(전역 sudo 설치 시 root 소유 파일을 방지). postinstall이 없으므로 `banker setup` 을 직접 실행합니다.
|
|
167
|
-
- Codex에는 스킬
|
|
178
|
+
- Codex에는 스킬 54개가 `~/.codex/skills/banker-<name>/` 에, 커맨드 2개가 `~/.codex/prompts/banker-<name>.md` 에 설치됩니다(`codex/manifest.json`). \
|
|
168
179
|
디렉터리명과 일치하도록 프론트매터 `name:` 이 `banker-<name>` 으로 재작성되어 Codex가 `banker-<name>` 으로 인식합니다.
|
|
169
180
|
- OMC/Claude 에 결합됐던 오케스트레이터·설치·유틸 표면(all-in-one·ultra-init·front-qa·setup·setup-omc·setup-omc-hud·setup-stitch·omc-reference·compact-copy)은 본문이 **런타임 인식**이라 Codex에서도 동작합니다.
|
|
170
181
|
- Codex에선 OMC 대신 **oh-my-codex(OMX)** 의 동명 스킬(ralplan·ralph·ultraqa·hud 등)과 `codex mcp`·내장 `/copy` 를 사용합니다(Codex는 `omx setup` 전제).
|
|
@@ -204,6 +215,8 @@ banker uninstall # 제거
|
|
|
204
215
|
| `setup-pwsh` | `env.CLAUDE_CODE_GIT_BASH_PATH` (병합) | — (네이티브 셸, 배선 불필요) |
|
|
205
216
|
| `harness-factory` | `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` (env 영속) | — |
|
|
206
217
|
| `smart-compact` | `statusLine.command` 래핑 + `UserPromptSubmit` 훅 추가 (백업·멱등) | `~/.codex/` 대응 |
|
|
218
|
+
| `motion-graphic-setup` | 설정 파일 미패치 (Node/ffmpeg 확보 + `npx hyperframes` 설치만) | 동일 (`config.toml` 미변경) |
|
|
219
|
+
| `3d-intro-setup` | `settings.json` 미패치 — 크레덴셜을 untracked env 파일에 기록(`.env.3d-intro.local` 또는 `~/.config/banker/3d-intro/env`) | 동일 (`config.toml` 미변경) |
|
|
207
220
|
|
|
208
221
|
`obsidizer` 는 `settings.json` 대신 `<위키디렉터리>/.obsidizer` 플래그 파일로만 켜고 끕니다.
|
|
209
222
|
|
|
@@ -214,6 +227,7 @@ banker uninstall # 제거
|
|
|
214
227
|
- 일부 스킬은 별도 의존성이 필요하며 `/banker:setup` 으로 설치합니다. 의존성이 없으면 각 스킬이 실행 전에 설치부터 안내합니다.
|
|
215
228
|
- `all-in-one`, `ultra-init`, `/banker:front-qa`: oh-my-claudecode(OMC). Codex에서는 OMX.
|
|
216
229
|
- `audit-web-page`, `play-qa`, `ultra-ui-qa`: playwright.
|
|
230
|
+
- `lineage`: Python 3.7+ (표준 라이브러리만 사용). RHEL8/Rocky8은 기본 `python3` 가 3.6이라 `setup-python` 등으로 3.11을 설치해 지정해야 합니다.
|
|
217
231
|
|
|
218
232
|
## 업데이트 / 제거
|
|
219
233
|
|
|
@@ -277,15 +291,18 @@ banker 자체는 **MIT** ([LICENSE](LICENSE)). Owner: [smallOpenSource](https://
|
|
|
277
291
|
- `skills/humanizer`: [blader/humanizer](https://github.com/blader/humanizer) 기반, **MIT License**(© 2025 Siqi Chen).\
|
|
278
292
|
원본 라이선스 고지는 `skills/humanizer/LICENSE` 에 포함.\
|
|
279
293
|
패턴 목록은 Wikipedia [*Signs of AI writing*](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing)(WikiProject AI Cleanup, **CC BY-SA**)에 기반합니다.
|
|
294
|
+
- `skills/3d-intro-build/references`: [oso95/scroll-world](https://github.com/oso95/scroll-world) 의 스크럽 엔진(`scrub-engine.js`·`index-template.html`)을 그대로 벤더링, **MIT License**(© 2026 cyw).\
|
|
295
|
+
원본 라이선스 고지는 `skills/3d-intro-build/references/LICENSE` 와 `NOTICE.md` 에 포함.
|
|
280
296
|
|
|
281
|
-
코드로 포함(재배포)하는 서드파티는 `humanizer`
|
|
297
|
+
코드로 포함(재배포)하는 서드파티는 `humanizer` 와 `scroll-world`(`3d-intro-build`) 둘입니다.\
|
|
282
298
|
아래는 스킬이 **런타임에 의존하거나 연동**하는 외부 요소로, banker 가 재배포하지 않으며 각 라이선스·상표는 소유자에게 있습니다.
|
|
283
299
|
|
|
284
300
|
**의존 라이브러리·도구 (사용 시 별도 설치, 라이선스는 각 프로젝트 소유)**
|
|
285
301
|
|
|
286
302
|
| 분류 | 도구 | 라이선스 | 사용 스킬 |
|
|
287
303
|
|---|---|---|---|
|
|
288
|
-
| Python | python-pptx | MIT | `arch-diagram` |
|
|
304
|
+
| Python | python-pptx | MIT | `arch-diagram` · `vertical-pptx` |
|
|
305
|
+
| Node | pptxgenjs | MIT | `vertical-pptx` |
|
|
289
306
|
| Python | python-docx | MIT | `rfp-author` |
|
|
290
307
|
| Python | Playwright | Apache-2.0 | `audit-web-page`·`play-qa`·`ultra-ui-qa` |
|
|
291
308
|
| Python | detect-secrets | Apache-2.0 | `lineage`(시크릿 스캔) |
|
|
@@ -306,6 +323,8 @@ banker 자체는 **MIT** ([LICENSE](LICENSE)). Owner: [smallOpenSource](https://
|
|
|
306
323
|
| 개발환경·LSP | psmux | 각 프로젝트 | `setup-tmux` |
|
|
307
324
|
| 개발환경·LSP | bubblewrap | LGPL-2.0 | `setup-sandbox` |
|
|
308
325
|
| 개발환경·LSP | rustup | 각 프로젝트 | `setup-sandbox` |
|
|
326
|
+
| 미디어·영상 | hyperframes (HeyGen) | Apache-2.0 | `motion-graphic-setup`·`motion-graphic-make` |
|
|
327
|
+
| 미디어·영상 | ffmpeg | LGPL-2.1+/GPL | `motion-graphic-setup`·`motion-graphic-make`·`3d-intro-setup`·`3d-intro-build` |
|
|
309
328
|
|
|
310
329
|
**연동·참조 (외부 프레임워크·서비스·브랜드, banker 는 재배포하지 않음)**
|
|
311
330
|
|
|
@@ -318,3 +337,4 @@ banker 자체는 **MIT** ([LICENSE](LICENSE)). Owner: [smallOpenSource](https://
|
|
|
318
337
|
| 서비스(독점·상표) | Google Stitch | 독점 | `setup-stitch` |
|
|
319
338
|
| 디자인(상표) | Nothing 디자인 언어 | 상표 | `nothing-design` |
|
|
320
339
|
| QA 엔진(예시) | Godot·Phaser 등 | MIT | `play-qa` |
|
|
340
|
+
| 서비스(독점·상표) | Microsoft Azure OpenAI (Sora-2·gpt-image-2·FLUX.2-pro) | 독점 | `3d-intro-setup`·`3d-intro-build` |
|
package/codex/manifest.json
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
"surfaces": [
|
|
5
5
|
{ "name": "append_wiki", "type": "skill", "target": "both", "reason": "knowledge capture; tool-agnostic workflow", "supportingFiles": [], "caveat": "uses wiki_* MCP (OMC/OMX) at runtime; copies fine, needs a wiki MCP present" },
|
|
6
6
|
{ "name": "arch-diagram", "type": "skill", "target": "both", "reason": "PlantUML+pptx diagramming; tool-agnostic", "supportingFiles": ["build_pptx_template.py"] },
|
|
7
|
+
{ "name": "vertical-pptx", "type": "skill", "target": "both", "reason": "A4 portrait (210x297mm) pptx spec: build, verify, repair, and 16:9 conversion; tool-agnostic", "supportingFiles": ["build_a4p.js", "build_a4p.py", "verify_a4p.mjs"], "caveat": "owns the spec only and delegates layout/color/charts to a pptx document skill when one is reachable, falling back to a minimal self-contained block otherwise; the verify path needs node, and building needs pptxgenjs or python-pptx which it never auto-installs (points at vertical-pptx-setup instead)" },
|
|
8
|
+
{ "name": "vertical-pptx-setup", "type": "skill", "target": "both", "reason": "installs what vertical-pptx runs on (pptxgenjs or python-pptx) plus optional LibreOffice for PDF render checks; OS and privilege adaptive", "supportingFiles": [], "caveat": "LibreOffice is optional and only buys visual/PDF confirmation; without root it extracts to a home prefix, and on RHEL8/Rocky8 the distro build is required because upstream 26.x needs a newer glibc than 2.28" },
|
|
7
9
|
{ "name": "audit-mock", "type": "skill", "target": "both", "reason": "static anti-pattern audit; tool-agnostic", "supportingFiles": [] },
|
|
8
10
|
{ "name": "audit-security", "type": "skill", "target": "both", "reason": "SCA/SAST/secrets methodology; tool-agnostic", "supportingFiles": [] },
|
|
9
11
|
{ "name": "audit-web-page", "type": "skill", "target": "both", "reason": "playwright live page audit; tool-agnostic", "supportingFiles": ["harness.py"], "caveat": "needs playwright (setup-playwright)" },
|
|
@@ -34,7 +36,7 @@
|
|
|
34
36
|
{ "name": "curation", "type": "skill", "target": "both", "reason": "decision-framing behavior (options/rec/confidence + --perf); no runtime deps; identical in both", "supportingFiles": [] },
|
|
35
37
|
{ "name": "deep-init", "type": "skill", "target": "both", "reason": "hierarchical AGENTS.md generation (port of OMC deepinit); runtime-agnostic fs+doc; subagents Claude=OMC/Codex=OMX", "supportingFiles": [] },
|
|
36
38
|
{ "name": "deep-research", "type": "skill", "target": "both", "reason": "fan-out + adversarial-verify web research (re-authored from bundled workflow); Claude WebSearch/Workflow, Codex OMX autoresearch; runtime-aware", "supportingFiles": [] },
|
|
37
|
-
{ "name": "ralph-qa", "type": "skill", "target": "both", "reason": "
|
|
39
|
+
{ "name": "ralph-qa", "type": "skill", "target": "both", "reason": "independent verify loop (ralplan+critic logic): multi-agent backbone always runs; externally-validated LLMs join as extra seats. Seat-lifecycle monotone gate (INCONCLUSIVE on seat loss) so adding or losing a seat can never widen it; runtime-aware", "supportingFiles": ["references/verifier-probe.mjs"] },
|
|
38
40
|
{ "name": "smart-compact", "type": "skill", "target": "both", "reason": "context-threshold compaction-hygiene gate (statusLine detect + hook bridge + assistant chain + TUI handoff); runtime-aware", "supportingFiles": [] },
|
|
39
41
|
{ "name": "visual-ralph", "type": "skill", "target": "both", "reason": "measured visual build loop (port of OMX visual-ralph); Claude ralph+visual-verdict+Stitch imagegen, Codex $ralph+$imagegen; runtime-aware", "supportingFiles": [] },
|
|
40
42
|
|
|
@@ -57,6 +59,11 @@
|
|
|
57
59
|
{ "name": "refresh-readme", "type": "skill", "target": "both", "reason": "brings a README back in line with the code it drifted from, before release; prose claims are cross-checked against the manifest, skills/, and package.json", "supportingFiles": [], "caveat": "README only. Fence/inline-code/URL/--flag aware: POSIX end-of-options ` -- ` is textually identical to prose double-hyphen, so a blanket sed/awk substitution is itself a defect. Delegates AI-writing markers to humanizer rather than restating them." },
|
|
58
60
|
{ "name": "cleansing-memory", "type": "skill", "target": "both", "reason": "keeps agent memory files inside their documented thresholds by de-duping to latest, condensing losslessly, and converting append-style records into replace-style", "supportingFiles": [], "caveat": "only MEMORY.md has a documented hard gate (200 lines or 25KB, whichever comes first); CLAUDE.md has NO documented size limit, so asserting a byte cap for it would be fabrication. Codex's 32768-byte project_doc_max_bytes covers project-scope AGENTS.md only, not the global one, and truncates raw bytes before a lossy UTF-8 decode, so cutting to an exact byte count corrupts the boundary character. Codebase-derivable CLAUDE.md trimming is left to Claude's own /doctor." },
|
|
59
61
|
|
|
62
|
+
{ "name": "motion-graphic-setup", "type": "skill", "target": "both", "reason": "installs hyperframes prereqs (Node22+ffmpeg per-OS) then npx hyperframes init/skills update/doctor; ffmpeg never bundled; runtime-agnostic installer", "supportingFiles": [], "caveat": "needs Node+ffmpeg; hyperframes npx-installed (Apache-2.0)" },
|
|
63
|
+
{ "name": "motion-graphic-make", "type": "skill", "target": "both", "reason": "thin wrapper delegating to hyperframes /motion-graphics (free form categories); owns no render pipeline; runtime-agnostic", "supportingFiles": [], "caveat": "needs hyperframes via motion-graphic-setup (npx, Apache-2.0)" },
|
|
64
|
+
{ "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"] },
|
|
65
|
+
{ "name": "3d-intro-build", "type": "skill", "target": "both", "reason": "scroll-scrub 3D intro via Azure Sora-2 forward-chaining + gpt-image-2 stills; vendored scroll-world engine (MIT); cross-platform Node", "supportingFiles": ["references/azure-adapter.mjs", "references/scrub-engine.js", "references/index-template.html", "references/prompts.md", "references/LICENSE", "references/NOTICE.md", "references/serve.mjs", "references/assemble.mjs", "references/curate.mjs"] },
|
|
66
|
+
|
|
60
67
|
{ "name": "front-qa", "type": "command", "target": "both", "reason": "ralplan->ralph frontend-QA pipeline; Claude=OMC, Codex=OMX", "supportingFiles": [] },
|
|
61
68
|
{ "name": "setup", "type": "command", "target": "both", "reason": "installer orchestrator; Claude AskUserQuestion multi-select, Codex prompt-based selection", "supportingFiles": [] }
|
|
62
69
|
]
|
|
@@ -27,7 +27,7 @@ The generator (`banker setup --codex`) applies the rules below for `target: both
|
|
|
27
27
|
- `visual-ralph` → OMX `$ralph`·`$imagegen`(+`omx imagegen continuation`)·Visual Verdict; Claude은 `ralph`+`visual-verdict`+Stitch/ccg imagegen.
|
|
28
28
|
- `deep-init` → 서브에이전트 Claude=OMC explore/architect/writer, Codex=OMX worker/explore(부재 시 직접 수행). 순수 fs+doc.
|
|
29
29
|
- `deep-research` → Claude 번들 워크플로/`WebSearch`, Codex OMX `autoresearch`/`best-practice-research`.
|
|
30
|
-
- `ralph-qa` →
|
|
30
|
+
- `ralph-qa` → 백본은 런타임 서브에이전트(Claude=Agent/Task `model: opus`, Codex=OMX 서브에이전트)로 양쪽 동일. 외부 좌석만 런타임별로 갈린다: Claude=`codex exec`/`omc ask codex`, Codex=`omx $ask claude`(Codex 런타임에서 `codex exec` 는 자기 자신이라 부적격).
|
|
31
31
|
- `smart-compact` → Claude statusLine `context_window.used_percentage`+hook; Codex 신호 미확인 시 휴리스틱 폴백. TUI 3단(`/copy`·`/compact`·paste)은 유저.
|
|
32
32
|
- `curation` → 런타임 무관(외부 의존 0, 양쪽 동일).
|
|
33
33
|
|
|
@@ -36,7 +36,7 @@ The generator (`banker setup --codex`) applies the rules below for `target: both
|
|
|
36
36
|
- `audit-web-page`, `play-qa`, `ultra-ui-qa` — need playwright (install via `setup-playwright`).
|
|
37
37
|
- `setup-playwright` — genericize the `/banker:setup` trigger phrasing for the Codex copy.
|
|
38
38
|
- `visual-ralph` — needs an imagegen path (Stitch via `setup-stitch`, or `/ccg`/Gemini) + a frontend repo; static/live-URL reference works without imagegen.
|
|
39
|
-
- `ralph-qa` —
|
|
39
|
+
- `ralph-qa` — runs with no external dependency: the multi-agent backbone always runs, and external LLM seats join only when a 0-token probe observes them valid. Their absence is a coverage fact (model axis uncovered), not a degraded mode. A same-runtime `critic` is never substituted for an external seat — on Codex that would be GPT approving GPT, i.e. self-approval.
|
|
40
40
|
- `deep-research` — needs web search/fetch (Claude WebSearch/WebFetch or bundled workflow; Codex OMX autoresearch).
|
|
41
41
|
- `smart-compact` — Claude statusLine exposes context%; Codex signal unconfirmed → heuristic fallback; `/copy`·`/compact`·paste stay user-driven (TUI).
|
|
42
42
|
- `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.
|
package/commands/setup.md
CHANGED
|
@@ -35,6 +35,8 @@ banker 플러그인이 제공하는 설치 스킬들을 **multi-select**로 골
|
|
|
35
35
|
**의존성 라이브러리**
|
|
36
36
|
- **setup-playwright** — Playwright + 브라우저 + Xvfb(RHEL8/Rocky8 폴백). (`ultra-ui-qa`·`audit-web-page`·`play-qa` 의존성)
|
|
37
37
|
- **docs-setup** — arch-diagram·pdf-vision-extract 의존성(python-pptx·pymupdf·plantuml). (의존: python)
|
|
38
|
+
- **motion-graphic-setup** — hyperframes(무료 모션 그래픽 CLI) 전제조건(Node≥22 + ffmpeg → `npx hyperframes`). (`motion-graphic-make` 의존성)
|
|
39
|
+
- **3d-intro-setup** — Azure Sora-2/gpt-image-2 3D 인트로용 크레덴셜·의존성(Node/ffmpeg) + 무과금 프리플라이트. (`3d-intro-build` 의존성)
|
|
38
40
|
|
|
39
41
|
2. **실행**: 선택된 각 항목을 호출한다(미선택은 건드리지 않음). Claude Code는 `Skill("banker:<name>")`, **Codex 런타임에선 설치된 `banker-<name>` 스킬을 적용**한다(예: `Skill("banker:setup-node")`).
|
|
40
42
|
- **의존 순서 강제**: 뒤 계층을 고르면 전제 스킬을 먼저 실행한다 — `setup-lsp` 전에 setup-node·setup-python·setup-java; `setup-mcp` 전에 setup-node·setup-python; `docs-setup` 전에 setup-python. 이미 설치돼 있으면 각 스킬이 감지해 skip(멱등).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kaydash9999/banker-plugins",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.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"
|
|
@@ -19,6 +19,11 @@
|
|
|
19
19
|
"hooks",
|
|
20
20
|
"bin",
|
|
21
21
|
"!**/*.test.mjs",
|
|
22
|
+
"!**/test_*.py",
|
|
23
|
+
"!**/__pycache__",
|
|
24
|
+
"!**/__pycache__/**",
|
|
25
|
+
"!**/.omc",
|
|
26
|
+
"!**/.omc/**",
|
|
22
27
|
"LICENSE",
|
|
23
28
|
"README.md",
|
|
24
29
|
"CHANGELOG.md",
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 3d-intro-build
|
|
3
|
+
description: "(banker) 브랜드 인트로용 스크롤-스크럽 3D fly-through 사이트를 Azure(gpt-image-2 스틸 + Sora-2 forward-chaining)로 제작: 인터뷰 → 비용 승인 게이트 → 스틸 → fly-through → 로컬 프리뷰. '3d-intro-build'/'3D 인트로'/'스크롤 fly-through'/'인트로 영상 사이트' 시 사용."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 3d-intro-build — 스크롤-스크럽 3D 인트로 제작 (Azure 파이프라인)
|
|
7
|
+
|
|
8
|
+
스크롤에 맞춰 카메라가 미니어처 세계를 날아 들어가는 브랜드 인트로 사이트를 만든다.
|
|
9
|
+
씬 스틸은 `gpt-image-2`, fly-through 영상은 `Sora-2` 로 Azure 에서 생성하고, scroll-world 엔진으로 한 장의 자체완결 HTML 에 배선한다.
|
|
10
|
+
|
|
11
|
+
이 스킬은 **오케스트레이션**만 소유한다.
|
|
12
|
+
모든 Azure 호출·ffmpeg 처리는 `references/azure-adapter.mjs`(정본)에 있으니 재구현하지 말고 그 export 를 부른다.
|
|
13
|
+
엔진(`references/scrub-engine.js`)과 템플릿(`references/index-template.html`)은 벤더링본이라 **수정하지 않는다**(출처는 `references/NOTICE.md`).
|
|
14
|
+
답변은 한글(기술 토큰·경로·명령은 영문).
|
|
15
|
+
|
|
16
|
+
**유료 호출은 딱 다섯 개다:** `generateImage`, `generateImageFlux`, `editImage`, `createVideo`, `createVideoTwoImage`.
|
|
17
|
+
이 중 **어느 것도 Step 2 의 명시적 승인 이전에는 실행하지 않는다.**
|
|
18
|
+
Step 0~2 에서 쓰는 `resolveCreds`·`resolveFfmpeg`·`detectTwoImageSupport`·`estimateCost` 는 전부 과금이 없다.
|
|
19
|
+
게다가 가장 비싼 `createVideo`·`createVideoTwoImage` 는 **Step 3.5 에서 사용자가 스틸을 고르기 전에는 실행하지 않는다**(무료 큐레이션 게이트).
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Step 0 — 프리플라이트 (무료)
|
|
24
|
+
|
|
25
|
+
크리덴셜과 ffmpeg 가 준비됐는지 먼저 확인한다.
|
|
26
|
+
문제가 있으면 **설치부터 안내**하고 멈춘다(추정·임의 재설치 금지).
|
|
27
|
+
|
|
28
|
+
```js
|
|
29
|
+
import { resolveCreds, resolveFfmpeg } from './references/azure-adapter.mjs';
|
|
30
|
+
const creds = resolveCreds({ projectDir }); // _source === null 이면 미설정
|
|
31
|
+
// setup 이 ffmpeg 경로를 creds 에 FFMPEG_PATH 로 영속했으면 이 프로세스 env 에 적용(다른 세션/no-PATH 대비)
|
|
32
|
+
if (creds.FFMPEG_PATH && !process.env.FFMPEG_PATH) process.env.FFMPEG_PATH = creds.FFMPEG_PATH;
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- `creds._source` 가 `null` 이면 크리덴셜이 없다 → `3d-intro-setup` 으로 보낸다.
|
|
36
|
+
Claude Code: `/banker:setup` → 3d-intro-setup / Codex: `banker-3d-intro-setup`.
|
|
37
|
+
- `resolveFfmpeg()` 가 throw 하면 ffmpeg 가 없다 → 같은 `3d-intro-setup` 으로 보낸다.
|
|
38
|
+
- 둘 다 통과해야 다음 단계로 간다.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Step 1 — 인터뷰 (무료)
|
|
43
|
+
|
|
44
|
+
`references/prompts.md` 의 인테이크 체크리스트를 따른다.
|
|
45
|
+
아래 다섯 가지는 **반드시** 묻는다.
|
|
46
|
+
|
|
47
|
+
- **SUBJECT** — 대상 비즈니스/제품 + 한 줄 소개.
|
|
48
|
+
- **BRAND** — 화면에 표시할 브랜드명.
|
|
49
|
+
- **SCENES[] (순서 있는 씬 목록)** — 각 씬의 `id`·`label`·`subject`·`eyebrow`·`title`·`body`·`tags[]`. 마지막 씬 = 히어로 제품 + CTA.
|
|
50
|
+
- **ORIENTATION** — `720x1280`(세로) 또는 `1280x720`(가로). 스틸과 영상 크기가 이 값으로 통일된다.
|
|
51
|
+
- **BUDGET** — 상한 USD.
|
|
52
|
+
|
|
53
|
+
부수 항목(없으면 기본값): `PALETTE`(배경색 하나·accent 하나 지정), `TONE`, `STYLE`(기본 clay diorama), `CAMERA_FEEL`, `MOBILE`(yes 면 약 2배 비용), `STILLS_SOURCE`(기본 gpt-image-2, 코히전 강화 원하면 FLUX 옵트인).
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Step 2 — 비용 추정 + 승인 게이트 (무료 · 필수 · 유료 호출 차단선)
|
|
58
|
+
|
|
59
|
+
유료 생성 **이전에** 반드시 총액을 제시하고 명시적 승인을 받는다.
|
|
60
|
+
two-image 커넥터를 검토 중이면 여기서 무료 probe 로 지원 여부만 확인해 추정에 반영한다.
|
|
61
|
+
|
|
62
|
+
```js
|
|
63
|
+
import { estimateCost, detectTwoImageSupport } from './references/azure-adapter.mjs';
|
|
64
|
+
const twoImage = wantConnectors && await detectTwoImageSupport({ endpoint, key }); // 무료 GET probe
|
|
65
|
+
const cost = estimateCost({ nScenes, seconds, twoImage }); // { images, videos, usd }
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- 사용자에게 `cost.images` / `cost.videos` / `cost.usd` 와 BUDGET 대비를 보여준다.
|
|
69
|
+
- MOBILE=yes 면 세로 체인이 추가돼 대략 2배임을 명시한다.
|
|
70
|
+
- **명시적 승인이 없으면 여기서 멈춘다.** 승인 전에는 Step 3·4 의 유료 호출로 진입하지 않는다.
|
|
71
|
+
- BUDGET 을 초과하면 씬 수·`seconds`·품질을 줄이는 선택지를 제시하고 다시 추정한다.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Step 3 — 씬 스틸 (유료 · 승인 이후에만)
|
|
76
|
+
|
|
77
|
+
기본은 `gpt-image-2`(`generateImage`).
|
|
78
|
+
씬마다 `references/prompts.md` 의 스타일 서문 + 씬 subject 로 프롬프트를 만들되, **스타일 서문은 모든 씬에 글자 그대로 동일**하게 넣어 코히전을 만든다.
|
|
79
|
+
|
|
80
|
+
```js
|
|
81
|
+
import { generateImage, generateImageFlux, probeDims } from './references/azure-adapter.mjs';
|
|
82
|
+
const png = await generateImage({ endpoint, key, deployment, prompt, size: ORIENTATION, quality });
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- **큐레이션용 변형(권장)** — 다음 Step 3.5 에서 사용자가 실제로 고를 수 있게, 씬마다 `generateImage` 를 한 번 더 불러 변형 스틸을 하나 더 만든다(스틸은 싼 티어라 부담이 작다).
|
|
86
|
+
변형을 넣으면 스틸 비용이 대략 씬당 2배이니 **Step 2 추정에 미리 반영**한다. 변형 없이 씬당 1장만 만들어도 Step 3.5 의 "이 스틸로 승인 / 다시 만들기" 결정은 그대로 받는다.
|
|
87
|
+
- **FLUX 옵트인** — 씬 간 톤·질감 일관성을 더 원하면 `generateImageFlux({ width, height })`(ORIENTATION 을 나눠 전달).
|
|
88
|
+
FLUX 크리덴셜을 요청했는데 미수집이면 조용히 실패하지 말고 `gpt-image-2` 로 **정직하게 폴백**한다("FLUX 미수집 → gpt-image-2 로 진행").
|
|
89
|
+
- **N3 주의(씨앗 스틸 크기)** — `generateImage` 의 classic 폴백이 뜨면 반환 크기가 `1024x1536`(2:3)라 `720x1280` 이 아니다.
|
|
90
|
+
체인 씨앗이 되는 **씬 1 스틸**은 `probeDims` 로 확인해 ORIENTATION 과 다르면 `createVideo` 전에 Sora 크기로 리사이즈(`resolveFfmpeg` + ffmpeg `scale`)하거나 재생성한다.
|
|
91
|
+
v1 경로(`720x1280`)가 검증된 happy path 다.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Step 3.5 — 스틸 큐레이션 (무료 · 사용자 선택 · 영상 차단선)
|
|
96
|
+
|
|
97
|
+
스틸은 값싼 유료 티어지만, fly-through(Step 4)는 이 파이프라인에서 **가장 비싼** 단계다.
|
|
98
|
+
그러니 비싼 영상 호출을 쓰기 전에, 방금 만든 스틸을 사용자가 직접 브라우저에서 보고 씬별로 고르게 한다.
|
|
99
|
+
이 단계는 전부 **무료**이며, Step 2 의 비용 게이트에 더해 "사용자가 고른 스틸에만 영상비를 쓴다" 는 **두 번째 게이트**를 만든다.
|
|
100
|
+
|
|
101
|
+
**1) 큐레이션 입력을 쓴다.** 프로젝트 dir 에 `curate-input.json` 을 적는다.
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"scenes": [
|
|
106
|
+
{ "id": "sceneA", "label": "Scene A — 로비",
|
|
107
|
+
"variants": [ { "file": "still-A-1.png", "prompt": "…" }, { "file": "still-A-2.png", "prompt": "…" } ] },
|
|
108
|
+
{ "id": "sceneB", "label": "Scene B — 히어로 제품",
|
|
109
|
+
"variants": [ { "file": "still-B-1.png" } ] }
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- `file` 은 프로젝트 dir 기준 상대 png 경로다(서버가 path-traversal 가드로 그 안에서만 서빙한다).
|
|
115
|
+
- `label`·`prompt` 는 화면 표시용일 뿐 선택 결과에 영향을 주지 않는다.
|
|
116
|
+
|
|
117
|
+
**2) 큐레이션 서버를 백그라운드로 띄우고 로컬 URL 을 출력한다.**
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
node references/curate.mjs <projectDir> # → curate-port.txt + CURATE http://localhost:<port>/ (백그라운드)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
- 페이지는 씬마다 변형 카드를 보여주고, 클릭으로 하나를 고른다(선택된 카드가 하이라이트된다).
|
|
124
|
+
- 각 씬엔 "재생성 메모"(수정 프롬프트) 입력이 있다 — 비우면 그 스틸로 승인, 채우면 그 씬을 다시 만들라는 뜻이다.
|
|
125
|
+
- 사용자가 "선택 확정" 을 누르면 서버가 `selection.json` 을 쓰고, 페이지에 "선택 저장됨 — 에이전트로 돌아가세요" 가 뜬다.
|
|
126
|
+
|
|
127
|
+
**3) 사용자가 확정할 때까지 기다린다.** 프로젝트 dir 에 `selection.json` 이 나타나면 진행한다.
|
|
128
|
+
파일이 아직 없으면 사용자가 고르는 중이니 Step 4 로 넘어가지 않는다.
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
{ "scenes": [
|
|
132
|
+
{ "id": "sceneA", "chosen": "still-A-2.png" },
|
|
133
|
+
{ "id": "sceneB", "chosen": "still-B-1.png", "regenerate": "배경 더 어둡게, 캐릭터 2명 추가" }
|
|
134
|
+
] }
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
- `chosen` = 그 씬에 대해 사용자가 고른 스틸 파일(= 이후 영상의 씨앗/포스터로 쓸 파일).
|
|
138
|
+
- `regenerate` = 있으면 그 씬을 이 메모대로 다시 만들라는 요청이고, 없으면 승인이다.
|
|
139
|
+
|
|
140
|
+
**4) 재생성 요청이 있으면 3.5 안에서 루프한다.**
|
|
141
|
+
`regenerate` 가 달린 씬은 그 메모를 스타일 서문 뒤 subject 에 반영해 `generateImage` 로 그 씬만 다시 만든다.
|
|
142
|
+
새 스틸로 `curate-input.json` 을 갱신하고, 헷갈리지 않게 오래된 `selection.json` 을 지운 뒤 다시 서빙해 재확인을 받는다.
|
|
143
|
+
모든 씬이 `regenerate` 없이 확정될 때까지 반복한다.
|
|
144
|
+
|
|
145
|
+
**5) 확정된 스틸만 Step 4 로 넘긴다.**
|
|
146
|
+
각 씬의 씨앗 스틸 = 그 씬의 `chosen` 이다.
|
|
147
|
+
승인되지 않은/버려진 변형에는 **영상비를 한 푼도 쓰지 않는다.**
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Step 4 — Fly-through (유료 · forward-chaining)
|
|
152
|
+
|
|
153
|
+
**이 단계는 Step 3.5 에서 사용자가 확정한 스틸에만 돈을 쓴다** — 각 씬의 씨앗은 `selection.json` 의 `chosen` 이고, 승인되지 않은/버려진 변형으로는 영상을 만들지 않는다.
|
|
154
|
+
|
|
155
|
+
Azure `/videos` 는 `input_reference` 를 **하나만** 받으므로(두-이미지는 400), 연속성은 **forward-chaining** 으로 만든다.
|
|
156
|
+
직전 클립의 **실제 마지막 프레임을 톤 변형 없이 그대로** 다음 클립의 `input_reference` 로 넣는다.
|
|
157
|
+
(시드 프레임에 histeq 톤 정합을 걸면 시작 톤이 바뀌어 연속성이 **오히려 나빠진다** — e2e 실측 raw-시드 SSIM ~0.59 vs histeq-시드 0.46. 톤 정합은 시드가 아니라 조립/재생 계층에서 처리한다.)
|
|
158
|
+
|
|
159
|
+
```js
|
|
160
|
+
import { createVideo, pollVideo, downloadVideo,
|
|
161
|
+
extractLastFrame, extractFirstFrame } from './references/azure-adapter.mjs';
|
|
162
|
+
|
|
163
|
+
// Leg 0 — 씬 1 스틸에서 dive-in
|
|
164
|
+
let job = await createVideo({ endpoint, key, prompt: leg0, size: ORIENTATION, seconds, inputReferencePng: scene1Still });
|
|
165
|
+
await pollVideo({ endpoint, key, id: job.id });
|
|
166
|
+
const clip0 = await downloadVideo({ endpoint, key, id: job.id }); // mp4 Buffer → dive-1.mp4
|
|
167
|
+
|
|
168
|
+
// Leg i (i ≥ 1) — 직전 클립의 RAW 마지막 프레임을 그대로 다음 input_reference 로 (톤 변형 금지)
|
|
169
|
+
const last = await extractLastFrame('dive-i.mp4', 'last-i.png');
|
|
170
|
+
job = await createVideo({ endpoint, key, prompt: legi, size: ORIENTATION, seconds, inputReferencePng: fs.readFileSync('last-i.png') });
|
|
171
|
+
// poll → download → dive-(i+1).mp4
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
- **각 leg 렌더 직후, 다음 leg 전에 마지막 프레임을 확인**한다. 잔잔한 전진 활공 컷이 아니면 그 leg 를 재생성한다(나쁜 핸드오프 프레임이 뒤 leg 를 오염시킨다).
|
|
175
|
+
- **포스터(스틸) 배선** — 씬 1 포스터 = 씬 1 스틸. 씬 i≥2 포스터 = `extractFirstFrame(clip_i)` (클립 첫 프레임과 정확히 일치 → 로딩 시 플래시 없음).
|
|
176
|
+
- **Seam 처리** — `intro.json` 의 `connectors` 를 전부 `null` 로 두면 엔진이 인접 dive 를 **직접 crossfade** 한다. forward-chaining 으로 첫/끝 프레임이 같은 구도로 이어져 있어(e2e 실측 raw-시드 SSIM ~0.59, 구성 연속·경미한 톤 drift) 엔진의 짧은 crossfade 가 잔여 drift 를 덮는다. (`colorMatch` 는 **시드엔 걸지 않는다** — 필요하면 조립 전 클립 전체 톤 그레이드용 선택 유틸일 뿐이다.)
|
|
177
|
+
- **two-image 커넥터(옵트인 · UNVALIDATED)** — 사용자가 명시적으로 원하고 `detectTwoImageSupport()` 가 참일 때만 `createVideoTwoImage({ firstPng, lastPng })` 로 진짜 커넥터를 만든다.
|
|
178
|
+
스모크로 검증되지 않은 경로다 → **어떤 실패에도 forward-chaining 으로 폴백**한다.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Step 5 — 조립 & 로컬 프리뷰 (무료)
|
|
183
|
+
|
|
184
|
+
씬·커넥터·테마를 `intro.json` 매니페스트로 적고(`assemble.mjs` 헤더에 형식), 조립한 뒤 사용하지 않는 포트로 서빙한다.
|
|
185
|
+
`intro.json` 의 각 섹션 카피(`eyebrow`/`title`/`body`/`tags`)와 `theme.bg`(= 씬 배경색)를 채운다.
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
node references/assemble.mjs <projectDir> # → <projectDir>/site (index.html + scrub-engine.js + assets/)
|
|
189
|
+
node references/serve.mjs <projectDir>/site # → port.txt + PREVIEW http://localhost:<port>/ (백그라운드)
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
- 결과는 **한 장의 자체완결 HTML** 이다(엔진·에셋을 옆에 복사).
|
|
193
|
+
- 프로젝트 관례상 **claude.ai 아티팩트를 만들지 않는다** — 로컬 HTML 을 포트로 서빙해 사용자가 브라우저로 확인한다.
|
|
194
|
+
- `serve.mjs` 는 mp4 를 HTTP Range(206)로 내보내 스크럽이 매끄럽고, 포트를 자동으로 잡아 `port.txt` 에 적는다.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Step 6 — Seam 품질 보고 (정직 · 조건부)
|
|
199
|
+
|
|
200
|
+
이음매 품질은 경로에 따라 **정직하게** 표현한다. 과장하지 않는다.
|
|
201
|
+
|
|
202
|
+
- **무료 forward-chain(기본):** 이음매가 **near-seamless** 하되 **경미한 톤/디테일 drift** 가 있을 수 있다.
|
|
203
|
+
- **two-image(옵트인):** 지원되면 **seamless**(단 UNVALIDATED — 미지원/실패 시 forward-chain 으로 떨어진다).
|
|
204
|
+
- **수용 기준은 조립·서빙된 페이지**다 — raw 프레임 SSIM 이 아니다.
|
|
205
|
+
참고로 forward-chain 의 pre-composite raw SSIM 은 ~0.59(가시 drift 대역)로 측정됐지만, 최종 판정은 crossfade·colorMatch 가 적용된 **서빙 페이지의 실제 스크럽 경험**으로 한다.
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 완료 보고
|
|
210
|
+
|
|
211
|
+
- 산출물 경로(`site/index.html`)와 프리뷰 URL(포트).
|
|
212
|
+
- 씬 수·`seconds`·ORIENTATION·사용 모델(gpt-image-2 / FLUX, 커넥터 경로).
|
|
213
|
+
- **실제 소요 비용**(추정 대비).
|
|
214
|
+
- seam 판정(위 조건부 표현으로) + 재생성한 leg 가 있으면 그 사유.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 cyw
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# NOTICE — 서드파티 출처 (3d-intro-build)
|
|
2
|
+
|
|
3
|
+
이 스킬의 `references/` 는 서드파티 코드 일부를 재사용한다.
|
|
4
|
+
아래는 그 출처와 라이선스를 실제 재사용 범위에 한정해 밝힌 것이다.
|
|
5
|
+
|
|
6
|
+
## 그대로 벤더링한 파일 (VERBATIM)
|
|
7
|
+
|
|
8
|
+
- **`scrub-engine.js`**
|
|
9
|
+
- **`index-template.html`**
|
|
10
|
+
|
|
11
|
+
두 파일 모두 **scroll-world**(https://github.com/oso95/scroll-world)에서 **글자 그대로** 가져왔다.
|
|
12
|
+
라이선스: MIT, Copyright (c) 2026 cyw.
|
|
13
|
+
전문은 이 디렉터리의 `LICENSE` 파일에 있으며, MIT 조건에 따라 그 저작권·허가 고지를 함께 배포한다.
|
|
14
|
+
두 파일은 이 스킬에서 **수정하지 않는다**(정본은 상류 scroll-world 다).
|
|
15
|
+
|
|
16
|
+
## 접근을 각색한 것 (ADAPTED, 코드 아님)
|
|
17
|
+
|
|
18
|
+
- **`prompts.md`**
|
|
19
|
+
|
|
20
|
+
scroll-world 의 씬/아트디렉션 **구조**(스타일 서문을 씬마다 동일하게 두어 코히전을 만드는 방식, forward-chaining leg 프롬프트의 모션-핸드오프 계약)를 참고해 각색했다.
|
|
21
|
+
문구 자체는 이 스킬의 Azure 파이프라인(`gpt-image-2` + `Sora-2`)에 맞춰 새로 썼고, scroll-world 의 외부 CLI(Higgsfield·Monid) 플래그는 옮기지 않았다.
|
|
22
|
+
구조적 아이디어의 출처로서 위 MIT 저작자에게 귀속을 표한다.
|
|
23
|
+
|
|
24
|
+
## 벤더링/번들하지 않은 것
|
|
25
|
+
|
|
26
|
+
- **ffmpeg** — 번들하지 않는다. `azure-adapter.mjs` 의 `resolveFfmpeg()` 가 런타임에 시스템 바이너리(또는 선택적 `ffmpeg-static`)를 찾고, 설치는 `3d-intro-setup` 스킬이 담당한다.
|
|
27
|
+
- **hyperframes** — 이 스킬은 쓰지 않는다(형제 스킬 `motion-graphic-make` 가 `npx` 로 호출할 뿐이며, 어느 경우에도 벤더링하지 않는다).
|
|
28
|
+
|
|
29
|
+
## 이 스킬의 자작 파일 (서드파티 아님)
|
|
30
|
+
|
|
31
|
+
`azure-adapter.mjs`, `serve.mjs`, `assemble.mjs`, `prompts.md`, `SKILL.md` 는 이 스킬의 창작물이다.
|
|
32
|
+
이 중 재사용에 해당하는 것은 위에 밝힌 `prompts.md` 의 **구조 각색**뿐이다.
|