@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,497 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""tezgah-doctor - report and reclaim the state the armed harnesses leave behind.
|
|
3
|
+
|
|
4
|
+
Two stores grow without bound and neither rotates on its own:
|
|
5
|
+
- opencode's SQLite session/event database (~/.local/share/opencode/opencode.db)
|
|
6
|
+
- one codegraph index per indexed repository (`<repo>/.codegraph/codegraph.db`).
|
|
7
|
+
It lives inside the repo rather than in one shared cache, so there is no
|
|
8
|
+
central directory to measure: the per-repo scan below is the only place the
|
|
9
|
+
total is visible, and a repo whose index is stale or abandoned keeps its
|
|
10
|
+
bytes until its owner deletes them.
|
|
11
|
+
|
|
12
|
+
It also reports the hosts' own state (~/.codex, ~/.omp, ~/.claude) and never
|
|
13
|
+
touches it: those stores belong to the hosts, and the number is here so a reader
|
|
14
|
+
can decide, not so this tool can act.
|
|
15
|
+
|
|
16
|
+
This tool is read-only by default. With --clean it vacuums the opencode database
|
|
17
|
+
(only when opencode is not running, so it cannot fight a live connection).
|
|
18
|
+
VACUUM alone cannot shrink that database - its pages are all live - so
|
|
19
|
+
--prune-sessions is the action that actually reclaims space: it deletes old
|
|
20
|
+
sessions through the supported opencode command and then vacuums.
|
|
21
|
+
|
|
22
|
+
--coverage is the other read-only report, and the one codegraph does not ship:
|
|
23
|
+
every tracked file the index does not hold, in the two classes a file can go
|
|
24
|
+
missing by. Its rules are imported from benchmarks/codegraph-bench/probe.py, the
|
|
25
|
+
spike that measured them. That file is in MANIFEST, which `packaging/build.sh`
|
|
26
|
+
ships verbatim, so a release artifact carries it and a packaged install answers
|
|
27
|
+
`--coverage` in full. A tree that lost it - a hand-stripped copy, a repack that
|
|
28
|
+
dropped benchmarks/ - gets a named refusal and exit 0 rather than an ImportError
|
|
29
|
+
out of a shipped CLI. Everything it reads is the standard library or a file in
|
|
30
|
+
this tree.
|
|
31
|
+
|
|
32
|
+
tezgah-doctor report sizes and counts
|
|
33
|
+
tezgah-doctor --json same, machine readable
|
|
34
|
+
tezgah-doctor --coverage the tracked files the graph index does not hold
|
|
35
|
+
tezgah-doctor --coverage --repo ~/Projects/x
|
|
36
|
+
tezgah-doctor --clean vacuum the opencode database, and delete the
|
|
37
|
+
hook state (evidence ledgers, turns/,
|
|
38
|
+
sessions/, classify.log, context-drops.log,
|
|
39
|
+
debug.log) idle > 30 days
|
|
40
|
+
(--retention-days N); $TEZGAH_SESSION's
|
|
41
|
+
own files are always kept
|
|
42
|
+
tezgah-doctor --prune-sessions 30 delete sessions idle > 30 days, then vacuum
|
|
43
|
+
"""
|
|
44
|
+
import argparse
|
|
45
|
+
import importlib.machinery
|
|
46
|
+
import importlib.util
|
|
47
|
+
import json
|
|
48
|
+
import os
|
|
49
|
+
import shutil
|
|
50
|
+
import sqlite3
|
|
51
|
+
import subprocess
|
|
52
|
+
import sys
|
|
53
|
+
import time
|
|
54
|
+
|
|
55
|
+
HOME = os.path.expanduser("~")
|
|
56
|
+
# this file lives in <checkout>/bin, and the coverage rules live in the checkout's
|
|
57
|
+
# bench directory next to the hooks that own the roots and the binary resolver
|
|
58
|
+
REPO_ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
|
|
59
|
+
sys.path.insert(0, os.path.join(REPO_ROOT, "hooks"))
|
|
60
|
+
from tezgah_paths import (CACHE, CODEGRAPH, codegraph_bin, # noqa: E402
|
|
61
|
+
fallback_cache, root_for, roots)
|
|
62
|
+
|
|
63
|
+
# the coverage rules, in the bench directory next to the hooks that own the roots
|
|
64
|
+
# and the binary resolver. MANIFEST lists it, so it ships; it is also the one file
|
|
65
|
+
# here that a repack may drop, so `load_probe` treats it as optional rather than
|
|
66
|
+
# assuming it.
|
|
67
|
+
PROBE = os.path.join(REPO_ROOT, "benchmarks", "codegraph-bench", "probe.py")
|
|
68
|
+
OPENCODE = os.path.join(
|
|
69
|
+
os.environ.get("XDG_CONFIG_HOME") or os.path.join(HOME, ".config"), "opencode")
|
|
70
|
+
OPENCODE_DATA = os.environ.get("TEZGAH_OPENCODE_DATA",
|
|
71
|
+
os.path.join(HOME, ".local", "share", "opencode"))
|
|
72
|
+
OPENCODE_DB = os.path.join(OPENCODE_DATA, "opencode.db")
|
|
73
|
+
TEZGAH_CACHE = os.path.join(HOME, ".cache", "tezgah")
|
|
74
|
+
OPENCODE_BIN = shutil.which("opencode")
|
|
75
|
+
# codegraph's index, inside the repo it belongs to (derived from the engine name
|
|
76
|
+
# itself, so the doctor cannot name a directory the engine does not write)
|
|
77
|
+
GRAPH_DIR = "." + CODEGRAPH
|
|
78
|
+
GRAPH_DB = CODEGRAPH + ".db"
|
|
79
|
+
# The per-session state the hooks write and nothing else removes: the evidence
|
|
80
|
+
# ledgers, the per-turn stamps, the used-tool marks and the two capped logs.
|
|
81
|
+
# Audit L-11 (GAP-10) measured 2,000 of each, 400 days old, surviving a full
|
|
82
|
+
# cycle and `--clean`. Snapshots are not here: tezgah_snapshot caps them itself.
|
|
83
|
+
STATE_DIRS = ("evidence", "turns", "sessions")
|
|
84
|
+
STATE_LOGS = ("classify.log", "context-drops.log", "debug.log")
|
|
85
|
+
RETENTION_DAYS = 30
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def du(path):
|
|
89
|
+
total = 0
|
|
90
|
+
for root, _dirs, files in os.walk(path):
|
|
91
|
+
for name in files:
|
|
92
|
+
try:
|
|
93
|
+
total += os.path.getsize(os.path.join(root, name))
|
|
94
|
+
except OSError:
|
|
95
|
+
pass
|
|
96
|
+
return total
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def human(n):
|
|
100
|
+
n = float(n)
|
|
101
|
+
for unit in ("B", "K", "M", "G"):
|
|
102
|
+
if n < 1024:
|
|
103
|
+
return "%.1f%s" % (n, unit)
|
|
104
|
+
n /= 1024.0
|
|
105
|
+
return "%.1fT" % n
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def codegraph_size(repo):
|
|
109
|
+
"""One repo's index as (bytes, has_index).
|
|
110
|
+
|
|
111
|
+
The file is the marker, not the directory: codegraph writes `.codegraph/`
|
|
112
|
+
with its lock and `.gitignore` before the index exists, so a directory
|
|
113
|
+
without `codegraph.db` is a repo whose index never finished."""
|
|
114
|
+
try:
|
|
115
|
+
return os.path.getsize(os.path.join(repo, GRAPH_DIR, GRAPH_DB)), True
|
|
116
|
+
except OSError:
|
|
117
|
+
return 0, False
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def is_repo(path):
|
|
121
|
+
"""Git is the marker, and a worktree keeps `.git` as a file. `.codegraph` is
|
|
122
|
+
the second one: an indexed project that is not a git checkout is still a repo
|
|
123
|
+
this report has bytes to account for."""
|
|
124
|
+
return (os.path.exists(os.path.join(path, ".git"))
|
|
125
|
+
or os.path.isdir(os.path.join(path, GRAPH_DIR)))
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def repos_under(root, depth=2):
|
|
129
|
+
"""The repositories one configured root holds, as absolute paths.
|
|
130
|
+
|
|
131
|
+
Two levels below the root, so both a flat `~/Projects/<repo>` layout and an
|
|
132
|
+
`~/Projects/<org>/<repo>` one are covered. The walk stops at the first repo
|
|
133
|
+
on a path: descending into one would report its vendored checkouts as repos
|
|
134
|
+
of their own."""
|
|
135
|
+
found = []
|
|
136
|
+
frontier = [(root, 0)]
|
|
137
|
+
while frontier:
|
|
138
|
+
directory, level = frontier.pop()
|
|
139
|
+
if is_repo(directory):
|
|
140
|
+
found.append(directory)
|
|
141
|
+
continue
|
|
142
|
+
if level >= depth:
|
|
143
|
+
continue
|
|
144
|
+
try:
|
|
145
|
+
names = sorted(os.listdir(directory))
|
|
146
|
+
except OSError:
|
|
147
|
+
continue
|
|
148
|
+
for name in names:
|
|
149
|
+
path = os.path.join(directory, name)
|
|
150
|
+
if not name.startswith(".") and os.path.isdir(path):
|
|
151
|
+
frontier.append((path, level + 1))
|
|
152
|
+
return sorted(found)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def targets(named):
|
|
156
|
+
"""The repositories to account for as (configured root, repo) pairs: the ones
|
|
157
|
+
the user named, else every repository under a configured tezgah root."""
|
|
158
|
+
if named:
|
|
159
|
+
out = []
|
|
160
|
+
for path in named:
|
|
161
|
+
repo = os.path.realpath(os.path.expanduser(path))
|
|
162
|
+
out.append((root_for(repo) or "", repo))
|
|
163
|
+
return out
|
|
164
|
+
return [(root, repo) for root in roots() for repo in repos_under(root)]
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def host_bytes():
|
|
168
|
+
"""The hosts' own state dirs, measured and never touched by this tool."""
|
|
169
|
+
return {"codex_bytes": du(os.path.join(HOME, ".codex")) if os.path.isdir(
|
|
170
|
+
os.path.join(HOME, ".codex")) else 0,
|
|
171
|
+
"omp_bytes": du(os.path.join(HOME, ".omp")) if os.path.isdir(
|
|
172
|
+
os.path.join(HOME, ".omp")) else 0,
|
|
173
|
+
"claude_bytes": du(os.path.join(HOME, ".claude")) if os.path.isdir(
|
|
174
|
+
os.path.join(HOME, ".claude")) else 0}
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def db_rows(db, table):
|
|
178
|
+
if not os.path.exists(db):
|
|
179
|
+
return None
|
|
180
|
+
try:
|
|
181
|
+
con = sqlite3.connect("file:%s?mode=ro" % db, uri=True)
|
|
182
|
+
try:
|
|
183
|
+
return con.execute("SELECT count(*) FROM %s" % table).fetchone()[0]
|
|
184
|
+
finally:
|
|
185
|
+
con.close()
|
|
186
|
+
except sqlite3.Error:
|
|
187
|
+
return None
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def opencode_cfg():
|
|
191
|
+
try:
|
|
192
|
+
with open(os.path.join(OPENCODE, "opencode.json"), encoding="utf-8") as fh:
|
|
193
|
+
return json.load(fh)
|
|
194
|
+
except Exception:
|
|
195
|
+
return {}
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def opencode_running():
|
|
199
|
+
try:
|
|
200
|
+
return subprocess.run(["pgrep", "-x", "opencode"],
|
|
201
|
+
capture_output=True).returncode == 0
|
|
202
|
+
except OSError:
|
|
203
|
+
return False
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def collect(pairs):
|
|
207
|
+
cfg = opencode_cfg()
|
|
208
|
+
repos = []
|
|
209
|
+
for root, repo in pairs:
|
|
210
|
+
size, indexed = codegraph_size(repo)
|
|
211
|
+
repos.append({"root": root, "repo": repo, "bytes": size, "indexed": indexed})
|
|
212
|
+
return {
|
|
213
|
+
"opencode_db_bytes": os.path.getsize(OPENCODE_DB) if os.path.exists(OPENCODE_DB) else 0,
|
|
214
|
+
"opencode_sessions": db_rows(OPENCODE_DB, "session"),
|
|
215
|
+
"opencode_events": db_rows(OPENCODE_DB, "event"),
|
|
216
|
+
"opencode_running": opencode_running(),
|
|
217
|
+
"compaction_prune": (cfg.get("compaction") or {}).get("prune"),
|
|
218
|
+
"watcher_ignore": len(((cfg.get("watcher") or {}).get("ignore") or [])),
|
|
219
|
+
"codegraph_repos": repos,
|
|
220
|
+
"codegraph_bytes": sum(r["bytes"] for r in repos),
|
|
221
|
+
"tezgah_cache_bytes": du(TEZGAH_CACHE) if os.path.isdir(TEZGAH_CACHE) else 0,
|
|
222
|
+
**host_bytes(),
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def vacuum_db():
|
|
227
|
+
before = os.path.getsize(OPENCODE_DB)
|
|
228
|
+
con = sqlite3.connect(OPENCODE_DB)
|
|
229
|
+
try:
|
|
230
|
+
con.execute("PRAGMA wal_checkpoint(TRUNCATE)")
|
|
231
|
+
con.execute("VACUUM")
|
|
232
|
+
con.commit()
|
|
233
|
+
finally:
|
|
234
|
+
con.close()
|
|
235
|
+
return before, os.path.getsize(OPENCODE_DB)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def select_old_sessions(days):
|
|
239
|
+
"""Sessions whose last update is older than `days`, oldest first."""
|
|
240
|
+
if not os.path.exists(OPENCODE_DB):
|
|
241
|
+
return []
|
|
242
|
+
cutoff = int((time.time() - days * 86400) * 1000) # time_updated is epoch ms
|
|
243
|
+
try:
|
|
244
|
+
con = sqlite3.connect("file:%s?mode=ro" % OPENCODE_DB, uri=True)
|
|
245
|
+
try:
|
|
246
|
+
rows = con.execute(
|
|
247
|
+
"SELECT id FROM session WHERE time_updated < ? ORDER BY time_updated",
|
|
248
|
+
(cutoff,)).fetchall()
|
|
249
|
+
return [r[0] for r in rows]
|
|
250
|
+
finally:
|
|
251
|
+
con.close()
|
|
252
|
+
except sqlite3.Error:
|
|
253
|
+
return []
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def prune_sessions(days):
|
|
257
|
+
"""Delete sessions older than `days` and return (deleted, failed).
|
|
258
|
+
|
|
259
|
+
Uses `opencode session delete` rather than raw SQL: that keeps the event log
|
|
260
|
+
and the running server consistent. The caller guarantees opencode is stopped.
|
|
261
|
+
"""
|
|
262
|
+
ids = select_old_sessions(days)
|
|
263
|
+
if not ids or not OPENCODE_BIN:
|
|
264
|
+
# nothing is attempted without the CLI; the caller reports the skip, so
|
|
265
|
+
# do not count these ids as failed deletions
|
|
266
|
+
return 0, 0
|
|
267
|
+
deleted = failed = 0
|
|
268
|
+
for sid in ids:
|
|
269
|
+
proc = subprocess.run([OPENCODE_BIN, "session", "delete", sid],
|
|
270
|
+
capture_output=True)
|
|
271
|
+
if proc.returncode == 0:
|
|
272
|
+
deleted += 1
|
|
273
|
+
else:
|
|
274
|
+
failed += 1
|
|
275
|
+
return deleted, failed
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def sweep_state(days, session=None):
|
|
279
|
+
"""Delete the hook state not modified for `days`, in the global cache and
|
|
280
|
+
the temp fallback; (removed, bytes freed).
|
|
281
|
+
|
|
282
|
+
By mtime because every writer appends or rewrites in place, so a file's
|
|
283
|
+
mtime is its session's last activity. The current session's files
|
|
284
|
+
(`TEZGAH_SESSION`, the id omp and the judgement CLIs export) are kept
|
|
285
|
+
whatever their age: a session idle past the window and then resumed must
|
|
286
|
+
not lose its ledger mid-flight."""
|
|
287
|
+
from tezgah_context import slug
|
|
288
|
+
from tezgah_integrity import _slug
|
|
289
|
+
keep = ({_slug(session) + ".jsonl", slug(session) + ".json",
|
|
290
|
+
slug(session) + ".jsonl"} if session else set())
|
|
291
|
+
cutoff = time.time() - days * 86400
|
|
292
|
+
removed = freed = 0
|
|
293
|
+
for base in dict.fromkeys((CACHE, fallback_cache())):
|
|
294
|
+
paths = [os.path.join(base, name) for name in STATE_LOGS]
|
|
295
|
+
for sub in STATE_DIRS:
|
|
296
|
+
try:
|
|
297
|
+
paths += [os.path.join(base, sub, n)
|
|
298
|
+
for n in os.listdir(os.path.join(base, sub))]
|
|
299
|
+
except OSError:
|
|
300
|
+
continue
|
|
301
|
+
for path in paths:
|
|
302
|
+
if os.path.basename(path) in keep:
|
|
303
|
+
continue
|
|
304
|
+
try:
|
|
305
|
+
st = os.lstat(path)
|
|
306
|
+
if not os.path.isfile(path) or st.st_mtime >= cutoff:
|
|
307
|
+
continue
|
|
308
|
+
os.remove(path)
|
|
309
|
+
except OSError:
|
|
310
|
+
continue
|
|
311
|
+
removed += 1
|
|
312
|
+
freed += st.st_size
|
|
313
|
+
return removed, freed
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def load_probe():
|
|
318
|
+
"""The bench spike, imported by path so its two coverage rules stay the only
|
|
319
|
+
implementation of them; `None` when this tree has no such file.
|
|
320
|
+
|
|
321
|
+
Its directory name (`codegraph-bench`) is not an identifier, so it cannot be
|
|
322
|
+
imported as a package; a copy of the rules here would be a second definition
|
|
323
|
+
of "covered" that drifts from the spike's the first time either is touched.
|
|
324
|
+
Missing is an answer, not an error: a tree that dropped benchmarks/ asks for
|
|
325
|
+
rules that are simply not there, and a shipped CLI may not raise at the user
|
|
326
|
+
over a file it can describe."""
|
|
327
|
+
if not os.path.exists(PROBE):
|
|
328
|
+
return None
|
|
329
|
+
loader = importlib.machinery.SourceFileLoader("tezgah_codegraph_probe", PROBE)
|
|
330
|
+
spec = importlib.util.spec_from_loader(loader.name, loader)
|
|
331
|
+
module = importlib.util.module_from_spec(spec)
|
|
332
|
+
loader.exec_module(module)
|
|
333
|
+
return module
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def coverage_report(repo, dump_path):
|
|
337
|
+
"""Every tracked file the codegraph index does not hold, as two classes.
|
|
338
|
+
|
|
339
|
+
A report, not a gate: it always exits 0, and the counts it read come first,
|
|
340
|
+
so an empty result cannot read as "everything is covered". The same holds
|
|
341
|
+
when the rules themselves are not in this tree: it names the file and what to
|
|
342
|
+
do, so a user of a tree that lost them reads a reason, not a traceback."""
|
|
343
|
+
probe = load_probe()
|
|
344
|
+
if probe is None:
|
|
345
|
+
print("codegraph coverage: %s" % repo)
|
|
346
|
+
print(" coverage probe unavailable: %s" % PROBE)
|
|
347
|
+
print(" it is the only implementation of these rules and this tree has "
|
|
348
|
+
"lost it (a copy or repack that dropped benchmarks/): run "
|
|
349
|
+
"--coverage from a tree that has it.")
|
|
350
|
+
return 0
|
|
351
|
+
binary = codegraph_bin()
|
|
352
|
+
report, why = probe.coverage(repo, dump_path,
|
|
353
|
+
[binary] if binary else None)
|
|
354
|
+
print("codegraph coverage: %s" % repo)
|
|
355
|
+
if report is None:
|
|
356
|
+
print(" could not read an index dump: %s" % why)
|
|
357
|
+
print(" index the repo first (`codegraph init`), run this in a git work "
|
|
358
|
+
"tree, or pass --dump FILE with the output of `codegraph files -j`.")
|
|
359
|
+
return 0
|
|
360
|
+
print(" tracked files read: %d | files the index holds: %d"
|
|
361
|
+
% (report["tracked"], report["indexed"]))
|
|
362
|
+
print(" uncovered, supported extension (%d):" % len(report["by_ext"]))
|
|
363
|
+
for rel, lang in report["by_ext"]:
|
|
364
|
+
print(" %s (%s)" % (rel, lang))
|
|
365
|
+
print(" uncovered, shebang-only script with no `.py` twin (%d):"
|
|
366
|
+
% len(report["by_shebang"]))
|
|
367
|
+
for rel, lang in report["by_shebang"]:
|
|
368
|
+
print(" %s (%s)" % (rel, lang))
|
|
369
|
+
print(" covered through a `.py` twin (%d)" % len(report["twins"]))
|
|
370
|
+
print(" codegraph reports none of this itself: `status` counts what it "
|
|
371
|
+
"parsed, never what it skipped.")
|
|
372
|
+
return 0
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def report(rep):
|
|
376
|
+
print("opencode")
|
|
377
|
+
print(" db %s (%s sessions, %s events)" % (
|
|
378
|
+
human(rep["opencode_db_bytes"]), rep["opencode_sessions"], rep["opencode_events"]))
|
|
379
|
+
print(" compaction prune=%s watcher.ignore=%d" % (
|
|
380
|
+
rep["compaction_prune"], rep["watcher_ignore"]))
|
|
381
|
+
print(" running %s" % ("yes" if rep["opencode_running"] else "no"))
|
|
382
|
+
print("codegraph (one index per repository)")
|
|
383
|
+
rows = rep["codegraph_repos"]
|
|
384
|
+
if not rows:
|
|
385
|
+
print(" no repository under a configured root (%s)"
|
|
386
|
+
% (", ".join(roots()) or "none configured"))
|
|
387
|
+
else:
|
|
388
|
+
root = None
|
|
389
|
+
for row in rows:
|
|
390
|
+
if row["root"] != root:
|
|
391
|
+
root = row["root"]
|
|
392
|
+
print(" %s" % (root or "(named on the command line)"))
|
|
393
|
+
print(" %-40s %9s %s" % (
|
|
394
|
+
os.path.relpath(row["repo"], root) if root else row["repo"],
|
|
395
|
+
human(row["bytes"]), "indexed" if row["indexed"] else "no index"))
|
|
396
|
+
indexed = sum(1 for row in rows if row["indexed"])
|
|
397
|
+
print(" total %s across %d repos (%d indexed, %d without an index)"
|
|
398
|
+
% (human(rep["codegraph_bytes"]), len(rows), indexed,
|
|
399
|
+
len(rows) - indexed))
|
|
400
|
+
print("tezgah")
|
|
401
|
+
print(" cache %s" % human(rep["tezgah_cache_bytes"]))
|
|
402
|
+
print("host state (the hosts' own; this tool never touches it)")
|
|
403
|
+
for label, key in (("codex", "codex_bytes"), ("omp", "omp_bytes"),
|
|
404
|
+
("claude", "claude_bytes")):
|
|
405
|
+
print(" %-13s %s" % (label, human(rep[key])))
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
def main():
|
|
409
|
+
ap = argparse.ArgumentParser(description="report and reclaim harness state")
|
|
410
|
+
ap.add_argument("--json", action="store_true", help="machine-readable report")
|
|
411
|
+
ap.add_argument("--coverage", action="store_true",
|
|
412
|
+
help="the tracked files the graph index does not hold (exits 0)")
|
|
413
|
+
ap.add_argument("--repo", action="append", metavar="PATH",
|
|
414
|
+
help="a repository to account for instead of the configured "
|
|
415
|
+
"roots (repeatable; --coverage reports the first)")
|
|
416
|
+
ap.add_argument("--dump", metavar="FILE",
|
|
417
|
+
help="a saved `codegraph files -j` dump to read for --coverage")
|
|
418
|
+
ap.add_argument("--clean", action="store_true",
|
|
419
|
+
help="vacuum the opencode database and delete tezgah hook "
|
|
420
|
+
"state (ledgers, turns/, sessions/, classify.log, "
|
|
421
|
+
"context-drops.log, debug.log) not "
|
|
422
|
+
"modified for --retention-days; the current session "
|
|
423
|
+
"($TEZGAH_SESSION) is kept (opt-in)")
|
|
424
|
+
ap.add_argument("--retention-days", type=int, default=RETENTION_DAYS,
|
|
425
|
+
metavar="DAYS",
|
|
426
|
+
help="the age --clean deletes hook state past (default: "
|
|
427
|
+
"%(default)s days)")
|
|
428
|
+
ap.add_argument("--prune-sessions", type=int, metavar="DAYS",
|
|
429
|
+
help="delete sessions idle longer than DAYS, then vacuum")
|
|
430
|
+
args = ap.parse_args()
|
|
431
|
+
if args.retention_days < 1:
|
|
432
|
+
ap.error("--retention-days wants a positive day count")
|
|
433
|
+
|
|
434
|
+
if args.coverage:
|
|
435
|
+
repo = os.path.realpath(os.path.expanduser(args.repo[0]) if args.repo
|
|
436
|
+
else os.getcwd())
|
|
437
|
+
return coverage_report(repo, args.dump)
|
|
438
|
+
|
|
439
|
+
pairs = targets(args.repo)
|
|
440
|
+
rep = collect(pairs)
|
|
441
|
+
cleaned = None
|
|
442
|
+
if args.clean or args.prune_sessions is not None:
|
|
443
|
+
cleaned = {}
|
|
444
|
+
if args.prune_sessions is not None and os.path.exists(OPENCODE_DB):
|
|
445
|
+
if rep["opencode_running"]:
|
|
446
|
+
cleaned["prune_sessions"] = "skipped: opencode is running"
|
|
447
|
+
elif not OPENCODE_BIN:
|
|
448
|
+
cleaned["prune_sessions"] = "skipped: opencode is not installed"
|
|
449
|
+
else:
|
|
450
|
+
deleted, failed = prune_sessions(args.prune_sessions)
|
|
451
|
+
cleaned["prune_sessions"] = {"deleted": deleted, "failed": failed}
|
|
452
|
+
if os.path.exists(OPENCODE_DB):
|
|
453
|
+
if rep["opencode_running"]:
|
|
454
|
+
cleaned["vacuum"] = "skipped: opencode is running"
|
|
455
|
+
else:
|
|
456
|
+
try:
|
|
457
|
+
before, after = vacuum_db()
|
|
458
|
+
cleaned["vacuum"] = {"before": before, "after": after}
|
|
459
|
+
except sqlite3.Error as exc:
|
|
460
|
+
cleaned["vacuum"] = "failed: %s" % exc
|
|
461
|
+
if args.clean:
|
|
462
|
+
removed, freed = sweep_state(args.retention_days,
|
|
463
|
+
os.environ.get("TEZGAH_SESSION"))
|
|
464
|
+
cleaned["state"] = {"removed": removed, "bytes": freed,
|
|
465
|
+
"days": args.retention_days}
|
|
466
|
+
rep = collect(pairs)
|
|
467
|
+
|
|
468
|
+
if args.json:
|
|
469
|
+
out = dict(rep)
|
|
470
|
+
if cleaned is not None:
|
|
471
|
+
out["cleaned"] = cleaned
|
|
472
|
+
print(json.dumps(out, indent=2))
|
|
473
|
+
return 0
|
|
474
|
+
report(rep)
|
|
475
|
+
if cleaned is not None:
|
|
476
|
+
print("cleaned")
|
|
477
|
+
ps = cleaned.get("prune_sessions")
|
|
478
|
+
if isinstance(ps, dict):
|
|
479
|
+
print(" sessions %d deleted, %d failed" % (ps["deleted"], ps["failed"]))
|
|
480
|
+
elif ps:
|
|
481
|
+
print(" sessions %s" % ps)
|
|
482
|
+
v = cleaned.get("vacuum")
|
|
483
|
+
if isinstance(v, dict):
|
|
484
|
+
print(" vacuum %s -> %s" % (human(v["before"]), human(v["after"])))
|
|
485
|
+
elif v:
|
|
486
|
+
print(" vacuum %s" % v)
|
|
487
|
+
st = cleaned.get("state")
|
|
488
|
+
if st:
|
|
489
|
+
print(" hook state %d file(s) older than %d days removed, %s"
|
|
490
|
+
% (st["removed"], st["days"], human(st["bytes"])))
|
|
491
|
+
elif rep["opencode_db_bytes"] > 500 * 1024 * 1024:
|
|
492
|
+
print("\nrun with --clean to vacuum; --prune-sessions DAYS to shrink the db")
|
|
493
|
+
return 0
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
if __name__ == "__main__":
|
|
497
|
+
sys.exit(main())
|
package/bin/tezgah-dsh
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# tezgah-dsh - launch the DeepSeek Harness (dsh) CLI installed under $DSH_HOME.
|
|
3
|
+
#
|
|
4
|
+
# dsh ships as node modules under <harness home>/profiles/node_modules, so there
|
|
5
|
+
# is no PATH command unless one is created. tezgah-setup symlinks ~/.local/bin/dsh
|
|
6
|
+
# to this wrapper; the wrapper resolves the CLI so the symlink survives a version
|
|
7
|
+
# change. Arguments are passed through untouched (e.g. --profile web|headless).
|
|
8
|
+
#
|
|
9
|
+
# dsh boots its hooks under a workspace-write sandbox that confines hook
|
|
10
|
+
# subprocesses to the workspace plus the platform temp dir. The graph index
|
|
11
|
+
# worker writes `.codegraph/` inside the repository and the CLI it calls wants a
|
|
12
|
+
# writable cache of its own, which that sandbox denies for a repo dsh has never
|
|
13
|
+
# seen; without the warm-up below such a repo would never get indexed from the
|
|
14
|
+
# hook. The launcher runs in the user's shell, unconfined, so it starts the same
|
|
15
|
+
# worker the hooks use - HEAD-stamped, so it is a no-op when the graph is current.
|
|
16
|
+
set -eu
|
|
17
|
+
DSH_HOME="${DSH_HOME:-$HOME/.dsh}"
|
|
18
|
+
BIN="$DSH_HOME/profiles/node_modules/@deepseek-ai/dsh/lib/bin.js"
|
|
19
|
+
INDEX="${TEZGAH_INDEX_BIN:-$HOME/.config/tezgah/bin/tezgah-index}"
|
|
20
|
+
warm_index() {
|
|
21
|
+
if [ -x "$INDEX" ]; then
|
|
22
|
+
"$INDEX" "$PWD" >/dev/null 2>&1 || true
|
|
23
|
+
fi
|
|
24
|
+
}
|
|
25
|
+
if [ -f "$BIN" ]; then
|
|
26
|
+
warm_index
|
|
27
|
+
exec node "$BIN" "$@"
|
|
28
|
+
fi
|
|
29
|
+
# A fresh machine has no profile tree yet; npx runs dsh and materializes
|
|
30
|
+
# $DSH_HOME, so the host works before the first explicit `dsh web` boot.
|
|
31
|
+
if command -v npx >/dev/null 2>&1; then
|
|
32
|
+
warm_index
|
|
33
|
+
exec npx -y @deepseek-ai/dsh "$@"
|
|
34
|
+
fi
|
|
35
|
+
echo "tezgah-dsh: dsh CLI not found at $BIN" >&2
|
|
36
|
+
echo "tezgah-dsh: install the DeepSeek Harness (npx -y @deepseek-ai/dsh) or set DSH_HOME" >&2
|
|
37
|
+
exit 127
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
rem tezgah-dsh.cmd - launch the DeepSeek Harness (dsh) CLI on Windows.
|
|
3
|
+
rem
|
|
4
|
+
rem The Windows twin of bin/tezgah-dsh, the /bin/sh wrapper: a machine with no
|
|
5
|
+
rem sh cannot start that file, so tezgah-setup copies this one to
|
|
6
|
+
rem ~/.local/bin/dsh.cmd, the name cmd.exe resolves through PATHEXT. Everything
|
|
7
|
+
rem below is resolved absolutely - the CLI under the profile home and the index
|
|
8
|
+
rem farm under the config dir - so the copy works from anywhere. Arguments are
|
|
9
|
+
rem passed through untouched.
|
|
10
|
+
rem
|
|
11
|
+
rem dsh boots its hooks under a workspace-write sandbox that confines hook
|
|
12
|
+
rem subprocesses to the workspace plus the platform temp dir. The graph index
|
|
13
|
+
rem worker writes .codegraph/ inside the repository and the CLI it calls wants a
|
|
14
|
+
rem writable cache of its own, which that sandbox denies for a repo dsh has
|
|
15
|
+
rem never seen; without the warm-up below such a repo would never get indexed
|
|
16
|
+
rem from the hook. The launcher runs in the user's shell, unconfined, so it
|
|
17
|
+
rem starts the same worker the hooks use - HEAD-stamped, so it is a no-op when
|
|
18
|
+
rem the graph is current.
|
|
19
|
+
setlocal
|
|
20
|
+
|
|
21
|
+
rem The profile home defaults to the place the sh launcher's ${DSH_HOME:-...}
|
|
22
|
+
rem resolves to, so both twins find one tree.
|
|
23
|
+
if not defined DSH_HOME set "DSH_HOME=%USERPROFILE%\.dsh"
|
|
24
|
+
set "BIN=%DSH_HOME%\profiles\node_modules\@deepseek-ai\dsh\lib\bin.js"
|
|
25
|
+
|
|
26
|
+
if exist "%BIN%" goto dsh_cli
|
|
27
|
+
where npx >nul 2>nul
|
|
28
|
+
if errorlevel 1 goto no_cli
|
|
29
|
+
|
|
30
|
+
rem A fresh machine has no profile tree yet; npx runs dsh and materializes the
|
|
31
|
+
rem profile home, so the host works before the first explicit dsh web boot.
|
|
32
|
+
call :warm
|
|
33
|
+
rem cmd.exe has no exec, so the launcher waits for the CLI and returns its own
|
|
34
|
+
rem exit code, which is what a caller scripts against.
|
|
35
|
+
npx -y @deepseek-ai/dsh %*
|
|
36
|
+
exit /b %errorlevel%
|
|
37
|
+
|
|
38
|
+
:dsh_cli
|
|
39
|
+
call :warm
|
|
40
|
+
node "%BIN%" %*
|
|
41
|
+
exit /b %errorlevel%
|
|
42
|
+
|
|
43
|
+
:no_cli
|
|
44
|
+
echo tezgah-dsh: dsh CLI not found at %BIN% 1>&2
|
|
45
|
+
echo tezgah-dsh: install the DeepSeek Harness (npx -y @deepseek-ai/dsh) or set DSH_HOME 1>&2
|
|
46
|
+
exit /b 127
|
|
47
|
+
|
|
48
|
+
:warm
|
|
49
|
+
rem Best effort, as in the sh twin: a machine that cannot start the worker
|
|
50
|
+
rem still starts dsh. The farm entry is a Python script
|
|
51
|
+
rem (a relay where a symlink was refused), so it is started the way
|
|
52
|
+
rem hooks/tezgah_paths.python_cmd resolves an interpreter: the pin first, then
|
|
53
|
+
rem the names Windows ships - python3 is never one of them - and py last.
|
|
54
|
+
set "CONFIG=%XDG_CONFIG_HOME%"
|
|
55
|
+
if not defined CONFIG set "CONFIG=%USERPROFILE%\.config"
|
|
56
|
+
set "INDEX=%TEZGAH_INDEX_BIN%"
|
|
57
|
+
if not defined INDEX set "INDEX=%CONFIG%\tezgah\bin\tezgah-index"
|
|
58
|
+
if not exist "%INDEX%" exit /b 0
|
|
59
|
+
set "PY=%TEZGAH_PYTHON%"
|
|
60
|
+
if defined PY goto warm_run
|
|
61
|
+
where python3 >nul 2>nul && set "PY=python3"
|
|
62
|
+
if defined PY goto warm_run
|
|
63
|
+
where python >nul 2>nul && set "PY=python"
|
|
64
|
+
if defined PY goto warm_run
|
|
65
|
+
where py >nul 2>nul && set "PY=py"
|
|
66
|
+
if not defined PY exit /b 0
|
|
67
|
+
|
|
68
|
+
:warm_run
|
|
69
|
+
"%PY%" "%INDEX%" "%CD%" >nul 2>nul
|
|
70
|
+
exit /b 0
|
package/bin/tezgah-gate
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""tezgah-gate - the gate's decision, for a host that is not Python.
|
|
3
|
+
|
|
4
|
+
tezgah-gate check one call on stdin, its deny reason on stdout (if any);
|
|
5
|
+
a dry run: nothing is written anywhere
|
|
6
|
+
tezgah-gate decide the same answer, recorded the way the live gate records
|
|
7
|
+
it (deny/drift/nudge rows, the pre-write snapshot)
|
|
8
|
+
tezgah-gate replay the real ledgers replayed through this gate in a sandbox
|
|
9
|
+
HOME, with per-stratum fidelity; `--report` reads labels,
|
|
10
|
+
`--sheet` draws the blind label sample (hooks/tezgah_replay.py)
|
|
11
|
+
|
|
12
|
+
Reads the host's own call as {"tool":..., "input":{...}, "cwd":...,
|
|
13
|
+
"session_id":...} and prints what hooks/tezgah_gate.decision() returns for it,
|
|
14
|
+
or nothing when the call passes. A host whose plugin is written in another
|
|
15
|
+
language (opencode's tezgah.js) asks `decide` instead of mirroring a rule: that
|
|
16
|
+
mirror is documented as incomplete and divergent, so a new rule reaches such a
|
|
17
|
+
host through the core rather than through a second implementation of it that
|
|
18
|
+
drifts. `check` is what a person or the MCP `tezgah_gate_check` tool asks: a
|
|
19
|
+
dry run against a live session id used to write refusal rows into that
|
|
20
|
+
session's counters (audit CHAT-07 / L-14b).
|
|
21
|
+
|
|
22
|
+
Exit codes: 0 whether the call passes or is refused - the reason is the output,
|
|
23
|
+
not the status - 2 for misuse, and 3 from `check` when the gate's core cannot
|
|
24
|
+
be imported: an empty answer there would read as a pass (`decide`, opencode's
|
|
25
|
+
hook path, fails open with 0 like every hook).
|
|
26
|
+
"""
|
|
27
|
+
import json
|
|
28
|
+
import os
|
|
29
|
+
import sys
|
|
30
|
+
|
|
31
|
+
HERE = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
|
|
32
|
+
sys.path.insert(0, os.path.join(HERE, "hooks"))
|
|
33
|
+
from tezgah_guard import import_failed # noqa: E402
|
|
34
|
+
try:
|
|
35
|
+
from tezgah_gate import decision # noqa: E402
|
|
36
|
+
except Exception as exc:
|
|
37
|
+
# `check` is asked for a verdict (by a person, or the MCP `gate_check`
|
|
38
|
+
# tool): an empty answer with exit 0 reads as a pass from a gate that is
|
|
39
|
+
# not there. `decide` is opencode's hook path and fails open like the rest.
|
|
40
|
+
import_failed(exc, 3 if sys.argv[1:2] == ["check"] else 0)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def misuse(message):
|
|
44
|
+
print("tezgah-gate: %s" % message, file=sys.stderr)
|
|
45
|
+
return 2
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def main(argv):
|
|
49
|
+
if len(argv) < 2:
|
|
50
|
+
print(__doc__, file=sys.stderr)
|
|
51
|
+
return 2
|
|
52
|
+
if argv[1] == "replay":
|
|
53
|
+
import tezgah_replay
|
|
54
|
+
return tezgah_replay.main(argv[2:])
|
|
55
|
+
if argv[1] not in ("check", "decide"):
|
|
56
|
+
return misuse("unknown command %r (check, decide, replay)" % argv[1])
|
|
57
|
+
if len(argv) > 2:
|
|
58
|
+
return misuse("check reads its call on stdin, not as arguments")
|
|
59
|
+
try:
|
|
60
|
+
payload = json.load(sys.stdin)
|
|
61
|
+
except ValueError:
|
|
62
|
+
return misuse("stdin is not one JSON object")
|
|
63
|
+
if not isinstance(payload, dict):
|
|
64
|
+
return misuse("stdin must be one JSON object")
|
|
65
|
+
inp = payload.get("input")
|
|
66
|
+
reason = decision(payload.get("tool"), inp if isinstance(inp, dict) else {},
|
|
67
|
+
payload.get("cwd") or os.getcwd(),
|
|
68
|
+
payload.get("session_id"), record=argv[1] == "decide")
|
|
69
|
+
if reason:
|
|
70
|
+
sys.stdout.write(reason if reason.endswith("\n") else reason + "\n")
|
|
71
|
+
return 0
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
if __name__ == "__main__":
|
|
75
|
+
sys.exit(main(sys.argv))
|