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
|
@@ -0,0 +1,758 @@
|
|
|
1
|
+
# Política De Version Control Do Vault
|
|
2
|
+
|
|
3
|
+
Define como agentes (Claude Code, Gemini CLI, Codex, OpenCode, subagents) registram mutações textuais do vault Obsidian em git/GitHub. Objetivo: rastreabilidade total — quem mexeu, em qual nota, qual workflow, quando, por quê.
|
|
4
|
+
|
|
5
|
+
Escopo: vault de notas médicas (`wiki_dir` via `medical-notes-workbench.paths.v1`). Não se aplica ao workbench (tem política própria).
|
|
6
|
+
|
|
7
|
+
## Modelo Público
|
|
8
|
+
|
|
9
|
+
Para usuário leigo, Git é invisível. Experiência pública:
|
|
10
|
+
|
|
11
|
+
- **ponto de restauração**: estado seguro salvo antes/depois de mutação real;
|
|
12
|
+
- **histórico**: lista desses pontos;
|
|
13
|
+
- **preview de restauração**: mostra o que seria restaurado sem alterar nada;
|
|
14
|
+
- **restaurar**: aplica preview confirmado e cria novo ponto de restauração.
|
|
15
|
+
|
|
16
|
+
Termos `commit`, `branch`, `merge`, `rebase`, `worktree` são detalhes técnicos. Slash commands e respostas finais só os usam se usuário pedir.
|
|
17
|
+
|
|
18
|
+
## Princípios
|
|
19
|
+
|
|
20
|
+
1. **Commit antes, commit depois em workflow mutante.** Working tree sujo antes de uma mutação real → agente primeiro fecha em commit `snapshot:` (isola humano do agente), depois muta e fecha cada lote em commit próprio. `/mednotes:setup` é exceção: se o Git já existe, ele preserva mudanças abertas e não cria snapshot só para limpar o estado.
|
|
21
|
+
2. **Um lote = um commit.** 50 notas num run = **um** commit. Não commitar por arquivo.
|
|
22
|
+
3. **Identidade por agente.** Trailers no corpo identificam workflow, tool e
|
|
23
|
+
run-id. O author/committer Git usa a identidade nativa do agente/TUI quando
|
|
24
|
+
ela existir. Isso preserva a autoria textual do commit. Para o GitHub
|
|
25
|
+
mostrar avatar, link e filtro por autor, o email dessa identidade precisa
|
|
26
|
+
pertencer a uma conta GitHub real ou bot; se não existir, cai no fallback
|
|
27
|
+
local fixo. GPG opcional — política depende de honestidade do agente.
|
|
28
|
+
4. **Commita local, sincroniza, empurra.** Modo sequencial: fecha estado sujo local (`snapshot:` antes, commit identificado depois). Depois `git fetch origin main` + `git rebase origin/main` + `git push origin main`. Evita rebase com working tree sujo. Falha de rede não desfaz commit local; próximo run empurra backlog. Conflito de rebase = humano; agente nunca auto-resolve.
|
|
29
|
+
5. **`main` é branch de integração.** Fluxo direto em `main` para runs sequenciais e compatibilidade. Runs paralelos usam `git worktree` separado e branch `vault/<agent>/<run-id>`; integrados em `main` por merge textual limpo. Conflito real = decisão humana, sem resolver conteúdo clínico automaticamente.
|
|
30
|
+
6. **Auth herdada do usuário.** Scripts não armazenam token nem pedem senha. Workflows mutantes usam credenciais git globais do ambiente; `/mednotes:setup`, com confirmação humana, pode abrir o fluxo oficial do GitHub CLI para reparar login/credential helper.
|
|
31
|
+
7. **Português no commit.** Título e corpo em português do Brasil. Trailers em inglês (chaves estruturadas).
|
|
32
|
+
|
|
33
|
+
## Gemini CLI Hook Guard
|
|
34
|
+
|
|
35
|
+
O Gemini CLI Hook Guard é uma camada defensiva empacotada e registrada em
|
|
36
|
+
`hooks.json` para enforcement local de FSM/vault. Ele não envia telemetria
|
|
37
|
+
remota automática e fica silencioso quando não há cartão FSM ativo, enquanto a
|
|
38
|
+
UX pública continua sendo conduzida pelos workflows e pelo `vault_git.py`.
|
|
39
|
+
|
|
40
|
+
O modo `guard-vault-before` bloqueia escrita direta no vault sem ponto de
|
|
41
|
+
restauração ativo, bloqueia Git direto no vault mesmo com lease e permite
|
|
42
|
+
`vault_git.py run-start` para abrir a proteção. Os modos FSM capturam somente
|
|
43
|
+
JSON oficial com `agent_directive`, injetam contexto curto e bloqueiam P0 quando
|
|
44
|
+
a directive ativa proíbe a ação. O agente deve abrir e fechar a proteção uma vez
|
|
45
|
+
por lote, não uma vez por nota.
|
|
46
|
+
|
|
47
|
+
## Identidades
|
|
48
|
+
|
|
49
|
+
`Agent:` é a identidade operacional canônica do Workbench. O author Git é a
|
|
50
|
+
camada visual/de auditoria do GitHub.
|
|
51
|
+
|
|
52
|
+
Quando o Gemini CLI, OpenCode, Codex ou outro ambiente já expõe uma identidade
|
|
53
|
+
Git nativa (por exemplo depois de um setup GitHub da própria TUI), `vault_git.py`
|
|
54
|
+
herda essa identidade nos commits do resultado do workflow e salva o mapeamento
|
|
55
|
+
por agente em `~/.mednotes/vault.git-identities.json`.
|
|
56
|
+
Runs futuros do mesmo agente reutilizam essa identidade mesmo que o processo
|
|
57
|
+
seguinte não exponha mais as variáveis Git nativas.
|
|
58
|
+
|
|
59
|
+
Importante: author Git e autor GitHub clicável não são a mesma camada. Git
|
|
60
|
+
aceita qualquer `Nome <email>`. O GitHub só mostra logo/avatar, link de perfil e
|
|
61
|
+
filtro por autor quando o email do commit resolve para uma conta GitHub
|
|
62
|
+
reconhecida. Para contas modernas com email privado, o formato esperado costuma
|
|
63
|
+
ser o no-reply oficial `ID+login@users.noreply.github.com`. Um email inventado
|
|
64
|
+
ou genérico como `gemini-cli@users.noreply.github.com` pode preservar a autoria
|
|
65
|
+
textual, mas aparecer sem avatar e sem link. O payload do setup/commit expõe
|
|
66
|
+
`git_identity_github_attribution` para o agente traduzir essa diferença sem
|
|
67
|
+
pedir que o usuário mexa manualmente no Workbench.
|
|
68
|
+
|
|
69
|
+
Se nenhuma identidade nativa/configurada existir, o fallback continua:
|
|
70
|
+
|
|
71
|
+
| Agente | Author git fallback | Email fallback |
|
|
72
|
+
| --- | --- | --- |
|
|
73
|
+
| Claude Code | `claude-code` | `claude-code@medical-notes` |
|
|
74
|
+
| Gemini CLI | `gemini-cli` | `gemini-cli@medical-notes` |
|
|
75
|
+
| Codex | `codex` | `codex@medical-notes` |
|
|
76
|
+
| Subagent genérico | `<nome-do-subagent>` | `<nome>@medical-notes` |
|
|
77
|
+
| Snapshot pré-agente | `snapshot` | `snapshot@medical-notes` |
|
|
78
|
+
| Edição humana | (config global do usuário) | (config global do usuário) |
|
|
79
|
+
|
|
80
|
+
Snapshots pré-agente sempre usam `snapshot <snapshot@medical-notes>`, mesmo se
|
|
81
|
+
o ambiente do agente tiver identidade GitHub nativa; isso separa mudanças
|
|
82
|
+
humanas/prévias das mutações do workflow. Agentes não devem rodar `git commit`
|
|
83
|
+
direto na Wiki nem configurar email manualmente durante um workflow: devem
|
|
84
|
+
entrar por `run-start`/`run-finish` ou pelos wrappers oficiais, que preservam a
|
|
85
|
+
autoria nativa e adicionam trailers estruturados.
|
|
86
|
+
|
|
87
|
+
Subagents dentro de workflow (ex: `body-linker`, `note-merge`) podem usar identidade própria quando lote todo é atribuível a eles, ou identidade do orquestrador com trailer `Subagent:`. Política conservadora: usar orquestrador, marcar subagent em trailer.
|
|
88
|
+
|
|
89
|
+
## Formato Do Commit
|
|
90
|
+
|
|
91
|
+
### Linha 1 (título)
|
|
92
|
+
|
|
93
|
+
- Imperativo presente, português.
|
|
94
|
+
- Até 72 caracteres.
|
|
95
|
+
- Estrutura: `<verbo>(<escopo>): <descrição curta>`.
|
|
96
|
+
- Verbos canônicos: `cria`, `atualiza`, `remove`, `renomeia`, `move`, `mescla`, `enriquece`, `linka`, `repara`, `publica`, `snapshot`.
|
|
97
|
+
- Escopo: nome curto da categoria/pasta/workflow afetado.
|
|
98
|
+
|
|
99
|
+
Exemplos:
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
enriquece(cardiologia): adiciona imagens em 3 notas de IAM
|
|
103
|
+
cria(neuro): nova nota sobre AVC isquêmico
|
|
104
|
+
linka(batch): reescreve WikiLinks após merge de duplicatas
|
|
105
|
+
repara(grafo): remove 12 links danglings após delete manual
|
|
106
|
+
publica(chats): publica 5 notas do batch process-chats 2026-05-14
|
|
107
|
+
snapshot: estado antes de /mednotes:enrich rodar
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Linha 2 (em branco)
|
|
111
|
+
|
|
112
|
+
### Corpo
|
|
113
|
+
|
|
114
|
+
- Antes de escrever o corpo, o agente examina o diff da Wiki: notas `.md`,
|
|
115
|
+
movimentos, deletes, merges, linker e artefatos de workflow.
|
|
116
|
+
- O script registra detalhes operacionais fora da Wiki, como `.obsidian/`, em
|
|
117
|
+
bloco separado. O agente não precisa interpretar esse diff para escrever a
|
|
118
|
+
narrativa principal.
|
|
119
|
+
- Arquivos `.obsidian/` são importantes para operação do vault; não ignore nem
|
|
120
|
+
descarte.
|
|
121
|
+
- Lista das notas tocadas (até ~20 caminhos; acima, agrupar por categoria com contagem).
|
|
122
|
+
- Workflow que disparou a mutação.
|
|
123
|
+
- Métricas: notas criadas/modificadas/movidas/removidas.
|
|
124
|
+
- Validações: dry-run, testes, recibo.
|
|
125
|
+
- Erros/warnings ignorados intencionalmente.
|
|
126
|
+
|
|
127
|
+
### Trailers
|
|
128
|
+
|
|
129
|
+
Separados do corpo por linha em branco. Chave-valor, uma por linha. Chaves em inglês.
|
|
130
|
+
|
|
131
|
+
Obrigatórios:
|
|
132
|
+
|
|
133
|
+
- `Agent:` — mesmo que author (redundância para grep).
|
|
134
|
+
- `Workflow:` — slash command ou identificador (`/mednotes:enrich`, `/mednotes:link`, `manual`, `extension-internal`).
|
|
135
|
+
- `Run-Id:` — timestamp ISO-8601 UTC do início do run (`2026-05-14T14-30-00Z`).
|
|
136
|
+
|
|
137
|
+
Opcionais:
|
|
138
|
+
|
|
139
|
+
- `Tool:` — script/binário que mutou (`enrich_notes.py`, `run-linker`, `publish-batch`).
|
|
140
|
+
- `Subagent:` — quando aplicável (`body-linker`, `note-merge`).
|
|
141
|
+
- `Trigger-Context:` — caminho relativo do `trigger-context.json` quando commit dispara handoff pro linker.
|
|
142
|
+
- `Receipt:` — caminho relativo do recibo JSON quando emitido.
|
|
143
|
+
- `Notes-Touched:` — contagem total quando corpo agrupou por categoria.
|
|
144
|
+
- `Branch:` — branch `vault/<agent>/<run-id>` quando commit feito em worktree paralelo.
|
|
145
|
+
|
|
146
|
+
Commits de merge por `integrate` usam trailers próprios para documentar o que entrou em `main`:
|
|
147
|
+
|
|
148
|
+
- `Integrated-Branch:`
|
|
149
|
+
- `Integrated-Agent:`
|
|
150
|
+
- `Integrated-Workflow:`
|
|
151
|
+
- `Integrated-Run-Id:`
|
|
152
|
+
|
|
153
|
+
### Exemplo Completo
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
enriquece(cardiologia): adiciona imagens em 3 notas de IAM
|
|
157
|
+
|
|
158
|
+
Notas modificadas:
|
|
159
|
+
- #. Cardiologia/Infarto Agudo do Miocardio.md
|
|
160
|
+
- #. Cardiologia/Sindrome Coronariana Aguda.md
|
|
161
|
+
- #. Cardiologia/Angina Instavel.md
|
|
162
|
+
|
|
163
|
+
Workflow /mednotes:enrich rodou em modo apply. 9 imagens inseridas (3 anatomia,
|
|
164
|
+
4 esquemas, 2 radiologia). Frontmatter images_* atualizado. Caption em portugues
|
|
165
|
+
gerada via Gemini. Ponto de restauracao do vault criado antes da mutacao.
|
|
166
|
+
|
|
167
|
+
Validacoes: dry-run conferido antes; receipt em .runs/2026-05-14T14-30-00Z/.
|
|
168
|
+
|
|
169
|
+
Agent: claude-code
|
|
170
|
+
Workflow: /mednotes:enrich
|
|
171
|
+
Tool: enrich_notes.py
|
|
172
|
+
Run-Id: 2026-05-14T14-30-00Z
|
|
173
|
+
Receipt: .runs/2026-05-14T14-30-00Z/enrich-receipt.json
|
|
174
|
+
Notes-Touched: 3
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Snapshot Pré-Agente
|
|
178
|
+
|
|
179
|
+
Antes de qualquer mutação:
|
|
180
|
+
|
|
181
|
+
1. O script roda `git status --short --untracked-files=all`, observa diff do
|
|
182
|
+
vault e registra no commit resumo seguro. O agente examina só o diff da Wiki
|
|
183
|
+
para decidir a narrativa; arquivos `.obsidian/` são preservados e
|
|
184
|
+
versionados quando aparecem, mas entram em seção operacional separada, fora
|
|
185
|
+
do foco narrativo.
|
|
186
|
+
2. Se houver `modified`/`added`/`deleted`/`untracked` (não no `.gitignore`), faz `git add -A` e commita com author `snapshot`:
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
snapshot: estado antes de <agente> rodar <workflow>
|
|
190
|
+
|
|
191
|
+
Capturado automaticamente para isolar mutacoes do humano das que o agente fara
|
|
192
|
+
a seguir. Conteudo pode ser edicao manual no Obsidian, sincronizacao do plugin,
|
|
193
|
+
ou trabalho em andamento.
|
|
194
|
+
|
|
195
|
+
Alteracoes observadas antes do snapshot:
|
|
196
|
+
|
|
197
|
+
Mudancas na Wiki observadas antes do snapshot:
|
|
198
|
+
- M Cardiologia/IAM.md
|
|
199
|
+
- ?? Pneumo/Nova nota.md
|
|
200
|
+
|
|
201
|
+
Arquivos operacionais do Obsidian observados:
|
|
202
|
+
- M .obsidian/workspace.json
|
|
203
|
+
|
|
204
|
+
Diffstat da Wiki rastreada:
|
|
205
|
+
- Cardiologia/IAM.md | 12 +++++++-----
|
|
206
|
+
|
|
207
|
+
Diffstat operacional do Obsidian:
|
|
208
|
+
- .obsidian/workspace.json | 4 ++--
|
|
209
|
+
|
|
210
|
+
Agent: snapshot
|
|
211
|
+
Workflow: pre-agent-snapshot
|
|
212
|
+
Run-Id: <timestamp>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
3. Faz `git fetch origin main` + `git rebase origin/main` + `git push origin
|
|
216
|
+
main`. Conflito no rebase → aborta e pede resolução humana.
|
|
217
|
+
4. Agente prossegue com working tree limpo e snapshot local preservado.
|
|
218
|
+
|
|
219
|
+
Se `git status` limpo, pula snapshot.
|
|
220
|
+
|
|
221
|
+
## Modos De Trabalho
|
|
222
|
+
|
|
223
|
+
Dois modos canônicos.
|
|
224
|
+
|
|
225
|
+
**Modo sequencial em `main`:** fluxo histórico, simples, compatível com launchers antigos. Usar quando só um agente mexe no vault por vez, ou usuário trabalhando diretamente no checkout do Obsidian.
|
|
226
|
+
|
|
227
|
+
```mermaid
|
|
228
|
+
flowchart TD
|
|
229
|
+
A[Agente vai mutar vault em main] --> B{git status sujo?}
|
|
230
|
+
B -->|sim| C[vault_precommit: commit snapshot local]
|
|
231
|
+
B -->|nao| D[Prossegue]
|
|
232
|
+
C --> C1[fetch + rebase origin/main + push]
|
|
233
|
+
C1 --> C2{Rebase OK?}
|
|
234
|
+
C2 -->|conflito| ABORT[Sai com erro, humano resolve]
|
|
235
|
+
C2 -->|sim| D
|
|
236
|
+
D --> E[Agente faz suas mutacoes]
|
|
237
|
+
E --> E1[vault_commit: commit local com identidade + trailers]
|
|
238
|
+
E1 --> E2[fetch + rebase origin/main + push]
|
|
239
|
+
E2 --> E3{Rebase OK?}
|
|
240
|
+
E3 -->|conflito| ABORT
|
|
241
|
+
E3 -->|sim| G{Mais lotes no mesmo run?}
|
|
242
|
+
G -->|sim| E
|
|
243
|
+
G -->|nao| H[Fim]
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Modo paralelo por worktree:** para agentes simultâneos. Cada run ganha checkout próprio fora do vault aberto no Obsidian:
|
|
247
|
+
|
|
248
|
+
```text
|
|
249
|
+
~/.mednotes/vault-worktrees/<run-id>-<agent>
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Agente edita só o worktree da sua branch. Checkout principal do vault permanece em `main`, limpo e pronto para integrar.
|
|
253
|
+
|
|
254
|
+
```mermaid
|
|
255
|
+
flowchart TD
|
|
256
|
+
A[branch-start] --> B[Valida vault principal em main]
|
|
257
|
+
B --> C{main sujo?}
|
|
258
|
+
C -->|sim| D[Cria snapshot pre-agente em main]
|
|
259
|
+
C -->|nao| E[Sincroniza main]
|
|
260
|
+
D --> E1[fetch + rebase origin/main + push]
|
|
261
|
+
E1 --> F[Cria branch vault/agent/run-id]
|
|
262
|
+
E --> F
|
|
263
|
+
F --> G[Cria worktree local isolado]
|
|
264
|
+
G --> H[Agente edita o worktree]
|
|
265
|
+
H --> I[branch-commit]
|
|
266
|
+
I --> J[Commit com identidade + trailers]
|
|
267
|
+
J --> K[Push da branch]
|
|
268
|
+
K --> L[integrate em main limpo]
|
|
269
|
+
L --> M{git merge textual limpo?}
|
|
270
|
+
M -->|sim| N[Merge commit documentado + push main]
|
|
271
|
+
M -->|conflito| O[Abort merge, lista conflitos, humano decide]
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Merge automático = "Git conseguiu mesclar texto sem conflito". Duas branches editando mesma linha, ou contexto ambíguo → `integrate` aborta, lista arquivos conflitados, para. Agente não escolhe versão clínica.
|
|
275
|
+
|
|
276
|
+
## Scripts Auxiliares
|
|
277
|
+
|
|
278
|
+
Scripts canônicos em `bundle/scripts/vault/` no repo fonte, copiados para `dist/gemini-cli-bundle/scripts/vault/` no bundle:
|
|
279
|
+
|
|
280
|
+
- `bundle/scripts/vault/vault_git.py` - núcleo cross-platform, sem deps fora da stdlib, com subcomandos `setup`, `precommit`, `commit`, `run-start`, `run-finish`, `timeline`, `restore-preview`, `restore-apply`, `guard-status`, `branch-start`, `branch-commit` e `integrate`.
|
|
281
|
+
- `bundle/scripts/vault/vault_git.sh` - wrapper Bash genérico.
|
|
282
|
+
- `bundle/scripts/vault/vault_git.ps1` - wrapper PowerShell genérico.
|
|
283
|
+
- `bundle/scripts/vault/vault_precommit.sh` - wrapper Bash para macOS/Linux/Git Bash.
|
|
284
|
+
- `bundle/scripts/vault/vault_commit.sh` - wrapper Bash para macOS/Linux/Git Bash.
|
|
285
|
+
- `bundle/scripts/vault/vault_precommit.ps1` - wrapper PowerShell para Windows.
|
|
286
|
+
- `bundle/scripts/vault/vault_commit.ps1` - wrapper PowerShell para Windows.
|
|
287
|
+
|
|
288
|
+
Wrappers exigem `uv run --project <raiz> ...` para executar Python. Se `uv` não existir, eles bloqueiam e apontam setup/bootstrap oficial; não há fallback para `python`/`python3`/`py` do sistema. Regra operacional toda em `vault_git.py` — sem duas políticas divergentes entre Bash e PowerShell.
|
|
289
|
+
|
|
290
|
+
Política **não** depende de `bundle/policies/` nem de mecanismo `policies/` da Gemini CLI. Arquivo distribuído em `bundle/docs/` e no bundle em `docs/`, junto dos demais contratos duráveis.
|
|
291
|
+
|
|
292
|
+
### Interface Semântica
|
|
293
|
+
|
|
294
|
+
Workflows públicos devem preferir comandos semânticos:
|
|
295
|
+
|
|
296
|
+
- `setup`: prepara proteção local, guia login GitHub e propõe repositório
|
|
297
|
+
privado para backup online.
|
|
298
|
+
- `run-start`: prepara ponto de restauração antes de mutação real; funciona
|
|
299
|
+
mesmo sem GitHub. A lease técnica aberta para o agente cobre workflows
|
|
300
|
+
longos, e comandos mutantes oficiais renovam essa janela ao entrar pela
|
|
301
|
+
guarda para que um lote legítimo não pareça sem `run-start` no recibo final.
|
|
302
|
+
- `run-finish`: fecha run e salva ponto de restauração resultante. Mesmo quando
|
|
303
|
+
não há mudança nova, tenta sincronizar pontos locais pendentes para o backup
|
|
304
|
+
online; se não houver remoto, mantém tudo local e retorna
|
|
305
|
+
`sync_status=skipped_no_remote`. Sem `--run-id`, só fecha automaticamente
|
|
306
|
+
quando existe uma lease ativa única para o mesmo vault, agente e workflow; se
|
|
307
|
+
não houver lease ou houver múltiplas, bloqueia e pede o `--run-id` correto.
|
|
308
|
+
`--run-id ""` é placeholder vazio: bloqueia, não fecha lease e pede o
|
|
309
|
+
`run_id` real emitido por `run-start`. Com `--run-id` explícito, se houver
|
|
310
|
+
lease ativa para o mesmo vault, agente e workflow, o valor precisa ser o
|
|
311
|
+
`run_id` literal emitido por `run-start`; versão normalizada/compactada
|
|
312
|
+
bloqueia como `guard_lease_mismatch` e mantém a lease aberta.
|
|
313
|
+
Relatório público só pode dizer que o guard fechou com
|
|
314
|
+
`guard_lease.status=closed` ou `guard-status` retornando `active_count=0`.
|
|
315
|
+
Em workflows conduzidos por agente, prefira `run-finish --public-json --json`
|
|
316
|
+
para a saída lida pelo modelo: ela preserva `version_control_safety` e remove
|
|
317
|
+
`run_id`, `guard_lease`, lease path e hash de ponto de restauração do stdout.
|
|
318
|
+
- `timeline`: lista pontos de restauração para `/mednotes:history`, reporta se
|
|
319
|
+
há pontos locais pendentes de backup online e não altera o vault. Aceita
|
|
320
|
+
`--since` e `--until` e funciona local-only.
|
|
321
|
+
- `restore-preview`: mostra arquivos que seriam restaurados, sem alterar vault.
|
|
322
|
+
- `restore-apply`: aplica somente preview confirmado e cria novo ponto de restauração. Se houver mudanças abertas e histórico ainda bater com preview, salva automaticamente ponto antes de restaurar.
|
|
323
|
+
- `guard-status`: mostra leases ativos da trava técnica sem conteúdo clínico;
|
|
324
|
+
usado por `/mednotes:status`, testes e diagnóstico de suporte.
|
|
325
|
+
|
|
326
|
+
Comandos técnicos (`precommit`, `commit`, `branch-start`, `branch-commit`, `integrate`) existem para compatibilidade e implementação da política, mas não são interface mental do usuário.
|
|
327
|
+
`precommit`/`commit` também podem operar só localmente; `branch-start`,
|
|
328
|
+
`branch-commit` e `integrate` exigem backup online/remoto no v1 porque
|
|
329
|
+
coordenam runs paralelos. Sem remoto, esses comandos retornam
|
|
330
|
+
`blocked_online_backup_required` e apontam para `/mednotes:setup`.
|
|
331
|
+
|
|
332
|
+
Data do último ponto de restauração e estado do backup online são coisas
|
|
333
|
+
diferentes. Um ponto criado há dois dias continua com essa data mesmo se for
|
|
334
|
+
enviado ao backup online hoje. Por isso `timeline` expõe `backup_status`:
|
|
335
|
+
`synced`, `local_checkpoints_pending`, `remote_changes_pending`, `diverged`,
|
|
336
|
+
`unavailable` ou `skipped_no_remote`.
|
|
337
|
+
|
|
338
|
+
### Guard De Runtime Local
|
|
339
|
+
|
|
340
|
+
O bundle Gemini CLI registra hooks locais de FSM/vault. Eles não substituem a
|
|
341
|
+
proteção determinística: workflows públicos ainda devem chamar
|
|
342
|
+
`vault_git.py run-start` e `run-finish`. O guard é por run/lote, não por nota:
|
|
343
|
+
abra `run-start` uma vez por lote, altere todas as notas do lote e feche com
|
|
344
|
+
`run-finish` uma vez por lote no
|
|
345
|
+
final.
|
|
346
|
+
|
|
347
|
+
Scripts fonte de hook podem permanecer no repositório para histórico e testes
|
|
348
|
+
diretos, mas não são a proteção distribuída. Se hooks não estiverem
|
|
349
|
+
disponíveis, isso é o estado esperado: os CLIs oficiais que mutam o vault ainda
|
|
350
|
+
devem chamar `bundle/scripts/mednotes/vault_guard.py`.
|
|
351
|
+
|
|
352
|
+
Modo degradado:
|
|
353
|
+
|
|
354
|
+
- sem `vault.path`, os workflows públicos devem bloquear antes de mutação e
|
|
355
|
+
orientar `/mednotes:setup`;
|
|
356
|
+
- se `[paths].raw_dir` estiver configurado, edição direta de raw chats `.md`
|
|
357
|
+
continua proibida; corpo de raw chat é imutável e YAML/status só muda por
|
|
358
|
+
`wiki/cli.py` (`triage`, `discard`, `publish-batch`);
|
|
359
|
+
- os CLIs oficiais que mutam o vault devem chamar
|
|
360
|
+
`bundle/scripts/mednotes/vault_guard.py`;
|
|
361
|
+
- se uma operação legítima for bloqueada, rode o workflow público correto
|
|
362
|
+
(`/mednotes:fix-wiki`, `/mednotes:link`, `/mednotes:enrich`, etc.).
|
|
363
|
+
|
|
364
|
+
Bloqueios usam `status=blocked_vault_guard_required`,
|
|
365
|
+
`blocked_reason=vault_guard_required`, `recovery_command` e `required_inputs`
|
|
366
|
+
para que o agente saiba como retomar sem exigir que o usuário entenda Git.
|
|
367
|
+
|
|
368
|
+
### Resolução Do Caminho Do Vault
|
|
369
|
+
|
|
370
|
+
Scripts resolvem caminho do vault nesta ordem:
|
|
371
|
+
|
|
372
|
+
1. Flag `--vault-dir <path>` (intenção explícita do caller).
|
|
373
|
+
2. Variável de ambiente `VAULT_DIR`.
|
|
374
|
+
3. Arquivo `~/.mednotes/vault.path` (uma linha com caminho absoluto; espaços e CRLF preservados).
|
|
375
|
+
4. Erro fatal — caller precisa configurar uma das opções acima.
|
|
376
|
+
|
|
377
|
+
Garante que agente rodando de outro diretório (worktree do workbench, shell em outro lugar) encontra vault correto sem depender da CWD.
|
|
378
|
+
|
|
379
|
+
**Setup recomendado uma vez:**
|
|
380
|
+
|
|
381
|
+
```bash
|
|
382
|
+
echo "/Users/<voce>/Documents/<seu-vault>" \
|
|
383
|
+
> ~/.mednotes/vault.path
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
```powershell
|
|
387
|
+
New-Item -ItemType Directory -Force "$HOME\.mednotes"
|
|
388
|
+
Set-Content -Encoding utf8 "$HOME\.mednotes\vault.path" `
|
|
389
|
+
"C:\Users\<voce>\Documents\<seu-vault>"
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### Validação Anti-Engano
|
|
393
|
+
|
|
394
|
+
Antes de qualquer mutação, scripts validam que caminho resolvido é **realmente o vault**, não outro repo (ex: workbench, que também tem `main` e `.git/`). Checagens:
|
|
395
|
+
|
|
396
|
+
1. **Caminho é raiz do repo git** — validado com `git rev-parse`, inclusive quando `.git` é arquivo de worktree.
|
|
397
|
+
2. **Paths persistidos batem com a raiz Git** — quando `~/.mednotes/config.toml` contém `[paths].wiki_dir`, essa pasta precisa estar dentro da raiz Git validada. Se o caller passar o próprio `wiki_dir` e ele já estiver dentro de um repo Git compatível, o script resolve para a raiz Git antes de gravar `vault.path`.
|
|
398
|
+
3. **Branch principal segura** — repo novo nasce em `main`; repo existente em
|
|
399
|
+
outra branch bloqueia com `blocked_branch_confirmation_required` em vez de
|
|
400
|
+
renomear automaticamente.
|
|
401
|
+
4. **Remote `origin` quando existir** — proteção local não exige GitHub. Se
|
|
402
|
+
`origin` existir, ele é validado para sincronização; se faltar, comandos
|
|
403
|
+
locais retornam `backup_online=false`.
|
|
404
|
+
5. **Allowlist de remote** — se `~/.mednotes/vault.remote-allowlist` existir, URL do `origin` deve constar lá (uma URL por linha; CRLF aceito). Se arquivo não existir, só imprime warning. Se existir e não bater, **bloqueia antes de sincronizar online**.
|
|
405
|
+
|
|
406
|
+
**Setup recomendado uma vez:** rode `/mednotes:setup` ou o comando oficial
|
|
407
|
+
`scripts/vault/vault_git.py setup` depois de persistir `[paths].wiki_dir` e
|
|
408
|
+
`[paths].raw_dir` pela API `set-paths`. Esse fluxo grava `vault.path`, valida a
|
|
409
|
+
raiz Git contra o `wiki_dir` configurado, mantém allowlist de remoto e ativa
|
|
410
|
+
backup online quando disponível. Se o Git já existe, o setup preserva o
|
|
411
|
+
histórico e não cria snapshot para "limpar" mudanças humanas ou de plugins; se
|
|
412
|
+
o setup criou a proteção local pela primeira vez, ele cria o primeiro ponto a
|
|
413
|
+
partir do estado atual. Não crie arquivos de contexto para corrigir paths
|
|
414
|
+
durante um workflow; se os caminhos mudaram, chame `set-paths` e repita
|
|
415
|
+
`/mednotes:setup`.
|
|
416
|
+
|
|
417
|
+
Allowlist é defesa final: `--vault-dir` apontando acidentalmente pro workbench
|
|
418
|
+
ou para outro repo não compatível com `[paths].wiki_dir` faz o script parar
|
|
419
|
+
antes de empurrar para a origem errada.
|
|
420
|
+
|
|
421
|
+
### Uso Sequencial Em `main`
|
|
422
|
+
|
|
423
|
+
Antes do agente mutar:
|
|
424
|
+
|
|
425
|
+
```bash
|
|
426
|
+
bundle/scripts/vault/vault_precommit.sh \
|
|
427
|
+
--agent claude-code \
|
|
428
|
+
--workflow /mednotes:enrich
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
```powershell
|
|
432
|
+
.\extension\scripts\vault\vault_precommit.ps1 `
|
|
433
|
+
--agent claude-code `
|
|
434
|
+
--workflow /mednotes:enrich
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
Após o agente mutar:
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
bundle/scripts/vault/vault_commit.sh \
|
|
441
|
+
--agent claude-code \
|
|
442
|
+
--workflow /mednotes:enrich \
|
|
443
|
+
--tool enrich_notes.py \
|
|
444
|
+
--run-id 2026-05-14T14-30-00Z \
|
|
445
|
+
--title "enriquece(cardiologia): adiciona imagens em 3 notas de IAM" \
|
|
446
|
+
--body-file .runs/2026-05-14T14-30-00Z/commit-body.txt
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
```powershell
|
|
450
|
+
.\extension\scripts\vault\vault_commit.ps1 `
|
|
451
|
+
--agent claude-code `
|
|
452
|
+
--workflow /mednotes:enrich `
|
|
453
|
+
--tool enrich_notes.py `
|
|
454
|
+
--run-id 2026-05-14T14-30-00Z `
|
|
455
|
+
--title "enriquece(cardiologia): adiciona imagens em 3 notas de IAM" `
|
|
456
|
+
--body-file .runs\2026-05-14T14-30-00Z\commit-body.txt
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
`--body-file` continua recomendado para o relato escrito pelo agente. Se ele
|
|
460
|
+
for omitido, o script gera um `Registro de entrega` legível a partir do diff da
|
|
461
|
+
Wiki; arquivos operacionais do Obsidian e trailers técnicos ficam separados no
|
|
462
|
+
fim da mensagem.
|
|
463
|
+
|
|
464
|
+
### Uso Paralelo Por Branch/Worktree
|
|
465
|
+
|
|
466
|
+
Criar branch/worktree isolada para um run:
|
|
467
|
+
|
|
468
|
+
```bash
|
|
469
|
+
bundle/scripts/vault/vault_git.sh branch-start \
|
|
470
|
+
--agent gemini-cli \
|
|
471
|
+
--workflow /mednotes:fix-wiki \
|
|
472
|
+
--run-id 2026-05-14T14-30-00Z
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
```powershell
|
|
476
|
+
.\extension\scripts\vault\vault_git.ps1 branch-start `
|
|
477
|
+
--agent gemini-cli `
|
|
478
|
+
--workflow /mednotes:fix-wiki `
|
|
479
|
+
--run-id 2026-05-14T14-30-00Z
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
Script cria branch sanitizada (sem espaços) no formato:
|
|
483
|
+
|
|
484
|
+
```text
|
|
485
|
+
vault/gemini-cli/2026-05-14T14-30-00Z
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
E worktree local em:
|
|
489
|
+
|
|
490
|
+
```text
|
|
491
|
+
~/.mednotes/vault-worktrees/2026-05-14T14-30-00Z-gemini-cli
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
Após agente editar, commitar e empurrar a branch:
|
|
495
|
+
|
|
496
|
+
```bash
|
|
497
|
+
bundle/scripts/vault/vault_git.sh branch-commit \
|
|
498
|
+
--agent gemini-cli \
|
|
499
|
+
--workflow /mednotes:fix-wiki \
|
|
500
|
+
--run-id 2026-05-14T14-30-00Z \
|
|
501
|
+
--tool run-linker \
|
|
502
|
+
--title "repara(grafo): atualiza links em branch paralela" \
|
|
503
|
+
--body-file .runs/2026-05-14T14-30-00Z/commit-body.txt
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
```powershell
|
|
507
|
+
.\extension\scripts\vault\vault_git.ps1 branch-commit `
|
|
508
|
+
--agent gemini-cli `
|
|
509
|
+
--workflow /mednotes:fix-wiki `
|
|
510
|
+
--run-id 2026-05-14T14-30-00Z `
|
|
511
|
+
--tool run-linker `
|
|
512
|
+
--title "repara(grafo): atualiza links em branch paralela" `
|
|
513
|
+
--body-file .runs\2026-05-14T14-30-00Z\commit-body.txt
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
Se `branch-commit` chamado de dentro do próprio worktree, `--run-id` pode ser omitido; script lê branch atual `vault/<agent>/<run-id>`.
|
|
517
|
+
|
|
518
|
+
Integrar branch em `main`:
|
|
519
|
+
|
|
520
|
+
```bash
|
|
521
|
+
bundle/scripts/vault/vault_git.sh integrate \
|
|
522
|
+
--branch vault/gemini-cli/2026-05-14T14-30-00Z \
|
|
523
|
+
--agent codex \
|
|
524
|
+
--workflow /mednotes:fix-wiki \
|
|
525
|
+
--run-id 2026-05-14T14-30-00Z
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
```powershell
|
|
529
|
+
.\extension\scripts\vault\vault_git.ps1 integrate `
|
|
530
|
+
--branch vault/gemini-cli/2026-05-14T14-30-00Z `
|
|
531
|
+
--agent codex `
|
|
532
|
+
--workflow /mednotes:fix-wiki `
|
|
533
|
+
--run-id 2026-05-14T14-30-00Z
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
Merge limpo → `integrate` cria merge commit em `main`, registra `Integrated-Branch`, `Integrated-Agent`, `Integrated-Workflow` e `Integrated-Run-Id`, valida árvore limpa e empurra `main`. Conflito → aborta merge, lista arquivos conflitados, retorna erro.
|
|
537
|
+
|
|
538
|
+
Os três subcomandos aceitam `--json` para automação. Saída humana em texto simples por padrão.
|
|
539
|
+
|
|
540
|
+
Dentro da extensão instalada ou de `dist/gemini-cli-bundle/`, wrappers ficam em `scripts/vault/...` (porque `bundle/scripts/` é copiado para `scripts/` do bundle).
|
|
541
|
+
|
|
542
|
+
## `.gitignore` Do Vault
|
|
543
|
+
|
|
544
|
+
`.gitignore` do vault é decisão sua, não desta política. Política assume que snapshot pré-agente captura tudo que **não** está no `.gitignore`. Se algo indesejado aparecer nos commits de snapshot, ajuste o `.gitignore` — não desligue a política.
|
|
545
|
+
|
|
546
|
+
Atenção a artefatos que **são** input de workflow e **devem** ser versionados (mesmo parecendo "cache"):
|
|
547
|
+
|
|
548
|
+
- Export do plugin Related Notes — input do linker (`/mednotes:link`).
|
|
549
|
+
- HTML capturado por `gemini-md-export.artifact-html-manifest.v1` — pode ser referenciado por iframe em notas.
|
|
550
|
+
- Recibos/manifests em `.runs/` se quiser auditoria histórica.
|
|
551
|
+
|
|
552
|
+
## Setup Inicial
|
|
553
|
+
|
|
554
|
+
O setup público é `/mednotes:setup`, conduzido pelo agente passo a passo. Ele
|
|
555
|
+
chama o core semântico, traduz cada estado em linguagem humana e só avança em
|
|
556
|
+
login ou criação de repositório depois de confirmação clara:
|
|
557
|
+
|
|
558
|
+
```bash
|
|
559
|
+
uv run python scripts/vault/vault_git.py setup \
|
|
560
|
+
--vault-dir "$VAULT_DIR" \
|
|
561
|
+
--agent gemini-cli \
|
|
562
|
+
--workflow /mednotes:setup \
|
|
563
|
+
--json
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
No Windows PowerShell:
|
|
567
|
+
|
|
568
|
+
```powershell
|
|
569
|
+
uv run python scripts\vault\vault_git.py setup `
|
|
570
|
+
--vault-dir $env:VAULT_DIR `
|
|
571
|
+
--agent gemini-cli `
|
|
572
|
+
--workflow /mednotes:setup `
|
|
573
|
+
--json
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
O comando:
|
|
577
|
+
|
|
578
|
+
- bloqueia com `blocked_missing_git` se Git não estiver instalado;
|
|
579
|
+
- inicializa proteção local se o vault ainda não for repo;
|
|
580
|
+
- captura a identidade Git nativa do agente/TUI, quando disponível, para que
|
|
581
|
+
commits futuros da Wiki preservem o author do agente sem setup manual dentro
|
|
582
|
+
do Workbench;
|
|
583
|
+
- informa `git_identity_github_attribution`; se o email nativo não for
|
|
584
|
+
reconhecível pelo GitHub, o agente deve explicar que a autoria foi salva, mas
|
|
585
|
+
avatar/link/filtro dependem do setup GitHub nativo usar uma conta GitHub/bot
|
|
586
|
+
real;
|
|
587
|
+
- cria `main` em repo novo, mas em repo existente fora de `main` bloqueia com
|
|
588
|
+
`blocked_branch_confirmation_required` antes de renomear qualquer coisa;
|
|
589
|
+
- valida `[paths].wiki_dir` e grava `vault.path`; em repo existente preserva
|
|
590
|
+
histórico/mudanças abertas, e em repo novo cria o primeiro ponto a partir do
|
|
591
|
+
estado atual;
|
|
592
|
+
- se GitHub ainda não estiver pronto, retorna `local_ready_github_pending` sem
|
|
593
|
+
quebrar a proteção local; workflows mutantes locais já podem criar/restaurar
|
|
594
|
+
pontos neste computador;
|
|
595
|
+
- se o GitHub CLI estiver logado e faltar remoto, retorna
|
|
596
|
+
`awaiting_remote_confirmation` com `proposed_private_repo`;
|
|
597
|
+
- só cria repositório privado após nova chamada com
|
|
598
|
+
`--confirm-create-remote <owner/repo>` exatamente igual ao proposto;
|
|
599
|
+
- quando backup online está pronto, retorna `ready` e grava
|
|
600
|
+
`vault.remote-allowlist`.
|
|
601
|
+
|
|
602
|
+
`gh auth login` só é iniciado quando o agente está em terminal interativo e o
|
|
603
|
+
usuário confirmou esse passo. Em execução não interativa, o setup retorna
|
|
604
|
+
`github_login_required` e preserva a proteção local. Operações de rede têm
|
|
605
|
+
timeout; push rejeitado por permissão ou branch protection vira
|
|
606
|
+
`github_push_failed`, sem deixar estado parcial.
|
|
607
|
+
|
|
608
|
+
Cobertura automatizada usa `gh` fake e remoto local; login real do GitHub não é
|
|
609
|
+
automatizável de forma confiável. Antes de publicar mudanças nesse fluxo, faça
|
|
610
|
+
smoke manual em terminal real: rode `/mednotes:setup`, confirme abertura do
|
|
611
|
+
login GitHub quando solicitado, confirme criação de repositório privado de
|
|
612
|
+
teste e verifique que o estado final fala em proteção local pronta e backup
|
|
613
|
+
online conectado.
|
|
614
|
+
|
|
615
|
+
Termos de Git/GitHub acima são contrato interno; a resposta ao usuário fala em
|
|
616
|
+
proteção local, backup online, login GitHub e repositório privado proposto.
|
|
617
|
+
|
|
618
|
+
## Branch Protection No GitHub
|
|
619
|
+
|
|
620
|
+
Se vault tiver branch protection em `main` (required reviews, status checks), push direto do agente ou via `integrate` vai falhar. Para esse fluxo, protection deve estar **desligada** em `main` ou ter exceção para o usuário que roda o agente.
|
|
621
|
+
|
|
622
|
+
Documente no README do repo do vault: "este repo é mutado por agentes via push em main ou integração semi-automática; não habilitar branch protection sem ajustar a política correspondente no workbench."
|
|
623
|
+
|
|
624
|
+
## Integração Com GitHub Actions / CI
|
|
625
|
+
|
|
626
|
+
Se vault tiver workflows do GitHub Actions no push (validação YAML, link check, lint markdown), eles **vão** rodar a cada commit do agente. Considerar:
|
|
627
|
+
|
|
628
|
+
- Workflows devem ser idempotentes e rápidos — agente pode empurrar dezenas de commits por dia.
|
|
629
|
+
- Falha no workflow não afeta o push (já aconteceu) — mas você recebe notificação. Use como sinal para ajustar política ou workflow, não para bypassar.
|
|
630
|
+
- Não rode CI que faça push de volta no mesmo repo a partir de commit do agente — loop infinito.
|
|
631
|
+
|
|
632
|
+
## Concorrência
|
|
633
|
+
|
|
634
|
+
Checkout principal do vault em `main` continua sequencial: só um agente usa `precommit`/`commit` diretamente por vez.
|
|
635
|
+
|
|
636
|
+
Para paralelismo no mesmo vault, use somente o fluxo `branch-start` -> `branch-commit` -> `integrate`. Regra simples:
|
|
637
|
+
|
|
638
|
+
- cada agente/run edita seu próprio worktree;
|
|
639
|
+
- cada run empurra branch `vault/<agent>/<run-id>`;
|
|
640
|
+
- `main` recebe mudanças apenas via `integrate`;
|
|
641
|
+
- conflito de merge bloqueia e vira decisão humana.
|
|
642
|
+
|
|
643
|
+
Não rode dois agentes editando o mesmo checkout principal aberto no Obsidian. Caso contrário, um agente pode capturar mudanças incompletas do outro em snapshot — exatamente o que o fluxo de worktree existe para evitar.
|
|
644
|
+
|
|
645
|
+
## Voltar No Tempo / Desfazer Mudanças
|
|
646
|
+
|
|
647
|
+
Para "voltar no tempo", "desfazer", "restaurar antes de X" ou equivalente, interface pública é `/mednotes:history`: listar pontos, mostrar preview, aplicar só após confirmação clara.
|
|
648
|
+
|
|
649
|
+
Core canônico:
|
|
650
|
+
|
|
651
|
+
```bash
|
|
652
|
+
uv run python scripts/vault/vault_git.py timeline --limit 30 --json
|
|
653
|
+
uv run python scripts/vault/vault_git.py restore-preview --to <ponto> --json
|
|
654
|
+
uv run python scripts/vault/vault_git.py restore-apply --plan <plan.json> --confirm <plan-id> --agent <agente> --workflow /mednotes:history --json
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
Para alvo temporal claro, use `timeline --since <inicio> --until <fim>` antes de escolher ponto. `restore-apply` nunca roda sem preview confirmado. Se vault tiver mudanças abertas mas histórico ainda for o mesmo do preview, script salva automaticamente ponto "antes da restauração" e segue; se histórico mudou, bloqueia e pede novo preview.
|
|
658
|
+
|
|
659
|
+
Se `timeline` retornar `backup_status=local_checkpoints_pending`, os pontos já
|
|
660
|
+
existem neste computador, mas ainda não foram enviados ao backup online. Um
|
|
661
|
+
`run-finish` sem mudanças novas deve sincronizar esse backlog e depois
|
|
662
|
+
`timeline` deve ser consultado novamente.
|
|
663
|
+
|
|
664
|
+
Fallback técnico de manutenção:
|
|
665
|
+
|
|
666
|
+
Comandos abaixo existem para manutenção manual ou recuperação quando camada semântica (`timeline`, `restore-preview`, `restore-apply`) não estiver disponível. Workflows públicos e agentes atendendo pedido normal do usuário devem usar interface semântica acima, para manter Git invisível.
|
|
667
|
+
|
|
668
|
+
Regra mental:
|
|
669
|
+
|
|
670
|
+
- **Mudança já commitada em `main` ou possivelmente compartilhada:** use `git revert --no-commit` seguido de `vault_commit`. Preserva histórico, evita editor interativo, mantém author/trailers corretos.
|
|
671
|
+
- **Restaurar arquivo/pasta para conteúdo de commit anterior:** use `git restore --source=<sha> -- <path>` e depois novo commit documentando a restauração.
|
|
672
|
+
- **Cancelar mudanças ainda não commitadas que o próprio agente acabou de fazer:** use `git restore --worktree --staged -- <path>` ou equivalente por arquivo. Nunca apague mudanças humanas junto.
|
|
673
|
+
- **Mudança só em branch paralela, não integrada:** ajuste ou descarte worktree/branch paralelo; não toque em `main`. Para desfazer só parte do run, use `git restore` dentro do worktree paralelo e rode `branch-commit` novamente.
|
|
674
|
+
- **Reescrever histórico com `git reset --hard`, `git push --force` ou similares destrutivos:** só com pedido explícito do usuário, após confirmar alvo e garantir que não há trabalho humano misturado. Não é o caminho padrão.
|
|
675
|
+
|
|
676
|
+
Comandos de fallback:
|
|
677
|
+
|
|
678
|
+
```bash
|
|
679
|
+
# Ver a linha do tempo recente
|
|
680
|
+
git -C "$VAULT_DIR" log --oneline --decorate --max-count=20
|
|
681
|
+
|
|
682
|
+
# Desfazer um commit já publicado/compartilhado, mantendo commit documentado
|
|
683
|
+
git -C "$VAULT_DIR" revert --no-commit <sha>
|
|
684
|
+
bundle/scripts/vault/vault_commit.sh \
|
|
685
|
+
--agent <agente> \
|
|
686
|
+
--workflow manual-restore \
|
|
687
|
+
--title "reverte(vault): desfaz <sha>" \
|
|
688
|
+
--body-file <commit-body.txt>
|
|
689
|
+
|
|
690
|
+
# Restaurar uma nota para o conteúdo de um commit anterior, mantendo histórico
|
|
691
|
+
git -C "$VAULT_DIR" restore --source=<sha> -- "Cardiologia/IAM.md"
|
|
692
|
+
bundle/scripts/vault/vault_commit.sh \
|
|
693
|
+
--agent <agente> \
|
|
694
|
+
--workflow manual-restore \
|
|
695
|
+
--title "restaura(cardiologia): volta IAM ao estado <sha>" \
|
|
696
|
+
--body-file <commit-body.txt>
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
```powershell
|
|
700
|
+
# Ver a linha do tempo recente
|
|
701
|
+
git -C $env:VAULT_DIR log --oneline --decorate --max-count=20
|
|
702
|
+
|
|
703
|
+
# Desfazer um commit já publicado/compartilhado, mantendo commit documentado
|
|
704
|
+
git -C $env:VAULT_DIR revert --no-commit <sha>
|
|
705
|
+
.\extension\scripts\vault\vault_commit.ps1 `
|
|
706
|
+
--agent <agente> `
|
|
707
|
+
--workflow manual-restore `
|
|
708
|
+
--title "reverte(vault): desfaz <sha>" `
|
|
709
|
+
--body-file <commit-body.txt>
|
|
710
|
+
|
|
711
|
+
# Restaurar uma nota para o conteúdo de um commit anterior, mantendo histórico
|
|
712
|
+
git -C $env:VAULT_DIR restore --source=<sha> -- "Cardiologia/IAM.md"
|
|
713
|
+
.\extension\scripts\vault\vault_commit.ps1 `
|
|
714
|
+
--agent <agente> `
|
|
715
|
+
--workflow manual-restore `
|
|
716
|
+
--title "restaura(cardiologia): volta IAM ao estado <sha>" `
|
|
717
|
+
--body-file <commit-body.txt>
|
|
718
|
+
```
|
|
719
|
+
|
|
720
|
+
Commit de restauração deve explicar alvo restaurado, commit de referência e motivo informado pelo usuário. Se `revert --no-commit` gerar conflito, pare e peça resolução humana; não auto-resolva conteúdo clínico.
|
|
721
|
+
|
|
722
|
+
## Falhas E Recuperação
|
|
723
|
+
|
|
724
|
+
- **Push falha (rede/auth):** commit local mantido; próximo `vault_commit` empurra backlog. Workflow continua.
|
|
725
|
+
- **Fetch falha depois do commit local:** scripts seguem com base local e avisam no stderr. Push subsequente pode ser rejeitado por divergência — cai no próximo caso.
|
|
726
|
+
- **Push rejeitado por divergência:** próximo run tenta `fetch` + `rebase
|
|
727
|
+
origin/main` depois de criar commit local necessário. Rebase limpo → segue. Conflito → humano.
|
|
728
|
+
- **Conflito de rebase:** scripts saem com erro sem auto-resolver e abortam o rebase. Usuário precisa: abrir arquivo conflitado, escolher versão, finalizar rebase manualmente (`git rebase --continue` ou `git rebase --abort`), re-rodar o agente.
|
|
729
|
+
- **Conflito de integração paralela:** `integrate` aborta merge, preserva `main` no commit anterior, lista arquivos conflitados, retorna `blocked_conflict` com `--json`. Ajuste a branch ou faça resolução humana em worktree controlado; rode `integrate` novamente.
|
|
730
|
+
- **Auth falha (SSH/PAT inválido):** em `fetch`/`push`, commit local preservado e script avisa no stderr. Usuário conserta config git global e re-roda para empurrar backlog. Scripts usam `GIT_TERMINAL_PROMPT=0` por padrão.
|
|
731
|
+
- **Push rejeitado por branch protection:** ajustar config do repo no GitHub conforme seção "Branch Protection No GitHub".
|
|
732
|
+
- **Pre-commit hook do vault falha:** investigar antes de bypassar. Nunca usar `--no-verify` por padrão. Consertar a nota é o caminho correto.
|
|
733
|
+
- **Commit sem mudanças:** `vault_commit` detecta e é no-op silencioso, não cria commit vazio.
|
|
734
|
+
|
|
735
|
+
## Auditoria
|
|
736
|
+
|
|
737
|
+
Para responder "quem mexeu nesta nota e quando":
|
|
738
|
+
|
|
739
|
+
```bash
|
|
740
|
+
git -C $VAULT_DIR log --follow --pretty='format:%h %ai %an %s' -- "<caminho-da-nota>"
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
Para listar tudo que um agente fez num run:
|
|
744
|
+
|
|
745
|
+
```bash
|
|
746
|
+
git -C $VAULT_DIR log --all --pretty='format:%h %s%n%b%n---' --grep "Run-Id: 2026-05-14T14-30-00Z"
|
|
747
|
+
```
|
|
748
|
+
|
|
749
|
+
Para ver só commits de um agente específico:
|
|
750
|
+
|
|
751
|
+
```bash
|
|
752
|
+
git -C $VAULT_DIR log --author='claude-code' --pretty='format:%h %ai %s'
|
|
753
|
+
```
|
|
754
|
+
|
|
755
|
+
## Quando Esta Política Não Se Aplica
|
|
756
|
+
|
|
757
|
+
- Edição manual humana no Obsidian: usa config git global do usuário, sem trailers obrigatórios. Política cobre apenas commits por agente.
|
|
758
|
+
- Operações de manutenção do repo (rebase, tag, branch): humano direto, sem trailers de agente.
|