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,48 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Skill Indexer - Hook de SessionStart v2.0
|
|
4
|
+
|
|
5
|
+
Indexa todas as skills E sub-agents no início de cada sessão.
|
|
6
|
+
Executado automaticamente via settings.local.json SessionStart hook.
|
|
7
|
+
|
|
8
|
+
REGRA #27: Skills e Sub-Agents são indexados automaticamente no início de cada sessão.
|
|
9
|
+
|
|
10
|
+
v2.0: Suporta tanto skills quanto sub-agents JARVIS
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import os
|
|
15
|
+
import sys
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
PROJECT_ROOT = Path(os.environ.get('CLAUDE_PROJECT_DIR', '.'))
|
|
19
|
+
sys.path.insert(0, str(PROJECT_ROOT / ".claude" / "hooks"))
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
from skill_router import build_index
|
|
23
|
+
except ImportError:
|
|
24
|
+
# Fallback se import falhar
|
|
25
|
+
def build_index():
|
|
26
|
+
return {"skills_count": 0, "subagents_count": 0, "error": "skill_router not found"}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def main():
|
|
30
|
+
"""Função principal - executa indexação."""
|
|
31
|
+
try:
|
|
32
|
+
index = build_index()
|
|
33
|
+
skills_count = index.get('skills_count', 0)
|
|
34
|
+
subagents_count = index.get('subagents_count', 0)
|
|
35
|
+
keywords_count = len(index.get('keyword_map', {}))
|
|
36
|
+
|
|
37
|
+
# Output compacto para não poluir o chat
|
|
38
|
+
# Formato compatível com outros hooks SessionStart
|
|
39
|
+
print(f"Skills: {skills_count} | Sub-Agents: {subagents_count} | Keywords: {keywords_count}")
|
|
40
|
+
|
|
41
|
+
except Exception as e:
|
|
42
|
+
# Falha silenciosa para não bloquear sessão
|
|
43
|
+
# Erro é logado mas não impede uso do sistema
|
|
44
|
+
print(f"Skill indexer: {str(e)[:50]}")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
if __name__ == "__main__":
|
|
48
|
+
main()
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Skill Router - Sistema de Roteamento Semântico v2.0
|
|
4
|
+
|
|
5
|
+
Escaneia SKILLS e SUB-AGENTS, extrai metadados e faz matching com prompts.
|
|
6
|
+
|
|
7
|
+
REGRA #27: Skills são auto-ativadas quando keywords matcham no prompt do usuário.
|
|
8
|
+
|
|
9
|
+
v2.0 CHANGES:
|
|
10
|
+
- Adicionado suporte a SUB-AGENTS (/.claude/jarvis/sub-agents/)
|
|
11
|
+
- Campo "type": "skill" | "sub-agent" no índice
|
|
12
|
+
- Sub-agents têm AGENT.md + opcional SOUL.md
|
|
13
|
+
- Separação clara: sub-agents são súbditos do JARVIS, não do Council
|
|
14
|
+
|
|
15
|
+
ARQUITETURA:
|
|
16
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
17
|
+
│ /.claude/skills/ → SKILLS (auto-routing) │
|
|
18
|
+
│ /.claude/jarvis/sub-agents/ → SUB-AGENTS (auto-routing) │
|
|
19
|
+
│ /agents/ → CONCLAVE ONLY (via /conclave) │
|
|
20
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
import os
|
|
24
|
+
import re
|
|
25
|
+
import json
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
from typing import Dict, List, Optional, Tuple
|
|
28
|
+
|
|
29
|
+
PROJECT_ROOT = Path(os.environ.get('CLAUDE_PROJECT_DIR', '.'))
|
|
30
|
+
SKILLS_PATH = PROJECT_ROOT / ".claude" / "skills"
|
|
31
|
+
SUBAGENTS_PATH = PROJECT_ROOT / ".claude" / "jarvis" / "sub-agents"
|
|
32
|
+
INDEX_PATH = PROJECT_ROOT / ".claude" / "mission-control" / "SKILL-INDEX.json"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def scan_skills() -> List[Tuple[Path, str]]:
|
|
36
|
+
"""Lista todas as pastas de skills válidas com tipo."""
|
|
37
|
+
items = []
|
|
38
|
+
|
|
39
|
+
# Scan skills
|
|
40
|
+
if SKILLS_PATH.exists():
|
|
41
|
+
for item in SKILLS_PATH.iterdir():
|
|
42
|
+
if item.is_dir() and not item.name.startswith('_'):
|
|
43
|
+
skill_md = item / "SKILL.md"
|
|
44
|
+
if skill_md.exists():
|
|
45
|
+
items.append((item, "skill"))
|
|
46
|
+
|
|
47
|
+
# Scan sub-agents
|
|
48
|
+
if SUBAGENTS_PATH.exists():
|
|
49
|
+
for item in SUBAGENTS_PATH.iterdir():
|
|
50
|
+
if item.is_dir() and not item.name.startswith('_'):
|
|
51
|
+
agent_md = item / "AGENT.md"
|
|
52
|
+
if agent_md.exists():
|
|
53
|
+
items.append((item, "sub-agent"))
|
|
54
|
+
|
|
55
|
+
return items
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def extract_metadata(item_path: Path, item_type: str) -> Dict:
|
|
59
|
+
"""Extrai metadados de SKILL.md ou AGENT.md."""
|
|
60
|
+
|
|
61
|
+
if item_type == "skill":
|
|
62
|
+
md_file = item_path / "SKILL.md"
|
|
63
|
+
else:
|
|
64
|
+
md_file = item_path / "AGENT.md"
|
|
65
|
+
|
|
66
|
+
if not md_file.exists():
|
|
67
|
+
return {}
|
|
68
|
+
|
|
69
|
+
try:
|
|
70
|
+
content = md_file.read_text(encoding='utf-8')
|
|
71
|
+
except Exception:
|
|
72
|
+
return {}
|
|
73
|
+
|
|
74
|
+
# Extrai header (primeiras 40 linhas para garantir captura)
|
|
75
|
+
lines = content.split('\n')[:40]
|
|
76
|
+
header = '\n'.join(lines)
|
|
77
|
+
|
|
78
|
+
metadata = {
|
|
79
|
+
"path": str(item_path.relative_to(PROJECT_ROOT)),
|
|
80
|
+
"name": item_path.name,
|
|
81
|
+
"type": item_type,
|
|
82
|
+
"auto_trigger": "",
|
|
83
|
+
"keywords": [],
|
|
84
|
+
"priority": "MÉDIA",
|
|
85
|
+
"description": ""
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
# Auto-Trigger (múltiplos formatos)
|
|
89
|
+
for pattern in [r'\*\*Auto-Trigger:\*\*\s*(.+)', r'> \*\*Auto-Trigger:\*\*\s*(.+)']:
|
|
90
|
+
match = re.search(pattern, header)
|
|
91
|
+
if match:
|
|
92
|
+
metadata["auto_trigger"] = match.group(1).strip()
|
|
93
|
+
break
|
|
94
|
+
|
|
95
|
+
# Keywords - múltiplos formatos suportados
|
|
96
|
+
for pattern in [r'\*\*Keywords:\*\*\s*(.+)', r'> \*\*Keywords:\*\*\s*(.+)']:
|
|
97
|
+
match = re.search(pattern, header)
|
|
98
|
+
if match:
|
|
99
|
+
raw = match.group(1).strip()
|
|
100
|
+
# Parse keywords (pode ser "a", "b", "c" ou a, b, c ou [a, b, c])
|
|
101
|
+
keywords = re.findall(r'["\']?([^",\'\[\]]+)["\']?', raw)
|
|
102
|
+
metadata["keywords"] = [k.strip().lower() for k in keywords if k.strip() and len(k.strip()) > 1]
|
|
103
|
+
break
|
|
104
|
+
|
|
105
|
+
# Prioridade
|
|
106
|
+
for pattern in [r'\*\*Prioridade:\*\*\s*(ALTA|MÉDIA|BAIXA)', r'> \*\*Prioridade:\*\*\s*(ALTA|MÉDIA|BAIXA)']:
|
|
107
|
+
match = re.search(pattern, header, re.I)
|
|
108
|
+
if match:
|
|
109
|
+
metadata["priority"] = match.group(1).upper()
|
|
110
|
+
break
|
|
111
|
+
|
|
112
|
+
# Description (primeira linha após # Header)
|
|
113
|
+
match = re.search(r'^#\s+[^\n]+\n+##?\s*([^\n]+)', content)
|
|
114
|
+
if match:
|
|
115
|
+
metadata["description"] = match.group(1).strip()
|
|
116
|
+
|
|
117
|
+
# Para sub-agents, verificar se tem SOUL.md
|
|
118
|
+
if item_type == "sub-agent":
|
|
119
|
+
soul_path = item_path / "SOUL.md"
|
|
120
|
+
metadata["has_soul"] = soul_path.exists()
|
|
121
|
+
|
|
122
|
+
return metadata
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def build_index() -> Dict:
|
|
126
|
+
"""Constrói índice completo de skills e sub-agents."""
|
|
127
|
+
items = scan_skills()
|
|
128
|
+
|
|
129
|
+
index = {
|
|
130
|
+
"version": "2.0.0",
|
|
131
|
+
"skills_count": 0,
|
|
132
|
+
"subagents_count": 0,
|
|
133
|
+
"total_count": len(items),
|
|
134
|
+
"skills": {},
|
|
135
|
+
"subagents": {},
|
|
136
|
+
"keyword_map": {}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
for item_path, item_type in items:
|
|
140
|
+
metadata = extract_metadata(item_path, item_type)
|
|
141
|
+
if metadata and metadata.get("keywords"):
|
|
142
|
+
item_name = metadata["name"]
|
|
143
|
+
|
|
144
|
+
if item_type == "skill":
|
|
145
|
+
index["skills"][item_name] = metadata
|
|
146
|
+
index["skills_count"] += 1
|
|
147
|
+
else:
|
|
148
|
+
index["subagents"][item_name] = metadata
|
|
149
|
+
index["subagents_count"] += 1
|
|
150
|
+
|
|
151
|
+
# Popula keyword_map (unificado)
|
|
152
|
+
for keyword in metadata.get("keywords", []):
|
|
153
|
+
if keyword not in index["keyword_map"]:
|
|
154
|
+
index["keyword_map"][keyword] = []
|
|
155
|
+
index["keyword_map"][keyword].append({
|
|
156
|
+
"name": item_name,
|
|
157
|
+
"type": item_type,
|
|
158
|
+
"path": metadata["path"],
|
|
159
|
+
"priority": metadata["priority"]
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
# Salva índice
|
|
163
|
+
INDEX_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
164
|
+
with open(INDEX_PATH, 'w', encoding='utf-8') as f:
|
|
165
|
+
json.dump(index, f, indent=2, ensure_ascii=False)
|
|
166
|
+
|
|
167
|
+
return index
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def match_prompt(prompt: str, index: Dict = None) -> List[Dict]:
|
|
171
|
+
"""Retorna skills e sub-agents que matcham com o prompt."""
|
|
172
|
+
if index is None:
|
|
173
|
+
if INDEX_PATH.exists():
|
|
174
|
+
try:
|
|
175
|
+
with open(INDEX_PATH, 'r', encoding='utf-8') as f:
|
|
176
|
+
index = json.load(f)
|
|
177
|
+
except Exception:
|
|
178
|
+
index = build_index()
|
|
179
|
+
else:
|
|
180
|
+
index = build_index()
|
|
181
|
+
|
|
182
|
+
prompt_lower = prompt.lower()
|
|
183
|
+
matches = []
|
|
184
|
+
seen_items = set()
|
|
185
|
+
|
|
186
|
+
# Ordem de prioridade
|
|
187
|
+
priority_order = {"ALTA": 0, "MÉDIA": 1, "BAIXA": 2}
|
|
188
|
+
|
|
189
|
+
for keyword, item_list in index.get("keyword_map", {}).items():
|
|
190
|
+
# Match por palavra inteira ou substring significativa
|
|
191
|
+
if keyword in prompt_lower:
|
|
192
|
+
for item_info in item_list:
|
|
193
|
+
item_name = item_info["name"]
|
|
194
|
+
if item_name not in seen_items:
|
|
195
|
+
seen_items.add(item_name)
|
|
196
|
+
matches.append({
|
|
197
|
+
"name": item_name,
|
|
198
|
+
"type": item_info["type"],
|
|
199
|
+
"path": item_info["path"],
|
|
200
|
+
"priority": item_info["priority"],
|
|
201
|
+
"matched_keyword": keyword
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
# Ordena por prioridade
|
|
205
|
+
matches.sort(key=lambda x: priority_order.get(x["priority"], 1))
|
|
206
|
+
|
|
207
|
+
return matches
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def get_skill_instructions(skill_path: str) -> str:
|
|
211
|
+
"""Retorna instruções principais da skill para injeção."""
|
|
212
|
+
full_path = PROJECT_ROOT / skill_path / "SKILL.md"
|
|
213
|
+
if not full_path.exists():
|
|
214
|
+
return ""
|
|
215
|
+
|
|
216
|
+
try:
|
|
217
|
+
content = full_path.read_text(encoding='utf-8')
|
|
218
|
+
except Exception:
|
|
219
|
+
return ""
|
|
220
|
+
|
|
221
|
+
# Retorna primeiras 100 linhas (instruções principais)
|
|
222
|
+
lines = content.split('\n')[:100]
|
|
223
|
+
return '\n'.join(lines)
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def get_skill_summary(skill_path: str) -> str:
|
|
227
|
+
"""Retorna resumo curto da skill (primeiras 20 linhas)."""
|
|
228
|
+
full_path = PROJECT_ROOT / skill_path / "SKILL.md"
|
|
229
|
+
if not full_path.exists():
|
|
230
|
+
return ""
|
|
231
|
+
|
|
232
|
+
try:
|
|
233
|
+
content = full_path.read_text(encoding='utf-8')
|
|
234
|
+
except Exception:
|
|
235
|
+
return ""
|
|
236
|
+
|
|
237
|
+
lines = content.split('\n')[:20]
|
|
238
|
+
return '\n'.join(lines)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def get_subagent_context(subagent_path: str) -> str:
|
|
242
|
+
"""Retorna contexto completo do sub-agent (AGENT.md + SOUL.md se existir)."""
|
|
243
|
+
base_path = PROJECT_ROOT / subagent_path
|
|
244
|
+
|
|
245
|
+
context_parts = []
|
|
246
|
+
|
|
247
|
+
# AGENT.md (obrigatório)
|
|
248
|
+
agent_md = base_path / "AGENT.md"
|
|
249
|
+
if agent_md.exists():
|
|
250
|
+
try:
|
|
251
|
+
content = agent_md.read_text(encoding='utf-8')
|
|
252
|
+
# Primeiras 150 linhas do AGENT.md
|
|
253
|
+
lines = content.split('\n')[:150]
|
|
254
|
+
context_parts.append("=== AGENT INSTRUCTIONS ===\n" + '\n'.join(lines))
|
|
255
|
+
except Exception:
|
|
256
|
+
pass
|
|
257
|
+
|
|
258
|
+
# SOUL.md (opcional - personalidade)
|
|
259
|
+
soul_md = base_path / "SOUL.md"
|
|
260
|
+
if soul_md.exists():
|
|
261
|
+
try:
|
|
262
|
+
content = soul_md.read_text(encoding='utf-8')
|
|
263
|
+
# Primeiras 50 linhas do SOUL.md (personalidade é mais compacta)
|
|
264
|
+
lines = content.split('\n')[:50]
|
|
265
|
+
context_parts.append("\n=== AGENT PERSONALITY ===\n" + '\n'.join(lines))
|
|
266
|
+
except Exception:
|
|
267
|
+
pass
|
|
268
|
+
|
|
269
|
+
return '\n'.join(context_parts)
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def get_item_context(item_path: str, item_type: str) -> str:
|
|
273
|
+
"""Retorna contexto apropriado baseado no tipo."""
|
|
274
|
+
if item_type == "skill":
|
|
275
|
+
return get_skill_summary(item_path)
|
|
276
|
+
else:
|
|
277
|
+
return get_subagent_context(item_path)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def main():
|
|
281
|
+
"""
|
|
282
|
+
Hook entry point for Claude Code UserPromptSubmit event.
|
|
283
|
+
Reads JSON from stdin, outputs JSON to stdout.
|
|
284
|
+
"""
|
|
285
|
+
import sys
|
|
286
|
+
|
|
287
|
+
try:
|
|
288
|
+
input_data = sys.stdin.read()
|
|
289
|
+
hook_input = json.loads(input_data) if input_data else {}
|
|
290
|
+
|
|
291
|
+
prompt = hook_input.get('prompt', '')
|
|
292
|
+
if not prompt:
|
|
293
|
+
print(json.dumps({'continue': True}))
|
|
294
|
+
return
|
|
295
|
+
|
|
296
|
+
matches = match_prompt(prompt)
|
|
297
|
+
|
|
298
|
+
if not matches:
|
|
299
|
+
print(json.dumps({'continue': True}))
|
|
300
|
+
return
|
|
301
|
+
|
|
302
|
+
top = matches[0]
|
|
303
|
+
item_type = top.get('type', 'skill')
|
|
304
|
+
item_name = top.get('name', 'unknown')
|
|
305
|
+
|
|
306
|
+
context = get_item_context(top['path'], item_type)
|
|
307
|
+
|
|
308
|
+
if context:
|
|
309
|
+
type_label = "SKILL" if item_type == "skill" else "SUB-AGENT"
|
|
310
|
+
feedback = f"[{type_label} AUTO-ACTIVATED: {item_name}]\n"
|
|
311
|
+
feedback += f"Keyword: \"{top['matched_keyword']}\"\n"
|
|
312
|
+
feedback += f"Priority: {top['priority']}\n\n"
|
|
313
|
+
feedback += context
|
|
314
|
+
|
|
315
|
+
print(json.dumps({'continue': True, 'feedback': feedback}))
|
|
316
|
+
else:
|
|
317
|
+
print(json.dumps({'continue': True}))
|
|
318
|
+
|
|
319
|
+
except Exception:
|
|
320
|
+
print(json.dumps({'continue': True}))
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def cli_test():
|
|
324
|
+
"""CLI test mode - run directly for debugging."""
|
|
325
|
+
index = build_index()
|
|
326
|
+
print(f"Skills indexadas: {index['skills_count']}")
|
|
327
|
+
print(f"Sub-agents indexados: {index['subagents_count']}")
|
|
328
|
+
print(f"Total: {index['total_count']}")
|
|
329
|
+
print(f"Keywords mapeadas: {len(index['keyword_map'])}")
|
|
330
|
+
|
|
331
|
+
print("\nKeywords disponíveis:")
|
|
332
|
+
for kw in sorted(index['keyword_map'].keys()):
|
|
333
|
+
items = [f"{s['name']} ({s['type']})" for s in index['keyword_map'][kw]]
|
|
334
|
+
print(f" '{kw}' → {items}")
|
|
335
|
+
|
|
336
|
+
test_prompts = [
|
|
337
|
+
"preciso analisar este PDF",
|
|
338
|
+
"criar uma planilha excel",
|
|
339
|
+
"jarvis, status do sistema",
|
|
340
|
+
"processar vídeo do youtube"
|
|
341
|
+
]
|
|
342
|
+
|
|
343
|
+
for test_prompt in test_prompts:
|
|
344
|
+
matches = match_prompt(test_prompt, index)
|
|
345
|
+
print(f"\nMatches para '{test_prompt}':")
|
|
346
|
+
if matches:
|
|
347
|
+
for m in matches:
|
|
348
|
+
print(f" - {m['name']} ({m['type']}, keyword: {m['matched_keyword']}, priority: {m['priority']})")
|
|
349
|
+
else:
|
|
350
|
+
print(" (nenhum match)")
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
if __name__ == "__main__":
|
|
354
|
+
import sys
|
|
355
|
+
if len(sys.argv) > 1 and sys.argv[1] == '--test':
|
|
356
|
+
cli_test()
|
|
357
|
+
else:
|
|
358
|
+
main()
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
STOP HOOK - TASK COMPLETENESS CHECKER
|
|
4
|
+
=====================================
|
|
5
|
+
Intercepta quando Claude quer parar e verifica se a tarefa realmente completou.
|
|
6
|
+
|
|
7
|
+
Baseado no workflow Boris Cherny: Stop hooks para tarefas longas
|
|
8
|
+
|
|
9
|
+
Verifica:
|
|
10
|
+
1. Se havia uma tarefa em andamento (LEDGER.md)
|
|
11
|
+
2. Se a tarefa foi completada
|
|
12
|
+
3. Se há arquivos pendentes no INBOX
|
|
13
|
+
4. Se há batches incompletos
|
|
14
|
+
|
|
15
|
+
Output:
|
|
16
|
+
- Se completo: exit 0 (permite parar)
|
|
17
|
+
- Se incompleto: print mensagem sugerindo continuar
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import sys
|
|
21
|
+
import os
|
|
22
|
+
import json
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from datetime import datetime
|
|
25
|
+
|
|
26
|
+
# Fix Windows cp1252 encoding
|
|
27
|
+
if sys.platform == 'win32':
|
|
28
|
+
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
29
|
+
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
|
|
30
|
+
|
|
31
|
+
PROJECT_ROOT = Path(os.environ.get('CLAUDE_PROJECT_DIR', '.'))
|
|
32
|
+
MISSION_CONTROL = PROJECT_ROOT / '.claude' / 'mission-control'
|
|
33
|
+
LEDGER_PATH = PROJECT_ROOT / '.claude' / 'LEDGER.md'
|
|
34
|
+
INBOX_PATH = PROJECT_ROOT / 'inbox'
|
|
35
|
+
LOGS_PATH = PROJECT_ROOT / 'logs' / 'stop_hooks'
|
|
36
|
+
LOGS_PATH.mkdir(parents=True, exist_ok=True)
|
|
37
|
+
|
|
38
|
+
def count_inbox_files() -> int:
|
|
39
|
+
"""Count processable files in INBOX"""
|
|
40
|
+
if not INBOX_PATH.exists():
|
|
41
|
+
return 0
|
|
42
|
+
|
|
43
|
+
count = 0
|
|
44
|
+
exclude_patterns = ['_DUPLICATAS', '_BACKUP', '.DS_Store', '_INDEX']
|
|
45
|
+
|
|
46
|
+
for item in INBOX_PATH.rglob('*'):
|
|
47
|
+
if item.is_file():
|
|
48
|
+
# Skip excluded patterns
|
|
49
|
+
if any(excl in str(item) for excl in exclude_patterns):
|
|
50
|
+
continue
|
|
51
|
+
# Count txt, md, docx files
|
|
52
|
+
if item.suffix.lower() in ['.txt', '.md', '.docx', '.pdf']:
|
|
53
|
+
count += 1
|
|
54
|
+
|
|
55
|
+
return count
|
|
56
|
+
|
|
57
|
+
def check_pending_batches() -> tuple[int, int]:
|
|
58
|
+
"""Check if there are pending batches based on MISSION-STATE"""
|
|
59
|
+
state_file = MISSION_CONTROL / 'MISSION-STATE.json'
|
|
60
|
+
|
|
61
|
+
if not state_file.exists():
|
|
62
|
+
return 0, 0
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
with open(state_file, 'r') as f:
|
|
66
|
+
state = json.load(f)
|
|
67
|
+
|
|
68
|
+
current = state.get('current_state', {})
|
|
69
|
+
batch_current = current.get('batch_current', 0)
|
|
70
|
+
batch_total = current.get('batch_total', 0)
|
|
71
|
+
|
|
72
|
+
return batch_current, batch_total
|
|
73
|
+
except Exception:
|
|
74
|
+
return 0, 0
|
|
75
|
+
|
|
76
|
+
def read_ledger() -> dict:
|
|
77
|
+
"""Read current ledger state"""
|
|
78
|
+
if not LEDGER_PATH.exists():
|
|
79
|
+
return {}
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
content = LEDGER_PATH.read_text()
|
|
83
|
+
|
|
84
|
+
# Parse simple ledger format
|
|
85
|
+
ledger = {
|
|
86
|
+
'has_pending_task': '⏳' in content or 'PENDING' in content.upper(),
|
|
87
|
+
'last_task': '',
|
|
88
|
+
'next_action': ''
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
# Extract next action
|
|
92
|
+
if 'Próxima Ação:' in content or 'Next Action:' in content:
|
|
93
|
+
lines = content.split('\n')
|
|
94
|
+
for i, line in enumerate(lines):
|
|
95
|
+
if 'Próxima Ação' in line or 'Next Action' in line:
|
|
96
|
+
if i + 1 < len(lines):
|
|
97
|
+
ledger['next_action'] = lines[i + 1].strip('- ')
|
|
98
|
+
|
|
99
|
+
return ledger
|
|
100
|
+
except Exception:
|
|
101
|
+
return {}
|
|
102
|
+
|
|
103
|
+
def log_stop_check(reason: str, should_continue: bool, details: dict):
|
|
104
|
+
"""Log stop check"""
|
|
105
|
+
log_file = LOGS_PATH / 'stop_checks.jsonl'
|
|
106
|
+
entry = {
|
|
107
|
+
'timestamp': datetime.now().isoformat(),
|
|
108
|
+
'reason': reason,
|
|
109
|
+
'should_continue': should_continue,
|
|
110
|
+
'details': details
|
|
111
|
+
}
|
|
112
|
+
with open(log_file, 'a') as f:
|
|
113
|
+
f.write(json.dumps(entry) + '\n')
|
|
114
|
+
|
|
115
|
+
def check_completeness():
|
|
116
|
+
"""Core completeness check logic. Returns list of issues."""
|
|
117
|
+
issues = []
|
|
118
|
+
details = {}
|
|
119
|
+
|
|
120
|
+
# Check 1: INBOX files
|
|
121
|
+
inbox_count = count_inbox_files()
|
|
122
|
+
details['inbox_files'] = inbox_count
|
|
123
|
+
if inbox_count > 10:
|
|
124
|
+
issues.append(f"INBOX has {inbox_count} files waiting to be processed")
|
|
125
|
+
|
|
126
|
+
# Check 2: Pending batches
|
|
127
|
+
batch_current, batch_total = check_pending_batches()
|
|
128
|
+
details['batch_current'] = batch_current
|
|
129
|
+
details['batch_total'] = batch_total
|
|
130
|
+
if batch_total > 0 and batch_current < batch_total:
|
|
131
|
+
remaining = batch_total - batch_current
|
|
132
|
+
issues.append(f"Batch processing incomplete: {batch_current}/{batch_total} ({remaining} remaining)")
|
|
133
|
+
|
|
134
|
+
# Check 3: Ledger pending tasks
|
|
135
|
+
ledger = read_ledger()
|
|
136
|
+
details['ledger'] = ledger
|
|
137
|
+
if ledger.get('has_pending_task'):
|
|
138
|
+
next_action = ledger.get('next_action', 'Unknown')
|
|
139
|
+
issues.append(f"Ledger shows pending task: {next_action}")
|
|
140
|
+
|
|
141
|
+
# Log the check
|
|
142
|
+
log_stop_check('stop_hook_check', len(issues) > 0, details)
|
|
143
|
+
|
|
144
|
+
return issues
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def main():
|
|
148
|
+
"""
|
|
149
|
+
Hook entry point for Claude Code Stop event.
|
|
150
|
+
Reads JSON from stdin, outputs JSON to stdout.
|
|
151
|
+
Must output valid JSON per Anthropic hook standards.
|
|
152
|
+
"""
|
|
153
|
+
try:
|
|
154
|
+
issues = check_completeness()
|
|
155
|
+
|
|
156
|
+
if issues:
|
|
157
|
+
feedback = "Tasks may be incomplete: " + "; ".join(issues)
|
|
158
|
+
result = {"continue": True, "feedback": feedback}
|
|
159
|
+
else:
|
|
160
|
+
result = {"continue": True, "feedback": "All clear, no pending tasks detected."}
|
|
161
|
+
|
|
162
|
+
print(json.dumps(result))
|
|
163
|
+
sys.exit(0)
|
|
164
|
+
|
|
165
|
+
except Exception as e:
|
|
166
|
+
# Even on error, output valid JSON
|
|
167
|
+
result = {"continue": True, "feedback": f"Stop hook check error: {e}"}
|
|
168
|
+
print(json.dumps(result))
|
|
169
|
+
sys.exit(0)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def cli_test():
|
|
173
|
+
"""CLI test mode - run directly for debugging."""
|
|
174
|
+
issues = check_completeness()
|
|
175
|
+
if issues:
|
|
176
|
+
print("STOP HOOK: Tasks may be incomplete")
|
|
177
|
+
for issue in issues:
|
|
178
|
+
print(f" - {issue}")
|
|
179
|
+
else:
|
|
180
|
+
print("STOP HOOK: All clear, no pending tasks detected.")
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
if __name__ == '__main__':
|
|
184
|
+
if len(sys.argv) > 1 and sys.argv[1] == '--test':
|
|
185
|
+
cli_test()
|
|
186
|
+
else:
|
|
187
|
+
main()
|