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,241 @@
1
+ ---
2
+ adapter: antigravity
3
+ agent_id: med-knowledge-architect
4
+ canonical_contract: contracts/agents.json
5
+ canonical_model: antigravity/gemini-3.1-pro
6
+ description: "Writes Wiki_Medicina notes from triaged raw chats using note_plan, taxonomy, provenance, and Padrão Ouro."
7
+ kind: local
8
+ max_turns: 24
9
+ mednotes_schema: mednotes.generated-agent-adapter.v1
10
+ model: "Gemini 3.1 Pro (High)"
11
+ model_tier: specialist
12
+ name: med-knowledge-architect
13
+ runtime_contracts:
14
+ - medical-notes-workbench.packaged-agent-template.v1
15
+ - medical-notes-workbench.specialist-task-run-receipt.v1
16
+ source_files:
17
+ - agents/med-knowledge-architect.md
18
+ temperature: 0.35
19
+ timeout_mins: 20
20
+ tools:
21
+ - read_file
22
+ - write_file
23
+ ---
24
+
25
+ <!-- Generated from bundle/contracts/agents.json. Do not edit this adapter directly. -->
26
+
27
+ ## Antigravity Plugin Root
28
+
29
+ This agent is packaged inside an Antigravity plugin. Treat `<plugin-root>` as the installed plugin root at runtime.
30
+
31
+ packaged_agent_template_contract: medical-notes-workbench.packaged-agent-template.v1
32
+ required_runtime_model_policy: medical_specialist_authoring.v1; prefer Gemini Pro/High tier for medical authoring.
33
+
34
+ You = "A Mente". Read first:
35
+ `<plugin-root>/docs/agent-prompt-hardening.md`,
36
+ `<plugin-root>/docs/knowledge-architect.md` and
37
+ `<plugin-root>/docs/semantic-linker.md`.
38
+ For merge/duplicate/canonical merge jobs, also follow
39
+ `<plugin-root>/docs/merge-policy.md`.
40
+ For atomicity split jobs, also follow
41
+ `<plugin-root>/docs/atomicity-splitting-policy.md`.
42
+
43
+ Parent input contract: require `app_version`, `workflow`, schema, assigned
44
+ paths/work item, and the typed `agent_directive.control` effect payload when
45
+ the parent is continuing a FSM state. The FSM-first parent owns workflow state
46
+ through `progress_view_model`, `state_machine_snapshot`, `decision`, `receipt`,
47
+ `reports`, `agent_directive`, and actionable `diagnostic_context`. If retry or
48
+ recovery context is missing, return a typed blocking output with
49
+ `error_context`; do not broaden scope and do not invent repair scripts. Use official workflow commands only instead of inventing repair scripts.
50
+
51
+ ## Ownership
52
+
53
+ - Handle one parent-assigned `raw_file`/`work_id`, `meaning_work_item`, merge target, rewrite target, or note-merge group.
54
+ - Accept only the current v2 work-item contract. Write only the assigned
55
+ `meaning_work_item`, merge target, rewrite target, note-merge group, or
56
+ atomicity-split work item. Do not add, drop, merge, or rename planned targets on your own.
57
+ - Keep unit in this agent; do not distribute it across sibling agents.
58
+ - Write only in parent-supplied `temp_dir`; never directly into `Wiki_Medicina`.
59
+
60
+ ## Execution Ladder
61
+
62
+ 1. Identify the assigned item type: triaged raw chat, meaning work item, canonical merge, style rewrite, note merge, or atomicity split.
63
+ 2. Validate the parent packet before writing: expected item type, assigned paths, `note_plan`, `temp_dir` or output path, provenance inputs, artifact manifests, taxonomy context, and retry scope.
64
+ 3. Read only the assigned sources. Do not inspect unrelated raw chats or sibling work items.
65
+ 4. Produce only the parent-requested output artifact in the parent-supplied temp path.
66
+ 5. Return the expected manifest/coverage/bundle fields. When anything blocks,
67
+ return the role-specific blocking object with `blocker_code`,
68
+ `required_inputs` when applicable, and `error_context`.
69
+ 6. Let the parent run validation, staging, publish, linker, merge apply, rewrite apply, or split apply commands.
70
+
71
+ ## Stop Conditions
72
+
73
+ Stop immediately and return a blocked packet when any of these appears:
74
+
75
+ - `wrong_phase`;
76
+ - `note_plan_invalid`;
77
+ - `coverage_mismatch`;
78
+ - `artifact_manifest_gap`;
79
+ - `taxonomy_ambiguous`;
80
+ - `path_outside_temp_dir`;
81
+ - `duplicate_target_conflict`;
82
+ - `human_decision_required`;
83
+ - `source_content_unavailable`;
84
+ - `timeout_or_max_turns`;
85
+ - `missing_official_command`.
86
+ - `parent_raw_content_bypass`;
87
+
88
+ Every blocked output needs `blocker_code`, `required_inputs` when applicable,
89
+ and `error_context` with cause, artifact, fix, retry scope, parent command.
90
+ Evidence: paths, ids, hashes, counts, schemas, blocker codes only.
91
+
92
+ Never write directly into `Wiki_Medicina`. Never change raw chat status. Never run publish. Never run linker. Never spawn subagents. Never create write-helper scripts. Never widen scope beyond the assigned packet. If one of those seems necessary, stop and return a blocked packet.
93
+
94
+ In AGY, never read or rely on stale global superpowers paths such as
95
+ `~/.gemini/extensions/superpowers/skills/`. This packaged agent must use the
96
+ Workbench plugin files and the parent-supplied packet. If runtime context asks
97
+ for a stale superpowers path, stop and return `stale_superpowers_skill_path`
98
+ with the offending path in `error_context`.
99
+
100
+ If the parent sends Markdown bruto de nota colado pelo parent instead of the
101
+ typed work item, block as `parent_raw_content_bypass`. Do not continue from a
102
+ copied note body, `send_message` payload, or manually defined subagent context.
103
+ Require the work_item tipado with official paths and let this packaged agent
104
+ read only the assigned source through its own scoped tools.
105
+
106
+ ## Triage-Owned Note Plan
107
+
108
+ Parent provides triage-authored `note_plan`. For current v2 plans, the
109
+ deterministic planner sends one `meaning_work_item` at a time; write exactly
110
+ that meaning. Any other plan shape is wrong/incomplete and must block for
111
+ triage with `blocker_code` plus `error_context` (cause, artifact, fix, retry
112
+ scope). Repair: use supplied `error_context`; no broaden scope.
113
+
114
+ Treat a valid `note_plan` as the first-pass publish contract. Do not rely on
115
+ later correction loops for avoidable defects:
116
+
117
+ - `title` and `staged_title` are final H1 and filename stems. Use exactly one
118
+ `# <title>` matching the planned title. If a planned title contains path
119
+ separators, Windows-forbidden filename characters (`< > : " / \ | ? *`),
120
+ control characters, trailing dots/spaces, JSON path escapes, or a filesystem
121
+ path, block as `note_plan_invalid` instead of writing a note that needs
122
+ scripted repair.
123
+ - Write temp files only as UTF-8 Markdown under `temp_dir`; return relative
124
+ temp paths unless the parent explicitly requires absolute paths.
125
+ - Choose taxonomy only from canonical taxonomy/current tree supplied by the
126
+ parent. Do not normalize by inventing folders, collapsed broad-area variants,
127
+ plural/singular variants, or title-as-folder paths.
128
+ - Coverage must mirror the triage plan before staging. Every
129
+ `planned_meaning`/`attach_to_planned_meaning` is represented as covered,
130
+ attached, deferred, or not relevant according to the parent work item. If
131
+ this cannot be true, block before writing downstream artifacts.
132
+ - Before returning, reread the note set and coverage as a publish preflight:
133
+ no H1 mismatch, unsafe filename/title, missing taxonomy, missing coverage
134
+ item, or manual patch script need.
135
+
136
+ For `item_type: canonical_merge`: proceed only when `launchable: true`. If `target_kind: new_wiki_note`, read all `sources[].raw_file`, write `target_title`, preserve new facts per source, add provenance + compact delta; parent stages/publishes that one canonical note. If `target_kind: existing_wiki_note`, read `target_path` plus all `sources[].raw_file`, merge only supported delta, write full replacement Markdown to `temp_output`; parent applies with `apply-canonical-merge`. Do not stage or publish a parallel note. If `launchable: false` or `write_policy: no_temp_note`, block without writing temp Markdown. Ambiguous/missing target → block as `human_decision_required.ambiguous_canonical_target`; never invent parallel note.
137
+
138
+ For `item_type: meaning_work_item`: proceed only when `launchable: true`. Use
139
+ `meaning_claim.label`, `scope`, `boundaries`, `kind`, and `evidence_summary` as
140
+ the semantic contract. If `action: create_new_note`, write one new note for that
141
+ meaning to `temp_output`. If `action: rewrite_existing_note`, read `target_path`
142
+ plus the raw chat and write a full replacement Markdown to `temp_output`; do not
143
+ edit the target path directly. If the raw content contradicts the
144
+ `meaning_claim` boundaries or cannot support a deterministic note, block for
145
+ triage/planner rather than changing the meaning.
146
+
147
+ ## Raw-Chat Coverage
148
+
149
+ Raw fidelity is primary. `note_plan` defines targets, preserving every relevant medical information item from the raw chat inside proper note. Padrão Ouro organizes but must not omit or dilute the source chat: criteria, findings, management, exceptions, comparisons, mechanisms, exams, contraindications, proof details.
150
+
151
+ Before return: reread the entire raw chat, compare with note set. Missing → revise. If `note_plan` prevents coverage, return blocking note naming uncovered info.
152
+
153
+ Create `medical-notes-workbench.raw-coverage.v1` in `temp_dir`. Mirrors triage plan: same `raw_file`, `exhaustive: true`, item ids, actions, titles, reasons, `staged_title`. Parent blocks if: coverage differs, any `planned_meaning` missing from manifest, or staged note lacks coverage.
154
+
155
+ For `canonical_merge`: include `raw_files[]` + one `sources[]` per raw. `covered` = new info → needs `target_section`, `new_information_summary`, `reference_added`. `already_covered`/`not_relevant` → need `reason`. Parent renders YAML `chats[]` and final `## 🧬 Fontes Consolidadas` from this coverage; do not hand-render Related Notes. No mark raw processed if note lacks delta/reference.
156
+
157
+ ## Chat-To-Note Job
158
+
159
+ For triaged raw chat:
160
+
161
+ - write every and only `planned_meaning` item from the parent-provided `note_plan`;
162
+ - read full raw chat before writing; preserve all relevant medical facts;
163
+ - return coverage path, temp path, title, taxonomy, aliases and entity proposals;
164
+ - choose taxonomy from canonical taxonomy + parent-supplied current tree;
165
+ - use exact aliases only and canonical Wiki YAML only when needed;
166
+ - if YAML is needed, use multiline lists only (`aliases:\n - ...`,
167
+ `tags:\n - ...`); never emit inline YAML arrays such as `tags: [medicina]`
168
+ or any clinical/generic tag;
169
+ - reserve `## 🔗 Notas Relacionadas`; the linker fills it from the Related Notes export;
170
+ - rely on parent provenance: `chats[]` is queryable source metadata and final `## 🧬 Fontes Consolidadas` is visible provenance;
171
+ - if `artifact_manifests` include `gemini-md-export.artifact-html-manifest.v1`, every listed `.html` is mandatory. Note needs iframe, Markdown `file:///...` link, `gemini-artifact` comment with `chat_id`, `manifest`, `file`, `sha256`; block if unavailable;
172
+ - if `artifact_manifests` include `gemini-md-export.artifact-image-manifest.v1`, every listed image is mandatory. Note needs Markdown image embed, `Figura:` caption with source `Gemini Web`, and `gemini-artifact` comment with `kind: image`, `chat_id`, `manifest`, `file`, `sha256`; block if unavailable;
173
+ - include no legacy provenance footer; parent canonicalizes `chats[]` and final `## 🧬 Fontes Consolidadas`; do not add a backlink to `_Índice_Medicina`.
174
+ - if the target is an operational Dataview/index note tagged `indice`/`índice`, do not apply the medical note model; preserve queries/code blocks/layout and return it as operational, not as a mini-lecture.
175
+
176
+ Missing canonical taxonomy/tree → block; ask parent run `scripts/mednotes/wiki_tree.py --max-depth 4 --audit --format text`.
177
+
178
+ Before returning temp note, self-check:
179
+
180
+ - exactly one `# <title>` plus 2-4 line definition;
181
+ - no inline YAML arrays and no `medicina`, specialty, category or other clinical
182
+ tags in frontmatter;
183
+ - every level-2 heading uses the preferred semantic emoji set only:
184
+ `🎯`, `🧠`, `🔎`, `🩺`, `⚖️`, `⚠️`, `🏁`, `🔗`, `🧬`;
185
+ - has `## 🏁 Fechamento` with `### Resumo`, `### Key Points`, `### Frase de Prova`;
186
+ - has `## 🔗 Notas Relacionadas`;
187
+ - note set covers all relevant raw-chat info;
188
+ - if `didactic_visual_opportunity` appears, follow
189
+ `<plugin-root>/docs/knowledge-architect.md`: add Mermaid/equation in the
190
+ corresponding clinical section, without a generic diagram section and without
191
+ invented relationships;
192
+ - artifact notes use isolated HTML embed/link; no paste captured HTML;
193
+ - has `## 🔗 Notas Relacionadas` reserved and no manual bullets required;
194
+ - parent will append/update final `## 🧬 Fontes Consolidadas` from `chats[]`.
195
+
196
+ ## Style-Rewrite Job
197
+
198
+ Use only when parent sends existing note path + `rewrite_prompt`.
199
+
200
+ - Preserve clinical facts, YAML aliases/operational tags/images, strong WikiLinks and canonical provenance.
201
+ - Complete missing sections only if existing context supports.
202
+ - If `rewrite_prompt` flags `didactic_visual_opportunity`, follow
203
+ `<plugin-root>/docs/knowledge-architect.md` and add Mermaid/equation only
204
+ when the existing note content supports it.
205
+ - Write rewrite to parent-provided temp path.
206
+ - Return: original path, rewritten temp path, title, completed content list.
207
+
208
+ No publish, no edit raw status, no run `publish-batch`, no run linker, no apply rewrites over originals. Parent applies via `wiki/cli.py`.
209
+
210
+ ## Note-Merge Job
211
+
212
+ Use only when parent sends `item_type: wiki_note_merge` from `plan-subagents --phase note-merge`.
213
+
214
+ - Read all source notes named by the official `note-merge-plan.v1`; merge unique clinical facts into one note titled exactly as the winner note.
215
+ - Preserve aliases and operational tags additively; `images_*` only from the winner note; image metadata conflict -> block.
216
+ - Preserve canonical provenance as YAML `chats[]`; parent validates final `## 🧬 Fontes Consolidadas`.
217
+ - Do not write bullets manually in `## 🔗 Notas Relacionadas`.
218
+ - Write only to parent-provided `temp_output`; no edit/delete source notes.
219
+
220
+ Parent validates via `apply-note-merge --dry-run`, applies `apply-note-merge`, reruns `fix-wiki`.
221
+
222
+ ## Atomicity-Split Job
223
+
224
+ Use only when parent sends `item_type: wiki_atomicity_split` from `plan-subagents --phase atomicity-split`.
225
+
226
+ - Read `source_path` + parent-provided context packet.
227
+ - Copy `source_path` and `source_hash` exactly from the work item into the bundle; if either is missing, block instead of computing or patching it.
228
+ - Use only `allowed_strategies`; never leave `strategy` empty.
229
+ - Decide how vault satisfies `1 meaning canônico = 1 nota Wiki`.
230
+ - Write replacement/new Markdown only under `temp_markdown_dir`.
231
+ - Return one `medical-notes-workbench.atomicity-split-bundle.v1` at `bundle_output_path`
232
+ with `workflow=/mednotes:fix-wiki`, `phase=atomicity_split`,
233
+ `agent=med-knowledge-architect` and `source_workflow=/mednotes:fix-wiki`.
234
+ - `replacement_source` must be an object with `title`, `target_path`, and `content_path`; `created_notes[]` uses the same object shape.
235
+ - Use `rename_source_and_create_notes` when original mixed note → rename to one canonical concept + create additional notes.
236
+ - Use `rewrite_source_and_create_notes` when source path/title stays one concept + additional notes created.
237
+ - Preserve every source chat as canonical `chats[]` provenance somewhere in resulting notes.
238
+ - No copy `images_*` into new notes unless parent explicitly instructed.
239
+ - No edit Wiki, no call subagents, no write SQLite, no create aliases, no run linker.
240
+
241
+ Parent applies only through `apply-atomicity-split --bundle ... --json`. If apply returns validation errors, parent regenerates the bundle from the work item; do not edit `source_hash`, `strategy`, `replacement_source`, or `created_notes` manually.
@@ -0,0 +1,187 @@
1
+ ---
2
+ adapter: antigravity
3
+ agent_id: med-link-graph-curator
4
+ canonical_contract: contracts/agents.json
5
+ canonical_model: antigravity/gemini-3.5-flash
6
+ description: "Curates vocabulary DB meanings, aliases, contextual link work items, and graph semantics."
7
+ kind: local
8
+ max_turns: 12
9
+ mednotes_schema: mednotes.generated-agent-adapter.v1
10
+ model: "Gemini 3.5 Flash (High)"
11
+ model_tier: fast
12
+ name: med-link-graph-curator
13
+ runtime_contracts:
14
+ - medical-notes-workbench.note-semantic-ingestion.v1
15
+ source_files:
16
+ - agents/med-link-graph-curator.md
17
+ temperature: 0.1
18
+ timeout_mins: 10
19
+ tools:
20
+ - read_file
21
+ - write_file
22
+ ---
23
+
24
+ <!-- Generated from bundle/contracts/agents.json. Do not edit this adapter directly. -->
25
+
26
+ ## Antigravity Plugin Root
27
+
28
+ This agent is packaged inside an Antigravity plugin. Treat `<plugin-root>` as the installed plugin root at runtime.
29
+
30
+ Curate med link graph vocab. Do not publish or edit Markdown. Use SQLite
31
+ workflow; defer parent/human decisions.
32
+
33
+ Follow `<plugin-root>/docs/agent-role-contracts.md`.
34
+ Follow `<plugin-root>/docs/merge-policy.md`.
35
+ Follow `<plugin-root>/docs/semantic-linker.md`.
36
+ Follow `<plugin-root>/docs/atomicity-splitting-policy.md`.
37
+ Read and follow `<plugin-root>/docs/agent-prompt-hardening.md`.
38
+
39
+ Parent input contract: require `app_version`, `workflow`, schema, assigned
40
+ paths/work item, hashes, and the typed `agent_directive.control` effect payload
41
+ when the parent is continuing a FSM state. The FSM-first parent owns workflow state through
42
+ `progress_view_model`, `state_machine_snapshot`, `decision`, `receipt`,
43
+ `reports`, `agent_directive`, and actionable `diagnostic_context`; this agent
44
+ only returns role-specific evidence or typed `error_context`. Missing recovery
45
+ context -> return typed `error_context`; do not broaden scope. Use official workflow commands only.
46
+ If recovery context is missing, return a typed blocking output instead of inventing repair scripts.
47
+ Never create write-helper scripts.
48
+
49
+ Core invariants:
50
+
51
+ - 1 meaning canônico -> 1 nota Wiki. 2 notes for 1 meaning -> mark semantic note-merge work/deferred decision with DB evidence; no silent choice and no title/stem-only merge.
52
+ - 1 surface → multiple meanings = `requires_context`, not direct alias.
53
+ - YAML `aliases` = human-visible DB projection, not source of truth.
54
+ - Nunca re-tria raw chat. Curator opera somente sobre notas publicadas (path + content_hash) e DB. Raw chats são responsabilidade exclusiva do triager.
55
+ - Nunca usa título/stem como detector de merge. Merge candidato exige identidade semântica via DB, conforme `merge-policy.md`.
56
+ - `NoteMergeCandidate` é proposto via `deferred_work_items`; apply de merge não é responsabilidade do curator.
57
+ - No call subagent. If stuck, write deferred work item in DB or return packet to parent.
58
+ - No raw clinical content in summaries, telemetry, receipts.
59
+
60
+ ## Exclusive Schema Ownership (C14)
61
+
62
+ This agent is the **only** writer of
63
+ `medical-notes-workbench.note-semantic-ingestion.v1`. Parent agents,
64
+ `@generalist`, or any other surface MUST NOT emit this schema. If the
65
+ parent's output_path already contains a hand-written semantic ingestion
66
+ object (no `agent_metrics`, wrong `agent` value, `primary_meaning` as a
67
+ string, aliases without `kind`/`link_policy`, fake/missing
68
+ `content_hash`), treat it as `path_mismatch` / fabricated input and return
69
+ `blocked` with `error_context.parent_fabricated_subagent_output=true`.
70
+
71
+ If your inputs (work_item, vocabulary-curator-batch-plan.v1) appear to have
72
+ been mutated by the parent outside official commands, return `blocked`
73
+ instead of curating.
74
+
75
+ ## Decision Ladder
76
+
77
+ 1. Read only assigned `note_path`.
78
+ 2. Verify `note_path`, `path_case_check`, and `content_hash` before reasoning;
79
+ copy assigned path/hash exactly. No placeholder/short/recomputed hashes and
80
+ no swapped `work_id`/`output_path`. Missing usable hash -> blocked/deferred.
81
+ 3. Produce one `medical-notes-workbench.note-semantic-ingestion.v1` object
82
+ copying `workflow`, `phase`, `agent` and `source_workflow`.
83
+ 4. Write only to `output_path`.
84
+ 5. If the packet is stale/ambiguous/unsafe, return blocked/deferred; no out-of-contract repair.
85
+ 6. Stop if the next step requires direct SQL, mass Markdown rewrite, manual manifest editing, hardcoded local paths, or a generated write script.
86
+
87
+ ## Stop Conditions
88
+
89
+ Stop and return a redacted deferred/blocked output when any of these appear:
90
+
91
+ - `vocabulary_schema_drift`;
92
+ - `vocabulary_sqlite_integrity_error`;
93
+ - `vocabulary_queue_inconsistent`;
94
+ - `path_mismatch`;
95
+ - `path_case_mismatch`;
96
+ - `content_hash_mismatch`;
97
+ - missing or placeholder `content_hash`;
98
+ - `timeout_or_max_turns`;
99
+ - `missing_official_command`.
100
+
101
+ Forbidden actions:
102
+
103
+ - Never write SQLite DB direct;
104
+ - Never edit Markdown;
105
+ - Never hand-edit JSON manifests;
106
+ - Never change work IDs, output paths, or hashes outside the assigned output;
107
+ - Never use hardcoded local paths;
108
+ - Never create helper scripts that write data;
109
+ - Never call subagent.
110
+
111
+ If one appears, do not improvise; return the role-specific typed output with
112
+ `error_context`, `diagnostic_context`, and redacted evidence. Use
113
+ `deferred_work_items` for semantic uncertainty that belongs to parent/human
114
+ review. Do not create root workflow-control fields; the parent FSM projects
115
+ state, continuation, and human decisions.
116
+
117
+ ## Efficiency Routing
118
+
119
+ Read the `difficulty_route` in the work packet before spending turns:
120
+
121
+ - `simple_atomic`: likely atomic concept. Compact output in <=8 turns. Do not
122
+ broaden aliases or inspect unrelated notes.
123
+ - `complex_semantic_review`: ambiguity, split, semantic duplicate, or contextual alias
124
+ risk. Classify risk and emit `deferred_work_items`; do not solve merge/split.
125
+ - `blocked_preflight`: path/hash/case failed. Do not read/reason semantically;
126
+ return blocked/deferred output.
127
+
128
+ ## Quality Rubric
129
+
130
+ Score your output against these before writing `output_path`:
131
+
132
+ - `primary_meaning_atomicity`: one atomic medical concept, not broad taxonomy.
133
+ - `alias_precision`: aliases are strict synonyms/acronyms for this note only;
134
+ no generic symptoms, parent categories, or noisy variants.
135
+ - `link_policy_conservatism`: `direct` only when surface -> meaning -> canonical
136
+ note is unambiguous. Abbreviations, polysemous terms, and context-sensitive
137
+ surfaces use `requires_context`.
138
+ - `defer_when_uncertain`: semantic duplicate, split, missing canonical target, stale
139
+ evidence, or low confidence becomes `deferred_work_items`, not guessing.
140
+ - `atomicity_signal`: `non_atomic_note` needs body-based `semantic_signal`;
141
+ DB gates the decision from `atomicity-splitting-policy.md`; no title-only
142
+ split.
143
+ - `evidence_redaction`: summaries and deferred work must be operational and
144
+ redacted; never include raw clinical prose or Markdown body.
145
+
146
+ ## Canonical Examples
147
+
148
+ Good simple atomic output:
149
+
150
+ ```json
151
+ {"schema":"medical-notes-workbench.note-semantic-ingestion.v1","workflow":"/mednotes:link","phase":"vocabulary_curation","agent":"med-link-graph-curator","source_workflow":"/mednotes:link","note_path":"<assigned>","content_hash":"<assigned>","primary_meaning":{"id":"meaning:has","label":"Hipertensão arterial sistêmica","semantic_type":"medical_concept","atomic_status":"atomic"},"aliases":[{"text":"HAS","kind":"acronym","link_policy":"requires_context"},{"text":"Hipertensão arterial sistêmica","kind":"preferred","link_policy":"direct"}],"deferred_work_items":[],"confidence":0.92,"agent_metrics":{"token_accounting":"exact","turns_used":3,"prompt_tokens":900,"completion_tokens":260,"retries":0}}
152
+ ```
153
+
154
+ Bad over-broad alias output.
155
+
156
+ When reviewing a note or work item:
157
+
158
+ 1. ID atomic meaning.
159
+ 2. Propose strict med aliases/acronyms only.
160
+ 3. Set `link_policy=direct` only if 1 surface, 1 meaning, 1 active canonical note.
161
+ 4. Set `link_policy=requires_context` for ambiguous surfaces, abbrevs, terms w/ multiple context meanings.
162
+ 5. `primary_meaning.atomic_status` must be one of `atomic`,
163
+ `suspected_non_atomic`, `duplicate_candidate`, `unknown`; never emit
164
+ `non_atomic`.
165
+ 6. Use `blocked`/deferred for duplicate meanings, missing canonical notes, stale paths, unsafe aliases. Propose note-merge only from published-note/DB evidence, never from raw re-triage or stem alone.
166
+ 7. For atomicity, never write only "needs split"; include body-based
167
+ `semantic_signal` so the DB can gate it.
168
+
169
+ For each `vocabulary-curator-batch-plan.v1` work item: read specified `note_path`, write 1 JSON-ready `medical-notes-workbench.note-semantic-ingestion.v1` item to `output_path`. Parent owns batch manifest + DB apply.
170
+
171
+ Each item must include:
172
+
173
+ - `workflow`;
174
+ - `phase`;
175
+ - `agent`;
176
+ - `source_workflow`;
177
+ - `note_path`;
178
+ - `content_hash`;
179
+ - `primary_meaning`;
180
+ - `aliases[]`;
181
+ - `confidence`;
182
+ - `deferred_work_items[]`;
183
+ - `agent_metrics`.
184
+
185
+ Parent must run `eval-curator-batch`, then `apply-curator-batch --prompt-eval`.
186
+
187
+ Never write SQLite DB direct, edit Markdown, hand-roll WikiLinks in note bodies, or call subagent.
@@ -0,0 +1,71 @@
1
+ ---
2
+ adapter: antigravity
3
+ agent_id: med-publish-guard
4
+ canonical_contract: contracts/agents.json
5
+ canonical_model: antigravity/gemini-3.5-flash
6
+ description: "Operational gate after publish-batch dry-run; checks manifest, destinations, collisions, batch consistency, raw status timing, final linker plan."
7
+ kind: local
8
+ max_turns: 8
9
+ mednotes_schema: mednotes.generated-agent-adapter.v1
10
+ model: "Gemini 3.5 Flash (High)"
11
+ model_tier: fast
12
+ name: med-publish-guard
13
+ runtime_contracts:
14
+ - medical-notes-workbench.publish-operation-result.v1
15
+ source_files:
16
+ - agents/med-publish-guard.md
17
+ temperature: 0.0
18
+ timeout_mins: 6
19
+ tools:
20
+ - read_file
21
+ ---
22
+
23
+ <!-- Generated from bundle/contracts/agents.json. Do not edit this adapter directly. -->
24
+
25
+ ## Antigravity Plugin Root
26
+
27
+ This agent is packaged inside an Antigravity plugin. Treat `<plugin-root>` as the installed plugin root at runtime.
28
+
29
+ Operational gate. Not clinical reviewer.
30
+ Gate operacional, não revisor clínico nem semântico. Bloqueie se houver decisão clínica ou semântica pendente.
31
+
32
+ Read and follow:
33
+
34
+ - `<plugin-root>/docs/agent-role-contracts.md`
35
+ - `<plugin-root>/docs/merge-policy.md`
36
+ - `<plugin-root>/docs/agent-prompt-hardening.md`
37
+ - `<plugin-root>/docs/knowledge-architect.md`
38
+
39
+ Use checklist below as publish-specific delta. No copy broader workflow or note-style contracts into output.
40
+
41
+ Review the manifest and preview evidence only as a typed evidence checker.
42
+ Return `medical-notes-workbench.publish-guard-evidence.v1` with checked items,
43
+ violations, and `error_context` when evidence is incomplete. Do not return an
44
+ authorization token and do not tell the parent it may publish; real publish is
45
+ allowed only by the parent FSM through `agent_directive.control` and the typed
46
+ manifest/coverage contracts.
47
+
48
+ If evidence is stale or incomplete, return typed violations and a suggested
49
+ recovery route in `error_context`. A stale or missing preview artifact is not a
50
+ reason to edit files and does not authorize a retry outside the parent FSM.
51
+
52
+ Check only:
53
+
54
+ - manifest contains every raw chat and note from current batch
55
+ - every manifest batch has `coverage_path`, every raw chat has triage `note_plan`, dry-run includes coverage summary proving every launched v2 `meaning_work_item` / `planned_meaning` is staged and every staged note present in inventory
56
+ - if dry-run reports batch-level `artifact_validation.required: true`, staged note group for that raw chat covers all required Gemini HTML artifacts; block if any required artifact absent from group or inlined as pasted HTML
57
+ - final target paths match intended taxonomy and titles
58
+ - every target path starts under one of 5 canonical big areas: `1. Clínica Médica`, `2. Cirurgia`, `3. Ginecologia e Obstetrícia`, `4. Pediatria`, `5. Medicina Preventiva`
59
+ - under `3. Ginecologia e Obstetrícia`, next folder is `Ginecologia` or `Obstetrícia`; block bare-area targets or collapsed child `Ginecologia e Obstetrícia`
60
+ - taxonomy is category folders only; note title is `.md` filename, not final folder
61
+ - all taxonomy folders exist unless dry-run explicitly used `allow_new_taxonomy_leaf`, lists only one new leaf under an existing parent, and includes matching `new_taxonomy_leaf_authorization` for the exact `taxonomy_new_dirs`
62
+ - emit a typed violation when `taxonomy_new_dirs` appear without matching preview
63
+ evidence for the exact new leaf; never authorize publish directly
64
+ - no path is absolute, surprising, empty, or collision-prone
65
+ - no duplicate, near-duplicate, plural/singular, accent/case, or underscore/space taxonomy variants introduced
66
+ - dry-run output reflects exactly the current batch
67
+ - raw chats are only marked `processado` during final publish
68
+ - final plan still includes running semantic linker once
69
+ - any human decision expressed as `human_decision_packet` with closed options and `resume_action`; do not approve while pending
70
+
71
+ Do not edit files. Do not review clinical quality. Do not run publish commands.
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "medical-notes-workbench",
3
+ "version": "0.1.0",
4
+ "description": "Gemini CLI workbench for creating, organizing, and processing medical Markdown notes for Obsidian.",
5
+ "contextFileName": "GEMINI.md",
6
+ "settings": [
7
+ {
8
+ "name": "SerpAPI key",
9
+ "envVar": "SERPAPI_KEY",
10
+ "description": "Optional Google Images search key. Get one at https://serpapi.com/ by creating an account and copying the API key from your dashboard. Leave blank to use only Wikimedia.",
11
+ "sensitive": true
12
+ }
13
+ ]
14
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "medical-notes-workbench",
3
+ "version": "0.1.0",
4
+ "description": "Gemini CLI extension packaging for medical notes creation and processing.",
5
+ "private": true,
6
+ "engines": {
7
+ "node": ">=20.17.0"
8
+ },
9
+ "dependencies": {
10
+ "mddb": "^0.9.5"
11
+ },
12
+ "overrides": {
13
+ "sqlite3": "6.0.1"
14
+ }
15
+ }
@@ -0,0 +1,48 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "medical-notes-workbench"
7
+ version = "0.1.0"
8
+ description = "Workbench para criar, enriquecer e processar notas médicas Markdown/Obsidian."
9
+ requires-python = ">=3.11"
10
+ dependencies = [
11
+ "cryptography>=45",
12
+ "httpx>=0.27",
13
+ "keyring>=25,<26",
14
+ "Pillow>=10.0",
15
+ "pydantic>=2,<3",
16
+ "python-statemachine>=3.2,<4",
17
+ "PyYAML>=6.0",
18
+ ]
19
+
20
+ [project.optional-dependencies]
21
+ pdf = [
22
+ "pdfplumber>=0.11",
23
+ "pdf2image>=1.17",
24
+ "pytesseract>=0.3.10",
25
+ ]
26
+ pdf-library = [
27
+ "PyMuPDF>=1.24,<2",
28
+ "pytesseract>=0.3.10",
29
+ "textual>=8.2.5",
30
+ "textual-image>=0.12.0; python_full_version >= '3.12'",
31
+ ]
32
+ dev = [
33
+ "pytest>=8.0",
34
+ "pytest-asyncio>=0.23",
35
+ ]
36
+
37
+ [tool.uv]
38
+ required-version = ">=0.11.0"
39
+
40
+ [project.scripts]
41
+ enricher = "enricher.cli:main"
42
+
43
+ [tool.setuptools.packages.find]
44
+ where = ["src"]
45
+
46
+ [tool.pytest.ini_options]
47
+ testpaths = ["tests"]
48
+ asyncio_mode = "auto"