@caddis/cli 0.3.0 → 0.4.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 (238) hide show
  1. package/bundles/antigravity-plugin/agents/knowledge-transfer.md +17 -32
  2. package/bundles/antigravity-plugin/caddis_statusline.py +25 -3
  3. package/bundles/antigravity-plugin/guard_agy.py +41 -9
  4. package/bundles/antigravity-plugin/plugin.json +1 -1
  5. package/bundles/antigravity-plugin/scripts/caddis_inventory.py +73 -3
  6. package/bundles/antigravity-plugin/scripts/caddis_statusline.py +25 -3
  7. package/bundles/antigravity-plugin/scripts/claudster_config.py +0 -5
  8. package/bundles/antigravity-plugin/scripts/hook_log.py +1 -1
  9. package/bundles/antigravity-plugin/scripts/new-machine.ps1 +170 -0
  10. package/bundles/antigravity-plugin/scripts/oss_ask.py +1 -1
  11. package/bundles/antigravity-plugin/scripts/oss_model.py +10 -2
  12. package/bundles/antigravity-plugin/scripts/oss_review.py +1 -1
  13. package/bundles/antigravity-plugin/scripts/setup_project_ai.py +9 -6
  14. package/bundles/antigravity-plugin/session_end_agy.py +31 -6
  15. package/bundles/antigravity-plugin/skills/advisory-hub/SKILL.md +44 -0
  16. package/bundles/antigravity-plugin/skills/code-review/SKILL.md +11 -0
  17. package/bundles/antigravity-plugin/skills/feature-plan/SKILL.md +21 -0
  18. package/bundles/antigravity-plugin/skills/gate-review/SKILL.md +11 -0
  19. package/bundles/antigravity-plugin/skills/implement/SKILL.md +36 -0
  20. package/bundles/antigravity-plugin/skills/security-review/SKILL.md +9 -0
  21. package/bundles/antigravity-plugin/skills/validate-phase/SKILL.md +31 -0
  22. package/bundles/antigravity-plugin/warm_start_agy.py +96 -9
  23. package/bundles/antigravity-plugin-extras/plugin.json +1 -1
  24. package/bundles/codex/.codex/config.toml.example +36 -0
  25. package/bundles/codex/.codex/skills/coding/api-design/SKILL.md +249 -0
  26. package/bundles/codex/.codex/skills/coding/backend-development/SKILL.md +305 -0
  27. package/bundles/codex/.codex/skills/coding/code-review/SKILL.md +140 -0
  28. package/bundles/codex/.codex/skills/coding/codebase-audit/SKILL.md +204 -0
  29. package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/SKILL.md +132 -0
  30. package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/scripts/perf_sweep.py +249 -0
  31. package/bundles/codex/.codex/skills/coding/error-handling/SKILL.md +260 -0
  32. package/bundles/codex/.codex/skills/coding/fastapi-dev/SKILL.md +300 -0
  33. package/bundles/codex/.codex/skills/coding/javascript-typescript/SKILL.md +142 -0
  34. package/bundles/codex/.codex/skills/coding/python/SKILL.md +388 -0
  35. package/bundles/codex/.codex/skills/coding/refactoring/SKILL.md +486 -0
  36. package/bundles/codex/.codex/skills/coding/security-review/SKILL.md +205 -0
  37. package/bundles/codex/.codex/skills/coding/sql/SKILL.md +321 -0
  38. package/bundles/codex/.codex/skills/data/database-design/SKILL.md +177 -0
  39. package/bundles/codex/.codex/skills/data/db-diagram/SKILL.md +148 -0
  40. package/bundles/codex/.codex/skills/data/db-diagram/scripts/sql_to_graph.py +1212 -0
  41. package/bundles/codex/.codex/skills/devops/ci-cd-pipeline/SKILL.md +315 -0
  42. package/bundles/codex/.codex/skills/devops/gh-cli/SKILL.md +195 -0
  43. package/bundles/codex/.codex/skills/devops/git-commit/SKILL.md +285 -0
  44. package/bundles/codex/.codex/skills/devops/using-git-worktrees/SKILL.md +217 -0
  45. package/bundles/codex/.codex/skills/devops/windows-deployment/SKILL.md +880 -0
  46. package/bundles/codex/.codex/skills/docs/code-documentation/SKILL.md +271 -0
  47. package/bundles/codex/.codex/skills/docs/explainer-doc/SKILL.md +97 -0
  48. package/bundles/codex/.codex/skills/docs/technical-writing/SKILL.md +286 -0
  49. package/bundles/codex/.codex/skills/docs/writing-plans/SKILL.md +387 -0
  50. package/bundles/codex/.codex/skills/frontend/css-architecture/SKILL.md +305 -0
  51. package/bundles/codex/.codex/skills/frontend/css-architecture/references/RESPONSIVE-DESIGN.md +604 -0
  52. package/bundles/codex/.codex/skills/frontend/frontend-design/SKILL.md +193 -0
  53. package/bundles/codex/.codex/skills/frontend/frontend-design/references/my-tech-stack.md +127 -0
  54. package/bundles/codex/.codex/skills/frontend/mockup/SKILL.md +242 -0
  55. package/bundles/codex/.codex/skills/frontend/react-best-practices/SKILL.md +269 -0
  56. package/bundles/codex/.codex/skills/frontend/react-dev/README.md +404 -0
  57. package/bundles/codex/.codex/skills/frontend/react-dev/SKILL.md +459 -0
  58. package/bundles/codex/.codex/skills/frontend/react-dev/examples/generic-components.md +579 -0
  59. package/bundles/codex/.codex/skills/frontend/react-dev/examples/server-components.md +579 -0
  60. package/bundles/codex/.codex/skills/frontend/react-dev/references/event-handlers.md +574 -0
  61. package/bundles/codex/.codex/skills/frontend/react-dev/references/hooks.md +456 -0
  62. package/bundles/codex/.codex/skills/frontend/react-dev/references/react-19-patterns.md +638 -0
  63. package/bundles/codex/.codex/skills/frontend/react-dev/references/react-router.md +1002 -0
  64. package/bundles/codex/.codex/skills/frontend/react-dev/references/tanstack-router.md +587 -0
  65. package/bundles/codex/.codex/skills/frontend/ui-review/SKILL.md +176 -0
  66. package/bundles/codex/.codex/skills/frontend/ui-review/references/framework-fixes.md +471 -0
  67. package/bundles/codex/.codex/skills/frontend/ui-review/references/visual-checklist.md +236 -0
  68. package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/DESIGN_TOKENS.md +487 -0
  69. package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/IMPLEMENTATION_GUIDE.md +177 -0
  70. package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/SKILL.md +732 -0
  71. package/bundles/codex/.codex/skills/media/draw-io/SKILL.md +162 -0
  72. package/bundles/codex/.codex/skills/media/draw-io/references/aws-icons.md +677 -0
  73. package/bundles/codex/.codex/skills/media/draw-io/references/layout-guidelines.md +142 -0
  74. package/bundles/codex/.codex/skills/media/draw-io/references/troubleshooting.md +118 -0
  75. package/bundles/codex/.codex/skills/media/draw-io/references/workflows.md +103 -0
  76. package/bundles/codex/.codex/skills/media/draw-io/scripts/convert-drawio-to-png.sh +25 -0
  77. package/bundles/codex/.codex/skills/media/draw-io/scripts/find_aws_icon.py +79 -0
  78. package/bundles/codex/.codex/skills/media/mermaid-diagrams/SKILL.md +292 -0
  79. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/ENHANCEMENTS.md +264 -0
  80. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/MERMAID-SUMMARY.md +137 -0
  81. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/advanced-features.md +556 -0
  82. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/architecture-diagrams.md +192 -0
  83. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/c4-diagrams.md +410 -0
  84. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/class-diagrams.md +361 -0
  85. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/erd-diagrams.md +510 -0
  86. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/flowcharts.md +450 -0
  87. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/sequence-diagrams.md +394 -0
  88. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/troubleshooting.md +335 -0
  89. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/workflows.md +418 -0
  90. package/bundles/codex/.codex/skills/media/particle-art/SKILL.md +243 -0
  91. package/bundles/codex/.codex/skills/media/particle-art/references/canvas-utils.ts +171 -0
  92. package/bundles/codex/.codex/skills/media/particle-art/references/dot-field.template.tsx +203 -0
  93. package/bundles/codex/.codex/skills/media/particle-art/references/flow-field.template.tsx +263 -0
  94. package/bundles/codex/.codex/skills/media/particle-art/references/node-shape.template.tsx +261 -0
  95. package/bundles/codex/.codex/skills/media/particle-art/references/shape-sampler.ts +281 -0
  96. package/bundles/codex/.codex/skills/media/particle-art/references/stipple-morph.template.tsx +167 -0
  97. package/bundles/codex/.codex/skills/media/particle-art/references/stipple.template.tsx +175 -0
  98. package/bundles/codex/.codex/skills/media/particle-art/references/trail-ghost.template.tsx +266 -0
  99. package/bundles/codex/.codex/skills/media/particle-art/references/usage-examples.md +320 -0
  100. package/bundles/codex/.codex/skills/testing/playwright/API_REFERENCE.md +653 -0
  101. package/bundles/codex/.codex/skills/testing/playwright/SKILL.md +454 -0
  102. package/bundles/codex/.codex/skills/testing/playwright/lib/helpers.js +441 -0
  103. package/bundles/codex/.codex/skills/testing/playwright/package.json +26 -0
  104. package/bundles/codex/.codex/skills/testing/playwright/run.js +228 -0
  105. package/bundles/codex/.codex/skills/testing/tdd-workflow/SKILL.md +188 -0
  106. package/bundles/codex/.codex/skills/testing/test-strategy/SKILL.md +155 -0
  107. package/bundles/codex/.codex/skills/testing/webapp-testing/LICENSE.txt +202 -0
  108. package/bundles/codex/.codex/skills/testing/webapp-testing/SKILL.md +97 -0
  109. package/bundles/codex/.codex/skills/testing/webapp-testing/examples/console_logging.py +35 -0
  110. package/bundles/codex/.codex/skills/testing/webapp-testing/examples/element_discovery.py +40 -0
  111. package/bundles/codex/.codex/skills/testing/webapp-testing/examples/static_html_automation.py +33 -0
  112. package/bundles/codex/.codex/skills/testing/webapp-testing/scripts/with_server.py +106 -0
  113. package/bundles/codex/.codex/skills/workflow/advisory-hub/SKILL.md +227 -0
  114. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/context-template.md +214 -0
  115. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/hub-handbook.md +233 -0
  116. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/report-contract.md +94 -0
  117. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/succession.md +118 -0
  118. package/bundles/codex/.codex/skills/workflow/best-practices/SKILL.md +500 -0
  119. package/bundles/codex/.codex/skills/workflow/best-practices/agents/best-practices-referencer.md +263 -0
  120. package/bundles/codex/.codex/skills/workflow/best-practices/agents/codebase-context-builder.md +326 -0
  121. package/bundles/codex/.codex/skills/workflow/best-practices/agents/task-intent-analyzer.md +245 -0
  122. package/bundles/codex/.codex/skills/workflow/best-practices/references/anti-patterns.md +571 -0
  123. package/bundles/codex/.codex/skills/workflow/best-practices/references/before-after-examples.md +1114 -0
  124. package/bundles/codex/.codex/skills/workflow/best-practices/references/best-practices-guide.md +513 -0
  125. package/bundles/codex/.codex/skills/workflow/best-practices/references/common-workflows.md +692 -0
  126. package/bundles/codex/.codex/skills/workflow/best-practices/references/prompt-patterns.md +547 -0
  127. package/bundles/codex/.codex/skills/workflow/brainstorming/SKILL.md +57 -0
  128. package/bundles/codex/.codex/skills/workflow/context-curator/SKILL.md +157 -0
  129. package/bundles/codex/.codex/skills/workflow/golden-plan/SKILL.md +586 -0
  130. package/bundles/codex/.codex/skills/workflow/preflight/SKILL.md +440 -0
  131. package/bundles/codex/.codex/skills/workflow/skill-creator/LICENSE.txt +202 -0
  132. package/bundles/codex/.codex/skills/workflow/skill-creator/SKILL.md +491 -0
  133. package/bundles/codex/.codex/skills/workflow/skill-creator/agents/analyzer.md +274 -0
  134. package/bundles/codex/.codex/skills/workflow/skill-creator/agents/comparator.md +202 -0
  135. package/bundles/codex/.codex/skills/workflow/skill-creator/agents/grader.md +223 -0
  136. package/bundles/codex/.codex/skills/workflow/skill-creator/assets/eval_review.html +146 -0
  137. package/bundles/codex/.codex/skills/workflow/skill-creator/eval-viewer/generate_review.py +471 -0
  138. package/bundles/codex/.codex/skills/workflow/skill-creator/eval-viewer/viewer.html +1325 -0
  139. package/bundles/codex/.codex/skills/workflow/skill-creator/references/schemas.md +430 -0
  140. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/__init__.py +0 -0
  141. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/aggregate_benchmark.py +401 -0
  142. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/generate_report.py +326 -0
  143. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/improve_description.py +247 -0
  144. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/package_skill.py +136 -0
  145. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/quick_validate.py +103 -0
  146. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/run_eval.py +310 -0
  147. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/run_loop.py +328 -0
  148. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/utils.py +47 -0
  149. package/bundles/codex/AGENTS.md +146 -0
  150. package/bundles/manifest.json +4 -3
  151. package/dist/claude-deepseek.js +2 -2
  152. package/dist/claude-glm.js +2 -2
  153. package/dist/claude-oss.js +2 -2
  154. package/dist/cli.js +187 -56
  155. package/package.json +1 -1
  156. package/bundles/antigravity-plugin/scripts/dream_capture.py +0 -249
  157. package/bundles/antigravity-plugin/scripts/dream_memory.py +0 -438
  158. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  159. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  160. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  161. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  162. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  163. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  164. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  165. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  166. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  167. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  168. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  169. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  170. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  171. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  172. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  173. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  174. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  175. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  176. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  177. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  178. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  179. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  180. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  181. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  182. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  183. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  184. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  185. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  186. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  187. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  188. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  189. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  190. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  191. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  192. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  193. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  194. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  195. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  196. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  197. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  198. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  199. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  200. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  201. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  202. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  203. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  204. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  205. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  206. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  207. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  208. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  209. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  210. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  211. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  212. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  213. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  214. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  215. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  216. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  217. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  218. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  219. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  220. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  221. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  222. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  223. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  224. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  225. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  226. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  227. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  228. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  229. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  230. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  231. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  232. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  233. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  234. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  235. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  236. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  237. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  238. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -41,16 +41,39 @@ def _hook_note(feature, exc, root=None):
41
41
  except Exception:
42
42
  pass
43
43
 
44
+
45
+ def _workspace_roots(data):
46
+ """Every workspace root in the payload, as a list. Empty when the payload has none.
47
+
48
+ agy sends `workspacePaths` as a LIST. All three caddis agy hooks used to read
49
+ `workspacePaths[0]` and treat it as "the workspace" — silently, with no signal that a
50
+ choice had been made. In a single-root workspace that is correct and the behaviour here
51
+ is unchanged. In a MULTI-root workspace it is a coin toss: the hook acts on the first
52
+ root regardless of which one the session is actually working in.
53
+
54
+ Nothing on this machine is multi-root today, so this has never fired. It is a live trap
55
+ for exactly the multi-repo workspaces the leakage investigation was about, which is why
56
+ each caller below now handles the list rather than assuming its first element.
57
+ """
58
+ roots = data.get("workspacePaths") if isinstance(data, dict) else None
59
+ if not isinstance(roots, list):
60
+ return []
61
+ return [str(r) for r in roots if isinstance(r, (str, bytes)) and str(r).strip()]
62
+
44
63
  def main() -> None:
45
64
  try:
46
65
  data = json.load(sys.stdin)
47
66
  except Exception:
48
67
  data = {}
49
68
  try:
50
- workspaces = data.get("workspacePaths") or []
51
- workspace = workspaces[0] if workspaces else os.getcwd()
52
- art = _artifact_root(workspace)
53
- os.makedirs(art, exist_ok=True)
69
+ roots = _workspace_roots(data) or [os.getcwd()]
70
+ # Write the record to every root that ALREADY has a .caddis dir, rather than to
71
+ # whichever root happened to be first. A multi-root session's usage belongs to each
72
+ # repo that participates in it, and creating .caddis in a repo that never opted in
73
+ # would be caddis littering someone else's tree.
74
+ targets = [_artifact_root(r) for r in roots if os.path.isdir(_artifact_root(r))]
75
+ if not targets:
76
+ targets = [_artifact_root(roots[0])] # single-root default: unchanged behaviour
54
77
  record = {
55
78
  "ts": datetime.now(timezone.utc).isoformat(),
56
79
  "event": "session_end",
@@ -60,8 +83,10 @@ def main() -> None:
60
83
  "terminationReason": data.get("terminationReason"),
61
84
  "model": data.get("modelName"),
62
85
  }
63
- with open(os.path.join(art, "usage-log.jsonl"), "a", encoding="utf-8") as fh:
64
- fh.write(json.dumps(record) + "\n")
86
+ for art in targets:
87
+ os.makedirs(art, exist_ok=True)
88
+ with open(os.path.join(art, "usage-log.jsonl"), "a", encoding="utf-8") as fh:
89
+ fh.write(json.dumps(record) + "\n")
65
90
  except Exception as _exc:
66
91
  _hook_note("agy usage-log write", _exc) # never fail the turn
67
92
  # No stdout: agy interprets a Stop hook's stdout as a decision object.
@@ -93,6 +93,50 @@ A three-phase feature hits none of this. `/caddis:feature-plan` Step 3b runs thi
93
93
  it never creates the file silently. This is the test's only home — do not restate the thresholds
94
94
  elsewhere, or the copies drift.
95
95
 
96
+ ### Failing this test correctly does not mean "no discipline"
97
+
98
+ A plan can fail the test above — properly, no Hub needed — and still be multi-phase, multi-session,
99
+ and worth structuring. The trap is what happens next.
100
+
101
+ The Hub's file conventions are *attractive*. Once one plan in a repo runs in Hub mode, its
102
+ `phase-NN.prompt.md` / `phase-NN.report.md` / CONTINUE GATE artefacts are sitting right there as the
103
+ most recent example of "how we structure a multi-session plan here." A second, smaller plan copies
104
+ them by analogy. It gets the readability. It gets **none** of the safety, because the safety was
105
+ never in the file names — it was in the role split and the verdict gate.
106
+
107
+ That has happened. A six-phase UI plan borrowed the naming, and an implementing session filed its own
108
+ batch report **and then wrote the next batch's prompt in the same session**, with nobody having
109
+ looked at the work in between. Nothing was wrong that time. Nothing *checked*, either — and the good
110
+ outcome is not evidence the mechanism worked, it is evidence nothing tested it.
111
+
112
+ This skill already says why role separation is not decoration:
113
+
114
+ > *An implementer that writes its own verdict has produced a self-assessment wearing a verdict's
115
+ > name — worse than no verdict, because it looks like a check happened.*
116
+
117
+ The same sentence holds with two words changed: **an implementer that writes the next phase's
118
+ instructions** has produced a plan wearing an independently-authored prompt's name.
119
+
120
+ ### The one lightweight rule — cheap enough to always afford
121
+
122
+ > **The session that files a phase's report must not also write the next phase's prompt without an
123
+ > independent re-check in between.**
124
+
125
+ That is the whole rule. It costs minutes, not a session:
126
+
127
+ - re-run the test suite rather than trusting the report's claim that it passed
128
+ - grep the source for the report's two or three load-bearing claims
129
+ - open one or two of the screenshots it describes, rather than reading its description of them
130
+
131
+ No switch file. No dedicated Hub session. No advisory-context doc. If the re-check finds nothing, you
132
+ have lost ten minutes; if it finds something, it found it *before* the wrong instruction went into a
133
+ fresh session that cannot know any better.
134
+
135
+ **State which one you are doing, in the plan.** A plan that borrows Hub file conventions should say
136
+ either "full Advisory Hub mode" or "Hub file conventions, lightweight re-check rule, no Hub" —
137
+ because a reader six phases later cannot tell the two apart from the artefacts alone. That is the
138
+ entire problem this section exists to prevent.
139
+
96
140
  ## Succession is not the same as a standing validator
97
141
 
98
142
  Two things look alike from outside and are not:
@@ -8,6 +8,17 @@ license: Apache-2.0
8
8
 
9
9
  # Code Review
10
10
 
11
+ > **On Claude Code, prefer the native `/code-review`.** It is a command, not a skill, so it always
12
+ > fires — including headless — and it has grown capabilities this one does not have: effort levels
13
+ > (`low`…`max`), an `ultra` mode that runs a multi-agent review in the cloud, `--comment` to post
14
+ > findings as inline PR comments, and `--fix` to apply them to the working tree. Reach for it first.
15
+ >
16
+ > This surface remains because caddis ships to harnesses that have **no** native equivalent — agy,
17
+ > Codex and Copilot. There it is the only review you get. Do not delete it to tidy up Claude Code.
18
+ >
19
+ > `/caddis:cross-review` is NOT replaced by either. It sends the diff to a **different vendor's**
20
+ > model, which neither this nor the native reviewer can do.
21
+
11
22
  ## Review Categories
12
23
 
13
24
  ### 1. Security Review
@@ -349,6 +349,27 @@ this. But **always record the determination in the plan, pass or fail**: one lin
349
349
  > `Advisory Hub: not applicable — no REQUIRED trigger (not a migration / security change /
350
350
  > production data correctness / numbers published to stakeholders).`
351
351
 
352
+ ### If the test FAILS but this repo already runs a Hub for another plan
353
+
354
+ Check for an existing `*-advisory-context.md` in `.caddis/plans/` belonging to a **different** plan.
355
+ If one exists, add a second line under `## Constraints & decisions`:
356
+
357
+ > `Hub conventions: this repo runs Advisory Hub for <other-plan>. This plan does NOT — if it borrows
358
+ > the phase-NN.prompt.md / .report.md / CONTINUE GATE conventions, the lightweight rule applies: the
359
+ > session that files a report must not write the next prompt without an independent re-check.`
360
+
361
+ **Why this line exists.** A repo with one Hub plan has its artefacts sitting there as the most recent
362
+ example of "how we structure a multi-session plan here", and the next plan copies them by analogy.
363
+ It inherits the file names and none of the safety, because the safety was never in the names.
364
+ Measured once already: an implementing session filed its own batch report and then wrote the next
365
+ batch's prompt in the same session, with nobody having looked in between. Nothing was wrong that
366
+ time — and nothing checked either.
367
+
368
+ This is the cheapest possible place to catch it: when the second plan is created, before any
369
+ artefact-mimicry has happened. See *"Failing this test correctly does not mean no discipline"* in the
370
+ `advisory-hub` skill for the rule itself. Do not restate the rule here — one home, or the copies
371
+ drift.
372
+
352
373
  Silent to the human, auditable in the artifact. "Say nothing" once meant *leave no trace anywhere*,
353
374
  and a wrong negative was then invisible — no line in the plan, no line in the chat, nothing for
354
375
  anyone to challenge. A rule whose failures leave no artifact cannot be reviewed.
@@ -5,6 +5,17 @@ description: Deterministic headless code review — adversarial diff review, sel
5
5
 
6
6
  # /caddis:gate-review — headless adversarial code review (self-contained)
7
7
 
8
+ > **On Claude Code, prefer the native `/code-review`.** It is a command, not a skill, so it always
9
+ > fires — including headless — and it has grown capabilities this one does not have: effort levels
10
+ > (`low`…`max`), an `ultra` mode that runs a multi-agent review in the cloud, `--comment` to post
11
+ > findings as inline PR comments, and `--fix` to apply them to the working tree. Reach for it first.
12
+ >
13
+ > This surface remains because caddis ships to harnesses that have **no** native equivalent — agy,
14
+ > Codex and Copilot. There it is the only review you get. Do not delete it to tidy up Claude Code.
15
+ >
16
+ > `/caddis:cross-review` is NOT replaced by either. It sends the diff to a **different vendor's**
17
+ > model, which neither this nor the native reviewer can do.
18
+
8
19
  Perform an adversarial code review of **$ARGUMENTS** (a git range, e.g. `abc123..HEAD` — defaults
9
20
  to the current working diff when empty).
10
21
 
@@ -137,6 +137,42 @@ This is the Hub's central power and until now it ran on human discipline alone:
137
137
  whether the next phase could start, and *nothing read it*. Five lines of check make the claim true by
138
138
  machine.
139
139
 
140
+ ### Ringing the Hub, and waiting for it (Claude Code only, optional)
141
+
142
+ Two moments in Advisory-Hub mode currently cost the user a copy-paste. Both are optional, both
143
+ degrade to today's behaviour, and neither replaces a file.
144
+
145
+ **After you file `phase-NN.report.md`** — if `ListAgents` is available, look for a peer session whose
146
+ name starts with **this repo's directory name**. Sessions are auto-named `<repo-dir>-<hash>`, so a
147
+ same-repo peer is the Hub:
148
+
149
+ ```
150
+ SendMessage({to: "<peer-name>", summary: "phase-05 report filed",
151
+ message: "phase-05.report.md is filed and awaiting a verdict."})
152
+ ```
153
+
154
+ **When you are BLOCKED on a verdict** — instead of stopping dead, subscribe once:
155
+
156
+ ```
157
+ SendMessage({to: "<peer-name>", notify_when_idle: true,
158
+ message: "blocked on phase-05 verdict; ping me when you have written it"})
159
+ ```
160
+
161
+ `notify_when_idle` is one-shot and costs the Hub nothing extra. **Never poll `ListAgents` in a loop,
162
+ and never send "are you done yet?"** — that burns both sessions' context to no purpose.
163
+
164
+ **The rules that keep this from becoming a mess:**
165
+
166
+ - **The file is the decision; the message is a doorbell.** Never treat a chat message as a verdict.
167
+ If a peer says "accepted", still read `phase-NN.verdict.md` — the gate above checks the FILE, and
168
+ a message cannot be re-read next week or by a third session.
169
+ - **No `ListAgents`, no peer, or more than one same-repo peer → do nothing and carry on.** caddis
170
+ also runs on agy and Codex, which have no cross-session messaging at all. Everything above is an
171
+ accelerant on one harness; the file protocol is the portable layer and is what actually works.
172
+ - **Headless runs never message.** There is no copy-paste to save.
173
+ - **Never ask a peer to perform work your own session was denied.** Permission boundaries are
174
+ per-session, and routing blocked work through another session launders the user's decision.
175
+
140
176
  **If a `phase-NN.prompt.md` exists for the phase you are about to run, it is the INSTRUCTION OF
141
177
  RECORD** — read it, and measure your DEVIATIONS against it, not against the plan alone. The Hub writes
142
178
  that file before the phase precisely so a deviation is falsifiable; an executor that never reads it
@@ -6,6 +6,15 @@ description: "Security review workflow — OWASP, code scanning, cloud infrastru
6
6
 
7
7
  # Security Review
8
8
 
9
+ > **On Claude Code, prefer the native `/security-review`.** It is a command, not a skill, so it always
10
+ > fires — including headless — and it has grown capabilities this one does not have: Reach for it first.
11
+ >
12
+ > This surface remains because caddis ships to harnesses that have **no** native equivalent — agy,
13
+ > Codex and Copilot. There it is the only review you get. Do not delete it to tidy up Claude Code.
14
+ >
15
+ > `/caddis:cross-review` is NOT replaced by either. It sends the diff to a **different vendor's**
16
+ > model, which neither this nor the native reviewer can do.
17
+
9
18
  Security review workflow covering OWASP Top 10, code scanning, and cloud infrastructure.
10
19
 
11
20
  ## When to Use
@@ -98,6 +98,37 @@ step, not just described.
98
98
  Add or update this phase's row in `.caddis/advisory-hub-reports/README.md` (Phase | Report | Verdict |
99
99
  Outcome | Date).
100
100
 
101
+ ## Step 8 — tell the implementing session (Claude Code only, optional)
102
+
103
+ The verdict file is the decision. This step only saves the user from carrying it by hand.
104
+
105
+ If `ListAgents` is available, look for a peer session whose name starts with **this repo's directory
106
+ name** — sessions are auto-named `<repo-dir>-<hash>`, so in a repo directory called `acme-api`,
107
+ `acme-api-91` is a session in this repo and `other-project-e8` is not. If exactly one such peer
108
+ exists, it is the implementer:
109
+
110
+ ```
111
+ SendMessage({to: "<peer-name>", summary: "phase-05 verdict",
112
+ message: "phase-05.verdict.md written — verdict: accept-with-correction. "
113
+ "Corrections are in the file and in advisory-context.md."})
114
+ ```
115
+
116
+ Send the **headline and the filename**, never the whole verdict. The file is the record; the message
117
+ is a doorbell. A chat message cannot be re-read next week; `phase-05.verdict.md` can.
118
+
119
+ **Do not do any of this if:**
120
+
121
+ - there is no `ListAgents` — caddis also runs on agy and Codex, which have no cross-session
122
+ messaging. The file-based flow is the portable one and works everywhere. This step is an
123
+ accelerant, not a requirement.
124
+ - **more than one** same-repo peer is listed. Guessing which is the implementer is worse than not
125
+ sending — say so to the user and let them name it.
126
+ - you are headless. There is no one to save a copy-paste for.
127
+
128
+ **Never ask the peer to run something your own session was denied.** Permission boundaries are
129
+ per-session; routing blocked work through another session launders the user's decision. Route it back
130
+ to the user instead.
131
+
101
132
  ## Rules
102
133
 
103
134
  - **Fail closed.** A gate you could not re-run is `NOT RE-RUN`, never `PASS`. A claim you could not
@@ -150,6 +150,63 @@ def _hook_note(feature, exc, root=None):
150
150
  except Exception:
151
151
  pass
152
152
 
153
+
154
+
155
+ def _injected_marker(root, conversation):
156
+ """Path of the per-conversation "relay already injected" marker, or None."""
157
+ try:
158
+ safe = "".join(c for c in str(conversation) if c.isalnum() or c in "-_")[:64]
159
+ if not safe:
160
+ return None
161
+ return os.path.join(str(root), ".caddis", ".relay-injected", safe)
162
+ except Exception:
163
+ return None
164
+
165
+
166
+ def _already_injected(root, conversation):
167
+ """True when this conversation has had its relay injected before. Fail-open: on any
168
+ error return False, because a duplicate relay is a smaller harm than none at all."""
169
+ try:
170
+ marker = _injected_marker(root, conversation)
171
+ return bool(marker) and os.path.isfile(marker)
172
+ except Exception:
173
+ return False
174
+
175
+
176
+ def _mark_injected(root, conversation):
177
+ """Record that this conversation received its relay. Never raises.
178
+
179
+ A failure here means the next truncation may re-inject — the pre-2026-08-22 behaviour,
180
+ which is exactly the fail-open direction we want.
181
+ """
182
+ try:
183
+ marker = _injected_marker(root, conversation)
184
+ if not marker:
185
+ return
186
+ os.makedirs(os.path.dirname(marker), exist_ok=True)
187
+ with open(marker, "w", encoding="utf-8") as fh:
188
+ fh.write("")
189
+ except Exception as _exc:
190
+ _hook_note("agy relay injection marker", _exc, root)
191
+
192
+ def _workspace_roots(data):
193
+ """Every workspace root in the payload, as a list. Empty when the payload has none.
194
+
195
+ agy sends `workspacePaths` as a LIST. All three caddis agy hooks used to read
196
+ `workspacePaths[0]` and treat it as "the workspace" — silently, with no signal that a
197
+ choice had been made. In a single-root workspace that is correct and the behaviour here
198
+ is unchanged. In a MULTI-root workspace it is a coin toss: the hook acts on the first
199
+ root regardless of which one the session is actually working in.
200
+
201
+ Nothing on this machine is multi-root today, so this has never fired. It is a live trap
202
+ for exactly the multi-repo workspaces the leakage investigation was about, which is why
203
+ each caller below now handles the list rather than assuming its first element.
204
+ """
205
+ roots = data.get("workspacePaths") if isinstance(data, dict) else None
206
+ if not isinstance(roots, list):
207
+ return []
208
+ return [str(r) for r in roots if isinstance(r, (str, bytes)) and str(r).strip()]
209
+
153
210
  def main() -> None:
154
211
  try:
155
212
  _reconfig = getattr(sys.stdout, "reconfigure", None)
@@ -173,17 +230,47 @@ def main() -> None:
173
230
  return
174
231
  if is_headless():
175
232
  return
176
- workspaces = data.get("workspacePaths") or []
177
- if not (isinstance(workspaces, list) and workspaces):
233
+ roots = _workspace_roots(data)
234
+ if not roots:
178
235
  return
179
- root = str(workspaces[0])
180
- relay = resolve_relay(root)
181
- if not relay:
182
- return
183
- text = open(relay, encoding="utf-8").read().strip()
184
- if not text:
236
+
237
+ # DOUBLE-INJECTION GUARD (2026-08-22). The gate above is `invocationNum == 0`, and
238
+ # agy RESTARTS invocation numbering after a CHECKPOINT truncation. A long session
239
+ # therefore hits invocation 0 a second time mid-conversation and injected the relay
240
+ # again — observed at steps 53 and 56 of one transcript, after a truncation at 50.
241
+ # A relay injected mid-task is worse than noise: it carries a "next step" from a
242
+ # PREVIOUS session, and that has been seen executed in place of the real prompt.
243
+ #
244
+ # Conversation ids are unique per session, so a marker file per id is enough. Stale
245
+ # markers are harmless — they only ever suppress a re-injection into a conversation
246
+ # that already received one.
247
+ conversation = str(data.get("conversationId") or "").strip()
248
+
249
+ blocks = []
250
+ for root in roots:
251
+ relay = resolve_relay(root)
252
+ if not relay:
253
+ continue
254
+ try:
255
+ text = open(relay, encoding="utf-8").read().strip()
256
+ except Exception as _exc:
257
+ _hook_note("agy relay read", _exc, root)
258
+ continue
259
+ if not text:
260
+ continue
261
+ if conversation and _already_injected(root, conversation):
262
+ continue
263
+ # Label the block ONLY when there is more than one root. A single-root session
264
+ # must produce byte-identical output to before this change.
265
+ if len(roots) > 1:
266
+ blocks.append("relay for " + os.path.basename(root.rstrip("/\\")) + ":")
267
+ blocks.append(truncate_relay(text))
268
+ if conversation:
269
+ _mark_injected(root, conversation)
270
+
271
+ if not blocks:
185
272
  return
186
- message = (RELAY_FRAME_HEADER + "\n" + truncate_relay(text)
273
+ message = (RELAY_FRAME_HEADER + "\n" + "\n\n".join(blocks)
187
274
  + "\n\n" + RELAY_FRAME_FOOTER)
188
275
  payload = json.dumps({"injectSteps": [{"ephemeralMessage": message}]})
189
276
  sys.stdout.write(payload)
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "caddis-extras",
3
- "version": "1.3.25",
3
+ "version": "1.3.26",
4
4
  "description": "caddis-extras — the long-tail skills for the Antigravity (agy) caddis plugin; install alongside caddis for the full set."
5
5
  }
@@ -0,0 +1,36 @@
1
+ # Codex CLI configuration example
2
+ # Copy to ~/.codex/config.toml (user-level, all projects)
3
+ # or <project>/.codex/config.toml (project-level; project must be trusted)
4
+ #
5
+ # Add a server interactively: codex mcp add <name> -- <command> [args...]
6
+ # Verify loaded servers: codex mcp list
7
+
8
+ # ── Model (adjust to your OpenAI tier) ───────────────────────────────────────
9
+ # model = "codex-mini-latest"
10
+
11
+ # ── Skills ────────────────────────────────────────────────────────────────────
12
+ # Project skills: <project>/.codex/skills/<category>/<name>/SKILL.md
13
+ # User skills: ~/.codex/skills/<name>/SKILL.md (no category subdir)
14
+ # (Paths probed from codex 0.137 — see docs/analysis/codex-cli-contract.md.
15
+ # .agents/ is codex's PLUGINS root, not a skills root.)
16
+ #
17
+ # Disable a skill without deleting it:
18
+ # [[skills.config]]
19
+ # path = ".codex/skills/devops/windows-deployment"
20
+ # enabled = false
21
+
22
+ # ── junai MCP (pipeline state + project context) ─────────────────────────────
23
+ # OFF by default. The junai MCP server tracks pipeline stage and project state
24
+ # across sessions. Enable when the server is available locally.
25
+ #
26
+ # Prerequisites:
27
+ # pip install junai-mcp (or: uv tool install junai-mcp)
28
+ # codex mcp add junai -- python -m junai_mcp --project-root .
29
+ #
30
+ # Or add the block below manually and run `codex mcp list` to confirm:
31
+ #
32
+ # [[mcp_servers]]
33
+ # name = "junai"
34
+ # command = "python"
35
+ # args = ["-m", "junai_mcp", "--project-root", "."]
36
+ # env = {}