@r1z4x/tezgah 1.0.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 +738 -0
- package/LICENSE +21 -0
- package/MANIFEST +753 -0
- package/README.de.md +169 -0
- package/README.es.md +168 -0
- package/README.fr.md +166 -0
- package/README.md +161 -0
- package/README.tr.md +163 -0
- package/agents/tezgah-reviewer.md +70 -0
- package/bin/codegen +337 -0
- package/bin/consult +797 -0
- package/bin/tezgah-adhd +50 -0
- package/bin/tezgah-agents +45 -0
- package/bin/tezgah-capture +66 -0
- package/bin/tezgah-context +96 -0
- package/bin/tezgah-decisions +213 -0
- package/bin/tezgah-design +953 -0
- package/bin/tezgah-docs +1199 -0
- package/bin/tezgah-doctor +497 -0
- package/bin/tezgah-dsh +37 -0
- package/bin/tezgah-dsh.cmd +70 -0
- package/bin/tezgah-gate +75 -0
- package/bin/tezgah-import-ai-research +439 -0
- package/bin/tezgah-index +32 -0
- package/bin/tezgah-lessons +148 -0
- package/bin/tezgah-mcp +322 -0
- package/bin/tezgah-migrate +324 -0
- package/bin/tezgah-pony +50 -0
- package/bin/tezgah-research +772 -0
- package/bin/tezgah-rollback +93 -0
- package/bin/tezgah-route +124 -0
- package/bin/tezgah-setup +5798 -0
- package/bin/tezgah-status +383 -0
- package/bin/tezgah-task +607 -0
- package/bin/tezgah-taste +423 -0
- package/bin/tezgah-triage +485 -0
- package/bin/tezgah.js +36 -0
- package/commands/adhd.md +21 -0
- package/commands/ponytail.md +21 -0
- package/docs/README.md +112 -0
- package/docs/architecture.md +226 -0
- package/docs/citations-baseline.json +59 -0
- package/docs/clarity-baseline.json +116 -0
- package/docs/contract.md +416 -0
- package/docs/environment.md +141 -0
- package/docs/evidence.md +831 -0
- package/docs/feature-audit.md +139 -0
- package/docs/gate.md +407 -0
- package/docs/glossary.md +201 -0
- package/docs/hosts.md +400 -0
- package/docs/index.json +471 -0
- package/docs/judge.md +193 -0
- package/docs/layers.md +189 -0
- package/docs/models.md +160 -0
- package/docs/operations.md +666 -0
- package/docs/research.md +809 -0
- package/docs/results/paired-outcome-2026-10.jsonl +254 -0
- package/docs/results/paired-outcome-2026-10.md +204 -0
- package/docs/skills.md +236 -0
- package/docs/status-line.md +315 -0
- package/docs/testing.md +287 -0
- package/docs/vision.md +117 -0
- package/hooks/hooks.json +33 -0
- package/hooks/projects-auto-init.py +98 -0
- package/hooks/projects-posttooluse.py +149 -0
- package/hooks/projects-pretooluse.py +40 -0
- package/hooks/projects-stop.py +60 -0
- package/hooks/tezgah_agents.py +817 -0
- package/hooks/tezgah_apps.py +266 -0
- package/hooks/tezgah_attest.py +255 -0
- package/hooks/tezgah_clarity.py +171 -0
- package/hooks/tezgah_components.py +140 -0
- package/hooks/tezgah_context.py +2953 -0
- package/hooks/tezgah_embed.py +765 -0
- package/hooks/tezgah_gate.py +2736 -0
- package/hooks/tezgah_guard.py +177 -0
- package/hooks/tezgah_index.py +124 -0
- package/hooks/tezgah_integrity.py +5141 -0
- package/hooks/tezgah_judge.py +487 -0
- package/hooks/tezgah_lang.py +230 -0
- package/hooks/tezgah_lessons.py +210 -0
- package/hooks/tezgah_models.py +855 -0
- package/hooks/tezgah_paths.py +1132 -0
- package/hooks/tezgah_policy.py +1039 -0
- package/hooks/tezgah_rank.py +77 -0
- package/hooks/tezgah_replay.py +1109 -0
- package/hooks/tezgah_research.py +5176 -0
- package/hooks/tezgah_shapes.py +305 -0
- package/hooks/tezgah_skill_pick.py +227 -0
- package/hooks/tezgah_snapshot.py +490 -0
- package/hooks/tezgah_stopspec.py +320 -0
- package/hooks/tezgah_task.py +458 -0
- package/hooks/tezgah_taste.py +201 -0
- package/hooks/tezgah_untrusted.py +112 -0
- package/hooks/tezgah_update.py +430 -0
- package/hosts/codex/hook.py +268 -0
- package/hosts/codex/hooks.json +26 -0
- package/hosts/cursor/hook.py +461 -0
- package/hosts/cursor/hooks.json +44 -0
- package/hosts/dsh/hooks.json +21 -0
- package/hosts/dsh/statusline/lib/client.js +138 -0
- package/hosts/dsh/statusline/lib/index.js +104 -0
- package/hosts/dsh/statusline/package.json +28 -0
- package/hosts/omp/hook.py +277 -0
- package/hosts/omp/tezgah-hook.ts.in +701 -0
- package/hosts/opencode/plugins/tezgah.js +2742 -0
- package/hosts/opencode/tui/tezgah-tui.tsx +151 -0
- package/output-styles/tezgah.md +142 -0
- package/package.json +32 -0
- package/packaging/build.sh +342 -0
- package/packaging/install.ps1 +166 -0
- package/packaging/install.sh +56 -0
- package/packaging/upgrade.sh +142 -0
- package/skills/ai-research/0-autoresearch-skill/SKILL.md +411 -0
- package/skills/ai-research/0-autoresearch-skill/references/agent-continuity.md +95 -0
- package/skills/ai-research/0-autoresearch-skill/references/progress-reporting.md +166 -0
- package/skills/ai-research/0-autoresearch-skill/references/skill-routing.md +219 -0
- package/skills/ai-research/0-autoresearch-skill/templates/findings.md +44 -0
- package/skills/ai-research/0-autoresearch-skill/templates/research-log.md +41 -0
- package/skills/ai-research/01-model-architecture/litgpt/SKILL.md +469 -0
- package/skills/ai-research/01-model-architecture/litgpt/references/custom-models.md +569 -0
- package/skills/ai-research/01-model-architecture/litgpt/references/distributed-training.md +452 -0
- package/skills/ai-research/01-model-architecture/litgpt/references/supported-models.md +337 -0
- package/skills/ai-research/01-model-architecture/litgpt/references/training-recipes.md +620 -0
- package/skills/ai-research/01-model-architecture/mamba/SKILL.md +260 -0
- package/skills/ai-research/01-model-architecture/mamba/references/architecture-details.md +207 -0
- package/skills/ai-research/01-model-architecture/mamba/references/benchmarks.md +256 -0
- package/skills/ai-research/01-model-architecture/mamba/references/training-guide.md +389 -0
- package/skills/ai-research/01-model-architecture/nanogpt/SKILL.md +290 -0
- package/skills/ai-research/01-model-architecture/nanogpt/references/architecture.md +383 -0
- package/skills/ai-research/01-model-architecture/nanogpt/references/data.md +477 -0
- package/skills/ai-research/01-model-architecture/nanogpt/references/training.md +565 -0
- package/skills/ai-research/01-model-architecture/rwkv/SKILL.md +260 -0
- package/skills/ai-research/01-model-architecture/rwkv/references/architecture-details.md +345 -0
- package/skills/ai-research/01-model-architecture/rwkv/references/rwkv7.md +387 -0
- package/skills/ai-research/01-model-architecture/rwkv/references/state-management.md +370 -0
- package/skills/ai-research/01-model-architecture/torchtitan/SKILL.md +358 -0
- package/skills/ai-research/01-model-architecture/torchtitan/references/checkpoint.md +182 -0
- package/skills/ai-research/01-model-architecture/torchtitan/references/custom-models.md +259 -0
- package/skills/ai-research/01-model-architecture/torchtitan/references/float8.md +134 -0
- package/skills/ai-research/01-model-architecture/torchtitan/references/fsdp.md +127 -0
- package/skills/ai-research/02-tokenization/huggingface-tokenizers/SKILL.md +516 -0
- package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/algorithms.md +654 -0
- package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/integration.md +638 -0
- package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/pipeline.md +724 -0
- package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/training.md +566 -0
- package/skills/ai-research/02-tokenization/sentencepiece/SKILL.md +235 -0
- package/skills/ai-research/02-tokenization/sentencepiece/references/algorithms.md +201 -0
- package/skills/ai-research/02-tokenization/sentencepiece/references/training.md +305 -0
- package/skills/ai-research/03-fine-tuning/axolotl/SKILL.md +158 -0
- package/skills/ai-research/03-fine-tuning/axolotl/references/api.md +5549 -0
- package/skills/ai-research/03-fine-tuning/axolotl/references/dataset-formats.md +1030 -0
- package/skills/ai-research/03-fine-tuning/axolotl/references/index.md +16 -0
- package/skills/ai-research/03-fine-tuning/axolotl/references/other.md +3564 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/SKILL.md +80 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/references/_images.md +24 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/references/advanced.md +1056 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/references/getting_started.md +350 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/references/index.md +20 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/references/other.md +32 -0
- package/skills/ai-research/03-fine-tuning/peft/SKILL.md +431 -0
- package/skills/ai-research/03-fine-tuning/peft/references/advanced-usage.md +515 -0
- package/skills/ai-research/03-fine-tuning/peft/references/troubleshooting.md +481 -0
- package/skills/ai-research/03-fine-tuning/unsloth/SKILL.md +80 -0
- package/skills/ai-research/03-fine-tuning/unsloth/references/index.md +8 -0
- package/skills/ai-research/03-fine-tuning/unsloth/references/llms.md +83 -0
- package/skills/ai-research/04-mechanistic-interpretability/nnsight/SKILL.md +436 -0
- package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/README.md +79 -0
- package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/api.md +345 -0
- package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/tutorials.md +301 -0
- package/skills/ai-research/04-mechanistic-interpretability/pyvene/SKILL.md +473 -0
- package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/README.md +74 -0
- package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/api.md +384 -0
- package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/tutorials.md +377 -0
- package/skills/ai-research/04-mechanistic-interpretability/saelens/SKILL.md +386 -0
- package/skills/ai-research/04-mechanistic-interpretability/saelens/references/README.md +71 -0
- package/skills/ai-research/04-mechanistic-interpretability/saelens/references/api.md +334 -0
- package/skills/ai-research/04-mechanistic-interpretability/saelens/references/tutorials.md +319 -0
- package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/SKILL.md +346 -0
- package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/README.md +55 -0
- package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/api.md +363 -0
- package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/tutorials.md +340 -0
- package/skills/ai-research/05-data-processing/nemo-curator/SKILL.md +383 -0
- package/skills/ai-research/05-data-processing/nemo-curator/references/deduplication.md +88 -0
- package/skills/ai-research/05-data-processing/nemo-curator/references/filtering.md +103 -0
- package/skills/ai-research/05-data-processing/ray-data/SKILL.md +326 -0
- package/skills/ai-research/05-data-processing/ray-data/references/integration.md +83 -0
- package/skills/ai-research/05-data-processing/ray-data/references/transformations.md +84 -0
- package/skills/ai-research/06-post-training/grpo-rl-training/README.md +98 -0
- package/skills/ai-research/06-post-training/grpo-rl-training/SKILL.md +572 -0
- package/skills/ai-research/06-post-training/miles/SKILL.md +315 -0
- package/skills/ai-research/06-post-training/miles/references/api-reference.md +142 -0
- package/skills/ai-research/06-post-training/miles/references/troubleshooting.md +353 -0
- package/skills/ai-research/06-post-training/openrlhf/SKILL.md +249 -0
- package/skills/ai-research/06-post-training/openrlhf/references/algorithm-comparison.md +405 -0
- package/skills/ai-research/06-post-training/openrlhf/references/custom-rewards.md +531 -0
- package/skills/ai-research/06-post-training/openrlhf/references/hybrid-engine.md +288 -0
- package/skills/ai-research/06-post-training/openrlhf/references/multi-node-training.md +455 -0
- package/skills/ai-research/06-post-training/simpo/SKILL.md +219 -0
- package/skills/ai-research/06-post-training/simpo/references/datasets.md +479 -0
- package/skills/ai-research/06-post-training/simpo/references/hyperparameters.md +453 -0
- package/skills/ai-research/06-post-training/simpo/references/loss-functions.md +351 -0
- package/skills/ai-research/06-post-training/slime/SKILL.md +464 -0
- package/skills/ai-research/06-post-training/slime/references/api-reference.md +393 -0
- package/skills/ai-research/06-post-training/slime/references/troubleshooting.md +387 -0
- package/skills/ai-research/06-post-training/torchforge/SKILL.md +433 -0
- package/skills/ai-research/06-post-training/torchforge/references/api-reference.md +328 -0
- package/skills/ai-research/06-post-training/torchforge/references/troubleshooting.md +410 -0
- package/skills/ai-research/06-post-training/trl-fine-tuning/SKILL.md +455 -0
- package/skills/ai-research/06-post-training/trl-fine-tuning/references/dpo-variants.md +228 -0
- package/skills/ai-research/06-post-training/trl-fine-tuning/references/online-rl.md +83 -0
- package/skills/ai-research/06-post-training/trl-fine-tuning/references/reward-modeling.md +123 -0
- package/skills/ai-research/06-post-training/trl-fine-tuning/references/sft-training.md +169 -0
- package/skills/ai-research/06-post-training/verl/SKILL.md +391 -0
- package/skills/ai-research/06-post-training/verl/references/api-reference.md +302 -0
- package/skills/ai-research/06-post-training/verl/references/troubleshooting.md +392 -0
- package/skills/ai-research/07-safety-alignment/constitutional-ai/SKILL.md +290 -0
- package/skills/ai-research/07-safety-alignment/llamaguard/SKILL.md +337 -0
- package/skills/ai-research/07-safety-alignment/nemo-guardrails/SKILL.md +297 -0
- package/skills/ai-research/07-safety-alignment/prompt-guard/SKILL.md +312 -0
- package/skills/ai-research/08-distributed-training/accelerate/SKILL.md +332 -0
- package/skills/ai-research/08-distributed-training/accelerate/references/custom-plugins.md +454 -0
- package/skills/ai-research/08-distributed-training/accelerate/references/megatron-integration.md +490 -0
- package/skills/ai-research/08-distributed-training/accelerate/references/performance.md +526 -0
- package/skills/ai-research/08-distributed-training/deepspeed/SKILL.md +141 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/08.md +18 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/09.md +174 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/2020.md +379 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/2023.md +280 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/assets.md +180 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/index.md +36 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/mii.md +119 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/other.md +1192 -0
- package/skills/ai-research/08-distributed-training/megatron-core/SKILL.md +366 -0
- package/skills/ai-research/08-distributed-training/megatron-core/references/benchmarks.md +250 -0
- package/skills/ai-research/08-distributed-training/megatron-core/references/parallelism-guide.md +405 -0
- package/skills/ai-research/08-distributed-training/megatron-core/references/production-examples.md +474 -0
- package/skills/ai-research/08-distributed-training/megatron-core/references/training-recipes.md +548 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/SKILL.md +231 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_async_recipe.md +14 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_overview.md +19 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_recipe.md +18 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_ddp_notes.md +10 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_device_mesh_tutorial.md +22 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_examples_fsdp2.md +15 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fsdp1_api.md +9 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fsdp2_tutorial.md +45 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fully_shard_api.md +49 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_tp_tutorial.md +22 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/ray_train_fsdp2_example.md +13 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/torchtitan_fsdp_notes.md +14 -0
- package/skills/ai-research/08-distributed-training/pytorch-lightning/SKILL.md +346 -0
- package/skills/ai-research/08-distributed-training/pytorch-lightning/references/callbacks.md +437 -0
- package/skills/ai-research/08-distributed-training/pytorch-lightning/references/distributed.md +491 -0
- package/skills/ai-research/08-distributed-training/pytorch-lightning/references/hyperparameter-tuning.md +557 -0
- package/skills/ai-research/08-distributed-training/ray-train/SKILL.md +406 -0
- package/skills/ai-research/08-distributed-training/ray-train/references/multi-node.md +629 -0
- package/skills/ai-research/09-infrastructure/lambda-labs/SKILL.md +545 -0
- package/skills/ai-research/09-infrastructure/lambda-labs/references/advanced-usage.md +612 -0
- package/skills/ai-research/09-infrastructure/lambda-labs/references/troubleshooting.md +531 -0
- package/skills/ai-research/09-infrastructure/modal/SKILL.md +341 -0
- package/skills/ai-research/09-infrastructure/modal/references/advanced-usage.md +504 -0
- package/skills/ai-research/09-infrastructure/modal/references/troubleshooting.md +495 -0
- package/skills/ai-research/09-infrastructure/skypilot/SKILL.md +509 -0
- package/skills/ai-research/09-infrastructure/skypilot/references/advanced-usage.md +492 -0
- package/skills/ai-research/09-infrastructure/skypilot/references/troubleshooting.md +571 -0
- package/skills/ai-research/10-optimization/awq/SKILL.md +310 -0
- package/skills/ai-research/10-optimization/awq/references/advanced-usage.md +325 -0
- package/skills/ai-research/10-optimization/awq/references/troubleshooting.md +345 -0
- package/skills/ai-research/10-optimization/bitsandbytes/SKILL.md +411 -0
- package/skills/ai-research/10-optimization/bitsandbytes/references/memory-optimization.md +522 -0
- package/skills/ai-research/10-optimization/bitsandbytes/references/qlora-training.md +522 -0
- package/skills/ai-research/10-optimization/bitsandbytes/references/quantization-formats.md +448 -0
- package/skills/ai-research/10-optimization/flash-attention/SKILL.md +367 -0
- package/skills/ai-research/10-optimization/flash-attention/references/benchmarks.md +216 -0
- package/skills/ai-research/10-optimization/flash-attention/references/transformers-integration.md +294 -0
- package/skills/ai-research/10-optimization/gguf/SKILL.md +427 -0
- package/skills/ai-research/10-optimization/gguf/references/advanced-usage.md +505 -0
- package/skills/ai-research/10-optimization/gguf/references/troubleshooting.md +443 -0
- package/skills/ai-research/10-optimization/gptq/SKILL.md +450 -0
- package/skills/ai-research/10-optimization/gptq/references/calibration.md +338 -0
- package/skills/ai-research/10-optimization/gptq/references/integration.md +130 -0
- package/skills/ai-research/10-optimization/gptq/references/troubleshooting.md +96 -0
- package/skills/ai-research/10-optimization/hqq/SKILL.md +445 -0
- package/skills/ai-research/10-optimization/hqq/references/advanced-usage.md +529 -0
- package/skills/ai-research/10-optimization/hqq/references/troubleshooting.md +504 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/SKILL.md +319 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/architecture.md +320 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/biomedical.md +498 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/domain-specific.md +626 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/experiment-loop.md +129 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/optimizers.md +330 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/scaling-and-selection.md +428 -0
- package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/SKILL.md +405 -0
- package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/benchmarks.md +394 -0
- package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/custom-tasks.md +425 -0
- package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/issues.md +395 -0
- package/skills/ai-research/11-evaluation/lm-evaluation-harness/SKILL.md +490 -0
- package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/api-evaluation.md +491 -0
- package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/benchmark-guide.md +489 -0
- package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/custom-tasks.md +603 -0
- package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/distributed-eval.md +520 -0
- package/skills/ai-research/11-evaluation/nemo-evaluator/SKILL.md +494 -0
- package/skills/ai-research/11-evaluation/nemo-evaluator/references/adapter-system.md +341 -0
- package/skills/ai-research/11-evaluation/nemo-evaluator/references/configuration.md +448 -0
- package/skills/ai-research/11-evaluation/nemo-evaluator/references/custom-benchmarks.md +316 -0
- package/skills/ai-research/11-evaluation/nemo-evaluator/references/execution-backends.md +362 -0
- package/skills/ai-research/12-inference-serving/llama-cpp/SKILL.md +258 -0
- package/skills/ai-research/12-inference-serving/llama-cpp/references/optimization.md +90 -0
- package/skills/ai-research/12-inference-serving/llama-cpp/references/quantization.md +214 -0
- package/skills/ai-research/12-inference-serving/llama-cpp/references/server.md +126 -0
- package/skills/ai-research/12-inference-serving/sglang/SKILL.md +442 -0
- package/skills/ai-research/12-inference-serving/sglang/references/deployment.md +491 -0
- package/skills/ai-research/12-inference-serving/sglang/references/radix-attention.md +414 -0
- package/skills/ai-research/12-inference-serving/sglang/references/structured-generation.md +542 -0
- package/skills/ai-research/12-inference-serving/tensorrt-llm/SKILL.md +187 -0
- package/skills/ai-research/12-inference-serving/tensorrt-llm/references/multi-gpu.md +299 -0
- package/skills/ai-research/12-inference-serving/tensorrt-llm/references/optimization.md +243 -0
- package/skills/ai-research/12-inference-serving/tensorrt-llm/references/serving.md +471 -0
- package/skills/ai-research/12-inference-serving/vllm/SKILL.md +364 -0
- package/skills/ai-research/12-inference-serving/vllm/references/optimization.md +227 -0
- package/skills/ai-research/12-inference-serving/vllm/references/quantization.md +285 -0
- package/skills/ai-research/12-inference-serving/vllm/references/server-deployment.md +256 -0
- package/skills/ai-research/12-inference-serving/vllm/references/troubleshooting.md +448 -0
- package/skills/ai-research/13-mlops/mlflow/SKILL.md +704 -0
- package/skills/ai-research/13-mlops/mlflow/references/deployment.md +745 -0
- package/skills/ai-research/13-mlops/mlflow/references/model-registry.md +771 -0
- package/skills/ai-research/13-mlops/mlflow/references/tracking.md +681 -0
- package/skills/ai-research/13-mlops/swanlab/SKILL.md +406 -0
- package/skills/ai-research/13-mlops/swanlab/references/integrations.md +305 -0
- package/skills/ai-research/13-mlops/swanlab/references/visualization.md +234 -0
- package/skills/ai-research/13-mlops/tensorboard/SKILL.md +629 -0
- package/skills/ai-research/13-mlops/tensorboard/references/integrations.md +639 -0
- package/skills/ai-research/13-mlops/tensorboard/references/profiling.md +546 -0
- package/skills/ai-research/13-mlops/tensorboard/references/visualization.md +621 -0
- package/skills/ai-research/13-mlops/weights-and-biases/SKILL.md +590 -0
- package/skills/ai-research/13-mlops/weights-and-biases/references/artifacts.md +585 -0
- package/skills/ai-research/13-mlops/weights-and-biases/references/integrations.md +701 -0
- package/skills/ai-research/13-mlops/weights-and-biases/references/sweeps.md +848 -0
- package/skills/ai-research/14-agents/a-evolve/SKILL.md +383 -0
- package/skills/ai-research/14-agents/a-evolve/references/README.md +831 -0
- package/skills/ai-research/14-agents/a-evolve/references/api.md +594 -0
- package/skills/ai-research/14-agents/a-evolve/references/architecture.md +417 -0
- package/skills/ai-research/14-agents/a-evolve/references/design-patterns.md +462 -0
- package/skills/ai-research/14-agents/a-evolve/references/examples.md +352 -0
- package/skills/ai-research/14-agents/a-evolve/references/issues.md +591 -0
- package/skills/ai-research/14-agents/a-evolve/references/releases.md +112 -0
- package/skills/ai-research/14-agents/a-evolve/references/tutorials.md +819 -0
- package/skills/ai-research/14-agents/autogpt/SKILL.md +403 -0
- package/skills/ai-research/14-agents/autogpt/references/advanced-usage.md +536 -0
- package/skills/ai-research/14-agents/autogpt/references/troubleshooting.md +421 -0
- package/skills/ai-research/14-agents/crewai/SKILL.md +498 -0
- package/skills/ai-research/14-agents/crewai/references/flows.md +439 -0
- package/skills/ai-research/14-agents/crewai/references/tools.md +430 -0
- package/skills/ai-research/14-agents/crewai/references/troubleshooting.md +481 -0
- package/skills/ai-research/14-agents/langchain/SKILL.md +480 -0
- package/skills/ai-research/14-agents/langchain/references/agents.md +500 -0
- package/skills/ai-research/14-agents/langchain/references/integration.md +563 -0
- package/skills/ai-research/14-agents/langchain/references/rag.md +601 -0
- package/skills/ai-research/14-agents/llamaindex/SKILL.md +569 -0
- package/skills/ai-research/14-agents/llamaindex/references/agents.md +84 -0
- package/skills/ai-research/14-agents/llamaindex/references/data_connectors.md +109 -0
- package/skills/ai-research/14-agents/llamaindex/references/query_engines.md +407 -0
- package/skills/ai-research/15-rag/chroma/SKILL.md +406 -0
- package/skills/ai-research/15-rag/chroma/references/integration.md +39 -0
- package/skills/ai-research/15-rag/faiss/SKILL.md +221 -0
- package/skills/ai-research/15-rag/faiss/references/index_types.md +281 -0
- package/skills/ai-research/15-rag/pinecone/SKILL.md +358 -0
- package/skills/ai-research/15-rag/pinecone/references/deployment.md +182 -0
- package/skills/ai-research/15-rag/qdrant/SKILL.md +493 -0
- package/skills/ai-research/15-rag/qdrant/references/advanced-usage.md +649 -0
- package/skills/ai-research/15-rag/qdrant/references/troubleshooting.md +632 -0
- package/skills/ai-research/15-rag/sentence-transformers/SKILL.md +255 -0
- package/skills/ai-research/15-rag/sentence-transformers/references/models.md +124 -0
- package/skills/ai-research/16-prompt-engineering/dspy/SKILL.md +590 -0
- package/skills/ai-research/16-prompt-engineering/dspy/references/examples.md +664 -0
- package/skills/ai-research/16-prompt-engineering/dspy/references/modules.md +476 -0
- package/skills/ai-research/16-prompt-engineering/dspy/references/optimizers.md +567 -0
- package/skills/ai-research/16-prompt-engineering/guidance/SKILL.md +572 -0
- package/skills/ai-research/16-prompt-engineering/guidance/references/backends.md +555 -0
- package/skills/ai-research/16-prompt-engineering/guidance/references/constraints.md +675 -0
- package/skills/ai-research/16-prompt-engineering/guidance/references/examples.md +768 -0
- package/skills/ai-research/16-prompt-engineering/instructor/SKILL.md +740 -0
- package/skills/ai-research/16-prompt-engineering/instructor/references/examples.md +108 -0
- package/skills/ai-research/16-prompt-engineering/instructor/references/providers.md +71 -0
- package/skills/ai-research/16-prompt-engineering/instructor/references/validation.md +607 -0
- package/skills/ai-research/16-prompt-engineering/outlines/SKILL.md +652 -0
- package/skills/ai-research/16-prompt-engineering/outlines/references/backends.md +616 -0
- package/skills/ai-research/16-prompt-engineering/outlines/references/examples.md +774 -0
- package/skills/ai-research/16-prompt-engineering/outlines/references/json_generation.md +653 -0
- package/skills/ai-research/17-observability/langsmith/SKILL.md +422 -0
- package/skills/ai-research/17-observability/langsmith/references/advanced-usage.md +549 -0
- package/skills/ai-research/17-observability/langsmith/references/troubleshooting.md +538 -0
- package/skills/ai-research/17-observability/phoenix/SKILL.md +475 -0
- package/skills/ai-research/17-observability/phoenix/references/advanced-usage.md +620 -0
- package/skills/ai-research/17-observability/phoenix/references/troubleshooting.md +539 -0
- package/skills/ai-research/18-multimodal/audiocraft/SKILL.md +564 -0
- package/skills/ai-research/18-multimodal/audiocraft/references/advanced-usage.md +667 -0
- package/skills/ai-research/18-multimodal/audiocraft/references/troubleshooting.md +505 -0
- package/skills/ai-research/18-multimodal/blip-2/SKILL.md +564 -0
- package/skills/ai-research/18-multimodal/blip-2/references/advanced-usage.md +681 -0
- package/skills/ai-research/18-multimodal/blip-2/references/troubleshooting.md +527 -0
- package/skills/ai-research/18-multimodal/clip/SKILL.md +253 -0
- package/skills/ai-research/18-multimodal/clip/references/applications.md +208 -0
- package/skills/ai-research/18-multimodal/cosmos-policy/SKILL.md +402 -0
- package/skills/ai-research/18-multimodal/cosmos-policy/references/libero-commands.md +175 -0
- package/skills/ai-research/18-multimodal/cosmos-policy/references/robocasa-commands.md +147 -0
- package/skills/ai-research/18-multimodal/llava/SKILL.md +304 -0
- package/skills/ai-research/18-multimodal/llava/references/training.md +198 -0
- package/skills/ai-research/18-multimodal/openpi/SKILL.md +480 -0
- package/skills/ai-research/18-multimodal/openpi/references/checkpoints-and-env-map.md +86 -0
- package/skills/ai-research/18-multimodal/openpi/references/config-recipes.md +50 -0
- package/skills/ai-research/18-multimodal/openpi/references/pytorch-gotchas.md +49 -0
- package/skills/ai-research/18-multimodal/openpi/references/remote-client-pattern.md +48 -0
- package/skills/ai-research/18-multimodal/openpi/references/training-debugging.md +46 -0
- package/skills/ai-research/18-multimodal/openvla-oft/SKILL.md +441 -0
- package/skills/ai-research/18-multimodal/openvla-oft/references/aloha-workflow.md +141 -0
- package/skills/ai-research/18-multimodal/openvla-oft/references/config-troubleshooting.md +97 -0
- package/skills/ai-research/18-multimodal/openvla-oft/references/libero-workflow.md +115 -0
- package/skills/ai-research/18-multimodal/openvla-oft/references/paper-and-checkpoints.md +84 -0
- package/skills/ai-research/18-multimodal/segment-anything/SKILL.md +500 -0
- package/skills/ai-research/18-multimodal/segment-anything/references/advanced-usage.md +590 -0
- package/skills/ai-research/18-multimodal/segment-anything/references/troubleshooting.md +485 -0
- package/skills/ai-research/18-multimodal/stable-diffusion/SKILL.md +519 -0
- package/skills/ai-research/18-multimodal/stable-diffusion/references/advanced-usage.md +717 -0
- package/skills/ai-research/18-multimodal/stable-diffusion/references/troubleshooting.md +556 -0
- package/skills/ai-research/18-multimodal/whisper/SKILL.md +317 -0
- package/skills/ai-research/18-multimodal/whisper/references/languages.md +190 -0
- package/skills/ai-research/19-emerging-techniques/knowledge-distillation/SKILL.md +458 -0
- package/skills/ai-research/19-emerging-techniques/knowledge-distillation/references/minillm.md +335 -0
- package/skills/ai-research/19-emerging-techniques/long-context/SKILL.md +536 -0
- package/skills/ai-research/19-emerging-techniques/long-context/references/extension_methods.md +469 -0
- package/skills/ai-research/19-emerging-techniques/long-context/references/fine_tuning.md +612 -0
- package/skills/ai-research/19-emerging-techniques/long-context/references/rope.md +403 -0
- package/skills/ai-research/19-emerging-techniques/model-merging/SKILL.md +497 -0
- package/skills/ai-research/19-emerging-techniques/model-merging/references/coefficient-tuning.md +415 -0
- package/skills/ai-research/19-emerging-techniques/model-merging/references/evaluation.md +463 -0
- package/skills/ai-research/19-emerging-techniques/model-merging/references/examples.md +429 -0
- package/skills/ai-research/19-emerging-techniques/model-merging/references/methods.md +353 -0
- package/skills/ai-research/19-emerging-techniques/model-pruning/SKILL.md +495 -0
- package/skills/ai-research/19-emerging-techniques/model-pruning/references/wanda.md +348 -0
- package/skills/ai-research/19-emerging-techniques/moe-training/SKILL.md +526 -0
- package/skills/ai-research/19-emerging-techniques/moe-training/references/architectures.md +433 -0
- package/skills/ai-research/19-emerging-techniques/moe-training/references/inference.md +349 -0
- package/skills/ai-research/19-emerging-techniques/moe-training/references/training.md +426 -0
- package/skills/ai-research/19-emerging-techniques/speculative-decoding/SKILL.md +467 -0
- package/skills/ai-research/19-emerging-techniques/speculative-decoding/references/lookahead.md +310 -0
- package/skills/ai-research/19-emerging-techniques/speculative-decoding/references/medusa.md +351 -0
- package/skills/ai-research/20-ml-paper-writing/academic-plotting/SKILL.md +479 -0
- package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/data-visualization.md +509 -0
- package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/diagram-generation.md +395 -0
- package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/style-guide.md +305 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/SKILL.md +982 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/checklists.md +348 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/citation-workflow.md +563 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/reviewer-guidelines.md +349 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/sources.md +165 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/writing-guide.md +477 -0
- package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/SKILL.md +298 -0
- package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/references/slide-templates.md +505 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/SKILL.md +270 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/checklist.md +279 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/reviewer-guidelines.md +116 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/section-blueprints.md +400 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/systems-conferences.md +261 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/writing-patterns.md +231 -0
- package/skills/ai-research/21-research-ideation/brainstorming-research-ideas/SKILL.md +384 -0
- package/skills/ai-research/21-research-ideation/creative-thinking-for-research/SKILL.md +366 -0
- package/skills/ai-research/22-agent-native-research-artifact/compiler/SKILL.md +245 -0
- package/skills/ai-research/22-agent-native-research-artifact/compiler/references/ara-schema.md +439 -0
- package/skills/ai-research/22-agent-native-research-artifact/compiler/references/exploration-tree-spec.md +125 -0
- package/skills/ai-research/22-agent-native-research-artifact/compiler/references/validation-checklist.md +149 -0
- package/skills/ai-research/22-agent-native-research-artifact/research-manager/SKILL.md +324 -0
- package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/event-taxonomy.md +124 -0
- package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/provenance-tags.md +190 -0
- package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/session-protocol.md +162 -0
- package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/SKILL.md +322 -0
- package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/references/review-dimensions.md +182 -0
- package/skills/ai-research/SKILL.md +101 -0
- package/skills/ai-research/SOURCE +38 -0
- package/skills/ai-research/index/1-frame.md +18 -0
- package/skills/ai-research/index/2-data.md +21 -0
- package/skills/ai-research/index/3-train.md +48 -0
- package/skills/ai-research/index/4-measure.md +25 -0
- package/skills/ai-research/index/5-run.md +23 -0
- package/skills/ai-research/index/6-write.md +35 -0
- package/skills/ai-research/library.json +3456 -0
- package/skills/analyze-app/EVALS.md +82 -0
- package/skills/analyze-app/SKILL.md +188 -0
- package/skills/design-contract/EVALS.md +80 -0
- package/skills/design-contract/SKILL.md +171 -0
- package/skills/design-library/EVALS.md +85 -0
- package/skills/design-library/INDEX.md +59 -0
- package/skills/design-library/SKILL.md +58 -0
- package/skills/design-library/SOURCE +131 -0
- package/skills/design-library/adaptive-interfaces/skills/colour-independence/SKILL.md +90 -0
- package/skills/design-library/adaptive-interfaces/skills/flexible-typography/SKILL.md +83 -0
- package/skills/design-library/adaptive-interfaces/skills/information-density/SKILL.md +87 -0
- package/skills/design-library/adaptive-interfaces/skills/preference-audit/SKILL.md +70 -0
- package/skills/design-library/adaptive-interfaces/skills/responsive-accessibility/SKILL.md +86 -0
- package/skills/design-library/adaptive-interfaces/skills/responsive-review/SKILL.md +76 -0
- package/skills/design-library/adaptive-interfaces/skills/simplified-views/SKILL.md +97 -0
- package/skills/design-library/adaptive-interfaces/skills/specify/SKILL.md +63 -0
- package/skills/design-library/adaptive-interfaces/skills/user-preference-respect/SKILL.md +100 -0
- package/skills/design-library/cognitive-accessibility/skills/adaptive-personalisation/SKILL.md +61 -0
- package/skills/design-library/cognitive-accessibility/skills/assess-load/SKILL.md +48 -0
- package/skills/design-library/cognitive-accessibility/skills/cognitive-load-assessment/SKILL.md +60 -0
- package/skills/design-library/cognitive-accessibility/skills/contextual-help-design/SKILL.md +61 -0
- package/skills/design-library/cognitive-accessibility/skills/error-prevention-recovery/SKILL.md +71 -0
- package/skills/design-library/cognitive-accessibility/skills/focus-attention-design/SKILL.md +67 -0
- package/skills/design-library/cognitive-accessibility/skills/memory-load-reduction/SKILL.md +60 -0
- package/skills/design-library/cognitive-accessibility/skills/plain-language-design/SKILL.md +78 -0
- package/skills/design-library/cognitive-accessibility/skills/review/SKILL.md +56 -0
- package/skills/design-library/cognitive-accessibility/skills/simplify/SKILL.md +39 -0
- package/skills/design-library/cognitive-accessibility/skills/wayfinding-navigation/SKILL.md +64 -0
- package/skills/design-library/design-research/skills/behavioural-analytics/SKILL.md +33 -0
- package/skills/design-library/design-research/skills/qual-quant-triangulation/SKILL.md +33 -0
- package/skills/design-library/inclusive-interaction/skills/audit/SKILL.md +50 -0
- package/skills/design-library/inclusive-interaction/skills/design-flow/SKILL.md +58 -0
- package/skills/design-library/inclusive-interaction/skills/feedback-and-status/SKILL.md +76 -0
- package/skills/design-library/inclusive-interaction/skills/gesture-alternatives/SKILL.md +70 -0
- package/skills/design-library/inclusive-interaction/skills/keyboard-navigation/SKILL.md +99 -0
- package/skills/design-library/inclusive-interaction/skills/keyboard-review/SKILL.md +54 -0
- package/skills/design-library/inclusive-interaction/skills/motion-sensitivity/SKILL.md +79 -0
- package/skills/design-library/inclusive-interaction/skills/multi-modal-input/SKILL.md +70 -0
- package/skills/design-library/inclusive-interaction/skills/touch-target-design/SKILL.md +71 -0
- package/skills/design-library/inclusive-interaction/skills/voice-interaction/SKILL.md +68 -0
- package/skills/design-library/visual-critique/skills/critique-affordance/SKILL.md +45 -0
- package/skills/design-library/visual-critique/skills/critique-brand-consistency/SKILL.md +42 -0
- package/skills/design-library/visual-critique/skills/critique-color/SKILL.md +44 -0
- package/skills/design-library/visual-critique/skills/critique-composition/SKILL.md +46 -0
- package/skills/design-library/visual-critique/skills/critique-information-density/SKILL.md +45 -0
- package/skills/design-library/visual-critique/skills/critique-typography/SKILL.md +45 -0
- package/skills/design-library/visual-critique/skills/critique-visual-hierarchy/SKILL.md +40 -0
- package/skills/feature-audit/EVALS.md +83 -0
- package/skills/feature-audit/SKILL.md +326 -0
- package/skills/harness/EVALS.md +81 -0
- package/skills/harness/SKILL.md +88 -0
- package/skills/i-have-adhd/EVALS.md +80 -0
- package/skills/i-have-adhd/SKILL.md +183 -0
- package/skills/no-ai-slop/EVALS.md +89 -0
- package/skills/no-ai-slop/SKILL.md +209 -0
- package/skills/no-ai-slop/eval.md +52 -0
- package/skills/plan-add/EVALS.md +79 -0
- package/skills/plan-add/SKILL.md +179 -0
- package/skills/plan-add/render_table.py +72 -0
- package/skills/plan-status/EVALS.md +78 -0
- package/skills/plan-status/SKILL.md +52 -0
- package/skills/plan-sync/EVALS.md +80 -0
- package/skills/plan-sync/SKILL.md +69 -0
- package/skills/pm-frameworks/SKILL.md +33 -0
- package/skills/pm-frameworks/SOURCE +39 -0
- package/skills/pm-frameworks/intended-vs-implemented/SKILL.md +42 -0
- package/skills/pm-frameworks/opportunity-solution-tree/SKILL.md +64 -0
- package/skills/ponytail/EVALS.md +80 -0
- package/skills/ponytail/SKILL.md +124 -0
- package/skills/product-analysis/EVALS.md +103 -0
- package/skills/product-analysis/SKILL.md +361 -0
- package/skills/research/EVALS.md +104 -0
- package/skills/research/SKILL.md +570 -0
- package/skills/rl-env/SKILL.md +53 -0
- package/skills/rl-env/SOURCE +41 -0
- package/skills/rl-env/generate-nemo-gym-env/SKILL.md +169 -0
- package/skills/rl-env/generate-nemo-gym-env/references/architecture.md +114 -0
- package/skills/rl-env/generate-openenv-env/SKILL.md +183 -0
- package/skills/rl-env/generate-openenv-env/references/architecture.md +82 -0
- package/skills/rl-env/generate-ors-env/SKILL.md +209 -0
- package/skills/rl-env/generate-ors-env/references/architecture.md +113 -0
- package/skills/rl-env/generate-verifiers-env/SKILL.md +188 -0
- package/skills/rl-env/generate-verifiers-env/references/architecture.md +119 -0
- package/skills/rl-env/rl-env-from-description/SKILL.md +124 -0
- package/skills/rl-env/rl-env-from-description/references/interview.md +75 -0
- package/skills/rl-env/rl-env-from-description/references/nemo_gym.md +41 -0
- package/skills/rl-env/rl-env-from-description/references/openenv.md +35 -0
- package/skills/rl-env/rl-env-from-description/references/ors.md +50 -0
- package/skills/rl-env/rl-env-from-description/references/verifiers.md +39 -0
- package/skills/tezgah-contract/EVALS.md +78 -0
- package/skills/tezgah-contract/SKILL.md +792 -0
- package/statusline.py +129 -0
- package/workflows/graph-impact.js +153 -0
- package/workflows/graph-map.js +158 -0
- package/workflows/graph-review.js +170 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"""The browser and mobile app-analysis MCP servers tezgah wires into each host.
|
|
2
|
+
|
|
3
|
+
One source of truth: one row per feature in `REGISTRY`. tezgah-setup renders the
|
|
4
|
+
rows a selection enables into opencode.json, Codex config.toml, Cursor mcp.json,
|
|
5
|
+
omp's mcp.json and the dsh patch, so the per-host configs cannot drift; Claude
|
|
6
|
+
reads the `.mcp.json` at the plugin root, which the installer renders from the
|
|
7
|
+
same rows. A row carries the vendor command and env of its server, the `default`
|
|
8
|
+
state a config without a `features` key means, and the `dep` it cannot start
|
|
9
|
+
without - so what is wired, what is installed and what is reported all answer
|
|
10
|
+
from one key.
|
|
11
|
+
|
|
12
|
+
Both servers drive the app from its accessibility / DOM / native view tree, so
|
|
13
|
+
an analysis run does not need a screenshot per step; a screenshot is an
|
|
14
|
+
explicit, on-demand action. The browser profile is isolated by default - the
|
|
15
|
+
user's real Chrome is only reached by a deliberate attach, never automatically.
|
|
16
|
+
|
|
17
|
+
Nothing here is installed by tezgah: the commands run through `npx`, which is
|
|
18
|
+
present wherever node is (the dsh host and its status line already need it).
|
|
19
|
+
"""
|
|
20
|
+
import os
|
|
21
|
+
import sys
|
|
22
|
+
|
|
23
|
+
HOME = os.path.expanduser("~")
|
|
24
|
+
|
|
25
|
+
# Where screenshots, traces and tree dumps land. The agent gets a path back;
|
|
26
|
+
# image bytes are never inlined into the prompt.
|
|
27
|
+
ARTIFACTS = os.environ.get("TEZGAH_ARTIFACTS") or os.path.join(
|
|
28
|
+
os.environ.get("XDG_CACHE_HOME") or os.path.join(HOME, ".cache"),
|
|
29
|
+
"tezgah", "apps")
|
|
30
|
+
|
|
31
|
+
# Pinned on purpose. A floating tag (`@latest`) makes every session start fetch
|
|
32
|
+
# whatever is current on the registry and run it with the agent's privileges -
|
|
33
|
+
# a supply-chain defect a 2,660-harness study found in 9.8% of committed agent
|
|
34
|
+
# configurations ("Scanning the Harness", arXiv 2609.07360). Bump these
|
|
35
|
+
# deliberately, not implicitly.
|
|
36
|
+
# Playwright MCP exposes core tools only unless capabilities are named, and the
|
|
37
|
+
# caps are exactly what a product audit needs: `testing` turns a UX claim into a
|
|
38
|
+
# re-runnable assertion (browser_verify_*), `storage` reaches a logged-in surface
|
|
39
|
+
# by saving and restoring a state file instead of attaching to the user's real
|
|
40
|
+
# Chrome, and `network` sets the offline state and mocks a failure - the two
|
|
41
|
+
# states a mobile-first product is judged on. `devtools` (traces, video) stays
|
|
42
|
+
# off: the opt-in chrome-devtools sidecar owns perf and deep network, and a
|
|
43
|
+
# second copy of it would only widen the tool list.
|
|
44
|
+
_PLAYWRIGHT = ["npx", "-y", "@playwright/mcp@0.0.81", "--isolated",
|
|
45
|
+
"--caps=testing,storage,network"]
|
|
46
|
+
_CHROME_DEVTOOLS = ["npx", "-y", "chrome-devtools-mcp@1.9.0", "--isolated",
|
|
47
|
+
"--no-usage-statistics"]
|
|
48
|
+
_MOBILE = ["npx", "-y", "@mobilenext/mobile-mcp@1.0.4"]
|
|
49
|
+
|
|
50
|
+
# The browser build the playwright row launches, installed by the same Playwright
|
|
51
|
+
# version that server ships: `@playwright/mcp@0.0.81` declares
|
|
52
|
+
# `playwright@1.64.0-alpha-2026-09-14` as its own dependency (read from its
|
|
53
|
+
# published package.json), and a browser cache written by another version can be
|
|
54
|
+
# the wrong revision for it. Bumping `_PLAYWRIGHT` means bumping this with it.
|
|
55
|
+
_PW_BROWSERS = ["npx", "-y", "playwright@1.64.0-alpha-2026-09-14",
|
|
56
|
+
"install", "chromium"]
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# ------------------------------------------------------------------- probes ---
|
|
60
|
+
# Each probe answers "can this feature start?", not "is it wired": the wiring is
|
|
61
|
+
# tezgah's own file and the report reads that separately. They are called only
|
|
62
|
+
# when a feature's state is asked for, so `shutil` and `tezgah_paths` are
|
|
63
|
+
# imported here rather than at module level - this module is a leaf the
|
|
64
|
+
# installer imports on every host.
|
|
65
|
+
|
|
66
|
+
def _which(name):
|
|
67
|
+
import shutil
|
|
68
|
+
return shutil.which(name)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _tp(attr):
|
|
72
|
+
import tezgah_paths
|
|
73
|
+
return getattr(tezgah_paths, attr)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _browser_caches():
|
|
77
|
+
"""Every directory Playwright itself would look in, in its own order.
|
|
78
|
+
|
|
79
|
+
`PLAYWRIGHT_BROWSERS_PATH=0` means "beside the package", which for an
|
|
80
|
+
npx-fetched server is inside the npx cache; the probe treats it as any other
|
|
81
|
+
miss instead of guessing a path there."""
|
|
82
|
+
local = os.environ.get("LOCALAPPDATA")
|
|
83
|
+
return tuple(p for p in (
|
|
84
|
+
os.environ.get("PLAYWRIGHT_BROWSERS_PATH"),
|
|
85
|
+
os.path.join(HOME, "Library", "Caches", "ms-playwright"),
|
|
86
|
+
os.path.join(HOME, ".cache", "ms-playwright"),
|
|
87
|
+
os.path.join(local, "ms-playwright") if local else None,
|
|
88
|
+
) if p)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _playwright_browsers():
|
|
92
|
+
"""A browser cache holding a build, or None.
|
|
93
|
+
|
|
94
|
+
The server launches a browser on its first tool call, so one wired without a
|
|
95
|
+
build fails there instead of at install time - which is what the probe is
|
|
96
|
+
for. Any build counts: the row's own pin decides which one."""
|
|
97
|
+
for d in _browser_caches():
|
|
98
|
+
try:
|
|
99
|
+
found = sorted(e for e in os.listdir(d)
|
|
100
|
+
if e.startswith(("chromium", "firefox", "webkit")))
|
|
101
|
+
except OSError:
|
|
102
|
+
continue
|
|
103
|
+
if found:
|
|
104
|
+
return os.path.join(d, found[0])
|
|
105
|
+
return None
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _probe_playwright():
|
|
109
|
+
"""`npx` to start the server, and a browser build for it to launch."""
|
|
110
|
+
if not _which("npx"):
|
|
111
|
+
return None
|
|
112
|
+
return _playwright_browsers()
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _probe_device_toolchain():
|
|
116
|
+
"""`adb` (Android platform tools) or `xcrun` (macOS, whose simulator
|
|
117
|
+
services arrive with Xcode). Either one drives a device the native tree is
|
|
118
|
+
read from; no server here can start a device itself."""
|
|
119
|
+
return _which("adb") or _which("xcrun")
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _probe_npx():
|
|
123
|
+
return _which("npx")
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _probe_orx():
|
|
127
|
+
return _tp("orx_bin")()
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# The fetch-and-convert step of an embedding row, run by the installer as its
|
|
131
|
+
# `cmd`, and the probe that answers whether the pinned file is in place.
|
|
132
|
+
_EMBED = os.path.join(os.path.dirname(os.path.abspath(__file__)), "tezgah_embed.py")
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _embed():
|
|
136
|
+
import tezgah_embed
|
|
137
|
+
return tezgah_embed
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def _embed_row(ident, name, model):
|
|
141
|
+
return {"id": ident, "name": name,
|
|
142
|
+
"why": "lessons and docs ranked by meaning as well as words (%s)" % model,
|
|
143
|
+
"command": None, "env": None, "default": False,
|
|
144
|
+
# removed by --disable: the file is tezgah's own, not a tool the
|
|
145
|
+
# user may want for something else
|
|
146
|
+
"remove": lambda: _embed().remove(ident),
|
|
147
|
+
"dep": {"name": ident, "probe": lambda: _embed().valid(ident),
|
|
148
|
+
"needs": (sys.executable,),
|
|
149
|
+
"cmd": [sys.executable, _EMBED, "fetch", ident],
|
|
150
|
+
"why": "the converted model file under ~/.cache/tezgah/embed "
|
|
151
|
+
"(missing, or not the pinned sha256)"}}
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
# ----------------------------------------------------------------- registry ---
|
|
155
|
+
# One row per feature id. `command`/`env` are the server spec, so a row without
|
|
156
|
+
# a `command` is a feature with no host file to write (nothing iterates those
|
|
157
|
+
# into a host config - `servers()` is the accessor that filters them). `dep` is
|
|
158
|
+
# the runtime the feature cannot start without, in the shape the installer's own
|
|
159
|
+
# `DEPS` table uses: `probe` answers whether it is there, `needs` names the
|
|
160
|
+
# tools its `cmd` requires on PATH, `cmd` is the vendor's own installer, and a
|
|
161
|
+
# `cmd` of None is a dependency with no unattended installer to name - the
|
|
162
|
+
# probe still fails honestly instead of wiring a server whose runtime is absent.
|
|
163
|
+
REGISTRY = (
|
|
164
|
+
{"id": "mcp-playwright",
|
|
165
|
+
"name": "playwright",
|
|
166
|
+
"why": "web app analysis from the accessibility tree",
|
|
167
|
+
"command": _PLAYWRIGHT,
|
|
168
|
+
"env": {"PLAYWRIGHT_MCP_OUTPUT_DIR": ARTIFACTS},
|
|
169
|
+
"default": True,
|
|
170
|
+
"dep": {"name": "playwright-browsers", "probe": _probe_playwright,
|
|
171
|
+
"needs": ("npx",), "cmd": _PW_BROWSERS,
|
|
172
|
+
"why": "the browser it launches on its first tool call"}},
|
|
173
|
+
{"id": "mcp-mobile-mcp",
|
|
174
|
+
"name": "mobile-mcp",
|
|
175
|
+
"why": "iOS Simulator / Android emulator from the native tree",
|
|
176
|
+
"command": _MOBILE,
|
|
177
|
+
"env": {"MOBILEMCP_DISABLE_TELEMETRY": "1"},
|
|
178
|
+
"default": True,
|
|
179
|
+
"dep": {"name": "device-toolchain", "probe": _probe_device_toolchain,
|
|
180
|
+
"needs": (),
|
|
181
|
+
# Neither channel is an unattended vendor installer: Xcode comes
|
|
182
|
+
# from the App Store, the Android SDK from its own manager.
|
|
183
|
+
"cmd": None,
|
|
184
|
+
"why": "adb or Xcode's simulator services, for the device it drives"}},
|
|
185
|
+
# Opt-in (`--enable mcp-chrome-devtools`, or `--devtools`): perf traces, deep
|
|
186
|
+
# network and source-mapped console. Playwright's tree snapshot is the
|
|
187
|
+
# analysis default; this is the diagnostic sidecar the second opinion
|
|
188
|
+
# recommended keeping separate.
|
|
189
|
+
{"id": "mcp-chrome-devtools",
|
|
190
|
+
"name": "chrome-devtools",
|
|
191
|
+
"why": "web perf traces, deep network and source-mapped console",
|
|
192
|
+
"command": _CHROME_DEVTOOLS,
|
|
193
|
+
"env": {},
|
|
194
|
+
"default": False,
|
|
195
|
+
"dep": {"name": "npx", "probe": _probe_npx, "needs": (),
|
|
196
|
+
# The package itself is fetched by npx on demand, and node has no
|
|
197
|
+
# unattended vendor installer to name here.
|
|
198
|
+
"cmd": None,
|
|
199
|
+
"why": "node, which npx runs the server through"}},
|
|
200
|
+
# Not a server: the OpenResearch CLI the research routing shells out to.
|
|
201
|
+
# Same dep record the installer's DEPS table carries for it.
|
|
202
|
+
{"id": "orx",
|
|
203
|
+
"name": "orx",
|
|
204
|
+
"why": "research routing (OpenResearch)",
|
|
205
|
+
"command": None,
|
|
206
|
+
"env": None,
|
|
207
|
+
"default": True,
|
|
208
|
+
"dep": {"name": "orx", "probe": _probe_orx, "needs": ("curl", "sh"),
|
|
209
|
+
"cmd": ["sh", "-c",
|
|
210
|
+
"curl -LsSf https://openresearch.sh/install.sh | sh"],
|
|
211
|
+
"why": "research routing (OpenResearch)"}},
|
|
212
|
+
# Opt-in, not servers: a static embedding model fused with BM25 for the
|
|
213
|
+
# per-turn lessons and the docs fallback (hooks/tezgah_embed.py). Enabling
|
|
214
|
+
# one fetches and converts its pinned file; the first selected one is used.
|
|
215
|
+
_embed_row("embed-mrl", "embed-mrl",
|
|
216
|
+
"static-similarity-mrl-multilingual-v1, 128 dims, "
|
|
217
|
+
"~436 MB download, 15 MB file"),
|
|
218
|
+
_embed_row("embed-m2v", "embed-m2v",
|
|
219
|
+
"potion-multilingual-128M, PCA-128, ~531 MB download, 42 MB file"),
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
IDS = tuple(r["id"] for r in REGISTRY)
|
|
223
|
+
# Every id that carries a server, i.e. every name tezgah may have written into a
|
|
224
|
+
# host file. Uninstall reads this (`names(MCP_IDS)`), never a disable: a feature
|
|
225
|
+
# that is off today still has to be swept from a file an older release wrote.
|
|
226
|
+
MCP_IDS = tuple(r["id"] for r in REGISTRY if r["command"])
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def defaults():
|
|
230
|
+
"""The ids a config with no `features` key means.
|
|
231
|
+
|
|
232
|
+
Declared per row, never inferred from what is installed or from how the
|
|
233
|
+
registry is ordered, so a config.json written before that key existed keeps
|
|
234
|
+
exactly the wiring it had."""
|
|
235
|
+
return tuple(r["id"] for r in REGISTRY if r["default"])
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def selected_ids(selected=None):
|
|
239
|
+
"""`selected` normalised to registry order.
|
|
240
|
+
|
|
241
|
+
`None` means the declared defaults - an absent key is not "none". An id this
|
|
242
|
+
registry does not know is dropped rather than raising, so a selection an
|
|
243
|
+
older release wrote cannot break a host writer; `--features` is where an
|
|
244
|
+
unknown id is reported."""
|
|
245
|
+
if selected is None:
|
|
246
|
+
return defaults()
|
|
247
|
+
if isinstance(selected, (bool, str)):
|
|
248
|
+
# A bool is the `devtools` argument this signature replaced and a string
|
|
249
|
+
# is iterable, so either one left at a call site would answer with the
|
|
250
|
+
# wrong set - or, for the bool, with an unreadable "not iterable" from
|
|
251
|
+
# `set()`. Name the argument the caller has to give instead.
|
|
252
|
+
raise TypeError("selected is a list of feature ids, not %s"
|
|
253
|
+
% type(selected).__name__)
|
|
254
|
+
wanted = set(selected)
|
|
255
|
+
return tuple(r["id"] for r in REGISTRY if r["id"] in wanted)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def servers(selected=None):
|
|
259
|
+
"""The enabled rows that carry a server, in registry order."""
|
|
260
|
+
on = set(selected_ids(selected))
|
|
261
|
+
return tuple(r for r in REGISTRY if r["id"] in on and r["command"])
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def names(selected=None):
|
|
265
|
+
"""The server names of `servers(selected)`."""
|
|
266
|
+
return [r["name"] for r in servers(selected)]
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Runtime attestation: are tezgah's own hook entries armed and unchanged?
|
|
3
|
+
|
|
4
|
+
`tezgah-setup --report` reads what an install WROTE, and `--report --live` proves
|
|
5
|
+
the hooks EXECUTE, but both run only when someone asks. This is the per-session
|
|
6
|
+
half: every host's session start compares the hook entries tezgah owns with what
|
|
7
|
+
the install recorded, writes one `attest` row, and keeps a drift mark the status
|
|
8
|
+
line and the Stop rule's claim row read.
|
|
9
|
+
|
|
10
|
+
One store, not two: the install record is the per-artifact sha file the contract
|
|
11
|
+
artifacts already use (`contract.sha256`, `bin/tezgah-setup::record_contract`),
|
|
12
|
+
one line per entry under a `hook:<host>:<entry>` key. An entry is one hook event's
|
|
13
|
+
tezgah-owned groups (Claude, dsh, Codex, Cursor - so a removed PreToolUse is named
|
|
14
|
+
while PostToolUse stays), opencode's plugin links, and nothing for omp: its bridge
|
|
15
|
+
is compared to a fresh render, the way `rules_current` compares a rules file. The
|
|
16
|
+
code an entry runs is hashed only on a packaged install (a tree with no `.git`):
|
|
17
|
+
a checkout install points into a tree its owner edits on purpose. A hook file
|
|
18
|
+
any user can write (0666) is drift too; group write is left alone, because a
|
|
19
|
+
umask of 002 (user-private groups) gives every file that.
|
|
20
|
+
|
|
21
|
+
Drift is evidence, never integrity: the same uid that could edit a hook can edit
|
|
22
|
+
the record. It is never a Stop block, and its text never tells the model what to
|
|
23
|
+
run - the user reads it and decides.
|
|
24
|
+
"""
|
|
25
|
+
import hashlib
|
|
26
|
+
import json
|
|
27
|
+
import os
|
|
28
|
+
|
|
29
|
+
import tezgah_paths as tp
|
|
30
|
+
|
|
31
|
+
ROOT = tp.PLUGIN_ROOT
|
|
32
|
+
CONTRACT_SHA = os.path.join(tp.CONFIG_DIR, "contract.sha256")
|
|
33
|
+
KEY = "hook:%s:%s"
|
|
34
|
+
# The scripts a host's registration runs, relative to the tree: one file each,
|
|
35
|
+
# so a session start never hashes the plugin tree (about 710 files).
|
|
36
|
+
CLAUDE_SCRIPTS = tuple(os.path.join("hooks", n) for n in (
|
|
37
|
+
"projects-auto-init.py", "projects-pretooluse.py", "projects-posttooluse.py",
|
|
38
|
+
"projects-stop.py"))
|
|
39
|
+
CODE_TARGETS = {
|
|
40
|
+
"claude": CLAUDE_SCRIPTS, "dsh": CLAUDE_SCRIPTS,
|
|
41
|
+
"codex": (os.path.join("hosts", "codex", "hook.py"),),
|
|
42
|
+
"cursor": (os.path.join("hosts", "cursor", "hook.py"),),
|
|
43
|
+
"opencode": (os.path.join("hosts", "opencode", "plugins", "tezgah.js"),),
|
|
44
|
+
"omp": (os.path.join("hosts", "omp", "hook.py"),),
|
|
45
|
+
}
|
|
46
|
+
OPENCODE_DIRS = ("plugins", "plugin")
|
|
47
|
+
OMP_BRIDGE = os.path.join(tp.HOST_DIRS["omp"], "agent", "hooks", "pre",
|
|
48
|
+
"tezgah-hook.ts")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def sha(text):
|
|
52
|
+
return hashlib.sha256(text.encode("utf-8")).hexdigest()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def recorded_shas(path=CONTRACT_SHA):
|
|
56
|
+
"""{key: sha} from the install record, in sha256sum's `<sha> <key>` shape."""
|
|
57
|
+
out = {}
|
|
58
|
+
try:
|
|
59
|
+
with open(path, encoding="utf-8") as fh:
|
|
60
|
+
for line in fh:
|
|
61
|
+
digest, _, key = line.rstrip("\n").partition(" ")
|
|
62
|
+
if key:
|
|
63
|
+
out[key] = digest
|
|
64
|
+
except OSError:
|
|
65
|
+
pass
|
|
66
|
+
return out
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def own_groups(data, own=False):
|
|
70
|
+
"""{event: canonical JSON of its tezgah-owned groups} for a `{"hooks": ...}`
|
|
71
|
+
manifest. In a shared file (Codex, Cursor) only a group naming tezgah is
|
|
72
|
+
tezgah's - the filter `install_codex`/`install_cursor` replace by; in
|
|
73
|
+
tezgah's own manifest (`own`) every group is."""
|
|
74
|
+
hooks = data.get("hooks") if isinstance(data, dict) else None
|
|
75
|
+
out = {}
|
|
76
|
+
for event, groups in (hooks if isinstance(hooks, dict) else {}).items():
|
|
77
|
+
mine = [g for g in groups if own or "tezgah" in json.dumps(g)] \
|
|
78
|
+
if isinstance(groups, list) else []
|
|
79
|
+
if mine:
|
|
80
|
+
out[event] = json.dumps(mine, sort_keys=True)
|
|
81
|
+
return out
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _manifest(path, own):
|
|
85
|
+
try:
|
|
86
|
+
with open(path, encoding="utf-8") as fh:
|
|
87
|
+
return own_groups(json.load(fh), own)
|
|
88
|
+
except (OSError, ValueError):
|
|
89
|
+
return None
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def omp_bridge(root=ROOT):
|
|
93
|
+
"""The omp extension as an install writes it: the template with this tree's
|
|
94
|
+
hook path, or "" when the template is unreadable."""
|
|
95
|
+
try:
|
|
96
|
+
with open(os.path.join(root, "hosts", "omp", "tezgah-hook.ts.in"),
|
|
97
|
+
encoding="utf-8") as fh:
|
|
98
|
+
return fh.read().replace(
|
|
99
|
+
"@HOOK@", os.path.join(root, "hosts", "omp", "hook.py"))
|
|
100
|
+
except OSError:
|
|
101
|
+
return ""
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def registration(host, root=ROOT):
|
|
105
|
+
"""({entry: text}, [files]) for the tezgah-owned hook entries this host has
|
|
106
|
+
on disk; the dict is None when the host's file cannot be read."""
|
|
107
|
+
if host in ("claude", "dsh"):
|
|
108
|
+
path = os.path.join(root, *(("hooks",) if host == "claude"
|
|
109
|
+
else ("hosts", "dsh")), "hooks.json")
|
|
110
|
+
return _manifest(path, own=True), [path]
|
|
111
|
+
if host in ("codex", "cursor"):
|
|
112
|
+
path = os.path.join(tp.HOST_DIRS[host], "hooks.json")
|
|
113
|
+
return _manifest(path, own=False), [path]
|
|
114
|
+
if host == "opencode":
|
|
115
|
+
links = (os.path.join(tp.HOST_DIRS["opencode"], d, "tezgah.js")
|
|
116
|
+
for d in OPENCODE_DIRS)
|
|
117
|
+
# a keg path is read through opt/, so a `brew upgrade` is no change
|
|
118
|
+
return {os.path.basename(os.path.dirname(p)): tp.stable_root(os.path.realpath(p))
|
|
119
|
+
for p in links if os.path.lexists(p)}, []
|
|
120
|
+
if host == "omp":
|
|
121
|
+
try:
|
|
122
|
+
with open(OMP_BRIDGE, encoding="utf-8") as fh:
|
|
123
|
+
return {"bridge": fh.read()}, [OMP_BRIDGE]
|
|
124
|
+
except OSError:
|
|
125
|
+
return None, [OMP_BRIDGE]
|
|
126
|
+
return None, []
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def packaged(root=ROOT):
|
|
130
|
+
"""A release tree (tarball, npm, brew) carries no `.git`."""
|
|
131
|
+
return not os.path.exists(os.path.join(root, ".git"))
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def code_text(host, root=ROOT):
|
|
135
|
+
"""`<relpath> <sha>` per script the host's entries run, or None."""
|
|
136
|
+
lines = []
|
|
137
|
+
for rel in CODE_TARGETS.get(host, ()):
|
|
138
|
+
try:
|
|
139
|
+
with open(os.path.join(root, rel), "rb") as fh:
|
|
140
|
+
lines.append("%s %s" % (rel, hashlib.sha256(fh.read()).hexdigest()))
|
|
141
|
+
except OSError:
|
|
142
|
+
return None
|
|
143
|
+
return "\n".join(lines)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def record_texts(host, root=ROOT):
|
|
147
|
+
"""{key: text} an install records for one host (`bin/tezgah-setup::record_hooks`)."""
|
|
148
|
+
entries, _files = registration(host, root)
|
|
149
|
+
out = {}
|
|
150
|
+
if host != "omp":
|
|
151
|
+
out.update((KEY % (host, name), text)
|
|
152
|
+
for name, text in (entries or {}).items())
|
|
153
|
+
code = code_text(host, root) if packaged(root) else None
|
|
154
|
+
if code is not None:
|
|
155
|
+
out[KEY % (host, "code")] = code
|
|
156
|
+
return out
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def drift(host, root=ROOT, shas=None):
|
|
160
|
+
"""(drifted, unverified): what differs from the install, and what cannot be
|
|
161
|
+
judged because the install recorded nothing for it."""
|
|
162
|
+
shas = recorded_shas() if shas is None else shas
|
|
163
|
+
prefix = KEY % (host, "")
|
|
164
|
+
recorded = {k[len(prefix):]: v for k, v in shas.items() if k.startswith(prefix)}
|
|
165
|
+
entries, files = registration(host, root)
|
|
166
|
+
found, unknown = [], []
|
|
167
|
+
for path in files:
|
|
168
|
+
try:
|
|
169
|
+
mode = os.stat(path).st_mode & 0o777
|
|
170
|
+
except OSError:
|
|
171
|
+
continue
|
|
172
|
+
if mode & 0o002:
|
|
173
|
+
found.append("%s mode %04o" % (path, mode))
|
|
174
|
+
if entries is None:
|
|
175
|
+
found.append("%s unreadable or missing" % files[0])
|
|
176
|
+
elif host == "omp":
|
|
177
|
+
if entries["bridge"] != omp_bridge(root):
|
|
178
|
+
found.append("omp bridge %s differs from a fresh render" % OMP_BRIDGE)
|
|
179
|
+
else:
|
|
180
|
+
names = set(recorded) - {"code"}
|
|
181
|
+
if not names:
|
|
182
|
+
unknown.append("no install record for %s hook entries" % host)
|
|
183
|
+
for name in sorted(names | set(entries)) if names else ():
|
|
184
|
+
if name not in entries:
|
|
185
|
+
found.append("%s %s entry removed" % (host, name))
|
|
186
|
+
elif name not in recorded:
|
|
187
|
+
found.append("%s %s entry added" % (host, name))
|
|
188
|
+
elif recorded[name] != sha(entries[name]):
|
|
189
|
+
found.append("%s %s entry changed" % (host, name))
|
|
190
|
+
if "code" in recorded:
|
|
191
|
+
code = code_text(host, root)
|
|
192
|
+
if code is None or sha(code) != recorded["code"]:
|
|
193
|
+
found.append("%s hook code changed since install" % host)
|
|
194
|
+
return found, unknown
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def drift_mark(session_id, host):
|
|
198
|
+
"""The mark one host's drifted session start leaves; its text is the drift
|
|
199
|
+
list. Keyed by session AND host: two hosts can share a session id (a
|
|
200
|
+
`tezgah-context attest` run by hand, a host whose ids collide), and a clean
|
|
201
|
+
start on one must not clear the other's mark."""
|
|
202
|
+
return os.path.join(tp.cache_dir(), "harness-drift", "%s.%s" % (
|
|
203
|
+
hashlib.sha256(str(session_id).encode()).hexdigest()[:16], host))
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def mark_text(session_id):
|
|
207
|
+
"""The drift lists this session's starts recorded, every host's, or ""."""
|
|
208
|
+
if not session_id:
|
|
209
|
+
return ""
|
|
210
|
+
texts = []
|
|
211
|
+
for host in CODE_TARGETS:
|
|
212
|
+
try:
|
|
213
|
+
with open(drift_mark(session_id, host), encoding="utf-8") as fh:
|
|
214
|
+
text = fh.read().strip()
|
|
215
|
+
except OSError:
|
|
216
|
+
continue
|
|
217
|
+
if text and text not in texts:
|
|
218
|
+
texts.append(text)
|
|
219
|
+
return "; ".join(texts)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def switches():
|
|
223
|
+
"""The kill switches present, by name. Before the latching plan (051) lands
|
|
224
|
+
this is all the row can say about them."""
|
|
225
|
+
names = set()
|
|
226
|
+
for d in tp.OFF_DIRS:
|
|
227
|
+
try:
|
|
228
|
+
names.update(n for n in os.listdir(d) if n.endswith((".off", "-off")))
|
|
229
|
+
except OSError:
|
|
230
|
+
pass
|
|
231
|
+
return sorted(names)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def run(host, session_id, cwd=None):
|
|
235
|
+
"""One `attest` row for this session start, and the drift mark set or
|
|
236
|
+
cleared to match; the drift list. Outside a root it does nothing."""
|
|
237
|
+
if not session_id or not tp.root_for(cwd or os.getcwd()):
|
|
238
|
+
return None
|
|
239
|
+
found, unknown = drift(host)
|
|
240
|
+
detail = ("drifted: " + "; ".join(found) if found
|
|
241
|
+
else "unverified: " + "; ".join(unknown) if unknown else "ok")
|
|
242
|
+
import tezgah_integrity
|
|
243
|
+
tezgah_integrity.note(session_id, "attest", detail, host=host,
|
|
244
|
+
switches=",".join(switches()) or None)
|
|
245
|
+
mark = drift_mark(session_id, host)
|
|
246
|
+
try:
|
|
247
|
+
if found:
|
|
248
|
+
os.makedirs(os.path.dirname(mark), exist_ok=True)
|
|
249
|
+
with open(mark, "w", encoding="utf-8") as fh:
|
|
250
|
+
fh.write("; ".join(found) + "\n")
|
|
251
|
+
elif os.path.exists(mark):
|
|
252
|
+
os.remove(mark)
|
|
253
|
+
except OSError:
|
|
254
|
+
pass
|
|
255
|
+
return found
|