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,46 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Session Autosave Hook - Mega Brain
|
|
4
|
+
Tracks tool usage for session persistence.
|
|
5
|
+
Called as PostToolUse hook for Bash, Write, Edit.
|
|
6
|
+
|
|
7
|
+
Usage: python3 session_autosave.py <TOOL_NAME> "<TOOL_INPUT>"
|
|
8
|
+
Exit codes: 0 = success, 1 = warning (non-blocking)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import sys
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
MEGA_BRAIN_ROOT = os.getenv("MEGA_BRAIN_ROOT", os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
18
|
+
SESSION_DIR = Path(MEGA_BRAIN_ROOT) / ".claude" / "sessions"
|
|
19
|
+
AUTOSAVE_LOG = SESSION_DIR / "autosave-activity.jsonl"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def main():
|
|
23
|
+
tool_name = sys.argv[1] if len(sys.argv) > 1 else "UNKNOWN"
|
|
24
|
+
tool_input = sys.argv[2] if len(sys.argv) > 2 else ""
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
SESSION_DIR.mkdir(parents=True, exist_ok=True)
|
|
28
|
+
|
|
29
|
+
entry = {
|
|
30
|
+
"timestamp": datetime.now().isoformat(),
|
|
31
|
+
"tool": tool_name,
|
|
32
|
+
"input_preview": tool_input[:200] if tool_input else "",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
with open(AUTOSAVE_LOG, "a", encoding="utf-8") as f:
|
|
36
|
+
f.write(json.dumps(entry, ensure_ascii=False) + "\n")
|
|
37
|
+
|
|
38
|
+
except Exception:
|
|
39
|
+
# Non-critical - never block execution
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
sys.exit(0)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
if __name__ == "__main__":
|
|
46
|
+
main()
|
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
SKILL GENERATOR - Intelligence Layer v1.0
|
|
4
|
+
==========================================
|
|
5
|
+
Converte frameworks extraidos do DNA em Skills executaveis (SKILL.md).
|
|
6
|
+
|
|
7
|
+
Pipeline: Framework DNA -> SKILL.md
|
|
8
|
+
Inspirado no NERO pipeline do MMOS (128+ skills de 11 personas).
|
|
9
|
+
|
|
10
|
+
Le DNA layers de personas, identifica frameworks/metodologias,
|
|
11
|
+
e converte cada um em SKILL.md executavel com workflow, evidencia, etc.
|
|
12
|
+
|
|
13
|
+
Dependencias: Sprint 4 completo (roles com weighted_score)
|
|
14
|
+
Inspiracao: MMOS NERO pipeline, formato SKILL.md do aios-core
|
|
15
|
+
|
|
16
|
+
Versao: 1.0.0
|
|
17
|
+
Data: 2026-02-26
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
import re
|
|
22
|
+
import sys
|
|
23
|
+
import yaml
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from datetime import datetime, timezone
|
|
26
|
+
from collections import defaultdict
|
|
27
|
+
|
|
28
|
+
sys.path.insert(0, str(Path(__file__).parent))
|
|
29
|
+
from entity_normalizer import load_registry, save_registry, load_taxonomy
|
|
30
|
+
|
|
31
|
+
# ---------------------------------------------------------------------------
|
|
32
|
+
# PATHS
|
|
33
|
+
# ---------------------------------------------------------------------------
|
|
34
|
+
BASE_DIR = Path(__file__).parent.parent
|
|
35
|
+
INSIGHTS_DIR = BASE_DIR / "processing" / "insights"
|
|
36
|
+
CHUNKS_DIR = BASE_DIR / "processing" / "chunks"
|
|
37
|
+
SKILLS_OUTPUT_DIR = BASE_DIR / "knowledge" / "dna" / "skills"
|
|
38
|
+
SKILLS_REGISTRY_PATH = BASE_DIR / "knowledge" / "dna" / "_dna-skills-registry.yaml"
|
|
39
|
+
|
|
40
|
+
# ---------------------------------------------------------------------------
|
|
41
|
+
# FRAMEWORK EXTRACTION PATTERNS
|
|
42
|
+
# ---------------------------------------------------------------------------
|
|
43
|
+
|
|
44
|
+
# Patterns that indicate a framework or methodology in text
|
|
45
|
+
FRAMEWORK_INDICATORS = [
|
|
46
|
+
# Named frameworks (e.g., "The CLOSER Framework", "NEPQ Method")
|
|
47
|
+
r"(?:the\s+)?([A-Z][A-Z0-9\s-]{2,30})\s+(?:framework|method|model|system|process|approach|formula|technique|estrategia|metodo|processo|sistema)",
|
|
48
|
+
# Step-based patterns (e.g., "Step 1: ..., Step 2: ...")
|
|
49
|
+
r"(?:step|passo|etapa|fase)\s+[1-9][\s:.-]+([^\n]{10,80})",
|
|
50
|
+
# Numbered lists that look like methodology (3+ items)
|
|
51
|
+
r"(\d+)\)\s+([^\n]{10,80})",
|
|
52
|
+
# Acronym-based (e.g., "SPIN", "BANT", "MEDDIC")
|
|
53
|
+
r"\b([A-Z]{3,8})\b\s+(?:stands\s+for|significa|is\s+an?\s+(?:acronym|framework|method))",
|
|
54
|
+
# "Rule of" patterns
|
|
55
|
+
r"(?:rule|regra|lei)\s+(?:of|de|do|da)\s+(\w+(?:\s+\w+){0,3})",
|
|
56
|
+
# "X-Step" patterns (e.g., "7-Step Close", "3-Step Qualification")
|
|
57
|
+
r"(\d+)[-\s](?:step|passo|etapa)\s+(\w+(?:\s+\w+){0,3})",
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
# Patterns for extracting steps within a framework
|
|
61
|
+
STEP_PATTERNS = [
|
|
62
|
+
r"(?:step|passo|etapa)\s+(\d+)[\s:.-]+([^\n]+)",
|
|
63
|
+
r"(\d+)[\)\.]\s+([^\n]+)",
|
|
64
|
+
r"(?:first|second|third|fourth|fifth|primeiro|segundo|terceiro|quarto|quinto)[\s:,]+([^\n]+)",
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
# Skill type classification
|
|
68
|
+
SKILL_TYPE_KEYWORDS = {
|
|
69
|
+
"sequential": ["step", "passo", "etapa", "first", "then", "next", "depois", "apos"],
|
|
70
|
+
"parallel": ["simultaneously", "at the same time", "while", "ao mesmo tempo", "enquanto"],
|
|
71
|
+
"reference": ["guide", "reference", "checklist", "template", "guia", "referencia"],
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# ---------------------------------------------------------------------------
|
|
76
|
+
# CORE: EXTRACT FRAMEWORKS
|
|
77
|
+
# ---------------------------------------------------------------------------
|
|
78
|
+
def extract_frameworks_from_text(text, source_id=None, persona=None):
|
|
79
|
+
"""
|
|
80
|
+
Extract framework/methodology patterns from text.
|
|
81
|
+
|
|
82
|
+
Returns list of framework dicts with name, steps, evidence, etc.
|
|
83
|
+
"""
|
|
84
|
+
frameworks = []
|
|
85
|
+
text_lower = text.lower()
|
|
86
|
+
|
|
87
|
+
# 1. Find named frameworks
|
|
88
|
+
for pattern in FRAMEWORK_INDICATORS[:3]:
|
|
89
|
+
for match in re.finditer(pattern, text, re.IGNORECASE):
|
|
90
|
+
name = match.group(1).strip() if match.group(1) else ""
|
|
91
|
+
if name and len(name) > 3 and not _is_noise(name):
|
|
92
|
+
ctx_start = max(0, match.start() - 200)
|
|
93
|
+
ctx_end = min(len(text), match.end() + 500)
|
|
94
|
+
context = text[ctx_start:ctx_end]
|
|
95
|
+
|
|
96
|
+
steps = _extract_steps_from_context(context)
|
|
97
|
+
fw = {
|
|
98
|
+
"name": _clean_framework_name(name),
|
|
99
|
+
"raw_name": name,
|
|
100
|
+
"steps": steps,
|
|
101
|
+
"step_count": len(steps),
|
|
102
|
+
"source_id": source_id,
|
|
103
|
+
"persona": persona,
|
|
104
|
+
"evidence": context[:300].strip(),
|
|
105
|
+
"layer": _classify_layer(context),
|
|
106
|
+
}
|
|
107
|
+
if not _is_duplicate_framework(fw, frameworks):
|
|
108
|
+
frameworks.append(fw)
|
|
109
|
+
|
|
110
|
+
# 2. Find step-sequence frameworks (unnamed but structured)
|
|
111
|
+
step_sequences = _find_step_sequences(text)
|
|
112
|
+
for seq in step_sequences:
|
|
113
|
+
if seq["step_count"] >= 3:
|
|
114
|
+
name = _infer_framework_name(seq["steps"], text)
|
|
115
|
+
fw = {
|
|
116
|
+
"name": name,
|
|
117
|
+
"raw_name": f"Unnamed {seq['step_count']}-step process",
|
|
118
|
+
"steps": seq["steps"],
|
|
119
|
+
"step_count": seq["step_count"],
|
|
120
|
+
"source_id": source_id,
|
|
121
|
+
"persona": persona,
|
|
122
|
+
"evidence": seq.get("context", "")[:300].strip(),
|
|
123
|
+
"layer": _classify_layer(seq.get("context", "")),
|
|
124
|
+
}
|
|
125
|
+
if not _is_duplicate_framework(fw, frameworks):
|
|
126
|
+
frameworks.append(fw)
|
|
127
|
+
|
|
128
|
+
# 3. Find acronym-based frameworks
|
|
129
|
+
for pattern in FRAMEWORK_INDICATORS[3:4]:
|
|
130
|
+
for match in re.finditer(pattern, text, re.IGNORECASE):
|
|
131
|
+
acronym = match.group(1).strip()
|
|
132
|
+
if len(acronym) >= 3 and not _is_noise(acronym):
|
|
133
|
+
ctx_start = max(0, match.start() - 100)
|
|
134
|
+
ctx_end = min(len(text), match.end() + 300)
|
|
135
|
+
context = text[ctx_start:ctx_end]
|
|
136
|
+
fw = {
|
|
137
|
+
"name": acronym,
|
|
138
|
+
"raw_name": acronym,
|
|
139
|
+
"steps": [],
|
|
140
|
+
"step_count": 0,
|
|
141
|
+
"source_id": source_id,
|
|
142
|
+
"persona": persona,
|
|
143
|
+
"evidence": context[:300].strip(),
|
|
144
|
+
"layer": "L3", # Acronyms are usually mental models
|
|
145
|
+
}
|
|
146
|
+
if not _is_duplicate_framework(fw, frameworks):
|
|
147
|
+
frameworks.append(fw)
|
|
148
|
+
|
|
149
|
+
return frameworks
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def extract_frameworks_from_file(filepath):
|
|
153
|
+
"""Extract frameworks from a chunk file."""
|
|
154
|
+
filepath = Path(filepath)
|
|
155
|
+
with open(filepath, "r", encoding="utf-8") as f:
|
|
156
|
+
data = json.load(f)
|
|
157
|
+
|
|
158
|
+
source_id = data.get("source_id", data.get("source_hash", filepath.stem))
|
|
159
|
+
persona = _detect_persona(source_id, data)
|
|
160
|
+
|
|
161
|
+
chunks = data.get("chunks", [data])
|
|
162
|
+
all_frameworks = []
|
|
163
|
+
|
|
164
|
+
for chunk in chunks:
|
|
165
|
+
text = chunk.get("content", "") or chunk.get("texto", "") or chunk.get("text", "")
|
|
166
|
+
if not text:
|
|
167
|
+
continue
|
|
168
|
+
frameworks = extract_frameworks_from_text(text, source_id=source_id, persona=persona)
|
|
169
|
+
all_frameworks.extend(frameworks)
|
|
170
|
+
|
|
171
|
+
return {
|
|
172
|
+
"source_id": source_id,
|
|
173
|
+
"persona": persona,
|
|
174
|
+
"frameworks_found": len(all_frameworks),
|
|
175
|
+
"frameworks": all_frameworks,
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def scan_all_and_generate(registry=None, save=True):
|
|
180
|
+
"""Scan all chunks, extract frameworks, generate SKILL.md files."""
|
|
181
|
+
if registry is None:
|
|
182
|
+
registry = load_registry()
|
|
183
|
+
|
|
184
|
+
# Phase 1: Extract all frameworks
|
|
185
|
+
persona_frameworks = defaultdict(list)
|
|
186
|
+
files_scanned = 0
|
|
187
|
+
|
|
188
|
+
for fpath in sorted(CHUNKS_DIR.glob("*.json")):
|
|
189
|
+
if fpath.name in ("CHUNKS-STATE.json", "_INDEX.json", "_rag_export.json"):
|
|
190
|
+
continue
|
|
191
|
+
|
|
192
|
+
result = extract_frameworks_from_file(fpath)
|
|
193
|
+
files_scanned += 1
|
|
194
|
+
|
|
195
|
+
persona = result["persona"] or "unknown"
|
|
196
|
+
persona_frameworks[persona].extend(result["frameworks"])
|
|
197
|
+
|
|
198
|
+
# Phase 2: Deduplicate frameworks per persona
|
|
199
|
+
for persona in persona_frameworks:
|
|
200
|
+
persona_frameworks[persona] = _deduplicate_frameworks(persona_frameworks[persona])
|
|
201
|
+
|
|
202
|
+
# Phase 3: Generate SKILL.md for each framework
|
|
203
|
+
total_skills = 0
|
|
204
|
+
skills_registry = {
|
|
205
|
+
"version": 1,
|
|
206
|
+
"generated_at": datetime.now(timezone.utc).isoformat(),
|
|
207
|
+
"total_skills": 0,
|
|
208
|
+
"personas": {},
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
for persona, frameworks in persona_frameworks.items():
|
|
212
|
+
persona_slug = _slugify(persona)
|
|
213
|
+
persona_skills = []
|
|
214
|
+
|
|
215
|
+
for fw in frameworks:
|
|
216
|
+
if fw["step_count"] < 2 and not fw["name"]:
|
|
217
|
+
continue # Skip frameworks without enough structure
|
|
218
|
+
|
|
219
|
+
skill_id = f"dna-{persona_slug}-{_slugify(fw['name'])}"
|
|
220
|
+
skill_type = _classify_skill_type(fw)
|
|
221
|
+
|
|
222
|
+
skill = {
|
|
223
|
+
"skill_id": skill_id,
|
|
224
|
+
"source_persona": persona,
|
|
225
|
+
"source_layer": fw.get("layer", "L3"),
|
|
226
|
+
"name": fw["name"],
|
|
227
|
+
"type": skill_type,
|
|
228
|
+
"workflow_steps": fw["steps"],
|
|
229
|
+
"step_count": fw["step_count"],
|
|
230
|
+
"evidence": fw.get("evidence", ""),
|
|
231
|
+
"source_id": fw.get("source_id", ""),
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if save:
|
|
235
|
+
_save_skill_md(persona_slug, skill)
|
|
236
|
+
|
|
237
|
+
persona_skills.append(skill)
|
|
238
|
+
total_skills += 1
|
|
239
|
+
|
|
240
|
+
skills_registry["personas"][persona_slug] = {
|
|
241
|
+
"skills_count": len(persona_skills),
|
|
242
|
+
"skills": [s["skill_id"] for s in persona_skills],
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
skills_registry["total_skills"] = total_skills
|
|
246
|
+
|
|
247
|
+
if save:
|
|
248
|
+
_save_skills_registry(skills_registry)
|
|
249
|
+
|
|
250
|
+
return {
|
|
251
|
+
"files_scanned": files_scanned,
|
|
252
|
+
"personas_found": len(persona_frameworks),
|
|
253
|
+
"total_frameworks": sum(len(v) for v in persona_frameworks.values()),
|
|
254
|
+
"total_skills_generated": total_skills,
|
|
255
|
+
"per_persona": {
|
|
256
|
+
k: len(v) for k, v in persona_frameworks.items()
|
|
257
|
+
},
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
# ---------------------------------------------------------------------------
|
|
262
|
+
# SKILL MD GENERATION
|
|
263
|
+
# ---------------------------------------------------------------------------
|
|
264
|
+
def _save_skill_md(persona_slug, skill):
|
|
265
|
+
"""Generate and save SKILL.md file."""
|
|
266
|
+
skill_dir = SKILLS_OUTPUT_DIR / persona_slug
|
|
267
|
+
skill_dir.mkdir(parents=True, exist_ok=True)
|
|
268
|
+
|
|
269
|
+
filename = f"{_slugify(skill['name'])}.md"
|
|
270
|
+
filepath = skill_dir / filename
|
|
271
|
+
|
|
272
|
+
lines = [
|
|
273
|
+
f"# {skill['name']}",
|
|
274
|
+
f"",
|
|
275
|
+
f"> **Skill ID:** {skill['skill_id']}",
|
|
276
|
+
f"> **Source:** DNA Layer {skill['source_layer']} - {skill['source_persona']}",
|
|
277
|
+
f"> **Type:** {skill['type']}",
|
|
278
|
+
f"> **Version:** 1.0.0 (auto-generated)",
|
|
279
|
+
f"",
|
|
280
|
+
]
|
|
281
|
+
|
|
282
|
+
# When to Use
|
|
283
|
+
lines.extend([
|
|
284
|
+
f"## Quando Usar",
|
|
285
|
+
f"",
|
|
286
|
+
f"Framework aplicavel quando o contexto envolve {skill['source_persona']} "
|
|
287
|
+
f"e a situacao requer um processo estruturado de {skill['name'].lower()}.",
|
|
288
|
+
f"",
|
|
289
|
+
])
|
|
290
|
+
|
|
291
|
+
# When NOT to Use
|
|
292
|
+
lines.extend([
|
|
293
|
+
f"## Quando NAO Usar",
|
|
294
|
+
f"",
|
|
295
|
+
f"- Contexto nao relacionado ao dominio original",
|
|
296
|
+
f"- Quando uma abordagem mais simples resolve",
|
|
297
|
+
f"- Quando o framework conflita com outro framework ativo",
|
|
298
|
+
f"",
|
|
299
|
+
])
|
|
300
|
+
|
|
301
|
+
# Workflow
|
|
302
|
+
lines.extend([
|
|
303
|
+
f"## Workflow",
|
|
304
|
+
f"",
|
|
305
|
+
])
|
|
306
|
+
if skill["workflow_steps"]:
|
|
307
|
+
for i, step in enumerate(skill["workflow_steps"], 1):
|
|
308
|
+
lines.append(f"{i}. {step}")
|
|
309
|
+
else:
|
|
310
|
+
lines.append(f"_Framework detectado mas steps nao extraidos automaticamente. "
|
|
311
|
+
f"Consultar evidencia original._")
|
|
312
|
+
lines.append("")
|
|
313
|
+
|
|
314
|
+
# Output
|
|
315
|
+
lines.extend([
|
|
316
|
+
f"## Output Esperado",
|
|
317
|
+
f"",
|
|
318
|
+
f"Resultado estruturado seguindo os {skill['step_count']} passos do framework.",
|
|
319
|
+
f"",
|
|
320
|
+
])
|
|
321
|
+
|
|
322
|
+
# Evidence
|
|
323
|
+
lines.extend([
|
|
324
|
+
f"## Evidencia e Atribuicao",
|
|
325
|
+
f"",
|
|
326
|
+
f"**Source ID:** {skill['source_id']}",
|
|
327
|
+
f"",
|
|
328
|
+
f"```",
|
|
329
|
+
f"{skill['evidence'][:500]}",
|
|
330
|
+
f"```",
|
|
331
|
+
f"",
|
|
332
|
+
f"---",
|
|
333
|
+
f"Auto-gerado por Mega Brain Intelligence Layer | {datetime.now(timezone.utc).strftime('%Y-%m-%d')}",
|
|
334
|
+
])
|
|
335
|
+
|
|
336
|
+
with open(filepath, "w", encoding="utf-8") as f:
|
|
337
|
+
f.write("\n".join(lines))
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def _save_skills_registry(registry_data):
|
|
341
|
+
"""Save _dna-skills-registry.yaml."""
|
|
342
|
+
SKILLS_REGISTRY_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
343
|
+
with open(SKILLS_REGISTRY_PATH, "w", encoding="utf-8") as f:
|
|
344
|
+
yaml.dump(registry_data, f, default_flow_style=False, allow_unicode=True)
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
# ---------------------------------------------------------------------------
|
|
348
|
+
# HELPERS
|
|
349
|
+
# ---------------------------------------------------------------------------
|
|
350
|
+
def _clean_framework_name(name):
|
|
351
|
+
"""Clean and normalize framework name."""
|
|
352
|
+
name = re.sub(r"\s+", " ", name.strip())
|
|
353
|
+
# Remove common noise words at start
|
|
354
|
+
name = re.sub(r"^(?:the|a|an|o|a)\s+", "", name, flags=re.IGNORECASE)
|
|
355
|
+
return name.title() if name else "Unnamed Framework"
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
def _classify_layer(context):
|
|
359
|
+
"""Classify which DNA layer a framework belongs to."""
|
|
360
|
+
ctx_lower = context.lower()
|
|
361
|
+
if any(kw in ctx_lower for kw in ["step", "passo", "process", "processo", "how to", "como"]):
|
|
362
|
+
return "L3" # Mental models / processes
|
|
363
|
+
if any(kw in ctx_lower for kw in ["believe", "acredit", "philosophy", "filosofia", "mindset"]):
|
|
364
|
+
return "L4" # Values / beliefs
|
|
365
|
+
if any(kw in ctx_lower for kw in ["always", "never", "rule", "regra", "principle", "principio"]):
|
|
366
|
+
return "L4" # Values / principles
|
|
367
|
+
if any(kw in ctx_lower for kw in ["feel", "emotion", "intuition", "gut", "instinto"]):
|
|
368
|
+
return "L2" # Recognition patterns
|
|
369
|
+
return "L3" # Default to mental models
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
def _classify_skill_type(fw):
|
|
373
|
+
"""Classify skill as sequential, parallel, or reference."""
|
|
374
|
+
text = " ".join(fw.get("steps", [])).lower() + " " + fw.get("evidence", "").lower()
|
|
375
|
+
|
|
376
|
+
for skill_type, keywords in SKILL_TYPE_KEYWORDS.items():
|
|
377
|
+
if any(kw in text for kw in keywords):
|
|
378
|
+
return skill_type
|
|
379
|
+
|
|
380
|
+
if fw["step_count"] >= 3:
|
|
381
|
+
return "sequential"
|
|
382
|
+
return "reference"
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def _extract_steps_from_context(context):
|
|
386
|
+
"""Extract numbered/sequential steps from context text."""
|
|
387
|
+
steps = []
|
|
388
|
+
for pattern in STEP_PATTERNS:
|
|
389
|
+
matches = re.finditer(pattern, context, re.IGNORECASE)
|
|
390
|
+
for match in matches:
|
|
391
|
+
groups = match.groups()
|
|
392
|
+
step_text = groups[-1].strip() if groups else ""
|
|
393
|
+
if step_text and len(step_text) > 5 and not _is_noise(step_text):
|
|
394
|
+
steps.append(step_text[:200])
|
|
395
|
+
|
|
396
|
+
# Deduplicate while preserving order
|
|
397
|
+
seen = set()
|
|
398
|
+
unique_steps = []
|
|
399
|
+
for s in steps:
|
|
400
|
+
norm = s.lower()[:50]
|
|
401
|
+
if norm not in seen:
|
|
402
|
+
seen.add(norm)
|
|
403
|
+
unique_steps.append(s)
|
|
404
|
+
|
|
405
|
+
return unique_steps[:15] # Cap at 15 steps
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
def _find_step_sequences(text):
|
|
409
|
+
"""Find sequences of numbered steps in text."""
|
|
410
|
+
sequences = []
|
|
411
|
+
lines = text.split("\n")
|
|
412
|
+
|
|
413
|
+
current_steps = []
|
|
414
|
+
current_start = 0
|
|
415
|
+
|
|
416
|
+
for i, line in enumerate(lines):
|
|
417
|
+
match = re.match(r"^\s*(\d+)[\)\.:\s]+(.{10,200})", line)
|
|
418
|
+
if match:
|
|
419
|
+
step_num = int(match.group(1))
|
|
420
|
+
step_text = match.group(2).strip()
|
|
421
|
+
|
|
422
|
+
if step_num == 1 or (current_steps and step_num == len(current_steps) + 1):
|
|
423
|
+
if step_num == 1 and current_steps:
|
|
424
|
+
# Save previous sequence
|
|
425
|
+
if len(current_steps) >= 3:
|
|
426
|
+
ctx_start = max(0, current_start - 100)
|
|
427
|
+
ctx_end = min(len(text), i * 80)
|
|
428
|
+
sequences.append({
|
|
429
|
+
"steps": current_steps,
|
|
430
|
+
"step_count": len(current_steps),
|
|
431
|
+
"context": text[ctx_start:ctx_end][:500],
|
|
432
|
+
})
|
|
433
|
+
current_steps = []
|
|
434
|
+
current_start = i
|
|
435
|
+
|
|
436
|
+
current_steps.append(step_text)
|
|
437
|
+
else:
|
|
438
|
+
if current_steps and len(current_steps) >= 3:
|
|
439
|
+
ctx_start = max(0, current_start - 100)
|
|
440
|
+
sequences.append({
|
|
441
|
+
"steps": current_steps,
|
|
442
|
+
"step_count": len(current_steps),
|
|
443
|
+
"context": "\n".join(lines[max(0, current_start - 2):i])[:500],
|
|
444
|
+
})
|
|
445
|
+
current_steps = []
|
|
446
|
+
|
|
447
|
+
# Don't forget last sequence
|
|
448
|
+
if current_steps and len(current_steps) >= 3:
|
|
449
|
+
sequences.append({
|
|
450
|
+
"steps": current_steps,
|
|
451
|
+
"step_count": len(current_steps),
|
|
452
|
+
"context": "\n".join(lines[-min(20, len(lines)):])[:500],
|
|
453
|
+
})
|
|
454
|
+
|
|
455
|
+
return sequences
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
def _infer_framework_name(steps, full_text):
|
|
459
|
+
"""Try to infer a name for an unnamed framework from its steps."""
|
|
460
|
+
if not steps:
|
|
461
|
+
return "Unnamed Process"
|
|
462
|
+
|
|
463
|
+
# Look at the context right before the steps
|
|
464
|
+
first_step = steps[0]
|
|
465
|
+
idx = full_text.find(first_step)
|
|
466
|
+
if idx > 20:
|
|
467
|
+
before = full_text[max(0, idx - 200):idx].strip()
|
|
468
|
+
# Look for a title/header before the steps
|
|
469
|
+
lines = before.split("\n")
|
|
470
|
+
for line in reversed(lines):
|
|
471
|
+
line = line.strip()
|
|
472
|
+
if line and 5 < len(line) < 60 and not line[0].isdigit():
|
|
473
|
+
return line.rstrip(":").strip().title()
|
|
474
|
+
|
|
475
|
+
# Fallback: use verb from first step
|
|
476
|
+
first_word = steps[0].split()[0] if steps[0] else "Process"
|
|
477
|
+
return f"{first_word.title()} Framework ({len(steps)} Steps)"
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
def _is_duplicate_framework(new_fw, existing):
|
|
481
|
+
"""Check if framework is duplicate of an existing one."""
|
|
482
|
+
new_name_lower = new_fw["name"].lower()
|
|
483
|
+
for fw in existing:
|
|
484
|
+
if fw["name"].lower() == new_name_lower:
|
|
485
|
+
return True
|
|
486
|
+
# Check if steps overlap significantly
|
|
487
|
+
if fw["steps"] and new_fw["steps"]:
|
|
488
|
+
overlap = len(set(s.lower()[:30] for s in fw["steps"]) &
|
|
489
|
+
set(s.lower()[:30] for s in new_fw["steps"]))
|
|
490
|
+
if overlap >= 3:
|
|
491
|
+
return True
|
|
492
|
+
return False
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
def _deduplicate_frameworks(frameworks):
|
|
496
|
+
"""Deduplicate a list of frameworks."""
|
|
497
|
+
unique = []
|
|
498
|
+
for fw in frameworks:
|
|
499
|
+
if not _is_duplicate_framework(fw, unique):
|
|
500
|
+
unique.append(fw)
|
|
501
|
+
return unique
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
def _detect_persona(source_id, data):
|
|
505
|
+
"""Detect which persona this content belongs to."""
|
|
506
|
+
# Check source_id for person name hints
|
|
507
|
+
if not source_id:
|
|
508
|
+
return None
|
|
509
|
+
|
|
510
|
+
source_lower = source_id.lower()
|
|
511
|
+
persona_hints = {
|
|
512
|
+
"hormozi": "Alex Hormozi",
|
|
513
|
+
"cole": "Cole Gordon",
|
|
514
|
+
"gordon": "Cole Gordon",
|
|
515
|
+
"sam": "Sam Oven",
|
|
516
|
+
"oven": "Sam Oven",
|
|
517
|
+
"jordan": "Jordan Lee",
|
|
518
|
+
"miner": "Jeremy Miner",
|
|
519
|
+
"haynes": "Jeremy Haynes",
|
|
520
|
+
"brunson": "Russell Brunson",
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
for hint, persona in persona_hints.items():
|
|
524
|
+
if hint in source_lower:
|
|
525
|
+
return persona
|
|
526
|
+
|
|
527
|
+
# Check metadata
|
|
528
|
+
meta_persona = data.get("persona", data.get("speaker", data.get("author")))
|
|
529
|
+
if meta_persona:
|
|
530
|
+
return meta_persona
|
|
531
|
+
|
|
532
|
+
return None
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
def _is_noise(text):
|
|
536
|
+
"""Check if text is noise (too generic, stop words, etc.)."""
|
|
537
|
+
noise_words = {
|
|
538
|
+
"the", "a", "an", "this", "that", "these", "those",
|
|
539
|
+
"and", "or", "but", "if", "then", "so", "because",
|
|
540
|
+
"you", "your", "they", "them", "we", "our", "i", "my",
|
|
541
|
+
"it", "its", "is", "are", "was", "were", "be",
|
|
542
|
+
}
|
|
543
|
+
words = text.lower().split()
|
|
544
|
+
if len(words) <= 1:
|
|
545
|
+
return True
|
|
546
|
+
if all(w in noise_words for w in words):
|
|
547
|
+
return True
|
|
548
|
+
if len(text) < 4:
|
|
549
|
+
return True
|
|
550
|
+
return False
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
def _slugify(text):
|
|
554
|
+
"""Convert text to slug format."""
|
|
555
|
+
if not text:
|
|
556
|
+
return "unknown"
|
|
557
|
+
text = text.lower().strip()
|
|
558
|
+
text = re.sub(r"[^\w\s-]", "", text)
|
|
559
|
+
text = re.sub(r"[\s]+", "-", text)
|
|
560
|
+
text = re.sub(r"-+", "-", text)
|
|
561
|
+
return text[:50].strip("-")
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
# ---------------------------------------------------------------------------
|
|
565
|
+
# CLI
|
|
566
|
+
# ---------------------------------------------------------------------------
|
|
567
|
+
def main():
|
|
568
|
+
if len(sys.argv) > 1 and sys.argv[1] == "--all":
|
|
569
|
+
print("\n=== SKILL GENERATOR v1.0: Full Scan ===\n")
|
|
570
|
+
result = scan_all_and_generate(save=True)
|
|
571
|
+
print(f"Files scanned: {result['files_scanned']}")
|
|
572
|
+
print(f"Personas found: {result['personas_found']}")
|
|
573
|
+
print(f"Total frameworks: {result['total_frameworks']}")
|
|
574
|
+
print(f"Skills generated: {result['total_skills_generated']}")
|
|
575
|
+
|
|
576
|
+
if result["per_persona"]:
|
|
577
|
+
print(f"\n--- Per Persona ---")
|
|
578
|
+
for persona, count in sorted(result["per_persona"].items(),
|
|
579
|
+
key=lambda x: -x[1]):
|
|
580
|
+
print(f" {persona:30s} {count} frameworks")
|
|
581
|
+
|
|
582
|
+
elif len(sys.argv) > 1:
|
|
583
|
+
filepath = sys.argv[1]
|
|
584
|
+
result = extract_frameworks_from_file(filepath)
|
|
585
|
+
print(f"\nSource: {result['source_id']}")
|
|
586
|
+
print(f"Persona: {result['persona']}")
|
|
587
|
+
print(f"Frameworks found: {result['frameworks_found']}")
|
|
588
|
+
for fw in result["frameworks"]:
|
|
589
|
+
print(f"\n [{fw.get('layer', '?')}] {fw['name']} ({fw['step_count']} steps)")
|
|
590
|
+
for i, step in enumerate(fw["steps"][:5], 1):
|
|
591
|
+
print(f" {i}. {step[:80]}")
|
|
592
|
+
|
|
593
|
+
else:
|
|
594
|
+
print("Uso:")
|
|
595
|
+
print(" python3 skill_generator.py --all # Scan all + generate skills")
|
|
596
|
+
print(" python3 skill_generator.py <filepath> # Extract from single file")
|
|
597
|
+
sys.exit(1)
|
|
598
|
+
|
|
599
|
+
|
|
600
|
+
if __name__ == "__main__":
|
|
601
|
+
main()
|