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