bps-kit 1.0.1 → 1.0.2

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 (368) hide show
  1. package/package.json +1 -1
  2. package/templates/.agents/agents/backend-specialist.md +263 -0
  3. package/templates/.agents/agents/code-archaeologist.md +106 -0
  4. package/templates/.agents/agents/database-architect.md +226 -0
  5. package/templates/.agents/agents/debugger.md +225 -0
  6. package/templates/.agents/agents/devops-engineer.md +242 -0
  7. package/templates/.agents/agents/documentation-writer.md +104 -0
  8. package/templates/.agents/agents/explorer-agent.md +73 -0
  9. package/templates/.agents/agents/frontend-specialist.md +593 -0
  10. package/templates/.agents/agents/game-developer.md +162 -0
  11. package/templates/.agents/agents/mobile-developer.md +377 -0
  12. package/templates/.agents/agents/orchestrator.md +416 -0
  13. package/templates/.agents/agents/penetration-tester.md +188 -0
  14. package/templates/.agents/agents/performance-optimizer.md +187 -0
  15. package/templates/.agents/agents/product-manager.md +112 -0
  16. package/templates/.agents/agents/product-owner.md +95 -0
  17. package/templates/.agents/agents/project-planner.md +406 -0
  18. package/templates/.agents/agents/qa-automation-engineer.md +103 -0
  19. package/templates/.agents/agents/security-auditor.md +170 -0
  20. package/templates/.agents/agents/seo-specialist.md +111 -0
  21. package/templates/.agents/agents/test-engineer.md +158 -0
  22. package/templates/.agents/rules/GEMINI.md +219 -0
  23. package/templates/.agents/scripts/auto_preview.py +148 -0
  24. package/templates/.agents/scripts/checklist.py +217 -0
  25. package/templates/.agents/scripts/session_manager.py +120 -0
  26. package/templates/.agents/scripts/verify_all.py +327 -0
  27. package/templates/.agents/workflows/brainstorm.md +113 -0
  28. package/templates/.agents/workflows/create.md +59 -0
  29. package/templates/.agents/workflows/debug.md +103 -0
  30. package/templates/.agents/workflows/deploy.md +176 -0
  31. package/templates/.agents/workflows/enhance.md +63 -0
  32. package/templates/.agents/workflows/orchestrate.md +237 -0
  33. package/templates/.agents/workflows/plan.md +89 -0
  34. package/templates/.agents/workflows/preview.md +81 -0
  35. package/templates/.agents/workflows/setup-brain.md +39 -0
  36. package/templates/.agents/workflows/status.md +86 -0
  37. package/templates/.agents/workflows/test.md +144 -0
  38. package/templates/.agents/workflows/ui-ux-pro-max.md +296 -0
  39. package/templates/skills_normal/api-patterns/scripts/api_validator.py +211 -0
  40. package/templates/skills_normal/database-design/scripts/schema_validator.py +172 -0
  41. package/templates/skills_normal/frontend-design/scripts/accessibility_checker.py +183 -0
  42. package/templates/skills_normal/frontend-design/scripts/ux_audit.py +722 -0
  43. package/templates/skills_normal/git-pushing/scripts/smart_commit.sh +19 -0
  44. package/templates/skills_normal/lint-and-validate/scripts/lint_runner.py +184 -0
  45. package/templates/skills_normal/lint-and-validate/scripts/type_coverage.py +173 -0
  46. package/templates/skills_normal/performance-profiling/scripts/lighthouse_audit.py +76 -0
  47. package/templates/skills_normal/senior-fullstack/scripts/code_quality_analyzer.py +114 -0
  48. package/templates/skills_normal/senior-fullstack/scripts/fullstack_scaffolder.py +114 -0
  49. package/templates/skills_normal/senior-fullstack/scripts/project_scaffolder.py +114 -0
  50. package/templates/skills_normal/seo-fundamentals/scripts/seo_checker.py +219 -0
  51. package/templates/skills_normal/testing-patterns/scripts/test_runner.py +219 -0
  52. package/templates/skills_normal/vulnerability-scanner/scripts/security_scan.py +458 -0
  53. package/templates/vault/007/scripts/config.py +472 -0
  54. package/templates/vault/007/scripts/full_audit.py +1306 -0
  55. package/templates/vault/007/scripts/quick_scan.py +481 -0
  56. package/templates/vault/007/scripts/requirements.txt +26 -0
  57. package/templates/vault/007/scripts/scanners/__init__.py +0 -0
  58. package/templates/vault/007/scripts/scanners/dependency_scanner.py +1305 -0
  59. package/templates/vault/007/scripts/scanners/injection_scanner.py +1104 -0
  60. package/templates/vault/007/scripts/scanners/secrets_scanner.py +1008 -0
  61. package/templates/vault/007/scripts/score_calculator.py +693 -0
  62. package/templates/vault/agent-orchestrator/scripts/match_skills.py +329 -0
  63. package/templates/vault/agent-orchestrator/scripts/orchestrate.py +304 -0
  64. package/templates/vault/agent-orchestrator/scripts/requirements.txt +1 -0
  65. package/templates/vault/agent-orchestrator/scripts/scan_registry.py +508 -0
  66. package/templates/vault/ai-studio-image/scripts/config.py +613 -0
  67. package/templates/vault/ai-studio-image/scripts/generate.py +630 -0
  68. package/templates/vault/ai-studio-image/scripts/prompt_engine.py +424 -0
  69. package/templates/vault/ai-studio-image/scripts/requirements.txt +4 -0
  70. package/templates/vault/ai-studio-image/scripts/templates.py +349 -0
  71. package/templates/vault/android_ui_verification/scripts/verify_ui.sh +32 -0
  72. package/templates/vault/apify-audience-analysis/reference/scripts/run_actor.js +363 -0
  73. package/templates/vault/apify-brand-reputation-monitoring/reference/scripts/run_actor.js +363 -0
  74. package/templates/vault/apify-competitor-intelligence/reference/scripts/run_actor.js +363 -0
  75. package/templates/vault/apify-content-analytics/reference/scripts/run_actor.js +363 -0
  76. package/templates/vault/apify-ecommerce/reference/scripts/package.json +3 -0
  77. package/templates/vault/apify-ecommerce/reference/scripts/run_actor.js +369 -0
  78. package/templates/vault/apify-influencer-discovery/reference/scripts/run_actor.js +363 -0
  79. package/templates/vault/apify-lead-generation/reference/scripts/run_actor.js +363 -0
  80. package/templates/vault/apify-market-research/reference/scripts/run_actor.js +363 -0
  81. package/templates/vault/apify-trend-analysis/reference/scripts/run_actor.js +363 -0
  82. package/templates/vault/apify-ultimate-scraper/reference/scripts/run_actor.js +363 -0
  83. package/templates/vault/audio-transcriber/scripts/install-requirements.sh +190 -0
  84. package/templates/vault/audio-transcriber/scripts/transcribe.py +486 -0
  85. package/templates/vault/claude-monitor/scripts/api_bench.py +240 -0
  86. package/templates/vault/claude-monitor/scripts/config.py +69 -0
  87. package/templates/vault/claude-monitor/scripts/health_check.py +362 -0
  88. package/templates/vault/claude-monitor/scripts/monitor.py +296 -0
  89. package/templates/vault/content-creator/scripts/brand_voice_analyzer.py +185 -0
  90. package/templates/vault/content-creator/scripts/seo_optimizer.py +419 -0
  91. package/templates/vault/context-agent/scripts/active_context.py +227 -0
  92. package/templates/vault/context-agent/scripts/compressor.py +149 -0
  93. package/templates/vault/context-agent/scripts/config.py +69 -0
  94. package/templates/vault/context-agent/scripts/context_loader.py +155 -0
  95. package/templates/vault/context-agent/scripts/context_manager.py +302 -0
  96. package/templates/vault/context-agent/scripts/models.py +103 -0
  97. package/templates/vault/context-agent/scripts/project_registry.py +132 -0
  98. package/templates/vault/context-agent/scripts/requirements.txt +6 -0
  99. package/templates/vault/context-agent/scripts/search.py +115 -0
  100. package/templates/vault/context-agent/scripts/session_parser.py +206 -0
  101. package/templates/vault/context-agent/scripts/session_summary.py +319 -0
  102. package/templates/vault/context-guardian/scripts/context_snapshot.py +229 -0
  103. package/templates/vault/docx/ooxml/scripts/pack.py +159 -0
  104. package/templates/vault/docx/ooxml/scripts/unpack.py +29 -0
  105. package/templates/vault/docx/ooxml/scripts/validate.py +69 -0
  106. package/templates/vault/docx/ooxml/scripts/validation/__init__.py +15 -0
  107. package/templates/vault/docx/ooxml/scripts/validation/base.py +951 -0
  108. package/templates/vault/docx/ooxml/scripts/validation/docx.py +274 -0
  109. package/templates/vault/docx/ooxml/scripts/validation/pptx.py +315 -0
  110. package/templates/vault/docx/ooxml/scripts/validation/redlining.py +279 -0
  111. package/templates/vault/docx/scripts/__init__.py +1 -0
  112. package/templates/vault/docx/scripts/document.py +1276 -0
  113. package/templates/vault/docx/scripts/templates/comments.xml +3 -0
  114. package/templates/vault/docx/scripts/templates/commentsExtended.xml +3 -0
  115. package/templates/vault/docx/scripts/templates/commentsExtensible.xml +3 -0
  116. package/templates/vault/docx/scripts/templates/commentsIds.xml +3 -0
  117. package/templates/vault/docx/scripts/templates/people.xml +3 -0
  118. package/templates/vault/docx/scripts/utilities.py +374 -0
  119. package/templates/vault/docx-official/ooxml/scripts/pack.py +159 -0
  120. package/templates/vault/docx-official/ooxml/scripts/unpack.py +29 -0
  121. package/templates/vault/docx-official/ooxml/scripts/validate.py +69 -0
  122. package/templates/vault/docx-official/ooxml/scripts/validation/__init__.py +15 -0
  123. package/templates/vault/docx-official/ooxml/scripts/validation/base.py +951 -0
  124. package/templates/vault/docx-official/ooxml/scripts/validation/docx.py +274 -0
  125. package/templates/vault/docx-official/ooxml/scripts/validation/pptx.py +315 -0
  126. package/templates/vault/docx-official/ooxml/scripts/validation/redlining.py +279 -0
  127. package/templates/vault/docx-official/scripts/__init__.py +1 -0
  128. package/templates/vault/docx-official/scripts/document.py +1276 -0
  129. package/templates/vault/docx-official/scripts/templates/comments.xml +3 -0
  130. package/templates/vault/docx-official/scripts/templates/commentsExtended.xml +3 -0
  131. package/templates/vault/docx-official/scripts/templates/commentsExtensible.xml +3 -0
  132. package/templates/vault/docx-official/scripts/templates/commentsIds.xml +3 -0
  133. package/templates/vault/docx-official/scripts/templates/people.xml +3 -0
  134. package/templates/vault/docx-official/scripts/utilities.py +374 -0
  135. package/templates/vault/geo-fundamentals/scripts/geo_checker.py +289 -0
  136. package/templates/vault/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
  137. package/templates/vault/i18n-localization/scripts/i18n_checker.py +241 -0
  138. package/templates/vault/instagram/scripts/account_setup.py +233 -0
  139. package/templates/vault/instagram/scripts/analyze.py +221 -0
  140. package/templates/vault/instagram/scripts/api_client.py +444 -0
  141. package/templates/vault/instagram/scripts/auth.py +411 -0
  142. package/templates/vault/instagram/scripts/comments.py +160 -0
  143. package/templates/vault/instagram/scripts/config.py +111 -0
  144. package/templates/vault/instagram/scripts/db.py +467 -0
  145. package/templates/vault/instagram/scripts/export.py +138 -0
  146. package/templates/vault/instagram/scripts/governance.py +233 -0
  147. package/templates/vault/instagram/scripts/hashtags.py +114 -0
  148. package/templates/vault/instagram/scripts/insights.py +170 -0
  149. package/templates/vault/instagram/scripts/media.py +65 -0
  150. package/templates/vault/instagram/scripts/messages.py +103 -0
  151. package/templates/vault/instagram/scripts/profile.py +58 -0
  152. package/templates/vault/instagram/scripts/publish.py +449 -0
  153. package/templates/vault/instagram/scripts/requirements.txt +5 -0
  154. package/templates/vault/instagram/scripts/run_all.py +189 -0
  155. package/templates/vault/instagram/scripts/schedule.py +189 -0
  156. package/templates/vault/instagram/scripts/serve_api.py +234 -0
  157. package/templates/vault/instagram/scripts/templates.py +155 -0
  158. package/templates/vault/junta-leiloeiros/scripts/db.py +216 -0
  159. package/templates/vault/junta-leiloeiros/scripts/export.py +137 -0
  160. package/templates/vault/junta-leiloeiros/scripts/requirements.txt +15 -0
  161. package/templates/vault/junta-leiloeiros/scripts/run_all.py +190 -0
  162. package/templates/vault/junta-leiloeiros/scripts/scraper/__init__.py +4 -0
  163. package/templates/vault/junta-leiloeiros/scripts/scraper/base_scraper.py +209 -0
  164. package/templates/vault/junta-leiloeiros/scripts/scraper/generic_scraper.py +110 -0
  165. package/templates/vault/junta-leiloeiros/scripts/scraper/jucap.py +110 -0
  166. package/templates/vault/junta-leiloeiros/scripts/scraper/juceac.py +72 -0
  167. package/templates/vault/junta-leiloeiros/scripts/scraper/juceal.py +72 -0
  168. package/templates/vault/junta-leiloeiros/scripts/scraper/juceb.py +68 -0
  169. package/templates/vault/junta-leiloeiros/scripts/scraper/jucec.py +63 -0
  170. package/templates/vault/junta-leiloeiros/scripts/scraper/jucema.py +211 -0
  171. package/templates/vault/junta-leiloeiros/scripts/scraper/jucemg.py +218 -0
  172. package/templates/vault/junta-leiloeiros/scripts/scraper/jucep.py +70 -0
  173. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepa.py +74 -0
  174. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepar.py +80 -0
  175. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepe.py +78 -0
  176. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepi.py +69 -0
  177. package/templates/vault/junta-leiloeiros/scripts/scraper/jucer.py +256 -0
  178. package/templates/vault/junta-leiloeiros/scripts/scraper/jucerja.py +170 -0
  179. package/templates/vault/junta-leiloeiros/scripts/scraper/jucern.py +71 -0
  180. package/templates/vault/junta-leiloeiros/scripts/scraper/jucesc.py +89 -0
  181. package/templates/vault/junta-leiloeiros/scripts/scraper/jucesp.py +233 -0
  182. package/templates/vault/junta-leiloeiros/scripts/scraper/jucetins.py +134 -0
  183. package/templates/vault/junta-leiloeiros/scripts/scraper/jucis_df.py +63 -0
  184. package/templates/vault/junta-leiloeiros/scripts/scraper/jucisrs.py +299 -0
  185. package/templates/vault/junta-leiloeiros/scripts/scraper/states.py +99 -0
  186. package/templates/vault/junta-leiloeiros/scripts/serve_api.py +164 -0
  187. package/templates/vault/junta-leiloeiros/scripts/web_scraper_fallback.py +233 -0
  188. package/templates/vault/last30days/scripts/last30days.py +521 -0
  189. package/templates/vault/last30days/scripts/lib/__init__.py +1 -0
  190. package/templates/vault/last30days/scripts/lib/cache.py +152 -0
  191. package/templates/vault/last30days/scripts/lib/dates.py +124 -0
  192. package/templates/vault/last30days/scripts/lib/dedupe.py +120 -0
  193. package/templates/vault/last30days/scripts/lib/env.py +149 -0
  194. package/templates/vault/last30days/scripts/lib/http.py +152 -0
  195. package/templates/vault/last30days/scripts/lib/models.py +175 -0
  196. package/templates/vault/last30days/scripts/lib/normalize.py +160 -0
  197. package/templates/vault/last30days/scripts/lib/openai_reddit.py +230 -0
  198. package/templates/vault/last30days/scripts/lib/reddit_enrich.py +232 -0
  199. package/templates/vault/last30days/scripts/lib/render.py +383 -0
  200. package/templates/vault/last30days/scripts/lib/schema.py +336 -0
  201. package/templates/vault/last30days/scripts/lib/score.py +311 -0
  202. package/templates/vault/last30days/scripts/lib/ui.py +324 -0
  203. package/templates/vault/last30days/scripts/lib/websearch.py +401 -0
  204. package/templates/vault/last30days/scripts/lib/xai_x.py +217 -0
  205. package/templates/vault/leiloeiro-avaliacao/scripts/governance.py +106 -0
  206. package/templates/vault/leiloeiro-avaliacao/scripts/requirements.txt +1 -0
  207. package/templates/vault/leiloeiro-edital/scripts/governance.py +106 -0
  208. package/templates/vault/leiloeiro-edital/scripts/requirements.txt +1 -0
  209. package/templates/vault/leiloeiro-ia/scripts/governance.py +106 -0
  210. package/templates/vault/leiloeiro-ia/scripts/requirements.txt +1 -0
  211. package/templates/vault/leiloeiro-juridico/scripts/governance.py +106 -0
  212. package/templates/vault/leiloeiro-juridico/scripts/requirements.txt +1 -0
  213. package/templates/vault/leiloeiro-mercado/scripts/governance.py +106 -0
  214. package/templates/vault/leiloeiro-mercado/scripts/requirements.txt +1 -0
  215. package/templates/vault/leiloeiro-risco/scripts/governance.py +106 -0
  216. package/templates/vault/leiloeiro-risco/scripts/requirements.txt +1 -0
  217. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/database.ts +24 -0
  218. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/db.ts +35 -0
  219. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/index.ts +2 -0
  220. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/migrations.ts +31 -0
  221. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/schema.sql +8 -0
  222. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/index.ts +44 -0
  223. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/routes/todos.ts +155 -0
  224. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/types/index.ts +35 -0
  225. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.css +384 -0
  226. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.tsx +81 -0
  227. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/api/todos.ts +57 -0
  228. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/ConfirmDialog.tsx +26 -0
  229. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/EmptyState.tsx +8 -0
  230. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoForm.tsx +43 -0
  231. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoItem.tsx +36 -0
  232. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoList.tsx +27 -0
  233. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/hooks/useTodos.ts +81 -0
  234. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/index.css +48 -0
  235. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/main.tsx +10 -0
  236. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/vite-env.d.ts +1 -0
  237. package/templates/vault/loki-mode/scripts/export-to-vibe-kanban.sh +178 -0
  238. package/templates/vault/loki-mode/scripts/loki-wrapper.sh +281 -0
  239. package/templates/vault/loki-mode/scripts/take-screenshots.js +55 -0
  240. package/templates/vault/matematico-tao/scripts/complexity_analyzer.py +544 -0
  241. package/templates/vault/matematico-tao/scripts/dependency_graph.py +538 -0
  242. package/templates/vault/mcp-builder/scripts/connections.py +151 -0
  243. package/templates/vault/mcp-builder/scripts/evaluation.py +373 -0
  244. package/templates/vault/mcp-builder/scripts/example_evaluation.xml +22 -0
  245. package/templates/vault/mcp-builder/scripts/requirements.txt +2 -0
  246. package/templates/vault/mobile-design/scripts/mobile_audit.py +670 -0
  247. package/templates/vault/notebooklm/scripts/__init__.py +81 -0
  248. package/templates/vault/notebooklm/scripts/ask_question.py +256 -0
  249. package/templates/vault/notebooklm/scripts/auth_manager.py +358 -0
  250. package/templates/vault/notebooklm/scripts/browser_session.py +255 -0
  251. package/templates/vault/notebooklm/scripts/browser_utils.py +107 -0
  252. package/templates/vault/notebooklm/scripts/cleanup_manager.py +302 -0
  253. package/templates/vault/notebooklm/scripts/config.py +44 -0
  254. package/templates/vault/notebooklm/scripts/notebook_manager.py +410 -0
  255. package/templates/vault/notebooklm/scripts/run.py +102 -0
  256. package/templates/vault/notebooklm/scripts/setup_environment.py +204 -0
  257. package/templates/vault/pdf/scripts/check_bounding_boxes.py +70 -0
  258. package/templates/vault/pdf/scripts/check_bounding_boxes_test.py +226 -0
  259. package/templates/vault/pdf/scripts/check_fillable_fields.py +12 -0
  260. package/templates/vault/pdf/scripts/convert_pdf_to_images.py +35 -0
  261. package/templates/vault/pdf/scripts/create_validation_image.py +41 -0
  262. package/templates/vault/pdf/scripts/extract_form_field_info.py +152 -0
  263. package/templates/vault/pdf/scripts/fill_fillable_fields.py +114 -0
  264. package/templates/vault/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  265. package/templates/vault/pdf-official/scripts/check_bounding_boxes.py +70 -0
  266. package/templates/vault/pdf-official/scripts/check_bounding_boxes_test.py +226 -0
  267. package/templates/vault/pdf-official/scripts/check_fillable_fields.py +12 -0
  268. package/templates/vault/pdf-official/scripts/convert_pdf_to_images.py +35 -0
  269. package/templates/vault/pdf-official/scripts/create_validation_image.py +41 -0
  270. package/templates/vault/pdf-official/scripts/extract_form_field_info.py +152 -0
  271. package/templates/vault/pdf-official/scripts/fill_fillable_fields.py +114 -0
  272. package/templates/vault/pdf-official/scripts/fill_pdf_form_with_annotations.py +108 -0
  273. package/templates/vault/planning-with-files/scripts/check-complete.sh +44 -0
  274. package/templates/vault/planning-with-files/scripts/init-session.sh +120 -0
  275. package/templates/vault/pptx/ooxml/scripts/pack.py +159 -0
  276. package/templates/vault/pptx/ooxml/scripts/unpack.py +29 -0
  277. package/templates/vault/pptx/ooxml/scripts/validate.py +69 -0
  278. package/templates/vault/pptx/ooxml/scripts/validation/__init__.py +15 -0
  279. package/templates/vault/pptx/ooxml/scripts/validation/base.py +951 -0
  280. package/templates/vault/pptx/ooxml/scripts/validation/docx.py +274 -0
  281. package/templates/vault/pptx/ooxml/scripts/validation/pptx.py +315 -0
  282. package/templates/vault/pptx/ooxml/scripts/validation/redlining.py +279 -0
  283. package/templates/vault/pptx/scripts/html2pptx.js +979 -0
  284. package/templates/vault/pptx/scripts/inventory.py +1020 -0
  285. package/templates/vault/pptx/scripts/rearrange.py +231 -0
  286. package/templates/vault/pptx/scripts/replace.py +385 -0
  287. package/templates/vault/pptx/scripts/thumbnail.py +450 -0
  288. package/templates/vault/pptx-official/ooxml/scripts/pack.py +159 -0
  289. package/templates/vault/pptx-official/ooxml/scripts/unpack.py +29 -0
  290. package/templates/vault/pptx-official/ooxml/scripts/validate.py +69 -0
  291. package/templates/vault/pptx-official/ooxml/scripts/validation/__init__.py +15 -0
  292. package/templates/vault/pptx-official/ooxml/scripts/validation/base.py +951 -0
  293. package/templates/vault/pptx-official/ooxml/scripts/validation/docx.py +274 -0
  294. package/templates/vault/pptx-official/ooxml/scripts/validation/pptx.py +315 -0
  295. package/templates/vault/pptx-official/ooxml/scripts/validation/redlining.py +279 -0
  296. package/templates/vault/pptx-official/scripts/html2pptx.js +979 -0
  297. package/templates/vault/pptx-official/scripts/inventory.py +1020 -0
  298. package/templates/vault/pptx-official/scripts/rearrange.py +231 -0
  299. package/templates/vault/pptx-official/scripts/replace.py +385 -0
  300. package/templates/vault/pptx-official/scripts/thumbnail.py +450 -0
  301. package/templates/vault/product-manager-toolkit/scripts/customer_interview_analyzer.py +441 -0
  302. package/templates/vault/product-manager-toolkit/scripts/rice_prioritizer.py +296 -0
  303. package/templates/vault/prompt-engineering-patterns/scripts/optimize-prompt.py +279 -0
  304. package/templates/vault/scripts/.skill_cache.json +7538 -0
  305. package/templates/vault/scripts/skill_search.py +228 -0
  306. package/templates/vault/senior-architect/scripts/architecture_diagram_generator.py +114 -0
  307. package/templates/vault/senior-architect/scripts/dependency_analyzer.py +114 -0
  308. package/templates/vault/senior-architect/scripts/project_architect.py +114 -0
  309. package/templates/vault/shopify-development/scripts/requirements.txt +19 -0
  310. package/templates/vault/shopify-development/scripts/shopify_graphql.py +428 -0
  311. package/templates/vault/shopify-development/scripts/shopify_init.py +441 -0
  312. package/templates/vault/shopify-development/scripts/tests/test_shopify_init.py +379 -0
  313. package/templates/vault/skill-creator/scripts/init_skill.py +303 -0
  314. package/templates/vault/skill-creator/scripts/package_skill.py +110 -0
  315. package/templates/vault/skill-creator/scripts/quick_validate.py +95 -0
  316. package/templates/vault/skill-installer/scripts/detect_skills.py +318 -0
  317. package/templates/vault/skill-installer/scripts/install_skill.py +1708 -0
  318. package/templates/vault/skill-installer/scripts/package_skill.py +417 -0
  319. package/templates/vault/skill-installer/scripts/requirements.txt +1 -0
  320. package/templates/vault/skill-installer/scripts/validate_skill.py +430 -0
  321. package/templates/vault/skill-sentinel/scripts/analyzers/__init__.py +13 -0
  322. package/templates/vault/skill-sentinel/scripts/analyzers/code_quality.py +247 -0
  323. package/templates/vault/skill-sentinel/scripts/analyzers/cross_skill.py +134 -0
  324. package/templates/vault/skill-sentinel/scripts/analyzers/dependencies.py +121 -0
  325. package/templates/vault/skill-sentinel/scripts/analyzers/documentation.py +189 -0
  326. package/templates/vault/skill-sentinel/scripts/analyzers/governance_audit.py +153 -0
  327. package/templates/vault/skill-sentinel/scripts/analyzers/performance.py +164 -0
  328. package/templates/vault/skill-sentinel/scripts/analyzers/security.py +189 -0
  329. package/templates/vault/skill-sentinel/scripts/config.py +158 -0
  330. package/templates/vault/skill-sentinel/scripts/cost_optimizer.py +146 -0
  331. package/templates/vault/skill-sentinel/scripts/db.py +354 -0
  332. package/templates/vault/skill-sentinel/scripts/governance.py +58 -0
  333. package/templates/vault/skill-sentinel/scripts/recommender.py +228 -0
  334. package/templates/vault/skill-sentinel/scripts/report_generator.py +224 -0
  335. package/templates/vault/skill-sentinel/scripts/requirements.txt +1 -0
  336. package/templates/vault/skill-sentinel/scripts/run_audit.py +290 -0
  337. package/templates/vault/skill-sentinel/scripts/scanner.py +271 -0
  338. package/templates/vault/stability-ai/scripts/config.py +266 -0
  339. package/templates/vault/stability-ai/scripts/generate.py +687 -0
  340. package/templates/vault/stability-ai/scripts/requirements.txt +4 -0
  341. package/templates/vault/stability-ai/scripts/styles.py +174 -0
  342. package/templates/vault/telegram/assets/boilerplate/nodejs/src/bot-client.ts +86 -0
  343. package/templates/vault/telegram/assets/boilerplate/nodejs/src/handlers.ts +79 -0
  344. package/templates/vault/telegram/assets/boilerplate/nodejs/src/index.ts +32 -0
  345. package/templates/vault/telegram/scripts/send_message.py +143 -0
  346. package/templates/vault/telegram/scripts/setup_project.py +103 -0
  347. package/templates/vault/telegram/scripts/test_bot.py +144 -0
  348. package/templates/vault/typescript-expert/scripts/ts_diagnostic.py +203 -0
  349. package/templates/vault/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
  350. package/templates/vault/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
  351. package/templates/vault/ui-ux-pro-max/scripts/core.py +257 -0
  352. package/templates/vault/ui-ux-pro-max/scripts/design_system.py +487 -0
  353. package/templates/vault/ui-ux-pro-max/scripts/search.py +76 -0
  354. package/templates/vault/videodb/scripts/ws_listener.py +204 -0
  355. package/templates/vault/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  356. package/templates/vault/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  357. package/templates/vault/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  358. package/templates/vault/webapp-testing/scripts/with_server.py +106 -0
  359. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/index.ts +125 -0
  360. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/template-manager.ts +67 -0
  361. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/types.ts +216 -0
  362. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/webhook-handler.ts +173 -0
  363. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/whatsapp-client.ts +193 -0
  364. package/templates/vault/whatsapp-cloud-api/scripts/send_test_message.py +137 -0
  365. package/templates/vault/whatsapp-cloud-api/scripts/setup_project.py +118 -0
  366. package/templates/vault/whatsapp-cloud-api/scripts/validate_config.py +190 -0
  367. package/templates/vault/youtube-summarizer/scripts/extract-transcript.py +65 -0
  368. package/templates/vault/youtube-summarizer/scripts/install-dependencies.sh +28 -0
@@ -0,0 +1,174 @@
1
+ """
2
+ Presets de estilo para Stability AI.
3
+
4
+ Cada estilo adiciona qualificadores ao prompt do usuario para direcionar
5
+ o modelo na direcao visual desejada. Use --style <nome> no CLI.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ STYLES = {
10
+ "photorealistic": {
11
+ "name": "Fotorrealismo",
12
+ "suffix": (
13
+ "photorealistic, hyperrealistic, 8k uhd, high resolution, "
14
+ "sharp focus, professional photography, natural lighting, "
15
+ "film grain, bokeh, shot on Canon EOS R5"
16
+ ),
17
+ "negative": "cartoon, painting, illustration, drawing, anime, cgi, render",
18
+ },
19
+ "anime": {
20
+ "name": "Anime / Manga",
21
+ "suffix": (
22
+ "anime style, manga art, cel shading, vibrant colors, "
23
+ "clean linework, detailed eyes, studio ghibli inspired, "
24
+ "high quality anime illustration"
25
+ ),
26
+ "negative": "photorealistic, photo, 3d render, western cartoon",
27
+ },
28
+ "digital-art": {
29
+ "name": "Arte Digital",
30
+ "suffix": (
31
+ "digital art, highly detailed, digital painting, artstation, "
32
+ "concept art, smooth, sharp focus, illustration, "
33
+ "professional digital artwork"
34
+ ),
35
+ "negative": "photo, photograph, low quality, blurry",
36
+ },
37
+ "oil-painting": {
38
+ "name": "Pintura a Oleo",
39
+ "suffix": (
40
+ "oil painting on canvas, thick brushstrokes, rich texture, "
41
+ "classical art, warm color palette, museum quality, "
42
+ "rembrandt lighting, chiaroscuro"
43
+ ),
44
+ "negative": "digital, photo, smooth, flat, cartoon",
45
+ },
46
+ "watercolor": {
47
+ "name": "Aquarela",
48
+ "suffix": (
49
+ "watercolor painting, soft washes, translucent layers, "
50
+ "wet on wet technique, delicate details, paper texture visible, "
51
+ "flowing colors, artistic watercolor illustration"
52
+ ),
53
+ "negative": "digital, photo, sharp edges, bold outlines",
54
+ },
55
+ "pixel-art": {
56
+ "name": "Pixel Art",
57
+ "suffix": (
58
+ "pixel art, 16-bit, retro game style, limited color palette, "
59
+ "crisp pixels, no anti-aliasing, nostalgic, 8-bit aesthetic"
60
+ ),
61
+ "negative": "realistic, photo, smooth, high resolution, blurry",
62
+ },
63
+ "3d-render": {
64
+ "name": "Render 3D",
65
+ "suffix": (
66
+ "3d render, octane render, unreal engine 5, ray tracing, "
67
+ "volumetric lighting, subsurface scattering, physically based rendering, "
68
+ "cinema 4d, blender cycles, ultra detailed"
69
+ ),
70
+ "negative": "2d, flat, painting, sketch, low poly",
71
+ },
72
+ "concept-art": {
73
+ "name": "Concept Art",
74
+ "suffix": (
75
+ "concept art, highly detailed, professional illustration, "
76
+ "trending on artstation, matte painting, dynamic composition, "
77
+ "cinematic, dramatic lighting, epic scale"
78
+ ),
79
+ "negative": "photo, amateur, low quality, simple",
80
+ },
81
+ "comic": {
82
+ "name": "Comics / HQ",
83
+ "suffix": (
84
+ "comic book style, bold outlines, halftone dots, dynamic pose, "
85
+ "vivid colors, graphic novel illustration, ink drawing, "
86
+ "professional comic art"
87
+ ),
88
+ "negative": "photorealistic, soft, watercolor, oil painting",
89
+ },
90
+ "minimalist": {
91
+ "name": "Minimalista",
92
+ "suffix": (
93
+ "minimalist design, clean lines, simple shapes, "
94
+ "limited color palette, negative space, modern aesthetic, "
95
+ "flat design, geometric, elegant simplicity"
96
+ ),
97
+ "negative": "complex, detailed, busy, cluttered, realistic",
98
+ },
99
+ "fantasy": {
100
+ "name": "Fantasy Art",
101
+ "suffix": (
102
+ "epic fantasy art, magical atmosphere, ethereal glow, "
103
+ "detailed fantasy illustration, mystical, enchanted, "
104
+ "dramatic lighting, heroic, masterpiece"
105
+ ),
106
+ "negative": "modern, mundane, realistic, photo",
107
+ },
108
+ "sci-fi": {
109
+ "name": "Sci-Fi Futurista",
110
+ "suffix": (
111
+ "science fiction art, futuristic, neon lights, cyberpunk, "
112
+ "advanced technology, holographic, chrome and glass, "
113
+ "blade runner aesthetic, high tech"
114
+ ),
115
+ "negative": "medieval, fantasy, natural, organic, rustic",
116
+ },
117
+ "sketch": {
118
+ "name": "Desenho a Lapis",
119
+ "suffix": (
120
+ "pencil sketch, graphite drawing, detailed linework, "
121
+ "cross-hatching, shading, paper texture, hand-drawn, "
122
+ "charcoal drawing, artist sketchbook"
123
+ ),
124
+ "negative": "color, painted, digital, photo, saturated",
125
+ },
126
+ "pop-art": {
127
+ "name": "Pop Art",
128
+ "suffix": (
129
+ "pop art style, bold primary colors, ben-day dots, "
130
+ "high contrast, graphic, screen print effect, "
131
+ "vibrant and eye-catching"
132
+ ),
133
+ "negative": "realistic, muted colors, subtle, natural",
134
+ },
135
+ "noir": {
136
+ "name": "Film Noir",
137
+ "suffix": (
138
+ "film noir style, black and white, dramatic shadows, "
139
+ "high contrast, moody atmosphere, venetian blinds shadow, "
140
+ "detective story aesthetic, 1940s cinema"
141
+ ),
142
+ "negative": "colorful, bright, cheerful, modern, flat lighting",
143
+ },
144
+ }
145
+
146
+ DEFAULT_STYLE = None
147
+
148
+
149
+ def get_style(name: str) -> dict | None:
150
+ """Retorna configuracao de um estilo ou None se nao existe."""
151
+ return STYLES.get(name.lower().strip())
152
+
153
+
154
+ def list_styles() -> dict:
155
+ """Retorna todos os estilos disponiveis."""
156
+ return STYLES
157
+
158
+
159
+ def apply_style(prompt: str, style_name: str | None) -> tuple[str, str | None]:
160
+ """
161
+ Aplica estilo ao prompt.
162
+
163
+ Retorna (prompt_modificado, negative_prompt).
164
+ Se estilo nao encontrado, retorna prompt original.
165
+ """
166
+ if not style_name:
167
+ return prompt, None
168
+
169
+ style = get_style(style_name)
170
+ if not style:
171
+ return prompt, None
172
+
173
+ enhanced = f"{prompt}, {style['suffix']}"
174
+ return enhanced, style.get("negative")
@@ -0,0 +1,86 @@
1
+ import TelegramBot from 'node-telegram-bot-api';
2
+ import express from 'express';
3
+
4
+ export class TelegramBotClient {
5
+ public bot: TelegramBot;
6
+ private token: string;
7
+
8
+ constructor(token: string, webhookMode: boolean = false) {
9
+ this.token = token;
10
+ this.bot = new TelegramBot(token, {
11
+ polling: !webhookMode,
12
+ });
13
+ }
14
+
15
+ async startPolling(): Promise<void> {
16
+ const me = await this.bot.getMe();
17
+ console.log(`Bot @${me.username} (${me.first_name}) started with polling`);
18
+ }
19
+
20
+ async startWebhook(port: number, webhookUrl: string, secret?: string): Promise<void> {
21
+ const app = express();
22
+ app.use(express.json());
23
+
24
+ // Webhook endpoint
25
+ app.post(`/webhook/${this.token}`, (req, res) => {
26
+ if (secret) {
27
+ const headerSecret = req.headers['x-telegram-bot-api-secret-token'];
28
+ if (headerSecret !== secret) {
29
+ return res.sendStatus(403);
30
+ }
31
+ }
32
+ this.bot.processUpdate(req.body);
33
+ res.sendStatus(200);
34
+ });
35
+
36
+ // Health check
37
+ app.get('/health', (_req, res) => {
38
+ res.json({ status: 'ok', bot: 'running' });
39
+ });
40
+
41
+ // Register webhook with Telegram
42
+ await this.bot.setWebHook(`${webhookUrl}/webhook/${this.token}`, {
43
+ max_connections: 40,
44
+ secret_token: secret,
45
+ } as any);
46
+
47
+ const info = await this.bot.getWebHookInfo();
48
+ console.log('Webhook registered:', info.url);
49
+
50
+ app.listen(port, () => {
51
+ console.log(`Express server listening on port ${port}`);
52
+ });
53
+
54
+ const me = await this.bot.getMe();
55
+ console.log(`Bot @${me.username} (${me.first_name}) started with webhook`);
56
+ }
57
+
58
+ /**
59
+ * Send a text message with automatic retry on rate limit.
60
+ */
61
+ async sendMessageSafe(
62
+ chatId: number | string,
63
+ text: string,
64
+ options?: TelegramBot.SendMessageOptions
65
+ ): Promise<TelegramBot.Message | null> {
66
+ const maxRetries = 3;
67
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
68
+ try {
69
+ return await this.bot.sendMessage(chatId, text, options);
70
+ } catch (error: any) {
71
+ if (error?.response?.statusCode === 429) {
72
+ const retryAfter = error.response.body?.parameters?.retry_after || 5;
73
+ console.warn(`Rate limited. Retrying after ${retryAfter}s...`);
74
+ await new Promise((r) => setTimeout(r, retryAfter * 1000));
75
+ continue;
76
+ }
77
+ if (error?.response?.statusCode === 403) {
78
+ console.warn(`Bot blocked by user ${chatId}`);
79
+ return null;
80
+ }
81
+ throw error;
82
+ }
83
+ }
84
+ return null;
85
+ }
86
+ }
@@ -0,0 +1,79 @@
1
+ import { TelegramBotClient } from './bot-client';
2
+ import TelegramBot from 'node-telegram-bot-api';
3
+
4
+ export function registerHandlers(client: TelegramBotClient): void {
5
+ const bot = client.bot;
6
+
7
+ // /start command
8
+ bot.onText(/\/start/, async (msg) => {
9
+ const name = msg.from?.first_name || 'usuario';
10
+ await client.sendMessageSafe(
11
+ msg.chat.id,
12
+ `Ola, ${name}! Bem-vindo ao bot.\n\nComandos disponiveis:\n/start - Iniciar\n/help - Ajuda\n/about - Sobre`,
13
+ { parse_mode: 'HTML' }
14
+ );
15
+ });
16
+
17
+ // /help command
18
+ bot.onText(/\/help/, async (msg) => {
19
+ await client.sendMessageSafe(
20
+ msg.chat.id,
21
+ '<b>Comandos:</b>\n' +
22
+ '/start - Iniciar o bot\n' +
23
+ '/help - Ver esta mensagem\n' +
24
+ '/about - Informacoes sobre o bot\n' +
25
+ '/echo &lt;texto&gt; - Repetir texto',
26
+ { parse_mode: 'HTML' }
27
+ );
28
+ });
29
+
30
+ // /about command
31
+ bot.onText(/\/about/, async (msg) => {
32
+ const me = await bot.getMe();
33
+ await client.sendMessageSafe(
34
+ msg.chat.id,
35
+ `<b>${me.first_name}</b>\n@${me.username}\n\nBot criado com Telegram Bot API`,
36
+ { parse_mode: 'HTML' }
37
+ );
38
+ });
39
+
40
+ // /echo command
41
+ bot.onText(/\/echo (.+)/, async (msg, match) => {
42
+ const text = match?.[1] || '';
43
+ await client.sendMessageSafe(msg.chat.id, text);
44
+ });
45
+
46
+ // Callback query handler (for inline keyboards)
47
+ bot.on('callback_query', async (query) => {
48
+ await bot.answerCallbackQuery(query.id, { text: `Opcao: ${query.data}` });
49
+
50
+ if (query.message) {
51
+ await bot.editMessageText(`Voce escolheu: ${query.data}`, {
52
+ chat_id: query.message.chat.id,
53
+ message_id: query.message.message_id,
54
+ });
55
+ }
56
+ });
57
+
58
+ // Default message handler (echo)
59
+ bot.on('message', async (msg) => {
60
+ // Skip commands
61
+ if (msg.text?.startsWith('/')) return;
62
+
63
+ // Echo non-command text messages
64
+ if (msg.text) {
65
+ await client.sendMessageSafe(msg.chat.id, `Voce disse: ${msg.text}`);
66
+ }
67
+ });
68
+
69
+ // Error handler
70
+ bot.on('polling_error', (error) => {
71
+ console.error('Polling error:', error.message);
72
+ });
73
+
74
+ bot.on('webhook_error', (error) => {
75
+ console.error('Webhook error:', error.message);
76
+ });
77
+
78
+ console.log('All handlers registered');
79
+ }
@@ -0,0 +1,32 @@
1
+ import dotenv from 'dotenv';
2
+ dotenv.config();
3
+
4
+ import { TelegramBotClient } from './bot-client';
5
+ import { registerHandlers } from './handlers';
6
+
7
+ async function main() {
8
+ const token = process.env.TELEGRAM_BOT_TOKEN;
9
+ if (!token) {
10
+ console.error('ERROR: Set TELEGRAM_BOT_TOKEN in .env file');
11
+ process.exit(1);
12
+ }
13
+
14
+ const useWebhook = !!process.env.WEBHOOK_URL;
15
+ const client = new TelegramBotClient(token, useWebhook);
16
+
17
+ // Register all command and message handlers
18
+ registerHandlers(client);
19
+
20
+ if (useWebhook) {
21
+ const port = parseInt(process.env.PORT || '3000');
22
+ const webhookUrl = process.env.WEBHOOK_URL!;
23
+ const secret = process.env.WEBHOOK_SECRET;
24
+ await client.startWebhook(port, webhookUrl, secret);
25
+ console.log(`Bot running in webhook mode on port ${port}`);
26
+ } else {
27
+ await client.startPolling();
28
+ console.log('Bot running in polling mode. Press Ctrl+C to stop.');
29
+ }
30
+ }
31
+
32
+ main().catch(console.error);
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Send a test message via Telegram Bot API.
4
+
5
+ Usage:
6
+ python send_message.py --token "TOKEN" --chat-id "CHAT_ID" --text "Hello!"
7
+ python send_message.py --chat-id "CHAT_ID" --text "Hello!" # Uses env var
8
+ python send_message.py --chat-id "CHAT_ID" --photo "https://example.com/img.jpg"
9
+ python send_message.py --chat-id "CHAT_ID" --document "/path/to/file.pdf"
10
+ """
11
+
12
+ import argparse
13
+ import json
14
+ import os
15
+ import sys
16
+ from urllib.request import urlopen, Request
17
+ from urllib.error import HTTPError
18
+
19
+
20
+ def _mask_token(token: str) -> str:
21
+ """Return a masked version of the token for safe logging."""
22
+ if not token or len(token) < 12:
23
+ return "***masked***"
24
+ return f"{token[:8]}...masked"
25
+
26
+
27
+ def api_call(token: str, method: str, data: dict) -> dict:
28
+ """Make a Telegram Bot API call."""
29
+ url = f"https://api.telegram.org/bot{token}/{method}"
30
+ payload = json.dumps(data).encode("utf-8")
31
+ req = Request(url, data=payload, headers={"Content-Type": "application/json"})
32
+
33
+ try:
34
+ with urlopen(req, timeout=30) as resp:
35
+ return json.loads(resp.read().decode())
36
+ except HTTPError as e:
37
+ error_body = json.loads(e.read().decode())
38
+ return error_body
39
+
40
+
41
+ def send_text(token: str, chat_id: str, text: str, parse_mode: str = None,
42
+ silent: bool = False) -> dict:
43
+ """Send a text message."""
44
+ data = {"chat_id": chat_id, "text": text}
45
+ if parse_mode:
46
+ data["parse_mode"] = parse_mode
47
+ if silent:
48
+ data["disable_notification"] = True
49
+ return api_call(token, "sendMessage", data)
50
+
51
+
52
+ def send_photo(token: str, chat_id: str, photo: str, caption: str = None) -> dict:
53
+ """Send a photo by URL or file_id."""
54
+ data = {"chat_id": chat_id, "photo": photo}
55
+ if caption:
56
+ data["caption"] = caption
57
+ return api_call(token, "sendPhoto", data)
58
+
59
+
60
+ def send_document_url(token: str, chat_id: str, document: str, caption: str = None) -> dict:
61
+ """Send a document by URL."""
62
+ data = {"chat_id": chat_id, "document": document}
63
+ if caption:
64
+ data["caption"] = caption
65
+ return api_call(token, "sendDocument", data)
66
+
67
+
68
+ def send_location(token: str, chat_id: str, lat: float, lon: float) -> dict:
69
+ """Send a location."""
70
+ return api_call(token, "sendLocation", {
71
+ "chat_id": chat_id,
72
+ "latitude": lat,
73
+ "longitude": lon
74
+ })
75
+
76
+
77
+ def send_poll(token: str, chat_id: str, question: str, options: list) -> dict:
78
+ """Send a poll."""
79
+ return api_call(token, "sendPoll", {
80
+ "chat_id": chat_id,
81
+ "question": question,
82
+ "options": [{"text": opt} for opt in options]
83
+ })
84
+
85
+
86
+ def main():
87
+ parser = argparse.ArgumentParser(description="Send Telegram message")
88
+ parser.add_argument("--token", type=str, help="Bot token (or TELEGRAM_BOT_TOKEN env)")
89
+ parser.add_argument("--chat-id", type=str, required=True, help="Target chat ID")
90
+ parser.add_argument("--text", type=str, help="Text message to send")
91
+ parser.add_argument("--parse-mode", type=str, choices=["HTML", "MarkdownV2", "Markdown"],
92
+ help="Parse mode for text formatting")
93
+ parser.add_argument("--photo", type=str, help="Photo URL to send")
94
+ parser.add_argument("--document", type=str, help="Document URL to send")
95
+ parser.add_argument("--caption", type=str, help="Caption for photo/document")
96
+ parser.add_argument("--location", type=str, help="Location as 'lat,lon'")
97
+ parser.add_argument("--poll", type=str, help="Poll question")
98
+ parser.add_argument("--poll-options", type=str, nargs="+", help="Poll options")
99
+ parser.add_argument("--silent", action="store_true", help="Send without notification")
100
+ args = parser.parse_args()
101
+
102
+ token = args.token or os.environ.get("TELEGRAM_BOT_TOKEN")
103
+ if not token:
104
+ print("ERROR: Provide --token or set TELEGRAM_BOT_TOKEN environment variable")
105
+ sys.exit(1)
106
+
107
+ masked = _mask_token(token)
108
+ result = None
109
+
110
+ if args.text:
111
+ print(f"Sending text to {args.chat_id}...")
112
+ result = send_text(token, args.chat_id, args.text, args.parse_mode, args.silent)
113
+ elif args.photo:
114
+ print(f"Sending photo to {args.chat_id}...")
115
+ result = send_photo(token, args.chat_id, args.photo, args.caption)
116
+ elif args.document:
117
+ print(f"Sending document to {args.chat_id}...")
118
+ result = send_document_url(token, args.chat_id, args.document, args.caption)
119
+ elif args.location:
120
+ lat, lon = map(float, args.location.split(","))
121
+ print(f"Sending location to {args.chat_id}...")
122
+ result = send_location(token, args.chat_id, lat, lon)
123
+ elif args.poll and args.poll_options:
124
+ print(f"Sending poll to {args.chat_id}...")
125
+ result = send_poll(token, args.chat_id, args.poll, args.poll_options)
126
+ else:
127
+ print("ERROR: Provide --text, --photo, --document, --location, or --poll")
128
+ sys.exit(1)
129
+
130
+ if result and result.get("ok"):
131
+ msg = result["result"]
132
+ print(f"OK - Message sent! ID: {msg.get('message_id')}")
133
+ print(f" Chat: {msg.get('chat', {}).get('title', msg.get('chat', {}).get('first_name', 'N/A'))}")
134
+ print(f" Date: {msg.get('date')}")
135
+ else:
136
+ # Mask token in error output to prevent credential leakage
137
+ safe_output = json.dumps(result, indent=2, ensure_ascii=False).replace(token, masked)
138
+ print(f"FAIL - {safe_output}")
139
+ sys.exit(1)
140
+
141
+
142
+ if __name__ == "__main__":
143
+ main()
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Setup a new Telegram Bot project with boilerplate code.
4
+
5
+ Usage:
6
+ python setup_project.py --language nodejs --path ./my-telegram-bot
7
+ python setup_project.py --language python --path ./my-telegram-bot
8
+ python setup_project.py --language python --path ./my-bot --with-webhook --with-ai
9
+ """
10
+
11
+ import argparse
12
+ import os
13
+ import shutil
14
+ import sys
15
+
16
+ SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
17
+ SKILL_DIR = os.path.dirname(SCRIPT_DIR)
18
+ BOILERPLATE_DIR = os.path.join(SKILL_DIR, "assets", "boilerplate")
19
+
20
+
21
+ def setup_nodejs(project_path: str, with_webhook: bool = False, with_ai: bool = False):
22
+ """Setup Node.js/TypeScript project."""
23
+ src_dir = os.path.join(BOILERPLATE_DIR, "nodejs")
24
+
25
+ if not os.path.exists(src_dir):
26
+ print(f"ERROR: Boilerplate not found at {src_dir}")
27
+ sys.exit(1)
28
+
29
+ # Copy boilerplate
30
+ shutil.copytree(src_dir, project_path, dirs_exist_ok=True)
31
+
32
+ print(f"Node.js project created at: {project_path}")
33
+ print("\nNext steps:")
34
+ print(f" 1. cd {project_path}")
35
+ print(" 2. npm install")
36
+ print(" 3. Copy .env.example to .env and add your bot token")
37
+ print(" 4. npm run dev (development with hot reload)")
38
+ print(" 5. npm run build && npm start (production)")
39
+
40
+ if with_webhook:
41
+ print("\n Webhook mode enabled - configure WEBHOOK_URL in .env")
42
+ if with_ai:
43
+ print("\n AI integration enabled - configure ANTHROPIC_API_KEY in .env")
44
+
45
+
46
+ def setup_python(project_path: str, with_webhook: bool = False, with_ai: bool = False):
47
+ """Setup Python project."""
48
+ src_dir = os.path.join(BOILERPLATE_DIR, "python")
49
+
50
+ if not os.path.exists(src_dir):
51
+ print(f"ERROR: Boilerplate not found at {src_dir}")
52
+ sys.exit(1)
53
+
54
+ # Copy boilerplate
55
+ shutil.copytree(src_dir, project_path, dirs_exist_ok=True)
56
+
57
+ print(f"Python project created at: {project_path}")
58
+ print("\nNext steps:")
59
+ print(f" 1. cd {project_path}")
60
+ print(" 2. pip install -r requirements.txt")
61
+ print(" 3. Copy .env.example to .env and add your bot token")
62
+ print(" 4. python bot.py (long polling mode)")
63
+
64
+ if with_webhook:
65
+ print(" 5. python webhook_server.py (webhook mode)")
66
+ if with_ai:
67
+ print("\n AI integration enabled - configure ANTHROPIC_API_KEY in .env")
68
+
69
+
70
+ def main():
71
+ parser = argparse.ArgumentParser(description="Setup Telegram Bot project")
72
+ parser.add_argument("--language", type=str, required=True,
73
+ choices=["nodejs", "python"],
74
+ help="Project language")
75
+ parser.add_argument("--path", type=str, required=True,
76
+ help="Project directory path")
77
+ parser.add_argument("--with-webhook", action="store_true",
78
+ help="Include webhook server setup")
79
+ parser.add_argument("--with-ai", action="store_true",
80
+ help="Include AI integration boilerplate")
81
+ parser.add_argument("--force", action="store_true",
82
+ help="Overwrite existing directory")
83
+ args = parser.parse_args()
84
+
85
+ project_path = os.path.abspath(args.path)
86
+
87
+ if os.path.exists(project_path) and not args.force:
88
+ print(f"ERROR: Directory already exists: {project_path}")
89
+ print("Use --force to overwrite")
90
+ sys.exit(1)
91
+
92
+ os.makedirs(project_path, exist_ok=True)
93
+
94
+ if args.language == "nodejs":
95
+ setup_nodejs(project_path, args.with_webhook, args.with_ai)
96
+ elif args.language == "python":
97
+ setup_python(project_path, args.with_webhook, args.with_ai)
98
+
99
+ print("\nDone!")
100
+
101
+
102
+ if __name__ == "__main__":
103
+ main()