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.
Files changed (510) hide show
  1. package/.antigravity/README.md +46 -0
  2. package/.antigravity/rules/.gitkeep +0 -0
  3. package/.antigravity/rules/mega-brain.md +39 -0
  4. package/.claude/CLAUDE.md +172 -0
  5. package/.claude/agents.yaml +44 -0
  6. package/.claude/commands/agents.md +161 -0
  7. package/.claude/commands/ask.md +117 -0
  8. package/.claude/commands/benchmark.md +224 -0
  9. package/.claude/commands/chat.md +343 -0
  10. package/.claude/commands/compare.md +116 -0
  11. package/.claude/commands/conclave.md +196 -0
  12. package/.claude/commands/config.md +133 -0
  13. package/.claude/commands/create-agent.md +467 -0
  14. package/.claude/commands/debate.md +159 -0
  15. package/.claude/commands/documentation/create-architecture-documentation.md +175 -0
  16. package/.claude/commands/dossiers.md +180 -0
  17. package/.claude/commands/evolve.md +223 -0
  18. package/.claude/commands/extract-dna.md +172 -0
  19. package/.claude/commands/extract-knowledge.md +507 -0
  20. package/.claude/commands/gsd/add-phase.md +43 -0
  21. package/.claude/commands/gsd/add-tests.md +41 -0
  22. package/.claude/commands/gsd/add-todo.md +47 -0
  23. package/.claude/commands/gsd/audit-milestone.md +36 -0
  24. package/.claude/commands/gsd/check-todos.md +45 -0
  25. package/.claude/commands/gsd/cleanup.md +18 -0
  26. package/.claude/commands/gsd/complete-milestone.md +136 -0
  27. package/.claude/commands/gsd/debug.md +167 -0
  28. package/.claude/commands/gsd/discuss-phase.md +83 -0
  29. package/.claude/commands/gsd/execute-phase.md +41 -0
  30. package/.claude/commands/gsd/health.md +22 -0
  31. package/.claude/commands/gsd/help.md +22 -0
  32. package/.claude/commands/gsd/insert-phase.md +32 -0
  33. package/.claude/commands/gsd/join-discord.md +18 -0
  34. package/.claude/commands/gsd/list-phase-assumptions.md +46 -0
  35. package/.claude/commands/gsd/map-codebase.md +71 -0
  36. package/.claude/commands/gsd/new-milestone.md +44 -0
  37. package/.claude/commands/gsd/new-project.md +42 -0
  38. package/.claude/commands/gsd/pause-work.md +38 -0
  39. package/.claude/commands/gsd/plan-milestone-gaps.md +34 -0
  40. package/.claude/commands/gsd/plan-phase.md +45 -0
  41. package/.claude/commands/gsd/progress.md +24 -0
  42. package/.claude/commands/gsd/quick.md +41 -0
  43. package/.claude/commands/gsd/reapply-patches.md +110 -0
  44. package/.claude/commands/gsd/remove-phase.md +31 -0
  45. package/.claude/commands/gsd/research-phase.md +189 -0
  46. package/.claude/commands/gsd/resume-work.md +40 -0
  47. package/.claude/commands/gsd/set-profile.md +34 -0
  48. package/.claude/commands/gsd/settings.md +36 -0
  49. package/.claude/commands/gsd/update.md +37 -0
  50. package/.claude/commands/gsd/verify-work.md +38 -0
  51. package/.claude/commands/inbox.md +296 -0
  52. package/.claude/commands/ingest-empresa.md +191 -0
  53. package/.claude/commands/ingest.md +183 -0
  54. package/.claude/commands/jarvis-briefing.md +67 -0
  55. package/.claude/commands/jarvis-control.md +169 -0
  56. package/.claude/commands/jarvis-full.md +182 -0
  57. package/.claude/commands/jarvis.md +212 -0
  58. package/.claude/commands/ler-drive.md +212 -0
  59. package/.claude/commands/log.md +158 -0
  60. package/.claude/commands/loop.md +133 -0
  61. package/.claude/commands/loops.md +73 -0
  62. package/.claude/commands/mission-autopilot.md +538 -0
  63. package/.claude/commands/mission.md +353 -0
  64. package/.claude/commands/process-inbox.md +148 -0
  65. package/.claude/commands/process-jarvis.md +3036 -0
  66. package/.claude/commands/process-video.md +131 -0
  67. package/.claude/commands/rag-search.md +78 -0
  68. package/.claude/commands/resume.md +33 -0
  69. package/.claude/commands/save.md +38 -0
  70. package/.claude/commands/scan-inbox.md +125 -0
  71. package/.claude/commands/setup.md +99 -0
  72. package/.claude/commands/system-digest.md +243 -0
  73. package/.claude/commands/verify.md +182 -0
  74. package/.claude/commands/view-dna.md +169 -0
  75. package/.claude/get-shit-done/VERSION +1 -0
  76. package/.claude/get-shit-done/bin/gsd-tools.cjs +588 -0
  77. package/.claude/get-shit-done/bin/lib/commands.cjs +553 -0
  78. package/.claude/get-shit-done/bin/lib/config.cjs +162 -0
  79. package/.claude/get-shit-done/bin/lib/core.cjs +411 -0
  80. package/.claude/get-shit-done/bin/lib/frontmatter.cjs +299 -0
  81. package/.claude/get-shit-done/bin/lib/init.cjs +710 -0
  82. package/.claude/get-shit-done/bin/lib/milestone.cjs +216 -0
  83. package/.claude/get-shit-done/bin/lib/phase.cjs +871 -0
  84. package/.claude/get-shit-done/bin/lib/roadmap.cjs +298 -0
  85. package/.claude/get-shit-done/bin/lib/state.cjs +679 -0
  86. package/.claude/get-shit-done/bin/lib/template.cjs +222 -0
  87. package/.claude/get-shit-done/bin/lib/verify.cjs +773 -0
  88. package/.claude/get-shit-done/references/checkpoints.md +776 -0
  89. package/.claude/get-shit-done/references/continuation-format.md +249 -0
  90. package/.claude/get-shit-done/references/decimal-phase-calculation.md +65 -0
  91. package/.claude/get-shit-done/references/git-integration.md +248 -0
  92. package/.claude/get-shit-done/references/git-planning-commit.md +38 -0
  93. package/.claude/get-shit-done/references/model-profile-resolution.md +34 -0
  94. package/.claude/get-shit-done/references/model-profiles.md +92 -0
  95. package/.claude/get-shit-done/references/phase-argument-parsing.md +61 -0
  96. package/.claude/get-shit-done/references/planning-config.md +196 -0
  97. package/.claude/get-shit-done/references/questioning.md +145 -0
  98. package/.claude/get-shit-done/references/tdd.md +263 -0
  99. package/.claude/get-shit-done/references/ui-brand.md +160 -0
  100. package/.claude/get-shit-done/references/verification-patterns.md +612 -0
  101. package/.claude/get-shit-done/templates/DEBUG.md +164 -0
  102. package/.claude/get-shit-done/templates/UAT.md +247 -0
  103. package/.claude/get-shit-done/templates/VALIDATION.md +76 -0
  104. package/.claude/get-shit-done/templates/codebase/architecture.md +255 -0
  105. package/.claude/get-shit-done/templates/codebase/concerns.md +310 -0
  106. package/.claude/get-shit-done/templates/codebase/conventions.md +307 -0
  107. package/.claude/get-shit-done/templates/codebase/integrations.md +280 -0
  108. package/.claude/get-shit-done/templates/codebase/stack.md +186 -0
  109. package/.claude/get-shit-done/templates/codebase/structure.md +285 -0
  110. package/.claude/get-shit-done/templates/codebase/testing.md +480 -0
  111. package/.claude/get-shit-done/templates/config.json +37 -0
  112. package/.claude/get-shit-done/templates/context.md +283 -0
  113. package/.claude/get-shit-done/templates/continue-here.md +78 -0
  114. package/.claude/get-shit-done/templates/debug-subagent-prompt.md +91 -0
  115. package/.claude/get-shit-done/templates/discovery.md +146 -0
  116. package/.claude/get-shit-done/templates/milestone-archive.md +123 -0
  117. package/.claude/get-shit-done/templates/milestone.md +115 -0
  118. package/.claude/get-shit-done/templates/phase-prompt.md +569 -0
  119. package/.claude/get-shit-done/templates/planner-subagent-prompt.md +117 -0
  120. package/.claude/get-shit-done/templates/project.md +184 -0
  121. package/.claude/get-shit-done/templates/requirements.md +231 -0
  122. package/.claude/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
  123. package/.claude/get-shit-done/templates/research-project/FEATURES.md +147 -0
  124. package/.claude/get-shit-done/templates/research-project/PITFALLS.md +200 -0
  125. package/.claude/get-shit-done/templates/research-project/STACK.md +120 -0
  126. package/.claude/get-shit-done/templates/research-project/SUMMARY.md +170 -0
  127. package/.claude/get-shit-done/templates/research.md +552 -0
  128. package/.claude/get-shit-done/templates/retrospective.md +54 -0
  129. package/.claude/get-shit-done/templates/roadmap.md +202 -0
  130. package/.claude/get-shit-done/templates/state.md +176 -0
  131. package/.claude/get-shit-done/templates/summary-complex.md +59 -0
  132. package/.claude/get-shit-done/templates/summary-minimal.md +41 -0
  133. package/.claude/get-shit-done/templates/summary-standard.md +48 -0
  134. package/.claude/get-shit-done/templates/summary.md +248 -0
  135. package/.claude/get-shit-done/templates/user-setup.md +311 -0
  136. package/.claude/get-shit-done/templates/verification-report.md +322 -0
  137. package/.claude/get-shit-done/workflows/add-phase.md +111 -0
  138. package/.claude/get-shit-done/workflows/add-tests.md +350 -0
  139. package/.claude/get-shit-done/workflows/add-todo.md +157 -0
  140. package/.claude/get-shit-done/workflows/audit-milestone.md +297 -0
  141. package/.claude/get-shit-done/workflows/check-todos.md +176 -0
  142. package/.claude/get-shit-done/workflows/cleanup.md +152 -0
  143. package/.claude/get-shit-done/workflows/complete-milestone.md +763 -0
  144. package/.claude/get-shit-done/workflows/diagnose-issues.md +219 -0
  145. package/.claude/get-shit-done/workflows/discovery-phase.md +289 -0
  146. package/.claude/get-shit-done/workflows/discuss-phase.md +542 -0
  147. package/.claude/get-shit-done/workflows/execute-phase.md +449 -0
  148. package/.claude/get-shit-done/workflows/execute-plan.md +448 -0
  149. package/.claude/get-shit-done/workflows/health.md +156 -0
  150. package/.claude/get-shit-done/workflows/help.md +489 -0
  151. package/.claude/get-shit-done/workflows/insert-phase.md +129 -0
  152. package/.claude/get-shit-done/workflows/list-phase-assumptions.md +178 -0
  153. package/.claude/get-shit-done/workflows/map-codebase.md +315 -0
  154. package/.claude/get-shit-done/workflows/new-milestone.md +382 -0
  155. package/.claude/get-shit-done/workflows/new-project.md +1116 -0
  156. package/.claude/get-shit-done/workflows/pause-work.md +122 -0
  157. package/.claude/get-shit-done/workflows/plan-milestone-gaps.md +274 -0
  158. package/.claude/get-shit-done/workflows/plan-phase.md +569 -0
  159. package/.claude/get-shit-done/workflows/progress.md +381 -0
  160. package/.claude/get-shit-done/workflows/quick.md +453 -0
  161. package/.claude/get-shit-done/workflows/remove-phase.md +154 -0
  162. package/.claude/get-shit-done/workflows/research-phase.md +73 -0
  163. package/.claude/get-shit-done/workflows/resume-project.md +306 -0
  164. package/.claude/get-shit-done/workflows/set-profile.md +80 -0
  165. package/.claude/get-shit-done/workflows/settings.md +213 -0
  166. package/.claude/get-shit-done/workflows/transition.md +544 -0
  167. package/.claude/get-shit-done/workflows/update.md +219 -0
  168. package/.claude/get-shit-done/workflows/verify-phase.md +242 -0
  169. package/.claude/get-shit-done/workflows/verify-work.md +569 -0
  170. package/.claude/gsd-file-manifest.json +144 -0
  171. package/.claude/hooks/agent_creation_trigger.py +168 -0
  172. package/.claude/hooks/agent_index_updater.py +255 -0
  173. package/.claude/hooks/agent_memory_persister.py +203 -0
  174. package/.claude/hooks/claude_md_agent_sync.py +162 -0
  175. package/.claude/hooks/claude_md_guard.py +154 -0
  176. package/.claude/hooks/continuous_save.py +414 -0
  177. package/.claude/hooks/creation_validator.py +360 -0
  178. package/.claude/hooks/enforce_dual_location.py +501 -0
  179. package/.claude/hooks/enforce_plan_mode.py +220 -0
  180. package/.claude/hooks/gsd-check-update.js +62 -0
  181. package/.claude/hooks/gsd-context-monitor.js +122 -0
  182. package/.claude/hooks/gsd-statusline.js +108 -0
  183. package/.claude/hooks/inbox_age_alert.py +367 -0
  184. package/.claude/hooks/ledger_updater.py +303 -0
  185. package/.claude/hooks/memory_hints_injector.py +251 -0
  186. package/.claude/hooks/memory_updater.py +202 -0
  187. package/.claude/hooks/notification_system.py +115 -0
  188. package/.claude/hooks/pending_tracker.py +188 -0
  189. package/.claude/hooks/pipeline_checkpoint.py +583 -0
  190. package/.claude/hooks/post_batch_cascading.py +1740 -0
  191. package/.claude/hooks/post_tool_use.py +120 -0
  192. package/.claude/hooks/quality_watchdog.py +394 -0
  193. package/.claude/hooks/ralph_wiggum.py +286 -0
  194. package/.claude/hooks/session-source-sync.py +223 -0
  195. package/.claude/hooks/session_autosave_v2.py +1135 -0
  196. package/.claude/hooks/session_end.py +203 -0
  197. package/.claude/hooks/session_start.py +939 -0
  198. package/.claude/hooks/skill_indexer.py +48 -0
  199. package/.claude/hooks/skill_router.py +358 -0
  200. package/.claude/hooks/stop_hook_completeness.py +187 -0
  201. package/.claude/hooks/user_prompt_submit.py +125 -0
  202. package/.claude/package.json +1 -0
  203. package/.claude/rules/ANTHROPIC-STANDARDS.md +384 -0
  204. package/.claude/rules/CLAUDE-LITE.md +201 -0
  205. package/.claude/rules/RULE-GROUP-1.md +320 -0
  206. package/.claude/rules/RULE-GROUP-2.md +307 -0
  207. package/.claude/rules/RULE-GROUP-3.md +248 -0
  208. package/.claude/rules/RULE-GROUP-4.md +427 -0
  209. package/.claude/rules/RULE-GROUP-5.md +388 -0
  210. package/.claude/rules/RULE-GROUP-6.md +387 -0
  211. package/.claude/rules/RULE-GSD-MANDATORY.md +106 -0
  212. package/.claude/rules/agent-cognition.md +779 -0
  213. package/.claude/rules/agent-integrity.md +692 -0
  214. package/.claude/rules/epistemic-standards.md +333 -0
  215. package/.claude/rules/logging.md +53 -0
  216. package/.claude/rules/mcp-governance.md +128 -0
  217. package/.claude/rules/pipeline.md +60 -0
  218. package/.claude/rules/state-management.md +93 -0
  219. package/.claude/scripts/apply-tags.py +77 -0
  220. package/.claude/scripts/batch-extract-transcriptions.py +132 -0
  221. package/.claude/scripts/build-complete-index.py +250 -0
  222. package/.claude/scripts/build-planilha-index.py +170 -0
  223. package/.claude/scripts/complete-tag-matching.py +250 -0
  224. package/.claude/scripts/deduplicate-inbox.py +139 -0
  225. package/.claude/scripts/docx-xml-extractor.py +141 -0
  226. package/.claude/scripts/extract-docx-text.py +58 -0
  227. package/.claude/scripts/extract-single-transcription.py +74 -0
  228. package/.claude/scripts/extract_docx_from_gdrive.py +77 -0
  229. package/.claude/scripts/jarvis_orchestrator.py +5 -0
  230. package/.claude/scripts/organized-downloader.py +246 -0
  231. package/.claude/scripts/planilha-tagger.py +187 -0
  232. package/.claude/scripts/revert-tags.py +70 -0
  233. package/.claude/scripts/source-sync.py +265 -0
  234. package/.claude/scripts/tag-inbox-files.py +276 -0
  235. package/.claude/scripts/tag-inbox-v2.py +253 -0
  236. package/.claude/scripts/test-extraction.py +35 -0
  237. package/.claude/scripts/test-full-extraction.py +74 -0
  238. package/.claude/scripts/validate_cascading_integrity.py +409 -0
  239. package/.claude/settings.json +215 -0
  240. package/.claude/skills/DETECTION-PROTOCOL.md +217 -0
  241. package/.claude/skills/README.md +240 -0
  242. package/.claude/skills/SKILL-REGISTRY.md +283 -0
  243. package/.claude/skills/SKILL-SUGGESTIONS.md +114 -0
  244. package/.claude/skills/_TEMPLATES/SKILL-WRITER-GUIDE.md +385 -0
  245. package/.claude/skills/agent-creation/SKILL.md +374 -0
  246. package/.claude/skills/ask-company/SKILL.md +198 -0
  247. package/.claude/skills/brainstorming/SKILL.md +72 -0
  248. package/.claude/skills/chronicler/SKILL.md +146 -0
  249. package/.claude/skills/chronicler/chronicler_core.py +468 -0
  250. package/.claude/skills/code-review/SKILL.md +160 -0
  251. package/.claude/skills/convert-to-company-docs/SKILL.md +68 -0
  252. package/.claude/skills/convert-to-company-docs/convert.py +532 -0
  253. package/.claude/skills/dispatching-parallel-agents/SKILL.md +193 -0
  254. package/.claude/skills/docs-megabrain/SKILL.md +251 -0
  255. package/.claude/skills/executing-plans/SKILL.md +114 -0
  256. package/.claude/skills/executor/SKILL.md +161 -0
  257. package/.claude/skills/fase-2-5-tagging/SKILL.md +182 -0
  258. package/.claude/skills/feature-dev/SKILL.md +154 -0
  259. package/.claude/skills/frontend-design/SKILL.md +165 -0
  260. package/.claude/skills/gdrive-transcription-downloader/SKILL.md +249 -0
  261. package/.claude/skills/gemini-fallback/SKILL.md +67 -0
  262. package/.claude/skills/gemini-fallback/gemini_fetch.py +0 -0
  263. package/.claude/skills/gha/SKILL.md +96 -0
  264. package/.claude/skills/gha/gha_diagnostic.py +227 -0
  265. package/.claude/skills/github-workflow/SKILL.md +190 -0
  266. package/.claude/skills/hookify/SKILL.md +134 -0
  267. package/.claude/skills/hybrid-source-reading/SKILL.md +265 -0
  268. package/.claude/skills/jarvis/SKILL.md +546 -0
  269. package/.claude/skills/jarvis-briefing/SKILL.md +340 -0
  270. package/.claude/skills/knowledge-extraction/SKILL.md +318 -0
  271. package/.claude/skills/ler-planilha/SKILL.md +281 -0
  272. package/.claude/skills/pipeline-jarvis/SKILL.md +430 -0
  273. package/.claude/skills/plugin-dev/SKILL.md +176 -0
  274. package/.claude/skills/pr-review-toolkit/SKILL.md +178 -0
  275. package/.claude/skills/process-company-inbox/SKILL.md +183 -0
  276. package/.claude/skills/python-megabrain/SKILL.md +323 -0
  277. package/.claude/skills/resume/SKILL.md +61 -0
  278. package/.claude/skills/save/SKILL.md +87 -0
  279. package/.claude/skills/skill-creator-internal/SKILL.md +186 -0
  280. package/.claude/skills/skill-writer/SKILL.md +153 -0
  281. package/.claude/skills/skill-writer/examples.md +191 -0
  282. package/.claude/skills/skill-writer/troubleshooting.md +205 -0
  283. package/.claude/skills/smart-download-tagger/SKILL.md +148 -0
  284. package/.claude/skills/source-sync/SKILL.md +240 -0
  285. package/.claude/skills/sync-docs/SKILL.md +193 -0
  286. package/.claude/skills/sync-docs/config.json +37 -0
  287. package/.claude/skills/sync-docs/gdrive_sync.py +358 -0
  288. package/.claude/skills/sync-docs/reauth.py +71 -0
  289. package/.claude/skills/using-superpowers/SKILL.md +105 -0
  290. package/.claude/skills/verification-before-completion/SKILL.md +130 -0
  291. package/.claude/skills/verify/SKILL.md +154 -0
  292. package/.claude/skills/verify/verify_runner.py +0 -0
  293. package/.claude/skills/verify-6-levels/SKILL.md +234 -0
  294. package/.claude/skills/writing-plans/SKILL.md +184 -0
  295. package/.claude/templates/BATCH-LOG-TEMPLATE.md +221 -0
  296. package/.claudeignore +9 -0
  297. package/.cursor/agents.yaml +44 -0
  298. package/.cursor/rules/mega-brain.md +39 -0
  299. package/.gitattributes +19 -0
  300. package/.github/CODEOWNERS +8 -0
  301. package/.github/ISSUE_TEMPLATE/agent.md +96 -0
  302. package/.github/ISSUE_TEMPLATE/bug.md +67 -0
  303. package/.github/ISSUE_TEMPLATE/feature.md +56 -0
  304. package/.github/ISSUE_TEMPLATE/pipeline.md +70 -0
  305. package/.github/PULL_REQUEST_TEMPLATE.md +30 -0
  306. package/.github/assets/banner.svg +152 -0
  307. package/.github/assets/logo-dark.svg +79 -0
  308. package/.github/assets/social-preview.png +0 -0
  309. package/.github/layer1-allowlist.txt +196 -0
  310. package/.github/layer2-manifest.txt +42 -0
  311. package/.github/layer3-manifest.txt +94 -0
  312. package/.github/workflows/claude-code-pr.yml +198 -0
  313. package/.github/workflows/claude-code-review.yml +57 -0
  314. package/.github/workflows/claude.yml +76 -0
  315. package/.github/workflows/publish-pro.yml +72 -0
  316. package/.github/workflows/publish.yml +86 -0
  317. package/.github/workflows/verification.yml +251 -0
  318. package/.gitignore +244 -0
  319. package/.gitleaks.toml +118 -0
  320. package/.windsurf/agents.yaml +44 -0
  321. package/.windsurf/rules/mega-brain.md +39 -0
  322. package/CONTRIBUTING.md +62 -0
  323. package/QUICK-START.md +231 -0
  324. package/README.md +168 -0
  325. package/agents/AGENT-INDEX.yaml +107 -0
  326. package/agents/MASTER-AGENT.md +612 -0
  327. package/agents/README.md +48 -0
  328. package/agents/_templates/INDEX.md +741 -0
  329. package/agents/_templates/TEMPLATE-AGENT-MD-ULTRA-ROBUSTO-V3.md +2399 -0
  330. package/agents/boardroom/CHECKLIST-MASTER.md +281 -0
  331. package/agents/boardroom/INTEGRATION-GUIDE.md +406 -0
  332. package/agents/boardroom/README.md +238 -0
  333. package/agents/boardroom/config/BOARDROOM-CONFIG.md +186 -0
  334. package/agents/boardroom/config/TTS-INTEGRATION.md +258 -0
  335. package/agents/boardroom/config/VOICE-PROFILES.md +624 -0
  336. package/agents/boardroom/scripts/audio_generator.py +375 -0
  337. package/agents/boardroom/scripts/audio_generator_edge.py +353 -0
  338. package/agents/boardroom/scripts/jarvis_boardroom_hook.py +415 -0
  339. package/agents/boardroom/scripts/notebooklm_generator.py +578 -0
  340. package/agents/boardroom/templates/EPISODE-TEMPLATE.md +367 -0
  341. package/agents/boardroom/templates/scene-templates/SCENE-AGENT-DEBATE.md +252 -0
  342. package/agents/boardroom/templates/scene-templates/SCENE-COUNCIL.md +270 -0
  343. package/agents/boardroom/templates/scene-templates/SCENE-DNA-CONSULTATION.md +126 -0
  344. package/agents/boardroom/templates/scene-templates/SCENE-QUESTION.md +174 -0
  345. package/agents/boardroom/workflows/WORKFLOW-AUDIO-GENERATION.md +421 -0
  346. package/agents/conclave/CRITIC.md +197 -0
  347. package/agents/conclave/DEVILS-ADVOCATE.md +274 -0
  348. package/agents/conclave/README.md +35 -0
  349. package/agents/conclave/SYNTHESIZER.md +293 -0
  350. package/agents/conclave/advogado-do-diabo/AGENT.md +502 -0
  351. package/agents/conclave/advogado-do-diabo/SOUL.md +100 -0
  352. package/agents/conclave/critico-metodologico/AGENT.md +683 -0
  353. package/agents/conclave/critico-metodologico/SOUL.md +107 -0
  354. package/agents/conclave/sintetizador/AGENT.md +571 -0
  355. package/agents/conclave/sintetizador/SOUL.md +94 -0
  356. package/agents/constitution/BASE-CONSTITUTION.md +254 -0
  357. package/agents/persona-registry.yaml +300 -0
  358. package/agents/sua-empresa/.gitkeep +0 -0
  359. package/agents/sua-empresa/README.md +44 -0
  360. package/agents/sua-empresa/_example/jds/EXAMPLE-JD.md +42 -0
  361. package/agents/sua-empresa/_example/org/EXAMPLE-ORG.md +32 -0
  362. package/agents/sua-empresa/_example/roles/EXAMPLE-ROLE.md +38 -0
  363. package/artifacts/README.md +11 -0
  364. package/artifacts/canonical/.gitkeep +0 -0
  365. package/artifacts/chunks/.gitkeep +0 -0
  366. package/artifacts/insights/.gitkeep +0 -0
  367. package/artifacts/narratives/.gitkeep +0 -0
  368. package/bin/cli.js +2 -0
  369. package/bin/lib/ascii-art.js +202 -0
  370. package/bin/lib/feature-gate.js +46 -0
  371. package/bin/lib/installer.js +593 -0
  372. package/bin/lib/license.js +59 -0
  373. package/bin/lib/pro-commands.js +75 -0
  374. package/bin/lib/setup-wizard.js +547 -0
  375. package/bin/lib/validate-email.js +113 -0
  376. package/bin/mega-brain.js +136 -0
  377. package/bin/pre-publish-gate.js +229 -0
  378. package/bin/push.js +1056 -0
  379. package/bin/templates/env.example +27 -0
  380. package/bin/utils/pro-detector.js +50 -0
  381. package/bin/validate-package.js +190 -0
  382. package/core/__init__.py +2 -0
  383. package/core/glossary/INDEX.md +63 -0
  384. package/core/glossary/digital.md +243 -0
  385. package/core/glossary/finance.md +49 -0
  386. package/core/glossary/marketing.md +69 -0
  387. package/core/glossary/operations.md +50 -0
  388. package/core/glossary/sales.md +690 -0
  389. package/core/intelligence/__init__.py +41 -0
  390. package/core/intelligence/agent_trigger.py +468 -0
  391. package/core/intelligence/audit_layers.py +491 -0
  392. package/core/intelligence/autonomous_processor.py +796 -0
  393. package/core/intelligence/bootstrap_registry.py +550 -0
  394. package/core/intelligence/business_model_detector.py +476 -0
  395. package/core/intelligence/dossier_trigger.py +336 -0
  396. package/core/intelligence/entity_normalizer.py +565 -0
  397. package/core/intelligence/org_chain_detector.py +411 -0
  398. package/core/intelligence/review_dashboard.py +338 -0
  399. package/core/intelligence/role_detector.py +855 -0
  400. package/core/intelligence/session_autosave.py +46 -0
  401. package/core/intelligence/skill_generator.py +601 -0
  402. package/core/intelligence/sow_generator.py +711 -0
  403. package/core/intelligence/sync_package_files.py +504 -0
  404. package/core/intelligence/task_orchestrator.py +780 -0
  405. package/core/intelligence/theme_analyzer.py +562 -0
  406. package/core/intelligence/tool_discovery.py +432 -0
  407. package/core/intelligence/validate_json_integrity.py +106 -0
  408. package/core/intelligence/validate_layers.py +310 -0
  409. package/core/intelligence/verify_classifications.py +94 -0
  410. package/core/intelligence/viability_scorer.py +592 -0
  411. package/core/jarvis/02-JARVIS-SOUL.md +390 -0
  412. package/core/jarvis/03-JARVIS-DNA.yaml +312 -0
  413. package/core/jarvis/AGENT.md +191 -0
  414. package/core/jarvis/agent-creator/AGENT.md +199 -0
  415. package/core/jarvis/agent-creator/SOUL.md +82 -0
  416. package/core/jarvis/agent-creator/tasks/create-agent.md +133 -0
  417. package/core/jarvis/agent-creator/tasks/sync-agents.md +100 -0
  418. package/core/jarvis/agent-creator/workflows/wf-create-agent.yaml +110 -0
  419. package/core/jarvis/agent-creator/workflows/wf-pipeline-trigger.yaml +111 -0
  420. package/core/jarvis/autonomous/benchmark/AGENT.md +347 -0
  421. package/core/jarvis/autonomous/benchmark/SOUL.md +78 -0
  422. package/core/jarvis/autonomous/critic/AGENT.md +324 -0
  423. package/core/jarvis/autonomous/critic/SOUL.md +78 -0
  424. package/core/jarvis/autonomous/evolver/AGENT.md +294 -0
  425. package/core/jarvis/autonomous/evolver/SOUL.md +85 -0
  426. package/core/jarvis/autonomous/playbook-generator/AGENT.md +399 -0
  427. package/core/jarvis/autonomous/playbook-generator/SOUL.md +80 -0
  428. package/core/patterns/_ROLE_PATTERNS.yaml +547 -0
  429. package/core/patterns/quality_gates.yaml +259 -0
  430. package/core/patterns/trigger_config.yaml +193 -0
  431. package/core/schemas/SCHEMA-INDEX.md +94 -0
  432. package/core/schemas/canonical-map.schema.json +98 -0
  433. package/core/schemas/chunks-state.schema.json +131 -0
  434. package/core/schemas/decisions-registry.schema.json +120 -0
  435. package/core/schemas/file-registry.schema.json +69 -0
  436. package/core/schemas/insights-state.schema.json +111 -0
  437. package/core/schemas/narratives-state.schema.json +150 -0
  438. package/core/tasks/CHANGELOG.md +55 -0
  439. package/core/tasks/TASK-REGISTRY.md +113 -0
  440. package/core/tasks/_templates/task-tmpl.md +105 -0
  441. package/core/tasks/analyze-themes.md +84 -0
  442. package/core/tasks/detect-role.md +82 -0
  443. package/core/tasks/extract-dna.md +114 -0
  444. package/core/tasks/normalize-entities.md +82 -0
  445. package/core/tasks/process-batch.md +111 -0
  446. package/core/tasks/validate-cascade.md +105 -0
  447. package/core/templates/README.md +27 -0
  448. package/core/templates/agents/dna-config-template.yaml +181 -0
  449. package/core/templates/agents/enrichment-protocol.md +408 -0
  450. package/core/templates/agents/memory-template.md +567 -0
  451. package/core/templates/agents/reasoning-model.md +331 -0
  452. package/core/templates/agents/soul-template.md +416 -0
  453. package/core/templates/agents/template-evolution.md +544 -0
  454. package/core/templates/debates/CONCLAVE-LOG-TEMPLATE-v2.md +309 -0
  455. package/core/templates/debates/conclave-log-template.md +309 -0
  456. package/core/templates/debates/conclave-protocol.md +518 -0
  457. package/core/templates/debates/debate-dynamics-config.yaml +322 -0
  458. package/core/templates/debates/debate-dynamics.md +613 -0
  459. package/core/templates/debates/debate-protocol.md +323 -0
  460. package/core/templates/logs/LOG-TEMPLATES.md +1068 -0
  461. package/core/templates/logs/batch-visual-template.md +841 -0
  462. package/core/templates/logs/log-structure.md +65 -0
  463. package/core/templates/logs/visual-diff.md +159 -0
  464. package/core/templates/phases/dossier-compilation.md +790 -0
  465. package/core/templates/phases/narrative-metabolism.md +292 -0
  466. package/core/templates/phases/narrative-synthesis.md +278 -0
  467. package/core/templates/phases/phase4-checkpoint.md +146 -0
  468. package/core/templates/phases/prompt-1.1-chunking.md +154 -0
  469. package/core/templates/phases/prompt-1.2-entity-resolution.md +186 -0
  470. package/core/templates/phases/prompt-2.1-dna-tags.md +208 -0
  471. package/core/templates/phases/prompt-2.1-insight-extraction.md +191 -0
  472. package/core/templates/phases/prompt-3.1-narrative.md +331 -0
  473. package/core/templates/phases/sources-compilation.md +340 -0
  474. package/core/workflows/PIPELINE-JARVIS-DOCS.md +606 -0
  475. package/core/workflows/wf-conclave.yaml +139 -0
  476. package/core/workflows/wf-extract-dna.yaml +158 -0
  477. package/core/workflows/wf-ingest.yaml +88 -0
  478. package/core/workflows/wf-pipeline-full.yaml +138 -0
  479. package/docs/API-KEYS-GUIDE.md +372 -0
  480. package/docs/INTEGRATION-POINTS.md +501 -0
  481. package/docs/LAYERS.md +403 -0
  482. package/docs/PLAN-MODE-PROTOCOL.md +388 -0
  483. package/docs/RESTORE-AND-INDEX.md +203 -0
  484. package/docs/TAG-RESOLVER-IMPLEMENTATION.md +597 -0
  485. package/docs/conselho.md +337 -0
  486. package/docs/context7-readme.md +28 -0
  487. package/docs/jarvis-logging-protocol.md +380 -0
  488. package/docs/pipeline-completa-v4.md +1315 -0
  489. package/docs/prompts/meta_agente_mapeamento_processos.md +297 -0
  490. package/docs/quick-start.md +197 -0
  491. package/docs/readme-ralph-cascateamento.md +207 -0
  492. package/docs/template-master.md +727 -0
  493. package/docs/templates/phase5/IMPLEMENTATION-GUIDE.md +355 -0
  494. package/docs/templates/phase5/MOGA-BRAIN-PHASE5-TEMPLATES.md +1284 -0
  495. package/docs/templates/phase5/README.md +165 -0
  496. package/docs/workflow-continuous-claude.md +2232 -0
  497. package/inbox/.gitkeep +0 -0
  498. package/inbox/README.md +15 -0
  499. package/knowledge/NAVIGATION-MAP.json +292 -0
  500. package/knowledge/README.md +11 -0
  501. package/knowledge/dna/.gitkeep +0 -0
  502. package/knowledge/dossiers/persons/.gitkeep +0 -0
  503. package/knowledge/dossiers/system/.gitkeep +0 -0
  504. package/knowledge/dossiers/themes/.gitkeep +0 -0
  505. package/knowledge/playbooks/.gitkeep +0 -0
  506. package/knowledge/sources/.gitkeep +0 -0
  507. package/logs/.gitkeep +0 -0
  508. package/logs/README.md +11 -0
  509. package/package.json +180 -0
  510. package/requirements.txt +4 -0
@@ -0,0 +1,367 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ INBOX AGE ALERT HOOK - REGRA #7 ENFORCEMENT
4
+ ============================================
5
+
6
+ Alerta sobre arquivos antigos no INBOX no inicio de cada sessao.
7
+
8
+ REGRA #7: INBOX E TEMPORARIO
9
+ - NAO PODE deixar arquivos no INBOX indefinidamente
10
+ - NAO PODE mover para INBOX sem plano de organizacao
11
+ - DEVE organizar cada arquivo que entra no INBOX
12
+
13
+ Este hook:
14
+ 1. Executa no inicio de cada sessao (session_start hook)
15
+ 2. Verifica arquivos no INBOX com mais de 3 dias
16
+ 3. Se encontrar, gera alerta formatado para o JARVIS exibir
17
+ 4. Loga em /logs/inbox_alerts.jsonl
18
+
19
+ Autor: JARVIS Autonomous System
20
+ Data: 2026-01-11
21
+ """
22
+
23
+ import os
24
+ import json
25
+ import sys
26
+ from pathlib import Path
27
+ from datetime import datetime, timedelta
28
+ from typing import List, Dict, Optional
29
+
30
+ #==================================
31
+ # CONFIGURACAO
32
+ #==================================
33
+
34
+ PROJECT_ROOT = Path(os.environ.get('CLAUDE_PROJECT_DIR', '.'))
35
+ INBOX_PATH = PROJECT_ROOT / "inbox"
36
+ MAX_AGE_DAYS = 3
37
+ ALERT_LOG = PROJECT_ROOT / "logs" / "inbox_alerts.jsonl"
38
+
39
+ # Extensoes de arquivos para monitorar
40
+ MONITORED_EXTENSIONS = {".txt", ".md", ".docx", ".pdf", ".json", ".yaml", ".yml"}
41
+
42
+ # Pastas/prefixos a ignorar
43
+ IGNORE_PREFIXES = {"_", ".", "__"}
44
+ IGNORE_FOLDERS = {"_BACKUP", "_OLD", "_ARCHIVE", "__pycache__"}
45
+
46
+
47
+ #==================================
48
+ # FUNCOES PRINCIPAIS
49
+ #==================================
50
+
51
+
52
+ def get_old_files(max_age_days: int = MAX_AGE_DAYS) -> List[Dict]:
53
+ """
54
+ Retorna lista de arquivos mais velhos que max_age_days.
55
+
56
+ Args:
57
+ max_age_days: Numero maximo de dias que um arquivo pode ficar no INBOX
58
+
59
+ Returns:
60
+ Lista de dicts com informacoes dos arquivos antigos
61
+ """
62
+ old_files = []
63
+ cutoff = datetime.now() - timedelta(days=max_age_days)
64
+
65
+ if not INBOX_PATH.exists():
66
+ return []
67
+
68
+ for root, dirs, files in os.walk(INBOX_PATH):
69
+ # Ignorar pastas de backup e ocultas
70
+ dirs[:] = [
71
+ d
72
+ for d in dirs
73
+ if not any(d.startswith(p) for p in IGNORE_PREFIXES)
74
+ and d not in IGNORE_FOLDERS
75
+ ]
76
+
77
+ for f in files:
78
+ # Ignorar arquivos ocultos
79
+ if any(f.startswith(p) for p in IGNORE_PREFIXES):
80
+ continue
81
+
82
+ # Verificar extensao
83
+ ext = Path(f).suffix.lower()
84
+ if ext not in MONITORED_EXTENSIONS:
85
+ continue
86
+
87
+ try:
88
+ fpath = Path(root) / f
89
+ mtime = datetime.fromtimestamp(fpath.stat().st_mtime)
90
+
91
+ if mtime < cutoff:
92
+ # Calcular caminho relativo ao INBOX
93
+ rel_path = fpath.relative_to(INBOX_PATH)
94
+ folder = rel_path.parent if rel_path.parent != Path(".") else "ROOT"
95
+
96
+ old_files.append(
97
+ {
98
+ "path": str(fpath),
99
+ "relative_path": str(rel_path),
100
+ "name": f,
101
+ "age_days": (datetime.now() - mtime).days,
102
+ "folder": str(folder),
103
+ "size_kb": round(fpath.stat().st_size / 1024, 2),
104
+ "modified_at": mtime.isoformat(),
105
+ }
106
+ )
107
+ except (OSError, PermissionError) as e:
108
+ # Ignorar arquivos inacessiveis
109
+ continue
110
+
111
+ return sorted(old_files, key=lambda x: x["age_days"], reverse=True)
112
+
113
+
114
+ def count_by_folder(old_files: List[Dict]) -> Dict[str, int]:
115
+ """Agrupa arquivos antigos por pasta."""
116
+ folder_counts = {}
117
+ for f in old_files:
118
+ folder = f["folder"]
119
+ folder_counts[folder] = folder_counts.get(folder, 0) + 1
120
+ return dict(sorted(folder_counts.items(), key=lambda x: x[1], reverse=True))
121
+
122
+
123
+ def generate_alert(old_files: List[Dict]) -> str:
124
+ """
125
+ Gera mensagem de alerta formatada no estilo JARVIS.
126
+
127
+ Args:
128
+ old_files: Lista de arquivos antigos
129
+
130
+ Returns:
131
+ String formatada com o alerta
132
+ """
133
+ if not old_files:
134
+ return ""
135
+
136
+ folder_counts = count_by_folder(old_files)
137
+ total_size = sum(f["size_kb"] for f in old_files)
138
+
139
+ # Construir alerta visual
140
+ alert = f"""
141
+ +==============================================================================+
142
+ | REGRA #7 ALERTA - INBOX TEMPORARIO |
143
+ +==============================================================================+
144
+
145
+ ATENCAO, senhor. {len(old_files)} arquivo(s) no INBOX com mais de {MAX_AGE_DAYS} dias.
146
+
147
+ +------------------------------------------------------------------------------+
148
+ | METRICAS |
149
+ +------------------------------------------------------------------------------+
150
+ | Total de arquivos antigos: {len(old_files):>4} |
151
+ | Tamanho total: {total_size:>8.1f} KB |
152
+ | Arquivo mais antigo: {old_files[0]["age_days"]:>4} dias |
153
+ +------------------------------------------------------------------------------+
154
+
155
+ +------------------------------------------------------------------------------+
156
+ | POR PASTA |
157
+ +------------------------------------------------------------------------------+
158
+ """
159
+
160
+ for folder, count in list(folder_counts.items())[:8]:
161
+ folder_display = folder[:40] if len(folder) <= 40 else folder[:37] + "..."
162
+ alert += f"| {folder_display:<42} {count:>3} arquivo(s) |\n"
163
+
164
+ if len(folder_counts) > 8:
165
+ alert += f"| ... e mais {len(folder_counts) - 8} pastas |\n"
166
+
167
+ alert += """+------------------------------------------------------------------------------+
168
+
169
+ +------------------------------------------------------------------------------+
170
+ | ARQUIVOS MAIS ANTIGOS |
171
+ +------------------------------------------------------------------------------+
172
+ """
173
+
174
+ for f in old_files[:10]:
175
+ name_display = (
176
+ f["name"][:50] if len(f["name"]) <= 50 else f["name"][:47] + "..."
177
+ )
178
+ alert += f"| [{f['age_days']:>3}d] {name_display:<50} |\n"
179
+
180
+ if len(old_files) > 10:
181
+ alert += f"| ... e mais {len(old_files) - 10} arquivos |\n"
182
+
183
+ alert += """+------------------------------------------------------------------------------+
184
+
185
+ +------------------------------------------------------------------------------+
186
+ | ACAO RECOMENDADA |
187
+ +------------------------------------------------------------------------------+
188
+ | Executar: python3 SCRIPTS/organize_inbox_to_knowledge.py --execute |
189
+ | Ou: /inbox para ver lista completa |
190
+ +------------------------------------------------------------------------------+
191
+
192
+ REGRA #7: INBOX E TEMPORARIO - Organizar, nao acumular.
193
+ """
194
+
195
+ return alert
196
+
197
+
198
+ def generate_summary(old_files: List[Dict]) -> str:
199
+ """Gera resumo curto para o contexto do JARVIS."""
200
+ if not old_files:
201
+ return ""
202
+
203
+ return f"REGRA #7: {len(old_files)} arquivo(s) antigos no INBOX (>{MAX_AGE_DAYS} dias). Mais antigo: {old_files[0]['age_days']} dias."
204
+
205
+
206
+ def log_alert(old_files: List[Dict]) -> bool:
207
+ """
208
+ Loga alerta em jsonl para historico.
209
+
210
+ Args:
211
+ old_files: Lista de arquivos antigos
212
+
213
+ Returns:
214
+ True se logou com sucesso
215
+ """
216
+ try:
217
+ # Garantir que diretorio existe
218
+ ALERT_LOG.parent.mkdir(parents=True, exist_ok=True)
219
+
220
+ log_entry = {
221
+ "timestamp": datetime.now().isoformat(),
222
+ "alert_type": "inbox_age",
223
+ "rule": "REGRA_7",
224
+ "total_files": len(old_files),
225
+ "max_age_days_threshold": MAX_AGE_DAYS,
226
+ "oldest_file_days": old_files[0]["age_days"] if old_files else 0,
227
+ "folders_affected": count_by_folder(old_files),
228
+ "files": old_files[:20], # Limitar a 20 arquivos no log
229
+ "action_suggested": "python3 SCRIPTS/organize_inbox_to_knowledge.py --execute",
230
+ }
231
+
232
+ with open(ALERT_LOG, "a", encoding="utf-8") as f:
233
+ f.write(json.dumps(log_entry, ensure_ascii=False) + "\n")
234
+
235
+ return True
236
+
237
+ except Exception as e:
238
+ # Nao bloquear execucao por falha de log
239
+ sys.stderr.write(f"[INBOX_ALERT] Erro ao logar: {e}\n")
240
+ return False
241
+
242
+
243
+ def check_inbox_health() -> Dict:
244
+ """
245
+ Verifica saude geral do INBOX.
246
+
247
+ Returns:
248
+ Dict com metricas de saude
249
+ """
250
+ if not INBOX_PATH.exists():
251
+ return {"status": "error", "message": "INBOX path not found"}
252
+
253
+ total_files = 0
254
+ total_size = 0
255
+
256
+ for root, dirs, files in os.walk(INBOX_PATH):
257
+ # Ignorar pastas de backup
258
+ dirs[:] = [
259
+ d
260
+ for d in dirs
261
+ if not any(d.startswith(p) for p in IGNORE_PREFIXES)
262
+ and d not in IGNORE_FOLDERS
263
+ ]
264
+
265
+ for f in files:
266
+ if any(f.startswith(p) for p in IGNORE_PREFIXES):
267
+ continue
268
+ try:
269
+ fpath = Path(root) / f
270
+ total_files += 1
271
+ total_size += fpath.stat().st_size
272
+ except:
273
+ continue
274
+
275
+ old_files = get_old_files()
276
+
277
+ # Determinar status
278
+ if len(old_files) == 0:
279
+ status = "healthy"
280
+ elif len(old_files) < 10:
281
+ status = "warning"
282
+ else:
283
+ status = "critical"
284
+
285
+ return {
286
+ "status": status,
287
+ "total_files": total_files,
288
+ "total_size_mb": round(total_size / (1024 * 1024), 2),
289
+ "old_files_count": len(old_files),
290
+ "oldest_file_days": old_files[0]["age_days"] if old_files else 0,
291
+ "threshold_days": MAX_AGE_DAYS,
292
+ }
293
+
294
+
295
+ #==================================
296
+ # INTEGRACAO COM SESSION_START
297
+ #==================================
298
+
299
+
300
+ def get_session_context(old_files: List[Dict]) -> Dict:
301
+ """
302
+ Retorna contexto para integracao com session_start.
303
+
304
+ Args:
305
+ old_files: Lista de arquivos antigos
306
+
307
+ Returns:
308
+ Dict com contexto para o JARVIS
309
+ """
310
+ if not old_files:
311
+ return {"has_alert": False, "summary": "", "alert": ""}
312
+
313
+ return {
314
+ "has_alert": True,
315
+ "summary": generate_summary(old_files),
316
+ "alert": generate_alert(old_files),
317
+ "file_count": len(old_files),
318
+ "oldest_days": old_files[0]["age_days"],
319
+ "health": check_inbox_health(),
320
+ }
321
+
322
+
323
+ #==================================
324
+ # MAIN
325
+ #==================================
326
+
327
+
328
+ def main():
329
+ """
330
+ Hook entry point for Claude Code SessionStart event.
331
+ Reads JSON from stdin, outputs JSON to stdout.
332
+ """
333
+ try:
334
+ input_data = sys.stdin.read()
335
+ hook_input = json.loads(input_data) if input_data else {}
336
+
337
+ old_files = get_old_files()
338
+
339
+ if old_files:
340
+ log_alert(old_files)
341
+ summary = generate_summary(old_files)
342
+ print(json.dumps({'continue': True, 'feedback': summary}))
343
+ else:
344
+ print(json.dumps({'continue': True}))
345
+
346
+ except Exception:
347
+ print(json.dumps({'continue': True}))
348
+
349
+
350
+ def cli_test():
351
+ """CLI test mode - run directly for debugging."""
352
+ old_files = get_old_files()
353
+ if old_files:
354
+ alert = generate_alert(old_files)
355
+ print(alert)
356
+ else:
357
+ print("[INBOX_ALERT] No old files found. INBOX is clean.")
358
+
359
+ health = check_inbox_health()
360
+ print(f"\nHealth: {json.dumps(health, indent=2)}")
361
+
362
+
363
+ if __name__ == "__main__":
364
+ if len(sys.argv) > 1 and sys.argv[1] == '--test':
365
+ cli_test()
366
+ else:
367
+ main()
@@ -0,0 +1,303 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ LEDGER UPDATER HOOK
4
+ ===================
5
+ Atualiza o LEDGER.md automaticamente em pontos chave.
6
+
7
+ Baseado no Continuous Claude: Context persistence via ledgers
8
+
9
+ Triggers:
10
+ - SessionEnd: Salva estado final
11
+ - Após completar tarefa significativa
12
+ - Antes de parar
13
+
14
+ Usage:
15
+ python3 ledger_updater.py [action] [details]
16
+
17
+ Actions:
18
+ - complete_task: Marca tarefa como completada
19
+ - add_blocker: Adiciona bloqueio
20
+ - set_next_action: Define próxima ação
21
+ - update_status: Atualiza status geral
22
+ - session_end: Finaliza sessão
23
+ """
24
+
25
+ import sys
26
+ import os
27
+ import json
28
+ import re
29
+ from pathlib import Path
30
+ from datetime import datetime
31
+
32
+ # Fix Windows cp1252 encoding
33
+ if sys.platform == 'win32':
34
+ sys.stdout.reconfigure(encoding='utf-8', errors='replace')
35
+ sys.stderr.reconfigure(encoding='utf-8', errors='replace')
36
+
37
+ PROJECT_ROOT = Path(os.environ.get('CLAUDE_PROJECT_DIR', '.'))
38
+ LEDGER_PATH = PROJECT_ROOT / ".claude" / "LEDGER.md"
39
+ MISSION_STATE_PATH = (
40
+ PROJECT_ROOT / ".claude" / "mission-control" / "MISSION-STATE.json"
41
+ )
42
+ INBOX_PATH = PROJECT_ROOT / "inbox"
43
+
44
+
45
+ def count_inbox_files() -> int:
46
+ """Count files in INBOX"""
47
+ if not INBOX_PATH.exists():
48
+ return 0
49
+
50
+ count = 0
51
+ exclude = ["_DUPLICATAS", "_BACKUP", ".DS_Store", "_INDEX"]
52
+
53
+ for item in INBOX_PATH.rglob("*"):
54
+ if item.is_file() and not any(e in str(item) for e in exclude):
55
+ if item.suffix.lower() in [".txt", ".md", ".docx", ".pdf"]:
56
+ count += 1
57
+ return count
58
+
59
+
60
+ def get_mission_state() -> dict:
61
+ """Get current mission state"""
62
+ if not MISSION_STATE_PATH.exists():
63
+ return {}
64
+ try:
65
+ with open(MISSION_STATE_PATH, "r", encoding="utf-8") as f:
66
+ return json.load(f)
67
+ except:
68
+ return {}
69
+
70
+
71
+ def read_ledger() -> str:
72
+ """Read current ledger content"""
73
+ if not LEDGER_PATH.exists():
74
+ return ""
75
+ return LEDGER_PATH.read_text(encoding="utf-8")
76
+
77
+
78
+ def write_ledger(content: str):
79
+ """Write ledger content"""
80
+ LEDGER_PATH.write_text(content, encoding="utf-8")
81
+
82
+
83
+ def update_timestamp(content: str) -> str:
84
+ """Update the timestamp in ledger"""
85
+ now = datetime.now().isoformat()
86
+
87
+ # Update timestamp line
88
+ pattern = r"\*\*Timestamp:\*\* .+"
89
+ replacement = f"**Timestamp:** {now}"
90
+ content = re.sub(pattern, replacement, content)
91
+
92
+ return content
93
+
94
+
95
+ def update_inbox_status(content: str) -> str:
96
+ """Update INBOX status in ledger"""
97
+ inbox_count = count_inbox_files()
98
+ now = datetime.now().strftime("%Y-%m-%d %H:%M")
99
+
100
+ # Find and update INBOX table
101
+ # Pattern for "Arquivos pendentes" row
102
+ pattern = r"\| \*\*Arquivos pendentes\*\* \| .+ \|"
103
+ replacement = f"| **Arquivos pendentes** | {inbox_count} |"
104
+ content = re.sub(pattern, replacement, content)
105
+
106
+ # Update last scan
107
+ pattern = r"\| \*\*Última varredura\*\* \| .+ \|"
108
+ replacement = f"| **Última varredura** | {now} |"
109
+ content = re.sub(pattern, replacement, content)
110
+
111
+ return content
112
+
113
+
114
+ def update_mission_status(content: str) -> str:
115
+ """Update mission status from MISSION-STATE.json"""
116
+ state = get_mission_state()
117
+
118
+ if not state:
119
+ return content
120
+
121
+ current = state.get("current_state", {})
122
+
123
+ # Update mission ID
124
+ mission_id = current.get("mission_id", state.get("mission_id", "-"))
125
+ pattern = r"\| \*\*ID\*\* \| .+ \|"
126
+ replacement = f"| **ID** | {mission_id} |"
127
+ content = re.sub(pattern, replacement, content)
128
+
129
+ # Update phase
130
+ phase = current.get("phase", "-")
131
+ phase_name = current.get("phase_name", "")
132
+ pattern = r"\| \*\*Fase\*\* \| .+ \|"
133
+ replacement = f"| **Fase** | {phase} ({phase_name}) |"
134
+ content = re.sub(pattern, replacement, content)
135
+
136
+ # Update status
137
+ status = current.get("status", "-")
138
+ pattern = r"\| \*\*Status\*\* \| .+ \|"
139
+ replacement = f"| **Status** | {status} |"
140
+ content = re.sub(pattern, replacement, content)
141
+
142
+ # Update batch info if available
143
+ batch_current = current.get("batch_current", "-")
144
+ batch_total = current.get("batch_total", "-")
145
+ percent = current.get("percent_complete", "-")
146
+
147
+ pattern = r"\| \*\*Batch atual\*\* \| .+ \|"
148
+ content = re.sub(pattern, f"| **Batch atual** | {batch_current} |", content)
149
+
150
+ pattern = r"\| \*\*Batch total\*\* \| .+ \|"
151
+ content = re.sub(pattern, f"| **Batch total** | {batch_total} |", content)
152
+
153
+ pattern = r"\| \*\*Progresso\*\* \| .+ \|"
154
+ content = re.sub(pattern, f"| **Progresso** | {percent}% |", content)
155
+
156
+ return content
157
+
158
+
159
+ def add_completed_task(content: str, task: str) -> str:
160
+ """Add a completed task to the ledger"""
161
+ now = datetime.now().strftime("%H:%M")
162
+ task_line = f"- [x] [{now}] {task}"
163
+
164
+ # Find the completed tasks section and add
165
+ marker = "## ✅ Tarefas Completadas"
166
+ if marker in content:
167
+ # Find the next section
168
+ parts = content.split(marker)
169
+ if len(parts) >= 2:
170
+ # Find where to insert (after the header)
171
+ section = parts[1]
172
+ lines = section.split("\n")
173
+
174
+ # Find first empty checkbox or "Nenhuma tarefa"
175
+ insert_idx = None
176
+ for i, line in enumerate(lines):
177
+ if "(Nenhuma tarefa" in line:
178
+ lines[i] = task_line
179
+ insert_idx = -1 # Signal we replaced
180
+ break
181
+ elif line.strip().startswith("- ["):
182
+ insert_idx = i + 1
183
+
184
+ if insert_idx is None:
185
+ # Add after section header
186
+ for i, line in enumerate(lines):
187
+ if line.strip() == "" and i > 0:
188
+ lines.insert(i, task_line)
189
+ break
190
+ elif insert_idx > 0:
191
+ lines.insert(insert_idx, task_line)
192
+
193
+ parts[1] = "\n".join(lines)
194
+ content = marker.join(parts)
195
+
196
+ return content
197
+
198
+
199
+ def add_blocker(content: str, blocker: str) -> str:
200
+ """Add a blocker to the ledger"""
201
+ now = datetime.now().strftime("%H:%M")
202
+ blocker_line = f"- [{now}] {blocker}"
203
+
204
+ marker = "## ⚠️ Bloqueios Encontrados"
205
+ if marker in content:
206
+ # Remove "(Nenhum bloqueio registrado)" if present
207
+ content = content.replace("- (Nenhum bloqueio registrado)", blocker_line)
208
+
209
+ return content
210
+
211
+
212
+ def set_next_action(content: str, action: str, priority: str = "Alta") -> str:
213
+ """Set the next action"""
214
+ pattern = r"AÇÃO: .+"
215
+ replacement = f"AÇÃO: {action}"
216
+ content = re.sub(pattern, replacement, content)
217
+
218
+ pattern = r"PRIORIDADE: .+"
219
+ replacement = f"PRIORIDADE: {priority}"
220
+ content = re.sub(pattern, replacement, content)
221
+
222
+ return content
223
+
224
+
225
+ def add_iteration(content: str, duration: str, tasks: str, status: str) -> str:
226
+ """Add iteration to history"""
227
+ now = datetime.now().strftime("%Y-%m-%d")
228
+
229
+ # Find the history table
230
+ marker = "## 📊 Histórico de Iterações"
231
+ if marker in content:
232
+ parts = content.split(marker)
233
+ if len(parts) >= 2:
234
+ # Find last row number
235
+ matches = re.findall(r"\| (\d+) \|", parts[1])
236
+ last_num = int(matches[-1]) if matches else 0
237
+ new_num = last_num + 1
238
+
239
+ # Add new row before the closing
240
+ new_row = f"| {new_num} | {now} | {duration} | {tasks} | {status} |"
241
+
242
+ # Find where to insert
243
+ lines = parts[1].split("\n")
244
+ for i, line in enumerate(lines):
245
+ if line.strip().startswith("---") and i > 5:
246
+ lines.insert(i, new_row)
247
+ break
248
+
249
+ parts[1] = "\n".join(lines)
250
+ content = marker.join(parts)
251
+
252
+ return content
253
+
254
+
255
+ def output_json(feedback: str):
256
+ """Output valid JSON for Claude Code hooks."""
257
+ print(json.dumps({"continue": True, "feedback": feedback}))
258
+
259
+
260
+ def main():
261
+ try:
262
+ if len(sys.argv) < 2:
263
+ action = "update_status"
264
+ else:
265
+ action = sys.argv[1]
266
+
267
+ details = sys.argv[2] if len(sys.argv) > 2 else ""
268
+
269
+ content = read_ledger()
270
+
271
+ if not content:
272
+ output_json("Ledger not found - skipping update")
273
+ sys.exit(0)
274
+
275
+ content = update_timestamp(content)
276
+ content = update_inbox_status(content)
277
+ content = update_mission_status(content)
278
+
279
+ feedback = ""
280
+ if action == "complete_task" and details:
281
+ content = add_completed_task(content, details)
282
+ feedback = f"Task marked complete: {details}"
283
+ elif action == "add_blocker" and details:
284
+ content = add_blocker(content, details)
285
+ feedback = f"Blocker added: {details}"
286
+ elif action == "set_next_action" and details:
287
+ content = set_next_action(content, details)
288
+ feedback = f"Next action set: {details}"
289
+ elif action == "session_end":
290
+ content = add_iteration(content, "-", "Session ended", "✅")
291
+ feedback = "Session recorded in ledger"
292
+
293
+ write_ledger(content)
294
+ output_json(feedback if feedback else "Ledger updated")
295
+
296
+ except Exception as e:
297
+ output_json(f"Ledger error: {e}")
298
+
299
+ sys.exit(0)
300
+
301
+
302
+ if __name__ == "__main__":
303
+ main()