@rubix0270/arboris 1.0.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/README.md +151 -0
- package/cli/manifest.json +323 -0
- package/dist/cli.mjs +376 -0
- package/package.json +81 -0
- package/prisma/skills/accessibility/SKILL.md +147 -0
- package/prisma/skills/agent-architecture-audit/SKILL.md +257 -0
- package/prisma/skills/agent-eval/SKILL.md +146 -0
- package/prisma/skills/agent-harness-construction/SKILL.md +74 -0
- package/prisma/skills/agent-introspection-debugging/SKILL.md +154 -0
- package/prisma/skills/agent-payment-x402/SKILL.md +225 -0
- package/prisma/skills/agent-self-evaluation/SKILL.md +182 -0
- package/prisma/skills/agent-self-evaluation/examples/high-score-example.md +87 -0
- package/prisma/skills/agent-self-evaluation/examples/low-score-example.md +86 -0
- package/prisma/skills/agent-self-evaluation/references/evaluation-criteria.md +71 -0
- package/prisma/skills/agent-self-evaluation/references/hook-integration.md +64 -0
- package/prisma/skills/agent-self-evaluation/scripts/evaluate.py +408 -0
- package/prisma/skills/agent-self-evaluation/templates/evaluation-report.md +86 -0
- package/prisma/skills/agent-sort/SKILL.md +216 -0
- package/prisma/skills/agentic-engineering/SKILL.md +64 -0
- package/prisma/skills/agentic-os/SKILL.md +388 -0
- package/prisma/skills/ai-first-engineering/SKILL.md +52 -0
- package/prisma/skills/ai-regression-testing/SKILL.md +386 -0
- package/prisma/skills/android-clean-architecture/SKILL.md +340 -0
- package/prisma/skills/angular-developer/SKILL.md +155 -0
- package/prisma/skills/angular-developer/references/angular-animations.md +160 -0
- package/prisma/skills/angular-developer/references/angular-aria.md +410 -0
- package/prisma/skills/angular-developer/references/cli.md +86 -0
- package/prisma/skills/angular-developer/references/component-harnesses.md +59 -0
- package/prisma/skills/angular-developer/references/component-styling.md +91 -0
- package/prisma/skills/angular-developer/references/components.md +117 -0
- package/prisma/skills/angular-developer/references/creating-services.md +97 -0
- package/prisma/skills/angular-developer/references/data-resolvers.md +69 -0
- package/prisma/skills/angular-developer/references/define-routes.md +67 -0
- package/prisma/skills/angular-developer/references/defining-providers.md +72 -0
- package/prisma/skills/angular-developer/references/di-fundamentals.md +120 -0
- package/prisma/skills/angular-developer/references/e2e-testing.md +56 -0
- package/prisma/skills/angular-developer/references/effects.md +83 -0
- package/prisma/skills/angular-developer/references/hierarchical-injectors.md +43 -0
- package/prisma/skills/angular-developer/references/host-elements.md +80 -0
- package/prisma/skills/angular-developer/references/injection-context.md +63 -0
- package/prisma/skills/angular-developer/references/inputs.md +101 -0
- package/prisma/skills/angular-developer/references/linked-signal.md +59 -0
- package/prisma/skills/angular-developer/references/loading-strategies.md +61 -0
- package/prisma/skills/angular-developer/references/mcp.md +108 -0
- package/prisma/skills/angular-developer/references/navigate-to-routes.md +69 -0
- package/prisma/skills/angular-developer/references/outputs.md +86 -0
- package/prisma/skills/angular-developer/references/reactive-forms.md +122 -0
- package/prisma/skills/angular-developer/references/rendering-strategies.md +44 -0
- package/prisma/skills/angular-developer/references/resource.md +77 -0
- package/prisma/skills/angular-developer/references/route-animations.md +56 -0
- package/prisma/skills/angular-developer/references/route-guards.md +52 -0
- package/prisma/skills/angular-developer/references/router-lifecycle.md +45 -0
- package/prisma/skills/angular-developer/references/router-testing.md +87 -0
- package/prisma/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
- package/prisma/skills/angular-developer/references/signal-forms.md +795 -0
- package/prisma/skills/angular-developer/references/signals-overview.md +94 -0
- package/prisma/skills/angular-developer/references/tailwind-css.md +69 -0
- package/prisma/skills/angular-developer/references/template-driven-forms.md +114 -0
- package/prisma/skills/angular-developer/references/testing-fundamentals.md +65 -0
- package/prisma/skills/api-connector-builder/SKILL.md +121 -0
- package/prisma/skills/api-design/SKILL.md +524 -0
- package/prisma/skills/architecture-decision-records/SKILL.md +180 -0
- package/prisma/skills/article-writing/SKILL.md +80 -0
- package/prisma/skills/automation-audit-ops/SKILL.md +143 -0
- package/prisma/skills/autonomous-agent-harness/SKILL.md +274 -0
- package/prisma/skills/autonomous-loops/SKILL.md +611 -0
- package/prisma/skills/backend-patterns/SKILL.md +562 -0
- package/prisma/skills/benchmark/SKILL.md +94 -0
- package/prisma/skills/benchmark-methodology/SKILL.md +190 -0
- package/prisma/skills/benchmark-optimization-loop/SKILL.md +70 -0
- package/prisma/skills/blender-motion-state-inspection/SKILL.md +165 -0
- package/prisma/skills/blueprint/SKILL.md +106 -0
- package/prisma/skills/brand-discovery/SKILL.md +145 -0
- package/prisma/skills/brand-discovery/references/10_purpose-why.md +40 -0
- package/prisma/skills/brand-discovery/references/20_positioning.md +44 -0
- package/prisma/skills/brand-discovery/references/30_audience-niche.md +52 -0
- package/prisma/skills/brand-discovery/references/40_personality-archetype.md +57 -0
- package/prisma/skills/brand-discovery/references/50_voice-tone.md +59 -0
- package/prisma/skills/brand-discovery/references/60_narrative-story.md +50 -0
- package/prisma/skills/brand-discovery/references/70_founder-tension.md +49 -0
- package/prisma/skills/brand-discovery/references/90_SYNTHESIS.md +133 -0
- package/prisma/skills/brand-voice/SKILL.md +98 -0
- package/prisma/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/prisma/skills/browser-qa/SKILL.md +105 -0
- package/prisma/skills/bun-runtime/SKILL.md +85 -0
- package/prisma/skills/canary-watch/SKILL.md +108 -0
- package/prisma/skills/carrier-relationship-management/SKILL.md +212 -0
- package/prisma/skills/cisco-ios-patterns/SKILL.md +164 -0
- package/prisma/skills/ck/SKILL.md +148 -0
- package/prisma/skills/ck/commands/forget.mjs +44 -0
- package/prisma/skills/ck/commands/info.mjs +24 -0
- package/prisma/skills/ck/commands/init.mjs +143 -0
- package/prisma/skills/ck/commands/list.mjs +40 -0
- package/prisma/skills/ck/commands/migrate.mjs +202 -0
- package/prisma/skills/ck/commands/resume.mjs +36 -0
- package/prisma/skills/ck/commands/save.mjs +210 -0
- package/prisma/skills/ck/commands/shared.mjs +387 -0
- package/prisma/skills/ck/hooks/session-start.mjs +224 -0
- package/prisma/skills/claude-devfleet/SKILL.md +112 -0
- package/prisma/skills/click-path-audit/SKILL.md +245 -0
- package/prisma/skills/clickhouse-io/SKILL.md +440 -0
- package/prisma/skills/code-tour/SKILL.md +254 -0
- package/prisma/skills/codebase-onboarding/SKILL.md +234 -0
- package/prisma/skills/codehealth-mcp/SKILL.md +167 -0
- package/prisma/skills/coding-standards/SKILL.md +551 -0
- package/prisma/skills/competitive-platform-analysis/SKILL.md +214 -0
- package/prisma/skills/competitive-report-structure/SKILL.md +162 -0
- package/prisma/skills/compose-multiplatform-patterns/SKILL.md +300 -0
- package/prisma/skills/config-gc/SKILL.md +120 -0
- package/prisma/skills/configure-ecc/SKILL.md +385 -0
- package/prisma/skills/connections-optimizer/SKILL.md +190 -0
- package/prisma/skills/content-engine/SKILL.md +132 -0
- package/prisma/skills/content-hash-cache-pattern/SKILL.md +162 -0
- package/prisma/skills/context-budget/SKILL.md +136 -0
- package/prisma/skills/continuous-agent-loop/SKILL.md +46 -0
- package/prisma/skills/continuous-learning/SKILL.md +132 -0
- package/prisma/skills/continuous-learning/config.json +18 -0
- package/prisma/skills/continuous-learning/evaluate-session.sh +69 -0
- package/prisma/skills/continuous-learning-v2/SKILL.md +361 -0
- package/prisma/skills/continuous-learning-v2/agents/observer-loop.sh +359 -0
- package/prisma/skills/continuous-learning-v2/agents/observer.md +189 -0
- package/prisma/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/prisma/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
- package/prisma/skills/continuous-learning-v2/config.json +8 -0
- package/prisma/skills/continuous-learning-v2/hooks/observe.sh +585 -0
- package/prisma/skills/continuous-learning-v2/scripts/detect-project.sh +322 -0
- package/prisma/skills/continuous-learning-v2/scripts/instinct-cli.py +1956 -0
- package/prisma/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
- package/prisma/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +68 -0
- package/prisma/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1421 -0
- package/prisma/skills/cost-aware-llm-pipeline/SKILL.md +184 -0
- package/prisma/skills/cost-tracking/SKILL.md +97 -0
- package/prisma/skills/council/SKILL.md +204 -0
- package/prisma/skills/cpp-coding-standards/SKILL.md +724 -0
- package/prisma/skills/cpp-testing/SKILL.md +325 -0
- package/prisma/skills/crosspost/SKILL.md +112 -0
- package/prisma/skills/csharp-testing/SKILL.md +322 -0
- package/prisma/skills/customer-billing-ops/SKILL.md +141 -0
- package/prisma/skills/customs-trade-compliance/SKILL.md +263 -0
- package/prisma/skills/dart-flutter-patterns/SKILL.md +564 -0
- package/prisma/skills/dashboard-builder/SKILL.md +109 -0
- package/prisma/skills/data-scraper-agent/SKILL.md +765 -0
- package/prisma/skills/data-throughput-accelerator/SKILL.md +73 -0
- package/prisma/skills/database-migrations/SKILL.md +430 -0
- package/prisma/skills/deep-research/SKILL.md +160 -0
- package/prisma/skills/defi-amm-security/SKILL.md +167 -0
- package/prisma/skills/delivery-gate/SKILL.md +126 -0
- package/prisma/skills/delivery-gate/hooks/quality-gate.py +220 -0
- package/prisma/skills/deployment-patterns/SKILL.md +428 -0
- package/prisma/skills/design-system/SKILL.md +83 -0
- package/prisma/skills/django-celery/SKILL.md +458 -0
- package/prisma/skills/django-patterns/SKILL.md +735 -0
- package/prisma/skills/django-security/SKILL.md +644 -0
- package/prisma/skills/django-tdd/SKILL.md +730 -0
- package/prisma/skills/django-verification/SKILL.md +470 -0
- package/prisma/skills/dmux-workflows/SKILL.md +192 -0
- package/prisma/skills/docker-patterns/SKILL.md +365 -0
- package/prisma/skills/documentation-lookup/SKILL.md +91 -0
- package/prisma/skills/dotnet-patterns/SKILL.md +322 -0
- package/prisma/skills/dynamic-workflow-mode/SKILL.md +124 -0
- package/prisma/skills/e2e-testing/SKILL.md +327 -0
- package/prisma/skills/ecc-guide/SKILL.md +190 -0
- package/prisma/skills/ecc-recipes/SKILL.md +149 -0
- package/prisma/skills/ecc-tools-cost-audit/SKILL.md +161 -0
- package/prisma/skills/email-ops/SKILL.md +122 -0
- package/prisma/skills/energy-procurement/SKILL.md +228 -0
- package/prisma/skills/enterprise-agent-ops/SKILL.md +51 -0
- package/prisma/skills/error-handling/SKILL.md +377 -0
- package/prisma/skills/eval-harness/SKILL.md +271 -0
- package/prisma/skills/evm-token-decimals/SKILL.md +131 -0
- package/prisma/skills/exa-search/SKILL.md +108 -0
- package/prisma/skills/fal-ai-media/SKILL.md +289 -0
- package/prisma/skills/fastapi-patterns/SKILL.md +514 -0
- package/prisma/skills/finance-billing-ops/SKILL.md +128 -0
- package/prisma/skills/flox-environments/SKILL.md +497 -0
- package/prisma/skills/flutter-dart-code-review/SKILL.md +436 -0
- package/prisma/skills/foundation-models-on-device/SKILL.md +243 -0
- package/prisma/skills/frontend-a11y/SKILL.md +446 -0
- package/prisma/skills/frontend-design-direction/SKILL.md +93 -0
- package/prisma/skills/frontend-patterns/SKILL.md +657 -0
- package/prisma/skills/frontend-slides/SKILL.md +185 -0
- package/prisma/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/prisma/skills/frontend-slides/animation-patterns.md +122 -0
- package/prisma/skills/frontend-slides/html-template.md +419 -0
- package/prisma/skills/frontend-slides/scripts/export-pdf.sh +418 -0
- package/prisma/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/prisma/skills/frontend-slides/viewport-base.css +153 -0
- package/prisma/skills/fsharp-testing/SKILL.md +281 -0
- package/prisma/skills/gan-style-harness/SKILL.md +279 -0
- package/prisma/skills/gateguard/SKILL.md +133 -0
- package/prisma/skills/generating-python-installer/SKILL.md +820 -0
- package/prisma/skills/git-workflow/SKILL.md +716 -0
- package/prisma/skills/github-ops/SKILL.md +145 -0
- package/prisma/skills/golang-patterns/SKILL.md +675 -0
- package/prisma/skills/golang-testing/SKILL.md +721 -0
- package/prisma/skills/google-workspace-ops/SKILL.md +96 -0
- package/prisma/skills/growth-log/SKILL.md +128 -0
- package/prisma/skills/healthcare-cdss-patterns/SKILL.md +246 -0
- package/prisma/skills/healthcare-emr-patterns/SKILL.md +160 -0
- package/prisma/skills/healthcare-eval-harness/SKILL.md +208 -0
- package/prisma/skills/healthcare-phi-compliance/SKILL.md +146 -0
- package/prisma/skills/hermes-imports/SKILL.md +89 -0
- package/prisma/skills/hexagonal-architecture/SKILL.md +277 -0
- package/prisma/skills/hipaa-compliance/SKILL.md +79 -0
- package/prisma/skills/homelab-network-readiness/SKILL.md +170 -0
- package/prisma/skills/homelab-network-setup/SKILL.md +130 -0
- package/prisma/skills/homelab-pihole-dns/SKILL.md +275 -0
- package/prisma/skills/homelab-vlan-segmentation/SKILL.md +312 -0
- package/prisma/skills/homelab-wireguard-vpn/SKILL.md +306 -0
- package/prisma/skills/hookify-rules/SKILL.md +128 -0
- package/prisma/skills/inherit-legacy-style/SKILL.md +157 -0
- package/prisma/skills/intent-driven-development/SKILL.md +360 -0
- package/prisma/skills/inventory-demand-planning/SKILL.md +247 -0
- package/prisma/skills/investor-materials/SKILL.md +97 -0
- package/prisma/skills/investor-outreach/SKILL.md +92 -0
- package/prisma/skills/ios-icon-gen/SKILL.md +158 -0
- package/prisma/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
- package/prisma/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
- package/prisma/skills/iterative-retrieval/SKILL.md +212 -0
- package/prisma/skills/ito-basket-compare/SKILL.md +64 -0
- package/prisma/skills/ito-data-atlas-agent/SKILL.md +64 -0
- package/prisma/skills/ito-market-intelligence/SKILL.md +61 -0
- package/prisma/skills/ito-trade-planner/SKILL.md +68 -0
- package/prisma/skills/java-coding-standards/SKILL.md +384 -0
- package/prisma/skills/jira-integration/SKILL.md +303 -0
- package/prisma/skills/jpa-patterns/SKILL.md +152 -0
- package/prisma/skills/knowledge-ops/SKILL.md +155 -0
- package/prisma/skills/kotlin-coroutines-flows/SKILL.md +285 -0
- package/prisma/skills/kotlin-exposed-patterns/SKILL.md +720 -0
- package/prisma/skills/kotlin-ktor-patterns/SKILL.md +690 -0
- package/prisma/skills/kotlin-patterns/SKILL.md +712 -0
- package/prisma/skills/kotlin-testing/SKILL.md +825 -0
- package/prisma/skills/kubernetes-patterns/SKILL.md +756 -0
- package/prisma/skills/laravel-patterns/SKILL.md +416 -0
- package/prisma/skills/laravel-plugin-discovery/SKILL.md +230 -0
- package/prisma/skills/laravel-security/SKILL.md +948 -0
- package/prisma/skills/laravel-tdd/SKILL.md +675 -0
- package/prisma/skills/laravel-verification/SKILL.md +180 -0
- package/prisma/skills/latency-critical-systems/SKILL.md +74 -0
- package/prisma/skills/lead-intelligence/SKILL.md +322 -0
- package/prisma/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
- package/prisma/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
- package/prisma/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
- package/prisma/skills/lead-intelligence/agents/signal-scorer.md +60 -0
- package/prisma/skills/liquid-glass-design/SKILL.md +279 -0
- package/prisma/skills/llm-trading-agent-security/SKILL.md +147 -0
- package/prisma/skills/logistics-exception-management/SKILL.md +222 -0
- package/prisma/skills/loop-design-check/SKILL.md +143 -0
- package/prisma/skills/mailtrap-email-integration/SKILL.md +77 -0
- package/prisma/skills/make-interfaces-feel-better/SKILL.md +152 -0
- package/prisma/skills/manim-video/SKILL.md +90 -0
- package/prisma/skills/manim-video/assets/network_graph_scene.py +52 -0
- package/prisma/skills/market-research/SKILL.md +76 -0
- package/prisma/skills/marketing-campaign/SKILL.md +114 -0
- package/prisma/skills/mcp-server-patterns/SKILL.md +70 -0
- package/prisma/skills/messages-ops/SKILL.md +105 -0
- package/prisma/skills/ml-adoption-playbook/SKILL.md +57 -0
- package/prisma/skills/mle-workflow/SKILL.md +347 -0
- package/prisma/skills/motion-advanced/SKILL.md +596 -0
- package/prisma/skills/motion-foundations/SKILL.md +299 -0
- package/prisma/skills/motion-patterns/SKILL.md +434 -0
- package/prisma/skills/motion-ui/SKILL.md +576 -0
- package/prisma/skills/mysql-patterns/SKILL.md +413 -0
- package/prisma/skills/nanoclaw-repl/SKILL.md +34 -0
- package/prisma/skills/nestjs-patterns/SKILL.md +231 -0
- package/prisma/skills/netmiko-ssh-automation/SKILL.md +174 -0
- package/prisma/skills/network-bgp-diagnostics/SKILL.md +168 -0
- package/prisma/skills/network-config-validation/SKILL.md +211 -0
- package/prisma/skills/network-interface-health/SKILL.md +153 -0
- package/prisma/skills/nextjs-turbopack/SKILL.md +58 -0
- package/prisma/skills/nodejs-keccak256/SKILL.md +103 -0
- package/prisma/skills/nutrient-document-processing/SKILL.md +168 -0
- package/prisma/skills/nuxt4-patterns/SKILL.md +101 -0
- package/prisma/skills/openclaw-persona-forge/SKILL.md +289 -0
- package/prisma/skills/openclaw-persona-forge/gacha.py +224 -0
- package/prisma/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/prisma/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/prisma/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/prisma/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/prisma/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/prisma/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/prisma/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/prisma/skills/opensource-pipeline/SKILL.md +256 -0
- package/prisma/skills/orch-add-feature/SKILL.md +45 -0
- package/prisma/skills/orch-build-mvp/SKILL.md +49 -0
- package/prisma/skills/orch-change-feature/SKILL.md +43 -0
- package/prisma/skills/orch-fix-defect/SKILL.md +43 -0
- package/prisma/skills/orch-pipeline/SKILL.md +121 -0
- package/prisma/skills/orch-refine-code/SKILL.md +44 -0
- package/prisma/skills/parallel-execution-optimizer/SKILL.md +73 -0
- package/prisma/skills/perl-patterns/SKILL.md +505 -0
- package/prisma/skills/perl-security/SKILL.md +504 -0
- package/prisma/skills/perl-testing/SKILL.md +476 -0
- package/prisma/skills/plan-orchestrate/SKILL.md +263 -0
- package/prisma/skills/plankton-code-quality/SKILL.md +237 -0
- package/prisma/skills/postgres-patterns/SKILL.md +148 -0
- package/prisma/skills/prediction-market-oracle-research/SKILL.md +64 -0
- package/prisma/skills/prediction-market-risk-review/SKILL.md +61 -0
- package/prisma/skills/prisma-patterns/SKILL.md +401 -0
- package/prisma/skills/product-capability/SKILL.md +142 -0
- package/prisma/skills/product-lens/SKILL.md +93 -0
- package/prisma/skills/production-audit/SKILL.md +207 -0
- package/prisma/skills/production-scheduling/SKILL.md +238 -0
- package/prisma/skills/project-flow-ops/SKILL.md +112 -0
- package/prisma/skills/prompt-optimizer/SKILL.md +398 -0
- package/prisma/skills/python-patterns/SKILL.md +751 -0
- package/prisma/skills/python-testing/SKILL.md +817 -0
- package/prisma/skills/pytorch-patterns/SKILL.md +397 -0
- package/prisma/skills/quality-nonconformance/SKILL.md +260 -0
- package/prisma/skills/quarkus-patterns/SKILL.md +723 -0
- package/prisma/skills/quarkus-security/SKILL.md +468 -0
- package/prisma/skills/quarkus-tdd/SKILL.md +812 -0
- package/prisma/skills/quarkus-verification/SKILL.md +480 -0
- package/prisma/skills/ralphinho-rfc-pipeline/SKILL.md +68 -0
- package/prisma/skills/react-native-patterns/SKILL.md +326 -0
- package/prisma/skills/react-patterns/SKILL.md +342 -0
- package/prisma/skills/react-performance/SKILL.md +575 -0
- package/prisma/skills/react-testing/SKILL.md +424 -0
- package/prisma/skills/recsys-pipeline-architect/SKILL.md +115 -0
- package/prisma/skills/recursive-decision-ledger/SKILL.md +80 -0
- package/prisma/skills/redis-patterns/SKILL.md +404 -0
- package/prisma/skills/regex-vs-llm-structured-text/SKILL.md +221 -0
- package/prisma/skills/remotion-video-creation/SKILL.md +43 -0
- package/prisma/skills/remotion-video-creation/rules/3d.md +86 -0
- package/prisma/skills/remotion-video-creation/rules/animations.md +29 -0
- package/prisma/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/prisma/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/prisma/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/prisma/skills/remotion-video-creation/rules/assets.md +78 -0
- package/prisma/skills/remotion-video-creation/rules/audio.md +172 -0
- package/prisma/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/prisma/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/prisma/skills/remotion-video-creation/rules/charts.md +58 -0
- package/prisma/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/prisma/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/prisma/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/prisma/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/prisma/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/prisma/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/prisma/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/prisma/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/prisma/skills/remotion-video-creation/rules/images.md +130 -0
- package/prisma/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/prisma/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/prisma/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/prisma/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/prisma/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/prisma/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/prisma/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/prisma/skills/remotion-video-creation/rules/timing.md +179 -0
- package/prisma/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/prisma/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/prisma/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/prisma/skills/remotion-video-creation/rules/videos.md +171 -0
- package/prisma/skills/repo-scan/SKILL.md +79 -0
- package/prisma/skills/research-ops/SKILL.md +113 -0
- package/prisma/skills/returns-reverse-logistics/SKILL.md +240 -0
- package/prisma/skills/rules-distill/SKILL.md +265 -0
- package/prisma/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/prisma/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/prisma/skills/rust-patterns/SKILL.md +500 -0
- package/prisma/skills/rust-testing/SKILL.md +501 -0
- package/prisma/skills/safety-guard/SKILL.md +76 -0
- package/prisma/skills/santa-method/SKILL.md +307 -0
- package/prisma/skills/scientific-db-pubmed-database/SKILL.md +176 -0
- package/prisma/skills/scientific-db-uspto-database/SKILL.md +178 -0
- package/prisma/skills/scientific-pkg-gget/SKILL.md +167 -0
- package/prisma/skills/scientific-thinking-literature-review/SKILL.md +193 -0
- package/prisma/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -0
- package/prisma/skills/search-first/SKILL.md +183 -0
- package/prisma/skills/security-bounty-hunter/SKILL.md +100 -0
- package/prisma/skills/security-review/SKILL.md +504 -0
- package/prisma/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/prisma/skills/security-scan/SKILL.md +166 -0
- package/prisma/skills/seo/SKILL.md +155 -0
- package/prisma/skills/skill-comply/SKILL.md +59 -0
- package/prisma/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
- package/prisma/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
- package/prisma/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
- package/prisma/skills/skill-comply/prompts/classifier.md +24 -0
- package/prisma/skills/skill-comply/prompts/scenario_generator.md +62 -0
- package/prisma/skills/skill-comply/prompts/spec_generator.md +42 -0
- package/prisma/skills/skill-comply/pyproject.toml +15 -0
- package/prisma/skills/skill-comply/scripts/__init__.py +0 -0
- package/prisma/skills/skill-comply/scripts/classifier.py +85 -0
- package/prisma/skills/skill-comply/scripts/grader.py +124 -0
- package/prisma/skills/skill-comply/scripts/parser.py +107 -0
- package/prisma/skills/skill-comply/scripts/report.py +170 -0
- package/prisma/skills/skill-comply/scripts/run.py +127 -0
- package/prisma/skills/skill-comply/scripts/runner.py +194 -0
- package/prisma/skills/skill-comply/scripts/scenario_generator.py +70 -0
- package/prisma/skills/skill-comply/scripts/spec_generator.py +72 -0
- package/prisma/skills/skill-comply/scripts/utils.py +13 -0
- package/prisma/skills/skill-comply/tests/test_grader.py +197 -0
- package/prisma/skills/skill-comply/tests/test_parser.py +90 -0
- package/prisma/skills/skill-comply/tests/test_runner.py +172 -0
- package/prisma/skills/skill-scout/SKILL.md +141 -0
- package/prisma/skills/skill-stocktake/SKILL.md +195 -0
- package/prisma/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/prisma/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/prisma/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/prisma/skills/social-graph-ranker/SKILL.md +155 -0
- package/prisma/skills/social-publisher/SKILL.md +130 -0
- package/prisma/skills/springboot-patterns/SKILL.md +315 -0
- package/prisma/skills/springboot-security/SKILL.md +273 -0
- package/prisma/skills/springboot-tdd/SKILL.md +159 -0
- package/prisma/skills/springboot-verification/SKILL.md +232 -0
- package/prisma/skills/strategic-compact/SKILL.md +136 -0
- package/prisma/skills/swift-actor-persistence/SKILL.md +144 -0
- package/prisma/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/prisma/skills/swift-protocol-di-testing/SKILL.md +191 -0
- package/prisma/skills/swiftui-patterns/SKILL.md +259 -0
- package/prisma/skills/taste/SKILL.md +264 -0
- package/prisma/skills/taste/references/genre-taxonomy.md +87 -0
- package/prisma/skills/tdd-workflow/SKILL.md +583 -0
- package/prisma/skills/team-agent-orchestration/SKILL.md +111 -0
- package/prisma/skills/team-builder/SKILL.md +169 -0
- package/prisma/skills/terminal-ops/SKILL.md +110 -0
- package/prisma/skills/tinystruct-patterns/SKILL.md +279 -0
- package/prisma/skills/tinystruct-patterns/references/architecture.md +90 -0
- package/prisma/skills/tinystruct-patterns/references/data-handling.md +60 -0
- package/prisma/skills/tinystruct-patterns/references/database.md +99 -0
- package/prisma/skills/tinystruct-patterns/references/routing.md +64 -0
- package/prisma/skills/tinystruct-patterns/references/system-usage.md +97 -0
- package/prisma/skills/tinystruct-patterns/references/testing.md +72 -0
- package/prisma/skills/token-budget-advisor/SKILL.md +134 -0
- package/prisma/skills/ui-demo/SKILL.md +466 -0
- package/prisma/skills/ui-to-vue/SKILL.md +135 -0
- package/prisma/skills/uncloud/SKILL.md +344 -0
- package/prisma/skills/unified-notifications-ops/SKILL.md +188 -0
- package/prisma/skills/verification-loop/SKILL.md +127 -0
- package/prisma/skills/video-editing/SKILL.md +311 -0
- package/prisma/skills/videodb/SKILL.md +375 -0
- package/prisma/skills/videodb/reference/api-reference.md +550 -0
- package/prisma/skills/videodb/reference/capture-reference.md +407 -0
- package/prisma/skills/videodb/reference/capture.md +101 -0
- package/prisma/skills/videodb/reference/editor.md +443 -0
- package/prisma/skills/videodb/reference/generative.md +331 -0
- package/prisma/skills/videodb/reference/rtstream-reference.md +564 -0
- package/prisma/skills/videodb/reference/rtstream.md +65 -0
- package/prisma/skills/videodb/reference/search.md +230 -0
- package/prisma/skills/videodb/reference/streaming.md +406 -0
- package/prisma/skills/videodb/reference/use-cases.md +118 -0
- package/prisma/skills/videodb/scripts/ws_listener.py +282 -0
- package/prisma/skills/visa-doc-translate/README.md +86 -0
- package/prisma/skills/visa-doc-translate/SKILL.md +117 -0
- package/prisma/skills/vite-patterns/SKILL.md +450 -0
- package/prisma/skills/vue-patterns/SKILL.md +471 -0
- package/prisma/skills/windows-desktop-e2e/SKILL.md +888 -0
- package/prisma/skills/workspace-surface-audit/SKILL.md +126 -0
- package/prisma/skills/x-api/SKILL.md +235 -0
package/dist/cli.mjs
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// cli/main.ts
|
|
3
|
+
import { resolve as resolve2 } from "node:path";
|
|
4
|
+
|
|
5
|
+
// src/lib/agents.ts
|
|
6
|
+
var AGENT_SKILL_PATH = {
|
|
7
|
+
Cursor: (id) => `.cursor/skills/${id}/SKILL.md`,
|
|
8
|
+
Claude: (id) => `.claude/skills/${id}/SKILL.md`,
|
|
9
|
+
Codex: (id) => `.agents/skills/${id}/SKILL.md`,
|
|
10
|
+
Copilot: (id) => `.github/skills/${id}/SKILL.md`
|
|
11
|
+
};
|
|
12
|
+
function isAgentName(name) {
|
|
13
|
+
return name in AGENT_SKILL_PATH;
|
|
14
|
+
}
|
|
15
|
+
function agentSkillPath(agent, skillId) {
|
|
16
|
+
return AGENT_SKILL_PATH[agent](skillId);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// src/lib/package-root.ts
|
|
20
|
+
import { existsSync } from "node:fs";
|
|
21
|
+
import { dirname, join } from "node:path";
|
|
22
|
+
import { fileURLToPath } from "node:url";
|
|
23
|
+
function resolvePackageRoot(fromModuleUrl) {
|
|
24
|
+
let dir = dirname(fileURLToPath(fromModuleUrl));
|
|
25
|
+
for (let i = 0; i < 8; i++) {
|
|
26
|
+
if (existsSync(join(dir, "package.json")) && existsSync(join(dir, "prisma", "skills"))) {
|
|
27
|
+
return dir;
|
|
28
|
+
}
|
|
29
|
+
const parent = dirname(dir);
|
|
30
|
+
if (parent === dir) break;
|
|
31
|
+
dir = parent;
|
|
32
|
+
}
|
|
33
|
+
return dirname(fileURLToPath(fromModuleUrl));
|
|
34
|
+
}
|
|
35
|
+
function defaultSkillsDir(packageRoot) {
|
|
36
|
+
return join(packageRoot, "prisma", "skills");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// src/lib/skill-install-core.ts
|
|
40
|
+
import { access, mkdir, writeFile } from "node:fs/promises";
|
|
41
|
+
import { constants } from "node:fs";
|
|
42
|
+
import { dirname as dirname2, resolve } from "node:path";
|
|
43
|
+
|
|
44
|
+
// src/lib/skill-file.ts
|
|
45
|
+
import { readFile } from "node:fs/promises";
|
|
46
|
+
import { join as join2 } from "node:path";
|
|
47
|
+
function parseDependsOn(frontmatter) {
|
|
48
|
+
const lines = frontmatter.split(/\r?\n/);
|
|
49
|
+
const deps = [];
|
|
50
|
+
let inDepends = false;
|
|
51
|
+
for (const line of lines) {
|
|
52
|
+
const trimmed = line.trim();
|
|
53
|
+
if (!inDepends) {
|
|
54
|
+
if (trimmed === "depends_on:" || trimmed === "dependencies:") {
|
|
55
|
+
inDepends = true;
|
|
56
|
+
}
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (!trimmed) continue;
|
|
60
|
+
if (/^[A-Za-z0-9_-]+:/.test(trimmed)) break;
|
|
61
|
+
const match = trimmed.match(/^-\s+(.+)$/);
|
|
62
|
+
if (!match) break;
|
|
63
|
+
deps.push(match[1].trim());
|
|
64
|
+
}
|
|
65
|
+
return deps;
|
|
66
|
+
}
|
|
67
|
+
function parseSkillFile(raw) {
|
|
68
|
+
const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
|
|
69
|
+
if (!match) {
|
|
70
|
+
return { dependsOn: [], body: raw.trim(), raw };
|
|
71
|
+
}
|
|
72
|
+
const [, frontmatter, body] = match;
|
|
73
|
+
return {
|
|
74
|
+
dependsOn: parseDependsOn(frontmatter),
|
|
75
|
+
body: body.trim(),
|
|
76
|
+
raw
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async function readSkillFileByRef(skillsDir, ref) {
|
|
80
|
+
try {
|
|
81
|
+
const content = await readFile(join2(skillsDir, ref, "SKILL.md"), "utf-8");
|
|
82
|
+
return content.trim() ? parseSkillFile(content) : null;
|
|
83
|
+
} catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async function compileSkillFile(skillsDir, ref, seen = /* @__PURE__ */ new Set()) {
|
|
88
|
+
if (seen.has(ref)) return null;
|
|
89
|
+
seen.add(ref);
|
|
90
|
+
const parsed = await readSkillFileByRef(skillsDir, ref);
|
|
91
|
+
if (!parsed) return null;
|
|
92
|
+
const sections = [parsed.body];
|
|
93
|
+
for (const dep of parsed.dependsOn) {
|
|
94
|
+
const compiled = await compileSkillFile(skillsDir, dep, seen);
|
|
95
|
+
if (!compiled) continue;
|
|
96
|
+
sections.push(`## Included dependency: ${dep}
|
|
97
|
+
|
|
98
|
+
${compiled}`);
|
|
99
|
+
}
|
|
100
|
+
return sections.filter(Boolean).join("\n\n");
|
|
101
|
+
}
|
|
102
|
+
async function loadSkillFileContent(skillsDir, id) {
|
|
103
|
+
return compileSkillFile(skillsDir, id);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// src/lib/skill-install-core.ts
|
|
107
|
+
function assertInsideWorkspace(root, target) {
|
|
108
|
+
const normalizedRoot = resolve(root);
|
|
109
|
+
const normalizedTarget = resolve(target);
|
|
110
|
+
if (normalizedTarget !== normalizedRoot && !normalizedTarget.startsWith(`${normalizedRoot}/`)) {
|
|
111
|
+
throw new Error("invalid_path");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function fileExists(path) {
|
|
115
|
+
try {
|
|
116
|
+
await access(path, constants.F_OK);
|
|
117
|
+
return true;
|
|
118
|
+
} catch {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function installSkillToWorkspace(input) {
|
|
123
|
+
if (!isAgentName(input.agent)) {
|
|
124
|
+
return { ok: false, error: "unknown_agent" };
|
|
125
|
+
}
|
|
126
|
+
const content = await loadSkillFileContent(input.skillsDir, input.skillId);
|
|
127
|
+
if (!content) {
|
|
128
|
+
return { ok: false, error: "skill_not_found" };
|
|
129
|
+
}
|
|
130
|
+
const root = resolve(input.workspaceRoot);
|
|
131
|
+
const relativePath = agentSkillPath(input.agent, input.skillId);
|
|
132
|
+
const absolutePath = resolve(root, relativePath);
|
|
133
|
+
try {
|
|
134
|
+
assertInsideWorkspace(root, absolutePath);
|
|
135
|
+
} catch {
|
|
136
|
+
return { ok: false, error: "invalid_path" };
|
|
137
|
+
}
|
|
138
|
+
if (!input.force && await fileExists(absolutePath)) {
|
|
139
|
+
return { ok: true, path: relativePath, skipped: true };
|
|
140
|
+
}
|
|
141
|
+
await mkdir(dirname2(absolutePath), { recursive: true });
|
|
142
|
+
await writeFile(absolutePath, content, "utf-8");
|
|
143
|
+
return { ok: true, path: relativePath, skipped: false };
|
|
144
|
+
}
|
|
145
|
+
async function installStackToWorkspace(input) {
|
|
146
|
+
const summary = { installed: [], skipped: [], failed: [] };
|
|
147
|
+
const total = input.skillIds.length;
|
|
148
|
+
for (const [index, skillId] of input.skillIds.entries()) {
|
|
149
|
+
const result = await installSkillToWorkspace({
|
|
150
|
+
skillId,
|
|
151
|
+
agent: input.agent,
|
|
152
|
+
workspaceRoot: input.workspaceRoot,
|
|
153
|
+
skillsDir: input.skillsDir,
|
|
154
|
+
force: input.force
|
|
155
|
+
});
|
|
156
|
+
input.onProgress?.({ index: index + 1, total, skillId, result });
|
|
157
|
+
if (!result.ok) {
|
|
158
|
+
summary.failed.push({ skillId, error: result.error });
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (result.skipped) {
|
|
162
|
+
summary.skipped.push(skillId);
|
|
163
|
+
} else {
|
|
164
|
+
summary.installed.push(skillId);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return summary;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// cli/stack-resolve.ts
|
|
171
|
+
import { readFile as readFile2 } from "node:fs/promises";
|
|
172
|
+
import { join as join3 } from "node:path";
|
|
173
|
+
var PACKAGE_ROOT = resolvePackageRoot(import.meta.url);
|
|
174
|
+
var MANIFEST_PATH = join3(PACKAGE_ROOT, "cli", "manifest.json");
|
|
175
|
+
var cached = null;
|
|
176
|
+
async function loadCliManifest() {
|
|
177
|
+
if (cached) return cached;
|
|
178
|
+
const raw = await readFile2(MANIFEST_PATH, "utf-8");
|
|
179
|
+
cached = JSON.parse(raw);
|
|
180
|
+
return cached;
|
|
181
|
+
}
|
|
182
|
+
function normalizeStackInput(input) {
|
|
183
|
+
return input.trim().toLowerCase().replace(/\.js$/i, "").replace(/\s+/g, "-").replace(/_/g, "-");
|
|
184
|
+
}
|
|
185
|
+
var ALIASES = {
|
|
186
|
+
nodejs: "node",
|
|
187
|
+
node: "node",
|
|
188
|
+
javascript: "js",
|
|
189
|
+
js: "js",
|
|
190
|
+
typescript: "ts",
|
|
191
|
+
ts: "ts",
|
|
192
|
+
fastapi: "fastapi",
|
|
193
|
+
react: "react",
|
|
194
|
+
angular: "angular",
|
|
195
|
+
java: "java",
|
|
196
|
+
spring: "spring-boot",
|
|
197
|
+
springboot: "spring-boot",
|
|
198
|
+
"spring-boot": "spring-boot",
|
|
199
|
+
docker: "docker",
|
|
200
|
+
kubernetes: "k9",
|
|
201
|
+
k8s: "k9",
|
|
202
|
+
k9s: "k9",
|
|
203
|
+
k9: "k9",
|
|
204
|
+
postgres: "postgresql",
|
|
205
|
+
postgresql: "postgresql",
|
|
206
|
+
mysql: "mysql",
|
|
207
|
+
prisma: "prisma"
|
|
208
|
+
};
|
|
209
|
+
function resolveStackId(input, manifest) {
|
|
210
|
+
const normalized = normalizeStackInput(input);
|
|
211
|
+
const alias = ALIASES[normalized];
|
|
212
|
+
if (alias && manifest.skillsByStack[alias]) return alias;
|
|
213
|
+
if (manifest.skillsByStack[normalized]) return normalized;
|
|
214
|
+
const byLabel = manifest.stacks.find(
|
|
215
|
+
(stack) => normalizeStackInput(stack.label) === normalized
|
|
216
|
+
);
|
|
217
|
+
if (byLabel) return byLabel.id;
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
function formatStackList(manifest) {
|
|
221
|
+
return manifest.stacks.map((stack) => {
|
|
222
|
+
const count = manifest.skillsByStack[stack.id]?.length ?? 0;
|
|
223
|
+
return ` ${stack.label.padEnd(14)} (${stack.id}) \u2014 ${count} skills`;
|
|
224
|
+
}).join("\n");
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// cli/main.ts
|
|
228
|
+
var PACKAGE_ROOT2 = resolvePackageRoot(import.meta.url);
|
|
229
|
+
var SKILLS_DIR = defaultSkillsDir(PACKAGE_ROOT2);
|
|
230
|
+
function printHelp() {
|
|
231
|
+
console.log(`arboris \u2014 installe les skills IA recommand\xE9s pour une techno
|
|
232
|
+
|
|
233
|
+
Usage:
|
|
234
|
+
npx @rubix0270/arboris <techno> [options]
|
|
235
|
+
npx @rubix0270/arboris list
|
|
236
|
+
|
|
237
|
+
Exemples:
|
|
238
|
+
npx @rubix0270/arboris node
|
|
239
|
+
npx @rubix0270/arboris node.js --agent cursor
|
|
240
|
+
npx @rubix0270/arboris typescript --force
|
|
241
|
+
|
|
242
|
+
Technos (alias accept\xE9s: node.js, k8s, spring, postgres\u2026):
|
|
243
|
+
node, js, ts, fastapi, react, angular, java, spring-boot,
|
|
244
|
+
docker, k9, postgresql, mysql, prisma
|
|
245
|
+
|
|
246
|
+
Options:
|
|
247
|
+
--agent <name> Agent cible: cursor | claude | codex | copilot (d\xE9faut: cursor)
|
|
248
|
+
--cwd <path> Projet cible (d\xE9faut: r\xE9pertoire courant)
|
|
249
|
+
--force \xC9crase les skills d\xE9j\xE0 install\xE9s
|
|
250
|
+
--dry-run Affiche sans \xE9crire
|
|
251
|
+
-h, --help Aide
|
|
252
|
+
`);
|
|
253
|
+
}
|
|
254
|
+
function parseArgs(argv) {
|
|
255
|
+
const options = {
|
|
256
|
+
agent: "Cursor",
|
|
257
|
+
cwd: process.cwd(),
|
|
258
|
+
dryRun: false,
|
|
259
|
+
force: false,
|
|
260
|
+
help: false
|
|
261
|
+
};
|
|
262
|
+
const positional = [];
|
|
263
|
+
for (let i = 0; i < argv.length; i++) {
|
|
264
|
+
const arg = argv[i];
|
|
265
|
+
if (arg === "-h" || arg === "--help") {
|
|
266
|
+
options.help = true;
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
if (arg === "--dry-run") {
|
|
270
|
+
options.dryRun = true;
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if (arg === "--force") {
|
|
274
|
+
options.force = true;
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
if (arg === "--agent") {
|
|
278
|
+
const value = argv[++i];
|
|
279
|
+
if (!value) throw new Error("Option --agent requiert une valeur.");
|
|
280
|
+
const normalized = value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
|
|
281
|
+
if (!isAgentName(normalized)) {
|
|
282
|
+
throw new Error(`Agent inconnu: ${value}. Utilise cursor, claude, codex ou copilot.`);
|
|
283
|
+
}
|
|
284
|
+
options.agent = normalized;
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
if (arg === "--cwd") {
|
|
288
|
+
const value = argv[++i];
|
|
289
|
+
if (!value) throw new Error("Option --cwd requiert un chemin.");
|
|
290
|
+
options.cwd = resolve2(value);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
if (arg.startsWith("-")) {
|
|
294
|
+
throw new Error(`Option inconnue: ${arg}`);
|
|
295
|
+
}
|
|
296
|
+
positional.push(arg);
|
|
297
|
+
}
|
|
298
|
+
return { command: positional[0] ?? null, options };
|
|
299
|
+
}
|
|
300
|
+
async function runList() {
|
|
301
|
+
const manifest = await loadCliManifest();
|
|
302
|
+
console.log("Technos disponibles:\n");
|
|
303
|
+
console.log(formatStackList(manifest));
|
|
304
|
+
console.log("\nExemple: npx @rubix0270/arboris node");
|
|
305
|
+
}
|
|
306
|
+
async function runInstall(stackInput, options) {
|
|
307
|
+
const manifest = await loadCliManifest();
|
|
308
|
+
const stackId = resolveStackId(stackInput, manifest);
|
|
309
|
+
if (!stackId) {
|
|
310
|
+
console.error(`Techno inconnue: "${stackInput}"`);
|
|
311
|
+
console.error("\nTechnos disponibles:\n");
|
|
312
|
+
console.error(formatStackList(manifest));
|
|
313
|
+
process.exit(1);
|
|
314
|
+
}
|
|
315
|
+
const stack = manifest.stacks.find((s) => s.id === stackId);
|
|
316
|
+
const skillIds = manifest.skillsByStack[stackId] ?? [];
|
|
317
|
+
if (skillIds.length === 0) {
|
|
318
|
+
console.error(`Aucun skill associ\xE9 \xE0 ${stack?.label ?? stackId}.`);
|
|
319
|
+
process.exit(1);
|
|
320
|
+
}
|
|
321
|
+
console.log(
|
|
322
|
+
`${options.dryRun ? "[dry-run] " : ""}Installation de ${skillIds.length} skills pour ${stack?.label ?? stackId} \u2192 ${options.agent} (${options.cwd})`
|
|
323
|
+
);
|
|
324
|
+
if (options.dryRun) {
|
|
325
|
+
for (const skillId of skillIds) {
|
|
326
|
+
console.log(` \u2022 ${skillId}`);
|
|
327
|
+
}
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
const summary = await installStackToWorkspace({
|
|
331
|
+
skillIds,
|
|
332
|
+
agent: options.agent,
|
|
333
|
+
workspaceRoot: options.cwd,
|
|
334
|
+
skillsDir: SKILLS_DIR,
|
|
335
|
+
force: options.force,
|
|
336
|
+
onProgress: ({ index, total, skillId, result }) => {
|
|
337
|
+
if (!result.ok) {
|
|
338
|
+
process.stdout.write(` [${index}/${total}] \u2717 ${skillId} (${result.error})
|
|
339
|
+
`);
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (result.skipped) {
|
|
343
|
+
process.stdout.write(` [${index}/${total}] \u2298 ${skillId} (d\xE9j\xE0 pr\xE9sent)
|
|
344
|
+
`);
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
process.stdout.write(` [${index}/${total}] \u2713 ${skillId} \u2192 ${result.path}
|
|
348
|
+
`);
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
console.log(
|
|
352
|
+
`
|
|
353
|
+
Termin\xE9: ${summary.installed.length} install\xE9s, ${summary.skipped.length} ignor\xE9s, ${summary.failed.length} \xE9checs.`
|
|
354
|
+
);
|
|
355
|
+
if (summary.failed.length > 0) {
|
|
356
|
+
process.exit(1);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
async function main() {
|
|
360
|
+
try {
|
|
361
|
+
const { command, options } = parseArgs(process.argv.slice(2));
|
|
362
|
+
if (options.help || !command) {
|
|
363
|
+
printHelp();
|
|
364
|
+
process.exit(command ? 0 : 1);
|
|
365
|
+
}
|
|
366
|
+
if (command === "list" || command === "ls") {
|
|
367
|
+
await runList();
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
await runInstall(command, options);
|
|
371
|
+
} catch (error) {
|
|
372
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
373
|
+
process.exit(1);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
void main();
|
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rubix0270/arboris",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Catalogue de skills IA — installe les skills recommandés pour ta stack via CLI.",
|
|
5
|
+
"private": false,
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"bin": {
|
|
11
|
+
"arboris": "dist/cli.mjs"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/cli.mjs",
|
|
15
|
+
"cli/manifest.json",
|
|
16
|
+
"prisma/skills"
|
|
17
|
+
],
|
|
18
|
+
"imports": {
|
|
19
|
+
"#/*": "./src/*"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"dev": "vite dev --port 3000",
|
|
23
|
+
"build": "vite build",
|
|
24
|
+
"start": "node .output/server/index.mjs",
|
|
25
|
+
"preview": "vite preview",
|
|
26
|
+
"generate-routes": "tsr generate",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"cli:manifest": "tsx scripts/generate-cli-manifest.ts",
|
|
30
|
+
"build:cli": "npm run cli:manifest && node scripts/build-cli.mjs",
|
|
31
|
+
"prepack": "npm run build:cli",
|
|
32
|
+
"db:generate": "prisma generate",
|
|
33
|
+
"db:up": "docker compose up -d",
|
|
34
|
+
"db:down": "docker compose down",
|
|
35
|
+
"db:setup": "docker compose up -d && prisma migrate deploy && prisma db seed",
|
|
36
|
+
"db:push": "prisma db push",
|
|
37
|
+
"db:migrate": "prisma migrate dev",
|
|
38
|
+
"db:seed": "prisma db seed",
|
|
39
|
+
"db:studio": "prisma studio",
|
|
40
|
+
"db:reset": "prisma migrate reset --force"
|
|
41
|
+
},
|
|
42
|
+
"prisma": {
|
|
43
|
+
"seed": "tsx prisma/seed.ts"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@prisma/client": "^6.19.2",
|
|
47
|
+
"@tailwindcss/vite": "^4.1.18",
|
|
48
|
+
"@tanstack/react-devtools": "latest",
|
|
49
|
+
"@tanstack/react-router": "latest",
|
|
50
|
+
"@tanstack/react-router-devtools": "latest",
|
|
51
|
+
"@tanstack/react-router-ssr-query": "latest",
|
|
52
|
+
"@tanstack/react-start": "latest",
|
|
53
|
+
"@tanstack/router-plugin": "^1.132.0",
|
|
54
|
+
"react": "^19.2.0",
|
|
55
|
+
"react-dom": "^19.2.0",
|
|
56
|
+
"tailwindcss": "^4.1.18"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@tanstack/devtools-vite": "latest",
|
|
60
|
+
"@tanstack/router-cli": "^1.132.0",
|
|
61
|
+
"@types/node": "^22.10.2",
|
|
62
|
+
"@types/react": "^19.2.0",
|
|
63
|
+
"@types/react-dom": "^19.2.0",
|
|
64
|
+
"@vitejs/plugin-react": "^6.0.1",
|
|
65
|
+
"esbuild": "^0.25.12",
|
|
66
|
+
"prisma": "^6.19.2",
|
|
67
|
+
"tsx": "^4.19.2",
|
|
68
|
+
"typescript": "^6.0.2",
|
|
69
|
+
"vite": "^8.0.0",
|
|
70
|
+
"vitest": "^4.1.5"
|
|
71
|
+
},
|
|
72
|
+
"pnpm": {
|
|
73
|
+
"onlyBuiltDependencies": [
|
|
74
|
+
"esbuild",
|
|
75
|
+
"lightningcss",
|
|
76
|
+
"@prisma/client",
|
|
77
|
+
"@prisma/engines",
|
|
78
|
+
"prisma"
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: accessibility
|
|
3
|
+
description: Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA
|
|
4
|
+
standards. Use this skill to generate semantic ARIA for Web and accessibility traits for Web and Native platforms (iOS/Android).
|
|
5
|
+
metadata:
|
|
6
|
+
origin: ECC
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Accessibility (WCAG 2.2)
|
|
10
|
+
|
|
11
|
+
This skill ensures that digital interfaces are Perceivable, Operable, Understandable, and Robust (POUR) for all users, including those using screen readers, switch controls, or keyboard navigation. It focuses on the technical implementation of WCAG 2.2 success criteria.
|
|
12
|
+
|
|
13
|
+
## When to Use
|
|
14
|
+
|
|
15
|
+
- Defining UI component specifications for Web, iOS, or Android.
|
|
16
|
+
- Auditing existing code for accessibility barriers or compliance gaps.
|
|
17
|
+
- Implementing new WCAG 2.2 standards like Target Size (Minimum) and Focus Appearance.
|
|
18
|
+
- Mapping high-level design requirements to technical attributes (ARIA roles, traits, hints).
|
|
19
|
+
|
|
20
|
+
## Core Concepts
|
|
21
|
+
|
|
22
|
+
- **POUR Principles**: The foundation of WCAG (Perceivable, Operable, Understandable, Robust).
|
|
23
|
+
- **Semantic Mapping**: Using native elements over generic containers to provide built-in accessibility.
|
|
24
|
+
- **Accessibility Tree**: The representation of the UI that assistive technologies actually "read."
|
|
25
|
+
- **Focus Management**: Controlling the order and visibility of the keyboard/screen reader cursor.
|
|
26
|
+
- **Labeling & Hints**: Providing context through `aria-label`, `accessibilityLabel`, and `contentDescription`.
|
|
27
|
+
|
|
28
|
+
## How It Works
|
|
29
|
+
|
|
30
|
+
### Step 1: Identify the Component Role
|
|
31
|
+
|
|
32
|
+
Determine the functional purpose (e.g., Is this a button, a link, or a tab?). Use the most semantic native element available before resorting to custom roles.
|
|
33
|
+
|
|
34
|
+
### Step 2: Define Perceivable Attributes
|
|
35
|
+
|
|
36
|
+
- Ensure text contrast meets **4.5:1** (normal) or **3:1** (large/UI).
|
|
37
|
+
- Add text alternatives for non-text content (images, icons).
|
|
38
|
+
- Implement responsive reflow (up to 400% zoom without loss of function).
|
|
39
|
+
|
|
40
|
+
### Step 3: Implement Operable Controls
|
|
41
|
+
|
|
42
|
+
- Ensure a minimum **24x24 CSS pixel** target size (WCAG 2.2 SC 2.5.8).
|
|
43
|
+
- Verify all interactive elements are reachable via keyboard and have a visible focus indicator (SC 2.4.11).
|
|
44
|
+
- Provide single-pointer alternatives for dragging movements.
|
|
45
|
+
|
|
46
|
+
### Step 4: Ensure Understandable Logic
|
|
47
|
+
|
|
48
|
+
- Use consistent navigation patterns.
|
|
49
|
+
- Provide descriptive error messages and suggestions for correction (SC 3.3.3).
|
|
50
|
+
- Implement "Redundant Entry" (SC 3.3.7) to prevent asking for the same data twice.
|
|
51
|
+
|
|
52
|
+
### Step 5: Verify Robust Compatibility
|
|
53
|
+
|
|
54
|
+
- Use correct `Name, Role, Value` patterns.
|
|
55
|
+
- Implement `aria-live` or live regions for dynamic status updates.
|
|
56
|
+
|
|
57
|
+
## Accessibility Architecture Diagram
|
|
58
|
+
|
|
59
|
+
```mermaid
|
|
60
|
+
flowchart TD
|
|
61
|
+
UI["UI Component"] --> Platform{Platform?}
|
|
62
|
+
Platform -->|Web| ARIA["WAI-ARIA + HTML5"]
|
|
63
|
+
Platform -->|iOS| SwiftUI["Accessibility Traits + Labels"]
|
|
64
|
+
Platform -->|Android| Compose["Semantics + ContentDesc"]
|
|
65
|
+
|
|
66
|
+
ARIA --> AT["Assistive Technology (Screen Readers, Switches)"]
|
|
67
|
+
SwiftUI --> AT
|
|
68
|
+
Compose --> AT
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Cross-Platform Mapping
|
|
72
|
+
|
|
73
|
+
| Feature | Web (HTML/ARIA) | iOS (SwiftUI) | Android (Compose) |
|
|
74
|
+
| :----------------- | :----------------------- | :----------------------------------- | :---------------------------------------------------------- |
|
|
75
|
+
| **Primary Label** | `aria-label` / `<label>` | `.accessibilityLabel()` | `contentDescription` |
|
|
76
|
+
| **Secondary Hint** | `aria-describedby` | `.accessibilityHint()` | `Modifier.semantics { stateDescription = ... }` |
|
|
77
|
+
| **Action Role** | `role="button"` | `.accessibilityAddTraits(.isButton)` | `Modifier.semantics { role = Role.Button }` |
|
|
78
|
+
| **Live Updates** | `aria-live="polite"` | `.accessibilityLiveRegion(.polite)` | `Modifier.semantics { liveRegion = LiveRegionMode.Polite }` |
|
|
79
|
+
|
|
80
|
+
## Examples
|
|
81
|
+
|
|
82
|
+
### Web: Accessible Search
|
|
83
|
+
|
|
84
|
+
```html
|
|
85
|
+
<form role="search">
|
|
86
|
+
<label for="search-input" class="sr-only">Search products</label>
|
|
87
|
+
<input type="search" id="search-input" placeholder="Search..." />
|
|
88
|
+
<button type="submit" aria-label="Submit Search">
|
|
89
|
+
<svg aria-hidden="true">...</svg>
|
|
90
|
+
</button>
|
|
91
|
+
</form>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### iOS: Accessible Action Button
|
|
95
|
+
|
|
96
|
+
```swift
|
|
97
|
+
Button(action: deleteItem) {
|
|
98
|
+
Image(systemName: "trash")
|
|
99
|
+
}
|
|
100
|
+
.accessibilityLabel("Delete item")
|
|
101
|
+
.accessibilityHint("Permanently removes this item from your list")
|
|
102
|
+
.accessibilityAddTraits(.isButton)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Android: Accessible Toggle
|
|
106
|
+
|
|
107
|
+
```kotlin
|
|
108
|
+
Switch(
|
|
109
|
+
checked = isEnabled,
|
|
110
|
+
onCheckedChange = { onToggle() },
|
|
111
|
+
modifier = Modifier.semantics {
|
|
112
|
+
contentDescription = "Enable notifications"
|
|
113
|
+
}
|
|
114
|
+
)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Anti-Patterns to Avoid
|
|
118
|
+
|
|
119
|
+
- **Div-Buttons**: Using a `<div>` or `<span>` for a click event without adding a role and keyboard support.
|
|
120
|
+
- **Color-Only Meaning**: Indicating an error or status _only_ with a color change (e.g., turning a border red).
|
|
121
|
+
- **Uncontained Modal Focus**: Modals that don't trap focus, allowing keyboard users to navigate background content while the modal is open. Focus must be contained _and_ escapable via the `Escape` key or an explicit close button (WCAG SC 2.1.2).
|
|
122
|
+
- **Redundant Alt Text**: Using "Image of..." or "Picture of..." in alt text (screen readers already announce the role "Image").
|
|
123
|
+
|
|
124
|
+
## Best Practices Checklist
|
|
125
|
+
|
|
126
|
+
- [ ] Interactive elements meet the **24x24px** (Web) or **44x44pt** (Native) target size.
|
|
127
|
+
- [ ] Focus indicators are clearly visible and high-contrast.
|
|
128
|
+
- [ ] Modals **contain focus** while open, and release it cleanly on close (`Escape` key or close button).
|
|
129
|
+
- [ ] Dropdowns and menus restore focus to the trigger element on close.
|
|
130
|
+
- [ ] Forms provide text-based error suggestions.
|
|
131
|
+
- [ ] All icon-only buttons have a descriptive text label.
|
|
132
|
+
- [ ] Content reflows properly when text is scaled.
|
|
133
|
+
|
|
134
|
+
## References
|
|
135
|
+
|
|
136
|
+
- [WCAG 2.2 Guidelines](https://www.w3.org/TR/WCAG22/)
|
|
137
|
+
- [WAI-ARIA Authoring Practices](https://www.w3.org/TR/wai-aria-practices/)
|
|
138
|
+
- [iOS Accessibility Programming Guide](https://developer.apple.com/documentation/accessibility)
|
|
139
|
+
- [iOS Human Interface Guidelines - Accessibility](https://developer.apple.com/design/human-interface-guidelines/accessibility)
|
|
140
|
+
- [Android Accessibility Developer Guide](https://developer.android.com/guide/topics/ui/accessibility)
|
|
141
|
+
|
|
142
|
+
## Related Skills
|
|
143
|
+
|
|
144
|
+
- `frontend-patterns`
|
|
145
|
+
- `design-system`
|
|
146
|
+
- `liquid-glass-design`
|
|
147
|
+
- `swiftui-patterns`
|