@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
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from playwright.sync_api import sync_playwright
|
|
2
|
+
|
|
3
|
+
# Example: Discovering buttons and other elements on a page
|
|
4
|
+
|
|
5
|
+
with sync_playwright() as p:
|
|
6
|
+
browser = p.chromium.launch(headless=True)
|
|
7
|
+
page = browser.new_page()
|
|
8
|
+
|
|
9
|
+
# Navigate to page and wait for it to fully load
|
|
10
|
+
page.goto('http://localhost:5173')
|
|
11
|
+
page.wait_for_load_state('networkidle')
|
|
12
|
+
|
|
13
|
+
# Discover all buttons on the page
|
|
14
|
+
buttons = page.locator('button').all()
|
|
15
|
+
print(f"Found {len(buttons)} buttons:")
|
|
16
|
+
for i, button in enumerate(buttons):
|
|
17
|
+
text = button.inner_text() if button.is_visible() else "[hidden]"
|
|
18
|
+
print(f" [{i}] {text}")
|
|
19
|
+
|
|
20
|
+
# Discover links
|
|
21
|
+
links = page.locator('a[href]').all()
|
|
22
|
+
print(f"\nFound {len(links)} links:")
|
|
23
|
+
for link in links[:5]: # Show first 5
|
|
24
|
+
text = link.inner_text().strip()
|
|
25
|
+
href = link.get_attribute('href')
|
|
26
|
+
print(f" - {text} -> {href}")
|
|
27
|
+
|
|
28
|
+
# Discover input fields
|
|
29
|
+
inputs = page.locator('input, textarea, select').all()
|
|
30
|
+
print(f"\nFound {len(inputs)} input fields:")
|
|
31
|
+
for input_elem in inputs:
|
|
32
|
+
name = input_elem.get_attribute('name') or input_elem.get_attribute('id') or "[unnamed]"
|
|
33
|
+
input_type = input_elem.get_attribute('type') or 'text'
|
|
34
|
+
print(f" - {name} ({input_type})")
|
|
35
|
+
|
|
36
|
+
# Take screenshot for visual reference
|
|
37
|
+
page.screenshot(path='/tmp/page_discovery.png', full_page=True)
|
|
38
|
+
print("\nScreenshot saved to /tmp/page_discovery.png")
|
|
39
|
+
|
|
40
|
+
browser.close()
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from playwright.sync_api import sync_playwright
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
# Example: Automating interaction with static HTML files using file:// URLs
|
|
5
|
+
|
|
6
|
+
html_file_path = os.path.abspath('path/to/your/file.html')
|
|
7
|
+
file_url = f'file://{html_file_path}'
|
|
8
|
+
|
|
9
|
+
with sync_playwright() as p:
|
|
10
|
+
browser = p.chromium.launch(headless=True)
|
|
11
|
+
page = browser.new_page(viewport={'width': 1920, 'height': 1080})
|
|
12
|
+
|
|
13
|
+
# Navigate to local HTML file
|
|
14
|
+
page.goto(file_url)
|
|
15
|
+
|
|
16
|
+
# Take screenshot
|
|
17
|
+
page.screenshot(path='/mnt/user-data/outputs/static_page.png', full_page=True)
|
|
18
|
+
|
|
19
|
+
# Interact with elements
|
|
20
|
+
page.click('text=Click Me')
|
|
21
|
+
page.fill('#name', 'John Doe')
|
|
22
|
+
page.fill('#email', 'john@example.com')
|
|
23
|
+
|
|
24
|
+
# Submit form
|
|
25
|
+
page.click('button[type="submit"]')
|
|
26
|
+
page.wait_for_timeout(500)
|
|
27
|
+
|
|
28
|
+
# Take final screenshot
|
|
29
|
+
page.screenshot(path='/mnt/user-data/outputs/after_submit.png', full_page=True)
|
|
30
|
+
|
|
31
|
+
browser.close()
|
|
32
|
+
|
|
33
|
+
print("Static HTML automation completed!")
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Start one or more servers, wait for them to be ready, run a command, then clean up.
|
|
4
|
+
|
|
5
|
+
Usage:
|
|
6
|
+
# Single server
|
|
7
|
+
python scripts/with_server.py --server "npm run dev" --port 5173 -- python automation.py
|
|
8
|
+
python scripts/with_server.py --server "npm start" --port 3000 -- python test.py
|
|
9
|
+
|
|
10
|
+
# Multiple servers
|
|
11
|
+
python scripts/with_server.py \
|
|
12
|
+
--server "cd backend && python server.py" --port 3000 \
|
|
13
|
+
--server "cd frontend && npm run dev" --port 5173 \
|
|
14
|
+
-- python test.py
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import subprocess
|
|
18
|
+
import socket
|
|
19
|
+
import time
|
|
20
|
+
import sys
|
|
21
|
+
import argparse
|
|
22
|
+
|
|
23
|
+
def is_server_ready(port, timeout=30):
|
|
24
|
+
"""Wait for server to be ready by polling the port."""
|
|
25
|
+
start_time = time.time()
|
|
26
|
+
while time.time() - start_time < timeout:
|
|
27
|
+
try:
|
|
28
|
+
with socket.create_connection(('localhost', port), timeout=1):
|
|
29
|
+
return True
|
|
30
|
+
except (socket.error, ConnectionRefusedError):
|
|
31
|
+
time.sleep(0.5)
|
|
32
|
+
return False
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def main():
|
|
36
|
+
parser = argparse.ArgumentParser(description='Run command with one or more servers')
|
|
37
|
+
parser.add_argument('--server', action='append', dest='servers', required=True, help='Server command (can be repeated)')
|
|
38
|
+
parser.add_argument('--port', action='append', dest='ports', type=int, required=True, help='Port for each server (must match --server count)')
|
|
39
|
+
parser.add_argument('--timeout', type=int, default=30, help='Timeout in seconds per server (default: 30)')
|
|
40
|
+
parser.add_argument('command', nargs=argparse.REMAINDER, help='Command to run after server(s) ready')
|
|
41
|
+
|
|
42
|
+
args = parser.parse_args()
|
|
43
|
+
|
|
44
|
+
# Remove the '--' separator if present
|
|
45
|
+
if args.command and args.command[0] == '--':
|
|
46
|
+
args.command = args.command[1:]
|
|
47
|
+
|
|
48
|
+
if not args.command:
|
|
49
|
+
print("Error: No command specified to run")
|
|
50
|
+
sys.exit(1)
|
|
51
|
+
|
|
52
|
+
# Parse server configurations
|
|
53
|
+
if len(args.servers) != len(args.ports):
|
|
54
|
+
print("Error: Number of --server and --port arguments must match")
|
|
55
|
+
sys.exit(1)
|
|
56
|
+
|
|
57
|
+
servers = []
|
|
58
|
+
for cmd, port in zip(args.servers, args.ports):
|
|
59
|
+
servers.append({'cmd': cmd, 'port': port})
|
|
60
|
+
|
|
61
|
+
server_processes = []
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
# Start all servers
|
|
65
|
+
for i, server in enumerate(servers):
|
|
66
|
+
print(f"Starting server {i+1}/{len(servers)}: {server['cmd']}")
|
|
67
|
+
|
|
68
|
+
# Use shell=True to support commands with cd and &&
|
|
69
|
+
process = subprocess.Popen(
|
|
70
|
+
server['cmd'],
|
|
71
|
+
shell=True,
|
|
72
|
+
stdout=subprocess.PIPE,
|
|
73
|
+
stderr=subprocess.PIPE
|
|
74
|
+
)
|
|
75
|
+
server_processes.append(process)
|
|
76
|
+
|
|
77
|
+
# Wait for this server to be ready
|
|
78
|
+
print(f"Waiting for server on port {server['port']}...")
|
|
79
|
+
if not is_server_ready(server['port'], timeout=args.timeout):
|
|
80
|
+
raise RuntimeError(f"Server failed to start on port {server['port']} within {args.timeout}s")
|
|
81
|
+
|
|
82
|
+
print(f"Server ready on port {server['port']}")
|
|
83
|
+
|
|
84
|
+
print(f"\nAll {len(servers)} server(s) ready")
|
|
85
|
+
|
|
86
|
+
# Run the command
|
|
87
|
+
print(f"Running: {' '.join(args.command)}\n")
|
|
88
|
+
result = subprocess.run(args.command)
|
|
89
|
+
sys.exit(result.returncode)
|
|
90
|
+
|
|
91
|
+
finally:
|
|
92
|
+
# Clean up all servers
|
|
93
|
+
print(f"\nStopping {len(server_processes)} server(s)...")
|
|
94
|
+
for i, process in enumerate(server_processes):
|
|
95
|
+
try:
|
|
96
|
+
process.terminate()
|
|
97
|
+
process.wait(timeout=5)
|
|
98
|
+
except subprocess.TimeoutExpired:
|
|
99
|
+
process.kill()
|
|
100
|
+
process.wait()
|
|
101
|
+
print(f"Server {i+1} stopped")
|
|
102
|
+
print("All servers stopped")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
if __name__ == '__main__':
|
|
106
|
+
main()
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: advisory-hub
|
|
3
|
+
description: Cross-session phase validation for multi-phase implementation plans — a long-lived "Hub" session RE-DERIVES each implementation phase's claims independently instead of trusting its self-assessment. Use when the user says "advisory hub", "validate this phase", "phase report", "hub verdict", "advisory context", "who checks the implementing session", "the plan turned out to be wrong", "hand off the hub", "re-derive don't trust", or when a long, multi-session plan with expensive-to-reverse decisions (a migration, a security change, anything touching production data correctness) needs an independent session that verifies every phase before the next one starts. NOT for a three-phase feature — it costs a full extra session's context per phase, and a skill that doesn't say so gets applied everywhere and resented. Every Hub artefact belongs in `.caddis/advisory-hub-reports/` — a succession prompt is `hub-NN.spawn.md` there, never a generic prompts folder, even when you write it by hand instead of running `/caddis:spawn-hub`.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Advisory Hub — cross-session phase validation
|
|
7
|
+
|
|
8
|
+
## The whole model, in four statements
|
|
9
|
+
|
|
10
|
+
> **1. Re-derive, don't trust — and re-derive DIFFERENTLY than the implementer did.**
|
|
11
|
+
> **2. Two roles, four files.** The implementer writes only the report. The Hub writes everything else.
|
|
12
|
+
> **3. The memory IS the switch.** `<plan-stem>-advisory-context.md` turns the mode on *and* is the
|
|
13
|
+
> Hub's brain. An empty file buys a rubber stamp.
|
|
14
|
+
> **4. Nothing is fixed until it lands in the context doc.** A correction living in a verdict or a
|
|
15
|
+
> chat dies with the session that wrote it.
|
|
16
|
+
|
|
17
|
+
### 1. The rule, and the correction to it
|
|
18
|
+
|
|
19
|
+
A phase report is a **self-assessment**. When it says *"VALUE CHECK passed: endpoint 11,126 = SQL
|
|
20
|
+
11,126,"* the Hub **runs the query itself**. A Hub that reads reports and nods is *worse than no Hub*
|
|
21
|
+
— it manufactures false confidence.
|
|
22
|
+
|
|
23
|
+
**But re-running a gate *identically* is not independent verification** — it reproduces the
|
|
24
|
+
implementer's blind spot. That cost a failed production deploy: implementer and Hub both ran the same
|
|
25
|
+
suite, both green, and CI then failed on a dependency-injection bug the gitignored local env file had
|
|
26
|
+
been masking. **For anything touching config, a data seam, or dependency injection, deprive the
|
|
27
|
+
environment:** `mv <env-file> aside && <test command> && mv back`.
|
|
28
|
+
|
|
29
|
+
### 2. Two roles, four files
|
|
30
|
+
|
|
31
|
+
| File | Written by | When | What is lost without it |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| `<plan-stem>-advisory-context.md` | scaffolded at planning; **owned and maintained by the Hub** | before | The Hub's memory — re-derivation access, locked decisions *and their non-obvious reasons*, the disproved-claims list. Nothing else survives a Hub crash or compaction |
|
|
34
|
+
| `.caddis/advisory-hub-reports/phase-NN.prompt.md` | **the Hub** | **BEFORE the phase runs** | What the implementer was *told*. Without it, "the implementer deviated" and "the plan was wrong" are both unfalsifiable |
|
|
35
|
+
| `.caddis/advisory-hub-reports/phase-NN.report.md` | the implementing session | after | The only evidence a phase's claims were ever checkable rather than merely asserted |
|
|
36
|
+
| `.caddis/advisory-hub-reports/phase-NN.verdict.md` | **the Hub** | after | A later reader sees a self-assessment and no evidence anyone checked it |
|
|
37
|
+
|
|
38
|
+
**Role separation is not decoration.** An implementer that writes its own verdict has produced a
|
|
39
|
+
self-assessment wearing a verdict's name — worse than no verdict, because it *looks* like a check
|
|
40
|
+
happened. Diligence is no substitute: an implementer can re-derive its own claims honestly and still
|
|
41
|
+
produce a worthless verdict.
|
|
42
|
+
|
|
43
|
+
Where a `phase-NN.prompt.md` exists it is **the instruction of record** — `/caddis:implement` reads it,
|
|
44
|
+
and deviations are measured against it, not against the plan alone.
|
|
45
|
+
|
|
46
|
+
**The launch command does not belong in `phase-NN.prompt.md`.** That file is read by the implementer,
|
|
47
|
+
i.e. *after* launch — a file instructing you to spawn GLM is one GLM only reads once it has already
|
|
48
|
+
been spawned. Observed on a real plan, and the skill said nothing either way, so it will recur.
|
|
49
|
+
Surface the launch command to whoever is **orchestrating** (the human, or the session that will spawn
|
|
50
|
+
the phase). What the phase prompt SHOULD carry is a one-line **lane declaration** — *"This phase must
|
|
51
|
+
run on `<lane>`"* — so a mis-launched session can self-detect and act on it.
|
|
52
|
+
|
|
53
|
+
The lane a phase gets is also **provisional until this file is written.** Writing the phase prompt is
|
|
54
|
+
the first time anyone but the spec's author reads the spec; if the phase turns out to need judgment a
|
|
55
|
+
no-escalation lane cannot supply, downgrade it here.
|
|
56
|
+
|
|
57
|
+
### 3. The switch
|
|
58
|
+
|
|
59
|
+
`<plan-stem>-advisory-context.md`, beside the plan. `/caddis:implement`, `/caddis:handoff` and
|
|
60
|
+
`/caddis:validate-phase` all check for it. **No file → zero behaviour change, in every command, ever.**
|
|
61
|
+
|
|
62
|
+
Do not `touch` an empty one to "turn it on". The switch and the memory are deliberately the same file:
|
|
63
|
+
it should be structurally impossible to enable the Hub without giving it a brain.
|
|
64
|
+
|
|
65
|
+
**The verdict gates the next phase, by machine.** In Advisory-Hub mode, before starting phase N,
|
|
66
|
+
`/caddis:implement` requires `phase-(N-1).verdict.md` carrying `verdict: accept` or
|
|
67
|
+
`accept-with-correction`. Missing, or `reject` → stop and report `blocked-pending-hub`.
|
|
68
|
+
|
|
69
|
+
### 4. Corrections land structurally
|
|
70
|
+
|
|
71
|
+
Every correction the Hub issues must be asked: *where does this live so it cannot recur?* Telling the
|
|
72
|
+
implementing session is worthless — that session is closing. Putting it in the next phase's prompt
|
|
73
|
+
works exactly once. **Put it in the context doc**, where it binds every future phase whether or not
|
|
74
|
+
anyone remembers it. Each verdict therefore ends with *"what is now structural."*
|
|
75
|
+
|
|
76
|
+
Corollary: **feed the generic form back to this skill's parking lot.** Project facts stay in the
|
|
77
|
+
project; role mechanics come back here, or the skill never improves.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## When it earns its keep
|
|
82
|
+
|
|
83
|
+
**The cost is a full extra session's context, per phase.** Do not reach for this because it sounds
|
|
84
|
+
rigorous — reach for it when a mistake is expensive enough that the cost is cheap by comparison.
|
|
85
|
+
|
|
86
|
+
> **REQUIRED: the work is expensive to reverse** — a migration, a security change, production data
|
|
87
|
+
> correctness, or numbers published to stakeholders. **No stakes → no Hub, whatever else is true.**
|
|
88
|
+
>
|
|
89
|
+
> **PLUS at least one of:** the plan has **≥8 phases** · it is implemented across **sessions that will
|
|
90
|
+
> not share context**.
|
|
91
|
+
|
|
92
|
+
A three-phase feature hits none of this. `/caddis:feature-plan` Step 3b runs this test and **offers**;
|
|
93
|
+
it never creates the file silently. This is the test's only home — do not restate the thresholds
|
|
94
|
+
elsewhere, or the copies drift.
|
|
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
|
+
|
|
140
|
+
## Succession is not the same as a standing validator
|
|
141
|
+
|
|
142
|
+
Two things look alike from outside and are not:
|
|
143
|
+
|
|
144
|
+
- **`/caddis:spawn-hub` is SUCCESSION.** The outgoing Hub **ends**. It hands the role to a fresh
|
|
145
|
+
session and stops. There is one Hub afterwards, not two.
|
|
146
|
+
- **`/caddis:validate-phase` assumes a Hub that PERSISTS** across phases, checking each one.
|
|
147
|
+
|
|
148
|
+
Conflating them builds a review loop that has to be unwound. One session kept Hub-1 alive to check
|
|
149
|
+
Hub-2, then dismantled the arrangement when the user said they were closing Hub-1. Both models are
|
|
150
|
+
reasonable; running both at once is not.
|
|
151
|
+
|
|
152
|
+
## Every Hub artefact has one home
|
|
153
|
+
|
|
154
|
+
`.caddis/advisory-hub-reports/`. A succession prompt is `hub-NN.spawn.md` there, with frontmatter
|
|
155
|
+
`type: hub-spawn`. **This holds even when you write one by hand** rather than running
|
|
156
|
+
`/caddis:spawn-hub` — and by hand is exactly when it gets missed, because the instruction lives
|
|
157
|
+
inside the command you skipped.
|
|
158
|
+
|
|
159
|
+
The knock-on is the part that bites. `spawn-hub` rotates its comprehension trap by reading the last
|
|
160
|
+
spawn prompt from that directory. A prompt filed anywhere else is invisible to it, so rotation
|
|
161
|
+
silently runs against an empty set — the failure the artefact file was introduced to prevent,
|
|
162
|
+
returning through a different door. `check_doc_coverage.py` now warns on a `type: hub-spawn` file
|
|
163
|
+
found outside that directory.
|
|
164
|
+
|
|
165
|
+
## The Hub is a ROLE, not a conversation
|
|
166
|
+
|
|
167
|
+
It outlives any one session and hands over through **files**, never chat history. Hand over with
|
|
168
|
+
`/caddis:spawn-hub` — at a milestone boundary, or sooner if context is filling.
|
|
169
|
+
|
|
170
|
+
**Your instinct that the context doc is current is measured-wrong.** Asked *"can we hand off?"*, an
|
|
171
|
+
outgoing Hub's honest first answer was yes; a mechanical audit then found **seven gaps** — including
|
|
172
|
+
that the single highest-value technique then in use was written down nowhere a fresh Hub would find it.
|
|
173
|
+
|
|
174
|
+
## While you hold the role — maintain `relay.md`, not just the succession table
|
|
175
|
+
|
|
176
|
+
**The succession table records WHO HELD THE ROLE. `.caddis/relay.md` records WHERE THE WORK IS. A
|
|
177
|
+
Hub maintains both; they are not substitutes.**
|
|
178
|
+
|
|
179
|
+
The succession table is written when a Hub **ends**. Nothing else covers the hours while a Hub is
|
|
180
|
+
**working** — and that is the whole period this mechanism exists to protect, because its entire
|
|
181
|
+
purpose is surviving session death.
|
|
182
|
+
|
|
183
|
+
> **Mirror your working list into `.caddis/relay.md` as you go.** Your in-session task list does not
|
|
184
|
+
> survive this session. `relay.md` does. Anything not written there is lost when the window closes.
|
|
185
|
+
|
|
186
|
+
This gap was real. A spawned Hub read `relay.md`, answered a thirteen-question context check
|
|
187
|
+
correctly, found four genuine defects in its handover — **and created no tracker at all**, because
|
|
188
|
+
nothing asked it to. The user noticed before the agent did: *"I don't see it creating any todo list
|
|
189
|
+
yet."* The work was only recoverable because the OUTGOING Hub had written a tracker into `relay.md`
|
|
190
|
+
an hour earlier, on its own initiative.
|
|
191
|
+
|
|
192
|
+
**`relay.md` is gitignored and machine-local.** That is deliberate — it is per-machine session state,
|
|
193
|
+
not a shared artefact — but it has two consequences a Hub must plan around. It never reaches another
|
|
194
|
+
machine, so anything a *successor on a different box* needs belongs in the advisory context or the
|
|
195
|
+
spawn prompt instead. And no gate can check it through git, so keeping it current is a discipline,
|
|
196
|
+
not something a build will catch for you.
|
|
197
|
+
|
|
198
|
+
## Where the detail lives
|
|
199
|
+
|
|
200
|
+
Each file below is loaded by a **named command step**, at the moment it is needed. This is not optional
|
|
201
|
+
reading — it is deferred reading.
|
|
202
|
+
|
|
203
|
+
| Load this | For | Loaded by |
|
|
204
|
+
|---|---|---|
|
|
205
|
+
| `reference/context-template.md` | scaffolding or maintaining the context doc | `feature-plan` 3b · `validate-phase` 0 · `spawn-hub` 3 |
|
|
206
|
+
| `reference/report-contract.md` | filing a phase report | `implement`, at report time |
|
|
207
|
+
| `reference/hub-handbook.md` | validating a phase — verdict template, checklist, techniques, plan drift | `validate-phase` 2 |
|
|
208
|
+
| `reference/succession.md` | handing the role over — audit, self-check trap, carried-open ledger | `spawn-hub` · `handoff` 2b |
|
|
209
|
+
|
|
210
|
+
Naming, frontmatter and directory rules ship as an `AGENTS.md` **inside**
|
|
211
|
+
`.caddis/advisory-hub-reports/`, so they bind every agent that writes there — including agents that
|
|
212
|
+
never loaded this skill.
|
|
213
|
+
|
|
214
|
+
## Not to be confused with
|
|
215
|
+
|
|
216
|
+
`.github/prompts/advisory-hub.prompt.md` and `.github/instructions/advisory-mode.instructions.md` use
|
|
217
|
+
the same name for an older, unrelated Copilot chat-mode pipeline. It never ships to the Claude Code
|
|
218
|
+
plugin.
|
|
219
|
+
|
|
220
|
+
## Anti-patterns
|
|
221
|
+
|
|
222
|
+
- **Rubber-stamping.** A verdict with no re-derivation is not a verdict.
|
|
223
|
+
- **Re-running a gate the same way and calling it independent verification.** Change the environment.
|
|
224
|
+
- **An implementer writing its own verdict.** The roles exist for exactly this.
|
|
225
|
+
- **An empty context doc.** The switch *is* the memory.
|
|
226
|
+
- **Applying this to a short feature.** State the cost, every time, before adopting it.
|
|
227
|
+
- **A correction that lives only in a verdict file.** It dies with the session that wrote it.
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# Advisory Hub — the `advisory-context.md` template — the Hub's memory AND its on/off switch
|
|
2
|
+
|
|
3
|
+
> **Loaded by:** `/caddis:feature-plan` Step 3b (scaffold) · `/caddis:validate-phase` Step 0 (bootstrap) · `/caddis:spawn-hub` Step 3
|
|
4
|
+
>
|
|
5
|
+
> Reference for `.github/skills/workflow/advisory-hub/SKILL.md`. The core card carries the
|
|
6
|
+
> model; this carries the detail for one moment of use. Every rule here was earned by a
|
|
7
|
+
> specific failure — the failure is stated alongside it, so a later reader can tell a hard-won
|
|
8
|
+
> rule from an opinion.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## §A — the `advisory-context.md` template
|
|
13
|
+
|
|
14
|
+
Copy this in full when you (the Hub) start guarding a new plan. It is a **committed** peer of the plan,
|
|
15
|
+
not of `relay.md`.
|
|
16
|
+
|
|
17
|
+
````markdown
|
|
18
|
+
---
|
|
19
|
+
type: advisory-context
|
|
20
|
+
status: active
|
|
21
|
+
feature: <slug>
|
|
22
|
+
Original Author: <human or agent>
|
|
23
|
+
Creation Date: <ISO 8601 UTC>
|
|
24
|
+
Creating Model: <model/lane>
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# Advisory Context — <Feature Name>
|
|
28
|
+
|
|
29
|
+
**Companion to `<path to the plan>`.** The plan says *what to build*. This says *why it is shaped that
|
|
30
|
+
way, what was measured, and what has already been disproved* — the things a reader of the plan alone
|
|
31
|
+
would re-litigate.
|
|
32
|
+
|
|
33
|
+
**Who this is for:** the **Advisory Hub** — the long-lived session that validates each implementation
|
|
34
|
+
phase. If the Hub session dies or compacts, a new one is reconstituted from: this file → the plan → the
|
|
35
|
+
project's own rules file (`AGENTS.md`). Nothing else is required.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 1. The Hub's job, and its one rule
|
|
40
|
+
|
|
41
|
+
Implementation sessions run phases and report. The Hub **validates**.
|
|
42
|
+
|
|
43
|
+
> **THE RULE: re-derive, do not trust.** A phase report is a self-assessment; accepting it at face value
|
|
44
|
+
> makes the Hub a rubber stamp.
|
|
45
|
+
|
|
46
|
+
The Hub's verdict is one of:
|
|
47
|
+
- **ACCEPT** — re-derived numbers match; gates genuinely ran; move to the next phase.
|
|
48
|
+
- **ACCEPT WITH CORRECTION** — work is sound but something is wrong or missing; the Hub states the exact
|
|
49
|
+
fix and it lands before the next phase.
|
|
50
|
+
- **REJECT** — a gate was skipped, a number does not reproduce, or a locked decision was violated. The
|
|
51
|
+
phase is redone.
|
|
52
|
+
|
|
53
|
+
The Hub also protects the plan from drift (§6 below) — a deviation from a locked decision (§4) is a
|
|
54
|
+
*Hub* decision, never the implementer's.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 2. Baseline state as of <date>
|
|
59
|
+
|
|
60
|
+
The state every validation starts from — anything that changed out-of-band, before Phase 0/1 ran, that a
|
|
61
|
+
fresh Hub needs to know about (environment changes, migrations already applied, services restarted).
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 3. The measured facts (re-derivable — do not accept a contradiction without re-measuring)
|
|
66
|
+
|
|
67
|
+
### 3a. RE-DERIVATION ACCESS
|
|
68
|
+
|
|
69
|
+
The literal, copy-pasteable command (or script, query, API call, test invocation) that reproduces this
|
|
70
|
+
plan's anchor numbers from this repo, and roughly how long it takes. **The Hub's one rule is unaffordable
|
|
71
|
+
without this** — if reproducing a number takes twenty minutes of setup, the Hub will quietly stop doing
|
|
72
|
+
it. Include every environment prerequisite; nothing here should require reconstruction.
|
|
73
|
+
|
|
74
|
+
### 3b. The anchor numbers
|
|
75
|
+
|
|
76
|
+
| Fact | Value |
|
|
77
|
+
|---|---|
|
|
78
|
+
| <the numbers the plan's claims will be checked against> | |
|
|
79
|
+
|
|
80
|
+
### 3c. The findings that shaped the plan most
|
|
81
|
+
|
|
82
|
+
<the 1-3 measured findings that most determined the plan's shape, and why no simpler approach works>
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 4. Locked decisions — an implementer may not change these unilaterally
|
|
87
|
+
|
|
88
|
+
| # | Decision | The reason that is NOT obvious from the plan |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| D1 | | |
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 5. Project safety conventions this Hub enforces
|
|
95
|
+
|
|
96
|
+
If this project's rules file (`AGENTS.md`/`CLAUDE.md`) or its docs declare standing correctness
|
|
97
|
+
conventions that a phase could silently violate, list them here with an id, a one-line statement, and
|
|
98
|
+
**the check that proves compliance**. The phase report carries a slot per rule; the Hub re-checks each.
|
|
99
|
+
**If this project declares none, write `NONE DECLARED`** — both the report section and the Hub's
|
|
100
|
+
re-check become `N/A`, and this costs nothing.
|
|
101
|
+
|
|
102
|
+
| Rule id | What it requires | The check that proves it | Scope (docs only, or `src/` too) |
|
|
103
|
+
|---|---|---|---|
|
|
104
|
+
|
|
105
|
+
*Worked example — a project that computes rates or percentages typically declares something like: every
|
|
106
|
+
rate-bearing field must name its population, must carry its coverage denominator, and must have a
|
|
107
|
+
nested-subset test that would actually fail if the denominator drifted. Other common shapes: a
|
|
108
|
+
date-window boundary convention; a required migration-reversibility check; a mandatory secret-scan on any
|
|
109
|
+
config change.* This section exists because the Hub's core distrust — re-derive, don't trust — applies to
|
|
110
|
+
process as much as to arithmetic; where a project has already codified that distrust as a rule, the Hub
|
|
111
|
+
enforces it every phase rather than hoping the implementer remembered.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 6. Already disproved — do not re-raise
|
|
116
|
+
|
|
117
|
+
| Claim | Status |
|
|
118
|
+
|---|---|
|
|
119
|
+
| <a claim two reviewers independently raised, that a live check settled as false> | **FALSE** — <the evidence> |
|
|
120
|
+
|
|
121
|
+
A Hub without this memory reopens the same false blocker every phase a new reviewer raises it.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 7. The phase report contract
|
|
126
|
+
|
|
127
|
+
Canonical definition: the `advisory-hub` skill's §B. This project's local additions (if any) and the
|
|
128
|
+
specific failures that earned them:
|
|
129
|
+
|
|
130
|
+
<none yet, or list them here as they're discovered>
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 8. Standing gotchas that bite every phase
|
|
135
|
+
|
|
136
|
+
<durable, non-obvious rules a fresh implementing session needs and would not discover from the code>
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 9. Hub techniques that actually caught something here
|
|
141
|
+
|
|
142
|
+
<which of §E's techniques (mutation testing, re-running cross-review, reading the copy) found a real
|
|
143
|
+
problem on this plan, and what it found>
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 10. Environment facts a fresh Hub will not otherwise know
|
|
148
|
+
|
|
149
|
+
| Fact | Why it matters |
|
|
150
|
+
|---|---|
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 11. Gotchas discovered while implementing (not in the plan)
|
|
155
|
+
|
|
156
|
+
<implementation-time surprises worth a durable rule, even though the plan didn't anticipate them>
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 12. Hub self-handoff — the mechanical audit is mandatory, not optional
|
|
161
|
+
|
|
162
|
+
This file exists so a fresh Hub session can take over without the conversation. That only works if it
|
|
163
|
+
stays current — and the outgoing Hub's instinct is always "yes, this is ready," because it's judging
|
|
164
|
+
against its own memory of the session, not against this document. **That instinct is wrong by default.**
|
|
165
|
+
Run the audit in §G before every handoff; do not skip it because the file "looks current."
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Changelog
|
|
170
|
+
- **<date>** — created.
|
|
171
|
+
````
|
|
172
|
+
|
|
173
|
+
**Why this file, not the plan:** a fresh session has the plan but not the *why* — and will re-litigate
|
|
174
|
+
settled questions. §4's *reason* column is the load-bearing part; the decision alone invites a second
|
|
175
|
+
reviewer to reopen it. §6 exists because on the reference implementation of this pattern, two independent
|
|
176
|
+
cross-review models both raised the same blocker — only a live probe closed it, and a Hub without that
|
|
177
|
+
memory would have reopened it every subsequent phase. §3a is kept separate from §3b because the numbers
|
|
178
|
+
are worthless if a future Hub can't cheaply reproduce them.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Succession — the Hub is a role, not a conversation
|
|
183
|
+
|
|
184
|
+
| Hub | Covered | Ended because |
|
|
185
|
+
|---|---|---|
|
|
186
|
+
| 1 | <phases> | <context / milestone / handover> |
|
|
187
|
+
|
|
188
|
+
## Carried open — APPEND AND CLOSE, never rewrite
|
|
189
|
+
|
|
190
|
+
Every item keeps a stable id and is **never deleted**. Closing one requires saying who closed it and
|
|
191
|
+
why — a line, not a deletion. That makes a disappearance impossible: an item either carries a close
|
|
192
|
+
reason or is still open, and both are visible. It also lets a later Hub see something was closed
|
|
193
|
+
*wrongly*, which a deletion hides forever.
|
|
194
|
+
|
|
195
|
+
`/caddis:spawn-hub` runs a **conservation check** against this table at every handover: an id present
|
|
196
|
+
in the predecessor's ledger and absent here fails the spawn.
|
|
197
|
+
|
|
198
|
+
| id | raised by | item | status |
|
|
199
|
+
|---|---|---|---|
|
|
200
|
+
| C1 | Hub 1 | <enough detail to act on without archaeology> | open |
|
|
201
|
+
| C2 | Hub 1 | <…> | **closed by Hub 3** — <why> |
|
|
202
|
+
|
|
203
|
+
A verdict may *raise* an item, but it is not raised until it has an id here, in the same commit.
|
|
204
|
+
Closed rows compress to one line; they leave for the changelog only when the plan ships.
|
|
205
|
+
|
|
206
|
+
## Lane trust — what each execution lane has actually earned
|
|
207
|
+
|
|
208
|
+
Phase reports carry `MODEL/LANE` so the Hub can judge whether a lane is trustworthy for later phases.
|
|
209
|
+
Nothing accumulated that judgement, so each Hub re-formed it from scratch or lost it.
|
|
210
|
+
|
|
211
|
+
| lane | phases run | notable |
|
|
212
|
+
|---|---|---|
|
|
213
|
+
| claude | | |
|
|
214
|
+
| glm-headless | | |
|