@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,258 @@
|
|
|
1
|
+
#!/usr/bin/env swift
|
|
2
|
+
|
|
3
|
+
import AppKit
|
|
4
|
+
import Foundation
|
|
5
|
+
|
|
6
|
+
// MARK: - Configuration
|
|
7
|
+
|
|
8
|
+
struct IconSpec {
|
|
9
|
+
let symbolName: String
|
|
10
|
+
let assetName: String
|
|
11
|
+
let baseSize: CGFloat
|
|
12
|
+
let color: NSColor
|
|
13
|
+
let weight: NSFont.Weight
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
func parseColor(_ hex: String) -> NSColor {
|
|
17
|
+
var hex = hex.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
18
|
+
if hex.hasPrefix("#") { hex.removeFirst() }
|
|
19
|
+
guard hex.count == 6, let value = UInt64(hex, radix: 16) else {
|
|
20
|
+
return NSColor(red: 142/255, green: 142/255, blue: 147/255, alpha: 1.0)
|
|
21
|
+
}
|
|
22
|
+
return NSColor(
|
|
23
|
+
red: CGFloat((value >> 16) & 0xFF) / 255,
|
|
24
|
+
green: CGFloat((value >> 8) & 0xFF) / 255,
|
|
25
|
+
blue: CGFloat(value & 0xFF) / 255,
|
|
26
|
+
alpha: 1.0
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
func parseWeight(_ name: String) -> NSFont.Weight {
|
|
31
|
+
switch name.lowercased() {
|
|
32
|
+
case "ultralight": return .ultraLight
|
|
33
|
+
case "thin": return .thin
|
|
34
|
+
case "light": return .light
|
|
35
|
+
case "regular": return .regular
|
|
36
|
+
case "medium": return .medium
|
|
37
|
+
case "semibold": return .semibold
|
|
38
|
+
case "bold": return .bold
|
|
39
|
+
case "heavy": return .heavy
|
|
40
|
+
case "black": return .black
|
|
41
|
+
default: return .thin
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// MARK: - Generation
|
|
46
|
+
|
|
47
|
+
enum IconError: Error, CustomStringConvertible {
|
|
48
|
+
case directoryCreation(String)
|
|
49
|
+
case symbolNotFound(String)
|
|
50
|
+
case configurationFailed(String)
|
|
51
|
+
case pngCreation(String)
|
|
52
|
+
case fileWrite(String)
|
|
53
|
+
|
|
54
|
+
var description: String {
|
|
55
|
+
switch self {
|
|
56
|
+
case .directoryCreation(let msg): return msg
|
|
57
|
+
case .symbolNotFound(let msg): return msg
|
|
58
|
+
case .configurationFailed(let msg): return msg
|
|
59
|
+
case .pngCreation(let msg): return msg
|
|
60
|
+
case .fileWrite(let msg): return msg
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
func generateIcon(_ spec: IconSpec, outputDir: String) throws {
|
|
66
|
+
let dir = "\(outputDir)/\(spec.assetName).imageset"
|
|
67
|
+
do {
|
|
68
|
+
try FileManager.default.createDirectory(atPath: dir, withIntermediateDirectories: true)
|
|
69
|
+
} catch {
|
|
70
|
+
throw IconError.directoryCreation("Could not create output directory '\(dir)': \(error.localizedDescription)")
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let scales: [(suffix: String, multiplier: CGFloat)] = [("", 1), ("@2x", 2), ("@3x", 3)]
|
|
74
|
+
|
|
75
|
+
for scale in scales {
|
|
76
|
+
let pixelSize = spec.baseSize * scale.multiplier
|
|
77
|
+
let imageSize = NSSize(width: pixelSize, height: pixelSize)
|
|
78
|
+
|
|
79
|
+
let config = NSImage.SymbolConfiguration(
|
|
80
|
+
pointSize: pixelSize * 0.40,
|
|
81
|
+
weight: spec.weight,
|
|
82
|
+
scale: .large
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
guard let symbol = NSImage(systemSymbolName: spec.symbolName, accessibilityDescription: nil) else {
|
|
86
|
+
throw IconError.symbolNotFound("SF Symbol '\(spec.symbolName)' not found. Run 'SF Symbols' app to browse available names.")
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
guard let configured = symbol.withSymbolConfiguration(config) else {
|
|
90
|
+
throw IconError.configurationFailed("Could not apply symbol configuration to '\(spec.symbolName)'")
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
let image = NSImage(size: imageSize, flipped: false) { rect in
|
|
94
|
+
let symSize = configured.size
|
|
95
|
+
let x = (rect.width - symSize.width) / 2
|
|
96
|
+
let y = (rect.height - symSize.height) / 2
|
|
97
|
+
let drawRect = NSRect(x: x, y: y, width: symSize.width, height: symSize.height)
|
|
98
|
+
|
|
99
|
+
let tinted = NSImage(size: symSize, flipped: false) { tintRect in
|
|
100
|
+
configured.draw(in: tintRect)
|
|
101
|
+
spec.color.set()
|
|
102
|
+
tintRect.fill(using: .sourceAtop)
|
|
103
|
+
return true
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
tinted.draw(in: drawRect, from: .zero, operation: .sourceOver, fraction: 1.0)
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
guard let tiffData = image.tiffRepresentation,
|
|
111
|
+
let bitmap = NSBitmapImageRep(data: tiffData),
|
|
112
|
+
let pngData = bitmap.representation(using: .png, properties: [:]) else {
|
|
113
|
+
throw IconError.pngCreation("Failed to create PNG for \(spec.assetName)\(scale.suffix)")
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
let fileName = "\(spec.assetName)\(scale.suffix).png"
|
|
117
|
+
do {
|
|
118
|
+
try pngData.write(to: URL(fileURLWithPath: "\(dir)/\(fileName)"))
|
|
119
|
+
} catch {
|
|
120
|
+
throw IconError.fileWrite("Failed to write \(fileName): \(error.localizedDescription)")
|
|
121
|
+
}
|
|
122
|
+
print(" \(fileName) (\(Int(pixelSize))x\(Int(pixelSize)))")
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Write Contents.json
|
|
126
|
+
let json = """
|
|
127
|
+
{
|
|
128
|
+
"images" : [
|
|
129
|
+
{
|
|
130
|
+
"filename" : "\(spec.assetName).png",
|
|
131
|
+
"idiom" : "universal",
|
|
132
|
+
"scale" : "1x"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"filename" : "\(spec.assetName)@2x.png",
|
|
136
|
+
"idiom" : "universal",
|
|
137
|
+
"scale" : "2x"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"filename" : "\(spec.assetName)@3x.png",
|
|
141
|
+
"idiom" : "universal",
|
|
142
|
+
"scale" : "3x"
|
|
143
|
+
}
|
|
144
|
+
],
|
|
145
|
+
"info" : {
|
|
146
|
+
"author" : "xcode",
|
|
147
|
+
"version" : 1
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
"""
|
|
151
|
+
do {
|
|
152
|
+
try json.write(toFile: "\(dir)/Contents.json", atomically: true, encoding: .utf8)
|
|
153
|
+
} catch {
|
|
154
|
+
throw IconError.fileWrite("Failed to write Contents.json: \(error.localizedDescription)")
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
func requireOptionValue(_ args: [String], at index: Int, flag: String) -> String {
|
|
159
|
+
guard index < args.count else {
|
|
160
|
+
fputs("ERROR: Missing value for \(flag)\n", stderr)
|
|
161
|
+
exit(1)
|
|
162
|
+
}
|
|
163
|
+
let value = args[index]
|
|
164
|
+
if value.hasPrefix("--") {
|
|
165
|
+
fputs("ERROR: Missing value for \(flag)\n", stderr)
|
|
166
|
+
exit(1)
|
|
167
|
+
}
|
|
168
|
+
return value
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// MARK: - CLI
|
|
172
|
+
|
|
173
|
+
let args = CommandLine.arguments
|
|
174
|
+
|
|
175
|
+
if args.count < 3 || args.contains("--help") || args.contains("-h") {
|
|
176
|
+
print("""
|
|
177
|
+
Usage: generate_icons.swift <sf-symbol-name> <asset-name> [options]
|
|
178
|
+
|
|
179
|
+
Options:
|
|
180
|
+
--size <pt> Base size in points (default: 68)
|
|
181
|
+
--color <hex> Color hex code (default: 8E8E93)
|
|
182
|
+
--weight <name> Font weight: ultralight|thin|light|regular|medium|semibold|bold|heavy|black (default: thin)
|
|
183
|
+
--output <dir> Output directory (default: /tmp/icons)
|
|
184
|
+
|
|
185
|
+
Examples:
|
|
186
|
+
generate_icons.swift doc.text.below.ecg editTool_expenseReport
|
|
187
|
+
generate_icons.swift person.crop.rectangle editTool_businessCard --color 007AFF --weight regular
|
|
188
|
+
generate_icons.swift receipt myReceipt --size 48 --output ./Assets.xcassets/icons
|
|
189
|
+
|
|
190
|
+
Browse SF Symbol names: open the SF Symbols app (free from Apple) or https://developer.apple.com/sf-symbols/
|
|
191
|
+
""")
|
|
192
|
+
exit(0)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
let symbolName = args[1]
|
|
196
|
+
let assetName = args[2]
|
|
197
|
+
|
|
198
|
+
var baseSize: CGFloat = 68
|
|
199
|
+
var colorHex = "8E8E93"
|
|
200
|
+
var weightName = "thin"
|
|
201
|
+
var outputDir = "/tmp/icons"
|
|
202
|
+
|
|
203
|
+
var i = 3
|
|
204
|
+
while i < args.count {
|
|
205
|
+
switch args[i] {
|
|
206
|
+
case "--size":
|
|
207
|
+
let raw = requireOptionValue(args, at: i + 1, flag: "--size")
|
|
208
|
+
guard let size = Double(raw), size > 0 else {
|
|
209
|
+
fputs("ERROR: --size must be a positive number\n", stderr)
|
|
210
|
+
exit(1)
|
|
211
|
+
}
|
|
212
|
+
baseSize = CGFloat(size)
|
|
213
|
+
i += 2
|
|
214
|
+
continue
|
|
215
|
+
case "--color":
|
|
216
|
+
colorHex = requireOptionValue(args, at: i + 1, flag: "--color")
|
|
217
|
+
let stripped = colorHex.hasPrefix("#") ? String(colorHex.dropFirst()) : colorHex
|
|
218
|
+
guard stripped.count == 6, UInt64(stripped, radix: 16) != nil else {
|
|
219
|
+
fputs("ERROR: --color must be a 6-digit hex code (e.g. 007AFF)\n", stderr)
|
|
220
|
+
exit(1)
|
|
221
|
+
}
|
|
222
|
+
i += 2
|
|
223
|
+
continue
|
|
224
|
+
case "--weight":
|
|
225
|
+
weightName = requireOptionValue(args, at: i + 1, flag: "--weight")
|
|
226
|
+
let validWeights = ["ultralight", "thin", "light", "regular", "medium", "semibold", "bold", "heavy", "black"]
|
|
227
|
+
guard validWeights.contains(weightName.lowercased()) else {
|
|
228
|
+
fputs("ERROR: --weight must be one of: \(validWeights.joined(separator: ", "))\n", stderr)
|
|
229
|
+
exit(1)
|
|
230
|
+
}
|
|
231
|
+
i += 2
|
|
232
|
+
continue
|
|
233
|
+
case "--output":
|
|
234
|
+
outputDir = requireOptionValue(args, at: i + 1, flag: "--output")
|
|
235
|
+
i += 2
|
|
236
|
+
continue
|
|
237
|
+
default:
|
|
238
|
+
fputs("WARNING: Unknown option \(args[i])\n", stderr)
|
|
239
|
+
}
|
|
240
|
+
i += 1
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
let spec = IconSpec(
|
|
244
|
+
symbolName: symbolName,
|
|
245
|
+
assetName: assetName,
|
|
246
|
+
baseSize: baseSize,
|
|
247
|
+
color: parseColor(colorHex),
|
|
248
|
+
weight: parseWeight(weightName)
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
print("Generating \(assetName) from SF Symbol '\(symbolName)':")
|
|
252
|
+
do {
|
|
253
|
+
try generateIcon(spec, outputDir: outputDir)
|
|
254
|
+
print("Output: \(outputDir)/\(assetName).imageset/")
|
|
255
|
+
} catch {
|
|
256
|
+
fputs("ERROR: \(error)\n", stderr)
|
|
257
|
+
exit(1)
|
|
258
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Generate iOS icon imagesets from Iconify API (275k+ open source icons)
|
|
4
|
+
# Uses: curl (download SVG) + sips (SVG->PNG conversion, built into macOS)
|
|
5
|
+
#
|
|
6
|
+
# Usage:
|
|
7
|
+
# iconify_gen.sh <icon-id> <asset-name> [options]
|
|
8
|
+
# iconify_gen.sh search <query> [--prefix <collection>] [--limit <n>]
|
|
9
|
+
#
|
|
10
|
+
# Examples:
|
|
11
|
+
# iconify_gen.sh mdi:receipt-text-outline myExpenseIcon
|
|
12
|
+
# iconify_gen.sh search "business card"
|
|
13
|
+
# iconify_gen.sh search receipt --prefix mdi
|
|
14
|
+
|
|
15
|
+
set -euo pipefail
|
|
16
|
+
|
|
17
|
+
API_BASE="https://api.iconify.design"
|
|
18
|
+
readonly CURL_OPTS=(--fail --silent --show-error --connect-timeout 10 --max-time 30)
|
|
19
|
+
|
|
20
|
+
# Defaults
|
|
21
|
+
SIZE=68
|
|
22
|
+
COLOR="8E8E93"
|
|
23
|
+
OUTPUT="/tmp/icons"
|
|
24
|
+
LIMIT=20
|
|
25
|
+
|
|
26
|
+
require_value() {
|
|
27
|
+
local flag="$1"
|
|
28
|
+
local value="${2-}"
|
|
29
|
+
if [[ -z "$value" || "$value" == --* ]]; then
|
|
30
|
+
echo "ERROR: ${flag} requires a value" >&2
|
|
31
|
+
exit 1
|
|
32
|
+
fi
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
usage() {
|
|
36
|
+
cat <<'EOF'
|
|
37
|
+
Usage:
|
|
38
|
+
iconify_gen.sh <icon-id> <asset-name> [options] Generate an icon imageset
|
|
39
|
+
iconify_gen.sh search <query> [options] Search for icons
|
|
40
|
+
iconify_gen.sh preview <icon-id> Download preview SVG
|
|
41
|
+
iconify_gen.sh collections List popular icon collections
|
|
42
|
+
|
|
43
|
+
Generate Options:
|
|
44
|
+
--size <pt> Base size in points (default: 68)
|
|
45
|
+
--color <hex> Color hex without # (default: 8E8E93)
|
|
46
|
+
--output <dir> Output directory (default: /tmp/icons)
|
|
47
|
+
|
|
48
|
+
Search Options:
|
|
49
|
+
--prefix <name> Filter by collection (e.g., mdi, lucide, tabler, ph)
|
|
50
|
+
--limit <n> Max results (default: 20)
|
|
51
|
+
|
|
52
|
+
Icon ID Format: <collection>:<icon-name>
|
|
53
|
+
Examples: mdi:receipt-text-outline, lucide:credit-card, ph:address-book
|
|
54
|
+
|
|
55
|
+
Popular Collections:
|
|
56
|
+
mdi Material Design Icons (7400+ icons)
|
|
57
|
+
lucide Lucide (1700+ icons)
|
|
58
|
+
tabler Tabler Icons (6000+ icons)
|
|
59
|
+
ph Phosphor (9000+ icons)
|
|
60
|
+
ri Remix Icon (2800+ icons)
|
|
61
|
+
carbon Carbon (2100+ icons)
|
|
62
|
+
EOF
|
|
63
|
+
exit 0
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
search_icons() {
|
|
67
|
+
local query="$1"
|
|
68
|
+
shift
|
|
69
|
+
local prefix=""
|
|
70
|
+
|
|
71
|
+
while [[ $# -gt 0 ]]; do
|
|
72
|
+
case "$1" in
|
|
73
|
+
--prefix) require_value --prefix "${2-}"; prefix="$2"; shift 2 ;;
|
|
74
|
+
--limit) require_value --limit "${2-}"; LIMIT="$2"; shift 2 ;;
|
|
75
|
+
*) shift ;;
|
|
76
|
+
esac
|
|
77
|
+
done
|
|
78
|
+
|
|
79
|
+
local encoded_query
|
|
80
|
+
encoded_query="$(python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1]))" "$query")"
|
|
81
|
+
local url="${API_BASE}/search?query=${encoded_query}&limit=${LIMIT}"
|
|
82
|
+
if [[ -n "$prefix" ]]; then
|
|
83
|
+
url="${url}&prefix=${prefix}"
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
local response
|
|
87
|
+
response=$(curl "${CURL_OPTS[@]}" "$url") || { echo "ERROR: Search request failed"; exit 1; }
|
|
88
|
+
|
|
89
|
+
local total
|
|
90
|
+
total=$(echo "$response" | python3 -c "import sys,json; print(json.load(sys.stdin).get('total',0))")
|
|
91
|
+
|
|
92
|
+
echo "Found ${total} icons for '${query}':"
|
|
93
|
+
echo ""
|
|
94
|
+
echo "$response" | python3 -c "
|
|
95
|
+
import sys, json
|
|
96
|
+
data = json.load(sys.stdin)
|
|
97
|
+
for icon in data.get('icons', []):
|
|
98
|
+
print(f' {icon}')
|
|
99
|
+
"
|
|
100
|
+
echo ""
|
|
101
|
+
echo "Generate with: iconify_gen.sh <icon-id> <asset-name>"
|
|
102
|
+
echo "Preview with: iconify_gen.sh preview <icon-id>"
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
list_collections() {
|
|
106
|
+
echo "Popular Iconify collections:"
|
|
107
|
+
echo ""
|
|
108
|
+
local resp
|
|
109
|
+
resp=$(curl "${CURL_OPTS[@]}" "${API_BASE}/collections") || { echo "ERROR: Failed to fetch collections list"; exit 1; }
|
|
110
|
+
echo "$resp" | python3 -c "
|
|
111
|
+
import sys, json
|
|
112
|
+
data = json.load(sys.stdin)
|
|
113
|
+
popular = ['mdi','lucide','tabler','ph','ri','carbon','solar','heroicons','bi','octicon','ion','fe','charm','ci','iconoir','basil','uil','mingcute','flowbite','mynaui']
|
|
114
|
+
for k in popular:
|
|
115
|
+
if k in data:
|
|
116
|
+
v = data[k]
|
|
117
|
+
name = v.get('name','')
|
|
118
|
+
total = v.get('total',0)
|
|
119
|
+
print(f' {k:12s} {name} ({total} icons)')
|
|
120
|
+
"
|
|
121
|
+
echo ""
|
|
122
|
+
echo "Full list: https://icon-sets.iconify.design/"
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
preview_icon() {
|
|
126
|
+
local icon_id="$1"
|
|
127
|
+
local collection="${icon_id%%:*}"
|
|
128
|
+
local name="${icon_id#*:}"
|
|
129
|
+
local url="${API_BASE}/${collection}/${name}.svg?width=136&height=136&color=%23${COLOR}"
|
|
130
|
+
local outfile="/tmp/iconify_preview_${collection}_${name}.svg"
|
|
131
|
+
|
|
132
|
+
curl "${CURL_OPTS[@]}" "$url" -o "$outfile" || { echo "ERROR: Icon '${icon_id}' not found"; exit 1; }
|
|
133
|
+
echo "Preview SVG: ${outfile}"
|
|
134
|
+
echo "URL: ${url}"
|
|
135
|
+
|
|
136
|
+
# Also convert to PNG for visual check
|
|
137
|
+
local pngfile="/tmp/iconify_preview_${collection}_${name}.png"
|
|
138
|
+
sips -s format png "$outfile" --out "$pngfile" >/dev/null 2>&1 || echo "WARNING: sips conversion failed; PNG may be incorrect"
|
|
139
|
+
echo "Preview PNG: ${pngfile}"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
generate_icon() {
|
|
143
|
+
local icon_id="$1"
|
|
144
|
+
local asset_name="$2"
|
|
145
|
+
shift 2
|
|
146
|
+
|
|
147
|
+
while [[ $# -gt 0 ]]; do
|
|
148
|
+
case "$1" in
|
|
149
|
+
--size) require_value --size "${2-}"; SIZE="$2"; shift 2 ;;
|
|
150
|
+
--color) require_value --color "${2-}"; COLOR="$2"; shift 2 ;;
|
|
151
|
+
--output) require_value --output "${2-}"; OUTPUT="$2"; shift 2 ;;
|
|
152
|
+
*) shift ;;
|
|
153
|
+
esac
|
|
154
|
+
done
|
|
155
|
+
|
|
156
|
+
local collection="${icon_id%%:*}"
|
|
157
|
+
local name="${icon_id#*:}"
|
|
158
|
+
local imageset_dir="${OUTPUT}/${asset_name}.imageset"
|
|
159
|
+
|
|
160
|
+
mkdir -p "$imageset_dir"
|
|
161
|
+
|
|
162
|
+
echo "Generating ${asset_name} from Iconify '${icon_id}':"
|
|
163
|
+
|
|
164
|
+
local scales=("1:${SIZE}" "2:$((SIZE * 2))" "3:$((SIZE * 3))")
|
|
165
|
+
|
|
166
|
+
for scale_info in "${scales[@]}"; do
|
|
167
|
+
local scale="${scale_info%%:*}"
|
|
168
|
+
local px="${scale_info#*:}"
|
|
169
|
+
local suffix=""
|
|
170
|
+
[[ "$scale" != "1" ]] && suffix="@${scale}x"
|
|
171
|
+
|
|
172
|
+
local svg_url="${API_BASE}/${collection}/${name}.svg?width=${px}&height=${px}&color=%23${COLOR}"
|
|
173
|
+
local svg_file="${imageset_dir}/${asset_name}${suffix}.svg"
|
|
174
|
+
local png_file="${imageset_dir}/${asset_name}${suffix}.png"
|
|
175
|
+
|
|
176
|
+
curl "${CURL_OPTS[@]}" "$svg_url" -o "$svg_file" || { echo "ERROR: Failed to download icon '${icon_id}'"; exit 1; }
|
|
177
|
+
sips -s format png "$svg_file" --out "$png_file" >/dev/null 2>&1 || echo "WARNING: sips conversion may have failed for ${svg_file}"
|
|
178
|
+
rm "$svg_file"
|
|
179
|
+
|
|
180
|
+
echo " ${asset_name}${suffix}.png (${px}x${px})"
|
|
181
|
+
done
|
|
182
|
+
|
|
183
|
+
# Write Contents.json
|
|
184
|
+
cat > "${imageset_dir}/Contents.json" <<JSONEOF
|
|
185
|
+
{
|
|
186
|
+
"images" : [
|
|
187
|
+
{
|
|
188
|
+
"filename" : "${asset_name}.png",
|
|
189
|
+
"idiom" : "universal",
|
|
190
|
+
"scale" : "1x"
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
"filename" : "${asset_name}@2x.png",
|
|
194
|
+
"idiom" : "universal",
|
|
195
|
+
"scale" : "2x"
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"filename" : "${asset_name}@3x.png",
|
|
199
|
+
"idiom" : "universal",
|
|
200
|
+
"scale" : "3x"
|
|
201
|
+
}
|
|
202
|
+
],
|
|
203
|
+
"info" : {
|
|
204
|
+
"author" : "xcode",
|
|
205
|
+
"version" : 1
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
JSONEOF
|
|
209
|
+
|
|
210
|
+
echo "Output: ${imageset_dir}/"
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
# Main
|
|
214
|
+
[[ $# -eq 0 ]] && usage
|
|
215
|
+
[[ "$1" == "--help" || "$1" == "-h" ]] && usage
|
|
216
|
+
|
|
217
|
+
case "$1" in
|
|
218
|
+
search)
|
|
219
|
+
shift
|
|
220
|
+
[[ $# -eq 0 ]] && { echo "Usage: iconify_gen.sh search <query>"; exit 1; }
|
|
221
|
+
search_icons "$@"
|
|
222
|
+
;;
|
|
223
|
+
preview)
|
|
224
|
+
shift
|
|
225
|
+
[[ $# -eq 0 ]] && { echo "Usage: iconify_gen.sh preview <icon-id>"; exit 1; }
|
|
226
|
+
preview_icon "$1"
|
|
227
|
+
;;
|
|
228
|
+
collections)
|
|
229
|
+
list_collections
|
|
230
|
+
;;
|
|
231
|
+
*)
|
|
232
|
+
[[ $# -lt 2 ]] && { echo "Usage: iconify_gen.sh <icon-id> <asset-name> [options]"; exit 1; }
|
|
233
|
+
generate_icon "$@"
|
|
234
|
+
;;
|
|
235
|
+
esac
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: iterative-retrieval
|
|
3
|
+
description: Pattern for progressively refining context retrieval to solve the subagent context problem
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Iterative Retrieval Pattern
|
|
7
|
+
|
|
8
|
+
Solves the "context problem" in multi-agent workflows where subagents don't know what context they need until they start working.
|
|
9
|
+
|
|
10
|
+
## When to Activate
|
|
11
|
+
|
|
12
|
+
- Spawning subagents that need codebase context they cannot predict upfront
|
|
13
|
+
- Building multi-agent workflows where context is progressively refined
|
|
14
|
+
- Encountering "context too large" or "missing context" failures in agent tasks
|
|
15
|
+
- Designing RAG-like retrieval pipelines for code exploration
|
|
16
|
+
- Optimizing token usage in agent orchestration
|
|
17
|
+
|
|
18
|
+
## The Problem
|
|
19
|
+
|
|
20
|
+
Subagents are spawned with limited context. They don't know:
|
|
21
|
+
- Which files contain relevant code
|
|
22
|
+
- What patterns exist in the codebase
|
|
23
|
+
- What terminology the project uses
|
|
24
|
+
|
|
25
|
+
Standard approaches fail:
|
|
26
|
+
- **Send everything**: Exceeds context limits
|
|
27
|
+
- **Send nothing**: Agent lacks critical information
|
|
28
|
+
- **Guess what's needed**: Often wrong
|
|
29
|
+
|
|
30
|
+
## The Solution: Iterative Retrieval
|
|
31
|
+
|
|
32
|
+
A 4-phase loop that progressively refines context:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
┌─────────────────────────────────────────────┐
|
|
36
|
+
│ │
|
|
37
|
+
│ ┌──────────┐ ┌──────────┐ │
|
|
38
|
+
│ │ DISPATCH │─────│ EVALUATE │ │
|
|
39
|
+
│ └──────────┘ └──────────┘ │
|
|
40
|
+
│ ▲ │ │
|
|
41
|
+
│ │ ▼ │
|
|
42
|
+
│ ┌──────────┐ ┌──────────┐ │
|
|
43
|
+
│ │ LOOP │─────│ REFINE │ │
|
|
44
|
+
│ └──────────┘ └──────────┘ │
|
|
45
|
+
│ │
|
|
46
|
+
│ Max 3 cycles, then proceed │
|
|
47
|
+
└─────────────────────────────────────────────┘
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Phase 1: DISPATCH
|
|
51
|
+
|
|
52
|
+
Initial broad query to gather candidate files:
|
|
53
|
+
|
|
54
|
+
```javascript
|
|
55
|
+
// Start with high-level intent
|
|
56
|
+
const initialQuery = {
|
|
57
|
+
patterns: ['src/**/*.ts', 'lib/**/*.ts'],
|
|
58
|
+
keywords: ['authentication', 'user', 'session'],
|
|
59
|
+
excludes: ['*.test.ts', '*.spec.ts']
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// Dispatch to retrieval agent
|
|
63
|
+
const candidates = await retrieveFiles(initialQuery);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Phase 2: EVALUATE
|
|
67
|
+
|
|
68
|
+
Assess retrieved content for relevance:
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
function evaluateRelevance(files, task) {
|
|
72
|
+
return files.map(file => ({
|
|
73
|
+
path: file.path,
|
|
74
|
+
relevance: scoreRelevance(file.content, task),
|
|
75
|
+
reason: explainRelevance(file.content, task),
|
|
76
|
+
missingContext: identifyGaps(file.content, task)
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Scoring criteria:
|
|
82
|
+
- **High (0.8-1.0)**: Directly implements target functionality
|
|
83
|
+
- **Medium (0.5-0.7)**: Contains related patterns or types
|
|
84
|
+
- **Low (0.2-0.4)**: Tangentially related
|
|
85
|
+
- **None (0-0.2)**: Not relevant, exclude
|
|
86
|
+
|
|
87
|
+
### Phase 3: REFINE
|
|
88
|
+
|
|
89
|
+
Update search criteria based on evaluation:
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
function refineQuery(evaluation, previousQuery) {
|
|
93
|
+
return {
|
|
94
|
+
// Add new patterns discovered in high-relevance files
|
|
95
|
+
patterns: [...previousQuery.patterns, ...extractPatterns(evaluation)],
|
|
96
|
+
|
|
97
|
+
// Add terminology found in codebase
|
|
98
|
+
keywords: [...previousQuery.keywords, ...extractKeywords(evaluation)],
|
|
99
|
+
|
|
100
|
+
// Exclude confirmed irrelevant paths
|
|
101
|
+
excludes: [...previousQuery.excludes, ...evaluation
|
|
102
|
+
.filter(e => e.relevance < 0.2)
|
|
103
|
+
.map(e => e.path)
|
|
104
|
+
],
|
|
105
|
+
|
|
106
|
+
// Target specific gaps
|
|
107
|
+
focusAreas: evaluation
|
|
108
|
+
.flatMap(e => e.missingContext)
|
|
109
|
+
.filter(unique)
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Phase 4: LOOP
|
|
115
|
+
|
|
116
|
+
Repeat with refined criteria (max 3 cycles):
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
async function iterativeRetrieve(task, maxCycles = 3) {
|
|
120
|
+
let query = createInitialQuery(task);
|
|
121
|
+
let bestContext = [];
|
|
122
|
+
|
|
123
|
+
for (let cycle = 0; cycle < maxCycles; cycle++) {
|
|
124
|
+
const candidates = await retrieveFiles(query);
|
|
125
|
+
const evaluation = evaluateRelevance(candidates, task);
|
|
126
|
+
|
|
127
|
+
// Check if we have sufficient context
|
|
128
|
+
const highRelevance = evaluation.filter(e => e.relevance >= 0.7);
|
|
129
|
+
if (highRelevance.length >= 3 && !hasCriticalGaps(evaluation)) {
|
|
130
|
+
return highRelevance;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Refine and continue
|
|
134
|
+
query = refineQuery(evaluation, query);
|
|
135
|
+
bestContext = mergeContext(bestContext, highRelevance);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return bestContext;
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Practical Examples
|
|
143
|
+
|
|
144
|
+
### Example 1: Bug Fix Context
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
Task: "Fix the authentication token expiry bug"
|
|
148
|
+
|
|
149
|
+
Cycle 1:
|
|
150
|
+
DISPATCH: Search for "token", "auth", "expiry" in src/**
|
|
151
|
+
EVALUATE: Found auth.ts (0.9), tokens.ts (0.8), user.ts (0.3)
|
|
152
|
+
REFINE: Add "refresh", "jwt" keywords; exclude user.ts
|
|
153
|
+
|
|
154
|
+
Cycle 2:
|
|
155
|
+
DISPATCH: Search refined terms
|
|
156
|
+
EVALUATE: Found session-manager.ts (0.95), jwt-utils.ts (0.85)
|
|
157
|
+
REFINE: Sufficient context (2 high-relevance files)
|
|
158
|
+
|
|
159
|
+
Result: auth.ts, tokens.ts, session-manager.ts, jwt-utils.ts
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Example 2: Feature Implementation
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
Task: "Add rate limiting to API endpoints"
|
|
166
|
+
|
|
167
|
+
Cycle 1:
|
|
168
|
+
DISPATCH: Search "rate", "limit", "api" in routes/**
|
|
169
|
+
EVALUATE: No matches - codebase uses "throttle" terminology
|
|
170
|
+
REFINE: Add "throttle", "middleware" keywords
|
|
171
|
+
|
|
172
|
+
Cycle 2:
|
|
173
|
+
DISPATCH: Search refined terms
|
|
174
|
+
EVALUATE: Found throttle.ts (0.9), middleware/index.ts (0.7)
|
|
175
|
+
REFINE: Need router patterns
|
|
176
|
+
|
|
177
|
+
Cycle 3:
|
|
178
|
+
DISPATCH: Search "router", "express" patterns
|
|
179
|
+
EVALUATE: Found router-setup.ts (0.8)
|
|
180
|
+
REFINE: Sufficient context
|
|
181
|
+
|
|
182
|
+
Result: throttle.ts, middleware/index.ts, router-setup.ts
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Integration with Agents
|
|
186
|
+
|
|
187
|
+
Use in agent prompts:
|
|
188
|
+
|
|
189
|
+
```markdown
|
|
190
|
+
When retrieving context for this task:
|
|
191
|
+
1. Start with broad keyword search
|
|
192
|
+
2. Evaluate each file's relevance (0-1 scale)
|
|
193
|
+
3. Identify what context is still missing
|
|
194
|
+
4. Refine search criteria and repeat (max 3 cycles)
|
|
195
|
+
5. Return files with relevance >= 0.7
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Best Practices
|
|
199
|
+
|
|
200
|
+
1. **Start broad, narrow progressively** - Don't over-specify initial queries
|
|
201
|
+
2. **Learn codebase terminology** - First cycle often reveals naming conventions
|
|
202
|
+
3. **Track what's missing** - Explicit gap identification drives refinement
|
|
203
|
+
4. **Stop at "good enough"** - 3 high-relevance files beats 10 mediocre ones
|
|
204
|
+
5. **Exclude confidently** - Low-relevance files won't become relevant
|
|
205
|
+
|
|
206
|
+
## Related
|
|
207
|
+
|
|
208
|
+
- `continuous-learning` skill - For patterns that improve over time
|
|
209
|
+
- Agent definitions bundled with the toolset (manual install path: `agents/`)
|