mednotes-opencode 0.1.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 (430) hide show
  1. package/.opencode/agents/med-chat-triager.md +204 -0
  2. package/.opencode/agents/med-flashcard-maker.md +63 -0
  3. package/.opencode/agents/med-knowledge-architect.md +230 -0
  4. package/.opencode/agents/med-link-graph-curator.md +177 -0
  5. package/.opencode/agents/med-publish-guard.md +62 -0
  6. package/.opencode/commands/flashcards.md +25 -0
  7. package/.opencode/commands/mednotes/create.md +25 -0
  8. package/.opencode/commands/mednotes/enrich.md +27 -0
  9. package/.opencode/commands/mednotes/fix-wiki.md +27 -0
  10. package/.opencode/commands/mednotes/history.md +22 -0
  11. package/.opencode/commands/mednotes/link-body.md +25 -0
  12. package/.opencode/commands/mednotes/link-related.md +27 -0
  13. package/.opencode/commands/mednotes/link.md +27 -0
  14. package/.opencode/commands/mednotes/pdf-library.md +27 -0
  15. package/.opencode/commands/mednotes/process-chats.md +23 -0
  16. package/.opencode/commands/mednotes/setup.md +21 -0
  17. package/.opencode/commands/mednotes/status.md +27 -0
  18. package/.opencode/commands/mednotes/telemetry.md +27 -0
  19. package/.opencode/commands/report.md +26 -0
  20. package/.opencode/mednotes/AGENTS.md +57 -0
  21. package/.opencode/mednotes/agents/med-chat-triager.md +197 -0
  22. package/.opencode/mednotes/agents/med-flashcard-maker.md +56 -0
  23. package/.opencode/mednotes/agents/med-knowledge-architect.md +224 -0
  24. package/.opencode/mednotes/agents/med-link-graph-curator.md +171 -0
  25. package/.opencode/mednotes/agents/med-publish-guard.md +55 -0
  26. package/.opencode/mednotes/contracts/.gitkeep +1 -0
  27. package/.opencode/mednotes/contracts/agents.json +116 -0
  28. package/.opencode/mednotes/contracts/opencode-plugin.json +70 -0
  29. package/.opencode/mednotes/docs/agent-prompt-hardening.md +567 -0
  30. package/.opencode/mednotes/docs/agent-role-contracts.md +94 -0
  31. package/.opencode/mednotes/docs/anki-mcp-twenty-rules.md +214 -0
  32. package/.opencode/mednotes/docs/anki-templates/README.md +39 -0
  33. package/.opencode/mednotes/docs/anki-templates/cloze.back.html +23 -0
  34. package/.opencode/mednotes/docs/anki-templates/cloze.front.html +14 -0
  35. package/.opencode/mednotes/docs/anki-templates/qa.back.html +24 -0
  36. package/.opencode/mednotes/docs/anki-templates/qa.front.html +14 -0
  37. package/.opencode/mednotes/docs/anki-templates/style.css +182 -0
  38. package/.opencode/mednotes/docs/atomicity-splitting-policy.md +113 -0
  39. package/.opencode/mednotes/docs/extension-docs.md +40 -0
  40. package/.opencode/mednotes/docs/flashcard-ingestion.md +278 -0
  41. package/.opencode/mednotes/docs/knowledge-architect.md +208 -0
  42. package/.opencode/mednotes/docs/merge-policy.md +110 -0
  43. package/.opencode/mednotes/docs/public-vocabulary.md +104 -0
  44. package/.opencode/mednotes/docs/semantic-linker.md +141 -0
  45. package/.opencode/mednotes/docs/taxonomy-policy.md +90 -0
  46. package/.opencode/mednotes/docs/triage-policy.md +187 -0
  47. package/.opencode/mednotes/docs/vault-version-control.md +758 -0
  48. package/.opencode/mednotes/docs/vocabulary-db-recovery.md +58 -0
  49. package/.opencode/mednotes/docs/workflow-output-contract.md +779 -0
  50. package/.opencode/mednotes/hooks/hooks.json +79 -0
  51. package/.opencode/mednotes/package-lock.json +6361 -0
  52. package/.opencode/mednotes/package.json +15 -0
  53. package/.opencode/mednotes/pyproject.toml +48 -0
  54. package/.opencode/mednotes/scripts/bootstrap_windows_python_uv.cmd +13 -0
  55. package/.opencode/mednotes/scripts/bootstrap_windows_python_uv.ps1 +172 -0
  56. package/.opencode/mednotes/scripts/enrich_notes.py +23 -0
  57. package/.opencode/mednotes/scripts/full_reset_windows_python_uv.cmd +13 -0
  58. package/.opencode/mednotes/scripts/hooks/antigravity_hook_status.mjs +212 -0
  59. package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/antigravity.mjs +169 -0
  60. package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/harness_payload.mjs +103 -0
  61. package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/opencode_plugin.mjs +341 -0
  62. package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/opencode_user_config_sync.mjs +177 -0
  63. package/.opencode/mednotes/scripts/hooks/mednotes_hook/anki_preflight.mjs +214 -0
  64. package/.opencode/mednotes/scripts/hooks/mednotes_hook/cli.mjs +143 -0
  65. package/.opencode/mednotes/scripts/hooks/mednotes_hook/diagnostics.mjs +11 -0
  66. package/.opencode/mednotes/scripts/hooks/mednotes_hook/domain/agent_directive_core.mjs +160 -0
  67. package/.opencode/mednotes/scripts/hooks/mednotes_hook/fsm_directive.mjs +1470 -0
  68. package/.opencode/mednotes/scripts/hooks/mednotes_hook/hook_errors.mjs +120 -0
  69. package/.opencode/mednotes/scripts/hooks/mednotes_hook/retention.mjs +114 -0
  70. package/.opencode/mednotes/scripts/hooks/mednotes_hook/runtime.mjs +174 -0
  71. package/.opencode/mednotes/scripts/hooks/mednotes_hook/telemetry_capture.mjs +511 -0
  72. package/.opencode/mednotes/scripts/hooks/mednotes_hook/vault_guard.mjs +624 -0
  73. package/.opencode/mednotes/scripts/hooks/mednotes_hook.mjs +5 -0
  74. package/.opencode/mednotes/scripts/mednotes/_runtime_paths.py +24 -0
  75. package/.opencode/mednotes/scripts/mednotes/anki_model_validator.py +18 -0
  76. package/.opencode/mednotes/scripts/mednotes/capture_extension_diff.py +1562 -0
  77. package/.opencode/mednotes/scripts/mednotes/feedback_report.py +16 -0
  78. package/.opencode/mednotes/scripts/mednotes/flashcard_index.py +18 -0
  79. package/.opencode/mednotes/scripts/mednotes/flashcard_pipeline.py +18 -0
  80. package/.opencode/mednotes/scripts/mednotes/flashcard_report.py +18 -0
  81. package/.opencode/mednotes/scripts/mednotes/flashcard_sources.py +18 -0
  82. package/.opencode/mednotes/scripts/mednotes/obsidian/README.md +6 -0
  83. package/.opencode/mednotes/scripts/mednotes/obsidian_note_utils.py +20 -0
  84. package/.opencode/mednotes/scripts/mednotes/pdf_library/cli.py +16 -0
  85. package/.opencode/mednotes/scripts/mednotes/project_fsm.py +229 -0
  86. package/.opencode/mednotes/scripts/mednotes/setup_telemetry_email.py +404 -0
  87. package/.opencode/mednotes/scripts/mednotes/sync_anki_twenty_rules.py +18 -0
  88. package/.opencode/mednotes/scripts/mednotes/sync_opencode_user_config.py +36 -0
  89. package/.opencode/mednotes/scripts/mednotes/wiki/cli.py +20 -0
  90. package/.opencode/mednotes/scripts/mednotes/wiki_graph.py +18 -0
  91. package/.opencode/mednotes/scripts/mednotes/wiki_tree.py +134 -0
  92. package/.opencode/mednotes/scripts/reset_windows_python_uv.ps1 +625 -0
  93. package/.opencode/mednotes/scripts/run_python.mjs +109 -0
  94. package/.opencode/mednotes/scripts/vault/vault_commit.ps1 +19 -0
  95. package/.opencode/mednotes/scripts/vault/vault_commit.sh +18 -0
  96. package/.opencode/mednotes/scripts/vault/vault_git.ps1 +19 -0
  97. package/.opencode/mednotes/scripts/vault/vault_git.py +3107 -0
  98. package/.opencode/mednotes/scripts/vault/vault_git.sh +18 -0
  99. package/.opencode/mednotes/scripts/vault/vault_precommit.ps1 +19 -0
  100. package/.opencode/mednotes/scripts/vault/vault_precommit.sh +18 -0
  101. package/.opencode/mednotes/skills/THIRD_PARTY_NOTICES.md +45 -0
  102. package/.opencode/mednotes/skills/create-medical-flashcards/SKILL.md +113 -0
  103. package/.opencode/mednotes/skills/create-medical-note/SKILL.md +90 -0
  104. package/.opencode/mednotes/skills/enrich-medical-note/SKILL.md +120 -0
  105. package/.opencode/mednotes/skills/fix-medical-wiki/SKILL.md +559 -0
  106. package/.opencode/mednotes/skills/link-medical-wiki/SKILL.md +224 -0
  107. package/.opencode/mednotes/skills/obsidian-cli/SKILL.md +118 -0
  108. package/.opencode/mednotes/skills/obsidian-markdown/SKILL.md +207 -0
  109. package/.opencode/mednotes/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
  110. package/.opencode/mednotes/skills/obsidian-markdown/references/EMBEDS.md +63 -0
  111. package/.opencode/mednotes/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
  112. package/.opencode/mednotes/skills/obsidian-ops/SKILL.md +136 -0
  113. package/.opencode/mednotes/skills/pdf-library/SKILL.md +45 -0
  114. package/.opencode/mednotes/skills/process-medical-chats/SKILL.md +246 -0
  115. package/.opencode/mednotes/skills/workflow-report/SKILL.md +100 -0
  116. package/.opencode/mednotes/src/mednotes/__init__.py +5 -0
  117. package/.opencode/mednotes/src/mednotes/domains/__init__.py +5 -0
  118. package/.opencode/mednotes/src/mednotes/domains/flashcards/README.md +26 -0
  119. package/.opencode/mednotes/src/mednotes/domains/flashcards/__init__.py +2 -0
  120. package/.opencode/mednotes/src/mednotes/domains/flashcards/build_demo_apkg.py +177 -0
  121. package/.opencode/mednotes/src/mednotes/domains/flashcards/contracts.py +385 -0
  122. package/.opencode/mednotes/src/mednotes/domains/flashcards/flashcards_machine.py +522 -0
  123. package/.opencode/mednotes/src/mednotes/domains/flashcards/fsm.py +817 -0
  124. package/.opencode/mednotes/src/mednotes/domains/flashcards/index.py +630 -0
  125. package/.opencode/mednotes/src/mednotes/domains/flashcards/install_models.py +445 -0
  126. package/.opencode/mednotes/src/mednotes/domains/flashcards/model.py +359 -0
  127. package/.opencode/mednotes/src/mednotes/domains/flashcards/obsidian_links.py +135 -0
  128. package/.opencode/mednotes/src/mednotes/domains/flashcards/obsidian_note_utils.py +546 -0
  129. package/.opencode/mednotes/src/mednotes/domains/flashcards/pipeline.py +580 -0
  130. package/.opencode/mednotes/src/mednotes/domains/flashcards/report.py +510 -0
  131. package/.opencode/mednotes/src/mednotes/domains/flashcards/sources.py +682 -0
  132. package/.opencode/mednotes/src/mednotes/domains/flashcards/sync_rules.py +184 -0
  133. package/.opencode/mednotes/src/mednotes/domains/history/__init__.py +1 -0
  134. package/.opencode/mednotes/src/mednotes/domains/history/history_fsm.py +852 -0
  135. package/.opencode/mednotes/src/mednotes/domains/history/history_machine.py +453 -0
  136. package/.opencode/mednotes/src/mednotes/domains/setup/__init__.py +7 -0
  137. package/.opencode/mednotes/src/mednotes/domains/setup/setup_fsm.py +808 -0
  138. package/.opencode/mednotes/src/mednotes/domains/setup/setup_machine.py +973 -0
  139. package/.opencode/mednotes/src/mednotes/domains/wiki/README.md +64 -0
  140. package/.opencode/mednotes/src/mednotes/domains/wiki/__init__.py +1 -0
  141. package/.opencode/mednotes/src/mednotes/domains/wiki/api.py +668 -0
  142. package/.opencode/mednotes/src/mednotes/domains/wiki/batch_state.py +102 -0
  143. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/__init__.py +1 -0
  144. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/atomicity/__init__.py +1 -0
  145. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/atomicity/atomicity.py +877 -0
  146. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/body_link/__init__.py +1 -0
  147. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/body_link/body_linker.py +1562 -0
  148. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/__init__.py +1 -0
  149. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/effect_adapters.py +949 -0
  150. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/fix_wiki_runtime_adapters.py +433 -0
  151. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/__init__.py +1 -0
  152. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/coverage.py +413 -0
  153. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/graph.py +396 -0
  154. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/graph_fixes.py +161 -0
  155. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/hygiene/__init__.py +1 -0
  156. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/hygiene/hygiene.py +483 -0
  157. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/__init__.py +2 -0
  158. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/anchors.py +185 -0
  159. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/__init__.py +0 -0
  160. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/cache.py +223 -0
  161. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/config.py +131 -0
  162. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/download.py +224 -0
  163. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/frontmatter.py +59 -0
  164. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/insert.py +227 -0
  165. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/local_import.py +54 -0
  166. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/__init__.py +42 -0
  167. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/web_profiles.py +99 -0
  168. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/web_search.py +203 -0
  169. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/wikimedia.py +102 -0
  170. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/__init__.py +1 -0
  171. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_db_adapter.mjs +434 -0
  172. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_node_runtime.py +274 -0
  173. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_query.py +227 -0
  174. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/__init__.py +1 -0
  175. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/artifacts.py +605 -0
  176. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/canonical_merge.py +277 -0
  177. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/markdown_zones.py +85 -0
  178. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/meaning_planner.py +307 -0
  179. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_iter.py +67 -0
  180. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_merge.py +278 -0
  181. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_plan.py +409 -0
  182. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_policy.py +22 -0
  183. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/__init__.py +79 -0
  184. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/fixes.py +264 -0
  185. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/frontmatter.py +435 -0
  186. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/models.py +208 -0
  187. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/prompts.py +37 -0
  188. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/tables.py +236 -0
  189. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/validate.py +404 -0
  190. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/provenance.py +478 -0
  191. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/raw_chats.py +273 -0
  192. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/sources_backfill.py +235 -0
  193. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/__init__.py +10 -0
  194. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/anchors.py +16 -0
  195. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/captions.py +47 -0
  196. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/cli.py +179 -0
  197. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/cloud.py +52 -0
  198. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/config.py +196 -0
  199. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/context_packets.py +76 -0
  200. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/db.py +81 -0
  201. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/doctor.py +102 -0
  202. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/figure_ids.py +42 -0
  203. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/ingest.py +326 -0
  204. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/insert.py +316 -0
  205. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/mentions.py +57 -0
  206. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/ocr.py +71 -0
  207. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/paths.py +35 -0
  208. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/pdf_engine.py +77 -0
  209. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/schema.py +155 -0
  210. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/search.py +188 -0
  211. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/__init__.py +1 -0
  212. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/app.py +89 -0
  213. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/image_backend.py +29 -0
  214. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/state.py +65 -0
  215. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/__init__.py +1 -0
  216. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish.py +1139 -0
  217. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish_receipts.py +365 -0
  218. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish_recovery.py +240 -0
  219. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/__init__.py +1 -0
  220. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_behavior_corpus.py +2069 -0
  221. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_report_validation.py +4448 -0
  222. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_run_audit.py +852 -0
  223. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/architect_prompt_eval.py +341 -0
  224. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/body_linker_eval.py +240 -0
  225. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/curator_output_validation.py +175 -0
  226. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/curator_prompt_eval.py +865 -0
  227. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/triager_prompt_eval.py +1295 -0
  228. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/__init__.py +1 -0
  229. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/related_notes.py +1920 -0
  230. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/related_notes_headless.py +1186 -0
  231. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/__init__.py +1 -0
  232. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/plan_attestation.py +148 -0
  233. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_receipts.py +360 -0
  234. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_runtime.py +52 -0
  235. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_task_runner.py +2470 -0
  236. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/style/__init__.py +1 -0
  237. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/style/style.py +1952 -0
  238. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/subagents/__init__.py +1 -0
  239. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/subagents/agents.py +1767 -0
  240. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/__init__.py +1 -0
  241. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/alias_projection.py +331 -0
  242. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/link_terms.py +151 -0
  243. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/llm_disambiguation.py +182 -0
  244. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/__init__.py +116 -0
  245. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/audit.py +201 -0
  246. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/migration.py +314 -0
  247. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/normalize.py +72 -0
  248. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/policy.py +135 -0
  249. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/resolve.py +413 -0
  250. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/schema.py +157 -0
  251. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/status.py +137 -0
  252. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_bootstrap.py +509 -0
  253. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_curator_batch.py +1115 -0
  254. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_ingestion.py +632 -0
  255. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_map.py +930 -0
  256. package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_recovery.py +1388 -0
  257. package/.opencode/mednotes/src/mednotes/domains/wiki/cli.py +6665 -0
  258. package/.opencode/mednotes/src/mednotes/domains/wiki/common.py +69 -0
  259. package/.opencode/mednotes/src/mednotes/domains/wiki/config.py +210 -0
  260. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/__init__.py +74 -0
  261. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agent_report.py +242 -0
  262. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agent_run_audit.py +196 -0
  263. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agents.py +601 -0
  264. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/curator.py +256 -0
  265. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/effect_payloads.py +519 -0
  266. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/happy_path.py +190 -0
  267. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/link_git.py +110 -0
  268. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/link_runtime_artifact.py +52 -0
  269. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/note_plan.py +75 -0
  270. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/paths.py +114 -0
  271. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/public_report.py +53 -0
  272. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/publish.py +111 -0
  273. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/raw_coverage.py +217 -0
  274. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes.py +136 -0
  275. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes_headless.py +153 -0
  276. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes_runtime.py +395 -0
  277. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/schema_registry.py +637 -0
  278. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/specialist.py +432 -0
  279. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/status.py +62 -0
  280. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/style_rewrite.py +568 -0
  281. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/vocabulary_ingestion.py +223 -0
  282. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_blockers.py +510 -0
  283. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_guardrails.py +637 -0
  284. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_outcomes.py +121 -0
  285. package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_receipts.py +100 -0
  286. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/__init__.py +1 -0
  287. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/__init__.py +1 -0
  288. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/__main__.py +4 -0
  289. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/cli.py +275 -0
  290. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/__init__.py +2 -0
  291. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/candidates.py +193 -0
  292. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/cli.py +189 -0
  293. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/gemini.py +220 -0
  294. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/inputs.py +120 -0
  295. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/models.py +34 -0
  296. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/parsing.py +48 -0
  297. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/prompts.py +216 -0
  298. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/quality.py +54 -0
  299. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/reporting.py +24 -0
  300. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/runner.py +433 -0
  301. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/utils.py +39 -0
  302. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/vault_guard_bridge.py +17 -0
  303. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/__init__.py +1 -0
  304. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_context_packets.py +454 -0
  305. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_decision_projection.py +133 -0
  306. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_effects.py +1260 -0
  307. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_fsm.py +2768 -0
  308. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_machine.py +1588 -0
  309. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_plan.py +306 -0
  310. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_primary_objective.py +316 -0
  311. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_problem.py +153 -0
  312. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_receipt_evidence.py +306 -0
  313. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_states.py +290 -0
  314. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_user_report.py +342 -0
  315. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/health.py +6332 -0
  316. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/__init__.py +1 -0
  317. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_fsm.py +1119 -0
  318. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_git.py +638 -0
  319. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_machine.py +1106 -0
  320. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_retry_governance.py +374 -0
  321. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_runtime_result.py +485 -0
  322. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_triggers.py +183 -0
  323. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/linking.py +2758 -0
  324. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/reference_repair.py +718 -0
  325. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/related_notes_fsm.py +1855 -0
  326. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link_related/__init__.py +1 -0
  327. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link_related/link_related_machine.py +834 -0
  328. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/__init__.py +1 -0
  329. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_fsm.py +1592 -0
  330. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_machine.py +3097 -0
  331. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_primary_objective.py +28 -0
  332. package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_runtime_result.py +185 -0
  333. package/.opencode/mednotes/src/mednotes/domains/wiki/performance.py +97 -0
  334. package/.opencode/mednotes/src/mednotes/kernel/__init__.py +6 -0
  335. package/.opencode/mednotes/src/mednotes/kernel/agent_directive.py +336 -0
  336. package/.opencode/mednotes/src/mednotes/kernel/base.py +51 -0
  337. package/.opencode/mednotes/src/mednotes/kernel/blockers.py +39 -0
  338. package/.opencode/mednotes/src/mednotes/kernel/effect_executor.py +55 -0
  339. package/.opencode/mednotes/src/mednotes/kernel/effect_intent.py +69 -0
  340. package/.opencode/mednotes/src/mednotes/kernel/effects.py +160 -0
  341. package/.opencode/mednotes/src/mednotes/kernel/errors.py +38 -0
  342. package/.opencode/mednotes/src/mednotes/kernel/fsm_event.py +35 -0
  343. package/.opencode/mednotes/src/mednotes/kernel/fsm_model.py +55 -0
  344. package/.opencode/mednotes/src/mednotes/kernel/fsm_transition_result.py +75 -0
  345. package/.opencode/mednotes/src/mednotes/kernel/guardrails.py +188 -0
  346. package/.opencode/mednotes/src/mednotes/kernel/progress.py +319 -0
  347. package/.opencode/mednotes/src/mednotes/kernel/public_report.py +346 -0
  348. package/.opencode/mednotes/src/mednotes/kernel/state_machine.py +164 -0
  349. package/.opencode/mednotes/src/mednotes/kernel/workflow.py +619 -0
  350. package/.opencode/mednotes/src/mednotes/platform/__init__.py +5 -0
  351. package/.opencode/mednotes/src/mednotes/platform/backup_policy.py +382 -0
  352. package/.opencode/mednotes/src/mednotes/platform/feedback/__init__.py +62 -0
  353. package/.opencode/mednotes/src/mednotes/platform/feedback/cli.py +275 -0
  354. package/.opencode/mednotes/src/mednotes/platform/feedback/contracts.py +83 -0
  355. package/.opencode/mednotes/src/mednotes/platform/feedback/core.py +4168 -0
  356. package/.opencode/mednotes/src/mednotes/platform/feedback/integrity.py +989 -0
  357. package/.opencode/mednotes/src/mednotes/platform/feedback/operational_contract.py +2293 -0
  358. package/.opencode/mednotes/src/mednotes/platform/feedback/telemetry.py +875 -0
  359. package/.opencode/mednotes/src/mednotes/platform/feedback/telemetry_config.py +65 -0
  360. package/.opencode/mednotes/src/mednotes/platform/opencode_runtime_config.py +182 -0
  361. package/.opencode/mednotes/src/mednotes/platform/paths/__init__.py +1560 -0
  362. package/.opencode/mednotes/src/mednotes/platform/secrets.py +89 -0
  363. package/.opencode/mednotes/src/mednotes/platform/user_config.py +103 -0
  364. package/.opencode/mednotes/src/mednotes/platform/vault_guard.py +214 -0
  365. package/.opencode/mednotes/uv.lock +932 -0
  366. package/.opencode/mednotes.generated.json +395 -0
  367. package/.opencode/opencode.json +31 -0
  368. package/.opencode/plugins/mednotes-fsm.mjs +7 -0
  369. package/.opencode/plugins/mednotes_hook/adapters/antigravity.mjs +169 -0
  370. package/.opencode/plugins/mednotes_hook/adapters/harness_payload.mjs +103 -0
  371. package/.opencode/plugins/mednotes_hook/adapters/opencode_plugin.mjs +341 -0
  372. package/.opencode/plugins/mednotes_hook/adapters/opencode_user_config_sync.mjs +177 -0
  373. package/.opencode/plugins/mednotes_hook/anki_preflight.mjs +214 -0
  374. package/.opencode/plugins/mednotes_hook/cli.mjs +143 -0
  375. package/.opencode/plugins/mednotes_hook/diagnostics.mjs +11 -0
  376. package/.opencode/plugins/mednotes_hook/domain/agent_directive_core.mjs +160 -0
  377. package/.opencode/plugins/mednotes_hook/fsm_directive.mjs +1470 -0
  378. package/.opencode/plugins/mednotes_hook/hook_errors.mjs +120 -0
  379. package/.opencode/plugins/mednotes_hook/retention.mjs +114 -0
  380. package/.opencode/plugins/mednotes_hook/runtime.mjs +174 -0
  381. package/.opencode/plugins/mednotes_hook/telemetry_capture.mjs +511 -0
  382. package/.opencode/plugins/mednotes_hook/vault_guard.mjs +624 -0
  383. package/AGENTS.md +57 -0
  384. package/README.md +194 -0
  385. package/adapters/antigravity/agents.json +80 -0
  386. package/adapters/antigravity/templates/med-chat-triager.md +214 -0
  387. package/adapters/antigravity/templates/med-flashcard-maker.md +72 -0
  388. package/adapters/antigravity/templates/med-knowledge-architect.md +241 -0
  389. package/adapters/antigravity/templates/med-link-graph-curator.md +187 -0
  390. package/adapters/antigravity/templates/med-publish-guard.md +71 -0
  391. package/adapters/gemini-cli/gemini-extension.json +14 -0
  392. package/adapters/gemini-cli/package.json +15 -0
  393. package/adapters/gemini-cli/pyproject.toml +48 -0
  394. package/bin/mednotes-opencode.mjs +155 -0
  395. package/contracts/agents.json +116 -0
  396. package/core/agents/med-chat-triager.md +197 -0
  397. package/core/agents/med-flashcard-maker.md +56 -0
  398. package/core/agents/med-knowledge-architect.md +224 -0
  399. package/core/agents/med-link-graph-curator.md +171 -0
  400. package/core/agents/med-publish-guard.md +55 -0
  401. package/core/commands/flashcards.toml +22 -0
  402. package/core/commands/mednotes/create.toml +22 -0
  403. package/core/commands/mednotes/enrich.toml +24 -0
  404. package/core/commands/mednotes/fix-wiki.toml +24 -0
  405. package/core/commands/mednotes/history.toml +19 -0
  406. package/core/commands/mednotes/link-body.toml +22 -0
  407. package/core/commands/mednotes/link-related.toml +24 -0
  408. package/core/commands/mednotes/link.toml +24 -0
  409. package/core/commands/mednotes/pdf-library.toml +24 -0
  410. package/core/commands/mednotes/process-chats.toml +20 -0
  411. package/core/commands/mednotes/setup.toml +18 -0
  412. package/core/commands/mednotes/status.toml +24 -0
  413. package/core/commands/mednotes/telemetry.toml +24 -0
  414. package/core/commands/report.toml +23 -0
  415. package/core/skills/THIRD_PARTY_NOTICES.md +45 -0
  416. package/core/skills/create-medical-flashcards/SKILL.md +113 -0
  417. package/core/skills/create-medical-note/SKILL.md +90 -0
  418. package/core/skills/enrich-medical-note/SKILL.md +120 -0
  419. package/core/skills/fix-medical-wiki/SKILL.md +559 -0
  420. package/core/skills/link-medical-wiki/SKILL.md +224 -0
  421. package/core/skills/obsidian-cli/SKILL.md +118 -0
  422. package/core/skills/obsidian-markdown/SKILL.md +207 -0
  423. package/core/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
  424. package/core/skills/obsidian-markdown/references/EMBEDS.md +63 -0
  425. package/core/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
  426. package/core/skills/obsidian-ops/SKILL.md +136 -0
  427. package/core/skills/pdf-library/SKILL.md +45 -0
  428. package/core/skills/process-medical-chats/SKILL.md +246 -0
  429. package/core/skills/workflow-report/SKILL.md +100 -0
  430. package/package.json +45 -0
@@ -0,0 +1,24 @@
1
+ description = "Roda a linkagem da Wiki_Medicina."
2
+ prompt = '''
3
+ Rode a linkagem da Wiki_Medicina.
4
+ Argumentos do usuário: {{args}}
5
+ Use a skill `link-medical-wiki` e carregue `${extensionPath}/skills/obsidian-ops/SKILL.md`.
6
+ Responda pelo contrato `${extensionPath}/docs/workflow-output-contract.md`.
7
+ Invariantes do launcher:
8
+ - /mednotes:link é o dono de todo reparo de grafo: vocabulary DB, curadoria semântica, aliases, body linker, Related Notes e validação final. Não mantém índice Dataview.
9
+ - `wiki/cli.py run-linker --diagnose` monta plano e salva `link-diagnosis.json`
10
+ sem mutar notas; resolve aliases contextuais determinísticos, mas não abre
11
+ `gemini -p` escondido para ambiguidades médicas reais.
12
+ - `wiki/cli.py run-linker --apply --diagnosis <json>` aplica só diagnóstico
13
+ validado; o apply não chama LLM nem recalcula decisões contextuais.
14
+ - Se aparecer `vocabulary_curator_batch_plan_path` ou `vocabulary_semantic_ingestion_pending`, continue a curadoria aqui; não encerre como próximo passo manual.
15
+ - Na curadoria de vocabulário: Não use `@generalist` nem outro agente intermediário; o agente pai é o único orquestrador; lance `med-link-graph-curator` diretamente por `work_items[]`.
16
+ - No apply, `vocabulary_semantic_repair` resolve fila simples antes de linkar; só pare em decisão humana ou erro operacional real.
17
+ - `wiki/cli.py related-notes-sync` é o único escritor de `## 🔗 Notas Relacionadas`;
18
+ `run-linker` chama essa fase canônica em vez de heurística própria.
19
+ - Modos estreitos: `/mednotes:link-body`, `/mednotes:link-related`; seção
20
+ gerenciada: `related-notes-sync --apply` com recibo e proteção do vault.
21
+ - Este workflow não corrige estilo, YAML/status, publicação ou taxonomia.
22
+ - Não faça regex manual para linkar notas.
23
+ - Não mostre JSON bruto por padrão; resuma links, Related Notes, blockers e próxima ação.
24
+ '''
@@ -0,0 +1,24 @@
1
+ description = "Gerencia biblioteca local de imagens extraidas de PDFs."
2
+ prompt = '''
3
+ Abra a biblioteca local de imagens de PDFs para enriquecer notas médicas.
4
+
5
+ Argumentos do usuário: {{args}}
6
+
7
+ Use a skill `pdf-library`. Use também `${extensionPath}/docs/workflow-output-contract.md`
8
+ para responder com resumo legível, prévia, confirmação e retomada oficial.
9
+
10
+ Invariantes do launcher:
11
+ - contrato tipado: `pdf-library insert` é uma operação canônica preview/apply.
12
+ O apply só pode materializar mudanças visual-only: embed de imagem, legenda
13
+ `Figura:` e frontmatter visual `images_*`.
14
+ - Trate o comando público como experiência guiada: confira o ambiente,
15
+ prepare automaticamente quando for seguro e só peça ação humana quando houver
16
+ bloqueio real.
17
+ - Não ensine subcomandos, flags ou termos técnicos por padrão. Fale em
18
+ preparar ambiente, mostrar prévia, nada alterado ainda, confirmar e aplicar.
19
+ - A TUI abre inline no terminal atual por padrão.
20
+ - Não envie PDF, OCR bruto, imagens ou conteúdo clínico para telemetria.
21
+ - Inserção exige prévia e confirmação explícita antes de mutar nota.
22
+ - Se qualquer mudança clínica/textual aparecer entre a prévia e o apply,
23
+ bloqueie como mutação não visual inesperada e preserve a nota.
24
+ '''
@@ -0,0 +1,20 @@
1
+ description = "Processa backlog de chats medicos brutos para notas Obsidian."
2
+ prompt = '''
3
+ Processe chats médicos brutos de `Chats_Raw` para `Wiki_Medicina`. Argumentos do usuário: {{args}}. Guardrails enfáticos do launcher:
4
+ - Rota rápida obrigatória: primeiro rode exatamente `node "${extensionPath}/scripts/run_python.mjs" "${extensionPath}/scripts/mednotes/wiki/cli.py" list-pending --summary --json`; não leia skills/docs, diretórios, `config.toml` nem rode `validate` antes dessa checagem.
5
+ - Se o payload público indicar que não há chats novos e o workflow é terminal, responda somente com `reports.public_report.lines` e encerre. Não adicione "Resumo do Trabalho"; não mencione nomes de campos internos, schemas, hashes ou caminhos locais.
6
+ - Resposta pública padrão: use `reports.public_report.lines` quando existir e não exponha comandos literais, flags, schemas, recibos, hashes, paths internos nem nomes de campos. Detalhes técnicos ficam no canal agente/debug ou laboratório; decisões humanas devem aparecer como pergunta, opções fechadas e item afetado.
7
+ - Só carregue a skill `process-medical-chats` e `${extensionPath}/skills/obsidian-ops/SKILL.md` se houver backlog real, bloqueio acionável ou continuação explícita. Resposta: `${extensionPath}/docs/workflow-output-contract.md`. Continuação agentica executável vem somente de `agent_directive.control.capabilities.continue=true` com `agent_directive.control.effects[]`; `decision`, `human_decision_packet` e `progress_view_model.resume_action` orientam UX, decisão humana e retomada pública, mas não autorizam mutação ou chamada de subagente sem `agent_directive.control`.
8
+ - Se a fase `architect` também indicar zero itens e terminal sem chats novos, encerre: não rode `validate-wiki`, `/mednotes:fix-wiki`, `run-linker`, `publish-batch` nem subagentes. Responda que não havia chat novo, nada foi escrito e linker/grafo não precisava rodar.
9
+ - Para lote explícito, use `plan-subagents --limit <N>` com `--phase triage` antes de ler raw; um raw chat por subagent; parent não monta prompt manual e usa paths do `work_item`.
10
+ - Não substitua `med-chat-triager`; `triage-note-plan.v2` é autoridade; rode `eval-triager-output --report`; se falhar, reenvie ao triager, não remende JSON; nunca peça metrics fabricadas.
11
+ - Exija coverage `raw-coverage.v1` derivada do plano e `stage-note --coverage` no manifest único.
12
+ - No OpenCode, depois de uma task `architect` concluída, use somente `wiki/cli.py finalize-opencode-architect-task` com `--plan`, `--work-id` e `--json`; não use `finalize-opencode-specialist-task`, não leia código para descobrir finalizer e não siga para `stage-note` antes desse payload validar metadata, `architect-output.v1`, coverage e nota.
13
+ - Corpo de raw chat é imutável; YAML/status só muda via `wiki/cli.py` (`triage`, `discard`, `publish-batch`). Não use `write_file`, `replace`, shell redirection, `sed` ou scripts para editar raw chats, coverage, manifests, H1, taxonomia, YAML/status ou notas staged; first-pass prevention: `note_plan_invalid` para na triagem; `blocked.validation_errors` usa `fix-note`/`rewrite_prompt`; `taxonomy_resolution_required` usa `taxonomy-*`; `coverage_invalid` repete só `stage-note --coverage`; não gere scripts.
14
+ - Se a CLI apontar `environment_blocker.windows_path_or_venv`, rode `/mednotes:setup` ou bootstrap/reset oficial; não edite scripts/runbooks.
15
+ - Para `canonical_merge_required`, `provenance_gap`, `batch_state_mismatch` ou decisão humana, renderize a decisão pelo `decision`/`human_decision_packet` e só continue automaticamente quando `agent_directive.control.effects[]` trouxer a próxima operação executável. Campos legados como `human_decision_required`/`next_action` em payload técnico não autorizam publicação.
16
+ - Se houver `artifact_manifests`, cubra todos os HTMLs; nunca inline HTML. Sempre rode `publish-batch --dry-run`, depois `med-publish-guard`; publish real tem rollback automático.
17
+ - Não rode `run-linker` manualmente depois do dry-run; o `publish-batch` real já chama o linker. Se links bloquearem após publish, próxima ação é `/mednotes:fix-wiki --dry-run`.
18
+ - Em bloqueios recuperáveis, preserve `error_context`; em retry/fase errada/comando falho, registre `agent_events` redigidos.
19
+ - Não chame dry-run de concluído: dry-run limpo é `ready_to_publish`, publish é `published`, linker com blockers é `completed_with_link_blockers`.
20
+ '''
@@ -0,0 +1,18 @@
1
+ description = "Prepara o ambiente Python local do Medical Notes Workbench."
2
+ prompt = '''
3
+ Prepare o Medical Notes Workbench para uso nesta maquina; conduza o usuario passo a passo e pare em login/decisao ate confirmacao clara.
4
+ Use `${extensionPath}` como raiz da extensão e `${extensionPath}/docs/workflow-output-contract.md` para a resposta final.
5
+ Modelo mental:
6
+ 1. `~/.gemini/extensions/medical-notes-workbench` é o bundle; estado persistente fica em `~/.mednotes`.
7
+ 2. Use `/mednotes:setup` como workflow FSM-first. O estado público é somente `setup-fsm-result.v1`: `state_machine_snapshot`, `progress_view_model`, `receipt`, `decision`, `human_decision_packet`, `reports` e `agent_directive`.
8
+ 3. Execute somente `agent_directive.control.effects[]`, em ordem, e alimente o resultado de cada adapter de volta como evento tipado da FSM. Não transforme stdout de adapter privado em estado público.
9
+ 4. Effects públicos esperados incluem `setup:set-paths`, `setup:validate-config`, `setup:repair-config` com adapter `--agent-repair`, `setup:bootstrap-python`, `setup:wait-obsidian`, `setup:rebuild-markdown-runtime`, `setup:rebuild-markdown-index` para preparar o índice Markdown, `setup:vault-guard`, `setup:start-github-login`, `setup:choose-local-only`, `setup:confirm-github-remote`, `setup:resolve-ambiguous-remote`, `setup:confirm-main-branch` e `setup:resolve-policy`.
10
+ 5. `setup:vault-guard` pode executar `vault_git.py setup` apenas como adapter privado e deve ser projetado pelo stack FSM antes de qualquer comunicação pública.
11
+ 6. Se `decision.kind=ask_human`, use a ferramenta nativa de pergunta/seleção com as opções do `human_decision_packet`; só retome pelo `resume_action` oficial.
12
+ 7. Se o receipt trouxer `git_identity_github_attribution`, explique que autoria Git preservada não garante avatar/link/filtro no GitHub; para isso use email de uma conta GitHub ou bot real.
13
+ 8. Não edite `config.toml` manualmente; use o adapter oficial preservando bytes UTF-8; não rode `git add`, não rode `git commit`, não rode `git push`, não limpe arquivos e não entre em nested repos/plugins para "limpar" o vault.
14
+ 9. No Windows, se aparecer "missing `RECORD`", `Failed to uninstall package`, repetição de uninstall/install ou `Acesso negado`, reporte `uv_repair_churn`/`windows_path_or_venv` e use as rotas oficiais `bootstrap_windows_python_uv.ps1` ou `reset_windows_python_uv.ps1`; não diga que o ambiente está perfeito.
15
+ 10. SerpAPI é opcional via `gemini extensions config medical-notes-workbench SERPAPI_KEY`, `config.toml`/`.env` persistentes; nunca imprima segredo.
16
+ 11. Registre feedback local com `scripts/mednotes/feedback_report.py record --workflow /mednotes:setup --agent`; falha de feedback não muda o resultado do setup.
17
+ Explique em portugues o que foi configurado/falta; se a proteção local estiver pronta, inclua: "Proteção local pronta. A extensão também ativou uma trava de segurança: agentes Gemini não conseguem alterar o vault diretamente sem ponto de restauração ativo."
18
+ '''
@@ -0,0 +1,24 @@
1
+ description = "Verifica configuracao local do Medical Notes Workbench."
2
+ prompt = '''
3
+ Verifique o status local do Medical Notes Workbench.
4
+
5
+ Use `${extensionPath}` como raiz da extensão e `${extensionPath}/docs/workflow-output-contract.md` para a resposta final.
6
+
7
+ Checklist nao mutante:
8
+ 1. Confirme `gemini extensions list` e raiz `~/.gemini/extensions/medical-notes-workbench`.
9
+ 2. Verifique `~/.mednotes/config.toml` sem imprimir o arquivo inteiro; nunca mostre tokens, `auth_token`, `.env`, defaults de telemetria, feedback records ou hook events.
10
+ 3. Confira `~/.mednotes/config.toml` com `[paths].wiki_dir` e `[paths].raw_dir`; o status não deve alterar notas. Se faltar caminho, a próxima ação oficial é `set-paths`; destaque compatibilidade ou bloqueio por ambiguidade.
11
+ 4. Valide o enricher pela porta explícita de script: `node "${extensionPath}/scripts/run_python.mjs" "scripts/enrich_notes.py" --help`. Não passe `-m` para `run_python.mjs`; o wrapper recebe um caminho `.py` relativo à raiz da extensão.
12
+ 5. Leia `[gemini].binary`, resolva `gemini.cmd` no Windows quando aplicavel e rode `<binary> --version` sem imprimir segredos.
13
+ 6. Rode `node "${extensionPath}/scripts/run_python.mjs" "scripts/mednotes/wiki/cli.py" validate --config ~/.mednotes/config.toml` e destaque `environment_preflight`, `wiki_source`, `wiki_compat_warnings`, `config_encoding_warnings` e `vocabulary_db_exists`.
14
+ 7. Rode `node "${extensionPath}/scripts/run_python.mjs" "scripts/mednotes/wiki/cli.py" markdown-query-status --config ~/.mednotes/config.toml --json` e trate a saída como snapshot técnico tipado do índice Markdown: ready = "Índice Markdown pronto."; missing/stale = "Índice Markdown precisa ser preparado; próxima ação: /mednotes:setup."; bloqueio = traduza causa e retomada oficial em linguagem humana, sem transformar campos técnicos raiz em estado paralelo.
15
+ 8. Rode `node "${extensionPath}/scripts/run_python.mjs" "scripts/mednotes/feedback_report.py" integrity status --format json` e destaque drift de prompts/runbooks/scripts.
16
+ 9. Confira `SERPAPI_KEY`/`SERPAPI_API_KEY` por setting, ambiente ou `.env` persistente sem imprimir chave; se faltar, dê o comando de configuração.
17
+ 10. Não publique, não corrija Wiki, não aplique linker e não altere notas.
18
+ 11. Registre feedback local com `node "${extensionPath}/scripts/run_python.mjs" "scripts/mednotes/feedback_report.py" record --workflow /mednotes:status --agent`.
19
+ Se algum comando anterior encontrou pendência, falha ou aviso, grave um payload tipado de snapshot/status com causa, retomada oficial e evidência redigida; nunca grave um resumo final saudável vazio depois de detectar ambiente pendente.
20
+ Se houve retry, fase errada, drift, mutação inesperada ou comando falho, use `--payload -` com `agent_events` e `error_context` tipados.
21
+ Se encontrar Python/uv/venv/PowerShell/path Windows quebrado, registre `environment_blocker.windows_path_or_venv`, sugira `/mednotes:setup` ou bootstrap/reset oficial e pare sem editar scripts, prompts ou runbooks.
22
+ Se qualquer comando imprimir "missing `RECORD`", "Failed to uninstall package", `Uninstalled ... Installed ...` repetidamente ou `Acesso negado`, registre `uv_repair_churn` ou `environment_blocker.windows_path_or_venv`; não diga que o ambiente está perfeito mesmo que o JSON principal venha `ready`.
23
+ Responda em portugues com pronto / pendente e proximas acoes concretas.
24
+ '''
@@ -0,0 +1,24 @@
1
+ description = "Configura e opera telemetria por email do Medical Notes Workbench."
2
+ prompt = '''
3
+ Gerencie a telemetria por email pela interface do Gemini CLI.
4
+
5
+ Argumentos do usuario: {{args}}
6
+
7
+ Use `${extensionPath}` como raiz da extensao; fallback `~/.gemini/extensions/medical-notes-workbench`.
8
+ Use `~/.mednotes` para estado persistente. Rode Python sempre com `uv run python`.
9
+ Contrato tipado: este launcher é adapter de telemetria local/desativada; ele lê `workflow-telemetry-status.v1`, `workflow-telemetry-envelope.v1` em prévia local e recibos de desativação, mas não cria uma FSM própria nem usa campos técnicos raiz como controle de workflow.
10
+
11
+ Intencoes:
12
+ 1. `setup-email`, "quero receber por email", `enable`, "ativar" ou `send`: informe que a telemetria remota automatica por email esta desativada no projeto. Nao rode deploy, nao envie email de teste, nao crie defaults privados e nao tente reativar hooks. Se o usuario quer enviar um relatorio manual da execucao atual, oriente para `/report`.
13
+ 2. `status`, `preview` ou `disable`: rode o subcomando correspondente de `scripts/mednotes/feedback_report.py telemetry`. Em `status`, diga que o projeto esta com telemetria remota desativada; em `disable`, confirme que a instalacao tambem ficou com opt-out local.
14
+ 3. Para diagnostico local, use backlog/relatorios de experimentos controlados; nao use hooks ou envio remoto.
15
+ 4. Antes de orientar update/release em uma instalacao com drift ou arquivos editados pelo agente, nao rode `gemini extensions update` diretamente e nao acione hooks de snapshot/telemetria. Se precisar preservar drift, use captura local sem envio e reporte o caminho do artefato local.
16
+ 5. Se o usuario ja atualizou e precisa tentar resgatar o diff agora, rode apenas captura local sem envio remoto. Nao use `--send` nem `--flush`. Se o conteudo antigo foi sobrescrito sem snapshot/backup/objeto Git, nao ha diff antigo recuperavel.
17
+ 6. Para diagnostico visual local, use `preview --since 7d`; nao use retry/envio da outbox.
18
+ 7. Ao fechar, nao registre um novo feedback apenas para reportar que telemetria esta desativada.
19
+ Se houve retry, fase errada, ação oficial desrespeitada, drift, mutacao inesperada
20
+ ou comando falho, use `--payload -` e inclua `agent_events`/`error_context` tipados conforme
21
+ `${extensionPath}/docs/workflow-output-contract.md`.
22
+
23
+ Responda em portugues simples: pronto, telemetria remota desligada, pendencias e proxima acao concreta. Nao exponha RESEND_API_KEY.
24
+ '''
@@ -0,0 +1,23 @@
1
+ description = "Envia relatório reflexivo pós-workflow por email."
2
+ prompt = '''
3
+ Gere e envie um relatório pós-workflow.
4
+
5
+ Argumentos do usuário: {{args}}
6
+
7
+ Use a skill `workflow-report`.
8
+ Use `${extensionPath}/docs/workflow-output-contract.md` para a resposta final.
9
+
10
+ Invariantes do launcher:
11
+ - Rode somente após um workflow ou quando o usuário pedir relatório da execução atual.
12
+ - O relatório precisa incluir `app_version`, erros, dificuldades, obstáculos,
13
+ contornos, arquivos modificados, scripts criados, impacto no output e melhorias.
14
+ - Este é um envio manual explícito com recibo tipado: preserve o resultado de
15
+ `manual-extension-diff-capture.v1`, `workflow-telemetry-envelope.v1` e `send-result.json`;
16
+ não trate `/report` como reativação de telemetria automática.
17
+ - Inclua uma seção `First-pass prevention`: o que o agente deveria ter feito
18
+ logo na primeira tentativa, qual prompt/contrato/guardrail teria evitado o
19
+ problema, e qual fixture validaria essa prevenção.
20
+ - Capture o diff local vs GitHub com `uv run python scripts/mednotes/capture_extension_diff.py --send --github-baseline-url https://codeload.github.com/augustocaruso/medical-notes-workbench/zip/refs/heads/gemini-cli-extension`.
21
+ - Envie email para Augusto com relatório e anexos criados (`extension-full.diff`, `capture.zip`, scripts).
22
+ - Não inclua conteúdo clínico bruto, `.env`, tokens, chaves ou raw chats.
23
+ '''
@@ -0,0 +1,45 @@
1
+ # Third Party Notices
2
+
3
+ ## PyMuPDF
4
+
5
+ The PDF library optional extra uses PyMuPDF for local PDF parsing and rendering.
6
+ PyMuPDF is distributed under AGPL/commercial licensing terms. Keep it optional
7
+ and surface setup/doctor notices before enabling `/mednotes:pdf-library`.
8
+
9
+ ## kepano/obsidian-skills
10
+
11
+ Vendored paths:
12
+
13
+ - `${extensionPath}/skills/obsidian-cli/SKILL.md`
14
+ - `${extensionPath}/skills/obsidian-markdown/SKILL.md`
15
+ - `${extensionPath}/skills/obsidian-markdown/references/`
16
+
17
+ Source: <https://github.com/kepano/obsidian-skills>
18
+
19
+ Vendored commit: `ac9398734fe719565809f7a6048b05c36b1ca38f`
20
+
21
+ License:
22
+
23
+ ```text
24
+ MIT License
25
+
26
+ Copyright (c) 2026 Steph Ango (@kepano)
27
+
28
+ Permission is hereby granted, free of charge, to any person obtaining a copy
29
+ of this software and associated documentation files (the "Software"), to deal
30
+ in the Software without restriction, including without limitation the rights
31
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
32
+ copies of the Software, and to permit persons to whom the Software is
33
+ furnished to do so, subject to the following conditions:
34
+
35
+ The above copyright notice and this permission notice shall be included in all
36
+ copies or substantial portions of the Software.
37
+
38
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
39
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
40
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
41
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
42
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
43
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
44
+ SOFTWARE.
45
+ ```
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: create-medical-flashcards
3
+ description: Cria flashcards médicos no Anki a partir de notas, pastas, tags Obsidian ou texto, usando Twenty Rules, flashcard_pipeline.py e o MCP global anki-mcp. Use com /flashcards.
4
+ ---
5
+
6
+ # Skill: create-medical-flashcards
7
+
8
+ Resposta visível: `${extensionPath}/docs/workflow-output-contract.md`.
9
+
10
+ ## Quando usar
11
+
12
+ Use para `/flashcards`: Markdown, múltiplos arquivos, diretórios, globs, tags
13
+ Obsidian, filtros em linguagem natural ou texto/briefing colado.
14
+
15
+ ## Fonte canônica
16
+
17
+ - Metodologia: `${extensionPath}/docs/anki-mcp-twenty-rules.md`.
18
+ - Regras locais, modelos, preview, idempotência, deeplink e tags:
19
+ `${extensionPath}/docs/flashcard-ingestion.md`.
20
+ - Templates Anki (HTML/CSS): `${extensionPath}/docs/anki-templates/`.
21
+ - Resolver fontes: `${extensionPath}/scripts/mednotes/flashcard_sources.py`.
22
+ - Modelos: `${extensionPath}/scripts/mednotes/flashcards/install_models.py`.
23
+ - Plano/aplicação: `${extensionPath}/scripts/mednotes/flashcard_pipeline.py`.
24
+ - Relatórios: `${extensionPath}/scripts/mednotes/flashcard_report.py`.
25
+ - Saída visível: `${extensionPath}/docs/workflow-output-contract.md`.
26
+ - Deeplink/tag Obsidian: `${extensionPath}/scripts/mednotes/obsidian_note_utils.py`.
27
+
28
+ ## Invariantes runtime
29
+
30
+ - `/flashcards` é preview-first. Modo direto só com `--create`, `--direct`,
31
+ `--yes`, `--no-preview`, "criar diretamente", "sem preview" ou equivalente.
32
+ - Use apenas o MCP global `anki-mcp` já configurado. As tools aparecem como
33
+ `mcp_anki-mcp_*`; não use nomes crus como `addNotes`.
34
+ - Não crie `/twenty_rules` local e não peça ao usuário para executá-lo. Leia a
35
+ cópia local `anki-mcp-twenty-rules.md`.
36
+ - Leia fontes resolvidas antes de raciocinar. Não use conteúdo externo como base
37
+ factual dos cards.
38
+ - Não adicione tags Anki. A tag Obsidian `anki` só vem depois de sucesso real
39
+ no Anki e apenas nas notas com pelo menos um card aceito.
40
+ - Pare antes de escrever se modelos, Anki MCP, confirmação ou plano bloquearem.
41
+ Mais de 40 candidatos exige confirmação.
42
+ - Trate `flashcard_pipeline.py prepare` como fonte de verdade. Se ele retornar
43
+ FSM `blocked`, `waiting_human` ou `failed`, não chame Anki nem resuma como
44
+ concluído.
45
+
46
+ ## Fluxo
47
+
48
+ 1. Resolva o escopo antes de ler notas:
49
+
50
+ ```bash
51
+ uv run python "${extensionPath}/scripts/mednotes/flashcard_sources.py" resolve --scope "<args>" --dry-run --skip-tag anki
52
+ ```
53
+
54
+ Omita `--skip-tag anki` só se o usuário pedir refazer/regenerar notas já
55
+ marcadas. Se `summary.requires_confirmation` ou escopo amplo, mostre:
56
+
57
+ ```bash
58
+ uv run python "${extensionPath}/scripts/mednotes/flashcard_sources.py" preview --scope "<args>" --dry-run --skip-tag anki
59
+ ```
60
+
61
+ 2. Use `manifest.notes` como lista final. Leia cada `path`; preserve `deck`,
62
+ `deeplink`, `vault_relative_path`, `link_mode`, tags e `content_sha256`.
63
+ Texto colado sem nota vai para `Medicina::Inbox`, salvo deck explícito.
64
+ 3. Garanta os modelos antes de pedir candidatos: chame
65
+ `mcp_anki-mcp_modelNames`, `mcp_anki-mcp_modelFieldNames` e rode:
66
+
67
+ ```bash
68
+ uv run python "${extensionPath}/scripts/mednotes/flashcards/install_models.py" ensure --existing - --output -
69
+ ```
70
+
71
+ Execute as `actions` MCP indicadas. Se status `incompatible`, peça apagar ou
72
+ renomear o modelo no Anki.
73
+ 4. Leia `anki-mcp-twenty-rules.md` e `flashcard-ingestion.md`. Chame
74
+ `med-flashcard-maker` em modo candidato; ele retorna `preferred_models`,
75
+ `models` e `candidate_cards`, sem gravar no Anki.
76
+ 5. Prepare o plano:
77
+
78
+ ```bash
79
+ uv run python "${extensionPath}/scripts/mednotes/flashcard_pipeline.py" prepare --input -
80
+ ```
81
+
82
+ Pare se a FSM retornar `blocked`, `waiting_human` ou `failed`. Decisão de
83
+ reprocessamento vem antes de qualquer escrita.
84
+ 6. Mostre o preview:
85
+
86
+ ```bash
87
+ uv run python "${extensionPath}/scripts/mednotes/flashcard_report.py" preview-cards --input -
88
+ ```
89
+
90
+ No modo padrão, não chame Anki antes da confirmação.
91
+ 7. Em gravação, use só `new_cards` aprovados e `anki_find_queries`.
92
+ Rode `mcp_anki-mcp_findNotes`, pule duplicados e só então use
93
+ `mcp_anki-mcp_addNotes`/`mcp_anki-mcp_addNote`.
94
+ 8. Depois do sucesso no Anki, aplique resultados:
95
+
96
+ ```bash
97
+ uv run python "${extensionPath}/scripts/mednotes/flashcard_pipeline.py" apply --input -
98
+ ```
99
+
100
+ 9. Marque somente notas com pelo menos um card aceito:
101
+
102
+ ```bash
103
+ uv run python "${extensionPath}/scripts/mednotes/obsidian_note_utils.py" add-tag --tag anki --effect-target flashcards.tag_obsidian --vault-guard-receipt <vault-guard-receipt.json> <arquivos...>
104
+ ```
105
+
106
+ 10. Gere o resumo final quando houver dados estruturados:
107
+
108
+ ```bash
109
+ uv run python "${extensionPath}/scripts/mednotes/flashcard_report.py" final --input -
110
+ ```
111
+
112
+ Termine pelo contrato de saída: status emoji, fontes, cards candidatos/novos,
113
+ duplicados, notas marcadas `anki`, bloqueios e próxima ação.
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: create-medical-note
3
+ description: Cria notas médicas didáticas em Markdown para estudo, com estrutura clara para Obsidian e pontos que podem ser enriquecidos com imagens depois. Use quando o usuário pedir para criar, escrever, estruturar ou transformar um tema/material em nota médica.
4
+ ---
5
+
6
+ # Skill: create-medical-note
7
+
8
+ Resposta ao usuário: `${extensionPath}/docs/workflow-output-contract.md`.
9
+
10
+ ## Quando usar
11
+
12
+ - O usuário quer criar uma nota médica didática a partir de um tema, outline,
13
+ transcrição, aula, texto colado ou pergunta clínica geral.
14
+ - O usuário quer uma nota Markdown organizada para estudo no Obsidian.
15
+ - O usuário quer preparar uma nota que depois possa receber figuras com
16
+ `enrich-medical-note`.
17
+ - O usuário quer uma Mini-Aula no padrão da Wiki_Medicina; nesse caso, carregue
18
+ e siga `${extensionPath}/docs/knowledge-architect.md`.
19
+
20
+ Não usar para:
21
+
22
+ - Dar aconselhamento médico individualizado para um paciente real.
23
+ - Diagnosticar ou prescrever conduta personalizada.
24
+ - Inserir imagens; para isso use `enrich-medical-note` depois que a nota existir.
25
+ - Processar `Chats_Raw`, decidir `note_plan`, publicar lote ou marcar raw chat;
26
+ para isso use `/mednotes:process-chats`.
27
+
28
+ ## Formato recomendado
29
+
30
+ Use Markdown limpo, com headings ATX (`#`, `##`, `###`). Prefira seções curtas,
31
+ boas para revisão e para futura inserção de imagens.
32
+
33
+ Estrutura padrão:
34
+
35
+ ```markdown
36
+ ---
37
+ tipo: nota-medica
38
+ tema: ...
39
+ status: rascunho
40
+ ---
41
+
42
+ # Título
43
+
44
+ ## Visão geral
45
+
46
+ ## Anatomia/Fisiologia essencial
47
+
48
+ ## Mecanismo ou fisiopatologia
49
+
50
+ ## Quadro clínico
51
+
52
+ ## Diagnóstico
53
+
54
+ ## Tratamento ou manejo
55
+
56
+ ## Armadilhas e diferenciais
57
+
58
+ ## Pontos visuais sugeridos
59
+ ```
60
+
61
+ Adapte a estrutura ao tema. Para Wiki_Medicina,
62
+ `${extensionPath}/docs/knowledge-architect.md` é o dono do Padrão Ouro: formato
63
+ de Mini-Aula, YAML mínimo, headings, fechamento, notas relacionadas,
64
+ rodapé de proveniência, taxonomia e links. Não replique nem substitua esse
65
+ contrato aqui.
66
+
67
+ Para farmacologia, prefira mecanismo, indicações,
68
+ efeitos adversos, contraindicações e interações. Para anatomia, prefira marcos,
69
+ relações, irrigação, inervação e correlações clínicas.
70
+
71
+ ## Regras de escrita
72
+
73
+ - Escreva em português do Brasil por padrão.
74
+ - Seja didático, direto e preciso.
75
+ - Diferencie conhecimento consolidado de incerteza quando relevante.
76
+ - Não invente referências bibliográficas específicas.
77
+ - Evite linguagem de prontuário; a nota é material de estudo.
78
+ - Inclua uma seção "Pontos visuais sugeridos" quando houver conceitos que se
79
+ beneficiem de figura, esquema, anatomia, histologia, radiologia ou gráfico.
80
+ - Não invente tags. Preserve apenas tags operacionais existentes, especialmente
81
+ `anki` e `revisar`, se estiver transformando uma nota já existente.
82
+ Especialidade clínica fica no caminho de pasta/taxonomia.
83
+
84
+ ## Salvamento
85
+
86
+ Se o usuário pedir para salvar em arquivo, use nome curto em kebab-case com
87
+ extensão `.md`. Antes de sobrescrever arquivo existente, confirme com o usuário.
88
+ Ao finalizar, indique status emoji, caminho salvo quando houver, se alguma
89
+ sobrescrita foi evitada, pontos visuais sugeridos e próximo workflow natural
90
+ (`/mednotes:enrich`, `/mednotes:link` ou `/flashcards`).
@@ -0,0 +1,120 @@
1
+ ---
2
+ name: enrich-medical-note
3
+ description: Enriquece notas médicas em Markdown com imagens usando o módulo enricher empacotado no Medical Notes Workbench. Use quando o usuário pedir para enriquecer, ilustrar, adicionar figuras ou buscar imagens para uma ou mais notas médicas `.md`.
4
+ ---
5
+
6
+ # Skill: enrich-medical-note
7
+
8
+ Resposta ao usuário: `${extensionPath}/docs/workflow-output-contract.md`.
9
+
10
+ ## Quando usar
11
+
12
+ - O usuário pede para enriquecer/ilustrar uma ou mais notas Markdown médicas.
13
+ - O usuário aponta um ou mais `.md` e quer figuras de anatomia, histologia, mecanismos,
14
+ esquemas, radiologia ou fotos clínicas.
15
+ - O usuário quer embutir imagens no formato Obsidian `![[...]]`.
16
+
17
+ Não usar para:
18
+
19
+ - Geração de imagens novas. O projeto busca e baixa imagens externas/locais.
20
+ - Reescrever livremente o conteúdo textual da nota.
21
+
22
+ ## Invariantes
23
+
24
+ - `${extensionPath}` é o bundle auto-updatable; use-o só para ler arquivos e
25
+ executar `scripts/enrich_notes.py`.
26
+ - Estado editável vive em `~/.mednotes`; não grave
27
+ segredo/config como única cópia dentro de `${extensionPath}`.
28
+ - Execute todos os alvos em uma invocação. Use `--force` somente se o usuário
29
+ pedir refazer notas já marcadas com `images_enriched: true`.
30
+ - Só adicione blocos de imagem/caption e frontmatter próprio do enricher; esse
31
+ frontmatter é additive-only. Não reescreva texto clínico.
32
+ - Não rode `/mednotes:link` por padrão; imagem/caption/frontmatter visual não
33
+ muda o grafo de notas.
34
+ - Se Python/config/venv estiverem quebrados, rode ou peça `/mednotes:setup`.
35
+
36
+ ## Pré-condições Mínimas
37
+
38
+ 1. Cada nota alvo é um arquivo `.md` legível.
39
+ 2. `~/.mednotes/config.toml` tem `[paths].wiki_dir`,
40
+ ou `config.toml` tem `[vault].path` legado preenchido.
41
+ 3. `uv` e `UV_PROJECT_ENVIRONMENT="$HOME/.mednotes/.venv"`
42
+ apontam para a venv persistente quando a extensão estiver instalada.
43
+ 4. O `gemini` CLI está autenticado para âncoras e rerank visual.
44
+
45
+ ## Como executar
46
+
47
+ Linux/macOS:
48
+
49
+ ```bash
50
+ cd "${extensionPath}"
51
+ export UV_PROJECT_ENVIRONMENT="$HOME/.mednotes/.venv"
52
+ uv run python scripts/enrich_notes.py "<nota-ou-pasta-ou-glob>" [mais alvos] --config ~/.mednotes/config.toml
53
+ ```
54
+
55
+ Windows:
56
+
57
+ ```powershell
58
+ Set-Location "${extensionPath}"
59
+ $env:UV_PROJECT_ENVIRONMENT = "$HOME\.mednotes\.venv"
60
+ uv run python scripts\enrich_notes.py "<nota-ou-glob>" [mais alvos] --config "$HOME\.mednotes\config.toml"
61
+ ```
62
+
63
+ Diretórios/globs são aceitos; o orquestrador deduplica e ignora anexos/cache.
64
+ Use `--force` só para refazer notas enriquecidas.
65
+
66
+ ## Como interpretar
67
+
68
+ Reporte ao usuário:
69
+
70
+ - Número de âncoras encontradas.
71
+ - Quantas imagens foram inseridas.
72
+ - Notas puladas por `images_enriched: true`.
73
+ - Notas sem inserção e falhas por nota.
74
+ - Fontes usadas (`wikimedia`, `web_search`, etc.).
75
+ - Caminhos finais das notas.
76
+ - Falhas toleradas, como downloads `403` ou thumbs indisponíveis.
77
+
78
+ ## Critério de qualidade visual
79
+
80
+ O orquestrador deve tratar busca e rerank como curadoria médica, não como
81
+ decoração de nota:
82
+
83
+ - Âncoras devem apontar o achado visual exato que ajudaria revisão clínica ou
84
+ prova de residência.
85
+ - Queries devem usar termos médicos específicos. Quando a fonte real for
86
+ `web_search`, operadores `site:` podem funcionar como adapter virtual para
87
+ fontes confiáveis (`site:nih.gov`, `site:ncbi.nlm.nih.gov`,
88
+ `site:radiopaedia.org`, etc.), sem prometer que existam adapters nativos.
89
+ - Fotos clínicas, histologia, radiologia e anatomia devem ser reais ou
90
+ academicamente confiáveis. Ilustração genérica, imagem decorativa, watermark
91
+ pesado, texto ilegível ou tópico apenas vizinho devem ser recusados.
92
+ - `radiopaedia`, `nih_open_i`, `openstax`, `dermnet` e `teachmeanatomy` são
93
+ perfil web confiável sobre `web_search` + SerpAPI com `site:` explícito, não
94
+ APIs nativas.
95
+ - Se nenhuma candidata servir, o rerank deve retornar `null`; se
96
+ `minimum_quality_met=false`, o perfil `clinical` não insere imagem meia-certa.
97
+ - Use `--quality-report <arquivo.json>` quando precisar revisar fontes e razões
98
+ de aceite/recusa; o relatório local não deve conter Markdown bruto ou imagens.
99
+
100
+ Use o contrato de saída para transformar logs e JSON em resumo curto com status
101
+ emoji, contagens, arquivos relevantes, warnings e próxima ação. Não despeje JSON
102
+ bruto por padrão.
103
+
104
+ ## Falhas comuns
105
+
106
+ - **Vault/Wiki não configurado**: peça o caminho e atualize
107
+ `[paths].wiki_dir` em `~/.mednotes/config.toml`; use
108
+ `[vault].path` apenas como compatibilidade.
109
+ - **Gemini CLI sem login**: peça para autenticar o Gemini CLI.
110
+ - **Gemini CLI não encontrado**: no Windows, o orquestrador tenta `gemini.cmd`;
111
+ ajuste `[gemini].binary` no config persistente só se necessário.
112
+ - **Sem `SERPAPI_KEY`/`SERPAPI_API_KEY`**: `web_search` e os perfis web
113
+ confiáveis retornam `[]`; Wikimedia continua. Configure via
114
+ `gemini extensions config medical-notes-workbench SERPAPI_KEY` ou `.env`
115
+ persistente, nunca dentro de `${extensionPath}`.
116
+ - **Cota/limite SerpAPI esgotado**: o lote para imediatamente com `rc=9` e
117
+ aviso claro para evitar novas chamadas à API. Oriente o usuário a renovar a
118
+ cota/chave ou rodar novamente só com fontes disponíveis.
119
+ - **Downloads 403**: o downloader tenta headers browser-like e fallback de
120
+ thumbnail SerpAPI quando disponível; se ainda falhar, pule a candidata.