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,597 @@
|
|
|
1
|
+
# TAG-RESOLVER-IMPLEMENTATION.md
|
|
2
|
+
# Instruções para Criar o Sistema de Resolução TAG ↔ Path
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## CONTEXTO
|
|
7
|
+
|
|
8
|
+
O sistema atual tem uma lacuna crítica:
|
|
9
|
+
- `PLANILHA-INDEX.json` tem 915 entries com `tag`, `original_name`, `sheet`
|
|
10
|
+
- **NÃO TEM** campo `path` - não sabe onde o arquivo está fisicamente
|
|
11
|
+
- Batches referenciam TAGs (ex: `JH-ST-0002`)
|
|
12
|
+
- Agentes não conseguem resolver TAG → arquivo real
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## PARTE 1: CRIAR TAG-RESOLVER.json
|
|
17
|
+
|
|
18
|
+
### 1.1 Script Python para Gerar o Resolver
|
|
19
|
+
|
|
20
|
+
Criar arquivo `scripts/create-tag-resolver.py`:
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
#!/usr/bin/env python3
|
|
24
|
+
"""
|
|
25
|
+
TAG-RESOLVER Generator
|
|
26
|
+
Cria índice bidirecional TAG ↔ Path para o sistema Mega Brain
|
|
27
|
+
|
|
28
|
+
Uso:
|
|
29
|
+
python create-tag-resolver.py
|
|
30
|
+
|
|
31
|
+
Output:
|
|
32
|
+
knowledge/TAG-RESOLVER.json
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
import os
|
|
36
|
+
import re
|
|
37
|
+
import json
|
|
38
|
+
from datetime import datetime
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
from collections import defaultdict
|
|
41
|
+
|
|
42
|
+
# Configuração
|
|
43
|
+
MEGA_BRAIN_ROOT = Path(__file__).parent.parent # Sobe de scripts para raiz
|
|
44
|
+
INBOX_PATH = MEGA_BRAIN_ROOT / "inbox"
|
|
45
|
+
OUTPUT_PATH = MEGA_BRAIN_ROOT / "knowledge" / "TAG-RESOLVER.json"
|
|
46
|
+
PLANILHA_INDEX_PATH = MEGA_BRAIN_ROOT / "PLANILHA-INDEX.json"
|
|
47
|
+
|
|
48
|
+
# Regex para extrair TAGs do nome do arquivo
|
|
49
|
+
# Formatos suportados:
|
|
50
|
+
# - [JM-0114] filename.txt
|
|
51
|
+
# - [JH-ST-0002] filename.txt
|
|
52
|
+
TAG_PATTERN = re.compile(r'\[([A-Z0-9]+-[A-Z]*-?\d+)\]')
|
|
53
|
+
|
|
54
|
+
def extract_tag_from_filename(filename: str) -> str | None:
|
|
55
|
+
"""Extrai TAG do nome do arquivo"""
|
|
56
|
+
match = TAG_PATTERN.search(filename)
|
|
57
|
+
return match.group(1) if match else None
|
|
58
|
+
|
|
59
|
+
def get_source_code(path: str) -> str:
|
|
60
|
+
"""Determina o código fonte baseado no path"""
|
|
61
|
+
path_lower = path.lower()
|
|
62
|
+
|
|
63
|
+
if "jeremy miner" in path_lower or "7th level" in path_lower:
|
|
64
|
+
return "JM"
|
|
65
|
+
elif "jeremy haynes" in path_lower:
|
|
66
|
+
if "sales-training" in path_lower:
|
|
67
|
+
return "JH-ST"
|
|
68
|
+
elif "inbound-closer" in path_lower:
|
|
69
|
+
return "JH-IC"
|
|
70
|
+
else:
|
|
71
|
+
return "JH"
|
|
72
|
+
elif "alex hormozi" in path_lower or "alex-hormozi" in path_lower:
|
|
73
|
+
return "AH"
|
|
74
|
+
elif "cole gordon" in path_lower or "cole-gordon" in path_lower:
|
|
75
|
+
return "CG"
|
|
76
|
+
else:
|
|
77
|
+
return "UNK"
|
|
78
|
+
|
|
79
|
+
def scan_inbox(inbox_path: Path) -> dict:
|
|
80
|
+
"""Varre o INBOX e cria mapeamento TAG → Path"""
|
|
81
|
+
|
|
82
|
+
tag_to_path = {}
|
|
83
|
+
path_to_tag = {}
|
|
84
|
+
stats = {
|
|
85
|
+
"total_files": 0,
|
|
86
|
+
"files_with_tag": 0,
|
|
87
|
+
"files_without_tag": 0,
|
|
88
|
+
"by_source": defaultdict(int),
|
|
89
|
+
"duplicates": [],
|
|
90
|
+
"errors": []
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
print(f"Scanning: {inbox_path}")
|
|
94
|
+
|
|
95
|
+
for root, dirs, files in os.walk(inbox_path):
|
|
96
|
+
# Ignorar pastas de backup
|
|
97
|
+
dirs[:] = [d for d in dirs if not d.startswith('_')]
|
|
98
|
+
|
|
99
|
+
for filename in files:
|
|
100
|
+
# Ignorar arquivos ocultos e de sistema
|
|
101
|
+
if filename.startswith('.') or filename.startswith('_'):
|
|
102
|
+
continue
|
|
103
|
+
|
|
104
|
+
stats["total_files"] += 1
|
|
105
|
+
|
|
106
|
+
full_path = os.path.join(root, filename)
|
|
107
|
+
relative_path = os.path.relpath(full_path, MEGA_BRAIN_ROOT)
|
|
108
|
+
|
|
109
|
+
tag = extract_tag_from_filename(filename)
|
|
110
|
+
|
|
111
|
+
if tag:
|
|
112
|
+
stats["files_with_tag"] += 1
|
|
113
|
+
source = get_source_code(relative_path)
|
|
114
|
+
stats["by_source"][source] += 1
|
|
115
|
+
|
|
116
|
+
# Verificar duplicata
|
|
117
|
+
if tag in tag_to_path:
|
|
118
|
+
stats["duplicates"].append({
|
|
119
|
+
"tag": tag,
|
|
120
|
+
"path1": tag_to_path[tag],
|
|
121
|
+
"path2": relative_path
|
|
122
|
+
})
|
|
123
|
+
print(f" ⚠️ TAG duplicada: {tag}")
|
|
124
|
+
else:
|
|
125
|
+
tag_to_path[tag] = relative_path
|
|
126
|
+
path_to_tag[relative_path] = tag
|
|
127
|
+
else:
|
|
128
|
+
stats["files_without_tag"] += 1
|
|
129
|
+
|
|
130
|
+
return {
|
|
131
|
+
"tag_to_path": tag_to_path,
|
|
132
|
+
"path_to_tag": path_to_tag,
|
|
133
|
+
"stats": stats
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
def load_planilha_index(path: Path) -> dict:
|
|
137
|
+
"""Carrega PLANILHA-INDEX.json existente"""
|
|
138
|
+
if path.exists():
|
|
139
|
+
with open(path, 'r', encoding='utf-8') as f:
|
|
140
|
+
return json.load(f)
|
|
141
|
+
return {"entries": []}
|
|
142
|
+
|
|
143
|
+
def merge_with_planilha(resolver_data: dict, planilha_data: dict) -> dict:
|
|
144
|
+
"""Merge resolver com dados da planilha"""
|
|
145
|
+
|
|
146
|
+
tag_to_path = resolver_data["tag_to_path"]
|
|
147
|
+
|
|
148
|
+
# Criar índice por tag da planilha
|
|
149
|
+
planilha_by_tag = {}
|
|
150
|
+
for entry in planilha_data.get("entries", []):
|
|
151
|
+
if "tag" in entry:
|
|
152
|
+
planilha_by_tag[entry["tag"]] = entry
|
|
153
|
+
|
|
154
|
+
# Criar entries enriquecidas
|
|
155
|
+
enriched_entries = []
|
|
156
|
+
|
|
157
|
+
for tag, path in tag_to_path.items():
|
|
158
|
+
entry = {
|
|
159
|
+
"tag": tag,
|
|
160
|
+
"path": path,
|
|
161
|
+
"source": get_source_code(path),
|
|
162
|
+
"filename": os.path.basename(path)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
# Enriquecer com dados da planilha se existir
|
|
166
|
+
if tag in planilha_by_tag:
|
|
167
|
+
planilha_entry = planilha_by_tag[tag]
|
|
168
|
+
entry["original_name"] = planilha_entry.get("original_name")
|
|
169
|
+
entry["sheet"] = planilha_entry.get("sheet")
|
|
170
|
+
entry["in_planilha"] = True
|
|
171
|
+
else:
|
|
172
|
+
entry["in_planilha"] = False
|
|
173
|
+
|
|
174
|
+
enriched_entries.append(entry)
|
|
175
|
+
|
|
176
|
+
# Identificar TAGs na planilha sem arquivo
|
|
177
|
+
orphan_tags = []
|
|
178
|
+
for tag in planilha_by_tag:
|
|
179
|
+
if tag not in tag_to_path:
|
|
180
|
+
orphan_tags.append({
|
|
181
|
+
"tag": tag,
|
|
182
|
+
"original_name": planilha_by_tag[tag].get("original_name"),
|
|
183
|
+
"sheet": planilha_by_tag[tag].get("sheet")
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
"entries": enriched_entries,
|
|
188
|
+
"orphan_tags": orphan_tags
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
def create_tag_resolver():
|
|
192
|
+
"""Função principal - cria TAG-RESOLVER.json"""
|
|
193
|
+
|
|
194
|
+
print("=" * 60)
|
|
195
|
+
print("TAG-RESOLVER Generator")
|
|
196
|
+
print("=" * 60)
|
|
197
|
+
print()
|
|
198
|
+
|
|
199
|
+
# 1. Scan do INBOX
|
|
200
|
+
print("📁 Fase 1: Scanning INBOX...")
|
|
201
|
+
resolver_data = scan_inbox(INBOX_PATH)
|
|
202
|
+
|
|
203
|
+
print(f" Total arquivos: {resolver_data['stats']['total_files']}")
|
|
204
|
+
print(f" Com TAG: {resolver_data['stats']['files_with_tag']}")
|
|
205
|
+
print(f" Sem TAG: {resolver_data['stats']['files_without_tag']}")
|
|
206
|
+
print()
|
|
207
|
+
|
|
208
|
+
# 2. Carregar planilha existente
|
|
209
|
+
print("📊 Fase 2: Loading PLANILHA-INDEX.json...")
|
|
210
|
+
planilha_data = load_planilha_index(PLANILHA_INDEX_PATH)
|
|
211
|
+
print(f" Entries na planilha: {len(planilha_data.get('entries', []))}")
|
|
212
|
+
print()
|
|
213
|
+
|
|
214
|
+
# 3. Merge dados
|
|
215
|
+
print("🔗 Fase 3: Merging data...")
|
|
216
|
+
merged_data = merge_with_planilha(resolver_data, planilha_data)
|
|
217
|
+
print(f" Entries enriquecidas: {len(merged_data['entries'])}")
|
|
218
|
+
print(f" TAGs órfãs (na planilha sem arquivo): {len(merged_data['orphan_tags'])}")
|
|
219
|
+
print()
|
|
220
|
+
|
|
221
|
+
# 4. Criar output final
|
|
222
|
+
output = {
|
|
223
|
+
"version": "1.0.0",
|
|
224
|
+
"generated_at": datetime.utcnow().isoformat() + "Z",
|
|
225
|
+
"generator": "create-tag-resolver.py",
|
|
226
|
+
"stats": {
|
|
227
|
+
"total_files_scanned": resolver_data["stats"]["total_files"],
|
|
228
|
+
"files_with_tag": resolver_data["stats"]["files_with_tag"],
|
|
229
|
+
"files_without_tag": resolver_data["stats"]["files_without_tag"],
|
|
230
|
+
"by_source": dict(resolver_data["stats"]["by_source"]),
|
|
231
|
+
"duplicates_found": len(resolver_data["stats"]["duplicates"]),
|
|
232
|
+
"orphan_tags": len(merged_data["orphan_tags"])
|
|
233
|
+
},
|
|
234
|
+
"tag_to_path": resolver_data["tag_to_path"],
|
|
235
|
+
"path_to_tag": resolver_data["path_to_tag"],
|
|
236
|
+
"entries": merged_data["entries"],
|
|
237
|
+
"orphan_tags": merged_data["orphan_tags"],
|
|
238
|
+
"duplicates": resolver_data["stats"]["duplicates"]
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
# 5. Salvar
|
|
242
|
+
print(f"💾 Fase 4: Saving to {OUTPUT_PATH}...")
|
|
243
|
+
OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
244
|
+
|
|
245
|
+
with open(OUTPUT_PATH, 'w', encoding='utf-8') as f:
|
|
246
|
+
json.dump(output, f, indent=2, ensure_ascii=False)
|
|
247
|
+
|
|
248
|
+
print(f" ✅ Salvo: {OUTPUT_PATH}")
|
|
249
|
+
print()
|
|
250
|
+
|
|
251
|
+
# 6. Sumário
|
|
252
|
+
print("=" * 60)
|
|
253
|
+
print("SUMÁRIO")
|
|
254
|
+
print("=" * 60)
|
|
255
|
+
print(f"Total TAGs mapeadas: {len(output['tag_to_path'])}")
|
|
256
|
+
print(f"Por fonte:")
|
|
257
|
+
for source, count in sorted(output["stats"]["by_source"].items()):
|
|
258
|
+
print(f" - {source}: {count}")
|
|
259
|
+
|
|
260
|
+
if output["duplicates"]:
|
|
261
|
+
print(f"\n⚠️ ATENÇÃO: {len(output['duplicates'])} TAGs duplicadas encontradas!")
|
|
262
|
+
for dup in output["duplicates"][:5]:
|
|
263
|
+
print(f" - {dup['tag']}: {dup['path1']} vs {dup['path2']}")
|
|
264
|
+
|
|
265
|
+
if output["orphan_tags"]:
|
|
266
|
+
print(f"\n⚠️ ATENÇÃO: {len(output['orphan_tags'])} TAGs na planilha sem arquivo!")
|
|
267
|
+
for orphan in output["orphan_tags"][:5]:
|
|
268
|
+
print(f" - {orphan['tag']}: {orphan['original_name']}")
|
|
269
|
+
|
|
270
|
+
print()
|
|
271
|
+
print("✅ TAG-RESOLVER.json criado com sucesso!")
|
|
272
|
+
return output
|
|
273
|
+
|
|
274
|
+
if __name__ == "__main__":
|
|
275
|
+
create_tag_resolver()
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### 1.2 Executar o Script
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
python3 scripts/create-tag-resolver.py
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
**Resultado esperado:**
|
|
285
|
+
- Arquivo `knowledge/TAG-RESOLVER.json` criado
|
|
286
|
+
- ~727 TAGs mapeadas para seus paths
|
|
287
|
+
- Relatório de TAGs duplicadas ou órfãs
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## PARTE 2: VALIDAR TAG-RESOLVER
|
|
292
|
+
|
|
293
|
+
### 2.1 Verificar Estrutura
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
# Verificar que arquivo foi criado
|
|
297
|
+
ls -la "knowledge/TAG-RESOLVER.json"
|
|
298
|
+
|
|
299
|
+
# Ver estatísticas
|
|
300
|
+
cat "knowledge/TAG-RESOLVER.json" | python3 -c "
|
|
301
|
+
import json, sys
|
|
302
|
+
data = json.load(sys.stdin)
|
|
303
|
+
print('=== TAG-RESOLVER Stats ===')
|
|
304
|
+
print(f'Version: {data[\"version\"]}')
|
|
305
|
+
print(f'Generated: {data[\"generated_at\"]}')
|
|
306
|
+
print(f'Total TAGs: {len(data[\"tag_to_path\"])}')
|
|
307
|
+
print()
|
|
308
|
+
print('Por fonte:')
|
|
309
|
+
for src, count in sorted(data['stats']['by_source'].items()):
|
|
310
|
+
print(f' {src}: {count}')
|
|
311
|
+
print()
|
|
312
|
+
print(f'Duplicatas: {data[\"stats\"][\"duplicates_found\"]}')
|
|
313
|
+
print(f'Órfãs: {data[\"stats\"][\"orphan_tags\"]}')
|
|
314
|
+
"
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### 2.2 Testar Resolução de TAGs
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
# Script de teste rápido
|
|
321
|
+
python3 << 'EOF'
|
|
322
|
+
import json
|
|
323
|
+
|
|
324
|
+
with open("knowledge/TAG-RESOLVER.json") as f:
|
|
325
|
+
resolver = json.load(f)
|
|
326
|
+
|
|
327
|
+
# Testar algumas TAGs conhecidas
|
|
328
|
+
|
|
329
|
+
print("=== Teste de Resolução TAG → Path ===")
|
|
330
|
+
for tag in test_tags:
|
|
331
|
+
path = resolver["tag_to_path"].get(tag)
|
|
332
|
+
if path:
|
|
333
|
+
print(f"✅ {tag} → {path}")
|
|
334
|
+
else:
|
|
335
|
+
print(f"❌ {tag} → NOT FOUND")
|
|
336
|
+
|
|
337
|
+
print()
|
|
338
|
+
print("=== Teste de Resolução Path → TAG ===")
|
|
339
|
+
# Pegar 3 paths aleatórios
|
|
340
|
+
for path in list(resolver["path_to_tag"].keys())[:3]:
|
|
341
|
+
tag = resolver["path_to_tag"][path]
|
|
342
|
+
print(f"✅ {path[:50]}... → {tag}")
|
|
343
|
+
EOF
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### 2.3 Resultado Esperado
|
|
347
|
+
|
|
348
|
+
```
|
|
349
|
+
╔══════════════════════════════════════════════════════════════════════════════╗
|
|
350
|
+
║ TAG-RESOLVER VALIDAÇÃO ║
|
|
351
|
+
╠══════════════════════════════════════════════════════════════════════════════╣
|
|
352
|
+
║ ║
|
|
353
|
+
║ [✓] Arquivo criado em knowledge/TAG-RESOLVER.json ║
|
|
354
|
+
║ [✓] ~727 TAGs mapeadas ║
|
|
355
|
+
║ [✓] Resolução bidirecional funcionando ║
|
|
356
|
+
║ [✓] Stats por fonte calculados ║
|
|
357
|
+
║ [✓] Duplicatas identificadas (se houver) ║
|
|
358
|
+
║ [✓] Órfãs identificadas (TAGs na planilha sem arquivo) ║
|
|
359
|
+
║ ║
|
|
360
|
+
╚══════════════════════════════════════════════════════════════════════════════╝
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
## PARTE 3: FUNÇÃO HELPER PARA USO EM SCRIPTS
|
|
366
|
+
|
|
367
|
+
### 3.1 Criar Módulo tag_resolver.py
|
|
368
|
+
|
|
369
|
+
Adicionar em `scripts/lib/tag_resolver.py`:
|
|
370
|
+
|
|
371
|
+
```python
|
|
372
|
+
#!/usr/bin/env python3
|
|
373
|
+
"""
|
|
374
|
+
TAG Resolver Library
|
|
375
|
+
Funções helper para resolver TAG ↔ Path em scripts do Mega Brain
|
|
376
|
+
"""
|
|
377
|
+
|
|
378
|
+
import json
|
|
379
|
+
import os
|
|
380
|
+
from pathlib import Path
|
|
381
|
+
from functools import lru_cache
|
|
382
|
+
|
|
383
|
+
# Cache do resolver
|
|
384
|
+
_resolver_cache = None
|
|
385
|
+
_resolver_path = None
|
|
386
|
+
|
|
387
|
+
def get_resolver_path() -> Path:
|
|
388
|
+
"""Retorna path do TAG-RESOLVER.json"""
|
|
389
|
+
global _resolver_path
|
|
390
|
+
if _resolver_path is None:
|
|
391
|
+
# Tenta encontrar o arquivo subindo diretórios
|
|
392
|
+
current = Path(__file__).resolve()
|
|
393
|
+
for _ in range(5):
|
|
394
|
+
current = current.parent
|
|
395
|
+
candidate = current / "knowledge" / "TAG-RESOLVER.json"
|
|
396
|
+
if candidate.exists():
|
|
397
|
+
_resolver_path = candidate
|
|
398
|
+
break
|
|
399
|
+
return _resolver_path
|
|
400
|
+
|
|
401
|
+
@lru_cache(maxsize=1)
|
|
402
|
+
def load_resolver() -> dict:
|
|
403
|
+
"""Carrega e cacheia o TAG-RESOLVER.json"""
|
|
404
|
+
global _resolver_cache
|
|
405
|
+
if _resolver_cache is None:
|
|
406
|
+
path = get_resolver_path()
|
|
407
|
+
if path and path.exists():
|
|
408
|
+
with open(path, 'r', encoding='utf-8') as f:
|
|
409
|
+
_resolver_cache = json.load(f)
|
|
410
|
+
else:
|
|
411
|
+
raise FileNotFoundError("TAG-RESOLVER.json não encontrado. Execute create-tag-resolver.py primeiro.")
|
|
412
|
+
return _resolver_cache
|
|
413
|
+
|
|
414
|
+
def resolve_tag(tag: str) -> str | None:
|
|
415
|
+
"""
|
|
416
|
+
Resolve TAG para path do arquivo
|
|
417
|
+
|
|
418
|
+
Args:
|
|
419
|
+
tag: TAG no formato "JM-0114" ou "[JM-0114]"
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
Path relativo do arquivo ou None se não encontrado
|
|
423
|
+
"""
|
|
424
|
+
# Remove colchetes se presentes
|
|
425
|
+
tag = tag.strip("[]")
|
|
426
|
+
|
|
427
|
+
resolver = load_resolver()
|
|
428
|
+
return resolver["tag_to_path"].get(tag)
|
|
429
|
+
|
|
430
|
+
def resolve_path(path: str) -> str | None:
|
|
431
|
+
"""
|
|
432
|
+
Resolve path para TAG
|
|
433
|
+
|
|
434
|
+
Args:
|
|
435
|
+
path: Path relativo do arquivo
|
|
436
|
+
|
|
437
|
+
Returns:
|
|
438
|
+
TAG ou None se não encontrado
|
|
439
|
+
"""
|
|
440
|
+
resolver = load_resolver()
|
|
441
|
+
return resolver["path_to_tag"].get(path)
|
|
442
|
+
|
|
443
|
+
def get_entry(tag: str) -> dict | None:
|
|
444
|
+
"""
|
|
445
|
+
Retorna entry completa para uma TAG
|
|
446
|
+
|
|
447
|
+
Args:
|
|
448
|
+
tag: TAG no formato "JM-0114"
|
|
449
|
+
|
|
450
|
+
Returns:
|
|
451
|
+
Dict com tag, path, source, filename, original_name, sheet, in_planilha
|
|
452
|
+
"""
|
|
453
|
+
tag = tag.strip("[]")
|
|
454
|
+
resolver = load_resolver()
|
|
455
|
+
|
|
456
|
+
for entry in resolver["entries"]:
|
|
457
|
+
if entry["tag"] == tag:
|
|
458
|
+
return entry
|
|
459
|
+
return None
|
|
460
|
+
|
|
461
|
+
def get_tags_by_source(source_code: str) -> list:
|
|
462
|
+
"""
|
|
463
|
+
Retorna todas as TAGs de uma fonte específica
|
|
464
|
+
|
|
465
|
+
Args:
|
|
466
|
+
|
|
467
|
+
Returns:
|
|
468
|
+
Lista de dicts com tag e path
|
|
469
|
+
"""
|
|
470
|
+
resolver = load_resolver()
|
|
471
|
+
return [
|
|
472
|
+
{"tag": e["tag"], "path": e["path"]}
|
|
473
|
+
for e in resolver["entries"]
|
|
474
|
+
if e.get("source") == source_code
|
|
475
|
+
]
|
|
476
|
+
|
|
477
|
+
def validate_tags(tags: list) -> dict:
|
|
478
|
+
"""
|
|
479
|
+
Valida lista de TAGs
|
|
480
|
+
|
|
481
|
+
Args:
|
|
482
|
+
tags: Lista de TAGs
|
|
483
|
+
|
|
484
|
+
Returns:
|
|
485
|
+
Dict com valid (lista de TAGs encontradas) e invalid (não encontradas)
|
|
486
|
+
"""
|
|
487
|
+
resolver = load_resolver()
|
|
488
|
+
tag_set = set(resolver["tag_to_path"].keys())
|
|
489
|
+
|
|
490
|
+
valid = []
|
|
491
|
+
invalid = []
|
|
492
|
+
|
|
493
|
+
for tag in tags:
|
|
494
|
+
tag = tag.strip("[]")
|
|
495
|
+
if tag in tag_set:
|
|
496
|
+
valid.append(tag)
|
|
497
|
+
else:
|
|
498
|
+
invalid.append(tag)
|
|
499
|
+
|
|
500
|
+
return {"valid": valid, "invalid": invalid}
|
|
501
|
+
|
|
502
|
+
# Funções de conveniência
|
|
503
|
+
def tag_exists(tag: str) -> bool:
|
|
504
|
+
"""Verifica se TAG existe no resolver"""
|
|
505
|
+
return resolve_tag(tag) is not None
|
|
506
|
+
|
|
507
|
+
def get_absolute_path(tag: str, mega_brain_root: str = None) -> str | None:
|
|
508
|
+
"""Retorna path absoluto para uma TAG"""
|
|
509
|
+
relative = resolve_tag(tag)
|
|
510
|
+
if relative is None:
|
|
511
|
+
return None
|
|
512
|
+
|
|
513
|
+
if mega_brain_root is None:
|
|
514
|
+
mega_brain_root = get_resolver_path().parent.parent
|
|
515
|
+
|
|
516
|
+
return os.path.join(mega_brain_root, relative)
|
|
517
|
+
|
|
518
|
+
# Stats helpers
|
|
519
|
+
def get_stats() -> dict:
|
|
520
|
+
"""Retorna estatísticas do resolver"""
|
|
521
|
+
return load_resolver()["stats"]
|
|
522
|
+
|
|
523
|
+
def get_orphan_tags() -> list:
|
|
524
|
+
"""Retorna TAGs que estão na planilha mas não têm arquivo"""
|
|
525
|
+
return load_resolver()["orphan_tags"]
|
|
526
|
+
|
|
527
|
+
def get_duplicates() -> list:
|
|
528
|
+
"""Retorna TAGs duplicadas encontradas"""
|
|
529
|
+
return load_resolver()["duplicates"]
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### 3.2 Criar __init__.py
|
|
533
|
+
|
|
534
|
+
```bash
|
|
535
|
+
mkdir -p scripts/lib
|
|
536
|
+
touch scripts/lib/__init__.py
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
## PARTE 4: ATUALIZAR PLANILHA-INDEX.json
|
|
542
|
+
|
|
543
|
+
### 4.1 Script para Adicionar Campo Path
|
|
544
|
+
|
|
545
|
+
```python
|
|
546
|
+
#!/usr/bin/env python3
|
|
547
|
+
"""
|
|
548
|
+
Atualiza PLANILHA-INDEX.json com campo 'path' do TAG-RESOLVER
|
|
549
|
+
"""
|
|
550
|
+
|
|
551
|
+
import json
|
|
552
|
+
from pathlib import Path
|
|
553
|
+
|
|
554
|
+
MEGA_BRAIN = Path(".")
|
|
555
|
+
PLANILHA_PATH = MEGA_BRAIN / "PLANILHA-INDEX.json"
|
|
556
|
+
RESOLVER_PATH = MEGA_BRAIN / "knowledge" / "TAG-RESOLVER.json"
|
|
557
|
+
|
|
558
|
+
# Carregar arquivos
|
|
559
|
+
with open(RESOLVER_PATH) as f:
|
|
560
|
+
resolver = json.load(f)
|
|
561
|
+
|
|
562
|
+
with open(PLANILHA_PATH) as f:
|
|
563
|
+
planilha = json.load(f)
|
|
564
|
+
|
|
565
|
+
# Criar índice tag → path
|
|
566
|
+
tag_to_path = resolver["tag_to_path"]
|
|
567
|
+
|
|
568
|
+
# Atualizar entries
|
|
569
|
+
updated = 0
|
|
570
|
+
not_found = 0
|
|
571
|
+
|
|
572
|
+
for entry in planilha.get("entries", []):
|
|
573
|
+
tag = entry.get("tag")
|
|
574
|
+
if tag and tag in tag_to_path:
|
|
575
|
+
entry["path"] = tag_to_path[tag]
|
|
576
|
+
updated += 1
|
|
577
|
+
else:
|
|
578
|
+
entry["path"] = None
|
|
579
|
+
not_found += 1
|
|
580
|
+
|
|
581
|
+
# Salvar
|
|
582
|
+
with open(PLANILHA_PATH, 'w', encoding='utf-8') as f:
|
|
583
|
+
json.dump(planilha, f, indent=2, ensure_ascii=False)
|
|
584
|
+
|
|
585
|
+
print(f"PLANILHA-INDEX.json atualizada!")
|
|
586
|
+
print(f" Entries com path: {updated}")
|
|
587
|
+
print(f" Entries sem path: {not_found}")
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
---
|
|
591
|
+
|
|
592
|
+
## PRÓXIMO PASSO
|
|
593
|
+
|
|
594
|
+
Após completar esta parte, execute as instruções em:
|
|
595
|
+
**`INTEGRATION-POINTS.md`**
|
|
596
|
+
|
|
597
|
+
Isso conectará o TAG-RESOLVER aos scripts existentes da pipeline.
|