@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.
Files changed (30) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +39 -0
  4. package/README.md +73 -11
  5. package/codex/manifest.json +8 -1
  6. package/commands/setup.md +2 -0
  7. package/package.json +6 -1
  8. package/skills/3d-intro-build/SKILL.md +214 -0
  9. package/skills/3d-intro-build/references/LICENSE +21 -0
  10. package/skills/3d-intro-build/references/NOTICE.md +32 -0
  11. package/skills/3d-intro-build/references/assemble.mjs +252 -0
  12. package/skills/3d-intro-build/references/azure-adapter.mjs +495 -0
  13. package/skills/3d-intro-build/references/curate.mjs +301 -0
  14. package/skills/3d-intro-build/references/index-template.html +73 -0
  15. package/skills/3d-intro-build/references/prompts.md +171 -0
  16. package/skills/3d-intro-build/references/scrub-engine.js +448 -0
  17. package/skills/3d-intro-build/references/serve.mjs +123 -0
  18. package/skills/3d-intro-setup/SKILL.md +196 -0
  19. package/skills/3d-intro-setup/references/azure-adapter.mjs +495 -0
  20. package/skills/lineage/SKILL.md +126 -134
  21. package/skills/lineage/lineage.py +1041 -354
  22. package/skills/motion-graphic-make/SKILL.md +57 -0
  23. package/skills/motion-graphic-setup/SKILL.md +141 -0
  24. package/skills/ralph-qa/SKILL.md +59 -32
  25. package/skills/refresh-readme/SKILL.md +3 -3
  26. package/skills/vertical-pptx/SKILL.md +409 -0
  27. package/skills/vertical-pptx/build_a4p.js +923 -0
  28. package/skills/vertical-pptx/build_a4p.py +916 -0
  29. package/skills/vertical-pptx/verify_a4p.mjs +2168 -0
  30. package/skills/vertical-pptx-setup/SKILL.md +223 -0
@@ -0,0 +1,223 @@
1
+ ---
2
+ name: vertical-pptx-setup
3
+ description: "(banker) vertical-pptx 의존성(pptxgenjs·python-pptx)과 시각 검증용 LibreOffice 를 OS·권한 감지 후 설치(root 없으면 홈 프리픽스 추출). 'vertical-pptx-setup'/'LibreOffice 설치'/'pptx 렌더 검증 준비' 또는 /banker:setup 시 사용."
4
+ ---
5
+
6
+ # vertical-pptx-setup — vertical-pptx 실행·검증 환경 설치
7
+
8
+ `vertical-pptx` 가 쓰는 것들을 OS 와 권한을 **먼저 재고** 설치한다.
9
+ 추정으로 설치 명령을 고르지 않는다. root 유무·아키텍처·기존 설치 여부가 전부 분기 조건이다.
10
+
11
+ ## 무엇을 왜 설치하는가 (세 층은 성격이 다르다)
12
+
13
+ | 층 | 대상 | 없으면 | 필수인가 |
14
+ |---|---|---|---|
15
+ | 검증 | **node** | `verify_a4p.mjs` 가 아예 못 돈다 | **필수** |
16
+ | 생성 | **pptxgenjs**(node) 또는 **python-pptx** | 덱을 못 만든다. 둘 중 하나면 된다 | 둘 중 하나 |
17
+ | 시각 | **LibreOffice** | PDF·이미지 렌더 확인만 못 한다 | **선택** |
18
+
19
+ **LibreOffice 는 선택이다.** `vertical-pptx` 의 생성·검증 경로는 LibreOffice 없이 완결된다.
20
+ 그럼에도 설치할 이유는 하나뿐이고 그게 크다.
21
+ 구조 검증(sldSz·좌표·CRC·폰트 메트릭)은 "규격에 맞는가" 만 답한다.
22
+ **"열었을 때 실제로 그렇게 보이는가" 는 렌더해야만 답이 나온다.**
23
+ 그 한 구멍을 메우는 것이 LibreOffice 의 역할이고, 그 외의 목적은 없다.
24
+
25
+ ## 0. 감지 (먼저 — 추정 금지)
26
+
27
+ ```bash
28
+ uname -sm # OS + 아키텍처
29
+ sudo -n true 2>/dev/null && echo "sudo=yes" || echo "sudo=no"
30
+ command -v node >/dev/null && node -v || echo "node=없음"
31
+ command -v soffice libreoffice 2>/dev/null | head -1 || echo "soffice=없음"
32
+ command -v dnf apt-get brew winget 2>/dev/null | tr '\n' ' '
33
+ for v in 3.13 3.12 3.11 3.10 3.9; do command -v python$v >/dev/null && echo "python$v ok"; done
34
+ ```
35
+
36
+ **python 버전 주의.** `python3` 이 3.6 이나 3.7 인 배포판이 있다(RHEL8/Rocky8 계열의 기본이 3.6.8 이다).
37
+ python-pptx 는 그보다 높은 버전을 요구하므로 `python3` 을 그대로 쓰지 말고 위 스캔에서 고른 인터프리터를 쓴다.
38
+
39
+ ## 1. 빌더 설치 (둘 중 하나면 충분하다)
40
+
41
+ **node 경로(권장).** `fontFace` 하나로 한글 3슬롯(`a:latin`·`a:ea`·`a:cs`)이 전부 채워져 한글 깨짐 위험이 구조적으로 낮다.
42
+
43
+ ```bash
44
+ npm i -g pptxgenjs@4 # 전역이 막히면 프로젝트 지역 설치 후 NODE_PATH 로 가리킨다
45
+ node -e "require('pptxgenjs')" && echo "pptxgenjs ok"
46
+ ```
47
+
48
+ `require('pptxgenjs')` 로 확인한다.
49
+ `require('pptxgenjs/package.json')` 은 패키지의 `exports` 필드가 서브경로를 막아 `ERR_PACKAGE_PATH_NOT_EXPORTED` 로 실패한다.
50
+ 설치가 멀쩡한데 확인 명령만 틀려서 "설치 실패" 로 오판하기 쉬운 자리다.
51
+
52
+ **python 경로.** npm 이 막힌 환경이나 python-pptx 가 이미 있는 환경을 위한 것이다.
53
+
54
+ ```bash
55
+ PY=<위 스캔에서 고른 3.9+ 인터프리터>
56
+ $PY -m pip install --user python-pptx
57
+ $PY -c "import pptx; print('python-pptx', pptx.__version__)"
58
+ ```
59
+
60
+ `fonttools` 는 필수가 아니다.
61
+ 폭 예측 정확도를 직접 대조하고 싶을 때만 넣는다(`$PY -m pip install --user fonttools`).
62
+
63
+ ## 2. LibreOffice 설치 — OS x 권한 분기
64
+
65
+ ### 2-a. Linux, root 있음
66
+
67
+ ```bash
68
+ sudo dnf install -y libreoffice-impress libreoffice-writer # RHEL/Rocky/Fedora
69
+ sudo apt-get install -y libreoffice-impress libreoffice-writer # Debian/Ubuntu
70
+ ```
71
+
72
+ ### 2-b. Linux, root 없음 (홈 프리픽스로 추출)
73
+
74
+ **먼저 glibc 를 재라. 이 한 줄이 어느 경로를 쓸지 정한다.**
75
+
76
+ ```bash
77
+ ldd --version | head -1
78
+ ```
79
+
80
+ 업스트림 최신판(26.x)은 **glibc 2.29 이상**을 요구한다.
81
+ RHEL8/Rocky8 계열은 **2.28** 이라 업스트림 tarball 을 받아 풀면 추출은 되지만 실행이 이렇게 죽는다:
82
+
83
+ ```
84
+ oosplash: /lib64/libm.so.6: version `GLIBC_2.29' not found
85
+ oosplash: /lib64/libc.so.6: version `GLIBC_2.33' not found
86
+ ```
87
+
88
+ 이건 설치 실패가 아니라 **호환 실패**라서 재시도해도 같다. 경로를 바꿔야 한다.
89
+
90
+ **glibc 2.28 (RHEL8/Rocky8): 배포판 RPM 을 받아 푼다.**
91
+ 배포판 빌드는 그 배포판의 glibc 에 맞춰져 있으므로 이게 정답이다. `dnf download` 는 root 가 필요 없다.
92
+
93
+ ```bash
94
+ SP=/tmp/lo-distro; PREFIX=$HOME/.local/lo-distro
95
+ mkdir -p $SP $PREFIX
96
+ dnf -q -y --disablerepo='*' --enablerepo='appstream,baseos,powertools' \
97
+ download --resolve --alldeps --destdir=$SP libreoffice-impress libreoffice-writer
98
+ cd $PREFIX
99
+ for r in $SP/*.rpm; do
100
+ rpm2cpio "$r" | cpio -idmu --quiet 2>/dev/null
101
+ chmod -R u+rwX $PREFIX/usr 2>/dev/null # ★ 이 줄이 없으면 중간부터 전부 실패한다
102
+ done
103
+ export LD_LIBRARY_PATH=$PREFIX/usr/lib64:$PREFIX/usr/lib64/libreoffice/program:$LD_LIBRARY_PATH
104
+ SOFFICE=$PREFIX/usr/lib64/libreoffice/program/soffice
105
+ $SOFFICE --version # 6.4.7.2 처럼 배포판 버전이 찍히면 성공이다
106
+ ```
107
+
108
+ ★ **`LD_LIBRARY_PATH` 를 반드시 걸어라.** 추출본은 시스템 경로에 없으므로 링커가 자기 라이브러리를 못 찾는다.
109
+ 증상이 `libgpgmepp.so.6: cannot open shared object file` 처럼 **특정 라이브러리 이름**으로 나와서
110
+ "그 패키지가 안 받아졌다" 로 오진하기 쉽다. 파일은 `$PREFIX/usr/lib64/` 에 이미 있다.
111
+ `ldd $PREFIX/usr/lib64/libreoffice/program/soffice.bin | grep 'not found'` 가 비면 경로 문제이지 누락이 아니다.
112
+
113
+ ★ **`chmod -R u+rwX` 를 RPM 마다 돌려야 한다.** 일부 RPM 이 `usr/lib64` 를 쓰기 불가 모드로 만들고,
114
+ 그 뒤 RPM 의 `cpio` 가 `cannot make directory: Permission denied` 로 조용히 실패한다.
115
+ `2>/dev/null` 로 에러를 가려 두면 **추출이 수백 MB 진행돼도 정작 바이너리가 하나도 안 나온다.**
116
+ 증상이 "용량은 늘었는데 `soffice` 가 없다" 이므로 디스크만 보고 성공으로 오판하기 쉽다.
117
+
118
+ **glibc 2.29 이상: 업스트림 tarball 도 쓸 수 있다.** 자체 라이브러리를 번들해 배포판과 안 싸운다.
119
+
120
+ ```bash
121
+ V=$(curl -s https://download.documentfoundation.org/libreoffice/stable/ \
122
+ | grep -oE '[0-9]+\.[0-9]+\.[0-9]+/' | sort -V | tail -1 | tr -d '/')
123
+ A=$(uname -m) # x86_64 또는 aarch64. 업스트림이 둘 다 제공한다
124
+ curl -sL -o /tmp/lo.tar.gz \
125
+ "https://download.documentfoundation.org/libreoffice/stable/$V/rpm/$A/LibreOffice_${V}_Linux_${A/x86_64/x86-64}_rpm.tar.gz"
126
+ ```
127
+
128
+ 이후는 위와 같은 추출 절차이고 `chmod` 주의도 동일하다.
129
+ deb 계열은 `rpm/` 대신 `deb/` 를 받아 `dpkg-deb -x` 로 편다.
130
+ `rpm2cpio` 와 `cpio` 가 없으면 이 경로는 못 쓴다. 그때는 root 를 얻거나 시각 검증을 건너뛴다.
131
+
132
+ 다운로드가 250~320MB 다. 느린 회선에서는 백그라운드로 돌린다.
133
+
134
+ ### 2-c. macOS
135
+
136
+ ```bash
137
+ brew install --cask libreoffice # brew 가 있으면 이게 가장 단순하다
138
+ ```
139
+
140
+ brew 가 없으면 업스트림 dmg 를 받는다. 아키텍처 이름이 `aarch64` 다(`arm64` 는 404 다).
141
+
142
+ ```bash
143
+ V=<위와 동일하게 조회>
144
+ curl -sL -o /tmp/lo.dmg "https://download.documentfoundation.org/libreoffice/stable/$V/mac/aarch64/LibreOffice_${V}_MacOS_aarch64.dmg"
145
+ hdiutil attach /tmp/lo.dmg -nobrowse -quiet
146
+ cp -R "/Volumes/LibreOffice/LibreOffice.app" /Applications/ # root 또는 쓰기 권한 필요
147
+ hdiutil detach "/Volumes/LibreOffice" -quiet
148
+ /Applications/LibreOffice.app/Contents/MacOS/soffice --version
149
+ ```
150
+
151
+ macOS 의 `soffice` 는 `PATH` 에 없다. 위 전체 경로를 그대로 쓴다.
152
+
153
+ ### 2-d. Windows
154
+
155
+ ```cmd
156
+ winget install --id TheDocumentFoundation.LibreOffice -e --scope user
157
+ ```
158
+
159
+ `--scope user` 가 요점이다.
160
+ 기본(machine) 스코프는 관리자를 요구하므로 비관리자 계정에서 실패한다.
161
+ 설치 후 `soffice.com` 은 보통 `%LOCALAPPDATA%\Programs\LibreOffice\program\` 아래에 있다.
162
+ **cmd 에서 `;` 는 구분자가 아니다.** 여러 명령을 이을 때는 `&&` 를 쓴다.
163
+
164
+ ## 3. PDF 렌더 확인 (이 설치의 존재 이유)
165
+
166
+ ```bash
167
+ SOFFICE=<위에서 확인한 경로>
168
+ $SOFFICE --headless --convert-to pdf --outdir <출력디렉터리> <입력.pptx>
169
+ ```
170
+
171
+ **렌더 결과의 페이지 크기를 반드시 재라.** 변환이 성공했다는 것과 A4 로 나왔다는 것은 다른 말이다.
172
+
173
+ ```bash
174
+ python -c "
175
+ import re,zlib,sys
176
+ d=open(sys.argv[1],'rb').read()
177
+ m=re.search(rb'/MediaBox\s*\[\s*([\d.]+)\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)', d)
178
+ if m:
179
+ w=float(m.group(3))-float(m.group(1)); h=float(m.group(4))-float(m.group(2))
180
+ print('MediaBox %.1f x %.1f pt = %.1f x %.1f mm' % (w,h,w*25.4/72,h*25.4/72))
181
+ print('A4 세로 판정:', abs(w*25.4/72-210)<1 and abs(h*25.4/72-297)<1)
182
+ " <출력.pdf>
183
+ ```
184
+
185
+ A4 세로는 **210 x 297 mm = 595 x 842 pt** 다.
186
+ 1mm 안쪽이면 통과로 본다(PDF 포인트 반올림 때문이다).
187
+
188
+ `soffice` 가 이미 떠 있으면 두 번째 호출이 조용히 아무것도 안 하고 끝날 수 있다.
189
+ 자동화에서는 프로파일을 분리한다: `-env:UserInstallation=file:///tmp/lo-profile-$$`.
190
+
191
+ ## 4. 검증 (보고 의무)
192
+
193
+ 설치했다고 말하기 전에 아래를 실제로 돌리고 출력을 보고한다.
194
+
195
+ ```bash
196
+ node -v # 검증기 전제
197
+ node -e "require('pptxgenjs')" && echo builder-node-ok
198
+ $PY -c "import pptx" && echo builder-python-ok # 둘 중 하나면 충분
199
+ $SOFFICE --version # 선택
200
+ ```
201
+
202
+ 보고에는 **고른 경로와 그 이유**를 함께 적는다.
203
+ "설치했다" 만으로는 다음 사람이 같은 결정을 재현할 수 없다.
204
+ root 가 없어서 홈 프리픽스로 갔다면 그 사실이 곧 다음 사람에게 필요한 정보다.
205
+
206
+ ## 함정
207
+
208
+ - **`python3` 이 3.6 인 배포판이 있다.** RHEL8/Rocky8 기본이 3.6.8 이다. python-pptx 가 안 들어간다. 버전 스캔에서 고른 인터프리터를 쓴다.
209
+ - **`require('pptxgenjs/package.json')` 로 설치를 확인하지 마라.** `exports` 필드에 막혀 실패한다. 패키지는 멀쩡한데 확인 명령이 틀린 것이다.
210
+ - **macOS 업스트림 경로는 `aarch64` 다.** `arm64` 로 요청하면 404 다.
211
+ - **macOS 의 soffice 는 PATH 에 없다.** `/Applications/LibreOffice.app/Contents/MacOS/soffice` 를 그대로 쓴다.
212
+ - **Windows 는 `--scope user` 를 붙여야 비관리자에서 설치된다.** 그리고 cmd 에서 `;` 는 구분자가 아니다.
213
+ - **변환 성공 != A4.** MediaBox 를 반드시 재라. 슬라이드 크기가 틀린 채로도 PDF 는 잘 나온다.
214
+ - **soffice 중복 실행.** 이미 떠 있으면 두 번째 호출이 조용히 종료된다. `-env:UserInstallation` 으로 프로파일을 분리한다.
215
+ - **LibreOffice 는 참조 렌더러이지 PowerPoint 가 아니다.** 여기서 통과해도 PowerPoint 에서 다르게 보일 수 있다. 이 설치가 메우는 구멍은 "규격은 맞는데 렌더가 깨지는" 부류이지 "PowerPoint 호환성 전부" 가 아니다.
216
+ - **렌더의 한글 자간을 산출물 결함으로 오해하지 마라.** LibreOffice 는 한글과 라틴·숫자·문장부호 사이에 자간을 자동으로 넣는다. 그래서 `갱신이었다. 특히 2분기` 가 화면에서 `갱신이었다 . 특히 2 분기` 처럼 보인다. **실측으로 확인한 렌더러 동작이다.** 의심되면 `unzip -p out.pptx ppt/slides/slide1.xml | grep -o '<a:t>[^<]*'` 로 실제 텍스트를 보라. 거기에 공백이 없으면 산출물은 멀쩡하고 화면만 그렇게 그려진 것이다.
217
+ - **디스크.** 추출 설치가 약 1.5GB 를 쓴다. 홈 디렉터리 할당량이 빠듯하면 먼저 확인한다.
218
+
219
+ ## 관련
220
+
221
+ - `vertical-pptx` — 이 설치가 지원하는 대상 스킬
222
+ - `docs-setup` — `arch-diagram`·`pdf-vision-extract` 용 python 툴(python-pptx 가 겹친다)
223
+ - `setup-node` / `setup-python` — 런타임 자체가 없을 때 먼저