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,250 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Complete Tag Matching Script - DE-PARA 1-a-1
|
|
4
|
+
Matches each untagged file to its correct planilha entry and applies TAG
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
import json
|
|
10
|
+
from difflib import SequenceMatcher
|
|
11
|
+
|
|
12
|
+
# Planilha data - extracted from Google Sheets
|
|
13
|
+
PLANILHA_DATA = {
|
|
14
|
+
"30 Days Challenge": {
|
|
15
|
+
"prefix": "30DC",
|
|
16
|
+
"entries": {
|
|
17
|
+
"1 - Day 1": "30DC-0001",
|
|
18
|
+
"2 - Day 2": "30DC-0002",
|
|
19
|
+
"3 - Day 3": "30DC-0003",
|
|
20
|
+
"4 - Day 4": "30DC-0004",
|
|
21
|
+
"5 - Day 5": "30DC-0005",
|
|
22
|
+
"6 - Day 6": "30DC-0006",
|
|
23
|
+
"7 - Day 7": "30DC-0007",
|
|
24
|
+
"8 - Day 8": "30DC-0008",
|
|
25
|
+
"9 - Day 9": "30DC-0009",
|
|
26
|
+
"10 - Day 10": "30DC-0010",
|
|
27
|
+
"11 - Day 11.": "30DC-0011",
|
|
28
|
+
"12 - Day 12.": "30DC-0012",
|
|
29
|
+
"13- Day 13.": "30DC-0013",
|
|
30
|
+
"14 - Day 14.": "30DC-0014",
|
|
31
|
+
"15 - Day 15": "30DC-0015",
|
|
32
|
+
"16 - Day 16": "30DC-0016",
|
|
33
|
+
"17 - Day 17": "30DC-0017",
|
|
34
|
+
"18 - Day 18": "30DC-0018",
|
|
35
|
+
"19 - Day 19": "30DC-0019",
|
|
36
|
+
"20 - Day 20": "30DC-0020",
|
|
37
|
+
"21 - Day 21": "30DC-0021",
|
|
38
|
+
"22 - Day 22": "30DC-0022",
|
|
39
|
+
"23 - Day 23": "30DC-0023",
|
|
40
|
+
"24 - Day 24": "30DC-0024",
|
|
41
|
+
"25 - Day 25": "30DC-0025",
|
|
42
|
+
"26 - Day 26": "30DC-0026",
|
|
43
|
+
"27 - Day 27": "30DC-0027",
|
|
44
|
+
"28 - Day 28": "30DC-0028",
|
|
45
|
+
"29 - Day 29.": "30DC-0029",
|
|
46
|
+
"30 - Day 30": "30DC-0030",
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"Cold Video Pitch": {
|
|
50
|
+
"prefix": "PCVP",
|
|
51
|
+
"entries": {
|
|
52
|
+
"1. Power Of Cold Video.": "PCVP-0001",
|
|
53
|
+
"2. Selling Advertising.": "PCVP-0002",
|
|
54
|
+
"3. Social Media Management.": "PCVP-0003",
|
|
55
|
+
"4. Google PPC.": "PCVP-0004",
|
|
56
|
+
"5. Facebook And Instagram.": "PCVP-0005",
|
|
57
|
+
"6. Long Form Content Creation.": "PCVP-0006",
|
|
58
|
+
"7. Animation.": "PCVP-0007",
|
|
59
|
+
"8. Graphics Design.": "PCVP-0008",
|
|
60
|
+
"9. Google Listing.": "PCVP-0009",
|
|
61
|
+
"10. Redoing Thumbnails.": "PCVP-0010",
|
|
62
|
+
"11. Sell Funnels.": "PCVP-0011",
|
|
63
|
+
"12. Chatbots.": "PCVP-0012",
|
|
64
|
+
"13. PR Services.": "PCVP-0013",
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"Agency Blueprint": {
|
|
68
|
+
"prefix": "AOBA",
|
|
69
|
+
"entries": {
|
|
70
|
+
"1. What Is A Marketing Agency.": "AOBA-0001",
|
|
71
|
+
"2. Phases Of A Marketing Agency.": "AOBA-0002",
|
|
72
|
+
"3. Skills Or No Skills.": "AOBA-0003",
|
|
73
|
+
"4. Is It Best To Have Stuff Or A Referral Network.": "AOBA-0004",
|
|
74
|
+
"5. What Are The Possible Limiting Beliefs.": "AOBA-0005",
|
|
75
|
+
"6. What Is PPHD.": "AOBA-0006",
|
|
76
|
+
"7. Leveraging The Facebook Group.": "AOBA-0007",
|
|
77
|
+
"8. Is It Best To Go General Or Niche.": "AOBA-0008",
|
|
78
|
+
"9. Whats The Best Business Model Service Clients Or Consulting.": "AOBA-0009",
|
|
79
|
+
"10. How To Keep A Real Perspective Of Things.": "AOBA-0010",
|
|
80
|
+
"11. Do You Need A Website For Your Agency.": "AOBA-0011",
|
|
81
|
+
"12. How To Become An Expert.": "AOBA-0012",
|
|
82
|
+
"13. Before You Even Think About Getting A Partner.": "AOBA-0013",
|
|
83
|
+
"14. How To Be Comfortable With Failure.": "AOBA-0014",
|
|
84
|
+
"15. Anatomy Of A Perfect Client.": "AOBA-0015",
|
|
85
|
+
"16. How To Keep Your Standards High.": "AOBA-0016",
|
|
86
|
+
"17. The Power Of Expert Positioning": "AOBA-0017",
|
|
87
|
+
"18. How To Improve Your Social Presence.": "AOBA-0018",
|
|
88
|
+
"19. The Best Way To Hijack Authority.": "AOBA-0019",
|
|
89
|
+
"20. Differences Between Hard Flex and Soft Flex.": "AOBA-0020",
|
|
90
|
+
"21. When To Ask For Testimonials.": "AOBA-0021",
|
|
91
|
+
"22. Every Result Is A Marketable Headline.": "AOBA-0022",
|
|
92
|
+
"23. How To PR For Expansion.": "AOBA-0023",
|
|
93
|
+
"24. How To Overcome Major Obstacles.": "AOBA-0024",
|
|
94
|
+
"25. Is It Better To Charge High-Ticket Or Competitive Pricing.": "AOBA-0025",
|
|
95
|
+
"26. What Are The Core Services To Offer.": "AOBA-0026",
|
|
96
|
+
"27. What Model Is Better Transactional Or Recurring.": "AOBA-0027",
|
|
97
|
+
"28. How To Move From Transactional To Recurring.": "AOBA-0028",
|
|
98
|
+
"29. How To Stay Away From Free To Paid Service.": "AOBA-0029",
|
|
99
|
+
"30. The Profit First Business Model.": "AOBA-0030",
|
|
100
|
+
"31. How To Manage Agency Costs.": "AOBA-0031",
|
|
101
|
+
"32. How To Setup Bank Accounts.": "AOBA-0032",
|
|
102
|
+
"33. State Of The Agency Contraction And Expansion.": "AOBA-0033",
|
|
103
|
+
"34. Refunds Policy No Refunds.": "AOBA-0034",
|
|
104
|
+
"35. Result-Driven Services.": "AOBA-0035",
|
|
105
|
+
"36. Is It Better To Have A Contract Or Not.": "AOBA-0036",
|
|
106
|
+
"37. Change Is The Only Constant.": "AOBA-0037",
|
|
107
|
+
"38. Is It Best To Get New Skills Or Referrals.": "AOBA-0038",
|
|
108
|
+
"39. Cash Is Like Oxygen.": "AOBA-0039",
|
|
109
|
+
"40. Why Big Companies Focus On Sales.": "AOBA-0040",
|
|
110
|
+
"41. Daily Attitude And Training": "AOBA-0041",
|
|
111
|
+
"42. How Your Outflow Equals Your Inflow.": "AOBA-0042",
|
|
112
|
+
"43. Money Is In The Follow Up.": "AOBA-0043",
|
|
113
|
+
"44. How To Use Conviction To Win More.": "AOBA-0044",
|
|
114
|
+
"45. How To Win The Sales Game.": "AOBA-0045",
|
|
115
|
+
"46. Duplicating Yourself With Sales People.": "AOBA-0046",
|
|
116
|
+
"47. How To Be Confident In Your Services.": "AOBA-0047",
|
|
117
|
+
"48. How To Keep Your Cool At All Times.": "AOBA-0048",
|
|
118
|
+
"49. Is Cold Calling Dead.": "AOBA-0049",
|
|
119
|
+
"50. How To Keep A Full Pipeline.": "AOBA-0050",
|
|
120
|
+
"51. When Is It Time To Fire A Client.": "AOBA-0051",
|
|
121
|
+
"52. How To Deal With More Rejection Than Acceptance": "AOBA-0052",
|
|
122
|
+
"53. What Is A VAK.": "AOBA-0053",
|
|
123
|
+
"54. Leverage The Power Of Math.": "AOBA-0054",
|
|
124
|
+
"55. How To Use Systems To Save Your Agency.": "AOBA-0055",
|
|
125
|
+
"56. How To Keep Your Team Accountable.": "AOBA-0056",
|
|
126
|
+
"57. Expectations Equal Success.": "AOBA-0057",
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
def normalize_name(name):
|
|
132
|
+
"""Normalize filename for matching"""
|
|
133
|
+
# Remove extension
|
|
134
|
+
name = re.sub(r'\.(txt|docx|mp4|pdf)$', '', name, flags=re.IGNORECASE)
|
|
135
|
+
# Remove youtube references
|
|
136
|
+
name = re.sub(r'\s*\[youtube\.com.*?\]', '', name)
|
|
137
|
+
# Remove timestamps
|
|
138
|
+
name = re.sub(r'\s*\d{1,2}-\d{1,2}-\d{2,4}', '', name)
|
|
139
|
+
# Normalize spaces and case
|
|
140
|
+
name = name.strip().lower()
|
|
141
|
+
# Remove multiple spaces
|
|
142
|
+
name = re.sub(r'\s+', ' ', name)
|
|
143
|
+
return name
|
|
144
|
+
|
|
145
|
+
def find_best_match(filename, threshold=0.7):
|
|
146
|
+
"""Find best matching planilha entry for a filename"""
|
|
147
|
+
norm_file = normalize_name(filename)
|
|
148
|
+
|
|
149
|
+
best_match = None
|
|
150
|
+
best_score = 0
|
|
151
|
+
best_tag = None
|
|
152
|
+
best_source = None
|
|
153
|
+
|
|
154
|
+
for source, data in PLANILHA_DATA.items():
|
|
155
|
+
for entry_name, tag in data["entries"].items():
|
|
156
|
+
norm_entry = normalize_name(entry_name)
|
|
157
|
+
score = SequenceMatcher(None, norm_file, norm_entry).ratio()
|
|
158
|
+
|
|
159
|
+
if score > best_score:
|
|
160
|
+
best_score = score
|
|
161
|
+
best_match = entry_name
|
|
162
|
+
best_tag = tag
|
|
163
|
+
best_source = source
|
|
164
|
+
|
|
165
|
+
if best_score >= threshold:
|
|
166
|
+
return {
|
|
167
|
+
"matched_to": best_match,
|
|
168
|
+
"tag": best_tag,
|
|
169
|
+
"source": best_source,
|
|
170
|
+
"score": best_score
|
|
171
|
+
}
|
|
172
|
+
return None
|
|
173
|
+
|
|
174
|
+
def get_untagged_files(inbox_path):
|
|
175
|
+
"""Get all untagged .txt files"""
|
|
176
|
+
untagged = []
|
|
177
|
+
|
|
178
|
+
for root, dirs, files in os.walk(inbox_path):
|
|
179
|
+
# Skip hidden and backup folders
|
|
180
|
+
dirs[:] = [d for d in dirs if not d.startswith('.') and not d.startswith('_')]
|
|
181
|
+
|
|
182
|
+
for f in files:
|
|
183
|
+
if f.endswith('.txt') and not (f.startswith('[') and ']' in f):
|
|
184
|
+
full_path = os.path.join(root, f)
|
|
185
|
+
rel_path = full_path.replace(inbox_path + '/', '')
|
|
186
|
+
untagged.append({
|
|
187
|
+
"filename": f,
|
|
188
|
+
"full_path": full_path,
|
|
189
|
+
"rel_path": rel_path
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
return untagged
|
|
193
|
+
|
|
194
|
+
def main():
|
|
195
|
+
inbox_path = "inbox"
|
|
196
|
+
|
|
197
|
+
print("=== COMPLETE TAG MATCHING - DE-PARA 1-a-1 ===\n")
|
|
198
|
+
|
|
199
|
+
# Get untagged files
|
|
200
|
+
untagged = get_untagged_files(inbox_path)
|
|
201
|
+
print(f"Total arquivos sem TAG: {len(untagged)}\n")
|
|
202
|
+
|
|
203
|
+
# Match each file
|
|
204
|
+
matches = []
|
|
205
|
+
orphans = []
|
|
206
|
+
|
|
207
|
+
for file_info in untagged:
|
|
208
|
+
match = find_best_match(file_info["filename"])
|
|
209
|
+
if match:
|
|
210
|
+
matches.append({
|
|
211
|
+
**file_info,
|
|
212
|
+
**match
|
|
213
|
+
})
|
|
214
|
+
else:
|
|
215
|
+
orphans.append(file_info)
|
|
216
|
+
|
|
217
|
+
print(f"MATCHES ENCONTRADOS: {len(matches)}")
|
|
218
|
+
print(f"ÓRFÃOS (sem match): {len(orphans)}\n")
|
|
219
|
+
|
|
220
|
+
print("=== MATCHES DETALHADOS ===\n")
|
|
221
|
+
for m in sorted(matches, key=lambda x: x["tag"]):
|
|
222
|
+
print(f"[{m['tag']}] {m['filename']}")
|
|
223
|
+
print(f" → Planilha: {m['matched_to']} ({m['source']})")
|
|
224
|
+
print(f" → Score: {m['score']:.2%}")
|
|
225
|
+
print(f" → Path: {m['rel_path']}")
|
|
226
|
+
print()
|
|
227
|
+
|
|
228
|
+
print("\n=== ÓRFÃOS (ARQUIVOS SEM MATCH NA PLANILHA) ===\n")
|
|
229
|
+
for o in orphans:
|
|
230
|
+
print(f" ✗ {o['rel_path']}")
|
|
231
|
+
|
|
232
|
+
# Save results
|
|
233
|
+
results = {
|
|
234
|
+
"total_untagged": len(untagged),
|
|
235
|
+
"total_matches": len(matches),
|
|
236
|
+
"total_orphans": len(orphans),
|
|
237
|
+
"matches": matches,
|
|
238
|
+
"orphans": orphans
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
output_path = ".claude/mission-control/COMPLETE-TAG-MATCHING.json"
|
|
242
|
+
with open(output_path, 'w') as f:
|
|
243
|
+
json.dump(results, f, indent=2, ensure_ascii=False)
|
|
244
|
+
|
|
245
|
+
print(f"\n\nResultados salvos em: {output_path}")
|
|
246
|
+
|
|
247
|
+
return results
|
|
248
|
+
|
|
249
|
+
if __name__ == "__main__":
|
|
250
|
+
main()
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Deduplication Script - Remove duplicate files keeping only the most recent
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import re
|
|
8
|
+
import shutil
|
|
9
|
+
from collections import defaultdict
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
|
|
12
|
+
INBOX_PATH = "inbox"
|
|
13
|
+
BACKUP_PATH = os.path.join(INBOX_PATH, "_DEDUP_BACKUP")
|
|
14
|
+
|
|
15
|
+
def find_tagged_files():
|
|
16
|
+
"""Find all files with [TAG-XXXX] format"""
|
|
17
|
+
tagged_files = defaultdict(list)
|
|
18
|
+
tag_pattern = re.compile(r'^\[([A-Z0-9\-]+)\]')
|
|
19
|
+
|
|
20
|
+
for root, dirs, files in os.walk(INBOX_PATH):
|
|
21
|
+
# Skip the backup folder itself
|
|
22
|
+
if "_DEDUP_BACKUP" in root:
|
|
23
|
+
continue
|
|
24
|
+
|
|
25
|
+
for filename in files:
|
|
26
|
+
if not filename.endswith('.txt'):
|
|
27
|
+
continue
|
|
28
|
+
|
|
29
|
+
match = tag_pattern.match(filename)
|
|
30
|
+
if match:
|
|
31
|
+
tag = match.group(1)
|
|
32
|
+
full_path = os.path.join(root, filename)
|
|
33
|
+
mtime = os.path.getmtime(full_path)
|
|
34
|
+
tagged_files[tag].append({
|
|
35
|
+
'filename': filename,
|
|
36
|
+
'path': full_path,
|
|
37
|
+
'mtime': mtime,
|
|
38
|
+
'rel_path': os.path.relpath(full_path, INBOX_PATH)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
return tagged_files
|
|
42
|
+
|
|
43
|
+
def deduplicate(execute=False):
|
|
44
|
+
"""Remove duplicates, keeping the most recent file for each TAG"""
|
|
45
|
+
|
|
46
|
+
print("=" * 70)
|
|
47
|
+
print("DEDUPLICAÇÃO DO INBOX - MEGA BRAIN")
|
|
48
|
+
print("=" * 70)
|
|
49
|
+
print(f"\nModo: {'EXECUTAR' if execute else 'PREVIEW (--execute para aplicar)'}")
|
|
50
|
+
print("=" * 70)
|
|
51
|
+
|
|
52
|
+
# Ensure backup folder exists
|
|
53
|
+
if execute and not os.path.exists(BACKUP_PATH):
|
|
54
|
+
os.makedirs(BACKUP_PATH)
|
|
55
|
+
|
|
56
|
+
tagged_files = find_tagged_files()
|
|
57
|
+
|
|
58
|
+
# Stats
|
|
59
|
+
total_tags = len(tagged_files)
|
|
60
|
+
duplicated_tags = 0
|
|
61
|
+
files_to_remove = 0
|
|
62
|
+
|
|
63
|
+
duplicates_list = []
|
|
64
|
+
|
|
65
|
+
for tag, files in sorted(tagged_files.items()):
|
|
66
|
+
if len(files) > 1:
|
|
67
|
+
duplicated_tags += 1
|
|
68
|
+
# Sort by mtime descending (most recent first)
|
|
69
|
+
files_sorted = sorted(files, key=lambda x: x['mtime'], reverse=True)
|
|
70
|
+
keep = files_sorted[0]
|
|
71
|
+
remove = files_sorted[1:]
|
|
72
|
+
|
|
73
|
+
print(f"\n[{tag}] {len(files)} cópias encontradas:")
|
|
74
|
+
print(f" ✓ MANTER: {keep['rel_path']}")
|
|
75
|
+
print(f" (modificado: {datetime.fromtimestamp(keep['mtime']).strftime('%Y-%m-%d %H:%M')})")
|
|
76
|
+
|
|
77
|
+
for f in remove:
|
|
78
|
+
files_to_remove += 1
|
|
79
|
+
print(f" ✗ REMOVER: {f['rel_path']}")
|
|
80
|
+
print(f" (modificado: {datetime.fromtimestamp(f['mtime']).strftime('%Y-%m-%d %H:%M')})")
|
|
81
|
+
duplicates_list.append({
|
|
82
|
+
'tag': tag,
|
|
83
|
+
'file': f,
|
|
84
|
+
'keep': keep
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
print("\n" + "=" * 70)
|
|
88
|
+
print("RESUMO")
|
|
89
|
+
print("=" * 70)
|
|
90
|
+
print(f"Total de TAGs únicas: {total_tags}")
|
|
91
|
+
print(f"TAGs com duplicatas: {duplicated_tags}")
|
|
92
|
+
print(f"Arquivos a remover: {files_to_remove}")
|
|
93
|
+
|
|
94
|
+
if execute and duplicates_list:
|
|
95
|
+
print("\n" + "=" * 70)
|
|
96
|
+
print("EXECUTANDO REMOÇÃO")
|
|
97
|
+
print("=" * 70)
|
|
98
|
+
|
|
99
|
+
success = 0
|
|
100
|
+
errors = 0
|
|
101
|
+
|
|
102
|
+
for dup in duplicates_list:
|
|
103
|
+
src = dup['file']['path']
|
|
104
|
+
# Create subfolder in backup based on original relative path
|
|
105
|
+
rel_dir = os.path.dirname(dup['file']['rel_path'])
|
|
106
|
+
if rel_dir:
|
|
107
|
+
dest_dir = os.path.join(BACKUP_PATH, rel_dir)
|
|
108
|
+
else:
|
|
109
|
+
dest_dir = BACKUP_PATH
|
|
110
|
+
|
|
111
|
+
if not os.path.exists(dest_dir):
|
|
112
|
+
os.makedirs(dest_dir)
|
|
113
|
+
|
|
114
|
+
dest = os.path.join(dest_dir, dup['file']['filename'])
|
|
115
|
+
|
|
116
|
+
try:
|
|
117
|
+
shutil.move(src, dest)
|
|
118
|
+
print(f"✓ Movido: {dup['file']['rel_path']}")
|
|
119
|
+
success += 1
|
|
120
|
+
except Exception as e:
|
|
121
|
+
print(f"✗ Erro: {dup['file']['rel_path']} - {e}")
|
|
122
|
+
errors += 1
|
|
123
|
+
|
|
124
|
+
print("\n" + "=" * 70)
|
|
125
|
+
print("RESULTADO FINAL")
|
|
126
|
+
print("=" * 70)
|
|
127
|
+
print(f"✓ Arquivos movidos para backup: {success}")
|
|
128
|
+
print(f"✗ Erros: {errors}")
|
|
129
|
+
print(f"\nBackup em: {BACKUP_PATH}")
|
|
130
|
+
|
|
131
|
+
elif not execute:
|
|
132
|
+
print(f"\nExecute com: python3 deduplicate-inbox.py --execute")
|
|
133
|
+
|
|
134
|
+
return duplicated_tags, files_to_remove
|
|
135
|
+
|
|
136
|
+
if __name__ == "__main__":
|
|
137
|
+
import sys
|
|
138
|
+
execute = '--execute' in sys.argv
|
|
139
|
+
deduplicate(execute)
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
DOCX XML Text Extractor for Mega Brain
|
|
4
|
+
---------------------------------------
|
|
5
|
+
Extrai texto de arquivos .docx usando parsing XML direto.
|
|
6
|
+
Não requer pandoc ou outras dependências externas.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import base64
|
|
10
|
+
import tempfile
|
|
11
|
+
import os
|
|
12
|
+
import sys
|
|
13
|
+
import re
|
|
14
|
+
import zipfile
|
|
15
|
+
from xml.etree import ElementTree as ET
|
|
16
|
+
|
|
17
|
+
# OOXML namespace
|
|
18
|
+
WORD_NAMESPACE = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
|
|
19
|
+
|
|
20
|
+
def extract_text_from_xml(xml_content: str) -> str:
|
|
21
|
+
"""
|
|
22
|
+
Extract text from Word document.xml content
|
|
23
|
+
"""
|
|
24
|
+
try:
|
|
25
|
+
root = ET.fromstring(xml_content)
|
|
26
|
+
except ET.ParseError:
|
|
27
|
+
# Fallback to regex if XML parsing fails
|
|
28
|
+
texts = re.findall(r'<w:t[^>]*>([^<]*)</w:t>', xml_content)
|
|
29
|
+
return ' '.join(texts)
|
|
30
|
+
|
|
31
|
+
texts = []
|
|
32
|
+
|
|
33
|
+
# Find all <w:t> elements (text runs)
|
|
34
|
+
for elem in root.iter():
|
|
35
|
+
if elem.tag == f'{WORD_NAMESPACE}t':
|
|
36
|
+
if elem.text:
|
|
37
|
+
texts.append(elem.text)
|
|
38
|
+
# Handle paragraph breaks
|
|
39
|
+
elif elem.tag == f'{WORD_NAMESPACE}p':
|
|
40
|
+
if texts and not texts[-1].endswith('\n'):
|
|
41
|
+
texts.append('\n')
|
|
42
|
+
# Handle line breaks
|
|
43
|
+
elif elem.tag == f'{WORD_NAMESPACE}br':
|
|
44
|
+
texts.append('\n')
|
|
45
|
+
|
|
46
|
+
# Join and clean up
|
|
47
|
+
text = ''.join(texts)
|
|
48
|
+
# Normalize whitespace but preserve paragraph breaks
|
|
49
|
+
text = re.sub(r'[ \t]+', ' ', text)
|
|
50
|
+
text = re.sub(r'\n\s*\n', '\n\n', text)
|
|
51
|
+
text = text.strip()
|
|
52
|
+
|
|
53
|
+
return text
|
|
54
|
+
|
|
55
|
+
def extract_from_docx_bytes(docx_bytes: bytes) -> str:
|
|
56
|
+
"""
|
|
57
|
+
Extract text from docx file bytes
|
|
58
|
+
"""
|
|
59
|
+
with tempfile.NamedTemporaryFile(suffix='.docx', delete=False) as tmp:
|
|
60
|
+
tmp.write(docx_bytes)
|
|
61
|
+
tmp_path = tmp.name
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
if not zipfile.is_zipfile(tmp_path):
|
|
65
|
+
return "[ERROR] Invalid docx file (not a valid ZIP)"
|
|
66
|
+
|
|
67
|
+
with zipfile.ZipFile(tmp_path, 'r') as z:
|
|
68
|
+
if 'word/document.xml' not in z.namelist():
|
|
69
|
+
return "[ERROR] Invalid docx file (no document.xml)"
|
|
70
|
+
|
|
71
|
+
xml_content = z.read('word/document.xml').decode('utf-8')
|
|
72
|
+
return extract_text_from_xml(xml_content)
|
|
73
|
+
|
|
74
|
+
finally:
|
|
75
|
+
try:
|
|
76
|
+
os.unlink(tmp_path)
|
|
77
|
+
except:
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
def process_base64_file(input_file: str) -> str:
|
|
81
|
+
"""
|
|
82
|
+
Process a file containing base64-encoded docx content
|
|
83
|
+
"""
|
|
84
|
+
with open(input_file, 'r') as f:
|
|
85
|
+
base64_content = f.read().strip()
|
|
86
|
+
|
|
87
|
+
# Clean base64 content
|
|
88
|
+
base64_clean = base64_content.replace('\n', '').replace('\r', '').replace(' ', '')
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
docx_bytes = base64.b64decode(base64_clean)
|
|
92
|
+
except Exception as e:
|
|
93
|
+
return f"[ERROR] Base64 decode failed: {e}"
|
|
94
|
+
|
|
95
|
+
return extract_from_docx_bytes(docx_bytes)
|
|
96
|
+
|
|
97
|
+
def save_transcription(text: str, tag: str, name: str, output_dir: str) -> str:
|
|
98
|
+
"""
|
|
99
|
+
Save transcription with proper [TAG] naming
|
|
100
|
+
"""
|
|
101
|
+
# Clean the name
|
|
102
|
+
clean_name = name
|
|
103
|
+
for ext in ['.docx', '.mp4', '.txt']:
|
|
104
|
+
clean_name = clean_name.replace(ext, '')
|
|
105
|
+
clean_name = clean_name.strip(' -.')
|
|
106
|
+
|
|
107
|
+
filename = f"[{tag}] {clean_name}.txt"
|
|
108
|
+
filepath = os.path.join(output_dir, filename)
|
|
109
|
+
|
|
110
|
+
os.makedirs(output_dir, exist_ok=True)
|
|
111
|
+
|
|
112
|
+
with open(filepath, 'w', encoding='utf-8') as f:
|
|
113
|
+
f.write(text)
|
|
114
|
+
|
|
115
|
+
return filepath
|
|
116
|
+
|
|
117
|
+
if __name__ == "__main__":
|
|
118
|
+
import argparse
|
|
119
|
+
|
|
120
|
+
parser = argparse.ArgumentParser(description='Extract text from base64-encoded docx')
|
|
121
|
+
parser.add_argument('base64_file', help='File containing base64 content')
|
|
122
|
+
parser.add_argument('--tag', help='TAG for output file (e.g., JM-0003)')
|
|
123
|
+
parser.add_argument('--name', help='Original filename for output')
|
|
124
|
+
parser.add_argument('--output-dir', help='Output directory')
|
|
125
|
+
|
|
126
|
+
args = parser.parse_args()
|
|
127
|
+
|
|
128
|
+
text = process_base64_file(args.base64_file)
|
|
129
|
+
|
|
130
|
+
if text.startswith('[ERROR]'):
|
|
131
|
+
print(text, file=sys.stderr)
|
|
132
|
+
sys.exit(1)
|
|
133
|
+
|
|
134
|
+
if args.tag and args.name and args.output_dir:
|
|
135
|
+
filepath = save_transcription(text, args.tag, args.name, args.output_dir)
|
|
136
|
+
print(f"Saved: {filepath}")
|
|
137
|
+
print(f"Characters: {len(text)}")
|
|
138
|
+
print(f"Words: {len(text.split())}")
|
|
139
|
+
else:
|
|
140
|
+
# Just print the text
|
|
141
|
+
print(text)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Extract text from base64-encoded .docx files from Google Drive
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import base64
|
|
7
|
+
import subprocess
|
|
8
|
+
import tempfile
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
def extract_text_from_base64_docx(base64_content: str) -> str:
|
|
13
|
+
"""
|
|
14
|
+
Decode base64 docx content and extract text using pandoc
|
|
15
|
+
"""
|
|
16
|
+
# Decode base64
|
|
17
|
+
docx_bytes = base64.b64decode(base64_content)
|
|
18
|
+
|
|
19
|
+
# Create temp file
|
|
20
|
+
with tempfile.NamedTemporaryFile(suffix='.docx', delete=False) as tmp:
|
|
21
|
+
tmp.write(docx_bytes)
|
|
22
|
+
tmp_path = tmp.name
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
# Use pandoc to extract text
|
|
26
|
+
result = subprocess.run(
|
|
27
|
+
['pandoc', tmp_path, '-t', 'plain', '--wrap=none'],
|
|
28
|
+
capture_output=True,
|
|
29
|
+
text=True,
|
|
30
|
+
check=True
|
|
31
|
+
)
|
|
32
|
+
return result.stdout
|
|
33
|
+
finally:
|
|
34
|
+
# Clean up
|
|
35
|
+
os.unlink(tmp_path)
|
|
36
|
+
|
|
37
|
+
def save_transcription(text: str, tag: str, name: str, output_dir: str) -> str:
|
|
38
|
+
"""
|
|
39
|
+
Save extracted text to file with proper naming
|
|
40
|
+
"""
|
|
41
|
+
# Clean filename
|
|
42
|
+
clean_name = name.replace('.docx', '').replace('.mp4', '').strip()
|
|
43
|
+
filename = f"[{tag}] {clean_name}.txt"
|
|
44
|
+
filepath = os.path.join(output_dir, filename)
|
|
45
|
+
|
|
46
|
+
with open(filepath, 'w', encoding='utf-8') as f:
|
|
47
|
+
f.write(text)
|
|
48
|
+
|
|
49
|
+
return filepath
|
|
50
|
+
|
|
51
|
+
if __name__ == "__main__":
|
|
52
|
+
if len(sys.argv) < 2:
|
|
53
|
+
print("Usage: python extract-docx-text.py <base64_content>")
|
|
54
|
+
sys.exit(1)
|
|
55
|
+
|
|
56
|
+
base64_content = sys.argv[1]
|
|
57
|
+
text = extract_text_from_base64_docx(base64_content)
|
|
58
|
+
print(text)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Extract a single transcription directly from Google Drive
|
|
4
|
+
Uses the MCP gdrive API output format
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import base64
|
|
8
|
+
import subprocess
|
|
9
|
+
import tempfile
|
|
10
|
+
import os
|
|
11
|
+
import sys
|
|
12
|
+
import re
|
|
13
|
+
import zipfile
|
|
14
|
+
|
|
15
|
+
def extract_text_from_docx_bytes(docx_bytes: bytes) -> str:
|
|
16
|
+
"""
|
|
17
|
+
Extract text from docx bytes using pandoc or fallback to XML parsing
|
|
18
|
+
"""
|
|
19
|
+
# Create temp file
|
|
20
|
+
with tempfile.NamedTemporaryFile(suffix='.docx', delete=False) as tmp:
|
|
21
|
+
tmp.write(docx_bytes)
|
|
22
|
+
tmp_path = tmp.name
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
# First try pandoc
|
|
26
|
+
result = subprocess.run(
|
|
27
|
+
['pandoc', tmp_path, '-t', 'plain', '--wrap=none'],
|
|
28
|
+
capture_output=True,
|
|
29
|
+
text=True,
|
|
30
|
+
timeout=30
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
if result.returncode == 0:
|
|
34
|
+
return result.stdout
|
|
35
|
+
|
|
36
|
+
# Fallback: extract from XML directly
|
|
37
|
+
with zipfile.ZipFile(tmp_path, 'r') as z:
|
|
38
|
+
if 'word/document.xml' in z.namelist():
|
|
39
|
+
xml_content = z.read('word/document.xml').decode('utf-8')
|
|
40
|
+
# Extract text from <w:t> tags
|
|
41
|
+
texts = re.findall(r'<w:t[^>]*>([^<]*)</w:t>', xml_content)
|
|
42
|
+
return ' '.join(texts)
|
|
43
|
+
|
|
44
|
+
return "[ERROR] Could not extract text"
|
|
45
|
+
|
|
46
|
+
except Exception as e:
|
|
47
|
+
return f"[ERROR] {e}"
|
|
48
|
+
finally:
|
|
49
|
+
try:
|
|
50
|
+
os.unlink(tmp_path)
|
|
51
|
+
except:
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
def main():
|
|
55
|
+
# Read base64 from stdin
|
|
56
|
+
base64_content = sys.stdin.read().strip()
|
|
57
|
+
|
|
58
|
+
if not base64_content:
|
|
59
|
+
print("[ERROR] No base64 content provided via stdin")
|
|
60
|
+
sys.exit(1)
|
|
61
|
+
|
|
62
|
+
try:
|
|
63
|
+
docx_bytes = base64.b64decode(base64_content)
|
|
64
|
+
print(f"[INFO] Decoded {len(docx_bytes)} bytes", file=sys.stderr)
|
|
65
|
+
|
|
66
|
+
text = extract_text_from_docx_bytes(docx_bytes)
|
|
67
|
+
print(text)
|
|
68
|
+
|
|
69
|
+
except Exception as e:
|
|
70
|
+
print(f"[ERROR] {e}")
|
|
71
|
+
sys.exit(1)
|
|
72
|
+
|
|
73
|
+
if __name__ == "__main__":
|
|
74
|
+
main()
|