@caddis/cli 0.2.6 → 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 (265) hide show
  1. package/bundles/antigravity-plugin/agents/claude-md-curator.md +1 -1
  2. package/bundles/antigravity-plugin/agents/knowledge-transfer.md +17 -32
  3. package/bundles/antigravity-plugin/caddis_statusline.py +825 -0
  4. package/bundles/antigravity-plugin/claude-md/folder-agents.md.tmpl +21 -0
  5. package/bundles/antigravity-plugin/guard_agy.py +60 -9
  6. package/bundles/antigravity-plugin/plugin.json +1 -1
  7. package/bundles/antigravity-plugin/scripts/caddis_gate.py +524 -0
  8. package/bundles/antigravity-plugin/scripts/caddis_inventory.py +439 -0
  9. package/bundles/antigravity-plugin/scripts/caddis_migrate_dir.py +270 -0
  10. package/bundles/antigravity-plugin/scripts/caddis_spawn.py +300 -0
  11. package/bundles/antigravity-plugin/scripts/caddis_statusline.py +825 -0
  12. package/bundles/antigravity-plugin/scripts/caddis_tidy.py +366 -0
  13. package/bundles/antigravity-plugin/scripts/check_doc_coverage.py +924 -0
  14. package/bundles/antigravity-plugin/scripts/claude-deepseek.ps1 +4 -0
  15. package/bundles/antigravity-plugin/scripts/claude-deepseek.sh +3 -0
  16. package/bundles/antigravity-plugin/scripts/claude-glm.ps1 +4 -0
  17. package/bundles/antigravity-plugin/scripts/claude-glm.sh +3 -0
  18. package/bundles/antigravity-plugin/scripts/claude-oss.ps1 +64 -0
  19. package/bundles/antigravity-plugin/scripts/claude-oss.sh +60 -0
  20. package/bundles/antigravity-plugin/scripts/claudster_config.py +121 -0
  21. package/bundles/antigravity-plugin/scripts/claudster_doctor.py +356 -0
  22. package/bundles/antigravity-plugin/scripts/claudster_init.py +400 -0
  23. package/bundles/antigravity-plugin/scripts/claudster_migrate_rules.py +300 -0
  24. package/bundles/antigravity-plugin/scripts/enforcement_inventory.py +261 -0
  25. package/bundles/antigravity-plugin/scripts/hook_log.py +156 -0
  26. package/bundles/antigravity-plugin/scripts/new-machine.ps1 +170 -0
  27. package/bundles/antigravity-plugin/scripts/oss_ask.py +98 -0
  28. package/bundles/antigravity-plugin/scripts/oss_model.py +174 -0
  29. package/bundles/antigravity-plugin/scripts/oss_review.py +718 -0
  30. package/bundles/antigravity-plugin/scripts/setup_project_ai.py +1432 -0
  31. package/bundles/antigravity-plugin/scripts/usage_review.py +1323 -0
  32. package/bundles/antigravity-plugin/session_end_agy.py +52 -8
  33. package/bundles/antigravity-plugin/skills/_registry.md +1 -0
  34. package/bundles/antigravity-plugin/skills/advisory-hub/SKILL.md +44 -0
  35. package/bundles/antigravity-plugin/skills/code-review/SKILL.md +11 -0
  36. package/bundles/antigravity-plugin/skills/fastapi-dev/SKILL.md +1 -1
  37. package/bundles/antigravity-plugin/skills/feature-plan/SKILL.md +21 -0
  38. package/bundles/antigravity-plugin/skills/gate-review/SKILL.md +11 -0
  39. package/bundles/antigravity-plugin/skills/implement/SKILL.md +36 -0
  40. package/bundles/antigravity-plugin/skills/security-review/SKILL.md +9 -0
  41. package/bundles/antigravity-plugin/skills/ship/SKILL.md +1 -1
  42. package/bundles/antigravity-plugin/skills/ship-merge/SKILL.md +1 -1
  43. package/bundles/antigravity-plugin/skills/ship-pr/SKILL.md +1 -1
  44. package/bundles/antigravity-plugin/skills/statusline/SKILL.md +105 -0
  45. package/bundles/antigravity-plugin/skills/use-model/SKILL.md +15 -3
  46. package/bundles/antigravity-plugin/skills/validate-phase/SKILL.md +31 -0
  47. package/bundles/antigravity-plugin/warm_start_agy.py +117 -11
  48. package/bundles/antigravity-plugin-extras/plugin.json +1 -1
  49. package/bundles/antigravity-plugin-extras/skills/architecture-design/SKILL.md +1 -1
  50. package/bundles/antigravity-plugin-extras/skills/caching-patterns/SKILL.md +1 -1
  51. package/bundles/antigravity-plugin-extras/skills/webapp-development/SKILL.md +1 -1
  52. package/bundles/codex/.codex/config.toml.example +36 -0
  53. package/bundles/codex/.codex/skills/coding/api-design/SKILL.md +249 -0
  54. package/bundles/codex/.codex/skills/coding/backend-development/SKILL.md +305 -0
  55. package/bundles/codex/.codex/skills/coding/code-review/SKILL.md +140 -0
  56. package/bundles/codex/.codex/skills/coding/codebase-audit/SKILL.md +204 -0
  57. package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/SKILL.md +132 -0
  58. package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/scripts/perf_sweep.py +249 -0
  59. package/bundles/codex/.codex/skills/coding/error-handling/SKILL.md +260 -0
  60. package/bundles/codex/.codex/skills/coding/fastapi-dev/SKILL.md +300 -0
  61. package/bundles/codex/.codex/skills/coding/javascript-typescript/SKILL.md +142 -0
  62. package/bundles/codex/.codex/skills/coding/python/SKILL.md +388 -0
  63. package/bundles/codex/.codex/skills/coding/refactoring/SKILL.md +486 -0
  64. package/bundles/codex/.codex/skills/coding/security-review/SKILL.md +205 -0
  65. package/bundles/codex/.codex/skills/coding/sql/SKILL.md +321 -0
  66. package/bundles/codex/.codex/skills/data/database-design/SKILL.md +177 -0
  67. package/bundles/codex/.codex/skills/data/db-diagram/SKILL.md +148 -0
  68. package/bundles/codex/.codex/skills/data/db-diagram/scripts/sql_to_graph.py +1212 -0
  69. package/bundles/codex/.codex/skills/devops/ci-cd-pipeline/SKILL.md +315 -0
  70. package/bundles/codex/.codex/skills/devops/gh-cli/SKILL.md +195 -0
  71. package/bundles/codex/.codex/skills/devops/git-commit/SKILL.md +285 -0
  72. package/bundles/codex/.codex/skills/devops/using-git-worktrees/SKILL.md +217 -0
  73. package/bundles/codex/.codex/skills/devops/windows-deployment/SKILL.md +880 -0
  74. package/bundles/codex/.codex/skills/docs/code-documentation/SKILL.md +271 -0
  75. package/bundles/codex/.codex/skills/docs/explainer-doc/SKILL.md +97 -0
  76. package/bundles/codex/.codex/skills/docs/technical-writing/SKILL.md +286 -0
  77. package/bundles/codex/.codex/skills/docs/writing-plans/SKILL.md +387 -0
  78. package/bundles/codex/.codex/skills/frontend/css-architecture/SKILL.md +305 -0
  79. package/bundles/codex/.codex/skills/frontend/css-architecture/references/RESPONSIVE-DESIGN.md +604 -0
  80. package/bundles/codex/.codex/skills/frontend/frontend-design/SKILL.md +193 -0
  81. package/bundles/codex/.codex/skills/frontend/frontend-design/references/my-tech-stack.md +127 -0
  82. package/bundles/codex/.codex/skills/frontend/mockup/SKILL.md +242 -0
  83. package/bundles/codex/.codex/skills/frontend/react-best-practices/SKILL.md +269 -0
  84. package/bundles/codex/.codex/skills/frontend/react-dev/README.md +404 -0
  85. package/bundles/codex/.codex/skills/frontend/react-dev/SKILL.md +459 -0
  86. package/bundles/codex/.codex/skills/frontend/react-dev/examples/generic-components.md +579 -0
  87. package/bundles/codex/.codex/skills/frontend/react-dev/examples/server-components.md +579 -0
  88. package/bundles/codex/.codex/skills/frontend/react-dev/references/event-handlers.md +574 -0
  89. package/bundles/codex/.codex/skills/frontend/react-dev/references/hooks.md +456 -0
  90. package/bundles/codex/.codex/skills/frontend/react-dev/references/react-19-patterns.md +638 -0
  91. package/bundles/codex/.codex/skills/frontend/react-dev/references/react-router.md +1002 -0
  92. package/bundles/codex/.codex/skills/frontend/react-dev/references/tanstack-router.md +587 -0
  93. package/bundles/codex/.codex/skills/frontend/ui-review/SKILL.md +176 -0
  94. package/bundles/codex/.codex/skills/frontend/ui-review/references/framework-fixes.md +471 -0
  95. package/bundles/codex/.codex/skills/frontend/ui-review/references/visual-checklist.md +236 -0
  96. package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/DESIGN_TOKENS.md +487 -0
  97. package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/IMPLEMENTATION_GUIDE.md +177 -0
  98. package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/SKILL.md +732 -0
  99. package/bundles/codex/.codex/skills/media/draw-io/SKILL.md +162 -0
  100. package/bundles/codex/.codex/skills/media/draw-io/references/aws-icons.md +677 -0
  101. package/bundles/codex/.codex/skills/media/draw-io/references/layout-guidelines.md +142 -0
  102. package/bundles/codex/.codex/skills/media/draw-io/references/troubleshooting.md +118 -0
  103. package/bundles/codex/.codex/skills/media/draw-io/references/workflows.md +103 -0
  104. package/bundles/codex/.codex/skills/media/draw-io/scripts/convert-drawio-to-png.sh +25 -0
  105. package/bundles/codex/.codex/skills/media/draw-io/scripts/find_aws_icon.py +79 -0
  106. package/bundles/codex/.codex/skills/media/mermaid-diagrams/SKILL.md +292 -0
  107. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/ENHANCEMENTS.md +264 -0
  108. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/MERMAID-SUMMARY.md +137 -0
  109. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/advanced-features.md +556 -0
  110. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/architecture-diagrams.md +192 -0
  111. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/c4-diagrams.md +410 -0
  112. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/class-diagrams.md +361 -0
  113. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/erd-diagrams.md +510 -0
  114. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/flowcharts.md +450 -0
  115. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/sequence-diagrams.md +394 -0
  116. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/troubleshooting.md +335 -0
  117. package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/workflows.md +418 -0
  118. package/bundles/codex/.codex/skills/media/particle-art/SKILL.md +243 -0
  119. package/bundles/codex/.codex/skills/media/particle-art/references/canvas-utils.ts +171 -0
  120. package/bundles/codex/.codex/skills/media/particle-art/references/dot-field.template.tsx +203 -0
  121. package/bundles/codex/.codex/skills/media/particle-art/references/flow-field.template.tsx +263 -0
  122. package/bundles/codex/.codex/skills/media/particle-art/references/node-shape.template.tsx +261 -0
  123. package/bundles/codex/.codex/skills/media/particle-art/references/shape-sampler.ts +281 -0
  124. package/bundles/codex/.codex/skills/media/particle-art/references/stipple-morph.template.tsx +167 -0
  125. package/bundles/codex/.codex/skills/media/particle-art/references/stipple.template.tsx +175 -0
  126. package/bundles/codex/.codex/skills/media/particle-art/references/trail-ghost.template.tsx +266 -0
  127. package/bundles/codex/.codex/skills/media/particle-art/references/usage-examples.md +320 -0
  128. package/bundles/codex/.codex/skills/testing/playwright/API_REFERENCE.md +653 -0
  129. package/bundles/codex/.codex/skills/testing/playwright/SKILL.md +454 -0
  130. package/bundles/codex/.codex/skills/testing/playwright/lib/helpers.js +441 -0
  131. package/bundles/codex/.codex/skills/testing/playwright/package.json +26 -0
  132. package/bundles/codex/.codex/skills/testing/playwright/run.js +228 -0
  133. package/bundles/codex/.codex/skills/testing/tdd-workflow/SKILL.md +188 -0
  134. package/bundles/codex/.codex/skills/testing/test-strategy/SKILL.md +155 -0
  135. package/bundles/codex/.codex/skills/testing/webapp-testing/LICENSE.txt +202 -0
  136. package/bundles/codex/.codex/skills/testing/webapp-testing/SKILL.md +97 -0
  137. package/bundles/codex/.codex/skills/testing/webapp-testing/examples/console_logging.py +35 -0
  138. package/bundles/codex/.codex/skills/testing/webapp-testing/examples/element_discovery.py +40 -0
  139. package/bundles/codex/.codex/skills/testing/webapp-testing/examples/static_html_automation.py +33 -0
  140. package/bundles/codex/.codex/skills/testing/webapp-testing/scripts/with_server.py +106 -0
  141. package/bundles/codex/.codex/skills/workflow/advisory-hub/SKILL.md +227 -0
  142. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/context-template.md +214 -0
  143. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/hub-handbook.md +233 -0
  144. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/report-contract.md +94 -0
  145. package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/succession.md +118 -0
  146. package/bundles/codex/.codex/skills/workflow/best-practices/SKILL.md +500 -0
  147. package/bundles/codex/.codex/skills/workflow/best-practices/agents/best-practices-referencer.md +263 -0
  148. package/bundles/codex/.codex/skills/workflow/best-practices/agents/codebase-context-builder.md +326 -0
  149. package/bundles/codex/.codex/skills/workflow/best-practices/agents/task-intent-analyzer.md +245 -0
  150. package/bundles/codex/.codex/skills/workflow/best-practices/references/anti-patterns.md +571 -0
  151. package/bundles/codex/.codex/skills/workflow/best-practices/references/before-after-examples.md +1114 -0
  152. package/bundles/codex/.codex/skills/workflow/best-practices/references/best-practices-guide.md +513 -0
  153. package/bundles/codex/.codex/skills/workflow/best-practices/references/common-workflows.md +692 -0
  154. package/bundles/codex/.codex/skills/workflow/best-practices/references/prompt-patterns.md +547 -0
  155. package/bundles/codex/.codex/skills/workflow/brainstorming/SKILL.md +57 -0
  156. package/bundles/codex/.codex/skills/workflow/context-curator/SKILL.md +157 -0
  157. package/bundles/codex/.codex/skills/workflow/golden-plan/SKILL.md +586 -0
  158. package/bundles/codex/.codex/skills/workflow/preflight/SKILL.md +440 -0
  159. package/bundles/codex/.codex/skills/workflow/skill-creator/LICENSE.txt +202 -0
  160. package/bundles/codex/.codex/skills/workflow/skill-creator/SKILL.md +491 -0
  161. package/bundles/codex/.codex/skills/workflow/skill-creator/agents/analyzer.md +274 -0
  162. package/bundles/codex/.codex/skills/workflow/skill-creator/agents/comparator.md +202 -0
  163. package/bundles/codex/.codex/skills/workflow/skill-creator/agents/grader.md +223 -0
  164. package/bundles/codex/.codex/skills/workflow/skill-creator/assets/eval_review.html +146 -0
  165. package/bundles/codex/.codex/skills/workflow/skill-creator/eval-viewer/generate_review.py +471 -0
  166. package/bundles/codex/.codex/skills/workflow/skill-creator/eval-viewer/viewer.html +1325 -0
  167. package/bundles/codex/.codex/skills/workflow/skill-creator/references/schemas.md +430 -0
  168. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/__init__.py +0 -0
  169. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/aggregate_benchmark.py +401 -0
  170. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/generate_report.py +326 -0
  171. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/improve_description.py +247 -0
  172. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/package_skill.py +136 -0
  173. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/quick_validate.py +103 -0
  174. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/run_eval.py +310 -0
  175. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/run_loop.py +328 -0
  176. package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/utils.py +47 -0
  177. package/bundles/codex/AGENTS.md +146 -0
  178. package/bundles/manifest.json +4 -3
  179. package/dist/claude-deepseek.js +544 -0
  180. package/dist/claude-glm.js +544 -0
  181. package/dist/claude-oss.js +544 -0
  182. package/dist/cli.js +542 -90
  183. package/package.json +5 -2
  184. package/bundles/antigravity-plugin/statusline-command-agy.sh +0 -91
  185. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  186. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  187. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  188. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  189. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  190. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  191. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  192. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  193. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  194. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  195. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  196. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  197. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  198. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  199. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  200. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  201. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  202. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  203. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  204. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  205. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  206. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  207. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  208. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  209. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  210. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  211. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  212. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  213. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  214. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  215. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  216. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  217. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  218. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  219. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  220. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  221. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  222. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  223. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  224. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  225. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  226. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  227. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  228. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  229. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  230. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  231. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  232. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  233. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  234. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  235. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  236. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  237. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  238. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  239. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  240. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  241. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  242. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  243. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  244. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  245. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  246. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  247. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  248. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  249. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  250. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  251. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  252. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  253. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  254. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  255. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  256. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  257. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  258. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  259. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  260. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  261. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  262. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  263. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  264. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  265. package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
package/dist/cli.js CHANGED
@@ -2419,8 +2419,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
2419
2419
  if (index < this.args.length) {
2420
2420
  value = this.args.slice(index);
2421
2421
  if (declaredArg.parseArg) {
2422
- value = value.reduce((processed, v) => {
2423
- return myParseArg(declaredArg, v, processed);
2422
+ value = value.reduce((processed, v2) => {
2423
+ return myParseArg(declaredArg, v2, processed);
2424
2424
  }, declaredArg.defaultValue);
2425
2425
  }
2426
2426
  } else if (value === void 0) {
@@ -3596,7 +3596,7 @@ var require_index_min = __commonJS({
3596
3596
  "use strict";
3597
3597
  Object.defineProperty(h2, "__esModule", { value: true });
3598
3598
  });
3599
- var v = exports && exports.__createBinding || (Object.create ? (function(t, e2, r2, s) {
3599
+ var v2 = exports && exports.__createBinding || (Object.create ? (function(t, e2, r2, s) {
3600
3600
  s === void 0 && (s = r2);
3601
3601
  var n = Object.getOwnPropertyDescriptor(e2, r2);
3602
3602
  (!n || ("get" in n ? !e2.__esModule : n.writable || n.configurable)) && (n = { enumerable: true, get: function() {
@@ -3621,12 +3621,12 @@ var require_index_min = __commonJS({
3621
3621
  return function(e2) {
3622
3622
  if (e2 && e2.__esModule) return e2;
3623
3623
  var r2 = {};
3624
- if (e2 != null) for (var s = t(e2), n = 0; n < s.length; n++) s[n] !== "default" && v(r2, e2, s[n]);
3624
+ if (e2 != null) for (var s = t(e2), n = 0; n < s.length; n++) s[n] !== "default" && v2(r2, e2, s[n]);
3625
3625
  return G2(r2, e2), r2;
3626
3626
  };
3627
3627
  })();
3628
3628
  var X2 = exports && exports.__exportStar || function(t, e2) {
3629
- for (var r2 in t) r2 !== "default" && !Object.prototype.hasOwnProperty.call(e2, r2) && v(e2, t, r2);
3629
+ for (var r2 in t) r2 !== "default" && !Object.prototype.hasOwnProperty.call(e2, r2) && v2(e2, t, r2);
3630
3630
  };
3631
3631
  Object.defineProperty(exports, "__esModule", { value: true });
3632
3632
  exports.sync = exports.isexe = exports.posix = exports.win32 = void 0;
@@ -3647,7 +3647,7 @@ var require_lib = __commonJS({
3647
3647
  "node_modules/which/lib/index.js"(exports, module) {
3648
3648
  "use strict";
3649
3649
  var { isexe, sync: isexeSync } = require_index_min();
3650
- var { join, delimiter, sep, posix } = __require("path");
3650
+ var { join: join2, delimiter, sep, posix } = __require("path");
3651
3651
  var isWindows = process.platform === "win32";
3652
3652
  var rSlash = new RegExp(`[${posix.sep}${sep === posix.sep ? "" : sep}]`.replace(/(\\)/g, "\\$1"));
3653
3653
  var rRel = new RegExp(`^\\.${rSlash.source}`);
@@ -3676,7 +3676,7 @@ var require_lib = __commonJS({
3676
3676
  var getPathPart = (raw, cmd) => {
3677
3677
  const pathPart = /^".*"$/.test(raw) ? raw.slice(1, -1) : raw;
3678
3678
  const prefix = !pathPart && rRel.test(cmd) ? cmd.slice(0, 2) : "";
3679
- return prefix + join(pathPart, cmd);
3679
+ return prefix + join2(pathPart, cmd);
3680
3680
  };
3681
3681
  var which = async (cmd, opt = {}) => {
3682
3682
  const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt);
@@ -3764,8 +3764,11 @@ function packageInfo() {
3764
3764
  cached = { root, name: parsed.name, version: parsed.version };
3765
3765
  return cached;
3766
3766
  }
3767
- function bundlePath(name) {
3767
+ function bundlePath(name, options = {}) {
3768
+ const { requireManifest = true } = options;
3768
3769
  const dir = path.join(packageInfo().root, "bundles", name);
3770
+ if (!existsSync(dir)) return null;
3771
+ if (!requireManifest) return dir;
3769
3772
  return existsSync(path.join(dir, "plugin.json")) ? dir : null;
3770
3773
  }
3771
3774
  function bundleManifest() {
@@ -4087,11 +4090,12 @@ function fD({ input: e2 = j, output: u2 = M, overwrite: t = true, hideCursor: F2
4087
4090
  e2.off("keypress", i), F2 && u2.write(import_sisteransi.cursor.show), e2.isTTY && !AD && e2.setRawMode(false), s.terminal = false, s.close();
4088
4091
  };
4089
4092
  }
4090
- var import_sisteransi, uD, W, tD, eD, FD, sD, w, N, I, R, r, iD, CD, ED, d, oD, y, V, nD, G, _, z, K, aD, k, hD, lD, xD, B, AD, S, gD, vD, h, x, dD, A;
4093
+ var import_sisteransi, import_picocolors2, uD, W, tD, eD, FD, sD, w, N, I, R, r, iD, CD, ED, d, oD, y, V, nD, G, _, z, K, aD, k, hD, lD, xD, B, AD, S, gD, vD, h, x, dD, A, TD, jD, U, MD;
4091
4094
  var init_dist = __esm({
4092
4095
  "node_modules/@clack/core/dist/index.mjs"() {
4093
4096
  "use strict";
4094
4097
  import_sisteransi = __toESM(require_src(), 1);
4098
+ import_picocolors2 = __toESM(require_picocolors(), 1);
4095
4099
  uD = DD();
4096
4100
  W = { exports: {} };
4097
4101
  (function(e2) {
@@ -4324,6 +4328,28 @@ var init_dist = __esm({
4324
4328
  }
4325
4329
  };
4326
4330
  A = /* @__PURE__ */ new WeakMap();
4331
+ TD = Object.defineProperty;
4332
+ jD = (e2, u2, t) => u2 in e2 ? TD(e2, u2, { enumerable: true, configurable: true, writable: true, value: t }) : e2[u2] = t;
4333
+ U = (e2, u2, t) => (jD(e2, typeof u2 != "symbol" ? u2 + "" : u2, t), t);
4334
+ MD = class extends x {
4335
+ constructor({ mask: u2, ...t }) {
4336
+ super(t), U(this, "valueWithCursor", ""), U(this, "_mask", "\u2022"), this._mask = u2 ?? "\u2022", this.on("finalize", () => {
4337
+ this.valueWithCursor = this.masked;
4338
+ }), this.on("value", () => {
4339
+ if (this.cursor >= this.value.length) this.valueWithCursor = `${this.masked}${import_picocolors2.default.inverse(import_picocolors2.default.hidden("_"))}`;
4340
+ else {
4341
+ const F2 = this.masked.slice(0, this.cursor), s = this.masked.slice(this.cursor);
4342
+ this.valueWithCursor = `${F2}${import_picocolors2.default.inverse(s[0])}${s.slice(1)}`;
4343
+ }
4344
+ });
4345
+ }
4346
+ get cursor() {
4347
+ return this._cursor;
4348
+ }
4349
+ get masked() {
4350
+ return this.value.replaceAll(/./g, this._mask);
4351
+ }
4352
+ };
4327
4353
  }
4328
4354
  });
4329
4355
 
@@ -4333,13 +4359,13 @@ import y2 from "process";
4333
4359
  function ce() {
4334
4360
  return y2.platform !== "win32" ? y2.env.TERM !== "linux" : !!y2.env.CI || !!y2.env.WT_SESSION || !!y2.env.TERMINUS_SUBLIME || y2.env.ConEmuTask === "{cmd::Cmder}" || y2.env.TERM_PROGRAM === "Terminus-Sublime" || y2.env.TERM_PROGRAM === "vscode" || y2.env.TERM === "xterm-256color" || y2.env.TERM === "alacritty" || y2.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
4335
4361
  }
4336
- var import_picocolors2, import_sisteransi2, V2, u, le, L2, W2, C, ue, o, d2, k2, P2, A2, T, F, $e, _2, me, de, pe, q, D, U, K2, b2, ye, xe, Ie, Se, J, Y2;
4362
+ var import_picocolors3, import_sisteransi2, V2, u, le, L2, W2, C, ue, o, d2, k2, P2, A2, T, F, $e, _2, me, de, pe, q, D, U2, K2, b2, ge, ye, xe, Ie, Se, J, Y2;
4337
4363
  var init_dist2 = __esm({
4338
4364
  "node_modules/@clack/prompts/dist/index.mjs"() {
4339
4365
  "use strict";
4340
4366
  init_dist();
4341
4367
  init_dist();
4342
- import_picocolors2 = __toESM(require_picocolors(), 1);
4368
+ import_picocolors3 = __toESM(require_picocolors(), 1);
4343
4369
  import_sisteransi2 = __toESM(require_src(), 1);
4344
4370
  V2 = ce();
4345
4371
  u = (t, n) => V2 ? t : n;
@@ -4362,66 +4388,87 @@ var init_dist2 = __esm({
4362
4388
  pe = u("\u256F", "+");
4363
4389
  q = u("\u25CF", "\u2022");
4364
4390
  D = u("\u25C6", "*");
4365
- U = u("\u25B2", "!");
4391
+ U2 = u("\u25B2", "!");
4366
4392
  K2 = u("\u25A0", "x");
4367
4393
  b2 = (t) => {
4368
4394
  switch (t) {
4369
4395
  case "initial":
4370
4396
  case "active":
4371
- return import_picocolors2.default.cyan(le);
4397
+ return import_picocolors3.default.cyan(le);
4372
4398
  case "cancel":
4373
- return import_picocolors2.default.red(L2);
4399
+ return import_picocolors3.default.red(L2);
4374
4400
  case "error":
4375
- return import_picocolors2.default.yellow(W2);
4401
+ return import_picocolors3.default.yellow(W2);
4376
4402
  case "submit":
4377
- return import_picocolors2.default.green(C);
4403
+ return import_picocolors3.default.green(C);
4378
4404
  }
4379
4405
  };
4406
+ ge = (t) => new MD({ validate: t.validate, mask: t.mask ?? $e, render() {
4407
+ const n = `${import_picocolors3.default.gray(o)}
4408
+ ${b2(this.state)} ${t.message}
4409
+ `, r2 = this.valueWithCursor, i = this.masked;
4410
+ switch (this.state) {
4411
+ case "error":
4412
+ return `${n.trim()}
4413
+ ${import_picocolors3.default.yellow(o)} ${i}
4414
+ ${import_picocolors3.default.yellow(d2)} ${import_picocolors3.default.yellow(this.error)}
4415
+ `;
4416
+ case "submit":
4417
+ return `${n}${import_picocolors3.default.gray(o)} ${import_picocolors3.default.dim(i)}`;
4418
+ case "cancel":
4419
+ return `${n}${import_picocolors3.default.gray(o)} ${import_picocolors3.default.strikethrough(import_picocolors3.default.dim(i ?? ""))}${i ? `
4420
+ ${import_picocolors3.default.gray(o)}` : ""}`;
4421
+ default:
4422
+ return `${n}${import_picocolors3.default.cyan(o)} ${r2}
4423
+ ${import_picocolors3.default.cyan(d2)}
4424
+ `;
4425
+ }
4426
+ } }).prompt();
4380
4427
  ye = (t) => {
4381
4428
  const n = t.active ?? "Yes", r2 = t.inactive ?? "No";
4382
4429
  return new dD({ active: n, inactive: r2, initialValue: t.initialValue ?? true, render() {
4383
- const i = `${import_picocolors2.default.gray(o)}
4430
+ const i = `${import_picocolors3.default.gray(o)}
4384
4431
  ${b2(this.state)} ${t.message}
4385
4432
  `, s = this.value ? n : r2;
4386
4433
  switch (this.state) {
4387
4434
  case "submit":
4388
- return `${i}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.dim(s)}`;
4435
+ return `${i}${import_picocolors3.default.gray(o)} ${import_picocolors3.default.dim(s)}`;
4389
4436
  case "cancel":
4390
- return `${i}${import_picocolors2.default.gray(o)} ${import_picocolors2.default.strikethrough(import_picocolors2.default.dim(s))}
4391
- ${import_picocolors2.default.gray(o)}`;
4437
+ return `${i}${import_picocolors3.default.gray(o)} ${import_picocolors3.default.strikethrough(import_picocolors3.default.dim(s))}
4438
+ ${import_picocolors3.default.gray(o)}`;
4392
4439
  default:
4393
- return `${i}${import_picocolors2.default.cyan(o)} ${this.value ? `${import_picocolors2.default.green(k2)} ${n}` : `${import_picocolors2.default.dim(P2)} ${import_picocolors2.default.dim(n)}`} ${import_picocolors2.default.dim("/")} ${this.value ? `${import_picocolors2.default.dim(P2)} ${import_picocolors2.default.dim(r2)}` : `${import_picocolors2.default.green(k2)} ${r2}`}
4394
- ${import_picocolors2.default.cyan(d2)}
4440
+ return `${i}${import_picocolors3.default.cyan(o)} ${this.value ? `${import_picocolors3.default.green(k2)} ${n}` : `${import_picocolors3.default.dim(P2)} ${import_picocolors3.default.dim(n)}`} ${import_picocolors3.default.dim("/")} ${this.value ? `${import_picocolors3.default.dim(P2)} ${import_picocolors3.default.dim(r2)}` : `${import_picocolors3.default.green(k2)} ${r2}`}
4441
+ ${import_picocolors3.default.cyan(d2)}
4395
4442
  `;
4396
4443
  }
4397
4444
  } }).prompt();
4398
4445
  };
4399
4446
  xe = (t = "") => {
4400
- process.stdout.write(`${import_picocolors2.default.gray(d2)} ${import_picocolors2.default.red(t)}
4447
+ process.stdout.write(`${import_picocolors3.default.gray(d2)} ${import_picocolors3.default.red(t)}
4401
4448
 
4402
4449
  `);
4403
4450
  };
4404
4451
  Ie = (t = "") => {
4405
- process.stdout.write(`${import_picocolors2.default.gray(ue)} ${t}
4452
+ process.stdout.write(`${import_picocolors3.default.gray(ue)} ${t}
4406
4453
  `);
4407
4454
  };
4408
4455
  Se = (t = "") => {
4409
- process.stdout.write(`${import_picocolors2.default.gray(o)}
4410
- ${import_picocolors2.default.gray(d2)} ${t}
4456
+ process.stdout.write(`${import_picocolors3.default.gray(o)}
4457
+ ${import_picocolors3.default.gray(d2)} ${t}
4411
4458
 
4412
4459
  `);
4413
4460
  };
4414
- J = `${import_picocolors2.default.gray(o)} `;
4461
+ J = `${import_picocolors3.default.gray(o)} `;
4415
4462
  Y2 = ({ indicator: t = "dots" } = {}) => {
4416
4463
  const n = V2 ? ["\u25D2", "\u25D0", "\u25D3", "\u25D1"] : ["\u2022", "o", "O", "0"], r2 = V2 ? 80 : 120, i = process.env.CI === "true";
4417
4464
  let s, c, a = false, l2 = "", $2, g2 = performance.now();
4418
4465
  const p2 = (m2) => {
4419
4466
  const h2 = m2 > 1 ? "Something went wrong" : "Canceled";
4420
4467
  a && N2(h2, m2);
4421
- }, v = () => p2(2), f = () => p2(1), j2 = () => {
4422
- process.on("uncaughtExceptionMonitor", v), process.on("unhandledRejection", v), process.on("SIGINT", f), process.on("SIGTERM", f), process.on("exit", p2);
4468
+ }, v2 = () => p2(2), f = () => p2(1), j2 = () => {
4469
+ process.on("uncaughtExceptionMonitor", v2), process.on("unhandledRejection", v2), process.on("SIGINT", f), process.on("SIGTERM", f), process.on("exit", p2);
4423
4470
  }, E = () => {
4424
- process.removeListener("uncaughtExceptionMonitor", v), process.removeListener("unhandledRejection", v), process.removeListener("SIGINT", f), process.removeListener("SIGTERM", f), process.removeListener("exit", p2);
4471
+ process.removeListener("uncaughtExceptionMonitor", v2), process.removeListener("unhandledRejection", v2), process.removeListener("SIGINT", f), process.removeListener("SIGTERM", f), process.removeListener("exit", p2);
4425
4472
  }, B2 = () => {
4426
4473
  if ($2 === void 0) return;
4427
4474
  i && process.stdout.write(`
@@ -4433,13 +4480,13 @@ ${import_picocolors2.default.gray(d2)} ${t}
4433
4480
  const h2 = (performance.now() - m2) / 1e3, w2 = Math.floor(h2 / 60), I2 = Math.floor(h2 % 60);
4434
4481
  return w2 > 0 ? `[${w2}m ${I2}s]` : `[${I2}s]`;
4435
4482
  }, H = (m2 = "") => {
4436
- a = true, s = fD(), l2 = R2(m2), g2 = performance.now(), process.stdout.write(`${import_picocolors2.default.gray(o)}
4483
+ a = true, s = fD(), l2 = R2(m2), g2 = performance.now(), process.stdout.write(`${import_picocolors3.default.gray(o)}
4437
4484
  `);
4438
4485
  let h2 = 0, w2 = 0;
4439
4486
  j2(), c = setInterval(() => {
4440
4487
  if (i && l2 === $2) return;
4441
4488
  B2(), $2 = l2;
4442
- const I2 = import_picocolors2.default.magenta(n[h2]);
4489
+ const I2 = import_picocolors3.default.magenta(n[h2]);
4443
4490
  if (i) process.stdout.write(`${I2} ${l2}...`);
4444
4491
  else if (t === "timer") process.stdout.write(`${I2} ${l2} ${O2(g2)}`);
4445
4492
  else {
@@ -4450,7 +4497,7 @@ ${import_picocolors2.default.gray(d2)} ${t}
4450
4497
  }, r2);
4451
4498
  }, N2 = (m2 = "", h2 = 0) => {
4452
4499
  a = false, clearInterval(c), B2();
4453
- const w2 = h2 === 0 ? import_picocolors2.default.green(C) : h2 === 1 ? import_picocolors2.default.red(L2) : import_picocolors2.default.red(W2);
4500
+ const w2 = h2 === 0 ? import_picocolors3.default.green(C) : h2 === 1 ? import_picocolors3.default.red(L2) : import_picocolors3.default.red(W2);
4454
4501
  l2 = R2(m2 ?? l2), t === "timer" ? process.stdout.write(`${w2} ${l2} ${O2(g2)}
4455
4502
  `) : process.stdout.write(`${w2} ${l2}
4456
4503
  `), E(), s();
@@ -4540,9 +4587,9 @@ function compareVersions(a, b3) {
4540
4587
  }
4541
4588
  return 0;
4542
4589
  }
4543
- function parse(v) {
4544
- if (!v || v === "unknown") return null;
4545
- const core = v.trim().replace(/^v/, "").split(/[-+]/)[0] ?? "";
4590
+ function parse(v2) {
4591
+ if (!v2 || v2 === "unknown") return null;
4592
+ const core = v2.trim().replace(/^v/, "").split(/[-+]/)[0] ?? "";
4546
4593
  const parts = core.split(".");
4547
4594
  if (parts.length === 0 || parts.some((p2) => p2 === "" || !/^\d+$/.test(p2))) return null;
4548
4595
  return parts.map((p2) => Number.parseInt(p2, 10));
@@ -4561,14 +4608,14 @@ async function checkCliUpdate(currentVersion) {
4561
4608
  if (!latest || latest === currentVersion) return null;
4562
4609
  return { current: currentVersion, latest };
4563
4610
  }
4564
- function classify(adapter, detection, status4, poolVersion) {
4611
+ function classify(adapter, detection, status5, poolVersion) {
4565
4612
  if (!detection.present) return "absent";
4566
4613
  if (!adapter.supported) return "unsupported";
4567
- if (!status4.installed) return "missing";
4568
- if (!status4.version) return "unknown";
4614
+ if (!status5.installed) return "missing";
4615
+ if (!status5.version) return "unknown";
4569
4616
  if (poolVersion === "unknown") return "unknown";
4570
- const order = compareVersions(status4.version, poolVersion);
4571
- if (order === null) return status4.version === poolVersion ? "current" : "stale";
4617
+ const order = compareVersions(status5.version, poolVersion);
4618
+ if (order === null) return status5.version === poolVersion ? "current" : "stale";
4572
4619
  if (order === 0) return "current";
4573
4620
  return order > 0 ? "ahead" : "stale";
4574
4621
  }
@@ -4581,13 +4628,13 @@ async function gather(adapters, options = {}) {
4581
4628
  Promise.all(
4582
4629
  adapters.map(async (adapter) => {
4583
4630
  const detection = await adapter.detect();
4584
- const status4 = detection.present ? await adapter.status() : { installed: false, note: "agent not installed" };
4631
+ const status5 = detection.present ? await adapter.status() : { installed: false, note: "agent not installed" };
4585
4632
  return {
4586
4633
  adapter,
4587
4634
  detection,
4588
- status: status4,
4589
- drift: classify(adapter, detection, status4, poolVersion),
4590
- extrasDrift: classifyExtras(adapter, detection, status4, extrasVersion)
4635
+ status: status5,
4636
+ drift: classify(adapter, detection, status5, poolVersion),
4637
+ extrasDrift: classifyExtras(adapter, detection, status5, extrasVersion)
4591
4638
  };
4592
4639
  })
4593
4640
  ),
@@ -4595,19 +4642,24 @@ async function gather(adapters, options = {}) {
4595
4642
  ]);
4596
4643
  return { cliVersion, poolVersion, extrasVersion, agents, cliUpdate: cliUpdate ?? void 0 };
4597
4644
  }
4598
- function classifyExtras(adapter, detection, status4, extrasVersion) {
4599
- if (!status4.extras) return void 0;
4645
+ function classifyExtras(adapter, detection, status5, extrasVersion) {
4646
+ if (!status5.extras) return void 0;
4600
4647
  if (!detection.present) return "absent";
4601
4648
  if (!adapter.supported) return "unsupported";
4602
- if (!status4.extras.installed) return "missing";
4603
- if (!status4.extras.version || !extrasVersion) return "unknown";
4604
- return status4.extras.version === extrasVersion ? "current" : "stale";
4649
+ if (!status5.extras.installed) return "missing";
4650
+ if (!status5.extras.version || !extrasVersion) return "unknown";
4651
+ const order = compareVersions(status5.extras.version, extrasVersion);
4652
+ if (order === null) return status5.extras.version === extrasVersion ? "current" : "stale";
4653
+ if (order === 0) return "current";
4654
+ return order > 0 ? "ahead" : "stale";
4605
4655
  }
4606
- function actionable(report, includeCurrent = false) {
4656
+ function actionable(report, options = {}) {
4657
+ const { includeCurrent = false, allowDowngrade = false } = options;
4607
4658
  return report.agents.filter((entry) => {
4608
4659
  if (!entry.detection.present || !entry.adapter.supported) return false;
4660
+ if (entry.drift === "ahead" && !allowDowngrade) return false;
4661
+ if (entry.extrasDrift === "ahead" && !allowDowngrade) return false;
4609
4662
  if (includeCurrent) return true;
4610
- if (entry.drift === "ahead") return false;
4611
4663
  return entry.drift !== "current" || entry.extrasDrift === "stale" || entry.extrasDrift === "unknown";
4612
4664
  });
4613
4665
  }
@@ -4641,7 +4693,7 @@ async function init(options) {
4641
4693
  const current = entry.drift === "current";
4642
4694
  item(current ? "ok" : "warn", `${entry.adapter.name} \u2014 ${current ? `caddis ${entry.status.version} (current)` : entry.status.installed ? `caddis ${entry.status.version ?? "?"} \u2192 ${report.poolVersion}` : "caddis not installed"}`);
4643
4695
  }
4644
- const targets = actionable(report, true);
4696
+ const targets = actionable(report, { includeCurrent: true });
4645
4697
  if (targets.length === 0) {
4646
4698
  Se(
4647
4699
  `${color.yellow("No supported agent found.")} caddis v0.1 drives Claude Code and agy \u2014 install one, then re-run.`
@@ -4684,6 +4736,266 @@ var init_init = __esm({
4684
4736
  }
4685
4737
  });
4686
4738
 
4739
+ // src/providers/resolve.ts
4740
+ import { readFileSync as readFileSync4 } from "fs";
4741
+ import { homedir } from "os";
4742
+ import { isAbsolute, join } from "path";
4743
+ function expandHome(p2) {
4744
+ if (p2 === "~") return homedir();
4745
+ if (p2.startsWith("~/") || p2.startsWith("~\\")) return join(homedir(), p2.slice(2));
4746
+ return p2;
4747
+ }
4748
+ function keysFilePath(env) {
4749
+ const configured = (env[KEYS_FILE_ENV] || "").trim() || DEFAULT_KEYS_FILE;
4750
+ const expanded = expandHome(configured);
4751
+ return isAbsolute(expanded) ? expanded : expanded;
4752
+ }
4753
+ function parseKeysFile(path5) {
4754
+ let text;
4755
+ try {
4756
+ text = readFileSync4(path5, "utf8");
4757
+ } catch {
4758
+ return {};
4759
+ }
4760
+ const out = {};
4761
+ for (const raw of text.split(/\r?\n/)) {
4762
+ const line2 = raw.trim();
4763
+ if (!line2 || line2.startsWith("#") || !line2.includes("=")) continue;
4764
+ const idx = line2.indexOf("=");
4765
+ const key = line2.slice(0, idx).trim();
4766
+ let val = line2.slice(idx + 1).trim();
4767
+ if (val.length >= 2 && (val.startsWith('"') && val.endsWith('"') || val.startsWith("'") && val.endsWith("'"))) {
4768
+ val = val.slice(1, -1);
4769
+ }
4770
+ out[key] = val;
4771
+ }
4772
+ return out;
4773
+ }
4774
+ function maskKey(key) {
4775
+ if (!key) return "(none)";
4776
+ return key.length <= 4 ? "*".repeat(key.length) : `${"*".repeat(8)}${key.slice(-4)}`;
4777
+ }
4778
+ var PROVIDERS, DEFAULT_KEYS_FILE, KEYS_FILE_ENV;
4779
+ var init_resolve = __esm({
4780
+ "src/providers/resolve.ts"() {
4781
+ "use strict";
4782
+ PROVIDERS = {
4783
+ deepseek: {
4784
+ baseUrl: "https://api.deepseek.com/anthropic",
4785
+ model: "deepseek-v4-flash[1m]",
4786
+ keyEnv: "DEEPSEEK_API_KEY"
4787
+ },
4788
+ glm: {
4789
+ baseUrl: "https://api.z.ai/api/anthropic",
4790
+ model: "glm-5.3[1m]",
4791
+ keyEnv: "GLM_API_KEY"
4792
+ },
4793
+ // OpenRouter has no Anthropic-protocol endpoint. It works only through an
4794
+ // Anthropic-compatible gateway (e.g. LiteLLM — see claude-harness/LOCAL-MODELS.md)
4795
+ // whose URL you supply via OSS_BASE_URL.
4796
+ openrouter: {
4797
+ baseUrl: "",
4798
+ model: "deepseek/deepseek-v4-flash",
4799
+ keyEnv: "OPENROUTER_API_KEY"
4800
+ }
4801
+ };
4802
+ DEFAULT_KEYS_FILE = "~/.caddis/keys.env";
4803
+ KEYS_FILE_ENV = "CADDIS_KEYS_FILE";
4804
+ }
4805
+ });
4806
+
4807
+ // src/commands/keys.ts
4808
+ var keys_exports = {};
4809
+ __export(keys_exports, {
4810
+ keys: () => keys,
4811
+ probeKey: () => probeKey,
4812
+ upsertKeyLines: () => upsertKeyLines
4813
+ });
4814
+ import { chmodSync, mkdirSync as mkdirSync2, readFileSync as readFileSync5, writeFileSync as writeFileSync2 } from "fs";
4815
+ import { dirname } from "path";
4816
+ async function probeKey(baseUrl, model, apiKey) {
4817
+ if (!baseUrl) return { ok: false, rejected: false, detail: "no endpoint for this provider" };
4818
+ const controller = new AbortController();
4819
+ const timer = setTimeout(() => controller.abort(), 15e3);
4820
+ try {
4821
+ const res = await fetch(`${baseUrl.replace(/\/$/, "")}/v1/messages`, {
4822
+ method: "POST",
4823
+ headers: {
4824
+ "content-type": "application/json",
4825
+ "anthropic-version": "2023-06-01",
4826
+ authorization: `Bearer ${apiKey}`,
4827
+ "x-api-key": apiKey
4828
+ },
4829
+ body: JSON.stringify({ model, max_tokens: 1, messages: [{ role: "user", content: "ping" }] }),
4830
+ signal: controller.signal
4831
+ });
4832
+ if (res.ok) return { ok: true, rejected: false, detail: "ok" };
4833
+ if (res.status === 401 || res.status === 403) {
4834
+ return { ok: false, rejected: true, detail: `rejected (HTTP ${res.status})` };
4835
+ }
4836
+ return { ok: false, rejected: false, detail: `could not validate (HTTP ${res.status})` };
4837
+ } catch (error) {
4838
+ const message = error instanceof Error ? error.message : String(error);
4839
+ return { ok: false, rejected: false, detail: `could not validate (${message})` };
4840
+ } finally {
4841
+ clearTimeout(timer);
4842
+ }
4843
+ }
4844
+ function upsertKeyLines(existing, updates) {
4845
+ const lines = existing ? existing.split(/\r?\n/) : [];
4846
+ const remaining = { ...updates };
4847
+ const out = lines.map((line2) => {
4848
+ const trimmed = line2.trim();
4849
+ if (!trimmed || trimmed.startsWith("#") || !trimmed.includes("=")) return line2;
4850
+ const name = trimmed.slice(0, trimmed.indexOf("=")).trim();
4851
+ if (name in remaining) {
4852
+ const value = remaining[name];
4853
+ delete remaining[name];
4854
+ return `${name}=${value}`;
4855
+ }
4856
+ return line2;
4857
+ });
4858
+ const added = Object.entries(remaining).map(([k3, v2]) => `${k3}=${v2}`);
4859
+ if (added.length) {
4860
+ if (out.length && out[out.length - 1].trim() !== "") out.push("");
4861
+ out.push("# added by `caddis keys`");
4862
+ out.push(...added);
4863
+ }
4864
+ let text = out.join("\n");
4865
+ if (!text.endsWith("\n")) text += "\n";
4866
+ return text;
4867
+ }
4868
+ function restrictPermissions(path5) {
4869
+ if (process.platform === "win32") return null;
4870
+ try {
4871
+ chmodSync(path5, 384);
4872
+ return null;
4873
+ } catch (error) {
4874
+ return error instanceof Error ? error.message : String(error);
4875
+ }
4876
+ }
4877
+ async function keys(options = {}) {
4878
+ const path5 = keysFilePath(process.env);
4879
+ const fileKeys = parseKeysFile(path5);
4880
+ const names = Object.keys(PROVIDERS).sort();
4881
+ const current = names.map((name) => {
4882
+ const preset = PROVIDERS[name];
4883
+ const fromEnv = (process.env[preset.keyEnv] || "").trim();
4884
+ const fromFile = (fileKeys[preset.keyEnv] || "").trim();
4885
+ return {
4886
+ name,
4887
+ preset,
4888
+ value: fromEnv || fromFile,
4889
+ source: fromEnv ? "env" : fromFile ? "file" : null
4890
+ };
4891
+ });
4892
+ if (options.check) {
4893
+ const configured = current.filter((entry) => entry.value);
4894
+ if (!configured.length) {
4895
+ process.stdout.write(`no provider keys configured (looked in $ENV and ${path5})
4896
+ `);
4897
+ return 1;
4898
+ }
4899
+ let bad = 0;
4900
+ for (const entry of configured) {
4901
+ const probe = await probeKey(entry.preset.baseUrl, entry.preset.model, entry.value);
4902
+ const label = probe.ok ? color.green("ok") : probe.rejected ? color.red("REJECTED") : color.yellow("unverified");
4903
+ process.stdout.write(` ${entry.name.padEnd(12)} ${label} ${probe.detail}
4904
+ `);
4905
+ if (probe.rejected) bad += 1;
4906
+ }
4907
+ return bad ? 1 : 0;
4908
+ }
4909
+ Ie("caddis keys");
4910
+ process.stdout.write(` keys file: ${path5}
4911
+
4912
+ `);
4913
+ for (const entry of current) {
4914
+ const state = entry.source ? `${color.green("present")} (${entry.source}) ${color.dim(maskKey(entry.value))}` : color.dim("missing");
4915
+ process.stdout.write(` ${entry.name.padEnd(12)} ${state}
4916
+ `);
4917
+ }
4918
+ process.stdout.write("\n");
4919
+ const collected = {};
4920
+ for (const entry of current) {
4921
+ if (entry.source === "env") {
4922
+ process.stdout.write(
4923
+ color.dim(` ${entry.name}: set via $${entry.preset.keyEnv}; the environment wins, skipping
4924
+ `)
4925
+ );
4926
+ continue;
4927
+ }
4928
+ if (entry.value && !options.yes) {
4929
+ const replace = await ye({
4930
+ message: `${entry.name}: a key is already saved. Replace it?`,
4931
+ initialValue: false
4932
+ });
4933
+ if (pD(replace)) {
4934
+ xe("cancelled \u2014 nothing written");
4935
+ return 1;
4936
+ }
4937
+ if (!replace) continue;
4938
+ } else if (entry.value) {
4939
+ continue;
4940
+ }
4941
+ const entered = await ge({
4942
+ message: `${entry.name} key (${entry.preset.keyEnv}) \u2014 Enter to skip`
4943
+ });
4944
+ if (pD(entered)) {
4945
+ xe("cancelled \u2014 nothing written");
4946
+ return 1;
4947
+ }
4948
+ const value = String(entered || "").trim();
4949
+ if (!value) continue;
4950
+ const probe = await probeKey(entry.preset.baseUrl, entry.preset.model, value);
4951
+ if (probe.rejected) {
4952
+ process.stdout.write(color.red(` ${entry.name}: ${probe.detail} \u2014 not saved
4953
+ `));
4954
+ continue;
4955
+ }
4956
+ if (!probe.ok) {
4957
+ process.stdout.write(color.yellow(` ${entry.name}: ${probe.detail} \u2014 saving anyway
4958
+ `));
4959
+ } else {
4960
+ process.stdout.write(color.green(` ${entry.name}: validated
4961
+ `));
4962
+ }
4963
+ collected[entry.preset.keyEnv] = value;
4964
+ }
4965
+ if (!Object.keys(collected).length) {
4966
+ Se("nothing to write");
4967
+ return 0;
4968
+ }
4969
+ if (options.dryRun) {
4970
+ Se(`dry run \u2014 would write ${Object.keys(collected).join(", ")} to ${path5}`);
4971
+ return 0;
4972
+ }
4973
+ let existing = "";
4974
+ try {
4975
+ existing = readFileSync5(path5, "utf8");
4976
+ } catch {
4977
+ existing = "";
4978
+ }
4979
+ mkdirSync2(dirname(path5), { recursive: true });
4980
+ writeFileSync2(path5, upsertKeyLines(existing, collected), { encoding: "utf8" });
4981
+ const permWarning = restrictPermissions(path5);
4982
+ process.stdout.write(`
4983
+ wrote ${Object.keys(collected).join(", ")} to ${path5}
4984
+ `);
4985
+ if (permWarning) process.stdout.write(color.yellow(` could not set 0600 on the keys file: ${permWarning}
4986
+ `));
4987
+ Se("lanes ready \u2014 try `claude-glm --print-config`");
4988
+ return 0;
4989
+ }
4990
+ var init_keys = __esm({
4991
+ "src/commands/keys.ts"() {
4992
+ "use strict";
4993
+ init_dist2();
4994
+ init_log();
4995
+ init_resolve();
4996
+ }
4997
+ });
4998
+
4687
4999
  // src/commands/update.ts
4688
5000
  var update_exports = {};
4689
5001
  __export(update_exports, {
@@ -4699,7 +5011,10 @@ async function update(options) {
4699
5011
  item("info", `${entry.adapter.name} \u2014 detected, not yet supported (v0.2)`);
4700
5012
  }
4701
5013
  }
4702
- const targets = actionable(report, options.force === true);
5014
+ const targets = actionable(report, {
5015
+ includeCurrent: options.force === true,
5016
+ allowDowngrade: options.force === true
5017
+ });
4703
5018
  if (targets.length === 0) {
4704
5019
  const supportedPresent = report.agents.filter((e2) => e2.detection.present && e2.adapter.supported);
4705
5020
  const ahead = report.agents.filter((e2) => e2.drift === "ahead");
@@ -4792,13 +5107,13 @@ function renderEnvironment(report, problems) {
4792
5107
  function renderAgents(report, problems) {
4793
5108
  heading("Agents");
4794
5109
  for (const entry of report.agents) {
4795
- const { adapter, detection, status: status4 } = entry;
5110
+ const { adapter, detection, status: status5 } = entry;
4796
5111
  item(markFor(entry.drift), `${color.bold(adapter.name)} \u2014 ${describe(entry, report.poolVersion)}`);
4797
5112
  if (detection.path) detail(detection.path);
4798
5113
  if (detection.agentVersion) detail(`agent version ${detection.agentVersion}`);
4799
- if (status4.source) detail(`read from ${status4.source}`);
4800
- if (status4.note) detail(status4.note);
4801
- if (detection.note && detection.note !== status4.note) detail(detection.note);
5114
+ if (status5.source) detail(`read from ${status5.source}`);
5115
+ if (status5.note) detail(status5.note);
5116
+ if (detection.note && detection.note !== status5.note) detail(detection.note);
4802
5117
  if (entry.extrasDrift) detail(describeExtras(entry, report.extrasVersion));
4803
5118
  const problem = problemFor(entry, report.poolVersion);
4804
5119
  if (problem) {
@@ -4991,18 +5306,18 @@ function renderTable(headers, rows) {
4991
5306
  (header, i) => Math.max(visibleWidth(header), ...rows.map((row) => visibleWidth(row[i] ?? "")))
4992
5307
  );
4993
5308
  const out = [];
4994
- out.push(` ${headers.map((h2, i) => pad(import_picocolors3.default.bold(h2), widths[i] ?? 0)).join(" ")}`.trimEnd());
4995
- out.push(` ${widths.map((w2) => import_picocolors3.default.dim("\u2500".repeat(w2))).join(" ")}`);
5309
+ out.push(` ${headers.map((h2, i) => pad(import_picocolors4.default.bold(h2), widths[i] ?? 0)).join(" ")}`.trimEnd());
5310
+ out.push(` ${widths.map((w2) => import_picocolors4.default.dim("\u2500".repeat(w2))).join(" ")}`);
4996
5311
  for (const row of rows) {
4997
5312
  out.push(` ${row.map((cell, i) => pad(cell ?? "", widths[i] ?? 0)).join(" ")}`.trimEnd());
4998
5313
  }
4999
5314
  return out.join("\n");
5000
5315
  }
5001
- var import_picocolors3, ANSI;
5316
+ var import_picocolors4, ANSI;
5002
5317
  var init_table = __esm({
5003
5318
  "src/util/table.ts"() {
5004
5319
  "use strict";
5005
- import_picocolors3 = __toESM(require_picocolors(), 1);
5320
+ import_picocolors4 = __toESM(require_picocolors(), 1);
5006
5321
  ANSI = /\[[0-9;]*m/g;
5007
5322
  }
5008
5323
  });
@@ -5010,9 +5325,9 @@ var init_table = __esm({
5010
5325
  // src/commands/status.ts
5011
5326
  var status_exports = {};
5012
5327
  __export(status_exports, {
5013
- status: () => status3
5328
+ status: () => status4
5014
5329
  });
5015
- async function status3(options) {
5330
+ async function status4(options) {
5016
5331
  const report = await gather(options.adapters);
5017
5332
  if (options.json) {
5018
5333
  line(JSON.stringify(toJson2(report), null, 2));
@@ -5145,8 +5460,8 @@ function parsePluginList(stdout, plugin = PLUGIN) {
5145
5460
  if (version?.[1] && entry.version === void 0) {
5146
5461
  entry.version = version[1] === "unknown" ? void 0 : version[1];
5147
5462
  }
5148
- const status4 = line2.match(/^\s*Status\s*:\s*(.+?)\s*$/i);
5149
- if (status4?.[1]) entry.disabled = /disabled/i.test(status4[1]);
5463
+ const status5 = line2.match(/^\s*Status\s*:\s*(.+?)\s*$/i);
5464
+ if (status5?.[1]) entry.disabled = /disabled/i.test(status5[1]);
5150
5465
  }
5151
5466
  return entry;
5152
5467
  }
@@ -5423,32 +5738,170 @@ var agyAdapter = {
5423
5738
  };
5424
5739
 
5425
5740
  // src/agents/codex.ts
5741
+ init_exec();
5742
+ import { cpSync as cpSync2, existsSync as existsSync3, mkdirSync, readFileSync as readFileSync3, rmSync as rmSync2, writeFileSync } from "fs";
5426
5743
  import os2 from "os";
5427
5744
  import path3 from "path";
5745
+ init_pkg();
5746
+ var BIN3 = "codex";
5747
+ var BUNDLE2 = "codex";
5748
+ function caddisSkillsDir(home = os2.homedir()) {
5749
+ return path3.join(home, ".codex", "skills", "caddis");
5750
+ }
5751
+ function versionFile(home = os2.homedir()) {
5752
+ return path3.join(caddisSkillsDir(home), ".caddis-version");
5753
+ }
5754
+ async function detect3() {
5755
+ const binPath = await findBin(BIN3);
5756
+ if (!binPath) {
5757
+ const configDir = path3.join(os2.homedir(), ".codex");
5758
+ if (existsSync3(configDir)) {
5759
+ return { present: false, path: configDir, note: "no `codex` binary on PATH, but ~/.codex exists" };
5760
+ }
5761
+ return { present: false, note: "no `codex` binary on PATH" };
5762
+ }
5763
+ const version = await run(BIN3, ["--version"], { timeout: 2e4 });
5764
+ return {
5765
+ present: true,
5766
+ path: binPath,
5767
+ // `codex --version` prints "codex-cli 0.150.1"; take the trailing token.
5768
+ agentVersion: version.ok ? version.stdout.trim().split(/\s+/).pop() || void 0 : void 0,
5769
+ note: version.ok ? void 0 : "binary found but `codex --version` failed"
5770
+ };
5771
+ }
5772
+ function shortenHome2(target) {
5773
+ const home = os2.homedir();
5774
+ return target.startsWith(home) ? path3.join("~", target.slice(home.length)) : target;
5775
+ }
5776
+ function statusFromHome2(home) {
5777
+ const marker = versionFile(home);
5778
+ const dir = caddisSkillsDir(home);
5779
+ if (existsSync3(marker)) {
5780
+ try {
5781
+ const version = readFileSync3(marker, "utf8").trim();
5782
+ if (version) return { installed: true, version, source: shortenHome2(marker) };
5783
+ } catch {
5784
+ }
5785
+ return { installed: true, source: shortenHome2(marker), note: "version marker present but unreadable" };
5786
+ }
5787
+ if (existsSync3(dir)) {
5788
+ return {
5789
+ installed: true,
5790
+ source: shortenHome2(dir),
5791
+ note: "skills present but no version marker \u2014 installed by hand, or by a caddis older than this one"
5792
+ };
5793
+ }
5794
+ return { installed: false, source: shortenHome2(dir), note: "caddis skills not installed into codex" };
5795
+ }
5796
+ async function status3() {
5797
+ const detected = await detect3();
5798
+ if (!detected.present) return { installed: false, note: "agent not installed" };
5799
+ return statusFromHome2(os2.homedir());
5800
+ }
5801
+ async function drive3(action, options) {
5802
+ const detected = await detect3();
5803
+ if (!detected.present) {
5804
+ return { ok: true, skipped: true, steps: [], message: "codex not installed \u2014 skipped" };
5805
+ }
5806
+ const bundle = bundlePath(BUNDLE2, { requireManifest: false });
5807
+ if (!bundle) {
5808
+ return {
5809
+ ok: false,
5810
+ skipped: false,
5811
+ steps: [],
5812
+ message: `the ${BUNDLE2} bundle is missing from this package \u2014 reinstall @caddis/cli`
5813
+ };
5814
+ }
5815
+ const source = path3.join(bundle, ".codex", "skills");
5816
+ if (!existsSync3(source)) {
5817
+ return {
5818
+ ok: false,
5819
+ skipped: false,
5820
+ steps: [],
5821
+ message: `the ${BUNDLE2} bundle has no .codex/skills directory \u2014 the export shape changed`
5822
+ };
5823
+ }
5824
+ const home = os2.homedir();
5825
+ const dest = caddisSkillsDir(home);
5826
+ const version = bundleManifest().poolVersion || "unknown";
5827
+ const label = `copy ${BUNDLE2} skills -> ${shortenHome2(dest)}`;
5828
+ const steps2 = [];
5829
+ if (options.dryRun) {
5830
+ return {
5831
+ ok: true,
5832
+ skipped: true,
5833
+ steps: [{ command: label, ok: true, code: 0 }],
5834
+ message: `dry run \u2014 would ${action} caddis ${version} into ${shortenHome2(dest)}`
5835
+ };
5836
+ }
5837
+ try {
5838
+ if (existsSync3(dest)) rmSync2(dest, { recursive: true, force: true });
5839
+ mkdirSync(path3.dirname(dest), { recursive: true });
5840
+ cpSync2(source, dest, { recursive: true });
5841
+ writeFileSync(versionFile(home), `${version}
5842
+ `, "utf8");
5843
+ steps2.push({ command: label, ok: true, code: 0 });
5844
+ } catch (error) {
5845
+ const message = error instanceof Error ? error.message : String(error);
5846
+ steps2.push({ command: label, ok: false, code: null, output: message });
5847
+ return { ok: false, skipped: false, steps: steps2, message: `could not install into codex: ${message}` };
5848
+ }
5849
+ const notes = [];
5850
+ for (const asset of ["AGENTS.md", path3.join(".codex", "config.toml.example")]) {
5851
+ const from = path3.join(bundle, asset);
5852
+ if (!existsSync3(from)) continue;
5853
+ const to = path3.join(dest, `caddis-${path3.basename(asset)}`);
5854
+ try {
5855
+ cpSync2(from, to);
5856
+ notes.push(path3.basename(to));
5857
+ } catch {
5858
+ }
5859
+ }
5860
+ const extrasNote = options.extras ? " (--extras has no codex bundle yet; core only)" : "";
5861
+ const referenceNote = notes.length ? ` Reference copies beside it: ${notes.join(", ")} \u2014 config.toml is NEVER merged for you.` : "";
5862
+ return {
5863
+ ok: true,
5864
+ skipped: false,
5865
+ steps: steps2,
5866
+ message: `caddis ${version} ${action === "install" ? "installed" : "updated"} in ${shortenHome2(dest)}.${referenceNote}${extrasNote}`
5867
+ };
5868
+ }
5869
+ var codexAdapter = {
5870
+ id: "codex",
5871
+ name: "Codex",
5872
+ supported: true,
5873
+ summary: "copy the caddis skill pool into ~/.codex/skills/caddis/ (config.toml never merged)",
5874
+ detect: detect3,
5875
+ drive: drive3,
5876
+ status: status3
5877
+ };
5878
+
5879
+ // src/agents/copilot.ts
5880
+ import path4 from "path";
5428
5881
 
5429
5882
  // src/agents/stub.ts
5430
- import { existsSync as existsSync3 } from "fs";
5883
+ import { existsSync as existsSync4 } from "fs";
5431
5884
  var NOT_YET_SUPPORTED = "not yet supported (v0.2)";
5432
5885
  function createStubAdapter(spec) {
5433
- async function detect3() {
5886
+ async function detect4() {
5434
5887
  for (const bin of spec.bins) {
5435
5888
  const found = await findBin(bin);
5436
5889
  if (found) return { present: true, path: found, note: NOT_YET_SUPPORTED };
5437
5890
  }
5438
5891
  for (const configPath of spec.configPaths) {
5439
- if (existsSync3(configPath)) return { present: true, path: configPath, note: NOT_YET_SUPPORTED };
5892
+ if (existsSync4(configPath)) return { present: true, path: configPath, note: NOT_YET_SUPPORTED };
5440
5893
  }
5441
5894
  return { present: false, note: `no ${spec.bins.map((b3) => `\`${b3}\``).join(" / ")} binary or config found` };
5442
5895
  }
5443
- async function status4() {
5444
- const detected = await detect3();
5896
+ async function status5() {
5897
+ const detected = await detect4();
5445
5898
  return {
5446
5899
  installed: false,
5447
5900
  note: detected.present ? NOT_YET_SUPPORTED : "agent not installed"
5448
5901
  };
5449
5902
  }
5450
- async function drive3(_action, _options) {
5451
- const detected = await detect3();
5903
+ async function drive4(_action, _options) {
5904
+ const detected = await detect4();
5452
5905
  return {
5453
5906
  ok: true,
5454
5907
  skipped: true,
@@ -5461,23 +5914,13 @@ function createStubAdapter(spec) {
5461
5914
  name: spec.name,
5462
5915
  supported: false,
5463
5916
  summary: spec.summary,
5464
- detect: detect3,
5465
- drive: drive3,
5466
- status: status4
5917
+ detect: detect4,
5918
+ drive: drive4,
5919
+ status: status5
5467
5920
  };
5468
5921
  }
5469
5922
 
5470
- // src/agents/codex.ts
5471
- var codexAdapter = createStubAdapter({
5472
- id: "codex",
5473
- name: "Codex",
5474
- bins: ["codex"],
5475
- configPaths: [path3.join(os2.homedir(), ".codex")],
5476
- summary: "merge the caddis pool into ~/.codex + AGENTS.md (v0.2)"
5477
- });
5478
-
5479
5923
  // src/agents/copilot.ts
5480
- import path4 from "path";
5481
5924
  var copilotAdapter = createStubAdapter({
5482
5925
  id: "copilot",
5483
5926
  name: "GitHub Copilot",
@@ -5531,6 +5974,15 @@ withGlobalFlags(program2.command("init")).description("first run: detect your ag
5531
5974
  })
5532
5975
  );
5533
5976
  });
5977
+ withGlobalFlags(program2.command("keys")).description("set up provider API keys for the model lanes (GLM, DeepSeek)").option("--check", "validate configured keys and exit non-zero on failure; never prompts", false).action(async (options) => {
5978
+ const flags = mergeFlags(options);
5979
+ const { keys: keys2 } = await Promise.resolve().then(() => (init_keys(), keys_exports));
5980
+ process.exitCode = await keys2({
5981
+ check: options.check === true,
5982
+ dryRun: flags.dryRun,
5983
+ yes: flags.yes
5984
+ });
5985
+ });
5534
5986
  withGlobalFlags(program2.command("update")).description("update every detected agent to the caddis version shipped in this CLI").option("-f, --force", "re-drive agents that already report the shipped version", false).option("--extras", "also install the optional caddis-extras long-tail skills", false).action(async (options) => {
5535
5987
  const flags = mergeFlags(options);
5536
5988
  const { update: update2 } = await Promise.resolve().then(() => (init_update(), update_exports));
@@ -5551,8 +6003,8 @@ withGlobalFlags(program2.command("doctor")).description("full health report: eve
5551
6003
  });
5552
6004
  withGlobalFlags(program2.command("status")).description("compact table: cli version, pool version, per-agent version, drift").option("--json", "machine-readable output", false).action(async (options) => {
5553
6005
  const flags = mergeFlags(options);
5554
- const { status: status4 } = await Promise.resolve().then(() => (init_status(), status_exports));
5555
- finish(await status4({ adapters: resolveAdapters(flags), json: options.json }));
6006
+ const { status: status5 } = await Promise.resolve().then(() => (init_status(), status_exports));
6007
+ finish(await status5({ adapters: resolveAdapters(flags), json: options.json }));
5556
6008
  });
5557
6009
  program2.addHelpText(
5558
6010
  "after",
@@ -5598,8 +6050,8 @@ async function maybeNotify(enabled) {
5598
6050
  }
5599
6051
  async function main() {
5600
6052
  if (process.argv.slice(2).length === 0) {
5601
- const { status: status4 } = await Promise.resolve().then(() => (init_status(), status_exports));
5602
- finish(await status4({ adapters: selectAdapters() }));
6053
+ const { status: status5 } = await Promise.resolve().then(() => (init_status(), status_exports));
6054
+ finish(await status5({ adapters: selectAdapters() }));
5603
6055
  await maybeNotify(true);
5604
6056
  return;
5605
6057
  }