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,193 @@
|
|
|
1
|
+
# SYNC-DOCS - Sincronizacao de Documentos [SUA EMPRESA]
|
|
2
|
+
|
|
3
|
+
## Trigger
|
|
4
|
+
`/sync-docs` ou `/sync-docs [caminho-do-arquivo]`
|
|
5
|
+
|
|
6
|
+
## Objetivo
|
|
7
|
+
Sincronizar arquivos .md selecionados com:
|
|
8
|
+
1. **Shared Drive [SUA EMPRESA]** (Google Drive via Service Account)
|
|
9
|
+
2. **Repositorio Mega Brain** (GitHub)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Pre-requisitos
|
|
14
|
+
|
|
15
|
+
1. Service Account Google configurada com acesso ao Shared Drive
|
|
16
|
+
2. Arquivo de credenciais JSON no caminho especificado em `config.json`
|
|
17
|
+
3. Git configurado e autenticado no repositorio
|
|
18
|
+
4. Python 3.x com dependencias instaladas
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Execucao
|
|
23
|
+
|
|
24
|
+
### 1. Selecao de Arquivos
|
|
25
|
+
|
|
26
|
+
**Com caminho especificado:**
|
|
27
|
+
```
|
|
28
|
+
/sync-docs [SUA EMPRESA]-CORE/templates/BILLION-TEMPLATES.md
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Sem caminho (selecao interativa):**
|
|
32
|
+
```
|
|
33
|
+
/sync-docs
|
|
34
|
+
```
|
|
35
|
+
- Listar .md disponiveis em locais comuns:
|
|
36
|
+
- `[SUA EMPRESA]-CORE/templates/`
|
|
37
|
+
- `[SUA EMPRESA]-CORE/knowledge/playbooks/`
|
|
38
|
+
- `.aios-core/docs/standards/`
|
|
39
|
+
- Usuario seleciona arquivo(s) para sincronizar
|
|
40
|
+
|
|
41
|
+
### 2. Validacao
|
|
42
|
+
|
|
43
|
+
Antes de sincronizar, validar:
|
|
44
|
+
```
|
|
45
|
+
[ ] Arquivo existe e e .md valido
|
|
46
|
+
[ ] Arquivo tem conteudo (nao vazio)
|
|
47
|
+
[ ] Arquivo nao contem dados sensiveis (checar por patterns)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 3. Sync Google Drive
|
|
51
|
+
|
|
52
|
+
**Processo:**
|
|
53
|
+
1. Autenticar via Service Account
|
|
54
|
+
2. Conectar ao Shared Drive [SUA EMPRESA]
|
|
55
|
+
3. Navegar para pasta destino (conforme config.json)
|
|
56
|
+
4. Upload ou update do arquivo
|
|
57
|
+
5. Capturar URL do arquivo no Drive
|
|
58
|
+
|
|
59
|
+
**Script de suporte:** `gdrive_sync.py`
|
|
60
|
+
|
|
61
|
+
### 4. Sync Repositorio
|
|
62
|
+
|
|
63
|
+
**Processo:**
|
|
64
|
+
1. `git add [caminho-do-arquivo]`
|
|
65
|
+
2. `git commit -m "docs: sync [nome-arquivo]"`
|
|
66
|
+
3. `git push origin main`
|
|
67
|
+
4. Capturar commit hash
|
|
68
|
+
|
|
69
|
+
### 5. Confirmacao
|
|
70
|
+
|
|
71
|
+
**Output de sucesso:**
|
|
72
|
+
```
|
|
73
|
+
SYNC COMPLETO
|
|
74
|
+
|
|
75
|
+
Google Drive: https://drive.google.com/file/d/[ID]
|
|
76
|
+
GitHub: commit [hash] em main
|
|
77
|
+
Timestamp: [YYYY-MM-DD HH:MM:SS]
|
|
78
|
+
|
|
79
|
+
Arquivo: [nome-do-arquivo]
|
|
80
|
+
Tamanho: [X] KB
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Output de erro:**
|
|
84
|
+
```
|
|
85
|
+
SYNC FALHOU
|
|
86
|
+
|
|
87
|
+
Etapa: [Google Drive | GitHub]
|
|
88
|
+
Erro: [mensagem de erro]
|
|
89
|
+
Acao: [sugestao de correcao]
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Configuracao
|
|
95
|
+
|
|
96
|
+
### config.json
|
|
97
|
+
Localizado em: `.claude/skills/sync-docs/config.json`
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"google": {
|
|
102
|
+
"credentials_path": "CAMINHO_DO_SERVICE_ACCOUNT_JSON",
|
|
103
|
+
"shared_drive_id": "ID_DO_SHARED_DRIVE_[SUA EMPRESA]",
|
|
104
|
+
"default_folder": "DOCUMENTACAO",
|
|
105
|
+
"folder_mapping": {
|
|
106
|
+
"templates": "Templates",
|
|
107
|
+
"playbooks": "Playbooks",
|
|
108
|
+
"standards": "Standards"
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"github": {
|
|
112
|
+
"repo": "Mega Brain",
|
|
113
|
+
"branch": "main",
|
|
114
|
+
"commit_prefix": "docs: sync",
|
|
115
|
+
"auto_push": true
|
|
116
|
+
},
|
|
117
|
+
"validation": {
|
|
118
|
+
"max_file_size_kb": 5000,
|
|
119
|
+
"sensitive_patterns": [
|
|
120
|
+
"API_KEY",
|
|
121
|
+
"SECRET",
|
|
122
|
+
"PASSWORD",
|
|
123
|
+
"CREDENTIALS"
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Mapeamento de Pastas
|
|
132
|
+
|
|
133
|
+
| Origem Local | Destino Google Drive |
|
|
134
|
+
|--------------|---------------------|
|
|
135
|
+
| `[SUA EMPRESA]-CORE/templates/` | Shared Drive > Templates |
|
|
136
|
+
| `[SUA EMPRESA]-CORE/knowledge/playbooks/` | Shared Drive > Playbooks |
|
|
137
|
+
| `.aios-core/docs/standards/` | Shared Drive > Standards |
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Uso Avancado
|
|
142
|
+
|
|
143
|
+
### Sync Multiplos Arquivos
|
|
144
|
+
```
|
|
145
|
+
/sync-docs [SUA EMPRESA]-CORE/templates/*.md
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Sync Apenas Google Drive
|
|
149
|
+
```
|
|
150
|
+
/sync-docs --drive-only [SUA EMPRESA]-CORE/templates/BILLION-TEMPLATES.md
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Sync Apenas GitHub
|
|
154
|
+
```
|
|
155
|
+
/sync-docs --git-only [SUA EMPRESA]-CORE/templates/BILLION-TEMPLATES.md
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Dry Run (sem executar)
|
|
159
|
+
```
|
|
160
|
+
/sync-docs --dry-run [SUA EMPRESA]-CORE/templates/BILLION-TEMPLATES.md
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Troubleshooting
|
|
166
|
+
|
|
167
|
+
| Problema | Causa | Solucao |
|
|
168
|
+
|----------|-------|---------|
|
|
169
|
+
| "Credenciais invalidas" | Service Account expirada ou path errado | Verificar config.json credentials_path |
|
|
170
|
+
| "Shared Drive nao encontrado" | ID incorreto ou sem permissao | Verificar shared_drive_id e permissoes |
|
|
171
|
+
| "Git push falhou" | Branch protegido ou conflito | Verificar permissoes e fazer pull primeiro |
|
|
172
|
+
| "Arquivo muito grande" | Excede max_file_size_kb | Aumentar limite ou dividir arquivo |
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Dependencias
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Checklist de Setup
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
[ ] Service Account criada no Google Cloud Console
|
|
188
|
+
[ ] Shared Drive [SUA EMPRESA] com permissao para Service Account
|
|
189
|
+
[ ] Arquivo JSON de credenciais baixado
|
|
190
|
+
[ ] config.json configurado com paths corretos
|
|
191
|
+
[ ] Dependencias Python instaladas
|
|
192
|
+
[ ] Git autenticado no repositorio
|
|
193
|
+
```
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"google": {
|
|
3
|
+
"oauth_keys_path": "~/.config/mcp-gdrive/gcp-oauth.keys.json",
|
|
4
|
+
"token_path": "~/.config/mcp-gdrive/.gdrive-server-credentials.json",
|
|
5
|
+
"target_folder_id": "YOUR_GOOGLE_DRIVE_FOLDER_ID",
|
|
6
|
+
"default_folder": "DOCUMENTACAO",
|
|
7
|
+
"folder_mapping": {
|
|
8
|
+
"templates": "Templates",
|
|
9
|
+
"playbooks": "Playbooks",
|
|
10
|
+
"standards": "Standards",
|
|
11
|
+
"knowledge": "Knowledge-Base",
|
|
12
|
+
"strategy": "Strategy",
|
|
13
|
+
"reports": "Reports"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"github": {
|
|
17
|
+
"repo": "Mega Brain",
|
|
18
|
+
"branch": "main",
|
|
19
|
+
"commit_prefix": "docs: sync",
|
|
20
|
+
"auto_push": true
|
|
21
|
+
},
|
|
22
|
+
"validation": {
|
|
23
|
+
"max_file_size_kb": 5000,
|
|
24
|
+
"sensitive_patterns": [
|
|
25
|
+
"API_KEY",
|
|
26
|
+
"SECRET",
|
|
27
|
+
"PASSWORD",
|
|
28
|
+
"CREDENTIALS",
|
|
29
|
+
"PRIVATE_KEY"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
"paths": {
|
|
33
|
+
"company_core": "/path/to/your/COMPANY-CORE",
|
|
34
|
+
"mega_brain": "/path/to/your/Mega-Brain",
|
|
35
|
+
"aios_core": "/path/to/your/.aios-core"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
GDRIVE SYNC - Sincronizacao de arquivos com Google Drive
|
|
4
|
+
Skill: /sync-docs
|
|
5
|
+
|
|
6
|
+
Usa autenticacao OAuth (access_token + refresh_token)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
import json
|
|
11
|
+
import sys
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from datetime import datetime
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
from google.oauth2.credentials import Credentials
|
|
17
|
+
from google.auth.transport.requests import Request
|
|
18
|
+
from googleapiclient.discovery import build
|
|
19
|
+
from googleapiclient.http import MediaFileUpload
|
|
20
|
+
except ImportError:
|
|
21
|
+
print("ERRO: Dependencias nao instaladas.")
|
|
22
|
+
print("Execute: pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib")
|
|
23
|
+
sys.exit(1)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class GDriveSync:
|
|
27
|
+
"""Sincronizador de arquivos com Google Drive usando OAuth."""
|
|
28
|
+
|
|
29
|
+
SCOPES = [
|
|
30
|
+
'https://www.googleapis.com/auth/drive',
|
|
31
|
+
'https://www.googleapis.com/auth/drive.file'
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
def __init__(self, config_path: str = None):
|
|
35
|
+
"""Inicializa com configuracao."""
|
|
36
|
+
self.config_path = config_path or self._default_config_path()
|
|
37
|
+
self.config = self._load_config()
|
|
38
|
+
self.service = None
|
|
39
|
+
self.credentials = None
|
|
40
|
+
|
|
41
|
+
def _default_config_path(self) -> str:
|
|
42
|
+
"""Retorna path padrao do config.json."""
|
|
43
|
+
skill_dir = Path(__file__).parent
|
|
44
|
+
return str(skill_dir / "config.json")
|
|
45
|
+
|
|
46
|
+
def _load_config(self) -> dict:
|
|
47
|
+
"""Carrega configuracao do config.json."""
|
|
48
|
+
if not os.path.exists(self.config_path):
|
|
49
|
+
raise FileNotFoundError(f"Config nao encontrado: {self.config_path}")
|
|
50
|
+
|
|
51
|
+
with open(self.config_path, 'r', encoding='utf-8') as f:
|
|
52
|
+
return json.load(f)
|
|
53
|
+
|
|
54
|
+
def authenticate(self) -> bool:
|
|
55
|
+
"""Autentica com OAuth tokens."""
|
|
56
|
+
try:
|
|
57
|
+
token_path = self.config['google']['token_path']
|
|
58
|
+
oauth_keys_path = self.config['google']['oauth_keys_path']
|
|
59
|
+
|
|
60
|
+
if not os.path.exists(token_path):
|
|
61
|
+
print(f"ERRO: Token nao encontrado: {token_path}")
|
|
62
|
+
return False
|
|
63
|
+
|
|
64
|
+
if not os.path.exists(oauth_keys_path):
|
|
65
|
+
print(f"ERRO: OAuth keys nao encontradas: {oauth_keys_path}")
|
|
66
|
+
return False
|
|
67
|
+
|
|
68
|
+
# Carrega tokens
|
|
69
|
+
with open(token_path, 'r') as f:
|
|
70
|
+
token_data = json.load(f)
|
|
71
|
+
|
|
72
|
+
# Carrega client info
|
|
73
|
+
with open(oauth_keys_path, 'r') as f:
|
|
74
|
+
oauth_data = json.load(f)
|
|
75
|
+
client_info = oauth_data.get('installed', oauth_data.get('web', {}))
|
|
76
|
+
|
|
77
|
+
# Cria credentials
|
|
78
|
+
self.credentials = Credentials(
|
|
79
|
+
token=token_data.get('access_token'),
|
|
80
|
+
refresh_token=token_data.get('refresh_token'),
|
|
81
|
+
token_uri=client_info.get('token_uri', 'https://oauth2.googleapis.com/token'),
|
|
82
|
+
client_id=client_info.get('client_id'),
|
|
83
|
+
client_secret=client_info.get('client_secret'),
|
|
84
|
+
scopes=self.SCOPES
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# Refresh se expirado
|
|
88
|
+
if self.credentials.expired and self.credentials.refresh_token:
|
|
89
|
+
print("Token expirado, renovando...")
|
|
90
|
+
self.credentials.refresh(Request())
|
|
91
|
+
# Salva novo token
|
|
92
|
+
new_token_data = {
|
|
93
|
+
'access_token': self.credentials.token,
|
|
94
|
+
'refresh_token': self.credentials.refresh_token,
|
|
95
|
+
'scope': ' '.join(self.SCOPES),
|
|
96
|
+
'token_type': 'Bearer',
|
|
97
|
+
'expiry_date': int(self.credentials.expiry.timestamp() * 1000) if self.credentials.expiry else None
|
|
98
|
+
}
|
|
99
|
+
with open(token_path, 'w') as f:
|
|
100
|
+
json.dump(new_token_data, f, indent=2)
|
|
101
|
+
print("Token renovado e salvo.")
|
|
102
|
+
|
|
103
|
+
self.service = build('drive', 'v3', credentials=self.credentials)
|
|
104
|
+
print("Autenticacao: OK")
|
|
105
|
+
return True
|
|
106
|
+
|
|
107
|
+
except Exception as e:
|
|
108
|
+
print(f"ERRO na autenticacao: {e}")
|
|
109
|
+
import traceback
|
|
110
|
+
traceback.print_exc()
|
|
111
|
+
return False
|
|
112
|
+
|
|
113
|
+
def find_folder(self, folder_name: str, parent_id: str = None) -> str:
|
|
114
|
+
"""Encontra pasta pelo nome."""
|
|
115
|
+
query = f"name='{folder_name}' and mimeType='application/vnd.google-apps.folder' and trashed=false"
|
|
116
|
+
|
|
117
|
+
if parent_id:
|
|
118
|
+
query += f" and '{parent_id}' in parents"
|
|
119
|
+
|
|
120
|
+
results = self.service.files().list(
|
|
121
|
+
q=query,
|
|
122
|
+
spaces='drive',
|
|
123
|
+
fields='files(id, name)',
|
|
124
|
+
supportsAllDrives=True,
|
|
125
|
+
includeItemsFromAllDrives=True
|
|
126
|
+
).execute()
|
|
127
|
+
|
|
128
|
+
files = results.get('files', [])
|
|
129
|
+
|
|
130
|
+
if files:
|
|
131
|
+
return files[0]['id']
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
def list_folder_contents(self, folder_id: str) -> list:
|
|
135
|
+
"""Lista conteudo de uma pasta."""
|
|
136
|
+
query = f"'{folder_id}' in parents and trashed=false"
|
|
137
|
+
|
|
138
|
+
results = self.service.files().list(
|
|
139
|
+
q=query,
|
|
140
|
+
spaces='drive',
|
|
141
|
+
fields='files(id, name, mimeType)',
|
|
142
|
+
supportsAllDrives=True,
|
|
143
|
+
includeItemsFromAllDrives=True
|
|
144
|
+
).execute()
|
|
145
|
+
|
|
146
|
+
return results.get('files', [])
|
|
147
|
+
|
|
148
|
+
def create_folder(self, folder_name: str, parent_id: str = None) -> str:
|
|
149
|
+
"""Cria pasta no Drive."""
|
|
150
|
+
file_metadata = {
|
|
151
|
+
'name': folder_name,
|
|
152
|
+
'mimeType': 'application/vnd.google-apps.folder'
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if parent_id:
|
|
156
|
+
file_metadata['parents'] = [parent_id]
|
|
157
|
+
|
|
158
|
+
folder = self.service.files().create(
|
|
159
|
+
body=file_metadata,
|
|
160
|
+
supportsAllDrives=True,
|
|
161
|
+
fields='id'
|
|
162
|
+
).execute()
|
|
163
|
+
|
|
164
|
+
return folder.get('id')
|
|
165
|
+
|
|
166
|
+
def get_or_create_folder(self, folder_name: str, parent_id: str = None) -> str:
|
|
167
|
+
"""Obtem ou cria pasta."""
|
|
168
|
+
folder_id = self.find_folder(folder_name, parent_id)
|
|
169
|
+
if folder_id:
|
|
170
|
+
return folder_id
|
|
171
|
+
return self.create_folder(folder_name, parent_id)
|
|
172
|
+
|
|
173
|
+
def file_exists(self, filename: str, folder_id: str) -> dict:
|
|
174
|
+
"""Verifica se arquivo existe na pasta."""
|
|
175
|
+
query = f"name='{filename}' and '{folder_id}' in parents and trashed=false"
|
|
176
|
+
|
|
177
|
+
results = self.service.files().list(
|
|
178
|
+
q=query,
|
|
179
|
+
spaces='drive',
|
|
180
|
+
fields='files(id, name, webViewLink)',
|
|
181
|
+
supportsAllDrives=True,
|
|
182
|
+
includeItemsFromAllDrives=True
|
|
183
|
+
).execute()
|
|
184
|
+
|
|
185
|
+
files = results.get('files', [])
|
|
186
|
+
|
|
187
|
+
if files:
|
|
188
|
+
return files[0]
|
|
189
|
+
return None
|
|
190
|
+
|
|
191
|
+
def upload_file(self, local_path: str, folder_id: str = None, folder_name: str = None) -> dict:
|
|
192
|
+
"""
|
|
193
|
+
Upload de arquivo para o Drive.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
local_path: Caminho local do arquivo
|
|
197
|
+
folder_id: ID da pasta destino (tem prioridade)
|
|
198
|
+
folder_name: Nome da pasta destino (usa se folder_id for None)
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
dict com id, name, webViewLink ou None se falhar
|
|
202
|
+
"""
|
|
203
|
+
if not os.path.exists(local_path):
|
|
204
|
+
print(f"ERRO: Arquivo nao encontrado: {local_path}")
|
|
205
|
+
return None
|
|
206
|
+
|
|
207
|
+
# Determina pasta destino
|
|
208
|
+
target_folder_id = folder_id
|
|
209
|
+
if not target_folder_id:
|
|
210
|
+
target_folder_id = self.config['google'].get('target_folder_id')
|
|
211
|
+
|
|
212
|
+
# Se folder_name especificado, busca/cria dentro do target
|
|
213
|
+
if folder_name and target_folder_id:
|
|
214
|
+
target_folder_id = self.get_or_create_folder(folder_name, target_folder_id)
|
|
215
|
+
|
|
216
|
+
filename = os.path.basename(local_path)
|
|
217
|
+
|
|
218
|
+
# Verifica se arquivo ja existe
|
|
219
|
+
existing = None
|
|
220
|
+
if target_folder_id:
|
|
221
|
+
existing = self.file_exists(filename, target_folder_id)
|
|
222
|
+
|
|
223
|
+
# Determina mimetype
|
|
224
|
+
if local_path.endswith('.md'):
|
|
225
|
+
mimetype = 'text/markdown'
|
|
226
|
+
elif local_path.endswith('.png'):
|
|
227
|
+
mimetype = 'image/png'
|
|
228
|
+
elif local_path.endswith('.json'):
|
|
229
|
+
mimetype = 'application/json'
|
|
230
|
+
elif local_path.endswith('.pdf'):
|
|
231
|
+
mimetype = 'application/pdf'
|
|
232
|
+
else:
|
|
233
|
+
mimetype = 'application/octet-stream'
|
|
234
|
+
|
|
235
|
+
media = MediaFileUpload(local_path, mimetype=mimetype, resumable=True)
|
|
236
|
+
|
|
237
|
+
try:
|
|
238
|
+
if existing:
|
|
239
|
+
# Update arquivo existente
|
|
240
|
+
file = self.service.files().update(
|
|
241
|
+
fileId=existing['id'],
|
|
242
|
+
media_body=media,
|
|
243
|
+
supportsAllDrives=True,
|
|
244
|
+
fields='id, name, webViewLink'
|
|
245
|
+
).execute()
|
|
246
|
+
print(f"Arquivo atualizado: {filename}")
|
|
247
|
+
else:
|
|
248
|
+
# Upload novo arquivo
|
|
249
|
+
file_metadata = {
|
|
250
|
+
'name': filename
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if target_folder_id:
|
|
254
|
+
file_metadata['parents'] = [target_folder_id]
|
|
255
|
+
|
|
256
|
+
file = self.service.files().create(
|
|
257
|
+
body=file_metadata,
|
|
258
|
+
media_body=media,
|
|
259
|
+
supportsAllDrives=True,
|
|
260
|
+
fields='id, name, webViewLink'
|
|
261
|
+
).execute()
|
|
262
|
+
print(f"Arquivo criado: {filename}")
|
|
263
|
+
|
|
264
|
+
return file
|
|
265
|
+
|
|
266
|
+
except Exception as e:
|
|
267
|
+
print(f"ERRO no upload: {e}")
|
|
268
|
+
import traceback
|
|
269
|
+
traceback.print_exc()
|
|
270
|
+
return None
|
|
271
|
+
|
|
272
|
+
def sync(self, local_path: str, folder_name: str = None) -> dict:
|
|
273
|
+
"""
|
|
274
|
+
Sincroniza arquivo com Google Drive.
|
|
275
|
+
|
|
276
|
+
Args:
|
|
277
|
+
local_path: Caminho local do arquivo
|
|
278
|
+
folder_name: Pasta destino no Drive (ex: "Strategy", "Reports")
|
|
279
|
+
|
|
280
|
+
Returns:
|
|
281
|
+
dict com resultado ou None
|
|
282
|
+
"""
|
|
283
|
+
print(f"\n=== SYNC GOOGLE DRIVE ===")
|
|
284
|
+
print(f"Arquivo: {local_path}")
|
|
285
|
+
|
|
286
|
+
# Autenticar
|
|
287
|
+
if not self.service:
|
|
288
|
+
if not self.authenticate():
|
|
289
|
+
return None
|
|
290
|
+
|
|
291
|
+
# Upload
|
|
292
|
+
result = self.upload_file(local_path, folder_name=folder_name)
|
|
293
|
+
|
|
294
|
+
if result:
|
|
295
|
+
print(f"URL: {result.get('webViewLink', 'N/A')}")
|
|
296
|
+
return {
|
|
297
|
+
'success': True,
|
|
298
|
+
'file_id': result.get('id'),
|
|
299
|
+
'file_name': result.get('name'),
|
|
300
|
+
'url': result.get('webViewLink'),
|
|
301
|
+
'timestamp': datetime.now().isoformat()
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return {
|
|
305
|
+
'success': False,
|
|
306
|
+
'error': 'Upload falhou',
|
|
307
|
+
'timestamp': datetime.now().isoformat()
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
def list_target_folder(self) -> list:
|
|
311
|
+
"""Lista conteudo da pasta alvo configurada."""
|
|
312
|
+
if not self.service:
|
|
313
|
+
if not self.authenticate():
|
|
314
|
+
return []
|
|
315
|
+
|
|
316
|
+
folder_id = self.config['google'].get('target_folder_id')
|
|
317
|
+
if not folder_id:
|
|
318
|
+
print("ERRO: target_folder_id nao configurado")
|
|
319
|
+
return []
|
|
320
|
+
|
|
321
|
+
return self.list_folder_contents(folder_id)
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def main():
|
|
325
|
+
"""CLI para sync manual."""
|
|
326
|
+
if len(sys.argv) < 2:
|
|
327
|
+
print("Uso: python gdrive_sync.py <caminho-do-arquivo> [pasta-destino]")
|
|
328
|
+
print("Exemplo: python gdrive_sync.py ./REPORT.md Strategy")
|
|
329
|
+
print("\nPara listar pasta alvo: python gdrive_sync.py --list")
|
|
330
|
+
sys.exit(1)
|
|
331
|
+
|
|
332
|
+
if sys.argv[1] == '--list':
|
|
333
|
+
syncer = GDriveSync()
|
|
334
|
+
contents = syncer.list_target_folder()
|
|
335
|
+
print("\n=== CONTEUDO DA PASTA ===")
|
|
336
|
+
for item in contents:
|
|
337
|
+
tipo = "PASTA" if item['mimeType'] == 'application/vnd.google-apps.folder' else "ARQUIVO"
|
|
338
|
+
print(f" [{tipo}] {item['name']}")
|
|
339
|
+
sys.exit(0)
|
|
340
|
+
|
|
341
|
+
file_path = sys.argv[1]
|
|
342
|
+
folder_name = sys.argv[2] if len(sys.argv) > 2 else None
|
|
343
|
+
|
|
344
|
+
syncer = GDriveSync()
|
|
345
|
+
result = syncer.sync(file_path, folder_name)
|
|
346
|
+
|
|
347
|
+
if result and result.get('success'):
|
|
348
|
+
print("\n=== SYNC COMPLETO ===")
|
|
349
|
+
print(f"URL: {result.get('url')}")
|
|
350
|
+
print(f"Timestamp: {result.get('timestamp')}")
|
|
351
|
+
else:
|
|
352
|
+
print("\n=== SYNC FALHOU ===")
|
|
353
|
+
print(f"Erro: {result.get('error') if result else 'Desconhecido'}")
|
|
354
|
+
sys.exit(1)
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
if __name__ == "__main__":
|
|
358
|
+
main()
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
GDRIVE REAUTH - Reautenticacao com escopo de escrita
|
|
4
|
+
Execute este script para obter novos tokens com permissao de upload.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import json
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
from google_auth_oauthlib.flow import InstalledAppFlow
|
|
13
|
+
except ImportError:
|
|
14
|
+
print("ERRO: Dependencias nao instaladas.")
|
|
15
|
+
print("Execute: pip install google-auth-oauthlib")
|
|
16
|
+
exit(1)
|
|
17
|
+
|
|
18
|
+
# Escopos necessarios para ESCRITA
|
|
19
|
+
SCOPES = [
|
|
20
|
+
'https://www.googleapis.com/auth/drive',
|
|
21
|
+
'https://www.googleapis.com/auth/drive.file'
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
# Paths
|
|
25
|
+
OAUTH_KEYS = Path(r"~/.config/mcp-gdrive/gcp-oauth.keys.json")
|
|
26
|
+
TOKEN_FILE = Path(r"~/.config/mcp-gdrive/.gdrive-server-credentials.json")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def main():
|
|
30
|
+
print("=== GOOGLE DRIVE REAUTH ===")
|
|
31
|
+
print(f"OAuth Keys: {OAUTH_KEYS}")
|
|
32
|
+
print(f"Token File: {TOKEN_FILE}")
|
|
33
|
+
print(f"Scopes: {SCOPES}")
|
|
34
|
+
print()
|
|
35
|
+
|
|
36
|
+
if not OAUTH_KEYS.exists():
|
|
37
|
+
print(f"ERRO: OAuth keys nao encontradas: {OAUTH_KEYS}")
|
|
38
|
+
return
|
|
39
|
+
|
|
40
|
+
# Inicia flow de autenticacao
|
|
41
|
+
flow = InstalledAppFlow.from_client_secrets_file(str(OAUTH_KEYS), SCOPES)
|
|
42
|
+
|
|
43
|
+
print("Abrindo navegador para autenticacao...")
|
|
44
|
+
print("Autorize o acesso ao Google Drive com permissao de ESCRITA.")
|
|
45
|
+
print()
|
|
46
|
+
|
|
47
|
+
# Executa autenticacao local
|
|
48
|
+
credentials = flow.run_local_server(port=8080)
|
|
49
|
+
|
|
50
|
+
# Salva novos tokens
|
|
51
|
+
token_data = {
|
|
52
|
+
'access_token': credentials.token,
|
|
53
|
+
'refresh_token': credentials.refresh_token,
|
|
54
|
+
'scope': ' '.join(SCOPES),
|
|
55
|
+
'token_type': 'Bearer',
|
|
56
|
+
'expiry_date': int(credentials.expiry.timestamp() * 1000) if credentials.expiry else None
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
with open(TOKEN_FILE, 'w') as f:
|
|
60
|
+
json.dump(token_data, f, indent=2)
|
|
61
|
+
|
|
62
|
+
print()
|
|
63
|
+
print("=== AUTENTICACAO CONCLUIDA ===")
|
|
64
|
+
print(f"Token salvo em: {TOKEN_FILE}")
|
|
65
|
+
print(f"Scopes: {SCOPES}")
|
|
66
|
+
print()
|
|
67
|
+
print("Agora voce pode usar /sync-docs para fazer upload!")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
if __name__ == "__main__":
|
|
71
|
+
main()
|