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,265 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
SOURCE SYNC - Detecção de Delta e Sincronização com Planilha
|
|
4
|
+
=============================================================
|
|
5
|
+
|
|
6
|
+
Este script:
|
|
7
|
+
1. Carrega o snapshot local (PLANILHA-INDEX.json)
|
|
8
|
+
2. Compara com o estado atual da planilha (via MCP)
|
|
9
|
+
3. Detecta arquivos NOVOS (delta)
|
|
10
|
+
4. Gera relatório visual
|
|
11
|
+
5. Opcionalmente executa tagueamento + download
|
|
12
|
+
|
|
13
|
+
Uso:
|
|
14
|
+
python source-sync.py --check # Apenas verificar
|
|
15
|
+
python source-sync.py --execute # Verificar + baixar
|
|
16
|
+
python source-sync.py --source=JM # Filtrar por fonte
|
|
17
|
+
|
|
18
|
+
Autor: JARVIS
|
|
19
|
+
Versão: 1.0.0
|
|
20
|
+
Data: 2026-01-13
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
import json
|
|
24
|
+
import os
|
|
25
|
+
import sys
|
|
26
|
+
from datetime import datetime
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import Dict, List, Optional, Tuple
|
|
29
|
+
|
|
30
|
+
#=================================
|
|
31
|
+
# CONFIGURAÇÃO
|
|
32
|
+
#=================================
|
|
33
|
+
|
|
34
|
+
MEGA_BRAIN_ROOT = Path(".")
|
|
35
|
+
MISSION_CONTROL = MEGA_BRAIN_ROOT / ".claude" / "mission-control"
|
|
36
|
+
INBOX_ROOT = MEGA_BRAIN_ROOT / "inbox"
|
|
37
|
+
|
|
38
|
+
# Arquivos de estado
|
|
39
|
+
PLANILHA_INDEX_FILE = MISSION_CONTROL / "PLANILHA-INDEX.json"
|
|
40
|
+
SYNC_STATE_FILE = MISSION_CONTROL / "SOURCE-SYNC-STATE.json"
|
|
41
|
+
DELTA_PENDING_FILE = MISSION_CONTROL / "DELTA-PENDING.json"
|
|
42
|
+
|
|
43
|
+
# ID da planilha principal
|
|
44
|
+
PLANILHA_ID = "[YOUR_SHEET_ID_HERE]"
|
|
45
|
+
|
|
46
|
+
#=================================
|
|
47
|
+
# MAPEAMENTO ABA → PREFIXO
|
|
48
|
+
#=================================
|
|
49
|
+
|
|
50
|
+
SHEET_TO_PREFIX: Dict[str, str] = {
|
|
51
|
+
"Jeremy Miner": "JM",
|
|
52
|
+
"Jeremy Haynes Sales Training": "JH-ST",
|
|
53
|
+
"Jeremy Haynes Inner Circle": "JH-IC",
|
|
54
|
+
"Inner Circle Weekly Group Call Recordings": "JH-WK",
|
|
55
|
+
"Agency Blueprint": "AOBA",
|
|
56
|
+
"Cold Video Pitch": "PCVP",
|
|
57
|
+
"Land Your First Agency Client": "LYFC",
|
|
58
|
+
"Marketer Mindset Masterclass": "MMM",
|
|
59
|
+
"30 Days Challenge": "30DC",
|
|
60
|
+
"Scale The Agency": "STA",
|
|
61
|
+
"Ultra High Ticket Closer": "UHTC",
|
|
62
|
+
"The Scalable Company": "TSC",
|
|
63
|
+
"Cole Gordon": "CG",
|
|
64
|
+
"Sales Training BR": "EDC",
|
|
65
|
+
"Alex Hormozi": "AH",
|
|
66
|
+
"Jeremy Haynes Program": "CA",
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# Mapeamento reverso para agrupamento
|
|
70
|
+
PREFIX_TO_SOURCE: Dict[str, str] = {
|
|
71
|
+
"JM": "JEREMY MINER",
|
|
72
|
+
"JH-ST": "JEREMY HAYNES (SALES TRAINING)",
|
|
73
|
+
"JH-IC": "JEREMY HAYNES (INNER CIRCLE)",
|
|
74
|
+
"JH-WK": "JEREMY HAYNES (WEEKLY CALLS)",
|
|
75
|
+
"AOBA": "AGENCY OWNERS BLUEPRINT",
|
|
76
|
+
"PCVP": "PERFECT COLD VIDEO PITCH",
|
|
77
|
+
"LYFC": "LAND YOUR FIRST CLIENT",
|
|
78
|
+
"MMM": "MARKETER MINDSET",
|
|
79
|
+
"30DC": "30 DAYS CHALLENGE",
|
|
80
|
+
"STA": "SCALE THE AGENCY",
|
|
81
|
+
"UHTC": "ULTRA HIGH TICKET CLOSER",
|
|
82
|
+
"TSC": "THE SCALABLE COMPANY",
|
|
83
|
+
"CG": "COLE GORDON",
|
|
84
|
+
"EDC": "SALES TRAINING BR",
|
|
85
|
+
"AH": "ALEX HORMOZI",
|
|
86
|
+
"CA": "JEREMY HAYNES PROGRAM",
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
#=================================
|
|
90
|
+
# FUNÇÕES AUXILIARES
|
|
91
|
+
#=================================
|
|
92
|
+
|
|
93
|
+
def load_json(path: Path) -> dict:
|
|
94
|
+
"""Carrega arquivo JSON com tratamento de erro."""
|
|
95
|
+
if not path.exists():
|
|
96
|
+
return {}
|
|
97
|
+
try:
|
|
98
|
+
with open(path, 'r', encoding='utf-8') as f:
|
|
99
|
+
return json.load(f)
|
|
100
|
+
except json.JSONDecodeError:
|
|
101
|
+
print(f"⚠️ Erro ao ler {path}")
|
|
102
|
+
return {}
|
|
103
|
+
|
|
104
|
+
def save_json(data: dict, path: Path) -> None:
|
|
105
|
+
"""Salva dados em arquivo JSON."""
|
|
106
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
107
|
+
with open(path, 'w', encoding='utf-8') as f:
|
|
108
|
+
json.dump(data, f, ensure_ascii=False, indent=2)
|
|
109
|
+
|
|
110
|
+
def generate_next_tag(prefix: str, existing_tags: List[str]) -> str:
|
|
111
|
+
"""Gera próxima TAG sequencial para um prefixo."""
|
|
112
|
+
# Extrair números existentes para este prefixo
|
|
113
|
+
existing_nums = []
|
|
114
|
+
for tag in existing_tags:
|
|
115
|
+
if tag.startswith(prefix + "-"):
|
|
116
|
+
try:
|
|
117
|
+
num = int(tag.split("-")[-1])
|
|
118
|
+
existing_nums.append(num)
|
|
119
|
+
except ValueError:
|
|
120
|
+
continue
|
|
121
|
+
|
|
122
|
+
# Próximo número
|
|
123
|
+
next_num = max(existing_nums, default=0) + 1
|
|
124
|
+
return f"{prefix}-{next_num:04d}"
|
|
125
|
+
|
|
126
|
+
#=================================
|
|
127
|
+
# FUNÇÕES PRINCIPAIS
|
|
128
|
+
#=================================
|
|
129
|
+
|
|
130
|
+
def load_snapshot() -> dict:
|
|
131
|
+
"""Carrega snapshot local da planilha."""
|
|
132
|
+
snapshot = load_json(PLANILHA_INDEX_FILE)
|
|
133
|
+
if not snapshot:
|
|
134
|
+
snapshot = {
|
|
135
|
+
"entries": [],
|
|
136
|
+
"timestamp": None,
|
|
137
|
+
"total_count": 0
|
|
138
|
+
}
|
|
139
|
+
return snapshot
|
|
140
|
+
|
|
141
|
+
def get_snapshot_tags(snapshot: dict) -> set:
|
|
142
|
+
"""Extrai conjunto de TAGs do snapshot."""
|
|
143
|
+
return {entry.get("tag") for entry in snapshot.get("entries", []) if entry.get("tag")}
|
|
144
|
+
|
|
145
|
+
def detect_delta(current_entries: List[dict], snapshot_tags: set) -> Tuple[List[dict], List[dict]]:
|
|
146
|
+
"""
|
|
147
|
+
Detecta delta entre estado atual e snapshot.
|
|
148
|
+
|
|
149
|
+
Retorna:
|
|
150
|
+
- novos_com_tag: Arquivos novos que JÁ têm TAG na planilha
|
|
151
|
+
- novos_sem_tag: Arquivos novos que PRECISAM de TAG
|
|
152
|
+
"""
|
|
153
|
+
novos_com_tag = []
|
|
154
|
+
novos_sem_tag = []
|
|
155
|
+
|
|
156
|
+
for entry in current_entries:
|
|
157
|
+
tag = entry.get("tag")
|
|
158
|
+
|
|
159
|
+
# Se não está no snapshot, é novo
|
|
160
|
+
if tag and tag not in snapshot_tags:
|
|
161
|
+
novos_com_tag.append(entry)
|
|
162
|
+
elif not tag:
|
|
163
|
+
novos_sem_tag.append(entry)
|
|
164
|
+
|
|
165
|
+
return novos_com_tag, novos_sem_tag
|
|
166
|
+
|
|
167
|
+
def group_by_source(entries: List[dict]) -> Dict[str, List[dict]]:
|
|
168
|
+
"""Agrupa entries por fonte/aba."""
|
|
169
|
+
grouped = {}
|
|
170
|
+
for entry in entries:
|
|
171
|
+
sheet = entry.get("sheet", "UNKNOWN")
|
|
172
|
+
if sheet not in grouped:
|
|
173
|
+
grouped[sheet] = []
|
|
174
|
+
grouped[sheet].append(entry)
|
|
175
|
+
return grouped
|
|
176
|
+
|
|
177
|
+
def print_report(novos_com_tag: List[dict], novos_sem_tag: List[dict]) -> None:
|
|
178
|
+
"""Exibe relatório visual do delta detectado."""
|
|
179
|
+
total_novos = len(novos_com_tag) + len(novos_sem_tag)
|
|
180
|
+
|
|
181
|
+
print()
|
|
182
|
+
print("╔" + "═" * 78 + "╗")
|
|
183
|
+
print("║" + "SOURCE SYNC - RELATÓRIO DE DELTA".center(78) + "║")
|
|
184
|
+
print("╠" + "═" * 78 + "╣")
|
|
185
|
+
print(f"║ NOVOS ARQUIVOS DETECTADOS: {total_novos:<48}║")
|
|
186
|
+
print("║" + " " * 78 + "║")
|
|
187
|
+
|
|
188
|
+
# Agrupar por fonte
|
|
189
|
+
all_novos = novos_com_tag + novos_sem_tag
|
|
190
|
+
grouped = group_by_source(all_novos)
|
|
191
|
+
|
|
192
|
+
print("║ POR FONTE:" + " " * 66 + "║")
|
|
193
|
+
for sheet, entries in sorted(grouped.items()):
|
|
194
|
+
prefix = SHEET_TO_PREFIX.get(sheet, "??")
|
|
195
|
+
line = f" ├── {sheet[:30]:<30} ({prefix}): {len(entries):>3} novos"
|
|
196
|
+
print(f"║{line:<78}║")
|
|
197
|
+
|
|
198
|
+
print("║" + " " * 78 + "║")
|
|
199
|
+
print("║ AÇÕES NECESSÁRIAS:" + " " * 58 + "║")
|
|
200
|
+
print(f"║ ├── TAGs a gerar: {len(novos_sem_tag):<3} (arquivos sem TAG)" + " " * 27 + "║")
|
|
201
|
+
print(f"║ ├── Downloads: {total_novos:<3} arquivos" + " " * 34 + "║")
|
|
202
|
+
print("║ └── Destino: inbox/[FONTE]/[TIPO]/" + " " * 38 + "║")
|
|
203
|
+
print("╚" + "═" * 78 + "╝")
|
|
204
|
+
print()
|
|
205
|
+
|
|
206
|
+
def update_sync_state(novos_count: int, status: str = "CHECKED") -> None:
|
|
207
|
+
"""Atualiza estado da sincronização."""
|
|
208
|
+
state = {
|
|
209
|
+
"last_sync": datetime.now().isoformat(),
|
|
210
|
+
"last_status": status,
|
|
211
|
+
"last_delta_count": novos_count,
|
|
212
|
+
"planilha_id": PLANILHA_ID
|
|
213
|
+
}
|
|
214
|
+
save_json(state, SYNC_STATE_FILE)
|
|
215
|
+
|
|
216
|
+
def save_delta_pending(novos_com_tag: List[dict], novos_sem_tag: List[dict]) -> None:
|
|
217
|
+
"""Salva delta pendente para processamento posterior."""
|
|
218
|
+
delta = {
|
|
219
|
+
"timestamp": datetime.now().isoformat(),
|
|
220
|
+
"com_tag": novos_com_tag,
|
|
221
|
+
"sem_tag": novos_sem_tag,
|
|
222
|
+
"total": len(novos_com_tag) + len(novos_sem_tag)
|
|
223
|
+
}
|
|
224
|
+
save_json(delta, DELTA_PENDING_FILE)
|
|
225
|
+
|
|
226
|
+
#=================================
|
|
227
|
+
# MAIN
|
|
228
|
+
#=================================
|
|
229
|
+
|
|
230
|
+
def main():
|
|
231
|
+
"""Função principal - executa detecção de delta."""
|
|
232
|
+
print("\n" + "=" * 80)
|
|
233
|
+
print("SOURCE SYNC - Detecção de Delta")
|
|
234
|
+
print("=" * 80)
|
|
235
|
+
|
|
236
|
+
# 1. Carregar snapshot
|
|
237
|
+
print("\n📁 Carregando snapshot local...")
|
|
238
|
+
snapshot = load_snapshot()
|
|
239
|
+
snapshot_tags = get_snapshot_tags(snapshot)
|
|
240
|
+
print(f" → {len(snapshot_tags)} TAGs no snapshot")
|
|
241
|
+
|
|
242
|
+
# 2. NOTA: A leitura real da planilha deve ser feita via MCP no Claude
|
|
243
|
+
print("\n⚠️ Este script prepara a estrutura de dados.")
|
|
244
|
+
print(" A leitura real da planilha deve ser feita via MCP gdrive.")
|
|
245
|
+
print(" Use o comando /source-sync no Claude para execução completa.")
|
|
246
|
+
|
|
247
|
+
# 3. Exibir estado atual
|
|
248
|
+
print("\n📊 Estado atual:")
|
|
249
|
+
print(f" → Snapshot: {PLANILHA_INDEX_FILE}")
|
|
250
|
+
print(f" → State: {SYNC_STATE_FILE}")
|
|
251
|
+
print(f" → Delta: {DELTA_PENDING_FILE}")
|
|
252
|
+
|
|
253
|
+
# 4. Verificar se há delta pendente
|
|
254
|
+
if DELTA_PENDING_FILE.exists():
|
|
255
|
+
delta = load_json(DELTA_PENDING_FILE)
|
|
256
|
+
if delta.get("total", 0) > 0:
|
|
257
|
+
print(f"\n⚠️ DELTA PENDENTE: {delta['total']} arquivos aguardando")
|
|
258
|
+
print(f" → Timestamp: {delta.get('timestamp', 'N/A')}")
|
|
259
|
+
|
|
260
|
+
print("\n" + "=" * 80)
|
|
261
|
+
print("Use /source-sync no Claude para sincronização completa via MCP")
|
|
262
|
+
print("=" * 80 + "\n")
|
|
263
|
+
|
|
264
|
+
if __name__ == "__main__":
|
|
265
|
+
main()
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
FASE 2.5 - Script de Tagueamento de Arquivos INBOX
|
|
4
|
+
Mega Brain - Sistema de Inteligencia de Negocios
|
|
5
|
+
|
|
6
|
+
Este script:
|
|
7
|
+
1. Le a planilha de controle e extrai mapeamento nome -> TAG
|
|
8
|
+
2. Varre todos os arquivos do INBOX recursivamente
|
|
9
|
+
3. Faz matching entre arquivos e TAGs
|
|
10
|
+
4. Renomeia arquivos com prefixo [TAG]
|
|
11
|
+
5. Gera relatorio de arquivos processados vs orfaos
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import os
|
|
15
|
+
import re
|
|
16
|
+
import json
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from datetime import datetime
|
|
19
|
+
|
|
20
|
+
# Configuracoes
|
|
21
|
+
INBOX_PATH = "inbox"
|
|
22
|
+
SCHEMA_PATH = ".claude/mission-control/SPREADSHEET-SCHEMA.json"
|
|
23
|
+
OUTPUT_PATH = ".claude/mission-control/TAG-MAPPING-REPORT.json"
|
|
24
|
+
|
|
25
|
+
# Mapeamento de pasta INBOX -> prefixo TAG
|
|
26
|
+
FOLDER_TO_PREFIX = {
|
|
27
|
+
"JEREMY MINER": "JM",
|
|
28
|
+
"JEREMY HAYNES": ["JH-ST", "JH-IC", "JH-WK", "AOBA", "PCVP", "LYFC", "MMM", "30DC", "STA", "UHTC"],
|
|
29
|
+
"THE SCALABLE COMPANY": "TSC",
|
|
30
|
+
"ALEX HORMOZI": "AH",
|
|
31
|
+
"JEREMY HAYNES PROGRAM": "CA",
|
|
32
|
+
"SAM OVEN (SETTERLUN UNIVERSITY)": None, # Nao tem na planilha ainda
|
|
33
|
+
"SETTERLUN (SETTERLUN UNIVERSITY)": None,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
def extract_number_from_filename(filename):
|
|
37
|
+
"""Extrai o numero do inicio do nome do arquivo."""
|
|
38
|
+
# Padroes comuns:
|
|
39
|
+
# "6 - 42 Minutes of Sales Training.txt"
|
|
40
|
+
# "112. How To Get Prospects.txt"
|
|
41
|
+
# "44 - LIVE CALL A Masterclass.txt"
|
|
42
|
+
|
|
43
|
+
patterns = [
|
|
44
|
+
r'^(\d+)\s*[-\.]\s*', # "123 - " ou "123. "
|
|
45
|
+
r'^(\d+)\.\s*', # "123. "
|
|
46
|
+
r'^(\d+)\s+', # "123 "
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
for pattern in patterns:
|
|
50
|
+
match = re.match(pattern, filename)
|
|
51
|
+
if match:
|
|
52
|
+
return int(match.group(1))
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
def clean_filename_for_matching(filename):
|
|
56
|
+
"""Limpa o nome do arquivo para facilitar matching."""
|
|
57
|
+
# Remove extensao
|
|
58
|
+
name = os.path.splitext(filename)[0]
|
|
59
|
+
# Remove timestamps no final
|
|
60
|
+
name = re.sub(r'_\d{14}$', '', name)
|
|
61
|
+
# Remove numero inicial
|
|
62
|
+
name = re.sub(r'^\d+\s*[-\.]\s*', '', name)
|
|
63
|
+
# Lowercase e remove caracteres especiais
|
|
64
|
+
name = name.lower()
|
|
65
|
+
name = re.sub(r'[^\w\s]', ' ', name)
|
|
66
|
+
name = re.sub(r'\s+', ' ', name).strip()
|
|
67
|
+
return name
|
|
68
|
+
|
|
69
|
+
def determine_prefix_from_path(filepath):
|
|
70
|
+
"""Determina o prefixo TAG baseado no caminho do arquivo."""
|
|
71
|
+
path_str = str(filepath).upper()
|
|
72
|
+
|
|
73
|
+
for folder, prefix in FOLDER_TO_PREFIX.items():
|
|
74
|
+
if folder in path_str:
|
|
75
|
+
return prefix
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
def scan_inbox_files():
|
|
79
|
+
"""Varre todos os arquivos do INBOX recursivamente."""
|
|
80
|
+
files = []
|
|
81
|
+
extensions = {'.txt', '.docx', '.pdf'}
|
|
82
|
+
|
|
83
|
+
for root, dirs, filenames in os.walk(INBOX_PATH):
|
|
84
|
+
# Ignorar pastas de backup/template
|
|
85
|
+
if '_BACKUP' in root or '_TEMPLATE' in root:
|
|
86
|
+
continue
|
|
87
|
+
|
|
88
|
+
for filename in filenames:
|
|
89
|
+
ext = os.path.splitext(filename)[1].lower()
|
|
90
|
+
if ext in extensions:
|
|
91
|
+
filepath = Path(root) / filename
|
|
92
|
+
|
|
93
|
+
# Verificar se ja tem TAG no nome
|
|
94
|
+
has_tag = bool(re.match(r'^\[[\w-]+\]', filename))
|
|
95
|
+
|
|
96
|
+
files.append({
|
|
97
|
+
'path': str(filepath),
|
|
98
|
+
'filename': filename,
|
|
99
|
+
'folder': os.path.basename(root),
|
|
100
|
+
'parent_folder': os.path.basename(os.path.dirname(root)),
|
|
101
|
+
'number': extract_number_from_filename(filename),
|
|
102
|
+
'clean_name': clean_filename_for_matching(filename),
|
|
103
|
+
'has_tag': has_tag,
|
|
104
|
+
'suggested_prefix': determine_prefix_from_path(filepath)
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
return files
|
|
108
|
+
|
|
109
|
+
def generate_tag_from_number(prefix, number):
|
|
110
|
+
"""Gera TAG no formato [PREFIX]-[NNNN]."""
|
|
111
|
+
if isinstance(prefix, list):
|
|
112
|
+
prefix = prefix[0] # Usar primeiro prefixo como padrao
|
|
113
|
+
return f"{prefix}-{number:04d}"
|
|
114
|
+
|
|
115
|
+
def rename_file_with_tag(filepath, tag):
|
|
116
|
+
"""Renomeia arquivo adicionando prefixo [TAG]."""
|
|
117
|
+
path = Path(filepath)
|
|
118
|
+
new_name = f"[{tag}] {path.name}"
|
|
119
|
+
new_path = path.parent / new_name
|
|
120
|
+
|
|
121
|
+
# Verificar se destino ja existe
|
|
122
|
+
if new_path.exists():
|
|
123
|
+
return None, "Destino ja existe"
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
path.rename(new_path)
|
|
127
|
+
return str(new_path), None
|
|
128
|
+
except Exception as e:
|
|
129
|
+
return None, str(e)
|
|
130
|
+
|
|
131
|
+
def execute_rename(report, dry_run=False):
|
|
132
|
+
"""Executa a renomeacao dos arquivos."""
|
|
133
|
+
print()
|
|
134
|
+
print("=" * 60)
|
|
135
|
+
print("EXECUTANDO RENOMEACAO" + (" (DRY RUN)" if dry_run else ""))
|
|
136
|
+
print("=" * 60)
|
|
137
|
+
print()
|
|
138
|
+
|
|
139
|
+
success = 0
|
|
140
|
+
errors = []
|
|
141
|
+
|
|
142
|
+
for item in report['to_tag']:
|
|
143
|
+
filepath = item['current_path']
|
|
144
|
+
tag = item['suggested_tag']
|
|
145
|
+
|
|
146
|
+
if dry_run:
|
|
147
|
+
path = Path(filepath)
|
|
148
|
+
new_name = f"[{tag}] {path.name}"
|
|
149
|
+
print(f" [DRY] {path.name}")
|
|
150
|
+
print(f" -> {new_name}")
|
|
151
|
+
success += 1
|
|
152
|
+
else:
|
|
153
|
+
new_path, error = rename_file_with_tag(filepath, tag)
|
|
154
|
+
if error:
|
|
155
|
+
errors.append({'path': filepath, 'error': error})
|
|
156
|
+
print(f" [ERRO] {item['filename']}: {error}")
|
|
157
|
+
else:
|
|
158
|
+
success += 1
|
|
159
|
+
if success % 50 == 0:
|
|
160
|
+
print(f" Renomeados: {success}/{len(report['to_tag'])}")
|
|
161
|
+
|
|
162
|
+
print()
|
|
163
|
+
print("=" * 60)
|
|
164
|
+
print("RESULTADO")
|
|
165
|
+
print("=" * 60)
|
|
166
|
+
print(f" Sucesso: {success}")
|
|
167
|
+
print(f" Erros: {len(errors)}")
|
|
168
|
+
|
|
169
|
+
if errors:
|
|
170
|
+
print()
|
|
171
|
+
print("ERROS:")
|
|
172
|
+
for e in errors[:10]: # Mostrar apenas primeiros 10
|
|
173
|
+
print(f" - {e['path']}: {e['error']}")
|
|
174
|
+
if len(errors) > 10:
|
|
175
|
+
print(f" ... e mais {len(errors) - 10} erros")
|
|
176
|
+
|
|
177
|
+
return success, errors
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def main(execute=False, dry_run=False):
|
|
181
|
+
print("=" * 60)
|
|
182
|
+
print("FASE 2.5 - TAGUEAMENTO DE ARQUIVOS INBOX")
|
|
183
|
+
print("=" * 60)
|
|
184
|
+
print()
|
|
185
|
+
|
|
186
|
+
# 1. Carregar schema
|
|
187
|
+
print("[1/4] Carregando schema...")
|
|
188
|
+
with open(SCHEMA_PATH, 'r', encoding='utf-8') as f:
|
|
189
|
+
schema = json.load(f)
|
|
190
|
+
|
|
191
|
+
# 2. Escanear arquivos
|
|
192
|
+
print("[2/4] Escaneando INBOX...")
|
|
193
|
+
files = scan_inbox_files()
|
|
194
|
+
print(f" Encontrados: {len(files)} arquivos")
|
|
195
|
+
|
|
196
|
+
# 3. Classificar arquivos
|
|
197
|
+
print("[3/4] Classificando arquivos...")
|
|
198
|
+
|
|
199
|
+
already_tagged = [f for f in files if f['has_tag']]
|
|
200
|
+
to_tag = [f for f in files if not f['has_tag'] and f['suggested_prefix'] and f['number']]
|
|
201
|
+
orphans = [f for f in files if not f['has_tag'] and (not f['suggested_prefix'] or not f['number'])]
|
|
202
|
+
|
|
203
|
+
print(f" Ja tagueados: {len(already_tagged)}")
|
|
204
|
+
print(f" Para taguear: {len(to_tag)}")
|
|
205
|
+
print(f" Orfaos: {len(orphans)}")
|
|
206
|
+
|
|
207
|
+
# 4. Gerar relatorio
|
|
208
|
+
print("[4/4] Gerando relatorio...")
|
|
209
|
+
|
|
210
|
+
report = {
|
|
211
|
+
'timestamp': datetime.now().isoformat(),
|
|
212
|
+
'summary': {
|
|
213
|
+
'total_files': len(files),
|
|
214
|
+
'already_tagged': len(already_tagged),
|
|
215
|
+
'to_tag': len(to_tag),
|
|
216
|
+
'orphans': len(orphans)
|
|
217
|
+
},
|
|
218
|
+
'to_tag': [],
|
|
219
|
+
'orphans': []
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
for f in to_tag:
|
|
223
|
+
prefix = f['suggested_prefix']
|
|
224
|
+
if isinstance(prefix, list):
|
|
225
|
+
prefix = prefix[0]
|
|
226
|
+
tag = generate_tag_from_number(prefix, f['number'])
|
|
227
|
+
report['to_tag'].append({
|
|
228
|
+
'current_path': f['path'],
|
|
229
|
+
'suggested_tag': tag,
|
|
230
|
+
'filename': f['filename'],
|
|
231
|
+
'folder': f['folder']
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
for f in orphans:
|
|
235
|
+
report['orphans'].append({
|
|
236
|
+
'path': f['path'],
|
|
237
|
+
'filename': f['filename'],
|
|
238
|
+
'folder': f['folder'],
|
|
239
|
+
'reason': 'Sem prefixo conhecido' if not f['suggested_prefix'] else 'Sem numero no nome'
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
# Salvar relatorio
|
|
243
|
+
with open(OUTPUT_PATH, 'w', encoding='utf-8') as f:
|
|
244
|
+
json.dump(report, f, ensure_ascii=False, indent=2)
|
|
245
|
+
|
|
246
|
+
print()
|
|
247
|
+
print("=" * 60)
|
|
248
|
+
print("RELATORIO GERADO")
|
|
249
|
+
print("=" * 60)
|
|
250
|
+
print(f"Arquivo: {OUTPUT_PATH}")
|
|
251
|
+
|
|
252
|
+
# 5. Executar renomeacao se solicitado
|
|
253
|
+
if execute:
|
|
254
|
+
success, errors = execute_rename(report, dry_run)
|
|
255
|
+
report['execution'] = {
|
|
256
|
+
'success': success,
|
|
257
|
+
'errors': len(errors),
|
|
258
|
+
'error_details': errors
|
|
259
|
+
}
|
|
260
|
+
# Atualizar relatorio com resultado
|
|
261
|
+
with open(OUTPUT_PATH, 'w', encoding='utf-8') as f:
|
|
262
|
+
json.dump(report, f, ensure_ascii=False, indent=2)
|
|
263
|
+
else:
|
|
264
|
+
print()
|
|
265
|
+
print("PROXIMO PASSO: Executar com --execute para renomear")
|
|
266
|
+
print(" Ou --dry-run para simular")
|
|
267
|
+
|
|
268
|
+
print()
|
|
269
|
+
return report
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
if __name__ == '__main__':
|
|
273
|
+
import sys
|
|
274
|
+
execute = '--execute' in sys.argv
|
|
275
|
+
dry_run = '--dry-run' in sys.argv
|
|
276
|
+
main(execute=execute, dry_run=dry_run)
|