mega-brain-ai 1.3.0
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/.antigravity/README.md +46 -0
- package/.antigravity/rules/.gitkeep +0 -0
- package/.antigravity/rules/mega-brain.md +39 -0
- package/.claude/CLAUDE.md +172 -0
- package/.claude/agents.yaml +44 -0
- package/.claude/commands/agents.md +161 -0
- package/.claude/commands/ask.md +117 -0
- package/.claude/commands/benchmark.md +224 -0
- package/.claude/commands/chat.md +343 -0
- package/.claude/commands/compare.md +116 -0
- package/.claude/commands/conclave.md +196 -0
- package/.claude/commands/config.md +133 -0
- package/.claude/commands/create-agent.md +467 -0
- package/.claude/commands/debate.md +159 -0
- package/.claude/commands/documentation/create-architecture-documentation.md +175 -0
- package/.claude/commands/dossiers.md +180 -0
- package/.claude/commands/evolve.md +223 -0
- package/.claude/commands/extract-dna.md +172 -0
- package/.claude/commands/extract-knowledge.md +507 -0
- package/.claude/commands/gsd/add-phase.md +43 -0
- package/.claude/commands/gsd/add-tests.md +41 -0
- package/.claude/commands/gsd/add-todo.md +47 -0
- package/.claude/commands/gsd/audit-milestone.md +36 -0
- package/.claude/commands/gsd/check-todos.md +45 -0
- package/.claude/commands/gsd/cleanup.md +18 -0
- package/.claude/commands/gsd/complete-milestone.md +136 -0
- package/.claude/commands/gsd/debug.md +167 -0
- package/.claude/commands/gsd/discuss-phase.md +83 -0
- package/.claude/commands/gsd/execute-phase.md +41 -0
- package/.claude/commands/gsd/health.md +22 -0
- package/.claude/commands/gsd/help.md +22 -0
- package/.claude/commands/gsd/insert-phase.md +32 -0
- package/.claude/commands/gsd/join-discord.md +18 -0
- package/.claude/commands/gsd/list-phase-assumptions.md +46 -0
- package/.claude/commands/gsd/map-codebase.md +71 -0
- package/.claude/commands/gsd/new-milestone.md +44 -0
- package/.claude/commands/gsd/new-project.md +42 -0
- package/.claude/commands/gsd/pause-work.md +38 -0
- package/.claude/commands/gsd/plan-milestone-gaps.md +34 -0
- package/.claude/commands/gsd/plan-phase.md +45 -0
- package/.claude/commands/gsd/progress.md +24 -0
- package/.claude/commands/gsd/quick.md +41 -0
- package/.claude/commands/gsd/reapply-patches.md +110 -0
- package/.claude/commands/gsd/remove-phase.md +31 -0
- package/.claude/commands/gsd/research-phase.md +189 -0
- package/.claude/commands/gsd/resume-work.md +40 -0
- package/.claude/commands/gsd/set-profile.md +34 -0
- package/.claude/commands/gsd/settings.md +36 -0
- package/.claude/commands/gsd/update.md +37 -0
- package/.claude/commands/gsd/verify-work.md +38 -0
- package/.claude/commands/inbox.md +296 -0
- package/.claude/commands/ingest-empresa.md +191 -0
- package/.claude/commands/ingest.md +183 -0
- package/.claude/commands/jarvis-briefing.md +67 -0
- package/.claude/commands/jarvis-control.md +169 -0
- package/.claude/commands/jarvis-full.md +182 -0
- package/.claude/commands/jarvis.md +212 -0
- package/.claude/commands/ler-drive.md +212 -0
- package/.claude/commands/log.md +158 -0
- package/.claude/commands/loop.md +133 -0
- package/.claude/commands/loops.md +73 -0
- package/.claude/commands/mission-autopilot.md +538 -0
- package/.claude/commands/mission.md +353 -0
- package/.claude/commands/process-inbox.md +148 -0
- package/.claude/commands/process-jarvis.md +3036 -0
- package/.claude/commands/process-video.md +131 -0
- package/.claude/commands/rag-search.md +78 -0
- package/.claude/commands/resume.md +33 -0
- package/.claude/commands/save.md +38 -0
- package/.claude/commands/scan-inbox.md +125 -0
- package/.claude/commands/setup.md +99 -0
- package/.claude/commands/system-digest.md +243 -0
- package/.claude/commands/verify.md +182 -0
- package/.claude/commands/view-dna.md +169 -0
- package/.claude/get-shit-done/VERSION +1 -0
- package/.claude/get-shit-done/bin/gsd-tools.cjs +588 -0
- package/.claude/get-shit-done/bin/lib/commands.cjs +553 -0
- package/.claude/get-shit-done/bin/lib/config.cjs +162 -0
- package/.claude/get-shit-done/bin/lib/core.cjs +411 -0
- package/.claude/get-shit-done/bin/lib/frontmatter.cjs +299 -0
- package/.claude/get-shit-done/bin/lib/init.cjs +710 -0
- package/.claude/get-shit-done/bin/lib/milestone.cjs +216 -0
- package/.claude/get-shit-done/bin/lib/phase.cjs +871 -0
- package/.claude/get-shit-done/bin/lib/roadmap.cjs +298 -0
- package/.claude/get-shit-done/bin/lib/state.cjs +679 -0
- package/.claude/get-shit-done/bin/lib/template.cjs +222 -0
- package/.claude/get-shit-done/bin/lib/verify.cjs +773 -0
- package/.claude/get-shit-done/references/checkpoints.md +776 -0
- package/.claude/get-shit-done/references/continuation-format.md +249 -0
- package/.claude/get-shit-done/references/decimal-phase-calculation.md +65 -0
- package/.claude/get-shit-done/references/git-integration.md +248 -0
- package/.claude/get-shit-done/references/git-planning-commit.md +38 -0
- package/.claude/get-shit-done/references/model-profile-resolution.md +34 -0
- package/.claude/get-shit-done/references/model-profiles.md +92 -0
- package/.claude/get-shit-done/references/phase-argument-parsing.md +61 -0
- package/.claude/get-shit-done/references/planning-config.md +196 -0
- package/.claude/get-shit-done/references/questioning.md +145 -0
- package/.claude/get-shit-done/references/tdd.md +263 -0
- package/.claude/get-shit-done/references/ui-brand.md +160 -0
- package/.claude/get-shit-done/references/verification-patterns.md +612 -0
- package/.claude/get-shit-done/templates/DEBUG.md +164 -0
- package/.claude/get-shit-done/templates/UAT.md +247 -0
- package/.claude/get-shit-done/templates/VALIDATION.md +76 -0
- package/.claude/get-shit-done/templates/codebase/architecture.md +255 -0
- package/.claude/get-shit-done/templates/codebase/concerns.md +310 -0
- package/.claude/get-shit-done/templates/codebase/conventions.md +307 -0
- package/.claude/get-shit-done/templates/codebase/integrations.md +280 -0
- package/.claude/get-shit-done/templates/codebase/stack.md +186 -0
- package/.claude/get-shit-done/templates/codebase/structure.md +285 -0
- package/.claude/get-shit-done/templates/codebase/testing.md +480 -0
- package/.claude/get-shit-done/templates/config.json +37 -0
- package/.claude/get-shit-done/templates/context.md +283 -0
- package/.claude/get-shit-done/templates/continue-here.md +78 -0
- package/.claude/get-shit-done/templates/debug-subagent-prompt.md +91 -0
- package/.claude/get-shit-done/templates/discovery.md +146 -0
- package/.claude/get-shit-done/templates/milestone-archive.md +123 -0
- package/.claude/get-shit-done/templates/milestone.md +115 -0
- package/.claude/get-shit-done/templates/phase-prompt.md +569 -0
- package/.claude/get-shit-done/templates/planner-subagent-prompt.md +117 -0
- package/.claude/get-shit-done/templates/project.md +184 -0
- package/.claude/get-shit-done/templates/requirements.md +231 -0
- package/.claude/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
- package/.claude/get-shit-done/templates/research-project/FEATURES.md +147 -0
- package/.claude/get-shit-done/templates/research-project/PITFALLS.md +200 -0
- package/.claude/get-shit-done/templates/research-project/STACK.md +120 -0
- package/.claude/get-shit-done/templates/research-project/SUMMARY.md +170 -0
- package/.claude/get-shit-done/templates/research.md +552 -0
- package/.claude/get-shit-done/templates/retrospective.md +54 -0
- package/.claude/get-shit-done/templates/roadmap.md +202 -0
- package/.claude/get-shit-done/templates/state.md +176 -0
- package/.claude/get-shit-done/templates/summary-complex.md +59 -0
- package/.claude/get-shit-done/templates/summary-minimal.md +41 -0
- package/.claude/get-shit-done/templates/summary-standard.md +48 -0
- package/.claude/get-shit-done/templates/summary.md +248 -0
- package/.claude/get-shit-done/templates/user-setup.md +311 -0
- package/.claude/get-shit-done/templates/verification-report.md +322 -0
- package/.claude/get-shit-done/workflows/add-phase.md +111 -0
- package/.claude/get-shit-done/workflows/add-tests.md +350 -0
- package/.claude/get-shit-done/workflows/add-todo.md +157 -0
- package/.claude/get-shit-done/workflows/audit-milestone.md +297 -0
- package/.claude/get-shit-done/workflows/check-todos.md +176 -0
- package/.claude/get-shit-done/workflows/cleanup.md +152 -0
- package/.claude/get-shit-done/workflows/complete-milestone.md +763 -0
- package/.claude/get-shit-done/workflows/diagnose-issues.md +219 -0
- package/.claude/get-shit-done/workflows/discovery-phase.md +289 -0
- package/.claude/get-shit-done/workflows/discuss-phase.md +542 -0
- package/.claude/get-shit-done/workflows/execute-phase.md +449 -0
- package/.claude/get-shit-done/workflows/execute-plan.md +448 -0
- package/.claude/get-shit-done/workflows/health.md +156 -0
- package/.claude/get-shit-done/workflows/help.md +489 -0
- package/.claude/get-shit-done/workflows/insert-phase.md +129 -0
- package/.claude/get-shit-done/workflows/list-phase-assumptions.md +178 -0
- package/.claude/get-shit-done/workflows/map-codebase.md +315 -0
- package/.claude/get-shit-done/workflows/new-milestone.md +382 -0
- package/.claude/get-shit-done/workflows/new-project.md +1116 -0
- package/.claude/get-shit-done/workflows/pause-work.md +122 -0
- package/.claude/get-shit-done/workflows/plan-milestone-gaps.md +274 -0
- package/.claude/get-shit-done/workflows/plan-phase.md +569 -0
- package/.claude/get-shit-done/workflows/progress.md +381 -0
- package/.claude/get-shit-done/workflows/quick.md +453 -0
- package/.claude/get-shit-done/workflows/remove-phase.md +154 -0
- package/.claude/get-shit-done/workflows/research-phase.md +73 -0
- package/.claude/get-shit-done/workflows/resume-project.md +306 -0
- package/.claude/get-shit-done/workflows/set-profile.md +80 -0
- package/.claude/get-shit-done/workflows/settings.md +213 -0
- package/.claude/get-shit-done/workflows/transition.md +544 -0
- package/.claude/get-shit-done/workflows/update.md +219 -0
- package/.claude/get-shit-done/workflows/verify-phase.md +242 -0
- package/.claude/get-shit-done/workflows/verify-work.md +569 -0
- package/.claude/gsd-file-manifest.json +144 -0
- package/.claude/hooks/agent_creation_trigger.py +168 -0
- package/.claude/hooks/agent_index_updater.py +255 -0
- package/.claude/hooks/agent_memory_persister.py +203 -0
- package/.claude/hooks/claude_md_agent_sync.py +162 -0
- package/.claude/hooks/claude_md_guard.py +154 -0
- package/.claude/hooks/continuous_save.py +414 -0
- package/.claude/hooks/creation_validator.py +360 -0
- package/.claude/hooks/enforce_dual_location.py +501 -0
- package/.claude/hooks/enforce_plan_mode.py +220 -0
- package/.claude/hooks/gsd-check-update.js +62 -0
- package/.claude/hooks/gsd-context-monitor.js +122 -0
- package/.claude/hooks/gsd-statusline.js +108 -0
- package/.claude/hooks/inbox_age_alert.py +367 -0
- package/.claude/hooks/ledger_updater.py +303 -0
- package/.claude/hooks/memory_hints_injector.py +251 -0
- package/.claude/hooks/memory_updater.py +202 -0
- package/.claude/hooks/notification_system.py +115 -0
- package/.claude/hooks/pending_tracker.py +188 -0
- package/.claude/hooks/pipeline_checkpoint.py +583 -0
- package/.claude/hooks/post_batch_cascading.py +1740 -0
- package/.claude/hooks/post_tool_use.py +120 -0
- package/.claude/hooks/quality_watchdog.py +394 -0
- package/.claude/hooks/ralph_wiggum.py +286 -0
- package/.claude/hooks/session-source-sync.py +223 -0
- package/.claude/hooks/session_autosave_v2.py +1135 -0
- package/.claude/hooks/session_end.py +203 -0
- package/.claude/hooks/session_start.py +939 -0
- package/.claude/hooks/skill_indexer.py +48 -0
- package/.claude/hooks/skill_router.py +358 -0
- package/.claude/hooks/stop_hook_completeness.py +187 -0
- package/.claude/hooks/user_prompt_submit.py +125 -0
- package/.claude/package.json +1 -0
- package/.claude/rules/ANTHROPIC-STANDARDS.md +384 -0
- package/.claude/rules/CLAUDE-LITE.md +201 -0
- package/.claude/rules/RULE-GROUP-1.md +320 -0
- package/.claude/rules/RULE-GROUP-2.md +307 -0
- package/.claude/rules/RULE-GROUP-3.md +248 -0
- package/.claude/rules/RULE-GROUP-4.md +427 -0
- package/.claude/rules/RULE-GROUP-5.md +388 -0
- package/.claude/rules/RULE-GROUP-6.md +387 -0
- package/.claude/rules/RULE-GSD-MANDATORY.md +106 -0
- package/.claude/rules/agent-cognition.md +779 -0
- package/.claude/rules/agent-integrity.md +692 -0
- package/.claude/rules/epistemic-standards.md +333 -0
- package/.claude/rules/logging.md +53 -0
- package/.claude/rules/mcp-governance.md +128 -0
- package/.claude/rules/pipeline.md +60 -0
- package/.claude/rules/state-management.md +93 -0
- package/.claude/scripts/apply-tags.py +77 -0
- package/.claude/scripts/batch-extract-transcriptions.py +132 -0
- package/.claude/scripts/build-complete-index.py +250 -0
- package/.claude/scripts/build-planilha-index.py +170 -0
- package/.claude/scripts/complete-tag-matching.py +250 -0
- package/.claude/scripts/deduplicate-inbox.py +139 -0
- package/.claude/scripts/docx-xml-extractor.py +141 -0
- package/.claude/scripts/extract-docx-text.py +58 -0
- package/.claude/scripts/extract-single-transcription.py +74 -0
- package/.claude/scripts/extract_docx_from_gdrive.py +77 -0
- package/.claude/scripts/jarvis_orchestrator.py +5 -0
- package/.claude/scripts/organized-downloader.py +246 -0
- package/.claude/scripts/planilha-tagger.py +187 -0
- package/.claude/scripts/revert-tags.py +70 -0
- package/.claude/scripts/source-sync.py +265 -0
- package/.claude/scripts/tag-inbox-files.py +276 -0
- package/.claude/scripts/tag-inbox-v2.py +253 -0
- package/.claude/scripts/test-extraction.py +35 -0
- package/.claude/scripts/test-full-extraction.py +74 -0
- package/.claude/scripts/validate_cascading_integrity.py +409 -0
- package/.claude/settings.json +215 -0
- package/.claude/skills/DETECTION-PROTOCOL.md +217 -0
- package/.claude/skills/README.md +240 -0
- package/.claude/skills/SKILL-REGISTRY.md +283 -0
- package/.claude/skills/SKILL-SUGGESTIONS.md +114 -0
- package/.claude/skills/_TEMPLATES/SKILL-WRITER-GUIDE.md +385 -0
- package/.claude/skills/agent-creation/SKILL.md +374 -0
- package/.claude/skills/ask-company/SKILL.md +198 -0
- package/.claude/skills/brainstorming/SKILL.md +72 -0
- package/.claude/skills/chronicler/SKILL.md +146 -0
- package/.claude/skills/chronicler/chronicler_core.py +468 -0
- package/.claude/skills/code-review/SKILL.md +160 -0
- package/.claude/skills/convert-to-company-docs/SKILL.md +68 -0
- package/.claude/skills/convert-to-company-docs/convert.py +532 -0
- package/.claude/skills/dispatching-parallel-agents/SKILL.md +193 -0
- package/.claude/skills/docs-megabrain/SKILL.md +251 -0
- package/.claude/skills/executing-plans/SKILL.md +114 -0
- package/.claude/skills/executor/SKILL.md +161 -0
- package/.claude/skills/fase-2-5-tagging/SKILL.md +182 -0
- package/.claude/skills/feature-dev/SKILL.md +154 -0
- package/.claude/skills/frontend-design/SKILL.md +165 -0
- package/.claude/skills/gdrive-transcription-downloader/SKILL.md +249 -0
- package/.claude/skills/gemini-fallback/SKILL.md +67 -0
- package/.claude/skills/gemini-fallback/gemini_fetch.py +0 -0
- package/.claude/skills/gha/SKILL.md +96 -0
- package/.claude/skills/gha/gha_diagnostic.py +227 -0
- package/.claude/skills/github-workflow/SKILL.md +190 -0
- package/.claude/skills/hookify/SKILL.md +134 -0
- package/.claude/skills/hybrid-source-reading/SKILL.md +265 -0
- package/.claude/skills/jarvis/SKILL.md +546 -0
- package/.claude/skills/jarvis-briefing/SKILL.md +340 -0
- package/.claude/skills/knowledge-extraction/SKILL.md +318 -0
- package/.claude/skills/ler-planilha/SKILL.md +281 -0
- package/.claude/skills/pipeline-jarvis/SKILL.md +430 -0
- package/.claude/skills/plugin-dev/SKILL.md +176 -0
- package/.claude/skills/pr-review-toolkit/SKILL.md +178 -0
- package/.claude/skills/process-company-inbox/SKILL.md +183 -0
- package/.claude/skills/python-megabrain/SKILL.md +323 -0
- package/.claude/skills/resume/SKILL.md +61 -0
- package/.claude/skills/save/SKILL.md +87 -0
- package/.claude/skills/skill-creator-internal/SKILL.md +186 -0
- package/.claude/skills/skill-writer/SKILL.md +153 -0
- package/.claude/skills/skill-writer/examples.md +191 -0
- package/.claude/skills/skill-writer/troubleshooting.md +205 -0
- package/.claude/skills/smart-download-tagger/SKILL.md +148 -0
- package/.claude/skills/source-sync/SKILL.md +240 -0
- package/.claude/skills/sync-docs/SKILL.md +193 -0
- package/.claude/skills/sync-docs/config.json +37 -0
- package/.claude/skills/sync-docs/gdrive_sync.py +358 -0
- package/.claude/skills/sync-docs/reauth.py +71 -0
- package/.claude/skills/using-superpowers/SKILL.md +105 -0
- package/.claude/skills/verification-before-completion/SKILL.md +130 -0
- package/.claude/skills/verify/SKILL.md +154 -0
- package/.claude/skills/verify/verify_runner.py +0 -0
- package/.claude/skills/verify-6-levels/SKILL.md +234 -0
- package/.claude/skills/writing-plans/SKILL.md +184 -0
- package/.claude/templates/BATCH-LOG-TEMPLATE.md +221 -0
- package/.claudeignore +9 -0
- package/.cursor/agents.yaml +44 -0
- package/.cursor/rules/mega-brain.md +39 -0
- package/.gitattributes +19 -0
- package/.github/CODEOWNERS +8 -0
- package/.github/ISSUE_TEMPLATE/agent.md +96 -0
- package/.github/ISSUE_TEMPLATE/bug.md +67 -0
- package/.github/ISSUE_TEMPLATE/feature.md +56 -0
- package/.github/ISSUE_TEMPLATE/pipeline.md +70 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +30 -0
- package/.github/assets/banner.svg +152 -0
- package/.github/assets/logo-dark.svg +79 -0
- package/.github/assets/social-preview.png +0 -0
- package/.github/layer1-allowlist.txt +196 -0
- package/.github/layer2-manifest.txt +42 -0
- package/.github/layer3-manifest.txt +94 -0
- package/.github/workflows/claude-code-pr.yml +198 -0
- package/.github/workflows/claude-code-review.yml +57 -0
- package/.github/workflows/claude.yml +76 -0
- package/.github/workflows/publish-pro.yml +72 -0
- package/.github/workflows/publish.yml +86 -0
- package/.github/workflows/verification.yml +251 -0
- package/.gitignore +244 -0
- package/.gitleaks.toml +118 -0
- package/.windsurf/agents.yaml +44 -0
- package/.windsurf/rules/mega-brain.md +39 -0
- package/CONTRIBUTING.md +62 -0
- package/QUICK-START.md +231 -0
- package/README.md +168 -0
- package/agents/AGENT-INDEX.yaml +107 -0
- package/agents/MASTER-AGENT.md +612 -0
- package/agents/README.md +48 -0
- package/agents/_templates/INDEX.md +741 -0
- package/agents/_templates/TEMPLATE-AGENT-MD-ULTRA-ROBUSTO-V3.md +2399 -0
- package/agents/boardroom/CHECKLIST-MASTER.md +281 -0
- package/agents/boardroom/INTEGRATION-GUIDE.md +406 -0
- package/agents/boardroom/README.md +238 -0
- package/agents/boardroom/config/BOARDROOM-CONFIG.md +186 -0
- package/agents/boardroom/config/TTS-INTEGRATION.md +258 -0
- package/agents/boardroom/config/VOICE-PROFILES.md +624 -0
- package/agents/boardroom/scripts/audio_generator.py +375 -0
- package/agents/boardroom/scripts/audio_generator_edge.py +353 -0
- package/agents/boardroom/scripts/jarvis_boardroom_hook.py +415 -0
- package/agents/boardroom/scripts/notebooklm_generator.py +578 -0
- package/agents/boardroom/templates/EPISODE-TEMPLATE.md +367 -0
- package/agents/boardroom/templates/scene-templates/SCENE-AGENT-DEBATE.md +252 -0
- package/agents/boardroom/templates/scene-templates/SCENE-COUNCIL.md +270 -0
- package/agents/boardroom/templates/scene-templates/SCENE-DNA-CONSULTATION.md +126 -0
- package/agents/boardroom/templates/scene-templates/SCENE-QUESTION.md +174 -0
- package/agents/boardroom/workflows/WORKFLOW-AUDIO-GENERATION.md +421 -0
- package/agents/conclave/CRITIC.md +197 -0
- package/agents/conclave/DEVILS-ADVOCATE.md +274 -0
- package/agents/conclave/README.md +35 -0
- package/agents/conclave/SYNTHESIZER.md +293 -0
- package/agents/conclave/advogado-do-diabo/AGENT.md +502 -0
- package/agents/conclave/advogado-do-diabo/SOUL.md +100 -0
- package/agents/conclave/critico-metodologico/AGENT.md +683 -0
- package/agents/conclave/critico-metodologico/SOUL.md +107 -0
- package/agents/conclave/sintetizador/AGENT.md +571 -0
- package/agents/conclave/sintetizador/SOUL.md +94 -0
- package/agents/constitution/BASE-CONSTITUTION.md +254 -0
- package/agents/persona-registry.yaml +300 -0
- package/agents/sua-empresa/.gitkeep +0 -0
- package/agents/sua-empresa/README.md +44 -0
- package/agents/sua-empresa/_example/jds/EXAMPLE-JD.md +42 -0
- package/agents/sua-empresa/_example/org/EXAMPLE-ORG.md +32 -0
- package/agents/sua-empresa/_example/roles/EXAMPLE-ROLE.md +38 -0
- package/artifacts/README.md +11 -0
- package/artifacts/canonical/.gitkeep +0 -0
- package/artifacts/chunks/.gitkeep +0 -0
- package/artifacts/insights/.gitkeep +0 -0
- package/artifacts/narratives/.gitkeep +0 -0
- package/bin/cli.js +2 -0
- package/bin/lib/ascii-art.js +202 -0
- package/bin/lib/feature-gate.js +46 -0
- package/bin/lib/installer.js +593 -0
- package/bin/lib/license.js +59 -0
- package/bin/lib/pro-commands.js +75 -0
- package/bin/lib/setup-wizard.js +547 -0
- package/bin/lib/validate-email.js +113 -0
- package/bin/mega-brain.js +136 -0
- package/bin/pre-publish-gate.js +229 -0
- package/bin/push.js +1056 -0
- package/bin/templates/env.example +27 -0
- package/bin/utils/pro-detector.js +50 -0
- package/bin/validate-package.js +190 -0
- package/core/__init__.py +2 -0
- package/core/glossary/INDEX.md +63 -0
- package/core/glossary/digital.md +243 -0
- package/core/glossary/finance.md +49 -0
- package/core/glossary/marketing.md +69 -0
- package/core/glossary/operations.md +50 -0
- package/core/glossary/sales.md +690 -0
- package/core/intelligence/__init__.py +41 -0
- package/core/intelligence/agent_trigger.py +468 -0
- package/core/intelligence/audit_layers.py +491 -0
- package/core/intelligence/autonomous_processor.py +796 -0
- package/core/intelligence/bootstrap_registry.py +550 -0
- package/core/intelligence/business_model_detector.py +476 -0
- package/core/intelligence/dossier_trigger.py +336 -0
- package/core/intelligence/entity_normalizer.py +565 -0
- package/core/intelligence/org_chain_detector.py +411 -0
- package/core/intelligence/review_dashboard.py +338 -0
- package/core/intelligence/role_detector.py +855 -0
- package/core/intelligence/session_autosave.py +46 -0
- package/core/intelligence/skill_generator.py +601 -0
- package/core/intelligence/sow_generator.py +711 -0
- package/core/intelligence/sync_package_files.py +504 -0
- package/core/intelligence/task_orchestrator.py +780 -0
- package/core/intelligence/theme_analyzer.py +562 -0
- package/core/intelligence/tool_discovery.py +432 -0
- package/core/intelligence/validate_json_integrity.py +106 -0
- package/core/intelligence/validate_layers.py +310 -0
- package/core/intelligence/verify_classifications.py +94 -0
- package/core/intelligence/viability_scorer.py +592 -0
- package/core/jarvis/02-JARVIS-SOUL.md +390 -0
- package/core/jarvis/03-JARVIS-DNA.yaml +312 -0
- package/core/jarvis/AGENT.md +191 -0
- package/core/jarvis/agent-creator/AGENT.md +199 -0
- package/core/jarvis/agent-creator/SOUL.md +82 -0
- package/core/jarvis/agent-creator/tasks/create-agent.md +133 -0
- package/core/jarvis/agent-creator/tasks/sync-agents.md +100 -0
- package/core/jarvis/agent-creator/workflows/wf-create-agent.yaml +110 -0
- package/core/jarvis/agent-creator/workflows/wf-pipeline-trigger.yaml +111 -0
- package/core/jarvis/autonomous/benchmark/AGENT.md +347 -0
- package/core/jarvis/autonomous/benchmark/SOUL.md +78 -0
- package/core/jarvis/autonomous/critic/AGENT.md +324 -0
- package/core/jarvis/autonomous/critic/SOUL.md +78 -0
- package/core/jarvis/autonomous/evolver/AGENT.md +294 -0
- package/core/jarvis/autonomous/evolver/SOUL.md +85 -0
- package/core/jarvis/autonomous/playbook-generator/AGENT.md +399 -0
- package/core/jarvis/autonomous/playbook-generator/SOUL.md +80 -0
- package/core/patterns/_ROLE_PATTERNS.yaml +547 -0
- package/core/patterns/quality_gates.yaml +259 -0
- package/core/patterns/trigger_config.yaml +193 -0
- package/core/schemas/SCHEMA-INDEX.md +94 -0
- package/core/schemas/canonical-map.schema.json +98 -0
- package/core/schemas/chunks-state.schema.json +131 -0
- package/core/schemas/decisions-registry.schema.json +120 -0
- package/core/schemas/file-registry.schema.json +69 -0
- package/core/schemas/insights-state.schema.json +111 -0
- package/core/schemas/narratives-state.schema.json +150 -0
- package/core/tasks/CHANGELOG.md +55 -0
- package/core/tasks/TASK-REGISTRY.md +113 -0
- package/core/tasks/_templates/task-tmpl.md +105 -0
- package/core/tasks/analyze-themes.md +84 -0
- package/core/tasks/detect-role.md +82 -0
- package/core/tasks/extract-dna.md +114 -0
- package/core/tasks/normalize-entities.md +82 -0
- package/core/tasks/process-batch.md +111 -0
- package/core/tasks/validate-cascade.md +105 -0
- package/core/templates/README.md +27 -0
- package/core/templates/agents/dna-config-template.yaml +181 -0
- package/core/templates/agents/enrichment-protocol.md +408 -0
- package/core/templates/agents/memory-template.md +567 -0
- package/core/templates/agents/reasoning-model.md +331 -0
- package/core/templates/agents/soul-template.md +416 -0
- package/core/templates/agents/template-evolution.md +544 -0
- package/core/templates/debates/CONCLAVE-LOG-TEMPLATE-v2.md +309 -0
- package/core/templates/debates/conclave-log-template.md +309 -0
- package/core/templates/debates/conclave-protocol.md +518 -0
- package/core/templates/debates/debate-dynamics-config.yaml +322 -0
- package/core/templates/debates/debate-dynamics.md +613 -0
- package/core/templates/debates/debate-protocol.md +323 -0
- package/core/templates/logs/LOG-TEMPLATES.md +1068 -0
- package/core/templates/logs/batch-visual-template.md +841 -0
- package/core/templates/logs/log-structure.md +65 -0
- package/core/templates/logs/visual-diff.md +159 -0
- package/core/templates/phases/dossier-compilation.md +790 -0
- package/core/templates/phases/narrative-metabolism.md +292 -0
- package/core/templates/phases/narrative-synthesis.md +278 -0
- package/core/templates/phases/phase4-checkpoint.md +146 -0
- package/core/templates/phases/prompt-1.1-chunking.md +154 -0
- package/core/templates/phases/prompt-1.2-entity-resolution.md +186 -0
- package/core/templates/phases/prompt-2.1-dna-tags.md +208 -0
- package/core/templates/phases/prompt-2.1-insight-extraction.md +191 -0
- package/core/templates/phases/prompt-3.1-narrative.md +331 -0
- package/core/templates/phases/sources-compilation.md +340 -0
- package/core/workflows/PIPELINE-JARVIS-DOCS.md +606 -0
- package/core/workflows/wf-conclave.yaml +139 -0
- package/core/workflows/wf-extract-dna.yaml +158 -0
- package/core/workflows/wf-ingest.yaml +88 -0
- package/core/workflows/wf-pipeline-full.yaml +138 -0
- package/docs/API-KEYS-GUIDE.md +372 -0
- package/docs/INTEGRATION-POINTS.md +501 -0
- package/docs/LAYERS.md +403 -0
- package/docs/PLAN-MODE-PROTOCOL.md +388 -0
- package/docs/RESTORE-AND-INDEX.md +203 -0
- package/docs/TAG-RESOLVER-IMPLEMENTATION.md +597 -0
- package/docs/conselho.md +337 -0
- package/docs/context7-readme.md +28 -0
- package/docs/jarvis-logging-protocol.md +380 -0
- package/docs/pipeline-completa-v4.md +1315 -0
- package/docs/prompts/meta_agente_mapeamento_processos.md +297 -0
- package/docs/quick-start.md +197 -0
- package/docs/readme-ralph-cascateamento.md +207 -0
- package/docs/template-master.md +727 -0
- package/docs/templates/phase5/IMPLEMENTATION-GUIDE.md +355 -0
- package/docs/templates/phase5/MOGA-BRAIN-PHASE5-TEMPLATES.md +1284 -0
- package/docs/templates/phase5/README.md +165 -0
- package/docs/workflow-continuous-claude.md +2232 -0
- package/inbox/.gitkeep +0 -0
- package/inbox/README.md +15 -0
- package/knowledge/NAVIGATION-MAP.json +292 -0
- package/knowledge/README.md +11 -0
- package/knowledge/dna/.gitkeep +0 -0
- package/knowledge/dossiers/persons/.gitkeep +0 -0
- package/knowledge/dossiers/system/.gitkeep +0 -0
- package/knowledge/dossiers/themes/.gitkeep +0 -0
- package/knowledge/playbooks/.gitkeep +0 -0
- package/knowledge/sources/.gitkeep +0 -0
- package/logs/.gitkeep +0 -0
- package/logs/README.md +11 -0
- package/package.json +180 -0
- package/requirements.txt +4 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Script para extrair texto de arquivos .docx baixados do Google Drive (base64)
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import base64
|
|
7
|
+
import zipfile
|
|
8
|
+
import io
|
|
9
|
+
import re
|
|
10
|
+
import sys
|
|
11
|
+
import os
|
|
12
|
+
|
|
13
|
+
def decode_base64_docx(base64_content):
|
|
14
|
+
"""Decodifica conteúdo base64 para bytes"""
|
|
15
|
+
# Remove possíveis prefixos de data URI
|
|
16
|
+
if ',' in base64_content:
|
|
17
|
+
base64_content = base64_content.split(',')[1]
|
|
18
|
+
|
|
19
|
+
# Remove whitespace
|
|
20
|
+
base64_content = base64_content.strip().replace('\n', '').replace('\r', '')
|
|
21
|
+
|
|
22
|
+
return base64.b64decode(base64_content)
|
|
23
|
+
|
|
24
|
+
def extract_text_from_docx_bytes(docx_bytes):
|
|
25
|
+
"""Extrai texto de um arquivo .docx (que é um ZIP)"""
|
|
26
|
+
try:
|
|
27
|
+
# Abre como ZIP
|
|
28
|
+
with zipfile.ZipFile(io.BytesIO(docx_bytes)) as zf:
|
|
29
|
+
# Lê word/document.xml
|
|
30
|
+
with zf.open('word/document.xml') as doc:
|
|
31
|
+
xml_content = doc.read().decode('utf-8')
|
|
32
|
+
|
|
33
|
+
# Remove tags XML, mantendo apenas texto
|
|
34
|
+
# Padrão para encontrar texto entre tags <w:t>
|
|
35
|
+
text_parts = re.findall(r'<w:t[^>]*>([^<]*)</w:t>', xml_content)
|
|
36
|
+
|
|
37
|
+
# Junta tudo
|
|
38
|
+
raw_text = ''.join(text_parts)
|
|
39
|
+
|
|
40
|
+
# Limpa e formata
|
|
41
|
+
# Substitui múltiplos espaços por um
|
|
42
|
+
text = re.sub(r' +', ' ', raw_text)
|
|
43
|
+
|
|
44
|
+
# Tenta preservar parágrafos baseado em padrões comuns
|
|
45
|
+
# Adiciona quebras antes de números que parecem timestamps ou marcadores
|
|
46
|
+
text = re.sub(r'(\d{1,2}:\d{2})', r'\n\1', text)
|
|
47
|
+
|
|
48
|
+
return text.strip()
|
|
49
|
+
|
|
50
|
+
except Exception as e:
|
|
51
|
+
return f"ERRO ao extrair texto: {str(e)}"
|
|
52
|
+
|
|
53
|
+
def process_file(base64_content, output_path):
|
|
54
|
+
"""Processa um arquivo: decode + extract + save"""
|
|
55
|
+
try:
|
|
56
|
+
# Decodifica base64
|
|
57
|
+
docx_bytes = decode_base64_docx(base64_content)
|
|
58
|
+
|
|
59
|
+
# Extrai texto
|
|
60
|
+
text = extract_text_from_docx_bytes(docx_bytes)
|
|
61
|
+
|
|
62
|
+
# Cria diretório se necessário
|
|
63
|
+
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
|
64
|
+
|
|
65
|
+
# Salva como .txt
|
|
66
|
+
with open(output_path, 'w', encoding='utf-8') as f:
|
|
67
|
+
f.write(text)
|
|
68
|
+
|
|
69
|
+
return True, len(text)
|
|
70
|
+
|
|
71
|
+
except Exception as e:
|
|
72
|
+
return False, str(e)
|
|
73
|
+
|
|
74
|
+
if __name__ == "__main__":
|
|
75
|
+
# Teste básico
|
|
76
|
+
if len(sys.argv) > 1:
|
|
77
|
+
print(f"Script pronto. Use as funções: decode_base64_docx, extract_text_from_docx_bytes, process_file")
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
ORGANIZED DOWNLOADER - Download com TAG
|
|
4
|
+
Mega Brain - Sistema de Inteligência de Negócios
|
|
5
|
+
|
|
6
|
+
Baixa arquivos do Google Drive JÁ com [TAG] no nome.
|
|
7
|
+
Organiza automaticamente em inbox/[SOURCE]/
|
|
8
|
+
|
|
9
|
+
USO: Este script é chamado pelo JARVIS via MCP, não diretamente.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import os
|
|
13
|
+
import json
|
|
14
|
+
import re
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
# Configurações
|
|
19
|
+
MEGA_BRAIN = "."
|
|
20
|
+
INBOX = f"{MEGA_BRAIN}/inbox"
|
|
21
|
+
MISSION_CONTROL = f"{MEGA_BRAIN}/.claude/mission-control"
|
|
22
|
+
PLANILHA_INDEX = f"{MISSION_CONTROL}/PLANILHA-INDEX.json"
|
|
23
|
+
DOWNLOAD_LOG = f"{MISSION_CONTROL}/DOWNLOAD-LOG.json"
|
|
24
|
+
|
|
25
|
+
# Mapeamento de prefixo → pasta no INBOX
|
|
26
|
+
PREFIX_TO_FOLDER = {
|
|
27
|
+
"JM": "JEREMY MINER",
|
|
28
|
+
"JH-ST": "JEREMY HAYNES/SALES TRAINING",
|
|
29
|
+
"JH-IC": "JEREMY HAYNES/INNER CIRCLE",
|
|
30
|
+
"JH-WK": "JEREMY HAYNES/WEEKLY CALLS",
|
|
31
|
+
"AOBA": "JEREMY HAYNES/AOBA",
|
|
32
|
+
"PCVP": "JEREMY HAYNES/PCVP",
|
|
33
|
+
"LYFC": "JEREMY HAYNES/LYFC",
|
|
34
|
+
"MMM": "JEREMY HAYNES/MMM",
|
|
35
|
+
"30DC": "JEREMY HAYNES/30DC",
|
|
36
|
+
"STA": "JEREMY HAYNES/STA",
|
|
37
|
+
"UHTC": "JEREMY HAYNES/UHTC",
|
|
38
|
+
"CG": "COLE GORDON",
|
|
39
|
+
"TSC": "COLE GORDON/TSC",
|
|
40
|
+
"EDC": "COLE GORDON/EAD",
|
|
41
|
+
"AH": "ALEX HORMOZI",
|
|
42
|
+
"CA": "JEREMY HAYNES PROGRAM"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def sanitize_filename(name):
|
|
47
|
+
"""Remove caracteres inválidos do nome do arquivo."""
|
|
48
|
+
invalid_chars = '<>:"/\\|?*'
|
|
49
|
+
for char in invalid_chars:
|
|
50
|
+
name = name.replace(char, '_')
|
|
51
|
+
return name.strip()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def get_folder_for_tag(tag):
|
|
55
|
+
"""Retorna pasta de destino baseada no prefixo da TAG."""
|
|
56
|
+
for prefix, folder in PREFIX_TO_FOLDER.items():
|
|
57
|
+
if tag.startswith(prefix + "-"):
|
|
58
|
+
return folder
|
|
59
|
+
return "OUTROS"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def format_tagged_filename(tag, original_name):
|
|
63
|
+
"""Formata nome do arquivo com TAG."""
|
|
64
|
+
clean_name = sanitize_filename(original_name)
|
|
65
|
+
return f"[{tag}] {clean_name}"
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def prepare_download_operations(tagged_entries):
|
|
69
|
+
"""
|
|
70
|
+
Prepara operações de download para MCP.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
tagged_entries: Lista de entradas já tagueadas na planilha
|
|
74
|
+
Formato: [{'tag': 'JM-0001', 'name': '...', 'file_id': '...', ...}]
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
Lista de operações de download
|
|
78
|
+
"""
|
|
79
|
+
operations = []
|
|
80
|
+
|
|
81
|
+
for entry in tagged_entries:
|
|
82
|
+
tag = entry.get('tag', '')
|
|
83
|
+
original_name = entry.get('name', entry.get('original_name', 'arquivo'))
|
|
84
|
+
file_id = entry.get('file_id', entry.get('drive_id', ''))
|
|
85
|
+
|
|
86
|
+
if not tag or not file_id:
|
|
87
|
+
continue
|
|
88
|
+
|
|
89
|
+
folder = get_folder_for_tag(tag)
|
|
90
|
+
dest_folder = os.path.join(INBOX, folder)
|
|
91
|
+
tagged_name = format_tagged_filename(tag, original_name)
|
|
92
|
+
dest_path = os.path.join(dest_folder, tagged_name)
|
|
93
|
+
|
|
94
|
+
operations.append({
|
|
95
|
+
'type': 'download',
|
|
96
|
+
'file_id': file_id,
|
|
97
|
+
'original_name': original_name,
|
|
98
|
+
'tagged_name': tagged_name,
|
|
99
|
+
'tag': tag,
|
|
100
|
+
'dest_folder': dest_folder,
|
|
101
|
+
'dest_path': dest_path,
|
|
102
|
+
'source': folder.split('/')[0] if '/' in folder else folder
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
return operations
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def ensure_folders_exist(operations):
|
|
109
|
+
"""Cria pastas de destino se não existirem."""
|
|
110
|
+
folders = set(op['dest_folder'] for op in operations)
|
|
111
|
+
created = []
|
|
112
|
+
|
|
113
|
+
for folder in folders:
|
|
114
|
+
if not os.path.exists(folder):
|
|
115
|
+
os.makedirs(folder, exist_ok=True)
|
|
116
|
+
created.append(folder)
|
|
117
|
+
|
|
118
|
+
return created
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def generate_download_report(operations):
|
|
122
|
+
"""Gera relatório de downloads."""
|
|
123
|
+
report = {
|
|
124
|
+
'timestamp': datetime.now().isoformat(),
|
|
125
|
+
'total_downloads': len(operations),
|
|
126
|
+
'by_source': {},
|
|
127
|
+
'operations': operations
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
for op in operations:
|
|
131
|
+
source = op['source']
|
|
132
|
+
if source not in report['by_source']:
|
|
133
|
+
report['by_source'][source] = 0
|
|
134
|
+
report['by_source'][source] += 1
|
|
135
|
+
|
|
136
|
+
return report
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def log_downloads(operations, success_ids):
|
|
140
|
+
"""Registra downloads realizados."""
|
|
141
|
+
log_path = DOWNLOAD_LOG
|
|
142
|
+
|
|
143
|
+
if os.path.exists(log_path):
|
|
144
|
+
with open(log_path, 'r', encoding='utf-8') as f:
|
|
145
|
+
log = json.load(f)
|
|
146
|
+
else:
|
|
147
|
+
log = {'downloads': [], 'stats': {'total': 0, 'by_date': {}}}
|
|
148
|
+
|
|
149
|
+
today = datetime.now().strftime('%Y-%m-%d')
|
|
150
|
+
|
|
151
|
+
for op in operations:
|
|
152
|
+
if op['file_id'] in success_ids:
|
|
153
|
+
log['downloads'].append({
|
|
154
|
+
'timestamp': datetime.now().isoformat(),
|
|
155
|
+
'tag': op['tag'],
|
|
156
|
+
'file_id': op['file_id'],
|
|
157
|
+
'dest_path': op['dest_path']
|
|
158
|
+
})
|
|
159
|
+
log['stats']['total'] += 1
|
|
160
|
+
|
|
161
|
+
if today not in log['stats']['by_date']:
|
|
162
|
+
log['stats']['by_date'][today] = 0
|
|
163
|
+
log['stats']['by_date'][today] += 1
|
|
164
|
+
|
|
165
|
+
with open(log_path, 'w', encoding='utf-8') as f:
|
|
166
|
+
json.dump(log, f, indent=2, ensure_ascii=False)
|
|
167
|
+
|
|
168
|
+
return log
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def update_planilha_index(operations, success_ids):
|
|
172
|
+
"""Atualiza índice da planilha com status de download."""
|
|
173
|
+
if not os.path.exists(PLANILHA_INDEX):
|
|
174
|
+
return
|
|
175
|
+
|
|
176
|
+
with open(PLANILHA_INDEX, 'r', encoding='utf-8') as f:
|
|
177
|
+
index = json.load(f)
|
|
178
|
+
|
|
179
|
+
downloaded_tags = {op['tag'] for op in operations if op['file_id'] in success_ids}
|
|
180
|
+
|
|
181
|
+
for entry in index.get('entries', []):
|
|
182
|
+
if entry.get('tag') in downloaded_tags:
|
|
183
|
+
entry['downloaded'] = True
|
|
184
|
+
entry['download_date'] = datetime.now().isoformat()
|
|
185
|
+
|
|
186
|
+
with open(PLANILHA_INDEX, 'w', encoding='utf-8') as f:
|
|
187
|
+
json.dump(index, f, indent=2, ensure_ascii=False)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def main(tagged_entries=None, preview=True):
|
|
191
|
+
"""
|
|
192
|
+
Função principal do downloader.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
tagged_entries: Lista de entradas já tagueadas
|
|
196
|
+
preview: Se True, apenas mostra relatório
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
Se preview=True: relatório
|
|
200
|
+
Se preview=False: lista de operações para MCP
|
|
201
|
+
"""
|
|
202
|
+
print("=" * 60)
|
|
203
|
+
print("ORGANIZED DOWNLOADER - Download com TAG")
|
|
204
|
+
print("=" * 60)
|
|
205
|
+
print()
|
|
206
|
+
|
|
207
|
+
if tagged_entries is None:
|
|
208
|
+
print("[MODO STANDALONE]")
|
|
209
|
+
print("Passe tagged_entries para executar.")
|
|
210
|
+
return None
|
|
211
|
+
|
|
212
|
+
operations = prepare_download_operations(tagged_entries)
|
|
213
|
+
|
|
214
|
+
if not operations:
|
|
215
|
+
print("✅ Nenhum download pendente!")
|
|
216
|
+
return []
|
|
217
|
+
|
|
218
|
+
report = generate_download_report(operations)
|
|
219
|
+
|
|
220
|
+
print(f"Downloads preparados: {report['total_downloads']}")
|
|
221
|
+
print()
|
|
222
|
+
print("Por fonte:")
|
|
223
|
+
for source, count in sorted(report['by_source'].items()):
|
|
224
|
+
print(f" {source}: {count}")
|
|
225
|
+
print()
|
|
226
|
+
|
|
227
|
+
if preview:
|
|
228
|
+
print("Arquivos:")
|
|
229
|
+
for i, op in enumerate(operations[:5], 1):
|
|
230
|
+
print(f" {i}. [{op['tag']}] → {op['source']}")
|
|
231
|
+
if len(operations) > 5:
|
|
232
|
+
print(f" ... e mais {len(operations) - 5}")
|
|
233
|
+
print()
|
|
234
|
+
print("MODO PREVIEW - Nenhum download realizado.")
|
|
235
|
+
return report
|
|
236
|
+
|
|
237
|
+
# Criar pastas
|
|
238
|
+
created_folders = ensure_folders_exist(operations)
|
|
239
|
+
if created_folders:
|
|
240
|
+
print(f"Pastas criadas: {len(created_folders)}")
|
|
241
|
+
|
|
242
|
+
return operations
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
if __name__ == '__main__':
|
|
246
|
+
main()
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
PLANILHA TAGGER - Tagueamento na Fonte
|
|
4
|
+
Mega Brain - Sistema de Inteligência de Negócios
|
|
5
|
+
|
|
6
|
+
Escreve TAGs diretamente na planilha de controle via MCP gdrive.
|
|
7
|
+
TAGs são escritas NA FONTE, não localmente.
|
|
8
|
+
|
|
9
|
+
USO: Este script é chamado pelo JARVIS via MCP, não diretamente.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import os
|
|
13
|
+
import json
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
# Configurações
|
|
18
|
+
MISSION_CONTROL = ".claude/mission-control"
|
|
19
|
+
PLANILHA_INDEX = f"{MISSION_CONTROL}/PLANILHA-INDEX.json"
|
|
20
|
+
SOURCE_SYNC_STATE = f"{MISSION_CONTROL}/SOURCE-SYNC-STATE.json"
|
|
21
|
+
|
|
22
|
+
# Mapeamento de abas → prefixos de TAG
|
|
23
|
+
SHEET_TO_PREFIX = {
|
|
24
|
+
"Jeremy Miner": "JM",
|
|
25
|
+
"Jeremy Haynes Sales Training": "JH-ST",
|
|
26
|
+
"Jeremy Haynes Inner Circle": "JH-IC",
|
|
27
|
+
"Inner Circle Weekly Group Call Recordings": "JH-WK",
|
|
28
|
+
"Agency Blueprint": "AOBA",
|
|
29
|
+
"Cold Video Pitch": "PCVP",
|
|
30
|
+
"Land Your First Agency Client": "LYFC",
|
|
31
|
+
"Marketer Mindset Masterclass": "MMM",
|
|
32
|
+
"30 Days Challenge": "30DC",
|
|
33
|
+
"Scale The Agency": "STA",
|
|
34
|
+
"Ultra High Ticket Closer": "UHTC",
|
|
35
|
+
"Cole Gordon": "CG",
|
|
36
|
+
"The Scalable Company": "TSC",
|
|
37
|
+
"Sales Training BR": "EDC",
|
|
38
|
+
"Alex Hormozi": "AH",
|
|
39
|
+
"Jeremy Haynes Program": "CA",
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
TAG_COLUMN = "I"
|
|
43
|
+
TAG_COLUMN_INDEX = 8
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def load_planilha_index():
|
|
47
|
+
"""Carrega índice da planilha."""
|
|
48
|
+
if os.path.exists(PLANILHA_INDEX):
|
|
49
|
+
with open(PLANILHA_INDEX, 'r', encoding='utf-8') as f:
|
|
50
|
+
return json.load(f)
|
|
51
|
+
return {"entries": [], "timestamp": None}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def get_existing_tags(index, prefix):
|
|
55
|
+
"""Retorna todas as TAGs existentes para um prefixo."""
|
|
56
|
+
tags = set()
|
|
57
|
+
for entry in index.get('entries', []):
|
|
58
|
+
tag = entry.get('tag', '')
|
|
59
|
+
if tag.startswith(prefix + "-"):
|
|
60
|
+
tags.add(tag)
|
|
61
|
+
return tags
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def generate_next_tag(prefix, existing_tags):
|
|
65
|
+
"""Gera próxima TAG sequencial para um prefixo."""
|
|
66
|
+
max_num = 0
|
|
67
|
+
for tag in existing_tags:
|
|
68
|
+
if tag.startswith(prefix + "-"):
|
|
69
|
+
try:
|
|
70
|
+
num_part = tag.split("-")[-1]
|
|
71
|
+
num = int(num_part)
|
|
72
|
+
if num > max_num:
|
|
73
|
+
max_num = num
|
|
74
|
+
except ValueError:
|
|
75
|
+
continue
|
|
76
|
+
return f"{prefix}-{str(max_num + 1).zfill(4)}"
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def identify_untagged_entries(delta_entries, index):
|
|
80
|
+
"""Identifica entradas que precisam de TAG."""
|
|
81
|
+
untagged = []
|
|
82
|
+
|
|
83
|
+
for entry in delta_entries:
|
|
84
|
+
if entry.get('tag') and entry['tag'].strip():
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
sheet_name = entry.get('sheet', '')
|
|
88
|
+
prefix = SHEET_TO_PREFIX.get(sheet_name)
|
|
89
|
+
|
|
90
|
+
if not prefix:
|
|
91
|
+
for sheet, pf in SHEET_TO_PREFIX.items():
|
|
92
|
+
if sheet.lower() in sheet_name.lower():
|
|
93
|
+
prefix = pf
|
|
94
|
+
break
|
|
95
|
+
|
|
96
|
+
if prefix:
|
|
97
|
+
untagged.append({
|
|
98
|
+
'entry': entry,
|
|
99
|
+
'prefix': prefix,
|
|
100
|
+
'sheet': sheet_name
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
return untagged
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def prepare_tag_operations(untagged, index):
|
|
107
|
+
"""Prepara operações de tagueamento para MCP."""
|
|
108
|
+
operations = []
|
|
109
|
+
by_prefix = {}
|
|
110
|
+
|
|
111
|
+
for item in untagged:
|
|
112
|
+
prefix = item['prefix']
|
|
113
|
+
if prefix not in by_prefix:
|
|
114
|
+
by_prefix[prefix] = []
|
|
115
|
+
by_prefix[prefix].append(item)
|
|
116
|
+
|
|
117
|
+
for prefix, items in by_prefix.items():
|
|
118
|
+
existing_tags = get_existing_tags(index, prefix)
|
|
119
|
+
|
|
120
|
+
for item in items:
|
|
121
|
+
new_tag = generate_next_tag(prefix, existing_tags)
|
|
122
|
+
existing_tags.add(new_tag)
|
|
123
|
+
|
|
124
|
+
entry = item['entry']
|
|
125
|
+
operations.append({
|
|
126
|
+
'type': 'write_tag',
|
|
127
|
+
'spreadsheet_id': entry.get('spreadsheet_id'),
|
|
128
|
+
'sheet_name': item['sheet'],
|
|
129
|
+
'row': entry.get('row'),
|
|
130
|
+
'column': TAG_COLUMN,
|
|
131
|
+
'range': f"'{item['sheet']}'!{TAG_COLUMN}{entry.get('row')}",
|
|
132
|
+
'value': new_tag,
|
|
133
|
+
'original_name': entry.get('name', ''),
|
|
134
|
+
'prefix': prefix
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
return operations
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def generate_tag_report(operations):
|
|
141
|
+
"""Gera relatório de operações de tagueamento."""
|
|
142
|
+
report = {
|
|
143
|
+
'timestamp': datetime.now().isoformat(),
|
|
144
|
+
'total_operations': len(operations),
|
|
145
|
+
'by_prefix': {},
|
|
146
|
+
'operations': operations
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
for op in operations:
|
|
150
|
+
prefix = op['prefix']
|
|
151
|
+
if prefix not in report['by_prefix']:
|
|
152
|
+
report['by_prefix'][prefix] = 0
|
|
153
|
+
report['by_prefix'][prefix] += 1
|
|
154
|
+
|
|
155
|
+
return report
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def main(delta_entries=None, preview=True):
|
|
159
|
+
"""Função principal do tagger."""
|
|
160
|
+
index = load_planilha_index()
|
|
161
|
+
|
|
162
|
+
if delta_entries is None:
|
|
163
|
+
print("PLANILHA TAGGER - Modo Standalone")
|
|
164
|
+
print("Passe delta_entries para executar.")
|
|
165
|
+
return None
|
|
166
|
+
|
|
167
|
+
untagged = identify_untagged_entries(delta_entries, index)
|
|
168
|
+
|
|
169
|
+
if not untagged:
|
|
170
|
+
print("✅ Todas as entradas já possuem TAG!")
|
|
171
|
+
return []
|
|
172
|
+
|
|
173
|
+
operations = prepare_tag_operations(untagged, index)
|
|
174
|
+
report = generate_tag_report(operations)
|
|
175
|
+
|
|
176
|
+
print(f"TAGs a escrever: {report['total_operations']}")
|
|
177
|
+
for prefix, count in sorted(report['by_prefix'].items()):
|
|
178
|
+
print(f" {prefix}: {count}")
|
|
179
|
+
|
|
180
|
+
if preview:
|
|
181
|
+
return None
|
|
182
|
+
|
|
183
|
+
return operations
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
if __name__ == '__main__':
|
|
187
|
+
main()
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
REVERT - Remove TAGs incorretas dos arquivos
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import re
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
INBOX_PATH = "inbox"
|
|
11
|
+
|
|
12
|
+
def revert_tags():
|
|
13
|
+
print("=" * 60)
|
|
14
|
+
print("REVERTENDO TAGS INCORRETAS")
|
|
15
|
+
print("=" * 60)
|
|
16
|
+
|
|
17
|
+
# Encontrar arquivos com TAG
|
|
18
|
+
tagged_files = []
|
|
19
|
+
pattern = re.compile(r'^\[[\w-]+\]\s*')
|
|
20
|
+
|
|
21
|
+
for root, dirs, files in os.walk(INBOX_PATH):
|
|
22
|
+
if '_BACKUP' in root or '_TEMPLATE' in root:
|
|
23
|
+
continue
|
|
24
|
+
for filename in files:
|
|
25
|
+
if pattern.match(filename):
|
|
26
|
+
tagged_files.append(Path(root) / filename)
|
|
27
|
+
|
|
28
|
+
print(f"\nEncontrados: {len(tagged_files)} arquivos com TAG")
|
|
29
|
+
|
|
30
|
+
# Reverter
|
|
31
|
+
success = 0
|
|
32
|
+
errors = []
|
|
33
|
+
|
|
34
|
+
for filepath in tagged_files:
|
|
35
|
+
old_name = filepath.name
|
|
36
|
+
# Remove [TAG] do início
|
|
37
|
+
new_name = pattern.sub('', old_name)
|
|
38
|
+
new_path = filepath.parent / new_name
|
|
39
|
+
|
|
40
|
+
# Verificar se destino já existe
|
|
41
|
+
if new_path.exists():
|
|
42
|
+
errors.append({'path': str(filepath), 'error': f'Destino já existe: {new_name}'})
|
|
43
|
+
continue
|
|
44
|
+
|
|
45
|
+
try:
|
|
46
|
+
filepath.rename(new_path)
|
|
47
|
+
success += 1
|
|
48
|
+
if success % 50 == 0:
|
|
49
|
+
print(f" Revertidos: {success}/{len(tagged_files)}")
|
|
50
|
+
except Exception as e:
|
|
51
|
+
errors.append({'path': str(filepath), 'error': str(e)})
|
|
52
|
+
|
|
53
|
+
print()
|
|
54
|
+
print("=" * 60)
|
|
55
|
+
print("RESULTADO")
|
|
56
|
+
print("=" * 60)
|
|
57
|
+
print(f" Sucesso: {success}")
|
|
58
|
+
print(f" Erros: {len(errors)}")
|
|
59
|
+
|
|
60
|
+
if errors:
|
|
61
|
+
print("\nERROS:")
|
|
62
|
+
for e in errors[:20]:
|
|
63
|
+
print(f" - {e['path']}: {e['error']}")
|
|
64
|
+
if len(errors) > 20:
|
|
65
|
+
print(f" ... e mais {len(errors) - 20} erros")
|
|
66
|
+
|
|
67
|
+
return success, errors
|
|
68
|
+
|
|
69
|
+
if __name__ == '__main__':
|
|
70
|
+
revert_tags()
|