@kaydash9999/banker-plugins 0.10.0 → 0.12.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 +39 -0
- package/README.md +73 -11
- package/codex/manifest.json +8 -1
- 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 +59 -32
- 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.12.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,44 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.12.0] - 2026-08-09
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **모션 그래픽 스킬 쌍(무료 · hyperframes)을 추가했다.**\
|
|
7
|
+
`motion-graphic-setup` 은 Node≥22 와 ffmpeg 를 OS별로 확보한 뒤 `npx hyperframes` 로 도구를 준비한다.\
|
|
8
|
+
`motion-graphic-make` 는 렌더 파이프라인을 소유하지 않는 얇은 래퍼로, 10초 내외 내레이션 없는 모션 그래픽 제작을 hyperframes 의 `/motion-graphics` 워크플로에 위임한다.
|
|
9
|
+
- **3D 인트로 스킬 쌍(유료 · Azure Sora-2 + gpt-image-2)을 추가했다.**\
|
|
10
|
+
`3d-intro-setup` 은 Node/ffmpeg 확보와 Azure 크레덴셜 저장, 무과금 프리플라이트까지만 담당해 과금 없이 연결을 검증한다.\
|
|
11
|
+
`3d-intro-build` 는 gpt-image-2 스틸과 Sora-2 forward-chaining 영상으로 스크롤-스크럽 3D 인트로 사이트를 제작한다.
|
|
12
|
+
- **scroll-world 스크럽 엔진(MIT)을 `3d-intro-build/references` 에 번들로 포함했다.**\
|
|
13
|
+
스크롤에 맞춰 3D 씬을 재생하는 이 엔진(`scrub-engine.js`·`index-template.html`)은 [oso95/scroll-world](https://github.com/oso95/scroll-world) 에서 그대로 벤더링했고, 원본 MIT 고지(`LICENSE`·`NOTICE.md`)를 함께 넣었다.
|
|
14
|
+
- **ffmpeg · hyperframes · Azure 는 사용자가 직접 공급하는 런타임 의존성이며 banker 가 번들하지 않는다.**\
|
|
15
|
+
hyperframes 는 `npx` 로 설치(Apache-2.0)하고, ffmpeg 는 OS 패키지로 확보하며, Azure(OpenAI · Sora-2 · gpt-image-2 · FLUX.2-pro)는 사용자 크레덴셜로 호출한다(과금은 사용자 부담).
|
|
16
|
+
- **A4 세로 PPTX 스킬 쌍 `vertical-pptx` · `vertical-pptx-setup` 을 추가했다.**\
|
|
17
|
+
`vertical-pptx` 는 A4 세로(210×297mm) 규격 PPTX 를 생성·점검·수리하고, 16:9 덱을 A4 세로로 변환한다(인쇄용 세로형 슬라이드).\
|
|
18
|
+
`vertical-pptx-setup` 은 빌더 의존성(pptxgenjs·python-pptx)과 시각 검증용 LibreOffice 를 OS·권한 감지 후 설치한다(root 없으면 홈 프리픽스로 추출).
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
- **🔴 `lineage` 세션 export 스킬을 전면 개편했다(2.0.0 · BREAKING).**\
|
|
22
|
+
실측(6세션·62MB·4,645레코드) 대조에서 산출물의 2/3가 대화가 아니었고 일부는 하네스 주입이 사용자 발언으로 오표시됐다 — 이를 바로잡되 진짜 사용자 발언은 한 건도 잃지 않도록 다시 만들었다.\
|
|
23
|
+
래퍼 없는 하네스 주입(스킬 본문·compaction 요약·에이전트 보고·이미지 노트)을 **위치가 아니라 형태로** 걸러 내고(위치 기반이 지우던 사용자 정정·인용 질문은 보존), 서브에이전트·동료 보고는 별도 회색 버블로 분리한다(발신자명 표시·idle 알림 폐기).\
|
|
24
|
+
Claude 본문을 **무의존 마크다운으로 렌더**한다(헤딩·리스트·표·코드펜스·인용·강조·링크; `html.escape` **후에만** 변환하고 코드/링크를 먼저 도려내 마크업/서식 주입을 차단, 링크는 `https?://` 만).\
|
|
25
|
+
연속된 assistant 레코드를 `--hide-tool-only` 앞에서 병합해 그동안 한 번도 표시되지 않던 `🔧 도구 N건` 을 살리고, 요약을 head+tail 로 뽑아 "무엇을 시작했다"가 아니라 결론을 담게 했다(요약기 버전을 캐시 키에 넣어 알고리즘 변경 시 자동 무효화).\
|
|
26
|
+
여러 세션을 레코드 단위 시간순 한 줄기로 합치는 `--all-sessions` 를 추가했다.\
|
|
27
|
+
단축키를 한글 IME·`Ctrl`/`Cmd`/`Alt` 안전하게 고치고(`e.code` 우선이라 브라우저 기본 동작을 가로채지 않음), 날짜·세션전환·compaction 을 형태가 다른 알약으로 구분(대비 개선·헤더가 스크롤에 따라 갱신), 범례를 우하단 `?` 오버레이로 옮겼다(배경 클릭으로만 닫힘·`aria-modal`).\
|
|
28
|
+
`self_verify` 가 렌더러 출력의 모든 태그를 HTMLParser 스택으로 검사(void 요소 14종 인지)해 개수는 맞지만 어긋난 마크업까지 배포 전에 잡는다.\
|
|
29
|
+
경로 인코딩을 바로잡았다: cwd 의 모든 비영숫자를 `-` 로 매핑(`_` 포함·Windows 경로 포함) — 이전엔 `/` 만 치환해 밑줄이 든 경로에서 자동탐색이 실패했다. 비-UTF8 세션 파일 하나가 전체 export 를 실패시키던 문제도 그 파일만 건너뛰게 고쳤다.\
|
|
30
|
+
**BREAKING — 기본값 반전 3건**: 첫 로드 **접힘**(펼치려면 `--open`), 마크다운 렌더 **기본 ON**(끄려면 `--no-markdown`), 하네스 노이즈 필터 **기본 ON**(남기려면 `--keep-trivia`). 400자 초과 사용자 메시지도 접힌다. 1.x 동작을 원하면 `--open --no-markdown --keep-trivia`.\
|
|
31
|
+
표준 라이브러리만 쓰는 `test_lineage.py`(회귀 143 단언·외부 의존 0)를 추가해 `scripts/smoke-test.js` 가 인터프리터 ≥3.7 을 자동 탐지해 CI 에서 돌리고(EL8 기본 python3=3.6 은 skip), npm 패키지에서는 제외한다.
|
|
32
|
+
|
|
33
|
+
## [0.11.0] - 2026-08-08
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
- **`ralph-qa` 교차검증 경로를 3단 우선순위로 재설계.** 방금 만든 결과를 다른 모델로 독립 검증할 때(자기승인 방지), 이제 ① 다른-LLM CLI(**Codex CLI 우선**; 저자가 Codex면 Claude/Gemini) → ② 다른 모델 직접 `curl`(크리덴셜이 있고 저자와 다른 계열일 때, 엔드포인트·키·모델을 env 로 파라미터화) → ③ 자체 다중 에이전트 합의(기본 3개·렌즈 분담·정족수, 최후 수단) 순으로 사용 가능한 첫 경로를 택한다. 이전엔 다른-LLM 경로 실패 시 같은-런타임 critic 하나로 곧장 후퇴했으나, 그 앞에 진짜 다른 모델(`curl`) 경로를 끼워 독립성을 실질적으로 강화했다. `--agents=N` 플래그를 추가했다.
|
|
37
|
+
- **README 빠른 시작의 Claude Code 설치를 인앱 `/plugin` 우선으로.** 실행 중인 세션에서 `/plugin marketplace add …` + `/plugin install …@…` 로 설치하는 흐름을 앞세우고(설치 후 필요 시 `/reload-plugins` 안내), 터미널 셸 `claude plugin …` 은 대안으로 병기했다.
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
- README 에 **설정 변경 지점(Claude Code · Codex)** 섹션을 추가했다. 설치·제거 CLI, 플러그인 자체 훅(`hooks.json`), setup 스킬별 설정 패치(`config.toml`·`settings.json`) 지점을 표로 정리했다.
|
|
41
|
+
|
|
3
42
|
## [0.10.0] - 2026-07-18
|
|
4
43
|
|
|
5
44
|
### Changed
|
package/README.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
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)
|
|
7
7
|
[](https://www.npmjs.com/package/@kaydash9999/banker-plugins) [](https://github.com/smallOpenSource/banker_plugins)
|
|
8
8
|
|
|
9
|
-
[빠른 시작](#빠른-시작) · [워크플로 예시](#워크플로-사용-예시) · [구성](#구성) · [설치 상세](#설치-상세-npm--codex) · [요구사항](#요구사항) · [업데이트 / 제거](#업데이트--제거) · [업데이트 확인](#업데이트-확인-및-사용량-카운팅) · [라이선스 / 서드파티](#라이선스--서드파티)
|
|
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
|
|
|
@@ -16,13 +16,18 @@ banker는 QA·보안 감사·문서·아키텍처·위키 작업과 의존성·
|
|
|
16
16
|
|
|
17
17
|
## 빠른 시작
|
|
18
18
|
|
|
19
|
-
**Claude Code:**
|
|
19
|
+
**Claude Code:** 실행 중인 세션에서 `/plugin` 으로 설치 (권장)
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
Claude Code 세션 안에서 입력합니다.
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
/plugin marketplace add smallOpenSource/banker_plugins
|
|
25
|
+
/plugin install banker@banker-plugins
|
|
24
26
|
```
|
|
25
27
|
|
|
28
|
+
설치 후 `Plugin is now active.` 면 바로 쓸 수 있고, `Run /reload-plugins to activate.` 가 뜨면 `/reload-plugins` 를 실행합니다.\
|
|
29
|
+
터미널 셸을 선호하면 `claude plugin marketplace add smallOpenSource/banker_plugins` 후 `claude plugin install banker@banker-plugins` 로도 됩니다(다음 실행 또는 `/reload-plugins` 후 적용).
|
|
30
|
+
|
|
26
31
|
스킬과 커맨드를 `/banker:audit-security` 처럼 `/banker:` 로 호출합니다.
|
|
27
32
|
|
|
28
33
|
**Codex CLI:** npm 전역 설치 후 `banker setup`
|
|
@@ -79,12 +84,13 @@ Claude Code는 `/banker:<이름>`, Codex는 `banker-<이름>` 으로 호출합
|
|
|
79
84
|
| 스킬 | 설명 |
|
|
80
85
|
|---|---|
|
|
81
86
|
| `arch-diagram` | 시스템 아키텍처 구성도 (PlantUML + 편집가능 PPTX) |
|
|
87
|
+
| `vertical-pptx` | A4 세로(210x297mm) 규격 PPTX 생성·점검·수리, 16:9 덱의 A4 세로 변환 |
|
|
82
88
|
| `make-notion-guide` | API 호출 가이드를 노션 양식 문서로 작성 |
|
|
83
89
|
| `pdf-vision-extract` | 비주얼 PDF를 고해상도 PNG로 변환(비전 입력) |
|
|
84
90
|
| `nothing-design` | Nothing 스타일 UI 디자인 적용 |
|
|
85
91
|
| `rfp-author` | 외주 제안요청서(RFP) 저작 (범용 프레임워크) |
|
|
86
92
|
| `humanizer` | AI 글 흔적 제거(자연스러운 문체로 윤문) |
|
|
87
|
-
| `lineage` | 세션 대화를 카카오톡 스타일 단일 HTML로 export |
|
|
93
|
+
| `lineage` | 세션 대화를 카카오톡 스타일 단일 HTML로 export (마크다운 렌더·하네스 노이즈 필터·다중 세션 병합) |
|
|
88
94
|
| `append_wiki` | 프로젝트 위키 문서 추가/보강 |
|
|
89
95
|
| `compact-wiki` | 위키 중복 제거·supersede·병합 (무손실) |
|
|
90
96
|
| `obsidizer` | AI 위키를 의미보존 Obsidian 그래프로 정규화·상호링크·백링크 |
|
|
@@ -115,6 +121,13 @@ Claude Code는 `/banker:<이름>`, Codex는 `banker-<이름>` 으로 호출합
|
|
|
115
121
|
| `refresh-readme` | 코드와 어긋난 README 를 현재 상태에 맞게 갱신(드리프트 해소) |
|
|
116
122
|
| `cleansing-memory` | 메모리 파일을 문서화된 threshold 내로 정리(중복 최신본화·무손실 압축) |
|
|
117
123
|
|
|
124
|
+
### 스킬: 미디어 (모션 그래픽 · 3D 인트로)
|
|
125
|
+
|
|
126
|
+
| 스킬 | 설명 |
|
|
127
|
+
|---|---|
|
|
128
|
+
| `motion-graphic-make` | 10초 내외 내레이션 없는 무료 모션 그래픽 제작 (hyperframes 위임) |
|
|
129
|
+
| `3d-intro-build` | 스크롤-스크럽 3D 인트로 사이트 제작 (Azure gpt-image-2 스틸 + Sora-2 영상, 유료) |
|
|
130
|
+
|
|
118
131
|
### 스킬: 개발환경 setup (OS별 · 런타임별)
|
|
119
132
|
|
|
120
133
|
USER_RESOURCES 가이드의 공통 요소를 OS별·런타임별(Claude Code/Codex)로 구성하는 얇은 실행 유닛.\
|
|
@@ -142,6 +155,9 @@ USER_RESOURCES 가이드의 공통 요소를 OS별·런타임별(Claude Code/Cod
|
|
|
142
155
|
| `setup-insane-search` | insane-search 플러그인 설치 (Claude·Codex) |
|
|
143
156
|
| `setup-stitch` | Stitch 디자인 MCP 프록시 등록(RockyLinux8 proxy) |
|
|
144
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) |
|
|
145
161
|
|
|
146
162
|
## 설치 상세 (npm · Codex)
|
|
147
163
|
|
|
@@ -159,12 +175,51 @@ banker uninstall # 제거
|
|
|
159
175
|
|
|
160
176
|
- `--scope project` 로 프로젝트 로컬(`./.codex`)에 설치하고, `--dry-run` 으로 미리 볼 수 있습니다.
|
|
161
177
|
- non-root 전용입니다(전역 sudo 설치 시 root 소유 파일을 방지). postinstall이 없으므로 `banker setup` 을 직접 실행합니다.
|
|
162
|
-
- Codex에는 스킬
|
|
178
|
+
- Codex에는 스킬 54개가 `~/.codex/skills/banker-<name>/` 에, 커맨드 2개가 `~/.codex/prompts/banker-<name>.md` 에 설치됩니다(`codex/manifest.json`). \
|
|
163
179
|
디렉터리명과 일치하도록 프론트매터 `name:` 이 `banker-<name>` 으로 재작성되어 Codex가 `banker-<name>` 으로 인식합니다.
|
|
164
180
|
- OMC/Claude 에 결합됐던 오케스트레이터·설치·유틸 표면(all-in-one·ultra-init·front-qa·setup·setup-omc·setup-omc-hud·setup-stitch·omc-reference·compact-copy)은 본문이 **런타임 인식**이라 Codex에서도 동작합니다.
|
|
165
181
|
- Codex에선 OMC 대신 **oh-my-codex(OMX)** 의 동명 스킬(ralplan·ralph·ultraqa·hud 등)과 `codex mcp`·내장 `/copy` 를 사용합니다(Codex는 `omx setup` 전제).
|
|
166
182
|
- `~/.codex/AGENTS.md` 는 건드리지 않습니다(omx가 재생성하므로 `~/.codex/skills/` 자동 검색에 의존).
|
|
167
183
|
|
|
184
|
+
## 설정 변경 지점 (Claude Code · Codex)
|
|
185
|
+
|
|
186
|
+
이 플러그인이 두 런타임의 설정·설치 상태를 건드리는 지점을 한눈에 정리했습니다.\
|
|
187
|
+
아래 파일 패치는 모두 기존 키를 병합·래핑·백업만 하며 덮어쓰지 않습니다.
|
|
188
|
+
|
|
189
|
+
**설치·제거 — `banker` CLI (결정론적)**
|
|
190
|
+
|
|
191
|
+
| 런타임 | 대상 | 동작 |
|
|
192
|
+
|---|---|---|
|
|
193
|
+
| Claude Code | 플러그인 레지스트리 | `claude plugin marketplace add` + 설치 → `/banker:*` (`settings.json` 직접수정 없음) |
|
|
194
|
+
| Codex CLI | `~/.codex/skills/banker-*/`, `~/.codex/prompts/banker-*.md` | 기존 `banker-*` 정리 후 복사(멱등). `AGENTS.md`·`config.toml` 미변경 |
|
|
195
|
+
|
|
196
|
+
**플러그인 자체 훅 — `hooks/hooks.json` (설치 시 Claude Code에서 자동 발화)**
|
|
197
|
+
|
|
198
|
+
사용자 `settings.json` 을 고치는 게 아니라 플러그인이 자기 훅을 선언한 것입니다.
|
|
199
|
+
|
|
200
|
+
| 이벤트 | 훅 | 역할 |
|
|
201
|
+
|---|---|---|
|
|
202
|
+
| PostToolUse | `obsidize-hook` · `telemetry-count-skill` | 위키 정규화 · 스킬 사용 카운트 |
|
|
203
|
+
| UserPromptExpansion | `telemetry-count` | `/banker:*` 직접호출 카운트 |
|
|
204
|
+
| SessionStart | `update-notify` | 업데이트 알림 |
|
|
205
|
+
|
|
206
|
+
**setup 스킬이 사용자 설정 파일을 패치 (해당 스킬 실행 시)**
|
|
207
|
+
|
|
208
|
+
| 스킬 | Claude Code (`~/.claude/settings.json` 등) | Codex CLI (`~/.codex/config.toml` 등) |
|
|
209
|
+
|---|---|---|
|
|
210
|
+
| `setup-sandbox` | `sandbox` 객체 | `sandbox_mode` · `[sandbox_workspace_write]` |
|
|
211
|
+
| `setup-mcp` | `claude mcp add` (context7·seq-thinking·filesystem·git·fetch) | `[mcp_servers.*]` |
|
|
212
|
+
| `setup-lsp` | LSP MCP 등록 | `[mcp_servers.lsp_bridge]` |
|
|
213
|
+
| `setup-stitch` | `claude mcp add stitch` | `codex mcp add stitch` |
|
|
214
|
+
| `setup-omc-hud` | `statusLine` | — (Codex는 OMX `hud`) |
|
|
215
|
+
| `setup-pwsh` | `env.CLAUDE_CODE_GIT_BASH_PATH` (병합) | — (네이티브 셸, 배선 불필요) |
|
|
216
|
+
| `harness-factory` | `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` (env 영속) | — |
|
|
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` 미변경) |
|
|
220
|
+
|
|
221
|
+
`obsidizer` 는 `settings.json` 대신 `<위키디렉터리>/.obsidizer` 플래그 파일로만 켜고 끕니다.
|
|
222
|
+
|
|
168
223
|
## 요구사항
|
|
169
224
|
|
|
170
225
|
- Claude Code (마켓플레이스 경로): 스킬이 `/banker:*` 로 동작.
|
|
@@ -172,6 +227,7 @@ banker uninstall # 제거
|
|
|
172
227
|
- 일부 스킬은 별도 의존성이 필요하며 `/banker:setup` 으로 설치합니다. 의존성이 없으면 각 스킬이 실행 전에 설치부터 안내합니다.
|
|
173
228
|
- `all-in-one`, `ultra-init`, `/banker:front-qa`: oh-my-claudecode(OMC). Codex에서는 OMX.
|
|
174
229
|
- `audit-web-page`, `play-qa`, `ultra-ui-qa`: playwright.
|
|
230
|
+
- `lineage`: Python 3.7+ (표준 라이브러리만 사용). RHEL8/Rocky8은 기본 `python3` 가 3.6이라 `setup-python` 등으로 3.11을 설치해 지정해야 합니다.
|
|
175
231
|
|
|
176
232
|
## 업데이트 / 제거
|
|
177
233
|
|
|
@@ -235,15 +291,18 @@ banker 자체는 **MIT** ([LICENSE](LICENSE)). Owner: [smallOpenSource](https://
|
|
|
235
291
|
- `skills/humanizer`: [blader/humanizer](https://github.com/blader/humanizer) 기반, **MIT License**(© 2025 Siqi Chen).\
|
|
236
292
|
원본 라이선스 고지는 `skills/humanizer/LICENSE` 에 포함.\
|
|
237
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` 에 포함.
|
|
238
296
|
|
|
239
|
-
코드로 포함(재배포)하는 서드파티는 `humanizer`
|
|
297
|
+
코드로 포함(재배포)하는 서드파티는 `humanizer` 와 `scroll-world`(`3d-intro-build`) 둘입니다.\
|
|
240
298
|
아래는 스킬이 **런타임에 의존하거나 연동**하는 외부 요소로, banker 가 재배포하지 않으며 각 라이선스·상표는 소유자에게 있습니다.
|
|
241
299
|
|
|
242
300
|
**의존 라이브러리·도구 (사용 시 별도 설치, 라이선스는 각 프로젝트 소유)**
|
|
243
301
|
|
|
244
302
|
| 분류 | 도구 | 라이선스 | 사용 스킬 |
|
|
245
303
|
|---|---|---|---|
|
|
246
|
-
| Python | python-pptx | MIT | `arch-diagram` |
|
|
304
|
+
| Python | python-pptx | MIT | `arch-diagram` · `vertical-pptx` |
|
|
305
|
+
| Node | pptxgenjs | MIT | `vertical-pptx` |
|
|
247
306
|
| Python | python-docx | MIT | `rfp-author` |
|
|
248
307
|
| Python | Playwright | Apache-2.0 | `audit-web-page`·`play-qa`·`ultra-ui-qa` |
|
|
249
308
|
| Python | detect-secrets | Apache-2.0 | `lineage`(시크릿 스캔) |
|
|
@@ -264,6 +323,8 @@ banker 자체는 **MIT** ([LICENSE](LICENSE)). Owner: [smallOpenSource](https://
|
|
|
264
323
|
| 개발환경·LSP | psmux | 각 프로젝트 | `setup-tmux` |
|
|
265
324
|
| 개발환경·LSP | bubblewrap | LGPL-2.0 | `setup-sandbox` |
|
|
266
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` |
|
|
267
328
|
|
|
268
329
|
**연동·참조 (외부 프레임워크·서비스·브랜드, banker 는 재배포하지 않음)**
|
|
269
330
|
|
|
@@ -276,3 +337,4 @@ banker 자체는 **MIT** ([LICENSE](LICENSE)). Owner: [smallOpenSource](https://
|
|
|
276
337
|
| 서비스(독점·상표) | Google Stitch | 독점 | `setup-stitch` |
|
|
277
338
|
| 디자인(상표) | Nothing 디자인 언어 | 상표 | `nothing-design` |
|
|
278
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": "cross-LLM independent verify loop (ralplan+critic logic
|
|
39
|
+
{ "name": "ralph-qa", "type": "skill", "target": "both", "reason": "cross-LLM independent verify loop (ralplan+critic logic): prefers Codex CLI, else other model via curl, else self-spawned multi-agent consensus; runtime-aware", "supportingFiles": [] },
|
|
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
|
]
|
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.12.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` 의 **구조 각색**뿐이다.
|