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,360 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Creation Validator - PreToolUse Hook v1.0
|
|
4
|
+
|
|
5
|
+
Valida criações ANTES de executar, garantindo conformidade com ANTHROPIC-STANDARDS.md.
|
|
6
|
+
|
|
7
|
+
REGRAS ENFORCED:
|
|
8
|
+
- Hooks: DEVEM ter timeout: 30
|
|
9
|
+
- Skills: DEVEM ter header com Auto-Trigger, Keywords, Prioridade, Tools
|
|
10
|
+
- MCP configs: NUNCA tokens em plaintext
|
|
11
|
+
- SDK Sub-Agents: DEVEM ter allowedTools explícito (não ["*"]) e maxTurns
|
|
12
|
+
|
|
13
|
+
EXIT CODES:
|
|
14
|
+
- 0: Passou (validação OK)
|
|
15
|
+
- 1: Aviso (continua mas notifica)
|
|
16
|
+
- 2: Erro (bloqueia execução)
|
|
17
|
+
|
|
18
|
+
ERROR HANDLING: fail-CLOSED (2026-02-22 hardening)
|
|
19
|
+
- Internal exceptions -> exit(2) BLOCK (can't validate = block)
|
|
20
|
+
- Log failures -> pass (logging never blocks)
|
|
21
|
+
|
|
22
|
+
Executado via settings.local.json PreToolUse hook.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
import json
|
|
26
|
+
import os
|
|
27
|
+
import sys
|
|
28
|
+
import re
|
|
29
|
+
from pathlib import Path
|
|
30
|
+
from datetime import datetime
|
|
31
|
+
|
|
32
|
+
PROJECT_ROOT = Path(os.environ.get('CLAUDE_PROJECT_DIR', '.'))
|
|
33
|
+
LOG_FILE = PROJECT_ROOT / "logs" / "creation_validations.jsonl"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class CreationValidator:
|
|
37
|
+
"""Validador de criações para conformidade Anthropic."""
|
|
38
|
+
|
|
39
|
+
def __init__(self, tool_input: str):
|
|
40
|
+
self.tool_input = tool_input
|
|
41
|
+
self.warnings = []
|
|
42
|
+
self.errors = []
|
|
43
|
+
self.file_path = ""
|
|
44
|
+
self.content = ""
|
|
45
|
+
|
|
46
|
+
# Parse tool input
|
|
47
|
+
self._parse_input()
|
|
48
|
+
|
|
49
|
+
def _parse_input(self):
|
|
50
|
+
"""Extrai file_path e content do tool input."""
|
|
51
|
+
try:
|
|
52
|
+
# Tool input pode ser JSON ou string
|
|
53
|
+
if self.tool_input.startswith('{'):
|
|
54
|
+
data = json.loads(self.tool_input)
|
|
55
|
+
self.file_path = data.get('file_path', '')
|
|
56
|
+
self.content = data.get('content', '')
|
|
57
|
+
else:
|
|
58
|
+
# Tenta extrair de formato string
|
|
59
|
+
self.file_path = self.tool_input
|
|
60
|
+
except json.JSONDecodeError:
|
|
61
|
+
self.file_path = self.tool_input
|
|
62
|
+
|
|
63
|
+
def validate(self) -> int:
|
|
64
|
+
"""
|
|
65
|
+
Executa validação baseada no tipo de arquivo.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
Exit code: 0 (pass), 1 (warn), 2 (block)
|
|
69
|
+
"""
|
|
70
|
+
if not self.file_path:
|
|
71
|
+
return 0 # Não conseguiu determinar arquivo, passa silenciosamente
|
|
72
|
+
|
|
73
|
+
path = Path(self.file_path)
|
|
74
|
+
|
|
75
|
+
# Detectar tipo de criação
|
|
76
|
+
if self._is_hook_creation(path):
|
|
77
|
+
self._validate_hook()
|
|
78
|
+
elif self._is_skill_creation(path):
|
|
79
|
+
self._validate_skill()
|
|
80
|
+
elif self._is_mcp_creation(path):
|
|
81
|
+
self._validate_mcp()
|
|
82
|
+
elif self._is_sdk_subagent(path):
|
|
83
|
+
self._validate_sdk_subagent()
|
|
84
|
+
else:
|
|
85
|
+
# Arquivo não é de tipo monitorado
|
|
86
|
+
return 0
|
|
87
|
+
|
|
88
|
+
# Logar resultado
|
|
89
|
+
self._log_validation()
|
|
90
|
+
|
|
91
|
+
# Determinar exit code
|
|
92
|
+
if self.errors:
|
|
93
|
+
self._output_errors()
|
|
94
|
+
return 2 # Block
|
|
95
|
+
elif self.warnings:
|
|
96
|
+
self._output_warnings()
|
|
97
|
+
return 1 # Warn but continue
|
|
98
|
+
else:
|
|
99
|
+
return 0 # Pass
|
|
100
|
+
|
|
101
|
+
#=============================
|
|
102
|
+
# DETECÇÃO DE TIPO
|
|
103
|
+
#=============================
|
|
104
|
+
|
|
105
|
+
def _is_hook_creation(self, path: Path) -> bool:
|
|
106
|
+
"""Detecta se é criação/modificação de hook."""
|
|
107
|
+
# settings.local.json contém hooks
|
|
108
|
+
if path.name == 'settings.local.json':
|
|
109
|
+
return True
|
|
110
|
+
# Scripts em .claude/hooks/
|
|
111
|
+
if '.claude/hooks/' in str(path) and path.suffix == '.py':
|
|
112
|
+
return True
|
|
113
|
+
return False
|
|
114
|
+
|
|
115
|
+
def _is_skill_creation(self, path: Path) -> bool:
|
|
116
|
+
"""Detecta se é criação/modificação de skill."""
|
|
117
|
+
# SKILL.md em .claude/skills/
|
|
118
|
+
if '.claude/skills/' in str(path) and path.name == 'SKILL.md':
|
|
119
|
+
return True
|
|
120
|
+
# Commands em .claude/commands/
|
|
121
|
+
if '.claude/commands/' in str(path) and path.suffix == '.md':
|
|
122
|
+
return True
|
|
123
|
+
return False
|
|
124
|
+
|
|
125
|
+
def _is_mcp_creation(self, path: Path) -> bool:
|
|
126
|
+
"""Detecta se é criação/modificação de MCP config."""
|
|
127
|
+
# settings.local.json com mcpServers
|
|
128
|
+
if path.name == 'settings.local.json' and self.content:
|
|
129
|
+
return '"mcpServers"' in self.content
|
|
130
|
+
return False
|
|
131
|
+
|
|
132
|
+
def _is_sdk_subagent(self, path: Path) -> bool:
|
|
133
|
+
"""Detecta se é criação/modificação de SDK sub-agent."""
|
|
134
|
+
# AGENT.md em .claude/jarvis/sub-agents/
|
|
135
|
+
if '.claude/jarvis/sub-agents/' in str(path):
|
|
136
|
+
if path.name in ('AGENT.md', 'CONFIG.yaml'):
|
|
137
|
+
return True
|
|
138
|
+
return False
|
|
139
|
+
|
|
140
|
+
#=============================
|
|
141
|
+
# VALIDAÇÕES
|
|
142
|
+
#=============================
|
|
143
|
+
|
|
144
|
+
def _validate_hook(self):
|
|
145
|
+
"""
|
|
146
|
+
Valida hook contra ANTHROPIC-STANDARDS.md:
|
|
147
|
+
- DEVE ter timeout: 30
|
|
148
|
+
- DEVE usar exit codes apropriados (não 2>/dev/null || true)
|
|
149
|
+
"""
|
|
150
|
+
if not self.content:
|
|
151
|
+
return
|
|
152
|
+
|
|
153
|
+
# Validar settings.local.json
|
|
154
|
+
if self.file_path.endswith('settings.local.json'):
|
|
155
|
+
try:
|
|
156
|
+
data = json.loads(self.content)
|
|
157
|
+
hooks = data.get('hooks', {})
|
|
158
|
+
|
|
159
|
+
for event, matchers in hooks.items():
|
|
160
|
+
for matcher in matchers:
|
|
161
|
+
for hook in matcher.get('hooks', []):
|
|
162
|
+
# Verificar timeout
|
|
163
|
+
if 'timeout' not in hook:
|
|
164
|
+
self.warnings.append(
|
|
165
|
+
f"Hook em {event} sem 'timeout'. "
|
|
166
|
+
f"Regra Anthropic: todo hook DEVE ter timeout: 30"
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
# Verificar supressão de erros
|
|
170
|
+
command = hook.get('command', '')
|
|
171
|
+
if '2>/dev/null || true' in command:
|
|
172
|
+
self.warnings.append(
|
|
173
|
+
f"Hook em {event} usa '2>/dev/null || true'. "
|
|
174
|
+
f"Regra Anthropic: usar exit codes apropriados (0, 1, 2)"
|
|
175
|
+
)
|
|
176
|
+
except json.JSONDecodeError:
|
|
177
|
+
self.warnings.append("settings.local.json com JSON inválido")
|
|
178
|
+
|
|
179
|
+
# Validar script Python de hook
|
|
180
|
+
elif self.file_path.endswith('.py'):
|
|
181
|
+
# Verificar se usa sys.exit com códigos corretos
|
|
182
|
+
if 'sys.exit' not in self.content:
|
|
183
|
+
self.warnings.append(
|
|
184
|
+
f"Hook Python sem sys.exit(). "
|
|
185
|
+
f"Regra Anthropic: usar exit code 0 (ok), 1 (warn), 2 (block)"
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
def _validate_skill(self):
|
|
189
|
+
"""
|
|
190
|
+
Valida skill contra ANTHROPIC-STANDARDS.md:
|
|
191
|
+
- DEVE ter header com Auto-Trigger, Keywords, Prioridade, Tools
|
|
192
|
+
- DEVE ter seção "Quando NÃO Ativar"
|
|
193
|
+
"""
|
|
194
|
+
if not self.content:
|
|
195
|
+
return
|
|
196
|
+
|
|
197
|
+
required_headers = [
|
|
198
|
+
('Auto-Trigger:', 'Auto-Trigger'),
|
|
199
|
+
('Keywords:', 'Keywords'),
|
|
200
|
+
('Prioridade:', 'Prioridade'),
|
|
201
|
+
('Tools:', 'Tools')
|
|
202
|
+
]
|
|
203
|
+
|
|
204
|
+
for pattern, name in required_headers:
|
|
205
|
+
if pattern not in self.content:
|
|
206
|
+
self.warnings.append(
|
|
207
|
+
f"SKILL.md sem '{name}' no header. "
|
|
208
|
+
f"Regra Anthropic: header obrigatório para auto-routing"
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
# Verificar seção "Quando NÃO Ativar"
|
|
212
|
+
if 'Quando NÃO Ativar' not in self.content and 'When NOT to Activate' not in self.content:
|
|
213
|
+
self.warnings.append(
|
|
214
|
+
f"SKILL.md sem seção 'Quando NÃO Ativar'. "
|
|
215
|
+
f"Regra Anthropic: seção obrigatória"
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
def _validate_mcp(self):
|
|
219
|
+
"""
|
|
220
|
+
Valida MCP config contra ANTHROPIC-STANDARDS.md:
|
|
221
|
+
- NUNCA tokens em plaintext
|
|
222
|
+
- Usar variáveis de ambiente
|
|
223
|
+
"""
|
|
224
|
+
if not self.content:
|
|
225
|
+
return
|
|
226
|
+
|
|
227
|
+
# Padrões de tokens sensíveis
|
|
228
|
+
sensitive_patterns = [
|
|
229
|
+
(r'eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+', 'JWT token'),
|
|
230
|
+
(r'sk-[A-Za-z0-9]{20,}', 'API key (sk-)'),
|
|
231
|
+
(r'pk_[A-Za-z0-9_]{20,}', 'API key (pk_)'),
|
|
232
|
+
(r'ntn_[A-Za-z0-9]{20,}', 'Notion token'),
|
|
233
|
+
(r'xox[baprs]-[A-Za-z0-9-]+', 'Slack token'),
|
|
234
|
+
]
|
|
235
|
+
|
|
236
|
+
for pattern, token_type in sensitive_patterns:
|
|
237
|
+
if re.search(pattern, self.content):
|
|
238
|
+
self.errors.append(
|
|
239
|
+
f"CRÍTICO: {token_type} detectado em plaintext! "
|
|
240
|
+
f"Regra Anthropic: NUNCA tokens em configs. "
|
|
241
|
+
f"Use variáveis de ambiente em ~/.zshrc"
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
def _validate_sdk_subagent(self):
|
|
245
|
+
"""
|
|
246
|
+
Valida SDK sub-agent contra ANTHROPIC-STANDARDS.md:
|
|
247
|
+
- DEVE ter allowedTools explícito (não ["*"])
|
|
248
|
+
- DEVE ter maxTurns definido
|
|
249
|
+
- DEVE ter header com Keywords
|
|
250
|
+
"""
|
|
251
|
+
if not self.content:
|
|
252
|
+
return
|
|
253
|
+
|
|
254
|
+
# Validar AGENT.md
|
|
255
|
+
if self.file_path.endswith('AGENT.md'):
|
|
256
|
+
required_headers = [
|
|
257
|
+
('Keywords:', 'Keywords'),
|
|
258
|
+
('allowedTools:', 'allowedTools'),
|
|
259
|
+
('maxTurns:', 'maxTurns')
|
|
260
|
+
]
|
|
261
|
+
|
|
262
|
+
for pattern, name in required_headers:
|
|
263
|
+
if pattern not in self.content:
|
|
264
|
+
self.warnings.append(
|
|
265
|
+
f"Sub-Agent sem '{name}' no header. "
|
|
266
|
+
f"Regra Anthropic: menor privilégio obrigatório"
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
# Verificar ["*"] proibido
|
|
270
|
+
if '["*"]' in self.content or "['*']" in self.content:
|
|
271
|
+
self.errors.append(
|
|
272
|
+
f"CRÍTICO: Sub-Agent com allowedTools: [\"*\"]! "
|
|
273
|
+
f"Regra Anthropic: NUNCA dar acesso total. "
|
|
274
|
+
f"Use lista explícita de tools."
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
# Validar CONFIG.yaml
|
|
278
|
+
elif self.file_path.endswith('CONFIG.yaml'):
|
|
279
|
+
if 'allowedTools:' not in self.content:
|
|
280
|
+
self.warnings.append(
|
|
281
|
+
f"CONFIG.yaml sem 'allowedTools'. "
|
|
282
|
+
f"Regra Anthropic: definir tools permitidas"
|
|
283
|
+
)
|
|
284
|
+
if 'maxTurns:' not in self.content:
|
|
285
|
+
self.warnings.append(
|
|
286
|
+
f"CONFIG.yaml sem 'maxTurns'. "
|
|
287
|
+
f"Regra Anthropic: definir limite de iterações"
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
#=============================
|
|
291
|
+
# OUTPUT
|
|
292
|
+
#=============================
|
|
293
|
+
|
|
294
|
+
def _output_warnings(self):
|
|
295
|
+
"""Output warnings em formato JSON para Claude processar."""
|
|
296
|
+
output = {
|
|
297
|
+
"status": "warning",
|
|
298
|
+
"file": self.file_path,
|
|
299
|
+
"warnings": self.warnings,
|
|
300
|
+
"message": f"Criação permitida com {len(self.warnings)} aviso(s). Revise conformidade Anthropic."
|
|
301
|
+
}
|
|
302
|
+
print(json.dumps(output, ensure_ascii=False))
|
|
303
|
+
|
|
304
|
+
def _output_errors(self):
|
|
305
|
+
"""Output errors em formato JSON para Claude processar."""
|
|
306
|
+
output = {
|
|
307
|
+
"status": "blocked",
|
|
308
|
+
"file": self.file_path,
|
|
309
|
+
"errors": self.errors,
|
|
310
|
+
"message": f"Criação BLOQUEADA! {len(self.errors)} violação(ões) crítica(s) de segurança."
|
|
311
|
+
}
|
|
312
|
+
print(json.dumps(output, ensure_ascii=False))
|
|
313
|
+
|
|
314
|
+
def _log_validation(self):
|
|
315
|
+
"""Loga resultado da validação para auditoria."""
|
|
316
|
+
try:
|
|
317
|
+
LOG_FILE.parent.mkdir(parents=True, exist_ok=True)
|
|
318
|
+
|
|
319
|
+
log_entry = {
|
|
320
|
+
"timestamp": datetime.now().isoformat(),
|
|
321
|
+
"file": self.file_path,
|
|
322
|
+
"warnings": self.warnings,
|
|
323
|
+
"errors": self.errors,
|
|
324
|
+
"exit_code": 2 if self.errors else (1 if self.warnings else 0)
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
with open(LOG_FILE, 'a', encoding='utf-8') as f:
|
|
328
|
+
f.write(json.dumps(log_entry, ensure_ascii=False) + '\n')
|
|
329
|
+
except Exception:
|
|
330
|
+
pass # Falha de log não deve bloquear operação
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def main():
|
|
334
|
+
"""Função principal - entry point do hook."""
|
|
335
|
+
try:
|
|
336
|
+
# Ler input do stdin ou argumento
|
|
337
|
+
if len(sys.argv) > 1:
|
|
338
|
+
tool_input = sys.argv[1]
|
|
339
|
+
else:
|
|
340
|
+
tool_input = sys.stdin.read()
|
|
341
|
+
|
|
342
|
+
if not tool_input.strip():
|
|
343
|
+
sys.exit(0) # Sem input, passa
|
|
344
|
+
|
|
345
|
+
validator = CreationValidator(tool_input)
|
|
346
|
+
exit_code = validator.validate()
|
|
347
|
+
sys.exit(exit_code)
|
|
348
|
+
|
|
349
|
+
except Exception as e:
|
|
350
|
+
# Fail-CLOSED: internal error = can't validate = BLOCK
|
|
351
|
+
print(json.dumps({
|
|
352
|
+
"status": "blocked",
|
|
353
|
+
"internal_error": str(e),
|
|
354
|
+
"message": "Validador falhou internamente. Operação BLOQUEADA por segurança (fail-closed)."
|
|
355
|
+
}))
|
|
356
|
+
sys.exit(2)
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
if __name__ == "__main__":
|
|
360
|
+
main()
|