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,120 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
JARVIS Post Tool Use Hook
|
|
4
|
+
Executado após Claude Code usar uma ferramenta de edição/escrita.
|
|
5
|
+
|
|
6
|
+
Responsabilidades:
|
|
7
|
+
1. Registrar arquivos modificados
|
|
8
|
+
2. Detectar padrões
|
|
9
|
+
3. Sugerir melhorias quando apropriado
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import sys
|
|
14
|
+
import os
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
def get_project_dir():
|
|
19
|
+
"""Obtém o diretório do projeto."""
|
|
20
|
+
return os.environ.get('CLAUDE_PROJECT_DIR', os.getcwd())
|
|
21
|
+
|
|
22
|
+
def load_actions_log():
|
|
23
|
+
"""Carrega log de ações."""
|
|
24
|
+
project_dir = get_project_dir()
|
|
25
|
+
log_path = Path(project_dir) / 'logs' / 'actions.json'
|
|
26
|
+
|
|
27
|
+
if log_path.exists():
|
|
28
|
+
with open(log_path, 'r', encoding='utf-8') as f:
|
|
29
|
+
return json.load(f)
|
|
30
|
+
return {'actions': []}
|
|
31
|
+
|
|
32
|
+
def save_actions_log(log):
|
|
33
|
+
"""Salva log de ações."""
|
|
34
|
+
project_dir = get_project_dir()
|
|
35
|
+
log_path = Path(project_dir) / 'logs' / 'actions.json'
|
|
36
|
+
log_path.parent.mkdir(parents=True, exist_ok=True)
|
|
37
|
+
|
|
38
|
+
# Manter apenas últimas 100 ações
|
|
39
|
+
log['actions'] = log['actions'][-100:]
|
|
40
|
+
|
|
41
|
+
with open(log_path, 'w', encoding='utf-8') as f:
|
|
42
|
+
json.dump(log, f, indent=2, ensure_ascii=False)
|
|
43
|
+
|
|
44
|
+
def detect_patterns(actions):
|
|
45
|
+
"""Detecta padrões nas ações recentes."""
|
|
46
|
+
if len(actions) < 3:
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
# Verificar se mesmo arquivo foi editado múltiplas vezes
|
|
50
|
+
recent = actions[-10:]
|
|
51
|
+
file_counts = {}
|
|
52
|
+
for action in recent:
|
|
53
|
+
file_path = action.get('file_path', '')
|
|
54
|
+
if file_path:
|
|
55
|
+
file_counts[file_path] = file_counts.get(file_path, 0) + 1
|
|
56
|
+
|
|
57
|
+
# Se algum arquivo foi editado 3+ vezes
|
|
58
|
+
repeated = [f for f, c in file_counts.items() if c >= 3]
|
|
59
|
+
if repeated:
|
|
60
|
+
return {
|
|
61
|
+
'type': 'repeated_edits',
|
|
62
|
+
'files': repeated,
|
|
63
|
+
'suggestion': 'Arquivo editado múltiplas vezes. Considerar refatoração.'
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return None
|
|
67
|
+
|
|
68
|
+
def main():
|
|
69
|
+
"""Função principal do hook."""
|
|
70
|
+
try:
|
|
71
|
+
# Ler input do hook (stdin)
|
|
72
|
+
input_data = sys.stdin.read()
|
|
73
|
+
hook_input = json.loads(input_data) if input_data else {}
|
|
74
|
+
|
|
75
|
+
# Extrair informações da ferramenta
|
|
76
|
+
tool_name = hook_input.get('tool_name', 'unknown')
|
|
77
|
+
tool_input = hook_input.get('tool_input', {})
|
|
78
|
+
|
|
79
|
+
file_path = tool_input.get('file_path', '')
|
|
80
|
+
|
|
81
|
+
# Carregar log
|
|
82
|
+
log = load_actions_log()
|
|
83
|
+
|
|
84
|
+
# Registrar ação
|
|
85
|
+
action = {
|
|
86
|
+
'timestamp': datetime.now().isoformat(),
|
|
87
|
+
'tool': tool_name,
|
|
88
|
+
'file_path': file_path,
|
|
89
|
+
'session_id': hook_input.get('session_id', 'unknown')
|
|
90
|
+
}
|
|
91
|
+
log['actions'].append(action)
|
|
92
|
+
|
|
93
|
+
# Salvar log
|
|
94
|
+
save_actions_log(log)
|
|
95
|
+
|
|
96
|
+
# Detectar padrões
|
|
97
|
+
pattern = detect_patterns(log['actions'])
|
|
98
|
+
|
|
99
|
+
# Preparar feedback
|
|
100
|
+
feedback = None
|
|
101
|
+
if pattern:
|
|
102
|
+
feedback = f"[JARVIS] Padrão detectado: {pattern['suggestion']}"
|
|
103
|
+
|
|
104
|
+
output = {
|
|
105
|
+
'continue': True,
|
|
106
|
+
'feedback': feedback
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
print(json.dumps(output))
|
|
110
|
+
|
|
111
|
+
except Exception as e:
|
|
112
|
+
# Em caso de erro, não bloquear a operação
|
|
113
|
+
error_output = {
|
|
114
|
+
'continue': True,
|
|
115
|
+
'feedback': None
|
|
116
|
+
}
|
|
117
|
+
print(json.dumps(error_output))
|
|
118
|
+
|
|
119
|
+
if __name__ == '__main__':
|
|
120
|
+
main()
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Quality Watchdog - Layer 1 do META-AGENT System v1.0
|
|
4
|
+
|
|
5
|
+
FUNÇÃO: Detecta agentes em prompts e injeta MANDATORY_SECTIONS no contexto.
|
|
6
|
+
Faz parte do sistema de enforcement de qualidade (warn, não block).
|
|
7
|
+
|
|
8
|
+
REGRA #28: META-AGENT QUALITY AWARENESS
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
import os
|
|
13
|
+
import re
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from typing import Dict, Optional
|
|
17
|
+
|
|
18
|
+
PROJECT_ROOT = Path(os.environ.get('CLAUDE_PROJECT_DIR', '.'))
|
|
19
|
+
AGENTS_PATH = PROJECT_ROOT / "agents"
|
|
20
|
+
JARVIS_SUBAGENTS = PROJECT_ROOT / ".claude" / "jarvis" / "sub-agents"
|
|
21
|
+
LOGS_PATH = PROJECT_ROOT / "logs"
|
|
22
|
+
QUALITY_GAPS_LOG = LOGS_PATH / "quality_gaps.jsonl"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
26
|
+
# AGENT DETECTION
|
|
27
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
28
|
+
|
|
29
|
+
# Keywords para sub-agents JARVIS
|
|
30
|
+
SUBAGENT_KEYWORDS = {
|
|
31
|
+
"chronicler": ["log bonito", "log visual", "chronicler", "formatar log", "status formatado", "resumo visual"],
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
# Dynamic caches (populated on first use)
|
|
35
|
+
_PERSON_KEYWORDS_CACHE = None
|
|
36
|
+
_CARGO_KEYWORDS_CACHE = None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _scan_agents_directory(subdir: str) -> Dict:
|
|
40
|
+
"""
|
|
41
|
+
Dynamically scan agents/{subdir}/ to build keyword map.
|
|
42
|
+
Each subdirectory name becomes an agent key, and keywords are
|
|
43
|
+
generated from the directory name parts.
|
|
44
|
+
"""
|
|
45
|
+
keywords = {}
|
|
46
|
+
scan_path = AGENTS_PATH / subdir
|
|
47
|
+
if not scan_path.exists():
|
|
48
|
+
return keywords
|
|
49
|
+
|
|
50
|
+
for entry in scan_path.iterdir():
|
|
51
|
+
if entry.is_dir():
|
|
52
|
+
agent_name = entry.name.lower()
|
|
53
|
+
# Generate keywords from directory name
|
|
54
|
+
parts = agent_name.replace('-', ' ').replace('_', ' ').split()
|
|
55
|
+
kws = [agent_name.replace('-', ' ')] # full name as keyword
|
|
56
|
+
# Add individual meaningful parts (skip very short ones)
|
|
57
|
+
for part in parts:
|
|
58
|
+
if len(part) >= 3:
|
|
59
|
+
kws.append(part)
|
|
60
|
+
# Also add the hyphenated form
|
|
61
|
+
if '-' in agent_name or '_' in agent_name:
|
|
62
|
+
kws.append(agent_name)
|
|
63
|
+
keywords[agent_name] = list(set(kws))
|
|
64
|
+
|
|
65
|
+
return keywords
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _get_person_keywords() -> Dict:
|
|
69
|
+
"""Lazily load person keywords from agents/persons/ directory."""
|
|
70
|
+
global _PERSON_KEYWORDS_CACHE
|
|
71
|
+
if _PERSON_KEYWORDS_CACHE is None:
|
|
72
|
+
_PERSON_KEYWORDS_CACHE = _scan_agents_directory("persons")
|
|
73
|
+
return _PERSON_KEYWORDS_CACHE
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _get_cargo_keywords() -> Dict:
|
|
77
|
+
"""Lazily load cargo keywords from agents/cargo/ directory (recursive)."""
|
|
78
|
+
global _CARGO_KEYWORDS_CACHE
|
|
79
|
+
if _CARGO_KEYWORDS_CACHE is None:
|
|
80
|
+
_CARGO_KEYWORDS_CACHE = {}
|
|
81
|
+
cargo_path = AGENTS_PATH / "cargo"
|
|
82
|
+
if cargo_path.exists():
|
|
83
|
+
# Scan all subdirectories recursively for agent folders containing AGENT.md
|
|
84
|
+
for agent_md in cargo_path.rglob("AGENT.md"):
|
|
85
|
+
agent_dir = agent_md.parent
|
|
86
|
+
agent_name = agent_dir.name.lower()
|
|
87
|
+
parts = agent_name.replace('-', ' ').replace('_', ' ').split()
|
|
88
|
+
kws = [agent_name.replace('-', ' ')]
|
|
89
|
+
for part in parts:
|
|
90
|
+
if len(part) >= 3:
|
|
91
|
+
kws.append(part)
|
|
92
|
+
_CARGO_KEYWORDS_CACHE[agent_name] = list(set(kws))
|
|
93
|
+
return _CARGO_KEYWORDS_CACHE
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def detect_agent_in_prompt(prompt: str) -> Dict:
|
|
97
|
+
"""
|
|
98
|
+
Detecta qual agente está sendo requisitado no prompt.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
dict: {type: "subagent"|"person"|"cargo"|None, name: str|None}
|
|
102
|
+
"""
|
|
103
|
+
prompt_lower = prompt.lower()
|
|
104
|
+
|
|
105
|
+
# Detecta sub-agent JARVIS (prioridade mais alta)
|
|
106
|
+
for agent, keywords in SUBAGENT_KEYWORDS.items():
|
|
107
|
+
if any(kw in prompt_lower for kw in keywords):
|
|
108
|
+
return {"type": "subagent", "name": agent}
|
|
109
|
+
|
|
110
|
+
# Detecta PERSON agent (dynamically from agents/persons/ directory)
|
|
111
|
+
for agent, keywords in _get_person_keywords().items():
|
|
112
|
+
if any(kw in prompt_lower for kw in keywords):
|
|
113
|
+
return {"type": "person", "name": agent}
|
|
114
|
+
|
|
115
|
+
# Detecta CARGO agent (dynamically from agents/cargo/ directory)
|
|
116
|
+
for agent, keywords in _get_cargo_keywords().items():
|
|
117
|
+
if any(kw in prompt_lower for kw in keywords):
|
|
118
|
+
return {"type": "cargo", "name": agent}
|
|
119
|
+
|
|
120
|
+
return {"type": None, "name": None}
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
124
|
+
# MANDATORY SECTIONS EXTRACTION
|
|
125
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
126
|
+
|
|
127
|
+
def extract_mandatory_sections(agent_path: Path) -> Dict:
|
|
128
|
+
"""
|
|
129
|
+
Extrai MANDATORY_SECTIONS do header do AGENT.md.
|
|
130
|
+
|
|
131
|
+
Prioridade:
|
|
132
|
+
1. Bloco formal <!-- MANDATORY --> ... <!-- End MANDATORY -->
|
|
133
|
+
2. Seção ## ⚠️ MANDATORY OUTPUT SECTIONS
|
|
134
|
+
3. Fallback: primeiras 50 linhas
|
|
135
|
+
"""
|
|
136
|
+
agent_md = agent_path / "AGENT.md"
|
|
137
|
+
if not agent_md.exists():
|
|
138
|
+
return {"found": False, "content": "", "lines": 0}
|
|
139
|
+
|
|
140
|
+
try:
|
|
141
|
+
content = agent_md.read_text(encoding='utf-8')
|
|
142
|
+
except Exception as e:
|
|
143
|
+
return {"found": False, "content": "", "lines": 0, "error": str(e)}
|
|
144
|
+
|
|
145
|
+
# Método 1: Bloco formal com comentários HTML
|
|
146
|
+
match = re.search(
|
|
147
|
+
r'<!-- MANDATORY -->(.+?)<!-- End MANDATORY -->',
|
|
148
|
+
content,
|
|
149
|
+
re.DOTALL | re.IGNORECASE
|
|
150
|
+
)
|
|
151
|
+
if match:
|
|
152
|
+
return {
|
|
153
|
+
"found": True,
|
|
154
|
+
"method": "html_comments",
|
|
155
|
+
"content": match.group(1).strip(),
|
|
156
|
+
"lines": len(match.group(1).split('\n'))
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# Método 2: Seção com header markdown
|
|
160
|
+
match = re.search(
|
|
161
|
+
r'## ⚠️ MANDATORY OUTPUT SECTIONS.*?(?=## [^⚠️]|$)',
|
|
162
|
+
content,
|
|
163
|
+
re.DOTALL | re.IGNORECASE
|
|
164
|
+
)
|
|
165
|
+
if match:
|
|
166
|
+
return {
|
|
167
|
+
"found": True,
|
|
168
|
+
"method": "markdown_header",
|
|
169
|
+
"content": match.group(0).strip(),
|
|
170
|
+
"lines": len(match.group(0).split('\n'))
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
# Método 3: Fallback - primeiras 50 linhas (para agents sem MANDATORY formal)
|
|
174
|
+
lines = content.split('\n')[:50]
|
|
175
|
+
return {
|
|
176
|
+
"found": False,
|
|
177
|
+
"method": "fallback_header",
|
|
178
|
+
"content": '\n'.join(lines),
|
|
179
|
+
"lines": 50
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def resolve_agent_path(agent_info: Dict) -> Optional[Path]:
|
|
184
|
+
"""Resolve o caminho do agente baseado no tipo."""
|
|
185
|
+
if not agent_info.get("name"):
|
|
186
|
+
return None
|
|
187
|
+
|
|
188
|
+
agent_name = agent_info["name"].upper()
|
|
189
|
+
|
|
190
|
+
if agent_info["type"] == "subagent":
|
|
191
|
+
return JARVIS_SUBAGENTS / agent_name
|
|
192
|
+
elif agent_info["type"] == "person":
|
|
193
|
+
return AGENTS_PATH / "persons" / agent_name
|
|
194
|
+
elif agent_info["type"] == "cargo":
|
|
195
|
+
# Cargo agents têm estrutura diferente
|
|
196
|
+
cargo_paths = {
|
|
197
|
+
"CRO": AGENTS_PATH / "cargo" / "C-LEVEL" / "CRO",
|
|
198
|
+
"CFO": AGENTS_PATH / "cargo" / "C-LEVEL" / "CFO",
|
|
199
|
+
"SALES-MANAGER": AGENTS_PATH / "cargo" / "SALES" / "SALES-MANAGER",
|
|
200
|
+
"closer": AGENTS_PATH / "cargo" / "SALES" / "closer",
|
|
201
|
+
"SDR": AGENTS_PATH / "cargo" / "SALES" / "SDR",
|
|
202
|
+
}
|
|
203
|
+
return cargo_paths.get(agent_name)
|
|
204
|
+
|
|
205
|
+
return None
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
209
|
+
# CONTEXT INJECTION
|
|
210
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
211
|
+
|
|
212
|
+
def inject_quality_context(prompt: str) -> str:
|
|
213
|
+
"""
|
|
214
|
+
Injeta contexto de qualidade se agente detectado.
|
|
215
|
+
|
|
216
|
+
Retorna string vazia se nenhum agente detectado.
|
|
217
|
+
"""
|
|
218
|
+
agent_info = detect_agent_in_prompt(prompt)
|
|
219
|
+
|
|
220
|
+
if not agent_info.get("name"):
|
|
221
|
+
return ""
|
|
222
|
+
|
|
223
|
+
agent_path = resolve_agent_path(agent_info)
|
|
224
|
+
if not agent_path or not agent_path.exists():
|
|
225
|
+
return ""
|
|
226
|
+
|
|
227
|
+
mandatory = extract_mandatory_sections(agent_path)
|
|
228
|
+
|
|
229
|
+
# Sempre injeta contexto se agente detectado
|
|
230
|
+
context = f"""
|
|
231
|
+
[QUALITY WATCHDOG ACTIVATED]
|
|
232
|
+
Agent detected: {agent_info['name']}
|
|
233
|
+
Type: {agent_info['type']}
|
|
234
|
+
Path: {agent_path}
|
|
235
|
+
|
|
236
|
+
"""
|
|
237
|
+
|
|
238
|
+
if mandatory.get("found"):
|
|
239
|
+
context += f"""--- MANDATORY SECTIONS (MUST INCLUDE IN OUTPUT) ---
|
|
240
|
+
{mandatory['content']}
|
|
241
|
+
--- END MANDATORY SECTIONS ---
|
|
242
|
+
|
|
243
|
+
⚠️ OUTPUT WILL BE VALIDATED AGAINST THESE REQUIREMENTS
|
|
244
|
+
⚠️ Quality scoring active - minimum recommended: 70/100
|
|
245
|
+
"""
|
|
246
|
+
else:
|
|
247
|
+
context += f"""--- AGENT HEADER (First 50 lines) ---
|
|
248
|
+
{mandatory['content']}
|
|
249
|
+
--- END HEADER ---
|
|
250
|
+
|
|
251
|
+
ℹ️ No formal MANDATORY_SECTIONS found. Using header as reference.
|
|
252
|
+
"""
|
|
253
|
+
|
|
254
|
+
return context
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
258
|
+
# LOGGING
|
|
259
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
260
|
+
|
|
261
|
+
def log_quality_gap(agent: str, score: int, missing: list, agent_type: str = "unknown"):
|
|
262
|
+
"""
|
|
263
|
+
Loga gap de qualidade para análise do DOCTOR (Layer 2).
|
|
264
|
+
|
|
265
|
+
Não bloqueia - apenas registra para análise posterior.
|
|
266
|
+
"""
|
|
267
|
+
# Garantir que diretório existe
|
|
268
|
+
QUALITY_GAPS_LOG.parent.mkdir(parents=True, exist_ok=True)
|
|
269
|
+
|
|
270
|
+
entry = {
|
|
271
|
+
"timestamp": datetime.now().isoformat(),
|
|
272
|
+
"agent": agent,
|
|
273
|
+
"agent_type": agent_type,
|
|
274
|
+
"score": score,
|
|
275
|
+
"missing_sections": missing,
|
|
276
|
+
"status": "gap_detected",
|
|
277
|
+
"action_taken": "logged_for_review"
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
try:
|
|
281
|
+
with open(QUALITY_GAPS_LOG, "a", encoding='utf-8') as f:
|
|
282
|
+
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
|
283
|
+
except Exception as e:
|
|
284
|
+
# Falha silenciosa - não deve interromper fluxo
|
|
285
|
+
pass
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def log_watchdog_activation(agent_info: Dict, mandatory_found: bool):
|
|
289
|
+
"""Loga ativação do watchdog para auditoria."""
|
|
290
|
+
log_file = LOGS_PATH / "watchdog_activations.jsonl"
|
|
291
|
+
log_file.parent.mkdir(parents=True, exist_ok=True)
|
|
292
|
+
|
|
293
|
+
entry = {
|
|
294
|
+
"timestamp": datetime.now().isoformat(),
|
|
295
|
+
"agent": agent_info.get("name"),
|
|
296
|
+
"type": agent_info.get("type"),
|
|
297
|
+
"mandatory_found": mandatory_found
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
try:
|
|
301
|
+
with open(log_file, "a", encoding='utf-8') as f:
|
|
302
|
+
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
|
303
|
+
except Exception:
|
|
304
|
+
pass
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
308
|
+
# MAIN INTERFACE
|
|
309
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
310
|
+
|
|
311
|
+
def process_prompt(prompt: str) -> Dict:
|
|
312
|
+
"""
|
|
313
|
+
Processa prompt e retorna contexto de qualidade se aplicável.
|
|
314
|
+
|
|
315
|
+
Interface principal para integração com user_prompt_submit.py
|
|
316
|
+
"""
|
|
317
|
+
agent_info = detect_agent_in_prompt(prompt)
|
|
318
|
+
|
|
319
|
+
result = {
|
|
320
|
+
"agent_detected": agent_info.get("name") is not None,
|
|
321
|
+
"agent_info": agent_info,
|
|
322
|
+
"context": "",
|
|
323
|
+
"mandatory_found": False
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
if agent_info.get("name"):
|
|
327
|
+
context = inject_quality_context(prompt)
|
|
328
|
+
result["context"] = context
|
|
329
|
+
result["mandatory_found"] = "MANDATORY SECTIONS" in context
|
|
330
|
+
|
|
331
|
+
# Log activation
|
|
332
|
+
log_watchdog_activation(agent_info, result["mandatory_found"])
|
|
333
|
+
|
|
334
|
+
return result
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
338
|
+
# CLI INTERFACE
|
|
339
|
+
# ═══════════════════════════════════════════════════════════════════════════
|
|
340
|
+
|
|
341
|
+
def main():
|
|
342
|
+
"""
|
|
343
|
+
Hook entry point for Claude Code UserPromptSubmit event.
|
|
344
|
+
Reads JSON from stdin, outputs JSON to stdout.
|
|
345
|
+
"""
|
|
346
|
+
import sys
|
|
347
|
+
|
|
348
|
+
try:
|
|
349
|
+
input_data = sys.stdin.read()
|
|
350
|
+
hook_input = json.loads(input_data) if input_data else {}
|
|
351
|
+
|
|
352
|
+
prompt = hook_input.get('prompt', '')
|
|
353
|
+
if not prompt:
|
|
354
|
+
print(json.dumps({'continue': True}))
|
|
355
|
+
return
|
|
356
|
+
|
|
357
|
+
result = process_prompt(prompt)
|
|
358
|
+
|
|
359
|
+
feedback = result.get('context') if result.get('agent_detected') else None
|
|
360
|
+
|
|
361
|
+
print(json.dumps({
|
|
362
|
+
'continue': True,
|
|
363
|
+
'feedback': feedback if feedback else None
|
|
364
|
+
}))
|
|
365
|
+
|
|
366
|
+
except Exception:
|
|
367
|
+
print(json.dumps({'continue': True}))
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def cli_test():
|
|
371
|
+
"""CLI test mode - run directly for debugging."""
|
|
372
|
+
import sys
|
|
373
|
+
|
|
374
|
+
if len(sys.argv) > 1:
|
|
375
|
+
test_prompt = " ".join(sys.argv[1:])
|
|
376
|
+
else:
|
|
377
|
+
test_prompt = "me dá um log bonito do conteúdo do Alex Hormozi"
|
|
378
|
+
|
|
379
|
+
print(f"Testing prompt: {test_prompt}\n")
|
|
380
|
+
|
|
381
|
+
result = process_prompt(test_prompt)
|
|
382
|
+
|
|
383
|
+
print(f"Agent detected: {result['agent_detected']}")
|
|
384
|
+
print(f"Agent info: {result['agent_info']}")
|
|
385
|
+
print(f"Mandatory found: {result['mandatory_found']}")
|
|
386
|
+
print(f"\nContext to inject:\n{result['context'][:500]}...")
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
if __name__ == "__main__":
|
|
390
|
+
import sys
|
|
391
|
+
if len(sys.argv) > 1 and sys.argv[1] == '--test':
|
|
392
|
+
cli_test()
|
|
393
|
+
else:
|
|
394
|
+
main()
|