@caddis/cli 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/antigravity-plugin/agents/knowledge-transfer.md +17 -32
- package/bundles/antigravity-plugin/caddis_statusline.py +25 -3
- package/bundles/antigravity-plugin/guard_agy.py +41 -9
- package/bundles/antigravity-plugin/plugin.json +1 -1
- package/bundles/antigravity-plugin/scripts/caddis_inventory.py +73 -3
- package/bundles/antigravity-plugin/scripts/caddis_statusline.py +25 -3
- package/bundles/antigravity-plugin/scripts/claudster_config.py +0 -5
- package/bundles/antigravity-plugin/scripts/hook_log.py +1 -1
- package/bundles/antigravity-plugin/scripts/new-machine.ps1 +170 -0
- package/bundles/antigravity-plugin/scripts/oss_ask.py +1 -1
- package/bundles/antigravity-plugin/scripts/oss_model.py +10 -2
- package/bundles/antigravity-plugin/scripts/oss_review.py +1 -1
- package/bundles/antigravity-plugin/scripts/setup_project_ai.py +9 -6
- package/bundles/antigravity-plugin/session_end_agy.py +31 -6
- package/bundles/antigravity-plugin/skills/advisory-hub/SKILL.md +44 -0
- package/bundles/antigravity-plugin/skills/code-review/SKILL.md +11 -0
- package/bundles/antigravity-plugin/skills/feature-plan/SKILL.md +21 -0
- package/bundles/antigravity-plugin/skills/gate-review/SKILL.md +11 -0
- package/bundles/antigravity-plugin/skills/implement/SKILL.md +36 -0
- package/bundles/antigravity-plugin/skills/security-review/SKILL.md +9 -0
- package/bundles/antigravity-plugin/skills/validate-phase/SKILL.md +31 -0
- package/bundles/antigravity-plugin/warm_start_agy.py +96 -9
- package/bundles/antigravity-plugin-extras/plugin.json +1 -1
- package/bundles/codex/.codex/config.toml.example +36 -0
- package/bundles/codex/.codex/skills/coding/api-design/SKILL.md +249 -0
- package/bundles/codex/.codex/skills/coding/backend-development/SKILL.md +305 -0
- package/bundles/codex/.codex/skills/coding/code-review/SKILL.md +140 -0
- package/bundles/codex/.codex/skills/coding/codebase-audit/SKILL.md +204 -0
- package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/SKILL.md +132 -0
- package/bundles/codex/.codex/skills/coding/dashboard-perf-sweep/scripts/perf_sweep.py +249 -0
- package/bundles/codex/.codex/skills/coding/error-handling/SKILL.md +260 -0
- package/bundles/codex/.codex/skills/coding/fastapi-dev/SKILL.md +300 -0
- package/bundles/codex/.codex/skills/coding/javascript-typescript/SKILL.md +142 -0
- package/bundles/codex/.codex/skills/coding/python/SKILL.md +388 -0
- package/bundles/codex/.codex/skills/coding/refactoring/SKILL.md +486 -0
- package/bundles/codex/.codex/skills/coding/security-review/SKILL.md +205 -0
- package/bundles/codex/.codex/skills/coding/sql/SKILL.md +321 -0
- package/bundles/codex/.codex/skills/data/database-design/SKILL.md +177 -0
- package/bundles/codex/.codex/skills/data/db-diagram/SKILL.md +148 -0
- package/bundles/codex/.codex/skills/data/db-diagram/scripts/sql_to_graph.py +1212 -0
- package/bundles/codex/.codex/skills/devops/ci-cd-pipeline/SKILL.md +315 -0
- package/bundles/codex/.codex/skills/devops/gh-cli/SKILL.md +195 -0
- package/bundles/codex/.codex/skills/devops/git-commit/SKILL.md +285 -0
- package/bundles/codex/.codex/skills/devops/using-git-worktrees/SKILL.md +217 -0
- package/bundles/codex/.codex/skills/devops/windows-deployment/SKILL.md +880 -0
- package/bundles/codex/.codex/skills/docs/code-documentation/SKILL.md +271 -0
- package/bundles/codex/.codex/skills/docs/explainer-doc/SKILL.md +97 -0
- package/bundles/codex/.codex/skills/docs/technical-writing/SKILL.md +286 -0
- package/bundles/codex/.codex/skills/docs/writing-plans/SKILL.md +387 -0
- package/bundles/codex/.codex/skills/frontend/css-architecture/SKILL.md +305 -0
- package/bundles/codex/.codex/skills/frontend/css-architecture/references/RESPONSIVE-DESIGN.md +604 -0
- package/bundles/codex/.codex/skills/frontend/frontend-design/SKILL.md +193 -0
- package/bundles/codex/.codex/skills/frontend/frontend-design/references/my-tech-stack.md +127 -0
- package/bundles/codex/.codex/skills/frontend/mockup/SKILL.md +242 -0
- package/bundles/codex/.codex/skills/frontend/react-best-practices/SKILL.md +269 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/README.md +404 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/SKILL.md +459 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/examples/generic-components.md +579 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/examples/server-components.md +579 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/references/event-handlers.md +574 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/references/hooks.md +456 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/references/react-19-patterns.md +638 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/references/react-router.md +1002 -0
- package/bundles/codex/.codex/skills/frontend/react-dev/references/tanstack-router.md +587 -0
- package/bundles/codex/.codex/skills/frontend/ui-review/SKILL.md +176 -0
- package/bundles/codex/.codex/skills/frontend/ui-review/references/framework-fixes.md +471 -0
- package/bundles/codex/.codex/skills/frontend/ui-review/references/visual-checklist.md +236 -0
- package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/DESIGN_TOKENS.md +487 -0
- package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/IMPLEMENTATION_GUIDE.md +177 -0
- package/bundles/codex/.codex/skills/frontend/warm-editorial-ui/SKILL.md +732 -0
- package/bundles/codex/.codex/skills/media/draw-io/SKILL.md +162 -0
- package/bundles/codex/.codex/skills/media/draw-io/references/aws-icons.md +677 -0
- package/bundles/codex/.codex/skills/media/draw-io/references/layout-guidelines.md +142 -0
- package/bundles/codex/.codex/skills/media/draw-io/references/troubleshooting.md +118 -0
- package/bundles/codex/.codex/skills/media/draw-io/references/workflows.md +103 -0
- package/bundles/codex/.codex/skills/media/draw-io/scripts/convert-drawio-to-png.sh +25 -0
- package/bundles/codex/.codex/skills/media/draw-io/scripts/find_aws_icon.py +79 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/SKILL.md +292 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/ENHANCEMENTS.md +264 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/MERMAID-SUMMARY.md +137 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/advanced-features.md +556 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/architecture-diagrams.md +192 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/c4-diagrams.md +410 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/class-diagrams.md +361 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/erd-diagrams.md +510 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/flowcharts.md +450 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/sequence-diagrams.md +394 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/troubleshooting.md +335 -0
- package/bundles/codex/.codex/skills/media/mermaid-diagrams/references/workflows.md +418 -0
- package/bundles/codex/.codex/skills/media/particle-art/SKILL.md +243 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/canvas-utils.ts +171 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/dot-field.template.tsx +203 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/flow-field.template.tsx +263 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/node-shape.template.tsx +261 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/shape-sampler.ts +281 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/stipple-morph.template.tsx +167 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/stipple.template.tsx +175 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/trail-ghost.template.tsx +266 -0
- package/bundles/codex/.codex/skills/media/particle-art/references/usage-examples.md +320 -0
- package/bundles/codex/.codex/skills/testing/playwright/API_REFERENCE.md +653 -0
- package/bundles/codex/.codex/skills/testing/playwright/SKILL.md +454 -0
- package/bundles/codex/.codex/skills/testing/playwright/lib/helpers.js +441 -0
- package/bundles/codex/.codex/skills/testing/playwright/package.json +26 -0
- package/bundles/codex/.codex/skills/testing/playwright/run.js +228 -0
- package/bundles/codex/.codex/skills/testing/tdd-workflow/SKILL.md +188 -0
- package/bundles/codex/.codex/skills/testing/test-strategy/SKILL.md +155 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/LICENSE.txt +202 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/SKILL.md +97 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/examples/console_logging.py +35 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/examples/element_discovery.py +40 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/examples/static_html_automation.py +33 -0
- package/bundles/codex/.codex/skills/testing/webapp-testing/scripts/with_server.py +106 -0
- package/bundles/codex/.codex/skills/workflow/advisory-hub/SKILL.md +227 -0
- package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/context-template.md +214 -0
- package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/hub-handbook.md +233 -0
- package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/report-contract.md +94 -0
- package/bundles/codex/.codex/skills/workflow/advisory-hub/reference/succession.md +118 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/SKILL.md +500 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/agents/best-practices-referencer.md +263 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/agents/codebase-context-builder.md +326 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/agents/task-intent-analyzer.md +245 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/references/anti-patterns.md +571 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/references/before-after-examples.md +1114 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/references/best-practices-guide.md +513 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/references/common-workflows.md +692 -0
- package/bundles/codex/.codex/skills/workflow/best-practices/references/prompt-patterns.md +547 -0
- package/bundles/codex/.codex/skills/workflow/brainstorming/SKILL.md +57 -0
- package/bundles/codex/.codex/skills/workflow/context-curator/SKILL.md +157 -0
- package/bundles/codex/.codex/skills/workflow/golden-plan/SKILL.md +586 -0
- package/bundles/codex/.codex/skills/workflow/preflight/SKILL.md +440 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/LICENSE.txt +202 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/SKILL.md +491 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/agents/analyzer.md +274 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/agents/comparator.md +202 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/agents/grader.md +223 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/assets/eval_review.html +146 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/eval-viewer/generate_review.py +471 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/eval-viewer/viewer.html +1325 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/references/schemas.md +430 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/__init__.py +0 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/generate_report.py +326 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/improve_description.py +247 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/package_skill.py +136 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/quick_validate.py +103 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/run_eval.py +310 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/run_loop.py +328 -0
- package/bundles/codex/.codex/skills/workflow/skill-creator/scripts/utils.py +47 -0
- package/bundles/codex/AGENTS.md +146 -0
- package/bundles/manifest.json +4 -3
- package/dist/claude-deepseek.js +2 -2
- package/dist/claude-glm.js +2 -2
- package/dist/claude-oss.js +2 -2
- package/dist/cli.js +187 -56
- package/package.json +1 -1
- package/bundles/antigravity-plugin/scripts/dream_capture.py +0 -249
- package/bundles/antigravity-plugin/scripts/dream_memory.py +0 -438
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
- package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
|
@@ -1,438 +0,0 @@
|
|
|
1
|
-
"""Dream Memory — caddis's short-term, self-maintaining per-repo fact store (fann Phase 5a).
|
|
2
|
-
|
|
3
|
-
Ports the dedupe / reinforce / prune / conflict logic of fann-core's
|
|
4
|
-
``src/memory/consolidator.ts`` into caddis's hooks-and-scripts world. This module is the
|
|
5
|
-
**pure consolidation engine** — the genuinely portable, fully-testable core. It owns the fact
|
|
6
|
-
schema and the four pure functions the design names (``merge`` / ``prune`` / ``conflicts`` /
|
|
7
|
-
``rank_for_surfacing``), plus thin, fail-open filesystem glue to load/save the JSONL store.
|
|
8
|
-
|
|
9
|
-
Mental model (see ``.caddis/plans/dream-memory-design.md``): Dream Memory is *short-term working
|
|
10
|
-
memory* — automatic, structured facts that get **reinforced** when they recur and **decay** when
|
|
11
|
-
they don't. It complements (never replaces) the curated layers: ``relay.md`` (session handoff),
|
|
12
|
-
``.caddis/kb/*.md`` (curated code docs), and the central ``.claude`` MEMORY.md (cross-repo
|
|
13
|
-
durable facts). A fact that proves durable is *promoted* up into a curated store and then allowed
|
|
14
|
-
to decay out here.
|
|
15
|
-
|
|
16
|
-
Design split mirrors ``check_doc_coverage.py``: a filesystem-free pure core (text/dicts in →
|
|
17
|
-
dicts out, unit-tested without a tree) and a small glue layer (``load_facts`` / ``save_facts`` /
|
|
18
|
-
the CLI) that does all I/O and **fails open & silent** — Dream Memory must never block or slow a
|
|
19
|
-
turn.
|
|
20
|
-
|
|
21
|
-
A fact (one JSON object per line in ``.caddis/memory.jsonl``)::
|
|
22
|
-
|
|
23
|
-
{
|
|
24
|
-
"kind": "failure-mode | rejected-approach | repo-fact | workflow-success",
|
|
25
|
-
"key": "pytest::import-error", # normalized dedup key (kind-scoped)
|
|
26
|
-
"summary": "pytest fails on a cold checkout — run `alembic upgrade` first",
|
|
27
|
-
"hitCount": 3,
|
|
28
|
-
"firstSeen": "2026-07-01T09:00:00Z",
|
|
29
|
-
"lastSeen": "2026-07-01T15:00:00Z",
|
|
30
|
-
"source": "auto | knowledge-transfer | manual",
|
|
31
|
-
"evidence": "tests/test_api.py" # optional, short
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
Fingerprint = ``kind + ":" + normalize(key)``. The file holds **consolidated** facts (not raw
|
|
35
|
-
events) — it self-compacts each cycle (``merge`` then ``prune``).
|
|
36
|
-
"""
|
|
37
|
-
|
|
38
|
-
from __future__ import annotations
|
|
39
|
-
|
|
40
|
-
import argparse
|
|
41
|
-
import json
|
|
42
|
-
import sys
|
|
43
|
-
from datetime import datetime, timedelta, timezone
|
|
44
|
-
from pathlib import Path
|
|
45
|
-
|
|
46
|
-
# --------------------------------------------------------------------------- #
|
|
47
|
-
# Schema constants. Tunables live here (a per-repo ``.caddis/config.toml``
|
|
48
|
-
# override is a deliberate fast-follow, matching check_doc_coverage / guard).
|
|
49
|
-
# --------------------------------------------------------------------------- #
|
|
50
|
-
KINDS: tuple[str, ...] = ("failure-mode", "rejected-approach", "repo-fact", "workflow-success")
|
|
51
|
-
SOURCES: tuple[str, ...] = ("auto", "knowledge-transfer", "manual")
|
|
52
|
-
|
|
53
|
-
# The "don't repeat this" kinds — weighted up when surfacing (they cost the most to relearn).
|
|
54
|
-
WEIGHTED_KINDS: frozenset[str] = frozenset({"failure-mode", "rejected-approach"})
|
|
55
|
-
|
|
56
|
-
PRUNE_AGE_DAYS = 14 # single-hit facts older than this decay out
|
|
57
|
-
MAX_FACTS = 200 # hard cap on the store; oldest-by-recency overflow drops first
|
|
58
|
-
SURFACE_LIMIT = 5 # SessionStart shows at most this many (context-economy-safe)
|
|
59
|
-
|
|
60
|
-
STORE_NAME = "memory.jsonl"
|
|
61
|
-
DEFAULT_STORE = f".caddis/{STORE_NAME}" # nominal path; resolve per-repo via store_path()
|
|
62
|
-
|
|
63
|
-
_REQUIRED_FIELDS = ("kind", "key", "summary", "hitCount", "firstSeen", "lastSeen", "source")
|
|
64
|
-
_EPOCH = datetime.min.replace(tzinfo=timezone.utc)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
def store_path(root) -> Path:
|
|
68
|
-
"""This repo's fact store, at ``.caddis/memory.jsonl``."""
|
|
69
|
-
try:
|
|
70
|
-
from claudster_config import artifact_read
|
|
71
|
-
return artifact_read(root, STORE_NAME)
|
|
72
|
-
except Exception:
|
|
73
|
-
return Path(root) / DEFAULT_STORE
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
# --------------------------------------------------------------------------- #
|
|
77
|
-
# Pure helpers (no filesystem) — the testable core.
|
|
78
|
-
# --------------------------------------------------------------------------- #
|
|
79
|
-
def normalize_key(value: str) -> str:
|
|
80
|
-
"""Lowercase, trim, and collapse internal whitespace — the dedup-key canonical form."""
|
|
81
|
-
return " ".join((value or "").strip().lower().split())
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
def fingerprint(fact: dict) -> str:
|
|
85
|
-
"""The dedup identity. Prefers an explicit ``fp`` (a hash of the FULL command, set at capture) so two
|
|
86
|
-
distinct commands that share a truncated 80-char head don't collapse into one inflated ``hitCount``;
|
|
87
|
-
falls back to ``kind:normalize(key)`` for facts written before ``fp`` existed (and for non-command facts)."""
|
|
88
|
-
fp = fact.get("fp")
|
|
89
|
-
if isinstance(fp, str) and fp:
|
|
90
|
-
return f"{fact.get('kind', '')}:{fp}"
|
|
91
|
-
basis = fact.get("key") or fact.get("summary") or ""
|
|
92
|
-
return f"{fact.get('kind', '')}:{normalize_key(basis)}"
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
def _parse_iso(value) -> datetime:
|
|
96
|
-
"""Parse an ISO-8601 timestamp to an aware datetime; unparseable/empty → the epoch floor.
|
|
97
|
-
|
|
98
|
-
Tolerant by design (the store may be hand-edited): a bad timestamp must never crash a cycle,
|
|
99
|
-
it just sorts as oldest. Accepts a trailing ``Z`` (Python <3.11 ``fromisoformat`` rejects it).
|
|
100
|
-
"""
|
|
101
|
-
if isinstance(value, datetime):
|
|
102
|
-
return value if value.tzinfo else value.replace(tzinfo=timezone.utc)
|
|
103
|
-
s = (value or "").strip()
|
|
104
|
-
if not s:
|
|
105
|
-
return _EPOCH
|
|
106
|
-
if s.endswith(("Z", "z")):
|
|
107
|
-
s = s[:-1] + "+00:00"
|
|
108
|
-
try:
|
|
109
|
-
dt = datetime.fromisoformat(s)
|
|
110
|
-
except ValueError:
|
|
111
|
-
return _EPOCH
|
|
112
|
-
return dt if dt.tzinfo else dt.replace(tzinfo=timezone.utc)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def make_fact(
|
|
116
|
-
kind: str,
|
|
117
|
-
key: str,
|
|
118
|
-
summary: str,
|
|
119
|
-
observed_at: str,
|
|
120
|
-
*,
|
|
121
|
-
source: str = "auto",
|
|
122
|
-
evidence: str | None = None,
|
|
123
|
-
fp: str | None = None,
|
|
124
|
-
) -> dict:
|
|
125
|
-
"""Construct a well-formed single-hit fact (``hitCount=1``, first==last==observed).
|
|
126
|
-
|
|
127
|
-
``fp`` (optional) is the full-command dedup fingerprint; when set it overrides the key-based
|
|
128
|
-
fingerprint so distinct commands sharing a truncated display key don't merge."""
|
|
129
|
-
fact = {
|
|
130
|
-
"kind": kind,
|
|
131
|
-
"key": key,
|
|
132
|
-
"summary": summary,
|
|
133
|
-
"hitCount": 1,
|
|
134
|
-
"firstSeen": observed_at,
|
|
135
|
-
"lastSeen": observed_at,
|
|
136
|
-
"source": source,
|
|
137
|
-
}
|
|
138
|
-
if evidence:
|
|
139
|
-
fact["evidence"] = evidence
|
|
140
|
-
if fp:
|
|
141
|
-
fact["fp"] = fp
|
|
142
|
-
return fact
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
def is_valid_fact(fact) -> bool:
|
|
146
|
-
"""True if ``fact`` has every required field, a known ``kind``, and a positive int hitCount.
|
|
147
|
-
|
|
148
|
-
Used to reject malformed/hand-broken lines when loading and to validate capture candidates.
|
|
149
|
-
"""
|
|
150
|
-
if not isinstance(fact, dict):
|
|
151
|
-
return False
|
|
152
|
-
if any(f not in fact for f in _REQUIRED_FIELDS):
|
|
153
|
-
return False
|
|
154
|
-
if fact["kind"] not in KINDS:
|
|
155
|
-
return False
|
|
156
|
-
hc = fact["hitCount"]
|
|
157
|
-
if not isinstance(hc, int) or isinstance(hc, bool) or hc < 1:
|
|
158
|
-
return False
|
|
159
|
-
return bool(str(fact["summary"]).strip())
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
def _hit(fact: dict) -> int:
|
|
163
|
-
try:
|
|
164
|
-
n = int(fact.get("hitCount", 1))
|
|
165
|
-
except (TypeError, ValueError):
|
|
166
|
-
return 1
|
|
167
|
-
return n if n >= 1 else 1
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
# --------------------------------------------------------------------------- #
|
|
171
|
-
# The four pure consolidation functions the design names. Filesystem-free.
|
|
172
|
-
# --------------------------------------------------------------------------- #
|
|
173
|
-
def merge(facts: list[dict]) -> list[dict]:
|
|
174
|
-
"""Group by fingerprint into consolidated facts (insertion order of first appearance).
|
|
175
|
-
|
|
176
|
-
For each group: sum ``hitCount``; ``firstSeen`` = min, ``lastSeen`` = max; the **newest**
|
|
177
|
-
(latest ``lastSeen``) member's ``summary`` / ``source`` / ``evidence`` win. This is the
|
|
178
|
-
reinforce step — re-running it over (existing ⧺ new candidates) accretes hit counts. Each
|
|
179
|
-
returned fact is a fresh dict; inputs are never mutated.
|
|
180
|
-
"""
|
|
181
|
-
merged: dict[str, dict] = {}
|
|
182
|
-
order: list[str] = []
|
|
183
|
-
|
|
184
|
-
for f in facts:
|
|
185
|
-
fp = fingerprint(f)
|
|
186
|
-
if fp not in merged:
|
|
187
|
-
first = f.get("firstSeen") or f.get("lastSeen") or ""
|
|
188
|
-
last = f.get("lastSeen") or f.get("firstSeen") or ""
|
|
189
|
-
g = dict(f)
|
|
190
|
-
g["hitCount"] = _hit(f)
|
|
191
|
-
g["firstSeen"] = first
|
|
192
|
-
g["lastSeen"] = last
|
|
193
|
-
merged[fp] = g
|
|
194
|
-
order.append(fp)
|
|
195
|
-
continue
|
|
196
|
-
|
|
197
|
-
g = merged[fp]
|
|
198
|
-
g["hitCount"] += _hit(f)
|
|
199
|
-
|
|
200
|
-
f_first = f.get("firstSeen") or f.get("lastSeen") or ""
|
|
201
|
-
if _parse_iso(f_first) < _parse_iso(g["firstSeen"]):
|
|
202
|
-
g["firstSeen"] = f_first
|
|
203
|
-
|
|
204
|
-
f_last = f.get("lastSeen") or f.get("firstSeen") or ""
|
|
205
|
-
# >= so a later-in-list tie counts as "newest wins" (last writer for same timestamp).
|
|
206
|
-
if _parse_iso(f_last) >= _parse_iso(g["lastSeen"]):
|
|
207
|
-
g["lastSeen"] = f_last
|
|
208
|
-
if f.get("summary"):
|
|
209
|
-
g["summary"] = f["summary"]
|
|
210
|
-
if f.get("source"):
|
|
211
|
-
g["source"] = f["source"]
|
|
212
|
-
if f.get("evidence"):
|
|
213
|
-
g["evidence"] = f["evidence"]
|
|
214
|
-
|
|
215
|
-
return [merged[fp] for fp in order]
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
def prune(facts: list[dict], now, *, max_age_days: int = PRUNE_AGE_DAYS, cap: int = MAX_FACTS) -> list[dict]:
|
|
219
|
-
"""Decay then cap.
|
|
220
|
-
|
|
221
|
-
1. Drop ``hitCount <= 1`` facts whose ``lastSeen`` is older than ``max_age_days`` (one-hit
|
|
222
|
-
noise fades on its own). Reinforced facts (hitCount >= 2) are never aged out.
|
|
223
|
-
2. Keep the top ``cap`` by ``(hitCount desc, lastSeen desc)`` — overflow drops the
|
|
224
|
-
least-reinforced, oldest facts first.
|
|
225
|
-
|
|
226
|
-
``now`` may be an ISO string or a datetime. Returns a new list; inputs are never mutated.
|
|
227
|
-
"""
|
|
228
|
-
now_dt = _parse_iso(now)
|
|
229
|
-
cutoff = now_dt - timedelta(days=max_age_days)
|
|
230
|
-
|
|
231
|
-
kept = [
|
|
232
|
-
f for f in facts
|
|
233
|
-
if not (_hit(f) <= 1 and _parse_iso(f.get("lastSeen")) < cutoff)
|
|
234
|
-
]
|
|
235
|
-
kept.sort(key=lambda f: (_hit(f), _parse_iso(f.get("lastSeen"))), reverse=True)
|
|
236
|
-
return kept[:cap]
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
def conflicts(facts: list[dict]) -> list[dict]:
|
|
240
|
-
"""Flag fingerprints carrying materially different summaries — don't auto-resolve, surface.
|
|
241
|
-
|
|
242
|
-
"Materially different" = distinct after :func:`normalize_key`. Returns one entry per
|
|
243
|
-
conflicting fingerprint: ``{"kind", "key", "summaries": [...]}`` with the distinct summaries
|
|
244
|
-
in first-seen order. Intended to run over (existing ⧺ incoming) *before* merge collapses them.
|
|
245
|
-
"""
|
|
246
|
-
by_fp: dict[str, list[dict]] = {}
|
|
247
|
-
for f in facts:
|
|
248
|
-
by_fp.setdefault(fingerprint(f), []).append(f)
|
|
249
|
-
|
|
250
|
-
out: list[dict] = []
|
|
251
|
-
for group in by_fp.values():
|
|
252
|
-
distinct: list[str] = []
|
|
253
|
-
seen_norm: set[str] = set()
|
|
254
|
-
for f in group:
|
|
255
|
-
summary = str(f.get("summary", ""))
|
|
256
|
-
norm = normalize_key(summary)
|
|
257
|
-
if norm and norm not in seen_norm:
|
|
258
|
-
seen_norm.add(norm)
|
|
259
|
-
distinct.append(summary)
|
|
260
|
-
if len(distinct) > 1:
|
|
261
|
-
out.append({
|
|
262
|
-
"kind": group[0].get("kind", ""),
|
|
263
|
-
"key": group[0].get("key", ""),
|
|
264
|
-
"summaries": distinct,
|
|
265
|
-
})
|
|
266
|
-
return out
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
def rank_for_surfacing(facts: list[dict], n: int = SURFACE_LIMIT, *, now=None) -> list[dict]:
|
|
270
|
-
"""Top ``n`` facts to show at SessionStart — score ≈ ``weight × hitCount × recency``.
|
|
271
|
-
|
|
272
|
-
``failure-mode`` / ``rejected-approach`` (the "don't repeat this" kinds) are weighted up. If
|
|
273
|
-
``now`` is given, recency decays continuously with age; otherwise facts are ordered by
|
|
274
|
-
``lastSeen`` directly (a now-free, deterministic proxy). Stable: ties break by ``lastSeen``
|
|
275
|
-
desc then fingerprint. Returns a new list; inputs are never mutated.
|
|
276
|
-
"""
|
|
277
|
-
now_dt = _parse_iso(now) if now is not None else None
|
|
278
|
-
|
|
279
|
-
def score(f: dict) -> float:
|
|
280
|
-
weight = 2.0 if f.get("kind") in WEIGHTED_KINDS else 1.0
|
|
281
|
-
if now_dt is None:
|
|
282
|
-
return weight * _hit(f)
|
|
283
|
-
age_days = max(0.0, (now_dt - _parse_iso(f.get("lastSeen"))).total_seconds() / 86400.0)
|
|
284
|
-
recency = 1.0 / (1.0 + age_days) # 1.0 today, halves after a day, decays smoothly
|
|
285
|
-
return weight * _hit(f) * recency
|
|
286
|
-
|
|
287
|
-
ranked = sorted(
|
|
288
|
-
facts,
|
|
289
|
-
key=lambda f: (score(f), _parse_iso(f.get("lastSeen")), fingerprint(f)),
|
|
290
|
-
reverse=True,
|
|
291
|
-
)
|
|
292
|
-
return ranked[:n]
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
def consolidate(facts: list[dict], now, *, max_age_days: int = PRUNE_AGE_DAYS, cap: int = MAX_FACTS) -> list[dict]:
|
|
296
|
-
"""One full cycle: ``merge`` (reinforce + dedup) then ``prune`` (decay + cap). Pure."""
|
|
297
|
-
return prune(merge(facts), now, max_age_days=max_age_days, cap=cap)
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
# --------------------------------------------------------------------------- #
|
|
301
|
-
# Filesystem glue — fail-open & silent. All I/O lives here, mirroring
|
|
302
|
-
# check_doc_coverage's pure-core / glue split. Never raises into a hook.
|
|
303
|
-
# --------------------------------------------------------------------------- #
|
|
304
|
-
def load_facts(path: Path) -> list[dict]:
|
|
305
|
-
"""Read the JSONL store, skipping blank/malformed/invalid lines. Missing file → ``[]``.
|
|
306
|
-
|
|
307
|
-
Tolerant by design: a hand-edited or partially-written store must never crash a turn.
|
|
308
|
-
"""
|
|
309
|
-
path = Path(path)
|
|
310
|
-
if not path.exists():
|
|
311
|
-
return []
|
|
312
|
-
facts: list[dict] = []
|
|
313
|
-
try:
|
|
314
|
-
text = path.read_text(encoding="utf-8", errors="replace")
|
|
315
|
-
except OSError:
|
|
316
|
-
return []
|
|
317
|
-
for line in text.splitlines():
|
|
318
|
-
line = line.strip()
|
|
319
|
-
if not line:
|
|
320
|
-
continue
|
|
321
|
-
try:
|
|
322
|
-
obj = json.loads(line)
|
|
323
|
-
except (json.JSONDecodeError, ValueError):
|
|
324
|
-
continue
|
|
325
|
-
if is_valid_fact(obj):
|
|
326
|
-
facts.append(obj)
|
|
327
|
-
return facts
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
def save_facts(path: Path, facts: list[dict]) -> bool:
|
|
331
|
-
"""Write facts as JSONL (one compact object per line). Returns True on success, never raises.
|
|
332
|
-
|
|
333
|
-
Writes via a temp file + atomic replace so a crash mid-write can't corrupt the store.
|
|
334
|
-
"""
|
|
335
|
-
path = Path(path)
|
|
336
|
-
try:
|
|
337
|
-
path.parent.mkdir(parents=True, exist_ok=True)
|
|
338
|
-
tmp = path.with_suffix(path.suffix + ".tmp")
|
|
339
|
-
lines = [json.dumps(f, ensure_ascii=False, sort_keys=True) for f in facts]
|
|
340
|
-
tmp.write_text("\n".join(lines) + ("\n" if lines else ""), encoding="utf-8")
|
|
341
|
-
tmp.replace(path)
|
|
342
|
-
return True
|
|
343
|
-
except OSError:
|
|
344
|
-
return False
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
def load_tunables(root) -> dict:
|
|
348
|
-
"""Read ``[dream_memory]`` overrides from the repo's ``config.toml``; defaults otherwise.
|
|
349
|
-
|
|
350
|
-
Returns ``{"prune_age_days", "max_facts", "surface_limit"}``. Fail-open — a missing config, a
|
|
351
|
-
missing helper, or a bad value degrades to the baked-in default, never raising into a hook.
|
|
352
|
-
"""
|
|
353
|
-
defaults = {"prune_age_days": PRUNE_AGE_DAYS, "max_facts": MAX_FACTS, "surface_limit": SURFACE_LIMIT}
|
|
354
|
-
try:
|
|
355
|
-
from claudster_config import get_int, load_config
|
|
356
|
-
cfg = load_config(root, "dream_memory")
|
|
357
|
-
return {
|
|
358
|
-
"prune_age_days": get_int(cfg, "prune_age_days", PRUNE_AGE_DAYS),
|
|
359
|
-
"max_facts": get_int(cfg, "max_facts", MAX_FACTS),
|
|
360
|
-
"surface_limit": get_int(cfg, "surface_limit", SURFACE_LIMIT),
|
|
361
|
-
}
|
|
362
|
-
except Exception:
|
|
363
|
-
return defaults
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
def _repo_root() -> Path:
|
|
367
|
-
"""Git top-level if available, else cwd — location-independent (matches the caddis hooks)."""
|
|
368
|
-
try:
|
|
369
|
-
import subprocess
|
|
370
|
-
out = subprocess.run(
|
|
371
|
-
["git", "rev-parse", "--show-toplevel"],
|
|
372
|
-
capture_output=True, text=True, timeout=5,
|
|
373
|
-
)
|
|
374
|
-
if out.returncode == 0 and out.stdout.strip():
|
|
375
|
-
return Path(out.stdout.strip())
|
|
376
|
-
except Exception:
|
|
377
|
-
pass
|
|
378
|
-
return Path.cwd()
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
def _format_surface(facts: list[dict]) -> list[str]:
|
|
382
|
-
"""Render ranked facts as the ≤5 SessionStart lines (the surfacing hook reuses this in 5c)."""
|
|
383
|
-
lines: list[str] = []
|
|
384
|
-
for f in facts:
|
|
385
|
-
mark = "⚠ " if f.get("kind") in WEIGHTED_KINDS else " "
|
|
386
|
-
hits = _hit(f)
|
|
387
|
-
suffix = f" (×{hits})" if hits > 1 else ""
|
|
388
|
-
lines.append(f" {mark}{f.get('kind')}: {f.get('summary')}{suffix}")
|
|
389
|
-
return lines
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
def main() -> None:
|
|
393
|
-
if hasattr(sys.stdout, "reconfigure"):
|
|
394
|
-
sys.stdout.reconfigure(encoding="utf-8") # Windows cp1252 can't encode ⚠/× glyphs
|
|
395
|
-
parser = argparse.ArgumentParser(
|
|
396
|
-
description="Inspect / consolidate the Dream Memory fact store (.caddis/memory.jsonl).",
|
|
397
|
-
)
|
|
398
|
-
parser.add_argument(
|
|
399
|
-
"--consolidate",
|
|
400
|
-
action="store_true",
|
|
401
|
-
help="Run a merge+prune cycle and rewrite the store (no-op if it would not change).",
|
|
402
|
-
)
|
|
403
|
-
parser.add_argument(
|
|
404
|
-
"--now",
|
|
405
|
-
default=None,
|
|
406
|
-
help="ISO timestamp to use as 'now' for decay/ranking (default: current UTC).",
|
|
407
|
-
)
|
|
408
|
-
args = parser.parse_args()
|
|
409
|
-
|
|
410
|
-
now = args.now or datetime.now(timezone.utc).isoformat()
|
|
411
|
-
root = _repo_root()
|
|
412
|
-
store = store_path(root)
|
|
413
|
-
tune = load_tunables(root)
|
|
414
|
-
facts = load_facts(store)
|
|
415
|
-
|
|
416
|
-
if not facts:
|
|
417
|
-
print("[memory] no facts yet.")
|
|
418
|
-
return
|
|
419
|
-
|
|
420
|
-
if args.consolidate:
|
|
421
|
-
consolidated = consolidate(facts, now, max_age_days=tune["prune_age_days"], cap=tune["max_facts"])
|
|
422
|
-
save_facts(store, consolidated)
|
|
423
|
-
print(f"[memory] consolidated: {len(facts)} → {len(consolidated)} facts.")
|
|
424
|
-
facts = consolidated
|
|
425
|
-
|
|
426
|
-
top = rank_for_surfacing(facts, tune["surface_limit"], now=now)
|
|
427
|
-
print("[memory] reinforced facts for this repo (auto; fades if not seen):")
|
|
428
|
-
for line in _format_surface(top):
|
|
429
|
-
print(line)
|
|
430
|
-
issues = conflicts(facts)
|
|
431
|
-
if issues:
|
|
432
|
-
print(f"\n[memory] {len(issues)} conflicting fact(s) — review:")
|
|
433
|
-
for c in issues:
|
|
434
|
-
print(f" {c['kind']}: {c['key']} → {len(c['summaries'])} differing summaries")
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
if __name__ == "__main__":
|
|
438
|
-
main()
|
package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
Copyright 2012 The Arsenal Project Authors (andrij.design@gmail.com)
|
|
2
|
-
|
|
3
|
-
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
-
This license is copied below, and is also available with a FAQ at:
|
|
5
|
-
https://openfontlicense.org
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
-----------------------------------------------------------
|
|
9
|
-
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
10
|
-
-----------------------------------------------------------
|
|
11
|
-
|
|
12
|
-
PREAMBLE
|
|
13
|
-
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
14
|
-
development of collaborative font projects, to support the font creation
|
|
15
|
-
efforts of academic and linguistic communities, and to provide a free and
|
|
16
|
-
open framework in which fonts may be shared and improved in partnership
|
|
17
|
-
with others.
|
|
18
|
-
|
|
19
|
-
The OFL allows the licensed fonts to be used, studied, modified and
|
|
20
|
-
redistributed freely as long as they are not sold by themselves. The
|
|
21
|
-
fonts, including any derivative works, can be bundled, embedded,
|
|
22
|
-
redistributed and/or sold with any software provided that any reserved
|
|
23
|
-
names are not used by derivative works. The fonts and derivatives,
|
|
24
|
-
however, cannot be released under any other type of license. The
|
|
25
|
-
requirement for fonts to remain under this license does not apply
|
|
26
|
-
to any document created using the fonts or their derivatives.
|
|
27
|
-
|
|
28
|
-
DEFINITIONS
|
|
29
|
-
"Font Software" refers to the set of files released by the Copyright
|
|
30
|
-
Holder(s) under this license and clearly marked as such. This may
|
|
31
|
-
include source files, build scripts and documentation.
|
|
32
|
-
|
|
33
|
-
"Reserved Font Name" refers to any names specified as such after the
|
|
34
|
-
copyright statement(s).
|
|
35
|
-
|
|
36
|
-
"Original Version" refers to the collection of Font Software components as
|
|
37
|
-
distributed by the Copyright Holder(s).
|
|
38
|
-
|
|
39
|
-
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
40
|
-
or substituting -- in part or in whole -- any of the components of the
|
|
41
|
-
Original Version, by changing formats or by porting the Font Software to a
|
|
42
|
-
new environment.
|
|
43
|
-
|
|
44
|
-
"Author" refers to any designer, engineer, programmer, technical
|
|
45
|
-
writer or other person who contributed to the Font Software.
|
|
46
|
-
|
|
47
|
-
PERMISSION & CONDITIONS
|
|
48
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
|
49
|
-
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
50
|
-
redistribute, and sell modified and unmodified copies of the Font
|
|
51
|
-
Software, subject to the following conditions:
|
|
52
|
-
|
|
53
|
-
1) Neither the Font Software nor any of its individual components,
|
|
54
|
-
in Original or Modified Versions, may be sold by itself.
|
|
55
|
-
|
|
56
|
-
2) Original or Modified Versions of the Font Software may be bundled,
|
|
57
|
-
redistributed and/or sold with any software, provided that each copy
|
|
58
|
-
contains the above copyright notice and this license. These can be
|
|
59
|
-
included either as stand-alone text files, human-readable headers or
|
|
60
|
-
in the appropriate machine-readable metadata fields within text or
|
|
61
|
-
binary files as long as those fields can be easily viewed by the user.
|
|
62
|
-
|
|
63
|
-
3) No Modified Version of the Font Software may use the Reserved Font
|
|
64
|
-
Name(s) unless explicit written permission is granted by the corresponding
|
|
65
|
-
Copyright Holder. This restriction only applies to the primary font name as
|
|
66
|
-
presented to the users.
|
|
67
|
-
|
|
68
|
-
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
69
|
-
Software shall not be used to promote, endorse or advertise any
|
|
70
|
-
Modified Version, except to acknowledge the contribution(s) of the
|
|
71
|
-
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
72
|
-
permission.
|
|
73
|
-
|
|
74
|
-
5) The Font Software, modified or unmodified, in part or in whole,
|
|
75
|
-
must be distributed entirely under this license, and must not be
|
|
76
|
-
distributed under any other license. The requirement for fonts to
|
|
77
|
-
remain under this license does not apply to any document created
|
|
78
|
-
using the Font Software.
|
|
79
|
-
|
|
80
|
-
TERMINATION
|
|
81
|
-
This license becomes null and void if any of the above conditions are
|
|
82
|
-
not met.
|
|
83
|
-
|
|
84
|
-
DISCLAIMER
|
|
85
|
-
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
86
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
87
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
88
|
-
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
89
|
-
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
90
|
-
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
91
|
-
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
92
|
-
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
93
|
-
OTHER DEALINGS IN THE FONT SOFTWARE.
|
package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf
DELETED
|
Binary file
|
package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf
DELETED
|
Binary file
|
package/bundles/antigravity-plugin-extras/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
Copyright 2019 The Big Shoulders Project Authors (https://github.com/xotypeco/big_shoulders)
|
|
2
|
-
|
|
3
|
-
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
-
This license is copied below, and is also available with a FAQ at:
|
|
5
|
-
https://openfontlicense.org
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
-----------------------------------------------------------
|
|
9
|
-
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
10
|
-
-----------------------------------------------------------
|
|
11
|
-
|
|
12
|
-
PREAMBLE
|
|
13
|
-
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
14
|
-
development of collaborative font projects, to support the font creation
|
|
15
|
-
efforts of academic and linguistic communities, and to provide a free and
|
|
16
|
-
open framework in which fonts may be shared and improved in partnership
|
|
17
|
-
with others.
|
|
18
|
-
|
|
19
|
-
The OFL allows the licensed fonts to be used, studied, modified and
|
|
20
|
-
redistributed freely as long as they are not sold by themselves. The
|
|
21
|
-
fonts, including any derivative works, can be bundled, embedded,
|
|
22
|
-
redistributed and/or sold with any software provided that any reserved
|
|
23
|
-
names are not used by derivative works. The fonts and derivatives,
|
|
24
|
-
however, cannot be released under any other type of license. The
|
|
25
|
-
requirement for fonts to remain under this license does not apply
|
|
26
|
-
to any document created using the fonts or their derivatives.
|
|
27
|
-
|
|
28
|
-
DEFINITIONS
|
|
29
|
-
"Font Software" refers to the set of files released by the Copyright
|
|
30
|
-
Holder(s) under this license and clearly marked as such. This may
|
|
31
|
-
include source files, build scripts and documentation.
|
|
32
|
-
|
|
33
|
-
"Reserved Font Name" refers to any names specified as such after the
|
|
34
|
-
copyright statement(s).
|
|
35
|
-
|
|
36
|
-
"Original Version" refers to the collection of Font Software components as
|
|
37
|
-
distributed by the Copyright Holder(s).
|
|
38
|
-
|
|
39
|
-
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
40
|
-
or substituting -- in part or in whole -- any of the components of the
|
|
41
|
-
Original Version, by changing formats or by porting the Font Software to a
|
|
42
|
-
new environment.
|
|
43
|
-
|
|
44
|
-
"Author" refers to any designer, engineer, programmer, technical
|
|
45
|
-
writer or other person who contributed to the Font Software.
|
|
46
|
-
|
|
47
|
-
PERMISSION & CONDITIONS
|
|
48
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
|
49
|
-
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
50
|
-
redistribute, and sell modified and unmodified copies of the Font
|
|
51
|
-
Software, subject to the following conditions:
|
|
52
|
-
|
|
53
|
-
1) Neither the Font Software nor any of its individual components,
|
|
54
|
-
in Original or Modified Versions, may be sold by itself.
|
|
55
|
-
|
|
56
|
-
2) Original or Modified Versions of the Font Software may be bundled,
|
|
57
|
-
redistributed and/or sold with any software, provided that each copy
|
|
58
|
-
contains the above copyright notice and this license. These can be
|
|
59
|
-
included either as stand-alone text files, human-readable headers or
|
|
60
|
-
in the appropriate machine-readable metadata fields within text or
|
|
61
|
-
binary files as long as those fields can be easily viewed by the user.
|
|
62
|
-
|
|
63
|
-
3) No Modified Version of the Font Software may use the Reserved Font
|
|
64
|
-
Name(s) unless explicit written permission is granted by the corresponding
|
|
65
|
-
Copyright Holder. This restriction only applies to the primary font name as
|
|
66
|
-
presented to the users.
|
|
67
|
-
|
|
68
|
-
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
69
|
-
Software shall not be used to promote, endorse or advertise any
|
|
70
|
-
Modified Version, except to acknowledge the contribution(s) of the
|
|
71
|
-
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
72
|
-
permission.
|
|
73
|
-
|
|
74
|
-
5) The Font Software, modified or unmodified, in part or in whole,
|
|
75
|
-
must be distributed entirely under this license, and must not be
|
|
76
|
-
distributed under any other license. The requirement for fonts to
|
|
77
|
-
remain under this license does not apply to any document created
|
|
78
|
-
using the Font Software.
|
|
79
|
-
|
|
80
|
-
TERMINATION
|
|
81
|
-
This license becomes null and void if any of the above conditions are
|
|
82
|
-
not met.
|
|
83
|
-
|
|
84
|
-
DISCLAIMER
|
|
85
|
-
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
86
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
87
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
88
|
-
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
89
|
-
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
90
|
-
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
91
|
-
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
92
|
-
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
93
|
-
OTHER DEALINGS IN THE FONT SOFTWARE.
|