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.
- package/package.json +1 -1
- package/templates/.agents/agents/backend-specialist.md +263 -0
- package/templates/.agents/agents/code-archaeologist.md +106 -0
- package/templates/.agents/agents/database-architect.md +226 -0
- package/templates/.agents/agents/debugger.md +225 -0
- package/templates/.agents/agents/devops-engineer.md +242 -0
- package/templates/.agents/agents/documentation-writer.md +104 -0
- package/templates/.agents/agents/explorer-agent.md +73 -0
- package/templates/.agents/agents/frontend-specialist.md +593 -0
- package/templates/.agents/agents/game-developer.md +162 -0
- package/templates/.agents/agents/mobile-developer.md +377 -0
- package/templates/.agents/agents/orchestrator.md +416 -0
- package/templates/.agents/agents/penetration-tester.md +188 -0
- package/templates/.agents/agents/performance-optimizer.md +187 -0
- package/templates/.agents/agents/product-manager.md +112 -0
- package/templates/.agents/agents/product-owner.md +95 -0
- package/templates/.agents/agents/project-planner.md +406 -0
- package/templates/.agents/agents/qa-automation-engineer.md +103 -0
- package/templates/.agents/agents/security-auditor.md +170 -0
- package/templates/.agents/agents/seo-specialist.md +111 -0
- package/templates/.agents/agents/test-engineer.md +158 -0
- package/templates/.agents/rules/GEMINI.md +219 -0
- package/templates/.agents/scripts/auto_preview.py +148 -0
- package/templates/.agents/scripts/checklist.py +217 -0
- package/templates/.agents/scripts/session_manager.py +120 -0
- package/templates/.agents/scripts/verify_all.py +327 -0
- package/templates/.agents/workflows/brainstorm.md +113 -0
- package/templates/.agents/workflows/create.md +59 -0
- package/templates/.agents/workflows/debug.md +103 -0
- package/templates/.agents/workflows/deploy.md +176 -0
- package/templates/.agents/workflows/enhance.md +63 -0
- package/templates/.agents/workflows/orchestrate.md +237 -0
- package/templates/.agents/workflows/plan.md +89 -0
- package/templates/.agents/workflows/preview.md +81 -0
- package/templates/.agents/workflows/setup-brain.md +39 -0
- package/templates/.agents/workflows/status.md +86 -0
- package/templates/.agents/workflows/test.md +144 -0
- package/templates/.agents/workflows/ui-ux-pro-max.md +296 -0
- package/templates/skills_normal/api-patterns/scripts/api_validator.py +211 -0
- package/templates/skills_normal/database-design/scripts/schema_validator.py +172 -0
- package/templates/skills_normal/frontend-design/scripts/accessibility_checker.py +183 -0
- package/templates/skills_normal/frontend-design/scripts/ux_audit.py +722 -0
- package/templates/skills_normal/git-pushing/scripts/smart_commit.sh +19 -0
- package/templates/skills_normal/lint-and-validate/scripts/lint_runner.py +184 -0
- package/templates/skills_normal/lint-and-validate/scripts/type_coverage.py +173 -0
- package/templates/skills_normal/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/templates/skills_normal/senior-fullstack/scripts/code_quality_analyzer.py +114 -0
- package/templates/skills_normal/senior-fullstack/scripts/fullstack_scaffolder.py +114 -0
- package/templates/skills_normal/senior-fullstack/scripts/project_scaffolder.py +114 -0
- package/templates/skills_normal/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/templates/skills_normal/testing-patterns/scripts/test_runner.py +219 -0
- package/templates/skills_normal/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/templates/vault/007/scripts/config.py +472 -0
- package/templates/vault/007/scripts/full_audit.py +1306 -0
- package/templates/vault/007/scripts/quick_scan.py +481 -0
- package/templates/vault/007/scripts/requirements.txt +26 -0
- package/templates/vault/007/scripts/scanners/__init__.py +0 -0
- package/templates/vault/007/scripts/scanners/dependency_scanner.py +1305 -0
- package/templates/vault/007/scripts/scanners/injection_scanner.py +1104 -0
- package/templates/vault/007/scripts/scanners/secrets_scanner.py +1008 -0
- package/templates/vault/007/scripts/score_calculator.py +693 -0
- package/templates/vault/agent-orchestrator/scripts/match_skills.py +329 -0
- package/templates/vault/agent-orchestrator/scripts/orchestrate.py +304 -0
- package/templates/vault/agent-orchestrator/scripts/requirements.txt +1 -0
- package/templates/vault/agent-orchestrator/scripts/scan_registry.py +508 -0
- package/templates/vault/ai-studio-image/scripts/config.py +613 -0
- package/templates/vault/ai-studio-image/scripts/generate.py +630 -0
- package/templates/vault/ai-studio-image/scripts/prompt_engine.py +424 -0
- package/templates/vault/ai-studio-image/scripts/requirements.txt +4 -0
- package/templates/vault/ai-studio-image/scripts/templates.py +349 -0
- package/templates/vault/android_ui_verification/scripts/verify_ui.sh +32 -0
- package/templates/vault/apify-audience-analysis/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-brand-reputation-monitoring/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-competitor-intelligence/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-content-analytics/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-ecommerce/reference/scripts/package.json +3 -0
- package/templates/vault/apify-ecommerce/reference/scripts/run_actor.js +369 -0
- package/templates/vault/apify-influencer-discovery/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-lead-generation/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-market-research/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-trend-analysis/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-ultimate-scraper/reference/scripts/run_actor.js +363 -0
- package/templates/vault/audio-transcriber/scripts/install-requirements.sh +190 -0
- package/templates/vault/audio-transcriber/scripts/transcribe.py +486 -0
- package/templates/vault/claude-monitor/scripts/api_bench.py +240 -0
- package/templates/vault/claude-monitor/scripts/config.py +69 -0
- package/templates/vault/claude-monitor/scripts/health_check.py +362 -0
- package/templates/vault/claude-monitor/scripts/monitor.py +296 -0
- package/templates/vault/content-creator/scripts/brand_voice_analyzer.py +185 -0
- package/templates/vault/content-creator/scripts/seo_optimizer.py +419 -0
- package/templates/vault/context-agent/scripts/active_context.py +227 -0
- package/templates/vault/context-agent/scripts/compressor.py +149 -0
- package/templates/vault/context-agent/scripts/config.py +69 -0
- package/templates/vault/context-agent/scripts/context_loader.py +155 -0
- package/templates/vault/context-agent/scripts/context_manager.py +302 -0
- package/templates/vault/context-agent/scripts/models.py +103 -0
- package/templates/vault/context-agent/scripts/project_registry.py +132 -0
- package/templates/vault/context-agent/scripts/requirements.txt +6 -0
- package/templates/vault/context-agent/scripts/search.py +115 -0
- package/templates/vault/context-agent/scripts/session_parser.py +206 -0
- package/templates/vault/context-agent/scripts/session_summary.py +319 -0
- package/templates/vault/context-guardian/scripts/context_snapshot.py +229 -0
- package/templates/vault/docx/ooxml/scripts/pack.py +159 -0
- package/templates/vault/docx/ooxml/scripts/unpack.py +29 -0
- package/templates/vault/docx/ooxml/scripts/validate.py +69 -0
- package/templates/vault/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/templates/vault/docx/ooxml/scripts/validation/base.py +951 -0
- package/templates/vault/docx/ooxml/scripts/validation/docx.py +274 -0
- package/templates/vault/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/templates/vault/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/templates/vault/docx/scripts/__init__.py +1 -0
- package/templates/vault/docx/scripts/document.py +1276 -0
- package/templates/vault/docx/scripts/templates/comments.xml +3 -0
- package/templates/vault/docx/scripts/templates/commentsExtended.xml +3 -0
- package/templates/vault/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/templates/vault/docx/scripts/templates/commentsIds.xml +3 -0
- package/templates/vault/docx/scripts/templates/people.xml +3 -0
- package/templates/vault/docx/scripts/utilities.py +374 -0
- package/templates/vault/docx-official/ooxml/scripts/pack.py +159 -0
- package/templates/vault/docx-official/ooxml/scripts/unpack.py +29 -0
- package/templates/vault/docx-official/ooxml/scripts/validate.py +69 -0
- package/templates/vault/docx-official/ooxml/scripts/validation/__init__.py +15 -0
- package/templates/vault/docx-official/ooxml/scripts/validation/base.py +951 -0
- package/templates/vault/docx-official/ooxml/scripts/validation/docx.py +274 -0
- package/templates/vault/docx-official/ooxml/scripts/validation/pptx.py +315 -0
- package/templates/vault/docx-official/ooxml/scripts/validation/redlining.py +279 -0
- package/templates/vault/docx-official/scripts/__init__.py +1 -0
- package/templates/vault/docx-official/scripts/document.py +1276 -0
- package/templates/vault/docx-official/scripts/templates/comments.xml +3 -0
- package/templates/vault/docx-official/scripts/templates/commentsExtended.xml +3 -0
- package/templates/vault/docx-official/scripts/templates/commentsExtensible.xml +3 -0
- package/templates/vault/docx-official/scripts/templates/commentsIds.xml +3 -0
- package/templates/vault/docx-official/scripts/templates/people.xml +3 -0
- package/templates/vault/docx-official/scripts/utilities.py +374 -0
- package/templates/vault/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/templates/vault/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
- package/templates/vault/i18n-localization/scripts/i18n_checker.py +241 -0
- package/templates/vault/instagram/scripts/account_setup.py +233 -0
- package/templates/vault/instagram/scripts/analyze.py +221 -0
- package/templates/vault/instagram/scripts/api_client.py +444 -0
- package/templates/vault/instagram/scripts/auth.py +411 -0
- package/templates/vault/instagram/scripts/comments.py +160 -0
- package/templates/vault/instagram/scripts/config.py +111 -0
- package/templates/vault/instagram/scripts/db.py +467 -0
- package/templates/vault/instagram/scripts/export.py +138 -0
- package/templates/vault/instagram/scripts/governance.py +233 -0
- package/templates/vault/instagram/scripts/hashtags.py +114 -0
- package/templates/vault/instagram/scripts/insights.py +170 -0
- package/templates/vault/instagram/scripts/media.py +65 -0
- package/templates/vault/instagram/scripts/messages.py +103 -0
- package/templates/vault/instagram/scripts/profile.py +58 -0
- package/templates/vault/instagram/scripts/publish.py +449 -0
- package/templates/vault/instagram/scripts/requirements.txt +5 -0
- package/templates/vault/instagram/scripts/run_all.py +189 -0
- package/templates/vault/instagram/scripts/schedule.py +189 -0
- package/templates/vault/instagram/scripts/serve_api.py +234 -0
- package/templates/vault/instagram/scripts/templates.py +155 -0
- package/templates/vault/junta-leiloeiros/scripts/db.py +216 -0
- package/templates/vault/junta-leiloeiros/scripts/export.py +137 -0
- package/templates/vault/junta-leiloeiros/scripts/requirements.txt +15 -0
- package/templates/vault/junta-leiloeiros/scripts/run_all.py +190 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/__init__.py +4 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/base_scraper.py +209 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/generic_scraper.py +110 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucap.py +110 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/juceac.py +72 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/juceal.py +72 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/juceb.py +68 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucec.py +63 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucema.py +211 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucemg.py +218 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucep.py +70 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucepa.py +74 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucepar.py +80 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucepe.py +78 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucepi.py +69 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucer.py +256 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucerja.py +170 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucern.py +71 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucesc.py +89 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucesp.py +233 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucetins.py +134 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucis_df.py +63 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucisrs.py +299 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/states.py +99 -0
- package/templates/vault/junta-leiloeiros/scripts/serve_api.py +164 -0
- package/templates/vault/junta-leiloeiros/scripts/web_scraper_fallback.py +233 -0
- package/templates/vault/last30days/scripts/last30days.py +521 -0
- package/templates/vault/last30days/scripts/lib/__init__.py +1 -0
- package/templates/vault/last30days/scripts/lib/cache.py +152 -0
- package/templates/vault/last30days/scripts/lib/dates.py +124 -0
- package/templates/vault/last30days/scripts/lib/dedupe.py +120 -0
- package/templates/vault/last30days/scripts/lib/env.py +149 -0
- package/templates/vault/last30days/scripts/lib/http.py +152 -0
- package/templates/vault/last30days/scripts/lib/models.py +175 -0
- package/templates/vault/last30days/scripts/lib/normalize.py +160 -0
- package/templates/vault/last30days/scripts/lib/openai_reddit.py +230 -0
- package/templates/vault/last30days/scripts/lib/reddit_enrich.py +232 -0
- package/templates/vault/last30days/scripts/lib/render.py +383 -0
- package/templates/vault/last30days/scripts/lib/schema.py +336 -0
- package/templates/vault/last30days/scripts/lib/score.py +311 -0
- package/templates/vault/last30days/scripts/lib/ui.py +324 -0
- package/templates/vault/last30days/scripts/lib/websearch.py +401 -0
- package/templates/vault/last30days/scripts/lib/xai_x.py +217 -0
- package/templates/vault/leiloeiro-avaliacao/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-avaliacao/scripts/requirements.txt +1 -0
- package/templates/vault/leiloeiro-edital/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-edital/scripts/requirements.txt +1 -0
- package/templates/vault/leiloeiro-ia/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-ia/scripts/requirements.txt +1 -0
- package/templates/vault/leiloeiro-juridico/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-juridico/scripts/requirements.txt +1 -0
- package/templates/vault/leiloeiro-mercado/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-mercado/scripts/requirements.txt +1 -0
- package/templates/vault/leiloeiro-risco/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-risco/scripts/requirements.txt +1 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/database.ts +24 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/db.ts +35 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/index.ts +2 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/migrations.ts +31 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/schema.sql +8 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/index.ts +44 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/routes/todos.ts +155 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/types/index.ts +35 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.css +384 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.tsx +81 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/api/todos.ts +57 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/ConfirmDialog.tsx +26 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/EmptyState.tsx +8 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoForm.tsx +43 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoItem.tsx +36 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoList.tsx +27 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/hooks/useTodos.ts +81 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/index.css +48 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/main.tsx +10 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/vite-env.d.ts +1 -0
- package/templates/vault/loki-mode/scripts/export-to-vibe-kanban.sh +178 -0
- package/templates/vault/loki-mode/scripts/loki-wrapper.sh +281 -0
- package/templates/vault/loki-mode/scripts/take-screenshots.js +55 -0
- package/templates/vault/matematico-tao/scripts/complexity_analyzer.py +544 -0
- package/templates/vault/matematico-tao/scripts/dependency_graph.py +538 -0
- package/templates/vault/mcp-builder/scripts/connections.py +151 -0
- package/templates/vault/mcp-builder/scripts/evaluation.py +373 -0
- package/templates/vault/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/templates/vault/mcp-builder/scripts/requirements.txt +2 -0
- package/templates/vault/mobile-design/scripts/mobile_audit.py +670 -0
- package/templates/vault/notebooklm/scripts/__init__.py +81 -0
- package/templates/vault/notebooklm/scripts/ask_question.py +256 -0
- package/templates/vault/notebooklm/scripts/auth_manager.py +358 -0
- package/templates/vault/notebooklm/scripts/browser_session.py +255 -0
- package/templates/vault/notebooklm/scripts/browser_utils.py +107 -0
- package/templates/vault/notebooklm/scripts/cleanup_manager.py +302 -0
- package/templates/vault/notebooklm/scripts/config.py +44 -0
- package/templates/vault/notebooklm/scripts/notebook_manager.py +410 -0
- package/templates/vault/notebooklm/scripts/run.py +102 -0
- package/templates/vault/notebooklm/scripts/setup_environment.py +204 -0
- package/templates/vault/pdf/scripts/check_bounding_boxes.py +70 -0
- package/templates/vault/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/templates/vault/pdf/scripts/check_fillable_fields.py +12 -0
- package/templates/vault/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/templates/vault/pdf/scripts/create_validation_image.py +41 -0
- package/templates/vault/pdf/scripts/extract_form_field_info.py +152 -0
- package/templates/vault/pdf/scripts/fill_fillable_fields.py +114 -0
- package/templates/vault/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/templates/vault/pdf-official/scripts/check_bounding_boxes.py +70 -0
- package/templates/vault/pdf-official/scripts/check_bounding_boxes_test.py +226 -0
- package/templates/vault/pdf-official/scripts/check_fillable_fields.py +12 -0
- package/templates/vault/pdf-official/scripts/convert_pdf_to_images.py +35 -0
- package/templates/vault/pdf-official/scripts/create_validation_image.py +41 -0
- package/templates/vault/pdf-official/scripts/extract_form_field_info.py +152 -0
- package/templates/vault/pdf-official/scripts/fill_fillable_fields.py +114 -0
- package/templates/vault/pdf-official/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/templates/vault/planning-with-files/scripts/check-complete.sh +44 -0
- package/templates/vault/planning-with-files/scripts/init-session.sh +120 -0
- package/templates/vault/pptx/ooxml/scripts/pack.py +159 -0
- package/templates/vault/pptx/ooxml/scripts/unpack.py +29 -0
- package/templates/vault/pptx/ooxml/scripts/validate.py +69 -0
- package/templates/vault/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/templates/vault/pptx/ooxml/scripts/validation/base.py +951 -0
- package/templates/vault/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/templates/vault/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/templates/vault/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/templates/vault/pptx/scripts/html2pptx.js +979 -0
- package/templates/vault/pptx/scripts/inventory.py +1020 -0
- package/templates/vault/pptx/scripts/rearrange.py +231 -0
- package/templates/vault/pptx/scripts/replace.py +385 -0
- package/templates/vault/pptx/scripts/thumbnail.py +450 -0
- package/templates/vault/pptx-official/ooxml/scripts/pack.py +159 -0
- package/templates/vault/pptx-official/ooxml/scripts/unpack.py +29 -0
- package/templates/vault/pptx-official/ooxml/scripts/validate.py +69 -0
- package/templates/vault/pptx-official/ooxml/scripts/validation/__init__.py +15 -0
- package/templates/vault/pptx-official/ooxml/scripts/validation/base.py +951 -0
- package/templates/vault/pptx-official/ooxml/scripts/validation/docx.py +274 -0
- package/templates/vault/pptx-official/ooxml/scripts/validation/pptx.py +315 -0
- package/templates/vault/pptx-official/ooxml/scripts/validation/redlining.py +279 -0
- package/templates/vault/pptx-official/scripts/html2pptx.js +979 -0
- package/templates/vault/pptx-official/scripts/inventory.py +1020 -0
- package/templates/vault/pptx-official/scripts/rearrange.py +231 -0
- package/templates/vault/pptx-official/scripts/replace.py +385 -0
- package/templates/vault/pptx-official/scripts/thumbnail.py +450 -0
- package/templates/vault/product-manager-toolkit/scripts/customer_interview_analyzer.py +441 -0
- package/templates/vault/product-manager-toolkit/scripts/rice_prioritizer.py +296 -0
- package/templates/vault/prompt-engineering-patterns/scripts/optimize-prompt.py +279 -0
- package/templates/vault/scripts/.skill_cache.json +7538 -0
- package/templates/vault/scripts/skill_search.py +228 -0
- package/templates/vault/senior-architect/scripts/architecture_diagram_generator.py +114 -0
- package/templates/vault/senior-architect/scripts/dependency_analyzer.py +114 -0
- package/templates/vault/senior-architect/scripts/project_architect.py +114 -0
- package/templates/vault/shopify-development/scripts/requirements.txt +19 -0
- package/templates/vault/shopify-development/scripts/shopify_graphql.py +428 -0
- package/templates/vault/shopify-development/scripts/shopify_init.py +441 -0
- package/templates/vault/shopify-development/scripts/tests/test_shopify_init.py +379 -0
- package/templates/vault/skill-creator/scripts/init_skill.py +303 -0
- package/templates/vault/skill-creator/scripts/package_skill.py +110 -0
- package/templates/vault/skill-creator/scripts/quick_validate.py +95 -0
- package/templates/vault/skill-installer/scripts/detect_skills.py +318 -0
- package/templates/vault/skill-installer/scripts/install_skill.py +1708 -0
- package/templates/vault/skill-installer/scripts/package_skill.py +417 -0
- package/templates/vault/skill-installer/scripts/requirements.txt +1 -0
- package/templates/vault/skill-installer/scripts/validate_skill.py +430 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/__init__.py +13 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/code_quality.py +247 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/cross_skill.py +134 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/dependencies.py +121 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/documentation.py +189 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/governance_audit.py +153 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/performance.py +164 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/security.py +189 -0
- package/templates/vault/skill-sentinel/scripts/config.py +158 -0
- package/templates/vault/skill-sentinel/scripts/cost_optimizer.py +146 -0
- package/templates/vault/skill-sentinel/scripts/db.py +354 -0
- package/templates/vault/skill-sentinel/scripts/governance.py +58 -0
- package/templates/vault/skill-sentinel/scripts/recommender.py +228 -0
- package/templates/vault/skill-sentinel/scripts/report_generator.py +224 -0
- package/templates/vault/skill-sentinel/scripts/requirements.txt +1 -0
- package/templates/vault/skill-sentinel/scripts/run_audit.py +290 -0
- package/templates/vault/skill-sentinel/scripts/scanner.py +271 -0
- package/templates/vault/stability-ai/scripts/config.py +266 -0
- package/templates/vault/stability-ai/scripts/generate.py +687 -0
- package/templates/vault/stability-ai/scripts/requirements.txt +4 -0
- package/templates/vault/stability-ai/scripts/styles.py +174 -0
- package/templates/vault/telegram/assets/boilerplate/nodejs/src/bot-client.ts +86 -0
- package/templates/vault/telegram/assets/boilerplate/nodejs/src/handlers.ts +79 -0
- package/templates/vault/telegram/assets/boilerplate/nodejs/src/index.ts +32 -0
- package/templates/vault/telegram/scripts/send_message.py +143 -0
- package/templates/vault/telegram/scripts/setup_project.py +103 -0
- package/templates/vault/telegram/scripts/test_bot.py +144 -0
- package/templates/vault/typescript-expert/scripts/ts_diagnostic.py +203 -0
- package/templates/vault/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
- package/templates/vault/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
- package/templates/vault/ui-ux-pro-max/scripts/core.py +257 -0
- package/templates/vault/ui-ux-pro-max/scripts/design_system.py +487 -0
- package/templates/vault/ui-ux-pro-max/scripts/search.py +76 -0
- package/templates/vault/videodb/scripts/ws_listener.py +204 -0
- package/templates/vault/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/templates/vault/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/templates/vault/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/templates/vault/webapp-testing/scripts/with_server.py +106 -0
- package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/index.ts +125 -0
- package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/template-manager.ts +67 -0
- package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/types.ts +216 -0
- package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/webhook-handler.ts +173 -0
- package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/whatsapp-client.ts +193 -0
- package/templates/vault/whatsapp-cloud-api/scripts/send_test_message.py +137 -0
- package/templates/vault/whatsapp-cloud-api/scripts/setup_project.py +118 -0
- package/templates/vault/whatsapp-cloud-api/scripts/validate_config.py +190 -0
- package/templates/vault/youtube-summarizer/scripts/extract-transcript.py +65 -0
- 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 <texto> - 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()
|