@r1z4x/tezgah 1.9.2 → 1.13.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/CHANGELOG.md +415 -1
- package/MANIFEST +404 -144
- package/README.de.md +1 -1
- package/README.es.md +1 -1
- package/README.fr.md +1 -1
- package/README.md +5 -4
- package/README.tr.md +1 -1
- package/bin/codegen +5 -2
- package/bin/tezgah-design +288 -1
- package/bin/tezgah-docs +1 -1
- package/bin/tezgah-doctor +39 -2
- package/bin/tezgah-import-ai-research +26 -12
- package/bin/tezgah-ocr-review +296 -0
- package/bin/tezgah-research +255 -44
- package/bin/tezgah-review-quote +185 -0
- package/bin/tezgah-setup +1365 -55
- package/bin/tezgah-skill +1 -1
- package/bin/tezgah-status +201 -3
- package/bin/tezgah-task +258 -20
- package/commands/adhd.md +2 -2
- package/commands/ponytail.md +4 -4
- package/docs/architecture.md +2 -2
- package/docs/citations-baseline.json +3 -3
- package/docs/clarity-baseline.json +11 -5
- package/docs/contract.md +91 -43
- package/docs/environment.md +5 -2
- package/docs/evidence.md +109 -17
- package/docs/feature-audit.md +2 -2
- package/docs/gate.md +60 -33
- package/docs/glossary.md +6 -3
- package/docs/hosts.md +313 -17
- package/docs/index.json +34 -8
- package/docs/judge.md +4 -2
- package/docs/layers.md +4 -4
- package/docs/models.md +37 -9
- package/docs/operations.md +141 -5
- package/docs/research.md +815 -8
- package/docs/skills.md +137 -13
- package/docs/status-line.md +121 -1
- package/docs/testing.md +3 -1
- package/hooks/hooks.json +2 -2
- package/hooks/lang/en.json +21 -0
- package/hooks/lang/tr.json +22 -1
- package/hooks/projects-stop.py +2 -1
- package/hooks/tezgah_agents.py +65 -25
- package/hooks/tezgah_apps.py +18 -0
- package/hooks/tezgah_attest.py +79 -10
- package/hooks/tezgah_components.py +4 -0
- package/hooks/tezgah_context.py +207 -55
- package/hooks/tezgah_extension.py +337 -0
- package/hooks/tezgah_gate.py +267 -79
- package/hooks/tezgah_integrity.py +864 -143
- package/hooks/tezgah_judge.py +6 -4
- package/hooks/tezgah_models.py +59 -19
- package/hooks/tezgah_orca.py +1 -1
- package/hooks/tezgah_paths.py +145 -8
- package/hooks/tezgah_policy.py +128 -57
- package/hooks/tezgah_rank.py +9 -6
- package/hooks/tezgah_replay.py +12 -6
- package/hooks/tezgah_research.py +1414 -76
- package/hooks/tezgah_research_capture.py +1544 -0
- package/hooks/tezgah_research_evidence.py +842 -0
- package/hooks/tezgah_research_stats.py +258 -0
- package/hooks/tezgah_skill_pick.py +408 -106
- package/hooks/tezgah_stack.py +236 -1
- package/hooks/tezgah_stopspec.py +8 -1
- package/hooks/tezgah_task.py +14 -5
- package/hooks/tezgah_taste_ledger.py +1 -1
- package/hosts/amp/hook.py +217 -0
- package/hosts/amp/tezgah-plugin.ts.in +386 -0
- package/hosts/antigravity/hook.py +255 -0
- package/hosts/codex/hook.py +2 -1
- package/hosts/commandcode/hook.py +239 -0
- package/hosts/copilot/hook.py +284 -0
- package/hosts/cursor/hook.py +31 -3
- package/hosts/droid/hook.py +259 -0
- package/hosts/dsh/hooks.json +1 -1
- package/hosts/gemini/hook.py +213 -0
- package/hosts/goose/hook.py +145 -0
- package/hosts/omp/hook.py +4 -1
- package/hosts/omp/tezgah-hook.ts.in +30 -7
- package/hosts/opencode/plugins/tezgah.js +309 -48
- package/hosts/opencode/tui/cli/tui.tsx +100 -0
- package/hosts/opencode/tui/tezgah-tui.tsx +2 -1
- package/hosts/qwen/hook.py +206 -0
- package/output-styles/tezgah.md +20 -15
- package/package.json +1 -1
- package/skills/ai-research/SKILL.md +21 -14
- package/skills/ai-research/SOURCE +7 -5
- package/skills/ai-research/index/1-frame.md +6 -6
- package/skills/ai-research/index/2-data.md +9 -9
- package/skills/ai-research/index/3-train.md +36 -36
- package/skills/ai-research/index/4-measure.md +13 -13
- package/skills/ai-research/index/5-run.md +11 -11
- package/skills/ai-research/index/6-write.md +23 -23
- package/skills/ai-research/library.json +104 -104
- package/skills/analyze-app/SKILL.md +17 -12
- package/skills/design-contract/SKILL.md +42 -7
- package/skills/design-contract/data-views.md +2 -2
- package/skills/design-library/EVALS.md +1 -1
- package/skills/design-library/INDEX.md +39 -39
- package/skills/design-library/SKILL.md +19 -13
- package/skills/design-library/SOURCE +45 -43
- package/skills/feature-audit/SKILL.md +20 -14
- package/skills/hallmark/LICENSE +21 -0
- package/skills/hallmark/SKILL.md +154 -0
- package/skills/hallmark/SOURCE +207 -0
- package/skills/hallmark/agents/openai.yaml +13 -0
- package/skills/hallmark/references/anatomy.md +71 -0
- package/skills/hallmark/references/brand-truth.md +40 -0
- package/skills/hallmark/references/comp.md +104 -0
- package/skills/hallmark/references/craft.md +116 -0
- package/skills/hallmark/references/dark-mode.md +49 -0
- package/skills/hallmark/references/data-viz.md +48 -0
- package/skills/hallmark/references/design-md.md +53 -0
- package/skills/hallmark/references/direction.md +52 -0
- package/skills/hallmark/references/export-formats.md +80 -0
- package/skills/hallmark/references/flow.md +131 -0
- package/skills/hallmark/references/fonts.md +58 -0
- package/skills/hallmark/references/gates.md +243 -0
- package/skills/hallmark/references/genres/atmospheric.md +24 -0
- package/skills/hallmark/references/genres/editorial.md +24 -0
- package/skills/hallmark/references/genres/modern-minimal.md +24 -0
- package/skills/hallmark/references/genres/playful.md +24 -0
- package/skills/hallmark/references/imagery.md +99 -0
- package/skills/hallmark/references/interaction-and-states.md +89 -0
- package/skills/hallmark/references/layout.md +104 -0
- package/skills/hallmark/references/macrostructures/01-bento-grid.md +21 -0
- package/skills/hallmark/references/macrostructures/02-long-document.md +35 -0
- package/skills/hallmark/references/macrostructures/03-marquee-hero.md +21 -0
- package/skills/hallmark/references/macrostructures/04-stat-led.md +21 -0
- package/skills/hallmark/references/macrostructures/05-workbench.md +21 -0
- package/skills/hallmark/references/macrostructures/06-conversational-faq.md +28 -0
- package/skills/hallmark/references/macrostructures/07-manifesto.md +28 -0
- package/skills/hallmark/references/macrostructures/08-photographic.md +21 -0
- package/skills/hallmark/references/macrostructures/09-quote-led.md +21 -0
- package/skills/hallmark/references/macrostructures/10-specimen.md +21 -0
- package/skills/hallmark/references/macrostructures/11-catalogue.md +21 -0
- package/skills/hallmark/references/macrostructures/12-letter.md +21 -0
- package/skills/hallmark/references/macrostructures/13-index-first.md +21 -0
- package/skills/hallmark/references/macrostructures/14-narrative-workflow.md +21 -0
- package/skills/hallmark/references/macrostructures/15-split-studio.md +21 -0
- package/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -0
- package/skills/hallmark/references/macrostructures/17-type-specimen.md +19 -0
- package/skills/hallmark/references/macrostructures/18-portfolio-grid.md +21 -0
- package/skills/hallmark/references/macrostructures/19-map-diagram.md +21 -0
- package/skills/hallmark/references/macrostructures/20-ecosystem-index.md +19 -0
- package/skills/hallmark/references/macrostructures/21-component-playground.md +21 -0
- package/skills/hallmark/references/macrostructures.md +119 -0
- package/skills/hallmark/references/microinteractions.md +80 -0
- package/skills/hallmark/references/patterns.md +202 -0
- package/skills/hallmark/references/redesign.md +88 -0
- package/skills/hallmark/references/responsive.md +46 -0
- package/skills/hallmark/references/review-finish.md +19 -0
- package/skills/hallmark/references/review-hero.md +20 -0
- package/skills/hallmark/references/scroll-choreography.md +110 -0
- package/skills/hallmark/references/texture.md +90 -0
- package/skills/hallmark/references/themes/README.md +58 -0
- package/skills/hallmark/references/themes/almanac.jpg +0 -0
- package/skills/hallmark/references/themes/almanac.md +103 -0
- package/skills/hallmark/references/themes/arcade.jpg +0 -0
- package/skills/hallmark/references/themes/arcade.md +102 -0
- package/skills/hallmark/references/themes/atelier.jpg +0 -0
- package/skills/hallmark/references/themes/atelier.md +98 -0
- package/skills/hallmark/references/themes/bloom.jpg +0 -0
- package/skills/hallmark/references/themes/bloom.md +102 -0
- package/skills/hallmark/references/themes/blueprint.jpg +0 -0
- package/skills/hallmark/references/themes/blueprint.md +103 -0
- package/skills/hallmark/references/themes/broadside.jpg +0 -0
- package/skills/hallmark/references/themes/broadside.md +108 -0
- package/skills/hallmark/references/themes/brutal.jpg +0 -0
- package/skills/hallmark/references/themes/brutal.md +95 -0
- package/skills/hallmark/references/themes/carnival.jpg +0 -0
- package/skills/hallmark/references/themes/carnival.md +104 -0
- package/skills/hallmark/references/themes/cobalt.jpg +0 -0
- package/skills/hallmark/references/themes/cobalt.md +101 -0
- package/skills/hallmark/references/themes/console.jpg +0 -0
- package/skills/hallmark/references/themes/console.md +99 -0
- package/skills/hallmark/references/themes/coral.jpg +0 -0
- package/skills/hallmark/references/themes/coral.md +102 -0
- package/skills/hallmark/references/themes/darkroom.jpg +0 -0
- package/skills/hallmark/references/themes/darkroom.md +99 -0
- package/skills/hallmark/references/themes/dose.jpg +0 -0
- package/skills/hallmark/references/themes/dose.md +98 -0
- package/skills/hallmark/references/themes/dusk.jpg +0 -0
- package/skills/hallmark/references/themes/dusk.md +105 -0
- package/skills/hallmark/references/themes/editorial.jpg +0 -0
- package/skills/hallmark/references/themes/editorial.md +97 -0
- package/skills/hallmark/references/themes/formwork.jpg +0 -0
- package/skills/hallmark/references/themes/formwork.md +107 -0
- package/skills/hallmark/references/themes/furrow.jpg +0 -0
- package/skills/hallmark/references/themes/furrow.md +98 -0
- package/skills/hallmark/references/themes/garden.jpg +0 -0
- package/skills/hallmark/references/themes/garden.md +97 -0
- package/skills/hallmark/references/themes/grid.jpg +0 -0
- package/skills/hallmark/references/themes/grid.md +101 -0
- package/skills/hallmark/references/themes/halftone.jpg +0 -0
- package/skills/hallmark/references/themes/halftone.md +106 -0
- package/skills/hallmark/references/themes/hedgerow.jpg +0 -0
- package/skills/hallmark/references/themes/hedgerow.md +104 -0
- package/skills/hallmark/references/themes/hum.jpg +0 -0
- package/skills/hallmark/references/themes/hum.md +99 -0
- package/skills/hallmark/references/themes/index.json +2191 -0
- package/skills/hallmark/references/themes/ink.jpg +0 -0
- package/skills/hallmark/references/themes/ink.md +106 -0
- package/skills/hallmark/references/themes/kiln.jpg +0 -0
- package/skills/hallmark/references/themes/kiln.md +108 -0
- package/skills/hallmark/references/themes/loom.jpg +0 -0
- package/skills/hallmark/references/themes/loom.md +106 -0
- package/skills/hallmark/references/themes/lumen.jpg +0 -0
- package/skills/hallmark/references/themes/lumen.md +103 -0
- package/skills/hallmark/references/themes/manifesto.jpg +0 -0
- package/skills/hallmark/references/themes/manifesto.md +101 -0
- package/skills/hallmark/references/themes/midnight.jpg +0 -0
- package/skills/hallmark/references/themes/midnight.md +97 -0
- package/skills/hallmark/references/themes/newsprint.jpg +0 -0
- package/skills/hallmark/references/themes/newsprint.md +102 -0
- package/skills/hallmark/references/themes/overprint.jpg +0 -0
- package/skills/hallmark/references/themes/overprint.md +101 -0
- package/skills/hallmark/references/themes/pasteup.jpg +0 -0
- package/skills/hallmark/references/themes/pasteup.md +100 -0
- package/skills/hallmark/references/themes/piste.jpg +0 -0
- package/skills/hallmark/references/themes/piste.md +99 -0
- package/skills/hallmark/references/themes/ribbon.jpg +0 -0
- package/skills/hallmark/references/themes/ribbon.md +106 -0
- package/skills/hallmark/references/themes/rim.jpg +0 -0
- package/skills/hallmark/references/themes/rim.md +96 -0
- package/skills/hallmark/references/themes/riso.jpg +0 -0
- package/skills/hallmark/references/themes/riso.md +98 -0
- package/skills/hallmark/references/themes/solstice.jpg +0 -0
- package/skills/hallmark/references/themes/solstice.md +104 -0
- package/skills/hallmark/references/themes/specimen.jpg +0 -0
- package/skills/hallmark/references/themes/specimen.md +100 -0
- package/skills/hallmark/references/themes/spore.jpg +0 -0
- package/skills/hallmark/references/themes/spore.md +104 -0
- package/skills/hallmark/references/themes/sport.jpg +0 -0
- package/skills/hallmark/references/themes/sport.md +101 -0
- package/skills/hallmark/references/themes/squeeze.jpg +0 -0
- package/skills/hallmark/references/themes/squeeze.md +99 -0
- package/skills/hallmark/references/themes/sticker.jpg +0 -0
- package/skills/hallmark/references/themes/sticker.md +106 -0
- package/skills/hallmark/references/themes/studio.jpg +0 -0
- package/skills/hallmark/references/themes/studio.md +99 -0
- package/skills/hallmark/references/themes/terminal.jpg +0 -0
- package/skills/hallmark/references/themes/terminal.md +96 -0
- package/skills/hallmark/references/themes/terrazzo.jpg +0 -0
- package/skills/hallmark/references/themes/terrazzo.md +106 -0
- package/skills/hallmark/references/themes/ultraviolet.jpg +0 -0
- package/skills/hallmark/references/themes/ultraviolet.md +106 -0
- package/skills/hallmark/references/themes/vellum.jpg +0 -0
- package/skills/hallmark/references/themes/vellum.md +105 -0
- package/skills/hallmark/references/themes/wayfind.jpg +0 -0
- package/skills/hallmark/references/themes/wayfind.md +105 -0
- package/skills/hallmark/references/themes/werkstatt.jpg +0 -0
- package/skills/hallmark/references/themes/werkstatt.md +105 -0
- package/skills/hallmark/scripts/capture.mjs +125 -0
- package/skills/hallmark/scripts/fixtures/exemplars/atmospheric.html +324 -0
- package/skills/hallmark/scripts/fixtures/exemplars/editorial.html +363 -0
- package/skills/hallmark/scripts/fixtures/exemplars/modern-minimal.html +527 -0
- package/skills/hallmark/scripts/fixtures/exemplars/playful.html +353 -0
- package/skills/hallmark/scripts/fixtures/eyebrow-fail/index.html +118 -0
- package/skills/hallmark/scripts/fixtures/eyebrow-pass/index.html +137 -0
- package/skills/hallmark/scripts/fixtures/kept/after.html +27 -0
- package/skills/hallmark/scripts/fixtures/kept/before.html +26 -0
- package/skills/hallmark/scripts/fixtures/slopped.html +145 -0
- package/skills/hallmark/scripts/fixtures/tailwind-fail/Feature.vue +14 -0
- package/skills/hallmark/scripts/fixtures/tailwind-fail/Hero.tsx +33 -0
- package/skills/hallmark/scripts/fixtures/tailwind-fail/index.html +74 -0
- package/skills/hallmark/scripts/fixtures/tailwind-fail/style.css +6 -0
- package/skills/hallmark/scripts/fixtures/tailwind-pass/Hero.tsx +33 -0
- package/skills/hallmark/scripts/fixtures/tailwind-pass/index.html +57 -0
- package/skills/hallmark/scripts/fixtures/tailwind-pass/style.css +15 -0
- package/skills/hallmark/scripts/fixtures/waiver/index.html +54 -0
- package/skills/hallmark/scripts/imagegen.mjs +85 -0
- package/skills/hallmark/scripts/install-hook.mjs +70 -0
- package/skills/hallmark/scripts/install.mjs +141 -0
- package/skills/hallmark/scripts/lint-hook.mjs +49 -0
- package/skills/hallmark/scripts/photos.json +1 -0
- package/skills/hallmark/scripts/picture.mjs +71 -0
- package/skills/hallmark/scripts/refcheck.mjs +352 -0
- package/skills/hallmark/scripts/sloplint-render.mjs +1252 -0
- package/skills/hallmark/scripts/sloplint.mjs +4422 -0
- package/skills/hallmark/scripts/theme.mjs +650 -0
- package/skills/harness/SKILL.md +17 -8
- package/skills/i-have-adhd/SKILL.md +32 -12
- package/skills/no-ai-slop/SKILL.md +15 -1
- package/skills/plan-add/SKILL.md +38 -27
- package/skills/plan-status/SKILL.md +13 -7
- package/skills/plan-sync/SKILL.md +18 -12
- package/skills/pm-frameworks/SKILL.md +19 -10
- package/skills/pm-frameworks/SOURCE +7 -5
- package/skills/ponytail/SKILL.md +19 -14
- package/skills/product-analysis/SKILL.md +22 -18
- package/skills/product-flow/SKILL.md +14 -9
- package/skills/research/SKILL.md +97 -48
- package/skills/rl-env/SKILL.md +25 -13
- package/skills/rl-env/SOURCE +8 -6
- package/skills/tezgah-contract/SKILL.md +65 -47
- package/statusline.py +20 -9
- package/workflows/graph-review.js +14 -2
- package/bin/tezgah-skill.py +0 -59
- /package/skills/ai-research/0-autoresearch-skill/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/01-model-architecture/litgpt/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/01-model-architecture/mamba/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/01-model-architecture/nanogpt/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/01-model-architecture/rwkv/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/01-model-architecture/torchtitan/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/02-tokenization/huggingface-tokenizers/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/02-tokenization/sentencepiece/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/03-fine-tuning/axolotl/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/03-fine-tuning/llama-factory/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/03-fine-tuning/peft/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/03-fine-tuning/unsloth/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/04-mechanistic-interpretability/nnsight/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/04-mechanistic-interpretability/pyvene/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/04-mechanistic-interpretability/saelens/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/05-data-processing/nemo-curator/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/05-data-processing/ray-data/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/grpo-rl-training/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/miles/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/openrlhf/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/simpo/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/slime/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/torchforge/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/trl-fine-tuning/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/06-post-training/verl/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/07-safety-alignment/constitutional-ai/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/07-safety-alignment/llamaguard/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/07-safety-alignment/nemo-guardrails/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/07-safety-alignment/prompt-guard/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/accelerate/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/deepspeed/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/megatron-core/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/pytorch-fsdp2/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/pytorch-lightning/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/08-distributed-training/ray-train/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/09-infrastructure/lambda-labs/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/09-infrastructure/modal/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/09-infrastructure/skypilot/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/awq/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/bitsandbytes/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/flash-attention/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/gguf/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/gptq/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/hqq/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/10-optimization/ml-training-recipes/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/11-evaluation/lm-evaluation-harness/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/11-evaluation/nemo-evaluator/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/12-inference-serving/llama-cpp/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/12-inference-serving/sglang/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/12-inference-serving/tensorrt-llm/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/12-inference-serving/vllm/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/13-mlops/mlflow/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/13-mlops/swanlab/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/13-mlops/tensorboard/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/13-mlops/weights-and-biases/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/14-agents/a-evolve/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/14-agents/autogpt/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/14-agents/crewai/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/14-agents/langchain/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/14-agents/llamaindex/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/15-rag/chroma/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/15-rag/faiss/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/15-rag/pinecone/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/15-rag/qdrant/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/15-rag/sentence-transformers/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/16-prompt-engineering/dspy/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/16-prompt-engineering/guidance/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/16-prompt-engineering/instructor/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/16-prompt-engineering/outlines/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/17-observability/langsmith/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/17-observability/phoenix/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/audiocraft/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/blip-2/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/clip/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/cosmos-policy/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/llava/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/openpi/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/openvla-oft/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/segment-anything/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/stable-diffusion/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/18-multimodal/whisper/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/knowledge-distillation/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/long-context/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/model-merging/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/model-pruning/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/moe-training/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/19-emerging-techniques/speculative-decoding/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/20-ml-paper-writing/academic-plotting/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/21-research-ideation/brainstorming-research-ideas/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/21-research-ideation/creative-thinking-for-research/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/22-agent-native-research-artifact/compiler/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/22-agent-native-research-artifact/research-manager/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/colour-independence/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/flexible-typography/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/information-density/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/preference-audit/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/responsive-accessibility/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/responsive-review/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/simplified-views/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/specify/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/adaptive-interfaces/skills/user-preference-respect/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/adaptive-personalisation/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/assess-load/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/cognitive-load-assessment/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/contextual-help-design/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/error-prevention-recovery/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/focus-attention-design/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/memory-load-reduction/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/plain-language-design/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/review/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/simplify/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/cognitive-accessibility/skills/wayfinding-navigation/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/design-research/skills/behavioural-analytics/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/design-research/skills/qual-quant-triangulation/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/audit/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/design-flow/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/feedback-and-status/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/gesture-alternatives/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/keyboard-navigation/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/keyboard-review/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/motion-sensitivity/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/multi-modal-input/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/touch-target-design/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/inclusive-interaction/skills/voice-interaction/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-affordance/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-brand-consistency/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-color/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-composition/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-information-density/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-typography/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/design-library/visual-critique/skills/critique-visual-hierarchy/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/pm-frameworks/intended-vs-implemented/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/pm-frameworks/opportunity-solution-tree/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/rl-env/generate-nemo-gym-env/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/rl-env/generate-openenv-env/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/rl-env/generate-ors-env/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/rl-env/generate-verifiers-env/{SKILL.md → ENTRY.md} +0 -0
- /package/skills/rl-env/rl-env-from-description/{SKILL.md → ENTRY.md} +0 -0
package/docs/hosts.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Hosts
|
|
2
2
|
|
|
3
|
-
tezgah is one Python core with
|
|
4
|
-
`cursor`, `opencode`, `dsh`, `omp`. This page is for the maintainer wiring a new
|
|
3
|
+
tezgah is one Python core with fourteen host adapters around it: `claude`, `codex`,
|
|
4
|
+
`cursor`, `opencode`, `dsh`, `omp`, `qwen`, `droid`, `commandcode`, `copilot`, `gemini`, `antigravity`, `goose`, `amp`. This page is for the maintainer wiring a new
|
|
5
5
|
host, adding a mark, or debugging a status line that claims something a host
|
|
6
6
|
cannot see. Read it when a question starts with "does this host get X?" or "can
|
|
7
7
|
this host observe Y?" - the answer is not uniform, and guessing it produces a
|
|
@@ -23,6 +23,14 @@ surface can honestly report this session; the two skill-read marks (`pony`,
|
|
|
23
23
|
| opencode | no lifecycle events; plugin hooks: config, permission.ask, tool.execute.before, shell.env, experimental.session.compacting, chat.message, tool.execute.after (`hosts/opencode/plugins/tezgah.js:2372-2737`) - `tool.execute.before` carries the whole gate, `tool.execute.after` the channel on the row, the provenance label on the result and the taint notice on the next effect (`untrustedSource` `hosts/opencode/plugins/tezgah.js:1942`, `labelResult` `:1993`) | static only: generated `instructions` files, because there is no session-start injection point (`hosts/opencode/plugins/tezgah.js:3-6`, `bin/tezgah-setup::opencode_contract_text`) | chat.message pushes a synthetic part (`hosts/opencode/plugins/tezgah.js:2652-2703`) | TUI plugin `tezgah-tui.tsx` declared in `tui.json`, runs `tezgah-status` on the event bus (`hosts/opencode/tui/tezgah-tui.tsx:1-11`; wiring `bin/tezgah-setup::install_opencode`) | all seven: skill reads and kinds are classified in process (`hosts/opencode/plugins/tezgah.js:2227-2263`) |
|
|
24
24
|
| dsh | SessionStart, SubagentStart, UserPromptSubmit, PreToolUse, PostToolUse (`hosts/dsh/hooks.json:2-19`); no Stop rule, because the bridge drops every call's outcome and no check there can show a pass | hook: the same Claude-family scripts, named by `configPath` (`bin/tezgah-setup::dsh_patch_block`) | UserPromptSubmit, through the bridge (`hosts/dsh/hooks.json:9-11`) | web-profile plugin: authenticated `GET /api/tezgah.status` -> `tezgah-status` (`hosts/dsh/statusline/lib/index.js:15,66-104`) | five tool-use: the route passes `--observable=consult,research,graph,orch,judge` (`hosts/dsh/statusline/lib/index.js:16-19,84,96`) |
|
|
25
25
|
| omp | session_start, session_compact, session_switch, turn_end, before_agent_start, tool_call, tool_result, session_stop (`hosts/omp/tezgah-hook.ts.in:596,655,674,679,681,701,720,755`) | both: static `RULES.md` (`bin/tezgah-setup::STATIC_RULES`, `bin/tezgah-setup::rules_block`) and a session payload carrying only what a static file cannot know (`hosts/omp/hook.py::handle`) | before_agent_start returns a hidden message (`hosts/omp/tezgah-hook.ts.in:681-699`) | extension draws `ctx.ui.setWidget` below the editor, `setStatus` as fallback (`hosts/omp/tezgah-hook.ts.in:170-203`); ANSI line from `hosts/omp/hook.py::status_line` | all seven: the embedded runner filters skill reads before asking python (`hosts/omp/tezgah-hook.ts.in:257-264`) and no `observable` is passed (`hosts/omp/hook.py::status_line`) |
|
|
26
|
+
| qwen | SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, PostToolUseFailure, SubagentStart, SubagentStop (record-only, `subagent_end`), Stop (`bin/tezgah-setup::QWEN_HOOK_EVENTS`), all in `~/.qwen/settings.json` beside Orca's rows | the managed block in `~/.qwen/QWEN.md` (`bin/tezgah-setup::STATIC_RULES`); SessionStart drops the core while the block is there (`hosts/qwen/hook.py::rules_carry_core`) | UserPromptSubmit -> `additionalContext` (`hosts/qwen/hook.py::main`) | `ui.statusLine` command in `~/.qwen/settings.json` -> `tezgah-statusline --qwen`, ANSI kept by `respectUserColors` (`bin/tezgah-setup::install_qwen`) | five tool-use (`statusline.py::observable`) |
|
|
27
|
+
| droid | SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, SubagentStop (record-only, `subagent_end`), Stop (`bin/tezgah-setup::DROID_HOOK_EVENTS`), all in `~/.factory/hooks.json` | the managed block in `~/.factory/AGENTS.md` (`bin/tezgah-setup::STATIC_RULES`); SessionStart drops the core while the block is there (`hosts/droid/hook.py::rules_carry_core`) | UserPromptSubmit -> `additionalContext` (`hosts/droid/hook.py::main`) | `statusLine` command in `~/.factory/settings.json` -> `tezgah-statusline --droid`, set in place with the file's comments kept (`bin/tezgah-setup::install_droid`, `bin/tezgah-setup::jsonc_put`) | five tool-use (`statusline.py::observable`) |
|
|
28
|
+
| commandcode | SessionStart, PreToolUse (matcher `shell\|write\|edit`), PostToolUse, Stop (`bin/tezgah-setup::COMMANDCODE_HOOK_EVENTS`), all in the `hooks` key of `~/.commandcode/settings.json` | the managed block in `~/.commandcode/AGENTS.md` (`bin/tezgah-setup::STATIC_RULES`); SessionStart drops the core while the block is there (`hosts/commandcode/hook.py::rules_carry_core`) | unavailable: Command Code has no prompt event | no custom status line - the segment rides `systemMessage`, plain, TUI only, at SessionStart and Stop (`hosts/commandcode/hook.py::status`) | five tool-use (`TOOL_USE_MEASURES` at `hosts/commandcode/hook.py::status`) |
|
|
29
|
+
| copilot | SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, PostToolUseFailure, subagentStart, SubagentStop (record-only, `subagent_end`), Stop (`bin/tezgah-setup::COPILOT_HOOK_EVENTS`), all in tezgah's own `$COPILOT_HOME/hooks/tezgah.json` | the managed block in `$COPILOT_HOME/copilot-instructions.md` (`bin/tezgah-setup::STATIC_RULES`); SessionStart drops the core while the block is there (`hosts/copilot/hook.py::rules_carry_core`) | unavailable: Copilot drops a command hook's UserPromptSubmit output; the event still writes the turn row (`hosts/copilot/hook.py::main`) | `statusLine` command in `$COPILOT_HOME/settings.json` -> `tezgah-statusline --copilot`, written only while that file is plain JSON (`bin/tezgah-setup::install_copilot`) | five tool-use (`statusline.py::observable`) |
|
|
30
|
+
| gemini | SessionStart, BeforeAgent, BeforeTool, AfterTool, AfterAgent (`bin/tezgah-setup::GEMINI_HOOK_EVENTS`), all in tezgah's own extension `~/.gemini/extensions/tezgah/hooks/hooks.json` | the managed block in `~/.gemini/GEMINI.md` (`bin/tezgah-setup::STATIC_RULES`), shared with Antigravity; SessionStart drops the core while the block is there (`hosts/gemini/hook.py::rules_carry_core`) | BeforeAgent -> `hookSpecificOutput.additionalContext`, appended to the prompt for that turn (`hosts/gemini/hook.py::main`) | no custom status line (`ui.footer.items` is a closed list) - the segment rides `systemMessage`, plain, at SessionStart and AfterAgent (`hosts/gemini/hook.py::status`) | five tool-use (`TOOL_USE_MEASURES` at `hosts/gemini/hook.py::status`) |
|
|
31
|
+
| antigravity | SessionStart, PreInvocation, PreToolUse, PostToolUse, Stop (`bin/tezgah-setup::ANTIGRAVITY_HOOK_EVENTS`), all under the `tezgah` name of `~/.gemini/config/hooks.json`; the payload names no event, so each command passes it as its first argument | the managed block in `~/.gemini/GEMINI.md` (`bin/tezgah-setup::STATIC_RULES`), shared with Gemini CLI; SessionStart injects the core as a system message while the block is missing (`hosts/antigravity/hook.py::rules_carry_core`) | PreInvocation with `invocationNum` 0 -> an `injectSteps` `ephemeralMessage`; whether that number restarts each user turn is undocumented (`hosts/antigravity/hook.py::main`) | `statusLine` command in `~/.gemini/antigravity-cli/settings.json` -> `tezgah-statusline --antigravity`, written only while that file is plain JSON (`bin/tezgah-setup::install_antigravity`) | five tool-use (`statusline.py::observable`) |
|
|
32
|
+
| goose | SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, PostToolUseFailure, Stop (`bin/tezgah-setup::GOOSE_HOOK_EVENTS`), all in tezgah's own plugin `~/.agents/plugins/tezgah/hooks/hooks.json`; the payload names the event in `event` | the managed block in `~/.config/goose/.goosehints` (`bin/tezgah-setup::STATIC_RULES`), which Goose adds to the system prompt of every request; no hook can inject it, because SessionStart is observation only | unavailable: Goose ignores UserPromptSubmit output; the event still writes the turn row (`hosts/goose/hook.py::main`) | unavailable: Goose has no status line and shows no hook output to the user | none drawn; the PostToolUse rows still record the five tool-use marks for `tezgah-status` (`hosts/goose/hook.py::post_tool`) |
|
|
33
|
+
| amp | no hook file: tezgah's TypeScript plugin `$XDG_CONFIG_HOME/amp/plugins/tezgah.ts` (else `~/.config/amp/plugins/tezgah.ts`) subscribes to `session.start`, `agent.start`, `tool.call`, `tool.result` and `agent.end` and forwards each to `hosts/amp/hook.py` (`hosts/amp/tezgah-plugin.ts.in`) | the managed block in `~/.config/amp/AGENTS.md` (`bin/tezgah-setup::STATIC_RULES`), which Amp always includes; `session.start` cannot inject, so the session brief rides the thread's next `agent.start`, with the core only while that block is missing or `AMP_IGNORE_GUIDANCE_FILES` is set (`hosts/amp/hook.py::handle`) | hook: `agent.start` returns the reminder as a hidden message (`display: false`); a prompt that starts with `[tezgah:stop]` is tezgah's own continue and sends no `user_prompt` | the experimental `createStatusItem`, plain text, for the thread the user is looking at only (owner-approved, plan 140 A-D15); without it, no status surface | none drawn beyond the status item; the `tool.result` rows record the five tool-use marks and a skill read |
|
|
26
34
|
|
|
27
35
|
The middle five marks (`consult`, `research`, `graph`, `orch`, `judge`) are tool-use marks:
|
|
28
36
|
any adapter that sees its host's tool calls can light them by calling
|
|
@@ -47,15 +55,37 @@ the code path there, but no run has shown the host obeying it.
|
|
|
47
55
|
| opencode | gate, probed by `--report --live` through a node driver | unavailable: the plugin API has no end-of-turn event | unavailable |
|
|
48
56
|
| dsh | gate, probed by `--report --live` through the bridge | unavailable: ADR 003 removed the Stop entry, because the bridge carries no outcome | partial, unverified: a brief at SubagentStart, no SubagentStop entry |
|
|
49
57
|
| omp | gate, probed by `--report --live` (node 22.6+) | gate, unverified (`hosts/omp/hook.py::handle`) | partial, unverified: a brief at a task session's start; `session_stop` does not fire for task sessions |
|
|
58
|
+
| qwen | gate, probed by `--report --live` through the hook command in `~/.qwen/settings.json`; that the qwen binary obeys the deny is unverified until `TEZGAH_E2E_SPEND=1 python3 tests/e2e_qwen.py` runs (it spends a model call) | gate, unverified (`hosts/qwen/hook.py::main`, judged on `last_assistant_message`) | observe, unverified: a brief at SubagentStart, a record-only `subagent_end` row at SubagentStop |
|
|
59
|
+
| droid | gate, probed by `--report --live` through the hook command in `~/.factory/hooks.json`; that the droid binary obeys the deny is unverified until `TEZGAH_E2E_SPEND=1 python3 tests/e2e_droid.py` runs (it spends a model call) | gate, unverified: Droid's Stop carries no reply, so the reply is read from `transcript_path` (`hosts/droid/hook.py::last_reply`), and a turn end whose reply is not there yet is a `reply_unread` row, never judged | partial, unverified: a record-only `subagent_end` row from SubagentStop's `task_result`; no SubagentStart, so no brief |
|
|
60
|
+
| commandcode | gate, unverified: probed by `--report --live` through the hook command in `~/.commandcode/settings.json`, but no run of the binary has shown it obeying the deny; only shell, write and edit reach the hook (read, MCP, subagent and web tools do not), and plan mode skips every hook | gate, unverified: Stop carries no reply, so the reply is read from `transcript_path` (`hosts/commandcode/hook.py::last_reply`) and a turn end with none there is a `reply_unread` row, never judged; the host caps a block at three retries | unavailable: the settings hooks have no subagent event |
|
|
61
|
+
| copilot | gate, unverified: probed by `--report --live` through the hook command in `$COPILOT_HOME/hooks/tezgah.json`, which answers with a top-level `permissionDecision: deny`, but no run of the binary has shown it obeying the deny. A PreToolUse hook that times out (10 s) lets the call through, by Copilot's own rule; one that crashes denies it. A repo's `.claude/settings.json` hooks run there too | gate, unverified: Stop carries no reply, so the reply is the last `assistant.message` in `transcript_path` (`hosts/copilot/hook.py::last_reply`), and a turn end with none there is a `reply_unread` row, never judged; the host ends the turn anyway after 8 blocks in a row | observe, unverified: a brief at subagentStart, a record-only `subagent_end` row at SubagentStop; the built-in `general-purpose` agent fires neither |
|
|
62
|
+
| gemini | gate, unverified: probed by `--report --live` through the hook command in `~/.gemini/extensions/tezgah/hooks/hooks.json`, which answers with a top-level `decision: deny`, but no run of the binary has shown it obeying the deny, and no run has shown Gemini loading an extension dir written without `gemini extensions install` (its loader reads every subdir; a non-empty `security.allowedExtensions` asks for install metadata tezgah does not write). A hook that crashes or prints bad JSON is a warning and the call goes on | gate, unverified: AfterAgent carries the reply as `prompt_response` and `stop_hook_active` (`hosts/gemini/hook.py::main`); a deny sends the reason back as a new prompt | unavailable: no subagent event; a subagent is a tool call (`codebase_investigator`, `generalist`, `invoke_agent`) the gate sees as `Task` |
|
|
63
|
+
| antigravity | gate, unverified: probed by `--report --live` through the hook command under the `tezgah` name of `~/.gemini/config/hooks.json`, fed Antigravity's camelCase envelope with the event as argv, which answers with a top-level `decision: deny` (an allow answers `decision: allow`, since the field is required), but no run of the binary has shown it obeying the deny. What Antigravity does when a hook crashes or times out is undocumented. The same file arms the Antigravity App and IDE | gate, unverified: Stop carries no reply, so the reply is read from `transcriptPath` (`hosts/antigravity/hook.py::last_reply`), and a turn end with none there is a `reply_unread` row, never judged; only an idle `model_stop` is judged, and `decision: continue` sends the model back into the loop with the reason as a system message. No block counter: the turn's refusal rows bound the re-asks | unavailable: no subagent event; a child conversation keeps its own ledger, and `invoke_subagent` reaches the gate as Task |
|
|
64
|
+
| goose | gate, unverified: probed by `--report --live` through the hook command in `~/.agents/plugins/tezgah/hooks/hooks.json`, which answers `{"decision": "block"}` on stdout, but no run of the binary has shown it obeying the block, nor loading a plugin dir written by hand rather than by `goose plugin install` (the plugins guide says both are discovered). `on_failure` is left at its default `allow`, so a hook that crashes, times out or prints no decision lets the call through: the gate fails open on a hook fault. Only `shell`, `write`, `edit` and `<extension>__<tool>` reach the gate | gate, unverified: Stop carries the reply as `last_assistant_message` (`hosts/goose/hook.py::main`), and a Stop with none is a `reply_unread` row, never judged. It carries no count of earlier blocks, so the turn's own refusal rows bound the re-asks; Goose ends the turn anyway after `GOOSE_STOP_HOOK_BLOCK_CAP` blocks in a row | unavailable: SubagentStart and SubagentStop are not emitted; the subagent tool is not mapped |
|
|
65
|
+
| amp | gate, unverified: `--report --live` loads the installed plugin with node 22.6+ (`--experimental-strip-types`) and fires its `tool.call` on a `Bash` call carrying `cmd`; the plugin answers `{action: "reject-and-continue"}`, but Amp's own Bun loader is not what ran it, so the row stays UNVERIFIED. A hook that is missing, crashes, times out or prints no JSON answers `{action: "allow"}`: the gate fails open. Only `Bash`, `shell_command`, `edit_file`, `create_file`, `apply_patch`, `Task` and an MCP effect name reach the gate | gate, unverified: `agent.end` with status `done` asks the Stop rule on the last assistant message and continues the turn with `[tezgah:stop] <reason>`; a turn that marker started is judged as the re-ask (`stop_hook_active`), and Amp's own cap of 5 continues backs the core's budget. Error and cancelled turns are not judged. A shell result passes only on an integer `exitCode` read off an output object (`hosts/amp/hook.py::call_failed`); Amp's docs do not show that its Bash result carries one, so until a run shows it no Amp check counts as passed | partial, unverified: a thread with a parent (`ctx.thread.parentThreadID()`) gets the subagent brief and a record-only `subagent_end` row at its `agent.end`; whether a Task subagent's events reach plugins is undocumented |
|
|
50
66
|
|
|
51
67
|
Every host also attests its own hook entries once per session
|
|
52
|
-
(`hooks/tezgah_attest.py::run`).
|
|
53
|
-
|
|
68
|
+
(`hooks/tezgah_attest.py::run`). Every host but opencode does it at session
|
|
69
|
+
start. opencode does it at the first message, through `oncePerSession`.
|
|
54
70
|
The `attest` row and the `drift` mark are
|
|
55
71
|
[evidence](evidence.md#the-kinds-by-what-reads-them), never a block.
|
|
56
72
|
`--report` prints the same comparison per host
|
|
57
73
|
(`bin/tezgah-setup::attestation_rows`).
|
|
58
74
|
|
|
75
|
+
Every Stop adapter hands the core the host's permission mode for the turn
|
|
76
|
+
(`hooks/tezgah_integrity.py::read_only_turn`, plan 142). Claude, Command Code,
|
|
77
|
+
Qwen, Copilot, Gemini, Codex, Goose, Droid and Cursor send it as
|
|
78
|
+
`permission_mode` on the Stop payload (Antigravity's envelope is camelCase,
|
|
79
|
+
`permissionMode`). omp has no such field, so its extension reads
|
|
80
|
+
`ctx.sessionModes.getState().plan` and sends `plan` when it is active
|
|
81
|
+
(`hosts/omp/tezgah-hook.ts.in`). A host that sends nothing reads as `default`.
|
|
82
|
+
Only `plan` and Droid's `spec` change a verdict, and only two of them: the rule
|
|
83
|
+
lets the approval question such a turn ends on through, and refuses a
|
|
84
|
+
done/tested claim in it
|
|
85
|
+
([evidence](evidence.md#the-stop-rule-end-to-end)). Claude's hooks reference
|
|
86
|
+
documents the field on its own Stop payload. Every other adapter reads whatever
|
|
87
|
+
its payload carries.
|
|
88
|
+
|
|
59
89
|
## What each host gets, and where it is written
|
|
60
90
|
|
|
61
91
|
Every host gets the skill symlinks from `SKILLS` (`bin/tezgah-setup::SKILLS`)
|
|
@@ -98,6 +128,15 @@ shared config, contract hash and the CLI symlinks every host shell can call
|
|
|
98
128
|
(`instructions`, `mcp`, `permission.skill=deny`, `compaction.prune`,
|
|
99
129
|
`watcher.ignore`, the two `external_directory` grants) and `tui.json` +
|
|
100
130
|
`tui-plugins/tezgah-tui.tsx`.
|
|
131
|
+
The installer detects opencode 2 by its `cli.json` (`bin/tezgah-setup::opencode_v2`).
|
|
132
|
+
On opencode 2 the plugin, the skill links, `opencode.json` and its
|
|
133
|
+
`instructions` still load.
|
|
134
|
+
`tui.json` and `compaction.prune` are not written there: opencode 2 ignores
|
|
135
|
+
`tui.json` after its first start and does not support `compaction.prune`, a legacy setting.
|
|
136
|
+
The install report drops those two rows on opencode 2.
|
|
137
|
+
On opencode 2 the status line is `hosts/opencode/tui/cli/tui.tsx`. The installer
|
|
138
|
+
links it as the directory `tui-plugins/tezgah-cli` and lists it in `cli.json`
|
|
139
|
+
`plugins`. opencode 2 skips an entry that names a file. It loads a directory's `tui` module.
|
|
101
140
|
- **dsh** - `install_dsh` (`bin/tezgah-setup::install_dsh`): `~/.dsh/skills/*` symlinks,
|
|
102
141
|
a managed block in `~/.dsh/cordis.patch.yml` (`dsh_patch_block`, `bin/tezgah-setup::dsh_patch_block`) that
|
|
103
142
|
mounts the Claude-code hook bridge on `hosts/dsh/hooks.json`, the MCP client
|
|
@@ -117,6 +156,122 @@ shared config, contract hash and the CLI symlinks every host shell can call
|
|
|
117
156
|
its own: orx's `codex` target writes the shim to `~/.agents/skills/orx`,
|
|
118
157
|
omp's native `agents` skill root, so `install_openresearch` maps omp onto it
|
|
119
158
|
(`ORX_AGENTS`, `bin/tezgah-setup::ORX_AGENTS`).
|
|
159
|
+
- **qwen** - `install_qwen` (`bin/tezgah-setup::install_qwen`) writes into
|
|
160
|
+
`~/.qwen/settings.json` (or `$QWEN_HOME`). It adds one hook group per event of
|
|
161
|
+
`QWEN_HOOK_EVENTS`, each `timeout` in milliseconds. The PreToolUse group
|
|
162
|
+
carries `QWEN_PRETOOL_MATCHER` over Qwen's runtime tool ids. It also sets
|
|
163
|
+
`ui.statusLine`. Orca's groups and the provider keys in that file stay, and
|
|
164
|
+
the backup is owner-only (`bin/tezgah-setup::backup`). The install links
|
|
165
|
+
`skills/*` into `~/.qwen/skills`. It writes the always-on block in
|
|
166
|
+
`~/.qwen/QWEN.md`. tezgah writes no subagent roles, MCP rows or orx shim for
|
|
167
|
+
Qwen yet.
|
|
168
|
+
- **droid** - `install_droid` (`bin/tezgah-setup::install_droid`) writes
|
|
169
|
+
`~/.factory/hooks.json`, keyed by event at the top. It adds one hook group per
|
|
170
|
+
event of `DROID_HOOK_EVENTS`, each `timeout` in seconds, and keeps the user's
|
|
171
|
+
own groups. The PreToolUse group carries `DROID_PRETOOL_MATCHER` over Droid's
|
|
172
|
+
tool ids. Droid reads the `hooks` key of `settings.json` only while hooks.json
|
|
173
|
+
is absent. The install then writes no hooks.json and says why
|
|
174
|
+
(`bin/tezgah-setup::droid_hooks_blocked`). Droid's settings.json holds
|
|
175
|
+
comments, so the install edits it in place and keeps them
|
|
176
|
+
(`bin/tezgah-setup::jsonc_put`). It adds the `statusLine`. It sets
|
|
177
|
+
`includeCoAuthoredByDroid` to false, the switch for Droid's co-author trailer.
|
|
178
|
+
A file it cannot edit safely is left alone and the run names both keys. The install
|
|
179
|
+
links `skills/*` into `~/.factory/skills` beside the user's own links. It
|
|
180
|
+
writes the always-on block in `~/.factory/AGENTS.md`. The uninstall deletes a
|
|
181
|
+
hooks.json that held only tezgah's groups. An empty one would still hide
|
|
182
|
+
settings.json's hooks. tezgah writes no subagent roles, MCP rows or orx
|
|
183
|
+
shim for Droid yet.
|
|
184
|
+
- **commandcode** - `install_commandcode` (`bin/tezgah-setup::install_commandcode`)
|
|
185
|
+
writes into the `hooks` key of `~/.commandcode/settings.json`. It adds one
|
|
186
|
+
hook group per event of `COMMANDCODE_HOOK_EVENTS`, each `timeout` in seconds.
|
|
187
|
+
The user's own groups stay, and the backup is owner-only. The PreToolUse group
|
|
188
|
+
carries `COMMANDCODE_PRETOOL_MATCHER`, which Command Code tests against the
|
|
189
|
+
tool's display name. The same write sets `attribution.commit` to `""`. That
|
|
190
|
+
turns off the default `Co-authored-by: CommandCodeBot` commit trailer. A value
|
|
191
|
+
the user set stays. The uninstall removes the key only while it holds what the
|
|
192
|
+
install wrote. The install links `skills/*` into `~/.commandcode/skills`. It
|
|
193
|
+
writes the always-on block in `~/.commandcode/AGENTS.md`. tezgah writes no
|
|
194
|
+
subagent roles, MCP rows or orx shim for Command Code yet.
|
|
195
|
+
- **copilot** - `install_copilot` (`bin/tezgah-setup::install_copilot`) writes
|
|
196
|
+
`$COPILOT_HOME/hooks/tezgah.json`, a `{"version": 1, "hooks": ...}` file that
|
|
197
|
+
is wholly tezgah's. `COPILOT_HOME` defaults to `~/.copilot`. The file holds
|
|
198
|
+
one entry per event of `COPILOT_HOOK_EVENTS`, each `timeoutSec` in seconds.
|
|
199
|
+
The inline `hooks` key of settings.json is never used, since one bad item
|
|
200
|
+
there rejects every hook in it. The PreToolUse entry carries
|
|
201
|
+
`COPILOT_PRETOOL_MATCHER`. settings.json is JSON with comments. So the status
|
|
202
|
+
line and `includeCoAuthoredBy: false` go in only while it parses as plain
|
|
203
|
+
JSON. That setting turns off the default `Co-authored-by` trailer on the
|
|
204
|
+
agent's commits. A value the user set stays. The install links `skills/*`
|
|
205
|
+
into `$COPILOT_HOME/skills` and writes the always-on block in
|
|
206
|
+
`$COPILOT_HOME/copilot-instructions.md`. The uninstall deletes tezgah.json
|
|
207
|
+
and takes back only tezgah's settings keys. tezgah writes no subagent roles,
|
|
208
|
+
MCP rows or orx shim for Copilot yet.
|
|
209
|
+
- **gemini** - `install_gemini` (`bin/tezgah-setup::install_gemini`) writes
|
|
210
|
+
tezgah's own extension, `~/.gemini/extensions/tezgah/`, which is wholly
|
|
211
|
+
tezgah's. `GEMINI_CLI_HOME` moves `~/.gemini` under it. The dir holds
|
|
212
|
+
`gemini-extension.json`, `hooks/hooks.json` with one group per event of
|
|
213
|
+
`GEMINI_HOOK_EVENTS` (each `timeout` in milliseconds) and `skills/*` links.
|
|
214
|
+
The BeforeTool group carries `GEMINI_PRETOOL_MATCHER`. settings.json is never
|
|
215
|
+
written: it is JSON with comments and holds the user's keys. Gemini's default
|
|
216
|
+
prompt adds no co-author trailer and no setting names one, so there is
|
|
217
|
+
nothing to turn off. The install writes the always-on block in
|
|
218
|
+
`~/.gemini/GEMINI.md`, which Antigravity reads too. The uninstall deletes the
|
|
219
|
+
extension dir. It strips the block only while no other host of
|
|
220
|
+
`GEMINI_MD_HOSTS` stays armed (`bin/tezgah-setup::gemini_md_kept`). Gemini
|
|
221
|
+
gets no subagent roles, MCP rows or orx shim from tezgah yet.
|
|
222
|
+
- **antigravity** - `install_antigravity` (`bin/tezgah-setup::install_antigravity`)
|
|
223
|
+
writes tezgah's hook set under the top-level `tezgah` name of
|
|
224
|
+
`~/.gemini/config/hooks.json`, beside the user's other names. Each event of
|
|
225
|
+
`ANTIGRAVITY_HOOK_EVENTS` gets one item, its `timeout` in seconds. PreToolUse
|
|
226
|
+
and PostToolUse take a matcher group, the others a bare handler. Antigravity
|
|
227
|
+
never loads hooks from `antigravity-cli/settings.json`. The Antigravity App
|
|
228
|
+
and IDE read the same global hooks.json, so the install arms them too. The
|
|
229
|
+
status line goes in `~/.gemini/antigravity-cli/settings.json` only while it
|
|
230
|
+
is plain JSON. The skill links go in `antigravity-cli/skills`. Antigravity
|
|
231
|
+
adds no co-author trailer of its own, and no setting names one. An open
|
|
232
|
+
feature request asks for one (google-antigravity/antigravity-cli#230). The
|
|
233
|
+
always-on block is the `~/.gemini/GEMINI.md` one Gemini CLI shares
|
|
234
|
+
(`bin/tezgah-setup::gemini_md_kept`). The uninstall takes out the `tezgah`
|
|
235
|
+
name, the statusLine and the links. It removes a file that held only
|
|
236
|
+
tezgah's keys. Antigravity gets no subagent roles, MCP rows or orx shim from
|
|
237
|
+
tezgah yet. Antigravity can never show a passing check. Its PostToolUse
|
|
238
|
+
carries no output. A shell call that went to the background also ends with an
|
|
239
|
+
empty `error`. So the hook records each shell call as ran, never a pass
|
|
240
|
+
(`hosts/antigravity/hook.py::post_tool`). The owner chose this: a done or
|
|
241
|
+
tested claim there always stops at the Stop rule's `no verify_ok` class.
|
|
242
|
+
- **goose** - `install_goose` (`bin/tezgah-setup::install_goose`) writes
|
|
243
|
+
tezgah's own plugin, `~/.agents/plugins/tezgah/`, which is wholly tezgah's.
|
|
244
|
+
It holds `plugin.json`, `hooks/hooks.json` and `skills/*` links. The hooks
|
|
245
|
+
file has one group per event of `GOOSE_HOOK_EVENTS`, each `timeout` in
|
|
246
|
+
seconds. Goose loads the skills as `tezgah:<skill>`. Goose tests a matcher
|
|
247
|
+
unanchored, so the PreToolUse group carries the anchored
|
|
248
|
+
`GOOSE_PRETOOL_MATCHER`. No hook sets `on_failure`, so it stays at Goose's
|
|
249
|
+
default `allow`, and a hook fault lets the call through. The always-on block
|
|
250
|
+
goes in `~/.config/goose/.goosehints`. Neither Goose's docs nor its system
|
|
251
|
+
prompt add a co-author trailer or name a setting for one. The uninstall
|
|
252
|
+
deletes the plugin dir and strips the block. The rest of `~/.agents` is the
|
|
253
|
+
user's and stays. The install ignores `GOOSE_PATH_ROOT`, since the docs
|
|
254
|
+
do not say where it puts the hints file. Goose gets no subagent roles, MCP
|
|
255
|
+
rows or orx shim from tezgah yet.
|
|
256
|
+
- **amp** - `install_amp` (`bin/tezgah-setup::install_amp`) writes one file,
|
|
257
|
+
`tezgah.ts`, into Amp's system plugin dir (`hooks/tezgah_paths.py::AMP_PLUGIN`,
|
|
258
|
+
under `XDG_CONFIG_HOME` when that is set). `hooks/tezgah_attest.py::amp_plugin`
|
|
259
|
+
renders it from `hosts/amp/tezgah-plugin.ts.in`. Amp loads every `.ts` there,
|
|
260
|
+
and nothing registers it. A running Amp needs `plugins: reload`. The plugin
|
|
261
|
+
spawns `hosts/amp/hook.py` without blocking, one JSON in and one out. One
|
|
262
|
+
plugin process serves many threads, so it keys all its state by thread id.
|
|
263
|
+
The install links the skills into `~/.config/amp/skills` and writes the
|
|
264
|
+
always-on block into `~/.config/amp/AGENTS.md`. By default Amp adds a
|
|
265
|
+
`Co-authored-by: Amp` and an `Amp-Thread-ID` trailer to its commits. The
|
|
266
|
+
install sets `amp.git.commit.coauthor.enabled` and
|
|
267
|
+
`amp.git.commit.ampThread.enabled` to false in `~/.config/amp/settings.json`
|
|
268
|
+
unless the user set them. It writes that file only while it is plain JSON
|
|
269
|
+
with no `settings.jsonc` beside it (`bin/tezgah-setup::amp_settings`). Else it
|
|
270
|
+
prints both keys to set by hand. The uninstall removes the plugin only when
|
|
271
|
+
it is a fresh render or starts with tezgah's header line
|
|
272
|
+
(`bin/tezgah-setup::amp_plugin_ours`). It drops a trailer key only while that
|
|
273
|
+
key is still false. Amp gets no subagent roles, MCP rows or orx shim from
|
|
274
|
+
tezgah.
|
|
120
275
|
|
|
121
276
|
An adapter is responsible for its host's **envelope** and its **surface**: it
|
|
122
277
|
translates the host's event and tool names into the shared vocabulary (one call
|
|
@@ -124,7 +279,7 @@ has to hash to one id - `hosts/codex/hook.py::gate_name`, `hosts/cursor/hook.py:
|
|
|
124
279
|
draws the line, and returns the host's own output shape. The contract text, the
|
|
125
280
|
gate decision, the evidence ledger, the untrusted-content marks and the segment
|
|
126
281
|
builder stay in the shared core under `hooks/` (`hosts/omp/hook.py:1-12`,
|
|
127
|
-
`hosts/cursor/hook.py:1-
|
|
282
|
+
`hosts/cursor/hook.py:1-44`).
|
|
128
283
|
|
|
129
284
|
## Where the always-on core reaches each host
|
|
130
285
|
|
|
@@ -140,6 +295,14 @@ pays for it once.
|
|
|
140
295
|
| opencode | no stdout-inject hook: `install_opencode` writes the generated `~/.config/tezgah/opencode-contract.md` and references it from `opencode.json` `instructions` |
|
|
141
296
|
| omp | the managed block in `~/.omp/agent/RULES.md` |
|
|
142
297
|
| dsh | the session's own hook context: `hosts/dsh/hooks.json` runs the Claude-family scripts through the bridge, and no dsh file carries the core, so dsh's `SessionStart` row declares nothing and still gets it here (`~/.dsh/cordis.patch.yml` mounts that bridge) |
|
|
298
|
+
| qwen | the managed block in `~/.qwen/QWEN.md`, which Qwen loads into every session; its `SessionStart` hook repeats the core only while that block is missing (`hosts/qwen/hook.py::rules_carry_core`) |
|
|
299
|
+
| droid | the managed block in `~/.factory/AGENTS.md`, which Droid loads as coding guidelines at startup; its `SessionStart` hook repeats the core only while that block is missing (`hosts/droid/hook.py::rules_carry_core`) |
|
|
300
|
+
| commandcode | the managed block in `~/.commandcode/AGENTS.md`, the user memory file Command Code puts in the system prompt; its `SessionStart` hook repeats the core only while that block is missing (`hosts/commandcode/hook.py::rules_carry_core`) |
|
|
301
|
+
| copilot | the managed block in `$COPILOT_HOME/copilot-instructions.md`, Copilot's personal instructions file, applied to every session; its `SessionStart` hook repeats the core only while that block is missing (`hosts/copilot/hook.py::rules_carry_core`) |
|
|
302
|
+
| gemini | the managed block in `~/.gemini/GEMINI.md`, the global context file Gemini puts in the system prompt and Antigravity reads too; its `SessionStart` hook repeats the core only while that block is missing (`hosts/gemini/hook.py::rules_carry_core`) |
|
|
303
|
+
| antigravity | the same managed block in `~/.gemini/GEMINI.md`, a standalone global rule Antigravity keeps always on (24,000-byte file limit); its `SessionStart` hook injects the core as a system message only while that block is missing (`hosts/antigravity/hook.py::rules_carry_core`) |
|
|
304
|
+
| goose | the managed block in `~/.config/goose/.goosehints`, the global hints file Goose adds to the system prompt of every request; no hook repeats it, because no Goose hook output reaches the model outside a block |
|
|
305
|
+
| amp | the managed block in `~/.config/amp/AGENTS.md`, which Amp always includes; the session brief on the thread's first turn repeats it only while that block is missing or `AMP_IGNORE_GUIDANCE_FILES` is set (`hosts/amp/hook.py::rules_carry_core`) |
|
|
143
306
|
|
|
144
307
|
An installed host whose core line is missing is a health check's business
|
|
145
308
|
(`host_checks_<host>`), not a second copy: two delivery paths for one host is the
|
|
@@ -158,11 +321,27 @@ and drops the later ones.
|
|
|
158
321
|
| context | cursor | the `sessionStart` hook context, the repo's `AGENTS.md`, `.cursor/rules/*.mdc`, `.cursorrules` | the hook |
|
|
159
322
|
| context | opencode | `~/.config/opencode/AGENTS.md`, `opencode.json` `instructions`, the repo's `AGENTS.md` | the contract and router files in `instructions` |
|
|
160
323
|
| context | omp | `SYSTEM.md`, `APPEND_SYSTEM.md`, `RULES.md` (sticky), the repo's `.omp/AGENTS.md`, `AGENTS.md`, `CLAUDE.md`; another host's user files only with `enabledProviders` | block in `RULES.md`, the extension at session start |
|
|
324
|
+
| context | qwen | `~/.qwen/QWEN.md`, the repo's `QWEN.md` and `AGENTS.md`, then `.qwen/QWEN.local.md`; all load | block in the first |
|
|
325
|
+
| context | droid | from the cwd up to the git root, `AGENTS.md` (or `CLAUDE.md`) in each dir and its `.factory/`, `.agents/`, `.agent/`; then `~/.factory/AGENTS.md` and the other personal dirs; project files override personal ones | block in `~/.factory/AGENTS.md` |
|
|
326
|
+
| context | commandcode | `~/.commandcode/AGENTS.md`, the repo's `AGENTS.md` (else `.commandcode/AGENTS.md`), then each subdirectory's; all load | block in the first |
|
|
327
|
+
| context | copilot | `$COPILOT_HOME/copilot-instructions.md` and `instructions/`, then in the git root and the cwd `.github/copilot-instructions.md`, `.github/instructions/`, `AGENTS.md`, `CLAUDE.md`, `GEMINI.md` and `.claude/rules/`; all merge | block in the first |
|
|
328
|
+
| context | gemini | `~/.gemini/GEMINI.md`, then from the cwd up to the git root, then subdirectories (`context.fileName` renames the file); all concatenate | block in the first |
|
|
329
|
+
| context | antigravity | `~/.gemini/AGENTS.md` and `GEMINI.md`, `~/.gemini/config/rules/*.md`, `~/.gemini/antigravity-cli/rules/*.md`, then the workspace's `AGENTS.md`, `GEMINI.md` and `.agents/rules/`, and plugin rules; all combine, more specific rules win a conflict, and over 20,000 tokens the largest files become pointers | block in `~/.gemini/GEMINI.md` |
|
|
330
|
+
| context | goose | `CONTEXT_FILE_NAMES` (default `AGENTS.md`, `.goosehints`) in `~/.config/goose/`, then in the project root and each directory goose reads; all load, and a local hint wins over a global one | block in `~/.config/goose/.goosehints` |
|
|
331
|
+
| context | amp | `AGENTS.md` in the cwd and its parents, subtree files on a read, then `~/.config/amp/AGENTS.md` and `~/.config/AGENTS.md`; all load, and `AMP_IGNORE_GUIDANCE_FILES` skips matching files | block in `~/.config/amp/AGENTS.md` |
|
|
161
332
|
| skills | omp | `skills.customDirectories`, then `.omp/skills` and `~/.omp/agent/skills`, Claude's project dir (user dir opt-in), `.agents/skills` and `~/.agents/skills`; first wins, identical copies collapse, a differing copy is renamed `<namespace>/<name>` | links in `~/.omp/agent/skills` |
|
|
162
333
|
| skills | claude | `.claude/skills`, `~/.claude/skills`; plugin skills are namespaced `tezgah:<name>` | the plugin copy |
|
|
163
334
|
| skills | codex | `.agents/skills` from the cwd up to the repo root, `~/.agents/skills`, `$CODEX_HOME/skills`; one name in two dirs is listed twice, not merged | links in `$CODEX_HOME/skills` |
|
|
164
335
|
| skills | cursor | `.agents/skills`, `.cursor/skills`, `~/.agents/skills`, `~/.cursor/skills`, then Claude's and Codex's project and user dirs; no documented winner | links in `~/.cursor/skills` |
|
|
165
336
|
| skills | opencode | its own skill tool is denied; the router lists `~/.config/opencode/skills`, `~/.claude/skills`, `~/.agents/skills`, first wins (`bin/tezgah-setup::skill_groups`) | links and the router |
|
|
337
|
+
| skills | qwen | `~/.qwen/skills`, `.qwen/skills`, extension and bundled skills; no documented winner | links in `~/.qwen/skills` |
|
|
338
|
+
| skills | droid | `.factory/skills` (project and folder), `~/.factory/skills`, `.agents/skills` and `~/.agents/skills`, plugin and built-in skills; no documented winner | links in `~/.factory/skills`, beside the user's own |
|
|
339
|
+
| skills | commandcode | `.commandcode/skills`, `.agents/skills`, `~/.commandcode/skills`, `~/.agents/skills`, extra locations, bundled; first wins | links in `~/.commandcode/skills` |
|
|
340
|
+
| skills | copilot | `.github/skills`, `.agents/skills`, `.claude/skills`, a parent's `.github/skills`, `$COPILOT_HOME/skills`, `~/.agents/skills`, plugins, `COPILOT_SKILLS_DIRS`, bundled; first wins | links in `$COPILOT_HOME/skills` |
|
|
341
|
+
| skills | gemini | workspace `.agents/skills` and `.gemini/skills`, user `~/.agents/skills` and `~/.gemini/skills`, extension skills, built-in; higher tier wins, `.agents/skills` wins within one | links in the extension's `skills/`, the lowest tier |
|
|
342
|
+
| skills | antigravity | the workspace's `.agents/skills`, `~/.gemini/antigravity-cli/skills`, plugin skills; no documented winner | links in `~/.gemini/antigravity-cli/skills` |
|
|
343
|
+
| skills | goose | `~/.agents/skills`, `.agents/skills`, plugin skills (namespaced `<plugin>:<name>`), then `.goose/skills`, `.claude/skills` and `~/.claude/skills` for backward compatibility; no documented winner | links in the plugin's `skills/`, loaded as `tezgah:<name>` |
|
|
344
|
+
| skills | amp | `~/.config/agents/skills`, `~/.agents/skills`, `~/.config/amp/skills`, `.agents/skills`, `.claude/skills`, `~/.claude/skills`, then plugin and configured paths; first name wins | links in `~/.config/amp/skills` |
|
|
166
345
|
| agents | claude | managed, the `claude --agents` flag, `.claude/agents`, `~/.claude/agents`, plugin agents namespaced `plugin:name`; a dir absent at start is not watched | `~/.claude/agents`, written at install |
|
|
167
346
|
| agents | codex | `$CODEX_HOME/agents`, `/etc/codex/agents`, `.codex/agents` (trusted repos only), read at config load | `$CODEX_HOME/agents`, written at install |
|
|
168
347
|
| agents | cursor | `cursor-agent`: `.cursor/agents`, then `.claude/agents`, `.grok/agents`, plugin agents; first name wins; no user dir; read at process start. The editor's docs add `~/.cursor/agents` and `~/.claude/agents` | `.cursor/agents` per repo at session start, in the CLI's line format (`hooks/tezgah_agents.py::render_md_cursor`) |
|
|
@@ -172,7 +351,16 @@ and drops the later ones.
|
|
|
172
351
|
| hooks | codex, cursor | `hooks.json` array order, then the repo's `.codex/` or `.cursor/hooks.json`; Codex runs a row only once its hash is trusted | own rows after Orca's |
|
|
173
352
|
| hooks | opencode | every `*.js`/`*.ts` in `plugins/` and `plugin/`; `tezgah.js` is linked into both, and its `globalThis.__tezgahPluginLoaded` guard makes the second load return `{}` | the plugin |
|
|
174
353
|
| hooks | omp | `~/.omp/agent/extensions/` first, then `config.yml` `extensions:`, one load per absolute path; per event in that order, and the first `block` ends a tool call | the bridge in `hooks/pre/` |
|
|
175
|
-
|
|
|
354
|
+
| hooks | qwen | user `settings.json` rows (Orca's and tezgah's), then project `.qwen/settings.json` rows in trusted folders; groups run in parallel unless `sequential` | own rows after Orca's |
|
|
355
|
+
| hooks | droid | org-managed hooks, user `~/.factory/hooks.json`, project `.factory/hooks.json` and enabled plugins' `hooks/hooks.json`, merged with no documented order; a scope's settings.json `hooks` key counts only while its hooks.json is absent | own rows in hooks.json |
|
|
356
|
+
| hooks | commandcode | project `.commandcode/settings.json` rows, then user `~/.commandcode/settings.json` rows; PreToolUse runs them in order and stops at the first deny, the other events run in parallel | own rows in the user settings.json |
|
|
357
|
+
| hooks | copilot | policy files, then the repo's `.github/hooks/*.json`, user `$COPILOT_HOME/hooks/*.json`, the inline `hooks` of the repo's and the user's settings.json (and the repo's `.claude/settings.json`), then plugins; every entry runs, and any PreToolUse deny blocks | own file `hooks/tezgah.json` |
|
|
358
|
+
| hooks | gemini | project `.gemini/settings.json`, user `~/.gemini/settings.json`, system settings, then extensions' `hooks/hooks.json`; `hooksConfig.enabled: false` runs none | own extension `extensions/tezgah/hooks/hooks.json` |
|
|
359
|
+
| hooks | antigravity | workspace `.agents/hooks.json`, global `~/.gemini/config/hooks.json`, then installed plugins' `hooks.json`; each top-level name is a hook set, and `enabled: false` on a name loads none of it | the `tezgah` name in the global hooks.json |
|
|
360
|
+
| hooks | goose | user `~/.agents/plugins/<name>/hooks/hooks.json`, project `.agents/plugins/<name>/hooks/hooks.json` and installed plugins; a name in `disabledPlugins` of `~/.config/goose/settings.json` loads none of it; any PreToolUse block denies | own plugin `~/.agents/plugins/tezgah/hooks/hooks.json` |
|
|
361
|
+
| hooks | amp | plugins: personal and workspace ones from Amp's settings, the project's `.amp/plugins/`, the system `$XDG_CONFIG_HOME/amp/plugins/`; a project plugin wins over a system one of the same name, and every plugin gets every event in no defined order | the system plugin `tezgah.ts` |
|
|
362
|
+
| mcp | each | omp: project `.omp/mcp.json`, then `~/.omp/agent/mcp.json`, first name wins; claude: `~/.claude.json`, the repo's `.mcp.json`, the plugin's `.mcp.json`; codex: `$CODEX_HOME/config.toml`; cursor: `~/.cursor/mcp.json`; opencode: `opencode.json` `mcp`; qwen: `settings.json` `mcpServers`; droid: `~/.factory/mcp.json`; commandcode: `settings.json` `mcp.servers`, `~/.commandcode/mcp.json`, the repo's `.mcp.json`; copilot: `$COPILOT_HOME/mcp-config.json`, the repo's `.mcp.json` and `.github/mcp.json`, project first; gemini: `settings.json` `mcpServers` (user, project) and each extension's `gemini-extension.json`, settings.json first; antigravity: `~/.gemini/config/mcp_config.json`, the workspace's `.agents/mcp_config.json` and plugins, the running server keeps a shared name; goose: the `extensions:` map of `~/.config/goose/config.yaml`; tezgah writes no row for qwen, droid, commandcode, copilot, gemini, antigravity or goose yet | one `tezgah` and one `codegraph` row per host but qwen, droid, commandcode, copilot, gemini, antigravity and goose |
|
|
363
|
+
| mcp | amp | `amp.mcpServers` in `~/.config/amp/settings.json`, then the workspace's `.amp/settings.json`, which wins | none: tezgah writes no MCP row for Amp |
|
|
176
364
|
|
|
177
365
|
Orca is a launcher, not a host. It starts omp with its own `--extension`. It
|
|
178
366
|
gives each Codex account its own `CODEX_HOME` under
|
|
@@ -215,6 +403,14 @@ three harness configurations while swapping the model inside one harness moved i
|
|
|
215
403
|
| opencode | a selector read from `opencode models` (`hooks/tezgah_models.py:12`) | the AI SDK: `@ai-sdk/openai-compatible` for `/v1/chat/completions`, `@ai-sdk/openai` for `/v1/responses`, beside its own Anthropic and Bedrock providers (opencode's provider docs) | vendor documentation |
|
|
216
404
|
| omp | the session default's family, otherwise `task.agentModelOverrides` and `modelRoles.plan` (`hooks/tezgah_models.py:13-16`) | whichever provider the selected model names - Anthropic Messages, OpenAI Responses, OpenAI chat completions, Google, Bedrock - with text-based dialects where a native tool API is unavailable; the OpenRouter route dispatches to Responses unless `PI_OPENROUTER_RESPONSES=0` (omp's own `provider-compat-reference` documentation) | the tool's own documentation |
|
|
217
405
|
| dsh | the Claude-family scripts through the bridge (`hosts/dsh/hooks.json:2-18`); `README.md:27-28` calls it "DeepSeek's dsh harness" | `unverified`: its own `--help` describes it as "an ordered stack of plugin-bundle patch layers" and names no model API, and its profile directory names a provider (DeepSeek) rather than a wire (checked 2026-10-01) | - |
|
|
406
|
+
| qwen | not named: tezgah writes no Qwen subagent roles | the provider `settings.json` `modelProviders` selects, keyed by auth type - `openai` (OpenAI-compatible), `anthropic`, `gemini`, `vertex-ai` - each with its own `baseUrl` (Qwen Code 0.21.13 `configuration/model-providers.md`) | the tool's own documentation |
|
|
407
|
+
| droid | not named: tezgah writes no Droid subagent roles | `unverified`: tezgah has not mapped Droid's providers to a wire | - |
|
|
408
|
+
| commandcode | not named: tezgah writes no Command Code subagent roles | `unverified`: tezgah has not mapped Command Code's providers to a wire | - |
|
|
409
|
+
| copilot | not named: tezgah writes no Copilot subagent roles | `unverified`: tezgah has not mapped Copilot's providers to a wire | - |
|
|
410
|
+
| gemini | not named: tezgah writes no Gemini subagent roles | `unverified`: tezgah has not mapped Gemini's providers to a wire | - |
|
|
411
|
+
| antigravity | not named: tezgah writes no Antigravity subagent roles | `unverified`: tezgah has not mapped Antigravity's models to a wire | - |
|
|
412
|
+
| goose | not named: tezgah writes no Goose subagent roles | `unverified`: tezgah has not mapped Goose's providers to a wire | - |
|
|
413
|
+
| amp | not named: tezgah writes no Amp subagent roles | `unverified`: tezgah has not mapped Amp's models to a wire | - |
|
|
218
414
|
|
|
219
415
|
`unverified` is the point of the column rather than a gap in it. A wrong dialect
|
|
220
416
|
here is worse than a blank one: a reader would use it to explain a score, and the
|
|
@@ -227,12 +423,13 @@ A skill read is observable only where the host gives a channel that does not cos
|
|
|
227
423
|
a process per read: Claude parses its transcript (`statusline.py::claude_used`),
|
|
228
424
|
opencode classifies in process (`hosts/opencode/plugins/tezgah.js:2227-2263`),
|
|
229
425
|
omp filters in its embedded runner before it asks python
|
|
230
|
-
(`hosts/omp/tezgah-hook.ts.in:257-264`)
|
|
231
|
-
|
|
232
|
-
|
|
426
|
+
(`hosts/omp/tezgah-hook.ts.in:257-264`), and Amp's plugin does the same for a
|
|
427
|
+
`Read` of a shipped skill (`hosts/amp/tezgah-plugin.ts.in`). On codex, cursor, qwen, droid, commandcode, copilot, gemini, antigravity, goose and dsh a read is not
|
|
428
|
+
observable at that price. Their surfaces pass the five tool-use measures as
|
|
429
|
+
`observable`, and the two skill marks render dim (`info`, no glyph) instead of
|
|
233
430
|
claiming the skill was never opened (`hooks/tezgah_context.py::TOOL_USE_MEASURES`, and the
|
|
234
431
|
`observable` branch at `hooks/tezgah_context.py::health_segments`). Callers that pass `TOOL_USE_MEASURES`:
|
|
235
|
-
`statusline.py::observable`, `hosts/codex/hook.py::main`,
|
|
432
|
+
`statusline.py::observable`, `hosts/codex/hook.py::main`, `hosts/commandcode/hook.py::status`,
|
|
236
433
|
`hosts/dsh/statusline/lib/index.js:16-19`. A kill switch is observable everywhere
|
|
237
434
|
and still renders `off` (`hooks/tezgah_context.py::health_segments`).
|
|
238
435
|
|
|
@@ -251,11 +448,24 @@ In order, each step verified by the one below it:
|
|
|
251
448
|
(`hosts/omp/tezgah-hook.ts.in` rendered at `hooks/tezgah_attest.py::omp_bridge`).
|
|
252
449
|
3. `install_<host>()` writing that host's files, registered in `INSTALLERS`
|
|
253
450
|
(`bin/tezgah-setup::INSTALLERS`), and `uninstall_<host>()` removing only
|
|
254
|
-
tezgah-managed links and blocks (`bin/tezgah-setup
|
|
451
|
+
tezgah-managed links and blocks, registered in `UNINSTALLERS` (`bin/tezgah-setup::UNINSTALLERS`).
|
|
255
452
|
4. `host_checks_<host>()` returning `(label, bool)` rows over what was actually
|
|
256
453
|
written, registered in `HOST_CHECKS` (`bin/tezgah-setup::HOST_CHECKS`); the
|
|
257
454
|
`--report` output is that list (`bin/tezgah-setup::report`). Give the row a home-qualified
|
|
258
455
|
label if the host's dir can be relocated (`host_checks_codex`, `bin/tezgah-setup::host_checks_codex`).
|
|
456
|
+
The first row is the host's "wired" row (`bin/tezgah-setup::hosts_row`), and a
|
|
457
|
+
row whose MISS means unarmed names a label `ARMING_ROWS` carries
|
|
458
|
+
(`bin/tezgah-setup::ARMING_ROWS`).
|
|
459
|
+
Every other table keyed by host grows with it, or the host crashes or drops
|
|
460
|
+
out there. `hooks/tezgah_stack.py::host_stack` raises on an unknown host, so
|
|
461
|
+
`tezgah-doctor --stack` fails. The other tables are
|
|
462
|
+
`hooks/tezgah_stack.py::tezgah_skill_dirs`, `hooks/tezgah_attest.py::registration`
|
|
463
|
+
and `CODE_TARGETS`, `bin/tezgah-setup::hook_entries` and
|
|
464
|
+
`bin/tezgah-setup::live_plan`. Without `live_plan` the live rows read
|
|
465
|
+
UNVERIFIED. The gate's control plane grows too: `HOOK_ENTRIES`, `HOOK_HOSTS`
|
|
466
|
+
and the shared files of `hooks/tezgah_gate.py::_registration`. The gate then
|
|
467
|
+
refuses a forged run of the new hook, and an edit of its registration, as it
|
|
468
|
+
refuses the others.
|
|
259
469
|
5. Decide the surface: a `statusLine` command, a TUI/widget plugin, or the
|
|
260
470
|
`systemMessage` fallback (`hosts/codex/hook.py:10-12`). Pass `observable` if
|
|
261
471
|
the host cannot see a skill read, and `idx_override` on any redraw that must
|
|
@@ -265,7 +475,9 @@ In order, each step verified by the one below it:
|
|
|
265
475
|
`CodexHome:657-702`, `CursorMatcher:705-722`, `DshStatusline:872-957`), and an
|
|
266
476
|
opt-in script under `tests/e2e_*.py` for the thing only a real host can prove
|
|
267
477
|
- not collected by `unittest discover`, it exits 0 with `SKIP` when the host
|
|
268
|
-
is absent (`tests/e2e_omp_statusline.py:13-16`).
|
|
478
|
+
is absent (`tests/e2e_omp_statusline.py:13-16`). A script that calls a model
|
|
479
|
+
also exits 0 with `SKIP` unless `TEZGAH_E2E_SPEND=1` is set
|
|
480
|
+
(`tests/e2e_qwen.py`, `tests/e2e_droid.py`).
|
|
269
481
|
|
|
270
482
|
## Host-specific limits worth knowing
|
|
271
483
|
|
|
@@ -278,6 +490,26 @@ In order, each step verified by the one below it:
|
|
|
278
490
|
`gate✗` appears only in the SessionStart/Stop status message.
|
|
279
491
|
- **cursor, dsh:** observed only if their prompt payload carries `transcript_path`
|
|
280
492
|
(unverified on a live host).
|
|
493
|
+
- **qwen:** unverified. Its prompt payload carries `transcript_path`. The counter
|
|
494
|
+
reads only the Claude, omp and Codex row shapes (`hooks/tezgah_context.py::_transcript_calls`).
|
|
495
|
+
No run has captured Qwen's transcript format yet, so a disarmed gate there likely counts 0.
|
|
496
|
+
- **droid:** unverified on a live host. Its transcript rows carry `message.content`
|
|
497
|
+
`tool_use` blocks with a `timestamp`, the Claude shape the counter reads, and
|
|
498
|
+
`GATED_TOOLS` names `Execute`, `Create` and `ApplyPatch`
|
|
499
|
+
(`hooks/tezgah_context.py::GATED_TOOLS`).
|
|
500
|
+
- **commandcode:** unavailable: Command Code has no prompt event, so nothing runs the
|
|
501
|
+
counter there.
|
|
502
|
+
- **copilot:** unavailable: Copilot drops a command hook's UserPromptSubmit output,
|
|
503
|
+
so no reminder carries the counter's warning there.
|
|
504
|
+
- **gemini:** unverified. BeforeAgent carries `transcript_path`, but Gemini's
|
|
505
|
+
session file is a format the counter does not read
|
|
506
|
+
(`hooks/tezgah_context.py::_transcript_calls`), so a disarmed gate there likely counts 0.
|
|
507
|
+
- **antigravity:** unavailable: its `transcript.jsonl` is not a format the counter
|
|
508
|
+
reads, so the hook does not hand it over. Only a switch armed mid-session shows.
|
|
509
|
+
- **goose:** unavailable: Goose ignores UserPromptSubmit output, so no reminder
|
|
510
|
+
carries the counter's warning there.
|
|
511
|
+
- **amp:** unavailable: the plugin hands the hook no transcript path, so only a
|
|
512
|
+
switch armed mid-session shows.
|
|
281
513
|
- **omp, opencode:** not applicable: the prompt hook and the gate live in one extension or
|
|
282
514
|
plugin process, so one cannot run without the other.
|
|
283
515
|
- Everywhere: a disarmed PreToolUse beside a working PostToolUse writes rows and is not
|
|
@@ -398,9 +630,14 @@ In order, each step verified by the one below it:
|
|
|
398
630
|
(`hosts/opencode/plugins/tezgah.js:11-14`).
|
|
399
631
|
- **Cursor only runs a PreToolUse hook for the tool types its matcher names**, so
|
|
400
632
|
the matcher must list the write spellings or the gate's edit branches are
|
|
401
|
-
unreachable there (`hosts/cursor/hook.py:
|
|
633
|
+
unreachable there (`hosts/cursor/hook.py:33-42`,
|
|
402
634
|
`bin/tezgah-setup::CURSOR_PRETOOL_MATCHER`).
|
|
403
|
-
- **
|
|
635
|
+
- **Cursor carries the per-turn text only up to 10000 characters.**
|
|
636
|
+
cursor-agent drops a `beforeSubmitPrompt` `additional_context` whole when it is
|
|
637
|
+
longer. A busy turn with every conditional rule armed measured 10288.
|
|
638
|
+
`fit()` cuts the tail to `CONTEXT_MAX` and marks the cut, so the reminder and
|
|
639
|
+
the first rules arrive (`hosts/cursor/hook.py::fit`, `hosts/cursor/hook.py::CONTEXT_MAX`).
|
|
640
|
+
- **Claude, dsh, omp, codex, cursor, qwen, droid, commandcode, copilot, gemini, antigravity, goose and amp run the gate only for the tool names
|
|
404
641
|
their matcher carries**, so a name the PostToolUse side carries and the
|
|
405
642
|
PreToolUse side does not is recorded in the ledger and never refused.
|
|
406
643
|
`PowerShell` and `pwsh` are both `BASH_TOOLS` members
|
|
@@ -411,14 +648,65 @@ In order, each step verified by the one below it:
|
|
|
411
648
|
`hosts/cursor/hooks.json:8` - neither named them until 2026-09-19, so a
|
|
412
649
|
PowerShell call on those two reached no hook at all while the shared rules
|
|
413
650
|
already knew the spelling), and omp's `GATED` list
|
|
414
|
-
(`hosts/omp/tezgah-hook.ts.in:270-273`).
|
|
415
|
-
|
|
651
|
+
(`hosts/omp/tezgah-hook.ts.in:270-273`). Qwen Code has two shell tool ids,
|
|
652
|
+
`run_shell_command` and `monitor`, which `bin/tezgah-setup::QWEN_PRETOOL_MATCHER`
|
|
653
|
+
names beside `notebook_edit` and `mcp__.*`. Claude's and dsh's `Monitor` runs a
|
|
654
|
+
shell command too, so their matcher names it. Droid's shell is `Execute`, which `bin/tezgah-setup::DROID_PRETOOL_MATCHER`
|
|
655
|
+
names beside `Create`, `Edit`, `ApplyPatch`, `Task`, `Grep` and `mcp__.*`. The
|
|
656
|
+
adapter hands ApplyPatch's `input` to the gate as `patch`
|
|
657
|
+
(`hosts/droid/hook.py::gate_input`). Command Code's settings hooks see only
|
|
658
|
+
four tools and test the matcher against their display names (`SHELL`, `READ`,
|
|
659
|
+
`WRITE`, `EDIT`), so `bin/tezgah-setup::COMMANDCODE_PRETOOL_MATCHER` is
|
|
660
|
+
`shell|write|edit`. Its read, MCP, subagent and web tools never reach the
|
|
661
|
+
gate, and plan mode skips every hook. The adapter folds a shell call's `args`
|
|
662
|
+
into `command` and hands an edit's `old_value`/`new_value` over as
|
|
663
|
+
`old_string`/`new_string` (`hosts/commandcode/hook.py::gate_input`). Copilot's
|
|
664
|
+
PascalCase PreToolUse reports Claude tool names and anchors its matcher. So
|
|
665
|
+
`bin/tezgah-setup::COPILOT_PRETOOL_MATCHER` names `Bash`, `Write`, `Edit`,
|
|
666
|
+
`Agent`, `Task` and `Grep`, plus `.+-.+` for an MCP tool's `<server>-<tool>`.
|
|
667
|
+
The adapter maps the runtime spellings too (`bash`, `powershell`, `create`,
|
|
668
|
+
`edit`, `apply_patch`, `task`, `grep`, `rg`). An Edit that names no file but
|
|
669
|
+
carries a patch reaches the gate as `apply_patch`. `<server>-<tool>` becomes
|
|
670
|
+
`mcp__<server>__<tool>` for a server `mcp-config.json` names
|
|
671
|
+
(`hosts/copilot/hook.py::gate_name`). Gemini's BeforeTool matcher is a regex
|
|
672
|
+
over the tool name. `bin/tezgah-setup::GEMINI_PRETOOL_MATCHER` names the
|
|
673
|
+
shell, write, edit and grep tools, the subagent tools
|
|
674
|
+
(`codebase_investigator`, `generalist`, `invoke_agent`) and `mcp_.*`. A user's own subagents are not
|
|
675
|
+
named. `mcp_<server>_<tool>` marks no boundary between server and tool, so it
|
|
676
|
+
reaches the gate as `mcp__<server>_<tool>` (`hosts/gemini/hook.py::gate_name`).
|
|
677
|
+
Antigravity's matcher is a regex over the tool name, and
|
|
678
|
+
`bin/tezgah-setup::ANTIGRAVITY_PRETOOL_MATCHER` names `run_command`,
|
|
679
|
+
`write_to_file`, `replace_file_content`, `multi_replace_file_content`,
|
|
680
|
+
`invoke_subagent` and `grep_search`. The adapter renames their PascalCase
|
|
681
|
+
arguments into the gate's fields (`hosts/antigravity/hook.py::gate_input`).
|
|
682
|
+
`CommandLine` becomes `command`, `TargetFile` and `CodeContent` become
|
|
683
|
+
`file_path` and `content`. `TargetContent` and `ReplacementContent` become
|
|
684
|
+
`old_string` and `new_string`, and `ReplacementChunks` becomes `edits`. The
|
|
685
|
+
docs name no MCP tool spelling, so the matcher names no MCP tool. It names
|
|
686
|
+
neither `manage_task`'s `send_input` nor `schedule`.
|
|
687
|
+
Goose tests a matcher unanchored, so `bin/tezgah-setup::GOOSE_PRETOOL_MATCHER`
|
|
688
|
+
anchors `shell`, `write`, `edit` and `.+__.+`, an extension's
|
|
689
|
+
`<extension>__<tool>`, which reaches the gate as `mcp__<extension>__<tool>`
|
|
690
|
+
(`hosts/goose/hook.py::gate_name`). The adapter hands `write`'s and `edit`'s
|
|
691
|
+
`path` over as `file_path`, and `edit`'s `before`/`after` as
|
|
692
|
+
`old_string`/`new_string` (`hosts/goose/hook.py::gate_input`). Goose's own
|
|
693
|
+
`developer`, `analyze`, `summon` and `code_execution` tools other than these
|
|
694
|
+
three, and its subagent tool, are not named.
|
|
695
|
+
Amp's plugin sends the gate `Bash`, `shell_command`, `edit_file`,
|
|
696
|
+
`create_file`, `apply_patch` and `Task` (its `GATED` list) and an MCP effect
|
|
697
|
+
name. A shell call's text reaches the gate as `command`, from Amp's
|
|
698
|
+
`shellCommandFromToolCall` helper or the input's `cmd`
|
|
699
|
+
(`hosts/amp/hook.py::gate_input`). Read, search, web and `code_exec` calls
|
|
700
|
+
are not gated, and an MCP tool reached through `code_exec` or `tool_search`
|
|
701
|
+
is never seen.
|
|
702
|
+
A host this list does not cover is a host whose shell the gate cannot see.
|
|
416
703
|
- **An MCP effect reaches the gate on every host that can route it**. Claude
|
|
417
704
|
and dsh run it through a PreToolUse group of its own in `hooks/hooks.json` and
|
|
418
705
|
`hosts/dsh/hooks.json`. That group stays apart from the literal one, because
|
|
419
706
|
one regex character would end its exact-name dialect. Its pattern names the
|
|
420
707
|
effect verbs of `hooks/tezgah_integrity.py::MCP_VERBS`, and omp's `tool_call`
|
|
421
|
-
tests the same pattern (`MCP_EFFECT`, `hosts/omp/tezgah-hook.ts.in`)
|
|
708
|
+
tests the same pattern (`MCP_EFFECT`, `hosts/omp/tezgah-hook.ts.in`), as does
|
|
709
|
+
Amp's `tool.call` (`hosts/amp/tezgah-plugin.ts.in`). Both
|
|
422
710
|
hosts read a matcher as an unanchored JavaScript `RegExp`, and the pattern
|
|
423
711
|
uses no lookahead. A read-only MCP call, such as a code-graph query, spawns no
|
|
424
712
|
hook there. Codex's matcher carries `mcp__.*` (`hosts/codex/hooks.json`).
|
|
@@ -451,6 +739,14 @@ In order, each step verified by the one below it:
|
|
|
451
739
|
- `hosts/dsh/hooks.json`, `hosts/dsh/statusline/lib/index.js`
|
|
452
740
|
- `hosts/omp/hook.py`, `hosts/omp/tezgah-hook.ts.in`
|
|
453
741
|
- `hosts/opencode/plugins/tezgah.js`, `hosts/opencode/tui/tezgah-tui.tsx`
|
|
742
|
+
- `hosts/qwen/hook.py`, `tests/e2e_qwen.py` (the opt-in run of the real binary)
|
|
743
|
+
- `hosts/droid/hook.py`, `tests/e2e_droid.py` (the opt-in run of the real binary)
|
|
744
|
+
- `hosts/commandcode/hook.py`
|
|
745
|
+
- `hosts/copilot/hook.py`
|
|
746
|
+
- `hosts/gemini/hook.py`
|
|
747
|
+
- `hosts/antigravity/hook.py`
|
|
748
|
+
- `hosts/goose/hook.py`
|
|
749
|
+
- `hosts/amp/hook.py`, `hosts/amp/tezgah-plugin.ts.in`
|
|
454
750
|
- `statusline.py`, `bin/tezgah-status`, `hooks/tezgah_context.py`
|
|
455
751
|
- `hooks/tezgah_models.py` - the per-host model surface in `## The model wire`
|
|
456
752
|
- `hooks/tezgah_stack.py`, `bin/tezgah-doctor` `--stack` - the order in `## Precedence`
|