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,106 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modulo de governanca para leiloeiro-ia.
|
|
3
|
+
|
|
4
|
+
Implementa action_log, rate_limit, confirmation_request e warning_threshold
|
|
5
|
+
para skills baseadas em conhecimento (knowledge-only).
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
# Diretorio de dados
|
|
15
|
+
DATA_DIR = Path(__file__).parent.parent / "data"
|
|
16
|
+
DATA_DIR.mkdir(exist_ok=True)
|
|
17
|
+
|
|
18
|
+
LOG_FILE = DATA_DIR / "action_log.jsonl"
|
|
19
|
+
RATE_LIMIT_WINDOW = 60 # segundos
|
|
20
|
+
RATE_LIMIT_MAX = 30 # max acoes por janela
|
|
21
|
+
WARNING_THRESHOLD = 0.8 # 80% do limite
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def log_action(action: str, details: dict | None = None) -> dict:
|
|
25
|
+
"""Registra acao no action_log para auditoria."""
|
|
26
|
+
entry = {
|
|
27
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
28
|
+
"action": action,
|
|
29
|
+
"details": details or {},
|
|
30
|
+
}
|
|
31
|
+
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
|
32
|
+
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
|
33
|
+
return entry
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def check_rate(action: str = "query") -> bool:
|
|
37
|
+
"""Verifica rate_limit — retorna True se dentro do limite."""
|
|
38
|
+
if not LOG_FILE.exists():
|
|
39
|
+
return True
|
|
40
|
+
now = datetime.utcnow()
|
|
41
|
+
count = 0
|
|
42
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
43
|
+
for line in f:
|
|
44
|
+
try:
|
|
45
|
+
entry = json.loads(line)
|
|
46
|
+
ts = datetime.fromisoformat(entry["timestamp"])
|
|
47
|
+
if (now - ts).total_seconds() <= RATE_LIMIT_WINDOW:
|
|
48
|
+
count += 1
|
|
49
|
+
except (json.JSONDecodeError, KeyError, ValueError):
|
|
50
|
+
continue
|
|
51
|
+
if count >= RATE_LIMIT_MAX:
|
|
52
|
+
raise RateLimitExceeded(f"Rate limit excedido: {count}/{RATE_LIMIT_MAX} em {RATE_LIMIT_WINDOW}s")
|
|
53
|
+
return True
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def requires_confirmation(action: str, risk_level: str = "alto") -> dict:
|
|
57
|
+
"""Gera confirmation_request para acoes de alto risco."""
|
|
58
|
+
return {
|
|
59
|
+
"type": "confirmation_request",
|
|
60
|
+
"action": action,
|
|
61
|
+
"risk_level": risk_level,
|
|
62
|
+
"message": f"Acao '{action}' requer confirmacao do usuario (risco: {risk_level})",
|
|
63
|
+
"confirmed": False,
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def check_warning_threshold(current_value: float, threshold: float = WARNING_THRESHOLD) -> list:
|
|
68
|
+
"""Verifica warning_threshold e retorna warnings se ultrapassado."""
|
|
69
|
+
warnings = []
|
|
70
|
+
if current_value >= threshold:
|
|
71
|
+
warnings.append({
|
|
72
|
+
"type": "RATE_LIMIT_WARNING",
|
|
73
|
+
"message": f"warning_threshold atingido: {current_value:.0%} do limite",
|
|
74
|
+
"threshold": threshold,
|
|
75
|
+
"current": current_value,
|
|
76
|
+
})
|
|
77
|
+
return warnings
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def get_recent_actions(limit: int = 20) -> list:
|
|
81
|
+
"""Retorna acoes recentes do audit_log."""
|
|
82
|
+
if not LOG_FILE.exists():
|
|
83
|
+
return []
|
|
84
|
+
actions = []
|
|
85
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
86
|
+
for line in f:
|
|
87
|
+
try:
|
|
88
|
+
actions.append(json.loads(line))
|
|
89
|
+
except json.JSONDecodeError:
|
|
90
|
+
continue
|
|
91
|
+
return actions[-limit:]
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class RateLimitExceeded(Exception):
|
|
95
|
+
"""Excecao quando rate limit e excedido."""
|
|
96
|
+
pass
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
if __name__ == "__main__":
|
|
100
|
+
import sys
|
|
101
|
+
recent = get_recent_actions(20)
|
|
102
|
+
if recent:
|
|
103
|
+
for a in recent:
|
|
104
|
+
print(f"[{a['timestamp']}] {a['action']}: {a.get('details', {})}")
|
|
105
|
+
else:
|
|
106
|
+
print("Nenhuma acao registrada.")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Sem dependencias externas (stdlib only)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modulo de governanca para leiloeiro-ia.
|
|
3
|
+
|
|
4
|
+
Implementa action_log, rate_limit, confirmation_request e warning_threshold
|
|
5
|
+
para skills baseadas em conhecimento (knowledge-only).
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
# Diretorio de dados
|
|
15
|
+
DATA_DIR = Path(__file__).parent.parent / "data"
|
|
16
|
+
DATA_DIR.mkdir(exist_ok=True)
|
|
17
|
+
|
|
18
|
+
LOG_FILE = DATA_DIR / "action_log.jsonl"
|
|
19
|
+
RATE_LIMIT_WINDOW = 60 # segundos
|
|
20
|
+
RATE_LIMIT_MAX = 30 # max acoes por janela
|
|
21
|
+
WARNING_THRESHOLD = 0.8 # 80% do limite
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def log_action(action: str, details: dict | None = None) -> dict:
|
|
25
|
+
"""Registra acao no action_log para auditoria."""
|
|
26
|
+
entry = {
|
|
27
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
28
|
+
"action": action,
|
|
29
|
+
"details": details or {},
|
|
30
|
+
}
|
|
31
|
+
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
|
32
|
+
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
|
33
|
+
return entry
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def check_rate(action: str = "query") -> bool:
|
|
37
|
+
"""Verifica rate_limit — retorna True se dentro do limite."""
|
|
38
|
+
if not LOG_FILE.exists():
|
|
39
|
+
return True
|
|
40
|
+
now = datetime.utcnow()
|
|
41
|
+
count = 0
|
|
42
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
43
|
+
for line in f:
|
|
44
|
+
try:
|
|
45
|
+
entry = json.loads(line)
|
|
46
|
+
ts = datetime.fromisoformat(entry["timestamp"])
|
|
47
|
+
if (now - ts).total_seconds() <= RATE_LIMIT_WINDOW:
|
|
48
|
+
count += 1
|
|
49
|
+
except (json.JSONDecodeError, KeyError, ValueError):
|
|
50
|
+
continue
|
|
51
|
+
if count >= RATE_LIMIT_MAX:
|
|
52
|
+
raise RateLimitExceeded(f"Rate limit excedido: {count}/{RATE_LIMIT_MAX} em {RATE_LIMIT_WINDOW}s")
|
|
53
|
+
return True
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def requires_confirmation(action: str, risk_level: str = "alto") -> dict:
|
|
57
|
+
"""Gera confirmation_request para acoes de alto risco."""
|
|
58
|
+
return {
|
|
59
|
+
"type": "confirmation_request",
|
|
60
|
+
"action": action,
|
|
61
|
+
"risk_level": risk_level,
|
|
62
|
+
"message": f"Acao '{action}' requer confirmacao do usuario (risco: {risk_level})",
|
|
63
|
+
"confirmed": False,
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def check_warning_threshold(current_value: float, threshold: float = WARNING_THRESHOLD) -> list:
|
|
68
|
+
"""Verifica warning_threshold e retorna warnings se ultrapassado."""
|
|
69
|
+
warnings = []
|
|
70
|
+
if current_value >= threshold:
|
|
71
|
+
warnings.append({
|
|
72
|
+
"type": "RATE_LIMIT_WARNING",
|
|
73
|
+
"message": f"warning_threshold atingido: {current_value:.0%} do limite",
|
|
74
|
+
"threshold": threshold,
|
|
75
|
+
"current": current_value,
|
|
76
|
+
})
|
|
77
|
+
return warnings
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def get_recent_actions(limit: int = 20) -> list:
|
|
81
|
+
"""Retorna acoes recentes do audit_log."""
|
|
82
|
+
if not LOG_FILE.exists():
|
|
83
|
+
return []
|
|
84
|
+
actions = []
|
|
85
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
86
|
+
for line in f:
|
|
87
|
+
try:
|
|
88
|
+
actions.append(json.loads(line))
|
|
89
|
+
except json.JSONDecodeError:
|
|
90
|
+
continue
|
|
91
|
+
return actions[-limit:]
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class RateLimitExceeded(Exception):
|
|
95
|
+
"""Excecao quando rate limit e excedido."""
|
|
96
|
+
pass
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
if __name__ == "__main__":
|
|
100
|
+
import sys
|
|
101
|
+
recent = get_recent_actions(20)
|
|
102
|
+
if recent:
|
|
103
|
+
for a in recent:
|
|
104
|
+
print(f"[{a['timestamp']}] {a['action']}: {a.get('details', {})}")
|
|
105
|
+
else:
|
|
106
|
+
print("Nenhuma acao registrada.")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Sem dependencias externas (stdlib only)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modulo de governanca para leiloeiro-ia.
|
|
3
|
+
|
|
4
|
+
Implementa action_log, rate_limit, confirmation_request e warning_threshold
|
|
5
|
+
para skills baseadas em conhecimento (knowledge-only).
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
# Diretorio de dados
|
|
15
|
+
DATA_DIR = Path(__file__).parent.parent / "data"
|
|
16
|
+
DATA_DIR.mkdir(exist_ok=True)
|
|
17
|
+
|
|
18
|
+
LOG_FILE = DATA_DIR / "action_log.jsonl"
|
|
19
|
+
RATE_LIMIT_WINDOW = 60 # segundos
|
|
20
|
+
RATE_LIMIT_MAX = 30 # max acoes por janela
|
|
21
|
+
WARNING_THRESHOLD = 0.8 # 80% do limite
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def log_action(action: str, details: dict | None = None) -> dict:
|
|
25
|
+
"""Registra acao no action_log para auditoria."""
|
|
26
|
+
entry = {
|
|
27
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
28
|
+
"action": action,
|
|
29
|
+
"details": details or {},
|
|
30
|
+
}
|
|
31
|
+
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
|
32
|
+
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
|
33
|
+
return entry
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def check_rate(action: str = "query") -> bool:
|
|
37
|
+
"""Verifica rate_limit — retorna True se dentro do limite."""
|
|
38
|
+
if not LOG_FILE.exists():
|
|
39
|
+
return True
|
|
40
|
+
now = datetime.utcnow()
|
|
41
|
+
count = 0
|
|
42
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
43
|
+
for line in f:
|
|
44
|
+
try:
|
|
45
|
+
entry = json.loads(line)
|
|
46
|
+
ts = datetime.fromisoformat(entry["timestamp"])
|
|
47
|
+
if (now - ts).total_seconds() <= RATE_LIMIT_WINDOW:
|
|
48
|
+
count += 1
|
|
49
|
+
except (json.JSONDecodeError, KeyError, ValueError):
|
|
50
|
+
continue
|
|
51
|
+
if count >= RATE_LIMIT_MAX:
|
|
52
|
+
raise RateLimitExceeded(f"Rate limit excedido: {count}/{RATE_LIMIT_MAX} em {RATE_LIMIT_WINDOW}s")
|
|
53
|
+
return True
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def requires_confirmation(action: str, risk_level: str = "alto") -> dict:
|
|
57
|
+
"""Gera confirmation_request para acoes de alto risco."""
|
|
58
|
+
return {
|
|
59
|
+
"type": "confirmation_request",
|
|
60
|
+
"action": action,
|
|
61
|
+
"risk_level": risk_level,
|
|
62
|
+
"message": f"Acao '{action}' requer confirmacao do usuario (risco: {risk_level})",
|
|
63
|
+
"confirmed": False,
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def check_warning_threshold(current_value: float, threshold: float = WARNING_THRESHOLD) -> list:
|
|
68
|
+
"""Verifica warning_threshold e retorna warnings se ultrapassado."""
|
|
69
|
+
warnings = []
|
|
70
|
+
if current_value >= threshold:
|
|
71
|
+
warnings.append({
|
|
72
|
+
"type": "RATE_LIMIT_WARNING",
|
|
73
|
+
"message": f"warning_threshold atingido: {current_value:.0%} do limite",
|
|
74
|
+
"threshold": threshold,
|
|
75
|
+
"current": current_value,
|
|
76
|
+
})
|
|
77
|
+
return warnings
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def get_recent_actions(limit: int = 20) -> list:
|
|
81
|
+
"""Retorna acoes recentes do audit_log."""
|
|
82
|
+
if not LOG_FILE.exists():
|
|
83
|
+
return []
|
|
84
|
+
actions = []
|
|
85
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
86
|
+
for line in f:
|
|
87
|
+
try:
|
|
88
|
+
actions.append(json.loads(line))
|
|
89
|
+
except json.JSONDecodeError:
|
|
90
|
+
continue
|
|
91
|
+
return actions[-limit:]
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class RateLimitExceeded(Exception):
|
|
95
|
+
"""Excecao quando rate limit e excedido."""
|
|
96
|
+
pass
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
if __name__ == "__main__":
|
|
100
|
+
import sys
|
|
101
|
+
recent = get_recent_actions(20)
|
|
102
|
+
if recent:
|
|
103
|
+
for a in recent:
|
|
104
|
+
print(f"[{a['timestamp']}] {a['action']}: {a.get('details', {})}")
|
|
105
|
+
else:
|
|
106
|
+
print("Nenhuma acao registrada.")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Sem dependencias externas (stdlib only)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modulo de governanca para leiloeiro-ia.
|
|
3
|
+
|
|
4
|
+
Implementa action_log, rate_limit, confirmation_request e warning_threshold
|
|
5
|
+
para skills baseadas em conhecimento (knowledge-only).
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
# Diretorio de dados
|
|
15
|
+
DATA_DIR = Path(__file__).parent.parent / "data"
|
|
16
|
+
DATA_DIR.mkdir(exist_ok=True)
|
|
17
|
+
|
|
18
|
+
LOG_FILE = DATA_DIR / "action_log.jsonl"
|
|
19
|
+
RATE_LIMIT_WINDOW = 60 # segundos
|
|
20
|
+
RATE_LIMIT_MAX = 30 # max acoes por janela
|
|
21
|
+
WARNING_THRESHOLD = 0.8 # 80% do limite
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def log_action(action: str, details: dict | None = None) -> dict:
|
|
25
|
+
"""Registra acao no action_log para auditoria."""
|
|
26
|
+
entry = {
|
|
27
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
28
|
+
"action": action,
|
|
29
|
+
"details": details or {},
|
|
30
|
+
}
|
|
31
|
+
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
|
32
|
+
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
|
33
|
+
return entry
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def check_rate(action: str = "query") -> bool:
|
|
37
|
+
"""Verifica rate_limit — retorna True se dentro do limite."""
|
|
38
|
+
if not LOG_FILE.exists():
|
|
39
|
+
return True
|
|
40
|
+
now = datetime.utcnow()
|
|
41
|
+
count = 0
|
|
42
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
43
|
+
for line in f:
|
|
44
|
+
try:
|
|
45
|
+
entry = json.loads(line)
|
|
46
|
+
ts = datetime.fromisoformat(entry["timestamp"])
|
|
47
|
+
if (now - ts).total_seconds() <= RATE_LIMIT_WINDOW:
|
|
48
|
+
count += 1
|
|
49
|
+
except (json.JSONDecodeError, KeyError, ValueError):
|
|
50
|
+
continue
|
|
51
|
+
if count >= RATE_LIMIT_MAX:
|
|
52
|
+
raise RateLimitExceeded(f"Rate limit excedido: {count}/{RATE_LIMIT_MAX} em {RATE_LIMIT_WINDOW}s")
|
|
53
|
+
return True
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def requires_confirmation(action: str, risk_level: str = "alto") -> dict:
|
|
57
|
+
"""Gera confirmation_request para acoes de alto risco."""
|
|
58
|
+
return {
|
|
59
|
+
"type": "confirmation_request",
|
|
60
|
+
"action": action,
|
|
61
|
+
"risk_level": risk_level,
|
|
62
|
+
"message": f"Acao '{action}' requer confirmacao do usuario (risco: {risk_level})",
|
|
63
|
+
"confirmed": False,
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def check_warning_threshold(current_value: float, threshold: float = WARNING_THRESHOLD) -> list:
|
|
68
|
+
"""Verifica warning_threshold e retorna warnings se ultrapassado."""
|
|
69
|
+
warnings = []
|
|
70
|
+
if current_value >= threshold:
|
|
71
|
+
warnings.append({
|
|
72
|
+
"type": "RATE_LIMIT_WARNING",
|
|
73
|
+
"message": f"warning_threshold atingido: {current_value:.0%} do limite",
|
|
74
|
+
"threshold": threshold,
|
|
75
|
+
"current": current_value,
|
|
76
|
+
})
|
|
77
|
+
return warnings
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def get_recent_actions(limit: int = 20) -> list:
|
|
81
|
+
"""Retorna acoes recentes do audit_log."""
|
|
82
|
+
if not LOG_FILE.exists():
|
|
83
|
+
return []
|
|
84
|
+
actions = []
|
|
85
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
86
|
+
for line in f:
|
|
87
|
+
try:
|
|
88
|
+
actions.append(json.loads(line))
|
|
89
|
+
except json.JSONDecodeError:
|
|
90
|
+
continue
|
|
91
|
+
return actions[-limit:]
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class RateLimitExceeded(Exception):
|
|
95
|
+
"""Excecao quando rate limit e excedido."""
|
|
96
|
+
pass
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
if __name__ == "__main__":
|
|
100
|
+
import sys
|
|
101
|
+
recent = get_recent_actions(20)
|
|
102
|
+
if recent:
|
|
103
|
+
for a in recent:
|
|
104
|
+
print(f"[{a['timestamp']}] {a['action']}: {a.get('details', {})}")
|
|
105
|
+
else:
|
|
106
|
+
print("Nenhuma acao registrada.")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Sem dependencias externas (stdlib only)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modulo de governanca para leiloeiro-ia.
|
|
3
|
+
|
|
4
|
+
Implementa action_log, rate_limit, confirmation_request e warning_threshold
|
|
5
|
+
para skills baseadas em conhecimento (knowledge-only).
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
# Diretorio de dados
|
|
15
|
+
DATA_DIR = Path(__file__).parent.parent / "data"
|
|
16
|
+
DATA_DIR.mkdir(exist_ok=True)
|
|
17
|
+
|
|
18
|
+
LOG_FILE = DATA_DIR / "action_log.jsonl"
|
|
19
|
+
RATE_LIMIT_WINDOW = 60 # segundos
|
|
20
|
+
RATE_LIMIT_MAX = 30 # max acoes por janela
|
|
21
|
+
WARNING_THRESHOLD = 0.8 # 80% do limite
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def log_action(action: str, details: dict | None = None) -> dict:
|
|
25
|
+
"""Registra acao no action_log para auditoria."""
|
|
26
|
+
entry = {
|
|
27
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
28
|
+
"action": action,
|
|
29
|
+
"details": details or {},
|
|
30
|
+
}
|
|
31
|
+
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
|
32
|
+
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
|
33
|
+
return entry
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def check_rate(action: str = "query") -> bool:
|
|
37
|
+
"""Verifica rate_limit — retorna True se dentro do limite."""
|
|
38
|
+
if not LOG_FILE.exists():
|
|
39
|
+
return True
|
|
40
|
+
now = datetime.utcnow()
|
|
41
|
+
count = 0
|
|
42
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
43
|
+
for line in f:
|
|
44
|
+
try:
|
|
45
|
+
entry = json.loads(line)
|
|
46
|
+
ts = datetime.fromisoformat(entry["timestamp"])
|
|
47
|
+
if (now - ts).total_seconds() <= RATE_LIMIT_WINDOW:
|
|
48
|
+
count += 1
|
|
49
|
+
except (json.JSONDecodeError, KeyError, ValueError):
|
|
50
|
+
continue
|
|
51
|
+
if count >= RATE_LIMIT_MAX:
|
|
52
|
+
raise RateLimitExceeded(f"Rate limit excedido: {count}/{RATE_LIMIT_MAX} em {RATE_LIMIT_WINDOW}s")
|
|
53
|
+
return True
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def requires_confirmation(action: str, risk_level: str = "alto") -> dict:
|
|
57
|
+
"""Gera confirmation_request para acoes de alto risco."""
|
|
58
|
+
return {
|
|
59
|
+
"type": "confirmation_request",
|
|
60
|
+
"action": action,
|
|
61
|
+
"risk_level": risk_level,
|
|
62
|
+
"message": f"Acao '{action}' requer confirmacao do usuario (risco: {risk_level})",
|
|
63
|
+
"confirmed": False,
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def check_warning_threshold(current_value: float, threshold: float = WARNING_THRESHOLD) -> list:
|
|
68
|
+
"""Verifica warning_threshold e retorna warnings se ultrapassado."""
|
|
69
|
+
warnings = []
|
|
70
|
+
if current_value >= threshold:
|
|
71
|
+
warnings.append({
|
|
72
|
+
"type": "RATE_LIMIT_WARNING",
|
|
73
|
+
"message": f"warning_threshold atingido: {current_value:.0%} do limite",
|
|
74
|
+
"threshold": threshold,
|
|
75
|
+
"current": current_value,
|
|
76
|
+
})
|
|
77
|
+
return warnings
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def get_recent_actions(limit: int = 20) -> list:
|
|
81
|
+
"""Retorna acoes recentes do audit_log."""
|
|
82
|
+
if not LOG_FILE.exists():
|
|
83
|
+
return []
|
|
84
|
+
actions = []
|
|
85
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
86
|
+
for line in f:
|
|
87
|
+
try:
|
|
88
|
+
actions.append(json.loads(line))
|
|
89
|
+
except json.JSONDecodeError:
|
|
90
|
+
continue
|
|
91
|
+
return actions[-limit:]
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class RateLimitExceeded(Exception):
|
|
95
|
+
"""Excecao quando rate limit e excedido."""
|
|
96
|
+
pass
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
if __name__ == "__main__":
|
|
100
|
+
import sys
|
|
101
|
+
recent = get_recent_actions(20)
|
|
102
|
+
if recent:
|
|
103
|
+
for a in recent:
|
|
104
|
+
print(f"[{a['timestamp']}] {a['action']}: {a.get('details', {})}")
|
|
105
|
+
else:
|
|
106
|
+
print("Nenhuma acao registrada.")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Sem dependencias externas (stdlib only)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modulo de governanca para leiloeiro-ia.
|
|
3
|
+
|
|
4
|
+
Implementa action_log, rate_limit, confirmation_request e warning_threshold
|
|
5
|
+
para skills baseadas em conhecimento (knowledge-only).
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
# Diretorio de dados
|
|
15
|
+
DATA_DIR = Path(__file__).parent.parent / "data"
|
|
16
|
+
DATA_DIR.mkdir(exist_ok=True)
|
|
17
|
+
|
|
18
|
+
LOG_FILE = DATA_DIR / "action_log.jsonl"
|
|
19
|
+
RATE_LIMIT_WINDOW = 60 # segundos
|
|
20
|
+
RATE_LIMIT_MAX = 30 # max acoes por janela
|
|
21
|
+
WARNING_THRESHOLD = 0.8 # 80% do limite
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def log_action(action: str, details: dict | None = None) -> dict:
|
|
25
|
+
"""Registra acao no action_log para auditoria."""
|
|
26
|
+
entry = {
|
|
27
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
28
|
+
"action": action,
|
|
29
|
+
"details": details or {},
|
|
30
|
+
}
|
|
31
|
+
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
|
32
|
+
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
|
33
|
+
return entry
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def check_rate(action: str = "query") -> bool:
|
|
37
|
+
"""Verifica rate_limit — retorna True se dentro do limite."""
|
|
38
|
+
if not LOG_FILE.exists():
|
|
39
|
+
return True
|
|
40
|
+
now = datetime.utcnow()
|
|
41
|
+
count = 0
|
|
42
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
43
|
+
for line in f:
|
|
44
|
+
try:
|
|
45
|
+
entry = json.loads(line)
|
|
46
|
+
ts = datetime.fromisoformat(entry["timestamp"])
|
|
47
|
+
if (now - ts).total_seconds() <= RATE_LIMIT_WINDOW:
|
|
48
|
+
count += 1
|
|
49
|
+
except (json.JSONDecodeError, KeyError, ValueError):
|
|
50
|
+
continue
|
|
51
|
+
if count >= RATE_LIMIT_MAX:
|
|
52
|
+
raise RateLimitExceeded(f"Rate limit excedido: {count}/{RATE_LIMIT_MAX} em {RATE_LIMIT_WINDOW}s")
|
|
53
|
+
return True
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def requires_confirmation(action: str, risk_level: str = "alto") -> dict:
|
|
57
|
+
"""Gera confirmation_request para acoes de alto risco."""
|
|
58
|
+
return {
|
|
59
|
+
"type": "confirmation_request",
|
|
60
|
+
"action": action,
|
|
61
|
+
"risk_level": risk_level,
|
|
62
|
+
"message": f"Acao '{action}' requer confirmacao do usuario (risco: {risk_level})",
|
|
63
|
+
"confirmed": False,
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def check_warning_threshold(current_value: float, threshold: float = WARNING_THRESHOLD) -> list:
|
|
68
|
+
"""Verifica warning_threshold e retorna warnings se ultrapassado."""
|
|
69
|
+
warnings = []
|
|
70
|
+
if current_value >= threshold:
|
|
71
|
+
warnings.append({
|
|
72
|
+
"type": "RATE_LIMIT_WARNING",
|
|
73
|
+
"message": f"warning_threshold atingido: {current_value:.0%} do limite",
|
|
74
|
+
"threshold": threshold,
|
|
75
|
+
"current": current_value,
|
|
76
|
+
})
|
|
77
|
+
return warnings
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def get_recent_actions(limit: int = 20) -> list:
|
|
81
|
+
"""Retorna acoes recentes do audit_log."""
|
|
82
|
+
if not LOG_FILE.exists():
|
|
83
|
+
return []
|
|
84
|
+
actions = []
|
|
85
|
+
with open(LOG_FILE, "r", encoding="utf-8") as f:
|
|
86
|
+
for line in f:
|
|
87
|
+
try:
|
|
88
|
+
actions.append(json.loads(line))
|
|
89
|
+
except json.JSONDecodeError:
|
|
90
|
+
continue
|
|
91
|
+
return actions[-limit:]
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class RateLimitExceeded(Exception):
|
|
95
|
+
"""Excecao quando rate limit e excedido."""
|
|
96
|
+
pass
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
if __name__ == "__main__":
|
|
100
|
+
import sys
|
|
101
|
+
recent = get_recent_actions(20)
|
|
102
|
+
if recent:
|
|
103
|
+
for a in recent:
|
|
104
|
+
print(f"[{a['timestamp']}] {a['action']}: {a.get('details', {})}")
|
|
105
|
+
else:
|
|
106
|
+
print("Nenhuma acao registrada.")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Sem dependencias externas (stdlib only)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
const dbPath = path.join(__dirname, '../../todos.db');
|
|
5
|
+
|
|
6
|
+
// Create database connection
|
|
7
|
+
let db: Database.Database | null = null;
|
|
8
|
+
|
|
9
|
+
export function getDatabase(): Database.Database {
|
|
10
|
+
if (!db) {
|
|
11
|
+
db = new Database(dbPath);
|
|
12
|
+
db.pragma('journal_mode = WAL');
|
|
13
|
+
console.log(`Connected to SQLite database at ${dbPath}`);
|
|
14
|
+
}
|
|
15
|
+
return db;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function closeDatabase(): void {
|
|
19
|
+
if (db) {
|
|
20
|
+
db.close();
|
|
21
|
+
db = null;
|
|
22
|
+
console.log('Database connection closed');
|
|
23
|
+
}
|
|
24
|
+
}
|