mega-brain-ai 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.antigravity/README.md +46 -0
- package/.antigravity/rules/.gitkeep +0 -0
- package/.antigravity/rules/mega-brain.md +39 -0
- package/.claude/CLAUDE.md +172 -0
- package/.claude/agents.yaml +44 -0
- package/.claude/commands/agents.md +161 -0
- package/.claude/commands/ask.md +117 -0
- package/.claude/commands/benchmark.md +224 -0
- package/.claude/commands/chat.md +343 -0
- package/.claude/commands/compare.md +116 -0
- package/.claude/commands/conclave.md +196 -0
- package/.claude/commands/config.md +133 -0
- package/.claude/commands/create-agent.md +467 -0
- package/.claude/commands/debate.md +159 -0
- package/.claude/commands/documentation/create-architecture-documentation.md +175 -0
- package/.claude/commands/dossiers.md +180 -0
- package/.claude/commands/evolve.md +223 -0
- package/.claude/commands/extract-dna.md +172 -0
- package/.claude/commands/extract-knowledge.md +507 -0
- package/.claude/commands/gsd/add-phase.md +43 -0
- package/.claude/commands/gsd/add-tests.md +41 -0
- package/.claude/commands/gsd/add-todo.md +47 -0
- package/.claude/commands/gsd/audit-milestone.md +36 -0
- package/.claude/commands/gsd/check-todos.md +45 -0
- package/.claude/commands/gsd/cleanup.md +18 -0
- package/.claude/commands/gsd/complete-milestone.md +136 -0
- package/.claude/commands/gsd/debug.md +167 -0
- package/.claude/commands/gsd/discuss-phase.md +83 -0
- package/.claude/commands/gsd/execute-phase.md +41 -0
- package/.claude/commands/gsd/health.md +22 -0
- package/.claude/commands/gsd/help.md +22 -0
- package/.claude/commands/gsd/insert-phase.md +32 -0
- package/.claude/commands/gsd/join-discord.md +18 -0
- package/.claude/commands/gsd/list-phase-assumptions.md +46 -0
- package/.claude/commands/gsd/map-codebase.md +71 -0
- package/.claude/commands/gsd/new-milestone.md +44 -0
- package/.claude/commands/gsd/new-project.md +42 -0
- package/.claude/commands/gsd/pause-work.md +38 -0
- package/.claude/commands/gsd/plan-milestone-gaps.md +34 -0
- package/.claude/commands/gsd/plan-phase.md +45 -0
- package/.claude/commands/gsd/progress.md +24 -0
- package/.claude/commands/gsd/quick.md +41 -0
- package/.claude/commands/gsd/reapply-patches.md +110 -0
- package/.claude/commands/gsd/remove-phase.md +31 -0
- package/.claude/commands/gsd/research-phase.md +189 -0
- package/.claude/commands/gsd/resume-work.md +40 -0
- package/.claude/commands/gsd/set-profile.md +34 -0
- package/.claude/commands/gsd/settings.md +36 -0
- package/.claude/commands/gsd/update.md +37 -0
- package/.claude/commands/gsd/verify-work.md +38 -0
- package/.claude/commands/inbox.md +296 -0
- package/.claude/commands/ingest-empresa.md +191 -0
- package/.claude/commands/ingest.md +183 -0
- package/.claude/commands/jarvis-briefing.md +67 -0
- package/.claude/commands/jarvis-control.md +169 -0
- package/.claude/commands/jarvis-full.md +182 -0
- package/.claude/commands/jarvis.md +212 -0
- package/.claude/commands/ler-drive.md +212 -0
- package/.claude/commands/log.md +158 -0
- package/.claude/commands/loop.md +133 -0
- package/.claude/commands/loops.md +73 -0
- package/.claude/commands/mission-autopilot.md +538 -0
- package/.claude/commands/mission.md +353 -0
- package/.claude/commands/process-inbox.md +148 -0
- package/.claude/commands/process-jarvis.md +3036 -0
- package/.claude/commands/process-video.md +131 -0
- package/.claude/commands/rag-search.md +78 -0
- package/.claude/commands/resume.md +33 -0
- package/.claude/commands/save.md +38 -0
- package/.claude/commands/scan-inbox.md +125 -0
- package/.claude/commands/setup.md +99 -0
- package/.claude/commands/system-digest.md +243 -0
- package/.claude/commands/verify.md +182 -0
- package/.claude/commands/view-dna.md +169 -0
- package/.claude/get-shit-done/VERSION +1 -0
- package/.claude/get-shit-done/bin/gsd-tools.cjs +588 -0
- package/.claude/get-shit-done/bin/lib/commands.cjs +553 -0
- package/.claude/get-shit-done/bin/lib/config.cjs +162 -0
- package/.claude/get-shit-done/bin/lib/core.cjs +411 -0
- package/.claude/get-shit-done/bin/lib/frontmatter.cjs +299 -0
- package/.claude/get-shit-done/bin/lib/init.cjs +710 -0
- package/.claude/get-shit-done/bin/lib/milestone.cjs +216 -0
- package/.claude/get-shit-done/bin/lib/phase.cjs +871 -0
- package/.claude/get-shit-done/bin/lib/roadmap.cjs +298 -0
- package/.claude/get-shit-done/bin/lib/state.cjs +679 -0
- package/.claude/get-shit-done/bin/lib/template.cjs +222 -0
- package/.claude/get-shit-done/bin/lib/verify.cjs +773 -0
- package/.claude/get-shit-done/references/checkpoints.md +776 -0
- package/.claude/get-shit-done/references/continuation-format.md +249 -0
- package/.claude/get-shit-done/references/decimal-phase-calculation.md +65 -0
- package/.claude/get-shit-done/references/git-integration.md +248 -0
- package/.claude/get-shit-done/references/git-planning-commit.md +38 -0
- package/.claude/get-shit-done/references/model-profile-resolution.md +34 -0
- package/.claude/get-shit-done/references/model-profiles.md +92 -0
- package/.claude/get-shit-done/references/phase-argument-parsing.md +61 -0
- package/.claude/get-shit-done/references/planning-config.md +196 -0
- package/.claude/get-shit-done/references/questioning.md +145 -0
- package/.claude/get-shit-done/references/tdd.md +263 -0
- package/.claude/get-shit-done/references/ui-brand.md +160 -0
- package/.claude/get-shit-done/references/verification-patterns.md +612 -0
- package/.claude/get-shit-done/templates/DEBUG.md +164 -0
- package/.claude/get-shit-done/templates/UAT.md +247 -0
- package/.claude/get-shit-done/templates/VALIDATION.md +76 -0
- package/.claude/get-shit-done/templates/codebase/architecture.md +255 -0
- package/.claude/get-shit-done/templates/codebase/concerns.md +310 -0
- package/.claude/get-shit-done/templates/codebase/conventions.md +307 -0
- package/.claude/get-shit-done/templates/codebase/integrations.md +280 -0
- package/.claude/get-shit-done/templates/codebase/stack.md +186 -0
- package/.claude/get-shit-done/templates/codebase/structure.md +285 -0
- package/.claude/get-shit-done/templates/codebase/testing.md +480 -0
- package/.claude/get-shit-done/templates/config.json +37 -0
- package/.claude/get-shit-done/templates/context.md +283 -0
- package/.claude/get-shit-done/templates/continue-here.md +78 -0
- package/.claude/get-shit-done/templates/debug-subagent-prompt.md +91 -0
- package/.claude/get-shit-done/templates/discovery.md +146 -0
- package/.claude/get-shit-done/templates/milestone-archive.md +123 -0
- package/.claude/get-shit-done/templates/milestone.md +115 -0
- package/.claude/get-shit-done/templates/phase-prompt.md +569 -0
- package/.claude/get-shit-done/templates/planner-subagent-prompt.md +117 -0
- package/.claude/get-shit-done/templates/project.md +184 -0
- package/.claude/get-shit-done/templates/requirements.md +231 -0
- package/.claude/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
- package/.claude/get-shit-done/templates/research-project/FEATURES.md +147 -0
- package/.claude/get-shit-done/templates/research-project/PITFALLS.md +200 -0
- package/.claude/get-shit-done/templates/research-project/STACK.md +120 -0
- package/.claude/get-shit-done/templates/research-project/SUMMARY.md +170 -0
- package/.claude/get-shit-done/templates/research.md +552 -0
- package/.claude/get-shit-done/templates/retrospective.md +54 -0
- package/.claude/get-shit-done/templates/roadmap.md +202 -0
- package/.claude/get-shit-done/templates/state.md +176 -0
- package/.claude/get-shit-done/templates/summary-complex.md +59 -0
- package/.claude/get-shit-done/templates/summary-minimal.md +41 -0
- package/.claude/get-shit-done/templates/summary-standard.md +48 -0
- package/.claude/get-shit-done/templates/summary.md +248 -0
- package/.claude/get-shit-done/templates/user-setup.md +311 -0
- package/.claude/get-shit-done/templates/verification-report.md +322 -0
- package/.claude/get-shit-done/workflows/add-phase.md +111 -0
- package/.claude/get-shit-done/workflows/add-tests.md +350 -0
- package/.claude/get-shit-done/workflows/add-todo.md +157 -0
- package/.claude/get-shit-done/workflows/audit-milestone.md +297 -0
- package/.claude/get-shit-done/workflows/check-todos.md +176 -0
- package/.claude/get-shit-done/workflows/cleanup.md +152 -0
- package/.claude/get-shit-done/workflows/complete-milestone.md +763 -0
- package/.claude/get-shit-done/workflows/diagnose-issues.md +219 -0
- package/.claude/get-shit-done/workflows/discovery-phase.md +289 -0
- package/.claude/get-shit-done/workflows/discuss-phase.md +542 -0
- package/.claude/get-shit-done/workflows/execute-phase.md +449 -0
- package/.claude/get-shit-done/workflows/execute-plan.md +448 -0
- package/.claude/get-shit-done/workflows/health.md +156 -0
- package/.claude/get-shit-done/workflows/help.md +489 -0
- package/.claude/get-shit-done/workflows/insert-phase.md +129 -0
- package/.claude/get-shit-done/workflows/list-phase-assumptions.md +178 -0
- package/.claude/get-shit-done/workflows/map-codebase.md +315 -0
- package/.claude/get-shit-done/workflows/new-milestone.md +382 -0
- package/.claude/get-shit-done/workflows/new-project.md +1116 -0
- package/.claude/get-shit-done/workflows/pause-work.md +122 -0
- package/.claude/get-shit-done/workflows/plan-milestone-gaps.md +274 -0
- package/.claude/get-shit-done/workflows/plan-phase.md +569 -0
- package/.claude/get-shit-done/workflows/progress.md +381 -0
- package/.claude/get-shit-done/workflows/quick.md +453 -0
- package/.claude/get-shit-done/workflows/remove-phase.md +154 -0
- package/.claude/get-shit-done/workflows/research-phase.md +73 -0
- package/.claude/get-shit-done/workflows/resume-project.md +306 -0
- package/.claude/get-shit-done/workflows/set-profile.md +80 -0
- package/.claude/get-shit-done/workflows/settings.md +213 -0
- package/.claude/get-shit-done/workflows/transition.md +544 -0
- package/.claude/get-shit-done/workflows/update.md +219 -0
- package/.claude/get-shit-done/workflows/verify-phase.md +242 -0
- package/.claude/get-shit-done/workflows/verify-work.md +569 -0
- package/.claude/gsd-file-manifest.json +144 -0
- package/.claude/hooks/agent_creation_trigger.py +168 -0
- package/.claude/hooks/agent_index_updater.py +255 -0
- package/.claude/hooks/agent_memory_persister.py +203 -0
- package/.claude/hooks/claude_md_agent_sync.py +162 -0
- package/.claude/hooks/claude_md_guard.py +154 -0
- package/.claude/hooks/continuous_save.py +414 -0
- package/.claude/hooks/creation_validator.py +360 -0
- package/.claude/hooks/enforce_dual_location.py +501 -0
- package/.claude/hooks/enforce_plan_mode.py +220 -0
- package/.claude/hooks/gsd-check-update.js +62 -0
- package/.claude/hooks/gsd-context-monitor.js +122 -0
- package/.claude/hooks/gsd-statusline.js +108 -0
- package/.claude/hooks/inbox_age_alert.py +367 -0
- package/.claude/hooks/ledger_updater.py +303 -0
- package/.claude/hooks/memory_hints_injector.py +251 -0
- package/.claude/hooks/memory_updater.py +202 -0
- package/.claude/hooks/notification_system.py +115 -0
- package/.claude/hooks/pending_tracker.py +188 -0
- package/.claude/hooks/pipeline_checkpoint.py +583 -0
- package/.claude/hooks/post_batch_cascading.py +1740 -0
- package/.claude/hooks/post_tool_use.py +120 -0
- package/.claude/hooks/quality_watchdog.py +394 -0
- package/.claude/hooks/ralph_wiggum.py +286 -0
- package/.claude/hooks/session-source-sync.py +223 -0
- package/.claude/hooks/session_autosave_v2.py +1135 -0
- package/.claude/hooks/session_end.py +203 -0
- package/.claude/hooks/session_start.py +939 -0
- package/.claude/hooks/skill_indexer.py +48 -0
- package/.claude/hooks/skill_router.py +358 -0
- package/.claude/hooks/stop_hook_completeness.py +187 -0
- package/.claude/hooks/user_prompt_submit.py +125 -0
- package/.claude/package.json +1 -0
- package/.claude/rules/ANTHROPIC-STANDARDS.md +384 -0
- package/.claude/rules/CLAUDE-LITE.md +201 -0
- package/.claude/rules/RULE-GROUP-1.md +320 -0
- package/.claude/rules/RULE-GROUP-2.md +307 -0
- package/.claude/rules/RULE-GROUP-3.md +248 -0
- package/.claude/rules/RULE-GROUP-4.md +427 -0
- package/.claude/rules/RULE-GROUP-5.md +388 -0
- package/.claude/rules/RULE-GROUP-6.md +387 -0
- package/.claude/rules/RULE-GSD-MANDATORY.md +106 -0
- package/.claude/rules/agent-cognition.md +779 -0
- package/.claude/rules/agent-integrity.md +692 -0
- package/.claude/rules/epistemic-standards.md +333 -0
- package/.claude/rules/logging.md +53 -0
- package/.claude/rules/mcp-governance.md +128 -0
- package/.claude/rules/pipeline.md +60 -0
- package/.claude/rules/state-management.md +93 -0
- package/.claude/scripts/apply-tags.py +77 -0
- package/.claude/scripts/batch-extract-transcriptions.py +132 -0
- package/.claude/scripts/build-complete-index.py +250 -0
- package/.claude/scripts/build-planilha-index.py +170 -0
- package/.claude/scripts/complete-tag-matching.py +250 -0
- package/.claude/scripts/deduplicate-inbox.py +139 -0
- package/.claude/scripts/docx-xml-extractor.py +141 -0
- package/.claude/scripts/extract-docx-text.py +58 -0
- package/.claude/scripts/extract-single-transcription.py +74 -0
- package/.claude/scripts/extract_docx_from_gdrive.py +77 -0
- package/.claude/scripts/jarvis_orchestrator.py +5 -0
- package/.claude/scripts/organized-downloader.py +246 -0
- package/.claude/scripts/planilha-tagger.py +187 -0
- package/.claude/scripts/revert-tags.py +70 -0
- package/.claude/scripts/source-sync.py +265 -0
- package/.claude/scripts/tag-inbox-files.py +276 -0
- package/.claude/scripts/tag-inbox-v2.py +253 -0
- package/.claude/scripts/test-extraction.py +35 -0
- package/.claude/scripts/test-full-extraction.py +74 -0
- package/.claude/scripts/validate_cascading_integrity.py +409 -0
- package/.claude/settings.json +215 -0
- package/.claude/skills/DETECTION-PROTOCOL.md +217 -0
- package/.claude/skills/README.md +240 -0
- package/.claude/skills/SKILL-REGISTRY.md +283 -0
- package/.claude/skills/SKILL-SUGGESTIONS.md +114 -0
- package/.claude/skills/_TEMPLATES/SKILL-WRITER-GUIDE.md +385 -0
- package/.claude/skills/agent-creation/SKILL.md +374 -0
- package/.claude/skills/ask-company/SKILL.md +198 -0
- package/.claude/skills/brainstorming/SKILL.md +72 -0
- package/.claude/skills/chronicler/SKILL.md +146 -0
- package/.claude/skills/chronicler/chronicler_core.py +468 -0
- package/.claude/skills/code-review/SKILL.md +160 -0
- package/.claude/skills/convert-to-company-docs/SKILL.md +68 -0
- package/.claude/skills/convert-to-company-docs/convert.py +532 -0
- package/.claude/skills/dispatching-parallel-agents/SKILL.md +193 -0
- package/.claude/skills/docs-megabrain/SKILL.md +251 -0
- package/.claude/skills/executing-plans/SKILL.md +114 -0
- package/.claude/skills/executor/SKILL.md +161 -0
- package/.claude/skills/fase-2-5-tagging/SKILL.md +182 -0
- package/.claude/skills/feature-dev/SKILL.md +154 -0
- package/.claude/skills/frontend-design/SKILL.md +165 -0
- package/.claude/skills/gdrive-transcription-downloader/SKILL.md +249 -0
- package/.claude/skills/gemini-fallback/SKILL.md +67 -0
- package/.claude/skills/gemini-fallback/gemini_fetch.py +0 -0
- package/.claude/skills/gha/SKILL.md +96 -0
- package/.claude/skills/gha/gha_diagnostic.py +227 -0
- package/.claude/skills/github-workflow/SKILL.md +190 -0
- package/.claude/skills/hookify/SKILL.md +134 -0
- package/.claude/skills/hybrid-source-reading/SKILL.md +265 -0
- package/.claude/skills/jarvis/SKILL.md +546 -0
- package/.claude/skills/jarvis-briefing/SKILL.md +340 -0
- package/.claude/skills/knowledge-extraction/SKILL.md +318 -0
- package/.claude/skills/ler-planilha/SKILL.md +281 -0
- package/.claude/skills/pipeline-jarvis/SKILL.md +430 -0
- package/.claude/skills/plugin-dev/SKILL.md +176 -0
- package/.claude/skills/pr-review-toolkit/SKILL.md +178 -0
- package/.claude/skills/process-company-inbox/SKILL.md +183 -0
- package/.claude/skills/python-megabrain/SKILL.md +323 -0
- package/.claude/skills/resume/SKILL.md +61 -0
- package/.claude/skills/save/SKILL.md +87 -0
- package/.claude/skills/skill-creator-internal/SKILL.md +186 -0
- package/.claude/skills/skill-writer/SKILL.md +153 -0
- package/.claude/skills/skill-writer/examples.md +191 -0
- package/.claude/skills/skill-writer/troubleshooting.md +205 -0
- package/.claude/skills/smart-download-tagger/SKILL.md +148 -0
- package/.claude/skills/source-sync/SKILL.md +240 -0
- package/.claude/skills/sync-docs/SKILL.md +193 -0
- package/.claude/skills/sync-docs/config.json +37 -0
- package/.claude/skills/sync-docs/gdrive_sync.py +358 -0
- package/.claude/skills/sync-docs/reauth.py +71 -0
- package/.claude/skills/using-superpowers/SKILL.md +105 -0
- package/.claude/skills/verification-before-completion/SKILL.md +130 -0
- package/.claude/skills/verify/SKILL.md +154 -0
- package/.claude/skills/verify/verify_runner.py +0 -0
- package/.claude/skills/verify-6-levels/SKILL.md +234 -0
- package/.claude/skills/writing-plans/SKILL.md +184 -0
- package/.claude/templates/BATCH-LOG-TEMPLATE.md +221 -0
- package/.claudeignore +9 -0
- package/.cursor/agents.yaml +44 -0
- package/.cursor/rules/mega-brain.md +39 -0
- package/.gitattributes +19 -0
- package/.github/CODEOWNERS +8 -0
- package/.github/ISSUE_TEMPLATE/agent.md +96 -0
- package/.github/ISSUE_TEMPLATE/bug.md +67 -0
- package/.github/ISSUE_TEMPLATE/feature.md +56 -0
- package/.github/ISSUE_TEMPLATE/pipeline.md +70 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +30 -0
- package/.github/assets/banner.svg +152 -0
- package/.github/assets/logo-dark.svg +79 -0
- package/.github/assets/social-preview.png +0 -0
- package/.github/layer1-allowlist.txt +196 -0
- package/.github/layer2-manifest.txt +42 -0
- package/.github/layer3-manifest.txt +94 -0
- package/.github/workflows/claude-code-pr.yml +198 -0
- package/.github/workflows/claude-code-review.yml +57 -0
- package/.github/workflows/claude.yml +76 -0
- package/.github/workflows/publish-pro.yml +72 -0
- package/.github/workflows/publish.yml +86 -0
- package/.github/workflows/verification.yml +251 -0
- package/.gitignore +244 -0
- package/.gitleaks.toml +118 -0
- package/.windsurf/agents.yaml +44 -0
- package/.windsurf/rules/mega-brain.md +39 -0
- package/CONTRIBUTING.md +62 -0
- package/QUICK-START.md +231 -0
- package/README.md +168 -0
- package/agents/AGENT-INDEX.yaml +107 -0
- package/agents/MASTER-AGENT.md +612 -0
- package/agents/README.md +48 -0
- package/agents/_templates/INDEX.md +741 -0
- package/agents/_templates/TEMPLATE-AGENT-MD-ULTRA-ROBUSTO-V3.md +2399 -0
- package/agents/boardroom/CHECKLIST-MASTER.md +281 -0
- package/agents/boardroom/INTEGRATION-GUIDE.md +406 -0
- package/agents/boardroom/README.md +238 -0
- package/agents/boardroom/config/BOARDROOM-CONFIG.md +186 -0
- package/agents/boardroom/config/TTS-INTEGRATION.md +258 -0
- package/agents/boardroom/config/VOICE-PROFILES.md +624 -0
- package/agents/boardroom/scripts/audio_generator.py +375 -0
- package/agents/boardroom/scripts/audio_generator_edge.py +353 -0
- package/agents/boardroom/scripts/jarvis_boardroom_hook.py +415 -0
- package/agents/boardroom/scripts/notebooklm_generator.py +578 -0
- package/agents/boardroom/templates/EPISODE-TEMPLATE.md +367 -0
- package/agents/boardroom/templates/scene-templates/SCENE-AGENT-DEBATE.md +252 -0
- package/agents/boardroom/templates/scene-templates/SCENE-COUNCIL.md +270 -0
- package/agents/boardroom/templates/scene-templates/SCENE-DNA-CONSULTATION.md +126 -0
- package/agents/boardroom/templates/scene-templates/SCENE-QUESTION.md +174 -0
- package/agents/boardroom/workflows/WORKFLOW-AUDIO-GENERATION.md +421 -0
- package/agents/conclave/CRITIC.md +197 -0
- package/agents/conclave/DEVILS-ADVOCATE.md +274 -0
- package/agents/conclave/README.md +35 -0
- package/agents/conclave/SYNTHESIZER.md +293 -0
- package/agents/conclave/advogado-do-diabo/AGENT.md +502 -0
- package/agents/conclave/advogado-do-diabo/SOUL.md +100 -0
- package/agents/conclave/critico-metodologico/AGENT.md +683 -0
- package/agents/conclave/critico-metodologico/SOUL.md +107 -0
- package/agents/conclave/sintetizador/AGENT.md +571 -0
- package/agents/conclave/sintetizador/SOUL.md +94 -0
- package/agents/constitution/BASE-CONSTITUTION.md +254 -0
- package/agents/persona-registry.yaml +300 -0
- package/agents/sua-empresa/.gitkeep +0 -0
- package/agents/sua-empresa/README.md +44 -0
- package/agents/sua-empresa/_example/jds/EXAMPLE-JD.md +42 -0
- package/agents/sua-empresa/_example/org/EXAMPLE-ORG.md +32 -0
- package/agents/sua-empresa/_example/roles/EXAMPLE-ROLE.md +38 -0
- package/artifacts/README.md +11 -0
- package/artifacts/canonical/.gitkeep +0 -0
- package/artifacts/chunks/.gitkeep +0 -0
- package/artifacts/insights/.gitkeep +0 -0
- package/artifacts/narratives/.gitkeep +0 -0
- package/bin/cli.js +2 -0
- package/bin/lib/ascii-art.js +202 -0
- package/bin/lib/feature-gate.js +46 -0
- package/bin/lib/installer.js +593 -0
- package/bin/lib/license.js +59 -0
- package/bin/lib/pro-commands.js +75 -0
- package/bin/lib/setup-wizard.js +547 -0
- package/bin/lib/validate-email.js +113 -0
- package/bin/mega-brain.js +136 -0
- package/bin/pre-publish-gate.js +229 -0
- package/bin/push.js +1056 -0
- package/bin/templates/env.example +27 -0
- package/bin/utils/pro-detector.js +50 -0
- package/bin/validate-package.js +190 -0
- package/core/__init__.py +2 -0
- package/core/glossary/INDEX.md +63 -0
- package/core/glossary/digital.md +243 -0
- package/core/glossary/finance.md +49 -0
- package/core/glossary/marketing.md +69 -0
- package/core/glossary/operations.md +50 -0
- package/core/glossary/sales.md +690 -0
- package/core/intelligence/__init__.py +41 -0
- package/core/intelligence/agent_trigger.py +468 -0
- package/core/intelligence/audit_layers.py +491 -0
- package/core/intelligence/autonomous_processor.py +796 -0
- package/core/intelligence/bootstrap_registry.py +550 -0
- package/core/intelligence/business_model_detector.py +476 -0
- package/core/intelligence/dossier_trigger.py +336 -0
- package/core/intelligence/entity_normalizer.py +565 -0
- package/core/intelligence/org_chain_detector.py +411 -0
- package/core/intelligence/review_dashboard.py +338 -0
- package/core/intelligence/role_detector.py +855 -0
- package/core/intelligence/session_autosave.py +46 -0
- package/core/intelligence/skill_generator.py +601 -0
- package/core/intelligence/sow_generator.py +711 -0
- package/core/intelligence/sync_package_files.py +504 -0
- package/core/intelligence/task_orchestrator.py +780 -0
- package/core/intelligence/theme_analyzer.py +562 -0
- package/core/intelligence/tool_discovery.py +432 -0
- package/core/intelligence/validate_json_integrity.py +106 -0
- package/core/intelligence/validate_layers.py +310 -0
- package/core/intelligence/verify_classifications.py +94 -0
- package/core/intelligence/viability_scorer.py +592 -0
- package/core/jarvis/02-JARVIS-SOUL.md +390 -0
- package/core/jarvis/03-JARVIS-DNA.yaml +312 -0
- package/core/jarvis/AGENT.md +191 -0
- package/core/jarvis/agent-creator/AGENT.md +199 -0
- package/core/jarvis/agent-creator/SOUL.md +82 -0
- package/core/jarvis/agent-creator/tasks/create-agent.md +133 -0
- package/core/jarvis/agent-creator/tasks/sync-agents.md +100 -0
- package/core/jarvis/agent-creator/workflows/wf-create-agent.yaml +110 -0
- package/core/jarvis/agent-creator/workflows/wf-pipeline-trigger.yaml +111 -0
- package/core/jarvis/autonomous/benchmark/AGENT.md +347 -0
- package/core/jarvis/autonomous/benchmark/SOUL.md +78 -0
- package/core/jarvis/autonomous/critic/AGENT.md +324 -0
- package/core/jarvis/autonomous/critic/SOUL.md +78 -0
- package/core/jarvis/autonomous/evolver/AGENT.md +294 -0
- package/core/jarvis/autonomous/evolver/SOUL.md +85 -0
- package/core/jarvis/autonomous/playbook-generator/AGENT.md +399 -0
- package/core/jarvis/autonomous/playbook-generator/SOUL.md +80 -0
- package/core/patterns/_ROLE_PATTERNS.yaml +547 -0
- package/core/patterns/quality_gates.yaml +259 -0
- package/core/patterns/trigger_config.yaml +193 -0
- package/core/schemas/SCHEMA-INDEX.md +94 -0
- package/core/schemas/canonical-map.schema.json +98 -0
- package/core/schemas/chunks-state.schema.json +131 -0
- package/core/schemas/decisions-registry.schema.json +120 -0
- package/core/schemas/file-registry.schema.json +69 -0
- package/core/schemas/insights-state.schema.json +111 -0
- package/core/schemas/narratives-state.schema.json +150 -0
- package/core/tasks/CHANGELOG.md +55 -0
- package/core/tasks/TASK-REGISTRY.md +113 -0
- package/core/tasks/_templates/task-tmpl.md +105 -0
- package/core/tasks/analyze-themes.md +84 -0
- package/core/tasks/detect-role.md +82 -0
- package/core/tasks/extract-dna.md +114 -0
- package/core/tasks/normalize-entities.md +82 -0
- package/core/tasks/process-batch.md +111 -0
- package/core/tasks/validate-cascade.md +105 -0
- package/core/templates/README.md +27 -0
- package/core/templates/agents/dna-config-template.yaml +181 -0
- package/core/templates/agents/enrichment-protocol.md +408 -0
- package/core/templates/agents/memory-template.md +567 -0
- package/core/templates/agents/reasoning-model.md +331 -0
- package/core/templates/agents/soul-template.md +416 -0
- package/core/templates/agents/template-evolution.md +544 -0
- package/core/templates/debates/CONCLAVE-LOG-TEMPLATE-v2.md +309 -0
- package/core/templates/debates/conclave-log-template.md +309 -0
- package/core/templates/debates/conclave-protocol.md +518 -0
- package/core/templates/debates/debate-dynamics-config.yaml +322 -0
- package/core/templates/debates/debate-dynamics.md +613 -0
- package/core/templates/debates/debate-protocol.md +323 -0
- package/core/templates/logs/LOG-TEMPLATES.md +1068 -0
- package/core/templates/logs/batch-visual-template.md +841 -0
- package/core/templates/logs/log-structure.md +65 -0
- package/core/templates/logs/visual-diff.md +159 -0
- package/core/templates/phases/dossier-compilation.md +790 -0
- package/core/templates/phases/narrative-metabolism.md +292 -0
- package/core/templates/phases/narrative-synthesis.md +278 -0
- package/core/templates/phases/phase4-checkpoint.md +146 -0
- package/core/templates/phases/prompt-1.1-chunking.md +154 -0
- package/core/templates/phases/prompt-1.2-entity-resolution.md +186 -0
- package/core/templates/phases/prompt-2.1-dna-tags.md +208 -0
- package/core/templates/phases/prompt-2.1-insight-extraction.md +191 -0
- package/core/templates/phases/prompt-3.1-narrative.md +331 -0
- package/core/templates/phases/sources-compilation.md +340 -0
- package/core/workflows/PIPELINE-JARVIS-DOCS.md +606 -0
- package/core/workflows/wf-conclave.yaml +139 -0
- package/core/workflows/wf-extract-dna.yaml +158 -0
- package/core/workflows/wf-ingest.yaml +88 -0
- package/core/workflows/wf-pipeline-full.yaml +138 -0
- package/docs/API-KEYS-GUIDE.md +372 -0
- package/docs/INTEGRATION-POINTS.md +501 -0
- package/docs/LAYERS.md +403 -0
- package/docs/PLAN-MODE-PROTOCOL.md +388 -0
- package/docs/RESTORE-AND-INDEX.md +203 -0
- package/docs/TAG-RESOLVER-IMPLEMENTATION.md +597 -0
- package/docs/conselho.md +337 -0
- package/docs/context7-readme.md +28 -0
- package/docs/jarvis-logging-protocol.md +380 -0
- package/docs/pipeline-completa-v4.md +1315 -0
- package/docs/prompts/meta_agente_mapeamento_processos.md +297 -0
- package/docs/quick-start.md +197 -0
- package/docs/readme-ralph-cascateamento.md +207 -0
- package/docs/template-master.md +727 -0
- package/docs/templates/phase5/IMPLEMENTATION-GUIDE.md +355 -0
- package/docs/templates/phase5/MOGA-BRAIN-PHASE5-TEMPLATES.md +1284 -0
- package/docs/templates/phase5/README.md +165 -0
- package/docs/workflow-continuous-claude.md +2232 -0
- package/inbox/.gitkeep +0 -0
- package/inbox/README.md +15 -0
- package/knowledge/NAVIGATION-MAP.json +292 -0
- package/knowledge/README.md +11 -0
- package/knowledge/dna/.gitkeep +0 -0
- package/knowledge/dossiers/persons/.gitkeep +0 -0
- package/knowledge/dossiers/system/.gitkeep +0 -0
- package/knowledge/dossiers/themes/.gitkeep +0 -0
- package/knowledge/playbooks/.gitkeep +0 -0
- package/knowledge/sources/.gitkeep +0 -0
- package/logs/.gitkeep +0 -0
- package/logs/README.md +11 -0
- package/package.json +180 -0
- package/requirements.txt +4 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Apply Tags Script - Renames matched files with TAG prefix
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import json
|
|
8
|
+
import sys
|
|
9
|
+
|
|
10
|
+
def apply_tags(execute=False):
|
|
11
|
+
# Load matching results
|
|
12
|
+
with open('.claude/mission-control/COMPLETE-TAG-MATCHING.json') as f:
|
|
13
|
+
data = json.load(f)
|
|
14
|
+
|
|
15
|
+
matches = data['matches']
|
|
16
|
+
|
|
17
|
+
print("=" * 60)
|
|
18
|
+
print("APLICAÇÃO DE TAGS - DE-PARA COMPLETO")
|
|
19
|
+
print("=" * 60)
|
|
20
|
+
print(f"\nTotal arquivos com match: {len(matches)}")
|
|
21
|
+
print(f"Modo: {'EXECUTAR' if execute else 'PREVIEW (--execute para aplicar)'}")
|
|
22
|
+
print("=" * 60)
|
|
23
|
+
print()
|
|
24
|
+
|
|
25
|
+
success = 0
|
|
26
|
+
errors = 0
|
|
27
|
+
skipped = 0
|
|
28
|
+
|
|
29
|
+
for m in sorted(matches, key=lambda x: x['tag']):
|
|
30
|
+
old_path = m['full_path']
|
|
31
|
+
tag = m['tag']
|
|
32
|
+
filename = m['filename']
|
|
33
|
+
|
|
34
|
+
# Skip if file already has a tag
|
|
35
|
+
if filename.startswith('[') and ']' in filename:
|
|
36
|
+
print(f"⏭️ SKIP (já tem tag): {filename}")
|
|
37
|
+
skipped += 1
|
|
38
|
+
continue
|
|
39
|
+
|
|
40
|
+
# Build new filename with tag
|
|
41
|
+
new_filename = f"[{tag}] {filename}"
|
|
42
|
+
new_path = os.path.join(os.path.dirname(old_path), new_filename)
|
|
43
|
+
|
|
44
|
+
print(f"[{tag}] {m['rel_path']}")
|
|
45
|
+
print(f" → {new_filename}")
|
|
46
|
+
|
|
47
|
+
if execute:
|
|
48
|
+
try:
|
|
49
|
+
if os.path.exists(old_path):
|
|
50
|
+
os.rename(old_path, new_path)
|
|
51
|
+
print(f" ✓ RENOMEADO")
|
|
52
|
+
success += 1
|
|
53
|
+
else:
|
|
54
|
+
print(f" ✗ ERRO: Arquivo não encontrado")
|
|
55
|
+
errors += 1
|
|
56
|
+
except Exception as e:
|
|
57
|
+
print(f" ✗ ERRO: {e}")
|
|
58
|
+
errors += 1
|
|
59
|
+
print()
|
|
60
|
+
|
|
61
|
+
print("=" * 60)
|
|
62
|
+
print("RESUMO")
|
|
63
|
+
print("=" * 60)
|
|
64
|
+
if execute:
|
|
65
|
+
print(f"✓ Renomeados com sucesso: {success}")
|
|
66
|
+
print(f"⏭️ Pulados (já tem tag): {skipped}")
|
|
67
|
+
print(f"✗ Erros: {errors}")
|
|
68
|
+
else:
|
|
69
|
+
print(f"📋 Prontos para renomear: {len(matches) - skipped}")
|
|
70
|
+
print(f"⏭️ Já com tag: {skipped}")
|
|
71
|
+
print(f"\nExecute com: python3 apply-tags.py --execute")
|
|
72
|
+
|
|
73
|
+
return success, skipped, errors
|
|
74
|
+
|
|
75
|
+
if __name__ == "__main__":
|
|
76
|
+
execute = '--execute' in sys.argv
|
|
77
|
+
apply_tags(execute)
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Batch Extraction Script for Mega Brain Transcriptions
|
|
4
|
+
------------------------------------------------------
|
|
5
|
+
Este script extrai transcrições de arquivos .docx no Google Drive
|
|
6
|
+
e salva como arquivos .txt com TAG no INBOX.
|
|
7
|
+
|
|
8
|
+
Uso:
|
|
9
|
+
python batch-extract-transcriptions.py <base64_file> <tag> <output_name> <output_dir>
|
|
10
|
+
|
|
11
|
+
O arquivo base64_file deve conter o conteúdo base64 puro do .docx
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import base64
|
|
15
|
+
import subprocess
|
|
16
|
+
import tempfile
|
|
17
|
+
import os
|
|
18
|
+
import sys
|
|
19
|
+
import json
|
|
20
|
+
|
|
21
|
+
def decode_and_extract(base64_content: str) -> str:
|
|
22
|
+
"""
|
|
23
|
+
Decode base64 docx content and extract text using pandoc
|
|
24
|
+
"""
|
|
25
|
+
# Remove whitespace/newlines from base64
|
|
26
|
+
base64_clean = base64_content.strip().replace('\n', '').replace(' ', '')
|
|
27
|
+
|
|
28
|
+
# Decode base64
|
|
29
|
+
try:
|
|
30
|
+
docx_bytes = base64.b64decode(base64_clean)
|
|
31
|
+
except Exception as e:
|
|
32
|
+
return f"[ERROR] Base64 decode failed: {e}"
|
|
33
|
+
|
|
34
|
+
# Create temp file
|
|
35
|
+
with tempfile.NamedTemporaryFile(suffix='.docx', delete=False) as tmp:
|
|
36
|
+
tmp.write(docx_bytes)
|
|
37
|
+
tmp_path = tmp.name
|
|
38
|
+
|
|
39
|
+
try:
|
|
40
|
+
# Check if pandoc is available
|
|
41
|
+
result = subprocess.run(
|
|
42
|
+
['which', 'pandoc'],
|
|
43
|
+
capture_output=True,
|
|
44
|
+
text=True
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
if result.returncode != 0:
|
|
48
|
+
# Try using unzip to extract document.xml directly
|
|
49
|
+
import zipfile
|
|
50
|
+
try:
|
|
51
|
+
with zipfile.ZipFile(tmp_path, 'r') as z:
|
|
52
|
+
if 'word/document.xml' in z.namelist():
|
|
53
|
+
xml_content = z.read('word/document.xml').decode('utf-8')
|
|
54
|
+
# Basic XML text extraction
|
|
55
|
+
import re
|
|
56
|
+
text = re.sub(r'<[^>]+>', '', xml_content)
|
|
57
|
+
text = re.sub(r'\s+', ' ', text)
|
|
58
|
+
return text.strip()
|
|
59
|
+
except Exception as e:
|
|
60
|
+
return f"[ERROR] ZIP extraction failed: {e}"
|
|
61
|
+
|
|
62
|
+
# Use pandoc to extract text
|
|
63
|
+
result = subprocess.run(
|
|
64
|
+
['pandoc', tmp_path, '-t', 'plain', '--wrap=none'],
|
|
65
|
+
capture_output=True,
|
|
66
|
+
text=True,
|
|
67
|
+
check=True
|
|
68
|
+
)
|
|
69
|
+
return result.stdout
|
|
70
|
+
|
|
71
|
+
except subprocess.CalledProcessError as e:
|
|
72
|
+
return f"[ERROR] Pandoc failed: {e.stderr}"
|
|
73
|
+
except Exception as e:
|
|
74
|
+
return f"[ERROR] Extraction failed: {e}"
|
|
75
|
+
finally:
|
|
76
|
+
# Clean up
|
|
77
|
+
try:
|
|
78
|
+
os.unlink(tmp_path)
|
|
79
|
+
except:
|
|
80
|
+
pass
|
|
81
|
+
|
|
82
|
+
def save_transcription(text: str, tag: str, name: str, output_dir: str) -> str:
|
|
83
|
+
"""
|
|
84
|
+
Save extracted text to file with proper naming
|
|
85
|
+
"""
|
|
86
|
+
# Clean filename
|
|
87
|
+
clean_name = name.replace('.docx', '').replace('.mp4', '').strip()
|
|
88
|
+
# Remove leading numbers and dashes if duplicated
|
|
89
|
+
clean_name = clean_name.strip(' -.')
|
|
90
|
+
|
|
91
|
+
filename = f"[{tag}] {clean_name}.txt"
|
|
92
|
+
filepath = os.path.join(output_dir, filename)
|
|
93
|
+
|
|
94
|
+
with open(filepath, 'w', encoding='utf-8') as f:
|
|
95
|
+
f.write(text)
|
|
96
|
+
|
|
97
|
+
return filepath
|
|
98
|
+
|
|
99
|
+
def process_from_file(base64_file: str, tag: str, name: str, output_dir: str) -> dict:
|
|
100
|
+
"""
|
|
101
|
+
Process a single file from base64 content file
|
|
102
|
+
"""
|
|
103
|
+
with open(base64_file, 'r') as f:
|
|
104
|
+
base64_content = f.read()
|
|
105
|
+
|
|
106
|
+
text = decode_and_extract(base64_content)
|
|
107
|
+
|
|
108
|
+
if text.startswith('[ERROR]'):
|
|
109
|
+
return {'success': False, 'error': text, 'tag': tag}
|
|
110
|
+
|
|
111
|
+
filepath = save_transcription(text, tag, name, output_dir)
|
|
112
|
+
return {
|
|
113
|
+
'success': True,
|
|
114
|
+
'filepath': filepath,
|
|
115
|
+
'tag': tag,
|
|
116
|
+
'chars': len(text),
|
|
117
|
+
'words': len(text.split())
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if __name__ == "__main__":
|
|
121
|
+
if len(sys.argv) < 5:
|
|
122
|
+
print("Usage: python batch-extract-transcriptions.py <base64_file> <tag> <output_name> <output_dir>")
|
|
123
|
+
print("Example: python batch-extract-transcriptions.py /tmp/content.b64 JM-0003 'Your Prospects Are Lying' ./INBOX/")
|
|
124
|
+
sys.exit(1)
|
|
125
|
+
|
|
126
|
+
base64_file = sys.argv[1]
|
|
127
|
+
tag = sys.argv[2]
|
|
128
|
+
name = sys.argv[3]
|
|
129
|
+
output_dir = sys.argv[4]
|
|
130
|
+
|
|
131
|
+
result = process_from_file(base64_file, tag, name, output_dir)
|
|
132
|
+
print(json.dumps(result, indent=2))
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
BUILD COMPLETE INDEX - Extrai dados de todos os JSONs da planilha
|
|
4
|
+
Mega Brain - Sistema de Inteligência de Negócios
|
|
5
|
+
|
|
6
|
+
Processa os arquivos JSON salvos das chamadas do Google Sheets API
|
|
7
|
+
e constrói o índice completo nome→TAG
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import os
|
|
11
|
+
import re
|
|
12
|
+
import json
|
|
13
|
+
from datetime import datetime
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
# Configurações
|
|
17
|
+
TOOL_RESULTS_PATH = "" # Set to your Claude tool-results path
|
|
18
|
+
OUTPUT_PATH = ".claude/mission-control/PLANILHA-INDEX.json"
|
|
19
|
+
SCHEMA_PATH = ".claude/mission-control/SPREADSHEET-SCHEMA.json"
|
|
20
|
+
|
|
21
|
+
# Mapeamento de sheet -> coluna da TAG (índice baseado em 0 da row)
|
|
22
|
+
SHEET_CONFIG = {
|
|
23
|
+
"Jeremy Haynes Sales Training": {"tag_col": -1, "prefix": "JH-ST"}, # última coluna
|
|
24
|
+
"Jeremy Haynes Inner Circle": {"tag_col": -1, "prefix": "JH-IC"},
|
|
25
|
+
"Inner Circle Weekly Group Call Recordings": {"tag_col": -1, "prefix": "JH-WK"},
|
|
26
|
+
"Agency Blueprint": {"tag_col": -1, "prefix": "AOBA"},
|
|
27
|
+
"Cold Video Pitch": {"tag_col": -1, "prefix": "PCVP"},
|
|
28
|
+
"Land Your First Agency Client": {"tag_col": -1, "prefix": "LYFC"},
|
|
29
|
+
"Marketer Mindset Masterclass": {"tag_col": -1, "prefix": "MMM"},
|
|
30
|
+
"30 Days Challenge": {"tag_col": -1, "prefix": "30DC"},
|
|
31
|
+
"Scale The Agency": {"tag_col": -1, "prefix": "STA"},
|
|
32
|
+
"Ultra High Ticket Closer": {"tag_col": -1, "prefix": "UHTC"},
|
|
33
|
+
"Jeremy Miner": {"tag_col": -1, "prefix": "JM"},
|
|
34
|
+
"The Scalable Company": {"tag_col": -1, "prefix": "TSC"},
|
|
35
|
+
"Sales Training BR": {"tag_col": -1, "prefix": "EDC"},
|
|
36
|
+
"Alex Hormozi": {"tag_col": -1, "prefix": "AH"},
|
|
37
|
+
"Jeremy Haynes Program": {"tag_col": -1, "prefix": "CA"},
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
def normalize_name(name):
|
|
41
|
+
"""Normaliza nome para matching."""
|
|
42
|
+
if not name:
|
|
43
|
+
return ""
|
|
44
|
+
# Lowercase
|
|
45
|
+
name = str(name).lower()
|
|
46
|
+
# Remove extensão
|
|
47
|
+
name = re.sub(r'\.(mp4|docx|txt|pdf)$', '', name, flags=re.IGNORECASE)
|
|
48
|
+
# Remove número inicial
|
|
49
|
+
name = re.sub(r'^\d+[\s\.\-]+', '', name)
|
|
50
|
+
# Remove (1), (2), etc
|
|
51
|
+
name = re.sub(r'\s*\(\d+\)\s*', '', name)
|
|
52
|
+
# Remove youtube references
|
|
53
|
+
name = re.sub(r'\[youtube\.com[^\]]*\]', '', name)
|
|
54
|
+
# Remove caracteres especiais
|
|
55
|
+
name = re.sub(r'[^\w\s]', ' ', name)
|
|
56
|
+
name = re.sub(r'\s+', ' ', name).strip()
|
|
57
|
+
return name
|
|
58
|
+
|
|
59
|
+
def is_valid_tag(tag, prefix=None):
|
|
60
|
+
"""Verifica se é uma TAG válida."""
|
|
61
|
+
if not tag:
|
|
62
|
+
return False
|
|
63
|
+
tag = str(tag).strip()
|
|
64
|
+
|
|
65
|
+
# Formato básico: XXX-NNNN ou XX-XXX-NNNN
|
|
66
|
+
if not re.match(r'^[\w-]+-\d{4}$', tag):
|
|
67
|
+
return False
|
|
68
|
+
|
|
69
|
+
# Se prefix especificado, verificar
|
|
70
|
+
if prefix and not tag.startswith(prefix):
|
|
71
|
+
return False
|
|
72
|
+
|
|
73
|
+
return True
|
|
74
|
+
|
|
75
|
+
def extract_from_row(row, sheet_name):
|
|
76
|
+
"""Extrai nome e TAG de uma row."""
|
|
77
|
+
if not row:
|
|
78
|
+
return None, None
|
|
79
|
+
|
|
80
|
+
# Extrair valores
|
|
81
|
+
values = []
|
|
82
|
+
for cell in row:
|
|
83
|
+
if isinstance(cell, dict):
|
|
84
|
+
values.append(cell.get('value', ''))
|
|
85
|
+
else:
|
|
86
|
+
values.append(str(cell) if cell else '')
|
|
87
|
+
|
|
88
|
+
if not values:
|
|
89
|
+
return None, None
|
|
90
|
+
|
|
91
|
+
# Nome está na primeira coluna
|
|
92
|
+
name = values[0] if values else None
|
|
93
|
+
|
|
94
|
+
# TAG está na última coluna (geralmente)
|
|
95
|
+
# Procurar TAG no formato correto de trás para frente
|
|
96
|
+
tag = None
|
|
97
|
+
for v in reversed(values):
|
|
98
|
+
if v and is_valid_tag(v):
|
|
99
|
+
tag = v
|
|
100
|
+
break
|
|
101
|
+
|
|
102
|
+
return name, tag
|
|
103
|
+
|
|
104
|
+
def process_json_file(filepath):
|
|
105
|
+
"""Processa um arquivo JSON do Google Sheets."""
|
|
106
|
+
entries = []
|
|
107
|
+
|
|
108
|
+
try:
|
|
109
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
110
|
+
raw_data = json.load(f)
|
|
111
|
+
|
|
112
|
+
# Formato: [{type: text, text: JSON_STRING}]
|
|
113
|
+
if isinstance(raw_data, list) and raw_data:
|
|
114
|
+
if isinstance(raw_data[0], dict) and 'text' in raw_data[0]:
|
|
115
|
+
data = json.loads(raw_data[0]['text'])
|
|
116
|
+
else:
|
|
117
|
+
data = raw_data
|
|
118
|
+
else:
|
|
119
|
+
data = raw_data
|
|
120
|
+
|
|
121
|
+
# Processar dados
|
|
122
|
+
if isinstance(data, list):
|
|
123
|
+
# Lista de sheets
|
|
124
|
+
for sheet_data in data:
|
|
125
|
+
if isinstance(sheet_data, dict) and 'sheetName' in sheet_data:
|
|
126
|
+
sheet_name = sheet_data['sheetName']
|
|
127
|
+
rows = sheet_data.get('data', [])
|
|
128
|
+
|
|
129
|
+
for row in rows:
|
|
130
|
+
name, tag = extract_from_row(row, sheet_name)
|
|
131
|
+
if name and tag:
|
|
132
|
+
entries.append({
|
|
133
|
+
'original_name': name,
|
|
134
|
+
'normalized': normalize_name(name),
|
|
135
|
+
'tag': tag,
|
|
136
|
+
'sheet': sheet_name
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
elif isinstance(data, dict):
|
|
140
|
+
# Pode ser formato valueRanges ou outro
|
|
141
|
+
if 'valueRanges' in data:
|
|
142
|
+
for range_data in data.get('valueRanges', []):
|
|
143
|
+
# Extrair sheet name do range
|
|
144
|
+
range_str = range_data.get('range', '')
|
|
145
|
+
sheet_name = range_str.split('!')[0].strip("'")
|
|
146
|
+
|
|
147
|
+
for row in range_data.get('values', []):
|
|
148
|
+
name, tag = extract_from_row(row, sheet_name)
|
|
149
|
+
if name and tag:
|
|
150
|
+
entries.append({
|
|
151
|
+
'original_name': name,
|
|
152
|
+
'normalized': normalize_name(name),
|
|
153
|
+
'tag': tag,
|
|
154
|
+
'sheet': sheet_name
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
except Exception as e:
|
|
158
|
+
print(f" Erro processando {filepath}: {e}")
|
|
159
|
+
|
|
160
|
+
return entries
|
|
161
|
+
|
|
162
|
+
def main():
|
|
163
|
+
print("=" * 60)
|
|
164
|
+
print("BUILD COMPLETE INDEX")
|
|
165
|
+
print("=" * 60)
|
|
166
|
+
print()
|
|
167
|
+
|
|
168
|
+
all_entries = []
|
|
169
|
+
sheets_found = set()
|
|
170
|
+
|
|
171
|
+
# 1. Processar todos os arquivos JSON em tool-results
|
|
172
|
+
print("[1/3] Processando arquivos JSON...")
|
|
173
|
+
|
|
174
|
+
if os.path.exists(TOOL_RESULTS_PATH):
|
|
175
|
+
json_files = list(Path(TOOL_RESULTS_PATH).glob("mcp-gdrive*.txt"))
|
|
176
|
+
print(f" {len(json_files)} arquivos encontrados")
|
|
177
|
+
|
|
178
|
+
for filepath in json_files:
|
|
179
|
+
entries = process_json_file(filepath)
|
|
180
|
+
if entries:
|
|
181
|
+
print(f" {filepath.name}: {len(entries)} entradas")
|
|
182
|
+
all_entries.extend(entries)
|
|
183
|
+
sheets_found.update(e['sheet'] for e in entries)
|
|
184
|
+
else:
|
|
185
|
+
print(f" AVISO: Pasta não encontrada: {TOOL_RESULTS_PATH}")
|
|
186
|
+
|
|
187
|
+
# 2. Remover duplicatas (manter mais recente por tag)
|
|
188
|
+
print()
|
|
189
|
+
print("[2/3] Removendo duplicatas...")
|
|
190
|
+
|
|
191
|
+
seen_tags = {}
|
|
192
|
+
unique_entries = []
|
|
193
|
+
|
|
194
|
+
for entry in all_entries:
|
|
195
|
+
tag = entry['tag']
|
|
196
|
+
if tag not in seen_tags:
|
|
197
|
+
seen_tags[tag] = entry
|
|
198
|
+
unique_entries.append(entry)
|
|
199
|
+
else:
|
|
200
|
+
# Se mesma tag, manter a entrada com nome mais completo
|
|
201
|
+
existing = seen_tags[tag]
|
|
202
|
+
if len(entry['original_name']) > len(existing['original_name']):
|
|
203
|
+
seen_tags[tag] = entry
|
|
204
|
+
unique_entries = [e for e in unique_entries if e['tag'] != tag]
|
|
205
|
+
unique_entries.append(entry)
|
|
206
|
+
|
|
207
|
+
print(f" De {len(all_entries)} para {len(unique_entries)} entradas únicas")
|
|
208
|
+
|
|
209
|
+
# 3. Ordenar por sheet e tag
|
|
210
|
+
unique_entries.sort(key=lambda x: (x['sheet'], x['tag']))
|
|
211
|
+
|
|
212
|
+
# 4. Salvar índice
|
|
213
|
+
print()
|
|
214
|
+
print("[3/3] Salvando índice...")
|
|
215
|
+
|
|
216
|
+
index = {
|
|
217
|
+
'version': '2.0',
|
|
218
|
+
'timestamp': datetime.now().isoformat(),
|
|
219
|
+
'total_entries': len(unique_entries),
|
|
220
|
+
'sheets_processed': sorted(list(sheets_found)),
|
|
221
|
+
'entries': unique_entries
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
with open(OUTPUT_PATH, 'w', encoding='utf-8') as f:
|
|
225
|
+
json.dump(index, f, ensure_ascii=False, indent=2)
|
|
226
|
+
|
|
227
|
+
print(f" Salvo em: {OUTPUT_PATH}")
|
|
228
|
+
print()
|
|
229
|
+
|
|
230
|
+
# 5. Resumo por sheet
|
|
231
|
+
print("=" * 60)
|
|
232
|
+
print("RESUMO POR SHEET")
|
|
233
|
+
print("=" * 60)
|
|
234
|
+
|
|
235
|
+
sheet_counts = {}
|
|
236
|
+
for entry in unique_entries:
|
|
237
|
+
sheet = entry['sheet']
|
|
238
|
+
sheet_counts[sheet] = sheet_counts.get(sheet, 0) + 1
|
|
239
|
+
|
|
240
|
+
for sheet, count in sorted(sheet_counts.items()):
|
|
241
|
+
print(f" {sheet}: {count} TAGs")
|
|
242
|
+
|
|
243
|
+
print()
|
|
244
|
+
print(f"TOTAL: {len(unique_entries)} entradas")
|
|
245
|
+
print("=" * 60)
|
|
246
|
+
|
|
247
|
+
return index
|
|
248
|
+
|
|
249
|
+
if __name__ == '__main__':
|
|
250
|
+
main()
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
BUILD PLANILHA INDEX - Cria índice nome→TAG da planilha
|
|
4
|
+
Processa os arquivos JSON exportados das abas do Google Sheets
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
import json
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
|
|
12
|
+
# Configurações
|
|
13
|
+
TOOL_RESULTS_PATH = "" # Set to your Claude tool-results path
|
|
14
|
+
OUTPUT_PATH = ".claude/mission-control/PLANILHA-INDEX.json"
|
|
15
|
+
SCHEMA_PATH = ".claude/mission-control/SPREADSHEET-SCHEMA.json"
|
|
16
|
+
|
|
17
|
+
def normalize_name(name):
|
|
18
|
+
"""Normaliza nome para matching."""
|
|
19
|
+
if not name:
|
|
20
|
+
return ""
|
|
21
|
+
# Lowercase
|
|
22
|
+
name = str(name).lower()
|
|
23
|
+
# Remove extensão
|
|
24
|
+
name = re.sub(r'\.(mp4|docx|txt|pdf)$', '', name, flags=re.IGNORECASE)
|
|
25
|
+
# Remove número inicial
|
|
26
|
+
name = re.sub(r'^\d+[\s\.\-]+', '', name)
|
|
27
|
+
# Remove (1), (2), etc
|
|
28
|
+
name = re.sub(r'\s*\(\d+\)\s*', '', name)
|
|
29
|
+
# Remove caracteres especiais
|
|
30
|
+
name = re.sub(r'[^\w\s]', ' ', name)
|
|
31
|
+
name = re.sub(r'\s+', ' ', name).strip()
|
|
32
|
+
return name
|
|
33
|
+
|
|
34
|
+
def process_sheet_data(data, sheet_name, tag_col_index):
|
|
35
|
+
"""Processa dados de uma aba e extrai entradas."""
|
|
36
|
+
entries = []
|
|
37
|
+
|
|
38
|
+
for row in data:
|
|
39
|
+
if not row or len(row) < tag_col_index + 1:
|
|
40
|
+
continue
|
|
41
|
+
|
|
42
|
+
# Extrair valores relevantes
|
|
43
|
+
name_cell = row[0] if len(row) > 0 else None # Coluna B (nome)
|
|
44
|
+
tag_cell = row[tag_col_index] if len(row) > tag_col_index else None
|
|
45
|
+
|
|
46
|
+
if not name_cell or not tag_cell:
|
|
47
|
+
continue
|
|
48
|
+
|
|
49
|
+
name = name_cell.get('value', '') if isinstance(name_cell, dict) else str(name_cell)
|
|
50
|
+
tag = tag_cell.get('value', '') if isinstance(tag_cell, dict) else str(tag_cell)
|
|
51
|
+
|
|
52
|
+
# Verificar se TAG é válida
|
|
53
|
+
if not tag or not re.match(r'^[\w-]+-\d{4}$', tag):
|
|
54
|
+
continue
|
|
55
|
+
|
|
56
|
+
entries.append({
|
|
57
|
+
'original_name': name,
|
|
58
|
+
'normalized': normalize_name(name),
|
|
59
|
+
'tag': tag,
|
|
60
|
+
'sheet': sheet_name
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
return entries
|
|
64
|
+
|
|
65
|
+
def main():
|
|
66
|
+
print("=" * 60)
|
|
67
|
+
print("BUILD PLANILHA INDEX")
|
|
68
|
+
print("=" * 60)
|
|
69
|
+
print()
|
|
70
|
+
|
|
71
|
+
# Carregar schema para saber configuração de cada aba
|
|
72
|
+
print("[1/3] Carregando schema...")
|
|
73
|
+
with open(SCHEMA_PATH, 'r', encoding='utf-8') as f:
|
|
74
|
+
schema = json.load(f)
|
|
75
|
+
|
|
76
|
+
# Encontrar arquivos JSON do Google Sheets
|
|
77
|
+
print("[2/3] Processando dados exportados...")
|
|
78
|
+
|
|
79
|
+
# Dados inline do Sales Training (copiados do resultado anterior)
|
|
80
|
+
# Por agora, vou criar entradas manualmente baseadas no schema
|
|
81
|
+
|
|
82
|
+
entries = []
|
|
83
|
+
|
|
84
|
+
# Dados do Jeremy Haynes Sales Training (processado inline)
|
|
85
|
+
jh_st_data = [
|
|
86
|
+
("1 - Introduction to Sales Training", "JH-ST-0001"),
|
|
87
|
+
("2. The Plague of Fat Cat Closers", "JH-ST-0002"),
|
|
88
|
+
("3. How to Deal With Inbound Leads Who Only Filled Out a Form", "JH-ST-0003"),
|
|
89
|
+
("4. Sales Team Structures to Consider", "JH-ST-0004"),
|
|
90
|
+
("5. The Cleaner Role", "JH-ST-0005"),
|
|
91
|
+
("6. Using Sales Videos to Aid The Sales Process", "JH-ST-0006"),
|
|
92
|
+
("7. Selfie Follow up Video Texts Get an iphone", "JH-ST-0007"),
|
|
93
|
+
("8. Get Leads Back on The Phone With Value Driven Follow up", "JH-ST-0008"),
|
|
94
|
+
("9. How to Increase Show Rate", "JH-ST-0009"),
|
|
95
|
+
("10.Why You Should Text Every Lead Manually", "JH-ST-0010"),
|
|
96
|
+
("11. Value Added vs Selfish Questions", "JH-ST-0011"),
|
|
97
|
+
("12. Value Added Questions vs Selfish Questions", "JH-ST-0012"),
|
|
98
|
+
("13. How to Increase Average Order Value", "JH-ST-0013"),
|
|
99
|
+
("14. How to Recruit Sales People", "JH-ST-0014"),
|
|
100
|
+
("15. How to Train Maintain a Great Sales Team", "JH-ST-0015"),
|
|
101
|
+
("16. Why Full Time Closers Are Better", "JH-ST-0016"),
|
|
102
|
+
("17. How to Raise The Value of The Price", "JH-ST-0017"),
|
|
103
|
+
("18. Raising The Clients Interest Level", "JH-ST-0018"),
|
|
104
|
+
("19. How to Create Real Scarcity Urgency", "JH-ST-0019"),
|
|
105
|
+
("20. Reviewing Calls Providing Feedback", "JH-ST-0020"),
|
|
106
|
+
("21. Your Personal Life Impacts Your Professional Life", "JH-ST-0021"),
|
|
107
|
+
("22. Tools Software For Closers", "JH-ST-0022"),
|
|
108
|
+
("23. When to Fire Sales Reps", "JH-ST-0023"),
|
|
109
|
+
("24. Keep Your Moral High", "JH-ST-0024"),
|
|
110
|
+
("25. Sales Training With Jordan Stupar", "JH-ST-0025"),
|
|
111
|
+
("26. Sales Training With Josh Troy", "JH-ST-0026"),
|
|
112
|
+
("1. Intro to Objections", "JH-ST-0028"),
|
|
113
|
+
("2. What Happens if You go Out of Business", "JH-ST-0029"),
|
|
114
|
+
("3. How do I Know my Money is Safe", "JH-ST-0030"),
|
|
115
|
+
("4. Can I Speak to The Owner", "JH-ST-0031"),
|
|
116
|
+
("5. How Can You Guarantee That Ill Make Money", "JH-ST-0032"),
|
|
117
|
+
("6. Why Are You Better Than Everybody Else", "JH-ST-0033"),
|
|
118
|
+
("7. Id Rather Get Started Next Quarter", "JH-ST-0034"),
|
|
119
|
+
("8. I Have to Get my Lawyer to Review Before Moving Forward", "JH-ST-0035"),
|
|
120
|
+
("9. My Business Partner I Will Need To Review This", "JH-ST-0036"),
|
|
121
|
+
("10. Im Traveling This Week Lets Move Forward Next Week", "JH-ST-0037"),
|
|
122
|
+
("11. Are You Open to Changes in The Agreement", "JH-ST-0038"),
|
|
123
|
+
("12. Can I Speak to an Existing Client", "JH-ST-0039"),
|
|
124
|
+
("13. I Saw a Negative Review Im Afraid Itll Happen to me", "JH-ST-0040"),
|
|
125
|
+
("14. Objection I Cant Afford This", "JH-ST-0041"),
|
|
126
|
+
("15. Objection I Cant Afford This", "JH-ST-0042"),
|
|
127
|
+
("16. Objection I Cant Afford This", "JH-ST-0043"),
|
|
128
|
+
("17. I Didnt Expect it to Cost This Much", "JH-ST-0044"),
|
|
129
|
+
("18. I am Looking at Other Service Providers", "JH-ST-0045"),
|
|
130
|
+
]
|
|
131
|
+
|
|
132
|
+
for name, tag in jh_st_data:
|
|
133
|
+
entries.append({
|
|
134
|
+
'original_name': name,
|
|
135
|
+
'normalized': normalize_name(name),
|
|
136
|
+
'tag': tag,
|
|
137
|
+
'sheet': 'Jeremy Haynes Sales Training'
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
print(f" Processadas {len(entries)} entradas iniciais")
|
|
141
|
+
print()
|
|
142
|
+
print(" NOTA: Este script precisa ser expandido para processar todas as abas")
|
|
143
|
+
print(" via API do Google Sheets ou arquivos JSON exportados.")
|
|
144
|
+
print()
|
|
145
|
+
|
|
146
|
+
# 3. Salvar índice
|
|
147
|
+
print("[3/3] Salvando índice...")
|
|
148
|
+
|
|
149
|
+
index = {
|
|
150
|
+
'version': '1.0',
|
|
151
|
+
'timestamp': datetime.now().isoformat(),
|
|
152
|
+
'total_entries': len(entries),
|
|
153
|
+
'sheets_processed': list(set(e['sheet'] for e in entries)),
|
|
154
|
+
'entries': entries
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
with open(OUTPUT_PATH, 'w', encoding='utf-8') as f:
|
|
158
|
+
json.dump(index, f, ensure_ascii=False, indent=2)
|
|
159
|
+
|
|
160
|
+
print(f" Salvo em: {OUTPUT_PATH}")
|
|
161
|
+
print(f" Total: {len(entries)} entradas")
|
|
162
|
+
print()
|
|
163
|
+
print("=" * 60)
|
|
164
|
+
print("ÍNDICE CRIADO (parcial)")
|
|
165
|
+
print("=" * 60)
|
|
166
|
+
|
|
167
|
+
return index
|
|
168
|
+
|
|
169
|
+
if __name__ == '__main__':
|
|
170
|
+
main()
|