@heytherevibin/skillforge 0.2.1
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/CHANGELOG.md +16 -0
- package/CODE_OF_CONDUCT.md +34 -0
- package/CONTRIBUTING.md +38 -0
- package/LICENSE +21 -0
- package/README.md +337 -0
- package/RELEASING.md +93 -0
- package/SECURITY.md +31 -0
- package/STRATEGY.md +26 -0
- package/bin/cli.js +547 -0
- package/lib/packs.js +184 -0
- package/package.json +38 -0
- package/python/app/__init__.py +0 -0
- package/python/app/__pycache__/__init__.cpython-312.pyc +0 -0
- package/python/app/__pycache__/auth.cpython-312.pyc +0 -0
- package/python/app/__pycache__/main.cpython-312.pyc +0 -0
- package/python/app/auth.py +63 -0
- package/python/app/cli.py +78 -0
- package/python/app/db_paths.py +26 -0
- package/python/app/events_cli.py +175 -0
- package/python/app/main.py +647 -0
- package/python/app/materialize.py +138 -0
- package/python/app/mcp_server.py +610 -0
- package/python/app/route_cli.py +117 -0
- package/python/requirements-dev.txt +1 -0
- package/python/requirements.txt +7 -0
- package/python/tests/test_db_paths.py +41 -0
- package/skills/accessibility/SKILL.md +145 -0
- package/skills/agent-architecture-audit/SKILL.md +256 -0
- package/skills/agent-eval/SKILL.md +144 -0
- package/skills/agent-harness-construction/SKILL.md +72 -0
- package/skills/agent-introspection-debugging/SKILL.md +152 -0
- package/skills/agent-payment-x402/SKILL.md +224 -0
- package/skills/agent-sort/SKILL.md +214 -0
- package/skills/agentic-engineering/SKILL.md +62 -0
- package/skills/agentic-os/SKILL.md +386 -0
- package/skills/ai-first-engineering/SKILL.md +50 -0
- package/skills/ai-regression-testing/SKILL.md +384 -0
- package/skills/android-clean-architecture/SKILL.md +338 -0
- package/skills/angular-developer/SKILL.md +153 -0
- package/skills/angular-developer/references/angular-animations.md +160 -0
- package/skills/angular-developer/references/angular-aria.md +410 -0
- package/skills/angular-developer/references/cli.md +86 -0
- package/skills/angular-developer/references/component-harnesses.md +59 -0
- package/skills/angular-developer/references/component-styling.md +91 -0
- package/skills/angular-developer/references/components.md +117 -0
- package/skills/angular-developer/references/creating-services.md +97 -0
- package/skills/angular-developer/references/data-resolvers.md +69 -0
- package/skills/angular-developer/references/define-routes.md +67 -0
- package/skills/angular-developer/references/defining-providers.md +72 -0
- package/skills/angular-developer/references/di-fundamentals.md +120 -0
- package/skills/angular-developer/references/e2e-testing.md +56 -0
- package/skills/angular-developer/references/effects.md +83 -0
- package/skills/angular-developer/references/hierarchical-injectors.md +43 -0
- package/skills/angular-developer/references/host-elements.md +80 -0
- package/skills/angular-developer/references/injection-context.md +63 -0
- package/skills/angular-developer/references/inputs.md +101 -0
- package/skills/angular-developer/references/linked-signal.md +59 -0
- package/skills/angular-developer/references/loading-strategies.md +61 -0
- package/skills/angular-developer/references/mcp.md +108 -0
- package/skills/angular-developer/references/navigate-to-routes.md +69 -0
- package/skills/angular-developer/references/outputs.md +86 -0
- package/skills/angular-developer/references/reactive-forms.md +122 -0
- package/skills/angular-developer/references/rendering-strategies.md +44 -0
- package/skills/angular-developer/references/resource.md +77 -0
- package/skills/angular-developer/references/route-animations.md +56 -0
- package/skills/angular-developer/references/route-guards.md +52 -0
- package/skills/angular-developer/references/router-lifecycle.md +45 -0
- package/skills/angular-developer/references/router-testing.md +87 -0
- package/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
- package/skills/angular-developer/references/signal-forms.md +795 -0
- package/skills/angular-developer/references/signals-overview.md +94 -0
- package/skills/angular-developer/references/tailwind-css.md +69 -0
- package/skills/angular-developer/references/template-driven-forms.md +114 -0
- package/skills/angular-developer/references/testing-fundamentals.md +65 -0
- package/skills/api-connector-builder/SKILL.md +120 -0
- package/skills/api-design/SKILL.md +522 -0
- package/skills/architecture-decision-records/SKILL.md +178 -0
- package/skills/article-writing/SKILL.md +78 -0
- package/skills/automation-audit-ops/SKILL.md +141 -0
- package/skills/autonomous-agent-harness/SKILL.md +272 -0
- package/skills/autonomous-loops/SKILL.md +609 -0
- package/skills/backend-patterns/SKILL.md +560 -0
- package/skills/benchmark/SKILL.md +92 -0
- package/skills/blueprint/SKILL.md +104 -0
- package/skills/browser-qa/SKILL.md +86 -0
- package/skills/bun-runtime/SKILL.md +83 -0
- package/skills/canary-watch/SKILL.md +98 -0
- package/skills/carrier-relationship-management/SKILL.md +211 -0
- package/skills/cisco-ios-patterns/SKILL.md +163 -0
- package/skills/ck/SKILL.md +147 -0
- package/skills/ck/commands/forget.mjs +44 -0
- package/skills/ck/commands/info.mjs +24 -0
- package/skills/ck/commands/init.mjs +143 -0
- package/skills/ck/commands/list.mjs +40 -0
- package/skills/ck/commands/migrate.mjs +202 -0
- package/skills/ck/commands/resume.mjs +36 -0
- package/skills/ck/commands/save.mjs +210 -0
- package/skills/ck/commands/shared.mjs +387 -0
- package/skills/ck/hooks/session-start.mjs +224 -0
- package/skills/claude-devfleet/SKILL.md +103 -0
- package/skills/click-path-audit/SKILL.md +244 -0
- package/skills/clickhouse-io/SKILL.md +438 -0
- package/skills/code-tour/SKILL.md +235 -0
- package/skills/codebase-onboarding/SKILL.md +232 -0
- package/skills/coding-standards/SKILL.md +548 -0
- package/skills/compose-multiplatform-patterns/SKILL.md +298 -0
- package/skills/connections-optimizer/SKILL.md +188 -0
- package/skills/content-engine/SKILL.md +126 -0
- package/skills/content-hash-cache-pattern/SKILL.md +160 -0
- package/skills/context-budget/SKILL.md +134 -0
- package/skills/continuous-agent-loop/SKILL.md +44 -0
- package/skills/continuous-learning/SKILL.md +129 -0
- package/skills/continuous-learning/config.json +18 -0
- package/skills/continuous-learning/evaluate-session.sh +69 -0
- package/skills/continuous-learning-v2/SKILL.md +358 -0
- package/skills/continuous-learning-v2/agents/observer-loop.sh +322 -0
- package/skills/continuous-learning-v2/agents/observer.md +198 -0
- package/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
- package/skills/continuous-learning-v2/config.json +8 -0
- package/skills/continuous-learning-v2/hooks/observe.sh +476 -0
- package/skills/continuous-learning-v2/scripts/detect-project.sh +288 -0
- package/skills/continuous-learning-v2/scripts/instinct-cli.py +1519 -0
- package/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
- package/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -0
- package/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1018 -0
- package/skills/cost-aware-llm-pipeline/SKILL.md +182 -0
- package/skills/cost-tracking/SKILL.md +147 -0
- package/skills/council/SKILL.md +202 -0
- package/skills/cpp-coding-standards/SKILL.md +722 -0
- package/skills/cpp-testing/SKILL.md +323 -0
- package/skills/crosspost/SKILL.md +110 -0
- package/skills/csharp-testing/SKILL.md +320 -0
- package/skills/customer-billing-ops/SKILL.md +139 -0
- package/skills/customs-trade-compliance/SKILL.md +262 -0
- package/skills/dart-flutter-patterns/SKILL.md +562 -0
- package/skills/dashboard-builder/SKILL.md +108 -0
- package/skills/data-scraper-agent/SKILL.md +764 -0
- package/skills/database-migrations/SKILL.md +428 -0
- package/skills/deep-research/SKILL.md +158 -0
- package/skills/defi-amm-security/SKILL.md +166 -0
- package/skills/deployment-patterns/SKILL.md +426 -0
- package/skills/design-system/SKILL.md +81 -0
- package/skills/django-celery/SKILL.md +456 -0
- package/skills/django-patterns/SKILL.md +733 -0
- package/skills/django-security/SKILL.md +592 -0
- package/skills/django-tdd/SKILL.md +728 -0
- package/skills/django-verification/SKILL.md +468 -0
- package/skills/dmux-workflows/SKILL.md +190 -0
- package/skills/docker-patterns/SKILL.md +363 -0
- package/skills/documentation-lookup/SKILL.md +89 -0
- package/skills/dotnet-patterns/SKILL.md +320 -0
- package/skills/e2e-testing/SKILL.md +325 -0
- package/skills/email-ops/SKILL.md +120 -0
- package/skills/energy-procurement/SKILL.md +227 -0
- package/skills/enterprise-agent-ops/SKILL.md +49 -0
- package/skills/error-handling/SKILL.md +375 -0
- package/skills/eval-harness/SKILL.md +269 -0
- package/skills/evm-token-decimals/SKILL.md +130 -0
- package/skills/exa-search/SKILL.md +106 -0
- package/skills/fal-ai-media/SKILL.md +287 -0
- package/skills/fastapi-patterns/SKILL.md +327 -0
- package/skills/finance-billing-ops/SKILL.md +126 -0
- package/skills/flox-environments/SKILL.md +496 -0
- package/skills/flutter-dart-code-review/SKILL.md +434 -0
- package/skills/foundation-models-on-device/SKILL.md +243 -0
- package/skills/frontend-design-direction/SKILL.md +92 -0
- package/skills/frontend-patterns/SKILL.md +641 -0
- package/skills/frontend-slides/SKILL.md +183 -0
- package/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/skills/frontend-slides/animation-patterns.md +122 -0
- package/skills/frontend-slides/html-template.md +419 -0
- package/skills/frontend-slides/scripts/export-pdf.sh +418 -0
- package/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/skills/frontend-slides/viewport-base.css +153 -0
- package/skills/fsharp-testing/SKILL.md +279 -0
- package/skills/gan-style-harness/SKILL.md +278 -0
- package/skills/gateguard/SKILL.md +125 -0
- package/skills/git-workflow/SKILL.md +714 -0
- package/skills/github-ops/SKILL.md +143 -0
- package/skills/golang-patterns/SKILL.md +673 -0
- package/skills/golang-testing/SKILL.md +719 -0
- package/skills/google-workspace-ops/SKILL.md +94 -0
- package/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/skills/healthcare-emr-patterns/SKILL.md +159 -0
- package/skills/healthcare-eval-harness/SKILL.md +207 -0
- package/skills/healthcare-phi-compliance/SKILL.md +145 -0
- package/skills/hermes-imports/SKILL.md +87 -0
- package/skills/hexagonal-architecture/SKILL.md +275 -0
- package/skills/hipaa-compliance/SKILL.md +78 -0
- package/skills/homelab-network-readiness/SKILL.md +169 -0
- package/skills/homelab-network-setup/SKILL.md +129 -0
- package/skills/homelab-pihole-dns/SKILL.md +274 -0
- package/skills/homelab-vlan-segmentation/SKILL.md +311 -0
- package/skills/homelab-wireguard-vpn/SKILL.md +305 -0
- package/skills/hookify-rules/SKILL.md +128 -0
- package/skills/inventory-demand-planning/SKILL.md +246 -0
- package/skills/investor-materials/SKILL.md +95 -0
- package/skills/investor-outreach/SKILL.md +90 -0
- package/skills/ios-icon-gen/SKILL.md +157 -0
- package/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
- package/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
- package/skills/iterative-retrieval/SKILL.md +209 -0
- package/skills/java-coding-standards/SKILL.md +382 -0
- package/skills/jira-integration/SKILL.md +292 -0
- package/skills/jpa-patterns/SKILL.md +150 -0
- package/skills/knowledge-ops/SKILL.md +153 -0
- package/skills/kotlin-coroutines-flows/SKILL.md +283 -0
- package/skills/kotlin-exposed-patterns/SKILL.md +718 -0
- package/skills/kotlin-ktor-patterns/SKILL.md +688 -0
- package/skills/kotlin-patterns/SKILL.md +710 -0
- package/skills/kotlin-testing/SKILL.md +823 -0
- package/skills/laravel-patterns/SKILL.md +414 -0
- package/skills/laravel-plugin-discovery/SKILL.md +228 -0
- package/skills/laravel-security/SKILL.md +284 -0
- package/skills/laravel-tdd/SKILL.md +282 -0
- package/skills/laravel-verification/SKILL.md +178 -0
- package/skills/lead-intelligence/SKILL.md +320 -0
- package/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
- package/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
- package/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
- package/skills/lead-intelligence/agents/signal-scorer.md +60 -0
- package/skills/liquid-glass-design/SKILL.md +279 -0
- package/skills/llm-trading-agent-security/SKILL.md +146 -0
- package/skills/logistics-exception-management/SKILL.md +221 -0
- package/skills/make-interfaces-feel-better/SKILL.md +151 -0
- package/skills/manim-video/SKILL.md +88 -0
- package/skills/manim-video/assets/network_graph_scene.py +52 -0
- package/skills/market-research/SKILL.md +74 -0
- package/skills/mcp-server-patterns/SKILL.md +68 -0
- package/skills/messages-ops/SKILL.md +103 -0
- package/skills/mle-workflow/SKILL.md +345 -0
- package/skills/motion-advanced/SKILL.md +596 -0
- package/skills/motion-foundations/SKILL.md +299 -0
- package/skills/motion-patterns/SKILL.md +435 -0
- package/skills/motion-ui/SKILL.md +574 -0
- package/skills/mysql-patterns/SKILL.md +411 -0
- package/skills/nanoclaw-repl/SKILL.md +32 -0
- package/skills/nestjs-patterns/SKILL.md +229 -0
- package/skills/netmiko-ssh-automation/SKILL.md +173 -0
- package/skills/network-bgp-diagnostics/SKILL.md +167 -0
- package/skills/network-config-validation/SKILL.md +210 -0
- package/skills/network-interface-health/SKILL.md +152 -0
- package/skills/nextjs-turbopack/SKILL.md +43 -0
- package/skills/nodejs-keccak256/SKILL.md +102 -0
- package/skills/nutrient-document-processing/SKILL.md +166 -0
- package/skills/nuxt4-patterns/SKILL.md +99 -0
- package/skills/openclaw-persona-forge/SKILL.md +288 -0
- package/skills/openclaw-persona-forge/gacha.py +224 -0
- package/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/skills/opensource-pipeline/SKILL.md +254 -0
- package/skills/perl-patterns/SKILL.md +503 -0
- package/skills/perl-security/SKILL.md +502 -0
- package/skills/perl-testing/SKILL.md +474 -0
- package/skills/plan-orchestrate/SKILL.md +253 -0
- package/skills/plankton-code-quality/SKILL.md +236 -0
- package/skills/postgres-patterns/SKILL.md +146 -0
- package/skills/product-capability/SKILL.md +140 -0
- package/skills/product-lens/SKILL.md +91 -0
- package/skills/production-audit/SKILL.md +206 -0
- package/skills/production-scheduling/SKILL.md +237 -0
- package/skills/project-flow-ops/SKILL.md +110 -0
- package/skills/prompt-optimizer/SKILL.md +398 -0
- package/skills/python-patterns/SKILL.md +749 -0
- package/skills/python-testing/SKILL.md +815 -0
- package/skills/pytorch-patterns/SKILL.md +395 -0
- package/skills/quality-nonconformance/SKILL.md +259 -0
- package/skills/quarkus-patterns/SKILL.md +721 -0
- package/skills/quarkus-security/SKILL.md +466 -0
- package/skills/quarkus-tdd/SKILL.md +810 -0
- package/skills/quarkus-verification/SKILL.md +478 -0
- package/skills/ralphinho-rfc-pipeline/SKILL.md +66 -0
- package/skills/redis-patterns/SKILL.md +402 -0
- package/skills/regex-vs-llm-structured-text/SKILL.md +219 -0
- package/skills/remotion-video-creation/SKILL.md +43 -0
- package/skills/remotion-video-creation/rules/3d.md +86 -0
- package/skills/remotion-video-creation/rules/animations.md +29 -0
- package/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/skills/remotion-video-creation/rules/assets.md +78 -0
- package/skills/remotion-video-creation/rules/audio.md +172 -0
- package/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/skills/remotion-video-creation/rules/charts.md +58 -0
- package/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/skills/remotion-video-creation/rules/images.md +130 -0
- package/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/skills/remotion-video-creation/rules/timing.md +179 -0
- package/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/skills/remotion-video-creation/rules/videos.md +171 -0
- package/skills/repo-scan/SKILL.md +78 -0
- package/skills/research-ops/SKILL.md +111 -0
- package/skills/returns-reverse-logistics/SKILL.md +239 -0
- package/skills/rules-distill/SKILL.md +263 -0
- package/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/skills/rust-patterns/SKILL.md +498 -0
- package/skills/rust-testing/SKILL.md +499 -0
- package/skills/safety-guard/SKILL.md +74 -0
- package/skills/santa-method/SKILL.md +306 -0
- package/skills/scientific-db-pubmed-database/SKILL.md +175 -0
- package/skills/scientific-db-uspto-database/SKILL.md +177 -0
- package/skills/scientific-pkg-gget/SKILL.md +166 -0
- package/skills/scientific-thinking-literature-review/SKILL.md +192 -0
- package/skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
- package/skills/search-first/SKILL.md +181 -0
- package/skills/security-bounty-hunter/SKILL.md +99 -0
- package/skills/security-review/SKILL.md +502 -0
- package/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/skills/seo/SKILL.md +153 -0
- package/skills/skill-comply/SKILL.md +57 -0
- package/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
- package/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
- package/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
- package/skills/skill-comply/prompts/classifier.md +24 -0
- package/skills/skill-comply/prompts/scenario_generator.md +62 -0
- package/skills/skill-comply/prompts/spec_generator.md +42 -0
- package/skills/skill-comply/pyproject.toml +15 -0
- package/skills/skill-comply/scripts/__init__.py +0 -0
- package/skills/skill-comply/scripts/classifier.py +85 -0
- package/skills/skill-comply/scripts/grader.py +124 -0
- package/skills/skill-comply/scripts/parser.py +107 -0
- package/skills/skill-comply/scripts/report.py +170 -0
- package/skills/skill-comply/scripts/run.py +127 -0
- package/skills/skill-comply/scripts/runner.py +186 -0
- package/skills/skill-comply/scripts/scenario_generator.py +70 -0
- package/skills/skill-comply/scripts/spec_generator.py +72 -0
- package/skills/skill-comply/scripts/utils.py +13 -0
- package/skills/skill-comply/tests/test_grader.py +197 -0
- package/skills/skill-comply/tests/test_parser.py +90 -0
- package/skills/skill-comply/tests/test_runner.py +172 -0
- package/skills/skill-scout/SKILL.md +139 -0
- package/skills/skill-stocktake/SKILL.md +193 -0
- package/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/skills/social-graph-ranker/SKILL.md +153 -0
- package/skills/springboot-patterns/SKILL.md +313 -0
- package/skills/springboot-security/SKILL.md +271 -0
- package/skills/springboot-tdd/SKILL.md +157 -0
- package/skills/springboot-verification/SKILL.md +230 -0
- package/skills/strategic-compact/SKILL.md +129 -0
- package/skills/strategic-compact/suggest-compact.sh +54 -0
- package/skills/swift-actor-persistence/SKILL.md +142 -0
- package/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/skills/swift-protocol-di-testing/SKILL.md +189 -0
- package/skills/swiftui-patterns/SKILL.md +259 -0
- package/skills/tdd-workflow/SKILL.md +462 -0
- package/skills/team-builder/SKILL.md +166 -0
- package/skills/terminal-ops/SKILL.md +108 -0
- package/skills/tinystruct-patterns/SKILL.md +130 -0
- package/skills/tinystruct-patterns/references/architecture.md +77 -0
- package/skills/tinystruct-patterns/references/data-handling.md +35 -0
- package/skills/tinystruct-patterns/references/routing.md +57 -0
- package/skills/tinystruct-patterns/references/system-usage.md +74 -0
- package/skills/tinystruct-patterns/references/testing.md +59 -0
- package/skills/token-budget-advisor/SKILL.md +133 -0
- package/skills/ui-demo/SKILL.md +464 -0
- package/skills/ui-to-vue/SKILL.md +134 -0
- package/skills/unified-notifications-ops/SKILL.md +186 -0
- package/skills/verification-loop/SKILL.md +125 -0
- package/skills/video-editing/SKILL.md +309 -0
- package/skills/videodb/SKILL.md +373 -0
- package/skills/videodb/reference/api-reference.md +550 -0
- package/skills/videodb/reference/capture-reference.md +407 -0
- package/skills/videodb/reference/capture.md +101 -0
- package/skills/videodb/reference/editor.md +443 -0
- package/skills/videodb/reference/generative.md +331 -0
- package/skills/videodb/reference/rtstream-reference.md +564 -0
- package/skills/videodb/reference/rtstream.md +65 -0
- package/skills/videodb/reference/search.md +230 -0
- package/skills/videodb/reference/streaming.md +406 -0
- package/skills/videodb/reference/use-cases.md +118 -0
- package/skills/videodb/scripts/ws_listener.py +282 -0
- package/skills/visa-doc-translate/README.md +86 -0
- package/skills/visa-doc-translate/SKILL.md +117 -0
- package/skills/vite-patterns/SKILL.md +448 -0
- package/skills/windows-desktop-e2e/SKILL.md +787 -0
- package/skills/workspace-surface-audit/SKILL.md +124 -0
- package/skills/x-api/SKILL.md +233 -0
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: quarkus-security
|
|
3
|
+
description: Quarkus Security best practices for authentication, authorization, JWT/OIDC, RBAC, input validation, CSRF, secrets management, and dependency security.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Quarkus Security Review
|
|
7
|
+
|
|
8
|
+
Best practices for securing Quarkus applications with authentication, authorization, and input validation.
|
|
9
|
+
|
|
10
|
+
## When to Activate
|
|
11
|
+
|
|
12
|
+
- Adding authentication (JWT, OIDC, Basic Auth)
|
|
13
|
+
- Implementing authorization with @RolesAllowed or SecurityIdentity
|
|
14
|
+
- Validating user input (Bean Validation, custom validators)
|
|
15
|
+
- Configuring CORS or security headers
|
|
16
|
+
- Managing secrets (Vault, environment variables, config sources)
|
|
17
|
+
- Adding rate limiting or brute-force protection
|
|
18
|
+
- Scanning dependencies for CVEs
|
|
19
|
+
- Working with MicroProfile JWT or SmallRye JWT
|
|
20
|
+
|
|
21
|
+
## Authentication
|
|
22
|
+
|
|
23
|
+
### JWT Authentication
|
|
24
|
+
|
|
25
|
+
```java
|
|
26
|
+
// Resource protected with JWT
|
|
27
|
+
@Path("/api/protected")
|
|
28
|
+
@Authenticated
|
|
29
|
+
public class ProtectedResource {
|
|
30
|
+
|
|
31
|
+
@Inject
|
|
32
|
+
JsonWebToken jwt;
|
|
33
|
+
|
|
34
|
+
@Inject
|
|
35
|
+
SecurityIdentity securityIdentity;
|
|
36
|
+
|
|
37
|
+
@GET
|
|
38
|
+
public Response getData() {
|
|
39
|
+
String username = jwt.getName();
|
|
40
|
+
Set<String> roles = jwt.getGroups();
|
|
41
|
+
return Response.ok(Map.of(
|
|
42
|
+
"username", username,
|
|
43
|
+
"roles", roles,
|
|
44
|
+
"principal", securityIdentity.getPrincipal().getName()
|
|
45
|
+
)).build();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Configuration (application.properties):
|
|
51
|
+
```properties
|
|
52
|
+
mp.jwt.verify.publickey.location=publicKey.pem
|
|
53
|
+
mp.jwt.verify.issuer=https://auth.example.com
|
|
54
|
+
|
|
55
|
+
# OIDC
|
|
56
|
+
quarkus.oidc.auth-server-url=https://auth.example.com/realms/myrealm
|
|
57
|
+
quarkus.oidc.client-id=backend-service
|
|
58
|
+
quarkus.oidc.credentials.secret=${OIDC_SECRET}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Custom Authentication Filter
|
|
62
|
+
|
|
63
|
+
```java
|
|
64
|
+
@Provider
|
|
65
|
+
@Priority(Priorities.AUTHENTICATION)
|
|
66
|
+
public class CustomAuthFilter implements ContainerRequestFilter {
|
|
67
|
+
|
|
68
|
+
@Inject
|
|
69
|
+
SecurityIdentity identity;
|
|
70
|
+
|
|
71
|
+
@Override
|
|
72
|
+
public void filter(ContainerRequestContext requestContext) {
|
|
73
|
+
String authHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION);
|
|
74
|
+
|
|
75
|
+
// Reject immediately if header is absent or malformed
|
|
76
|
+
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
|
|
77
|
+
requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
String token = authHeader.substring(7);
|
|
82
|
+
if (!validateToken(token)) {
|
|
83
|
+
requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private boolean validateToken(String token) {
|
|
88
|
+
// Token validation logic
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Authorization
|
|
95
|
+
|
|
96
|
+
### Role-Based Access Control
|
|
97
|
+
|
|
98
|
+
```java
|
|
99
|
+
@Path("/api/admin")
|
|
100
|
+
@RolesAllowed("ADMIN")
|
|
101
|
+
public class AdminResource {
|
|
102
|
+
|
|
103
|
+
@GET
|
|
104
|
+
@Path("/users")
|
|
105
|
+
public List<UserDto> listUsers() {
|
|
106
|
+
return userService.findAll();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@DELETE
|
|
110
|
+
@Path("/users/{id}")
|
|
111
|
+
@RolesAllowed({"ADMIN", "SUPER_ADMIN"})
|
|
112
|
+
public Response deleteUser(@PathParam("id") Long id) {
|
|
113
|
+
userService.delete(id);
|
|
114
|
+
return Response.noContent().build();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
@Path("/api/users")
|
|
119
|
+
public class UserResource {
|
|
120
|
+
|
|
121
|
+
@Inject
|
|
122
|
+
SecurityIdentity securityIdentity;
|
|
123
|
+
|
|
124
|
+
@GET
|
|
125
|
+
@Path("/{id}")
|
|
126
|
+
@RolesAllowed("USER")
|
|
127
|
+
public Response getUser(@PathParam("id") Long id) {
|
|
128
|
+
// Check ownership
|
|
129
|
+
if (!securityIdentity.hasRole("ADMIN") &&
|
|
130
|
+
!isOwner(id, securityIdentity.getPrincipal().getName())) {
|
|
131
|
+
return Response.status(Response.Status.FORBIDDEN).build();
|
|
132
|
+
}
|
|
133
|
+
return Response.ok(userService.findById(id)).build();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private boolean isOwner(Long userId, String username) {
|
|
137
|
+
return userService.isOwner(userId, username);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Programmatic Security
|
|
143
|
+
|
|
144
|
+
```java
|
|
145
|
+
@ApplicationScoped
|
|
146
|
+
public class SecurityService {
|
|
147
|
+
|
|
148
|
+
@Inject
|
|
149
|
+
SecurityIdentity securityIdentity;
|
|
150
|
+
|
|
151
|
+
public boolean canAccessResource(Long resourceId) {
|
|
152
|
+
if (securityIdentity.isAnonymous()) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (securityIdentity.hasRole("ADMIN")) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
String userId = securityIdentity.getPrincipal().getName();
|
|
161
|
+
return resourceRepository.isOwner(resourceId, userId);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Input Validation
|
|
167
|
+
|
|
168
|
+
### Bean Validation
|
|
169
|
+
|
|
170
|
+
```java
|
|
171
|
+
// BAD: No validation
|
|
172
|
+
@POST
|
|
173
|
+
public Response createUser(UserDto dto) {
|
|
174
|
+
return Response.ok(userService.create(dto)).build();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// GOOD: Validated DTO
|
|
178
|
+
public record CreateUserDto(
|
|
179
|
+
@NotBlank @Size(max = 100) String name,
|
|
180
|
+
@NotBlank @Email String email,
|
|
181
|
+
@NotNull @Min(18) @Max(150) Integer age,
|
|
182
|
+
@Pattern(regexp = "^\\+?[1-9]\\d{1,14}$") String phone
|
|
183
|
+
) {}
|
|
184
|
+
|
|
185
|
+
@POST
|
|
186
|
+
@Path("/users")
|
|
187
|
+
public Response createUser(@Valid CreateUserDto dto) {
|
|
188
|
+
User user = userService.create(dto);
|
|
189
|
+
return Response.status(Response.Status.CREATED).entity(user).build();
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Custom Validators
|
|
194
|
+
|
|
195
|
+
```java
|
|
196
|
+
@Target({ElementType.FIELD, ElementType.PARAMETER})
|
|
197
|
+
@Retention(RetentionPolicy.RUNTIME)
|
|
198
|
+
@Constraint(validatedBy = UsernameValidator.class)
|
|
199
|
+
public @interface ValidUsername {
|
|
200
|
+
String message() default "Invalid username format";
|
|
201
|
+
Class<?>[] groups() default {};
|
|
202
|
+
Class<? extends Payload>[] payload() default {};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
public class UsernameValidator implements ConstraintValidator<ValidUsername, String> {
|
|
206
|
+
@Override
|
|
207
|
+
public boolean isValid(String value, ConstraintValidatorContext context) {
|
|
208
|
+
if (value == null) return false;
|
|
209
|
+
return value.matches("^[a-zA-Z0-9_-]{3,20}$");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Usage
|
|
214
|
+
public record CreateUserDto(
|
|
215
|
+
@ValidUsername String username,
|
|
216
|
+
@NotBlank @Email String email
|
|
217
|
+
) {}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## SQL Injection Prevention
|
|
221
|
+
|
|
222
|
+
### Panache Active Record (Safe by Default)
|
|
223
|
+
|
|
224
|
+
```java
|
|
225
|
+
// GOOD: Parameterized queries with Panache
|
|
226
|
+
List<User> users = User.list("email = ?1 and active = ?2", email, true);
|
|
227
|
+
|
|
228
|
+
Optional<User> user = User.find("username", username).firstResultOptional();
|
|
229
|
+
|
|
230
|
+
// GOOD: Named parameters
|
|
231
|
+
List<User> users = User.list("email = :email and age > :minAge",
|
|
232
|
+
Parameters.with("email", email).and("minAge", 18));
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Native Queries (Use Parameters)
|
|
236
|
+
|
|
237
|
+
```java
|
|
238
|
+
// BAD: String concatenation
|
|
239
|
+
@Query(value = "SELECT * FROM users WHERE name = '" + name + "'", nativeQuery = true)
|
|
240
|
+
|
|
241
|
+
// GOOD: Parameterized native query
|
|
242
|
+
@Entity
|
|
243
|
+
public class User extends PanacheEntity {
|
|
244
|
+
public static List<User> findByEmailNative(String email) {
|
|
245
|
+
return getEntityManager()
|
|
246
|
+
.createNativeQuery("SELECT * FROM users WHERE email = :email", User.class)
|
|
247
|
+
.setParameter("email", email)
|
|
248
|
+
.getResultList();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Password Hashing
|
|
254
|
+
|
|
255
|
+
```java
|
|
256
|
+
@ApplicationScoped
|
|
257
|
+
public class PasswordService {
|
|
258
|
+
|
|
259
|
+
public String hash(String plainPassword) {
|
|
260
|
+
return BcryptUtil.bcryptHash(plainPassword);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
public boolean verify(String plainPassword, String hashedPassword) {
|
|
264
|
+
return BcryptUtil.matches(plainPassword, hashedPassword);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// In service
|
|
269
|
+
@ApplicationScoped
|
|
270
|
+
public class UserService {
|
|
271
|
+
@Inject
|
|
272
|
+
PasswordService passwordService;
|
|
273
|
+
|
|
274
|
+
@Transactional
|
|
275
|
+
public User register(CreateUserDto dto) {
|
|
276
|
+
String hashedPassword = passwordService.hash(dto.password());
|
|
277
|
+
User user = new User();
|
|
278
|
+
user.email = dto.email();
|
|
279
|
+
user.password = hashedPassword;
|
|
280
|
+
user.persist();
|
|
281
|
+
return user;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
public boolean authenticate(String email, String password) {
|
|
285
|
+
return User.find("email", email)
|
|
286
|
+
.firstResultOptional()
|
|
287
|
+
.map(u -> passwordService.verify(password, u.password))
|
|
288
|
+
.orElse(false);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## CORS Configuration
|
|
294
|
+
|
|
295
|
+
```properties
|
|
296
|
+
# application.properties
|
|
297
|
+
quarkus.http.cors=true
|
|
298
|
+
quarkus.http.cors.origins=https://app.example.com,https://admin.example.com
|
|
299
|
+
quarkus.http.cors.methods=GET,POST,PUT,DELETE
|
|
300
|
+
quarkus.http.cors.headers=accept,authorization,content-type,x-requested-with
|
|
301
|
+
quarkus.http.cors.exposed-headers=Content-Disposition
|
|
302
|
+
quarkus.http.cors.access-control-max-age=24H
|
|
303
|
+
quarkus.http.cors.access-control-allow-credentials=true
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Secrets Management
|
|
307
|
+
|
|
308
|
+
```properties
|
|
309
|
+
# application.properties - NO SECRETS HERE
|
|
310
|
+
|
|
311
|
+
# Use environment variables
|
|
312
|
+
quarkus.datasource.username=${DB_USER}
|
|
313
|
+
quarkus.datasource.password=${DB_PASSWORD}
|
|
314
|
+
quarkus.oidc.credentials.secret=${OIDC_CLIENT_SECRET}
|
|
315
|
+
|
|
316
|
+
# Or use Vault
|
|
317
|
+
quarkus.vault.url=https://vault.example.com
|
|
318
|
+
quarkus.vault.authentication.kubernetes.role=my-role
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### HashiCorp Vault Integration
|
|
322
|
+
|
|
323
|
+
```java
|
|
324
|
+
@ApplicationScoped
|
|
325
|
+
public class SecretService {
|
|
326
|
+
|
|
327
|
+
@ConfigProperty(name = "api-key")
|
|
328
|
+
String apiKey; // Fetched from Vault
|
|
329
|
+
|
|
330
|
+
public String getSecret(String key) {
|
|
331
|
+
return ConfigProvider.getConfig().getValue(key, String.class);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
## Rate Limiting
|
|
337
|
+
|
|
338
|
+
**Security Note**: Never use `X-Forwarded-For` directly — clients can spoof it.
|
|
339
|
+
Use the actual remote address from the servlet request, or an authenticated
|
|
340
|
+
identity (API key, JWT subject) when available.
|
|
341
|
+
|
|
342
|
+
```java
|
|
343
|
+
@ApplicationScoped
|
|
344
|
+
public class RateLimitFilter implements ContainerRequestFilter {
|
|
345
|
+
private final Map<String, RateLimiter> limiters = new ConcurrentHashMap<>();
|
|
346
|
+
|
|
347
|
+
@Inject
|
|
348
|
+
HttpServletRequest servletRequest;
|
|
349
|
+
|
|
350
|
+
@Override
|
|
351
|
+
public void filter(ContainerRequestContext requestContext) {
|
|
352
|
+
String clientId = getClientIdentifier();
|
|
353
|
+
RateLimiter limiter = limiters.computeIfAbsent(clientId,
|
|
354
|
+
k -> RateLimiter.create(100.0)); // 100 requests per second
|
|
355
|
+
|
|
356
|
+
if (!limiter.tryAcquire()) {
|
|
357
|
+
requestContext.abortWith(
|
|
358
|
+
Response.status(429)
|
|
359
|
+
.entity(Map.of("error", "Too many requests"))
|
|
360
|
+
.build()
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
private String getClientIdentifier() {
|
|
366
|
+
// Use the container-provided remote address (not X-Forwarded-For).
|
|
367
|
+
// If behind a trusted proxy, configure quarkus.http.proxy.proxy-address-forwarding=true
|
|
368
|
+
// so getRemoteAddr() returns the real client IP.
|
|
369
|
+
return servletRequest.getRemoteAddr();
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
## Security Headers
|
|
375
|
+
|
|
376
|
+
```java
|
|
377
|
+
@Provider
|
|
378
|
+
public class SecurityHeadersFilter implements ContainerResponseFilter {
|
|
379
|
+
|
|
380
|
+
@Override
|
|
381
|
+
public void filter(ContainerRequestContext request, ContainerResponseContext response) {
|
|
382
|
+
MultivaluedMap<String, Object> headers = response.getHeaders();
|
|
383
|
+
|
|
384
|
+
// Prevent clickjacking
|
|
385
|
+
headers.putSingle("X-Frame-Options", "DENY");
|
|
386
|
+
|
|
387
|
+
// XSS protection
|
|
388
|
+
headers.putSingle("X-Content-Type-Options", "nosniff");
|
|
389
|
+
headers.putSingle("X-XSS-Protection", "1; mode=block");
|
|
390
|
+
|
|
391
|
+
// HSTS
|
|
392
|
+
headers.putSingle("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
|
|
393
|
+
|
|
394
|
+
// CSP — avoid 'unsafe-inline' for script-src as it negates XSS protection;
|
|
395
|
+
// use nonces or hashes instead. 'unsafe-inline' for style-src is acceptable
|
|
396
|
+
// when CSS frameworks require it, but prefer nonces where possible.
|
|
397
|
+
headers.putSingle("Content-Security-Policy",
|
|
398
|
+
"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'");
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
## Audit Logging
|
|
404
|
+
|
|
405
|
+
```java
|
|
406
|
+
@ApplicationScoped
|
|
407
|
+
public class AuditService {
|
|
408
|
+
private static final Logger LOG = Logger.getLogger(AuditService.class);
|
|
409
|
+
|
|
410
|
+
@Inject
|
|
411
|
+
SecurityIdentity securityIdentity;
|
|
412
|
+
|
|
413
|
+
public void logAccess(String resource, String action) {
|
|
414
|
+
String user = securityIdentity.isAnonymous()
|
|
415
|
+
? "anonymous"
|
|
416
|
+
: securityIdentity.getPrincipal().getName();
|
|
417
|
+
|
|
418
|
+
LOG.infof("AUDIT: user=%s action=%s resource=%s timestamp=%s",
|
|
419
|
+
user, action, resource, Instant.now());
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// Usage in resource
|
|
424
|
+
@Path("/api/sensitive")
|
|
425
|
+
public class SensitiveResource {
|
|
426
|
+
@Inject
|
|
427
|
+
AuditService auditService;
|
|
428
|
+
|
|
429
|
+
@GET
|
|
430
|
+
@RolesAllowed("ADMIN")
|
|
431
|
+
public Response getData() {
|
|
432
|
+
auditService.logAccess("sensitive-data", "READ");
|
|
433
|
+
return Response.ok(data).build();
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
## Dependency Security Scanning
|
|
439
|
+
|
|
440
|
+
```bash
|
|
441
|
+
# Maven
|
|
442
|
+
mvn org.owasp:dependency-check-maven:check
|
|
443
|
+
|
|
444
|
+
# Gradle
|
|
445
|
+
./gradlew dependencyCheckAnalyze
|
|
446
|
+
|
|
447
|
+
# Check Quarkus extensions
|
|
448
|
+
quarkus extension list --installable
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
## Best Practices
|
|
452
|
+
|
|
453
|
+
- Always use HTTPS in production
|
|
454
|
+
- Enable JWT or OIDC for stateless authentication
|
|
455
|
+
- Use `@RolesAllowed` for declarative authorization
|
|
456
|
+
- Validate all input with Bean Validation
|
|
457
|
+
- Hash passwords with BCrypt (never plaintext)
|
|
458
|
+
- Store secrets in Vault or environment variables
|
|
459
|
+
- Use parameterized queries to prevent SQL injection
|
|
460
|
+
- Add security headers to all responses
|
|
461
|
+
- Implement rate limiting for public endpoints
|
|
462
|
+
- Audit sensitive operations
|
|
463
|
+
- Keep dependencies updated and scan for CVEs
|
|
464
|
+
- Use SecurityIdentity for programmatic checks
|
|
465
|
+
- Set appropriate CORS policies
|
|
466
|
+
- Test authentication and authorization paths
|