@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
package/bin/tezgah-task
ADDED
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""tezgah-task - the active task: one plan's phase and its path allowlist.
|
|
3
|
+
|
|
4
|
+
tezgah-task start <NNN|path> --phase P [--allow GLOB ... | --any-path] activate a plan
|
|
5
|
+
tezgah-task phase P [--any-path] change the active task's phase
|
|
6
|
+
tezgah-task allow GLOB ... | --any-path replace the allowlist
|
|
7
|
+
tezgah-task stop deactivate (clear phase)
|
|
8
|
+
tezgah-task status [--json] the active task, or "no active task"
|
|
9
|
+
tezgah-task review <NNN|path> <reviewer> approve|changes record a fresh review's verdict
|
|
10
|
+
tezgah-task close <NNN|path> done|discarded move a plan to .tezgah/plans/done
|
|
11
|
+
|
|
12
|
+
The record is the plan file itself: `phase:` activates it, `allowed_paths:` is
|
|
13
|
+
the scope a write has to stay inside, and at most one open plan carries a phase
|
|
14
|
+
because `start` clears the others. That makes the gate's refusal a rule the user
|
|
15
|
+
set in advance, so this CLI is the only writer and the agent never runs its
|
|
16
|
+
first four commands - `stop` and a hand edit are equally valid ways to take the
|
|
17
|
+
requirement away. `phase implementation` (or `verification`) is what lets a write
|
|
18
|
+
through, so the phase changes when the work reaches that point and not before.
|
|
19
|
+
|
|
20
|
+
The allowlist is the plan's own: plan-add writes `allowed_paths:` when it
|
|
21
|
+
creates the plan, and `start` without `--allow` keeps it. A writing phase with
|
|
22
|
+
no allowlist is refused unless `--any-path` says so explicitly, and the record
|
|
23
|
+
keeps where its scope came from (`allowed_from:`), which `status` prints.
|
|
24
|
+
|
|
25
|
+
`review` and `close` are the session's: the verification phase asks for a
|
|
26
|
+
fresh reviewer's read of the diff, `review` records its verdict as
|
|
27
|
+
`review: <reviewer> <verdict> <date>` together with `reviewed_sha:` (the
|
|
28
|
+
project's HEAD it read) and `review_round:`, so the next round reads only
|
|
29
|
+
`git diff <reviewed_sha>..HEAD` and the two-round budget is countable; `close
|
|
30
|
+
NNN done` refuses a plan whose review is missing or not `approve`. `close`
|
|
31
|
+
refuses the active task - that one is the user's to stop first.
|
|
32
|
+
|
|
33
|
+
Two things the plan owes are asked here, at the only moment they can still be
|
|
34
|
+
fixed - the phase move - because the record is the user's and the refusal is
|
|
35
|
+
this CLI's: a writing phase needs at least one Acceptance item that names the
|
|
36
|
+
command proving it (or says `unverifiable` and why), since the report CI runs
|
|
37
|
+
afterwards reads the same items and refuses the same plan too late; and
|
|
38
|
+
`implementation` needs the plan's spike answered, so the build starts on
|
|
39
|
+
evidence rather than on the guess the spike exists to retire.
|
|
40
|
+
|
|
41
|
+
Entering `implementation` also records where the risky work returns to: a
|
|
42
|
+
`checkpoint:` field holding the pre-work commit's sha, or `pending <sha>` while
|
|
43
|
+
the tree still holds changes no commit names - `<sha>` being the `HEAD` of that
|
|
44
|
+
moment. The gate refuses a write in the phase only while the recorded sha is
|
|
45
|
+
still HEAD and the tree is still dirty, so committing is the whole way out of it
|
|
46
|
+
and the commit clears the refusal by itself; the per-file snapshots
|
|
47
|
+
(bin/tezgah-rollback) are not one state to return to.
|
|
48
|
+
|
|
49
|
+
Exit codes: 0 ok, 1 a refusal or a problem - one `FAIL <what>` line per problem,
|
|
50
|
+
with nothing written - 2 misuse.
|
|
51
|
+
"""
|
|
52
|
+
import glob
|
|
53
|
+
import json
|
|
54
|
+
import os
|
|
55
|
+
import re
|
|
56
|
+
import subprocess
|
|
57
|
+
import sys
|
|
58
|
+
import time
|
|
59
|
+
|
|
60
|
+
HERE = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
|
|
61
|
+
sys.path.insert(0, os.path.join(HERE, "hooks"))
|
|
62
|
+
import tezgah_task as tt # noqa: E402
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def repo_root(path):
|
|
66
|
+
"""The repository this run is about: git's own answer, else the directory the
|
|
67
|
+
CLI was called in - a plan under a tree git does not know is still a plan."""
|
|
68
|
+
try:
|
|
69
|
+
out = subprocess.run(["git", "-C", path, "rev-parse", "--show-toplevel"],
|
|
70
|
+
capture_output=True, text=True)
|
|
71
|
+
if out.returncode == 0 and out.stdout.strip():
|
|
72
|
+
return out.stdout.strip()
|
|
73
|
+
except OSError:
|
|
74
|
+
pass
|
|
75
|
+
return os.path.realpath(path)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def misuse(message):
|
|
79
|
+
"""Misuse exits 2, so a caller can tell it from a record that refuses."""
|
|
80
|
+
print("tezgah-task: %s" % message, file=sys.stderr)
|
|
81
|
+
return 2
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def today():
|
|
85
|
+
return time.strftime("%Y-%m-%d")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def read(path):
|
|
89
|
+
with open(path, "r", encoding="utf-8") as fh:
|
|
90
|
+
return fh.read()
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def open_dir(root):
|
|
94
|
+
return os.path.join(root, ".tezgah", "plans", "open")
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def plans(root):
|
|
98
|
+
return sorted(glob.glob(os.path.join(open_dir(root), "*.md")))
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def plan_path(root, ref):
|
|
102
|
+
"""The plan file `ref` names: a three-digit id picks the single `NNN-*.md`
|
|
103
|
+
under .tezgah/plans/open, anything else is a path. Returns (path, problem) with one
|
|
104
|
+
of the two set."""
|
|
105
|
+
if os.path.isfile(ref):
|
|
106
|
+
return os.path.realpath(ref), None
|
|
107
|
+
if re.fullmatch(r"\d{3}", ref):
|
|
108
|
+
found = [p for p in plans(root) if os.path.basename(p).startswith(ref + "-")]
|
|
109
|
+
if not found:
|
|
110
|
+
return None, "no plan %s under %s" % (ref, open_dir(root))
|
|
111
|
+
if len(found) > 1:
|
|
112
|
+
return None, "%s matches %d plans: %s" % (ref, len(found), ", ".join(found))
|
|
113
|
+
return found[0], None
|
|
114
|
+
return None, "no such plan %r (a three-digit id, or a path)" % ref
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def active_here(root):
|
|
118
|
+
"""The active task as every reader sees it - resolved by the module, so the
|
|
119
|
+
CLI and the gate cannot disagree about which plan is active."""
|
|
120
|
+
return tt.active(root, root)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def problems(items):
|
|
124
|
+
for problem in items:
|
|
125
|
+
print("FAIL %s" % problem)
|
|
126
|
+
return 1
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def write_fields(path, **fields):
|
|
130
|
+
"""Write the record, turning an I/O failure into the problem channel: a plan
|
|
131
|
+
that cannot be written is a problem with the plan, not with how the command
|
|
132
|
+
was called, and it must exit 1 with nothing half-applied."""
|
|
133
|
+
try:
|
|
134
|
+
tt.set_fields(path, **fields)
|
|
135
|
+
except OSError as exc:
|
|
136
|
+
return ["cannot write %s: %s" % (path, exc)]
|
|
137
|
+
return []
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
ANY_PATH = "--any-path"
|
|
141
|
+
VERDICTS = ("approve", "changes")
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def allow_source(text):
|
|
145
|
+
"""The allowlist and where it came from, as the phrase `status` prints: the
|
|
146
|
+
plan's own `allowed_paths:` (written when the plan was created), the CLI's
|
|
147
|
+
`--allow`/`allow` (`allowed_from:` names which), or an explicit
|
|
148
|
+
`--any-path`. No list and no `--any-path` is what a writing phase refuses."""
|
|
149
|
+
allow = tt.allowed_paths(text)
|
|
150
|
+
source = tt.frontmatter(text).get("allowed_from") or ""
|
|
151
|
+
if allow:
|
|
152
|
+
return allow, ("from tezgah-task %s" % source) if source else "from the plan"
|
|
153
|
+
if source == ANY_PATH:
|
|
154
|
+
return allow, "any path in the repo (--any-path)"
|
|
155
|
+
return allow, "any path in the repo (no allowlist)"
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def checkpoint_state(value, path):
|
|
159
|
+
"""The checkpoint line `show` prints for a plan in `implementation`: the sha
|
|
160
|
+
the work returns to, or the commit the phase waits for - named with the sha it
|
|
161
|
+
has to move off and with the one command that does it, because that command's
|
|
162
|
+
completion is what clears the gate's refusal.
|
|
163
|
+
|
|
164
|
+
The gate's refusal is `HEAD == the recorded sha AND the tree is dirty`, so
|
|
165
|
+
the line reads the checkout rather than the record alone: after the commit
|
|
166
|
+
the refusal names - or after the user discards that uncommitted work - the
|
|
167
|
+
record still carries `pending <sha>` until the next phase move rewrites it,
|
|
168
|
+
and a status that kept printing "writes are refused" would report a boundary
|
|
169
|
+
the gate has already lifted. The predicate is spelled the same way as
|
|
170
|
+
`tezgah_gate.checkpoint_reason`'s, so the two cannot disagree about which
|
|
171
|
+
state the phase is in."""
|
|
172
|
+
sha = tt.checkpoint_sha(value)
|
|
173
|
+
if sha:
|
|
174
|
+
root = repo_root(os.path.dirname(path) or ".")
|
|
175
|
+
head = git_out(root, "rev-parse", "HEAD")
|
|
176
|
+
listed = git_out(root, "status", "--porcelain")
|
|
177
|
+
if not head or head != sha or not listed:
|
|
178
|
+
print(" checkpoint: satisfied - %s, so this phase's writes are "
|
|
179
|
+
"allowed" % ("HEAD moved off %s" % sha if head != sha
|
|
180
|
+
else "the tree is clean again"))
|
|
181
|
+
else:
|
|
182
|
+
print(" checkpoint: pending on %s - the tree held uncommitted changes "
|
|
183
|
+
"when the phase began, so this phase's writes are refused until "
|
|
184
|
+
"the commit that moves HEAD off it: %s"
|
|
185
|
+
% (sha, tt.checkpoint_command(path)))
|
|
186
|
+
elif value:
|
|
187
|
+
print(" checkpoint: %s" % value)
|
|
188
|
+
else:
|
|
189
|
+
print(" checkpoint: none (one is recorded when the phase moves to "
|
|
190
|
+
"implementation)")
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def show(path):
|
|
194
|
+
"""Print the record as it stands on disk, read back through the parser the
|
|
195
|
+
gate uses: the CLI reports what was written, not what it meant to write."""
|
|
196
|
+
text = read(path)
|
|
197
|
+
fields = tt.frontmatter(text)
|
|
198
|
+
allow, source = allow_source(text)
|
|
199
|
+
phase = fields.get("phase") or ""
|
|
200
|
+
print("task %s: phase %s" % (fields.get("id") or os.path.basename(path).split("-")[0],
|
|
201
|
+
phase or "(none)"))
|
|
202
|
+
print(" allowed: %s" % ("%s (%s)" % (", ".join(allow), source) if allow else source))
|
|
203
|
+
print(" path: %s" % path)
|
|
204
|
+
if phase == "implementation":
|
|
205
|
+
checkpoint_state(fields.get("checkpoint"), path)
|
|
206
|
+
if phase == "verification":
|
|
207
|
+
verification_steps(text, path)
|
|
208
|
+
return 0
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def diff_base(root):
|
|
212
|
+
"""The commit the plan's work branched from: the merge-base with the first
|
|
213
|
+
of main/master/origin/main that exists, else a placeholder."""
|
|
214
|
+
for ref in ("main", "master", "origin/main"):
|
|
215
|
+
out = subprocess.run(["git", "-C", root, "merge-base", "HEAD", ref],
|
|
216
|
+
capture_output=True, text=True)
|
|
217
|
+
if out.returncode == 0 and out.stdout.strip():
|
|
218
|
+
return out.stdout.strip()[:12]
|
|
219
|
+
return "<base>"
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def git_out(root, *args):
|
|
223
|
+
"""One git command's stdout in `root`, or None when git cannot answer: not a
|
|
224
|
+
repository, no such revision, git missing. Every caller below reads None as
|
|
225
|
+
"this question has no answer here" and refuses nothing on the strength of it,
|
|
226
|
+
so a tree git cannot describe is never held to a rule about its state."""
|
|
227
|
+
try:
|
|
228
|
+
out = subprocess.run(["git", "-C", root] + list(args),
|
|
229
|
+
capture_output=True, text=True)
|
|
230
|
+
except OSError:
|
|
231
|
+
return None
|
|
232
|
+
return out.stdout.strip() if out.returncode == 0 else None
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def tree_dirty(root):
|
|
236
|
+
"""Does the project's working tree hold changes no commit names? `git status
|
|
237
|
+
--porcelain` is the whole answer, and a tree git cannot describe reads as
|
|
238
|
+
clean - a refusal has to rest on a state the user can see, and a checkout
|
|
239
|
+
without git is not the tree this rule is about."""
|
|
240
|
+
listed = git_out(root, "status", "--porcelain")
|
|
241
|
+
return bool(listed)
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def checkpoint_fields(root, phase):
|
|
245
|
+
"""The `checkpoint:` the record gets from a move to `phase`: the pre-work
|
|
246
|
+
commit's sha, or `pending <sha>` while the tree holds uncommitted work -
|
|
247
|
+
`<sha>` being the `HEAD` of that moment, which the commit the gate's refusal
|
|
248
|
+
names moves off. That comparison is what lets the commit clear the refusal by
|
|
249
|
+
itself, instead of the refusal outliving it and locking the phase for an agent
|
|
250
|
+
that may not rerun this CLI.
|
|
251
|
+
|
|
252
|
+
`{}` for every phase but `implementation` - the boundary is the writing
|
|
253
|
+
phase's own, and `discovery` writes nothing to return from. A tree with
|
|
254
|
+
nothing committed at all (a fresh `git init`) has no sha to name, so it takes
|
|
255
|
+
a bare `pending`: nothing to compare against, and the gate then holds nothing
|
|
256
|
+
to it."""
|
|
257
|
+
if phase != "implementation":
|
|
258
|
+
return {}
|
|
259
|
+
sha = git_out(root, "rev-parse", "HEAD")
|
|
260
|
+
if tree_dirty(root):
|
|
261
|
+
return {"checkpoint": ("%s %s" % (tt.CHECKPOINT_PENDING, sha)) if sha
|
|
262
|
+
else tt.CHECKPOINT_PENDING}
|
|
263
|
+
return {"checkpoint": sha or tt.CHECKPOINT_PENDING}
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def phase_problems(phase, text, path):
|
|
267
|
+
"""Every reason this plan cannot enter `phase`, as problem-channel lines: an
|
|
268
|
+
Acceptance section in which nothing can check the work, and - for
|
|
269
|
+
`implementation` - a spike that has not answered yet.
|
|
270
|
+
|
|
271
|
+
Both are read from the plan this CLI is about to move, through the same
|
|
272
|
+
readers the CI report uses, so the phase the gate then holds a write to is a
|
|
273
|
+
phase the plan can actually be checked in. They live here, at the phase move,
|
|
274
|
+
and not in the gate: the phase has one writer, this command, and the record
|
|
275
|
+
is the user's to write - a gate rule would have to re-read the same body on
|
|
276
|
+
every write to ask a question whose answer changes only here."""
|
|
277
|
+
out = []
|
|
278
|
+
if phase in tt.WRITE_PHASES:
|
|
279
|
+
items = tt.acceptance_gap(text)
|
|
280
|
+
if items:
|
|
281
|
+
out.append(
|
|
282
|
+
"%s cannot enter %s: all %d of its Acceptance items name no "
|
|
283
|
+
"command and none declares `unverifiable` (read by "
|
|
284
|
+
"hooks/tezgah_task.py:acceptance_items), so the work has no check "
|
|
285
|
+
"to be held to. Give at least one item the command that proves "
|
|
286
|
+
"it, or `unverifiable` and why; "
|
|
287
|
+
"`tezgah-render-table --acceptance` reports the same items"
|
|
288
|
+
% (path, phase, len(items)))
|
|
289
|
+
if phase == "implementation" and tt.spike_unanswered(text):
|
|
290
|
+
out.append(
|
|
291
|
+
"%s cannot enter implementation: its spike is unanswered - `spike:` "
|
|
292
|
+
"names the question and `spike_recorded:` names no answer, so the "
|
|
293
|
+
"build would start on the guess the spike exists to retire. Record "
|
|
294
|
+
"where the answer landed (`spike_recorded:`) first" % path)
|
|
295
|
+
return out
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def verification_steps(text, path):
|
|
299
|
+
"""What the verification phase requires before the plan is done: the plan's
|
|
300
|
+
own acceptance commands run once on the final tree, unpiped, and a fresh
|
|
301
|
+
reviewer's read of the diff, recorded with `review` - `close NNN done` refuses
|
|
302
|
+
without it. A round after the first reads only the delta since the sha the
|
|
303
|
+
last `review` recorded, and the review budget is two rounds."""
|
|
304
|
+
fields = tt.frontmatter(text)
|
|
305
|
+
ident = fields.get("id") or os.path.basename(path).split("-")[0]
|
|
306
|
+
# every item, not only the ones the command reader recognises: `pnpm test`
|
|
307
|
+
# carries no option or path and would otherwise vanish from the list
|
|
308
|
+
items = ["%s%s" % (i["text"], "" if i["state"] == "checkable" else
|
|
309
|
+
" [%s]" % ("unverifiable" if i["state"] == "unverifiable"
|
|
310
|
+
else "names no command"))
|
|
311
|
+
for i in tt.acceptance_items(text)]
|
|
312
|
+
# the project, not the private repository `.tezgah` may hold
|
|
313
|
+
root = os.path.realpath(os.path.join(os.path.dirname(path), "..", "..", ".."))
|
|
314
|
+
reviewed = fields.get("reviewed_sha") or ""
|
|
315
|
+
prior = fields.get("review_round") or ""
|
|
316
|
+
rounds = int(prior) if prior.isdigit() else 0
|
|
317
|
+
print("verification - required before this plan is done:")
|
|
318
|
+
print(" 1. prove the acceptance items ONCE, on the final tree - not again per "
|
|
319
|
+
"review round - every command run unpiped "
|
|
320
|
+
"(`cmd > /tmp/check.log 2>&1`, then read the file):")
|
|
321
|
+
for item in items or ["(the plan has no Acceptance items)"]:
|
|
322
|
+
print(" - %s" % item)
|
|
323
|
+
if os.path.isfile(os.path.join(root, "tests", "impacted.py")):
|
|
324
|
+
print(" the one full run here is `python3 tests/impacted.py --all`")
|
|
325
|
+
if reviewed:
|
|
326
|
+
print(" 2. review round %d: a fresh tezgah-reviewer reads only the delta "
|
|
327
|
+
"`git diff %s..HEAD` and the test output above; it does not re-run "
|
|
328
|
+
"the suite" % (rounds + 1, reviewed))
|
|
329
|
+
if rounds >= 2:
|
|
330
|
+
print(" the 2-round budget is spent: triage what is left as block "
|
|
331
|
+
"(back to the user) or fix-later (recorded), never a third loop")
|
|
332
|
+
else:
|
|
333
|
+
print(" 2. a fresh reviewer - the host's tezgah-reviewer subagent - "
|
|
334
|
+
"reads `git diff %s..HEAD` and the test output above" % diff_base(root))
|
|
335
|
+
print(" 3. record its verdict: `tezgah-task review %s <reviewer> approve|changes`"
|
|
336
|
+
" (records the reviewed sha);"
|
|
337
|
+
" `tezgah-task close %s done` refuses without an approve" % (ident, ident))
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def bad_phase(phase):
|
|
341
|
+
return "phase %r is not one of %s" % (phase, ", ".join(tt.TASK_PHASES))
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
def scope_problem(phase, allow, any_path):
|
|
345
|
+
"""A writing phase with nothing to hold its writes to is refused unless the
|
|
346
|
+
user said `--any-path`: an empty allowlist reads as "anywhere", and a plan
|
|
347
|
+
that forgot its scope must not grant that by omission."""
|
|
348
|
+
if phase in tt.WRITE_PHASES and not allow and not any_path:
|
|
349
|
+
return ["phase %s needs an allowlist: the plan has no `allowed_paths:` and "
|
|
350
|
+
"no --allow was given. Pass --allow GLOB ..., or --any-path to let "
|
|
351
|
+
"the task write anywhere in the repo" % phase]
|
|
352
|
+
return []
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
def cmd_start(args):
|
|
356
|
+
if not args:
|
|
357
|
+
return misuse("start needs a plan id or path")
|
|
358
|
+
root = repo_root(os.getcwd())
|
|
359
|
+
path, problem = plan_path(root, args[0])
|
|
360
|
+
phase = None
|
|
361
|
+
allow = []
|
|
362
|
+
any_path = False
|
|
363
|
+
rest = args[1:]
|
|
364
|
+
i = 0
|
|
365
|
+
while i < len(rest):
|
|
366
|
+
if rest[i] == "--phase":
|
|
367
|
+
if i + 1 >= len(rest):
|
|
368
|
+
return misuse("--phase needs one of %s" % ", ".join(tt.TASK_PHASES))
|
|
369
|
+
phase = rest[i + 1]
|
|
370
|
+
i += 2
|
|
371
|
+
continue
|
|
372
|
+
if rest[i] == ANY_PATH:
|
|
373
|
+
any_path = True
|
|
374
|
+
i += 1
|
|
375
|
+
continue
|
|
376
|
+
if rest[i] == "--allow":
|
|
377
|
+
i += 1
|
|
378
|
+
first = i
|
|
379
|
+
while i < len(rest) and not rest[i].startswith("--"):
|
|
380
|
+
i += 1
|
|
381
|
+
if i == first:
|
|
382
|
+
return misuse("--allow needs at least one glob (--any-path for any path)")
|
|
383
|
+
allow += rest[first:i]
|
|
384
|
+
continue
|
|
385
|
+
return misuse("unknown argument %r" % rest[i])
|
|
386
|
+
if phase is None:
|
|
387
|
+
return misuse("start needs --phase %s" % "|".join(tt.TASK_PHASES))
|
|
388
|
+
if allow and any_path:
|
|
389
|
+
return misuse("--allow and --any-path contradict each other")
|
|
390
|
+
if phase not in tt.TASK_PHASES:
|
|
391
|
+
return problems([bad_phase(phase)])
|
|
392
|
+
if problem:
|
|
393
|
+
return problems([problem])
|
|
394
|
+
text = read(path)
|
|
395
|
+
fields = {"phase": phase, "updated": today()}
|
|
396
|
+
if allow:
|
|
397
|
+
fields.update(allowed_paths=allow, allowed_from="--allow")
|
|
398
|
+
elif any_path:
|
|
399
|
+
fields.update(allowed_paths=[], allowed_from=ANY_PATH)
|
|
400
|
+
else:
|
|
401
|
+
# the plan's own scope, as plan-add wrote it (or an earlier --allow)
|
|
402
|
+
allow = tt.allowed_paths(text)
|
|
403
|
+
any_path = tt.frontmatter(text).get("allowed_from") == ANY_PATH
|
|
404
|
+
bad = (scope_problem(phase, allow, any_path)
|
|
405
|
+
or phase_problems(phase, text, path))
|
|
406
|
+
if bad:
|
|
407
|
+
return problems(bad)
|
|
408
|
+
fields.update(checkpoint_fields(root, phase))
|
|
409
|
+
for other in plans(root):
|
|
410
|
+
if other == path:
|
|
411
|
+
continue
|
|
412
|
+
if tt.frontmatter(read(other)).get("phase"):
|
|
413
|
+
# one active task at a time: the plan that had the phase loses it
|
|
414
|
+
# here rather than both being active and the gate reading whichever
|
|
415
|
+
# sorts first
|
|
416
|
+
bad = write_fields(other, phase="", updated=today())
|
|
417
|
+
if bad:
|
|
418
|
+
return problems(bad)
|
|
419
|
+
bad = write_fields(path, **fields)
|
|
420
|
+
if bad:
|
|
421
|
+
return problems(bad)
|
|
422
|
+
return show(path)
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def cmd_phase(args):
|
|
426
|
+
any_path = ANY_PATH in args
|
|
427
|
+
args = [a for a in args if a != ANY_PATH]
|
|
428
|
+
if len(args) != 1:
|
|
429
|
+
return misuse("phase takes one of %s [--any-path]" % ", ".join(tt.TASK_PHASES))
|
|
430
|
+
phase = args[0]
|
|
431
|
+
if phase not in tt.TASK_PHASES:
|
|
432
|
+
return problems([bad_phase(phase)])
|
|
433
|
+
root = repo_root(os.getcwd())
|
|
434
|
+
task = active_here(root)
|
|
435
|
+
if not task:
|
|
436
|
+
return problems(["no active task: start one with "
|
|
437
|
+
"`tezgah-task start <id> --phase %s`" % phase])
|
|
438
|
+
text = read(task["path"])
|
|
439
|
+
fields = {"phase": phase, "updated": today()}
|
|
440
|
+
if any_path:
|
|
441
|
+
fields.update(allowed_paths=[], allowed_from=ANY_PATH)
|
|
442
|
+
granted = (any_path or tt.frontmatter(text).get("allowed_from")
|
|
443
|
+
== ANY_PATH)
|
|
444
|
+
bad = (scope_problem(phase, task["allowed_paths"], granted)
|
|
445
|
+
or phase_problems(phase, text, task["path"]))
|
|
446
|
+
if bad:
|
|
447
|
+
return problems(bad)
|
|
448
|
+
fields.update(checkpoint_fields(root, phase))
|
|
449
|
+
bad = write_fields(task["path"], **fields)
|
|
450
|
+
if bad:
|
|
451
|
+
return problems(bad)
|
|
452
|
+
return show(task["path"])
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def cmd_allow(args):
|
|
456
|
+
any_path = ANY_PATH in args
|
|
457
|
+
args = [a for a in args if a != ANY_PATH]
|
|
458
|
+
for arg in args:
|
|
459
|
+
if arg.startswith("--"):
|
|
460
|
+
return misuse("allow takes globs, not %r" % arg)
|
|
461
|
+
if bool(args) == any_path:
|
|
462
|
+
return misuse("allow takes globs, or --any-path alone to lift the scope")
|
|
463
|
+
task = active_here(repo_root(os.getcwd()))
|
|
464
|
+
if not task:
|
|
465
|
+
return problems(["no active task to widen: start one with "
|
|
466
|
+
"`tezgah-task start <id> --phase P --allow GLOB`"])
|
|
467
|
+
# --any-path replaces the list with an empty one, which reads as "any path in
|
|
468
|
+
# the repo" - and the gate skips the scope check entirely then, so this is
|
|
469
|
+
# the way back out of a scope that turned out to be too narrow. A flag and
|
|
470
|
+
# not an empty call, so lifting the scope is always said out loud.
|
|
471
|
+
bad = write_fields(task["path"], allowed_paths=args, updated=today(),
|
|
472
|
+
allowed_from=ANY_PATH if any_path else "allow")
|
|
473
|
+
if bad:
|
|
474
|
+
return problems(bad)
|
|
475
|
+
return show(task["path"])
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
def cmd_stop(args):
|
|
479
|
+
if args:
|
|
480
|
+
return misuse("stop takes no arguments")
|
|
481
|
+
task = active_here(repo_root(os.getcwd()))
|
|
482
|
+
if not task:
|
|
483
|
+
return problems(["no active task to stop"])
|
|
484
|
+
bad = write_fields(task["path"], phase="", updated=today())
|
|
485
|
+
if bad:
|
|
486
|
+
return problems(bad)
|
|
487
|
+
print("task %s stopped" % task["id"])
|
|
488
|
+
return show(task["path"])
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
def review_verdict(text):
|
|
492
|
+
"""The verdict of the plan's `review: <reviewer> <verdict> <date>` line, or
|
|
493
|
+
None when it has none or names a verdict this CLI does not write."""
|
|
494
|
+
parts = (tt.frontmatter(text).get("review") or "").split()
|
|
495
|
+
return parts[1] if len(parts) >= 2 and parts[1] in VERDICTS else None
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
def cmd_review(args):
|
|
499
|
+
if len(args) != 3 or args[2] not in VERDICTS:
|
|
500
|
+
return misuse("review takes <NNN|path> <reviewer> %s" % "|".join(VERDICTS))
|
|
501
|
+
path, problem = plan_path(repo_root(os.getcwd()), args[0])
|
|
502
|
+
if problem:
|
|
503
|
+
return problems([problem])
|
|
504
|
+
fields = tt.frontmatter(read(path))
|
|
505
|
+
prior = fields.get("review_round") or ""
|
|
506
|
+
# the project's HEAD, never the private `.tezgah` repository's: the next
|
|
507
|
+
# round's delta is `git diff <this>..HEAD` over the project
|
|
508
|
+
root = os.path.realpath(os.path.join(os.path.dirname(path), "..", "..", ".."))
|
|
509
|
+
sha = (git_out(root, "rev-parse", "HEAD") or "")[:12]
|
|
510
|
+
record = {"review": "%s %s %s" % (args[1], args[2], today()),
|
|
511
|
+
"review_round": str(int(prior) + 1 if prior.isdigit() else 1),
|
|
512
|
+
"updated": today()}
|
|
513
|
+
if sha:
|
|
514
|
+
record["reviewed_sha"] = sha
|
|
515
|
+
bad = write_fields(path, **record)
|
|
516
|
+
if bad:
|
|
517
|
+
return problems(bad)
|
|
518
|
+
print("review recorded: %s %s round %s at %s (%s)" % (
|
|
519
|
+
args[1], args[2], record["review_round"], sha or "(no commit)", path))
|
|
520
|
+
return 0
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
def cmd_close(args):
|
|
524
|
+
if len(args) != 2 or args[1] not in ("done", "discarded"):
|
|
525
|
+
return misuse("close takes <NNN|path> done|discarded")
|
|
526
|
+
root = repo_root(os.getcwd())
|
|
527
|
+
path, problem = plan_path(root, args[0])
|
|
528
|
+
if problem:
|
|
529
|
+
return problems([problem])
|
|
530
|
+
if os.path.dirname(os.path.realpath(path)) != os.path.realpath(open_dir(root)):
|
|
531
|
+
return problems(["%s is not under %s" % (path, open_dir(root))])
|
|
532
|
+
text = read(path)
|
|
533
|
+
ident = os.path.basename(path).split("-")[0]
|
|
534
|
+
if tt.frontmatter(text).get("phase"):
|
|
535
|
+
return problems(["%s is the active task: the user stops it first "
|
|
536
|
+
"(`tezgah-task stop`)" % path])
|
|
537
|
+
if args[1] == "done" and review_verdict(text) != "approve":
|
|
538
|
+
return problems(["%s records no approving review: a fresh reviewer reads "
|
|
539
|
+
"the diff, then `tezgah-task review %s <reviewer> approve`"
|
|
540
|
+
% (path, ident)])
|
|
541
|
+
target = os.path.join(root, ".tezgah", "plans", "done", os.path.basename(path))
|
|
542
|
+
bad = write_fields(path, status=args[1], updated=today())
|
|
543
|
+
if bad:
|
|
544
|
+
return problems(bad)
|
|
545
|
+
try:
|
|
546
|
+
os.makedirs(os.path.dirname(target), exist_ok=True)
|
|
547
|
+
os.replace(path, target)
|
|
548
|
+
except OSError as exc:
|
|
549
|
+
return problems(["cannot move %s: %s" % (path, exc)])
|
|
550
|
+
print("moved %s -> %s" % (path, target))
|
|
551
|
+
return 0
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
def cmd_status(args):
|
|
555
|
+
as_json = "--json" in args
|
|
556
|
+
rest = [a for a in args if a != "--json"]
|
|
557
|
+
if rest:
|
|
558
|
+
return misuse("status takes --json and nothing else (%r)" % rest[0])
|
|
559
|
+
root = repo_root(os.getcwd())
|
|
560
|
+
task = active_here(root)
|
|
561
|
+
bad = []
|
|
562
|
+
for path in plans(root):
|
|
563
|
+
fields = tt.frontmatter(read(path))
|
|
564
|
+
phase = fields.get("phase") or ""
|
|
565
|
+
if phase and phase not in tt.TASK_PHASES:
|
|
566
|
+
bad.append({"id": fields.get("id") or os.path.basename(path).split("-")[0],
|
|
567
|
+
"phase": phase, "path": path})
|
|
568
|
+
if task:
|
|
569
|
+
task["allowed_from"] = allow_source(read(task["path"]))[1]
|
|
570
|
+
if as_json:
|
|
571
|
+
print(json.dumps({"active": task, "malformed": bad}, indent=2))
|
|
572
|
+
else:
|
|
573
|
+
if task:
|
|
574
|
+
show(task["path"])
|
|
575
|
+
else:
|
|
576
|
+
print("no active task")
|
|
577
|
+
for row in bad:
|
|
578
|
+
print("FAIL %s: phase %r is not one of %s, so the plan is ignored (%s)"
|
|
579
|
+
% (row["id"], row["phase"], ", ".join(tt.TASK_PHASES), row["path"]))
|
|
580
|
+
return 1 if bad else 0
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
def main(argv):
|
|
584
|
+
if len(argv) < 2:
|
|
585
|
+
print(__doc__, file=sys.stderr)
|
|
586
|
+
return 2
|
|
587
|
+
cmd, rest = argv[1], argv[2:]
|
|
588
|
+
if cmd == "start":
|
|
589
|
+
return cmd_start(rest)
|
|
590
|
+
if cmd == "phase":
|
|
591
|
+
return cmd_phase(rest)
|
|
592
|
+
if cmd == "allow":
|
|
593
|
+
return cmd_allow(rest)
|
|
594
|
+
if cmd == "stop":
|
|
595
|
+
return cmd_stop(rest)
|
|
596
|
+
if cmd == "status":
|
|
597
|
+
return cmd_status(rest)
|
|
598
|
+
if cmd == "review":
|
|
599
|
+
return cmd_review(rest)
|
|
600
|
+
if cmd == "close":
|
|
601
|
+
return cmd_close(rest)
|
|
602
|
+
return misuse("unknown command %r (start, phase, allow, stop, status, review, "
|
|
603
|
+
"close)" % cmd)
|
|
604
|
+
|
|
605
|
+
|
|
606
|
+
if __name__ == "__main__":
|
|
607
|
+
sys.exit(main(sys.argv))
|