@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.
- package/bundles/antigravity-plugin/agents/knowledge-transfer.md +17 -32
- package/bundles/antigravity-plugin/caddis_statusline.py +25 -3
- package/bundles/antigravity-plugin/guard_agy.py +41 -9
- package/bundles/antigravity-plugin/plugin.json +1 -1
- package/bundles/antigravity-plugin/scripts/caddis_inventory.py +73 -3
- package/bundles/antigravity-plugin/scripts/caddis_statusline.py +25 -3
- package/bundles/antigravity-plugin/scripts/claudster_config.py +0 -5
- package/bundles/antigravity-plugin/scripts/hook_log.py +1 -1
- package/bundles/antigravity-plugin/scripts/new-machine.ps1 +170 -0
- package/bundles/antigravity-plugin/scripts/oss_ask.py +1 -1
- package/bundles/antigravity-plugin/scripts/oss_model.py +10 -2
- package/bundles/antigravity-plugin/scripts/oss_review.py +1 -1
- package/bundles/antigravity-plugin/scripts/setup_project_ai.py +9 -6
- package/bundles/antigravity-plugin/session_end_agy.py +31 -6
- package/bundles/antigravity-plugin/skills/advisory-hub/SKILL.md +44 -0
- package/bundles/antigravity-plugin/skills/code-review/SKILL.md +11 -0
- package/bundles/antigravity-plugin/skills/feature-plan/SKILL.md +21 -0
- package/bundles/antigravity-plugin/skills/gate-review/SKILL.md +11 -0
- package/bundles/antigravity-plugin/skills/implement/SKILL.md +36 -0
- package/bundles/antigravity-plugin/skills/security-review/SKILL.md +9 -0
- package/bundles/antigravity-plugin/skills/validate-phase/SKILL.md +31 -0
- package/bundles/antigravity-plugin/warm_start_agy.py +96 -9
- package/bundles/antigravity-plugin-extras/plugin.json +1 -1
- package/bundles/codex/.codex/config.toml.example +36 -0
- package/bundles/codex/.codex/skills/coding/api-design/SKILL.md +249 -0
- package/bundles/codex/.codex/skills/coding/backend-development/SKILL.md +305 -0
- package/bundles/codex/.codex/skills/coding/code-review/SKILL.md +140 -0
- package/bundles/codex/.codex/skills/coding/codebase-audit/SKILL.md +204 -0
- package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/SKILL.md +132 -0
- package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/scripts/perf_sweep.py +249 -0
- package/bundles/codex/.codex/skills/coding/error-handling/SKILL.md +260 -0
- package/bundles/codex/.codex/skills/coding/fastapi-dev/SKILL.md +300 -0
- package/bundles/codex/.codex/skills/coding/javascript-typescript/SKILL.md +142 -0
- package/bundles/codex/.codex/skills/coding/python/SKILL.md +388 -0
- package/bundles/codex/.codex/skills/coding/refactoring/SKILL.md +486 -0
- package/bundles/codex/.codex/skills/coding/security-review/SKILL.md +205 -0
- package/bundles/codex/.codex/skills/coding/sql/SKILL.md +321 -0
- package/bundles/codex/.codex/skills/data/database-design/SKILL.md +177 -0
- package/bundles/codex/.codex/skills/data/db-diagram/SKILL.md +148 -0
- package/bundles/codex/.codex/skills/data/db-diagram/scripts/sql_to_graph.py +1212 -0
- package/bundles/codex/.codex/skills/devops/ci-cd-pipeline/SKILL.md +315 -0
- package/bundles/codex/.codex/skills/devops/gh-cli/SKILL.md +195 -0
- package/bundles/codex/.codex/skills/devops/git-commit/SKILL.md +285 -0
- package/bundles/codex/.codex/skills/devops/using-git-worktrees/SKILL.md +217 -0
- package/bundles/codex/.codex/skills/devops/windows-deployment/SKILL.md +880 -0
- package/bundles/codex/.codex/skills/docs/code-documentation/SKILL.md +271 -0
- package/bundles/codex/.codex/skills/docs/explainer-doc/SKILL.md +97 -0
- package/bundles/codex/.codex/skills/docs/technical-writing/SKILL.md +286 -0
- package/bundles/codex/.codex/skills/docs/writing-plans/SKILL.md +387 -0
- package/bundles/codex/.codex/skills/frontend/css-architecture/SKILL.md +305 -0
- package/bundles/codex/.codex/skills/frontend/css-architecture/references/RESPONSIVE-DESIGN.md +604 -0
- package/bundles/codex/.codex/skills/frontend/frontend-design/SKILL.md +193 -0
- package/bundles/codex/.codex/skills/frontend/frontend-design/references/my-tech-stack.md +127 -0
- package/bundles/codex/.codex/skills/frontend/mockup/SKILL.md +242 -0
- package/bundles/codex/.codex/skills/frontend/react-best-practices/SKILL.md +269 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/README.md +404 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/SKILL.md +459 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/examples/generic-components.md +579 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/examples/server-components.md +579 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/references/event-handlers.md +574 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/references/hooks.md +456 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/references/react-19-patterns.md +638 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/references/react-router.md +1002 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/references/tanstack-router.md +587 -0
- package/bundles/codex/.codex/skills/frontend/ui-review/SKILL.md +176 -0
- package/bundles/codex/.codex/skills/frontend/ui-review/references/framework-fixes.md +471 -0
- package/bundles/codex/.codex/skills/frontend/ui-review/references/visual-checklist.md +236 -0
- package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/DESIGN_TOKENS.md +487 -0
- package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/IMPLEMENTATION_GUIDE.md +177 -0
- package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/SKILL.md +732 -0
- package/bundles/codex/.codex/skills/media/draw-io/SKILL.md +162 -0
- package/bundles/codex/.codex/skills/media/draw-io/references/aws-icons.md +677 -0
- package/bundles/codex/.codex/skills/media/draw-io/references/layout-guidelines.md +142 -0
- package/bundles/codex/.codex/skills/media/draw-io/references/troubleshooting.md +118 -0
- package/bundles/codex/.codex/skills/media/draw-io/references/workflows.md +103 -0
- package/bundles/codex/.codex/skills/media/draw-io/scripts/convert-drawio-to-png.sh +25 -0
- package/bundles/codex/.codex/skills/media/draw-io/scripts/find_aws_icon.py +79 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/SKILL.md +292 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/ENHANCEMENTS.md +264 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/MERMAID-SUMMARY.md +137 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/advanced-features.md +556 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/architecture-diagrams.md +192 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/c4-diagrams.md +410 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/class-diagrams.md +361 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/erd-diagrams.md +510 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/flowcharts.md +450 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/sequence-diagrams.md +394 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/troubleshooting.md +335 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/workflows.md +418 -0
- package/bundles/codex/.codex/skills/media/particle-art/SKILL.md +243 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/canvas-utils.ts +171 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/dot-field.template.tsx +203 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/flow-field.template.tsx +263 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/node-shape.template.tsx +261 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/shape-sampler.ts +281 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/stipple-morph.template.tsx +167 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/stipple.template.tsx +175 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/trail-ghost.template.tsx +266 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/usage-examples.md +320 -0
- package/bundles/codex/.codex/skills/testing/playwright/API_REFERENCE.md +653 -0
- package/bundles/codex/.codex/skills/testing/playwright/SKILL.md +454 -0
- package/bundles/codex/.codex/skills/testing/playwright/lib/helpers.js +441 -0
- package/bundles/codex/.codex/skills/testing/playwright/package.json +26 -0
- package/bundles/codex/.codex/skills/testing/playwright/run.js +228 -0
- package/bundles/codex/.codex/skills/testing/tdd-workflow/SKILL.md +188 -0
- package/bundles/codex/.codex/skills/testing/test-strategy/SKILL.md +155 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/LICENSE.txt +202 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/SKILL.md +97 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/examples/console_logging.py +35 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/examples/element_discovery.py +40 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/examples/static_html_automation.py +33 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/scripts/with_server.py +106 -0
- package/bundles/codex/.codex/skills/workflow/advisory-hub/SKILL.md +227 -0
- package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/context-template.md +214 -0
- package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/hub-handbook.md +233 -0
- package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/report-contract.md +94 -0
- package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/succession.md +118 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/SKILL.md +500 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/agents/best-practices-referencer.md +263 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/agents/codebase-context-builder.md +326 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/agents/task-intent-analyzer.md +245 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/references/anti-patterns.md +571 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/references/before-after-examples.md +1114 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/references/best-practices-guide.md +513 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/references/common-workflows.md +692 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/references/prompt-patterns.md +547 -0
- package/bundles/codex/.codex/skills/workflow/brainstorming/SKILL.md +57 -0
- package/bundles/codex/.codex/skills/workflow/context-curator/SKILL.md +157 -0
- package/bundles/codex/.codex/skills/workflow/golden-plan/SKILL.md +586 -0
- package/bundles/codex/.codex/skills/workflow/preflight/SKILL.md +440 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/LICENSE.txt +202 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/SKILL.md +491 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/agents/analyzer.md +274 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/agents/comparator.md +202 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/agents/grader.md +223 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/assets/eval_review.html +146 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/eval-viewer/generate_review.py +471 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/eval-viewer/viewer.html +1325 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/references/schemas.md +430 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/__init__.py +0 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/generate_report.py +326 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/improve_description.py +247 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/package_skill.py +136 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/quick_validate.py +103 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/run_eval.py +310 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/run_loop.py +328 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/utils.py +47 -0
- package/bundles/codex/AGENTS.md +146 -0
- package/bundles/manifest.json +4 -3
- package/dist/claude-deepseek.js +2 -2
- package/dist/claude-glm.js +2 -2
- package/dist/claude-oss.js +2 -2
- package/dist/cli.js +187 -56
- package/package.json +1 -1
- package/bundles/antigravity-plugin/scripts/dream_capture.py +0 -249
- package/bundles/antigravity-plugin/scripts/dream_memory.py +0 -438
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
- 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
|
-
##
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
- <
|
|
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
|
-
#
|
|
635
|
-
#
|
|
636
|
-
|
|
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
|
|
307
|
-
|
|
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
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
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
|
-
|
|
332
|
-
|
|
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
|
|
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
|
|
|
@@ -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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
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
|
-
#
|
|
635
|
-
#
|
|
636
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
# ── [
|
|
945
|
-
# [
|
|
946
|
-
#
|
|
947
|
-
#
|
|
948
|
-
#
|
|
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
|
|
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/`.
|