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,363 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Apify Actor Runner - Runs Apify actors and exports results.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* # Quick answer (display in chat, no file saved)
|
|
7
|
+
* node --env-file=.env scripts/run_actor.js --actor ACTOR_ID --input '{}'
|
|
8
|
+
*
|
|
9
|
+
* # Export to file
|
|
10
|
+
* node --env-file=.env scripts/run_actor.js --actor ACTOR_ID --input '{}' --output leads.csv --format csv
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { parseArgs } from 'node:util';
|
|
14
|
+
import { writeFileSync, statSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
// User-Agent for tracking skill usage in Apify analytics
|
|
17
|
+
const USER_AGENT = 'apify-agent-skills/apify-ultimate-scraper-1.3.0';
|
|
18
|
+
|
|
19
|
+
// Parse command-line arguments
|
|
20
|
+
function parseCliArgs() {
|
|
21
|
+
const options = {
|
|
22
|
+
actor: { type: 'string', short: 'a' },
|
|
23
|
+
input: { type: 'string', short: 'i' },
|
|
24
|
+
output: { type: 'string', short: 'o' },
|
|
25
|
+
format: { type: 'string', short: 'f', default: 'csv' },
|
|
26
|
+
timeout: { type: 'string', short: 't', default: '600' },
|
|
27
|
+
'poll-interval': { type: 'string', default: '5' },
|
|
28
|
+
help: { type: 'boolean', short: 'h' },
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const { values } = parseArgs({ options, allowPositionals: false });
|
|
32
|
+
|
|
33
|
+
if (values.help) {
|
|
34
|
+
printHelp();
|
|
35
|
+
process.exit(0);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (!values.actor) {
|
|
39
|
+
console.error('Error: --actor is required');
|
|
40
|
+
printHelp();
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (!values.input) {
|
|
45
|
+
console.error('Error: --input is required');
|
|
46
|
+
printHelp();
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
actor: values.actor,
|
|
52
|
+
input: values.input,
|
|
53
|
+
output: values.output,
|
|
54
|
+
format: values.format || 'csv',
|
|
55
|
+
timeout: parseInt(values.timeout, 10),
|
|
56
|
+
pollInterval: parseInt(values['poll-interval'], 10),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function printHelp() {
|
|
61
|
+
console.log(`
|
|
62
|
+
Apify Actor Runner - Run Apify actors and export results
|
|
63
|
+
|
|
64
|
+
Usage:
|
|
65
|
+
node --env-file=.env scripts/run_actor.js --actor ACTOR_ID --input '{}'
|
|
66
|
+
|
|
67
|
+
Options:
|
|
68
|
+
--actor, -a Actor ID (e.g., compass/crawler-google-places) [required]
|
|
69
|
+
--input, -i Actor input as JSON string [required]
|
|
70
|
+
--output, -o Output file path (optional - if not provided, displays quick answer)
|
|
71
|
+
--format, -f Output format: csv, json (default: csv)
|
|
72
|
+
--timeout, -t Max wait time in seconds (default: 600)
|
|
73
|
+
--poll-interval Seconds between status checks (default: 5)
|
|
74
|
+
--help, -h Show this help message
|
|
75
|
+
|
|
76
|
+
Output Formats:
|
|
77
|
+
JSON (all data) --output file.json --format json
|
|
78
|
+
CSV (all data) --output file.csv --format csv
|
|
79
|
+
Quick answer (no --output) - displays top 5 in chat
|
|
80
|
+
|
|
81
|
+
Examples:
|
|
82
|
+
# Quick answer - display top 5 in chat
|
|
83
|
+
node --env-file=.env scripts/run_actor.js \\
|
|
84
|
+
--actor "compass/crawler-google-places" \\
|
|
85
|
+
--input '{"searchStringsArray": ["coffee shops"], "locationQuery": "Seattle, USA"}'
|
|
86
|
+
|
|
87
|
+
# Export all data to CSV
|
|
88
|
+
node --env-file=.env scripts/run_actor.js \\
|
|
89
|
+
--actor "compass/crawler-google-places" \\
|
|
90
|
+
--input '{"searchStringsArray": ["coffee shops"], "locationQuery": "Seattle, USA"}' \\
|
|
91
|
+
--output leads.csv --format csv
|
|
92
|
+
`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Start an actor run and return { runId, datasetId }
|
|
96
|
+
async function startActor(token, actorId, inputJson) {
|
|
97
|
+
// Convert "author/actor" format to "author~actor" for API compatibility
|
|
98
|
+
const apiActorId = actorId.replace('/', '~');
|
|
99
|
+
const url = `https://api.apify.com/v2/acts/${apiActorId}/runs?token=${encodeURIComponent(token)}`;
|
|
100
|
+
|
|
101
|
+
let data;
|
|
102
|
+
try {
|
|
103
|
+
data = JSON.parse(inputJson);
|
|
104
|
+
} catch (e) {
|
|
105
|
+
console.error(`Error: Invalid JSON input: ${e.message}`);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const response = await fetch(url, {
|
|
110
|
+
method: 'POST',
|
|
111
|
+
headers: {
|
|
112
|
+
'Content-Type': 'application/json',
|
|
113
|
+
'User-Agent': `${USER_AGENT}/start_actor`,
|
|
114
|
+
},
|
|
115
|
+
body: JSON.stringify(data),
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
if (response.status === 404) {
|
|
119
|
+
console.error(`Error: Actor '${actorId}' not found`);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (!response.ok) {
|
|
124
|
+
const text = await response.text();
|
|
125
|
+
console.error(`Error: API request failed (${response.status}): ${text}`);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const result = await response.json();
|
|
130
|
+
return {
|
|
131
|
+
runId: result.data.id,
|
|
132
|
+
datasetId: result.data.defaultDatasetId,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Poll run status until complete or timeout
|
|
137
|
+
async function pollUntilComplete(token, runId, timeout, interval) {
|
|
138
|
+
const url = `https://api.apify.com/v2/actor-runs/${runId}?token=${encodeURIComponent(token)}`;
|
|
139
|
+
const startTime = Date.now();
|
|
140
|
+
let lastStatus = null;
|
|
141
|
+
|
|
142
|
+
while (true) {
|
|
143
|
+
const response = await fetch(url);
|
|
144
|
+
if (!response.ok) {
|
|
145
|
+
const text = await response.text();
|
|
146
|
+
console.error(`Error: Failed to get run status: ${text}`);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const result = await response.json();
|
|
151
|
+
const status = result.data.status;
|
|
152
|
+
|
|
153
|
+
// Only print when status changes
|
|
154
|
+
if (status !== lastStatus) {
|
|
155
|
+
console.log(`Status: ${status}`);
|
|
156
|
+
lastStatus = status;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (['SUCCEEDED', 'FAILED', 'ABORTED', 'TIMED-OUT'].includes(status)) {
|
|
160
|
+
return status;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const elapsed = (Date.now() - startTime) / 1000;
|
|
164
|
+
if (elapsed > timeout) {
|
|
165
|
+
console.error(`Warning: Timeout after ${timeout}s, actor still running`);
|
|
166
|
+
return 'TIMED-OUT';
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
await sleep(interval * 1000);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Download dataset items
|
|
174
|
+
async function downloadResults(token, datasetId, outputPath, format) {
|
|
175
|
+
const url = `https://api.apify.com/v2/datasets/${datasetId}/items?token=${encodeURIComponent(token)}&format=json`;
|
|
176
|
+
|
|
177
|
+
const response = await fetch(url, {
|
|
178
|
+
headers: {
|
|
179
|
+
'User-Agent': `${USER_AGENT}/download_${format}`,
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
if (!response.ok) {
|
|
184
|
+
const text = await response.text();
|
|
185
|
+
console.error(`Error: Failed to download results: ${text}`);
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const data = await response.json();
|
|
190
|
+
|
|
191
|
+
if (format === 'json') {
|
|
192
|
+
writeFileSync(outputPath, JSON.stringify(data, null, 2));
|
|
193
|
+
} else {
|
|
194
|
+
// CSV output
|
|
195
|
+
if (data.length > 0) {
|
|
196
|
+
const fieldnames = Object.keys(data[0]);
|
|
197
|
+
const csvLines = [fieldnames.join(',')];
|
|
198
|
+
|
|
199
|
+
for (const row of data) {
|
|
200
|
+
const values = fieldnames.map((key) => {
|
|
201
|
+
let value = row[key];
|
|
202
|
+
|
|
203
|
+
// Truncate long text fields
|
|
204
|
+
if (typeof value === 'string' && value.length > 200) {
|
|
205
|
+
value = value.slice(0, 200) + '...';
|
|
206
|
+
} else if (Array.isArray(value) || (typeof value === 'object' && value !== null)) {
|
|
207
|
+
value = JSON.stringify(value) || '';
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// CSV escape: wrap in quotes if contains comma, quote, or newline
|
|
211
|
+
if (value === null || value === undefined) {
|
|
212
|
+
return '';
|
|
213
|
+
}
|
|
214
|
+
const strValue = String(value);
|
|
215
|
+
if (strValue.includes(',') || strValue.includes('"') || strValue.includes('\n')) {
|
|
216
|
+
return `"${strValue.replace(/"/g, '""')}"`;
|
|
217
|
+
}
|
|
218
|
+
return strValue;
|
|
219
|
+
});
|
|
220
|
+
csvLines.push(values.join(','));
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
writeFileSync(outputPath, csvLines.join('\n'));
|
|
224
|
+
} else {
|
|
225
|
+
writeFileSync(outputPath, '');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
console.log(`Saved to: ${outputPath}`);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Display top 5 results in chat format
|
|
233
|
+
async function displayQuickAnswer(token, datasetId) {
|
|
234
|
+
const url = `https://api.apify.com/v2/datasets/${datasetId}/items?token=${encodeURIComponent(token)}&format=json`;
|
|
235
|
+
|
|
236
|
+
const response = await fetch(url, {
|
|
237
|
+
headers: {
|
|
238
|
+
'User-Agent': `${USER_AGENT}/quick_answer`,
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
if (!response.ok) {
|
|
243
|
+
const text = await response.text();
|
|
244
|
+
console.error(`Error: Failed to download results: ${text}`);
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const data = await response.json();
|
|
249
|
+
const total = data.length;
|
|
250
|
+
|
|
251
|
+
if (total === 0) {
|
|
252
|
+
console.log('\nNo results found.');
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Display top 5
|
|
257
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
258
|
+
console.log(`TOP 5 RESULTS (of ${total} total)`);
|
|
259
|
+
console.log('='.repeat(60));
|
|
260
|
+
|
|
261
|
+
for (let i = 0; i < Math.min(5, data.length); i++) {
|
|
262
|
+
const item = data[i];
|
|
263
|
+
console.log(`\n--- Result ${i + 1} ---`);
|
|
264
|
+
|
|
265
|
+
for (const [key, value] of Object.entries(item)) {
|
|
266
|
+
let displayValue = value;
|
|
267
|
+
|
|
268
|
+
// Truncate long values
|
|
269
|
+
if (typeof value === 'string' && value.length > 100) {
|
|
270
|
+
displayValue = value.slice(0, 100) + '...';
|
|
271
|
+
} else if (Array.isArray(value) || (typeof value === 'object' && value !== null)) {
|
|
272
|
+
const jsonStr = JSON.stringify(value);
|
|
273
|
+
displayValue = jsonStr.length > 100 ? jsonStr.slice(0, 100) + '...' : jsonStr;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
console.log(` ${key}: ${displayValue}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
281
|
+
if (total > 5) {
|
|
282
|
+
console.log(`Showing 5 of ${total} results.`);
|
|
283
|
+
}
|
|
284
|
+
console.log(`Full data available at: https://console.apify.com/storage/datasets/${datasetId}`);
|
|
285
|
+
console.log('='.repeat(60));
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Report summary of downloaded data
|
|
289
|
+
function reportSummary(outputPath, format) {
|
|
290
|
+
const stats = statSync(outputPath);
|
|
291
|
+
const size = stats.size;
|
|
292
|
+
|
|
293
|
+
let count;
|
|
294
|
+
try {
|
|
295
|
+
const content = require('fs').readFileSync(outputPath, 'utf-8');
|
|
296
|
+
if (format === 'json') {
|
|
297
|
+
const data = JSON.parse(content);
|
|
298
|
+
count = Array.isArray(data) ? data.length : 1;
|
|
299
|
+
} else {
|
|
300
|
+
// CSV - count lines minus header
|
|
301
|
+
const lines = content.split('\n').filter((line) => line.trim());
|
|
302
|
+
count = Math.max(0, lines.length - 1);
|
|
303
|
+
}
|
|
304
|
+
} catch {
|
|
305
|
+
count = 'unknown';
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
console.log(`Records: ${count}`);
|
|
309
|
+
console.log(`Size: ${size.toLocaleString()} bytes`);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Helper: sleep for ms
|
|
313
|
+
function sleep(ms) {
|
|
314
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Main function
|
|
318
|
+
async function main() {
|
|
319
|
+
// Parse args first so --help works without token
|
|
320
|
+
const args = parseCliArgs();
|
|
321
|
+
|
|
322
|
+
// Check for APIFY_TOKEN
|
|
323
|
+
const token = process.env.APIFY_TOKEN;
|
|
324
|
+
if (!token) {
|
|
325
|
+
console.error('Error: APIFY_TOKEN not found in .env file');
|
|
326
|
+
console.error('');
|
|
327
|
+
console.error('Add your token to .env file:');
|
|
328
|
+
console.error(' APIFY_TOKEN=your_token_here');
|
|
329
|
+
console.error('');
|
|
330
|
+
console.error('Get your token: https://console.apify.com/account/integrations');
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Start the actor run
|
|
335
|
+
console.log(`Starting actor: ${args.actor}`);
|
|
336
|
+
const { runId, datasetId } = await startActor(token, args.actor, args.input);
|
|
337
|
+
console.log(`Run ID: ${runId}`);
|
|
338
|
+
console.log(`Dataset ID: ${datasetId}`);
|
|
339
|
+
|
|
340
|
+
// Poll for completion
|
|
341
|
+
const status = await pollUntilComplete(token, runId, args.timeout, args.pollInterval);
|
|
342
|
+
|
|
343
|
+
if (status !== 'SUCCEEDED') {
|
|
344
|
+
console.error(`Error: Actor run ${status}`);
|
|
345
|
+
console.error(`Details: https://console.apify.com/actors/runs/${runId}`);
|
|
346
|
+
process.exit(1);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Determine output mode
|
|
350
|
+
if (args.output) {
|
|
351
|
+
// File output mode
|
|
352
|
+
await downloadResults(token, datasetId, args.output, args.format);
|
|
353
|
+
reportSummary(args.output, args.format);
|
|
354
|
+
} else {
|
|
355
|
+
// Quick answer mode - display in chat
|
|
356
|
+
await displayQuickAnswer(token, datasetId);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
main().catch((err) => {
|
|
361
|
+
console.error(`Error: ${err.message}`);
|
|
362
|
+
process.exit(1);
|
|
363
|
+
});
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Audio Transcriber - Requirements Installation Script
|
|
4
|
+
# Automatically installs and validates dependencies
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
# Colors
|
|
9
|
+
GREEN='\033[0;32m'
|
|
10
|
+
YELLOW='\033[1;33m'
|
|
11
|
+
RED='\033[0;31m'
|
|
12
|
+
BLUE='\033[0;34m'
|
|
13
|
+
NC='\033[0m'
|
|
14
|
+
|
|
15
|
+
echo -e "${BLUE}🔧 Audio Transcriber - Dependency Installation${NC}"
|
|
16
|
+
echo ""
|
|
17
|
+
|
|
18
|
+
# Check Python
|
|
19
|
+
if ! command -v python3 &>/dev/null; then
|
|
20
|
+
echo -e "${RED}❌ Python 3 not found. Please install Python 3.8+${NC}"
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
PYTHON_VERSION=$(python3 --version | cut -d' ' -f2 | cut -d'.' -f1,2)
|
|
25
|
+
echo -e "${GREEN}✅ Python ${PYTHON_VERSION} detected${NC}"
|
|
26
|
+
|
|
27
|
+
# Check pip
|
|
28
|
+
if ! python3 -m pip --version &>/dev/null; then
|
|
29
|
+
echo -e "${RED}❌ pip not found. Please install pip${NC}"
|
|
30
|
+
exit 1
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
echo -e "${GREEN}✅ pip available${NC}"
|
|
34
|
+
echo ""
|
|
35
|
+
|
|
36
|
+
# Install system dependencies (macOS only)
|
|
37
|
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
38
|
+
echo -e "${BLUE}📦 Checking system dependencies (macOS)...${NC}"
|
|
39
|
+
|
|
40
|
+
# Check for Homebrew
|
|
41
|
+
if command -v brew &>/dev/null; then
|
|
42
|
+
# Install pkg-config and ffmpeg if not present
|
|
43
|
+
NEED_INSTALL=""
|
|
44
|
+
|
|
45
|
+
if ! brew list pkg-config &>/dev/null 2>&1; then
|
|
46
|
+
NEED_INSTALL="$NEED_INSTALL pkg-config"
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
if ! brew list ffmpeg &>/dev/null 2>&1; then
|
|
50
|
+
NEED_INSTALL="$NEED_INSTALL ffmpeg"
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
if [[ -n "$NEED_INSTALL" ]]; then
|
|
54
|
+
echo -e "${BLUE}Installing:$NEED_INSTALL${NC}"
|
|
55
|
+
brew install $NEED_INSTALL --quiet
|
|
56
|
+
echo -e "${GREEN}✅ System dependencies installed${NC}"
|
|
57
|
+
else
|
|
58
|
+
echo -e "${GREEN}✅ System dependencies already installed${NC}"
|
|
59
|
+
fi
|
|
60
|
+
else
|
|
61
|
+
echo -e "${YELLOW}⚠️ Homebrew not found. Install manually if needed:${NC}"
|
|
62
|
+
echo " /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\""
|
|
63
|
+
fi
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
echo ""
|
|
67
|
+
|
|
68
|
+
# Install faster-whisper (recommended)
|
|
69
|
+
echo -e "${BLUE}📦 Installing Faster-Whisper...${NC}"
|
|
70
|
+
|
|
71
|
+
# Try different installation methods based on Python environment
|
|
72
|
+
if python3 -m pip install faster-whisper --quiet 2>/dev/null; then
|
|
73
|
+
echo -e "${GREEN}✅ Faster-Whisper installed successfully${NC}"
|
|
74
|
+
elif python3 -m pip install --user --break-system-packages faster-whisper --quiet 2>/dev/null; then
|
|
75
|
+
echo -e "${GREEN}✅ Faster-Whisper installed successfully (user mode)${NC}"
|
|
76
|
+
else
|
|
77
|
+
echo -e "${YELLOW}⚠️ Faster-Whisper installation failed, trying Whisper...${NC}"
|
|
78
|
+
|
|
79
|
+
if python3 -m pip install openai-whisper --quiet 2>/dev/null; then
|
|
80
|
+
echo -e "${GREEN}✅ Whisper installed successfully${NC}"
|
|
81
|
+
elif python3 -m pip install --user --break-system-packages openai-whisper --quiet 2>/dev/null; then
|
|
82
|
+
echo -e "${GREEN}✅ Whisper installed successfully (user mode)${NC}"
|
|
83
|
+
else
|
|
84
|
+
echo -e "${RED}❌ Failed to install transcription engine${NC}"
|
|
85
|
+
echo ""
|
|
86
|
+
echo -e "${YELLOW}Manual installation options:${NC}"
|
|
87
|
+
echo " 1. Use --break-system-packages (macOS/Homebrew Python):"
|
|
88
|
+
echo " python3 -m pip install --user --break-system-packages openai-whisper"
|
|
89
|
+
echo ""
|
|
90
|
+
echo " 2. Use virtual environment (recommended):"
|
|
91
|
+
echo " python3 -m venv ~/whisper-env"
|
|
92
|
+
echo " source ~/whisper-env/bin/activate"
|
|
93
|
+
echo " pip install faster-whisper"
|
|
94
|
+
echo ""
|
|
95
|
+
echo " 3. Use pipx (isolated):"
|
|
96
|
+
echo " brew install pipx"
|
|
97
|
+
echo " pipx install openai-whisper"
|
|
98
|
+
exit 1
|
|
99
|
+
fi
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
# Install UI/progress libraries (tqdm, rich)
|
|
103
|
+
echo ""
|
|
104
|
+
echo -e "${BLUE}📦 Installing UI libraries (tqdm, rich)...${NC}"
|
|
105
|
+
|
|
106
|
+
if python3 -m pip install tqdm rich --quiet 2>/dev/null; then
|
|
107
|
+
echo -e "${GREEN}✅ tqdm and rich installed successfully${NC}"
|
|
108
|
+
elif python3 -m pip install --user --break-system-packages tqdm rich --quiet 2>/dev/null; then
|
|
109
|
+
echo -e "${GREEN}✅ tqdm and rich installed successfully (user mode)${NC}"
|
|
110
|
+
else
|
|
111
|
+
echo -e "${YELLOW}⚠️ Optional UI libraries not installed (skill will still work)${NC}"
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
# Check ffmpeg (optional but recommended)
|
|
115
|
+
echo ""
|
|
116
|
+
if command -v ffmpeg &>/dev/null; then
|
|
117
|
+
echo -e "${GREEN}✅ ffmpeg already installed${NC}"
|
|
118
|
+
else
|
|
119
|
+
echo -e "${YELLOW}⚠️ ffmpeg not found (should have been installed earlier)${NC}"
|
|
120
|
+
if [[ "$OSTYPE" == "darwin"* ]] && command -v brew &>/dev/null; then
|
|
121
|
+
echo -e "${BLUE}Installing ffmpeg via Homebrew...${NC}"
|
|
122
|
+
brew install ffmpeg --quiet && echo -e "${GREEN}✅ ffmpeg installed${NC}"
|
|
123
|
+
else
|
|
124
|
+
echo -e "${BLUE}ℹ️ ffmpeg is optional but recommended for format conversion${NC}"
|
|
125
|
+
echo ""
|
|
126
|
+
echo "Install ffmpeg:"
|
|
127
|
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
128
|
+
echo " brew install ffmpeg"
|
|
129
|
+
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
|
130
|
+
echo " sudo apt install ffmpeg # Debian/Ubuntu"
|
|
131
|
+
echo " sudo yum install ffmpeg # CentOS/RHEL"
|
|
132
|
+
fi
|
|
133
|
+
fi
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
# Verify installation
|
|
137
|
+
echo ""
|
|
138
|
+
echo -e "${BLUE}🔍 Verifying installation...${NC}"
|
|
139
|
+
|
|
140
|
+
if python3 -c "import faster_whisper" 2>/dev/null; then
|
|
141
|
+
echo -e "${GREEN}✅ Faster-Whisper verified${NC}"
|
|
142
|
+
TRANSCRIBER="Faster-Whisper"
|
|
143
|
+
elif python3 -c "import whisper" 2>/dev/null; then
|
|
144
|
+
echo -e "${GREEN}✅ Whisper verified${NC}"
|
|
145
|
+
TRANSCRIBER="Whisper"
|
|
146
|
+
else
|
|
147
|
+
echo -e "${RED}❌ No transcription engine found after installation${NC}"
|
|
148
|
+
exit 1
|
|
149
|
+
fi
|
|
150
|
+
|
|
151
|
+
# Download initial model (optional)
|
|
152
|
+
read -p "Download Whisper 'base' model now? (recommended, ~74MB) [Y/n]: " DOWNLOAD_MODEL
|
|
153
|
+
|
|
154
|
+
if [[ ! "$DOWNLOAD_MODEL" =~ ^[Nn] ]]; then
|
|
155
|
+
echo ""
|
|
156
|
+
echo -e "${BLUE}📥 Downloading 'base' model...${NC}"
|
|
157
|
+
|
|
158
|
+
python3 << 'EOF'
|
|
159
|
+
try:
|
|
160
|
+
import faster_whisper
|
|
161
|
+
model = faster_whisper.WhisperModel("base", device="cpu", compute_type="int8")
|
|
162
|
+
print("✅ Model downloaded successfully")
|
|
163
|
+
except:
|
|
164
|
+
try:
|
|
165
|
+
import whisper
|
|
166
|
+
model = whisper.load_model("base")
|
|
167
|
+
print("✅ Model downloaded successfully")
|
|
168
|
+
except Exception as e:
|
|
169
|
+
print(f"❌ Model download failed: {e}")
|
|
170
|
+
EOF
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
# Success summary
|
|
174
|
+
echo ""
|
|
175
|
+
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
176
|
+
echo -e "${GREEN}✅ Installation Complete!${NC}"
|
|
177
|
+
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
178
|
+
echo ""
|
|
179
|
+
echo "📊 Installed components:"
|
|
180
|
+
echo " • Transcription engine: $TRANSCRIBER"
|
|
181
|
+
if command -v ffmpeg &>/dev/null; then
|
|
182
|
+
echo " • Format conversion: ffmpeg (available)"
|
|
183
|
+
else
|
|
184
|
+
echo " • Format conversion: ffmpeg (not installed)"
|
|
185
|
+
fi
|
|
186
|
+
echo ""
|
|
187
|
+
echo "🚀 Ready to use! Try:"
|
|
188
|
+
echo " copilot> transcribe audio to markdown: myfile.mp3"
|
|
189
|
+
echo " claude> transcreva este áudio: myfile.mp3"
|
|
190
|
+
echo ""
|