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,486 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Audio Transcriber v1.1.0
|
|
4
|
+
Transcreve áudio para texto e gera atas/resumos usando LLM.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
import json
|
|
10
|
+
import subprocess
|
|
11
|
+
import shutil
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
# Rich for beautiful terminal output
|
|
16
|
+
try:
|
|
17
|
+
from rich.console import Console
|
|
18
|
+
from rich.prompt import Prompt
|
|
19
|
+
from rich.panel import Panel
|
|
20
|
+
from rich.progress import Progress, SpinnerColumn, TextColumn, BarColumn
|
|
21
|
+
from rich import print as rprint
|
|
22
|
+
RICH_AVAILABLE = True
|
|
23
|
+
except ImportError:
|
|
24
|
+
RICH_AVAILABLE = False
|
|
25
|
+
print("⚠️ Installing rich for better UI...")
|
|
26
|
+
subprocess.run([sys.executable, "-m", "pip", "install", "--user", "rich"], check=False)
|
|
27
|
+
from rich.console import Console
|
|
28
|
+
from rich.prompt import Prompt
|
|
29
|
+
from rich.panel import Panel
|
|
30
|
+
from rich.progress import Progress, SpinnerColumn, TextColumn, BarColumn
|
|
31
|
+
from rich import print as rprint
|
|
32
|
+
|
|
33
|
+
# tqdm for progress bars
|
|
34
|
+
try:
|
|
35
|
+
from tqdm import tqdm
|
|
36
|
+
except ImportError:
|
|
37
|
+
print("⚠️ Installing tqdm for progress bars...")
|
|
38
|
+
subprocess.run([sys.executable, "-m", "pip", "install", "--user", "tqdm"], check=False)
|
|
39
|
+
from tqdm import tqdm
|
|
40
|
+
|
|
41
|
+
# Whisper engines
|
|
42
|
+
try:
|
|
43
|
+
from faster_whisper import WhisperModel
|
|
44
|
+
TRANSCRIBER = "faster-whisper"
|
|
45
|
+
except ImportError:
|
|
46
|
+
try:
|
|
47
|
+
import whisper
|
|
48
|
+
TRANSCRIBER = "whisper"
|
|
49
|
+
except ImportError:
|
|
50
|
+
print("❌ Nenhum engine de transcrição encontrado!")
|
|
51
|
+
print(" Instale: pip install faster-whisper")
|
|
52
|
+
sys.exit(1)
|
|
53
|
+
|
|
54
|
+
console = Console()
|
|
55
|
+
|
|
56
|
+
# Template padrão RISEN para fallback
|
|
57
|
+
DEFAULT_MEETING_PROMPT = """
|
|
58
|
+
Role: Você é um transcritor profissional especializado em documentação.
|
|
59
|
+
|
|
60
|
+
Instructions: Transforme a transcrição fornecida em um documento estruturado e profissional.
|
|
61
|
+
|
|
62
|
+
Steps:
|
|
63
|
+
1. Identifique o tipo de conteúdo (reunião, palestra, entrevista, etc.)
|
|
64
|
+
2. Extraia os principais tópicos e pontos-chave
|
|
65
|
+
3. Identifique participantes/speakers (se aplicável)
|
|
66
|
+
4. Extraia decisões tomadas e ações definidas (se reunião)
|
|
67
|
+
5. Organize em formato apropriado com seções claras
|
|
68
|
+
6. Use Markdown para formatação profissional
|
|
69
|
+
|
|
70
|
+
End Goal: Documento final bem estruturado, legível e pronto para distribuição.
|
|
71
|
+
|
|
72
|
+
Narrowing:
|
|
73
|
+
- Mantenha objetividade e clareza
|
|
74
|
+
- Preserve contexto importante
|
|
75
|
+
- Use formatação Markdown adequada
|
|
76
|
+
- Inclua timestamps relevantes quando aplicável
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def detect_cli_tool():
|
|
81
|
+
"""Detecta qual CLI de LLM está disponível (claude > gh copilot)."""
|
|
82
|
+
if shutil.which('claude'):
|
|
83
|
+
return 'claude'
|
|
84
|
+
elif shutil.which('gh'):
|
|
85
|
+
result = subprocess.run(['gh', 'copilot', '--version'],
|
|
86
|
+
capture_output=True, text=True)
|
|
87
|
+
if result.returncode == 0:
|
|
88
|
+
return 'gh-copilot'
|
|
89
|
+
return None
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def invoke_prompt_engineer(raw_prompt, timeout=90):
|
|
93
|
+
"""
|
|
94
|
+
Invoca prompt-engineer skill via CLI para melhorar/gerar prompts.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
raw_prompt: Prompt a ser melhorado ou meta-prompt
|
|
98
|
+
timeout: Timeout em segundos
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
str: Prompt melhorado ou DEFAULT_MEETING_PROMPT se falhar
|
|
102
|
+
"""
|
|
103
|
+
try:
|
|
104
|
+
# Tentar via gh copilot
|
|
105
|
+
console.print("[dim] Invocando prompt-engineer...[/dim]")
|
|
106
|
+
|
|
107
|
+
result = subprocess.run(
|
|
108
|
+
['gh', 'copilot', 'suggest', '-t', 'shell', raw_prompt],
|
|
109
|
+
capture_output=True,
|
|
110
|
+
text=True,
|
|
111
|
+
timeout=timeout
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
if result.returncode == 0 and result.stdout.strip():
|
|
115
|
+
return result.stdout.strip()
|
|
116
|
+
else:
|
|
117
|
+
console.print("[yellow]⚠️ prompt-engineer não respondeu, usando template padrão[/yellow]")
|
|
118
|
+
return DEFAULT_MEETING_PROMPT
|
|
119
|
+
|
|
120
|
+
except subprocess.TimeoutExpired:
|
|
121
|
+
console.print(f"[red]⚠️ Timeout após {timeout}s, usando template padrão[/red]")
|
|
122
|
+
return DEFAULT_MEETING_PROMPT
|
|
123
|
+
except Exception as e:
|
|
124
|
+
console.print(f"[red]⚠️ Erro ao invocar prompt-engineer: {e}[/red]")
|
|
125
|
+
return DEFAULT_MEETING_PROMPT
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def handle_prompt_workflow(user_prompt, transcript):
|
|
129
|
+
"""
|
|
130
|
+
Gerencia fluxo completo de prompts com prompt-engineer.
|
|
131
|
+
|
|
132
|
+
Cenário A: Usuário forneceu prompt → Melhorar AUTOMATICAMENTE → Confirmar
|
|
133
|
+
Cenário B: Sem prompt → Sugerir tipo → Confirmar → Gerar → Confirmar
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
str: Prompt final a usar, ou None se usuário recusou processamento
|
|
137
|
+
"""
|
|
138
|
+
prompt_engineer_available = os.path.exists(
|
|
139
|
+
os.path.expanduser('~/.copilot/skills/prompt-engineer/SKILL.md')
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# ========== CENÁRIO A: USUÁRIO FORNECEU PROMPT ==========
|
|
143
|
+
if user_prompt:
|
|
144
|
+
console.print("\n[cyan]📝 Prompt fornecido pelo usuário[/cyan]")
|
|
145
|
+
console.print(Panel(user_prompt[:300] + ("..." if len(user_prompt) > 300 else ""),
|
|
146
|
+
title="Prompt original", border_style="dim"))
|
|
147
|
+
|
|
148
|
+
if prompt_engineer_available:
|
|
149
|
+
# Melhora AUTOMATICAMENTE (sem perguntar)
|
|
150
|
+
console.print("\n[cyan]🔧 Melhorando prompt com prompt-engineer...[/cyan]")
|
|
151
|
+
|
|
152
|
+
improved_prompt = invoke_prompt_engineer(
|
|
153
|
+
f"melhore este prompt:\n\n{user_prompt}"
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# Mostrar AMBAS versões
|
|
157
|
+
console.print("\n[green]✨ Versão melhorada:[/green]")
|
|
158
|
+
console.print(Panel(improved_prompt[:500] + ("..." if len(improved_prompt) > 500 else ""),
|
|
159
|
+
title="Prompt otimizado", border_style="green"))
|
|
160
|
+
|
|
161
|
+
console.print("\n[dim]📝 Versão original:[/dim]")
|
|
162
|
+
console.print(Panel(user_prompt[:300] + ("..." if len(user_prompt) > 300 else ""),
|
|
163
|
+
title="Seu prompt", border_style="dim"))
|
|
164
|
+
|
|
165
|
+
# Pergunta qual usar
|
|
166
|
+
confirm = Prompt.ask(
|
|
167
|
+
"\n💡 Usar versão melhorada?",
|
|
168
|
+
choices=["s", "n"],
|
|
169
|
+
default="s"
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
return improved_prompt if confirm == "s" else user_prompt
|
|
173
|
+
else:
|
|
174
|
+
# prompt-engineer não disponível
|
|
175
|
+
console.print("[yellow]⚠️ prompt-engineer skill não disponível[/yellow]")
|
|
176
|
+
console.print("[dim]✅ Usando seu prompt original[/dim]")
|
|
177
|
+
return user_prompt
|
|
178
|
+
|
|
179
|
+
# ========== CENÁRIO B: SEM PROMPT - AUTO-GERAÇÃO ==========
|
|
180
|
+
else:
|
|
181
|
+
console.print("\n[yellow]⚠️ Nenhum prompt fornecido.[/yellow]")
|
|
182
|
+
|
|
183
|
+
if not prompt_engineer_available:
|
|
184
|
+
console.print("[yellow]⚠️ prompt-engineer skill não encontrado[/yellow]")
|
|
185
|
+
console.print("[dim]Usando template padrão...[/dim]")
|
|
186
|
+
return DEFAULT_MEETING_PROMPT
|
|
187
|
+
|
|
188
|
+
# PASSO 1: Perguntar se quer auto-gerar
|
|
189
|
+
console.print("Posso analisar o transcript e sugerir um formato de resumo/ata?")
|
|
190
|
+
|
|
191
|
+
generate = Prompt.ask(
|
|
192
|
+
"\n💡 Gerar prompt automaticamente?",
|
|
193
|
+
choices=["s", "n"],
|
|
194
|
+
default="s"
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
if generate == "n":
|
|
198
|
+
console.print("[dim]✅ Ok, gerando apenas transcript.md (sem ata)[/dim]")
|
|
199
|
+
return None # Sinaliza: não processar com LLM
|
|
200
|
+
|
|
201
|
+
# PASSO 2: Analisar transcript e SUGERIR tipo
|
|
202
|
+
console.print("\n[cyan]🔍 Analisando transcript...[/cyan]")
|
|
203
|
+
|
|
204
|
+
suggestion_meta_prompt = f"""
|
|
205
|
+
Analise este transcript ({len(transcript)} caracteres) e sugira:
|
|
206
|
+
|
|
207
|
+
1. Tipo de conteúdo (reunião, palestra, entrevista, etc.)
|
|
208
|
+
2. Formato de saída recomendado (ata formal, resumo executivo, notas estruturadas)
|
|
209
|
+
3. Framework ideal (RISEN, RODES, STAR, etc.)
|
|
210
|
+
|
|
211
|
+
Primeiras 1000 palavras do transcript:
|
|
212
|
+
{transcript[:4000]}
|
|
213
|
+
|
|
214
|
+
Responda em 2-3 linhas concisas.
|
|
215
|
+
"""
|
|
216
|
+
|
|
217
|
+
suggested_type = invoke_prompt_engineer(suggestion_meta_prompt)
|
|
218
|
+
|
|
219
|
+
# PASSO 3: Mostrar sugestão e CONFIRMAR
|
|
220
|
+
console.print("\n[green]💡 Sugestão de formato:[/green]")
|
|
221
|
+
console.print(Panel(suggested_type, title="Análise do transcript", border_style="green"))
|
|
222
|
+
|
|
223
|
+
confirm_type = Prompt.ask(
|
|
224
|
+
"\n💡 Usar este formato?",
|
|
225
|
+
choices=["s", "n"],
|
|
226
|
+
default="s"
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
if confirm_type == "n":
|
|
230
|
+
console.print("[dim]Usando template padrão...[/dim]")
|
|
231
|
+
return DEFAULT_MEETING_PROMPT
|
|
232
|
+
|
|
233
|
+
# PASSO 4: Gerar prompt completo baseado na sugestão
|
|
234
|
+
console.print("\n[cyan]✨ Gerando prompt estruturado...[/cyan]")
|
|
235
|
+
|
|
236
|
+
final_meta_prompt = f"""
|
|
237
|
+
Crie um prompt completo e estruturado (usando framework apropriado) para:
|
|
238
|
+
|
|
239
|
+
{suggested_type}
|
|
240
|
+
|
|
241
|
+
O prompt deve instruir uma IA a transformar o transcript em um documento
|
|
242
|
+
profissional e bem formatado em Markdown.
|
|
243
|
+
"""
|
|
244
|
+
|
|
245
|
+
generated_prompt = invoke_prompt_engineer(final_meta_prompt)
|
|
246
|
+
|
|
247
|
+
# PASSO 5: Mostrar prompt gerado e CONFIRMAR
|
|
248
|
+
console.print("\n[green]✅ Prompt gerado:[/green]")
|
|
249
|
+
console.print(Panel(generated_prompt[:600] + ("..." if len(generated_prompt) > 600 else ""),
|
|
250
|
+
title="Preview", border_style="green"))
|
|
251
|
+
|
|
252
|
+
confirm_final = Prompt.ask(
|
|
253
|
+
"\n💡 Usar este prompt?",
|
|
254
|
+
choices=["s", "n"],
|
|
255
|
+
default="s"
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
if confirm_final == "s":
|
|
259
|
+
return generated_prompt
|
|
260
|
+
else:
|
|
261
|
+
console.print("[dim]Usando template padrão...[/dim]")
|
|
262
|
+
return DEFAULT_MEETING_PROMPT
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def process_with_llm(transcript, prompt, cli_tool='claude', timeout=300):
|
|
266
|
+
"""
|
|
267
|
+
Processa transcript com LLM usando prompt fornecido.
|
|
268
|
+
|
|
269
|
+
Args:
|
|
270
|
+
transcript: Texto transcrito
|
|
271
|
+
prompt: Prompt instruindo como processar
|
|
272
|
+
cli_tool: 'claude' ou 'gh-copilot'
|
|
273
|
+
timeout: Timeout em segundos
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
str: Ata/resumo processado
|
|
277
|
+
"""
|
|
278
|
+
full_prompt = f"{prompt}\n\n---\n\nTranscrição:\n\n{transcript}"
|
|
279
|
+
|
|
280
|
+
try:
|
|
281
|
+
with Progress(
|
|
282
|
+
SpinnerColumn(),
|
|
283
|
+
TextColumn("[progress.description]{task.description}"),
|
|
284
|
+
transient=True
|
|
285
|
+
) as progress:
|
|
286
|
+
progress.add_task(description=f"🤖 Processando com {cli_tool}...", total=None)
|
|
287
|
+
|
|
288
|
+
if cli_tool == 'claude':
|
|
289
|
+
result = subprocess.run(
|
|
290
|
+
['claude', '-'],
|
|
291
|
+
input=full_prompt,
|
|
292
|
+
capture_output=True,
|
|
293
|
+
text=True,
|
|
294
|
+
timeout=timeout
|
|
295
|
+
)
|
|
296
|
+
elif cli_tool == 'gh-copilot':
|
|
297
|
+
result = subprocess.run(
|
|
298
|
+
['gh', 'copilot', 'suggest', '-t', 'shell', full_prompt],
|
|
299
|
+
capture_output=True,
|
|
300
|
+
text=True,
|
|
301
|
+
timeout=timeout
|
|
302
|
+
)
|
|
303
|
+
else:
|
|
304
|
+
raise ValueError(f"CLI tool desconhecido: {cli_tool}")
|
|
305
|
+
|
|
306
|
+
if result.returncode == 0:
|
|
307
|
+
return result.stdout.strip()
|
|
308
|
+
else:
|
|
309
|
+
console.print(f"[red]❌ Erro ao processar com {cli_tool}[/red]")
|
|
310
|
+
console.print(f"[dim]{result.stderr[:200]}[/dim]")
|
|
311
|
+
return None
|
|
312
|
+
|
|
313
|
+
except subprocess.TimeoutExpired:
|
|
314
|
+
console.print(f"[red]❌ Timeout após {timeout}s[/red]")
|
|
315
|
+
return None
|
|
316
|
+
except Exception as e:
|
|
317
|
+
console.print(f"[red]❌ Erro: {e}[/red]")
|
|
318
|
+
return None
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def transcribe_audio(audio_file, model="base"):
|
|
322
|
+
"""
|
|
323
|
+
Transcreve áudio usando Whisper com barra de progresso.
|
|
324
|
+
|
|
325
|
+
Returns:
|
|
326
|
+
dict: {language, duration, segments: [{start, end, text}]}
|
|
327
|
+
"""
|
|
328
|
+
console.print(f"\n[cyan]🎙️ Transcrevendo áudio com {TRANSCRIBER}...[/cyan]")
|
|
329
|
+
|
|
330
|
+
try:
|
|
331
|
+
if TRANSCRIBER == "faster-whisper":
|
|
332
|
+
model_obj = WhisperModel(model, device="cpu", compute_type="int8")
|
|
333
|
+
segments, info = model_obj.transcribe(
|
|
334
|
+
audio_file,
|
|
335
|
+
language=None,
|
|
336
|
+
vad_filter=True,
|
|
337
|
+
word_timestamps=True
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
data = {
|
|
341
|
+
"language": info.language,
|
|
342
|
+
"language_probability": round(info.language_probability, 2),
|
|
343
|
+
"duration": info.duration,
|
|
344
|
+
"segments": []
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
# Converter generator em lista com progresso
|
|
348
|
+
console.print("[dim]Processando segmentos...[/dim]")
|
|
349
|
+
for segment in tqdm(segments, desc="Segmentos", unit="seg"):
|
|
350
|
+
data["segments"].append({
|
|
351
|
+
"start": round(segment.start, 2),
|
|
352
|
+
"end": round(segment.end, 2),
|
|
353
|
+
"text": segment.text.strip()
|
|
354
|
+
})
|
|
355
|
+
|
|
356
|
+
else: # whisper original
|
|
357
|
+
import whisper
|
|
358
|
+
model_obj = whisper.load_model(model)
|
|
359
|
+
result = model_obj.transcribe(audio_file, word_timestamps=True)
|
|
360
|
+
|
|
361
|
+
data = {
|
|
362
|
+
"language": result["language"],
|
|
363
|
+
"duration": result["segments"][-1]["end"] if result["segments"] else 0,
|
|
364
|
+
"segments": result["segments"]
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
console.print(f"[green]✅ Transcrição completa! Idioma: {data['language'].upper()}[/green]")
|
|
368
|
+
console.print(f"[dim] {len(data['segments'])} segmentos processados[/dim]")
|
|
369
|
+
|
|
370
|
+
return data
|
|
371
|
+
|
|
372
|
+
except Exception as e:
|
|
373
|
+
console.print(f"[red]❌ Erro na transcrição: {e}[/red]")
|
|
374
|
+
sys.exit(1)
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
def save_outputs(transcript_text, ata_text, audio_file, output_dir="."):
|
|
378
|
+
"""
|
|
379
|
+
Salva transcript e ata em arquivos .md com timestamp.
|
|
380
|
+
|
|
381
|
+
Returns:
|
|
382
|
+
tuple: (transcript_path, ata_path or None)
|
|
383
|
+
"""
|
|
384
|
+
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
|
|
385
|
+
base_name = Path(audio_file).stem
|
|
386
|
+
|
|
387
|
+
# Sempre salva transcript
|
|
388
|
+
transcript_filename = f"transcript-{timestamp}.md"
|
|
389
|
+
transcript_path = Path(output_dir) / transcript_filename
|
|
390
|
+
|
|
391
|
+
with open(transcript_path, 'w', encoding='utf-8') as f:
|
|
392
|
+
f.write(transcript_text)
|
|
393
|
+
|
|
394
|
+
console.print(f"[green]✅ Transcript salvo:[/green] {transcript_filename}")
|
|
395
|
+
|
|
396
|
+
# Salva ata se existir
|
|
397
|
+
ata_path = None
|
|
398
|
+
if ata_text:
|
|
399
|
+
ata_filename = f"ata-{timestamp}.md"
|
|
400
|
+
ata_path = Path(output_dir) / ata_filename
|
|
401
|
+
|
|
402
|
+
with open(ata_path, 'w', encoding='utf-8') as f:
|
|
403
|
+
f.write(ata_text)
|
|
404
|
+
|
|
405
|
+
console.print(f"[green]✅ Ata salva:[/green] {ata_filename}")
|
|
406
|
+
|
|
407
|
+
return str(transcript_path), str(ata_path) if ata_path else None
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
def main():
|
|
411
|
+
"""Função principal."""
|
|
412
|
+
import argparse
|
|
413
|
+
|
|
414
|
+
parser = argparse.ArgumentParser(description="Audio Transcriber v1.1.0")
|
|
415
|
+
parser.add_argument("audio_file", help="Arquivo de áudio para transcrever")
|
|
416
|
+
parser.add_argument("--prompt", help="Prompt customizado para processar transcript")
|
|
417
|
+
parser.add_argument("--model", default="base", help="Modelo Whisper (tiny/base/small/medium/large)")
|
|
418
|
+
parser.add_argument("--output-dir", default=".", help="Diretório de saída")
|
|
419
|
+
|
|
420
|
+
args = parser.parse_args()
|
|
421
|
+
|
|
422
|
+
# Verificar arquivo existe
|
|
423
|
+
if not os.path.exists(args.audio_file):
|
|
424
|
+
console.print(f"[red]❌ Arquivo não encontrado: {args.audio_file}[/red]")
|
|
425
|
+
sys.exit(1)
|
|
426
|
+
|
|
427
|
+
console.print("[bold cyan]🎵 Audio Transcriber v1.1.0[/bold cyan]\n")
|
|
428
|
+
|
|
429
|
+
# Step 1: Transcrever
|
|
430
|
+
transcription_data = transcribe_audio(args.audio_file, model=args.model)
|
|
431
|
+
|
|
432
|
+
# Gerar texto do transcript
|
|
433
|
+
transcript_text = f"# Transcrição de Áudio\n\n"
|
|
434
|
+
transcript_text += f"**Arquivo:** {Path(args.audio_file).name}\n"
|
|
435
|
+
transcript_text += f"**Idioma:** {transcription_data['language'].upper()}\n"
|
|
436
|
+
transcript_text += f"**Data:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n"
|
|
437
|
+
transcript_text += "---\n\n## Transcrição Completa\n\n"
|
|
438
|
+
|
|
439
|
+
for seg in transcription_data["segments"]:
|
|
440
|
+
start_min = int(seg["start"] // 60)
|
|
441
|
+
start_sec = int(seg["start"] % 60)
|
|
442
|
+
end_min = int(seg["end"] // 60)
|
|
443
|
+
end_sec = int(seg["end"] % 60)
|
|
444
|
+
transcript_text += f"**[{start_min:02d}:{start_sec:02d} → {end_min:02d}:{end_sec:02d}]** \n{seg['text']}\n\n"
|
|
445
|
+
|
|
446
|
+
# Step 2: Detectar CLI
|
|
447
|
+
cli_tool = detect_cli_tool()
|
|
448
|
+
|
|
449
|
+
if not cli_tool:
|
|
450
|
+
console.print("\n[yellow]⚠️ Nenhuma CLI de IA detectada (Claude ou GitHub Copilot)[/yellow]")
|
|
451
|
+
console.print("[dim]ℹ️ Salvando apenas transcript.md...[/dim]")
|
|
452
|
+
|
|
453
|
+
save_outputs(transcript_text, None, args.audio_file, args.output_dir)
|
|
454
|
+
|
|
455
|
+
console.print("\n[cyan]💡 Para gerar ata/resumo:[/cyan]")
|
|
456
|
+
console.print(" - Instale Claude CLI: pip install claude-cli")
|
|
457
|
+
console.print(" - Ou GitHub Copilot CLI já está instalado (gh copilot)")
|
|
458
|
+
return
|
|
459
|
+
|
|
460
|
+
console.print(f"\n[green]✅ CLI detectada: {cli_tool}[/green]")
|
|
461
|
+
|
|
462
|
+
# Step 3: Workflow de prompt
|
|
463
|
+
final_prompt = handle_prompt_workflow(args.prompt, transcript_text)
|
|
464
|
+
|
|
465
|
+
if final_prompt is None:
|
|
466
|
+
# Usuário recusou processamento
|
|
467
|
+
save_outputs(transcript_text, None, args.audio_file, args.output_dir)
|
|
468
|
+
return
|
|
469
|
+
|
|
470
|
+
# Step 4: Processar com LLM
|
|
471
|
+
ata_text = process_with_llm(transcript_text, final_prompt, cli_tool)
|
|
472
|
+
|
|
473
|
+
if ata_text:
|
|
474
|
+
console.print("[green]✅ Ata gerada com sucesso![/green]")
|
|
475
|
+
else:
|
|
476
|
+
console.print("[yellow]⚠️ Falha ao gerar ata, salvando apenas transcript[/yellow]")
|
|
477
|
+
|
|
478
|
+
# Step 5: Salvar arquivos
|
|
479
|
+
console.print("\n[cyan]💾 Salvando arquivos...[/cyan]")
|
|
480
|
+
save_outputs(transcript_text, ata_text, args.audio_file, args.output_dir)
|
|
481
|
+
|
|
482
|
+
console.print("\n[bold green]✅ Concluído![/bold green]")
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
if __name__ == "__main__":
|
|
486
|
+
main()
|