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,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mega Brain - Email Validation Module
|
|
3
|
+
* Validates MoneyClub buyer emails via Supabase RPC
|
|
4
|
+
*
|
|
5
|
+
* Uses native fetch (Node.js 18+) instead of Supabase client
|
|
6
|
+
* to avoid assertion errors from dangling WebSocket handles.
|
|
7
|
+
*
|
|
8
|
+
* On successful validation, returns a premium_token for
|
|
9
|
+
* accessing the premium content repository.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// Supabase connection — loaded from environment variables.
|
|
13
|
+
// SUPABASE_URL and SUPABASE_ANON_KEY must be set in .env
|
|
14
|
+
// Supabase anon keys are public by design (protected by RLS),
|
|
15
|
+
// but we load from env to avoid hardcoding in source control.
|
|
16
|
+
// See: https://supabase.com/docs/guides/auth#api-keys
|
|
17
|
+
const SUPABASE_URL = process.env.SUPABASE_URL || '';
|
|
18
|
+
const SUPABASE_ANON_KEY = process.env.SUPABASE_ANON_KEY || '';
|
|
19
|
+
|
|
20
|
+
const TIMEOUT_MS = 10000;
|
|
21
|
+
const MAX_ATTEMPTS = 3;
|
|
22
|
+
|
|
23
|
+
let attemptCount = 0;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Validate a buyer email against MoneyClub database
|
|
27
|
+
* @param {string} email - Email to validate
|
|
28
|
+
* @returns {Promise<{valid: boolean, name?: string, reason?: string, installCount?: number, premium_token?: string}>}
|
|
29
|
+
*/
|
|
30
|
+
export async function validateEmail(email) {
|
|
31
|
+
if (attemptCount >= MAX_ATTEMPTS) {
|
|
32
|
+
return {
|
|
33
|
+
valid: false,
|
|
34
|
+
reason: 'max_attempts_exceeded',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
attemptCount++;
|
|
39
|
+
|
|
40
|
+
if (!email || !email.includes('@')) {
|
|
41
|
+
return {
|
|
42
|
+
valid: false,
|
|
43
|
+
reason: 'invalid_email_format',
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
const response = await fetch(
|
|
49
|
+
`${SUPABASE_URL}/rest/v1/rpc/validate_buyer_email`,
|
|
50
|
+
{
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers: {
|
|
53
|
+
'apikey': SUPABASE_ANON_KEY,
|
|
54
|
+
'Authorization': `Bearer ${SUPABASE_ANON_KEY}`,
|
|
55
|
+
'Content-Type': 'application/json',
|
|
56
|
+
},
|
|
57
|
+
body: JSON.stringify({ buyer_email: email.trim().toLowerCase() }),
|
|
58
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
return {
|
|
64
|
+
valid: false,
|
|
65
|
+
reason: 'validation_error',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const data = await response.json();
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
valid: data.valid,
|
|
73
|
+
name: data.name || null,
|
|
74
|
+
reason: data.reason || null,
|
|
75
|
+
installCount: data.install_count || 0,
|
|
76
|
+
premium_token: data.premium_token || null,
|
|
77
|
+
};
|
|
78
|
+
} catch (err) {
|
|
79
|
+
if (err.name === 'TimeoutError' || err.name === 'AbortError') {
|
|
80
|
+
return {
|
|
81
|
+
valid: false,
|
|
82
|
+
reason: 'timeout',
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
valid: false,
|
|
88
|
+
reason: 'network_error',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Get user-friendly error messages in Portuguese
|
|
95
|
+
* @param {string} reason - Error reason code
|
|
96
|
+
* @returns {string} Human-readable message
|
|
97
|
+
*/
|
|
98
|
+
export function getErrorMessage(reason) {
|
|
99
|
+
const messages = {
|
|
100
|
+
email_not_found: 'Email não autorizado.\nAcesse a página do produto para adquirir acesso.',
|
|
101
|
+
invalid_email_format: 'Formato de email inválido. Verifique e tente novamente.',
|
|
102
|
+
max_attempts_exceeded: 'Número máximo de tentativas excedido. Reinicie o instalador.',
|
|
103
|
+
timeout: 'Tempo de conexão esgotado. Verifique sua internet e tente novamente.',
|
|
104
|
+
network_error: 'Erro de conexão. Verifique sua internet e tente novamente.',
|
|
105
|
+
validation_error: 'Erro na validação. Tente novamente em alguns minutos.',
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
return messages[reason] || 'Erro desconhecido. Tente novamente.';
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function resetAttempts() {
|
|
112
|
+
attemptCount = 0;
|
|
113
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Mega Brain - AI Knowledge Management System
|
|
5
|
+
* CLI Entry Point
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx mega-brain-ai install [name] - Install Mega Brain (optional project name)
|
|
9
|
+
* npx mega-brain-ai validate - Validate MoneyClub email
|
|
10
|
+
* npx mega-brain-ai push - Push to Layer 1/2/3 remote
|
|
11
|
+
* npx mega-brain-ai upgrade - Upgrade Community to Premium
|
|
12
|
+
* npx mega-brain-ai status - Show Pro license status
|
|
13
|
+
* npx mega-brain-ai features - List available vs locked features
|
|
14
|
+
* npx mega-brain-ai --help - Show help
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { createRequire } from 'module';
|
|
18
|
+
import { fileURLToPath } from 'url';
|
|
19
|
+
import { dirname, resolve } from 'path';
|
|
20
|
+
import { readFileSync, existsSync } from 'fs';
|
|
21
|
+
|
|
22
|
+
// Load .env from project root (Node.js 21+ native, no dependencies)
|
|
23
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
24
|
+
const __dirname = dirname(__filename);
|
|
25
|
+
const envPath = resolve(__dirname, '..', '.env');
|
|
26
|
+
if (existsSync(envPath)) {
|
|
27
|
+
try { process.loadEnvFile(envPath); } catch {}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const require = createRequire(import.meta.url);
|
|
31
|
+
|
|
32
|
+
const pkg = JSON.parse(readFileSync(resolve(__dirname, '..', 'package.json'), 'utf-8'));
|
|
33
|
+
|
|
34
|
+
const args = process.argv.slice(2);
|
|
35
|
+
const command = args[0];
|
|
36
|
+
|
|
37
|
+
async function main() {
|
|
38
|
+
const { showBanner } = await import('./lib/ascii-art.js');
|
|
39
|
+
|
|
40
|
+
showBanner(pkg.version);
|
|
41
|
+
|
|
42
|
+
if (!command || command === '--help' || command === '-h') {
|
|
43
|
+
showHelp();
|
|
44
|
+
process.exit(0);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Auto-trigger setup if .env is missing (skip for install/setup/help)
|
|
48
|
+
const skipEnvCheck = ['install', 'setup', 'push'].includes(command);
|
|
49
|
+
if (!skipEnvCheck) {
|
|
50
|
+
const projectEnv = resolve(process.cwd(), '.env');
|
|
51
|
+
if (!existsSync(projectEnv)) {
|
|
52
|
+
const boxen = (await import('boxen')).default;
|
|
53
|
+
console.log(boxen(
|
|
54
|
+
' First time? Let\'s set up your environment.\n' +
|
|
55
|
+
' Running setup wizard...\n\n' +
|
|
56
|
+
' (You can run this anytime with: npx mega-brain-ai setup)',
|
|
57
|
+
{ padding: 1, borderColor: 'cyan', borderStyle: 'round' }
|
|
58
|
+
));
|
|
59
|
+
const { runSetup } = await import('./lib/setup-wizard.js');
|
|
60
|
+
await runSetup();
|
|
61
|
+
process.exit(0);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (command === 'install') {
|
|
66
|
+
const { runInstaller } = await import('./lib/installer.js');
|
|
67
|
+
await runInstaller(pkg.version, args[1]);
|
|
68
|
+
} else if (command === 'validate') {
|
|
69
|
+
const { validateEmail } = await import('./lib/validate-email.js');
|
|
70
|
+
const email = args[1];
|
|
71
|
+
if (!email) {
|
|
72
|
+
console.error('\n Uso: mega-brain validate <email>\n');
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
const result = await validateEmail(email);
|
|
76
|
+
console.log(result.valid ? `\n Email válido: ${result.name}` : `\n Email inválido: ${result.reason}`);
|
|
77
|
+
setTimeout(() => process.exit(result.valid ? 0 : 1), 100);
|
|
78
|
+
} else if (command === 'push') {
|
|
79
|
+
// Dynamic import of push module
|
|
80
|
+
await import('./push.js');
|
|
81
|
+
} else if (command === 'upgrade') {
|
|
82
|
+
const { runUpgrade } = await import('./lib/installer.js');
|
|
83
|
+
if (typeof runUpgrade === 'function') {
|
|
84
|
+
await runUpgrade(pkg.version);
|
|
85
|
+
} else {
|
|
86
|
+
console.log('\n Funcionalidade de upgrade será disponibilizada em breve.');
|
|
87
|
+
console.log(' Por enquanto, reinstale com: mega-brain install\n');
|
|
88
|
+
}
|
|
89
|
+
} else if (command === 'status') {
|
|
90
|
+
const { showStatus } = await import('./lib/pro-commands.js');
|
|
91
|
+
showStatus();
|
|
92
|
+
} else if (command === 'features') {
|
|
93
|
+
const { showFeatures } = await import('./lib/pro-commands.js');
|
|
94
|
+
showFeatures();
|
|
95
|
+
} else if (command === 'setup') {
|
|
96
|
+
const { runSetup } = await import('./lib/setup-wizard.js');
|
|
97
|
+
await runSetup();
|
|
98
|
+
} else {
|
|
99
|
+
console.error(`\n Comando desconhecido: ${command}`);
|
|
100
|
+
showHelp();
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function showHelp() {
|
|
106
|
+
console.log(`
|
|
107
|
+
Mega Brain v${pkg.version}
|
|
108
|
+
AI Knowledge Management System
|
|
109
|
+
|
|
110
|
+
Comandos:
|
|
111
|
+
install [nome] Instalar Mega Brain (PREMIUM ou Community)
|
|
112
|
+
setup Configurar API keys e dependencias (wizard interativo)
|
|
113
|
+
validate Validar email MoneyClub (mega-brain validate <email>)
|
|
114
|
+
push Push para Layer 1/2/3 (mega-brain push [--layer N])
|
|
115
|
+
upgrade Atualizar Community para Premium
|
|
116
|
+
status Mostrar status da licenca Pro
|
|
117
|
+
features Listar features disponiveis vs bloqueadas
|
|
118
|
+
--help Mostrar esta mensagem
|
|
119
|
+
|
|
120
|
+
Layers:
|
|
121
|
+
Layer 1 Community (público) — shell sem conteúdo
|
|
122
|
+
Layer 2 Premium (MoneyClub) — shell + cérebro
|
|
123
|
+
Layer 3 Full Backup (pessoal) — tudo incluindo dados sensíveis
|
|
124
|
+
|
|
125
|
+
Exemplos:
|
|
126
|
+
npx mega-brain-ai install
|
|
127
|
+
npx mega-brain-ai install meu-projeto
|
|
128
|
+
npx mega-brain-ai push --layer 1
|
|
129
|
+
npx mega-brain-ai push
|
|
130
|
+
`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
main().catch((err) => {
|
|
134
|
+
console.error('\n Erro inesperado:', err.message);
|
|
135
|
+
setTimeout(() => process.exit(1), 100);
|
|
136
|
+
});
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Mega Brain — Pre-Publish Security Gate (PHYSICAL BLOCK)
|
|
5
|
+
*
|
|
6
|
+
* PURPOSE: Scan npm package contents for secrets AND verify only L1 content
|
|
7
|
+
* is included BEFORE publishing.
|
|
8
|
+
* DESIGN: fail-CLOSED — if scanning fails, publish is BLOCKED.
|
|
9
|
+
* INSTALLED: 2026-02-20 (post-incident hardening)
|
|
10
|
+
* UPDATED: 2026-02-27 (added L1 layer validation)
|
|
11
|
+
*
|
|
12
|
+
* Runs automatically via: "prepublishOnly": "node bin/pre-publish-gate.js"
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { execSync } from 'child_process';
|
|
16
|
+
import { readFileSync, existsSync, mkdirSync, rmSync } from 'fs';
|
|
17
|
+
import { resolve, dirname } from 'path';
|
|
18
|
+
import { fileURLToPath } from 'url';
|
|
19
|
+
import { validatePackageSync } from './validate-package.js';
|
|
20
|
+
|
|
21
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
22
|
+
const __dirname = dirname(__filename);
|
|
23
|
+
const PROJECT_ROOT = resolve(__dirname, '..');
|
|
24
|
+
|
|
25
|
+
// ANSI colors
|
|
26
|
+
const RED = '\x1b[31m';
|
|
27
|
+
const GREEN = '\x1b[32m';
|
|
28
|
+
const YELLOW = '\x1b[33m';
|
|
29
|
+
const CYAN = '\x1b[36m';
|
|
30
|
+
const NC = '\x1b[0m';
|
|
31
|
+
|
|
32
|
+
// === SECRET PATTERNS ===
|
|
33
|
+
const SECRET_PATTERNS = [
|
|
34
|
+
// GitHub tokens
|
|
35
|
+
/ghp_[A-Za-z0-9]{36}/,
|
|
36
|
+
/github_pat_[A-Za-z0-9_]{82}/,
|
|
37
|
+
/gho_[A-Za-z0-9]{36}/,
|
|
38
|
+
/ghs_[A-Za-z0-9]{36}/,
|
|
39
|
+
/ghr_[A-Za-z0-9]{36}/,
|
|
40
|
+
// Anthropic
|
|
41
|
+
/sk-ant-[A-Za-z0-9-]{90,}/,
|
|
42
|
+
// OpenAI
|
|
43
|
+
/sk-[A-Za-z0-9]{48}/,
|
|
44
|
+
// AWS
|
|
45
|
+
/AKIA[0-9A-Z]{16}/,
|
|
46
|
+
// ElevenLabs
|
|
47
|
+
/sk_[a-f0-9]{48}/,
|
|
48
|
+
// N8N webhooks
|
|
49
|
+
/https?:\/\/[^/]*\.app\.n8n\.cloud\/webhook/,
|
|
50
|
+
// Notion
|
|
51
|
+
/ntn_[A-Za-z0-9]{40,}/,
|
|
52
|
+
/secret_[A-Za-z0-9]{40,}/,
|
|
53
|
+
// JWT tokens (Supabase, etc.)
|
|
54
|
+
/eyJ[A-Za-z0-9_-]{20,}\.eyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}/,
|
|
55
|
+
// Generic secrets in code
|
|
56
|
+
/(?:password|api_key|secret|token|private_key)\s*[:=]\s*['"][^'"]{12,}['"]/i,
|
|
57
|
+
// Brazilian CPF (11 digits)
|
|
58
|
+
/\d{3}\.\d{3}\.\d{3}-\d{2}/,
|
|
59
|
+
// Brazilian CNPJ
|
|
60
|
+
/\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}/,
|
|
61
|
+
// Email addresses in bulk (PII indicator)
|
|
62
|
+
/[\w.+-]+@[\w-]+\.[\w.]+/,
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
// Files that should NEVER be in the package
|
|
66
|
+
const FORBIDDEN_FILE_PATTERNS = [
|
|
67
|
+
/\.env($|\.)/i,
|
|
68
|
+
/credentials\.json$/i,
|
|
69
|
+
/service.account.*\.json$/i,
|
|
70
|
+
/\.pem$/i,
|
|
71
|
+
/\.key$/i,
|
|
72
|
+
/id_rsa/i,
|
|
73
|
+
/id_ed25519/i,
|
|
74
|
+
/\.sqlite$/i,
|
|
75
|
+
/\.db$/i,
|
|
76
|
+
/memory\.db$/i,
|
|
77
|
+
/DOSSIE-SEGURANCA/i,
|
|
78
|
+
/trufflehog/i,
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
// Maximum emails allowed (more than this = PII leak)
|
|
82
|
+
const MAX_EMAILS_PER_FILE = 3;
|
|
83
|
+
|
|
84
|
+
console.log(`${YELLOW}[pre-publish] Running security gate before npm publish...${NC}`);
|
|
85
|
+
|
|
86
|
+
let foundIssues = 0;
|
|
87
|
+
|
|
88
|
+
// === STEP 1: Clean __pycache__ (original prepublishOnly behavior) ===
|
|
89
|
+
try {
|
|
90
|
+
execSync('find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null', {
|
|
91
|
+
cwd: PROJECT_ROOT,
|
|
92
|
+
stdio: 'ignore',
|
|
93
|
+
});
|
|
94
|
+
} catch {
|
|
95
|
+
// Ignore cleanup errors
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// === STEP 2: Get list of files that would be published ===
|
|
99
|
+
let packFiles = [];
|
|
100
|
+
try {
|
|
101
|
+
const packOutput = execSync('npm pack --dry-run --json 2>/dev/null', {
|
|
102
|
+
cwd: PROJECT_ROOT,
|
|
103
|
+
encoding: 'utf-8',
|
|
104
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const packData = JSON.parse(packOutput);
|
|
108
|
+
if (packData && packData[0] && packData[0].files) {
|
|
109
|
+
packFiles = packData[0].files.map(f => f.path);
|
|
110
|
+
}
|
|
111
|
+
} catch {
|
|
112
|
+
// Fallback: use the files field from package.json
|
|
113
|
+
console.log(`${YELLOW}[pre-publish] npm pack --dry-run failed, using files field fallback.${NC}`);
|
|
114
|
+
try {
|
|
115
|
+
const pkg = JSON.parse(readFileSync(resolve(PROJECT_ROOT, 'package.json'), 'utf-8'));
|
|
116
|
+
packFiles = pkg.files || [];
|
|
117
|
+
} catch {
|
|
118
|
+
console.error(`${RED}[BLOCKED] Cannot determine package files. Blocking publish.${NC}`);
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
console.log(`${CYAN}[pre-publish] Scanning ${packFiles.length} files...${NC}`);
|
|
124
|
+
|
|
125
|
+
// === STEP 3: Check file names for forbidden patterns ===
|
|
126
|
+
for (const file of packFiles) {
|
|
127
|
+
for (const pattern of FORBIDDEN_FILE_PATTERNS) {
|
|
128
|
+
if (pattern.test(file)) {
|
|
129
|
+
console.error(`${RED}[BLOCKED] Forbidden file in package: ${file}${NC}`);
|
|
130
|
+
foundIssues++;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// === STEP 4: Scan file contents for secrets ===
|
|
136
|
+
const BINARY_EXTENSIONS = new Set([
|
|
137
|
+
'.png', '.jpg', '.jpeg', '.gif', '.ico', '.svg',
|
|
138
|
+
'.woff', '.woff2', '.ttf', '.eot',
|
|
139
|
+
'.pdf', '.zip', '.tar', '.gz', '.bz2',
|
|
140
|
+
'.mp3', '.mp4', '.wav', '.webm',
|
|
141
|
+
]);
|
|
142
|
+
|
|
143
|
+
for (const file of packFiles) {
|
|
144
|
+
// Skip binary files
|
|
145
|
+
const ext = file.substring(file.lastIndexOf('.')).toLowerCase();
|
|
146
|
+
if (BINARY_EXTENSIONS.has(ext)) continue;
|
|
147
|
+
|
|
148
|
+
const filePath = resolve(PROJECT_ROOT, file);
|
|
149
|
+
if (!existsSync(filePath)) continue;
|
|
150
|
+
|
|
151
|
+
let content;
|
|
152
|
+
try {
|
|
153
|
+
content = readFileSync(filePath, 'utf-8');
|
|
154
|
+
} catch {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Check for secret patterns
|
|
159
|
+
for (const pattern of SECRET_PATTERNS) {
|
|
160
|
+
const matches = content.match(new RegExp(pattern.source, 'g'));
|
|
161
|
+
if (matches) {
|
|
162
|
+
// Special handling for emails: allow up to MAX_EMAILS_PER_FILE
|
|
163
|
+
if (pattern.source.includes('@')) {
|
|
164
|
+
if (matches.length > MAX_EMAILS_PER_FILE) {
|
|
165
|
+
console.error(`${RED}[BLOCKED] Bulk PII (${matches.length} emails) in: ${file}${NC}`);
|
|
166
|
+
foundIssues++;
|
|
167
|
+
}
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Redact the actual values
|
|
172
|
+
const redacted = matches[0].substring(0, 12) + '**REDACTED**';
|
|
173
|
+
console.error(`${RED}[BLOCKED] Secret found in: ${file} → ${redacted}${NC}`);
|
|
174
|
+
foundIssues++;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// === STEP 5: Optional trufflehog scan ===
|
|
180
|
+
try {
|
|
181
|
+
execSync('trufflehog --version', { stdio: 'pipe' });
|
|
182
|
+
console.log(`${YELLOW}[pre-publish] Running trufflehog deep scan...${NC}`);
|
|
183
|
+
const result = execSync(
|
|
184
|
+
`trufflehog filesystem "${PROJECT_ROOT}" --only-verified --no-update --json`,
|
|
185
|
+
{ encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 120000 }
|
|
186
|
+
);
|
|
187
|
+
if (result.trim()) {
|
|
188
|
+
console.error(`${RED}[BLOCKED] trufflehog found VERIFIED secrets.${NC}`);
|
|
189
|
+
foundIssues++;
|
|
190
|
+
}
|
|
191
|
+
} catch {
|
|
192
|
+
// trufflehog not available, pattern scan is sufficient
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// === STEP 6: Layer validation (L1 only) ===
|
|
196
|
+
console.log(`${CYAN}[pre-publish] Running layer validation...${NC}`);
|
|
197
|
+
try {
|
|
198
|
+
const validation = validatePackageSync(PROJECT_ROOT);
|
|
199
|
+
if (validation.status === 'FAILED') {
|
|
200
|
+
console.error(`${RED}[BLOCKED] ${validation.violations.length} non-L1 file(s) in package:${NC}`);
|
|
201
|
+
for (const v of validation.violations) {
|
|
202
|
+
console.error(`${RED} [${v.layer}] ${v.path} — ${v.reason}${NC}`);
|
|
203
|
+
}
|
|
204
|
+
foundIssues += validation.violations.length;
|
|
205
|
+
} else {
|
|
206
|
+
console.log(`${GREEN}[pre-publish] Layer validation PASSED: ${validation.totalFiles} files, all L1.${NC}`);
|
|
207
|
+
}
|
|
208
|
+
} catch (err) {
|
|
209
|
+
// Layer validation is best-effort in pre-publish gate.
|
|
210
|
+
// If Python or audit_layers.py not available, WARN but don't block.
|
|
211
|
+
console.warn(`${YELLOW}[pre-publish] Layer validation skipped: ${err.message}${NC}`);
|
|
212
|
+
console.warn(`${YELLOW}[pre-publish] Run 'node bin/validate-package.js' manually to validate.${NC}`);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// === VERDICT ===
|
|
216
|
+
if (foundIssues > 0) {
|
|
217
|
+
console.error('');
|
|
218
|
+
console.error(`${RED}=====================================================${NC}`);
|
|
219
|
+
console.error(`${RED} NPM PUBLISH BLOCKED: ${foundIssues} security issue(s) found ${NC}`);
|
|
220
|
+
console.error(`${RED}=====================================================${NC}`);
|
|
221
|
+
console.error('');
|
|
222
|
+
console.error(`${YELLOW} Fix the issues above before publishing.${NC}`);
|
|
223
|
+
console.error(`${YELLOW} Run 'npm pack --dry-run' to see what would be published.${NC}`);
|
|
224
|
+
console.error('');
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
console.log(`${GREEN}[pre-publish] Security gate PASSED. ${packFiles.length} files scanned, 0 issues.${NC}`);
|
|
229
|
+
console.log(`${GREEN}[pre-publish] Package is safe to publish.${NC}`);
|