@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.
Files changed (582) hide show
  1. package/CHANGELOG.md +738 -0
  2. package/LICENSE +21 -0
  3. package/MANIFEST +753 -0
  4. package/README.de.md +169 -0
  5. package/README.es.md +168 -0
  6. package/README.fr.md +166 -0
  7. package/README.md +161 -0
  8. package/README.tr.md +163 -0
  9. package/agents/tezgah-reviewer.md +70 -0
  10. package/bin/codegen +337 -0
  11. package/bin/consult +797 -0
  12. package/bin/tezgah-adhd +50 -0
  13. package/bin/tezgah-agents +45 -0
  14. package/bin/tezgah-capture +66 -0
  15. package/bin/tezgah-context +96 -0
  16. package/bin/tezgah-decisions +213 -0
  17. package/bin/tezgah-design +953 -0
  18. package/bin/tezgah-docs +1199 -0
  19. package/bin/tezgah-doctor +497 -0
  20. package/bin/tezgah-dsh +37 -0
  21. package/bin/tezgah-dsh.cmd +70 -0
  22. package/bin/tezgah-gate +75 -0
  23. package/bin/tezgah-import-ai-research +439 -0
  24. package/bin/tezgah-index +32 -0
  25. package/bin/tezgah-lessons +148 -0
  26. package/bin/tezgah-mcp +322 -0
  27. package/bin/tezgah-migrate +324 -0
  28. package/bin/tezgah-pony +50 -0
  29. package/bin/tezgah-research +772 -0
  30. package/bin/tezgah-rollback +93 -0
  31. package/bin/tezgah-route +124 -0
  32. package/bin/tezgah-setup +5798 -0
  33. package/bin/tezgah-status +383 -0
  34. package/bin/tezgah-task +607 -0
  35. package/bin/tezgah-taste +423 -0
  36. package/bin/tezgah-triage +485 -0
  37. package/bin/tezgah.js +36 -0
  38. package/commands/adhd.md +21 -0
  39. package/commands/ponytail.md +21 -0
  40. package/docs/README.md +112 -0
  41. package/docs/architecture.md +226 -0
  42. package/docs/citations-baseline.json +59 -0
  43. package/docs/clarity-baseline.json +116 -0
  44. package/docs/contract.md +416 -0
  45. package/docs/environment.md +141 -0
  46. package/docs/evidence.md +831 -0
  47. package/docs/feature-audit.md +139 -0
  48. package/docs/gate.md +407 -0
  49. package/docs/glossary.md +201 -0
  50. package/docs/hosts.md +400 -0
  51. package/docs/index.json +471 -0
  52. package/docs/judge.md +193 -0
  53. package/docs/layers.md +189 -0
  54. package/docs/models.md +160 -0
  55. package/docs/operations.md +666 -0
  56. package/docs/research.md +809 -0
  57. package/docs/results/paired-outcome-2026-10.jsonl +254 -0
  58. package/docs/results/paired-outcome-2026-10.md +204 -0
  59. package/docs/skills.md +236 -0
  60. package/docs/status-line.md +315 -0
  61. package/docs/testing.md +287 -0
  62. package/docs/vision.md +117 -0
  63. package/hooks/hooks.json +33 -0
  64. package/hooks/projects-auto-init.py +98 -0
  65. package/hooks/projects-posttooluse.py +149 -0
  66. package/hooks/projects-pretooluse.py +40 -0
  67. package/hooks/projects-stop.py +60 -0
  68. package/hooks/tezgah_agents.py +817 -0
  69. package/hooks/tezgah_apps.py +266 -0
  70. package/hooks/tezgah_attest.py +255 -0
  71. package/hooks/tezgah_clarity.py +171 -0
  72. package/hooks/tezgah_components.py +140 -0
  73. package/hooks/tezgah_context.py +2953 -0
  74. package/hooks/tezgah_embed.py +765 -0
  75. package/hooks/tezgah_gate.py +2736 -0
  76. package/hooks/tezgah_guard.py +177 -0
  77. package/hooks/tezgah_index.py +124 -0
  78. package/hooks/tezgah_integrity.py +5141 -0
  79. package/hooks/tezgah_judge.py +487 -0
  80. package/hooks/tezgah_lang.py +230 -0
  81. package/hooks/tezgah_lessons.py +210 -0
  82. package/hooks/tezgah_models.py +855 -0
  83. package/hooks/tezgah_paths.py +1132 -0
  84. package/hooks/tezgah_policy.py +1039 -0
  85. package/hooks/tezgah_rank.py +77 -0
  86. package/hooks/tezgah_replay.py +1109 -0
  87. package/hooks/tezgah_research.py +5176 -0
  88. package/hooks/tezgah_shapes.py +305 -0
  89. package/hooks/tezgah_skill_pick.py +227 -0
  90. package/hooks/tezgah_snapshot.py +490 -0
  91. package/hooks/tezgah_stopspec.py +320 -0
  92. package/hooks/tezgah_task.py +458 -0
  93. package/hooks/tezgah_taste.py +201 -0
  94. package/hooks/tezgah_untrusted.py +112 -0
  95. package/hooks/tezgah_update.py +430 -0
  96. package/hosts/codex/hook.py +268 -0
  97. package/hosts/codex/hooks.json +26 -0
  98. package/hosts/cursor/hook.py +461 -0
  99. package/hosts/cursor/hooks.json +44 -0
  100. package/hosts/dsh/hooks.json +21 -0
  101. package/hosts/dsh/statusline/lib/client.js +138 -0
  102. package/hosts/dsh/statusline/lib/index.js +104 -0
  103. package/hosts/dsh/statusline/package.json +28 -0
  104. package/hosts/omp/hook.py +277 -0
  105. package/hosts/omp/tezgah-hook.ts.in +701 -0
  106. package/hosts/opencode/plugins/tezgah.js +2742 -0
  107. package/hosts/opencode/tui/tezgah-tui.tsx +151 -0
  108. package/output-styles/tezgah.md +142 -0
  109. package/package.json +32 -0
  110. package/packaging/build.sh +342 -0
  111. package/packaging/install.ps1 +166 -0
  112. package/packaging/install.sh +56 -0
  113. package/packaging/upgrade.sh +142 -0
  114. package/skills/ai-research/0-autoresearch-skill/SKILL.md +411 -0
  115. package/skills/ai-research/0-autoresearch-skill/references/agent-continuity.md +95 -0
  116. package/skills/ai-research/0-autoresearch-skill/references/progress-reporting.md +166 -0
  117. package/skills/ai-research/0-autoresearch-skill/references/skill-routing.md +219 -0
  118. package/skills/ai-research/0-autoresearch-skill/templates/findings.md +44 -0
  119. package/skills/ai-research/0-autoresearch-skill/templates/research-log.md +41 -0
  120. package/skills/ai-research/01-model-architecture/litgpt/SKILL.md +469 -0
  121. package/skills/ai-research/01-model-architecture/litgpt/references/custom-models.md +569 -0
  122. package/skills/ai-research/01-model-architecture/litgpt/references/distributed-training.md +452 -0
  123. package/skills/ai-research/01-model-architecture/litgpt/references/supported-models.md +337 -0
  124. package/skills/ai-research/01-model-architecture/litgpt/references/training-recipes.md +620 -0
  125. package/skills/ai-research/01-model-architecture/mamba/SKILL.md +260 -0
  126. package/skills/ai-research/01-model-architecture/mamba/references/architecture-details.md +207 -0
  127. package/skills/ai-research/01-model-architecture/mamba/references/benchmarks.md +256 -0
  128. package/skills/ai-research/01-model-architecture/mamba/references/training-guide.md +389 -0
  129. package/skills/ai-research/01-model-architecture/nanogpt/SKILL.md +290 -0
  130. package/skills/ai-research/01-model-architecture/nanogpt/references/architecture.md +383 -0
  131. package/skills/ai-research/01-model-architecture/nanogpt/references/data.md +477 -0
  132. package/skills/ai-research/01-model-architecture/nanogpt/references/training.md +565 -0
  133. package/skills/ai-research/01-model-architecture/rwkv/SKILL.md +260 -0
  134. package/skills/ai-research/01-model-architecture/rwkv/references/architecture-details.md +345 -0
  135. package/skills/ai-research/01-model-architecture/rwkv/references/rwkv7.md +387 -0
  136. package/skills/ai-research/01-model-architecture/rwkv/references/state-management.md +370 -0
  137. package/skills/ai-research/01-model-architecture/torchtitan/SKILL.md +358 -0
  138. package/skills/ai-research/01-model-architecture/torchtitan/references/checkpoint.md +182 -0
  139. package/skills/ai-research/01-model-architecture/torchtitan/references/custom-models.md +259 -0
  140. package/skills/ai-research/01-model-architecture/torchtitan/references/float8.md +134 -0
  141. package/skills/ai-research/01-model-architecture/torchtitan/references/fsdp.md +127 -0
  142. package/skills/ai-research/02-tokenization/huggingface-tokenizers/SKILL.md +516 -0
  143. package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/algorithms.md +654 -0
  144. package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/integration.md +638 -0
  145. package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/pipeline.md +724 -0
  146. package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/training.md +566 -0
  147. package/skills/ai-research/02-tokenization/sentencepiece/SKILL.md +235 -0
  148. package/skills/ai-research/02-tokenization/sentencepiece/references/algorithms.md +201 -0
  149. package/skills/ai-research/02-tokenization/sentencepiece/references/training.md +305 -0
  150. package/skills/ai-research/03-fine-tuning/axolotl/SKILL.md +158 -0
  151. package/skills/ai-research/03-fine-tuning/axolotl/references/api.md +5549 -0
  152. package/skills/ai-research/03-fine-tuning/axolotl/references/dataset-formats.md +1030 -0
  153. package/skills/ai-research/03-fine-tuning/axolotl/references/index.md +16 -0
  154. package/skills/ai-research/03-fine-tuning/axolotl/references/other.md +3564 -0
  155. package/skills/ai-research/03-fine-tuning/llama-factory/SKILL.md +80 -0
  156. package/skills/ai-research/03-fine-tuning/llama-factory/references/_images.md +24 -0
  157. package/skills/ai-research/03-fine-tuning/llama-factory/references/advanced.md +1056 -0
  158. package/skills/ai-research/03-fine-tuning/llama-factory/references/getting_started.md +350 -0
  159. package/skills/ai-research/03-fine-tuning/llama-factory/references/index.md +20 -0
  160. package/skills/ai-research/03-fine-tuning/llama-factory/references/other.md +32 -0
  161. package/skills/ai-research/03-fine-tuning/peft/SKILL.md +431 -0
  162. package/skills/ai-research/03-fine-tuning/peft/references/advanced-usage.md +515 -0
  163. package/skills/ai-research/03-fine-tuning/peft/references/troubleshooting.md +481 -0
  164. package/skills/ai-research/03-fine-tuning/unsloth/SKILL.md +80 -0
  165. package/skills/ai-research/03-fine-tuning/unsloth/references/index.md +8 -0
  166. package/skills/ai-research/03-fine-tuning/unsloth/references/llms.md +83 -0
  167. package/skills/ai-research/04-mechanistic-interpretability/nnsight/SKILL.md +436 -0
  168. package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/README.md +79 -0
  169. package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/api.md +345 -0
  170. package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/tutorials.md +301 -0
  171. package/skills/ai-research/04-mechanistic-interpretability/pyvene/SKILL.md +473 -0
  172. package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/README.md +74 -0
  173. package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/api.md +384 -0
  174. package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/tutorials.md +377 -0
  175. package/skills/ai-research/04-mechanistic-interpretability/saelens/SKILL.md +386 -0
  176. package/skills/ai-research/04-mechanistic-interpretability/saelens/references/README.md +71 -0
  177. package/skills/ai-research/04-mechanistic-interpretability/saelens/references/api.md +334 -0
  178. package/skills/ai-research/04-mechanistic-interpretability/saelens/references/tutorials.md +319 -0
  179. package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/SKILL.md +346 -0
  180. package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/README.md +55 -0
  181. package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/api.md +363 -0
  182. package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/tutorials.md +340 -0
  183. package/skills/ai-research/05-data-processing/nemo-curator/SKILL.md +383 -0
  184. package/skills/ai-research/05-data-processing/nemo-curator/references/deduplication.md +88 -0
  185. package/skills/ai-research/05-data-processing/nemo-curator/references/filtering.md +103 -0
  186. package/skills/ai-research/05-data-processing/ray-data/SKILL.md +326 -0
  187. package/skills/ai-research/05-data-processing/ray-data/references/integration.md +83 -0
  188. package/skills/ai-research/05-data-processing/ray-data/references/transformations.md +84 -0
  189. package/skills/ai-research/06-post-training/grpo-rl-training/README.md +98 -0
  190. package/skills/ai-research/06-post-training/grpo-rl-training/SKILL.md +572 -0
  191. package/skills/ai-research/06-post-training/miles/SKILL.md +315 -0
  192. package/skills/ai-research/06-post-training/miles/references/api-reference.md +142 -0
  193. package/skills/ai-research/06-post-training/miles/references/troubleshooting.md +353 -0
  194. package/skills/ai-research/06-post-training/openrlhf/SKILL.md +249 -0
  195. package/skills/ai-research/06-post-training/openrlhf/references/algorithm-comparison.md +405 -0
  196. package/skills/ai-research/06-post-training/openrlhf/references/custom-rewards.md +531 -0
  197. package/skills/ai-research/06-post-training/openrlhf/references/hybrid-engine.md +288 -0
  198. package/skills/ai-research/06-post-training/openrlhf/references/multi-node-training.md +455 -0
  199. package/skills/ai-research/06-post-training/simpo/SKILL.md +219 -0
  200. package/skills/ai-research/06-post-training/simpo/references/datasets.md +479 -0
  201. package/skills/ai-research/06-post-training/simpo/references/hyperparameters.md +453 -0
  202. package/skills/ai-research/06-post-training/simpo/references/loss-functions.md +351 -0
  203. package/skills/ai-research/06-post-training/slime/SKILL.md +464 -0
  204. package/skills/ai-research/06-post-training/slime/references/api-reference.md +393 -0
  205. package/skills/ai-research/06-post-training/slime/references/troubleshooting.md +387 -0
  206. package/skills/ai-research/06-post-training/torchforge/SKILL.md +433 -0
  207. package/skills/ai-research/06-post-training/torchforge/references/api-reference.md +328 -0
  208. package/skills/ai-research/06-post-training/torchforge/references/troubleshooting.md +410 -0
  209. package/skills/ai-research/06-post-training/trl-fine-tuning/SKILL.md +455 -0
  210. package/skills/ai-research/06-post-training/trl-fine-tuning/references/dpo-variants.md +228 -0
  211. package/skills/ai-research/06-post-training/trl-fine-tuning/references/online-rl.md +83 -0
  212. package/skills/ai-research/06-post-training/trl-fine-tuning/references/reward-modeling.md +123 -0
  213. package/skills/ai-research/06-post-training/trl-fine-tuning/references/sft-training.md +169 -0
  214. package/skills/ai-research/06-post-training/verl/SKILL.md +391 -0
  215. package/skills/ai-research/06-post-training/verl/references/api-reference.md +302 -0
  216. package/skills/ai-research/06-post-training/verl/references/troubleshooting.md +392 -0
  217. package/skills/ai-research/07-safety-alignment/constitutional-ai/SKILL.md +290 -0
  218. package/skills/ai-research/07-safety-alignment/llamaguard/SKILL.md +337 -0
  219. package/skills/ai-research/07-safety-alignment/nemo-guardrails/SKILL.md +297 -0
  220. package/skills/ai-research/07-safety-alignment/prompt-guard/SKILL.md +312 -0
  221. package/skills/ai-research/08-distributed-training/accelerate/SKILL.md +332 -0
  222. package/skills/ai-research/08-distributed-training/accelerate/references/custom-plugins.md +454 -0
  223. package/skills/ai-research/08-distributed-training/accelerate/references/megatron-integration.md +490 -0
  224. package/skills/ai-research/08-distributed-training/accelerate/references/performance.md +526 -0
  225. package/skills/ai-research/08-distributed-training/deepspeed/SKILL.md +141 -0
  226. package/skills/ai-research/08-distributed-training/deepspeed/references/08.md +18 -0
  227. package/skills/ai-research/08-distributed-training/deepspeed/references/09.md +174 -0
  228. package/skills/ai-research/08-distributed-training/deepspeed/references/2020.md +379 -0
  229. package/skills/ai-research/08-distributed-training/deepspeed/references/2023.md +280 -0
  230. package/skills/ai-research/08-distributed-training/deepspeed/references/assets.md +180 -0
  231. package/skills/ai-research/08-distributed-training/deepspeed/references/index.md +36 -0
  232. package/skills/ai-research/08-distributed-training/deepspeed/references/mii.md +119 -0
  233. package/skills/ai-research/08-distributed-training/deepspeed/references/other.md +1192 -0
  234. package/skills/ai-research/08-distributed-training/megatron-core/SKILL.md +366 -0
  235. package/skills/ai-research/08-distributed-training/megatron-core/references/benchmarks.md +250 -0
  236. package/skills/ai-research/08-distributed-training/megatron-core/references/parallelism-guide.md +405 -0
  237. package/skills/ai-research/08-distributed-training/megatron-core/references/production-examples.md +474 -0
  238. package/skills/ai-research/08-distributed-training/megatron-core/references/training-recipes.md +548 -0
  239. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/SKILL.md +231 -0
  240. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_async_recipe.md +14 -0
  241. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_overview.md +19 -0
  242. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_recipe.md +18 -0
  243. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_ddp_notes.md +10 -0
  244. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_device_mesh_tutorial.md +22 -0
  245. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_examples_fsdp2.md +15 -0
  246. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fsdp1_api.md +9 -0
  247. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fsdp2_tutorial.md +45 -0
  248. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fully_shard_api.md +49 -0
  249. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_tp_tutorial.md +22 -0
  250. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/ray_train_fsdp2_example.md +13 -0
  251. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/torchtitan_fsdp_notes.md +14 -0
  252. package/skills/ai-research/08-distributed-training/pytorch-lightning/SKILL.md +346 -0
  253. package/skills/ai-research/08-distributed-training/pytorch-lightning/references/callbacks.md +437 -0
  254. package/skills/ai-research/08-distributed-training/pytorch-lightning/references/distributed.md +491 -0
  255. package/skills/ai-research/08-distributed-training/pytorch-lightning/references/hyperparameter-tuning.md +557 -0
  256. package/skills/ai-research/08-distributed-training/ray-train/SKILL.md +406 -0
  257. package/skills/ai-research/08-distributed-training/ray-train/references/multi-node.md +629 -0
  258. package/skills/ai-research/09-infrastructure/lambda-labs/SKILL.md +545 -0
  259. package/skills/ai-research/09-infrastructure/lambda-labs/references/advanced-usage.md +612 -0
  260. package/skills/ai-research/09-infrastructure/lambda-labs/references/troubleshooting.md +531 -0
  261. package/skills/ai-research/09-infrastructure/modal/SKILL.md +341 -0
  262. package/skills/ai-research/09-infrastructure/modal/references/advanced-usage.md +504 -0
  263. package/skills/ai-research/09-infrastructure/modal/references/troubleshooting.md +495 -0
  264. package/skills/ai-research/09-infrastructure/skypilot/SKILL.md +509 -0
  265. package/skills/ai-research/09-infrastructure/skypilot/references/advanced-usage.md +492 -0
  266. package/skills/ai-research/09-infrastructure/skypilot/references/troubleshooting.md +571 -0
  267. package/skills/ai-research/10-optimization/awq/SKILL.md +310 -0
  268. package/skills/ai-research/10-optimization/awq/references/advanced-usage.md +325 -0
  269. package/skills/ai-research/10-optimization/awq/references/troubleshooting.md +345 -0
  270. package/skills/ai-research/10-optimization/bitsandbytes/SKILL.md +411 -0
  271. package/skills/ai-research/10-optimization/bitsandbytes/references/memory-optimization.md +522 -0
  272. package/skills/ai-research/10-optimization/bitsandbytes/references/qlora-training.md +522 -0
  273. package/skills/ai-research/10-optimization/bitsandbytes/references/quantization-formats.md +448 -0
  274. package/skills/ai-research/10-optimization/flash-attention/SKILL.md +367 -0
  275. package/skills/ai-research/10-optimization/flash-attention/references/benchmarks.md +216 -0
  276. package/skills/ai-research/10-optimization/flash-attention/references/transformers-integration.md +294 -0
  277. package/skills/ai-research/10-optimization/gguf/SKILL.md +427 -0
  278. package/skills/ai-research/10-optimization/gguf/references/advanced-usage.md +505 -0
  279. package/skills/ai-research/10-optimization/gguf/references/troubleshooting.md +443 -0
  280. package/skills/ai-research/10-optimization/gptq/SKILL.md +450 -0
  281. package/skills/ai-research/10-optimization/gptq/references/calibration.md +338 -0
  282. package/skills/ai-research/10-optimization/gptq/references/integration.md +130 -0
  283. package/skills/ai-research/10-optimization/gptq/references/troubleshooting.md +96 -0
  284. package/skills/ai-research/10-optimization/hqq/SKILL.md +445 -0
  285. package/skills/ai-research/10-optimization/hqq/references/advanced-usage.md +529 -0
  286. package/skills/ai-research/10-optimization/hqq/references/troubleshooting.md +504 -0
  287. package/skills/ai-research/10-optimization/ml-training-recipes/SKILL.md +319 -0
  288. package/skills/ai-research/10-optimization/ml-training-recipes/references/architecture.md +320 -0
  289. package/skills/ai-research/10-optimization/ml-training-recipes/references/biomedical.md +498 -0
  290. package/skills/ai-research/10-optimization/ml-training-recipes/references/domain-specific.md +626 -0
  291. package/skills/ai-research/10-optimization/ml-training-recipes/references/experiment-loop.md +129 -0
  292. package/skills/ai-research/10-optimization/ml-training-recipes/references/optimizers.md +330 -0
  293. package/skills/ai-research/10-optimization/ml-training-recipes/references/scaling-and-selection.md +428 -0
  294. package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/SKILL.md +405 -0
  295. package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/benchmarks.md +394 -0
  296. package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/custom-tasks.md +425 -0
  297. package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/issues.md +395 -0
  298. package/skills/ai-research/11-evaluation/lm-evaluation-harness/SKILL.md +490 -0
  299. package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/api-evaluation.md +491 -0
  300. package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/benchmark-guide.md +489 -0
  301. package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/custom-tasks.md +603 -0
  302. package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/distributed-eval.md +520 -0
  303. package/skills/ai-research/11-evaluation/nemo-evaluator/SKILL.md +494 -0
  304. package/skills/ai-research/11-evaluation/nemo-evaluator/references/adapter-system.md +341 -0
  305. package/skills/ai-research/11-evaluation/nemo-evaluator/references/configuration.md +448 -0
  306. package/skills/ai-research/11-evaluation/nemo-evaluator/references/custom-benchmarks.md +316 -0
  307. package/skills/ai-research/11-evaluation/nemo-evaluator/references/execution-backends.md +362 -0
  308. package/skills/ai-research/12-inference-serving/llama-cpp/SKILL.md +258 -0
  309. package/skills/ai-research/12-inference-serving/llama-cpp/references/optimization.md +90 -0
  310. package/skills/ai-research/12-inference-serving/llama-cpp/references/quantization.md +214 -0
  311. package/skills/ai-research/12-inference-serving/llama-cpp/references/server.md +126 -0
  312. package/skills/ai-research/12-inference-serving/sglang/SKILL.md +442 -0
  313. package/skills/ai-research/12-inference-serving/sglang/references/deployment.md +491 -0
  314. package/skills/ai-research/12-inference-serving/sglang/references/radix-attention.md +414 -0
  315. package/skills/ai-research/12-inference-serving/sglang/references/structured-generation.md +542 -0
  316. package/skills/ai-research/12-inference-serving/tensorrt-llm/SKILL.md +187 -0
  317. package/skills/ai-research/12-inference-serving/tensorrt-llm/references/multi-gpu.md +299 -0
  318. package/skills/ai-research/12-inference-serving/tensorrt-llm/references/optimization.md +243 -0
  319. package/skills/ai-research/12-inference-serving/tensorrt-llm/references/serving.md +471 -0
  320. package/skills/ai-research/12-inference-serving/vllm/SKILL.md +364 -0
  321. package/skills/ai-research/12-inference-serving/vllm/references/optimization.md +227 -0
  322. package/skills/ai-research/12-inference-serving/vllm/references/quantization.md +285 -0
  323. package/skills/ai-research/12-inference-serving/vllm/references/server-deployment.md +256 -0
  324. package/skills/ai-research/12-inference-serving/vllm/references/troubleshooting.md +448 -0
  325. package/skills/ai-research/13-mlops/mlflow/SKILL.md +704 -0
  326. package/skills/ai-research/13-mlops/mlflow/references/deployment.md +745 -0
  327. package/skills/ai-research/13-mlops/mlflow/references/model-registry.md +771 -0
  328. package/skills/ai-research/13-mlops/mlflow/references/tracking.md +681 -0
  329. package/skills/ai-research/13-mlops/swanlab/SKILL.md +406 -0
  330. package/skills/ai-research/13-mlops/swanlab/references/integrations.md +305 -0
  331. package/skills/ai-research/13-mlops/swanlab/references/visualization.md +234 -0
  332. package/skills/ai-research/13-mlops/tensorboard/SKILL.md +629 -0
  333. package/skills/ai-research/13-mlops/tensorboard/references/integrations.md +639 -0
  334. package/skills/ai-research/13-mlops/tensorboard/references/profiling.md +546 -0
  335. package/skills/ai-research/13-mlops/tensorboard/references/visualization.md +621 -0
  336. package/skills/ai-research/13-mlops/weights-and-biases/SKILL.md +590 -0
  337. package/skills/ai-research/13-mlops/weights-and-biases/references/artifacts.md +585 -0
  338. package/skills/ai-research/13-mlops/weights-and-biases/references/integrations.md +701 -0
  339. package/skills/ai-research/13-mlops/weights-and-biases/references/sweeps.md +848 -0
  340. package/skills/ai-research/14-agents/a-evolve/SKILL.md +383 -0
  341. package/skills/ai-research/14-agents/a-evolve/references/README.md +831 -0
  342. package/skills/ai-research/14-agents/a-evolve/references/api.md +594 -0
  343. package/skills/ai-research/14-agents/a-evolve/references/architecture.md +417 -0
  344. package/skills/ai-research/14-agents/a-evolve/references/design-patterns.md +462 -0
  345. package/skills/ai-research/14-agents/a-evolve/references/examples.md +352 -0
  346. package/skills/ai-research/14-agents/a-evolve/references/issues.md +591 -0
  347. package/skills/ai-research/14-agents/a-evolve/references/releases.md +112 -0
  348. package/skills/ai-research/14-agents/a-evolve/references/tutorials.md +819 -0
  349. package/skills/ai-research/14-agents/autogpt/SKILL.md +403 -0
  350. package/skills/ai-research/14-agents/autogpt/references/advanced-usage.md +536 -0
  351. package/skills/ai-research/14-agents/autogpt/references/troubleshooting.md +421 -0
  352. package/skills/ai-research/14-agents/crewai/SKILL.md +498 -0
  353. package/skills/ai-research/14-agents/crewai/references/flows.md +439 -0
  354. package/skills/ai-research/14-agents/crewai/references/tools.md +430 -0
  355. package/skills/ai-research/14-agents/crewai/references/troubleshooting.md +481 -0
  356. package/skills/ai-research/14-agents/langchain/SKILL.md +480 -0
  357. package/skills/ai-research/14-agents/langchain/references/agents.md +500 -0
  358. package/skills/ai-research/14-agents/langchain/references/integration.md +563 -0
  359. package/skills/ai-research/14-agents/langchain/references/rag.md +601 -0
  360. package/skills/ai-research/14-agents/llamaindex/SKILL.md +569 -0
  361. package/skills/ai-research/14-agents/llamaindex/references/agents.md +84 -0
  362. package/skills/ai-research/14-agents/llamaindex/references/data_connectors.md +109 -0
  363. package/skills/ai-research/14-agents/llamaindex/references/query_engines.md +407 -0
  364. package/skills/ai-research/15-rag/chroma/SKILL.md +406 -0
  365. package/skills/ai-research/15-rag/chroma/references/integration.md +39 -0
  366. package/skills/ai-research/15-rag/faiss/SKILL.md +221 -0
  367. package/skills/ai-research/15-rag/faiss/references/index_types.md +281 -0
  368. package/skills/ai-research/15-rag/pinecone/SKILL.md +358 -0
  369. package/skills/ai-research/15-rag/pinecone/references/deployment.md +182 -0
  370. package/skills/ai-research/15-rag/qdrant/SKILL.md +493 -0
  371. package/skills/ai-research/15-rag/qdrant/references/advanced-usage.md +649 -0
  372. package/skills/ai-research/15-rag/qdrant/references/troubleshooting.md +632 -0
  373. package/skills/ai-research/15-rag/sentence-transformers/SKILL.md +255 -0
  374. package/skills/ai-research/15-rag/sentence-transformers/references/models.md +124 -0
  375. package/skills/ai-research/16-prompt-engineering/dspy/SKILL.md +590 -0
  376. package/skills/ai-research/16-prompt-engineering/dspy/references/examples.md +664 -0
  377. package/skills/ai-research/16-prompt-engineering/dspy/references/modules.md +476 -0
  378. package/skills/ai-research/16-prompt-engineering/dspy/references/optimizers.md +567 -0
  379. package/skills/ai-research/16-prompt-engineering/guidance/SKILL.md +572 -0
  380. package/skills/ai-research/16-prompt-engineering/guidance/references/backends.md +555 -0
  381. package/skills/ai-research/16-prompt-engineering/guidance/references/constraints.md +675 -0
  382. package/skills/ai-research/16-prompt-engineering/guidance/references/examples.md +768 -0
  383. package/skills/ai-research/16-prompt-engineering/instructor/SKILL.md +740 -0
  384. package/skills/ai-research/16-prompt-engineering/instructor/references/examples.md +108 -0
  385. package/skills/ai-research/16-prompt-engineering/instructor/references/providers.md +71 -0
  386. package/skills/ai-research/16-prompt-engineering/instructor/references/validation.md +607 -0
  387. package/skills/ai-research/16-prompt-engineering/outlines/SKILL.md +652 -0
  388. package/skills/ai-research/16-prompt-engineering/outlines/references/backends.md +616 -0
  389. package/skills/ai-research/16-prompt-engineering/outlines/references/examples.md +774 -0
  390. package/skills/ai-research/16-prompt-engineering/outlines/references/json_generation.md +653 -0
  391. package/skills/ai-research/17-observability/langsmith/SKILL.md +422 -0
  392. package/skills/ai-research/17-observability/langsmith/references/advanced-usage.md +549 -0
  393. package/skills/ai-research/17-observability/langsmith/references/troubleshooting.md +538 -0
  394. package/skills/ai-research/17-observability/phoenix/SKILL.md +475 -0
  395. package/skills/ai-research/17-observability/phoenix/references/advanced-usage.md +620 -0
  396. package/skills/ai-research/17-observability/phoenix/references/troubleshooting.md +539 -0
  397. package/skills/ai-research/18-multimodal/audiocraft/SKILL.md +564 -0
  398. package/skills/ai-research/18-multimodal/audiocraft/references/advanced-usage.md +667 -0
  399. package/skills/ai-research/18-multimodal/audiocraft/references/troubleshooting.md +505 -0
  400. package/skills/ai-research/18-multimodal/blip-2/SKILL.md +564 -0
  401. package/skills/ai-research/18-multimodal/blip-2/references/advanced-usage.md +681 -0
  402. package/skills/ai-research/18-multimodal/blip-2/references/troubleshooting.md +527 -0
  403. package/skills/ai-research/18-multimodal/clip/SKILL.md +253 -0
  404. package/skills/ai-research/18-multimodal/clip/references/applications.md +208 -0
  405. package/skills/ai-research/18-multimodal/cosmos-policy/SKILL.md +402 -0
  406. package/skills/ai-research/18-multimodal/cosmos-policy/references/libero-commands.md +175 -0
  407. package/skills/ai-research/18-multimodal/cosmos-policy/references/robocasa-commands.md +147 -0
  408. package/skills/ai-research/18-multimodal/llava/SKILL.md +304 -0
  409. package/skills/ai-research/18-multimodal/llava/references/training.md +198 -0
  410. package/skills/ai-research/18-multimodal/openpi/SKILL.md +480 -0
  411. package/skills/ai-research/18-multimodal/openpi/references/checkpoints-and-env-map.md +86 -0
  412. package/skills/ai-research/18-multimodal/openpi/references/config-recipes.md +50 -0
  413. package/skills/ai-research/18-multimodal/openpi/references/pytorch-gotchas.md +49 -0
  414. package/skills/ai-research/18-multimodal/openpi/references/remote-client-pattern.md +48 -0
  415. package/skills/ai-research/18-multimodal/openpi/references/training-debugging.md +46 -0
  416. package/skills/ai-research/18-multimodal/openvla-oft/SKILL.md +441 -0
  417. package/skills/ai-research/18-multimodal/openvla-oft/references/aloha-workflow.md +141 -0
  418. package/skills/ai-research/18-multimodal/openvla-oft/references/config-troubleshooting.md +97 -0
  419. package/skills/ai-research/18-multimodal/openvla-oft/references/libero-workflow.md +115 -0
  420. package/skills/ai-research/18-multimodal/openvla-oft/references/paper-and-checkpoints.md +84 -0
  421. package/skills/ai-research/18-multimodal/segment-anything/SKILL.md +500 -0
  422. package/skills/ai-research/18-multimodal/segment-anything/references/advanced-usage.md +590 -0
  423. package/skills/ai-research/18-multimodal/segment-anything/references/troubleshooting.md +485 -0
  424. package/skills/ai-research/18-multimodal/stable-diffusion/SKILL.md +519 -0
  425. package/skills/ai-research/18-multimodal/stable-diffusion/references/advanced-usage.md +717 -0
  426. package/skills/ai-research/18-multimodal/stable-diffusion/references/troubleshooting.md +556 -0
  427. package/skills/ai-research/18-multimodal/whisper/SKILL.md +317 -0
  428. package/skills/ai-research/18-multimodal/whisper/references/languages.md +190 -0
  429. package/skills/ai-research/19-emerging-techniques/knowledge-distillation/SKILL.md +458 -0
  430. package/skills/ai-research/19-emerging-techniques/knowledge-distillation/references/minillm.md +335 -0
  431. package/skills/ai-research/19-emerging-techniques/long-context/SKILL.md +536 -0
  432. package/skills/ai-research/19-emerging-techniques/long-context/references/extension_methods.md +469 -0
  433. package/skills/ai-research/19-emerging-techniques/long-context/references/fine_tuning.md +612 -0
  434. package/skills/ai-research/19-emerging-techniques/long-context/references/rope.md +403 -0
  435. package/skills/ai-research/19-emerging-techniques/model-merging/SKILL.md +497 -0
  436. package/skills/ai-research/19-emerging-techniques/model-merging/references/coefficient-tuning.md +415 -0
  437. package/skills/ai-research/19-emerging-techniques/model-merging/references/evaluation.md +463 -0
  438. package/skills/ai-research/19-emerging-techniques/model-merging/references/examples.md +429 -0
  439. package/skills/ai-research/19-emerging-techniques/model-merging/references/methods.md +353 -0
  440. package/skills/ai-research/19-emerging-techniques/model-pruning/SKILL.md +495 -0
  441. package/skills/ai-research/19-emerging-techniques/model-pruning/references/wanda.md +348 -0
  442. package/skills/ai-research/19-emerging-techniques/moe-training/SKILL.md +526 -0
  443. package/skills/ai-research/19-emerging-techniques/moe-training/references/architectures.md +433 -0
  444. package/skills/ai-research/19-emerging-techniques/moe-training/references/inference.md +349 -0
  445. package/skills/ai-research/19-emerging-techniques/moe-training/references/training.md +426 -0
  446. package/skills/ai-research/19-emerging-techniques/speculative-decoding/SKILL.md +467 -0
  447. package/skills/ai-research/19-emerging-techniques/speculative-decoding/references/lookahead.md +310 -0
  448. package/skills/ai-research/19-emerging-techniques/speculative-decoding/references/medusa.md +351 -0
  449. package/skills/ai-research/20-ml-paper-writing/academic-plotting/SKILL.md +479 -0
  450. package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/data-visualization.md +509 -0
  451. package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/diagram-generation.md +395 -0
  452. package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/style-guide.md +305 -0
  453. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/SKILL.md +982 -0
  454. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/checklists.md +348 -0
  455. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/citation-workflow.md +563 -0
  456. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/reviewer-guidelines.md +349 -0
  457. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/sources.md +165 -0
  458. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/writing-guide.md +477 -0
  459. package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/SKILL.md +298 -0
  460. package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/references/slide-templates.md +505 -0
  461. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/SKILL.md +270 -0
  462. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/checklist.md +279 -0
  463. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/reviewer-guidelines.md +116 -0
  464. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/section-blueprints.md +400 -0
  465. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/systems-conferences.md +261 -0
  466. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/writing-patterns.md +231 -0
  467. package/skills/ai-research/21-research-ideation/brainstorming-research-ideas/SKILL.md +384 -0
  468. package/skills/ai-research/21-research-ideation/creative-thinking-for-research/SKILL.md +366 -0
  469. package/skills/ai-research/22-agent-native-research-artifact/compiler/SKILL.md +245 -0
  470. package/skills/ai-research/22-agent-native-research-artifact/compiler/references/ara-schema.md +439 -0
  471. package/skills/ai-research/22-agent-native-research-artifact/compiler/references/exploration-tree-spec.md +125 -0
  472. package/skills/ai-research/22-agent-native-research-artifact/compiler/references/validation-checklist.md +149 -0
  473. package/skills/ai-research/22-agent-native-research-artifact/research-manager/SKILL.md +324 -0
  474. package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/event-taxonomy.md +124 -0
  475. package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/provenance-tags.md +190 -0
  476. package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/session-protocol.md +162 -0
  477. package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/SKILL.md +322 -0
  478. package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/references/review-dimensions.md +182 -0
  479. package/skills/ai-research/SKILL.md +101 -0
  480. package/skills/ai-research/SOURCE +38 -0
  481. package/skills/ai-research/index/1-frame.md +18 -0
  482. package/skills/ai-research/index/2-data.md +21 -0
  483. package/skills/ai-research/index/3-train.md +48 -0
  484. package/skills/ai-research/index/4-measure.md +25 -0
  485. package/skills/ai-research/index/5-run.md +23 -0
  486. package/skills/ai-research/index/6-write.md +35 -0
  487. package/skills/ai-research/library.json +3456 -0
  488. package/skills/analyze-app/EVALS.md +82 -0
  489. package/skills/analyze-app/SKILL.md +188 -0
  490. package/skills/design-contract/EVALS.md +80 -0
  491. package/skills/design-contract/SKILL.md +171 -0
  492. package/skills/design-library/EVALS.md +85 -0
  493. package/skills/design-library/INDEX.md +59 -0
  494. package/skills/design-library/SKILL.md +58 -0
  495. package/skills/design-library/SOURCE +131 -0
  496. package/skills/design-library/adaptive-interfaces/skills/colour-independence/SKILL.md +90 -0
  497. package/skills/design-library/adaptive-interfaces/skills/flexible-typography/SKILL.md +83 -0
  498. package/skills/design-library/adaptive-interfaces/skills/information-density/SKILL.md +87 -0
  499. package/skills/design-library/adaptive-interfaces/skills/preference-audit/SKILL.md +70 -0
  500. package/skills/design-library/adaptive-interfaces/skills/responsive-accessibility/SKILL.md +86 -0
  501. package/skills/design-library/adaptive-interfaces/skills/responsive-review/SKILL.md +76 -0
  502. package/skills/design-library/adaptive-interfaces/skills/simplified-views/SKILL.md +97 -0
  503. package/skills/design-library/adaptive-interfaces/skills/specify/SKILL.md +63 -0
  504. package/skills/design-library/adaptive-interfaces/skills/user-preference-respect/SKILL.md +100 -0
  505. package/skills/design-library/cognitive-accessibility/skills/adaptive-personalisation/SKILL.md +61 -0
  506. package/skills/design-library/cognitive-accessibility/skills/assess-load/SKILL.md +48 -0
  507. package/skills/design-library/cognitive-accessibility/skills/cognitive-load-assessment/SKILL.md +60 -0
  508. package/skills/design-library/cognitive-accessibility/skills/contextual-help-design/SKILL.md +61 -0
  509. package/skills/design-library/cognitive-accessibility/skills/error-prevention-recovery/SKILL.md +71 -0
  510. package/skills/design-library/cognitive-accessibility/skills/focus-attention-design/SKILL.md +67 -0
  511. package/skills/design-library/cognitive-accessibility/skills/memory-load-reduction/SKILL.md +60 -0
  512. package/skills/design-library/cognitive-accessibility/skills/plain-language-design/SKILL.md +78 -0
  513. package/skills/design-library/cognitive-accessibility/skills/review/SKILL.md +56 -0
  514. package/skills/design-library/cognitive-accessibility/skills/simplify/SKILL.md +39 -0
  515. package/skills/design-library/cognitive-accessibility/skills/wayfinding-navigation/SKILL.md +64 -0
  516. package/skills/design-library/design-research/skills/behavioural-analytics/SKILL.md +33 -0
  517. package/skills/design-library/design-research/skills/qual-quant-triangulation/SKILL.md +33 -0
  518. package/skills/design-library/inclusive-interaction/skills/audit/SKILL.md +50 -0
  519. package/skills/design-library/inclusive-interaction/skills/design-flow/SKILL.md +58 -0
  520. package/skills/design-library/inclusive-interaction/skills/feedback-and-status/SKILL.md +76 -0
  521. package/skills/design-library/inclusive-interaction/skills/gesture-alternatives/SKILL.md +70 -0
  522. package/skills/design-library/inclusive-interaction/skills/keyboard-navigation/SKILL.md +99 -0
  523. package/skills/design-library/inclusive-interaction/skills/keyboard-review/SKILL.md +54 -0
  524. package/skills/design-library/inclusive-interaction/skills/motion-sensitivity/SKILL.md +79 -0
  525. package/skills/design-library/inclusive-interaction/skills/multi-modal-input/SKILL.md +70 -0
  526. package/skills/design-library/inclusive-interaction/skills/touch-target-design/SKILL.md +71 -0
  527. package/skills/design-library/inclusive-interaction/skills/voice-interaction/SKILL.md +68 -0
  528. package/skills/design-library/visual-critique/skills/critique-affordance/SKILL.md +45 -0
  529. package/skills/design-library/visual-critique/skills/critique-brand-consistency/SKILL.md +42 -0
  530. package/skills/design-library/visual-critique/skills/critique-color/SKILL.md +44 -0
  531. package/skills/design-library/visual-critique/skills/critique-composition/SKILL.md +46 -0
  532. package/skills/design-library/visual-critique/skills/critique-information-density/SKILL.md +45 -0
  533. package/skills/design-library/visual-critique/skills/critique-typography/SKILL.md +45 -0
  534. package/skills/design-library/visual-critique/skills/critique-visual-hierarchy/SKILL.md +40 -0
  535. package/skills/feature-audit/EVALS.md +83 -0
  536. package/skills/feature-audit/SKILL.md +326 -0
  537. package/skills/harness/EVALS.md +81 -0
  538. package/skills/harness/SKILL.md +88 -0
  539. package/skills/i-have-adhd/EVALS.md +80 -0
  540. package/skills/i-have-adhd/SKILL.md +183 -0
  541. package/skills/no-ai-slop/EVALS.md +89 -0
  542. package/skills/no-ai-slop/SKILL.md +209 -0
  543. package/skills/no-ai-slop/eval.md +52 -0
  544. package/skills/plan-add/EVALS.md +79 -0
  545. package/skills/plan-add/SKILL.md +179 -0
  546. package/skills/plan-add/render_table.py +72 -0
  547. package/skills/plan-status/EVALS.md +78 -0
  548. package/skills/plan-status/SKILL.md +52 -0
  549. package/skills/plan-sync/EVALS.md +80 -0
  550. package/skills/plan-sync/SKILL.md +69 -0
  551. package/skills/pm-frameworks/SKILL.md +33 -0
  552. package/skills/pm-frameworks/SOURCE +39 -0
  553. package/skills/pm-frameworks/intended-vs-implemented/SKILL.md +42 -0
  554. package/skills/pm-frameworks/opportunity-solution-tree/SKILL.md +64 -0
  555. package/skills/ponytail/EVALS.md +80 -0
  556. package/skills/ponytail/SKILL.md +124 -0
  557. package/skills/product-analysis/EVALS.md +103 -0
  558. package/skills/product-analysis/SKILL.md +361 -0
  559. package/skills/research/EVALS.md +104 -0
  560. package/skills/research/SKILL.md +570 -0
  561. package/skills/rl-env/SKILL.md +53 -0
  562. package/skills/rl-env/SOURCE +41 -0
  563. package/skills/rl-env/generate-nemo-gym-env/SKILL.md +169 -0
  564. package/skills/rl-env/generate-nemo-gym-env/references/architecture.md +114 -0
  565. package/skills/rl-env/generate-openenv-env/SKILL.md +183 -0
  566. package/skills/rl-env/generate-openenv-env/references/architecture.md +82 -0
  567. package/skills/rl-env/generate-ors-env/SKILL.md +209 -0
  568. package/skills/rl-env/generate-ors-env/references/architecture.md +113 -0
  569. package/skills/rl-env/generate-verifiers-env/SKILL.md +188 -0
  570. package/skills/rl-env/generate-verifiers-env/references/architecture.md +119 -0
  571. package/skills/rl-env/rl-env-from-description/SKILL.md +124 -0
  572. package/skills/rl-env/rl-env-from-description/references/interview.md +75 -0
  573. package/skills/rl-env/rl-env-from-description/references/nemo_gym.md +41 -0
  574. package/skills/rl-env/rl-env-from-description/references/openenv.md +35 -0
  575. package/skills/rl-env/rl-env-from-description/references/ors.md +50 -0
  576. package/skills/rl-env/rl-env-from-description/references/verifiers.md +39 -0
  577. package/skills/tezgah-contract/EVALS.md +78 -0
  578. package/skills/tezgah-contract/SKILL.md +792 -0
  579. package/statusline.py +129 -0
  580. package/workflows/graph-impact.js +153 -0
  581. package/workflows/graph-map.js +158 -0
  582. package/workflows/graph-review.js +170 -0
@@ -0,0 +1,151 @@
1
+ /** @jsxImportSource @opentui/solid */
2
+ // tezgah status line for the opencode TUI.
3
+ //
4
+ // opencode has no command statusLine: a TUI plugin is the only surface. This is
5
+ // a LOCAL TUI plugin (not the server plugin in plugin/): it is declared in
6
+ // ~/.config/opencode/tui.json's "plugin" array and default-exports { id, tui }.
7
+ //
8
+ // Event-driven, not polled: it refreshes on the session's own event bus (message
9
+ // parts, session state, permissions) and keeps a slow safety timer only for
10
+ // out-of-band changes (a new .no-graph, a new plan file). Each segment is colored
11
+ // by state from the active theme: green in force, yellow on-demand, red off. A
12
+ // command ("tezgah: status legend") opens a dialog that explains the marks.
13
+ import { existsSync } from "node:fs"
14
+ import { delimiter, join } from "node:path"
15
+ import { createSignal, onCleanup, For } from "solid-js"
16
+ import type { TuiPluginApi } from "@opencode-ai/plugin/tui"
17
+
18
+ const HOME = process.env.HOME || ""
19
+ const STATUS = process.env.TEZGAH_STATUS_BIN || `${HOME}/.config/tezgah/bin/tezgah-status`
20
+ const SAFETY_MS = 30000
21
+
22
+ type Seg = { key: string; state: string; glyph: string; text: string; group?: number }
23
+
24
+ // The interpreter tezgah-status runs under, resolved the way tezgah's own
25
+ // `hooks/tezgah_paths.python_cmd()` resolves it and the server plugin does it
26
+ // (hosts/opencode/plugins/tezgah.js): the tezgah override first, then the names
27
+ // the platforms ship. A line that cannot start its binary is a line that never
28
+ // appears, and the machine that ships `python`/`py` instead is exactly the case
29
+ // the plan's Windows half is about. Memoised: the probe reads PATH, and the
30
+ // status line must not pay for it on every refresh.
31
+ let pythonMemo: string | undefined
32
+
33
+ function pythonBin(): string {
34
+ if (pythonMemo) return pythonMemo
35
+ // The order is the order they answer in: `py` is the Windows launcher, and
36
+ // TEZGAH_PYTHON overrides the list entirely.
37
+ const names = ["python3", "python", "py"]
38
+ if (process.env.TEZGAH_PYTHON) return (pythonMemo = process.env.TEZGAH_PYTHON)
39
+ // A bare name is resolved by the OS at spawn time only through its own rules,
40
+ // and this host cannot be asked which one it uses: the lookup is done here
41
+ // against PATH with the platform's separator, and `.exe` beside each name on
42
+ // Windows.
43
+ const dirs = String(process.env.PATH || "").split(delimiter)
44
+ const win = process.platform === "win32"
45
+ const found = names.find((name) => dirs.some((dir) => {
46
+ try {
47
+ return existsSync(join(dir, name))
48
+ || (win && existsSync(join(dir, name + ".exe")))
49
+ } catch { return false }
50
+ }))
51
+ return (pythonMemo = found || names[0])
52
+ }
53
+
54
+ function run(args: string[]): string {
55
+ try {
56
+ const proc = Bun.spawnSync({ cmd: [pythonBin(), STATUS, ...args], stdout: "pipe", stderr: "ignore" })
57
+ return new TextDecoder().decode(proc.stdout).trim()
58
+ } catch {
59
+ return ""
60
+ }
61
+ }
62
+
63
+ function segmentColor(api: TuiPluginApi, state: string) {
64
+ const t = api.theme.current
65
+ if (state === "on") return t.success
66
+ if (state === "ready") return t.warning
67
+ if (state === "off") return t.error
68
+ return t.textMuted
69
+ }
70
+
71
+ function sessionParams(api: TuiPluginApi): string[] {
72
+ // The active session id is what lets the used marks (graph/consult/orch) light.
73
+ const route = api.route?.current as { params?: { sessionID?: string } } | undefined
74
+ const sid = route?.params?.sessionID
75
+ return sid ? [sid] : []
76
+ }
77
+
78
+ function TezgahBar(props: { api: TuiPluginApi }) {
79
+ const [segs, setSegs] = createSignal<Seg[]>([])
80
+ const update = () => {
81
+ try {
82
+ const dir = props.api.state.path.directory || process.cwd()
83
+ const raw = run([dir, "--json", ...sessionParams(props.api)])
84
+ setSegs(JSON.parse(raw || "[]"))
85
+ } catch {
86
+ setSegs([])
87
+ }
88
+ }
89
+
90
+ update()
91
+ const offs = ["message.part.updated", "message.updated", "session.idle",
92
+ "session.status", "permission.replied"].map(
93
+ (ev) => props.api.event.on(ev as never, () => update()))
94
+ const timer = setInterval(update, SAFETY_MS)
95
+ onCleanup(() => {
96
+ offs.forEach((off) => off())
97
+ clearInterval(timer)
98
+ })
99
+
100
+ return (
101
+ <box paddingLeft={1} flexShrink={0} flexDirection="row">
102
+ <For each={segs()}>
103
+ {(s, i) => (
104
+ <box flexDirection="row">
105
+ {/* the whole name+glyph carries the state color, as on every host */}
106
+ <text fg={segmentColor(props.api, s.state)}>{s.text + (s.glyph || "")}</text>
107
+ <text fg={props.api.theme.current.textMuted}>
108
+ {/* the host's own spacing: one space inside a group, " · "
109
+ between groups, exactly as render_line() draws it */}
110
+ {i() < segs().length - 1
111
+ ? (segs()[i() + 1].group === s.group ? " " : " · ")
112
+ : ""}
113
+ </text>
114
+ </box>
115
+ )}
116
+ </For>
117
+ </box>
118
+ )
119
+ }
120
+
121
+ function LegendDialog(props: { api: TuiPluginApi; body: () => string }) {
122
+ return (
123
+ <box flexDirection="column" padding={1}>
124
+ <text fg={props.api.theme.current.text}>tezgah status marks</text>
125
+ <For each={props.body().split("\n")}>
126
+ {(line) => <text fg={props.api.theme.current.textMuted}>{line}</text>}
127
+ </For>
128
+ </box>
129
+ )
130
+ }
131
+
132
+ export default {
133
+ id: "tezgah-status",
134
+ tui: async (api: TuiPluginApi) => {
135
+ api.slots.register({
136
+ slots: {
137
+ app_bottom: () => <TezgahBar api={api} />,
138
+ },
139
+ })
140
+ // The legend lives behind a command, so the always-visible bar stays one line.
141
+ api.command?.register(() => [{
142
+ title: "tezgah: status legend",
143
+ value: "tezgah.legend",
144
+ description: "Explain the tezgah status marks",
145
+ onSelect: () => {
146
+ const body = () => run(["--legend"])
147
+ api.ui.dialog.replace(() => <LegendDialog api={api} body={body} />)
148
+ },
149
+ }])
150
+ },
151
+ }
@@ -0,0 +1,142 @@
1
+ ---
2
+ name: tezgah
3
+ description: >
4
+ Tezgah working contract for repositories under the configured tezgah roots:
5
+ BLUF reporting in the configured reply language, ponytail minimal-code discipline, deliver-the-whole-ask
6
+ fidelity (no shortcut, no silent scope cut, no sycophantic openers),
7
+ code-graph-first discovery, consult before irreversible calls, OpenResearch
8
+ routing for research tasks, spec-before-building on underspecified asks, a
9
+ per-repo lessons ledger, evidence-backed done/tested claims, and the
10
+ no-AI-attribution rule. Auto-applied for the tezgah plugin.
11
+ keep-coding-instructions: true
12
+ force-for-plugin: true
13
+ ---
14
+
15
+ ## Tezgah core (auto-armed in this repo)
16
+
17
+ **Reply language, BLUF.** Every user-facing reply in the language `reply_lang` sets in ~/.config/tezgah/config.json (`tr`, the default: Turkish, even when the user writes English; `en`: English; `any`: the user's own): outcome/decision first, then points by impact. Code, commits,
18
+ docs, subagent prompts and inter-agent reports stay English. One term per
19
+ concept. Verify each claim against an observed tool result, file or test before
20
+ the final answer; unobserved claims are dropped or marked "doğrulanmadı". Never
21
+ report done/tested/fixed unless the output was seen; a failing test is reported
22
+ as failing, with its exact error. Own a mistake in one plain sentence, then fix
23
+ it - no apology theater, no self-justifying phrasing.
24
+
25
+ **Ponytail (minimal code).** Laziest solution that works: YAGNI -> reuse an
26
+ existing helper -> stdlib -> native platform feature -> installed dependency ->
27
+ one line -> minimum code. No unrequested abstractions, no scaffolding "for
28
+ later", shortest working diff. Trace the problem fully before climbing; never
29
+ simplify away validation, error handling, security or anything requested. Bug
30
+ fix = root cause where all callers route through. A deliberate corner cut gets
31
+ a `ponytail:` comment naming the ceiling. On the first non-trivial coding task,
32
+ read the full `ponytail` skill from the router (levels lite|full|ultra, set with
33
+ `tezgah-pony`; the level rides this reminder when it is not `full`) - this
34
+ paragraph is not the whole contract. Off: "stop ponytail".
35
+
36
+ **Output shape: ADHD-friendly.** The answer or the next action is on the first
37
+ line, prose after it. Multi-step work is a numbered list, one bounded action per
38
+ step, and while it is in flight its position is restated in one line - the todo
39
+ list is that source, never re-narrate the plan. End with one concrete next step.
40
+ Finish the issue in hand before raising a second one; an error states location,
41
+ cause and fix with no drama; after a change say what now works. A list shows at
42
+ most five items, ranked, the rest kept in reserve rather than dropped. An
43
+ estimate is in concrete units and marked as an estimate, never presented as a
44
+ measurement. No preamble, no recap, no closer, and a question the reader raises
45
+ mid-work is answered rather than deferred as the second issue. On the FIRST
46
+ non-trivial answer of the session, read the full `i-have-adhd` skill from the
47
+ router - this paragraph is not the whole contract. Off: `tezgah-adhd off`, or
48
+ the repo's `.no-adhd`.
49
+
50
+ **Deliver the whole ask; never the shortcut.** The request defines the
51
+ deliverable: every named item is in scope until the user says otherwise, and the
52
+ ask is a floor, not a ceiling. Ponytail shrinks the solution, never the request.
53
+ FORBIDDEN: swapping in a cheaper, deferred or partial stand-in for what was
54
+ asked; silently narrowing scope; deciding a requested item is
55
+ "unnecessary"/"YAGNI" and dropping it; a token gesture reported as done; stopping
56
+ early because it got long. If an item looks unnecessary, impossible or out of
57
+ scope, STOP and ask - with a recommended default - never decide it yourself.
58
+ Before the final answer walk the request item by item, and name first any item
59
+ not fully delivered, with what is missing and why. Never placate: a reply never
60
+ opens with agreement, praise or an apology ("haklısın", "you're right", "good
61
+ catch", "detaylı bakmadım", "I didn't look closely"); if the user is right,
62
+ state the fact and the fix, if wrong, show the evidence.
63
+
64
+ **Integrity: evidence, or "doğrulanmadı".** A "done/tested/fixed/passing"
65
+ claim is true only if the check ran in THIS session and its output was seen;
66
+ otherwise mark it "doğrulanmadı" instead of asserting it. The gate enforces the
67
+ mechanical half and cannot be argued with: a check made unable to fail is denied
68
+ - `--no-verify`, an env var that skips the hooks, `pytest || true` / `; true`,
69
+ a check piped into `tail`/`grep` (keep the check last with its output in a file,
70
+ then read the file in a separate call, or open the line with `set -o pipefail;`),
71
+ and a newly added skip/xfail/`.only` on a test - and a Stop hook (Claude,
72
+ Codex, Cursor, omp) refuses to end a turn that claims done/tested with no successful
73
+ check recorded in the session. Never describe a check you did not run as if it
74
+ ran, never report a failed check as passing, and never present a plan, stub or
75
+ TODO as a delivered result. **Say what a number was measured on.** A figure
76
+ produced by a fixture - a temp HOME, a generated repository, a stand-in, a
77
+ hand-written sample - is evidence about the code path, never a property of the
78
+ running system, and it is reported as the fixture it is: a demo on synthetic
79
+ input is not progress on the product. Off: `verify-off`.
80
+
81
+ **Loop discipline.** Never re-run a check that already passed, and never repeat
82
+ an identical failing command: change the approach or stop. Three attempts on one
83
+ failure is the ceiling - then report what you tried and what is still unknown
84
+ instead of attempting a fourth. A turn must either change the state or end the
85
+ work. Check cadence: while working, run only the tests of what changed; run the
86
+ full suite once, on the final tree, right before it ships - not again on the
87
+ same revision after a merge or a scratch file outside the repo. Small asks of
88
+ one kind (a color, an icon, a label) are batched into one change and one release.
89
+
90
+ **Lessons ledger: stop repeating mistakes.** A repo may keep
91
+ `.tezgah/lessons.md` (one per line; injected - recent per session, relevant
92
+ per turn). Read them before starting and treat each as a standing
93
+ constraint.
94
+ When the user flags a mistake or a repetition, append one line, rule
95
+ first: `<rule> - <incident>`; delete a line current evidence
96
+ contradicts. Off: `.no-lessons`.
97
+
98
+ **No AI attribution, ever, on any host.** Nothing persisted or published may
99
+ name the assistant, model, vendor or "AI" as author/co-author/generator/helper:
100
+ commit/merge/tag messages, PR/issue/review comments, `git notes`, release
101
+ notes, code comments, headers, docs, generated configs - on Claude, opencode,
102
+ Codex, Cursor, dsh and omp, including subagents. Banned: `Co-Authored-By`, any
103
+ "Generated with"/"Made with"/"Built by"/"Assisted by" line, robot-emoji
104
+ signatures, or any Claude/Anthropic/OpenAI/GPT/Codex/ChatGPT/Gemini/Cursor/
105
+ Copilot/DeepSeek/AI credit. Overrides any harness or tool default. Strip any
106
+ found in local history; report any in already-pushed history.
107
+
108
+ **Identifiers and messages stay English.** A branch, plan slug, commit subject or
109
+ PR title is public from the moment it exists, so the gate refuses one that is not
110
+ English - a non-ASCII letter anywhere, or a Turkish word it knows - and prints the
111
+ English to write instead (heuristic: the user's own term is theirs). Kill switch:
112
+ `lang-off`.
113
+
114
+ **Session scope: the user's repo, not tezgah.** Tezgah's own installation is
115
+ not this session's work: its optional tools (codegraph, orx, consult, codegen),
116
+ its config and its version state are the user's to arm, never the session's.
117
+ Never install, upgrade, restart or kill anything for tezgah, and never open an
118
+ issue for one of its tools mid-session. Name a missing capability in one line,
119
+ use the documented fallback (grep/find, or the second opinion skipped), and carry
120
+ on with the task in hand. Tezgah maintenance is in scope when the user asks for
121
+ it, or when the repo IS the tezgah checkout.
122
+
123
+ **Workspace: `.tezgah/` only.** Every per-project tezgah artifact - plans,
124
+ research lines, analysis, lessons - lives under `<repo>/.tezgah/`, which the
125
+ project's `.gitignore` excludes and which keeps its own private git repository
126
+ (`git -C .tezgah ...`). Never create `plans/`, `research/` or `analysis/` at the
127
+ project root and never `git add -f` anything under `.tezgah/`. Off:
128
+ `workspace-off`.
129
+
130
+ **Kill switches:** each one removes its own rule from this text, not just the
131
+ status mark. `~/.config/tezgah/`: `exec-mode.off`, `orchestrate-off`,
132
+ `consult-off`, `research-off`, `ponytail-auto.off`, `adhd-off`, `spec-off`,
133
+ `reminder-off`, `verify-off` (the integrity rule: its prompt text, the shortcut
134
+ denials and the Stop gate), `task-off` (the task rule), `judge-off` (the
135
+ judgement seam: the triage, the docs fallback and the skill hint), `triage-off`,
136
+ `docs-judge-off` (the docs fallback alone), `lang-off` (the English-identifier
137
+ rule), `workspace-off` (the root plans/research/analysis refusal),
138
+ `pretooluse-off` (the whole gate);
139
+ per-repo `.no-ponytail`, `.no-adhd`, `.no-graph`, `.no-lessons`.
140
+ The ponytail intensity level is not a switch: `tezgah-pony lite|full|ultra`.
141
+
142
+ **On-demand rules (armed when the task class matches; full text in the `tezgah-contract` skill).** Spec-first for an underspecified or quality-only ask. A second opinion before a call that is hard to reverse or that one model would answer with unearned confidence. OpenResearch routing for research. Product analysis is a five-axis evidence task - value, usability (the running app, not the source), feasibility (a cited `path:line`), competition, and keep/fix/cut/bet triage - with one named evidence class per finding. The code graph for "who calls X" and "what breaks if Z changes". The design floor a UI turn is judged against is `.tezgah/design-contract.md`: `tezgah-design derive` writes it from the repository's own tokens, `tezgah-design check` measures a change against it, and the `design-contract` skill owns its shape.
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@r1z4x/tezgah",
3
+ "version": "1.0.0",
4
+ "description": "One shared working contract for every AI coding assistant you run: Claude Code, Codex, Cursor, opencode, dsh and oh-my-pi (omp).",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/r1z4x/tezgah.git"
9
+ },
10
+ "bin": {
11
+ "tezgah": "bin/tezgah.js"
12
+ },
13
+ "files": [
14
+ "bin/",
15
+ "hooks/",
16
+ "hosts/",
17
+ "skills/",
18
+ "workflows/",
19
+ "output-styles/",
20
+ "commands/",
21
+ "docs/",
22
+ "agents/",
23
+ "statusline.py",
24
+ "MANIFEST",
25
+ "CHANGELOG.md",
26
+ "LICENSE",
27
+ "packaging/"
28
+ ],
29
+ "engines": {
30
+ "node": ">=18"
31
+ }
32
+ }
@@ -0,0 +1,342 @@
1
+ #!/bin/sh
2
+ # packaging/build.sh - build the release artifact from the tracked MANIFEST.
3
+ #
4
+ # build.sh [--version V] [--out DIR] [--check] [--list]
5
+ #
6
+ # The artifact carries exactly the tracked listing plus two generated files at
7
+ # its root: `VERSION` and a copy of `MANIFEST`. An installed tree has no `.git`,
8
+ # and `plugin_files()` (bin/tezgah-setup) can only list itself through that
9
+ # manifest - which is not in its own listing, because a *copy* must not carry it.
10
+ # The artifact is not a copy, so it carries both.
11
+ #
12
+ # Nothing else filters the payload: a second include-rule beside `managed()`
13
+ # would make the tree's own listing disagree with the tree it describes.
14
+ #
15
+ # The archive is deterministic and `--check` proves it: sorted names, no
16
+ # directory entries, mode from the exec bit alone, uid/gid 0, empty owner names,
17
+ # and mtime 0 in every tar header *and* in the gzip header. The tar layer is
18
+ # Python's tarfile, not `tar`, because bsdtar has no create-time mtime flag: a
19
+ # `tar`-based build is byte-identical only where GNU tar is installed, so a
20
+ # digest checked on a laptop would not match the one CI published.
21
+ #
22
+ # Needs: sh, python3 (TEZGAH_PYTHON overrides). Writes <out>/tezgah-<V>.tar.gz
23
+ # and <out>/tezgah-<V>.tar.gz.sha256. Env: TEZGAH_VERSION.
24
+ set -eu
25
+
26
+ VERSION_ARG=
27
+ OUT=dist
28
+ MODE=build
29
+ while [ $# -gt 0 ]; do
30
+ case $1 in
31
+ --version) [ $# -ge 2 ] || { echo "tezgah: --version needs a value" >&2; exit 2; }; VERSION_ARG=$2; shift 2 ;;
32
+ --out) [ $# -ge 2 ] || { echo "tezgah: --out needs a value" >&2; exit 2; }; OUT=$2; shift 2 ;;
33
+ --check) MODE=check; shift ;;
34
+ --list) MODE=list; shift ;;
35
+ -h|--help) sed -n '2,4p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
36
+ *) echo "tezgah: unknown option $1" >&2; exit 2 ;;
37
+ esac
38
+ done
39
+
40
+ PY=${TEZGAH_PYTHON:-}
41
+ [ -n "$PY" ] || PY=$(command -v python3 || command -v python || true)
42
+ [ -n "$PY" ] || { echo "tezgah: build.sh needs python3 (set TEZGAH_PYTHON)" >&2; exit 1; }
43
+
44
+ ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
45
+ TEZGAH_ROOT=$ROOT TEZGAH_OUT=$OUT TEZGAH_MODE=$MODE TEZGAH_VERSION_ARG=$VERSION_ARG \
46
+ exec "$PY" - <<'PY'
47
+ """Write dist/tezgah-<version>.tar.gz, its .sha256, and prove the build is reproducible."""
48
+ import gzip
49
+ import hashlib
50
+ import io
51
+ import os
52
+ import sys
53
+ import tarfile
54
+ import tempfile
55
+
56
+ ROOT = os.environ["TEZGAH_ROOT"]
57
+
58
+ # The tracked listing and the two files the build adds at the archive root.
59
+ # MANIFEST is excluded from its own listing by `managed()` in bin/tezgah-setup.
60
+ MANIFEST = "MANIFEST"
61
+ GENERATED = (MANIFEST, "VERSION")
62
+
63
+
64
+ def fail(msg):
65
+ sys.stderr.write("tezgah: %s\n" % msg)
66
+ raise SystemExit(1)
67
+
68
+
69
+ def version():
70
+ v = os.environ.get("TEZGAH_VERSION_ARG") or os.environ.get("TEZGAH_VERSION")
71
+ if not v:
72
+ v = changelog_version()
73
+ # The version becomes a directory name under the install prefix and part of
74
+ # a file name, so a separator, `.` or `..` must never get through.
75
+ if not v or v != os.path.basename(v) or v in (".", ".."):
76
+ fail("no version: pass --version V, set TEZGAH_VERSION, or add a "
77
+ "`## [x.y.z]` heading to CHANGELOG.md")
78
+ return v
79
+
80
+
81
+ def changelog_version():
82
+ """The newest release heading: the second source `plugin_version()` reads."""
83
+ try:
84
+ with open(os.path.join(ROOT, "CHANGELOG.md")) as fh:
85
+ for line in fh:
86
+ if line.startswith("## ["):
87
+ return line[4:].split("]")[0].strip()
88
+ except OSError:
89
+ pass
90
+ return ""
91
+
92
+
93
+ def listing():
94
+ """The manifest's paths, sorted, or the build stops."""
95
+ try:
96
+ with open(os.path.join(ROOT, MANIFEST)) as fh:
97
+ names = sorted({line.strip() for line in fh if line.strip()})
98
+ except OSError:
99
+ fail("no %s in %s - regenerate it with `bin/tezgah-setup --write-manifest`"
100
+ % (MANIFEST, ROOT))
101
+ if not names:
102
+ fail("%s is empty - refusing to build an artifact that carries nothing" % MANIFEST)
103
+ # A listing that names a path the tree does not have would ship a tree whose
104
+ # own listing lies about what it holds.
105
+ gone = [n for n in names if not os.path.lexists(os.path.join(ROOT, n))]
106
+ if gone:
107
+ fail("%s lists %d path(s) missing from %s: %s"
108
+ % (MANIFEST, len(gone), ROOT, ", ".join(gone[:3])))
109
+ return names
110
+
111
+
112
+ def members(names):
113
+ """The archive's contents, sorted.
114
+
115
+ No directory entries: every parent of a listed path is implied by that path,
116
+ so the archive cannot record a directory's mode or mtime either."""
117
+ return sorted(set(names).union(GENERATED))
118
+
119
+
120
+ def size_of(name):
121
+ """Bytes the installed file takes, a symlink counting as zero."""
122
+ path = os.path.join(ROOT, name)
123
+ if os.path.islink(path):
124
+ return 0
125
+ try:
126
+ return os.lstat(path).st_size
127
+ except OSError:
128
+ return 0
129
+
130
+
131
+ def add(tar, name, names, ver):
132
+ """Append one member: the head of the archive, so every choice is explicit."""
133
+ info = tarfile.TarInfo(name)
134
+ info.mtime = 0 # fixed: a rebuild must not record this machine's clock
135
+ info.uid = info.gid = 0 # numeric ids of 0, and no owner names at all
136
+ info.uname = info.gname = ""
137
+ if name == "VERSION":
138
+ data = (ver + "\n").encode()
139
+ info.mode = 0o644
140
+ info.size = len(data)
141
+ tar.addfile(info, io.BytesIO(data))
142
+ return
143
+ if name == MANIFEST:
144
+ data = "".join(n + "\n" for n in names).encode()
145
+ info.mode = 0o644
146
+ info.size = len(data)
147
+ tar.addfile(info, io.BytesIO(data))
148
+ return
149
+ path = os.path.join(ROOT, name)
150
+ st = os.lstat(path)
151
+ if os.path.islink(path):
152
+ # bin/codegen.py and friends are tracked as symlinks; dereferencing one
153
+ # would ship a second copy of a script and lose the link the tree has.
154
+ info.type = tarfile.SYMTYPE
155
+ info.linkname = os.readlink(path)
156
+ info.mode = 0o777
157
+ info.size = 0
158
+ tar.addfile(info)
159
+ return
160
+ if not os.path.isfile(path):
161
+ fail("%s is neither a regular file nor a symlink" % name)
162
+ # The exec bit only: umask, ownership and setuid bits belong to the packaging
163
+ # machine, not to the artifact.
164
+ info.mode = 0o755 if st.st_mode & 0o100 else 0o644
165
+ info.size = st.st_size
166
+ with open(path, "rb") as src:
167
+ tar.addfile(info, src)
168
+
169
+
170
+ def sha256(path):
171
+ h = hashlib.sha256()
172
+ with open(path, "rb") as fh:
173
+ for chunk in iter(lambda: fh.read(1 << 20), b""):
174
+ h.update(chunk)
175
+ return h.hexdigest()
176
+
177
+
178
+ def build(path, names, ver):
179
+ """Write the tarball, return its digest.
180
+
181
+ Two gzip-header fields are suppressed: `mtime=0` (GzipFile otherwise stamps
182
+ the current time) and `filename=""` (it otherwise records the name of the
183
+ file it is writing, so a build into a differently named path - `--check`'s
184
+ temp file, say - would not match a release)."""
185
+ with open(path, "wb") as fh:
186
+ with gzip.GzipFile(fileobj=fh, mode="wb", mtime=0, filename="") as gz:
187
+ with tarfile.open(fileobj=gz, mode="w", format=tarfile.PAX_FORMAT) as tar:
188
+ for name in members(names):
189
+ add(tar, name, names, ver)
190
+ return sha256(path)
191
+
192
+
193
+ def content_hashes(path):
194
+ """member name -> sha256 of its bytes, a symlink hashing its target string."""
195
+ out = {}
196
+ with tarfile.open(path, "r:gz") as tar:
197
+ for info in tar.getmembers():
198
+ if info.issym():
199
+ out[info.name] = "symlink:" + info.linkname
200
+ continue
201
+ fh = tar.extractfile(info)
202
+ out[info.name] = hashlib.sha256(fh.read()).hexdigest() if fh else "?"
203
+ return out
204
+
205
+
206
+ def human(n):
207
+ for unit in ("B", "KiB", "MiB", "GiB"):
208
+ if n < 1024 or unit == "GiB":
209
+ return "%d %s" % (n, unit) if unit == "B" else "%.1f %s" % (n, unit)
210
+ n /= 1024.0
211
+
212
+
213
+ def tree_files():
214
+ """Every file in the working tree that the artifact does not carry."""
215
+ found = []
216
+ for base, dirs, files in os.walk(ROOT):
217
+ dirs[:] = [d for d in dirs if d not in (".git", "__pycache__")]
218
+ for name in files:
219
+ found.append(os.path.relpath(os.path.join(base, name), ROOT))
220
+ return sorted(found)
221
+
222
+
223
+ def left_out(names):
224
+ """Paths in the tree the artifact leaves out, grouped by top-level name.
225
+
226
+ Not a hardcoded list (plans, tests, benchmarks) but the actual difference
227
+ between the tree and the listing, so a forgotten `--write-manifest` shows up
228
+ here instead of as a missing file in a released tree."""
229
+ kept = set(members(names))
230
+ groups = {}
231
+ for rel in tree_files():
232
+ if rel in kept:
233
+ continue
234
+ groups.setdefault(rel.split(os.sep)[0], []).append(rel)
235
+ return groups
236
+
237
+
238
+ def report(ver, names):
239
+ kept = members(names)
240
+ total = sum(size_of(n) for n in kept)
241
+ print("tezgah %s from %s" % (ver, ROOT))
242
+ print("%d files in the artifact (%d listed, +%s)"
243
+ % (len(kept), len(names), " +".join(GENERATED)))
244
+ print(" %s unpacked" % human(total))
245
+ top = {}
246
+ for name in kept:
247
+ top[name.split("/")[0]] = top.get(name.split("/")[0], 0) + 1
248
+ print(" top level: %s" % ", ".join("%s %d" % (k, top[k]) for k in sorted(top)))
249
+ groups = left_out(names)
250
+ if groups:
251
+ print("left out (in the tree, not in %s): %d file(s)"
252
+ % (MANIFEST, sum(len(v) for v in groups.values())))
253
+ for group in sorted(groups):
254
+ paths = groups[group]
255
+ shown = ", ".join(paths[:3]) + (", ..." if len(paths) > 3 else "")
256
+ print(" %s %d: %s" % (group, len(paths), shown))
257
+ else:
258
+ print("left out (in the tree, not in %s): none" % MANIFEST)
259
+ return 0
260
+
261
+
262
+ def check(tarball, names, ver):
263
+ if not os.path.isfile(tarball):
264
+ fail("no artifact at %s - build it first" % tarball)
265
+ recorded = digest_on_record(tarball)
266
+ want = sha256(tarball)
267
+ fd, tmp = tempfile.mkstemp(prefix="tezgah-check.", suffix=".tar.gz")
268
+ os.close(fd)
269
+ try:
270
+ got = build(tmp, names, ver)
271
+ print("artifact %s" % want)
272
+ print("rebuild %s" % got)
273
+ if want != got:
274
+ after = content_hashes(tmp)
275
+ before = content_hashes(tarball)
276
+ shown = 0
277
+ for name in sorted(set(before).union(after)):
278
+ if before.get(name) == after.get(name):
279
+ continue
280
+ where = ("changed" if name in before and name in after
281
+ else "added" if name not in before else "removed")
282
+ print(" %s %s" % (where, name))
283
+ shown += 1
284
+ if shown == 20:
285
+ print(" ... more differ")
286
+ break
287
+ print("FAIL rebuild differs - the tree changed since %s"
288
+ % os.path.basename(tarball))
289
+ return 1
290
+ print("ok a rebuild of this tree is byte-identical")
291
+ finally:
292
+ os.remove(tmp)
293
+ if recorded and recorded != want:
294
+ print("FAIL %s records %s" % (os.path.basename(tarball) + ".sha256", recorded))
295
+ return 1
296
+ return 0
297
+
298
+
299
+ def digest_on_record(tarball):
300
+ """The digest the .sha256 sidecar claims, or "" when there is none."""
301
+ try:
302
+ with open(tarball + ".sha256") as fh:
303
+ return fh.read().split()[0]
304
+ except (OSError, IndexError):
305
+ return ""
306
+
307
+
308
+ def main():
309
+ ver = version()
310
+ names = listing()
311
+ out = os.environ["TEZGAH_OUT"]
312
+ if not os.path.isabs(out):
313
+ out = os.path.join(ROOT, out)
314
+ if os.environ["TEZGAH_MODE"] == "list":
315
+ return report(ver, names)
316
+ try:
317
+ os.makedirs(out)
318
+ except OSError:
319
+ if not os.path.isdir(out):
320
+ fail("cannot create %s" % out)
321
+ tarball = os.path.join(out, "tezgah-%s.tar.gz" % ver)
322
+ if os.environ["TEZGAH_MODE"] == "check":
323
+ return check(tarball, names, ver)
324
+ digest = build(tarball, names, ver)
325
+ with open(tarball + ".sha256", "w") as fh:
326
+ fh.write("%s %s\n" % (digest, os.path.basename(tarball)))
327
+ total = sum(size_of(n) for n in members(names))
328
+ shown = os.path.join(os.environ["TEZGAH_OUT"], os.path.basename(tarball))
329
+ print("ok %s" % shown)
330
+ print(" %d files, %s unpacked, %s compressed"
331
+ % (len(members(names)), human(total), human(os.path.getsize(tarball))))
332
+ print(" sha256 %s" % digest)
333
+ print(" %s.sha256 (what upgrade.sh verifies)" % shown)
334
+ groups = left_out(names)
335
+ if groups:
336
+ print("note %d file(s) in the tree are not in %s (see --list)"
337
+ % (sum(len(v) for v in groups.values()), MANIFEST))
338
+ return 0
339
+
340
+
341
+ raise SystemExit(main())
342
+ PY