@rubix0270/arboris 1.0.1 → 1.0.3
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/package.json +8 -19
- package/run.mjs +10 -0
- package/dist/cli.mjs +0 -382
- package/manifest.json +0 -323
- package/prisma/skills/accessibility/SKILL.md +0 -147
- package/prisma/skills/agent-architecture-audit/SKILL.md +0 -257
- package/prisma/skills/agent-eval/SKILL.md +0 -146
- package/prisma/skills/agent-harness-construction/SKILL.md +0 -74
- package/prisma/skills/agent-introspection-debugging/SKILL.md +0 -154
- package/prisma/skills/agent-payment-x402/SKILL.md +0 -225
- package/prisma/skills/agent-self-evaluation/SKILL.md +0 -182
- package/prisma/skills/agent-self-evaluation/examples/high-score-example.md +0 -87
- package/prisma/skills/agent-self-evaluation/examples/low-score-example.md +0 -86
- package/prisma/skills/agent-self-evaluation/references/evaluation-criteria.md +0 -71
- package/prisma/skills/agent-self-evaluation/references/hook-integration.md +0 -64
- package/prisma/skills/agent-self-evaluation/scripts/evaluate.py +0 -408
- package/prisma/skills/agent-self-evaluation/templates/evaluation-report.md +0 -86
- package/prisma/skills/agent-sort/SKILL.md +0 -216
- package/prisma/skills/agentic-engineering/SKILL.md +0 -64
- package/prisma/skills/agentic-os/SKILL.md +0 -388
- package/prisma/skills/ai-first-engineering/SKILL.md +0 -52
- package/prisma/skills/ai-regression-testing/SKILL.md +0 -386
- package/prisma/skills/android-clean-architecture/SKILL.md +0 -340
- package/prisma/skills/angular-developer/SKILL.md +0 -155
- package/prisma/skills/angular-developer/references/angular-animations.md +0 -160
- package/prisma/skills/angular-developer/references/angular-aria.md +0 -410
- package/prisma/skills/angular-developer/references/cli.md +0 -86
- package/prisma/skills/angular-developer/references/component-harnesses.md +0 -59
- package/prisma/skills/angular-developer/references/component-styling.md +0 -91
- package/prisma/skills/angular-developer/references/components.md +0 -117
- package/prisma/skills/angular-developer/references/creating-services.md +0 -97
- package/prisma/skills/angular-developer/references/data-resolvers.md +0 -69
- package/prisma/skills/angular-developer/references/define-routes.md +0 -67
- package/prisma/skills/angular-developer/references/defining-providers.md +0 -72
- package/prisma/skills/angular-developer/references/di-fundamentals.md +0 -120
- package/prisma/skills/angular-developer/references/e2e-testing.md +0 -56
- package/prisma/skills/angular-developer/references/effects.md +0 -83
- package/prisma/skills/angular-developer/references/hierarchical-injectors.md +0 -43
- package/prisma/skills/angular-developer/references/host-elements.md +0 -80
- package/prisma/skills/angular-developer/references/injection-context.md +0 -63
- package/prisma/skills/angular-developer/references/inputs.md +0 -101
- package/prisma/skills/angular-developer/references/linked-signal.md +0 -59
- package/prisma/skills/angular-developer/references/loading-strategies.md +0 -61
- package/prisma/skills/angular-developer/references/mcp.md +0 -108
- package/prisma/skills/angular-developer/references/navigate-to-routes.md +0 -69
- package/prisma/skills/angular-developer/references/outputs.md +0 -86
- package/prisma/skills/angular-developer/references/reactive-forms.md +0 -122
- package/prisma/skills/angular-developer/references/rendering-strategies.md +0 -44
- package/prisma/skills/angular-developer/references/resource.md +0 -77
- package/prisma/skills/angular-developer/references/route-animations.md +0 -56
- package/prisma/skills/angular-developer/references/route-guards.md +0 -52
- package/prisma/skills/angular-developer/references/router-lifecycle.md +0 -45
- package/prisma/skills/angular-developer/references/router-testing.md +0 -87
- package/prisma/skills/angular-developer/references/show-routes-with-outlets.md +0 -68
- package/prisma/skills/angular-developer/references/signal-forms.md +0 -795
- package/prisma/skills/angular-developer/references/signals-overview.md +0 -94
- package/prisma/skills/angular-developer/references/tailwind-css.md +0 -69
- package/prisma/skills/angular-developer/references/template-driven-forms.md +0 -114
- package/prisma/skills/angular-developer/references/testing-fundamentals.md +0 -65
- package/prisma/skills/api-connector-builder/SKILL.md +0 -121
- package/prisma/skills/api-design/SKILL.md +0 -524
- package/prisma/skills/architecture-decision-records/SKILL.md +0 -180
- package/prisma/skills/article-writing/SKILL.md +0 -80
- package/prisma/skills/automation-audit-ops/SKILL.md +0 -143
- package/prisma/skills/autonomous-agent-harness/SKILL.md +0 -274
- package/prisma/skills/autonomous-loops/SKILL.md +0 -611
- package/prisma/skills/backend-patterns/SKILL.md +0 -562
- package/prisma/skills/benchmark/SKILL.md +0 -94
- package/prisma/skills/benchmark-methodology/SKILL.md +0 -190
- package/prisma/skills/benchmark-optimization-loop/SKILL.md +0 -70
- package/prisma/skills/blender-motion-state-inspection/SKILL.md +0 -165
- package/prisma/skills/blueprint/SKILL.md +0 -106
- package/prisma/skills/brand-discovery/SKILL.md +0 -145
- package/prisma/skills/brand-discovery/references/10_purpose-why.md +0 -40
- package/prisma/skills/brand-discovery/references/20_positioning.md +0 -44
- package/prisma/skills/brand-discovery/references/30_audience-niche.md +0 -52
- package/prisma/skills/brand-discovery/references/40_personality-archetype.md +0 -57
- package/prisma/skills/brand-discovery/references/50_voice-tone.md +0 -59
- package/prisma/skills/brand-discovery/references/60_narrative-story.md +0 -50
- package/prisma/skills/brand-discovery/references/70_founder-tension.md +0 -49
- package/prisma/skills/brand-discovery/references/90_SYNTHESIS.md +0 -133
- package/prisma/skills/brand-voice/SKILL.md +0 -98
- package/prisma/skills/brand-voice/references/voice-profile-schema.md +0 -55
- package/prisma/skills/browser-qa/SKILL.md +0 -105
- package/prisma/skills/bun-runtime/SKILL.md +0 -85
- package/prisma/skills/canary-watch/SKILL.md +0 -108
- package/prisma/skills/carrier-relationship-management/SKILL.md +0 -212
- package/prisma/skills/cisco-ios-patterns/SKILL.md +0 -164
- package/prisma/skills/ck/SKILL.md +0 -148
- package/prisma/skills/ck/commands/forget.mjs +0 -44
- package/prisma/skills/ck/commands/info.mjs +0 -24
- package/prisma/skills/ck/commands/init.mjs +0 -143
- package/prisma/skills/ck/commands/list.mjs +0 -40
- package/prisma/skills/ck/commands/migrate.mjs +0 -202
- package/prisma/skills/ck/commands/resume.mjs +0 -36
- package/prisma/skills/ck/commands/save.mjs +0 -210
- package/prisma/skills/ck/commands/shared.mjs +0 -387
- package/prisma/skills/ck/hooks/session-start.mjs +0 -224
- package/prisma/skills/claude-devfleet/SKILL.md +0 -112
- package/prisma/skills/click-path-audit/SKILL.md +0 -245
- package/prisma/skills/clickhouse-io/SKILL.md +0 -440
- package/prisma/skills/code-tour/SKILL.md +0 -254
- package/prisma/skills/codebase-onboarding/SKILL.md +0 -234
- package/prisma/skills/codehealth-mcp/SKILL.md +0 -167
- package/prisma/skills/coding-standards/SKILL.md +0 -551
- package/prisma/skills/competitive-platform-analysis/SKILL.md +0 -214
- package/prisma/skills/competitive-report-structure/SKILL.md +0 -162
- package/prisma/skills/compose-multiplatform-patterns/SKILL.md +0 -300
- package/prisma/skills/config-gc/SKILL.md +0 -120
- package/prisma/skills/configure-ecc/SKILL.md +0 -385
- package/prisma/skills/connections-optimizer/SKILL.md +0 -190
- package/prisma/skills/content-engine/SKILL.md +0 -132
- package/prisma/skills/content-hash-cache-pattern/SKILL.md +0 -162
- package/prisma/skills/context-budget/SKILL.md +0 -136
- package/prisma/skills/continuous-agent-loop/SKILL.md +0 -46
- package/prisma/skills/continuous-learning/SKILL.md +0 -132
- package/prisma/skills/continuous-learning/config.json +0 -18
- package/prisma/skills/continuous-learning/evaluate-session.sh +0 -69
- package/prisma/skills/continuous-learning-v2/SKILL.md +0 -361
- package/prisma/skills/continuous-learning-v2/agents/observer-loop.sh +0 -359
- package/prisma/skills/continuous-learning-v2/agents/observer.md +0 -189
- package/prisma/skills/continuous-learning-v2/agents/session-guardian.sh +0 -150
- package/prisma/skills/continuous-learning-v2/agents/start-observer.sh +0 -248
- package/prisma/skills/continuous-learning-v2/config.json +0 -8
- package/prisma/skills/continuous-learning-v2/hooks/observe.sh +0 -585
- package/prisma/skills/continuous-learning-v2/scripts/detect-project.sh +0 -322
- package/prisma/skills/continuous-learning-v2/scripts/instinct-cli.py +0 -1956
- package/prisma/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +0 -31
- package/prisma/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +0 -68
- package/prisma/skills/continuous-learning-v2/scripts/test_parse_instinct.py +0 -1421
- package/prisma/skills/cost-aware-llm-pipeline/SKILL.md +0 -184
- package/prisma/skills/cost-tracking/SKILL.md +0 -97
- package/prisma/skills/council/SKILL.md +0 -204
- package/prisma/skills/cpp-coding-standards/SKILL.md +0 -724
- package/prisma/skills/cpp-testing/SKILL.md +0 -325
- package/prisma/skills/crosspost/SKILL.md +0 -112
- package/prisma/skills/csharp-testing/SKILL.md +0 -322
- package/prisma/skills/customer-billing-ops/SKILL.md +0 -141
- package/prisma/skills/customs-trade-compliance/SKILL.md +0 -263
- package/prisma/skills/dart-flutter-patterns/SKILL.md +0 -564
- package/prisma/skills/dashboard-builder/SKILL.md +0 -109
- package/prisma/skills/data-scraper-agent/SKILL.md +0 -765
- package/prisma/skills/data-throughput-accelerator/SKILL.md +0 -73
- package/prisma/skills/database-migrations/SKILL.md +0 -430
- package/prisma/skills/deep-research/SKILL.md +0 -160
- package/prisma/skills/defi-amm-security/SKILL.md +0 -167
- package/prisma/skills/delivery-gate/SKILL.md +0 -126
- package/prisma/skills/delivery-gate/hooks/quality-gate.py +0 -220
- package/prisma/skills/deployment-patterns/SKILL.md +0 -428
- package/prisma/skills/design-system/SKILL.md +0 -83
- package/prisma/skills/django-celery/SKILL.md +0 -458
- package/prisma/skills/django-patterns/SKILL.md +0 -735
- package/prisma/skills/django-security/SKILL.md +0 -644
- package/prisma/skills/django-tdd/SKILL.md +0 -730
- package/prisma/skills/django-verification/SKILL.md +0 -470
- package/prisma/skills/dmux-workflows/SKILL.md +0 -192
- package/prisma/skills/docker-patterns/SKILL.md +0 -365
- package/prisma/skills/documentation-lookup/SKILL.md +0 -91
- package/prisma/skills/dotnet-patterns/SKILL.md +0 -322
- package/prisma/skills/dynamic-workflow-mode/SKILL.md +0 -124
- package/prisma/skills/e2e-testing/SKILL.md +0 -327
- package/prisma/skills/ecc-guide/SKILL.md +0 -190
- package/prisma/skills/ecc-recipes/SKILL.md +0 -149
- package/prisma/skills/ecc-tools-cost-audit/SKILL.md +0 -161
- package/prisma/skills/email-ops/SKILL.md +0 -122
- package/prisma/skills/energy-procurement/SKILL.md +0 -228
- package/prisma/skills/enterprise-agent-ops/SKILL.md +0 -51
- package/prisma/skills/error-handling/SKILL.md +0 -377
- package/prisma/skills/eval-harness/SKILL.md +0 -271
- package/prisma/skills/evm-token-decimals/SKILL.md +0 -131
- package/prisma/skills/exa-search/SKILL.md +0 -108
- package/prisma/skills/fal-ai-media/SKILL.md +0 -289
- package/prisma/skills/fastapi-patterns/SKILL.md +0 -514
- package/prisma/skills/finance-billing-ops/SKILL.md +0 -128
- package/prisma/skills/flox-environments/SKILL.md +0 -497
- package/prisma/skills/flutter-dart-code-review/SKILL.md +0 -436
- package/prisma/skills/foundation-models-on-device/SKILL.md +0 -243
- package/prisma/skills/frontend-a11y/SKILL.md +0 -446
- package/prisma/skills/frontend-design-direction/SKILL.md +0 -93
- package/prisma/skills/frontend-patterns/SKILL.md +0 -657
- package/prisma/skills/frontend-slides/SKILL.md +0 -185
- package/prisma/skills/frontend-slides/STYLE_PRESETS.md +0 -330
- package/prisma/skills/frontend-slides/animation-patterns.md +0 -122
- package/prisma/skills/frontend-slides/html-template.md +0 -419
- package/prisma/skills/frontend-slides/scripts/export-pdf.sh +0 -418
- package/prisma/skills/frontend-slides/scripts/extract-pptx.py +0 -96
- package/prisma/skills/frontend-slides/viewport-base.css +0 -153
- package/prisma/skills/fsharp-testing/SKILL.md +0 -281
- package/prisma/skills/gan-style-harness/SKILL.md +0 -279
- package/prisma/skills/gateguard/SKILL.md +0 -133
- package/prisma/skills/generating-python-installer/SKILL.md +0 -820
- package/prisma/skills/git-workflow/SKILL.md +0 -716
- package/prisma/skills/github-ops/SKILL.md +0 -145
- package/prisma/skills/golang-patterns/SKILL.md +0 -675
- package/prisma/skills/golang-testing/SKILL.md +0 -721
- package/prisma/skills/google-workspace-ops/SKILL.md +0 -96
- package/prisma/skills/growth-log/SKILL.md +0 -128
- package/prisma/skills/healthcare-cdss-patterns/SKILL.md +0 -246
- package/prisma/skills/healthcare-emr-patterns/SKILL.md +0 -160
- package/prisma/skills/healthcare-eval-harness/SKILL.md +0 -208
- package/prisma/skills/healthcare-phi-compliance/SKILL.md +0 -146
- package/prisma/skills/hermes-imports/SKILL.md +0 -89
- package/prisma/skills/hexagonal-architecture/SKILL.md +0 -277
- package/prisma/skills/hipaa-compliance/SKILL.md +0 -79
- package/prisma/skills/homelab-network-readiness/SKILL.md +0 -170
- package/prisma/skills/homelab-network-setup/SKILL.md +0 -130
- package/prisma/skills/homelab-pihole-dns/SKILL.md +0 -275
- package/prisma/skills/homelab-vlan-segmentation/SKILL.md +0 -312
- package/prisma/skills/homelab-wireguard-vpn/SKILL.md +0 -306
- package/prisma/skills/hookify-rules/SKILL.md +0 -128
- package/prisma/skills/inherit-legacy-style/SKILL.md +0 -157
- package/prisma/skills/intent-driven-development/SKILL.md +0 -360
- package/prisma/skills/inventory-demand-planning/SKILL.md +0 -247
- package/prisma/skills/investor-materials/SKILL.md +0 -97
- package/prisma/skills/investor-outreach/SKILL.md +0 -92
- package/prisma/skills/ios-icon-gen/SKILL.md +0 -158
- package/prisma/skills/ios-icon-gen/scripts/generate_icons.swift +0 -258
- package/prisma/skills/ios-icon-gen/scripts/iconify_gen.sh +0 -235
- package/prisma/skills/iterative-retrieval/SKILL.md +0 -212
- package/prisma/skills/ito-basket-compare/SKILL.md +0 -64
- package/prisma/skills/ito-data-atlas-agent/SKILL.md +0 -64
- package/prisma/skills/ito-market-intelligence/SKILL.md +0 -61
- package/prisma/skills/ito-trade-planner/SKILL.md +0 -68
- package/prisma/skills/java-coding-standards/SKILL.md +0 -384
- package/prisma/skills/jira-integration/SKILL.md +0 -303
- package/prisma/skills/jpa-patterns/SKILL.md +0 -152
- package/prisma/skills/knowledge-ops/SKILL.md +0 -155
- package/prisma/skills/kotlin-coroutines-flows/SKILL.md +0 -285
- package/prisma/skills/kotlin-exposed-patterns/SKILL.md +0 -720
- package/prisma/skills/kotlin-ktor-patterns/SKILL.md +0 -690
- package/prisma/skills/kotlin-patterns/SKILL.md +0 -712
- package/prisma/skills/kotlin-testing/SKILL.md +0 -825
- package/prisma/skills/kubernetes-patterns/SKILL.md +0 -756
- package/prisma/skills/laravel-patterns/SKILL.md +0 -416
- package/prisma/skills/laravel-plugin-discovery/SKILL.md +0 -230
- package/prisma/skills/laravel-security/SKILL.md +0 -948
- package/prisma/skills/laravel-tdd/SKILL.md +0 -675
- package/prisma/skills/laravel-verification/SKILL.md +0 -180
- package/prisma/skills/latency-critical-systems/SKILL.md +0 -74
- package/prisma/skills/lead-intelligence/SKILL.md +0 -322
- package/prisma/skills/lead-intelligence/agents/enrichment-agent.md +0 -85
- package/prisma/skills/lead-intelligence/agents/mutual-mapper.md +0 -75
- package/prisma/skills/lead-intelligence/agents/outreach-drafter.md +0 -98
- package/prisma/skills/lead-intelligence/agents/signal-scorer.md +0 -60
- package/prisma/skills/liquid-glass-design/SKILL.md +0 -279
- package/prisma/skills/llm-trading-agent-security/SKILL.md +0 -147
- package/prisma/skills/logistics-exception-management/SKILL.md +0 -222
- package/prisma/skills/loop-design-check/SKILL.md +0 -143
- package/prisma/skills/mailtrap-email-integration/SKILL.md +0 -77
- package/prisma/skills/make-interfaces-feel-better/SKILL.md +0 -152
- package/prisma/skills/manim-video/SKILL.md +0 -90
- package/prisma/skills/manim-video/assets/network_graph_scene.py +0 -52
- package/prisma/skills/market-research/SKILL.md +0 -76
- package/prisma/skills/marketing-campaign/SKILL.md +0 -114
- package/prisma/skills/mcp-server-patterns/SKILL.md +0 -70
- package/prisma/skills/messages-ops/SKILL.md +0 -105
- package/prisma/skills/ml-adoption-playbook/SKILL.md +0 -57
- package/prisma/skills/mle-workflow/SKILL.md +0 -347
- package/prisma/skills/motion-advanced/SKILL.md +0 -596
- package/prisma/skills/motion-foundations/SKILL.md +0 -299
- package/prisma/skills/motion-patterns/SKILL.md +0 -434
- package/prisma/skills/motion-ui/SKILL.md +0 -576
- package/prisma/skills/mysql-patterns/SKILL.md +0 -413
- package/prisma/skills/nanoclaw-repl/SKILL.md +0 -34
- package/prisma/skills/nestjs-patterns/SKILL.md +0 -231
- package/prisma/skills/netmiko-ssh-automation/SKILL.md +0 -174
- package/prisma/skills/network-bgp-diagnostics/SKILL.md +0 -168
- package/prisma/skills/network-config-validation/SKILL.md +0 -211
- package/prisma/skills/network-interface-health/SKILL.md +0 -153
- package/prisma/skills/nextjs-turbopack/SKILL.md +0 -58
- package/prisma/skills/nodejs-keccak256/SKILL.md +0 -103
- package/prisma/skills/nutrient-document-processing/SKILL.md +0 -168
- package/prisma/skills/nuxt4-patterns/SKILL.md +0 -101
- package/prisma/skills/openclaw-persona-forge/SKILL.md +0 -289
- package/prisma/skills/openclaw-persona-forge/gacha.py +0 -224
- package/prisma/skills/openclaw-persona-forge/gacha.sh +0 -5
- package/prisma/skills/openclaw-persona-forge/references/avatar-style.md +0 -124
- package/prisma/skills/openclaw-persona-forge/references/boundary-rules.md +0 -53
- package/prisma/skills/openclaw-persona-forge/references/error-handling.md +0 -53
- package/prisma/skills/openclaw-persona-forge/references/identity-tension.md +0 -48
- package/prisma/skills/openclaw-persona-forge/references/naming-system.md +0 -39
- package/prisma/skills/openclaw-persona-forge/references/output-template.md +0 -166
- package/prisma/skills/opensource-pipeline/SKILL.md +0 -256
- package/prisma/skills/orch-add-feature/SKILL.md +0 -45
- package/prisma/skills/orch-build-mvp/SKILL.md +0 -49
- package/prisma/skills/orch-change-feature/SKILL.md +0 -43
- package/prisma/skills/orch-fix-defect/SKILL.md +0 -43
- package/prisma/skills/orch-pipeline/SKILL.md +0 -121
- package/prisma/skills/orch-refine-code/SKILL.md +0 -44
- package/prisma/skills/parallel-execution-optimizer/SKILL.md +0 -73
- package/prisma/skills/perl-patterns/SKILL.md +0 -505
- package/prisma/skills/perl-security/SKILL.md +0 -504
- package/prisma/skills/perl-testing/SKILL.md +0 -476
- package/prisma/skills/plan-orchestrate/SKILL.md +0 -263
- package/prisma/skills/plankton-code-quality/SKILL.md +0 -237
- package/prisma/skills/postgres-patterns/SKILL.md +0 -148
- package/prisma/skills/prediction-market-oracle-research/SKILL.md +0 -64
- package/prisma/skills/prediction-market-risk-review/SKILL.md +0 -61
- package/prisma/skills/prisma-patterns/SKILL.md +0 -401
- package/prisma/skills/product-capability/SKILL.md +0 -142
- package/prisma/skills/product-lens/SKILL.md +0 -93
- package/prisma/skills/production-audit/SKILL.md +0 -207
- package/prisma/skills/production-scheduling/SKILL.md +0 -238
- package/prisma/skills/project-flow-ops/SKILL.md +0 -112
- package/prisma/skills/prompt-optimizer/SKILL.md +0 -398
- package/prisma/skills/python-patterns/SKILL.md +0 -751
- package/prisma/skills/python-testing/SKILL.md +0 -817
- package/prisma/skills/pytorch-patterns/SKILL.md +0 -397
- package/prisma/skills/quality-nonconformance/SKILL.md +0 -260
- package/prisma/skills/quarkus-patterns/SKILL.md +0 -723
- package/prisma/skills/quarkus-security/SKILL.md +0 -468
- package/prisma/skills/quarkus-tdd/SKILL.md +0 -812
- package/prisma/skills/quarkus-verification/SKILL.md +0 -480
- package/prisma/skills/ralphinho-rfc-pipeline/SKILL.md +0 -68
- package/prisma/skills/react-native-patterns/SKILL.md +0 -326
- package/prisma/skills/react-patterns/SKILL.md +0 -342
- package/prisma/skills/react-performance/SKILL.md +0 -575
- package/prisma/skills/react-testing/SKILL.md +0 -424
- package/prisma/skills/recsys-pipeline-architect/SKILL.md +0 -115
- package/prisma/skills/recursive-decision-ledger/SKILL.md +0 -80
- package/prisma/skills/redis-patterns/SKILL.md +0 -404
- package/prisma/skills/regex-vs-llm-structured-text/SKILL.md +0 -221
- package/prisma/skills/remotion-video-creation/SKILL.md +0 -43
- package/prisma/skills/remotion-video-creation/rules/3d.md +0 -86
- package/prisma/skills/remotion-video-creation/rules/animations.md +0 -29
- package/prisma/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +0 -173
- package/prisma/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +0 -100
- package/prisma/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +0 -108
- package/prisma/skills/remotion-video-creation/rules/assets.md +0 -78
- package/prisma/skills/remotion-video-creation/rules/audio.md +0 -172
- package/prisma/skills/remotion-video-creation/rules/calculate-metadata.md +0 -104
- package/prisma/skills/remotion-video-creation/rules/can-decode.md +0 -75
- package/prisma/skills/remotion-video-creation/rules/charts.md +0 -58
- package/prisma/skills/remotion-video-creation/rules/compositions.md +0 -146
- package/prisma/skills/remotion-video-creation/rules/display-captions.md +0 -126
- package/prisma/skills/remotion-video-creation/rules/extract-frames.md +0 -229
- package/prisma/skills/remotion-video-creation/rules/fonts.md +0 -152
- package/prisma/skills/remotion-video-creation/rules/get-audio-duration.md +0 -58
- package/prisma/skills/remotion-video-creation/rules/get-video-dimensions.md +0 -68
- package/prisma/skills/remotion-video-creation/rules/get-video-duration.md +0 -58
- package/prisma/skills/remotion-video-creation/rules/gifs.md +0 -138
- package/prisma/skills/remotion-video-creation/rules/images.md +0 -130
- package/prisma/skills/remotion-video-creation/rules/import-srt-captions.md +0 -67
- package/prisma/skills/remotion-video-creation/rules/lottie.md +0 -67
- package/prisma/skills/remotion-video-creation/rules/measuring-dom-nodes.md +0 -34
- package/prisma/skills/remotion-video-creation/rules/measuring-text.md +0 -143
- package/prisma/skills/remotion-video-creation/rules/sequencing.md +0 -106
- package/prisma/skills/remotion-video-creation/rules/tailwind.md +0 -11
- package/prisma/skills/remotion-video-creation/rules/text-animations.md +0 -20
- package/prisma/skills/remotion-video-creation/rules/timing.md +0 -179
- package/prisma/skills/remotion-video-creation/rules/transcribe-captions.md +0 -19
- package/prisma/skills/remotion-video-creation/rules/transitions.md +0 -122
- package/prisma/skills/remotion-video-creation/rules/trimming.md +0 -52
- package/prisma/skills/remotion-video-creation/rules/videos.md +0 -171
- package/prisma/skills/repo-scan/SKILL.md +0 -79
- package/prisma/skills/research-ops/SKILL.md +0 -113
- package/prisma/skills/returns-reverse-logistics/SKILL.md +0 -240
- package/prisma/skills/rules-distill/SKILL.md +0 -265
- package/prisma/skills/rules-distill/scripts/scan-rules.sh +0 -58
- package/prisma/skills/rules-distill/scripts/scan-skills.sh +0 -129
- package/prisma/skills/rust-patterns/SKILL.md +0 -500
- package/prisma/skills/rust-testing/SKILL.md +0 -501
- package/prisma/skills/safety-guard/SKILL.md +0 -76
- package/prisma/skills/santa-method/SKILL.md +0 -307
- package/prisma/skills/scientific-db-pubmed-database/SKILL.md +0 -176
- package/prisma/skills/scientific-db-uspto-database/SKILL.md +0 -178
- package/prisma/skills/scientific-pkg-gget/SKILL.md +0 -167
- package/prisma/skills/scientific-thinking-literature-review/SKILL.md +0 -193
- package/prisma/skills/scientific-thinking-scholar-evaluation/SKILL.md +0 -161
- package/prisma/skills/search-first/SKILL.md +0 -183
- package/prisma/skills/security-bounty-hunter/SKILL.md +0 -100
- package/prisma/skills/security-review/SKILL.md +0 -504
- package/prisma/skills/security-review/cloud-infrastructure-security.md +0 -361
- package/prisma/skills/security-scan/SKILL.md +0 -166
- package/prisma/skills/seo/SKILL.md +0 -155
- package/prisma/skills/skill-comply/SKILL.md +0 -59
- package/prisma/skills/skill-comply/fixtures/compliant_trace.jsonl +0 -5
- package/prisma/skills/skill-comply/fixtures/noncompliant_trace.jsonl +0 -3
- package/prisma/skills/skill-comply/fixtures/tdd_spec.yaml +0 -44
- package/prisma/skills/skill-comply/prompts/classifier.md +0 -24
- package/prisma/skills/skill-comply/prompts/scenario_generator.md +0 -62
- package/prisma/skills/skill-comply/prompts/spec_generator.md +0 -42
- package/prisma/skills/skill-comply/pyproject.toml +0 -15
- package/prisma/skills/skill-comply/scripts/__init__.py +0 -0
- package/prisma/skills/skill-comply/scripts/classifier.py +0 -85
- package/prisma/skills/skill-comply/scripts/grader.py +0 -124
- package/prisma/skills/skill-comply/scripts/parser.py +0 -107
- package/prisma/skills/skill-comply/scripts/report.py +0 -170
- package/prisma/skills/skill-comply/scripts/run.py +0 -127
- package/prisma/skills/skill-comply/scripts/runner.py +0 -194
- package/prisma/skills/skill-comply/scripts/scenario_generator.py +0 -70
- package/prisma/skills/skill-comply/scripts/spec_generator.py +0 -72
- package/prisma/skills/skill-comply/scripts/utils.py +0 -13
- package/prisma/skills/skill-comply/tests/test_grader.py +0 -197
- package/prisma/skills/skill-comply/tests/test_parser.py +0 -90
- package/prisma/skills/skill-comply/tests/test_runner.py +0 -172
- package/prisma/skills/skill-scout/SKILL.md +0 -141
- package/prisma/skills/skill-stocktake/SKILL.md +0 -195
- package/prisma/skills/skill-stocktake/scripts/quick-diff.sh +0 -87
- package/prisma/skills/skill-stocktake/scripts/save-results.sh +0 -56
- package/prisma/skills/skill-stocktake/scripts/scan.sh +0 -170
- package/prisma/skills/social-graph-ranker/SKILL.md +0 -155
- package/prisma/skills/social-publisher/SKILL.md +0 -130
- package/prisma/skills/springboot-patterns/SKILL.md +0 -315
- package/prisma/skills/springboot-security/SKILL.md +0 -273
- package/prisma/skills/springboot-tdd/SKILL.md +0 -159
- package/prisma/skills/springboot-verification/SKILL.md +0 -232
- package/prisma/skills/strategic-compact/SKILL.md +0 -136
- package/prisma/skills/swift-actor-persistence/SKILL.md +0 -144
- package/prisma/skills/swift-concurrency-6-2/SKILL.md +0 -216
- package/prisma/skills/swift-protocol-di-testing/SKILL.md +0 -191
- package/prisma/skills/swiftui-patterns/SKILL.md +0 -259
- package/prisma/skills/taste/SKILL.md +0 -264
- package/prisma/skills/taste/references/genre-taxonomy.md +0 -87
- package/prisma/skills/tdd-workflow/SKILL.md +0 -583
- package/prisma/skills/team-agent-orchestration/SKILL.md +0 -111
- package/prisma/skills/team-builder/SKILL.md +0 -169
- package/prisma/skills/terminal-ops/SKILL.md +0 -110
- package/prisma/skills/tinystruct-patterns/SKILL.md +0 -279
- package/prisma/skills/tinystruct-patterns/references/architecture.md +0 -90
- package/prisma/skills/tinystruct-patterns/references/data-handling.md +0 -60
- package/prisma/skills/tinystruct-patterns/references/database.md +0 -99
- package/prisma/skills/tinystruct-patterns/references/routing.md +0 -64
- package/prisma/skills/tinystruct-patterns/references/system-usage.md +0 -97
- package/prisma/skills/tinystruct-patterns/references/testing.md +0 -72
- package/prisma/skills/token-budget-advisor/SKILL.md +0 -134
- package/prisma/skills/ui-demo/SKILL.md +0 -466
- package/prisma/skills/ui-to-vue/SKILL.md +0 -135
- package/prisma/skills/uncloud/SKILL.md +0 -344
- package/prisma/skills/unified-notifications-ops/SKILL.md +0 -188
- package/prisma/skills/verification-loop/SKILL.md +0 -127
- package/prisma/skills/video-editing/SKILL.md +0 -311
- package/prisma/skills/videodb/SKILL.md +0 -375
- package/prisma/skills/videodb/reference/api-reference.md +0 -550
- package/prisma/skills/videodb/reference/capture-reference.md +0 -407
- package/prisma/skills/videodb/reference/capture.md +0 -101
- package/prisma/skills/videodb/reference/editor.md +0 -443
- package/prisma/skills/videodb/reference/generative.md +0 -331
- package/prisma/skills/videodb/reference/rtstream-reference.md +0 -564
- package/prisma/skills/videodb/reference/rtstream.md +0 -65
- package/prisma/skills/videodb/reference/search.md +0 -230
- package/prisma/skills/videodb/reference/streaming.md +0 -406
- package/prisma/skills/videodb/reference/use-cases.md +0 -118
- package/prisma/skills/videodb/scripts/ws_listener.py +0 -282
- package/prisma/skills/visa-doc-translate/README.md +0 -86
- package/prisma/skills/visa-doc-translate/SKILL.md +0 -117
- package/prisma/skills/vite-patterns/SKILL.md +0 -450
- package/prisma/skills/vue-patterns/SKILL.md +0 -471
- package/prisma/skills/windows-desktop-e2e/SKILL.md +0 -888
- package/prisma/skills/workspace-surface-audit/SKILL.md +0 -126
- package/prisma/skills/x-api/SKILL.md +0 -235
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: defi-amm-security
|
|
3
|
-
description: Security checklist for Solidity AMM contracts, liquidity pools, and swap flows. Covers reentrancy, CEI ordering, donation or inflation attacks, oracle manipulation, slippage, admin controls, and integer math.
|
|
4
|
-
metadata:
|
|
5
|
-
origin: ECC direct-port adaptation
|
|
6
|
-
version: "1.0.0"
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# DeFi AMM Security
|
|
10
|
-
|
|
11
|
-
Critical vulnerability patterns and hardened implementations for Solidity AMM contracts, LP vaults, and swap functions.
|
|
12
|
-
|
|
13
|
-
## When to Use
|
|
14
|
-
|
|
15
|
-
- Writing or auditing a Solidity AMM or liquidity-pool contract
|
|
16
|
-
- Implementing swap, deposit, withdraw, mint, or burn flows that hold token balances
|
|
17
|
-
- Reviewing any contract that uses `token.balanceOf(address(this))` in share or reserve math
|
|
18
|
-
- Adding fee setters, pausers, oracle updates, or other admin functions to a DeFi protocol
|
|
19
|
-
|
|
20
|
-
## How It Works
|
|
21
|
-
|
|
22
|
-
Use this as a checklist-plus-pattern library. Review every user entrypoint against the categories below and prefer the hardened examples over hand-rolled variants.
|
|
23
|
-
|
|
24
|
-
## Execution Safety
|
|
25
|
-
|
|
26
|
-
The shell commands in this skill are local audit examples. Run them only in a trusted checkout or disposable sandbox, and do not splice untrusted contract names, paths, RPC URLs, private keys, or user-supplied flags into shell commands. Ask before installing tools or running long fuzzing/static-analysis jobs that may consume significant local or paid resources.
|
|
27
|
-
|
|
28
|
-
Never include secrets, private keys, seed phrases, API tokens, or mainnet signing credentials in command examples, logs, or reports.
|
|
29
|
-
|
|
30
|
-
## Examples
|
|
31
|
-
|
|
32
|
-
### Reentrancy: enforce CEI order
|
|
33
|
-
|
|
34
|
-
Vulnerable:
|
|
35
|
-
|
|
36
|
-
```solidity
|
|
37
|
-
function withdraw(uint256 amount) external {
|
|
38
|
-
require(balances[msg.sender] >= amount);
|
|
39
|
-
token.transfer(msg.sender, amount);
|
|
40
|
-
balances[msg.sender] -= amount;
|
|
41
|
-
}
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Safe:
|
|
45
|
-
|
|
46
|
-
```solidity
|
|
47
|
-
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
|
|
48
|
-
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
|
|
49
|
-
|
|
50
|
-
using SafeERC20 for IERC20;
|
|
51
|
-
|
|
52
|
-
function withdraw(uint256 amount) external nonReentrant {
|
|
53
|
-
require(balances[msg.sender] >= amount, "Insufficient");
|
|
54
|
-
balances[msg.sender] -= amount;
|
|
55
|
-
token.safeTransfer(msg.sender, amount);
|
|
56
|
-
}
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Do not write your own guard when a hardened library exists.
|
|
60
|
-
|
|
61
|
-
### Donation or inflation attacks
|
|
62
|
-
|
|
63
|
-
Using `token.balanceOf(address(this))` directly for share math lets attackers manipulate the denominator by sending tokens to the contract outside the intended path.
|
|
64
|
-
|
|
65
|
-
```solidity
|
|
66
|
-
// Vulnerable
|
|
67
|
-
function deposit(uint256 assets) external returns (uint256 shares) {
|
|
68
|
-
shares = (assets * totalShares) / token.balanceOf(address(this));
|
|
69
|
-
}
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
```solidity
|
|
73
|
-
// Safe
|
|
74
|
-
uint256 private _totalAssets;
|
|
75
|
-
|
|
76
|
-
function deposit(uint256 assets) external nonReentrant returns (uint256 shares) {
|
|
77
|
-
uint256 balBefore = token.balanceOf(address(this));
|
|
78
|
-
token.safeTransferFrom(msg.sender, address(this), assets);
|
|
79
|
-
uint256 received = token.balanceOf(address(this)) - balBefore;
|
|
80
|
-
|
|
81
|
-
shares = totalShares == 0 ? received : (received * totalShares) / _totalAssets;
|
|
82
|
-
_totalAssets += received;
|
|
83
|
-
totalShares += shares;
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
Track internal accounting and measure actual tokens received.
|
|
88
|
-
|
|
89
|
-
### Oracle manipulation
|
|
90
|
-
|
|
91
|
-
Spot prices are flash-loan manipulable. Prefer TWAP.
|
|
92
|
-
|
|
93
|
-
```solidity
|
|
94
|
-
uint32[] memory secondsAgos = new uint32[](2);
|
|
95
|
-
secondsAgos[0] = 1800;
|
|
96
|
-
secondsAgos[1] = 0;
|
|
97
|
-
(int56[] memory tickCumulatives,) = IUniswapV3Pool(pool).observe(secondsAgos);
|
|
98
|
-
int24 twapTick = int24(
|
|
99
|
-
(tickCumulatives[1] - tickCumulatives[0]) / int56(uint56(30 minutes))
|
|
100
|
-
);
|
|
101
|
-
uint160 sqrtPriceX96 = TickMath.getSqrtRatioAtTick(twapTick);
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
### Slippage protection
|
|
105
|
-
|
|
106
|
-
Every swap path needs caller-provided slippage and a deadline.
|
|
107
|
-
|
|
108
|
-
```solidity
|
|
109
|
-
function swap(
|
|
110
|
-
uint256 amountIn,
|
|
111
|
-
uint256 amountOutMin,
|
|
112
|
-
uint256 deadline
|
|
113
|
-
) external returns (uint256 amountOut) {
|
|
114
|
-
require(block.timestamp <= deadline, "Expired");
|
|
115
|
-
amountOut = _calculateOut(amountIn);
|
|
116
|
-
require(amountOut >= amountOutMin, "Slippage exceeded");
|
|
117
|
-
_executeSwap(amountIn, amountOut);
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### Safe reserve math
|
|
122
|
-
|
|
123
|
-
```solidity
|
|
124
|
-
import {FullMath} from "@uniswap/v3-core/contracts/libraries/FullMath.sol";
|
|
125
|
-
|
|
126
|
-
uint256 result = FullMath.mulDiv(a, b, c);
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
For large reserve math, avoid naive `a * b / c` when overflow risk exists.
|
|
130
|
-
|
|
131
|
-
### Admin controls
|
|
132
|
-
|
|
133
|
-
```solidity
|
|
134
|
-
import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
|
|
135
|
-
|
|
136
|
-
contract MyAMM is Ownable2Step {
|
|
137
|
-
function setFee(uint256 fee) external onlyOwner { ... }
|
|
138
|
-
function pause() external onlyOwner { ... }
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Prefer explicit acceptance for ownership transfer and gate every privileged path.
|
|
143
|
-
|
|
144
|
-
## Security Checklist
|
|
145
|
-
|
|
146
|
-
- Reentrancy-exposed entrypoints use `nonReentrant`
|
|
147
|
-
- CEI ordering is respected
|
|
148
|
-
- Share math does not depend on raw `balanceOf(address(this))`
|
|
149
|
-
- ERC-20 transfers use `SafeERC20`
|
|
150
|
-
- Deposits measure actual tokens received
|
|
151
|
-
- Oracle reads use TWAP or another manipulation-resistant source
|
|
152
|
-
- Swaps require `amountOutMin` and `deadline`
|
|
153
|
-
- Overflow-sensitive reserve math uses safe primitives like `mulDiv`
|
|
154
|
-
- Admin functions are access-controlled
|
|
155
|
-
- Emergency pause exists and is tested
|
|
156
|
-
- Static analysis and fuzzing are run before production
|
|
157
|
-
|
|
158
|
-
## Audit Tools
|
|
159
|
-
|
|
160
|
-
```bash
|
|
161
|
-
pip install slither-analyzer
|
|
162
|
-
slither . --exclude-dependencies
|
|
163
|
-
|
|
164
|
-
echidna-test . --contract YourAMM --config echidna.yaml
|
|
165
|
-
|
|
166
|
-
forge test --fuzz-runs 10000
|
|
167
|
-
```
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: delivery-gate
|
|
3
|
-
description: Stop hook that blocks Claude from finishing until quality checks pass. Detects rationalization patterns (surface text heuristics), stale learning logs (filesystem mtime), and low disk space. Complements self-audit by mechanically enforcing learning capture habits.
|
|
4
|
-
version: 1.1.1
|
|
5
|
-
metadata:
|
|
6
|
-
origin: ECC
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Delivery Gate — Mechanical Quality Gate for Claude Code
|
|
10
|
-
|
|
11
|
-
A **Stop hook** that checks three things before Claude can finish a session, using only **deterministic checks** — file modification timestamps, disk usage, and regex patterns on the transcript text. No AI inference.
|
|
12
|
-
|
|
13
|
-
This is distinct from reasoning gates (like `self-audit`): delivery-gate checks machine-verifiable facts; self-audit checks output quality across four reasoning dimensions. Together they form defense in depth:
|
|
14
|
-
- **delivery-gate**: "Was the learning library touched today? Is disk space safe?"
|
|
15
|
-
- **self-audit**: "Is the file content correct, complete, and honest?"
|
|
16
|
-
|
|
17
|
-
This is the same pattern as CI pipeline gates — automated, deterministic checks that verify machine-readable facts rather than trusting self-reported status.
|
|
18
|
-
|
|
19
|
-
## What It Checks
|
|
20
|
-
|
|
21
|
-
| Check | Mechanism | On Hit |
|
|
22
|
-
|-------|-----------|--------|
|
|
23
|
-
| Rationalization patterns | Regex on transcript tail | **Warning only** (never blocks) |
|
|
24
|
-
| Stale learning libraries | mtime on 5 configurable paths | Warning if some stale; **Block** if >=3 stale OR growth-log stale + complex task |
|
|
25
|
-
| Disk space < 50GB | `shutil.disk_usage` | Warning |
|
|
26
|
-
| Disk space < 15GB | `shutil.disk_usage` | **Block** (exit 2) |
|
|
27
|
-
|
|
28
|
-
Rationalization detection warns about patterns like "skip tests for now" and "pre-existing bug" — surface signals that thinking may have been cut short. It never blocks on its own, because regex heuristics can false-positive. The blocking conditions are: disk critical, `>=3 learning libs stale`, OR `growth-log` specifically stale (all require complex task >=3 edits).
|
|
29
|
-
|
|
30
|
-
## Why
|
|
31
|
-
|
|
32
|
-
Claude Code's built-in checks cover code quality (build → type → lint → test). But there's a different failure mode: the agent produces working code while the **session hygiene was neglected** — learning not captured, rationalized shortcuts, disk running out silently.
|
|
33
|
-
|
|
34
|
-
Over many sessions of "ship and forget," the human hasn't grown. This hook enforces the habit: complex task → must touch learning libraries.
|
|
35
|
-
|
|
36
|
-
## Install
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
cp quality-gate.py ~/.claude/scripts/
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Add to `~/.claude/settings.json`:
|
|
43
|
-
```json
|
|
44
|
-
{
|
|
45
|
-
"hooks": {
|
|
46
|
-
"Stop": [{
|
|
47
|
-
"hooks": [{
|
|
48
|
-
"type": "command",
|
|
49
|
-
"command": "python3 ~/.claude/scripts/quality-gate.py",
|
|
50
|
-
"timeout": 5000
|
|
51
|
-
}]
|
|
52
|
-
}]
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## Learning Libraries
|
|
58
|
-
|
|
59
|
-
Create these files in your project's memory directory. The hook checks if at least one was updated today:
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
memory/
|
|
63
|
-
├── growth-log/ # Daily learning entries (directory)
|
|
64
|
-
├── decisions/log.md # Decision log
|
|
65
|
-
├── output-index.md # Index of session outputs
|
|
66
|
-
├── ratings-tracker.md # Skill ratings over time
|
|
67
|
-
└── tooling_capabilities.md # Known tools inventory
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Customize the `LIBS` dict to match your own file structure.
|
|
71
|
-
|
|
72
|
-
## Configuration
|
|
73
|
-
|
|
74
|
-
Edit `quality-gate.py`:
|
|
75
|
-
|
|
76
|
-
| Variable | Default | Purpose |
|
|
77
|
-
|----------|---------|---------|
|
|
78
|
-
| `RATIONALIZE` | 4 patterns | Regex patterns for rationalization detection |
|
|
79
|
-
| `LIBS` | 5 libraries | Files/dirs to check for today's updates |
|
|
80
|
-
| `COMPLEX_THRESHOLD` | 3 | Edit/Write calls to classify as complex |
|
|
81
|
-
| `DISK_WARN_GB` | 50 | Warn below this |
|
|
82
|
-
| `DISK_CRIT_GB` | 15 | Block below this |
|
|
83
|
-
|
|
84
|
-
## Examples
|
|
85
|
-
|
|
86
|
-
**Simple session — allowed:**
|
|
87
|
-
```
|
|
88
|
-
edit_count=1 (< 3, not complex) → exit 0
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
**Complex task, learning captured — allowed:**
|
|
92
|
-
```
|
|
93
|
-
edit_count=5 (complex) → checks LIBS → growth-log updated today → exit 0
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**Complex task, no learning — BLOCKED:**
|
|
97
|
-
```
|
|
98
|
-
edit_count=4 (complex) → checks LIBS → all 5 stale → exit 2
|
|
99
|
-
stderr: "Blocked: complex task completed but no learning captured today."
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
**Low disk space — BLOCKED:**
|
|
103
|
-
```
|
|
104
|
-
disk_free=12GB < 15GB critical → exit 2
|
|
105
|
-
stderr: "Blocked: disk space at 12GB (threshold: 15GB)."
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## Limitations
|
|
109
|
-
|
|
110
|
-
The hook enforces the **habit** of touching learning libraries, not the **quality** of what was recorded. If `output-index.md` is updated but `growth-log` is skipped, the hook passes (1 of 5 libraries touched). This is by design: mechanical gates check machine-verifiable facts. For content quality verification, pair with `self-audit`.
|
|
111
|
-
|
|
112
|
-
## Compatibility
|
|
113
|
-
|
|
114
|
-
- Python 3.8+ (uses `from __future__ import annotations`)
|
|
115
|
-
- Cross-platform: Windows, macOS, Linux
|
|
116
|
-
- Zero dependencies beyond stdlib
|
|
117
|
-
|
|
118
|
-
## Quality
|
|
119
|
-
|
|
120
|
-
This code went through 4 rounds of automated code review (CodeRabbit + Greptile) with 9 real bugs found and fixed.
|
|
121
|
-
|
|
122
|
-
## See Also
|
|
123
|
-
|
|
124
|
-
- `self-audit` — Reasoning quality gate (completeness/consistency/groundedness/honesty)
|
|
125
|
-
- `verification-loop` — Code quality checks (build/type/lint/test)
|
|
126
|
-
- `gateguard` — PreToolUse safety gate
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Stop hook: quality gate with delivery check.
|
|
4
|
-
Detects incomplete work, stale learning logs, and low disk space.
|
|
5
|
-
Blocks Claude from stopping when a complex task completed without learning capture.
|
|
6
|
-
|
|
7
|
-
Install: cp this file to ~/.claude/scripts/quality-gate.py
|
|
8
|
-
Configure: Add to settings.json hooks.Stop
|
|
9
|
-
"""
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
import sys
|
|
13
|
-
import os
|
|
14
|
-
import re
|
|
15
|
-
import json
|
|
16
|
-
import datetime
|
|
17
|
-
import shutil
|
|
18
|
-
import logging
|
|
19
|
-
from typing import Optional
|
|
20
|
-
|
|
21
|
-
# ---- Configuration ----
|
|
22
|
-
RATIONALIZE = [
|
|
23
|
-
r'(?:this|that)\s+is\s+a\s+pre[- ]existing\s+(?:issue|bug)\b(?!\s+(?:that|which|and))',
|
|
24
|
-
r'skipping\s+(?:tests?|lint|coverage|type[- ]check)\s+for\s+now',
|
|
25
|
-
r'(?:tests?|coverage)\s+(?:are|is)\s+(?:failing|broken)\s+but\s+(?:I|we)\s+(?:\'ll|can|will)\s+(?:fix|address|resolve|handle)',
|
|
26
|
-
r'(?:not\s+addressing|won\'t\s+fix|leaving)\s+the\s+(?:failing|broken)\s+(?:tests?|builds?|integration\s+tests?)',
|
|
27
|
-
]
|
|
28
|
-
|
|
29
|
-
LIBS = {
|
|
30
|
-
'ratings-tracker': 'ratings-tracker.md',
|
|
31
|
-
'decisions-log': 'decisions/log.md',
|
|
32
|
-
'growth-log': 'growth-log/',
|
|
33
|
-
'output-index': 'output-index.md',
|
|
34
|
-
'tooling-capabilities': 'tooling_capabilities.md',
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
MIN_CHARS = 40
|
|
38
|
-
COMPLEX_THRESHOLD = 3
|
|
39
|
-
DISK_REMIND_GB = 50
|
|
40
|
-
DISK_WARN_GB = 30
|
|
41
|
-
DISK_CRIT_GB = 15
|
|
42
|
-
# ---- End Configuration ----
|
|
43
|
-
|
|
44
|
-
logging.basicConfig(
|
|
45
|
-
stream=sys.stderr,
|
|
46
|
-
format='%(levelname)s: %(message)s',
|
|
47
|
-
level=logging.INFO,
|
|
48
|
-
)
|
|
49
|
-
log = logging.getLogger('quality-gate')
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def get_project_memory_dir() -> Optional[str]:
|
|
53
|
-
"""Find the current project's memory directory.
|
|
54
|
-
|
|
55
|
-
Returns None if no memory directory exists for this project.
|
|
56
|
-
Does NOT fall back to other projects (privacy boundary)."""
|
|
57
|
-
cwd = os.environ.get('CLAUDE_PROJECT_DIR', os.getcwd())
|
|
58
|
-
safe = cwd.replace(':', '-').replace('\\', '-').replace('/', '-')
|
|
59
|
-
mem = os.path.expanduser(f'~/.claude/projects/{safe}/memory')
|
|
60
|
-
log.info('Looking for memory dir: cwd=%s -> %s', cwd, mem)
|
|
61
|
-
if os.path.isdir(mem):
|
|
62
|
-
return mem
|
|
63
|
-
return None
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def check_disk() -> Optional[int]:
|
|
67
|
-
"""Check free space on the disk containing the home directory.
|
|
68
|
-
|
|
69
|
-
Works cross-platform: macOS, Linux, Windows.
|
|
70
|
-
Returns free GB, or None if the home directory is unavailable."""
|
|
71
|
-
try:
|
|
72
|
-
home = os.path.expanduser('~')
|
|
73
|
-
free_gb = shutil.disk_usage(home).free // (2**30)
|
|
74
|
-
return free_gb
|
|
75
|
-
except (FileNotFoundError, PermissionError, OSError):
|
|
76
|
-
log.warning('cannot check disk space (home dir inaccessible)')
|
|
77
|
-
return None
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def check_stale_libs(mem_dir: str) -> list[str]:
|
|
81
|
-
"""Return list of library names not updated today.
|
|
82
|
-
|
|
83
|
-
Per-file OSError handling: individual unreadable files are skipped,
|
|
84
|
-
but the scan continues for remaining libraries."""
|
|
85
|
-
today = datetime.date.today()
|
|
86
|
-
stale: list[str] = []
|
|
87
|
-
for name, path in LIBS.items():
|
|
88
|
-
full = os.path.join(mem_dir, path)
|
|
89
|
-
try:
|
|
90
|
-
if os.path.isdir(full):
|
|
91
|
-
has_today = False
|
|
92
|
-
for dirpath, _dirnames, filenames in os.walk(full):
|
|
93
|
-
for f in filenames:
|
|
94
|
-
fp = os.path.join(dirpath, f)
|
|
95
|
-
try:
|
|
96
|
-
mt = datetime.datetime.fromtimestamp(os.path.getmtime(fp)).date()
|
|
97
|
-
if mt == today:
|
|
98
|
-
has_today = True
|
|
99
|
-
break
|
|
100
|
-
except OSError:
|
|
101
|
-
continue
|
|
102
|
-
if has_today:
|
|
103
|
-
break
|
|
104
|
-
if not has_today:
|
|
105
|
-
stale.append(name)
|
|
106
|
-
elif os.path.exists(full):
|
|
107
|
-
try:
|
|
108
|
-
mt = datetime.datetime.fromtimestamp(os.path.getmtime(full)).date()
|
|
109
|
-
if mt != today:
|
|
110
|
-
stale.append(name)
|
|
111
|
-
except OSError:
|
|
112
|
-
stale.append(name)
|
|
113
|
-
else:
|
|
114
|
-
stale.append(name)
|
|
115
|
-
except OSError as e:
|
|
116
|
-
log.warning('cannot access lib %s: %s', name, e)
|
|
117
|
-
stale.append(name)
|
|
118
|
-
return stale
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
def count_edits(text: str) -> int:
|
|
122
|
-
"""Count Edit/Write tool invocations in the full transcript.
|
|
123
|
-
|
|
124
|
-
Matches structured tool-call JSON patterns to avoid false-positives
|
|
125
|
-
from ordinary English prose. Scans entire transcript."""
|
|
126
|
-
return len(re.findall(r'"name":\s*"(?:Edit|Write)"', text))
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
def main() -> None:
|
|
130
|
-
raw = sys.stdin.read()
|
|
131
|
-
# Stop hooks write feedback to stderr, not stdout.
|
|
132
|
-
# Claude Code reads stderr as the hook's response message.
|
|
133
|
-
# Do NOT echo raw JSON to stdout — it would overwrite the blocking reason.
|
|
134
|
-
|
|
135
|
-
# Resolve transcript: Stop hooks may receive raw text OR JSON with transcript_path.
|
|
136
|
-
transcript = raw
|
|
137
|
-
try:
|
|
138
|
-
payload = json.loads(raw)
|
|
139
|
-
if isinstance(payload, dict) and 'transcript_path' in payload:
|
|
140
|
-
tp = os.path.expanduser(payload['transcript_path'])
|
|
141
|
-
if os.path.exists(tp):
|
|
142
|
-
with open(tp, 'r', encoding='utf-8') as f:
|
|
143
|
-
transcript = f.read()
|
|
144
|
-
else:
|
|
145
|
-
log.warning('transcript_path %s not found, falling back to raw stdin', tp)
|
|
146
|
-
except (json.JSONDecodeError, TypeError, OSError):
|
|
147
|
-
pass
|
|
148
|
-
|
|
149
|
-
# 1. Disk check — three-level: remind / warn / block
|
|
150
|
-
disk_free = check_disk()
|
|
151
|
-
if disk_free is not None:
|
|
152
|
-
if disk_free < DISK_CRIT_GB:
|
|
153
|
-
log.warning('Blocked: disk space at %dGB (<%dGB). Free space before continuing.',
|
|
154
|
-
disk_free, DISK_CRIT_GB)
|
|
155
|
-
sys.exit(2)
|
|
156
|
-
if disk_free < DISK_WARN_GB:
|
|
157
|
-
log.warning('WARN: disk space at %dGB (<%dGB)', disk_free, DISK_WARN_GB)
|
|
158
|
-
elif disk_free < DISK_REMIND_GB:
|
|
159
|
-
log.info('Reminder: disk space at %dGB (<%dGB)', disk_free, DISK_REMIND_GB)
|
|
160
|
-
|
|
161
|
-
# 2. Short session — skip remaining checks
|
|
162
|
-
if len(transcript) < MIN_CHARS:
|
|
163
|
-
sys.exit(0)
|
|
164
|
-
|
|
165
|
-
tail = transcript[-8000:]
|
|
166
|
-
|
|
167
|
-
# 3. Rationalization pattern detection
|
|
168
|
-
hits = []
|
|
169
|
-
for p in RATIONALIZE:
|
|
170
|
-
m = re.search(p, tail, re.IGNORECASE)
|
|
171
|
-
if m:
|
|
172
|
-
hits.append(m.group(0)[:80])
|
|
173
|
-
if hits:
|
|
174
|
-
log.warning('quality-gate: rationalization detected — %s', hits)
|
|
175
|
-
|
|
176
|
-
# 4. Learning capture check
|
|
177
|
-
mem_dir = get_project_memory_dir()
|
|
178
|
-
edit_count = count_edits(transcript)
|
|
179
|
-
is_complex = edit_count >= COMPLEX_THRESHOLD
|
|
180
|
-
|
|
181
|
-
if mem_dir:
|
|
182
|
-
stale = check_stale_libs(mem_dir)
|
|
183
|
-
else:
|
|
184
|
-
# No memory dir — setup incomplete.
|
|
185
|
-
# Warn but DO NOT block: blocking here deadlocks new users
|
|
186
|
-
# who haven't created the memory directory yet.
|
|
187
|
-
if is_complex:
|
|
188
|
-
log.warning('No project memory directory found — cannot verify learning capture.')
|
|
189
|
-
log.warning('Set up memory/ per delivery-gate SKILL.md to enable enforcement.')
|
|
190
|
-
stale = []
|
|
191
|
-
|
|
192
|
-
parts = []
|
|
193
|
-
if is_complex:
|
|
194
|
-
status_icons = ['X' if s in stale else 'O' for s in LIBS]
|
|
195
|
-
parts.append(
|
|
196
|
-
f'\n Complex task ({edit_count} edits). '
|
|
197
|
-
f'Check: [{"][".join(f"{k}:{v}" for k,v in zip(LIBS.keys(), status_icons))}]'
|
|
198
|
-
)
|
|
199
|
-
if stale:
|
|
200
|
-
parts.append(f' Stale ({len(stale)}): {", ".join(stale)}')
|
|
201
|
-
|
|
202
|
-
if parts:
|
|
203
|
-
log.warning('\n'.join(parts))
|
|
204
|
-
|
|
205
|
-
# 5. Block if complex task completed without learning capture
|
|
206
|
-
if is_complex:
|
|
207
|
-
if len(stale) >= 3:
|
|
208
|
-
log.warning('Blocked: complex task but >=3 learning libs stale.')
|
|
209
|
-
log.warning(f'Stale: {", ".join(stale)}. Update before stopping.')
|
|
210
|
-
sys.exit(2)
|
|
211
|
-
if 'growth-log' in stale:
|
|
212
|
-
log.warning('Blocked: code changes made but no growth-log update.')
|
|
213
|
-
log.warning('Write growth-log before stopping (even if "no new learnings").')
|
|
214
|
-
sys.exit(2)
|
|
215
|
-
|
|
216
|
-
sys.exit(0)
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
if __name__ == '__main__':
|
|
220
|
-
main()
|