@r1z4x/tezgah 1.9.2 → 1.13.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 (445) hide show
  1. package/CHANGELOG.md +415 -1
  2. package/MANIFEST +404 -144
  3. package/README.de.md +1 -1
  4. package/README.es.md +1 -1
  5. package/README.fr.md +1 -1
  6. package/README.md +5 -4
  7. package/README.tr.md +1 -1
  8. package/bin/codegen +5 -2
  9. package/bin/tezgah-design +288 -1
  10. package/bin/tezgah-docs +1 -1
  11. package/bin/tezgah-doctor +39 -2
  12. package/bin/tezgah-import-ai-research +26 -12
  13. package/bin/tezgah-ocr-review +296 -0
  14. package/bin/tezgah-research +255 -44
  15. package/bin/tezgah-review-quote +185 -0
  16. package/bin/tezgah-setup +1365 -55
  17. package/bin/tezgah-skill +1 -1
  18. package/bin/tezgah-status +201 -3
  19. package/bin/tezgah-task +258 -20
  20. package/commands/adhd.md +2 -2
  21. package/commands/ponytail.md +4 -4
  22. package/docs/architecture.md +2 -2
  23. package/docs/citations-baseline.json +3 -3
  24. package/docs/clarity-baseline.json +11 -5
  25. package/docs/contract.md +91 -43
  26. package/docs/environment.md +5 -2
  27. package/docs/evidence.md +109 -17
  28. package/docs/feature-audit.md +2 -2
  29. package/docs/gate.md +60 -33
  30. package/docs/glossary.md +6 -3
  31. package/docs/hosts.md +313 -17
  32. package/docs/index.json +34 -8
  33. package/docs/judge.md +4 -2
  34. package/docs/layers.md +4 -4
  35. package/docs/models.md +37 -9
  36. package/docs/operations.md +141 -5
  37. package/docs/research.md +815 -8
  38. package/docs/skills.md +137 -13
  39. package/docs/status-line.md +121 -1
  40. package/docs/testing.md +3 -1
  41. package/hooks/hooks.json +2 -2
  42. package/hooks/lang/en.json +21 -0
  43. package/hooks/lang/tr.json +22 -1
  44. package/hooks/projects-stop.py +2 -1
  45. package/hooks/tezgah_agents.py +65 -25
  46. package/hooks/tezgah_apps.py +18 -0
  47. package/hooks/tezgah_attest.py +79 -10
  48. package/hooks/tezgah_components.py +4 -0
  49. package/hooks/tezgah_context.py +207 -55
  50. package/hooks/tezgah_extension.py +337 -0
  51. package/hooks/tezgah_gate.py +267 -79
  52. package/hooks/tezgah_integrity.py +864 -143
  53. package/hooks/tezgah_judge.py +6 -4
  54. package/hooks/tezgah_models.py +59 -19
  55. package/hooks/tezgah_orca.py +1 -1
  56. package/hooks/tezgah_paths.py +145 -8
  57. package/hooks/tezgah_policy.py +128 -57
  58. package/hooks/tezgah_rank.py +9 -6
  59. package/hooks/tezgah_replay.py +12 -6
  60. package/hooks/tezgah_research.py +1414 -76
  61. package/hooks/tezgah_research_capture.py +1544 -0
  62. package/hooks/tezgah_research_evidence.py +842 -0
  63. package/hooks/tezgah_research_stats.py +258 -0
  64. package/hooks/tezgah_skill_pick.py +408 -106
  65. package/hooks/tezgah_stack.py +236 -1
  66. package/hooks/tezgah_stopspec.py +8 -1
  67. package/hooks/tezgah_task.py +14 -5
  68. package/hooks/tezgah_taste_ledger.py +1 -1
  69. package/hosts/amp/hook.py +217 -0
  70. package/hosts/amp/tezgah-plugin.ts.in +386 -0
  71. package/hosts/antigravity/hook.py +255 -0
  72. package/hosts/codex/hook.py +2 -1
  73. package/hosts/commandcode/hook.py +239 -0
  74. package/hosts/copilot/hook.py +284 -0
  75. package/hosts/cursor/hook.py +31 -3
  76. package/hosts/droid/hook.py +259 -0
  77. package/hosts/dsh/hooks.json +1 -1
  78. package/hosts/gemini/hook.py +213 -0
  79. package/hosts/goose/hook.py +145 -0
  80. package/hosts/omp/hook.py +4 -1
  81. package/hosts/omp/tezgah-hook.ts.in +30 -7
  82. package/hosts/opencode/plugins/tezgah.js +309 -48
  83. package/hosts/opencode/tui/cli/tui.tsx +100 -0
  84. package/hosts/opencode/tui/tezgah-tui.tsx +2 -1
  85. package/hosts/qwen/hook.py +206 -0
  86. package/output-styles/tezgah.md +20 -15
  87. package/package.json +1 -1
  88. package/skills/ai-research/SKILL.md +21 -14
  89. package/skills/ai-research/SOURCE +7 -5
  90. package/skills/ai-research/index/1-frame.md +6 -6
  91. package/skills/ai-research/index/2-data.md +9 -9
  92. package/skills/ai-research/index/3-train.md +36 -36
  93. package/skills/ai-research/index/4-measure.md +13 -13
  94. package/skills/ai-research/index/5-run.md +11 -11
  95. package/skills/ai-research/index/6-write.md +23 -23
  96. package/skills/ai-research/library.json +104 -104
  97. package/skills/analyze-app/SKILL.md +17 -12
  98. package/skills/design-contract/SKILL.md +42 -7
  99. package/skills/design-contract/data-views.md +2 -2
  100. package/skills/design-library/EVALS.md +1 -1
  101. package/skills/design-library/INDEX.md +39 -39
  102. package/skills/design-library/SKILL.md +19 -13
  103. package/skills/design-library/SOURCE +45 -43
  104. package/skills/feature-audit/SKILL.md +20 -14
  105. package/skills/hallmark/LICENSE +21 -0
  106. package/skills/hallmark/SKILL.md +154 -0
  107. package/skills/hallmark/SOURCE +207 -0
  108. package/skills/hallmark/agents/openai.yaml +13 -0
  109. package/skills/hallmark/references/anatomy.md +71 -0
  110. package/skills/hallmark/references/brand-truth.md +40 -0
  111. package/skills/hallmark/references/comp.md +104 -0
  112. package/skills/hallmark/references/craft.md +116 -0
  113. package/skills/hallmark/references/dark-mode.md +49 -0
  114. package/skills/hallmark/references/data-viz.md +48 -0
  115. package/skills/hallmark/references/design-md.md +53 -0
  116. package/skills/hallmark/references/direction.md +52 -0
  117. package/skills/hallmark/references/export-formats.md +80 -0
  118. package/skills/hallmark/references/flow.md +131 -0
  119. package/skills/hallmark/references/fonts.md +58 -0
  120. package/skills/hallmark/references/gates.md +243 -0
  121. package/skills/hallmark/references/genres/atmospheric.md +24 -0
  122. package/skills/hallmark/references/genres/editorial.md +24 -0
  123. package/skills/hallmark/references/genres/modern-minimal.md +24 -0
  124. package/skills/hallmark/references/genres/playful.md +24 -0
  125. package/skills/hallmark/references/imagery.md +99 -0
  126. package/skills/hallmark/references/interaction-and-states.md +89 -0
  127. package/skills/hallmark/references/layout.md +104 -0
  128. package/skills/hallmark/references/macrostructures/01-bento-grid.md +21 -0
  129. package/skills/hallmark/references/macrostructures/02-long-document.md +35 -0
  130. package/skills/hallmark/references/macrostructures/03-marquee-hero.md +21 -0
  131. package/skills/hallmark/references/macrostructures/04-stat-led.md +21 -0
  132. package/skills/hallmark/references/macrostructures/05-workbench.md +21 -0
  133. package/skills/hallmark/references/macrostructures/06-conversational-faq.md +28 -0
  134. package/skills/hallmark/references/macrostructures/07-manifesto.md +28 -0
  135. package/skills/hallmark/references/macrostructures/08-photographic.md +21 -0
  136. package/skills/hallmark/references/macrostructures/09-quote-led.md +21 -0
  137. package/skills/hallmark/references/macrostructures/10-specimen.md +21 -0
  138. package/skills/hallmark/references/macrostructures/11-catalogue.md +21 -0
  139. package/skills/hallmark/references/macrostructures/12-letter.md +21 -0
  140. package/skills/hallmark/references/macrostructures/13-index-first.md +21 -0
  141. package/skills/hallmark/references/macrostructures/14-narrative-workflow.md +21 -0
  142. package/skills/hallmark/references/macrostructures/15-split-studio.md +21 -0
  143. package/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -0
  144. package/skills/hallmark/references/macrostructures/17-type-specimen.md +19 -0
  145. package/skills/hallmark/references/macrostructures/18-portfolio-grid.md +21 -0
  146. package/skills/hallmark/references/macrostructures/19-map-diagram.md +21 -0
  147. package/skills/hallmark/references/macrostructures/20-ecosystem-index.md +19 -0
  148. package/skills/hallmark/references/macrostructures/21-component-playground.md +21 -0
  149. package/skills/hallmark/references/macrostructures.md +119 -0
  150. package/skills/hallmark/references/microinteractions.md +80 -0
  151. package/skills/hallmark/references/patterns.md +202 -0
  152. package/skills/hallmark/references/redesign.md +88 -0
  153. package/skills/hallmark/references/responsive.md +46 -0
  154. package/skills/hallmark/references/review-finish.md +19 -0
  155. package/skills/hallmark/references/review-hero.md +20 -0
  156. package/skills/hallmark/references/scroll-choreography.md +110 -0
  157. package/skills/hallmark/references/texture.md +90 -0
  158. package/skills/hallmark/references/themes/README.md +58 -0
  159. package/skills/hallmark/references/themes/almanac.jpg +0 -0
  160. package/skills/hallmark/references/themes/almanac.md +103 -0
  161. package/skills/hallmark/references/themes/arcade.jpg +0 -0
  162. package/skills/hallmark/references/themes/arcade.md +102 -0
  163. package/skills/hallmark/references/themes/atelier.jpg +0 -0
  164. package/skills/hallmark/references/themes/atelier.md +98 -0
  165. package/skills/hallmark/references/themes/bloom.jpg +0 -0
  166. package/skills/hallmark/references/themes/bloom.md +102 -0
  167. package/skills/hallmark/references/themes/blueprint.jpg +0 -0
  168. package/skills/hallmark/references/themes/blueprint.md +103 -0
  169. package/skills/hallmark/references/themes/broadside.jpg +0 -0
  170. package/skills/hallmark/references/themes/broadside.md +108 -0
  171. package/skills/hallmark/references/themes/brutal.jpg +0 -0
  172. package/skills/hallmark/references/themes/brutal.md +95 -0
  173. package/skills/hallmark/references/themes/carnival.jpg +0 -0
  174. package/skills/hallmark/references/themes/carnival.md +104 -0
  175. package/skills/hallmark/references/themes/cobalt.jpg +0 -0
  176. package/skills/hallmark/references/themes/cobalt.md +101 -0
  177. package/skills/hallmark/references/themes/console.jpg +0 -0
  178. package/skills/hallmark/references/themes/console.md +99 -0
  179. package/skills/hallmark/references/themes/coral.jpg +0 -0
  180. package/skills/hallmark/references/themes/coral.md +102 -0
  181. package/skills/hallmark/references/themes/darkroom.jpg +0 -0
  182. package/skills/hallmark/references/themes/darkroom.md +99 -0
  183. package/skills/hallmark/references/themes/dose.jpg +0 -0
  184. package/skills/hallmark/references/themes/dose.md +98 -0
  185. package/skills/hallmark/references/themes/dusk.jpg +0 -0
  186. package/skills/hallmark/references/themes/dusk.md +105 -0
  187. package/skills/hallmark/references/themes/editorial.jpg +0 -0
  188. package/skills/hallmark/references/themes/editorial.md +97 -0
  189. package/skills/hallmark/references/themes/formwork.jpg +0 -0
  190. package/skills/hallmark/references/themes/formwork.md +107 -0
  191. package/skills/hallmark/references/themes/furrow.jpg +0 -0
  192. package/skills/hallmark/references/themes/furrow.md +98 -0
  193. package/skills/hallmark/references/themes/garden.jpg +0 -0
  194. package/skills/hallmark/references/themes/garden.md +97 -0
  195. package/skills/hallmark/references/themes/grid.jpg +0 -0
  196. package/skills/hallmark/references/themes/grid.md +101 -0
  197. package/skills/hallmark/references/themes/halftone.jpg +0 -0
  198. package/skills/hallmark/references/themes/halftone.md +106 -0
  199. package/skills/hallmark/references/themes/hedgerow.jpg +0 -0
  200. package/skills/hallmark/references/themes/hedgerow.md +104 -0
  201. package/skills/hallmark/references/themes/hum.jpg +0 -0
  202. package/skills/hallmark/references/themes/hum.md +99 -0
  203. package/skills/hallmark/references/themes/index.json +2191 -0
  204. package/skills/hallmark/references/themes/ink.jpg +0 -0
  205. package/skills/hallmark/references/themes/ink.md +106 -0
  206. package/skills/hallmark/references/themes/kiln.jpg +0 -0
  207. package/skills/hallmark/references/themes/kiln.md +108 -0
  208. package/skills/hallmark/references/themes/loom.jpg +0 -0
  209. package/skills/hallmark/references/themes/loom.md +106 -0
  210. package/skills/hallmark/references/themes/lumen.jpg +0 -0
  211. package/skills/hallmark/references/themes/lumen.md +103 -0
  212. package/skills/hallmark/references/themes/manifesto.jpg +0 -0
  213. package/skills/hallmark/references/themes/manifesto.md +101 -0
  214. package/skills/hallmark/references/themes/midnight.jpg +0 -0
  215. package/skills/hallmark/references/themes/midnight.md +97 -0
  216. package/skills/hallmark/references/themes/newsprint.jpg +0 -0
  217. package/skills/hallmark/references/themes/newsprint.md +102 -0
  218. package/skills/hallmark/references/themes/overprint.jpg +0 -0
  219. package/skills/hallmark/references/themes/overprint.md +101 -0
  220. package/skills/hallmark/references/themes/pasteup.jpg +0 -0
  221. package/skills/hallmark/references/themes/pasteup.md +100 -0
  222. package/skills/hallmark/references/themes/piste.jpg +0 -0
  223. package/skills/hallmark/references/themes/piste.md +99 -0
  224. package/skills/hallmark/references/themes/ribbon.jpg +0 -0
  225. package/skills/hallmark/references/themes/ribbon.md +106 -0
  226. package/skills/hallmark/references/themes/rim.jpg +0 -0
  227. package/skills/hallmark/references/themes/rim.md +96 -0
  228. package/skills/hallmark/references/themes/riso.jpg +0 -0
  229. package/skills/hallmark/references/themes/riso.md +98 -0
  230. package/skills/hallmark/references/themes/solstice.jpg +0 -0
  231. package/skills/hallmark/references/themes/solstice.md +104 -0
  232. package/skills/hallmark/references/themes/specimen.jpg +0 -0
  233. package/skills/hallmark/references/themes/specimen.md +100 -0
  234. package/skills/hallmark/references/themes/spore.jpg +0 -0
  235. package/skills/hallmark/references/themes/spore.md +104 -0
  236. package/skills/hallmark/references/themes/sport.jpg +0 -0
  237. package/skills/hallmark/references/themes/sport.md +101 -0
  238. package/skills/hallmark/references/themes/squeeze.jpg +0 -0
  239. package/skills/hallmark/references/themes/squeeze.md +99 -0
  240. package/skills/hallmark/references/themes/sticker.jpg +0 -0
  241. package/skills/hallmark/references/themes/sticker.md +106 -0
  242. package/skills/hallmark/references/themes/studio.jpg +0 -0
  243. package/skills/hallmark/references/themes/studio.md +99 -0
  244. package/skills/hallmark/references/themes/terminal.jpg +0 -0
  245. package/skills/hallmark/references/themes/terminal.md +96 -0
  246. package/skills/hallmark/references/themes/terrazzo.jpg +0 -0
  247. package/skills/hallmark/references/themes/terrazzo.md +106 -0
  248. package/skills/hallmark/references/themes/ultraviolet.jpg +0 -0
  249. package/skills/hallmark/references/themes/ultraviolet.md +106 -0
  250. package/skills/hallmark/references/themes/vellum.jpg +0 -0
  251. package/skills/hallmark/references/themes/vellum.md +105 -0
  252. package/skills/hallmark/references/themes/wayfind.jpg +0 -0
  253. package/skills/hallmark/references/themes/wayfind.md +105 -0
  254. package/skills/hallmark/references/themes/werkstatt.jpg +0 -0
  255. package/skills/hallmark/references/themes/werkstatt.md +105 -0
  256. package/skills/hallmark/scripts/capture.mjs +125 -0
  257. package/skills/hallmark/scripts/fixtures/exemplars/atmospheric.html +324 -0
  258. package/skills/hallmark/scripts/fixtures/exemplars/editorial.html +363 -0
  259. package/skills/hallmark/scripts/fixtures/exemplars/modern-minimal.html +527 -0
  260. package/skills/hallmark/scripts/fixtures/exemplars/playful.html +353 -0
  261. package/skills/hallmark/scripts/fixtures/eyebrow-fail/index.html +118 -0
  262. package/skills/hallmark/scripts/fixtures/eyebrow-pass/index.html +137 -0
  263. package/skills/hallmark/scripts/fixtures/kept/after.html +27 -0
  264. package/skills/hallmark/scripts/fixtures/kept/before.html +26 -0
  265. package/skills/hallmark/scripts/fixtures/slopped.html +145 -0
  266. package/skills/hallmark/scripts/fixtures/tailwind-fail/Feature.vue +14 -0
  267. package/skills/hallmark/scripts/fixtures/tailwind-fail/Hero.tsx +33 -0
  268. package/skills/hallmark/scripts/fixtures/tailwind-fail/index.html +74 -0
  269. package/skills/hallmark/scripts/fixtures/tailwind-fail/style.css +6 -0
  270. package/skills/hallmark/scripts/fixtures/tailwind-pass/Hero.tsx +33 -0
  271. package/skills/hallmark/scripts/fixtures/tailwind-pass/index.html +57 -0
  272. package/skills/hallmark/scripts/fixtures/tailwind-pass/style.css +15 -0
  273. package/skills/hallmark/scripts/fixtures/waiver/index.html +54 -0
  274. package/skills/hallmark/scripts/imagegen.mjs +85 -0
  275. package/skills/hallmark/scripts/install-hook.mjs +70 -0
  276. package/skills/hallmark/scripts/install.mjs +141 -0
  277. package/skills/hallmark/scripts/lint-hook.mjs +49 -0
  278. package/skills/hallmark/scripts/photos.json +1 -0
  279. package/skills/hallmark/scripts/picture.mjs +71 -0
  280. package/skills/hallmark/scripts/refcheck.mjs +352 -0
  281. package/skills/hallmark/scripts/sloplint-render.mjs +1252 -0
  282. package/skills/hallmark/scripts/sloplint.mjs +4422 -0
  283. package/skills/hallmark/scripts/theme.mjs +650 -0
  284. package/skills/harness/SKILL.md +17 -8
  285. package/skills/i-have-adhd/SKILL.md +32 -12
  286. package/skills/no-ai-slop/SKILL.md +15 -1
  287. package/skills/plan-add/SKILL.md +38 -27
  288. package/skills/plan-status/SKILL.md +13 -7
  289. package/skills/plan-sync/SKILL.md +18 -12
  290. package/skills/pm-frameworks/SKILL.md +19 -10
  291. package/skills/pm-frameworks/SOURCE +7 -5
  292. package/skills/ponytail/SKILL.md +19 -14
  293. package/skills/product-analysis/SKILL.md +22 -18
  294. package/skills/product-flow/SKILL.md +14 -9
  295. package/skills/research/SKILL.md +97 -48
  296. package/skills/rl-env/SKILL.md +25 -13
  297. package/skills/rl-env/SOURCE +8 -6
  298. package/skills/tezgah-contract/SKILL.md +65 -47
  299. package/statusline.py +20 -9
  300. package/workflows/graph-review.js +14 -2
  301. package/bin/tezgah-skill.py +0 -59
  302. /package/skills/ai-research/0-autoresearch-skill/{SKILL.md → ENTRY.md} +0 -0
  303. /package/skills/ai-research/01-model-architecture/litgpt/{SKILL.md → ENTRY.md} +0 -0
  304. /package/skills/ai-research/01-model-architecture/mamba/{SKILL.md → ENTRY.md} +0 -0
  305. /package/skills/ai-research/01-model-architecture/nanogpt/{SKILL.md → ENTRY.md} +0 -0
  306. /package/skills/ai-research/01-model-architecture/rwkv/{SKILL.md → ENTRY.md} +0 -0
  307. /package/skills/ai-research/01-model-architecture/torchtitan/{SKILL.md → ENTRY.md} +0 -0
  308. /package/skills/ai-research/02-tokenization/huggingface-tokenizers/{SKILL.md → ENTRY.md} +0 -0
  309. /package/skills/ai-research/02-tokenization/sentencepiece/{SKILL.md → ENTRY.md} +0 -0
  310. /package/skills/ai-research/03-fine-tuning/axolotl/{SKILL.md → ENTRY.md} +0 -0
  311. /package/skills/ai-research/03-fine-tuning/llama-factory/{SKILL.md → ENTRY.md} +0 -0
  312. /package/skills/ai-research/03-fine-tuning/peft/{SKILL.md → ENTRY.md} +0 -0
  313. /package/skills/ai-research/03-fine-tuning/unsloth/{SKILL.md → ENTRY.md} +0 -0
  314. /package/skills/ai-research/04-mechanistic-interpretability/nnsight/{SKILL.md → ENTRY.md} +0 -0
  315. /package/skills/ai-research/04-mechanistic-interpretability/pyvene/{SKILL.md → ENTRY.md} +0 -0
  316. /package/skills/ai-research/04-mechanistic-interpretability/saelens/{SKILL.md → ENTRY.md} +0 -0
  317. /package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/{SKILL.md → ENTRY.md} +0 -0
  318. /package/skills/ai-research/05-data-processing/nemo-curator/{SKILL.md → ENTRY.md} +0 -0
  319. /package/skills/ai-research/05-data-processing/ray-data/{SKILL.md → ENTRY.md} +0 -0
  320. /package/skills/ai-research/06-post-training/grpo-rl-training/{SKILL.md → ENTRY.md} +0 -0
  321. /package/skills/ai-research/06-post-training/miles/{SKILL.md → ENTRY.md} +0 -0
  322. /package/skills/ai-research/06-post-training/openrlhf/{SKILL.md → ENTRY.md} +0 -0
  323. /package/skills/ai-research/06-post-training/simpo/{SKILL.md → ENTRY.md} +0 -0
  324. /package/skills/ai-research/06-post-training/slime/{SKILL.md → ENTRY.md} +0 -0
  325. /package/skills/ai-research/06-post-training/torchforge/{SKILL.md → ENTRY.md} +0 -0
  326. /package/skills/ai-research/06-post-training/trl-fine-tuning/{SKILL.md → ENTRY.md} +0 -0
  327. /package/skills/ai-research/06-post-training/verl/{SKILL.md → ENTRY.md} +0 -0
  328. /package/skills/ai-research/07-safety-alignment/constitutional-ai/{SKILL.md → ENTRY.md} +0 -0
  329. /package/skills/ai-research/07-safety-alignment/llamaguard/{SKILL.md → ENTRY.md} +0 -0
  330. /package/skills/ai-research/07-safety-alignment/nemo-guardrails/{SKILL.md → ENTRY.md} +0 -0
  331. /package/skills/ai-research/07-safety-alignment/prompt-guard/{SKILL.md → ENTRY.md} +0 -0
  332. /package/skills/ai-research/08-distributed-training/accelerate/{SKILL.md → ENTRY.md} +0 -0
  333. /package/skills/ai-research/08-distributed-training/deepspeed/{SKILL.md → ENTRY.md} +0 -0
  334. /package/skills/ai-research/08-distributed-training/megatron-core/{SKILL.md → ENTRY.md} +0 -0
  335. /package/skills/ai-research/08-distributed-training/pytorch-fsdp2/{SKILL.md → ENTRY.md} +0 -0
  336. /package/skills/ai-research/08-distributed-training/pytorch-lightning/{SKILL.md → ENTRY.md} +0 -0
  337. /package/skills/ai-research/08-distributed-training/ray-train/{SKILL.md → ENTRY.md} +0 -0
  338. /package/skills/ai-research/09-infrastructure/lambda-labs/{SKILL.md → ENTRY.md} +0 -0
  339. /package/skills/ai-research/09-infrastructure/modal/{SKILL.md → ENTRY.md} +0 -0
  340. /package/skills/ai-research/09-infrastructure/skypilot/{SKILL.md → ENTRY.md} +0 -0
  341. /package/skills/ai-research/10-optimization/awq/{SKILL.md → ENTRY.md} +0 -0
  342. /package/skills/ai-research/10-optimization/bitsandbytes/{SKILL.md → ENTRY.md} +0 -0
  343. /package/skills/ai-research/10-optimization/flash-attention/{SKILL.md → ENTRY.md} +0 -0
  344. /package/skills/ai-research/10-optimization/gguf/{SKILL.md → ENTRY.md} +0 -0
  345. /package/skills/ai-research/10-optimization/gptq/{SKILL.md → ENTRY.md} +0 -0
  346. /package/skills/ai-research/10-optimization/hqq/{SKILL.md → ENTRY.md} +0 -0
  347. /package/skills/ai-research/10-optimization/ml-training-recipes/{SKILL.md → ENTRY.md} +0 -0
  348. /package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/{SKILL.md → ENTRY.md} +0 -0
  349. /package/skills/ai-research/11-evaluation/lm-evaluation-harness/{SKILL.md → ENTRY.md} +0 -0
  350. /package/skills/ai-research/11-evaluation/nemo-evaluator/{SKILL.md → ENTRY.md} +0 -0
  351. /package/skills/ai-research/12-inference-serving/llama-cpp/{SKILL.md → ENTRY.md} +0 -0
  352. /package/skills/ai-research/12-inference-serving/sglang/{SKILL.md → ENTRY.md} +0 -0
  353. /package/skills/ai-research/12-inference-serving/tensorrt-llm/{SKILL.md → ENTRY.md} +0 -0
  354. /package/skills/ai-research/12-inference-serving/vllm/{SKILL.md → ENTRY.md} +0 -0
  355. /package/skills/ai-research/13-mlops/mlflow/{SKILL.md → ENTRY.md} +0 -0
  356. /package/skills/ai-research/13-mlops/swanlab/{SKILL.md → ENTRY.md} +0 -0
  357. /package/skills/ai-research/13-mlops/tensorboard/{SKILL.md → ENTRY.md} +0 -0
  358. /package/skills/ai-research/13-mlops/weights-and-biases/{SKILL.md → ENTRY.md} +0 -0
  359. /package/skills/ai-research/14-agents/a-evolve/{SKILL.md → ENTRY.md} +0 -0
  360. /package/skills/ai-research/14-agents/autogpt/{SKILL.md → ENTRY.md} +0 -0
  361. /package/skills/ai-research/14-agents/crewai/{SKILL.md → ENTRY.md} +0 -0
  362. /package/skills/ai-research/14-agents/langchain/{SKILL.md → ENTRY.md} +0 -0
  363. /package/skills/ai-research/14-agents/llamaindex/{SKILL.md → ENTRY.md} +0 -0
  364. /package/skills/ai-research/15-rag/chroma/{SKILL.md → ENTRY.md} +0 -0
  365. /package/skills/ai-research/15-rag/faiss/{SKILL.md → ENTRY.md} +0 -0
  366. /package/skills/ai-research/15-rag/pinecone/{SKILL.md → ENTRY.md} +0 -0
  367. /package/skills/ai-research/15-rag/qdrant/{SKILL.md → ENTRY.md} +0 -0
  368. /package/skills/ai-research/15-rag/sentence-transformers/{SKILL.md → ENTRY.md} +0 -0
  369. /package/skills/ai-research/16-prompt-engineering/dspy/{SKILL.md → ENTRY.md} +0 -0
  370. /package/skills/ai-research/16-prompt-engineering/guidance/{SKILL.md → ENTRY.md} +0 -0
  371. /package/skills/ai-research/16-prompt-engineering/instructor/{SKILL.md → ENTRY.md} +0 -0
  372. /package/skills/ai-research/16-prompt-engineering/outlines/{SKILL.md → ENTRY.md} +0 -0
  373. /package/skills/ai-research/17-observability/langsmith/{SKILL.md → ENTRY.md} +0 -0
  374. /package/skills/ai-research/17-observability/phoenix/{SKILL.md → ENTRY.md} +0 -0
  375. /package/skills/ai-research/18-multimodal/audiocraft/{SKILL.md → ENTRY.md} +0 -0
  376. /package/skills/ai-research/18-multimodal/blip-2/{SKILL.md → ENTRY.md} +0 -0
  377. /package/skills/ai-research/18-multimodal/clip/{SKILL.md → ENTRY.md} +0 -0
  378. /package/skills/ai-research/18-multimodal/cosmos-policy/{SKILL.md → ENTRY.md} +0 -0
  379. /package/skills/ai-research/18-multimodal/llava/{SKILL.md → ENTRY.md} +0 -0
  380. /package/skills/ai-research/18-multimodal/openpi/{SKILL.md → ENTRY.md} +0 -0
  381. /package/skills/ai-research/18-multimodal/openvla-oft/{SKILL.md → ENTRY.md} +0 -0
  382. /package/skills/ai-research/18-multimodal/segment-anything/{SKILL.md → ENTRY.md} +0 -0
  383. /package/skills/ai-research/18-multimodal/stable-diffusion/{SKILL.md → ENTRY.md} +0 -0
  384. /package/skills/ai-research/18-multimodal/whisper/{SKILL.md → ENTRY.md} +0 -0
  385. /package/skills/ai-research/19-emerging-techniques/knowledge-distillation/{SKILL.md → ENTRY.md} +0 -0
  386. /package/skills/ai-research/19-emerging-techniques/long-context/{SKILL.md → ENTRY.md} +0 -0
  387. /package/skills/ai-research/19-emerging-techniques/model-merging/{SKILL.md → ENTRY.md} +0 -0
  388. /package/skills/ai-research/19-emerging-techniques/model-pruning/{SKILL.md → ENTRY.md} +0 -0
  389. /package/skills/ai-research/19-emerging-techniques/moe-training/{SKILL.md → ENTRY.md} +0 -0
  390. /package/skills/ai-research/19-emerging-techniques/speculative-decoding/{SKILL.md → ENTRY.md} +0 -0
  391. /package/skills/ai-research/20-ml-paper-writing/academic-plotting/{SKILL.md → ENTRY.md} +0 -0
  392. /package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/{SKILL.md → ENTRY.md} +0 -0
  393. /package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/{SKILL.md → ENTRY.md} +0 -0
  394. /package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/{SKILL.md → ENTRY.md} +0 -0
  395. /package/skills/ai-research/21-research-ideation/brainstorming-research-ideas/{SKILL.md → ENTRY.md} +0 -0
  396. /package/skills/ai-research/21-research-ideation/creative-thinking-for-research/{SKILL.md → ENTRY.md} +0 -0
  397. /package/skills/ai-research/22-agent-native-research-artifact/compiler/{SKILL.md → ENTRY.md} +0 -0
  398. /package/skills/ai-research/22-agent-native-research-artifact/research-manager/{SKILL.md → ENTRY.md} +0 -0
  399. /package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/{SKILL.md → ENTRY.md} +0 -0
  400. /package/skills/design-library/adaptive-interfaces/skills/colour-independence/{SKILL.md → ENTRY.md} +0 -0
  401. /package/skills/design-library/adaptive-interfaces/skills/flexible-typography/{SKILL.md → ENTRY.md} +0 -0
  402. /package/skills/design-library/adaptive-interfaces/skills/information-density/{SKILL.md → ENTRY.md} +0 -0
  403. /package/skills/design-library/adaptive-interfaces/skills/preference-audit/{SKILL.md → ENTRY.md} +0 -0
  404. /package/skills/design-library/adaptive-interfaces/skills/responsive-accessibility/{SKILL.md → ENTRY.md} +0 -0
  405. /package/skills/design-library/adaptive-interfaces/skills/responsive-review/{SKILL.md → ENTRY.md} +0 -0
  406. /package/skills/design-library/adaptive-interfaces/skills/simplified-views/{SKILL.md → ENTRY.md} +0 -0
  407. /package/skills/design-library/adaptive-interfaces/skills/specify/{SKILL.md → ENTRY.md} +0 -0
  408. /package/skills/design-library/adaptive-interfaces/skills/user-preference-respect/{SKILL.md → ENTRY.md} +0 -0
  409. /package/skills/design-library/cognitive-accessibility/skills/adaptive-personalisation/{SKILL.md → ENTRY.md} +0 -0
  410. /package/skills/design-library/cognitive-accessibility/skills/assess-load/{SKILL.md → ENTRY.md} +0 -0
  411. /package/skills/design-library/cognitive-accessibility/skills/cognitive-load-assessment/{SKILL.md → ENTRY.md} +0 -0
  412. /package/skills/design-library/cognitive-accessibility/skills/contextual-help-design/{SKILL.md → ENTRY.md} +0 -0
  413. /package/skills/design-library/cognitive-accessibility/skills/error-prevention-recovery/{SKILL.md → ENTRY.md} +0 -0
  414. /package/skills/design-library/cognitive-accessibility/skills/focus-attention-design/{SKILL.md → ENTRY.md} +0 -0
  415. /package/skills/design-library/cognitive-accessibility/skills/memory-load-reduction/{SKILL.md → ENTRY.md} +0 -0
  416. /package/skills/design-library/cognitive-accessibility/skills/plain-language-design/{SKILL.md → ENTRY.md} +0 -0
  417. /package/skills/design-library/cognitive-accessibility/skills/review/{SKILL.md → ENTRY.md} +0 -0
  418. /package/skills/design-library/cognitive-accessibility/skills/simplify/{SKILL.md → ENTRY.md} +0 -0
  419. /package/skills/design-library/cognitive-accessibility/skills/wayfinding-navigation/{SKILL.md → ENTRY.md} +0 -0
  420. /package/skills/design-library/design-research/skills/behavioural-analytics/{SKILL.md → ENTRY.md} +0 -0
  421. /package/skills/design-library/design-research/skills/qual-quant-triangulation/{SKILL.md → ENTRY.md} +0 -0
  422. /package/skills/design-library/inclusive-interaction/skills/audit/{SKILL.md → ENTRY.md} +0 -0
  423. /package/skills/design-library/inclusive-interaction/skills/design-flow/{SKILL.md → ENTRY.md} +0 -0
  424. /package/skills/design-library/inclusive-interaction/skills/feedback-and-status/{SKILL.md → ENTRY.md} +0 -0
  425. /package/skills/design-library/inclusive-interaction/skills/gesture-alternatives/{SKILL.md → ENTRY.md} +0 -0
  426. /package/skills/design-library/inclusive-interaction/skills/keyboard-navigation/{SKILL.md → ENTRY.md} +0 -0
  427. /package/skills/design-library/inclusive-interaction/skills/keyboard-review/{SKILL.md → ENTRY.md} +0 -0
  428. /package/skills/design-library/inclusive-interaction/skills/motion-sensitivity/{SKILL.md → ENTRY.md} +0 -0
  429. /package/skills/design-library/inclusive-interaction/skills/multi-modal-input/{SKILL.md → ENTRY.md} +0 -0
  430. /package/skills/design-library/inclusive-interaction/skills/touch-target-design/{SKILL.md → ENTRY.md} +0 -0
  431. /package/skills/design-library/inclusive-interaction/skills/voice-interaction/{SKILL.md → ENTRY.md} +0 -0
  432. /package/skills/design-library/visual-critique/skills/critique-affordance/{SKILL.md → ENTRY.md} +0 -0
  433. /package/skills/design-library/visual-critique/skills/critique-brand-consistency/{SKILL.md → ENTRY.md} +0 -0
  434. /package/skills/design-library/visual-critique/skills/critique-color/{SKILL.md → ENTRY.md} +0 -0
  435. /package/skills/design-library/visual-critique/skills/critique-composition/{SKILL.md → ENTRY.md} +0 -0
  436. /package/skills/design-library/visual-critique/skills/critique-information-density/{SKILL.md → ENTRY.md} +0 -0
  437. /package/skills/design-library/visual-critique/skills/critique-typography/{SKILL.md → ENTRY.md} +0 -0
  438. /package/skills/design-library/visual-critique/skills/critique-visual-hierarchy/{SKILL.md → ENTRY.md} +0 -0
  439. /package/skills/pm-frameworks/intended-vs-implemented/{SKILL.md → ENTRY.md} +0 -0
  440. /package/skills/pm-frameworks/opportunity-solution-tree/{SKILL.md → ENTRY.md} +0 -0
  441. /package/skills/rl-env/generate-nemo-gym-env/{SKILL.md → ENTRY.md} +0 -0
  442. /package/skills/rl-env/generate-openenv-env/{SKILL.md → ENTRY.md} +0 -0
  443. /package/skills/rl-env/generate-ors-env/{SKILL.md → ENTRY.md} +0 -0
  444. /package/skills/rl-env/generate-verifiers-env/{SKILL.md → ENTRY.md} +0 -0
  445. /package/skills/rl-env/rl-env-from-description/{SKILL.md → ENTRY.md} +0 -0
@@ -83,6 +83,26 @@ def yaml_list(text, key):
83
83
  return out
84
84
 
85
85
 
86
+ def yaml_keys(text, key):
87
+ """The direct child keys of `key:` in a block-style YAML file (Goose's
88
+ `extensions:` map in config.yaml)."""
89
+ out, indent = [], None
90
+ for line in text.splitlines():
91
+ if indent is None:
92
+ if re.match(r"^%s:\s*$" % re.escape(key), line):
93
+ indent = -1
94
+ continue
95
+ if not line.strip() or line.lstrip().startswith("#"):
96
+ continue
97
+ m = re.match(r"^(\s+)([\w.-]+):", line)
98
+ if not m:
99
+ break
100
+ indent = len(m.group(1)) if indent < 0 else indent
101
+ if len(m.group(1)) == indent:
102
+ out.append(m.group(2))
103
+ return out
104
+
105
+
86
106
  def toml_tables(text, prefix):
87
107
  """Names of `[prefix.<name>]` tables in a TOML file (Codex's MCP rows)."""
88
108
  return sorted({m.group(1) for m in re.finditer(
@@ -264,6 +284,217 @@ def host_stack(host, repo):
264
284
  return {"context": [os.path.join(c, "cordis.patch.yml")],
265
285
  "skills": ("first", [os.path.join(c, "skills")]),
266
286
  "hooks": {}, "mcp": [], "scan": [os.path.join(c, "skills")]}
287
+ if host == "qwen":
288
+ c = tp.HOST_DIRS["qwen"]
289
+ user = _json(os.path.join(c, "settings.json"))
290
+ project = _json(os.path.join(repo, ".qwen", "settings.json"))
291
+ return {
292
+ # Qwen 0.21.13 docs (features/memory.md): all of these load
293
+ "context": [os.path.join(c, "QWEN.md"), os.path.join(repo, "QWEN.md"),
294
+ os.path.join(repo, "AGENTS.md"),
295
+ os.path.join(repo, ".qwen", "QWEN.local.md")],
296
+ # features/skills.md lists personal and project dirs and names no winner
297
+ "skills": ("all", [os.path.join(c, "skills"),
298
+ os.path.join(repo, ".qwen", "skills")]),
299
+ "hooks": merge_hooks(hook_rows(user, "settings.json"),
300
+ hook_rows(project, "project")),
301
+ "mcp": sorted(user.get("mcpServers") or {})
302
+ + ["%s (project)" % n for n in sorted(project.get("mcpServers") or {})],
303
+ "scan": [os.path.join(c, "skills")],
304
+ }
305
+ if host == "droid":
306
+ c, h = tp.HOST_DIRS["droid"], tp.HOME
307
+
308
+ def droid_hooks(d, source):
309
+ # hooks.json is keyed by event at the top; only when it is absent does
310
+ # Droid read the `hooks` key of settings.json (harness/hooks)
311
+ path = os.path.join(d, "hooks.json")
312
+ if os.path.exists(path):
313
+ return hook_rows({"hooks": _json(path)}, source)
314
+ return hook_rows(_json(os.path.join(d, "settings.json")), source)
315
+ return {
316
+ # harness/agents-md: cwd up to the git root and the personal dirs
317
+ "context": [os.path.join(c, "AGENTS.md"), os.path.join(h, ".agents", "AGENTS.md"),
318
+ os.path.join(repo, "AGENTS.md"),
319
+ os.path.join(repo, ".factory", "AGENTS.md"),
320
+ os.path.join(repo, "CLAUDE.md")],
321
+ # harness/skills lists the scopes and names no winner
322
+ "skills": ("all", [os.path.join(c, "skills"),
323
+ os.path.join(repo, ".factory", "skills"),
324
+ os.path.join(h, ".agents", "skills"),
325
+ os.path.join(repo, ".agents", "skills")]),
326
+ "hooks": merge_hooks(droid_hooks(c, "hooks.json"),
327
+ droid_hooks(os.path.join(repo, ".factory"), "project")),
328
+ "mcp": sorted(_json(os.path.join(c, "mcp.json")).get("mcpServers") or {}),
329
+ "scan": [os.path.join(c, "skills")],
330
+ }
331
+ if host == "commandcode":
332
+ c, h = tp.HOST_DIRS["commandcode"], tp.HOME
333
+ user = _json(os.path.join(c, "settings.json"))
334
+ project = _json(os.path.join(repo, ".commandcode", "settings.json"))
335
+ return {
336
+ # docs/memory: user, project, then subdirectory tiers; all load
337
+ "context": [os.path.join(c, "AGENTS.md"), os.path.join(repo, "AGENTS.md"),
338
+ os.path.join(repo, ".commandcode", "AGENTS.md")],
339
+ # docs/skills "Selection priority": project before user, and within a
340
+ # level .commandcode/ before .agents/
341
+ "skills": ("first", [os.path.join(repo, ".commandcode", "skills"),
342
+ os.path.join(repo, ".agents", "skills"),
343
+ os.path.join(c, "skills"),
344
+ os.path.join(h, ".agents", "skills")]),
345
+ "hooks": merge_hooks(hook_rows(user, "settings.json"),
346
+ hook_rows(project, "project")),
347
+ "mcp": sorted(_json(os.path.join(c, "mcp.json")).get("mcpServers") or {})
348
+ + ["%s (project)" % n for n in
349
+ sorted(_json(os.path.join(repo, ".mcp.json")).get("mcpServers") or {})],
350
+ "scan": [os.path.join(c, "skills")],
351
+ }
352
+ if host == "copilot":
353
+ c, h = tp.HOST_DIRS["copilot"], tp.HOME
354
+
355
+ def hook_files(d, source):
356
+ # every *.json in a hooks dir is one `{"version": 1, "hooks": ...}` file
357
+ names = sorted(n for n in os.listdir(d) if n.endswith(".json")) \
358
+ if os.path.isdir(d) else []
359
+ return merge_hooks(*(hook_rows(_json(os.path.join(d, n)), "%s %s" % (source, n))
360
+ for n in names))
361
+ return {
362
+ # cli-command-reference "Custom instructions locations": all merge
363
+ "context": [os.path.join(c, "copilot-instructions.md"),
364
+ os.path.join(repo, ".github", "copilot-instructions.md"),
365
+ os.path.join(repo, "AGENTS.md"), os.path.join(repo, "CLAUDE.md"),
366
+ os.path.join(repo, "GEMINI.md")],
367
+ # cli-command-reference "Skill locations": first found wins
368
+ "skills": ("first", [os.path.join(repo, ".github", "skills"),
369
+ os.path.join(repo, ".agents", "skills"),
370
+ os.path.join(repo, ".claude", "skills"),
371
+ os.path.join(c, "skills"),
372
+ os.path.join(h, ".agents", "skills")]),
373
+ # hooks-reference "Hooks locations": every source runs
374
+ "hooks": merge_hooks(hook_files(os.path.join(repo, ".github", "hooks"), "project"),
375
+ hook_files(os.path.join(c, "hooks"), "hooks"),
376
+ hook_rows(_json(os.path.join(c, "settings.json")),
377
+ "settings.json"),
378
+ hook_rows(_json(os.path.join(repo, ".claude",
379
+ "settings.json")), "project")),
380
+ "mcp": sorted(_json(os.path.join(c, "mcp-config.json")).get("mcpServers") or {})
381
+ + ["%s (project)" % n for n in
382
+ sorted(_json(os.path.join(repo, ".mcp.json")).get("mcpServers") or {})],
383
+ "scan": [os.path.join(c, "skills")],
384
+ }
385
+ if host == "gemini":
386
+ g, h = tp.HOST_DIRS["gemini"], tp.HOME
387
+ ext = os.path.join(g, "extensions")
388
+ exts = sorted(n for n in os.listdir(ext) if os.path.isdir(os.path.join(ext, n))) \
389
+ if os.path.isdir(ext) else []
390
+ user = _json(os.path.join(g, "settings.json"))
391
+ project = _json(os.path.join(repo, ".gemini", "settings.json"))
392
+ return {
393
+ # configuration "Context Files": the global file, then the cwd up to
394
+ # the git root, then subdirectories; all concatenate
395
+ "context": [os.path.join(g, "GEMINI.md"), os.path.join(repo, "GEMINI.md")],
396
+ # cli/skills.md: workspace over user over extension; `.agents/skills`
397
+ # wins within a tier
398
+ "skills": ("first", [os.path.join(repo, ".agents", "skills"),
399
+ os.path.join(repo, ".gemini", "skills"),
400
+ os.path.join(h, ".agents", "skills"),
401
+ os.path.join(g, "skills")]
402
+ + [os.path.join(ext, n, "skills") for n in exts]),
403
+ # hooks/index.md "Configuration": project, user, system, extensions
404
+ "hooks": merge_hooks(hook_rows(project, "project"),
405
+ hook_rows(user, "settings.json"),
406
+ *(hook_rows(_json(os.path.join(ext, n, "hooks", "hooks.json")),
407
+ "extension %s" % n) for n in exts)),
408
+ "mcp": sorted(user.get("mcpServers") or {})
409
+ + ["%s (project)" % n for n in sorted(project.get("mcpServers") or {})],
410
+ "scan": [os.path.join(g, "skills"), os.path.join(ext, "tezgah", "skills")],
411
+ }
412
+ if host == "antigravity":
413
+ a = tp.HOST_DIRS["antigravity"]
414
+ g = os.path.dirname(a)
415
+
416
+ def named(path, source):
417
+ # hooks.json maps a hook name to its events; a name set
418
+ # `enabled: false` loads nothing (docs/hooks "Hook definition fields")
419
+ data = _json(path)
420
+ return merge_hooks(*(hook_rows({"hooks": d}, "%s %s" % (source, n))
421
+ for n, d in sorted(data.items())
422
+ if isinstance(d, dict) and d.get("enabled") is not False))
423
+ return {
424
+ # docs/rules "Antigravity CLI": global and workspace rules all load
425
+ "context": [os.path.join(g, "GEMINI.md"), os.path.join(g, "AGENTS.md"),
426
+ os.path.join(repo, "GEMINI.md"), os.path.join(repo, "AGENTS.md")],
427
+ # docs/skills "CLI skill locations" names no winner
428
+ "skills": ("all", [os.path.join(repo, ".agents", "skills"),
429
+ os.path.join(a, "skills")]),
430
+ # docs/hooks "Antigravity CLI": workspace, global, plugins
431
+ "hooks": merge_hooks(named(os.path.join(repo, ".agents", "hooks.json"), "project"),
432
+ named(os.path.join(g, "config", "hooks.json"), "hooks.json")),
433
+ "mcp": sorted(_json(os.path.join(g, "config", "mcp_config.json"))
434
+ .get("mcpServers") or {})
435
+ + ["%s (project)" % n for n in sorted(
436
+ _json(os.path.join(repo, ".agents", "mcp_config.json")).get("mcpServers") or {})],
437
+ "scan": [os.path.join(a, "skills")],
438
+ }
439
+ if host == "goose":
440
+ c, h = tp.HOST_DIRS["goose"], tp.HOME
441
+ disabled = set(_json(os.path.join(c, "settings.json")).get("disabledPlugins") or [])
442
+
443
+ def plugins(base, source):
444
+ # plugins guide "Plugin Locations"; `disabledPlugins` skips one
445
+ names = sorted(n for n in os.listdir(base)
446
+ if os.path.isdir(os.path.join(base, n))) if os.path.isdir(base) else []
447
+ return [hook_rows(_json(os.path.join(base, n, "hooks", "hooks.json")),
448
+ "%s %s" % (source, n)) for n in names if n not in disabled]
449
+ return {
450
+ # goosehints guide: CONTEXT_FILE_NAMES (default AGENTS.md, .goosehints)
451
+ # global in ~/.config/goose, then the project's; all load
452
+ "context": [os.path.join(c, "AGENTS.md"), os.path.join(c, ".goosehints"),
453
+ os.path.join(repo, "AGENTS.md"), os.path.join(repo, ".goosehints")],
454
+ # skills guide "Skill Locations" names no winner; a plugin's skills are
455
+ # namespaced `<plugin>:<name>`, so they collide with none of these
456
+ "skills": ("all", [os.path.join(h, ".agents", "skills"),
457
+ os.path.join(repo, ".agents", "skills"),
458
+ os.path.join(repo, ".goose", "skills"),
459
+ os.path.join(repo, ".claude", "skills"),
460
+ os.path.join(h, ".claude", "skills")]),
461
+ # hooks guide "Where Hooks Live": user and project plugins
462
+ "hooks": merge_hooks(*plugins(os.path.join(h, ".agents", "plugins"), "plugin"),
463
+ *plugins(os.path.join(repo, ".agents", "plugins"),
464
+ "project plugin")),
465
+ # config-files guide: `extensions:` in config.yaml
466
+ "mcp": yaml_keys(_read(os.path.join(c, "config.yaml")), "extensions"),
467
+ "scan": [os.path.join(tp.GOOSE_PLUGIN, "skills")],
468
+ }
469
+ if host == "amp":
470
+ c, h = tp.HOST_DIRS["amp"], tp.HOME
471
+ system = os.path.dirname(tp.AMP_PLUGIN)
472
+
473
+ def plugins(base):
474
+ # plugins guide: a `.ts`/`.js` file or `<name>/index.*` in a plugin dir
475
+ return sorted(os.path.join(base, n) for n in (
476
+ os.listdir(base) if os.path.isdir(base) else []) if not n.startswith("."))
477
+ found = plugins(os.path.join(repo, ".amp", "plugins")) + plugins(system)
478
+ return {
479
+ # agents-md guide: the cwd and its parents, then both user files; all load
480
+ "context": [os.path.join(repo, "AGENTS.md"), os.path.join(c, "AGENTS.md"),
481
+ os.path.join(h, ".config", "AGENTS.md")],
482
+ # skills guide "Skill Sources and Precedence": the first name wins
483
+ "skills": ("first", [os.path.join(h, ".config", "agents", "skills"),
484
+ os.path.join(h, ".agents", "skills"),
485
+ os.path.join(c, "skills"),
486
+ os.path.join(repo, ".agents", "skills"),
487
+ os.path.join(repo, ".claude", "skills"),
488
+ os.path.join(h, ".claude", "skills")]),
489
+ # a plugin gets every event; a project plugin wins over a system one
490
+ # of the same name (plugins guide "Plugin Locations and Precedence")
491
+ "hooks": {"plugin (every event)": [(owner(p), p, p) for p in found]},
492
+ # settings guide: `amp.mcpServers`, user then workspace
493
+ "mcp": sorted(_json(os.path.join(c, "settings.json")).get("amp.mcpServers") or {})
494
+ + ["%s (project)" % n for n in sorted(
495
+ _json(os.path.join(repo, ".amp", "settings.json")).get("amp.mcpServers") or {})],
496
+ "scan": [os.path.join(c, "skills"), system],
497
+ }
267
498
  raise ValueError(host)
268
499
 
269
500
 
@@ -280,7 +511,11 @@ def skill_copies(dirs):
280
511
 
281
512
  def tezgah_skill_dirs():
282
513
  """The dirs tezgah-setup links its skills into, plus the plugin copy's."""
283
- dirs = [os.path.join(tp.HOST_DIRS[x], "skills") for x in ("codex", "cursor", "opencode", "dsh")]
514
+ dirs = [os.path.join(tp.HOST_DIRS[x], "skills")
515
+ for x in ("codex", "cursor", "opencode", "dsh", "qwen", "droid", "commandcode",
516
+ "copilot", "antigravity", "amp")]
517
+ dirs.append(os.path.join(tp.HOST_DIRS["gemini"], "extensions", "tezgah", "skills"))
518
+ dirs.append(os.path.join(tp.GOOSE_PLUGIN, "skills"))
284
519
  dirs.append(os.path.join(tp.HOST_DIRS["omp"], "agent", "skills"))
285
520
  active, _ = claude_plugin()
286
521
  return dirs + ([os.path.join(active, "skills")] if active else [])
@@ -207,7 +207,14 @@ class Trace:
207
207
  if name == "Dc":
208
208
  return self.col("U")[i] and bool(ti.DESIGN_COMPONENT.search(self.masked(i)))
209
209
  if name == "Dk":
210
- return self.col("P")[i] and bool(ti.DESIGN_CHECK.search(self.masked(i)))
210
+ # a `slop` verdict only counts for the repository it scanned (review
211
+ # of plan 133, finding 5): a scan of some other tree proves nothing
212
+ # about this one
213
+ detail = self.masked(i)
214
+ if not (self.col("P")[i] and ti.DESIGN_CHECK.search(detail)):
215
+ return False
216
+ return (not ti.DESIGN_SLOP.search(detail)
217
+ or ti._slop_row_holds(row, None))
211
218
  if name == "X":
212
219
  return (self.external is not None
213
220
  and kind in ("run", "verify", "verify_ok", "verify_fail")
@@ -547,9 +547,12 @@ def _phased(root, ident=None):
547
547
  # and allowlist would lock writes in a cloned repo (audit L-16). Only
548
548
  # positive evidence turns the rule off - the index tracks `.tezgah` -
549
549
  # never a can't-tell, which would switch the user's own guard off in
550
- # silence (review R2); the answer is cached on the index's stat.
551
- from tezgah_paths import workspace_tracked
552
- if out and workspace_tracked(root):
550
+ # silence (review R2); the answer is cached on the index's stat. A
551
+ # repository that carries `tezgah.owner` says it outright: `tasks: off`
552
+ # means its plans are its own, and `harness: excluded` makes `root_for`
553
+ # answer None, so no caller reaches this with a root at all.
554
+ from tezgah_paths import tasks_disabled, workspace_tracked
555
+ if out and (workspace_tracked(root) or tasks_disabled(root)):
553
556
  return []
554
557
  return out
555
558
 
@@ -706,9 +709,14 @@ def phased_record(root, rel):
706
709
  if (len(parts) != 4 or "/".join(parts[:3]).casefold() != ".tezgah/plans/open"
707
710
  or not parts[3].casefold().endswith(".md")):
708
711
  return False
712
+ from tezgah_paths import tasks_disabled
709
713
  for name, _, text in _plan_files(root, "open"):
710
714
  if name.casefold() == parts[3].casefold():
711
- return frontmatter(text).get("phase") in TASK_PHASES
715
+ # Read after the name matches, so an ordinary write pays no marker
716
+ # read. A repository that says `tasks: off` owns its plans: holding
717
+ # a write to one of them is the machine running there.
718
+ return (frontmatter(text).get("phase") in TASK_PHASES
719
+ and not tasks_disabled(root))
712
720
  return False
713
721
 
714
722
 
@@ -978,7 +986,8 @@ def set_section(path, heading, body):
978
986
  # These functions shell out to git; none of them is on the gate's write path.
979
987
 
980
988
  SLICE_KINDS = ("agent", "job")
981
- SLICE_HOSTS = ("omp", "claude", "codex", "cursor", "opencode", "dsh")
989
+ SLICE_HOSTS = ("omp", "claude", "codex", "cursor", "opencode", "dsh", "qwen", "droid",
990
+ "commandcode", "copilot", "gemini", "antigravity", "goose", "amp")
982
991
  # `stale`: an idle background job whose result stays in its parent transcript.
983
992
  # An agent with no observed end stays owed as stopped with no failure class.
984
993
  SLICE_STATUSES = ("open", "done", "stopped", "resumed", "stale")
@@ -454,7 +454,7 @@ def block(root, day=None):
454
454
  return (("Taste (learned from this user's own corrections; follow a rule, treat a "
455
455
  "hint as the default; the narrower scope wins - path, then language, then "
456
456
  "repository, then user - and AGENTS.md/CLAUDE.md beat every learning; "
457
- "`tezgah-taste reject <id>` drops one):\n"
457
+ "`~/.config/tezgah/bin/tezgah-taste reject <id>` drops one):\n"
458
458
  + "\n".join(_line(mode, learning) for mode, learning in picked)),
459
459
  [m[1]["id"] for m in picked])
460
460
 
@@ -0,0 +1,217 @@
1
+ #!/usr/bin/env python3
2
+ """Amp lifecycle hook: the python half of tezgah's Amp plugin.
3
+
4
+ Amp's plugin API is TypeScript (ampcode.com/docs plugin-api), so
5
+ `hosts/amp/tezgah-plugin.ts.in`, rendered to `$XDG_CONFIG_HOME/amp/plugins/
6
+ tezgah.ts`, forwards each event here as one JSON payload on stdin and turns the
7
+ answer into Amp's own result. The protocol is omp's (hosts/omp/hook.py); the
8
+ session id is Amp's thread id.
9
+
10
+ {"event": "session_start", "cwd", "session_id", "subagent", "parent",
11
+ "ignore_guidance", "line"}
12
+ -> {"context": <live state, the core too when AGENTS.md lacks it>,
13
+ "status", "idx"}
14
+ {"event": "status", "cwd", "session_id"} -> {"status", "idx"}
15
+ {"event": "user_prompt", "cwd", "session_id", "prompt", "subagent"}
16
+ -> {"context": <reminder + the rules this prompt arms>}
17
+ {"event": "pre_tool_use", "cwd", "session_id", "tool", "input"} -> {"deny": reason}
18
+ {"event": "post_tool_use", "cwd", "session_id", "tool", "input", "status",
19
+ "exit_code", "result_len", "empty_run", "idx", "line"}
20
+ -> {"label": one line, "status", "idx"}
21
+ {"event": "stop", "cwd", "session_id", "last_assistant_message",
22
+ "stop_hook_active"} -> {"decision": "block", "reason": reason}
23
+ {"event": "subagent_stop", ..., "parent", "agent"} -> {} (record-only)
24
+
25
+ Session start cannot inject in Amp, so the bridge asks `session_start` on the
26
+ thread's next `agent.start` and sends the brief with that turn. The always-on
27
+ core is the managed block in `~/.config/amp/AGENTS.md`; the brief repeats it
28
+ only while that block is missing or AMP_IGNORE_GUIDANCE_FILES is set. The
29
+ status line is plain text: Amp's status item draws no ANSI.
30
+ """
31
+ import json
32
+ import os
33
+ import sys
34
+
35
+ ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
36
+ sys.path.insert(0, os.path.join(ROOT, "hooks"))
37
+ from tezgah_guard import attest_session, import_failed, safe # noqa: E402
38
+ try:
39
+ from tezgah_context import ( # noqa: E402
40
+ command_text, context_for, health_segments, record, render_tiers, shell_kind,
41
+ skill_read_kind)
42
+ from tezgah_gate import cross_project_note, decision # noqa: E402
43
+ from tezgah_integrity import ( # noqa: E402
44
+ SUBAGENT_CHANNEL, bind_session, note, note_tool, stop_reason, untrusted_label,
45
+ untrusted_source)
46
+ from tezgah_paths import HOST_DIRS, off, root_for # noqa: E402
47
+ from tezgah_taste import write_note # noqa: E402
48
+ from tezgah_untrusted import marks # noqa: E402
49
+ except Exception as exc:
50
+ import_failed(exc)
51
+
52
+ # Amp's tool names -> the gate's vocabulary. `shell_command` is the other shell
53
+ # tool `shellCommandFromToolCall` reads (plugin-api); `Bash`, `edit_file`,
54
+ # `create_file`, `apply_patch` and `Task` are already the gate's names, and
55
+ # an MCP tool already arrives as `mcp__<server>__<tool>`.
56
+ GATE_TOOLS = {"shell_command": "Bash"}
57
+ IDX_GLYPHS = ("\u2713", "\u21bb", "\u2717", "?", "\u2013")
58
+
59
+
60
+ def gate_name(name):
61
+ """The tool name the gate denies under and the ledger row records; both
62
+ halves map through here so a call hashes to one id."""
63
+ return GATE_TOOLS.get(name, name)
64
+
65
+
66
+ def gate_input(tool, inp):
67
+ """The input in the gate's fields: the gate reads a shell call's text only
68
+ from `command`, so Amp's `cmd` is copied there when the bridge sent none."""
69
+ inp = dict(inp) if isinstance(inp, dict) else {}
70
+ if tool == "Bash" and "command" not in inp and isinstance(inp.get("cmd"), str):
71
+ inp["command"] = inp["cmd"]
72
+ return inp
73
+
74
+
75
+ def classify(tool, inp):
76
+ """The used-tool kind for a mapped call, or None."""
77
+ if tool.startswith("mcp__") and "codegraph" in tool:
78
+ return "graph"
79
+ kind = skill_read_kind(tool, inp)
80
+ if kind:
81
+ return kind
82
+ if tool.lower() == "task":
83
+ return "orch"
84
+ if tool == "Bash":
85
+ return shell_kind(command_text(inp))
86
+ return None
87
+
88
+
89
+ def call_failed(tool, status, exit_code):
90
+ """`note_tool`'s `failed`, tri-state. An error or cancelled result is a
91
+ failure; a shell result passes or fails only on an integer exit code the
92
+ bridge read off the output object; anything else is None - a call that
93
+ ran, never a pass (a `done` shell result alone proves nothing)."""
94
+ if status in ("error", "cancelled"):
95
+ return True
96
+ if tool == "Bash" and isinstance(exit_code, int) and not isinstance(exit_code, bool):
97
+ return exit_code != 0
98
+ return None
99
+
100
+
101
+ def rules_carry_core():
102
+ """True when Amp's user AGENTS.md holds tezgah-setup's managed block."""
103
+ try:
104
+ with open(os.path.join(HOST_DIRS["amp"], "AGENTS.md"), encoding="utf-8") as fh:
105
+ return "<!-- tezgah:start" in fh.read()
106
+ except OSError:
107
+ return False
108
+
109
+
110
+ def status_line(cwd, session_id, idx=None):
111
+ """{status, idx}: the widest plain tier of the checklist. `idx` echoed back
112
+ skips the git probe behind that mark, as on omp."""
113
+ segs = health_segments(cwd, session_id,
114
+ idx_override=idx if idx in IDX_GLYPHS else None)
115
+ out = {"status": render_tiers(segs, color=False)[0][0]}
116
+ glyph = next((s["glyph"] for s in segs if s["key"] == "idx"), None)
117
+ if glyph:
118
+ out["idx"] = glyph
119
+ return out
120
+
121
+
122
+ def post_tool(payload, cwd, session_id):
123
+ """The ledger row for one finished call; {label} for the model."""
124
+ tool = gate_name(str(payload.get("tool") or ""))
125
+ inp = gate_input(tool, payload.get("input"))
126
+ failed = call_failed(tool, payload.get("status"), payload.get("exit_code"))
127
+ # read before this call's row lands: `source` is the taint's own mark; the
128
+ # body never crosses, so a non-None stand-in keeps the subagent label
129
+ own = untrusted_source(tool, inp)
130
+ if failed is True:
131
+ source, label = own, untrusted_label(own)
132
+ else:
133
+ source, label = safe(session_id, marks, tool, inp, session_id, "") or (None, None)
134
+ record(session_id, classify(tool, inp))
135
+ size = payload.get("result_len")
136
+ if own == SUBAGENT_CHANNEL or not isinstance(size, int) or size < 0:
137
+ size = None
138
+ note_tool(session_id, tool, inp, failed=failed, out_bytes=size, source=source,
139
+ cwd=cwd, empty_run=payload.get("empty_run") is True)
140
+ if failed is not True:
141
+ taste = safe(session_id, write_note, session_id, inp, cwd, tool)
142
+ cross = safe(session_id, cross_project_note, session_id, tool, inp, cwd)
143
+ label = "\n".join(t for t in (label, taste, cross) if t)
144
+ out = status_line(cwd, session_id, payload.get("idx")) if payload.get("line") else {}
145
+ if label:
146
+ out["label"] = label
147
+ return out
148
+
149
+
150
+ def handle(payload):
151
+ event = payload.get("event") or ""
152
+ cwd = payload.get("cwd") or os.getcwd()
153
+ session_id = payload.get("session_id")
154
+ safe(session_id, bind_session, session_id) # the switch latch (tezgah_paths.off)
155
+ if event == "status":
156
+ return status_line(cwd, session_id)
157
+ if event == "pre_tool_use":
158
+ tool = gate_name(str(payload.get("tool") or ""))
159
+ reason = decision(tool, gate_input(tool, payload.get("input")), cwd, session_id)
160
+ return {"deny": reason} if reason else {}
161
+ if not root_for(cwd):
162
+ return {}
163
+ if event == "session_start":
164
+ sub = bool(payload.get("subagent"))
165
+ if sub and payload.get("parent"):
166
+ # the child's ledger opens with its parent, as on omp
167
+ note(session_id, "spawned", "", parent=str(payload["parent"]),
168
+ agent=payload.get("agent"))
169
+ elif not sub:
170
+ safe(session_id, attest_session, "amp", session_id, cwd)
171
+ core = not rules_carry_core() or bool(payload.get("ignore_guidance"))
172
+ context = context_for("subagent_start" if sub else "session_start", cwd,
173
+ dict(payload, host="amp"), with_core=core)
174
+ out = status_line(cwd, session_id) if payload.get("line") else {}
175
+ if context:
176
+ out["context"] = context
177
+ return out
178
+ if event == "user_prompt":
179
+ context = context_for("user_prompt", cwd, dict(payload, host="amp"))
180
+ return {"context": context} if context else {}
181
+ if event == "post_tool_use":
182
+ return post_tool(payload, cwd, session_id)
183
+ if event == "stop":
184
+ if off("verify-off"):
185
+ return {}
186
+ # `stop_hook_active`: this turn was started by tezgah's own continue, so
187
+ # the core may refuse it once more at most (tezgah_integrity, plan 083)
188
+ reason = safe(session_id, stop_reason, payload.get("last_assistant_message"),
189
+ session_id, cwd=cwd,
190
+ after_block=bool(payload.get("stop_hook_active")),
191
+ mode=payload.get("permission_mode"))
192
+ return {"decision": "block", "reason": reason} if reason else {}
193
+ if event == "subagent_stop":
194
+ # record-only (ADR 011): the row lands in the parent's ledger
195
+ if not off("verify-off") and payload.get("parent"):
196
+ safe(session_id, stop_reason, payload.get("last_assistant_message"),
197
+ session_id, cwd=cwd, subagent=True, agent=payload.get("agent"),
198
+ parent=str(payload["parent"]))
199
+ return {}
200
+ return {}
201
+
202
+
203
+ def main():
204
+ try:
205
+ payload = json.load(sys.stdin)
206
+ except Exception:
207
+ return
208
+ if not isinstance(payload, dict):
209
+ return
210
+ # one guard around the dispatch: a crash answers "nothing to say", and the
211
+ # plugin lets every call through (hooks/tezgah_guard.safe)
212
+ out = safe(payload.get("session_id"), handle, payload) or {}
213
+ if out:
214
+ print(json.dumps(out))
215
+
216
+
217
+ main()