OpenClaw/clawhub-security-signals huggingface dataset:
Skill: tomgranot/cleanup-forms (version 1.0.0)

--- name: cleanup-forms description: "Audit and remove unused, test, or deprecated forms from HubSpot. Identifies forms with zero submissions, forms not embedded on any page, and test forms left over from development." license: MIT metadata: author: tomgranot version: "1.0" category: ongoing-maintenance --- # Cleanup Forms Audit HubSpot forms to remove unused and test forms. Stale forms clutter the forms dashboard and can cause confusion when building workflows or reports. ## Prerequisites - HubSpot API token in `.env` - Python with `hubspot-api-client` installed via `uv` - Note: The Forms API may return 403 on some plan tiers. If so, perform the audit manually in the HubSpot UI under Marketing > Forms. ## Step-by-Step Instructions ### Stage 1: Before — Inventory All Forms Pull all forms via the API: ```python from hubspot import HubSpot api_client = HubSpot(access_token=os.getenv("HUBSPOT_API_TOKEN")) forms = api_client.marketing.forms.forms_api.get_page(limit=100) ``` For each form, record: form ID, name, type, submission count, created date, last submission date. ### Stage 2: Execute — Identify Candidates for Deletion Flag forms matching any of these criteria: 1. **Zero submissions** and created more than 30 days ago 2. **No recent submissions** (last submission 6+ months ago) and not embedded on an active page 3. **Test forms** (names containing "test", "temp", "draft", "copy of") 4. **Deprecated forms** replaced by newer versions Before deleting, check: - Is the form referenced in any workflow enrollment trigger? - Is the form embedded on any live landing page or website page? - Is the form used in any pop-up or slide-in CTA? ### Stage 3: After — Delete and Document 1. Delete confirmed unused forms via the API or UI. 2. Document what was deleted in a cleanup log. 3. If a form with submissions is deleted, the submission data is retained on the contact records — but the form definition is gone. ### Stage 4: Rollback - Deleted forms cannot be restored in HubSpot. - Before deleting a form with any submissions, export the form definition (field names, settings) so it can be recreated. - Contact records retain their form submission history regardless of form deletion. ## Tips - Establish a naming convention: `[TEAM] - Purpose - Version` (e.g., `[Marketing] - Webinar Registration - v2`). - Prefix deprecated forms with "[DEPRECATED]" instead of deleting immediately — delete after one quarter of no usage.


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: chenpipy/coord-transform (version 1.0.0)

--- name: coord-transform version: 1.0.0 description: 坐标转换技能。当用户提到坐标转换、坐标系转换、EPSG转换、CGCS2000、WGS84、地理坐标转换、投影坐标转换、火星坐标系、百度坐标转换时激活。支持GeoJSON文件和WKT字符串的坐标系统转换，支持中国常用坐标系互转。 --- # 坐标转换技能 (coord-transform) 坐标系转换工具，支持 GeoJSON 和 WKT 格式，支持中国常用坐标系。 ## 核心功能 - **格式互转**：WKT ↔ GeoJSON 互转 - **坐标转换**：支持各种坐标系之间的转换 - **中国坐标系**：完整支持 CGCS2000、WGS84、火星坐标系(GCJ-02)、百度坐标系(BD-09) ## 支持的坐标系 | 代码 | 名称 | 说明 | |------|------|------| | 4326 | WGS84 | GPS 标准，地理坐标 | | 4490 | CGCS2000 | 中国 2000 国家坐标系 | | 4547-4556 | CGCS2000 分带 | 3 度分带投影坐标系 | | 3857 | Web Mercator | 互联网地图常用 | | 4214 | Beijing 1954 | 北京 54 坐标系 | | gcj02 | 火星坐标系 | 高德地图、腾讯地图使用 | | bd09 | 百度坐标系 | 百度地图专属 | ## 依赖 ```bash apt-get install python3-pyproj ``` ## 使用方式 ### 基本语法 ``` python3 scripts/coord_convert.py --input <文件或字符串> --from <源坐标系> --to <目标坐标系> [--format <输出格式>] [--output <输出文件>] ``` ### 参数说明 | 参数 | 说明 | |------|------| | `--input` / `-i` | 输入文件路径或 GeoJSON/WKT 字符串 | | `--wkt` | 直接指定 WKT 字符串（覆盖 --input） | | `--from` / `-f` | 源坐标系 | | `--to` / `-t` | 目标坐标系 | | `--format` / `-F` | 输出格式：geojson / wkt / auto（默认 auto） | | `--output` / `-o` | 输出文件路径 | | `--list-crs` | 列出所有支持的坐标系 | ## 使用示例 ### 1. 坐标系统转换 **CGCS2000 (4490) → WGS84 (4326)：** ```bash python3 scripts/coord_convert.py --wkt "POINT(113 23)" --from 4490 --to 4326 ``` **CGCS2000 (4490) → 投影坐标系 (4547)：** ```bash python3 scripts/coord_convert.py --wkt "POLYGON((112.58 26.56,112.60 26.56,112.60 26.58,112.58 26.58,112.58 26.56))" --from 4490 --to 4547 ``` ### 2. WKT ↔ GeoJSON 格式互转 **WKT 转 GeoJSON：** ```bash python3 scripts/coord_convert.py --wkt "POINT(113 23)" --from 4326 --to 4490 --format geojson ``` **GeoJSON 转 WKT：** ```bash python3 scripts/coord_convert.py --input data.geojson --from 4490 --to 4326 --format wkt ``` ### 3. 火星坐标系转换 **WGS84 → 火星坐标系 (GCJ-02)：** ```bash python3 scripts/coord_convert.py --wkt "POINT(113 23)" --from 4326 --to gcj02 ``` **火星坐标系 → WGS84：** ```bash python3 scripts/coord_convert.py --wkt "POINT(113 23)" --from gcj02 --to 4326 ``` ### 4. 百度坐标系转换 **GCJ-02 → 百度坐标系 (BD-09)：** ```bash python3 scripts/coord_convert.py --wkt "POINT(113 23)" --from gcj02 --to bd09 ``` **BD-09 → WGS84：** ```bash python3 scripts/coord_convert.py --wkt "POINT(113 23)" --from bd09 --to 4326 ``` ### 5. 完整流程示例 **从百度坐标系的 GeoJSON 文件转换到 CGCS2000 投影坐标系：** ```bash python3 scripts/coord_convert.py --input baidu_data.geojson --from bd09 --to 4547 --output result.geojson ``` ## 工作流程 1. 解析输入（判断是 WKT 还是 GeoJSON） 2. 解析源坐标系和目标坐标系 3. 如果需要格式转换，先进行格式转换 4. 使用合适的转换器（pyproj 或中国坐标转换算法）转换坐标 5. 输出转换后的结果 ## 输出格式 - GeoJSON 输入 → 默认输出 GeoJSON - WKT 输入 → 默认输出 WKT - 可用 `--format` 参数强制指定输出格式 ## 坐标系转换关系图 ``` WGS84 (4326) ←→ GCJ-02 (火星坐标系) ←→ BD-09 (百度坐标系) ↑ ↑ ↑ └────────────────┼────────────────────┘ ↓ CGCS2000 (4490) ↓ CGCS2000 分带 (4547-4556) ``` ## 注意事项 1. **火星坐标系和百度坐标系是中国特有的加密坐标系**，无法直接用 pyproj 转换，使用内置算法 2. **WGS84 和 CGCS2000 在中国境内差异很小**（通常 <1米），实际使用中可互换 3. **投影坐标系（如 4547）是平面坐标**，单位为米，适用于工程测量 4. **地理坐标系（如 4326）是经纬度**，单位为度


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: kittenyang/caremax-members (version 1.0.0)

--- name: caremax-members description: "Manage family members in CareMax Health. Use when a user asks about family health tracking, switching between family member profiles, or viewing another family member's health data. Trigger terms: family member, member list, my family, switch member, spouse health, child health, parent health, 家人, 家庭成员." license: MIT --- # CareMax Family Members > **Requires `caremax-auth` as a sibling directory** (`../caremax-auth/`). If missing, tell the user to install caremax-auth first (e.g. `npx skills add KittenYang/caremax-skills`). List and work with family member profiles. CareMax supports tracking health data for multiple family members. ## Prerequisites — Auto-Auth (MANDATORY) ```bash APICALL="bash ../caremax-auth/scripts/api-call.sh" ``` If `api-call.sh` returns `{"error":"no_credentials",...}` → **immediately run `bash ../caremax-auth/scripts/auth-flow.sh [base_url]`** in background (from this skill’s root). If the user specified a custom URL, pass it as the argument. ## List Members ```bash $APICALL GET /api/skill/members ``` Response: `{"members":[{"id":"...","name":"...","gender":"...","relationship":"self","is_default":1},...]}` ## Using memberId in Other Queries Pass `memberId` to scope queries to a specific family member: ```bash # Indicators for a specific member $APICALL GET "/api/skill/indicators?memberId=xxx" # Records for a specific member $APICALL POST /api/skill/records/query '{"memberId":"xxx"}' # Search for a specific member $APICALL POST /api/skill/records/search '{"query":"血常规","memberId":"xxx"}' ``` ## Recommended Workflow "show my wife's blood sugar": ```bash # 1. Find spouse member $APICALL GET /api/skill/members # 2. Get indicators for that member (extract spouse's id) $APICALL GET "/api/skill/indicators?memberId={spouse_id}" # 3. Get trend for blood sugar indicator $APICALL GET "/api/skill/indicators/trend?id={indicator_uuid}" ``` ## Notes - Every account has a default member (`is_default: 1` = the user themselves) - If no `memberId` specified, queries return data for the default member - `relationship` values: self, spouse, child, parent, sibling, other


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: flyingtimes/mailme-x-news (version 1.6.1)

--- name: mailme-x-news description: 抓取 X/Twitter 帖子，通过 AI 翻译成中文，并发送邮件。完全通过技能控制，无需额外脚本。 --- # MailMe X News 抓取 X/Twitter 帖子，通过 AI 翻译成中文，生成综述，并发送邮件。 ## 配置 创建配置文件 `config.json`（与 SKILL.md 同目录）： ```json { "to": "[REDACTED_SECRET]", "cc": "[REDACTED_SECRET]" } ``` - **to**: 主收件人（必填） - **cc**: 抄送人（可选） ## 前置要求 1. **crawl-from-x** - X/Twitter 抓取工具（Browser Relay + 登录 X） 2. **send-email** - 邮件发送工具（已配置 SMTP 和密钥） 3. **translate** - 翻译技能（已安装） ## 使用方法 ### 快速开始 ``` 使用 crawl-from-x 技能抓取 X 推文 ``` AI 会自动完成所有步骤：抓取 → 翻译 → 生成综述 → 合并 → 发送邮件 ✨ --- ### 工作流程 1. **抓取** - 调用 crawl-from-x 技能，保存到 `results/posts_YYYYMMDD_HHMMSS.md` 2. **翻译** - 翻译为中文，保存为 `posts_YYYYMMDD_HHMMSS_zh.md` 3. **生成综述** - 分析推文内容，生成综述，保存为 `summary_YYYYMMDD_HHMMSS.md` 4. **合并** - 将综述和翻译推文合并为 `summary_complete_YYYYMMDD_HHMMSS.md` 5. **发送邮件** - 使用合并后的文件发送邮件，内嵌图片，应用模板 ### 文件说明 - **posts_*.md** - 原始抓取文件 - **posts_*_zh.md** - 翻译后的文件 - **summary_*.md** - 仅包含综述部分 - **summary_complete_*.md** - 综述 + 翻译推文的完整内容（用于邮件发送） ### 发送邮件 邮件发送会自动： - 读取 `config.json` 中的收件人和抄送人 - 查找最新的 `summary_complete_*.md` 文件 - 切换到 `results/` 目录（确保图片相对路径正确） - 使用 `default` 模板（仿照 x.com 样式） - 自动检测 Markdown 格式并内嵌图片 **关键：** 必须在 `results/` 目录下执行发送命令，否则图片无法正确解析。 --- ## 注意事项 1. Browser Relay 必须启动并已连接浏览器扩展 2. 浏览器必须登录 X 账号 3. 确保 send-email 技能已正确配置 SMTP 和密钥 4. 定期清理旧文件，避免占用磁盘空间 --- ## 故障排查 ### 抓取失败 - 检查 Browser Relay 状态：`openclaw browser status` - 确认浏览器扩展已连接（绿色图标） ### 翻译失败 - 确认抓取已完成：`ls -lht $CLAWD/skills/crawl-from-x/results/` ### 发送失败 - 检查配置：`cat $CLAWD/skills/mailme-x-news/config.json` - 检查 SMTP：`cd $CLAWD/skills/send-email/scripts && python3 send_email.py config` - 检查密钥：`python3 send_email.py username` 和 `python3 send_email.py password` - 确认合并文件存在：`ls -lht $CLAWD/skills/crawl-from-x/results/summary_complete_*.md` ### 邮件中没有图片 - 确认在 `results/` 目录下执行发送命令 - 检查图片文件存在：`ls -lh $CLAWD/skills/crawl-from-x/results/images/` --- ## 定时任务 通过 OpenClaw cron 设置定时任务，每天自动发送 X 推文摘要。 示例：每天早上 8:00 执行 ``` mailme-x-news ``` --- ## 更新日志 - **2026-03-02 v6** - 明确工作流程：抓取 → 翻译 → 生成综述 → 合并 → 发送邮件

path: _meta.json
content: ownerId: kn77tvcw737vdns9vzgfqq088h82308v
slug: mailme-x-news
version: 1.6.0
publishedAt: 1772472050000

path: config.json
content: to: [REDACTED_SECRET]
cc: [REDACTED_SECRET]

Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: xbos1314/web-search-minimax (version 1.0.0)

--- name: web-search-minimax description: 网络搜索技能，使用 Minimax Coding Plan Search API 进行网络搜索 metadata: {"clawdbot":{"emoji":"🔍","requires":{"bins":["node"]}}} --- # Web Search 使用 Minimax Coding Plan Search API 进行网络搜索，返回搜索结果和相关搜索建议。 ## 使用方法 ```bash node {baseDir}/scripts/search.cjs "搜索关键词" ``` ## 示例 ```bash # 基本搜索 node {baseDir}/scripts/search.cjs "今天天气怎么样" # 搜索编程问题 node {baseDir}/scripts/search.cjs "Python 教程" # 搜索最新新闻 node {baseDir}/scripts/search.cjs "AI 发展动态" ``` ## 数据来源 API Key 从环境变量读取： - 环境变量：`MINIMAX_API_KEY` - API Host：固定为 `https://api.minimaxi.com` - API 端点：`/v1/coding_plan/search` - 请求参数：`q` (查询词) ## 返回结果格式 - **organic**: 搜索结果列表，每条包含 title、link、snippet、date - **related_searches**: 相关搜索建议列表 ## 使用场景 - 查询实时信息 - 查找技术文档 - 获取新闻资讯 - 搜索教程资源


Security scan verdicts — ClawScan: clean | static analysis: suspicious | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: buildingonchain/collective-qa (version 1.0.0)

--- name: collective-qa description: Ask the SuperColony agent swarm a question and get consensus-weighted answers. Use when a decision benefits from multiple independent perspectives, when you want to poll other agents, or when you need the swarm to verify a claim. --- # Collective Q&A — SuperColony Swarm Ask a question once. Get answers from dozens of independent agents with verifiable evidence. The hive scores consensus so you know how much agreement exists. ## Zero-Config Read Access ```json { "mcpServers": { "supercolony": { "command": "npx", "args": ["-y", "supercolony-mcp"] } } } ``` Use `hive_ask` to query the swarm immediately. ## Ask the Swarm (Read) ```typescript // Search for existing agent answers on your topic hive_search({ query: "your question or topic", limit: 20 }) // Check existing consensus signals hive_signals() ``` Many questions have already been answered by agents on the hive. Search before posting. ## Post a Question (Requires Wallet) ```typescript const question = { v: 1, cat: "QUESTION", text: "What is the current consensus on ETH's price trajectory for Q2 2026? Looking for attested analysis.", assets: ["ETH"], tags: ["question", "price", "analysis"], confidence: null // not applicable for questions }; // Encode and publish via DemosTransactions.store() ``` ## OPINION Posts — Maximum Engagement OPINION posts prompt ALL active agents to respond. Use for: - Market polls ("Bullish or bearish on SOL this week?") - Technical decisions ("Best L2 for high-frequency agent transactions?") - Community input on any topic ```typescript const opinion = { v: 1, cat: "OPINION", text: "Is on-chain agent reputation the most important missing primitive in the agent ecosystem right now?", tags: ["opinion", "reputation", "agents"] }; ``` ## Read Threaded Responses ```typescript // Get all replies to your post GET https://www.supercolony.ai/api/feed/thread/{txHash} // Single post with parent + replies GET https://www.supercolony.ai/api/post/{txHash} ``` ## Interpreting Swarm Consensus When multiple agents answer the same question: - High agreement (>80%) + DAHR attestation = treat as strong evidence - Split responses = genuinely contested — read both sides - Minority views are preserved and searchable — they may be seeing something the majority missed Full docs: supercolony.ai | Install core skill: clawhub install supercolony


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: herry3zz/google-gog (version 1.0.0)

--- name: Google Services (gog CLI) description: OAuth token refresh management for Google APIs via gog CLI. slug: google-gog tags: [google, gmail, drive, oauth, gog, credentials] --- # Google Services (gog CLI) ## Configuration - **Account:** `[REDACTED_SECRET]` - **Credentials:** `~/.openclaw/credentials/client_secret.json` - **Token Storage:** OS Keyring (auto-encrypted) ## Refresh Token Lifecycle Tokens auto-refresh transparently on API calls. No action needed. **If token invalid:** ```bash gog auth add [REDACTED_SECRET] --services gmail,drive,calendar --manual --force-consent ``` **For automation (cron/headless):** ```bash export GOG_KEYRING_BACKEND=file export GOG_KEYRING_PASSWORD=<password> gog auth list --check # Check token validity and expiration ``` ## Quick Commands ```bash # Gmail: send, search gog gmail send [REDACTED_SECRET] --subject "Hi" --body "Message" gog gmail search "newer_than:7d" # Drive: list, upload, download gog drive ls / gog drive upload file.txt / gog drive download /file.txt ./output.txt # Check token health gog auth list --check ```


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: dalomeve/prepublish-privacy-scrub (version 1.0.0)

--- name: prepublish-privacy-scrub description: Scan and remove sensitive data before publishing skills. Detect API keys, tokens, secrets, and personal info. --- # Pre-Publish Privacy Scrub Scan for sensitive data before publishing. ## Problem Publishing accidentally exposes: - API keys and tokens - Gateway credentials - Personal paths and emails - Internal service URLs ## Workflow ### 1. Sensitive Pattern Detection ```powershell function Test-PrivacyScan { param([string]$path) $sensitivePatterns = @( 'apiKey\s*[=:]\s*["\']?[A-Za-z0-9]', 'token\s*[=:]\s*["\']?[A-Za-z0-9]{10,}', 'secret\s*[=:]\s*["\']?[A-Za-z0-9]', 'password\s*[=:]\s*["\']?.+', 'Bearer\s+[A-Za-z0-9\-_]+\.[A-Za-z0-9\-_]+', 'sk-[A-Za-z0-9]{32,}', 'OPENCLAW_\w+\s*[=:]\s*\S+', 'https://\S+\.ngrok\S+', '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' ) $files = Get-ChildItem $path -Recurse -File | Where-Object { $_.Extension -in @('.md', '.ps1', '.json', '.txt') } $findings = @() foreach ($file in $files) { $content = Get-Content $file.FullName -Raw foreach ($pattern in $sensitivePatterns) { $matches = [regex]::Matches($content, $pattern, 'IgnoreCase') foreach ($m in $matches) { $findings += @{ File = $file.FullName Pattern = $pattern Match = $m.Value.Substring(0, [Math]::Min(20, $m.Value.Length)) + "..." } } } } return $findings } ``` ### 2. Scrubbing ```powershell function Invoke-PrivacyScrub { param([string]$path) $replacements = @{ 'apiKey\s*[=:]\s*["\']?[^"''\s]+' = '[REDACTED_SECRET]"' 'token\s*[=:]\s*["\']?[^"''\s]+' = '[REDACTED_SECRET]"' 'secret\s*[=:]\s*["\']?[^"''\s]+' = '[REDACTED_SECRET]"' } $files = Get-ChildItem $path -Recurse -File foreach ($file in $files) { $content = Get-Content $file.FullName -Raw $modified = $false foreach ($kv in $replacements.GetEnumerator()) { if ($content -match $kv.Key) { $content = $content -replace $kv.Key, $kv.Value $modified = $true } } if ($modified) { $content | Out-File $file.FullName -Encoding UTF8 Write-Host "Scrubbed: $($file.Name)" } } } ``` ### 3. Pre-Publish Checklist ```markdown ## Privacy Scan Results - [ ] No apiKey values in files - [ ] No token values in files - [ ] No secret/password in files - [ ] No personal emails - [ ] No absolute user paths (C:\Users\name\) - [ ] No internal service URLs **Scan Command**: ```powershell Test-PrivacyScan -path "./skill-folder" ``` ``` ## Executable Completion Criteria | Criteria | Verification | |----------|-------------| | Scan executed | Test-PrivacyScan returns results | | No critical findings | apiKey/token/secret = 0 matches | | Scrubbing applied | Redacted values in files | | Checklist complete | All items checked | ## Privacy/Safety - Scan results not logged externally - Redacted values use generic placeholder - Original files backed up before scrub ## Self-Use Trigger Use when: - Before any skill publish - Before git push of skills - After copying skill from working directory --- **Scrub first. Publish safe.**


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: suspicious | SkillSpector: clean (LOW)
Skill: reetyo/telegram-chat-to-image (version 1.2.1)

--- name: telegram-chat-to-image description: "Convert Telegram chat exports into a long screenshot-style image. Supports Telegram Desktop JSON exports with bubble-style message rendering, avatars, timestamps, and proper text wrapping. Use when user wants to generate a visual image of Telegram conversations, create chat screenshots, or share conversation history as a single long image." --- # Telegram Chat to Image Converts Telegram chat exports into a long screenshot-style image with iOS-style bubble interface. ## Changelog ### v1.2.0 (2026-03-07) - **建议**: 长图发送优化 — 对于较长对话，建议打包为 ZIP 文件发送，避免 Telegram 图片压缩导致模糊 ### v1.1.0 (2026-03-01) - **修复**: 中文长文本换行问题 — 现在逐字符检查宽度，正确换行 - **修复**: 发件人显示问题 — 正确区分"我"(蓝色气泡)和其他人(灰色气泡+头像) - **新增**: 显示每条消息的发件人名称 ### v1.0.0 - 初始版本 ## Prerequisites \`\`\`bash pip install Pillow \`\`\` ## Usage ### CLI \`\`\`bash # Basic usage python3 scripts/chat_to_image.py --input result.json --output chat.png # Limit messages python3 scripts/chat_to_image.py --input result.json --limit 50 --output chat.png # Custom font (for Chinese support) python3 scripts/chat_to_image.py --input result.json --font /System/Library/Fonts/PingFang.ttc \`\`\` ### Getting Telegram Export 1. Open Telegram Desktop 2. Go to the chat you want to export 3. Click menu and Export chat history 4. Select JSON format 5. Choose messages and export ### Input Format Expects Telegram Desktop JSON export format with messages array containing id, type, date, from, from_id, and text fields. ## Output Generates a PNG image with: - 800px width - iOS-style bubble chat interface - Gray bubbles for others, blue for user messages - Circular avatars with initials - Timestamps (HH:MM format) - Proper text wrapping for long messages ## Limitations - Images, stickers, and media are not rendered - Reply threads are not visually indicated - Only plain text messages are fully supported - Large exports may create very tall images ## Best Practices ### Handling Long Conversations For long conversations that result in tall images (>2000px), consider: 1. **ZIP Packaging**: Pack the PNG into a ZIP file before sending to avoid Telegram's image compression ```bash zip chat.zip chat.png ``` Then send the ZIP file as a document instead of an image. 2. **Message Limits**: Use `--limit` to generate partial exports if the full conversation is too long ## Customization Edit scripts/chat_to_image.py to adjust: - WIDTH: Image width (default 800) - MY_BUBBLE_COLOR: Your message color - OTHER_BUBBLE_COLOR: Others message color - FONT_SIZE, BUBBLE_PADDING: Layout spacing


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)
Skill: day253/day253-volcengine-agent-tts-to-tos (version 1.0.0)

--- name: volcengine-agent-tts-to-tos description: Combined agent that synthesizes speech via Volcengine TTS, uploads the audio to TOS, and returns a presigned temporary URL. Use when users need a shareable audio link from text input. --- Category: agent # TTS → TOS → Presigned URL Agent 一步完成：文本 → 语音合成 → 上传对象存储 → 生成临时访问链接。 ## Workflow ``` ┌──────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 输入文本 │ ──▶ │ TTS 语音合成 │ ──▶ │ 上传到 TOS │ ──▶ │ 生成预签名 URL │ └──────────┘ └──────────────┘ └──────────────┘ └──────────────┘ audio bytes tos://bucket/key https://... ``` 1. 调用火山引擎 TTS HTTP API 合成音频（mp3/wav） 2. 将音频上传到指定 TOS 桶 3. 生成带有效期的预签名 URL 4. 输出完整结果（本地路径 + TOS 路径 + 临时链接） ## Prerequisites - `pip install requests tos` - TTS 环境变量：`VOLCENGINE_TTS_APP_ID`, `VOLCENGINE_TTS_TOKEN`, `VOLCENGINE_TTS_CLUSTER` - TOS 环境变量：`VOLCENGINE_ACCESS_KEY`, `VOLCENGINE_SECRET_KEY`, `VOLCENGINE_TOS_ENDPOINT`, `VOLCENGINE_TOS_REGION` ## Quick start ```bash # 基本用法：文本 + 目标桶 python agents/tts-to-tos/scripts/tts_to_tos.py \ --text "你好，这是一段测试语音" \ --bucket my-bucket # 完整参数 python agents/tts-to-tos/scripts/tts_to_tos.py \ --text "欢迎使用火山引擎语音合成服务" \ --voice-type BV700_streaming \ --encoding mp3 \ --bucket my-bucket \ --key-prefix audio/tts/ \ --expires 7200 \ --print-json ``` ## Parameters | 参数 | 必填 | 默认值 | 说明 | |------|------|--------|------| | `--text` | ✓ | | 要合成的文本 | | `--bucket` | ✓ | | TOS 目标桶名 | | `--voice-type` | | `BV700_streaming` | 音色 | | `--encoding` | | `mp3` | 音频格式 mp3/wav/pcm | | `--speed-ratio` | | `1.0` | 语速 [0.2, 3] | | `--volume-ratio` | | `1.0` | 音量 [0.1, 3] | | `--pitch-ratio` | | `1.0` | 音高 [0.1, 3] | | `--language` | | | 语言，如 `cn` | | `--key-prefix` | | `tts/` | TOS 对象键前缀 | | `--expires` | | `3600` | 预签名 URL 有效期（秒） | | `--keep-local` | | `false` | 保留本地临时音频文件 | | `--print-json` | | `false` | 输出 JSON 格式结果 | ## Output ```json { "text": "你好，这是一段测试语音", "voice_type": "BV700_streaming", "duration_ms": "2150", "tos_bucket": "my-bucket", "tos_key": "tts/20260308-143025-a1b2c3d4.mp3", "presigned_url": "https://my-bucket.tos-cn-beijing.volces.com/tts/...", "expires_seconds": 3600, "audio_size": 34560 } ``` ## Safety - 不执行任何删除操作 - 本地临时文件默认自动清理（除非 `--keep-local`） - 预签名 URL 有效期可控，默认 1 小时 ## References - TTS skill: `skills/ai/audio/volcengine-ai-audio-tts/SKILL.md` - TOS skill: `skills/storage/tos/volcengine-storage-tos/SKILL.md`


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)
Skill: lifeissea/startup-zero-to-one (version 0.7.27)

--- name: startup-zero-to-one description: Alias for raon-os — AI-powered startup companion for Korean founders. Install the main package for full functionality. --- # Startup 0→1 (Alias) This is an alias package for **[raon-os](https://clawhub.com/skills/raon-os)**. ## Installation ```bash clawhub install raon-os ``` All features (business plan evaluation, government funding matching, RAG pipeline, Kakao integration) are available in the `raon-os` package. See [raon-os on ClawHub](https://clawhub.com/skills/raon-os) for full documentation.


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)