From ff52dbb4cc3e69cdc3c1d6f00ae19130bec18bdc Mon Sep 17 00:00:00 2001 From: DimoHG Date: Tue, 10 Mar 2026 12:27:58 +0200 Subject: [PATCH 1/5] feat(cursor): restructure plugin for marketplace submission Cursor resolves plugin directories using pluginRoot + source from marketplace.json. Update marketplace.json to set pluginRoot: "skills" and source: "redis-development" so the plugin resolves to skills/redis-development/. Move the per-plugin manifest from plugins/redis-development/ to skills/redis-development/ (the resolved plugin directory), fix the author field to use email instead of url, remove stale skills/rules path overrides so Cursor uses auto-discovery, and add the logo field. Move the logo into skills/redis-development/assets/ because Cursor resolves relative logo paths from the plugin directory and forbids .. in paths. Remove the redundant root .cursor-plugin/plugin.json which is not needed when marketplace.json is present. Made-with: Cursor --- .cursor-plugin/marketplace.json | 5 +++-- .cursor-plugin/plugin.json | 17 ----------------- .../.cursor-plugin/plugin.json | 5 ++--- .../redis-development/assets/logo.png | Bin 4 files changed, 5 insertions(+), 22 deletions(-) delete mode 100644 .cursor-plugin/plugin.json rename {plugins => skills}/redis-development/.cursor-plugin/plugin.json (82%) rename {plugins => skills}/redis-development/assets/logo.png (100%) diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index db2ff08..eb94a7f 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -6,12 +6,13 @@ }, "metadata": { "description": "Official Redis plugins for Cursor", - "version": "1.0.0" + "version": "1.0.0", + "pluginRoot": "skills" }, "plugins": [ { "name": "redis-development", - "source": "./plugins/redis-development", + "source": "redis-development", "description": "Redis development best practices — data structures, query engine, vector search, caching, and performance optimization", "version": "1.0.0", "category": "database", diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json deleted file mode 100644 index 8eaef09..0000000 --- a/.cursor-plugin/plugin.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "redis", - "displayName": "Redis", - "version": "1.0.0", - "description": "Redis development best practices — data structures, query engine, vector search, caching, and performance optimization.", - "author": { - "name": "Redis", - "email": "support@redis.com" - }, - "homepage": "https://redis.io/docs/", - "repository": "https://github.com/redis/agent-skills", - "license": "MIT", - "keywords": ["redis", "database", "caching", "vector-search", "performance", "cursor"], - "logo": "plugins/redis-development/assets/logo.png", - "skills": "./skills/", - "rules": "./skills/redis-development/rules/" -} diff --git a/plugins/redis-development/.cursor-plugin/plugin.json b/skills/redis-development/.cursor-plugin/plugin.json similarity index 82% rename from plugins/redis-development/.cursor-plugin/plugin.json rename to skills/redis-development/.cursor-plugin/plugin.json index 885a665..074beb9 100644 --- a/plugins/redis-development/.cursor-plugin/plugin.json +++ b/skills/redis-development/.cursor-plugin/plugin.json @@ -5,12 +5,11 @@ "description": "Redis development best practices — data structures, query engine, vector search, caching, and performance optimization", "author": { "name": "Redis", - "url": "https://redis.io" + "email": "support@redis.com" }, "homepage": "https://redis.io", "repository": "https://github.com/redis/agent-skills", "license": "MIT", "keywords": ["redis", "database", "caching", "vector-search", "performance", "best-practices"], - "skills": "./skills/", - "rules": "./skills/redis-development/rules/" + "logo": "assets/logo.png" } diff --git a/plugins/redis-development/assets/logo.png b/skills/redis-development/assets/logo.png similarity index 100% rename from plugins/redis-development/assets/logo.png rename to skills/redis-development/assets/logo.png From 526dacd7e3a38b071dd19fb31fd3de791269adae Mon Sep 17 00:00:00 2001 From: DimoHG Date: Tue, 10 Mar 2026 12:28:06 +0200 Subject: [PATCH 2/5] feat(cursor): add description and alwaysApply to rule frontmatter Add description and alwaysApply: true to all 34 rule files for Cursor plugin compatibility. description gives the IDE a summary to display in the rules list and helps the agent understand when to apply each rule. alwaysApply: true ensures rules are always active rather than only available on request. Update the rule template, README example, and AGENTS.md to reflect the new frontmatter fields for contributors. Reference: https://cursor.com/docs/reference/plugins Made-with: Cursor --- AGENTS.md | 2 ++ skills/redis-development/README.md | 2 ++ skills/redis-development/rules/_template.md | 2 ++ skills/redis-development/rules/cluster-hash-tags.md | 2 ++ skills/redis-development/rules/cluster-read-replicas.md | 2 ++ skills/redis-development/rules/conn-blocking.md | 2 ++ skills/redis-development/rules/conn-client-cache.md | 2 ++ skills/redis-development/rules/conn-pipelining.md | 2 ++ skills/redis-development/rules/conn-pooling.md | 2 ++ skills/redis-development/rules/conn-timeouts.md | 2 ++ skills/redis-development/rules/data-choose-structure.md | 2 ++ skills/redis-development/rules/data-hash-field-expiry.md | 2 ++ skills/redis-development/rules/data-incr.md | 2 ++ skills/redis-development/rules/data-key-naming.md | 2 ++ skills/redis-development/rules/data-transactions.md | 2 ++ skills/redis-development/rules/json-partial-updates.md | 2 ++ skills/redis-development/rules/json-vs-hash.md | 2 ++ skills/redis-development/rules/observe-commands.md | 2 ++ skills/redis-development/rules/observe-metrics.md | 2 ++ skills/redis-development/rules/ram-limits.md | 2 ++ skills/redis-development/rules/ram-ttl.md | 2 ++ skills/redis-development/rules/rqe-dialect.md | 2 ++ skills/redis-development/rules/rqe-field-types.md | 2 ++ skills/redis-development/rules/rqe-index-creation.md | 2 ++ skills/redis-development/rules/rqe-index-management.md | 2 ++ skills/redis-development/rules/rqe-query-optimization.md | 2 ++ skills/redis-development/rules/rqe-skip-initial-scan.md | 2 ++ skills/redis-development/rules/security-acls.md | 2 ++ skills/redis-development/rules/security-auth.md | 2 ++ skills/redis-development/rules/security-network.md | 2 ++ skills/redis-development/rules/semantic-cache-best-practices.md | 2 ++ .../redis-development/rules/semantic-cache-langcache-usage.md | 2 ++ skills/redis-development/rules/stream-choosing-pattern.md | 2 ++ skills/redis-development/rules/vector-algorithm-choice.md | 2 ++ skills/redis-development/rules/vector-hybrid-search.md | 2 ++ skills/redis-development/rules/vector-index-creation.md | 2 ++ skills/redis-development/rules/vector-rag-pattern.md | 2 ++ 37 files changed, 74 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index ffaa468..319e5f1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -85,6 +85,8 @@ title: Clear, Action-Oriented Title impact: HIGH|MEDIUM|LOW impactDescription: Quantified benefit (e.g., "10x faster") tags: relevant, keywords +description: Clear, Action-Oriented Title +alwaysApply: true --- ## {Title} diff --git a/skills/redis-development/README.md b/skills/redis-development/README.md index c5dbf01..4d1579f 100644 --- a/skills/redis-development/README.md +++ b/skills/redis-development/README.md @@ -64,6 +64,8 @@ title: Rule Title Here impact: MEDIUM impactDescription: Optional description tags: tag1, tag2, tag3 +description: Rule Title Here +alwaysApply: true --- ## Rule Title Here diff --git a/skills/redis-development/rules/_template.md b/skills/redis-development/rules/_template.md index 9411eb9..c87b40a 100644 --- a/skills/redis-development/rules/_template.md +++ b/skills/redis-development/rules/_template.md @@ -3,6 +3,8 @@ title: Clear, Action-Oriented Title (e.g., "Use Connection Pooling") impact: MEDIUM impactDescription: Brief quantified benefit (e.g., "Reduces connection overhead by 10x") tags: relevant, keywords, here +description: Clear, Action-Oriented Title (e.g., "Use Connection Pooling") +alwaysApply: true --- ## [Rule Title] diff --git a/skills/redis-development/rules/cluster-hash-tags.md b/skills/redis-development/rules/cluster-hash-tags.md index 781c9bb..5902fca 100644 --- a/skills/redis-development/rules/cluster-hash-tags.md +++ b/skills/redis-development/rules/cluster-hash-tags.md @@ -3,6 +3,8 @@ title: Use Hash Tags for Multi-Key Operations impact: HIGH impactDescription: Enables multi-key operations in Redis Cluster tags: cluster, hash-tags, keys, sharding, multi-key +description: Use Hash Tags for Multi-Key Operations +alwaysApply: true --- ## Use Hash Tags for Multi-Key Operations diff --git a/skills/redis-development/rules/cluster-read-replicas.md b/skills/redis-development/rules/cluster-read-replicas.md index 025eabe..35b2458 100644 --- a/skills/redis-development/rules/cluster-read-replicas.md +++ b/skills/redis-development/rules/cluster-read-replicas.md @@ -3,6 +3,8 @@ title: Use Read Replicas for Read-Heavy Workloads impact: MEDIUM impactDescription: Scales read throughput without adding primary nodes tags: cluster, replicas, read-scaling, high-availability +description: Use Read Replicas for Read-Heavy Workloads +alwaysApply: true --- ## Use Read Replicas for Read-Heavy Workloads diff --git a/skills/redis-development/rules/conn-blocking.md b/skills/redis-development/rules/conn-blocking.md index 82a91fb..34e6379 100644 --- a/skills/redis-development/rules/conn-blocking.md +++ b/skills/redis-development/rules/conn-blocking.md @@ -3,6 +3,8 @@ title: Avoid Slow Commands in Production impact: HIGH impactDescription: Prevents Redis from becoming unresponsive tags: slow-commands, keys, scan, performance +description: Avoid Slow Commands in Production +alwaysApply: true --- ## Avoid Slow Commands in Production diff --git a/skills/redis-development/rules/conn-client-cache.md b/skills/redis-development/rules/conn-client-cache.md index ff886ee..df2c7a6 100644 --- a/skills/redis-development/rules/conn-client-cache.md +++ b/skills/redis-development/rules/conn-client-cache.md @@ -3,6 +3,8 @@ title: Use Client-Side Caching for Frequently Read Data impact: HIGH impactDescription: Reduces network round-trips for repeated reads tags: caching, performance, client-side, tracking +description: Use Client-Side Caching for Frequently Read Data +alwaysApply: true --- ## Use Client-Side Caching for Frequently Read Data diff --git a/skills/redis-development/rules/conn-pipelining.md b/skills/redis-development/rules/conn-pipelining.md index 0a76533..ba27f6b 100644 --- a/skills/redis-development/rules/conn-pipelining.md +++ b/skills/redis-development/rules/conn-pipelining.md @@ -3,6 +3,8 @@ title: Use Pipelining for Bulk Operations impact: HIGH impactDescription: Reduces round trips, 5-10x faster for batch operations tags: pipelining, batch, performance, round-trips +description: Use Pipelining for Bulk Operations +alwaysApply: true --- ## Use Pipelining for Bulk Operations diff --git a/skills/redis-development/rules/conn-pooling.md b/skills/redis-development/rules/conn-pooling.md index 20eedb4..c32e82f 100644 --- a/skills/redis-development/rules/conn-pooling.md +++ b/skills/redis-development/rules/conn-pooling.md @@ -3,6 +3,8 @@ title: Use Connection Pooling or Multiplexing impact: HIGH impactDescription: Reduces connection overhead by 10x or more tags: connections, pooling, multiplexing, performance +description: Use Connection Pooling or Multiplexing +alwaysApply: true --- ## Use Connection Pooling or Multiplexing diff --git a/skills/redis-development/rules/conn-timeouts.md b/skills/redis-development/rules/conn-timeouts.md index f69e5d0..84a6c01 100644 --- a/skills/redis-development/rules/conn-timeouts.md +++ b/skills/redis-development/rules/conn-timeouts.md @@ -3,6 +3,8 @@ title: Configure Connection Timeouts impact: MEDIUM impactDescription: Improves connection resilience and failure recovery tags: timeouts, connections, reliability +description: Configure Connection Timeouts +alwaysApply: true --- ## Configure Connection Timeouts diff --git a/skills/redis-development/rules/data-choose-structure.md b/skills/redis-development/rules/data-choose-structure.md index 2dfe514..6db6d64 100644 --- a/skills/redis-development/rules/data-choose-structure.md +++ b/skills/redis-development/rules/data-choose-structure.md @@ -3,6 +3,8 @@ title: Choose the Right Data Structure impact: HIGH impactDescription: Optimal memory usage and operation performance tags: data-structures, strings, hashes, sets, lists, sorted-sets, json, streams, vector-sets +description: Choose the Right Data Structure +alwaysApply: true --- ## Choose the Right Data Structure diff --git a/skills/redis-development/rules/data-hash-field-expiry.md b/skills/redis-development/rules/data-hash-field-expiry.md index bb5547a..9e5eccf 100644 --- a/skills/redis-development/rules/data-hash-field-expiry.md +++ b/skills/redis-development/rules/data-hash-field-expiry.md @@ -3,6 +3,8 @@ title: Use Hash Field Expiration for Per-Field TTL impact: MEDIUM impactDescription: Fine-grained expiration without managing timers tags: hash, expiration, ttl, hexpire +description: Use Hash Field Expiration for Per-Field TTL +alwaysApply: true --- ## Use Hash Field Expiration for Per-Field TTL diff --git a/skills/redis-development/rules/data-incr.md b/skills/redis-development/rules/data-incr.md index 826d31c..745a71b 100644 --- a/skills/redis-development/rules/data-incr.md +++ b/skills/redis-development/rules/data-incr.md @@ -3,6 +3,8 @@ title: Use INCR for Atomic Counters impact: MEDIUM impactDescription: Atomic increment avoids race conditions tags: incr, counters, atomic, performance +description: Use INCR for Atomic Counters +alwaysApply: true --- ## Use INCR for Atomic Counters diff --git a/skills/redis-development/rules/data-key-naming.md b/skills/redis-development/rules/data-key-naming.md index 6543f27..18a1971 100644 --- a/skills/redis-development/rules/data-key-naming.md +++ b/skills/redis-development/rules/data-key-naming.md @@ -3,6 +3,8 @@ title: Use Consistent Key Naming Conventions impact: MEDIUM impactDescription: Improved maintainability and debugging tags: keys, naming, conventions, prefixes +description: Use Consistent Key Naming Conventions +alwaysApply: true --- ## Use Consistent Key Naming Conventions diff --git a/skills/redis-development/rules/data-transactions.md b/skills/redis-development/rules/data-transactions.md index 8c74acb..ec76cdf 100644 --- a/skills/redis-development/rules/data-transactions.md +++ b/skills/redis-development/rules/data-transactions.md @@ -3,6 +3,8 @@ title: Use Transactions for Atomic Multi-Command Operations impact: MEDIUM impactDescription: Prevents race conditions and data inconsistency tags: transactions, multi, exec, atomicity +description: Use Transactions for Atomic Multi-Command Operations +alwaysApply: true --- ## Use Transactions for Atomic Multi-Command Operations diff --git a/skills/redis-development/rules/json-partial-updates.md b/skills/redis-development/rules/json-partial-updates.md index 313d06c..4525a16 100644 --- a/skills/redis-development/rules/json-partial-updates.md +++ b/skills/redis-development/rules/json-partial-updates.md @@ -3,6 +3,8 @@ title: Use JSON Paths for Partial Updates impact: MEDIUM impactDescription: Avoids fetching and rewriting entire documents tags: json, partial-updates, paths, atomic +description: Use JSON Paths for Partial Updates +alwaysApply: true --- ## Use JSON Paths for Partial Updates diff --git a/skills/redis-development/rules/json-vs-hash.md b/skills/redis-development/rules/json-vs-hash.md index 0356130..13a1f8d 100644 --- a/skills/redis-development/rules/json-vs-hash.md +++ b/skills/redis-development/rules/json-vs-hash.md @@ -3,6 +3,8 @@ title: Choose JSON vs Hash vs String Appropriately impact: MEDIUM impactDescription: Optimal data model for your use case tags: json, hash, string, data-structures, documents +description: Choose JSON vs Hash vs String Appropriately +alwaysApply: true --- ## Choose JSON vs Hash vs String Appropriately diff --git a/skills/redis-development/rules/observe-commands.md b/skills/redis-development/rules/observe-commands.md index 1568634..d6393d8 100644 --- a/skills/redis-development/rules/observe-commands.md +++ b/skills/redis-development/rules/observe-commands.md @@ -3,6 +3,8 @@ title: Use Observability Commands for Debugging impact: MEDIUM impactDescription: Enables quick diagnosis of performance issues tags: observability, slowlog, info, memory, debugging +description: Use Observability Commands for Debugging +alwaysApply: true --- ## Use Observability Commands for Debugging diff --git a/skills/redis-development/rules/observe-metrics.md b/skills/redis-development/rules/observe-metrics.md index 22d9254..a5b70a4 100644 --- a/skills/redis-development/rules/observe-metrics.md +++ b/skills/redis-development/rules/observe-metrics.md @@ -3,6 +3,8 @@ title: Monitor Key Redis Metrics impact: MEDIUM impactDescription: Early detection of performance and capacity issues tags: observability, metrics, monitoring, memory, connections +description: Monitor Key Redis Metrics +alwaysApply: true --- ## Monitor Key Redis Metrics diff --git a/skills/redis-development/rules/ram-limits.md b/skills/redis-development/rules/ram-limits.md index 16b19a6..b61f9b4 100644 --- a/skills/redis-development/rules/ram-limits.md +++ b/skills/redis-development/rules/ram-limits.md @@ -3,6 +3,8 @@ title: Configure Memory Limits and Eviction Policies impact: HIGH impactDescription: Prevents out-of-memory crashes and unpredictable behavior tags: memory, maxmemory, eviction, lru, ttl +description: Configure Memory Limits and Eviction Policies +alwaysApply: true --- ## Configure Memory Limits and Eviction Policies diff --git a/skills/redis-development/rules/ram-ttl.md b/skills/redis-development/rules/ram-ttl.md index c960607..66b0573 100644 --- a/skills/redis-development/rules/ram-ttl.md +++ b/skills/redis-development/rules/ram-ttl.md @@ -3,6 +3,8 @@ title: Set TTL on Cache Keys impact: HIGH impactDescription: Prevents unbounded memory growth tags: ttl, expiration, cache, memory +description: Set TTL on Cache Keys +alwaysApply: true --- ## Set TTL on Cache Keys diff --git a/skills/redis-development/rules/rqe-dialect.md b/skills/redis-development/rules/rqe-dialect.md index a53178d..56fe365 100644 --- a/skills/redis-development/rules/rqe-dialect.md +++ b/skills/redis-development/rules/rqe-dialect.md @@ -3,6 +3,8 @@ title: Use DIALECT 2 for Query Syntax impact: MEDIUM impactDescription: Ensures consistent query behavior and access to modern features tags: rqe, dialect, query, syntax +description: Use DIALECT 2 for Query Syntax +alwaysApply: true --- ## Use DIALECT 2 for Query Syntax diff --git a/skills/redis-development/rules/rqe-field-types.md b/skills/redis-development/rules/rqe-field-types.md index 5261895..4fdbf13 100644 --- a/skills/redis-development/rules/rqe-field-types.md +++ b/skills/redis-development/rules/rqe-field-types.md @@ -3,6 +3,8 @@ title: Choose the Correct Field Type impact: HIGH impactDescription: Use TAG instead of TEXT for filtering to improve query speed 10x tags: rqe, field-types, text, tag, numeric, geo, geoshape, vector +description: Choose the Correct Field Type +alwaysApply: true --- ## Choose the Correct Field Type diff --git a/skills/redis-development/rules/rqe-index-creation.md b/skills/redis-development/rules/rqe-index-creation.md index 45c396c..db64cdc 100644 --- a/skills/redis-development/rules/rqe-index-creation.md +++ b/skills/redis-development/rules/rqe-index-creation.md @@ -3,6 +3,8 @@ title: Index Only Fields You Query impact: HIGH impactDescription: Reduces index size and improves write performance tags: rqe, ft.create, index, schema +description: Index Only Fields You Query +alwaysApply: true --- ## Index Only Fields You Query diff --git a/skills/redis-development/rules/rqe-index-management.md b/skills/redis-development/rules/rqe-index-management.md index 41776ec..9eb817b 100644 --- a/skills/redis-development/rules/rqe-index-management.md +++ b/skills/redis-development/rules/rqe-index-management.md @@ -3,6 +3,8 @@ title: Manage Indexes for Zero-Downtime Updates impact: MEDIUM impactDescription: Use aliases for seamless index updates tags: rqe, index, alias, management, reindex +description: Manage Indexes for Zero-Downtime Updates +alwaysApply: true --- ## Manage Indexes for Zero-Downtime Updates diff --git a/skills/redis-development/rules/rqe-query-optimization.md b/skills/redis-development/rules/rqe-query-optimization.md index dadd6b4..162ea2b 100644 --- a/skills/redis-development/rules/rqe-query-optimization.md +++ b/skills/redis-development/rules/rqe-query-optimization.md @@ -3,6 +3,8 @@ title: Write Efficient Queries impact: HIGH impactDescription: Proper filtering reduces query time by orders of magnitude tags: rqe, ft.search, query, performance, filters +description: Write Efficient Queries +alwaysApply: true --- ## Write Efficient Queries diff --git a/skills/redis-development/rules/rqe-skip-initial-scan.md b/skills/redis-development/rules/rqe-skip-initial-scan.md index b64c7d8..75b1f2c 100644 --- a/skills/redis-development/rules/rqe-skip-initial-scan.md +++ b/skills/redis-development/rules/rqe-skip-initial-scan.md @@ -3,6 +3,8 @@ title: Use SKIPINITIALSCAN for New Data Only Indexes impact: MEDIUM impactDescription: Faster index creation, avoids indexing existing data tags: index, skipinitialscan, rqe, search +description: Use SKIPINITIALSCAN for New Data Only Indexes +alwaysApply: true --- ## Use SKIPINITIALSCAN for New Data Only Indexes diff --git a/skills/redis-development/rules/security-acls.md b/skills/redis-development/rules/security-acls.md index 4667f63..917fc80 100644 --- a/skills/redis-development/rules/security-acls.md +++ b/skills/redis-development/rules/security-acls.md @@ -3,6 +3,8 @@ title: Use ACLs for Fine-Grained Access Control impact: HIGH impactDescription: Limits blast radius if credentials are compromised tags: security, acl, users, permissions, least-privilege +description: Use ACLs for Fine-Grained Access Control +alwaysApply: true --- ## Use ACLs for Fine-Grained Access Control diff --git a/skills/redis-development/rules/security-auth.md b/skills/redis-development/rules/security-auth.md index 87dd08d..4e843a9 100644 --- a/skills/redis-development/rules/security-auth.md +++ b/skills/redis-development/rules/security-auth.md @@ -3,6 +3,8 @@ title: Always Use Authentication in Production impact: HIGH impactDescription: Prevents unauthorized access to your data tags: security, authentication, password, tls, ssl +description: Always Use Authentication in Production +alwaysApply: true --- ## Always Use Authentication in Production diff --git a/skills/redis-development/rules/security-network.md b/skills/redis-development/rules/security-network.md index 6062188..ebdde7e 100644 --- a/skills/redis-development/rules/security-network.md +++ b/skills/redis-development/rules/security-network.md @@ -3,6 +3,8 @@ title: Secure Network Access impact: HIGH impactDescription: Reduces attack surface and prevents unauthorized access tags: security, network, firewall, bind, tls +description: Secure Network Access +alwaysApply: true --- ## Secure Network Access diff --git a/skills/redis-development/rules/semantic-cache-best-practices.md b/skills/redis-development/rules/semantic-cache-best-practices.md index 7c48163..044fbbf 100644 --- a/skills/redis-development/rules/semantic-cache-best-practices.md +++ b/skills/redis-development/rules/semantic-cache-best-practices.md @@ -3,6 +3,8 @@ title: Configure Semantic Cache Properly impact: MEDIUM impactDescription: Correct threshold tuning balances hit rate vs accuracy tags: langcache, cache, threshold, ttl, semantic +description: Configure Semantic Cache Properly +alwaysApply: true --- ## Configure Semantic Cache Properly diff --git a/skills/redis-development/rules/semantic-cache-langcache-usage.md b/skills/redis-development/rules/semantic-cache-langcache-usage.md index 83bd8e7..4ef29c6 100644 --- a/skills/redis-development/rules/semantic-cache-langcache-usage.md +++ b/skills/redis-development/rules/semantic-cache-langcache-usage.md @@ -3,6 +3,8 @@ title: Use LangCache for LLM Response Caching impact: HIGH impactDescription: Reduces LLM API costs by 50-90% for similar queries tags: langcache, llm, semantic-cache, embeddings, ai +description: Use LangCache for LLM Response Caching +alwaysApply: true --- ## Use LangCache for LLM Response Caching diff --git a/skills/redis-development/rules/stream-choosing-pattern.md b/skills/redis-development/rules/stream-choosing-pattern.md index 15bdbd6..6ab718e 100644 --- a/skills/redis-development/rules/stream-choosing-pattern.md +++ b/skills/redis-development/rules/stream-choosing-pattern.md @@ -3,6 +3,8 @@ title: Choose Streams vs Pub/Sub Appropriately impact: MEDIUM impactDescription: Wrong choice leads to lost messages or unnecessary complexity tags: streams, pubsub, messaging, events, queues +description: Choose Streams vs Pub/Sub Appropriately +alwaysApply: true --- ## Choose Streams vs Pub/Sub Appropriately diff --git a/skills/redis-development/rules/vector-algorithm-choice.md b/skills/redis-development/rules/vector-algorithm-choice.md index 579c38e..d6ebe47 100644 --- a/skills/redis-development/rules/vector-algorithm-choice.md +++ b/skills/redis-development/rules/vector-algorithm-choice.md @@ -3,6 +3,8 @@ title: Choose HNSW vs FLAT Based on Requirements impact: HIGH impactDescription: HNSW trades accuracy for speed, FLAT provides exact results tags: vector, hnsw, flat, algorithm, performance +description: Choose HNSW vs FLAT Based on Requirements +alwaysApply: true --- ## Choose HNSW vs FLAT Based on Requirements diff --git a/skills/redis-development/rules/vector-hybrid-search.md b/skills/redis-development/rules/vector-hybrid-search.md index c96db48..68554b4 100644 --- a/skills/redis-development/rules/vector-hybrid-search.md +++ b/skills/redis-development/rules/vector-hybrid-search.md @@ -3,6 +3,8 @@ title: Use Hybrid Search for Better Results impact: MEDIUM impactDescription: Combining vector + filters improves relevance and reduces search space tags: vector, hybrid, filters, redisvl, search +description: Use Hybrid Search for Better Results +alwaysApply: true --- ## Use Hybrid Search for Better Results diff --git a/skills/redis-development/rules/vector-index-creation.md b/skills/redis-development/rules/vector-index-creation.md index 77a9fdc..f40ecf7 100644 --- a/skills/redis-development/rules/vector-index-creation.md +++ b/skills/redis-development/rules/vector-index-creation.md @@ -3,6 +3,8 @@ title: Configure Vector Indexes Properly impact: HIGH impactDescription: Correct configuration is essential for vector search accuracy tags: vector, index, hnsw, flat, embeddings, rqe +description: Configure Vector Indexes Properly +alwaysApply: true --- ## Configure Vector Indexes Properly diff --git a/skills/redis-development/rules/vector-rag-pattern.md b/skills/redis-development/rules/vector-rag-pattern.md index 7f5f8ac..5bceb0e 100644 --- a/skills/redis-development/rules/vector-rag-pattern.md +++ b/skills/redis-development/rules/vector-rag-pattern.md @@ -3,6 +3,8 @@ title: Implement RAG Pattern Correctly impact: HIGH impactDescription: Proper RAG implementation improves LLM response quality tags: vector, rag, llm, embeddings, retrieval +description: Implement RAG Pattern Correctly +alwaysApply: true --- ## Implement RAG Pattern Correctly From 772c79e73b30d9af85307e7855080528f0f0e688 Mon Sep 17 00:00:00 2001 From: DimoHG Date: Tue, 10 Mar 2026 12:28:12 +0200 Subject: [PATCH 3/5] feat(cursor): update validator to support marketplace.json The pre-commit validator previously required a root plugin.json and would fail when only marketplace.json was present. Refactor the validator to check for marketplace.json first, falling back to root plugin.json for single-plugin repos. For marketplace repos, validate the marketplace manifest (name, owner, plugins array), resolve each plugin directory using pluginRoot + source, and validate per-plugin manifests with paths relative to the plugin directory. Made-with: Cursor --- scripts/validate-cursor-plugins.mjs | 104 ++++++++++++++++++++++------ 1 file changed, 83 insertions(+), 21 deletions(-) diff --git a/scripts/validate-cursor-plugins.mjs b/scripts/validate-cursor-plugins.mjs index 787dd5a..b63ef87 100644 --- a/scripts/validate-cursor-plugins.mjs +++ b/scripts/validate-cursor-plugins.mjs @@ -109,34 +109,26 @@ async function validateManifestPath(pluginDir, pluginName, fieldName, value) { } } -async function main() { - const manifestPath = path.join( - repoRoot, - ".cursor-plugin", - "plugin.json", - ); - const pluginManifest = await readJsonFile( - manifestPath, - "Cursor plugin manifest", - ); +async function validatePluginManifest(manifestPath, pluginDir, context) { + const pluginManifest = await readJsonFile(manifestPath, context); if (!pluginManifest) { - summarizeAndExit(); return; } + const label = pluginManifest.name || context; + if ( typeof pluginManifest.name !== "string" || !pluginNamePattern.test(pluginManifest.name) ) { addError( - '"name" in plugin.json must be lowercase and use only alphanumerics, hyphens, and periods.', + `${label}: "name" must be lowercase and use only alphanumerics, hyphens, and periods.`, ); } - validateRequiredString(pluginManifest.displayName, "displayName"); - validateRequiredString(pluginManifest.version, "version"); - validateRequiredString(pluginManifest.description, "description"); - validateRequiredString(pluginManifest.license, "license"); + validateRequiredString(pluginManifest.version, `${label}: version`); + validateRequiredString(pluginManifest.description, `${label}: description`); + validateRequiredString(pluginManifest.license, `${label}: license`); if ( !pluginManifest.author || @@ -144,7 +136,7 @@ async function main() { typeof pluginManifest.author.name !== "string" || pluginManifest.author.name.length === 0 ) { - addError("author.name is required in plugin.json."); + addError(`${label}: author.name is required.`); } if ( !Array.isArray(pluginManifest.keywords) || @@ -153,11 +145,9 @@ async function main() { (keyword) => typeof keyword !== "string" || keyword.trim().length === 0, ) ) { - addError("keywords must be a non-empty string array."); + addError(`${label}: keywords must be a non-empty string array.`); } - await ensureDirectory(path.join(repoRoot, ".cursor-plugin"), ".cursor-plugin"); - for (const field of [ "logo", "rules", @@ -168,9 +158,81 @@ async function main() { "mcpServers", ]) { for (const value of extractPathValues(pluginManifest[field])) { - await validateManifestPath(repoRoot, pluginManifest.name, field, value); + await validateManifestPath(pluginDir, label, field, value); } } +} + +async function validateMarketplace(marketplacePath) { + const marketplace = await readJsonFile(marketplacePath, "Cursor marketplace manifest"); + if (!marketplace) { + return; + } + + validateRequiredString(marketplace.name, "marketplace: name"); + + if ( + !marketplace.owner || + typeof marketplace.owner !== "object" || + typeof marketplace.owner.name !== "string" || + marketplace.owner.name.length === 0 + ) { + addError("marketplace: owner.name is required."); + } + + if (!Array.isArray(marketplace.plugins) || marketplace.plugins.length === 0) { + addError("marketplace: plugins must be a non-empty array."); + return; + } + + const pluginRoot = marketplace.metadata?.pluginRoot || ""; + + for (const entry of marketplace.plugins) { + if ( + typeof entry.name !== "string" || + !pluginNamePattern.test(entry.name) + ) { + addError( + `marketplace plugin entry: "name" must be lowercase kebab-case.`, + ); + continue; + } + + const source = typeof entry.source === "string" + ? entry.source + : entry.source?.path; + + if (!source) { + addError(`${entry.name}: marketplace entry requires a "source" path.`); + continue; + } + + const pluginDir = path.resolve(repoRoot, pluginRoot, source); + if (!(await pathExists(pluginDir))) { + addError(`${entry.name}: resolved plugin directory does not exist: ${pluginDir}`); + continue; + } + + const perPluginManifest = path.join(pluginDir, ".cursor-plugin", "plugin.json"); + if (await pathExists(perPluginManifest)) { + await validatePluginManifest(perPluginManifest, pluginDir, `${entry.name} plugin.json`); + } + } +} + +async function main() { + await ensureDirectory(path.join(repoRoot, ".cursor-plugin"), ".cursor-plugin"); + + const marketplacePath = path.join(repoRoot, ".cursor-plugin", "marketplace.json"); + const rootManifestPath = path.join(repoRoot, ".cursor-plugin", "plugin.json"); + + if (await pathExists(marketplacePath)) { + await validateMarketplace(marketplacePath); + } else if (await pathExists(rootManifestPath)) { + await validatePluginManifest(rootManifestPath, repoRoot, "Cursor plugin manifest"); + } else { + addError("No .cursor-plugin/marketplace.json or .cursor-plugin/plugin.json found."); + } summarizeAndExit(); } From 2e3d42fc513be124e6e6d3c6e1f9dee7286dac60 Mon Sep 17 00:00:00 2001 From: DimoHG Date: Tue, 10 Mar 2026 12:32:03 +0200 Subject: [PATCH 4/5] fix(cursor): remove unrecognized displayName from plugin manifest displayName is not part of the Cursor plugin manifest schema. Only name, description, version, author, homepage, repository, license, keywords, and logo are recognized fields. Reference: https://cursor.com/docs/reference/plugins Made-with: Cursor --- skills/redis-development/.cursor-plugin/plugin.json | 1 - 1 file changed, 1 deletion(-) diff --git a/skills/redis-development/.cursor-plugin/plugin.json b/skills/redis-development/.cursor-plugin/plugin.json index 074beb9..f09823e 100644 --- a/skills/redis-development/.cursor-plugin/plugin.json +++ b/skills/redis-development/.cursor-plugin/plugin.json @@ -1,6 +1,5 @@ { "name": "redis-development", - "displayName": "Redis Development", "version": "1.0.0", "description": "Redis development best practices — data structures, query engine, vector search, caching, and performance optimization", "author": { From eba2af2c6482c649f333a63f089041ec2a130a41 Mon Sep 17 00:00:00 2001 From: DimoHG Date: Tue, 10 Mar 2026 13:27:23 +0200 Subject: [PATCH 5/5] fix(cursor): add path traversal checks and require per-plugin manifest Address two issues flagged in PR review: 1. Validate pluginRoot and source with isSafeRelativePath before using them in path.resolve. Without this, absolute paths or .. traversals in marketplace.json would pass validation silently. 2. Error when the per-plugin .cursor-plugin/plugin.json is missing instead of silently skipping it. A missing manifest would prevent the plugin from loading, so the validator should catch it. Made-with: Cursor --- scripts/validate-cursor-plugins.mjs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/scripts/validate-cursor-plugins.mjs b/scripts/validate-cursor-plugins.mjs index b63ef87..bba499f 100644 --- a/scripts/validate-cursor-plugins.mjs +++ b/scripts/validate-cursor-plugins.mjs @@ -187,6 +187,11 @@ async function validateMarketplace(marketplacePath) { const pluginRoot = marketplace.metadata?.pluginRoot || ""; + if (pluginRoot && !isSafeRelativePath(pluginRoot)) { + addError(`marketplace: metadata.pluginRoot has invalid path "${pluginRoot}".`); + return; + } + for (const entry of marketplace.plugins) { if ( typeof entry.name !== "string" || @@ -207,6 +212,11 @@ async function validateMarketplace(marketplacePath) { continue; } + if (!isSafeRelativePath(source)) { + addError(`${entry.name}: source has invalid path "${source}".`); + continue; + } + const pluginDir = path.resolve(repoRoot, pluginRoot, source); if (!(await pathExists(pluginDir))) { addError(`${entry.name}: resolved plugin directory does not exist: ${pluginDir}`); @@ -214,9 +224,11 @@ async function validateMarketplace(marketplacePath) { } const perPluginManifest = path.join(pluginDir, ".cursor-plugin", "plugin.json"); - if (await pathExists(perPluginManifest)) { - await validatePluginManifest(perPluginManifest, pluginDir, `${entry.name} plugin.json`); + if (!(await pathExists(perPluginManifest))) { + addError(`${entry.name}: per-plugin manifest is missing: ${perPluginManifest}`); + continue; } + await validatePluginManifest(perPluginManifest, pluginDir, `${entry.name} plugin.json`); } }