@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
@@ -56,36 +56,22 @@ Pre-empt it before writing the relay (use Grep/Read — you don't run the checke
56
56
  - Fix gaps directly — keeping these docs current is knowledge-doc work, squarely in your remit. Record the
57
57
  edits under `live_writes` in your return block.
58
58
 
59
- ## Feed Dream Memory (the short-term fact store)
60
- Dream Memory (`.caddis/memory.jsonl`, one JSON fact per line) is caddis's automatic, **decaying
61
- short-term** memory — reinforced when a fact recurs, pruned when it doesn't. The Stop hook already
62
- captures the *mechanical* kinds (a command that failed, a build that went red→green). You are the only
63
- place that can capture the **reasoned** kinds, so add them as a byproduct — cheap insurance that a
64
- hard-won "don't do that" resurfaces next session even before it graduates into a curated doc. This does
65
- **not** replace the durable write above — do both; this is short-term, that is long-term.
59
+ ## Dream Memory — RETIRED 2026-08-26. Do not write to `.caddis/memory.jsonl`.
60
+ Both halves of the mechanism this section used to describe are gone: the Stop hook's automatic
61
+ capture (`dream_capture.py`) and the SessionStart surfacing in `inject_relay.py` were both removed
62
+ the same day. Reason, verbatim from the retirement comment (`inject_relay.py`): it ranked facts by
63
+ hit count, so the most-repeated shell typo always outranked a real insight — 128 of 131 records were
64
+ `failure-mode`, the top six were a month stale with counts of 69-77, and the two genuinely useful
65
+ records sat at `hitCount: 1` and never surfaced. A count of 77 meant that command failed 77 times
66
+ **while its own warning held the top slot** — the mechanism never changed behaviour.
66
67
 
67
- **Append** — for each `rejected-approach` (an approach tried and abandoned, so no one retries it) or
68
- `repo-fact` (a non-obvious, durable truth about how this repo works) from this session, append ONE line
69
- to `.caddis/memory.jsonl` (create it if absent; never rewrite or reorder existing lines — the next
70
- Stop consolidates and dedups). Every field is required:
71
- ```
72
- {"kind":"rejected-approach","key":"poll-api-for-status","summary":"don't poll the API for status — use the SSE stream","hitCount":1,"firstSeen":"2026-07-01T00:00:00Z","lastSeen":"2026-07-01T00:00:00Z","source":"knowledge-transfer"}
73
- ```
74
- - `kind` is ONLY `rejected-approach` or `repo-fact` — the mechanical kinds are the hook's job, not yours.
75
- - `key` is a short, stable, lowercase dedup phrase (it's the identity; the same lesson must reuse the
76
- same key so it reinforces instead of duplicating). `summary` is ≤1 imperative line.
77
- - **Redact secrets** — never put a token, password, env value, or credentialed URL in `key`/`summary`.
78
- Store the lesson, not the secret; if you can't state it without a secret, don't store it.
79
- - Use today's date for both timestamps (a date-precision ISO like `2026-07-01T00:00:00Z` is fine).
80
- - Malformed lines are silently dropped on load, so a fumbled line is safe — but aim to get it right.
81
-
82
- **Promote (the boundary — do this when you see it):** if the store already holds a fact with
83
- `hitCount >= 3` (it has recurred across sessions), it has earned a permanent home. Write it into the
84
- right curated doc — a `.caddis/kb/*.md` note or the most specific live `AGENTS.md` (same routing as
85
- above) — then **delete that one fact's line** from `.caddis/memory.jsonl` so it doesn't double-surface.
86
- Promotion is one-way and one-at-a-time: the curated docs hold what survived; Dream Memory holds what's
87
- still proving itself. (Dream Memory is gitignored/local; promotion is how a repeatedly-useful fact
88
- becomes durable and shareable.)
68
+ The file (`.caddis/memory.jsonl`) is left on disk but nothing reads it anymore — appending a fact
69
+ there now has zero effect, good or bad. **Do not append to it.** Claude Code's own per-repo memory
70
+ (`~/.claude/projects/<slug>/memory/*.md` + `MEMORY.md`) does the short-term/reasoned-fact job instead;
71
+ it is maintained by the harness natively, not by this agent writing a file. If you land a
72
+ `rejected-approach` or `repo-fact` this session, it goes straight into the durable write above (a
73
+ `.caddis/kb/*.md` note or the most specific `AGENTS.md`) — there is no more intermediate decaying
74
+ tier to stage it in first.
89
75
 
90
76
  ## Return format (always end with this)
91
77
  ```
@@ -94,10 +80,9 @@ knowledge_transfer:
94
80
  - file: <path> section: <heading> nugget: <one-line summary>
95
81
  secondary_writes:
96
82
  - <session-log entry, or "none">
97
- dream_memory:
98
- - <kind + key of each fact appended to .caddis/memory.jsonl, or "none">
99
83
  promotions:
100
- - <fact key promoted to <curated doc> and removed from the store, or "none">
84
+ - <legacy field, kept for callers that still read it — Dream Memory retired 2026-08-26, so this is
85
+ always "none" now>
101
86
  adr_flag:
102
87
  - <decision worth formalizing as an ADR, or "none">
103
88
  skipped:
@@ -631,9 +631,31 @@ def install(hosts, dry_run: bool = False) -> int:
631
631
  failures = 0
632
632
  for host in hosts:
633
633
  settings = HOST_SETTINGS[host]
634
- # agy runs its status-line command through cmd.exe on Windows, where a quoted
635
- # path containing spaces breaks. Home is space-free here; keep it native.
636
- command = '%s "%s" --profile %s' % (py, str(INSTALLED_SCRIPT), host)
634
+ # QUOTING DIFFERS BY HOST, and getting it wrong breaks the line silently.
635
+ #
636
+ # Claude Code runs its statusLine command through a SHELL, so a quoted path is
637
+ # correct and a path containing spaces works.
638
+ #
639
+ # agy does NOT. It splits the string itself, so quotes survive as literal path
640
+ # characters and the result is resolved against the session cwd. Observed live
641
+ # 2026-08-27: agy reported it could not open a file whose path was the session
642
+ # cwd with the quoted absolute path appended inside it. The user own working agy
643
+ # line had always been unquoted; mine was not.
644
+ #
645
+ # Consequence to be honest about: an agy install whose home contains a space
646
+ # cannot be expressed this way. Detect it and say so, rather than writing a
647
+ # command that fails at render time with a confusing message.
648
+ target = str(INSTALLED_SCRIPT)
649
+ if host == "agy":
650
+ if " " in target:
651
+ print(" !! agy home path contains a space (%s)." % target)
652
+ print(" agy does not parse statusLine through a shell, so the path")
653
+ print(" cannot be quoted. Wire agy statusLine by hand. Skipped.")
654
+ failures += 1
655
+ continue
656
+ command = "%s %s --profile %s" % (py, target, host)
657
+ else:
658
+ command = '%s "%s" --profile %s' % (py, target, host)
637
659
  try:
638
660
  failures += wire_host(host, settings, command, dry_run)
639
661
  except Exception as exc: # never leave a half-written settings file unexplained
@@ -303,8 +303,27 @@ def _hook_note(feature, exc, root=None):
303
303
  sys.path.insert(0, _cand)
304
304
  import hook_log as _hl # noqa: E402
305
305
  _hl.record(os.path.basename(__file__).replace(".py", ""), feature, exc, root)
306
- except Exception as _exc:
307
- _hook_note("agy guard config read", _exc)
306
+ except Exception:
307
+ pass # the ledger must never recurse into itself
308
+
309
+
310
+ def _workspace_roots(data):
311
+ """Every workspace root in the payload, as a list. Empty when the payload has none.
312
+
313
+ agy sends `workspacePaths` as a LIST. All three caddis agy hooks used to read
314
+ `workspacePaths[0]` and treat it as "the workspace" — silently, with no signal that a
315
+ choice had been made. In a single-root workspace that is correct and the behaviour here
316
+ is unchanged. In a MULTI-root workspace it is a coin toss: the hook acts on the first
317
+ root regardless of which one the session is actually working in.
318
+
319
+ Nothing on this machine is multi-root today, so this has never fired. It is a live trap
320
+ for exactly the multi-repo workspaces the leakage investigation was about, which is why
321
+ each caller below now handles the list rather than assuming its first element.
322
+ """
323
+ roots = data.get("workspacePaths") if isinstance(data, dict) else None
324
+ if not isinstance(roots, list):
325
+ return []
326
+ return [str(r) for r in roots if isinstance(r, (str, bytes)) and str(r).strip()]
308
327
 
309
328
  def main() -> None:
310
329
  tier, reason = "allow", ""
@@ -314,7 +333,7 @@ def main() -> None:
314
333
  try:
315
334
  _reconfig(encoding="utf-8")
316
335
  except Exception as _exc:
317
- _hook_note("agy guard config read", _exc)
336
+ _hook_note("agy stdout utf-8 reconfigure", _exc)
318
337
  try:
319
338
  data = json.load(sys.stdin)
320
339
  except Exception:
@@ -324,12 +343,25 @@ def main() -> None:
324
343
  call = data.get("toolCall")
325
344
  if not isinstance(call, dict):
326
345
  return
327
- workspaces = data.get("workspacePaths") or []
328
- root = workspaces[0] if isinstance(workspaces, list) and workspaces else os.getcwd()
329
- if guard_disabled(str(root)):
346
+ roots = _workspace_roots(data) or [os.getcwd()]
347
+
348
+ # Every per-repo guard setting RELAXES the guard: `enabled = false` bypasses all
349
+ # tiers, `mode = "deny-only"` drops the ask tier, and `[guard] allow` downgrades an
350
+ # ask. Reading them from workspacePaths[0] meant one repo's relaxation silently
351
+ # applied to every other repo in the workspace — repo A's kill switch unguarding
352
+ # repo B. Require UNANIMITY instead: a relaxation applies only when every root asks
353
+ # for it. One root is the common case and behaves exactly as before.
354
+ if all(guard_disabled(r) for r in roots):
330
355
  return # kill switch: bypass every tier
331
- tier, reason = decide(str(call.get("name") or ""), call.get("args"), _load_allow(str(root)))
332
- if tier == "ask" and deny_only(str(root)):
356
+
357
+ # The allow-list downgrades an ask, so with several roots take only the entries
358
+ # present in ALL of them — the strictest reading, not the most permissive.
359
+ allow = _load_allow(roots[0])
360
+ for other in roots[1:]:
361
+ allow = [a for a in allow if a in _load_allow(other)]
362
+
363
+ tier, reason = decide(str(call.get("name") or ""), call.get("args"), allow)
364
+ if tier == "ask" and all(deny_only(r) for r in roots):
333
365
  tier = "allow" # deny-only: keep catastrophe blocks, never force_ask (no plan interruption)
334
366
  except Exception:
335
367
  return # ANY unexpected shape/error → no guard, never a crash and never a bad decision
@@ -337,7 +369,7 @@ def main() -> None:
337
369
  try:
338
370
  _emit(tier, reason)
339
371
  except Exception as _exc:
340
- _hook_note("agy guard config read", _exc)
372
+ _hook_note("agy guard decision emit", _exc)
341
373
  # Always exit 0: a non-zero code from a PreToolUse hook is an agy hook *error*.
342
374
  sys.exit(0)
343
375
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "caddis",
3
- "version": "1.3.77",
3
+ "version": "1.3.83",
4
4
  "description": "caddis — agent-agnostic dev harness as an Antigravity (agy) plugin: TDD skills + commands, single-sourced with the Claude Code plugin."
5
5
  }
@@ -290,12 +290,82 @@ def collect(root: Path, with_tests: bool = False) -> Inventory:
290
290
  if with_tests:
291
291
  # Run it. A handover once claimed 20 tests when there were 19, and the incoming Hub found
292
292
  # the discrepancy before anyone else did.
293
- out = _run([sys.executable, "-m", "pytest", "-q", "--tb=no"], root)
294
- tail = [l for l in out.splitlines() if "passed" in l or "failed" in l]
295
- inv.tests = tail[-1] if tail else "suite did not report a summary — investigate"
293
+ summary, shown = _run_tests(_test_command(root), root)
294
+ # Name the command. "932 passed" means nothing on its own — a reader who cannot see
295
+ # the command cannot tell a scoped run from a whole-tree one, which is exactly the
296
+ # ambiguity that produced this defect.
297
+ inv.tests = f"{summary} _(`{shown}`)_"
296
298
  return inv
297
299
 
298
300
 
301
+
302
+ # Generated/vendored trees hold COPIES of the harness. They have no node_modules and no
303
+ # import path, so collecting them is never right — it only produces collection errors that
304
+ # mask the real result. Excluded by default; `[handover] test_cmd` overrides everything.
305
+ _GENERATED_TREES = ("vscode-extensions", "dist", "node_modules", ".venv")
306
+
307
+ # The suite is the one thing here that is not a directory listing, so it gets its own
308
+ # runner rather than `_run`. Three reasons `_run` is wrong for it:
309
+ # * it returns "" on a non-zero exit — and pytest exits non-zero when tests FAIL, so a
310
+ # genuinely red suite became "did not report a summary", indistinguishable from a
311
+ # broken invocation. A red suite MUST report "3 failed".
312
+ # * its 30s timeout is shorter than a real suite. This repo's takes 112s, so
313
+ # `--with-tests` could never have produced a number here whatever else was fixed.
314
+ # * it discards stderr, where pytest writes collection errors.
315
+ def _run_tests(cmd: list[str], cwd: Path, timeout: int = 900) -> tuple[str, str]:
316
+ """Return ``(summary_line, command_string)``. Never raises."""
317
+ shown = " ".join(cmd[1:]) if cmd and cmd[0] == sys.executable else " ".join(cmd)
318
+ shown = shown.replace("-m pytest", "pytest", 1)
319
+ try:
320
+ r = subprocess.run(cmd, cwd=str(cwd), capture_output=True, text=True,
321
+ encoding="utf-8", errors="replace", timeout=timeout)
322
+ except subprocess.TimeoutExpired:
323
+ return (f"suite exceeded {timeout}s — not run to completion", shown)
324
+ except Exception as exc:
325
+ return (f"could not run the suite ({type(exc).__name__})", shown)
326
+
327
+ blob = (r.stdout or "") + chr(10) + (r.stderr or "")
328
+ # pytest's summary line is the last one naming passed/failed/error.
329
+ tail = [l.strip() for l in blob.splitlines()
330
+ if ("passed" in l or "failed" in l or "error" in l.lower()) and "==" not in l[:2]]
331
+ if tail:
332
+ return (tail[-1], shown)
333
+ return (f"suite did not report a summary (exit {r.returncode}) — investigate", shown)
334
+
335
+
336
+ def _test_command(root: Path) -> list[str]:
337
+ """The repo's test command.
338
+
339
+ A repo's test command is a PROJECT FACT, and this used to guess it. Bare `pytest` is a
340
+ guess that is right in a single-package repo and wrong in any repo carrying a vendored
341
+ or generated tree — which describes caddis itself and every consumer that vendors
342
+ anything. Set `[handover] test_cmd` in `.caddis/config.toml` to state it.
343
+ """
344
+ # In the SHIPPED bundle this file and claudster_config.py are co-located under
345
+ # scripts/. In the source repo they are not: this lives in scripts/, that one in
346
+ # claude-harness/scripts/. Try both, or the config is silently never read — which is
347
+ # how the first version of this fix looked like it worked and did not.
348
+ here = Path(__file__).resolve().parent
349
+ configured = ""
350
+ for cand in (here, here.parent / "claude-harness" / "scripts"):
351
+ try:
352
+ if str(cand) not in sys.path:
353
+ sys.path.insert(0, str(cand))
354
+ import claudster_config as _cc # noqa: E402
355
+ configured = _cc.get_str(_cc.load_config(root, "handover"), "test_cmd", "")
356
+ break
357
+ except Exception:
358
+ continue
359
+ if configured:
360
+ import shlex
361
+ return shlex.split(configured)
362
+ cmd = [sys.executable, "-m", "pytest", "-q", "--tb=no"]
363
+ for name in _GENERATED_TREES:
364
+ if (root / name).exists():
365
+ cmd += ["--ignore", name]
366
+ return cmd
367
+
368
+
299
369
  def _table(rows: list[dict], cols: list[tuple[str, str]]) -> list[str]:
300
370
  head = "| " + " | ".join(c[0] for c in cols) + " |"
301
371
  sep = "|" + "|".join("---" for _ in cols) + "|"
@@ -631,9 +631,31 @@ def install(hosts, dry_run: bool = False) -> int:
631
631
  failures = 0
632
632
  for host in hosts:
633
633
  settings = HOST_SETTINGS[host]
634
- # agy runs its status-line command through cmd.exe on Windows, where a quoted
635
- # path containing spaces breaks. Home is space-free here; keep it native.
636
- command = '%s "%s" --profile %s' % (py, str(INSTALLED_SCRIPT), host)
634
+ # QUOTING DIFFERS BY HOST, and getting it wrong breaks the line silently.
635
+ #
636
+ # Claude Code runs its statusLine command through a SHELL, so a quoted path is
637
+ # correct and a path containing spaces works.
638
+ #
639
+ # agy does NOT. It splits the string itself, so quotes survive as literal path
640
+ # characters and the result is resolved against the session cwd. Observed live
641
+ # 2026-08-27: agy reported it could not open a file whose path was the session
642
+ # cwd with the quoted absolute path appended inside it. The user own working agy
643
+ # line had always been unquoted; mine was not.
644
+ #
645
+ # Consequence to be honest about: an agy install whose home contains a space
646
+ # cannot be expressed this way. Detect it and say so, rather than writing a
647
+ # command that fails at render time with a confusing message.
648
+ target = str(INSTALLED_SCRIPT)
649
+ if host == "agy":
650
+ if " " in target:
651
+ print(" !! agy home path contains a space (%s)." % target)
652
+ print(" agy does not parse statusLine through a shell, so the path")
653
+ print(" cannot be quoted. Wire agy statusLine by hand. Skipped.")
654
+ failures += 1
655
+ continue
656
+ command = "%s %s --profile %s" % (py, target, host)
657
+ else:
658
+ command = '%s "%s" --profile %s' % (py, target, host)
637
659
  try:
638
660
  failures += wire_host(host, settings, command, dry_run)
639
661
  except Exception as exc: # never leave a half-written settings file unexplained
@@ -23,11 +23,6 @@ Config schema (see ``.caddis/config.toml.example``)::
23
23
  page_guide = "UI_PAGE_GUIDE.md"
24
24
  claude_md_budget = 200
25
25
  ignore_routes = ["/health"]
26
-
27
- [dream_memory]
28
- prune_age_days = 14
29
- max_facts = 200
30
- surface_limit = 5
31
26
  """
32
27
 
33
28
  from __future__ import annotations
@@ -8,7 +8,7 @@ they fail open is ``except Exception: pass``, which is wrong: a hook that is bro
8
8
  and a hook that had nothing to say produce the identical result — nothing.
9
9
 
10
10
  There were 20 such swallows across 6 hook files. Each one guards a named feature.
11
- When ``dream_memory``'s surface stops printing, nobody learns that it stopped; they
11
+ When the tidy nudge stops printing, nobody learns that it stopped; they
12
12
  learn that they have not seen it lately, months later, if at all.
13
13
 
14
14
  The fix keeps fail-open and adds a record. ``record()`` never raises, never prints,
@@ -0,0 +1,170 @@
1
+ <#
2
+ .SYNOPSIS
3
+ Set up a new Windows machine with the caddis toolchain, in the right order.
4
+
5
+ .DESCRIPTION
6
+ The ORDER matters, and it is the only thing this script really encodes:
7
+
8
+ 1. Agents first. caddis is a META-installer — `caddis init` detects which agents are
9
+ present and installs into each. An agent installed AFTER it is simply not seen,
10
+ and you get a silent no-op rather than an error.
11
+
12
+ Note the rule is about `caddis init`, NOT about installing the CLI. The npm package
13
+ has no postinstall step; it only puts binaries on PATH. Installing it early is safe.
14
+ 2. caddis CLI second, which brings the model-lane binaries with it.
15
+ 3. Keys and status line last. Both depend on the CLI being on PATH.
16
+
17
+ Fetch this script on a machine that has no caddis yet (the SOURCE repo is private; the
18
+ public mirror is what a new machine can reach):
19
+
20
+ irm https://raw.githubusercontent.com/saajunaid/caddis-plugin/main/plugin/scripts/new-machine.ps1 -OutFile $env:TEMP
21
+ ew-machine.ps1
22
+
23
+ Everything is idempotent: re-running skips what is already correct.
24
+
25
+ This script NEVER installs an agent for you. Each vendor's installer is theirs, changes
26
+ without notice, and may need an interactive login. It checks, reports, and tells you the
27
+ one command to run — then verifies afterwards.
28
+
29
+ .PARAMETER SkipKeys
30
+ Do not run `caddis keys` (which prompts). Use on a machine that only needs Claude.
31
+
32
+ .PARAMETER WhatIf
33
+ Report what would happen; change nothing.
34
+
35
+ .EXAMPLE
36
+ .\new-machine.ps1
37
+ .\new-machine.ps1 -SkipKeys
38
+ #>
39
+ [CmdletBinding(SupportsShouldProcess)]
40
+ param(
41
+ [switch]$SkipKeys
42
+ )
43
+
44
+ $ErrorActionPreference = 'Stop'
45
+ $script:Problems = @()
46
+
47
+ function Step($n, $text) { Write-Host "`n[$n] $text" -ForegroundColor Cyan }
48
+ function Ok($text) { Write-Host " OK $text" -ForegroundColor Green }
49
+ function Missing($text) { Write-Host " TODO $text" -ForegroundColor Yellow }
50
+ function Bad($text) { Write-Host " FAIL $text" -ForegroundColor Red; $script:Problems += $text }
51
+ function Note($text) { Write-Host " $text" -ForegroundColor DarkGray }
52
+
53
+ function Test-Bin($name) { $null -ne (Get-Command $name -ErrorAction SilentlyContinue) }
54
+
55
+ # ── 0. prerequisites ────────────────────────────────────────────────────────────────────
56
+ Step 0 'Prerequisites'
57
+
58
+ foreach ($p in @(
59
+ @{ bin = 'node'; why = 'runs the caddis CLI and every agent installer'; get = 'winget install OpenJS.NodeJS.LTS' },
60
+ @{ bin = 'python'; why = 'runs the caddis hooks and the status line'; get = 'winget install Python.Python.3.12' },
61
+ @{ bin = 'git'; why = 'the status line and most commands read git state'; get = 'winget install Git.Git' }
62
+ )) {
63
+ if (Test-Bin $p.bin) { Ok "$($p.bin) — $($p.why)" }
64
+ else { Bad "$($p.bin) is missing — $($p.why). Install: $($p.get)" }
65
+ }
66
+
67
+ if ($script:Problems.Count -gt 0) {
68
+ Write-Host "`nStopping: the prerequisites above are required before anything else works." -ForegroundColor Red
69
+ exit 1
70
+ }
71
+
72
+ # ── 1. the agents — BEFORE caddis, or caddis cannot see them ────────────────────────────
73
+ Step 1 'Agents (install these BEFORE caddis)'
74
+ Note 'caddis installs INTO an agent. One added later needs a re-run of `caddis init`.'
75
+
76
+ $agents = @(
77
+ @{ bin = 'claude'; name = 'Claude Code'; get = 'npm i -g @anthropic-ai/claude-code'; login = 'claude (log in on first run)' },
78
+ @{ bin = 'agy'; name = 'Antigravity (agy)'; get = 'download from antigravity.google'; login = 'agy (log in on first run)' },
79
+ @{ bin = 'codex'; name = 'Codex'; get = 'npm i -g @openai/codex'; login = 'codex login (INTERACTIVE — a script cannot do this)' }
80
+ )
81
+
82
+ $present = @()
83
+ foreach ($a in $agents) {
84
+ if (Test-Bin $a.bin) {
85
+ $ver = (& $a.bin --version 2>&1 | Select-Object -First 1)
86
+ Ok "$($a.name) — $ver"
87
+ $present += $a.name
88
+ } else {
89
+ Missing "$($a.name) not found. Install: $($a.get)"
90
+ Note "then: $($a.login)"
91
+ }
92
+ }
93
+
94
+ if ($present.Count -eq 0) {
95
+ Write-Host "`nStopping: no agents found, so caddis would install into nothing." -ForegroundColor Red
96
+ exit 1
97
+ }
98
+
99
+ # ── 2. caddis CLI ───────────────────────────────────────────────────────────────────────
100
+ Step 2 'caddis CLI'
101
+ Note 'Brings claude-oss / claude-glm / claude-deepseek onto PATH as well — no profile edit.'
102
+
103
+ if (Test-Bin 'caddis') {
104
+ Ok "caddis CLI present — $(caddis --version 2>&1 | Select-Object -First 1)"
105
+ } elseif ($PSCmdlet.ShouldProcess('npm', 'install -g @caddis/cli')) {
106
+ npm i -g '@caddis/cli'
107
+ if (Test-Bin 'caddis') { Ok 'caddis CLI installed' } else { Bad 'npm reported success but `caddis` is not on PATH — open a new shell and re-run' ; exit 1 }
108
+ }
109
+
110
+ # ── 3. drive each agent ─────────────────────────────────────────────────────────────────
111
+ Step 3 'Install caddis into every detected agent'
112
+ if ($PSCmdlet.ShouldProcess('agents', 'caddis init')) {
113
+ caddis init
114
+ }
115
+
116
+ # ── 4. provider keys ────────────────────────────────────────────────────────────────────
117
+ Step 4 'Provider API keys (GLM / DeepSeek)'
118
+ if ($SkipKeys) {
119
+ Note 'Skipped (-SkipKeys). Run `caddis keys` later to enable the OSS model lanes.'
120
+ } elseif ($PSCmdlet.ShouldProcess('~/.caddis/keys.env', 'caddis keys')) {
121
+ Note 'Prompts per provider, validates against the live endpoint, never prints a key.'
122
+ caddis keys
123
+ }
124
+
125
+ # ── 5. status line ──────────────────────────────────────────────────────────────────────
126
+ Step 5 'Status line (Claude Code + agy, user scope, once per machine)'
127
+ $statusline = Join-Path $HOME '.caddis\statusline.py'
128
+ if (Test-Path $statusline) {
129
+ if ($PSCmdlet.ShouldProcess($statusline, 'install')) { python $statusline --install }
130
+ } else {
131
+ Missing "statusline.py not found at $statusline"
132
+ Note 'It ships with the plugin. Run `/caddis:statusline` in a Claude Code session, or'
133
+ Note 'python PLUGIN_ROOT/scripts/caddis_statusline.py --install'
134
+ }
135
+
136
+ # ── 6. verify ───────────────────────────────────────────────────────────────────────────
137
+ Step 6 'Verify'
138
+
139
+ caddis status
140
+
141
+ if (Test-Path $statusline) {
142
+ python $statusline --check
143
+ }
144
+
145
+ if (-not $SkipKeys -and (Test-Bin 'caddis')) {
146
+ Note 'Validating keys against the live endpoints...'
147
+ caddis keys --check
148
+ }
149
+
150
+ Write-Host "`n-- Per repo, not per machine --" -ForegroundColor Cyan
151
+ Note 'In each project, once: /caddis:setup-project-ai'
152
+ Note 'The status line is deliberately NOT per-repo — one renderer serves every project.'
153
+
154
+ Write-Host "`n-- Known gotchas on this platform --" -ForegroundColor Cyan
155
+ Note 'codex headless: pass -c model_reasoning_effort=low. The default `high` can exceed 300s'
156
+ Note ' on a trivial call.'
157
+ Note '`codex doctor` is NOT an auth check — it validates the auth FILE, not the token, and'
158
+ Note ' reports healthy against a dead one. Real check:'
159
+ Note ' codex exec --skip-git-repo-check -s read-only "Reply OK"'
160
+ Note 'agy statusLine is NOT parsed through a shell, so its path must be UNQUOTED. --install'
161
+ Note ' handles this; if you wire it by hand, do not add quotes.'
162
+ Note 'Codex has NO status line and cannot have one — no status_line key in config.toml and'
163
+ Note ' nothing in `codex --help` (measured on codex-cli 0.150.1). Upstream limit,'
164
+ Note ' not a caddis gap. Two profiles exist because two hosts can call them.'
165
+
166
+ if ($script:Problems.Count -gt 0) {
167
+ Write-Host "`n$($script:Problems.Count) problem(s) above." -ForegroundColor Red
168
+ exit 1
169
+ }
170
+ Write-Host "`nDone." -ForegroundColor Green
@@ -28,7 +28,7 @@ import oss_model # noqa: E402 (same-directory import: shared key resolution)
28
28
  # which holds the Anthropic-protocol endpoints for Claude Code.
29
29
  CHAT_PROVIDERS: dict[str, dict[str, str]] = {
30
30
  "deepseek": {"base_url": "https://api.deepseek.com", "model": "deepseek-v4-flash", "key_env": "DEEPSEEK_API_KEY"},
31
- "glm": {"base_url": "https://api.z.ai/api/coding/paas/v4", "model": "glm-5.2", "key_env": "GLM_API_KEY"},
31
+ "glm": {"base_url": "https://api.z.ai/api/coding/paas/v4", "model": "glm-5.3", "key_env": "GLM_API_KEY"},
32
32
  "openrouter": {"base_url": "https://openrouter.ai/api/v1", "model": "deepseek/deepseek-v4-flash", "key_env": "OPENROUTER_API_KEY"},
33
33
  }
34
34
 
@@ -34,9 +34,17 @@ from pathlib import Path
34
34
  # "openrouter" has no Anthropic-protocol endpoint: it only works through an
35
35
  # Anthropic-compatible gateway (e.g. LiteLLM — see claude-harness/LOCAL-MODELS.md) whose
36
36
  # URL you supply via OSS_BASE_URL.
37
+ # The `[1m]` suffix on a model id is a CLAUDE CODE convention, not part of the model name.
38
+ # Claude Code strips it before calling the API; it only tells the client the real context
39
+ # window. Without it, an id Claude Code does not recognise is assumed to be 200k and
40
+ # auto-compact throws away context the model could still hold. Both providers are 1M
41
+ # (GLM-5.3: docs.z.ai; DeepSeek V4 Flash: 1,048,576 positions) — verified 2026-08-23 by
42
+ # running with and without the suffix and diffing the cap warning.
43
+ # NEVER put this suffix in the OpenAI-dialect tables (oss_review.py / oss_ask.py): those
44
+ # send the id raw to /chat/completions, which would reject it.
37
45
  PROVIDERS: dict[str, dict[str, str]] = {
38
- "deepseek": {"base_url": "https://api.deepseek.com/anthropic", "model": "deepseek-v4-flash", "key_env": "DEEPSEEK_API_KEY"},
39
- "glm": {"base_url": "https://api.z.ai/api/anthropic", "model": "glm-5.2", "key_env": "GLM_API_KEY"},
46
+ "deepseek": {"base_url": "https://api.deepseek.com/anthropic", "model": "deepseek-v4-flash[1m]", "key_env": "DEEPSEEK_API_KEY"},
47
+ "glm": {"base_url": "https://api.z.ai/api/anthropic", "model": "glm-5.3[1m]", "key_env": "GLM_API_KEY"},
40
48
  "openrouter": {"base_url": "", "model": "deepseek/deepseek-v4-flash", "key_env": "OPENROUTER_API_KEY"},
41
49
  }
42
50
  DEFAULT_PROVIDER = "deepseek"
@@ -62,7 +62,7 @@ EXIT_CONFIG = 3
62
62
  # provider (Qwen, a local vLLM, …) is one new row. Callers can always bypass this via env/flags.
63
63
  PROVIDERS: dict[str, dict[str, str]] = {
64
64
  "deepseek": {"base_url": "https://api.deepseek.com", "model": "deepseek-v4-flash"},
65
- "glm": {"base_url": "https://api.z.ai/api/coding/paas/v4", "model": "glm-5.2"},
65
+ "glm": {"base_url": "https://api.z.ai/api/coding/paas/v4", "model": "glm-5.3"},
66
66
  "openrouter": {"base_url": "https://openrouter.ai/api/v1", "model": "deepseek/deepseek-v4-flash"},
67
67
  }
68
68
  DEFAULT_PROVIDER = "deepseek"
@@ -941,11 +941,14 @@ allow = [
941
941
  # # accepted back-compat alias for this key.
942
942
  # ignore_routes = ["/health", "/__internal"] # routes intentionally left out of the page guide
943
943
 
944
- # ── [dream_memory] — short-term fact store (scripts/dream_memory.py) ── LIVE ──
945
- # [dream_memory]
946
- # prune_age_days = 14 # single-hit facts older than this decay out
947
- # max_facts = 200 # hard cap on the store
948
- # surface_limit = 5 # how many facts SessionStart prints
944
+ # ── [handover] — what /caddis:handoff measures (scripts/caddis_inventory.py) ── LIVE ──
945
+ # [handover]
946
+ # test_cmd = "pytest tests/ -q" # THIS REPO'S test command. Without it the inventory
947
+ # # guesses `pytest` at the root, which is right in a
948
+ # # single-package repo and wrong in any repo carrying a
949
+ # # vendored or generated tree. Generated trees
950
+ # # (vscode-extensions/, dist/, node_modules/, .venv/) are
951
+ # # excluded automatically; set this when that is not enough.
949
952
  """
950
953
 
951
954
 
@@ -1132,7 +1135,7 @@ def scaffold_artifact_dir(target: Path, dry: bool) -> list[str]:
1132
1135
  is gitignored. .caddis/ is the default home for every working-artifact kind (Track A
1133
1136
  Phase A3) — kb/ and prompts/ round out plans/prd/agent-docs/reviews so nothing has to
1134
1137
  scatter to the repo root or .github/. Also drops a documented `config.toml.example`
1135
- (guard/doc_coverage/dream_memory). Idempotent; never clobbers an existing .gitignore or
1138
+ (guard/doc_coverage). Idempotent; never clobbers an existing .gitignore or
1136
1139
  config example.
1137
1140
 
1138
1141
  Writes into the repo's `.caddis/`.