Figma Screenshot Extractor
Extract screenshots from Figma MCP server outputs stored in Codex session logs.
When to Use
Use this Skill when:
- User requests screenshots export (novo design, faturamento, etc.)
- Imagens foram geradas via MCP do Figma e precisam ser salvas a partir dos logs
- Script padrão não está presente, mas o log JSONL contém o base64
- Há IDs/nodes específicos para nomear arquivos
Instructions
Entender requisitos
- Diretório de saída (default atualizado:
docs/jornada-do-usuario/faturamento quando o tema é faturamento; caso contrário docs/contas-a-receber).
- Log alvo: usar o mais recente em
~/.codex/sessions/YYYY/MM/DD/*.jsonl salvo que o usuário forneça outro.
- Mapeamento de nodeId → nome de arquivo (opcional). Se não houver, nomeie sequencialmente
01-...png.
Caminho A: script existente
Caminho B: fallback manual (script ausente)
- Use Python inline para extrair base64 (
iVBOR) do log e salvar PNGs:python - <<'PY'
import json,re,base64,os,pathlib
log=os.path.expanduser('~/.codex/sessions/2025/12/05/rollout-*.jsonl')
out=pathlib.Path('docs/jornada-do-usuario/faturamento'); out.mkdir(parents=True, exist_ok=True)
idx=0
import glob
for logpath in sorted(glob.glob(log), reverse=True):
for line in open(logpath):
if 'iVBOR' not in line: continue
try:
obj=json.loads(line); text=str(obj.get('payload',{}).get('output',''))+str(obj.get('payload',{}).get('content',''))
except Exception:
text=line
for b64 in re.findall(r'iVBOR[a-zA-Z0-9+/=]+', text):
try: data=base64.b64decode(b64)
except Exception: continue
if not data.startswith(b'\x89PNG'): continue
idx+=1; (out/f"{idx:02d}-faturamento.png").write_bytes(data)
if idx: break
print('saved', idx, 'pngs to', out)
PY
- Renomeie depois se precisar de rótulos mais claros.
Mapeamento padrão (quando aplicável)
{
"31:3": "lista.png",
"31:457": "adicionar-nova-conta.png",
"33:524": "editar-conta.png",
"31:204": "encaminhar-parcela.png",
"34:672": "acao-rapida-icon.png"
}
Relate o resultado
- Liste arquivos gravados + diretório final.
- Se nada for encontrado: confirme se o log certo contém
mcp__figma_desktop__get_screenshot ou iVBOR.
- Se houver duplicatas, considere rodar um
md5 para evitar cópias.
Examples
Extract to Default Directory
python figma_screenshot_extractor.py
Extract to Custom Directory
python figma_screenshot_extractor.py --output-dir docs/screenshots
Extract from Specific Session Log
python figma_screenshot_extractor.py \
--output-dir docs/contas-a-receber \
--session-log ~/.codex/sessions/2025/11/10/session_2025-11-10_143022.jsonl
Extract with Custom Node Mapping
python figma_screenshot_extractor.py \
--output-dir docs/images \
--nodes '{"31:3": "custom-name.png", "31:457": "another-image.png"}'
How It Works
The script:
- Reads Codex session logs in JSONL format
- Finds calls to
mcp__figma_desktop__get_screenshot
- Extracts base64-encoded images from the responses
- Decodes and saves images to the specified directory
- Maps Figma node IDs to meaningful filenames
Troubleshooting
- No screenshots found: Check if the session log contains Figma MCP calls
- File not found: Verify the session log path exists
- Permission errors: Ensure the output directory is writable
- Missing dependencies: The script requires Python 3 with standard libraries only
Usando via Command
- Command sugerido:
/zord:figma-screenshot-extractor
- Parâmetros esperados pelo command:
output-dir (obrigatório): caminho destino. Se ausente, o command aborta pedindo o valor.
session-log (opcional): caminho do JSONL; se ausente, usa o mais recente em ~/.codex/sessions.
nodes (opcional): JSON string nodeId → filename; se ausente, nomeia sequencialmente.
- O command só executa a extração se
output-dir estiver presente e o log for encontrado; caso contrário, retorna instruções claras de correção.
1---2name: figma-screenshot-extractor3description: Extract and save Figma screenshots from Codex session logs when user needs to recover images captured by the Figma MCP server4---5
6# Figma Screenshot Extractor
7
8Extract screenshots from Figma MCP server outputs stored in Codex session logs.
9
10## When to Use
11
12Use this Skill when:
13- User requests screenshots export (novo design, faturamento, etc.)
14- Imagens foram geradas via MCP do Figma e precisam ser salvas a partir dos logs
15- Script padrão não está presente, mas o log JSONL contém o base64
16- Há IDs/nodes específicos para nomear arquivos
17
18## Instructions
19
201. **Entender requisitos**
21 - Diretório de saída (default atualizado: `docs/jornada-do-usuario/faturamento` quando o tema é faturamento; caso contrário `docs/contas-a-receber`).
22 - Log alvo: usar o mais recente em `~/.codex/sessions/YYYY/MM/DD/*.jsonl` salvo que o usuário forneça outro.
23 - Mapeamento de nodeId → nome de arquivo (opcional). Se não houver, nomeie sequencialmente `01-...png`.
24
252. **Caminho A: script existente**
26 - Se `figma_screenshot_extractor.py` existir no repo, execute:
27 ```bash
28 python figma_screenshot_extractor.py --output-dir <path> [--session-log <log-file>] [--nodes <json-map>]
29 ```
30
313. **Caminho B: fallback manual (script ausente)**
32 - Use Python inline para extrair base64 (`iVBOR`) do log e salvar PNGs:
33 ```bash
34 python - <<'PY'
35 import json,re,base64,os,pathlib
36 log=os.path.expanduser('~/.codex/sessions/2025/12/05/rollout-*.jsonl')
37 out=pathlib.Path('docs/jornada-do-usuario/faturamento'); out.mkdir(parents=True, exist_ok=True)
38 idx=0
39 import glob
40 for logpath in sorted(glob.glob(log), reverse=True):
41 for line in open(logpath):
42 if 'iVBOR' not in line: continue
43 try:
44 obj=json.loads(line); text=str(obj.get('payload',{}).get('output',''))+str(obj.get('payload',{}).get('content',''))
45 except Exception:
46 text=line
47 for b64 in re.findall(r'iVBOR[a-zA-Z0-9+/=]+', text):
48 try: data=base64.b64decode(b64)
49 except Exception: continue
50 if not data.startswith(b'\x89PNG'): continue
51 idx+=1; (out/f"{idx:02d}-faturamento.png").write_bytes(data)
52 if idx: break
53 print('saved', idx, 'pngs to', out)
54 PY
55 ```
56 - Renomeie depois se precisar de rótulos mais claros.
57
584. **Mapeamento padrão (quando aplicável)**
59 ```python
60 {
61 "31:3": "lista.png",
62 "31:457": "adicionar-nova-conta.png",
63 "33:524": "editar-conta.png",
64 "31:204": "encaminhar-parcela.png",
65 "34:672": "acao-rapida-icon.png"
66 }
67 ```
68
695. **Relate o resultado**
70 - Liste arquivos gravados + diretório final.
71 - Se nada for encontrado: confirme se o log certo contém `mcp__figma_desktop__get_screenshot` ou `iVBOR`.
72 - Se houver duplicatas, considere rodar um `md5` para evitar cópias.
73
74## Examples
75
76### Extract to Default Directory
77```bash
78python figma_screenshot_extractor.py
79```
80
81### Extract to Custom Directory
82```bash
83python figma_screenshot_extractor.py --output-dir docs/screenshots
84```
85
86### Extract from Specific Session Log
87```bash
88python figma_screenshot_extractor.py \
89 --output-dir docs/contas-a-receber \
90 --session-log ~/.codex/sessions/2025/11/10/session_2025-11-10_143022.jsonl
91```
92
93### Extract with Custom Node Mapping
94```bash
95python figma_screenshot_extractor.py \
96 --output-dir docs/images \
97 --nodes '{"31:3": "custom-name.png", "31:457": "another-image.png"}'
98```
99
100## How It Works
101
102The script:
1031. Reads Codex session logs in JSONL format
1042. Finds calls to `mcp__figma_desktop__get_screenshot`
1053. Extracts base64-encoded images from the responses
1064. Decodes and saves images to the specified directory
1075. Maps Figma node IDs to meaningful filenames
108
109## Troubleshooting
110
111- **No screenshots found**: Check if the session log contains Figma MCP calls
112- **File not found**: Verify the session log path exists
113- **Permission errors**: Ensure the output directory is writable
114- **Missing dependencies**: The script requires Python 3 with standard libraries only
115
116## Usando via Command
117
118- Command sugerido: `/zord:figma-screenshot-extractor`
119- Parâmetros esperados pelo command:
120 - `output-dir` (obrigatório): caminho destino. Se ausente, o command aborta pedindo o valor.
121 - `session-log` (opcional): caminho do JSONL; se ausente, usa o mais recente em `~/.codex/sessions`.
122 - `nodes` (opcional): JSON string nodeId → filename; se ausente, nomeia sequencialmente.
123- O command só executa a extração se `output-dir` estiver presente e o log for encontrado; caso contrário, retorna instruções claras de correção.