@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.
- package/bundles/antigravity-plugin/agents/claude-md-curator.md +1 -1
- package/bundles/antigravity-plugin/agents/knowledge-transfer.md +17 -32
- package/bundles/antigravity-plugin/caddis_statusline.py +825 -0
- package/bundles/antigravity-plugin/claude-md/folder-agents.md.tmpl +21 -0
- package/bundles/antigravity-plugin/guard_agy.py +60 -9
- package/bundles/antigravity-plugin/plugin.json +1 -1
- package/bundles/antigravity-plugin/scripts/caddis_gate.py +524 -0
- package/bundles/antigravity-plugin/scripts/caddis_inventory.py +439 -0
- package/bundles/antigravity-plugin/scripts/caddis_migrate_dir.py +270 -0
- package/bundles/antigravity-plugin/scripts/caddis_spawn.py +300 -0
- package/bundles/antigravity-plugin/scripts/caddis_statusline.py +825 -0
- package/bundles/antigravity-plugin/scripts/caddis_tidy.py +366 -0
- package/bundles/antigravity-plugin/scripts/check_doc_coverage.py +924 -0
- package/bundles/antigravity-plugin/scripts/claude-deepseek.ps1 +4 -0
- package/bundles/antigravity-plugin/scripts/claude-deepseek.sh +3 -0
- package/bundles/antigravity-plugin/scripts/claude-glm.ps1 +4 -0
- package/bundles/antigravity-plugin/scripts/claude-glm.sh +3 -0
- package/bundles/antigravity-plugin/scripts/claude-oss.ps1 +64 -0
- package/bundles/antigravity-plugin/scripts/claude-oss.sh +60 -0
- package/bundles/antigravity-plugin/scripts/claudster_config.py +121 -0
- package/bundles/antigravity-plugin/scripts/claudster_doctor.py +356 -0
- package/bundles/antigravity-plugin/scripts/claudster_init.py +400 -0
- package/bundles/antigravity-plugin/scripts/claudster_migrate_rules.py +300 -0
- package/bundles/antigravity-plugin/scripts/enforcement_inventory.py +261 -0
- package/bundles/antigravity-plugin/scripts/hook_log.py +156 -0
- package/bundles/antigravity-plugin/scripts/new-machine.ps1 +170 -0
- package/bundles/antigravity-plugin/scripts/oss_ask.py +98 -0
- package/bundles/antigravity-plugin/scripts/oss_model.py +174 -0
- package/bundles/antigravity-plugin/scripts/oss_review.py +718 -0
- package/bundles/antigravity-plugin/scripts/setup_project_ai.py +1432 -0
- package/bundles/antigravity-plugin/scripts/usage_review.py +1323 -0
- package/bundles/antigravity-plugin/session_end_agy.py +52 -8
- package/bundles/antigravity-plugin/skills/_registry.md +1 -0
- 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/fastapi-dev/SKILL.md +1 -1
- 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/ship/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/ship-merge/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/ship-pr/SKILL.md +1 -1
- package/bundles/antigravity-plugin/skills/statusline/SKILL.md +105 -0
- package/bundles/antigravity-plugin/skills/use-model/SKILL.md +15 -3
- package/bundles/antigravity-plugin/skills/validate-phase/SKILL.md +31 -0
- package/bundles/antigravity-plugin/warm_start_agy.py +117 -11
- package/bundles/antigravity-plugin-extras/plugin.json +1 -1
- package/bundles/antigravity-plugin-extras/skills/architecture-design/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/caching-patterns/SKILL.md +1 -1
- package/bundles/antigravity-plugin-extras/skills/webapp-development/SKILL.md +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 +544 -0
- package/dist/claude-glm.js +544 -0
- package/dist/claude-oss.js +544 -0
- package/dist/cli.js +542 -90
- package/package.json +5 -2
- package/bundles/antigravity-plugin/statusline-command-agy.sh +0 -91
- 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
|
@@ -22,16 +22,58 @@ def _artifact_root(root: str) -> str:
|
|
|
22
22
|
return os.path.join(str(root), ".caddis")
|
|
23
23
|
|
|
24
24
|
|
|
25
|
+
|
|
26
|
+
def _hook_note(feature, exc, root=None):
|
|
27
|
+
"""Record a swallowed failure in the caddis hook ledger. Never raises, never prints.
|
|
28
|
+
|
|
29
|
+
agy hooks ship FLAT at the plugin root while hook_log.py ships under scripts/, and in
|
|
30
|
+
the source repo this file sits in claude-harness/agy/ with hook_log.py one level up in
|
|
31
|
+
claude-harness/scripts/. Try both layouts.
|
|
32
|
+
"""
|
|
33
|
+
try:
|
|
34
|
+
_here = os.path.dirname(os.path.abspath(__file__))
|
|
35
|
+
for _cand in (os.path.join(_here, "scripts"),
|
|
36
|
+
os.path.join(os.path.dirname(_here), "scripts")):
|
|
37
|
+
if os.path.isdir(_cand) and _cand not in sys.path:
|
|
38
|
+
sys.path.insert(0, _cand)
|
|
39
|
+
import hook_log as _hl # noqa: E402
|
|
40
|
+
_hl.record(os.path.basename(__file__).replace(".py", ""), feature, exc, root)
|
|
41
|
+
except Exception:
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _workspace_roots(data):
|
|
46
|
+
"""Every workspace root in the payload, as a list. Empty when the payload has none.
|
|
47
|
+
|
|
48
|
+
agy sends `workspacePaths` as a LIST. All three caddis agy hooks used to read
|
|
49
|
+
`workspacePaths[0]` and treat it as "the workspace" — silently, with no signal that a
|
|
50
|
+
choice had been made. In a single-root workspace that is correct and the behaviour here
|
|
51
|
+
is unchanged. In a MULTI-root workspace it is a coin toss: the hook acts on the first
|
|
52
|
+
root regardless of which one the session is actually working in.
|
|
53
|
+
|
|
54
|
+
Nothing on this machine is multi-root today, so this has never fired. It is a live trap
|
|
55
|
+
for exactly the multi-repo workspaces the leakage investigation was about, which is why
|
|
56
|
+
each caller below now handles the list rather than assuming its first element.
|
|
57
|
+
"""
|
|
58
|
+
roots = data.get("workspacePaths") if isinstance(data, dict) else None
|
|
59
|
+
if not isinstance(roots, list):
|
|
60
|
+
return []
|
|
61
|
+
return [str(r) for r in roots if isinstance(r, (str, bytes)) and str(r).strip()]
|
|
62
|
+
|
|
25
63
|
def main() -> None:
|
|
26
64
|
try:
|
|
27
65
|
data = json.load(sys.stdin)
|
|
28
66
|
except Exception:
|
|
29
67
|
data = {}
|
|
30
68
|
try:
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
69
|
+
roots = _workspace_roots(data) or [os.getcwd()]
|
|
70
|
+
# Write the record to every root that ALREADY has a .caddis dir, rather than to
|
|
71
|
+
# whichever root happened to be first. A multi-root session's usage belongs to each
|
|
72
|
+
# repo that participates in it, and creating .caddis in a repo that never opted in
|
|
73
|
+
# would be caddis littering someone else's tree.
|
|
74
|
+
targets = [_artifact_root(r) for r in roots if os.path.isdir(_artifact_root(r))]
|
|
75
|
+
if not targets:
|
|
76
|
+
targets = [_artifact_root(roots[0])] # single-root default: unchanged behaviour
|
|
35
77
|
record = {
|
|
36
78
|
"ts": datetime.now(timezone.utc).isoformat(),
|
|
37
79
|
"event": "session_end",
|
|
@@ -41,10 +83,12 @@ def main() -> None:
|
|
|
41
83
|
"terminationReason": data.get("terminationReason"),
|
|
42
84
|
"model": data.get("modelName"),
|
|
43
85
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
86
|
+
for art in targets:
|
|
87
|
+
os.makedirs(art, exist_ok=True)
|
|
88
|
+
with open(os.path.join(art, "usage-log.jsonl"), "a", encoding="utf-8") as fh:
|
|
89
|
+
fh.write(json.dumps(record) + "\n")
|
|
90
|
+
except Exception as _exc:
|
|
91
|
+
_hook_note("agy usage-log write", _exc) # never fail the turn
|
|
48
92
|
# No stdout: agy interprets a Stop hook's stdout as a decision object.
|
|
49
93
|
|
|
50
94
|
|
|
@@ -86,6 +86,7 @@
|
|
|
86
86
|
| Ship Pr | `ship-pr/` | Open a reviewed PR for the current feature branch — rebase-safe push, PR create/update, monitor CI, STOP at green. Never merges, never deploys (that's /ship-merge). |
|
|
87
87
|
| Spawn Hub | `spawn-hub/` | Hand the Advisory Hub role to a fresh session — run the mechanical audit, then generate the succession prompt with a context self-check the new Hub must pass |
|
|
88
88
|
| Spawn Session | `spawn-session/` | Hand the WORK to a fresh session — generate the handover from the repo, then validate the successor by re-deriving its answers |
|
|
89
|
+
| Statusline | `statusline/` | Install the caddis status line into Claude Code and agy — one renderer, once per machine |
|
|
89
90
|
| Tdd | `tdd/` | Run a strict red-green-refactor TDD cycle for a unit of behavior |
|
|
90
91
|
| Ui Brief | `ui-brief/` | Design-first UI brief — lock the aesthetic before writing any code |
|
|
91
92
|
| Usage Review | `usage-review/` | Review local caddis usage over a window, surface prioritised recommendations, and apply config changes in one step |
|
|
@@ -93,6 +93,50 @@ A three-phase feature hits none of this. `/caddis:feature-plan` Step 3b runs thi
|
|
|
93
93
|
it never creates the file silently. This is the test's only home — do not restate the thresholds
|
|
94
94
|
elsewhere, or the copies drift.
|
|
95
95
|
|
|
96
|
+
### Failing this test correctly does not mean "no discipline"
|
|
97
|
+
|
|
98
|
+
A plan can fail the test above — properly, no Hub needed — and still be multi-phase, multi-session,
|
|
99
|
+
and worth structuring. The trap is what happens next.
|
|
100
|
+
|
|
101
|
+
The Hub's file conventions are *attractive*. Once one plan in a repo runs in Hub mode, its
|
|
102
|
+
`phase-NN.prompt.md` / `phase-NN.report.md` / CONTINUE GATE artefacts are sitting right there as the
|
|
103
|
+
most recent example of "how we structure a multi-session plan here." A second, smaller plan copies
|
|
104
|
+
them by analogy. It gets the readability. It gets **none** of the safety, because the safety was
|
|
105
|
+
never in the file names — it was in the role split and the verdict gate.
|
|
106
|
+
|
|
107
|
+
That has happened. A six-phase UI plan borrowed the naming, and an implementing session filed its own
|
|
108
|
+
batch report **and then wrote the next batch's prompt in the same session**, with nobody having
|
|
109
|
+
looked at the work in between. Nothing was wrong that time. Nothing *checked*, either — and the good
|
|
110
|
+
outcome is not evidence the mechanism worked, it is evidence nothing tested it.
|
|
111
|
+
|
|
112
|
+
This skill already says why role separation is not decoration:
|
|
113
|
+
|
|
114
|
+
> *An implementer that writes its own verdict has produced a self-assessment wearing a verdict's
|
|
115
|
+
> name — worse than no verdict, because it looks like a check happened.*
|
|
116
|
+
|
|
117
|
+
The same sentence holds with two words changed: **an implementer that writes the next phase's
|
|
118
|
+
instructions** has produced a plan wearing an independently-authored prompt's name.
|
|
119
|
+
|
|
120
|
+
### The one lightweight rule — cheap enough to always afford
|
|
121
|
+
|
|
122
|
+
> **The session that files a phase's report must not also write the next phase's prompt without an
|
|
123
|
+
> independent re-check in between.**
|
|
124
|
+
|
|
125
|
+
That is the whole rule. It costs minutes, not a session:
|
|
126
|
+
|
|
127
|
+
- re-run the test suite rather than trusting the report's claim that it passed
|
|
128
|
+
- grep the source for the report's two or three load-bearing claims
|
|
129
|
+
- open one or two of the screenshots it describes, rather than reading its description of them
|
|
130
|
+
|
|
131
|
+
No switch file. No dedicated Hub session. No advisory-context doc. If the re-check finds nothing, you
|
|
132
|
+
have lost ten minutes; if it finds something, it found it *before* the wrong instruction went into a
|
|
133
|
+
fresh session that cannot know any better.
|
|
134
|
+
|
|
135
|
+
**State which one you are doing, in the plan.** A plan that borrows Hub file conventions should say
|
|
136
|
+
either "full Advisory Hub mode" or "Hub file conventions, lightweight re-check rule, no Hub" —
|
|
137
|
+
because a reader six phases later cannot tell the two apart from the artefacts alone. That is the
|
|
138
|
+
entire problem this section exists to prevent.
|
|
139
|
+
|
|
96
140
|
## Succession is not the same as a standing validator
|
|
97
141
|
|
|
98
142
|
Two things look alike from outside and are not:
|
|
@@ -8,6 +8,17 @@ license: Apache-2.0
|
|
|
8
8
|
|
|
9
9
|
# Code Review
|
|
10
10
|
|
|
11
|
+
> **On Claude Code, prefer the native `/code-review`.** It is a command, not a skill, so it always
|
|
12
|
+
> fires — including headless — and it has grown capabilities this one does not have: effort levels
|
|
13
|
+
> (`low`…`max`), an `ultra` mode that runs a multi-agent review in the cloud, `--comment` to post
|
|
14
|
+
> findings as inline PR comments, and `--fix` to apply them to the working tree. Reach for it first.
|
|
15
|
+
>
|
|
16
|
+
> This surface remains because caddis ships to harnesses that have **no** native equivalent — agy,
|
|
17
|
+
> Codex and Copilot. There it is the only review you get. Do not delete it to tidy up Claude Code.
|
|
18
|
+
>
|
|
19
|
+
> `/caddis:cross-review` is NOT replaced by either. It sends the diff to a **different vendor's**
|
|
20
|
+
> model, which neither this nor the native reviewer can do.
|
|
21
|
+
|
|
11
22
|
## Review Categories
|
|
12
23
|
|
|
13
24
|
### 1. Security Review
|
|
@@ -295,6 +295,6 @@ async def create_record(record: RecordCreate, service: ...):
|
|
|
295
295
|
| Resource | Path |
|
|
296
296
|
|----------|------|
|
|
297
297
|
| FastAPI instructions | `instructions/fastapi.instructions.md` |
|
|
298
|
-
| SQL expert skill | `
|
|
298
|
+
| SQL expert skill | the `sql` skill |
|
|
299
299
|
| Python instructions | `instructions/python.instructions.md` |
|
|
300
300
|
| Security instructions | `instructions/security.instructions.md` |
|
|
@@ -349,6 +349,27 @@ this. But **always record the determination in the plan, pass or fail**: one lin
|
|
|
349
349
|
> `Advisory Hub: not applicable — no REQUIRED trigger (not a migration / security change /
|
|
350
350
|
> production data correctness / numbers published to stakeholders).`
|
|
351
351
|
|
|
352
|
+
### If the test FAILS but this repo already runs a Hub for another plan
|
|
353
|
+
|
|
354
|
+
Check for an existing `*-advisory-context.md` in `.caddis/plans/` belonging to a **different** plan.
|
|
355
|
+
If one exists, add a second line under `## Constraints & decisions`:
|
|
356
|
+
|
|
357
|
+
> `Hub conventions: this repo runs Advisory Hub for <other-plan>. This plan does NOT — if it borrows
|
|
358
|
+
> the phase-NN.prompt.md / .report.md / CONTINUE GATE conventions, the lightweight rule applies: the
|
|
359
|
+
> session that files a report must not write the next prompt without an independent re-check.`
|
|
360
|
+
|
|
361
|
+
**Why this line exists.** A repo with one Hub plan has its artefacts sitting there as the most recent
|
|
362
|
+
example of "how we structure a multi-session plan here", and the next plan copies them by analogy.
|
|
363
|
+
It inherits the file names and none of the safety, because the safety was never in the names.
|
|
364
|
+
Measured once already: an implementing session filed its own batch report and then wrote the next
|
|
365
|
+
batch's prompt in the same session, with nobody having looked in between. Nothing was wrong that
|
|
366
|
+
time — and nothing checked either.
|
|
367
|
+
|
|
368
|
+
This is the cheapest possible place to catch it: when the second plan is created, before any
|
|
369
|
+
artefact-mimicry has happened. See *"Failing this test correctly does not mean no discipline"* in the
|
|
370
|
+
`advisory-hub` skill for the rule itself. Do not restate the rule here — one home, or the copies
|
|
371
|
+
drift.
|
|
372
|
+
|
|
352
373
|
Silent to the human, auditable in the artifact. "Say nothing" once meant *leave no trace anywhere*,
|
|
353
374
|
and a wrong negative was then invisible — no line in the plan, no line in the chat, nothing for
|
|
354
375
|
anyone to challenge. A rule whose failures leave no artifact cannot be reviewed.
|
|
@@ -5,6 +5,17 @@ description: Deterministic headless code review — adversarial diff review, sel
|
|
|
5
5
|
|
|
6
6
|
# /caddis:gate-review — headless adversarial code review (self-contained)
|
|
7
7
|
|
|
8
|
+
> **On Claude Code, prefer the native `/code-review`.** It is a command, not a skill, so it always
|
|
9
|
+
> fires — including headless — and it has grown capabilities this one does not have: effort levels
|
|
10
|
+
> (`low`…`max`), an `ultra` mode that runs a multi-agent review in the cloud, `--comment` to post
|
|
11
|
+
> findings as inline PR comments, and `--fix` to apply them to the working tree. Reach for it first.
|
|
12
|
+
>
|
|
13
|
+
> This surface remains because caddis ships to harnesses that have **no** native equivalent — agy,
|
|
14
|
+
> Codex and Copilot. There it is the only review you get. Do not delete it to tidy up Claude Code.
|
|
15
|
+
>
|
|
16
|
+
> `/caddis:cross-review` is NOT replaced by either. It sends the diff to a **different vendor's**
|
|
17
|
+
> model, which neither this nor the native reviewer can do.
|
|
18
|
+
|
|
8
19
|
Perform an adversarial code review of **$ARGUMENTS** (a git range, e.g. `abc123..HEAD` — defaults
|
|
9
20
|
to the current working diff when empty).
|
|
10
21
|
|
|
@@ -137,6 +137,42 @@ This is the Hub's central power and until now it ran on human discipline alone:
|
|
|
137
137
|
whether the next phase could start, and *nothing read it*. Five lines of check make the claim true by
|
|
138
138
|
machine.
|
|
139
139
|
|
|
140
|
+
### Ringing the Hub, and waiting for it (Claude Code only, optional)
|
|
141
|
+
|
|
142
|
+
Two moments in Advisory-Hub mode currently cost the user a copy-paste. Both are optional, both
|
|
143
|
+
degrade to today's behaviour, and neither replaces a file.
|
|
144
|
+
|
|
145
|
+
**After you file `phase-NN.report.md`** — if `ListAgents` is available, look for a peer session whose
|
|
146
|
+
name starts with **this repo's directory name**. Sessions are auto-named `<repo-dir>-<hash>`, so a
|
|
147
|
+
same-repo peer is the Hub:
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
SendMessage({to: "<peer-name>", summary: "phase-05 report filed",
|
|
151
|
+
message: "phase-05.report.md is filed and awaiting a verdict."})
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**When you are BLOCKED on a verdict** — instead of stopping dead, subscribe once:
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
SendMessage({to: "<peer-name>", notify_when_idle: true,
|
|
158
|
+
message: "blocked on phase-05 verdict; ping me when you have written it"})
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
`notify_when_idle` is one-shot and costs the Hub nothing extra. **Never poll `ListAgents` in a loop,
|
|
162
|
+
and never send "are you done yet?"** — that burns both sessions' context to no purpose.
|
|
163
|
+
|
|
164
|
+
**The rules that keep this from becoming a mess:**
|
|
165
|
+
|
|
166
|
+
- **The file is the decision; the message is a doorbell.** Never treat a chat message as a verdict.
|
|
167
|
+
If a peer says "accepted", still read `phase-NN.verdict.md` — the gate above checks the FILE, and
|
|
168
|
+
a message cannot be re-read next week or by a third session.
|
|
169
|
+
- **No `ListAgents`, no peer, or more than one same-repo peer → do nothing and carry on.** caddis
|
|
170
|
+
also runs on agy and Codex, which have no cross-session messaging at all. Everything above is an
|
|
171
|
+
accelerant on one harness; the file protocol is the portable layer and is what actually works.
|
|
172
|
+
- **Headless runs never message.** There is no copy-paste to save.
|
|
173
|
+
- **Never ask a peer to perform work your own session was denied.** Permission boundaries are
|
|
174
|
+
per-session, and routing blocked work through another session launders the user's decision.
|
|
175
|
+
|
|
140
176
|
**If a `phase-NN.prompt.md` exists for the phase you are about to run, it is the INSTRUCTION OF
|
|
141
177
|
RECORD** — read it, and measure your DEVIATIONS against it, not against the plan alone. The Hub writes
|
|
142
178
|
that file before the phase precisely so a deviation is falsifiable; an executor that never reads it
|
|
@@ -6,6 +6,15 @@ description: "Security review workflow — OWASP, code scanning, cloud infrastru
|
|
|
6
6
|
|
|
7
7
|
# Security Review
|
|
8
8
|
|
|
9
|
+
> **On Claude Code, prefer the native `/security-review`.** It is a command, not a skill, so it always
|
|
10
|
+
> fires — including headless — and it has grown capabilities this one does not have: Reach for it first.
|
|
11
|
+
>
|
|
12
|
+
> This surface remains because caddis ships to harnesses that have **no** native equivalent — agy,
|
|
13
|
+
> Codex and Copilot. There it is the only review you get. Do not delete it to tidy up Claude Code.
|
|
14
|
+
>
|
|
15
|
+
> `/caddis:cross-review` is NOT replaced by either. It sends the diff to a **different vendor's**
|
|
16
|
+
> model, which neither this nor the native reviewer can do.
|
|
17
|
+
|
|
9
18
|
Security review workflow covering OWASP Top 10, code scanning, and cloud infrastructure.
|
|
10
19
|
|
|
11
20
|
## When to Use
|
|
@@ -103,5 +103,5 @@ Release tag: <tag> → <sha> | n/a
|
|
|
103
103
|
|
|
104
104
|
## Skill reference
|
|
105
105
|
Full procedures for the Gitea lane (CI monitoring, prod validation, queue triage, failure remediation)
|
|
106
|
-
are in `
|
|
106
|
+
are in the `deploy-local` skill (ships in the optional `caddis-extras` plugin — enable it with `claude plugin enable caddis-extras`). For the GitHub lane, the `gh-cli` skill covers `gh run`
|
|
107
107
|
usage. Load whichever matches the detected lane when a step needs more detail.
|
|
@@ -99,5 +99,5 @@ Cleanup: remote branch ✗ deleted / local ✗ deleted / backup ref droppe
|
|
|
99
99
|
- Local-only lane: no PR, no merge — refuse and point at `/ship`.
|
|
100
100
|
|
|
101
101
|
## Skill reference
|
|
102
|
-
Gitea deploy monitoring, prod validation, failure triage: `
|
|
102
|
+
Gitea deploy monitoring, prod validation, failure triage: the `deploy-local` skill (ships in the optional `caddis-extras` plugin — enable it with `claude plugin enable caddis-extras`).
|
|
103
103
|
GitHub `gh pr merge` / `gh run` usage: the `gh-cli` skill.
|
|
@@ -98,5 +98,5 @@ human-confirmed door.
|
|
|
98
98
|
- Local-only lane: refuse + point at `/ship`. On the default branch: stop + point at `/ship`.
|
|
99
99
|
|
|
100
100
|
## Skill reference
|
|
101
|
-
Gitea API monitoring + failure triage: `
|
|
101
|
+
Gitea API monitoring + failure triage: the `deploy-local` skill (ships in the optional `caddis-extras` plugin — enable it with `claude plugin enable caddis-extras`). GitHub `gh pr` / `gh run`
|
|
102
102
|
usage: the `gh-cli` skill. Load whichever matches the detected lane.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: statusline
|
|
3
|
+
description: Install the caddis status line into Claude Code and agy — one renderer, once per machine
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /statusline — set up the status bar
|
|
7
|
+
|
|
8
|
+
Wire the caddis status line into every coding agent on this machine. One Python renderer serves
|
|
9
|
+
both hosts. It installs at **user scope**, so every project gets the line and no project holds a
|
|
10
|
+
copy that can drift.
|
|
11
|
+
|
|
12
|
+
## What the user gets
|
|
13
|
+
|
|
14
|
+
Claude Code:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
⌂ claudster-source | saajunaid/caddis ⎇ main +2 ●1 ?3 ↑1 | ◆ Opus 5 (1M context) v2.1.239 |
|
|
18
|
+
◉ 412k/1M [███░░░░░] 41% | ⚡ 386k cached | effort:high | style:Plain | thinking |
|
|
19
|
+
5h:12% 7d:40% | 💻 57% (37 GB) | ⏺ relay | ◷ 07:58
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
agy (Antigravity):
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
▛▜ agy | ● idle | 🧠 Gemini 3.6 Flash (High) (high) | 📁 claudster-source | ⎇ main ?3 |
|
|
26
|
+
◉ 48.5k/1M [░░░░░░░░] 5% | ⚡ 40k cached | q 62% | 💻 57% (37 GB) | ⏺ relay | ◷ 08:01
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Both lines come from `caddis_statusline.py`. It has two profiles, because the two hosts send
|
|
30
|
+
different field names — agy's payload is a sibling of Claude Code's, not a copy.
|
|
31
|
+
|
|
32
|
+
## Run it
|
|
33
|
+
|
|
34
|
+
Find the renderer in this install and run it. Try these paths in order and use the first that exists:
|
|
35
|
+
|
|
36
|
+
- `${CLAUDE_PLUGIN_ROOT}/scripts/caddis_statusline.py`
|
|
37
|
+
- `claude-harness/scripts/caddis_statusline.py` (working inside the caddis source repo)
|
|
38
|
+
|
|
39
|
+
Then:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
python <path>/caddis_statusline.py --install # both hosts
|
|
43
|
+
python <path>/caddis_statusline.py --install --host claude
|
|
44
|
+
python <path>/caddis_statusline.py --install --host agy
|
|
45
|
+
python <path>/caddis_statusline.py --install --dry-run # print, write nothing
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`--install` does four things:
|
|
49
|
+
|
|
50
|
+
1. Copies the renderer to `~/.caddis/statusline.py` — a **stable** path. Pointing the host
|
|
51
|
+
settings at the plugin cache would break on every caddis upgrade, because the version number
|
|
52
|
+
is in that path.
|
|
53
|
+
2. Creates `~/.caddis/statusline.json` with the default toggles. It never overwrites an existing one.
|
|
54
|
+
3. Backs up each host's `settings.json` to `settings.json.bak-caddis-statusline`.
|
|
55
|
+
4. Sets `statusLine` in `~/.claude/settings.json` and `~/.gemini/antigravity-cli/settings.json`,
|
|
56
|
+
preserving every other key. A host that is not installed is skipped, not failed.
|
|
57
|
+
|
|
58
|
+
Report the tool's own output to the user. Then tell them the line appears on the **next** session —
|
|
59
|
+
neither host re-reads `settings.json` mid-session.
|
|
60
|
+
|
|
61
|
+
## Verify
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
python ~/.caddis/statusline.py --check # what is wired where
|
|
65
|
+
python ~/.caddis/statusline.py --sample --profile claude # preview, no host needed
|
|
66
|
+
python ~/.caddis/statusline.py --sample --profile agy
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`--check` exits non-zero when a host's `statusLine` is missing or points somewhere else.
|
|
70
|
+
|
|
71
|
+
## Change the look
|
|
72
|
+
|
|
73
|
+
Edit `~/.caddis/statusline.json`. Every key is optional; a missing file means defaults.
|
|
74
|
+
|
|
75
|
+
| key | default | what it controls |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| `color` | `true` | ANSI colour |
|
|
78
|
+
| `icons` | `true` | Unicode segment icons. These are plain Unicode, **not** Nerd Font glyphs |
|
|
79
|
+
| `progress_bar` | `true` | the `[███░░░░░]` context bar |
|
|
80
|
+
| `bar_width` | `8` | bar cells |
|
|
81
|
+
| `token_counts` | `true` | `◉ 412k/1M` |
|
|
82
|
+
| `cached_tokens` | `true` | `⚡ 386k cached` — bold and bright by design, never width-gated |
|
|
83
|
+
| `ram` | `true` | `💻 57% (37 GB)` |
|
|
84
|
+
| `ram_min_width` | `0` | hide RAM below this terminal width; `0` always shows it |
|
|
85
|
+
| `clock` | `true` | `◷ 07:58` |
|
|
86
|
+
| `relay` | `true` | `⏺ relay` when a parked resume pointer exists |
|
|
87
|
+
| `rate_limits` | `true` | `5h:12% 7d:40%` (Claude Code only) |
|
|
88
|
+
| `session_id` | `false` | `#a1b2c3d4` |
|
|
89
|
+
| `git` | `true` | branch, staged/unstaged/untracked counts, ahead/behind |
|
|
90
|
+
| `separator` | `"\|"` | segment separator |
|
|
91
|
+
|
|
92
|
+
Config changes take effect on the next render. No reinstall needed.
|
|
93
|
+
|
|
94
|
+
## Notes for you, not the user
|
|
95
|
+
|
|
96
|
+
- Do **not** hand-edit either `settings.json` to wire this. `--install` reads, merges and writes
|
|
97
|
+
back, so it cannot drop an unrelated key. Hand edits have dropped `trustedWorkspaces` before.
|
|
98
|
+
- The renderer never crashes the host. A bad payload, a missing field, or an unreadable config
|
|
99
|
+
degrades to fewer segments; a hard failure degrades to the directory name.
|
|
100
|
+
- RAM on Windows uses `ctypes` `GlobalMemoryStatusEx`, an in-process call. Do not replace it with
|
|
101
|
+
`Get-CimInstance Win32_OperatingSystem` — that cost about 300 ms on **every** render in the
|
|
102
|
+
PowerShell line this replaced.
|
|
103
|
+
- If the user asks why their old `~/.claude/statusline-custom.sh` or
|
|
104
|
+
`~/.gemini/statusline/statusline.ps1` no longer runs: nothing points at them any more. They are
|
|
105
|
+
superseded, not deleted. Both are safe to remove once the user is happy with the new line.
|
|
@@ -55,9 +55,21 @@ A wholly new provider: add a row to `PROVIDERS` in `oss_model.py` (base_url, mod
|
|
|
55
55
|
pass an unknown provider name with `OSS_BASE_URL`+`OSS_MODEL` set — no table edit required.
|
|
56
56
|
|
|
57
57
|
## First-time install
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
npm i -g @caddis/cli # puts claude-oss / claude-glm / claude-deepseek on PATH
|
|
61
|
+
caddis keys # prompts for each provider key, validates it, writes ~/.caddis/keys.env
|
|
62
|
+
claude-glm --print-config # zero-token check: endpoint, model, key all resolved
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
npm does the PATH work on Windows, macOS and Linux. No profile edit, no script copying, no
|
|
66
|
+
Python needed on the lane path — the resolver is ported into the CLI, because the npm tarball
|
|
67
|
+
ships only `dist` and `bundles`.
|
|
68
|
+
|
|
69
|
+
`npx` runs the default `caddis` binary only; the lane binaries need the global install above.
|
|
70
|
+
|
|
71
|
+
**Plugin-only installs** (no npm CLI) keep the original route: put the plugin's `scripts/`
|
|
72
|
+
directory on `PATH`, or add a shell profile function. caddis never silently edits your profile.
|
|
61
73
|
|
|
62
74
|
## Exit codes
|
|
63
75
|
`claude-oss`/`claude-glm` propagate the wrapped `claude` process's exit code, except a resolver failure
|
|
@@ -98,6 +98,37 @@ step, not just described.
|
|
|
98
98
|
Add or update this phase's row in `.caddis/advisory-hub-reports/README.md` (Phase | Report | Verdict |
|
|
99
99
|
Outcome | Date).
|
|
100
100
|
|
|
101
|
+
## Step 8 — tell the implementing session (Claude Code only, optional)
|
|
102
|
+
|
|
103
|
+
The verdict file is the decision. This step only saves the user from carrying it by hand.
|
|
104
|
+
|
|
105
|
+
If `ListAgents` is available, look for a peer session whose name starts with **this repo's directory
|
|
106
|
+
name** — sessions are auto-named `<repo-dir>-<hash>`, so in a repo directory called `acme-api`,
|
|
107
|
+
`acme-api-91` is a session in this repo and `other-project-e8` is not. If exactly one such peer
|
|
108
|
+
exists, it is the implementer:
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
SendMessage({to: "<peer-name>", summary: "phase-05 verdict",
|
|
112
|
+
message: "phase-05.verdict.md written — verdict: accept-with-correction. "
|
|
113
|
+
"Corrections are in the file and in advisory-context.md."})
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Send the **headline and the filename**, never the whole verdict. The file is the record; the message
|
|
117
|
+
is a doorbell. A chat message cannot be re-read next week; `phase-05.verdict.md` can.
|
|
118
|
+
|
|
119
|
+
**Do not do any of this if:**
|
|
120
|
+
|
|
121
|
+
- there is no `ListAgents` — caddis also runs on agy and Codex, which have no cross-session
|
|
122
|
+
messaging. The file-based flow is the portable one and works everywhere. This step is an
|
|
123
|
+
accelerant, not a requirement.
|
|
124
|
+
- **more than one** same-repo peer is listed. Guessing which is the implementer is worse than not
|
|
125
|
+
sending — say so to the user and let them name it.
|
|
126
|
+
- you are headless. There is no one to save a copy-paste for.
|
|
127
|
+
|
|
128
|
+
**Never ask the peer to run something your own session was denied.** Permission boundaries are
|
|
129
|
+
per-session; routing blocked work through another session launders the user's decision. Route it back
|
|
130
|
+
to the user instead.
|
|
131
|
+
|
|
101
132
|
## Rules
|
|
102
133
|
|
|
103
134
|
- **Fail closed.** A gate you could not re-run is `NOT RE-RUN`, never `PASS`. A claim you could not
|
|
@@ -131,14 +131,90 @@ def truncate_relay(text: str) -> str:
|
|
|
131
131
|
return text
|
|
132
132
|
|
|
133
133
|
|
|
134
|
+
|
|
135
|
+
def _hook_note(feature, exc, root=None):
|
|
136
|
+
"""Record a swallowed failure in the caddis hook ledger. Never raises, never prints.
|
|
137
|
+
|
|
138
|
+
agy hooks ship FLAT at the plugin root while hook_log.py ships under scripts/, and in
|
|
139
|
+
the source repo this file sits in claude-harness/agy/ with hook_log.py one level up in
|
|
140
|
+
claude-harness/scripts/. Try both layouts.
|
|
141
|
+
"""
|
|
142
|
+
try:
|
|
143
|
+
_here = os.path.dirname(os.path.abspath(__file__))
|
|
144
|
+
for _cand in (os.path.join(_here, "scripts"),
|
|
145
|
+
os.path.join(os.path.dirname(_here), "scripts")):
|
|
146
|
+
if os.path.isdir(_cand) and _cand not in sys.path:
|
|
147
|
+
sys.path.insert(0, _cand)
|
|
148
|
+
import hook_log as _hl # noqa: E402
|
|
149
|
+
_hl.record(os.path.basename(__file__).replace(".py", ""), feature, exc, root)
|
|
150
|
+
except Exception:
|
|
151
|
+
pass
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _injected_marker(root, conversation):
|
|
156
|
+
"""Path of the per-conversation "relay already injected" marker, or None."""
|
|
157
|
+
try:
|
|
158
|
+
safe = "".join(c for c in str(conversation) if c.isalnum() or c in "-_")[:64]
|
|
159
|
+
if not safe:
|
|
160
|
+
return None
|
|
161
|
+
return os.path.join(str(root), ".caddis", ".relay-injected", safe)
|
|
162
|
+
except Exception:
|
|
163
|
+
return None
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def _already_injected(root, conversation):
|
|
167
|
+
"""True when this conversation has had its relay injected before. Fail-open: on any
|
|
168
|
+
error return False, because a duplicate relay is a smaller harm than none at all."""
|
|
169
|
+
try:
|
|
170
|
+
marker = _injected_marker(root, conversation)
|
|
171
|
+
return bool(marker) and os.path.isfile(marker)
|
|
172
|
+
except Exception:
|
|
173
|
+
return False
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _mark_injected(root, conversation):
|
|
177
|
+
"""Record that this conversation received its relay. Never raises.
|
|
178
|
+
|
|
179
|
+
A failure here means the next truncation may re-inject — the pre-2026-08-22 behaviour,
|
|
180
|
+
which is exactly the fail-open direction we want.
|
|
181
|
+
"""
|
|
182
|
+
try:
|
|
183
|
+
marker = _injected_marker(root, conversation)
|
|
184
|
+
if not marker:
|
|
185
|
+
return
|
|
186
|
+
os.makedirs(os.path.dirname(marker), exist_ok=True)
|
|
187
|
+
with open(marker, "w", encoding="utf-8") as fh:
|
|
188
|
+
fh.write("")
|
|
189
|
+
except Exception as _exc:
|
|
190
|
+
_hook_note("agy relay injection marker", _exc, root)
|
|
191
|
+
|
|
192
|
+
def _workspace_roots(data):
|
|
193
|
+
"""Every workspace root in the payload, as a list. Empty when the payload has none.
|
|
194
|
+
|
|
195
|
+
agy sends `workspacePaths` as a LIST. All three caddis agy hooks used to read
|
|
196
|
+
`workspacePaths[0]` and treat it as "the workspace" — silently, with no signal that a
|
|
197
|
+
choice had been made. In a single-root workspace that is correct and the behaviour here
|
|
198
|
+
is unchanged. In a MULTI-root workspace it is a coin toss: the hook acts on the first
|
|
199
|
+
root regardless of which one the session is actually working in.
|
|
200
|
+
|
|
201
|
+
Nothing on this machine is multi-root today, so this has never fired. It is a live trap
|
|
202
|
+
for exactly the multi-repo workspaces the leakage investigation was about, which is why
|
|
203
|
+
each caller below now handles the list rather than assuming its first element.
|
|
204
|
+
"""
|
|
205
|
+
roots = data.get("workspacePaths") if isinstance(data, dict) else None
|
|
206
|
+
if not isinstance(roots, list):
|
|
207
|
+
return []
|
|
208
|
+
return [str(r) for r in roots if isinstance(r, (str, bytes)) and str(r).strip()]
|
|
209
|
+
|
|
134
210
|
def main() -> None:
|
|
135
211
|
try:
|
|
136
212
|
_reconfig = getattr(sys.stdout, "reconfigure", None)
|
|
137
213
|
if _reconfig:
|
|
138
214
|
try:
|
|
139
215
|
_reconfig(encoding="utf-8")
|
|
140
|
-
except Exception:
|
|
141
|
-
|
|
216
|
+
except Exception as _exc:
|
|
217
|
+
_hook_note("agy stdout utf-8 reconfigure", _exc)
|
|
142
218
|
try:
|
|
143
219
|
data = json.load(sys.stdin)
|
|
144
220
|
except Exception:
|
|
@@ -154,17 +230,47 @@ def main() -> None:
|
|
|
154
230
|
return
|
|
155
231
|
if is_headless():
|
|
156
232
|
return
|
|
157
|
-
|
|
158
|
-
if not
|
|
233
|
+
roots = _workspace_roots(data)
|
|
234
|
+
if not roots:
|
|
159
235
|
return
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
236
|
+
|
|
237
|
+
# DOUBLE-INJECTION GUARD (2026-08-22). The gate above is `invocationNum == 0`, and
|
|
238
|
+
# agy RESTARTS invocation numbering after a CHECKPOINT truncation. A long session
|
|
239
|
+
# therefore hits invocation 0 a second time mid-conversation and injected the relay
|
|
240
|
+
# again — observed at steps 53 and 56 of one transcript, after a truncation at 50.
|
|
241
|
+
# A relay injected mid-task is worse than noise: it carries a "next step" from a
|
|
242
|
+
# PREVIOUS session, and that has been seen executed in place of the real prompt.
|
|
243
|
+
#
|
|
244
|
+
# Conversation ids are unique per session, so a marker file per id is enough. Stale
|
|
245
|
+
# markers are harmless — they only ever suppress a re-injection into a conversation
|
|
246
|
+
# that already received one.
|
|
247
|
+
conversation = str(data.get("conversationId") or "").strip()
|
|
248
|
+
|
|
249
|
+
blocks = []
|
|
250
|
+
for root in roots:
|
|
251
|
+
relay = resolve_relay(root)
|
|
252
|
+
if not relay:
|
|
253
|
+
continue
|
|
254
|
+
try:
|
|
255
|
+
text = open(relay, encoding="utf-8").read().strip()
|
|
256
|
+
except Exception as _exc:
|
|
257
|
+
_hook_note("agy relay read", _exc, root)
|
|
258
|
+
continue
|
|
259
|
+
if not text:
|
|
260
|
+
continue
|
|
261
|
+
if conversation and _already_injected(root, conversation):
|
|
262
|
+
continue
|
|
263
|
+
# Label the block ONLY when there is more than one root. A single-root session
|
|
264
|
+
# must produce byte-identical output to before this change.
|
|
265
|
+
if len(roots) > 1:
|
|
266
|
+
blocks.append("relay for " + os.path.basename(root.rstrip("/\\")) + ":")
|
|
267
|
+
blocks.append(truncate_relay(text))
|
|
268
|
+
if conversation:
|
|
269
|
+
_mark_injected(root, conversation)
|
|
270
|
+
|
|
271
|
+
if not blocks:
|
|
166
272
|
return
|
|
167
|
-
message = (RELAY_FRAME_HEADER + "\n" +
|
|
273
|
+
message = (RELAY_FRAME_HEADER + "\n" + "\n\n".join(blocks)
|
|
168
274
|
+ "\n\n" + RELAY_FRAME_FOOTER)
|
|
169
275
|
payload = json.dumps({"injectSteps": [{"ephemeralMessage": message}]})
|
|
170
276
|
sys.stdout.write(payload)
|
|
@@ -241,4 +241,4 @@ def fetch_records(status: str = None, page: int = 1):
|
|
|
241
241
|
| Architect agent | `agents/architect.agent.md` |
|
|
242
242
|
| FastAPI dev skill | `skills/coding/fastapi-dev/SKILL.md` |
|
|
243
243
|
| Streamlit dev skill | `skills/frontend/streamlit-dev/SKILL.md` |
|
|
244
|
-
| SQL expert skill | `
|
|
244
|
+
| SQL expert skill | the `sql` skill |
|
|
@@ -382,4 +382,4 @@ This pattern is complementary to chunk retry (Step 6 + Gotcha 6) — the 3-layer
|
|
|
382
382
|
|----------|------|
|
|
383
383
|
| Streamlit dev skill | `skills/frontend/streamlit-dev/SKILL.md` |
|
|
384
384
|
| Streamlit instructions | `instructions/streamlit.instructions.md` |
|
|
385
|
-
| SQL expert skill | `
|
|
385
|
+
| SQL expert skill | the `sql` skill |
|