@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,230 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""A non-English identifier tezgah is about to write: a heuristic, not a
|
|
3
|
+
language detector.
|
|
4
|
+
|
|
5
|
+
What this answers: the contract has always said code, commits, branches and docs
|
|
6
|
+
are English, and nothing checked it - a plan branch was created as
|
|
7
|
+
`plan/004-admin-durum-onarimi`, and the repository carries that folded slug in
|
|
8
|
+
its history for the rest of its life. `hooks/tezgah_gate.py` refuses the command
|
|
9
|
+
that would create such an identifier (the language rule in `decision`); this
|
|
10
|
+
module is the detector behind it, so the predicate and the word list live in one
|
|
11
|
+
place and a test can read them without a session.
|
|
12
|
+
|
|
13
|
+
Two halves, and they answer different failures:
|
|
14
|
+
|
|
15
|
+
- **Any letter outside ASCII.** The contract is "identifiers and messages stay
|
|
16
|
+
English", not "no Turkish", so a Russian, Greek, Arabic, Chinese or
|
|
17
|
+
accented-Latin identifier is refused for the same reason a Turkish one is -
|
|
18
|
+
`non_english()` is a predicate rather than a list of one language's letters.
|
|
19
|
+
- **A curated Turkish word list.** Turkish is the language this repository has
|
|
20
|
+
actually seen folded into ASCII, where the alphabet half cannot see it
|
|
21
|
+
(`durum`, `onarim`, `hazirlik`). The list carries the English each stem should
|
|
22
|
+
be written as, so a refusal can name the replacement instead of leaving the
|
|
23
|
+
session to guess.
|
|
24
|
+
|
|
25
|
+
What this is NOT: it does not read meaning and it is not a language detector. A
|
|
26
|
+
word outside the two halves passes - an ASCII-folded word from any other
|
|
27
|
+
language (`naprawa-stanu`, `reparatur`) is invisible here, and that is the
|
|
28
|
+
ceiling this module states rather than hides: catching it would take a language
|
|
29
|
+
package or a model, which is a dependency and a nondeterministic answer on a
|
|
30
|
+
denial path. A proper noun, a product name and the user's own term are the cases
|
|
31
|
+
no list can decide, which is why the refusal says it is a heuristic and hands the
|
|
32
|
+
call back to the user instead of asserting a language.
|
|
33
|
+
"""
|
|
34
|
+
import re
|
|
35
|
+
|
|
36
|
+
# The characters an English identifier never contains: a letter or digit outside
|
|
37
|
+
# ASCII. A predicate rather than a list, because the contract is "identifiers and
|
|
38
|
+
# messages stay English" and not "no Turkish": a Russian, Greek, Arabic, Chinese
|
|
39
|
+
# or accented-Latin identifier is refused for the same reason `durum-onarimi` is,
|
|
40
|
+
# and Turkish is one case of it. Measured before this change: every one of
|
|
41
|
+
# `статус`, `إصلاح`, `状态修复`, `κατάσταση`, `kế-hoạch` and `état` passed, while
|
|
42
|
+
# ASCII `I` - the letter `İ` folds to - was refused, which refused `CI`, `ID` and
|
|
43
|
+
# `I1` as well. The cost is stated in the refusal: a proper noun or a product name
|
|
44
|
+
# in another language is refused too, and the user's own term is theirs to settle.
|
|
45
|
+
def non_english(token):
|
|
46
|
+
"""True when the token holds a character English identifiers do not: any
|
|
47
|
+
alphanumeric outside ASCII. Digits and `-`/`_`/`/` are boundaries, so a slug
|
|
48
|
+
keeps its words whole and a version like `4.2.1` is untouched."""
|
|
49
|
+
return any(ord(ch) > 127 and ch.isalnum() for ch in token)
|
|
50
|
+
|
|
51
|
+
# The ASCII a Turkish letter folds to when a slug or a filename strips it. The
|
|
52
|
+
# reverse direction is what makes the word list work on `onarım` as it works on
|
|
53
|
+
# `onarim`: the token is folded before it is looked up, so the English the list
|
|
54
|
+
# knows is offered for either spelling.
|
|
55
|
+
_FOLD = str.maketrans({"ı": "i", "İ": "I", "ş": "s", "Ş": "S", "ğ": "g",
|
|
56
|
+
"Ğ": "G", "ü": "u", "Ü": "U", "ö": "o", "Ö": "O",
|
|
57
|
+
"ç": "c", "Ç": "C"})
|
|
58
|
+
|
|
59
|
+
# A token is a run of letters and digits; everything else - `-`, `_`, `/`,
|
|
60
|
+
# space, a dot, a colon - is a boundary. That is the set the identifier
|
|
61
|
+
# vocabulary is built from, so `plan/004-admin-durum-onarimi` yields `durum` and
|
|
62
|
+
# `onarimi` and not one long string.
|
|
63
|
+
# A token is a run of ASCII or non-ASCII alphanumerics; `-`, `_`, `/`, space
|
|
64
|
+
# and punctuation are boundaries. Splitting on ASCII-alnum alone is what keeps
|
|
65
|
+
# a non-Latin word whole, so the refusal names it instead of a fragment.
|
|
66
|
+
_TOKENS = re.compile(r"[^0-9A-Za-z\u00c0-\U0010ffff]+")
|
|
67
|
+
|
|
68
|
+
# The Turkish stems the list knows, and the English each one is asking for. The
|
|
69
|
+
# replacements are the point of the list: the refusal can name what to write
|
|
70
|
+
# instead, so a refused session is not left guessing at a translation.
|
|
71
|
+
#
|
|
72
|
+
# Every key is a word English does not have, which is what keeps the list from
|
|
73
|
+
# refusing English text. `data` and `test` are the shape to avoid: they are
|
|
74
|
+
# English words AND Turkish ones, so a list that held them would refuse an
|
|
75
|
+
# ordinary commit subject.
|
|
76
|
+
ENGLISH = {
|
|
77
|
+
"durum": "status",
|
|
78
|
+
"kural": "rule",
|
|
79
|
+
"dosya": "file",
|
|
80
|
+
"sayfa": "page",
|
|
81
|
+
"hata": "error",
|
|
82
|
+
"rapor": "report",
|
|
83
|
+
"ozet": "summary",
|
|
84
|
+
"sonuc": "result",
|
|
85
|
+
"kullanim": "usage",
|
|
86
|
+
"calisma": "work",
|
|
87
|
+
"onarim": "repair",
|
|
88
|
+
"deneme": "experiment",
|
|
89
|
+
"incele": "review",
|
|
90
|
+
"kontrol": "check",
|
|
91
|
+
"listele": "list",
|
|
92
|
+
"goster": "show",
|
|
93
|
+
"tasarla": "design",
|
|
94
|
+
"duzelt": "fix",
|
|
95
|
+
"ekle": "add",
|
|
96
|
+
"kaldir": "remove",
|
|
97
|
+
"guncelle": "update",
|
|
98
|
+
"hazirla": "prepare",
|
|
99
|
+
"olustur": "create",
|
|
100
|
+
"degistir": "change",
|
|
101
|
+
"temizle": "clean",
|
|
102
|
+
"iyilestir": "improve",
|
|
103
|
+
"karsilastir": "compare",
|
|
104
|
+
"tasi": "move",
|
|
105
|
+
"sil": "delete",
|
|
106
|
+
# `sil` on its own is exact-matched (see SHORT below), so the suffixed form
|
|
107
|
+
# Turkish actually uses needs its own entry: `silme` is the word a plan
|
|
108
|
+
# says, and `sil*` would also swallow `silent` and `silk`.
|
|
109
|
+
"silme": "deletion",
|
|
110
|
+
# The second group: the words a 57-word probe of ordinary Turkish found
|
|
111
|
+
# missing. Each one is here because the English side of that probe stayed
|
|
112
|
+
# clean - no English word grows out of the stem - and the three that DO have
|
|
113
|
+
# an English word growing out of them are in WHOLE below instead.
|
|
114
|
+
"hazirlik": "preparation",
|
|
115
|
+
"silin": "deleted",
|
|
116
|
+
"degis": "change",
|
|
117
|
+
"temizlik": "cleanup",
|
|
118
|
+
"tasarim": "design",
|
|
119
|
+
"baglanti": "link",
|
|
120
|
+
"ayar": "settings",
|
|
121
|
+
"kullanici": "user",
|
|
122
|
+
"yetki": "permission",
|
|
123
|
+
"guvenlik": "security",
|
|
124
|
+
"testler": "tests",
|
|
125
|
+
"senaryo": "scenario",
|
|
126
|
+
"aciklama": "description",
|
|
127
|
+
"ornek": "example",
|
|
128
|
+
"cikti": "output",
|
|
129
|
+
# the three WHOLE stems (below): listed here so the word itself is still
|
|
130
|
+
# named and translated, and read whole-token so the English they grow is not
|
|
131
|
+
"arama": "search",
|
|
132
|
+
"veri": "data",
|
|
133
|
+
"girdi": "input",
|
|
134
|
+
"donusum": "conversion",
|
|
135
|
+
"yapilandirma": "configuration",
|
|
136
|
+
"surum": "version",
|
|
137
|
+
"yayin": "release",
|
|
138
|
+
"baslat": "start",
|
|
139
|
+
"durdur": "stop",
|
|
140
|
+
"bekle": "wait",
|
|
141
|
+
"hiz": "speed",
|
|
142
|
+
"hizmet": "service",
|
|
143
|
+
"hizli": "fast",
|
|
144
|
+
"boyut": "size",
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
# A stem this short is matched whole-token rather than as a prefix. English
|
|
148
|
+
# words are shorter than Turkish suffixes suggest: `sil` prefixes `silent` and
|
|
149
|
+
# `silk`, while every longer stem in the list above has no English word growing
|
|
150
|
+
# out of it, so the prefix match - which is what catches `onarimi`, `duzeltmesi`
|
|
151
|
+
# - costs nothing there. Raising this number would start missing Turkish
|
|
152
|
+
# suffixes; lowering it would start refusing English words.
|
|
153
|
+
SHORT = 4
|
|
154
|
+
|
|
155
|
+
# The stems long enough for the prefix match that must not use it, because the
|
|
156
|
+
# prefix IS an English word: `veri` grows `verify`, `verification` and
|
|
157
|
+
# `verifiable`, `arama` grows `Aramaic`, `girdi` grows `girding`. They are read
|
|
158
|
+
# whole-token, which still catches the word on its own and in every slug or
|
|
159
|
+
# subject that separates it (`veri-tabani`, `arama-sonuclari`, `girdi-dosyasi`)
|
|
160
|
+
# and misses only the inflections Turkish glues to it (`veriler`, `aramasi`) -
|
|
161
|
+
# the price of not refusing English. The English side of the probe is the guard
|
|
162
|
+
# on this whole list, pinned in tests/test_lang.py.
|
|
163
|
+
WHOLE = ("arama", "veri", "girdi")
|
|
164
|
+
|
|
165
|
+
DENY = (
|
|
166
|
+
"Non-English identifier: the %s this command would create is not "
|
|
167
|
+
"English (`%s`). Code, commits, branches, PR and issue text stay English, "
|
|
168
|
+
"because an identifier outlives the session that typed it: a branch name "
|
|
169
|
+
"and a commit subject are in the repository, and often in a public "
|
|
170
|
+
"history, from the moment they exist. Say the same thing in English and "
|
|
171
|
+
"re-issue the command with it.%s This is a heuristic - a letter set plus a "
|
|
172
|
+
"curated word list, not a language detector - so it cannot tell a proper "
|
|
173
|
+
"noun or a product name in another language from a word that ought to be "
|
|
174
|
+
"English, and a word it lists may be the user's own term. Where the wording "
|
|
175
|
+
"is the user's own, say so plainly and let them settle it: their explicit "
|
|
176
|
+
"instruction overrides this rule, and re-issuing the same command is not "
|
|
177
|
+
"that.")
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def _folded(token):
|
|
181
|
+
return token.translate(_FOLD).lower()
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def replacement(token):
|
|
185
|
+
"""The English the list holds for this token, or None when it does not know
|
|
186
|
+
it - a token the letter set caught, a word the user chose, a proper noun."""
|
|
187
|
+
folded = _folded(token)
|
|
188
|
+
for stem, english in ENGLISH.items():
|
|
189
|
+
whole = len(stem) < SHORT or stem in WHOLE
|
|
190
|
+
if folded == stem or (not whole and folded.startswith(stem)):
|
|
191
|
+
return english
|
|
192
|
+
return None
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def offending(text):
|
|
196
|
+
"""The tokens of `text` that are not English, each once, in order.
|
|
197
|
+
|
|
198
|
+
Empty for English text and for an empty string, so a caller can treat a
|
|
199
|
+
non-empty answer as the whole condition."""
|
|
200
|
+
out = []
|
|
201
|
+
for token in _TOKENS.split(str(text or "")):
|
|
202
|
+
if not token or token in out:
|
|
203
|
+
continue
|
|
204
|
+
if non_english(token) or replacement(token):
|
|
205
|
+
out.append(token)
|
|
206
|
+
return out
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _hint(tokens):
|
|
210
|
+
"""The English to write instead, for the tokens the list knows. Empty when
|
|
211
|
+
it knows none of them - then the non-ASCII letter caught them and the
|
|
212
|
+
refusal says only which token it read."""
|
|
213
|
+
known = ["`%s` -> `%s`" % (token, replacement(token))
|
|
214
|
+
for token in tokens if replacement(token)]
|
|
215
|
+
if not known:
|
|
216
|
+
return ""
|
|
217
|
+
return " The English this list knows: %s." % ", ".join(known)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def refusal(what, text):
|
|
221
|
+
"""The refusal for a `text` that would become `what`, or None when the text
|
|
222
|
+
reads as English.
|
|
223
|
+
|
|
224
|
+
`what` is the identifier the command is about to create, in the words the
|
|
225
|
+
session wrote it with ("branch name", "commit subject", "PR title"), so the
|
|
226
|
+
refusal names the thing that will exist and not the regex that caught it."""
|
|
227
|
+
tokens = offending(text)
|
|
228
|
+
if not tokens:
|
|
229
|
+
return None
|
|
230
|
+
return DENY % (what, "`, `".join(tokens), _hint(tokens))
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""The lesson ledger's one reader: `.tezgah/lessons.md` as entries, and the key
|
|
3
|
+
each entry is remembered by.
|
|
4
|
+
|
|
5
|
+
The session block, the per-turn block and the per-turn digest
|
|
6
|
+
(`tezgah_context`), the gate and the tidy CLI (`bin/tezgah-lessons`) all read the
|
|
7
|
+
ledger here, so they agree on what a lesson is and on its key. A module of its
|
|
8
|
+
own because the gate must not import `tezgah_context` (its import cost, and the
|
|
9
|
+
rule `hooks/tezgah_task.py::repo_root` states): this one imports only
|
|
10
|
+
`tezgah_paths` at load, and `tezgah_gate` lazily, only for a line that names a
|
|
11
|
+
gate rule as its enforcer.
|
|
12
|
+
|
|
13
|
+
Stdlib only."""
|
|
14
|
+
import hashlib
|
|
15
|
+
import json
|
|
16
|
+
import os
|
|
17
|
+
import re
|
|
18
|
+
|
|
19
|
+
from tezgah_paths import cache_dir, off
|
|
20
|
+
|
|
21
|
+
# A line carries its metadata after its text, never in it: from the first
|
|
22
|
+
# `|| check:` or `|| enforced_by:` clause outside a code span to the end of the
|
|
23
|
+
# line (in any order), and an `@<sha> <path>` stamp just before those clauses.
|
|
24
|
+
# `parse` cuts both off before anything else reads the line, so neither enters
|
|
25
|
+
# the 200-character cut, `lesson_key`, the per-turn digest or the ranking. Prose
|
|
26
|
+
# keeps the rest: a bare `||` (`pytest || true`), a clause inside backticks
|
|
27
|
+
# (`a||check:b`), and an `@<sha>` followed by a word that is not a path (`git
|
|
28
|
+
# show @cafebabe1 HEAD` - a path holds a `/` or a `.`). `check` is plan 061's
|
|
29
|
+
# compiled check, which nothing reads yet.
|
|
30
|
+
SUFFIX = re.compile(r"\s*\|\|\s*(?:check|enforced_by):")
|
|
31
|
+
STAMP = re.compile(r"\s+@[0-9a-f]{7,40}\s+\S*[/.]\S*$")
|
|
32
|
+
# A line a gate rule or a test already enforces carries `|| enforced_by:
|
|
33
|
+
# <slug|test>` and leaves the injected pool while that enforcer is armed: a gate
|
|
34
|
+
# rule slug from `tezgah_gate.DENY_RULES`, or a test named from the repository
|
|
35
|
+
# root (`tests.test_research.Unfinished`) that this repository still defines. An
|
|
36
|
+
# unknown name keeps the line. Read off the tail `parse` cut.
|
|
37
|
+
ENFORCED = re.compile(r"\|\|\s*enforced_by:\s*(\S+)\s*(?=\|\||$)")
|
|
38
|
+
# A ledger written with markdown bullets must not render as "- - ...".
|
|
39
|
+
BULLET = re.compile(r"^[-*+]\s+|^\d+[.)]\s+")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def ledger(root):
|
|
43
|
+
"""The ledger's path in the repository at `root`."""
|
|
44
|
+
return os.path.join(root, ".tezgah", "lessons.md")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def lesson_key(line):
|
|
48
|
+
"""The short id a lesson is remembered by: the session's turn stamp, the
|
|
49
|
+
`lesson` row and the `lesson_tainted` row."""
|
|
50
|
+
return hashlib.sha1(line.encode("utf-8", "replace")).hexdigest()[:8]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# The top-level class and function names of a test module, per (path, mtime,
|
|
54
|
+
# size): a ledger's retired lines name one module many times, and parsing a
|
|
55
|
+
# large test file once per line would cost every session start.
|
|
56
|
+
_TEST_NAMES = {}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _test_names(path):
|
|
60
|
+
"""The names `unittest` can load from `path` as `module.NAME`: its top-level
|
|
61
|
+
classes and functions, by `ast`, so a nested def or a `class X:` inside a
|
|
62
|
+
string is not one. Empty when the file is missing or does not parse."""
|
|
63
|
+
try:
|
|
64
|
+
st = os.stat(path)
|
|
65
|
+
key = (path, st.st_mtime_ns, st.st_size)
|
|
66
|
+
if key not in _TEST_NAMES:
|
|
67
|
+
import ast # lazy: only a line retired by a test pays for it
|
|
68
|
+
with open(path, encoding="utf-8", errors="replace") as fh:
|
|
69
|
+
tree = ast.parse(fh.read(), filename=path)
|
|
70
|
+
_TEST_NAMES[key] = frozenset(
|
|
71
|
+
n.name for n in tree.body
|
|
72
|
+
if isinstance(n, (ast.ClassDef, ast.FunctionDef, ast.AsyncFunctionDef)))
|
|
73
|
+
return _TEST_NAMES[key]
|
|
74
|
+
except (OSError, SyntaxError, ValueError):
|
|
75
|
+
return frozenset()
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _enforced(value, root):
|
|
79
|
+
"""Whether the enforcer a retired lesson names is armed now: a test only
|
|
80
|
+
while `<root>/tests/test_x.py` still defines it at top level, a gate rule
|
|
81
|
+
only while neither its own switch nor `pretooluse-off` is set."""
|
|
82
|
+
test = re.match(r"tests\.(test_\w+)\.(\w+)$", value)
|
|
83
|
+
if test:
|
|
84
|
+
return test.group(2) in _test_names(
|
|
85
|
+
os.path.join(root, "tests", test.group(1) + ".py"))
|
|
86
|
+
from tezgah_gate import DENY_RULES # lazy: only a retired line pays for it
|
|
87
|
+
if value not in DENY_RULES or off("pretooluse-off"):
|
|
88
|
+
return False
|
|
89
|
+
return not (DENY_RULES[value] and off(DENY_RULES[value]))
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def parse(line):
|
|
93
|
+
"""(text, tail) for one ledger line - the lesson as every reader sees it, and
|
|
94
|
+
the clauses cut off its end - or None for a blank line or a `#` heading."""
|
|
95
|
+
s = line.strip()
|
|
96
|
+
if not s or s.startswith("#"):
|
|
97
|
+
return None
|
|
98
|
+
s = BULLET.sub("", s)
|
|
99
|
+
m = next((m for m in SUFFIX.finditer(s)
|
|
100
|
+
if s.count("`", 0, m.start()) % 2 == 0), None)
|
|
101
|
+
text, tail = (s[:m.start()], s[m.start():]) if m else (s, "")
|
|
102
|
+
return STAMP.sub("", text), tail
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def entries(text):
|
|
106
|
+
"""The lessons a text holds, each as `lines` returns it: what a write adds
|
|
107
|
+
to the ledger, read the way the ledger will be read."""
|
|
108
|
+
return [got[0] for got in map(parse, text.splitlines()) if got and got[0]]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def is_ledger(path):
|
|
112
|
+
"""True when the absolute, unresolved `path` names a repository's ledger."""
|
|
113
|
+
return (os.path.basename(path) == "lessons.md"
|
|
114
|
+
and os.path.basename(os.path.dirname(path)) == ".tezgah")
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def taint_path(root):
|
|
118
|
+
"""The `lesson_tainted` index of the repository at `root`: the gate keeps
|
|
119
|
+
each keyed row here as well as in the session's ledger, so the context of a
|
|
120
|
+
later session reads one small file for the per-line label instead of every
|
|
121
|
+
ledger on the machine (3173 files, 30 MB on the measuring machine,
|
|
122
|
+
2026-10-07)."""
|
|
123
|
+
name = hashlib.sha1(os.path.realpath(root).encode("utf-8", "replace"))
|
|
124
|
+
return os.path.join(cache_dir(), "lessons", name.hexdigest()[:16] + ".jsonl")
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _index_rows(path):
|
|
128
|
+
"""The parseable keyed rows of an index file, oldest first; [] without one.
|
|
129
|
+
A damaged line costs only itself."""
|
|
130
|
+
rows = []
|
|
131
|
+
try:
|
|
132
|
+
with open(path, encoding="utf-8", errors="replace") as fh:
|
|
133
|
+
for ln in fh:
|
|
134
|
+
try:
|
|
135
|
+
row = json.loads(ln)
|
|
136
|
+
except ValueError:
|
|
137
|
+
continue
|
|
138
|
+
if isinstance(row, dict) and row.get("key"):
|
|
139
|
+
rows.append(row)
|
|
140
|
+
except OSError:
|
|
141
|
+
pass
|
|
142
|
+
return rows
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def write_taint(root, keep, rows):
|
|
146
|
+
"""Rewrite the index of the repository at `root`: the rows it holds whose key
|
|
147
|
+
is in `keep` (the ledger's lines plus the write's new ones), then `rows`. So
|
|
148
|
+
the file never outgrows the ledger it labels. Best effort, like a ledger row.
|
|
149
|
+
ponytail: two sessions rewriting one index in the same instant can lose one
|
|
150
|
+
row (one label); the session ledger keeps its own copy of every row."""
|
|
151
|
+
path = taint_path(root)
|
|
152
|
+
kept = [r for r in _index_rows(path) if r["key"] in keep] + rows
|
|
153
|
+
tmp = "%s.%d.tmp" % (path, os.getpid())
|
|
154
|
+
try:
|
|
155
|
+
os.makedirs(os.path.dirname(path), mode=0o700, exist_ok=True)
|
|
156
|
+
fd = os.open(tmp, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600)
|
|
157
|
+
with os.fdopen(fd, "w", encoding="utf-8") as fh:
|
|
158
|
+
fh.write("".join(json.dumps(r) + "\n" for r in kept))
|
|
159
|
+
os.replace(tmp, path)
|
|
160
|
+
except OSError:
|
|
161
|
+
pass
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
# The index as last read, per (path, mtime, size): the session block, the
|
|
165
|
+
# per-turn block and the digest of one prompt each ask for it, and a hook
|
|
166
|
+
# process serves one prompt.
|
|
167
|
+
_TAINTED = {}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def tainted(root):
|
|
171
|
+
"""{key: source} for the lessons of the repository at `root` that a gate
|
|
172
|
+
recorded as written in a turn that had read untrusted text (`taint_path`);
|
|
173
|
+
{} when there is none. Read once while the file is unchanged."""
|
|
174
|
+
path = taint_path(root)
|
|
175
|
+
try:
|
|
176
|
+
st = os.stat(path)
|
|
177
|
+
except OSError:
|
|
178
|
+
return {}
|
|
179
|
+
key = (path, st.st_mtime_ns, st.st_size)
|
|
180
|
+
if key not in _TAINTED:
|
|
181
|
+
_TAINTED[key] = {str(r["key"]): str(r.get("source") or "")
|
|
182
|
+
for r in _index_rows(path)}
|
|
183
|
+
return _TAINTED[key]
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def lines(root, retired=None):
|
|
187
|
+
"""The lesson ledger as entries: one per line, markdown bullets, the clause
|
|
188
|
+
tail and the stamp stripped (`parse`).
|
|
189
|
+
|
|
190
|
+
The one reader, so every surface agrees on what is a lesson: a line whose
|
|
191
|
+
enforcer is armed (ENFORCED) is left out and appended to `retired` when
|
|
192
|
+
given; one whose enforcer is off comes back without its tail."""
|
|
193
|
+
try:
|
|
194
|
+
with open(ledger(root), encoding="utf-8", errors="replace") as fh:
|
|
195
|
+
raw = fh.read().splitlines()
|
|
196
|
+
except OSError:
|
|
197
|
+
return []
|
|
198
|
+
out = []
|
|
199
|
+
for ln in raw:
|
|
200
|
+
got = parse(ln)
|
|
201
|
+
if not got or not got[0]:
|
|
202
|
+
continue
|
|
203
|
+
text, tail = got
|
|
204
|
+
m = ENFORCED.search(tail)
|
|
205
|
+
if m and _enforced(m.group(1), root):
|
|
206
|
+
if retired is not None:
|
|
207
|
+
retired.append(text)
|
|
208
|
+
continue
|
|
209
|
+
out.append(text)
|
|
210
|
+
return out
|