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.
- package/.opencode/agents/med-chat-triager.md +204 -0
- package/.opencode/agents/med-flashcard-maker.md +63 -0
- package/.opencode/agents/med-knowledge-architect.md +230 -0
- package/.opencode/agents/med-link-graph-curator.md +177 -0
- package/.opencode/agents/med-publish-guard.md +62 -0
- package/.opencode/commands/flashcards.md +25 -0
- package/.opencode/commands/mednotes/create.md +25 -0
- package/.opencode/commands/mednotes/enrich.md +27 -0
- package/.opencode/commands/mednotes/fix-wiki.md +27 -0
- package/.opencode/commands/mednotes/history.md +22 -0
- package/.opencode/commands/mednotes/link-body.md +25 -0
- package/.opencode/commands/mednotes/link-related.md +27 -0
- package/.opencode/commands/mednotes/link.md +27 -0
- package/.opencode/commands/mednotes/pdf-library.md +27 -0
- package/.opencode/commands/mednotes/process-chats.md +23 -0
- package/.opencode/commands/mednotes/setup.md +21 -0
- package/.opencode/commands/mednotes/status.md +27 -0
- package/.opencode/commands/mednotes/telemetry.md +27 -0
- package/.opencode/commands/report.md +26 -0
- package/.opencode/mednotes/AGENTS.md +57 -0
- package/.opencode/mednotes/agents/med-chat-triager.md +197 -0
- package/.opencode/mednotes/agents/med-flashcard-maker.md +56 -0
- package/.opencode/mednotes/agents/med-knowledge-architect.md +224 -0
- package/.opencode/mednotes/agents/med-link-graph-curator.md +171 -0
- package/.opencode/mednotes/agents/med-publish-guard.md +55 -0
- package/.opencode/mednotes/contracts/.gitkeep +1 -0
- package/.opencode/mednotes/contracts/agents.json +116 -0
- package/.opencode/mednotes/contracts/opencode-plugin.json +70 -0
- package/.opencode/mednotes/docs/agent-prompt-hardening.md +567 -0
- package/.opencode/mednotes/docs/agent-role-contracts.md +94 -0
- package/.opencode/mednotes/docs/anki-mcp-twenty-rules.md +214 -0
- package/.opencode/mednotes/docs/anki-templates/README.md +39 -0
- package/.opencode/mednotes/docs/anki-templates/cloze.back.html +23 -0
- package/.opencode/mednotes/docs/anki-templates/cloze.front.html +14 -0
- package/.opencode/mednotes/docs/anki-templates/qa.back.html +24 -0
- package/.opencode/mednotes/docs/anki-templates/qa.front.html +14 -0
- package/.opencode/mednotes/docs/anki-templates/style.css +182 -0
- package/.opencode/mednotes/docs/atomicity-splitting-policy.md +113 -0
- package/.opencode/mednotes/docs/extension-docs.md +40 -0
- package/.opencode/mednotes/docs/flashcard-ingestion.md +278 -0
- package/.opencode/mednotes/docs/knowledge-architect.md +208 -0
- package/.opencode/mednotes/docs/merge-policy.md +110 -0
- package/.opencode/mednotes/docs/public-vocabulary.md +104 -0
- package/.opencode/mednotes/docs/semantic-linker.md +141 -0
- package/.opencode/mednotes/docs/taxonomy-policy.md +90 -0
- package/.opencode/mednotes/docs/triage-policy.md +187 -0
- package/.opencode/mednotes/docs/vault-version-control.md +758 -0
- package/.opencode/mednotes/docs/vocabulary-db-recovery.md +58 -0
- package/.opencode/mednotes/docs/workflow-output-contract.md +779 -0
- package/.opencode/mednotes/hooks/hooks.json +79 -0
- package/.opencode/mednotes/package-lock.json +6361 -0
- package/.opencode/mednotes/package.json +15 -0
- package/.opencode/mednotes/pyproject.toml +48 -0
- package/.opencode/mednotes/scripts/bootstrap_windows_python_uv.cmd +13 -0
- package/.opencode/mednotes/scripts/bootstrap_windows_python_uv.ps1 +172 -0
- package/.opencode/mednotes/scripts/enrich_notes.py +23 -0
- package/.opencode/mednotes/scripts/full_reset_windows_python_uv.cmd +13 -0
- package/.opencode/mednotes/scripts/hooks/antigravity_hook_status.mjs +212 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/antigravity.mjs +169 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/harness_payload.mjs +103 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/opencode_plugin.mjs +341 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/adapters/opencode_user_config_sync.mjs +177 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/anki_preflight.mjs +214 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/cli.mjs +143 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/diagnostics.mjs +11 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/domain/agent_directive_core.mjs +160 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/fsm_directive.mjs +1470 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/hook_errors.mjs +120 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/retention.mjs +114 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/runtime.mjs +174 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/telemetry_capture.mjs +511 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook/vault_guard.mjs +624 -0
- package/.opencode/mednotes/scripts/hooks/mednotes_hook.mjs +5 -0
- package/.opencode/mednotes/scripts/mednotes/_runtime_paths.py +24 -0
- package/.opencode/mednotes/scripts/mednotes/anki_model_validator.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/capture_extension_diff.py +1562 -0
- package/.opencode/mednotes/scripts/mednotes/feedback_report.py +16 -0
- package/.opencode/mednotes/scripts/mednotes/flashcard_index.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/flashcard_pipeline.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/flashcard_report.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/flashcard_sources.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/obsidian/README.md +6 -0
- package/.opencode/mednotes/scripts/mednotes/obsidian_note_utils.py +20 -0
- package/.opencode/mednotes/scripts/mednotes/pdf_library/cli.py +16 -0
- package/.opencode/mednotes/scripts/mednotes/project_fsm.py +229 -0
- package/.opencode/mednotes/scripts/mednotes/setup_telemetry_email.py +404 -0
- package/.opencode/mednotes/scripts/mednotes/sync_anki_twenty_rules.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/sync_opencode_user_config.py +36 -0
- package/.opencode/mednotes/scripts/mednotes/wiki/cli.py +20 -0
- package/.opencode/mednotes/scripts/mednotes/wiki_graph.py +18 -0
- package/.opencode/mednotes/scripts/mednotes/wiki_tree.py +134 -0
- package/.opencode/mednotes/scripts/reset_windows_python_uv.ps1 +625 -0
- package/.opencode/mednotes/scripts/run_python.mjs +109 -0
- package/.opencode/mednotes/scripts/vault/vault_commit.ps1 +19 -0
- package/.opencode/mednotes/scripts/vault/vault_commit.sh +18 -0
- package/.opencode/mednotes/scripts/vault/vault_git.ps1 +19 -0
- package/.opencode/mednotes/scripts/vault/vault_git.py +3107 -0
- package/.opencode/mednotes/scripts/vault/vault_git.sh +18 -0
- package/.opencode/mednotes/scripts/vault/vault_precommit.ps1 +19 -0
- package/.opencode/mednotes/scripts/vault/vault_precommit.sh +18 -0
- package/.opencode/mednotes/skills/THIRD_PARTY_NOTICES.md +45 -0
- package/.opencode/mednotes/skills/create-medical-flashcards/SKILL.md +113 -0
- package/.opencode/mednotes/skills/create-medical-note/SKILL.md +90 -0
- package/.opencode/mednotes/skills/enrich-medical-note/SKILL.md +120 -0
- package/.opencode/mednotes/skills/fix-medical-wiki/SKILL.md +559 -0
- package/.opencode/mednotes/skills/link-medical-wiki/SKILL.md +224 -0
- package/.opencode/mednotes/skills/obsidian-cli/SKILL.md +118 -0
- package/.opencode/mednotes/skills/obsidian-markdown/SKILL.md +207 -0
- package/.opencode/mednotes/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
- package/.opencode/mednotes/skills/obsidian-markdown/references/EMBEDS.md +63 -0
- package/.opencode/mednotes/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
- package/.opencode/mednotes/skills/obsidian-ops/SKILL.md +136 -0
- package/.opencode/mednotes/skills/pdf-library/SKILL.md +45 -0
- package/.opencode/mednotes/skills/process-medical-chats/SKILL.md +246 -0
- package/.opencode/mednotes/skills/workflow-report/SKILL.md +100 -0
- package/.opencode/mednotes/src/mednotes/__init__.py +5 -0
- package/.opencode/mednotes/src/mednotes/domains/__init__.py +5 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/README.md +26 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/__init__.py +2 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/build_demo_apkg.py +177 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/contracts.py +385 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/flashcards_machine.py +522 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/fsm.py +817 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/index.py +630 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/install_models.py +445 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/model.py +359 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/obsidian_links.py +135 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/obsidian_note_utils.py +546 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/pipeline.py +580 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/report.py +510 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/sources.py +682 -0
- package/.opencode/mednotes/src/mednotes/domains/flashcards/sync_rules.py +184 -0
- package/.opencode/mednotes/src/mednotes/domains/history/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/history/history_fsm.py +852 -0
- package/.opencode/mednotes/src/mednotes/domains/history/history_machine.py +453 -0
- package/.opencode/mednotes/src/mednotes/domains/setup/__init__.py +7 -0
- package/.opencode/mednotes/src/mednotes/domains/setup/setup_fsm.py +808 -0
- package/.opencode/mednotes/src/mednotes/domains/setup/setup_machine.py +973 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/README.md +64 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/api.py +668 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/batch_state.py +102 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/atomicity/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/atomicity/atomicity.py +877 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/body_link/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/body_link/body_linker.py +1562 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/effect_adapters.py +949 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/effects/fix_wiki_runtime_adapters.py +433 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/coverage.py +413 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/graph.py +396 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/graph/graph_fixes.py +161 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/hygiene/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/hygiene/hygiene.py +483 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/__init__.py +2 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/anchors.py +185 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/__init__.py +0 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/cache.py +223 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/config.py +131 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/download.py +224 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/frontmatter.py +59 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/insert.py +227 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/core/local_import.py +54 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/__init__.py +42 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/web_profiles.py +99 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/web_search.py +203 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/illustrate/sources/wikimedia.py +102 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_db_adapter.mjs +434 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_node_runtime.py +274 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/markdown/markdown_query.py +227 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/artifacts.py +605 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/canonical_merge.py +277 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/markdown_zones.py +85 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/meaning_planner.py +307 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_iter.py +67 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_merge.py +278 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_plan.py +409 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_policy.py +22 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/__init__.py +79 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/fixes.py +264 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/frontmatter.py +435 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/models.py +208 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/prompts.py +37 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/tables.py +236 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/note_style/validate.py +404 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/provenance.py +478 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/raw_chats.py +273 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/notes/sources_backfill.py +235 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/__init__.py +10 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/anchors.py +16 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/captions.py +47 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/cli.py +179 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/cloud.py +52 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/config.py +196 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/context_packets.py +76 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/db.py +81 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/doctor.py +102 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/figure_ids.py +42 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/ingest.py +326 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/insert.py +316 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/mentions.py +57 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/ocr.py +71 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/paths.py +35 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/pdf_engine.py +77 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/schema.py +155 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/search.py +188 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/app.py +89 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/image_backend.py +29 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/pdf/tui/state.py +65 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish.py +1139 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish_receipts.py +365 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/publish/publish_recovery.py +240 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_behavior_corpus.py +2069 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_report_validation.py +4448 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/agent_run_audit.py +852 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/architect_prompt_eval.py +341 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/body_linker_eval.py +240 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/curator_output_validation.py +175 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/curator_prompt_eval.py +865 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/quality/triager_prompt_eval.py +1295 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/related_notes.py +1920 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/related_notes/related_notes_headless.py +1186 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/plan_attestation.py +148 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_receipts.py +360 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_runtime.py +52 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/specialist/specialist_task_runner.py +2470 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/style/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/style/style.py +1952 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/subagents/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/subagents/agents.py +1767 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/alias_projection.py +331 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/link_terms.py +151 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/llm_disambiguation.py +182 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/__init__.py +116 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/audit.py +201 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/migration.py +314 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/normalize.py +72 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/policy.py +135 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/resolve.py +413 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/schema.py +157 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/taxonomy/status.py +137 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_bootstrap.py +509 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_curator_batch.py +1115 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_ingestion.py +632 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_map.py +930 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/capabilities/vocabulary/vocabulary_recovery.py +1388 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/cli.py +6665 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/common.py +69 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/config.py +210 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/__init__.py +74 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agent_report.py +242 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agent_run_audit.py +196 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/agents.py +601 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/curator.py +256 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/effect_payloads.py +519 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/happy_path.py +190 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/link_git.py +110 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/link_runtime_artifact.py +52 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/note_plan.py +75 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/paths.py +114 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/public_report.py +53 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/publish.py +111 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/raw_coverage.py +217 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes.py +136 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes_headless.py +153 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/related_notes_runtime.py +395 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/schema_registry.py +637 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/specialist.py +432 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/status.py +62 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/style_rewrite.py +568 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/vocabulary_ingestion.py +223 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_blockers.py +510 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_guardrails.py +637 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_outcomes.py +121 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/contracts/workflow_receipts.py +100 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/__main__.py +4 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/cli.py +275 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/__init__.py +2 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/candidates.py +193 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/cli.py +189 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/gemini.py +220 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/inputs.py +120 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/models.py +34 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/parsing.py +48 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/prompts.py +216 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/quality.py +54 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/reporting.py +24 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/runner.py +433 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/utils.py +39 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/enrich/workflow/vault_guard_bridge.py +17 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_context_packets.py +454 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_decision_projection.py +133 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_effects.py +1260 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_fsm.py +2768 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_machine.py +1588 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_plan.py +306 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_primary_objective.py +316 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_problem.py +153 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_receipt_evidence.py +306 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_states.py +290 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/fix_wiki_user_report.py +342 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/fix_wiki/health.py +6332 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_fsm.py +1119 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_git.py +638 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_machine.py +1106 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_retry_governance.py +374 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_runtime_result.py +485 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/link_triggers.py +183 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/linking.py +2758 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/reference_repair.py +718 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link/related_notes_fsm.py +1855 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link_related/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/link_related/link_related_machine.py +834 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/__init__.py +1 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_fsm.py +1592 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_machine.py +3097 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_primary_objective.py +28 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/flows/process_chats/process_chats_runtime_result.py +185 -0
- package/.opencode/mednotes/src/mednotes/domains/wiki/performance.py +97 -0
- package/.opencode/mednotes/src/mednotes/kernel/__init__.py +6 -0
- package/.opencode/mednotes/src/mednotes/kernel/agent_directive.py +336 -0
- package/.opencode/mednotes/src/mednotes/kernel/base.py +51 -0
- package/.opencode/mednotes/src/mednotes/kernel/blockers.py +39 -0
- package/.opencode/mednotes/src/mednotes/kernel/effect_executor.py +55 -0
- package/.opencode/mednotes/src/mednotes/kernel/effect_intent.py +69 -0
- package/.opencode/mednotes/src/mednotes/kernel/effects.py +160 -0
- package/.opencode/mednotes/src/mednotes/kernel/errors.py +38 -0
- package/.opencode/mednotes/src/mednotes/kernel/fsm_event.py +35 -0
- package/.opencode/mednotes/src/mednotes/kernel/fsm_model.py +55 -0
- package/.opencode/mednotes/src/mednotes/kernel/fsm_transition_result.py +75 -0
- package/.opencode/mednotes/src/mednotes/kernel/guardrails.py +188 -0
- package/.opencode/mednotes/src/mednotes/kernel/progress.py +319 -0
- package/.opencode/mednotes/src/mednotes/kernel/public_report.py +346 -0
- package/.opencode/mednotes/src/mednotes/kernel/state_machine.py +164 -0
- package/.opencode/mednotes/src/mednotes/kernel/workflow.py +619 -0
- package/.opencode/mednotes/src/mednotes/platform/__init__.py +5 -0
- package/.opencode/mednotes/src/mednotes/platform/backup_policy.py +382 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/__init__.py +62 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/cli.py +275 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/contracts.py +83 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/core.py +4168 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/integrity.py +989 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/operational_contract.py +2293 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/telemetry.py +875 -0
- package/.opencode/mednotes/src/mednotes/platform/feedback/telemetry_config.py +65 -0
- package/.opencode/mednotes/src/mednotes/platform/opencode_runtime_config.py +182 -0
- package/.opencode/mednotes/src/mednotes/platform/paths/__init__.py +1560 -0
- package/.opencode/mednotes/src/mednotes/platform/secrets.py +89 -0
- package/.opencode/mednotes/src/mednotes/platform/user_config.py +103 -0
- package/.opencode/mednotes/src/mednotes/platform/vault_guard.py +214 -0
- package/.opencode/mednotes/uv.lock +932 -0
- package/.opencode/mednotes.generated.json +395 -0
- package/.opencode/opencode.json +31 -0
- package/.opencode/plugins/mednotes-fsm.mjs +7 -0
- package/.opencode/plugins/mednotes_hook/adapters/antigravity.mjs +169 -0
- package/.opencode/plugins/mednotes_hook/adapters/harness_payload.mjs +103 -0
- package/.opencode/plugins/mednotes_hook/adapters/opencode_plugin.mjs +341 -0
- package/.opencode/plugins/mednotes_hook/adapters/opencode_user_config_sync.mjs +177 -0
- package/.opencode/plugins/mednotes_hook/anki_preflight.mjs +214 -0
- package/.opencode/plugins/mednotes_hook/cli.mjs +143 -0
- package/.opencode/plugins/mednotes_hook/diagnostics.mjs +11 -0
- package/.opencode/plugins/mednotes_hook/domain/agent_directive_core.mjs +160 -0
- package/.opencode/plugins/mednotes_hook/fsm_directive.mjs +1470 -0
- package/.opencode/plugins/mednotes_hook/hook_errors.mjs +120 -0
- package/.opencode/plugins/mednotes_hook/retention.mjs +114 -0
- package/.opencode/plugins/mednotes_hook/runtime.mjs +174 -0
- package/.opencode/plugins/mednotes_hook/telemetry_capture.mjs +511 -0
- package/.opencode/plugins/mednotes_hook/vault_guard.mjs +624 -0
- package/AGENTS.md +57 -0
- package/README.md +194 -0
- package/adapters/antigravity/agents.json +80 -0
- package/adapters/antigravity/templates/med-chat-triager.md +214 -0
- package/adapters/antigravity/templates/med-flashcard-maker.md +72 -0
- package/adapters/antigravity/templates/med-knowledge-architect.md +241 -0
- package/adapters/antigravity/templates/med-link-graph-curator.md +187 -0
- package/adapters/antigravity/templates/med-publish-guard.md +71 -0
- package/adapters/gemini-cli/gemini-extension.json +14 -0
- package/adapters/gemini-cli/package.json +15 -0
- package/adapters/gemini-cli/pyproject.toml +48 -0
- package/bin/mednotes-opencode.mjs +155 -0
- package/contracts/agents.json +116 -0
- package/core/agents/med-chat-triager.md +197 -0
- package/core/agents/med-flashcard-maker.md +56 -0
- package/core/agents/med-knowledge-architect.md +224 -0
- package/core/agents/med-link-graph-curator.md +171 -0
- package/core/agents/med-publish-guard.md +55 -0
- package/core/commands/flashcards.toml +22 -0
- package/core/commands/mednotes/create.toml +22 -0
- package/core/commands/mednotes/enrich.toml +24 -0
- package/core/commands/mednotes/fix-wiki.toml +24 -0
- package/core/commands/mednotes/history.toml +19 -0
- package/core/commands/mednotes/link-body.toml +22 -0
- package/core/commands/mednotes/link-related.toml +24 -0
- package/core/commands/mednotes/link.toml +24 -0
- package/core/commands/mednotes/pdf-library.toml +24 -0
- package/core/commands/mednotes/process-chats.toml +20 -0
- package/core/commands/mednotes/setup.toml +18 -0
- package/core/commands/mednotes/status.toml +24 -0
- package/core/commands/mednotes/telemetry.toml +24 -0
- package/core/commands/report.toml +23 -0
- package/core/skills/THIRD_PARTY_NOTICES.md +45 -0
- package/core/skills/create-medical-flashcards/SKILL.md +113 -0
- package/core/skills/create-medical-note/SKILL.md +90 -0
- package/core/skills/enrich-medical-note/SKILL.md +120 -0
- package/core/skills/fix-medical-wiki/SKILL.md +559 -0
- package/core/skills/link-medical-wiki/SKILL.md +224 -0
- package/core/skills/obsidian-cli/SKILL.md +118 -0
- package/core/skills/obsidian-markdown/SKILL.md +207 -0
- package/core/skills/obsidian-markdown/references/CALLOUTS.md +58 -0
- package/core/skills/obsidian-markdown/references/EMBEDS.md +63 -0
- package/core/skills/obsidian-markdown/references/PROPERTIES.md +61 -0
- package/core/skills/obsidian-ops/SKILL.md +136 -0
- package/core/skills/pdf-library/SKILL.md +45 -0
- package/core/skills/process-medical-chats/SKILL.md +246 -0
- package/core/skills/workflow-report/SKILL.md +100 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# MedNotes for OpenCode
|
|
2
|
+
|
|
3
|
+
MedNotes é um plugin OpenCode para criar, organizar, revisar, linkar e estudar
|
|
4
|
+
notas médicas em Markdown/Obsidian. O produto foi desenhado para uso pessoal de
|
|
5
|
+
estudo clínico em português do Brasil, com fluxos guiados por máquina de estados
|
|
6
|
+
para evitar comandos soltos, estados paralelos e mutações inseguras no vault.
|
|
7
|
+
|
|
8
|
+
O contrato público é simples: você chama um workflow, o agente conduz preparo,
|
|
9
|
+
diagnóstico, prévia, confirmação e próxima ação. O código interno pode ter JSON,
|
|
10
|
+
hashes, recibos e validações, mas a experiência humana deve parecer direta.
|
|
11
|
+
|
|
12
|
+
## Instalação
|
|
13
|
+
|
|
14
|
+
Enquanto o pacote `mednotes-opencode` ainda não estiver publicado no registry
|
|
15
|
+
npm, instale pelo repo público GitHub:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g github:augustocaruso/mednotes
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Registre o plugin no OpenCode apontando para o mesmo spec GitHub:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
mednotes-opencode install --plugin github:augustocaruso/mednotes
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Quando o pacote npm estiver publicado, o caminho equivalente pelo registry será:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install -g mednotes-opencode
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
E o registro do plugin poderá usar o spec curto:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
mednotes-opencode install
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Esse comando atualiza `~/.config/opencode/opencode.json` no macOS/Linux, ou o
|
|
40
|
+
caminho equivalente em `%APPDATA%` no Windows. Ele cria backup antes de alterar
|
|
41
|
+
um arquivo existente e pode ser auditado sem escrever nada:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
mednotes-opencode install --dry-run
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Depois disso, abra o OpenCode normalmente. O plugin é carregado pelo próprio
|
|
48
|
+
OpenCode como pacote npm/GitHub e sincroniza a configuração de runtime no boot.
|
|
49
|
+
|
|
50
|
+
## Atualização
|
|
51
|
+
|
|
52
|
+
Se instalado pelo GitHub, atualize reinstalando o spec público:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npm install -g github:augustocaruso/mednotes
|
|
56
|
+
mednotes-opencode install --plugin github:augustocaruso/mednotes
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Quando o pacote registry estiver publicado, atualize como qualquer pacote npm:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npm update -g mednotes-opencode
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Se o `opencode.json` usar o spec `mednotes-opencode`, o OpenCode também pode
|
|
66
|
+
resolver versões novas pelo mecanismo nativo de plugins npm. Para congelar uma
|
|
67
|
+
versão, use um spec com versão explícita no instalador:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
mednotes-opencode install --plugin mednotes-opencode@0.1.0
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Configuração
|
|
74
|
+
|
|
75
|
+
A configuração global do usuário fica em:
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
~/.mednotes/config.toml
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Esse arquivo guarda caminhos, modelos dos especialistas, effort level e limites
|
|
82
|
+
de paralelismo. Segredos não entram no TOML. Chaves como SerpAPI devem vir de
|
|
83
|
+
variáveis de ambiente ou do keyring do sistema.
|
|
84
|
+
|
|
85
|
+
Exemplo mínimo:
|
|
86
|
+
|
|
87
|
+
```toml
|
|
88
|
+
[paths]
|
|
89
|
+
wiki_dir = "/caminho/para/Wiki_Medicina"
|
|
90
|
+
raw_dir = "/caminho/para/Chats_Raw"
|
|
91
|
+
|
|
92
|
+
[agents.med_chat_triager]
|
|
93
|
+
model = "antigravity/gemini-3.5-flash"
|
|
94
|
+
reasoning_effort = "medium"
|
|
95
|
+
|
|
96
|
+
[agents.med_knowledge_architect]
|
|
97
|
+
model = "antigravity/gemini-3.1-pro"
|
|
98
|
+
reasoning_effort = "high"
|
|
99
|
+
|
|
100
|
+
[workflows]
|
|
101
|
+
fix_wiki_max_parallel_rewrites = 3
|
|
102
|
+
process_chats_max_parallel_architects = 3
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
O TOML é lido no runtime. O usuário pode trocar modelo e effort sem editar o
|
|
106
|
+
plugin distribuído.
|
|
107
|
+
|
|
108
|
+
## Workflows
|
|
109
|
+
|
|
110
|
+
Comandos públicos preservados:
|
|
111
|
+
|
|
112
|
+
- `/mednotes:create`
|
|
113
|
+
- `/mednotes:enrich`
|
|
114
|
+
- `/mednotes:process-chats`
|
|
115
|
+
- `/mednotes:fix-wiki`
|
|
116
|
+
- `/mednotes:link`
|
|
117
|
+
- `/mednotes:link-body`
|
|
118
|
+
- `/mednotes:link-related`
|
|
119
|
+
- `/mednotes:pdf-library`
|
|
120
|
+
- `/mednotes:history`
|
|
121
|
+
- `/mednotes:setup`
|
|
122
|
+
- `/mednotes:status`
|
|
123
|
+
- `/mednotes:telemetry`
|
|
124
|
+
- `/flashcards`
|
|
125
|
+
- `/report`
|
|
126
|
+
|
|
127
|
+
Os workflows críticos são FSM-first. A FSM é a fonte de verdade para estado,
|
|
128
|
+
transições, bloqueios, recuperação e efeitos. Adapters executam efeitos; eles
|
|
129
|
+
não decidem política de fluxo.
|
|
130
|
+
|
|
131
|
+
## Segurança do vault
|
|
132
|
+
|
|
133
|
+
Workflows que mutam a Wiki usam ponto de restauração e validações antes de
|
|
134
|
+
aplicar mudanças. Prévia e confirmação humana aparecem quando há risco real:
|
|
135
|
+
mutação em lote, escolha clínica, credencial ausente, caminho ambíguo,
|
|
136
|
+
quota/capacidade de modelo ou validação de qualidade pendente.
|
|
137
|
+
|
|
138
|
+
O produto não deve expor detalhes internos por padrão. Termos como hashes,
|
|
139
|
+
recibos, schemas e comandos técnicos são superfícies de automação, não a UX
|
|
140
|
+
principal.
|
|
141
|
+
|
|
142
|
+
## Estrutura do pacote
|
|
143
|
+
|
|
144
|
+
O pacote npm exporta o plugin OpenCode por:
|
|
145
|
+
|
|
146
|
+
```text
|
|
147
|
+
.opencode/plugins/mednotes-fsm.mjs
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Arquivos principais:
|
|
151
|
+
|
|
152
|
+
- `.opencode/`: plugin, agentes, comandos e runtime OpenCode gerados.
|
|
153
|
+
- `core/`: fontes canônicas públicas de agentes, comandos e skills.
|
|
154
|
+
- `contracts/`: contratos de agentes usados pelos geradores.
|
|
155
|
+
- `adapters/`: projeções secundárias mantidas por compatibilidade.
|
|
156
|
+
- `bin/mednotes-opencode.mjs`: instalador idempotente do plugin OpenCode.
|
|
157
|
+
|
|
158
|
+
Tudo nessa árvore pública é gerado a partir do repo privado por allowlist. A
|
|
159
|
+
árvore pública não deve ser editada manualmente.
|
|
160
|
+
|
|
161
|
+
## Release
|
|
162
|
+
|
|
163
|
+
O release público deve passar por estes gates:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
npm run release:public:check
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Esse gate valida FSMs, adapters, geração da árvore pública, auditoria do repo
|
|
170
|
+
público, contrato do pacote npm e smoke do plugin OpenCode.
|
|
171
|
+
|
|
172
|
+
O pipeline público publica o pacote `mednotes-opencode` no npm e cria o release
|
|
173
|
+
GitHub correspondente no repo `augustocaruso/mednotes`.
|
|
174
|
+
|
|
175
|
+
## Desenvolvimento
|
|
176
|
+
|
|
177
|
+
O desenvolvimento acontece no repo privado. Para regenerar os adapters e a
|
|
178
|
+
projeção pública:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
npm run adapters:generate
|
|
182
|
+
node tools/run_python.mjs tools/public_repo/generate.py --repo-root . --output public/mednotes
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Para validar só o pacote OpenCode:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
npm run opencode:smoke
|
|
189
|
+
node tools/run_python.mjs tools/release/audit_opencode_npm_package.py --public-root public/mednotes
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Mudanças observáveis devem passar por contrato, implementação e teste. Se um
|
|
193
|
+
workflow é FSM-first, não adicione estado paralelo em CLI, hook, adapter,
|
|
194
|
+
relatório humano ou payload legado.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adapter": "antigravity",
|
|
3
|
+
"agent_count": 5,
|
|
4
|
+
"agents": [
|
|
5
|
+
{
|
|
6
|
+
"description": "Semantic raw-chat triager for the Medical Notes Workbench process-chats workflow. Reads exactly one raw medical chat and emits one top-level triager output object containing a triage-note-plan.v2 for the durable semantic units found in that raw chat. Does not decide existing-coverage, merge, or canonical winner.",
|
|
7
|
+
"display_name": "Medical Chat Triager",
|
|
8
|
+
"id": "med-chat-triager",
|
|
9
|
+
"model": "antigravity/gemini-3.5-flash",
|
|
10
|
+
"model_tier": "fast",
|
|
11
|
+
"runtime_contracts": [
|
|
12
|
+
"medical-notes-workbench.triage-note-plan.v2",
|
|
13
|
+
"medical-notes-workbench.subagent-run-receipt.v1"
|
|
14
|
+
],
|
|
15
|
+
"runtime_model": "Gemini 3.5 Flash (High)",
|
|
16
|
+
"source_files": [
|
|
17
|
+
"agents/med-chat-triager.md"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"description": "Make medical Anki flashcards from notes/chats/material using Twenty Rules + user Anki MCP.",
|
|
22
|
+
"display_name": "Medical Flashcard Maker",
|
|
23
|
+
"id": "med-flashcard-maker",
|
|
24
|
+
"model": "antigravity/gemini-3.1-pro",
|
|
25
|
+
"model_tier": "specialist",
|
|
26
|
+
"runtime_contracts": [
|
|
27
|
+
"medical-notes-workbench.flashcards-fsm-result.v1"
|
|
28
|
+
],
|
|
29
|
+
"runtime_model": "Gemini 3.1 Pro (High)",
|
|
30
|
+
"source_files": [
|
|
31
|
+
"agents/med-flashcard-maker.md"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"description": "Writes Wiki_Medicina notes from triaged raw chats using note_plan, taxonomy, provenance, and Padrão Ouro.",
|
|
36
|
+
"display_name": "Medical Knowledge Architect",
|
|
37
|
+
"id": "med-knowledge-architect",
|
|
38
|
+
"model": "antigravity/gemini-3.1-pro",
|
|
39
|
+
"model_tier": "specialist",
|
|
40
|
+
"runtime_contracts": [
|
|
41
|
+
"medical-notes-workbench.packaged-agent-template.v1",
|
|
42
|
+
"medical-notes-workbench.specialist-task-run-receipt.v1"
|
|
43
|
+
],
|
|
44
|
+
"runtime_model": "Gemini 3.1 Pro (High)",
|
|
45
|
+
"source_files": [
|
|
46
|
+
"agents/med-knowledge-architect.md"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"description": "Curates vocabulary DB meanings, aliases, contextual link work items, and graph semantics.",
|
|
51
|
+
"display_name": "Medical Link Graph Curator",
|
|
52
|
+
"id": "med-link-graph-curator",
|
|
53
|
+
"model": "antigravity/gemini-3.5-flash",
|
|
54
|
+
"model_tier": "fast",
|
|
55
|
+
"runtime_contracts": [
|
|
56
|
+
"medical-notes-workbench.note-semantic-ingestion.v1"
|
|
57
|
+
],
|
|
58
|
+
"runtime_model": "Gemini 3.5 Flash (High)",
|
|
59
|
+
"source_files": [
|
|
60
|
+
"agents/med-link-graph-curator.md"
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"description": "Operational gate after publish-batch dry-run; checks manifest, destinations, collisions, batch consistency, raw status timing, final linker plan.",
|
|
65
|
+
"display_name": "Medical Publish Guard",
|
|
66
|
+
"id": "med-publish-guard",
|
|
67
|
+
"model": "antigravity/gemini-3.5-flash",
|
|
68
|
+
"model_tier": "fast",
|
|
69
|
+
"runtime_contracts": [
|
|
70
|
+
"medical-notes-workbench.publish-operation-result.v1"
|
|
71
|
+
],
|
|
72
|
+
"runtime_model": "Gemini 3.5 Flash (High)",
|
|
73
|
+
"source_files": [
|
|
74
|
+
"agents/med-publish-guard.md"
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
"schema": "mednotes.generated-antigravity-adapter.v1",
|
|
79
|
+
"source_contract": "contracts/agents.json"
|
|
80
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
---
|
|
2
|
+
adapter: antigravity
|
|
3
|
+
agent_id: med-chat-triager
|
|
4
|
+
canonical_contract: contracts/agents.json
|
|
5
|
+
canonical_model: antigravity/gemini-3.5-flash
|
|
6
|
+
description: "Semantic raw-chat triager for the Medical Notes Workbench process-chats workflow. Reads exactly one raw medical chat and emits one top-level triager output object containing a triage-note-plan.v2 for the durable semantic units found in that raw chat. Does not decide existing-coverage, merge, or canonical winner."
|
|
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-chat-triager
|
|
13
|
+
runtime_contracts:
|
|
14
|
+
- medical-notes-workbench.triage-note-plan.v2
|
|
15
|
+
- medical-notes-workbench.subagent-run-receipt.v1
|
|
16
|
+
source_files:
|
|
17
|
+
- agents/med-chat-triager.md
|
|
18
|
+
temperature: 0.15
|
|
19
|
+
timeout_mins: 12
|
|
20
|
+
tools:
|
|
21
|
+
- read_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
|
+
You are the **semantic raw-chat triager** for a Brazilian Portuguese
|
|
31
|
+
medical-study workflow. Your only job is to read one raw chat and declare
|
|
32
|
+
which durable semantic units (`meanings`) it contains. You do not decide
|
|
33
|
+
existing coverage, canonical winners, merges, or note paths — those are
|
|
34
|
+
downstream responsibilities owned by the planner and the curator.
|
|
35
|
+
|
|
36
|
+
Read and follow, in this order:
|
|
37
|
+
|
|
38
|
+
- `<plugin-root>/docs/agent-role-contracts.md`
|
|
39
|
+
- `<plugin-root>/docs/triage-policy.md`
|
|
40
|
+
- `<plugin-root>/docs/merge-policy.md`
|
|
41
|
+
- `<plugin-root>/docs/agent-prompt-hardening.md`
|
|
42
|
+
|
|
43
|
+
You may run in parallel with other triagers, but the sharding contract is
|
|
44
|
+
strict: exactly one raw chat per agent invocation. Process only the
|
|
45
|
+
`raw_file` explicitly assigned by the parent. If the parent sends multiple
|
|
46
|
+
raw chats, or an ambiguous folder/list, return a blocking packet asking the
|
|
47
|
+
parent to call you once per `plan-subagents` work item.
|
|
48
|
+
|
|
49
|
+
Parent input contract: require `app_version`, `workflow`, schema, exactly
|
|
50
|
+
one `raw_file`, and the typed work item or `agent_directive.control` payload
|
|
51
|
+
that assigned it. The FSM-first parent owns workflow state through
|
|
52
|
+
`progress_view_model`, `state_machine_snapshot`, `decision`, `receipt`,
|
|
53
|
+
`reports`, `agent_directive`, and actionable `diagnostic_context`. If retry or
|
|
54
|
+
recovery context is missing, return a typed blocking output with
|
|
55
|
+
`error_context`; inspect no extra files. Use official workflow commands only
|
|
56
|
+
instead of inventing repair scripts.
|
|
57
|
+
Never create write-helper scripts.
|
|
58
|
+
|
|
59
|
+
## Execution Ladder
|
|
60
|
+
|
|
61
|
+
1. Validate the parent packet: exactly one `raw_file`, assigned triage role,
|
|
62
|
+
no ambiguous folder/list scope.
|
|
63
|
+
2. Read only that assigned raw chat.
|
|
64
|
+
3. Decide `triage` or `discard`.
|
|
65
|
+
4. If triaging, produce one exhaustive
|
|
66
|
+
`medical-notes-workbench.triage-note-plan.v2` for that raw chat inside
|
|
67
|
+
the top-level return object. Do not return a bare `note_plan` JSON as the
|
|
68
|
+
whole answer.
|
|
69
|
+
5. Check `planned_meaning` `staged_title` values for accent/case duplicates
|
|
70
|
+
inside the plan before returning.
|
|
71
|
+
6. Let the official runner save your full top-level output and emit a signed
|
|
72
|
+
`subagent-run-receipt.v1` for that exact output. The parent must not create,
|
|
73
|
+
edit, re-sign, or patch that receipt. Then the parent runs
|
|
74
|
+
`wiki/cli.py eval-triager-output --raw-file <raw.md> --output <triager-output.json> --subagent-run-receipt <subagent-run-receipt.json> --require-subagent-run-receipt --report <triager-eval.json> --json`,
|
|
75
|
+
and only then apply with
|
|
76
|
+
`wiki/cli.py triage --note-plan <note-plan.json> --triager-eval <triager-eval.json> --json`
|
|
77
|
+
or `wiki/cli.py discard`.
|
|
78
|
+
|
|
79
|
+
## Output Contract (`triage-note-plan.v2`)
|
|
80
|
+
|
|
81
|
+
Schema: `medical-notes-workbench.triage-note-plan.v2`. Allowed item actions
|
|
82
|
+
are:
|
|
83
|
+
|
|
84
|
+
- `planned_meaning` — durable semantic unit declared from the raw chat.
|
|
85
|
+
Requires a redacted `meaning_claim` (`label`, `scope`, `boundaries`,
|
|
86
|
+
`kind`, `evidence_summary`) plus `title` and `staged_title`. See
|
|
87
|
+
`triage-policy.md` for closed `kind` values and editorial criteria.
|
|
88
|
+
- `attach_to_planned_meaning` — subordinate detail that belongs to another
|
|
89
|
+
`planned_meaning` of **the same raw chat**. Requires `target_item_id`
|
|
90
|
+
(referencing a sibling `planned_meaning`), `reason_code` from the closed
|
|
91
|
+
set in `triage-policy.md`, and a redacted `reason`.
|
|
92
|
+
- `not_a_note` — content that should not become a Wiki note. Requires
|
|
93
|
+
`reason_code` from the closed set and a redacted `reason`.
|
|
94
|
+
- `needs_context` — raw chat does not support safe segmentation for this
|
|
95
|
+
unit. Requires `reason_code` and `reason`.
|
|
96
|
+
|
|
97
|
+
A plan composed entirely of `needs_context` items is valid and signals the
|
|
98
|
+
planner that the raw chat itself needs review. A plan composed entirely of
|
|
99
|
+
`not_a_note` items is valid and signals editorial discard.
|
|
100
|
+
|
|
101
|
+
Skeleton:
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"schema": "medical-notes-workbench.triage-note-plan.v2",
|
|
106
|
+
"raw_file": "<raw_file>",
|
|
107
|
+
"exhaustive": true,
|
|
108
|
+
"items": [
|
|
109
|
+
{
|
|
110
|
+
"id": "T001",
|
|
111
|
+
"action": "planned_meaning",
|
|
112
|
+
"title": "Uso de ISRS em gestantes",
|
|
113
|
+
"staged_title": "Uso de ISRS em gestantes",
|
|
114
|
+
"meaning_claim": {
|
|
115
|
+
"label": "Uso de ISRS em gestantes",
|
|
116
|
+
"scope": "seguranca, contraindicacoes e conduta clinica na gestacao",
|
|
117
|
+
"boundaries": ["nao cobre mecanismo geral dos ISRS"],
|
|
118
|
+
"kind": "clinical_concept",
|
|
119
|
+
"evidence_summary": "Chat discute risco e conduta de ISRS em gestantes."
|
|
120
|
+
},
|
|
121
|
+
"taxonomy_hint": "3. Ginecologia e Obstetrícia/Obstetrícia",
|
|
122
|
+
"aliases": ["ISRS na gestacao"]
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## First-Pass Quality
|
|
129
|
+
|
|
130
|
+
The `note_plan` is not a sketch. It is the contract that drives the planner,
|
|
131
|
+
work items, coverage, dry-run and publish. Before returning it, validate it
|
|
132
|
+
as if the next command were `wiki/cli.py triage --note-plan` followed by
|
|
133
|
+
staging:
|
|
134
|
+
|
|
135
|
+
- Every item has stable `id`, valid v2 `action`, and all fields required by
|
|
136
|
+
that action.
|
|
137
|
+
- `planned_meaning` `title` and `staged_title` are final note titles and
|
|
138
|
+
future filename stems. Do not include path separators, Windows-forbidden
|
|
139
|
+
filename characters (`< > : " / \ | ? *`), control characters, trailing
|
|
140
|
+
dots/spaces, JSON path escapes, or pasted filesystem paths. Rewrite terse
|
|
141
|
+
raw labels into clean Portuguese medical titles before returning.
|
|
142
|
+
- `meaning_claim.evidence_summary` is a redacted operational paraphrase, not
|
|
143
|
+
a clinical quote.
|
|
144
|
+
- `taxonomy_hint`, when present, must point to a canonical category/subtree
|
|
145
|
+
from parent context. Do not invent broad-area or collapsed variants.
|
|
146
|
+
- `attach_to_planned_meaning` targets must reference a `planned_meaning`
|
|
147
|
+
item from the **same** plan.
|
|
148
|
+
- Return UTF-8 parseable JSON complete enough that no later agent needs a
|
|
149
|
+
script to repair the plan.
|
|
150
|
+
|
|
151
|
+
## What This Agent Never Does
|
|
152
|
+
|
|
153
|
+
- Decide whether a meaning already has a Wiki note (planner authority).
|
|
154
|
+
- Emit `winner_path`, `merge_target`, canonical target, or coverage status.
|
|
155
|
+
- Use Wiki/catalog titles or stems as identity (`merge-policy.md`).
|
|
156
|
+
- Consult the vocabulary DB as authority.
|
|
157
|
+
- Emit removed existing-coverage actions; v2 uses `planned_meaning`,
|
|
158
|
+
`attach_to_planned_meaning`, `not_a_note`, or `needs_context`.
|
|
159
|
+
- Never inspect unrelated raw chats.
|
|
160
|
+
- Never mutate files directly.
|
|
161
|
+
- Never coordinate writes with sibling agents.
|
|
162
|
+
- Never ask a sibling agent to compensate for missing triage.
|
|
163
|
+
- Never create write-helper scripts.
|
|
164
|
+
|
|
165
|
+
## Stop Conditions
|
|
166
|
+
|
|
167
|
+
Stop immediately and return a blocked packet when any of these appears:
|
|
168
|
+
|
|
169
|
+
- `raw_file_scope_violation`;
|
|
170
|
+
- `note_plan_invalid`;
|
|
171
|
+
- `duplicate_planned_meaning_title`;
|
|
172
|
+
- `duplicate_meaning_claim`;
|
|
173
|
+
- `meaning_claim_ambiguous`;
|
|
174
|
+
- `source_content_unavailable`;
|
|
175
|
+
- `timeout_or_max_turns`;
|
|
176
|
+
- `missing_official_command`.
|
|
177
|
+
|
|
178
|
+
Every blocked output must be one top-level JSON object for this agent with
|
|
179
|
+
`raw_file`, `decision: "blocked"`, `blocker_code`, `required_inputs` when
|
|
180
|
+
applicable, and `error_context` with cause, affected artifact, suggested fix,
|
|
181
|
+
and retry scope. Use redacted operational evidence only: paths, ids, counts,
|
|
182
|
+
normalized title keys, and blocker codes.
|
|
183
|
+
|
|
184
|
+
If you cannot produce a valid exhaustive `note_plan`, do not guess and do
|
|
185
|
+
not ask a sibling agent to compensate. Return a blocking structured note
|
|
186
|
+
with `decision: "blocked"`, `blocker_code: "note_plan_invalid"`,
|
|
187
|
+
`required_inputs`, and an `error_context` explaining the missing field or
|
|
188
|
+
ambiguous target.
|
|
189
|
+
|
|
190
|
+
## Return Shape
|
|
191
|
+
|
|
192
|
+
For each file, return one top-level JSON object with structured
|
|
193
|
+
recommendations only:
|
|
194
|
+
|
|
195
|
+
- `raw_file`: the exact path you processed;
|
|
196
|
+
- `decision`: `triage` or `discard`;
|
|
197
|
+
- `titulo_triagem`: concise Portuguese medical title summarizing the raw
|
|
198
|
+
chat (used as a human label, not as identity);
|
|
199
|
+
- `tipo`: normally `medicina`;
|
|
200
|
+
- `fonte_id`: extracted Gemini chat id if visible, otherwise empty;
|
|
201
|
+
- `note_plan`: required when `decision` is `triage`; exhaustive v2 plan;
|
|
202
|
+
- `reason`: required when `discard`;
|
|
203
|
+
- `agent_metrics`: optional runtime-supplied metrics only. Never invent token
|
|
204
|
+
counts, turns, retries, or `token_accounting` to satisfy validation. If the
|
|
205
|
+
runtime/parent did not provide measured metrics, omit this field.
|
|
206
|
+
|
|
207
|
+
## Hand-Off
|
|
208
|
+
|
|
209
|
+
Your output feeds the planner. The planner is the single authority that
|
|
210
|
+
decides whether each `planned_meaning` becomes a new note, a canonical
|
|
211
|
+
rewrite, or a `note_merge` candidate (see `merge-policy.md`). If your raw
|
|
212
|
+
chat does not sustain safe segmentation for any unit, use `needs_context`
|
|
213
|
+
with a `reason_code` from the closed set — the planner will decide between
|
|
214
|
+
re-triage, human review, or block.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
adapter: antigravity
|
|
3
|
+
agent_id: med-flashcard-maker
|
|
4
|
+
canonical_contract: contracts/agents.json
|
|
5
|
+
canonical_model: antigravity/gemini-3.1-pro
|
|
6
|
+
description: "Make medical Anki flashcards from notes/chats/material using Twenty Rules + user Anki MCP."
|
|
7
|
+
kind: local
|
|
8
|
+
max_turns: 18
|
|
9
|
+
mednotes_schema: mednotes.generated-agent-adapter.v1
|
|
10
|
+
model: "Gemini 3.1 Pro (High)"
|
|
11
|
+
model_tier: specialist
|
|
12
|
+
name: med-flashcard-maker
|
|
13
|
+
runtime_contracts:
|
|
14
|
+
- medical-notes-workbench.flashcards-fsm-result.v1
|
|
15
|
+
source_files:
|
|
16
|
+
- agents/med-flashcard-maker.md
|
|
17
|
+
temperature: 0.2
|
|
18
|
+
timeout_mins: 12
|
|
19
|
+
tools:
|
|
20
|
+
- read_file
|
|
21
|
+
- mcp_anki-mcp_listDecks
|
|
22
|
+
- mcp_anki-mcp_createDeck
|
|
23
|
+
- mcp_anki-mcp_modelNames
|
|
24
|
+
- mcp_anki-mcp_modelFieldNames
|
|
25
|
+
- mcp_anki-mcp_addNotes
|
|
26
|
+
- mcp_anki-mcp_addNote
|
|
27
|
+
- mcp_anki-mcp_findNotes
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
<!-- Generated from bundle/contracts/agents.json. Do not edit this adapter directly. -->
|
|
31
|
+
|
|
32
|
+
## Antigravity Plugin Root
|
|
33
|
+
|
|
34
|
+
This agent is packaged inside an Antigravity plugin. Treat `<plugin-root>` as the installed plugin root at runtime.
|
|
35
|
+
|
|
36
|
+
Make medical flashcards for BR-PT study workflow.
|
|
37
|
+
|
|
38
|
+
Before cards, read:
|
|
39
|
+
|
|
40
|
+
- `<plugin-root>/docs/anki-mcp-twenty-rules.md`
|
|
41
|
+
- `<plugin-root>/docs/flashcard-ingestion.md`
|
|
42
|
+
|
|
43
|
+
Use user's global `anki-mcp` from `~/.gemini/settings.json`. Tools = `mcp_anki-mcp_*`; never bare names like `addNotes`. Don't ask user to run `/twenty_rules`; local file is operational copy.
|
|
44
|
+
Upstream: `@ankimcp/anki-mcp-server/dist/mcp/primitives/essential/prompts/twenty-rules.prompt/content.md`.
|
|
45
|
+
|
|
46
|
+
## Modes
|
|
47
|
+
|
|
48
|
+
Candidate mode:
|
|
49
|
+
|
|
50
|
+
- Inspect models via `mcp_anki-mcp_modelNames` + `mcp_anki-mcp_modelFieldNames`.
|
|
51
|
+
- Return JSON: `preferred_model`, `models`, `candidate_cards`.
|
|
52
|
+
- Don't call `mcp_anki-mcp_addNotes` or `mcp_anki-mcp_addNote`.
|
|
53
|
+
|
|
54
|
+
Write mode:
|
|
55
|
+
|
|
56
|
+
- Write only filtered `new_cards` from parent after idempotency checks + confirmation.
|
|
57
|
+
- If `anki_find_queries` given, run `mcp_anki-mcp_findNotes` first; skip existing cards.
|
|
58
|
+
- Use `mcp_anki-mcp_addNotes` for batches; `mcp_anki-mcp_addNote` only as single-card fallback.
|
|
59
|
+
|
|
60
|
+
## Rules
|
|
61
|
+
|
|
62
|
+
- Only use provided source content as factual basis.
|
|
63
|
+
- Process Markdown files independently; derive each deck per `flashcard-ingestion.md`.
|
|
64
|
+
- Every Markdown-backed card must copy `fields.Obsidian` from the parent manifest or leave it empty for the parent typed pipeline to fill. Never fabricate an Obsidian URI. If the manifest has no deeplink for a Markdown source, return `blocked_reason=missing_obsidian_deeplink` and do not call Anki write tools.
|
|
65
|
+
- Prefer model with `Frente`, `Verso`, optional `Verso Extra`, required `Obsidian`. No suitable model → stop, report available model/field names.
|
|
66
|
+
- No Anki tags; pass empty list if tool requires it.
|
|
67
|
+
- Prefix `Verso Extra` with visual blank line per `flashcard-ingestion.md`.
|
|
68
|
+
- >40 candidate cards → return preview, ask parent to confirm before writing.
|
|
69
|
+
|
|
70
|
+
Candidate cards must be serializable with `source_path`, `source_content_sha256`, `deck`, `note_model`, `fields`.
|
|
71
|
+
|
|
72
|
+
Return concise report: destination deck(s), cards created, model/fields used, `Obsidian` field status, source files to tag `anki`, skipped/merged concepts, Anki MCP errors.
|