@bcelep/capint 0.4.2 → 0.6.5

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.
Files changed (1312) hide show
  1. package/AGENT.md +11 -1
  2. package/CHANGELOG.md +101 -0
  3. package/README.md +38 -10
  4. package/bin/capint.js +13 -1
  5. package/docs/PRD-v0.5-agent-capability-activation.md +430 -0
  6. package/docs/conventions/cli-scripting.md +60 -0
  7. package/docs/conventions/daily-use.md +132 -0
  8. package/docs/conventions/task-to-capability-cheatsheet.md +29 -0
  9. package/docs/execution-intent-contract.md +31 -3
  10. package/docs/kullanim-kilavuzu.md +374 -0
  11. package/docs/maintainer-dogfood.md +90 -0
  12. package/package.json +11 -2
  13. package/projections/session-start.md +14 -6
  14. package/registry.json +117 -4
  15. package/schemas/explanation.v1.json +48 -0
  16. package/scripts/capint-task.ps1 +38 -0
  17. package/scripts/capint-task.sh +40 -0
  18. package/scripts/release-check.mjs +14 -1
  19. package/scripts/validate-registry.mjs +44 -0
  20. package/skill-routing-matrix.json +50 -4
  21. package/skills/agent-browser/LICENSE +201 -0
  22. package/skills/agent-browser/SKILL.md +522 -0
  23. package/skills/agent-browser/agents/verdent.yaml +7 -0
  24. package/skills/agent-browser/assets/icon-dark.png +0 -0
  25. package/skills/agent-browser/assets/icon-light.png +0 -0
  26. package/skills/agent-browser/references/authentication.md +202 -0
  27. package/skills/agent-browser/references/commands.md +263 -0
  28. package/skills/agent-browser/references/profiling.md +120 -0
  29. package/skills/agent-browser/references/proxy-support.md +194 -0
  30. package/skills/agent-browser/references/session-management.md +193 -0
  31. package/skills/agent-browser/references/snapshot-refs.md +194 -0
  32. package/skills/agent-browser/references/video-recording.md +173 -0
  33. package/skills/agent-browser/templates/authenticated-session.sh +105 -0
  34. package/skills/agent-browser/templates/capture-workflow.sh +69 -0
  35. package/skills/agent-browser/templates/form-automation.sh +62 -0
  36. package/skills/algorithmic-art/LICENSE.txt +202 -0
  37. package/skills/algorithmic-art/SKILL.md +410 -0
  38. package/skills/algorithmic-art/agents/verdent.yaml +11 -0
  39. package/skills/algorithmic-art/assets/icon-dark.png +0 -0
  40. package/skills/algorithmic-art/assets/icon-light.png +0 -0
  41. package/skills/algorithmic-art/templates/generator_template.js +223 -0
  42. package/skills/algorithmic-art/templates/viewer.html +599 -0
  43. package/skills/api-and-interface-design/SKILL.md +294 -0
  44. package/skills/aspnet-core/LICENSE.txt +202 -0
  45. package/skills/aspnet-core/SKILL.md +67 -0
  46. package/skills/aspnet-core/agents/verdent.yaml +11 -0
  47. package/skills/aspnet-core/assets/dotnet-logo.png +0 -0
  48. package/skills/aspnet-core/assets/icon-dark.png +0 -0
  49. package/skills/aspnet-core/assets/icon-light.png +0 -0
  50. package/skills/aspnet-core/references/_sections.md +40 -0
  51. package/skills/aspnet-core/references/apis-minimal-and-controllers.md +81 -0
  52. package/skills/aspnet-core/references/data-state-and-services.md +69 -0
  53. package/skills/aspnet-core/references/program-and-pipeline.md +103 -0
  54. package/skills/aspnet-core/references/realtime-grpc-and-background-work.md +58 -0
  55. package/skills/aspnet-core/references/security-and-identity.md +75 -0
  56. package/skills/aspnet-core/references/source-map.md +43 -0
  57. package/skills/aspnet-core/references/stack-selection.md +63 -0
  58. package/skills/aspnet-core/references/testing-performance-and-operations.md +92 -0
  59. package/skills/aspnet-core/references/ui-blazor.md +53 -0
  60. package/skills/aspnet-core/references/ui-mvc.md +56 -0
  61. package/skills/aspnet-core/references/ui-razor-pages.md +55 -0
  62. package/skills/aspnet-core/references/versioning-and-upgrades.md +51 -0
  63. package/skills/auth-patterns/SKILL.md +549 -0
  64. package/skills/best-practices/SKILL.md +641 -0
  65. package/skills/better-auth-best-practices/SKILL.md +180 -0
  66. package/skills/better-auth-best-practices/agents/verdent.yaml +11 -0
  67. package/skills/better-auth-best-practices/assets/icon-dark.png +0 -0
  68. package/skills/better-auth-best-practices/assets/icon-light.png +0 -0
  69. package/skills/brainstorming/SKILL.md +164 -0
  70. package/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  71. package/skills/brainstorming/visual-companion.md +287 -0
  72. package/skills/canvas-design/LICENSE.txt +202 -0
  73. package/skills/canvas-design/SKILL.md +135 -0
  74. package/skills/canvas-design/agents/verdent.yaml +11 -0
  75. package/skills/canvas-design/assets/icon-dark.png +0 -0
  76. package/skills/canvas-design/assets/icon-light.png +0 -0
  77. package/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  78. package/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  79. package/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  80. package/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  81. package/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  82. package/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  83. package/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  84. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  85. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  86. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  87. package/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  88. package/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  89. package/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  90. package/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  91. package/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  92. package/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  93. package/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  94. package/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  95. package/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  96. package/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  97. package/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  98. package/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  99. package/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  100. package/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  101. package/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  102. package/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  103. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  104. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  105. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  106. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  107. package/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  108. package/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  109. package/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  110. package/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  111. package/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  112. package/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  113. package/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  114. package/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  115. package/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  116. package/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  117. package/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  118. package/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  119. package/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  120. package/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  121. package/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  122. package/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  123. package/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  124. package/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  125. package/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  126. package/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  127. package/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  128. package/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  129. package/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  130. package/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  131. package/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  132. package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  133. package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  134. package/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  135. package/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  136. package/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  137. package/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  138. package/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  139. package/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  140. package/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  141. package/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  142. package/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  143. package/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  144. package/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  145. package/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  146. package/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  147. package/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  148. package/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  149. package/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  150. package/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  151. package/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  152. package/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  153. package/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  154. package/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  155. package/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  156. package/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  157. package/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  158. package/skills/ci-cd-and-automation/SKILL.md +390 -0
  159. package/skills/cloudflare/SKILL.md +233 -0
  160. package/skills/cloudflare/agents/verdent.yaml +12 -0
  161. package/skills/cloudflare/assets/icon-dark.png +0 -0
  162. package/skills/cloudflare/assets/icon-light.png +0 -0
  163. package/skills/cloudflare/references/agents-sdk/README.md +89 -0
  164. package/skills/cloudflare/references/agents-sdk/api.md +190 -0
  165. package/skills/cloudflare/references/agents-sdk/configuration.md +182 -0
  166. package/skills/cloudflare/references/agents-sdk/gotchas.md +158 -0
  167. package/skills/cloudflare/references/agents-sdk/patterns.md +192 -0
  168. package/skills/cloudflare/references/ai-gateway/README.md +175 -0
  169. package/skills/cloudflare/references/ai-gateway/configuration.md +111 -0
  170. package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +82 -0
  171. package/skills/cloudflare/references/ai-gateway/features.md +96 -0
  172. package/skills/cloudflare/references/ai-gateway/sdk-integration.md +114 -0
  173. package/skills/cloudflare/references/ai-gateway/troubleshooting.md +88 -0
  174. package/skills/cloudflare/references/ai-search/README.md +138 -0
  175. package/skills/cloudflare/references/ai-search/api.md +87 -0
  176. package/skills/cloudflare/references/ai-search/configuration.md +88 -0
  177. package/skills/cloudflare/references/ai-search/gotchas.md +81 -0
  178. package/skills/cloudflare/references/ai-search/patterns.md +85 -0
  179. package/skills/cloudflare/references/analytics-engine/README.md +94 -0
  180. package/skills/cloudflare/references/analytics-engine/api.md +112 -0
  181. package/skills/cloudflare/references/analytics-engine/configuration.md +112 -0
  182. package/skills/cloudflare/references/analytics-engine/gotchas.md +85 -0
  183. package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
  184. package/skills/cloudflare/references/api/README.md +66 -0
  185. package/skills/cloudflare/references/api/api.md +204 -0
  186. package/skills/cloudflare/references/api/configuration.md +160 -0
  187. package/skills/cloudflare/references/api/gotchas.md +225 -0
  188. package/skills/cloudflare/references/api/patterns.md +204 -0
  189. package/skills/cloudflare/references/api-shield/README.md +44 -0
  190. package/skills/cloudflare/references/api-shield/api.md +141 -0
  191. package/skills/cloudflare/references/api-shield/configuration.md +192 -0
  192. package/skills/cloudflare/references/api-shield/gotchas.md +125 -0
  193. package/skills/cloudflare/references/api-shield/patterns.md +180 -0
  194. package/skills/cloudflare/references/argo-smart-routing/README.md +90 -0
  195. package/skills/cloudflare/references/argo-smart-routing/api.md +240 -0
  196. package/skills/cloudflare/references/argo-smart-routing/configuration.md +197 -0
  197. package/skills/cloudflare/references/argo-smart-routing/gotchas.md +111 -0
  198. package/skills/cloudflare/references/argo-smart-routing/patterns.md +104 -0
  199. package/skills/cloudflare/references/bindings/README.md +122 -0
  200. package/skills/cloudflare/references/bindings/api.md +203 -0
  201. package/skills/cloudflare/references/bindings/configuration.md +188 -0
  202. package/skills/cloudflare/references/bindings/gotchas.md +208 -0
  203. package/skills/cloudflare/references/bindings/patterns.md +200 -0
  204. package/skills/cloudflare/references/bot-management/README.md +94 -0
  205. package/skills/cloudflare/references/bot-management/api.md +169 -0
  206. package/skills/cloudflare/references/bot-management/configuration.md +163 -0
  207. package/skills/cloudflare/references/bot-management/gotchas.md +114 -0
  208. package/skills/cloudflare/references/bot-management/patterns.md +182 -0
  209. package/skills/cloudflare/references/browser-rendering/README.md +78 -0
  210. package/skills/cloudflare/references/browser-rendering/api.md +108 -0
  211. package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
  212. package/skills/cloudflare/references/browser-rendering/gotchas.md +88 -0
  213. package/skills/cloudflare/references/browser-rendering/patterns.md +91 -0
  214. package/skills/cloudflare/references/c3/README.md +111 -0
  215. package/skills/cloudflare/references/c3/api.md +71 -0
  216. package/skills/cloudflare/references/c3/configuration.md +81 -0
  217. package/skills/cloudflare/references/c3/gotchas.md +92 -0
  218. package/skills/cloudflare/references/c3/patterns.md +82 -0
  219. package/skills/cloudflare/references/cache-reserve/README.md +147 -0
  220. package/skills/cloudflare/references/cache-reserve/api.md +194 -0
  221. package/skills/cloudflare/references/cache-reserve/configuration.md +169 -0
  222. package/skills/cloudflare/references/cache-reserve/gotchas.md +132 -0
  223. package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
  224. package/skills/cloudflare/references/containers/README.md +85 -0
  225. package/skills/cloudflare/references/containers/api.md +187 -0
  226. package/skills/cloudflare/references/containers/configuration.md +188 -0
  227. package/skills/cloudflare/references/containers/gotchas.md +178 -0
  228. package/skills/cloudflare/references/containers/patterns.md +202 -0
  229. package/skills/cloudflare/references/cron-triggers/README.md +99 -0
  230. package/skills/cloudflare/references/cron-triggers/api.md +196 -0
  231. package/skills/cloudflare/references/cron-triggers/configuration.md +180 -0
  232. package/skills/cloudflare/references/cron-triggers/gotchas.md +199 -0
  233. package/skills/cloudflare/references/cron-triggers/patterns.md +190 -0
  234. package/skills/cloudflare/references/d1/README.md +133 -0
  235. package/skills/cloudflare/references/d1/api.md +196 -0
  236. package/skills/cloudflare/references/d1/configuration.md +188 -0
  237. package/skills/cloudflare/references/d1/gotchas.md +98 -0
  238. package/skills/cloudflare/references/d1/patterns.md +189 -0
  239. package/skills/cloudflare/references/ddos/README.md +41 -0
  240. package/skills/cloudflare/references/ddos/api.md +164 -0
  241. package/skills/cloudflare/references/ddos/configuration.md +93 -0
  242. package/skills/cloudflare/references/ddos/gotchas.md +107 -0
  243. package/skills/cloudflare/references/ddos/patterns.md +174 -0
  244. package/skills/cloudflare/references/do-storage/README.md +75 -0
  245. package/skills/cloudflare/references/do-storage/api.md +102 -0
  246. package/skills/cloudflare/references/do-storage/configuration.md +112 -0
  247. package/skills/cloudflare/references/do-storage/gotchas.md +150 -0
  248. package/skills/cloudflare/references/do-storage/patterns.md +194 -0
  249. package/skills/cloudflare/references/do-storage/testing.md +183 -0
  250. package/skills/cloudflare/references/durable-objects/README.md +185 -0
  251. package/skills/cloudflare/references/durable-objects/api.md +187 -0
  252. package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
  253. package/skills/cloudflare/references/durable-objects/gotchas.md +197 -0
  254. package/skills/cloudflare/references/durable-objects/patterns.md +201 -0
  255. package/skills/cloudflare/references/email-routing/README.md +89 -0
  256. package/skills/cloudflare/references/email-routing/api.md +195 -0
  257. package/skills/cloudflare/references/email-routing/configuration.md +186 -0
  258. package/skills/cloudflare/references/email-routing/gotchas.md +196 -0
  259. package/skills/cloudflare/references/email-routing/patterns.md +229 -0
  260. package/skills/cloudflare/references/email-workers/README.md +151 -0
  261. package/skills/cloudflare/references/email-workers/api.md +237 -0
  262. package/skills/cloudflare/references/email-workers/configuration.md +112 -0
  263. package/skills/cloudflare/references/email-workers/gotchas.md +125 -0
  264. package/skills/cloudflare/references/email-workers/patterns.md +102 -0
  265. package/skills/cloudflare/references/graphql-api/README.md +147 -0
  266. package/skills/cloudflare/references/graphql-api/api.md +175 -0
  267. package/skills/cloudflare/references/graphql-api/configuration.md +118 -0
  268. package/skills/cloudflare/references/graphql-api/gotchas.md +110 -0
  269. package/skills/cloudflare/references/graphql-api/patterns.md +225 -0
  270. package/skills/cloudflare/references/hyperdrive/README.md +82 -0
  271. package/skills/cloudflare/references/hyperdrive/api.md +143 -0
  272. package/skills/cloudflare/references/hyperdrive/configuration.md +159 -0
  273. package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
  274. package/skills/cloudflare/references/hyperdrive/patterns.md +190 -0
  275. package/skills/cloudflare/references/images/README.md +61 -0
  276. package/skills/cloudflare/references/images/api.md +96 -0
  277. package/skills/cloudflare/references/images/configuration.md +211 -0
  278. package/skills/cloudflare/references/images/gotchas.md +99 -0
  279. package/skills/cloudflare/references/images/patterns.md +115 -0
  280. package/skills/cloudflare/references/kv/README.md +89 -0
  281. package/skills/cloudflare/references/kv/api.md +160 -0
  282. package/skills/cloudflare/references/kv/configuration.md +144 -0
  283. package/skills/cloudflare/references/kv/gotchas.md +131 -0
  284. package/skills/cloudflare/references/kv/patterns.md +196 -0
  285. package/skills/cloudflare/references/miniflare/README.md +105 -0
  286. package/skills/cloudflare/references/miniflare/api.md +187 -0
  287. package/skills/cloudflare/references/miniflare/configuration.md +173 -0
  288. package/skills/cloudflare/references/miniflare/gotchas.md +160 -0
  289. package/skills/cloudflare/references/miniflare/patterns.md +181 -0
  290. package/skills/cloudflare/references/network-interconnect/README.md +99 -0
  291. package/skills/cloudflare/references/network-interconnect/api.md +199 -0
  292. package/skills/cloudflare/references/network-interconnect/configuration.md +114 -0
  293. package/skills/cloudflare/references/network-interconnect/gotchas.md +165 -0
  294. package/skills/cloudflare/references/network-interconnect/patterns.md +166 -0
  295. package/skills/cloudflare/references/observability/README.md +88 -0
  296. package/skills/cloudflare/references/observability/api.md +164 -0
  297. package/skills/cloudflare/references/observability/configuration.md +169 -0
  298. package/skills/cloudflare/references/observability/gotchas.md +115 -0
  299. package/skills/cloudflare/references/observability/patterns.md +105 -0
  300. package/skills/cloudflare/references/pages/README.md +88 -0
  301. package/skills/cloudflare/references/pages/api.md +204 -0
  302. package/skills/cloudflare/references/pages/configuration.md +201 -0
  303. package/skills/cloudflare/references/pages/gotchas.md +203 -0
  304. package/skills/cloudflare/references/pages/patterns.md +204 -0
  305. package/skills/cloudflare/references/pages-functions/README.md +98 -0
  306. package/skills/cloudflare/references/pages-functions/api.md +143 -0
  307. package/skills/cloudflare/references/pages-functions/configuration.md +122 -0
  308. package/skills/cloudflare/references/pages-functions/gotchas.md +94 -0
  309. package/skills/cloudflare/references/pages-functions/patterns.md +137 -0
  310. package/skills/cloudflare/references/pipelines/README.md +105 -0
  311. package/skills/cloudflare/references/pipelines/api.md +208 -0
  312. package/skills/cloudflare/references/pipelines/configuration.md +98 -0
  313. package/skills/cloudflare/references/pipelines/gotchas.md +80 -0
  314. package/skills/cloudflare/references/pipelines/patterns.md +87 -0
  315. package/skills/cloudflare/references/pulumi/README.md +100 -0
  316. package/skills/cloudflare/references/pulumi/api.md +200 -0
  317. package/skills/cloudflare/references/pulumi/configuration.md +198 -0
  318. package/skills/cloudflare/references/pulumi/gotchas.md +181 -0
  319. package/skills/cloudflare/references/pulumi/patterns.md +191 -0
  320. package/skills/cloudflare/references/queues/README.md +96 -0
  321. package/skills/cloudflare/references/queues/api.md +206 -0
  322. package/skills/cloudflare/references/queues/configuration.md +144 -0
  323. package/skills/cloudflare/references/queues/gotchas.md +206 -0
  324. package/skills/cloudflare/references/queues/patterns.md +220 -0
  325. package/skills/cloudflare/references/r2/README.md +95 -0
  326. package/skills/cloudflare/references/r2/api.md +200 -0
  327. package/skills/cloudflare/references/r2/configuration.md +165 -0
  328. package/skills/cloudflare/references/r2/gotchas.md +190 -0
  329. package/skills/cloudflare/references/r2/patterns.md +193 -0
  330. package/skills/cloudflare/references/r2-data-catalog/README.md +149 -0
  331. package/skills/cloudflare/references/r2-data-catalog/api.md +199 -0
  332. package/skills/cloudflare/references/r2-data-catalog/configuration.md +198 -0
  333. package/skills/cloudflare/references/r2-data-catalog/gotchas.md +170 -0
  334. package/skills/cloudflare/references/r2-data-catalog/patterns.md +191 -0
  335. package/skills/cloudflare/references/r2-sql/README.md +128 -0
  336. package/skills/cloudflare/references/r2-sql/SKILL.md.backup +512 -0
  337. package/skills/cloudflare/references/r2-sql/api.md +158 -0
  338. package/skills/cloudflare/references/r2-sql/configuration.md +147 -0
  339. package/skills/cloudflare/references/r2-sql/gotchas.md +212 -0
  340. package/skills/cloudflare/references/r2-sql/patterns.md +222 -0
  341. package/skills/cloudflare/references/realtime-sfu/README.md +65 -0
  342. package/skills/cloudflare/references/realtime-sfu/api.md +158 -0
  343. package/skills/cloudflare/references/realtime-sfu/configuration.md +137 -0
  344. package/skills/cloudflare/references/realtime-sfu/gotchas.md +133 -0
  345. package/skills/cloudflare/references/realtime-sfu/patterns.md +174 -0
  346. package/skills/cloudflare/references/realtimekit/README.md +113 -0
  347. package/skills/cloudflare/references/realtimekit/api.md +212 -0
  348. package/skills/cloudflare/references/realtimekit/configuration.md +203 -0
  349. package/skills/cloudflare/references/realtimekit/gotchas.md +169 -0
  350. package/skills/cloudflare/references/realtimekit/patterns.md +223 -0
  351. package/skills/cloudflare/references/sandbox/README.md +96 -0
  352. package/skills/cloudflare/references/sandbox/api.md +198 -0
  353. package/skills/cloudflare/references/sandbox/configuration.md +143 -0
  354. package/skills/cloudflare/references/sandbox/gotchas.md +194 -0
  355. package/skills/cloudflare/references/sandbox/patterns.md +201 -0
  356. package/skills/cloudflare/references/secrets-store/README.md +74 -0
  357. package/skills/cloudflare/references/secrets-store/api.md +200 -0
  358. package/skills/cloudflare/references/secrets-store/configuration.md +185 -0
  359. package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
  360. package/skills/cloudflare/references/secrets-store/patterns.md +207 -0
  361. package/skills/cloudflare/references/smart-placement/README.md +138 -0
  362. package/skills/cloudflare/references/smart-placement/api.md +183 -0
  363. package/skills/cloudflare/references/smart-placement/configuration.md +196 -0
  364. package/skills/cloudflare/references/smart-placement/gotchas.md +174 -0
  365. package/skills/cloudflare/references/smart-placement/patterns.md +183 -0
  366. package/skills/cloudflare/references/snippets/README.md +68 -0
  367. package/skills/cloudflare/references/snippets/api.md +198 -0
  368. package/skills/cloudflare/references/snippets/configuration.md +227 -0
  369. package/skills/cloudflare/references/snippets/gotchas.md +86 -0
  370. package/skills/cloudflare/references/snippets/patterns.md +135 -0
  371. package/skills/cloudflare/references/spectrum/README.md +52 -0
  372. package/skills/cloudflare/references/spectrum/api.md +181 -0
  373. package/skills/cloudflare/references/spectrum/configuration.md +194 -0
  374. package/skills/cloudflare/references/spectrum/gotchas.md +145 -0
  375. package/skills/cloudflare/references/spectrum/patterns.md +196 -0
  376. package/skills/cloudflare/references/static-assets/README.md +65 -0
  377. package/skills/cloudflare/references/static-assets/api.md +199 -0
  378. package/skills/cloudflare/references/static-assets/configuration.md +186 -0
  379. package/skills/cloudflare/references/static-assets/gotchas.md +162 -0
  380. package/skills/cloudflare/references/static-assets/patterns.md +189 -0
  381. package/skills/cloudflare/references/stream/README.md +114 -0
  382. package/skills/cloudflare/references/stream/api-live.md +195 -0
  383. package/skills/cloudflare/references/stream/api.md +199 -0
  384. package/skills/cloudflare/references/stream/configuration.md +141 -0
  385. package/skills/cloudflare/references/stream/gotchas.md +130 -0
  386. package/skills/cloudflare/references/stream/patterns.md +184 -0
  387. package/skills/cloudflare/references/tail-workers/README.md +89 -0
  388. package/skills/cloudflare/references/tail-workers/api.md +200 -0
  389. package/skills/cloudflare/references/tail-workers/configuration.md +176 -0
  390. package/skills/cloudflare/references/tail-workers/gotchas.md +192 -0
  391. package/skills/cloudflare/references/tail-workers/patterns.md +180 -0
  392. package/skills/cloudflare/references/terraform/README.md +102 -0
  393. package/skills/cloudflare/references/terraform/api.md +178 -0
  394. package/skills/cloudflare/references/terraform/configuration.md +197 -0
  395. package/skills/cloudflare/references/terraform/gotchas.md +150 -0
  396. package/skills/cloudflare/references/terraform/patterns.md +174 -0
  397. package/skills/cloudflare/references/tunnel/README.md +129 -0
  398. package/skills/cloudflare/references/tunnel/api.md +193 -0
  399. package/skills/cloudflare/references/tunnel/configuration.md +157 -0
  400. package/skills/cloudflare/references/tunnel/gotchas.md +147 -0
  401. package/skills/cloudflare/references/tunnel/networking.md +168 -0
  402. package/skills/cloudflare/references/tunnel/patterns.md +192 -0
  403. package/skills/cloudflare/references/turn/README.md +82 -0
  404. package/skills/cloudflare/references/turn/api.md +239 -0
  405. package/skills/cloudflare/references/turn/configuration.md +179 -0
  406. package/skills/cloudflare/references/turn/gotchas.md +231 -0
  407. package/skills/cloudflare/references/turn/patterns.md +213 -0
  408. package/skills/cloudflare/references/turnstile/README.md +99 -0
  409. package/skills/cloudflare/references/turnstile/api.md +240 -0
  410. package/skills/cloudflare/references/turnstile/configuration.md +222 -0
  411. package/skills/cloudflare/references/turnstile/gotchas.md +218 -0
  412. package/skills/cloudflare/references/turnstile/patterns.md +193 -0
  413. package/skills/cloudflare/references/vectorize/README.md +133 -0
  414. package/skills/cloudflare/references/vectorize/api.md +88 -0
  415. package/skills/cloudflare/references/vectorize/configuration.md +88 -0
  416. package/skills/cloudflare/references/vectorize/gotchas.md +76 -0
  417. package/skills/cloudflare/references/vectorize/patterns.md +90 -0
  418. package/skills/cloudflare/references/waf/README.md +113 -0
  419. package/skills/cloudflare/references/waf/api.md +202 -0
  420. package/skills/cloudflare/references/waf/configuration.md +203 -0
  421. package/skills/cloudflare/references/waf/gotchas.md +204 -0
  422. package/skills/cloudflare/references/waf/patterns.md +197 -0
  423. package/skills/cloudflare/references/web-analytics/README.md +141 -0
  424. package/skills/cloudflare/references/web-analytics/configuration.md +76 -0
  425. package/skills/cloudflare/references/web-analytics/gotchas.md +82 -0
  426. package/skills/cloudflare/references/web-analytics/integration.md +60 -0
  427. package/skills/cloudflare/references/web-analytics/patterns.md +91 -0
  428. package/skills/cloudflare/references/workerd/README.md +78 -0
  429. package/skills/cloudflare/references/workerd/api.md +185 -0
  430. package/skills/cloudflare/references/workerd/configuration.md +183 -0
  431. package/skills/cloudflare/references/workerd/gotchas.md +139 -0
  432. package/skills/cloudflare/references/workerd/patterns.md +192 -0
  433. package/skills/cloudflare/references/workers/README.md +108 -0
  434. package/skills/cloudflare/references/workers/api.md +195 -0
  435. package/skills/cloudflare/references/workers/configuration.md +185 -0
  436. package/skills/cloudflare/references/workers/frameworks.md +197 -0
  437. package/skills/cloudflare/references/workers/gotchas.md +136 -0
  438. package/skills/cloudflare/references/workers/patterns.md +198 -0
  439. package/skills/cloudflare/references/workers-ai/README.md +197 -0
  440. package/skills/cloudflare/references/workers-ai/api.md +112 -0
  441. package/skills/cloudflare/references/workers-ai/configuration.md +97 -0
  442. package/skills/cloudflare/references/workers-ai/gotchas.md +114 -0
  443. package/skills/cloudflare/references/workers-ai/patterns.md +120 -0
  444. package/skills/cloudflare/references/workers-for-platforms/README.md +89 -0
  445. package/skills/cloudflare/references/workers-for-platforms/api.md +196 -0
  446. package/skills/cloudflare/references/workers-for-platforms/configuration.md +167 -0
  447. package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
  448. package/skills/cloudflare/references/workers-for-platforms/patterns.md +188 -0
  449. package/skills/cloudflare/references/workers-playground/README.md +127 -0
  450. package/skills/cloudflare/references/workers-playground/api.md +101 -0
  451. package/skills/cloudflare/references/workers-playground/configuration.md +163 -0
  452. package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
  453. package/skills/cloudflare/references/workers-playground/patterns.md +132 -0
  454. package/skills/cloudflare/references/workers-vpc/README.md +127 -0
  455. package/skills/cloudflare/references/workers-vpc/api.md +202 -0
  456. package/skills/cloudflare/references/workers-vpc/configuration.md +147 -0
  457. package/skills/cloudflare/references/workers-vpc/gotchas.md +167 -0
  458. package/skills/cloudflare/references/workers-vpc/patterns.md +209 -0
  459. package/skills/cloudflare/references/workflows/README.md +69 -0
  460. package/skills/cloudflare/references/workflows/api.md +185 -0
  461. package/skills/cloudflare/references/workflows/configuration.md +151 -0
  462. package/skills/cloudflare/references/workflows/gotchas.md +97 -0
  463. package/skills/cloudflare/references/workflows/patterns.md +175 -0
  464. package/skills/cloudflare/references/wrangler/README.md +135 -0
  465. package/skills/cloudflare/references/wrangler/api.md +188 -0
  466. package/skills/cloudflare/references/wrangler/configuration.md +197 -0
  467. package/skills/cloudflare/references/wrangler/gotchas.md +197 -0
  468. package/skills/cloudflare/references/wrangler/patterns.md +209 -0
  469. package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +121 -0
  470. package/skills/cloudflare/references/zaraz/README.md +111 -0
  471. package/skills/cloudflare/references/zaraz/api.md +112 -0
  472. package/skills/cloudflare/references/zaraz/configuration.md +90 -0
  473. package/skills/cloudflare/references/zaraz/gotchas.md +81 -0
  474. package/skills/cloudflare/references/zaraz/patterns.md +74 -0
  475. package/skills/code-reviewer/SKILL.md +347 -0
  476. package/skills/code-simplifier/SKILL.md +124 -0
  477. package/skills/code-simplifier/agents/verdent.yaml +11 -0
  478. package/skills/code-simplifier/assets/icon-dark.png +0 -0
  479. package/skills/code-simplifier/assets/icon-light.png +0 -0
  480. package/skills/concept-modeler/SKILL.md +178 -0
  481. package/skills/context-engineering/SKILL.md +289 -0
  482. package/skills/copywriting/SKILL.md +252 -0
  483. package/skills/copywriting/evals/evals.json +111 -0
  484. package/skills/copywriting/references/copy-frameworks.md +344 -0
  485. package/skills/copywriting/references/natural-transitions.md +272 -0
  486. package/skills/core-web-vitals/SKILL.md +483 -0
  487. package/skills/core-web-vitals/references/LCP.md +208 -0
  488. package/skills/craft-authoring/SKILL.md +123 -0
  489. package/skills/create-design-system-rules/SKILL.md +530 -0
  490. package/skills/create-design-system-rules/agents/verdent.yaml +11 -0
  491. package/skills/create-design-system-rules/assets/icon-dark.png +0 -0
  492. package/skills/create-design-system-rules/assets/icon-light.png +0 -0
  493. package/skills/database-and-data-modeling/SKILL.md +515 -0
  494. package/skills/database-blueprints/SKILL.md +60 -0
  495. package/skills/database-blueprints/agents/verdent.yaml +13 -0
  496. package/skills/database-blueprints/assets/icon-dark.png +0 -0
  497. package/skills/database-blueprints/assets/icon-light.png +0 -0
  498. package/skills/database-blueprints/references/core-schema.md +68 -0
  499. package/skills/database-blueprints/references/migration-safety.md +55 -0
  500. package/skills/database-blueprints/references/mysql.md +50 -0
  501. package/skills/database-blueprints/references/prisma.md +47 -0
  502. package/skills/database-blueprints/references/supabase-postgres.md +63 -0
  503. package/skills/delivery-acceptance/SKILL.md +60 -0
  504. package/skills/delivery-acceptance/agents/verdent.yaml +12 -0
  505. package/skills/delivery-acceptance/assets/icon-dark.png +0 -0
  506. package/skills/delivery-acceptance/assets/icon-light.png +0 -0
  507. package/skills/delivery-acceptance/references/acceptance-checklist.md +44 -0
  508. package/skills/delivery-acceptance/references/mobile-print-file.md +19 -0
  509. package/skills/delivery-acceptance/references/playwright-smoke.md +35 -0
  510. package/skills/dependency-audit/SKILL.md +97 -0
  511. package/skills/deprecation-and-migration/SKILL.md +206 -0
  512. package/skills/design-reviewer/SKILL.md +189 -0
  513. package/skills/develop-web-game/LICENSE.txt +201 -0
  514. package/skills/develop-web-game/SKILL.md +154 -0
  515. package/skills/develop-web-game/agents/verdent.yaml +12 -0
  516. package/skills/develop-web-game/assets/game-small.svg +4 -0
  517. package/skills/develop-web-game/assets/game.png +0 -0
  518. package/skills/develop-web-game/assets/icon-dark.png +0 -0
  519. package/skills/develop-web-game/assets/icon-light.png +0 -0
  520. package/skills/develop-web-game/references/action_payloads.json +7 -0
  521. package/skills/develop-web-game/scripts/web_game_playwright_client.js +356 -0
  522. package/skills/dignified-python/SKILL.md +175 -0
  523. package/skills/dignified-python/agents/verdent.yaml +11 -0
  524. package/skills/dignified-python/assets/icon-dark.png +0 -0
  525. package/skills/dignified-python/assets/icon-light.png +0 -0
  526. package/skills/dignified-python/cli-patterns.md +156 -0
  527. package/skills/dignified-python/dignified-python-core.md +345 -0
  528. package/skills/dignified-python/references/README.md +319 -0
  529. package/skills/dignified-python/references/advanced/api-design.md +230 -0
  530. package/skills/dignified-python/references/advanced/exception-handling.md +185 -0
  531. package/skills/dignified-python/references/advanced/interfaces.md +183 -0
  532. package/skills/dignified-python/references/advanced/typing-advanced.md +158 -0
  533. package/skills/dignified-python/references/checklists.md +134 -0
  534. package/skills/dignified-python/references/module-design.md +214 -0
  535. package/skills/dignified-python/subprocess.md +99 -0
  536. package/skills/dignified-python/versions/python-3.10.md +520 -0
  537. package/skills/dignified-python/versions/python-3.11.md +538 -0
  538. package/skills/dignified-python/versions/python-3.12.md +664 -0
  539. package/skills/dignified-python/versions/python-3.13.md +657 -0
  540. package/skills/dispatching-parallel-agents/SKILL.md +182 -0
  541. package/skills/documentation-and-adrs/SKILL.md +278 -0
  542. package/skills/documentation-sync/SKILL.md +76 -0
  543. package/skills/documentation-writer/SKILL.md +50 -0
  544. package/skills/documentation-writer/agents/verdent.yaml +10 -0
  545. package/skills/documentation-writer/assets/icon-dark.png +0 -0
  546. package/skills/documentation-writer/assets/icon-light.png +0 -0
  547. package/skills/docx/SKILL.md +186 -0
  548. package/skills/docx/agents/verdent.yaml +9 -0
  549. package/skills/docx/assets/docx.png +0 -0
  550. package/skills/docx/assets/icon-dark.png +0 -0
  551. package/skills/docx/assets/icon-light.png +0 -0
  552. package/skills/docx/references/creation-guide.md +309 -0
  553. package/skills/docx/references/xml-editing-guide.md +237 -0
  554. package/skills/docx/scripts/docx_tool.py +164 -0
  555. package/skills/docx/scripts/fixtures/comments.xml +3 -0
  556. package/skills/docx/scripts/fixtures/commentsExtended.xml +3 -0
  557. package/skills/docx/scripts/fixtures/commentsExtensible.xml +3 -0
  558. package/skills/docx/scripts/fixtures/commentsIds.xml +3 -0
  559. package/skills/docx/scripts/fixtures/people.xml +3 -0
  560. package/skills/docx/scripts/internals/__init__.py +0 -0
  561. package/skills/docx/scripts/internals/content.py +307 -0
  562. package/skills/docx/scripts/internals/integrity/__init__.py +0 -0
  563. package/skills/docx/scripts/internals/integrity/foundation.py +559 -0
  564. package/skills/docx/scripts/internals/integrity/orchestrator.py +66 -0
  565. package/skills/docx/scripts/internals/integrity/revision_checker.py +181 -0
  566. package/skills/docx/scripts/internals/integrity/schema_checker.py +294 -0
  567. package/skills/docx/scripts/internals/packaging.py +193 -0
  568. package/skills/docx/scripts/internals/preprocessing/__init__.py +0 -0
  569. package/skills/docx/scripts/internals/preprocessing/revision_merger.py +193 -0
  570. package/skills/docx/scripts/internals/preprocessing/run_consolidator.py +179 -0
  571. package/skills/docx/scripts/internals/runtime/__init__.py +0 -0
  572. package/skills/docx/scripts/internals/runtime/converter.py +184 -0
  573. package/skills/docx/scripts/internals/runtime/renderer.py +60 -0
  574. package/skills/docx/scripts/internals/runtime/revision_acceptor.py +122 -0
  575. package/skills/docx/scripts/render_docx.py +296 -0
  576. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  577. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  578. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  579. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  580. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  581. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  582. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  583. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  584. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  585. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  586. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  587. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  588. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  589. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  590. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  591. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  592. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  593. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  594. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  595. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  596. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  597. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  598. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  599. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  600. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  601. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  602. package/skills/docx/scripts/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  603. package/skills/docx/scripts/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  604. package/skills/docx/scripts/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  605. package/skills/docx/scripts/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  606. package/skills/docx/scripts/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  607. package/skills/docx/scripts/schemas/mce/mc.xsd +75 -0
  608. package/skills/docx/scripts/schemas/microsoft/wml-2010.xsd +560 -0
  609. package/skills/docx/scripts/schemas/microsoft/wml-2012.xsd +67 -0
  610. package/skills/docx/scripts/schemas/microsoft/wml-2018.xsd +14 -0
  611. package/skills/docx/scripts/schemas/microsoft/wml-cex-2018.xsd +20 -0
  612. package/skills/docx/scripts/schemas/microsoft/wml-cid-2016.xsd +13 -0
  613. package/skills/docx/scripts/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  614. package/skills/docx/scripts/schemas/microsoft/wml-symex-2015.xsd +8 -0
  615. package/skills/doubt-driven-development/SKILL.md +243 -0
  616. package/skills/e2e-testing-guide/SKILL.md +204 -0
  617. package/skills/emil-design-eng/SKILL.md +679 -0
  618. package/skills/environment-and-config/SKILL.md +849 -0
  619. package/skills/error-handling/SKILL.md +757 -0
  620. package/skills/excalidraw-diagram-generator/SKILL.md +618 -0
  621. package/skills/excalidraw-diagram-generator/agents/verdent.yaml +11 -0
  622. package/skills/excalidraw-diagram-generator/assets/icon-dark.png +0 -0
  623. package/skills/excalidraw-diagram-generator/assets/icon-light.png +0 -0
  624. package/skills/excalidraw-diagram-generator/references/element-types.md +497 -0
  625. package/skills/excalidraw-diagram-generator/references/excalidraw-schema.md +350 -0
  626. package/skills/excalidraw-diagram-generator/scripts/README.md +193 -0
  627. package/skills/excalidraw-diagram-generator/scripts/add-arrow.py +312 -0
  628. package/skills/excalidraw-diagram-generator/scripts/add-icon-to-diagram.py +404 -0
  629. package/skills/excalidraw-diagram-generator/scripts/split-excalidraw-library.py +183 -0
  630. package/skills/excalidraw-diagram-generator/templates/business-flow-swimlane-template.excalidraw +334 -0
  631. package/skills/excalidraw-diagram-generator/templates/class-diagram-template.excalidraw +558 -0
  632. package/skills/excalidraw-diagram-generator/templates/data-flow-diagram-template.excalidraw +279 -0
  633. package/skills/excalidraw-diagram-generator/templates/er-diagram-template.excalidraw +662 -0
  634. package/skills/excalidraw-diagram-generator/templates/flowchart-template.excalidraw +179 -0
  635. package/skills/excalidraw-diagram-generator/templates/mindmap-template.excalidraw +244 -0
  636. package/skills/excalidraw-diagram-generator/templates/relationship-template.excalidraw +145 -0
  637. package/skills/excalidraw-diagram-generator/templates/sequence-diagram-template.excalidraw +509 -0
  638. package/skills/executing-plans/SKILL.md +245 -0
  639. package/skills/figma/LICENSE.txt +202 -0
  640. package/skills/figma/SKILL.md +53 -0
  641. package/skills/figma/agents/verdent.yaml +7 -0
  642. package/skills/figma/assets/figma.png +0 -0
  643. package/skills/figma/assets/icon-dark.png +0 -0
  644. package/skills/figma/assets/icon-light.png +0 -0
  645. package/skills/figma/assets/icon.svg +28 -0
  646. package/skills/figma/references/figma-mcp-config.md +49 -0
  647. package/skills/figma/references/figma-tools-and-prompts.md +39 -0
  648. package/skills/figma-implement-design/LICENSE.txt +202 -0
  649. package/skills/figma-implement-design/SKILL.md +265 -0
  650. package/skills/figma-implement-design/agents/verdent.yaml +7 -0
  651. package/skills/figma-implement-design/assets/figma.png +0 -0
  652. package/skills/figma-implement-design/assets/icon-dark.png +0 -0
  653. package/skills/figma-implement-design/assets/icon-light.png +0 -0
  654. package/skills/figma-implement-design/assets/icon.svg +28 -0
  655. package/skills/find-docs/SKILL.md +164 -0
  656. package/skills/find-docs/agents/verdent.yaml +11 -0
  657. package/skills/find-docs/assets/icon-dark.png +0 -0
  658. package/skills/find-docs/assets/icon-light.png +0 -0
  659. package/skills/find-skills/SKILL.md +142 -0
  660. package/skills/firecrawl/SKILL.md +131 -0
  661. package/skills/firecrawl/agents/verdent.yaml +11 -0
  662. package/skills/firecrawl/assets/icon-dark.png +0 -0
  663. package/skills/firecrawl/assets/icon-light.png +0 -0
  664. package/skills/firecrawl/rules/install.md +63 -0
  665. package/skills/firecrawl/rules/security.md +26 -0
  666. package/skills/flutter-architecting-apps/SKILL.md +164 -0
  667. package/skills/flutter-architecting-apps/agents/verdent.yaml +11 -0
  668. package/skills/flutter-architecting-apps/assets/icon-dark.png +0 -0
  669. package/skills/flutter-architecting-apps/assets/icon-light.png +0 -0
  670. package/skills/frontend-design-pro/SKILL.md +328 -0
  671. package/skills/frontend-slides/LICENSE +21 -0
  672. package/skills/frontend-slides/SKILL.md +1169 -0
  673. package/skills/frontend-slides/STYLE_PRESETS.md +561 -0
  674. package/skills/frontend-slides/agents/verdent.yaml +7 -0
  675. package/skills/frontend-slides/assets/icon-dark.png +0 -0
  676. package/skills/frontend-slides/assets/icon-light.png +0 -0
  677. package/skills/gh-cli/SKILL.md +2192 -0
  678. package/skills/gh-cli/agents/verdent.yaml +12 -0
  679. package/skills/gh-cli/assets/icon-dark.png +0 -0
  680. package/skills/gh-cli/assets/icon-light.png +0 -0
  681. package/skills/git-commit/SKILL.md +129 -0
  682. package/skills/git-commit/agents/verdent.yaml +11 -0
  683. package/skills/git-commit/assets/icon-dark.png +0 -0
  684. package/skills/git-commit/assets/icon-light.png +0 -0
  685. package/skills/git-workflow-and-versioning/SKILL.md +300 -0
  686. package/skills/graphql-operations/SKILL.md +247 -0
  687. package/skills/graphql-operations/agents/verdent.yaml +11 -0
  688. package/skills/graphql-operations/assets/icon-dark.png +0 -0
  689. package/skills/graphql-operations/assets/icon-light.png +0 -0
  690. package/skills/graphql-operations/references/fragments.md +536 -0
  691. package/skills/graphql-operations/references/mutations.md +435 -0
  692. package/skills/graphql-operations/references/queries.md +504 -0
  693. package/skills/graphql-operations/references/tooling.md +404 -0
  694. package/skills/graphql-operations/references/variables.md +440 -0
  695. package/skills/graphql-schema/SKILL.md +175 -0
  696. package/skills/graphql-schema/agents/verdent.yaml +11 -0
  697. package/skills/graphql-schema/assets/icon-dark.png +0 -0
  698. package/skills/graphql-schema/assets/icon-light.png +0 -0
  699. package/skills/graphql-schema/references/errors.md +388 -0
  700. package/skills/graphql-schema/references/naming.md +400 -0
  701. package/skills/graphql-schema/references/pagination.md +396 -0
  702. package/skills/graphql-schema/references/security.md +484 -0
  703. package/skills/graphql-schema/references/types.md +445 -0
  704. package/skills/hugging-face-model-trainer/SKILL.md +722 -0
  705. package/skills/hugging-face-model-trainer/agents/verdent.yaml +12 -0
  706. package/skills/hugging-face-model-trainer/assets/icon-dark.png +0 -0
  707. package/skills/hugging-face-model-trainer/assets/icon-light.png +0 -0
  708. package/skills/hugging-face-model-trainer/references/gguf_conversion.md +296 -0
  709. package/skills/hugging-face-model-trainer/references/hardware_guide.md +283 -0
  710. package/skills/hugging-face-model-trainer/references/hub_saving.md +364 -0
  711. package/skills/hugging-face-model-trainer/references/local_training_macos.md +231 -0
  712. package/skills/hugging-face-model-trainer/references/reliability_principles.md +371 -0
  713. package/skills/hugging-face-model-trainer/references/trackio_guide.md +189 -0
  714. package/skills/hugging-face-model-trainer/references/training_methods.md +150 -0
  715. package/skills/hugging-face-model-trainer/references/training_patterns.md +203 -0
  716. package/skills/hugging-face-model-trainer/references/troubleshooting.md +282 -0
  717. package/skills/hugging-face-model-trainer/references/unsloth.md +313 -0
  718. package/skills/hugging-face-model-trainer/scripts/convert_to_gguf.py +424 -0
  719. package/skills/hugging-face-model-trainer/scripts/dataset_inspector.py +417 -0
  720. package/skills/hugging-face-model-trainer/scripts/estimate_cost.py +150 -0
  721. package/skills/hugging-face-model-trainer/scripts/train_dpo_example.py +106 -0
  722. package/skills/hugging-face-model-trainer/scripts/train_grpo_example.py +89 -0
  723. package/skills/hugging-face-model-trainer/scripts/train_sft_example.py +122 -0
  724. package/skills/hugging-face-model-trainer/scripts/unsloth_sft_example.py +512 -0
  725. package/skills/imagegen/LICENSE.txt +201 -0
  726. package/skills/imagegen/SKILL.md +180 -0
  727. package/skills/imagegen/agents/verdent.yaml +11 -0
  728. package/skills/imagegen/assets/icon-dark.png +0 -0
  729. package/skills/imagegen/assets/icon-light.png +0 -0
  730. package/skills/imagegen/assets/imagegen-small.svg +5 -0
  731. package/skills/imagegen/assets/imagegen.png +0 -0
  732. package/skills/imagegen/references/cli.md +132 -0
  733. package/skills/imagegen/references/image-api.md +36 -0
  734. package/skills/imagegen/references/network-notes.md +28 -0
  735. package/skills/imagegen/references/prompting.md +81 -0
  736. package/skills/imagegen/references/sample-prompts.md +384 -0
  737. package/skills/imagegen/scripts/image_gen.py +876 -0
  738. package/skills/impeccable/SKILL.md +450 -0
  739. package/skills/impeccable/reference/adapt.md +190 -0
  740. package/skills/impeccable/reference/animate.md +175 -0
  741. package/skills/impeccable/reference/audit.md +133 -0
  742. package/skills/impeccable/reference/bolder.md +113 -0
  743. package/skills/impeccable/reference/brand.md +114 -0
  744. package/skills/impeccable/reference/clarify.md +174 -0
  745. package/skills/impeccable/reference/cognitive-load.md +106 -0
  746. package/skills/impeccable/reference/color-and-contrast.md +105 -0
  747. package/skills/impeccable/reference/colorize.md +154 -0
  748. package/skills/impeccable/reference/craft.md +193 -0
  749. package/skills/impeccable/reference/critique.md +213 -0
  750. package/skills/impeccable/reference/delight.md +302 -0
  751. package/skills/impeccable/reference/distill.md +111 -0
  752. package/skills/impeccable/reference/document.md +427 -0
  753. package/skills/impeccable/reference/extract.md +69 -0
  754. package/skills/impeccable/reference/harden.md +347 -0
  755. package/skills/impeccable/reference/heuristics-scoring.md +234 -0
  756. package/skills/impeccable/reference/interaction-design.md +195 -0
  757. package/skills/impeccable/reference/layout.md +141 -0
  758. package/skills/impeccable/reference/live.md +622 -0
  759. package/skills/impeccable/reference/motion-design.md +109 -0
  760. package/skills/impeccable/reference/onboard.md +234 -0
  761. package/skills/impeccable/reference/optimize.md +258 -0
  762. package/skills/impeccable/reference/overdrive.md +130 -0
  763. package/skills/impeccable/reference/personas.md +179 -0
  764. package/skills/impeccable/reference/polish.md +233 -0
  765. package/skills/impeccable/reference/product.md +62 -0
  766. package/skills/impeccable/reference/quieter.md +99 -0
  767. package/skills/impeccable/reference/responsive-design.md +114 -0
  768. package/skills/impeccable/reference/shape.md +151 -0
  769. package/skills/impeccable/reference/spatial-design.md +100 -0
  770. package/skills/impeccable/reference/teach.md +156 -0
  771. package/skills/impeccable/reference/typeset.md +124 -0
  772. package/skills/impeccable/reference/typography.md +159 -0
  773. package/skills/impeccable/reference/ux-writing.md +107 -0
  774. package/skills/impeccable/references/A11Y-PATTERNS.md +233 -0
  775. package/skills/impeccable/references/WCAG.md +191 -0
  776. package/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
  777. package/skills/impeccable/scripts/command-metadata.json +94 -0
  778. package/skills/impeccable/scripts/design-parser.mjs +820 -0
  779. package/skills/impeccable/scripts/detect-csp.mjs +198 -0
  780. package/skills/impeccable/scripts/impeccable-paths.mjs +105 -0
  781. package/skills/impeccable/scripts/is-generated.mjs +69 -0
  782. package/skills/impeccable/scripts/live-accept.mjs +595 -0
  783. package/skills/impeccable/scripts/live-browser-session.js +123 -0
  784. package/skills/impeccable/scripts/live-browser.js +4860 -0
  785. package/skills/impeccable/scripts/live-complete.mjs +75 -0
  786. package/skills/impeccable/scripts/live-completion.mjs +18 -0
  787. package/skills/impeccable/scripts/live-inject.mjs +446 -0
  788. package/skills/impeccable/scripts/live-poll.mjs +200 -0
  789. package/skills/impeccable/scripts/live-resume.mjs +48 -0
  790. package/skills/impeccable/scripts/live-server.mjs +836 -0
  791. package/skills/impeccable/scripts/live-session-store.mjs +254 -0
  792. package/skills/impeccable/scripts/live-status.mjs +47 -0
  793. package/skills/impeccable/scripts/live-wrap.mjs +632 -0
  794. package/skills/impeccable/scripts/live.mjs +247 -0
  795. package/skills/impeccable/scripts/load-context.mjs +141 -0
  796. package/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  797. package/skills/impeccable/scripts/pin.mjs +214 -0
  798. package/skills/improve-codebase-architecture/DEEPENING.md +37 -0
  799. package/skills/improve-codebase-architecture/INTERFACE-DESIGN.md +44 -0
  800. package/skills/improve-codebase-architecture/LANGUAGE.md +53 -0
  801. package/skills/improve-codebase-architecture/SKILL.md +331 -0
  802. package/skills/incident-response/SKILL.md +97 -0
  803. package/skills/interview-me/SKILL.md +221 -0
  804. package/skills/knowledge-base-update/SKILL.md +90 -0
  805. package/skills/langchain-rag/SKILL.md +522 -0
  806. package/skills/langchain-rag/agents/verdent.yaml +12 -0
  807. package/skills/langchain-rag/assets/icon-dark.png +0 -0
  808. package/skills/langchain-rag/assets/icon-light.png +0 -0
  809. package/skills/linear/LICENSE.txt +202 -0
  810. package/skills/linear/SKILL.md +102 -0
  811. package/skills/linear/agents/verdent.yaml +7 -0
  812. package/skills/linear/assets/icon-dark.png +0 -0
  813. package/skills/linear/assets/icon-light.png +0 -0
  814. package/skills/linear/assets/linear.png +0 -0
  815. package/skills/localization-hub/ai-batch.md +23 -0
  816. package/skills/localization-hub/key-naming.md +15 -0
  817. package/skills/localization-hub/route-slugs.md +14 -0
  818. package/skills/mcp-builder/LICENSE.txt +202 -0
  819. package/skills/mcp-builder/SKILL.md +260 -0
  820. package/skills/mcp-builder/agents/verdent.yaml +7 -0
  821. package/skills/mcp-builder/assets/icon-dark.png +0 -0
  822. package/skills/mcp-builder/assets/icon-light.png +0 -0
  823. package/skills/mcp-builder/reference/mcp_best_practices.md +269 -0
  824. package/skills/mcp-builder/reference/node_mcp_server.md +980 -0
  825. package/skills/mcp-builder/reference/python_mcp_server.md +737 -0
  826. package/skills/mcp-builder/scripts/connections.py +151 -0
  827. package/skills/netlify-deploy/LICENSE.txt +201 -0
  828. package/skills/netlify-deploy/SKILL.md +261 -0
  829. package/skills/netlify-deploy/agents/verdent.yaml +7 -0
  830. package/skills/netlify-deploy/assets/icon-dark.png +0 -0
  831. package/skills/netlify-deploy/assets/icon-light.png +0 -0
  832. package/skills/netlify-deploy/assets/netlify.png +0 -0
  833. package/skills/netlify-deploy/references/cli-commands.md +162 -0
  834. package/skills/netlify-deploy/references/deployment-patterns.md +319 -0
  835. package/skills/netlify-deploy/references/netlify-toml.md +259 -0
  836. package/skills/nexus-mapper/SKILL.md +314 -0
  837. package/skills/nexus-mapper/references/language-customization.md +164 -0
  838. package/skills/nexus-mapper/references/output-schema.md +298 -0
  839. package/skills/nexus-mapper/references/probe-protocol.md +246 -0
  840. package/skills/nexus-mapper/scripts/extract_ast.py +705 -0
  841. package/skills/nexus-mapper/scripts/git_detective.py +194 -0
  842. package/skills/nexus-mapper/scripts/languages.json +127 -0
  843. package/skills/nexus-mapper/scripts/query_graph.py +556 -0
  844. package/skills/nexus-mapper/scripts/requirements.txt +6 -0
  845. package/skills/notion-spec-to-implementation/LICENSE.txt +7 -0
  846. package/skills/notion-spec-to-implementation/SKILL.md +67 -0
  847. package/skills/notion-spec-to-implementation/agents/verdent.yaml +7 -0
  848. package/skills/notion-spec-to-implementation/assets/icon-dark.png +0 -0
  849. package/skills/notion-spec-to-implementation/assets/icon-light.png +0 -0
  850. package/skills/notion-spec-to-implementation/assets/notion.png +0 -0
  851. package/skills/notion-spec-to-implementation/evaluations/README.md +130 -0
  852. package/skills/notion-spec-to-implementation/evaluations/basic-spec-implementation.json +31 -0
  853. package/skills/notion-spec-to-implementation/evaluations/spec-to-tasks.json +34 -0
  854. package/skills/notion-spec-to-implementation/examples/api-feature.md +511 -0
  855. package/skills/notion-spec-to-implementation/examples/database-migration.md +89 -0
  856. package/skills/notion-spec-to-implementation/examples/ui-component.md +78 -0
  857. package/skills/notion-spec-to-implementation/reference/milestone-summary-template.md +31 -0
  858. package/skills/notion-spec-to-implementation/reference/progress-tracking.md +507 -0
  859. package/skills/notion-spec-to-implementation/reference/progress-update-template.md +29 -0
  860. package/skills/notion-spec-to-implementation/reference/quick-implementation-plan.md +30 -0
  861. package/skills/notion-spec-to-implementation/reference/spec-parsing.md +406 -0
  862. package/skills/notion-spec-to-implementation/reference/standard-implementation-plan.md +170 -0
  863. package/skills/notion-spec-to-implementation/reference/task-creation-template.md +40 -0
  864. package/skills/notion-spec-to-implementation/reference/task-creation.md +467 -0
  865. package/skills/pdf/LICENSE.txt +201 -0
  866. package/skills/pdf/SKILL.md +715 -0
  867. package/skills/pdf/agents/verdent.yaml +9 -0
  868. package/skills/pdf/assets/icon-dark.png +0 -0
  869. package/skills/pdf/assets/icon-light.png +0 -0
  870. package/skills/pdf/assets/pdf.png +0 -0
  871. package/skills/pdf/reference.md +221 -0
  872. package/skills/performance/SKILL.md +400 -0
  873. package/skills/playwright/LICENSE.txt +201 -0
  874. package/skills/playwright/NOTICE.txt +14 -0
  875. package/skills/playwright/SKILL.md +151 -0
  876. package/skills/playwright/agents/verdent.yaml +7 -0
  877. package/skills/playwright/assets/icon-dark.png +0 -0
  878. package/skills/playwright/assets/icon-light.png +0 -0
  879. package/skills/playwright/assets/playwright.png +0 -0
  880. package/skills/playwright/references/cli.md +116 -0
  881. package/skills/playwright/references/workflows.md +95 -0
  882. package/skills/playwright/scripts/playwright_cli.sh +25 -0
  883. package/skills/playwriter/SKILL.md +69 -0
  884. package/skills/playwriter/agents/verdent.yaml +7 -0
  885. package/skills/playwriter/assets/icon-dark.png +0 -0
  886. package/skills/playwriter/assets/icon-light.png +0 -0
  887. package/skills/pptx/SKILL.md +302 -0
  888. package/skills/pptx/agents/verdent.yaml +9 -0
  889. package/skills/pptx/assets/icon-dark.png +0 -0
  890. package/skills/pptx/assets/icon-light.png +0 -0
  891. package/skills/pptx/references/generate-with-js.md +412 -0
  892. package/skills/pptx/references/modify-workflow.md +157 -0
  893. package/skills/pptx/references/python-charts.md +91 -0
  894. package/skills/pptx/scripts/check_env.py +207 -0
  895. package/skills/pptx/scripts/deck.py +161 -0
  896. package/skills/pptx/scripts/internals/__init__.py +0 -0
  897. package/skills/pptx/scripts/internals/cleanup.py +194 -0
  898. package/skills/pptx/scripts/internals/content.py +62 -0
  899. package/skills/pptx/scripts/internals/create.py +122 -0
  900. package/skills/pptx/scripts/internals/gridshot.py +181 -0
  901. package/skills/pptx/scripts/internals/imaging.py +77 -0
  902. package/skills/pptx/scripts/internals/integrity/__init__.py +0 -0
  903. package/skills/pptx/scripts/internals/integrity/checks.py +318 -0
  904. package/skills/pptx/scripts/internals/packaging.py +127 -0
  905. package/skills/pptx/scripts/internals/runtime/__init__.py +0 -0
  906. package/skills/pptx/scripts/internals/runtime/converter.py +154 -0
  907. package/skills/pptx/scripts/internals/structure.py +162 -0
  908. package/skills/pr-creator/SKILL.md +98 -0
  909. package/skills/pr-creator/agents/verdent.yaml +11 -0
  910. package/skills/pr-creator/assets/icon-dark.png +0 -0
  911. package/skills/pr-creator/assets/icon-light.png +0 -0
  912. package/skills/prd/SKILL.md +148 -0
  913. package/skills/prd/agents/verdent.yaml +11 -0
  914. package/skills/prd/assets/icon-dark.png +0 -0
  915. package/skills/prd/assets/icon-light.png +0 -0
  916. package/skills/prismx-skill-gateway/SKILL.md +179 -0
  917. package/skills/prismx-skill-gateway/references/installed-skills.md +38 -0
  918. package/skills/prismx-skills-catalog/SKILL.md +51 -0
  919. package/skills/prismx-skills-catalog/references/inventory.json +1092 -0
  920. package/skills/prompt-enhancer/SKILL.md +90 -0
  921. package/skills/react-native-best-practices/SKILL.md +241 -0
  922. package/skills/react-native-best-practices/agents/verdent.yaml +11 -0
  923. package/skills/react-native-best-practices/assets/icon-dark.png +0 -0
  924. package/skills/react-native-best-practices/assets/icon-light.png +0 -0
  925. package/skills/react-native-best-practices/references/bundle-analyze-app.md +211 -0
  926. package/skills/react-native-best-practices/references/bundle-analyze-js.md +262 -0
  927. package/skills/react-native-best-practices/references/bundle-barrel-exports.md +248 -0
  928. package/skills/react-native-best-practices/references/bundle-code-splitting.md +224 -0
  929. package/skills/react-native-best-practices/references/bundle-hermes-mmap.md +167 -0
  930. package/skills/react-native-best-practices/references/bundle-library-size.md +177 -0
  931. package/skills/react-native-best-practices/references/bundle-native-assets.md +214 -0
  932. package/skills/react-native-best-practices/references/bundle-r8-android.md +225 -0
  933. package/skills/react-native-best-practices/references/bundle-tree-shaking.md +214 -0
  934. package/skills/react-native-best-practices/references/images/bundle-treemap-source-map-explorer.png +0 -0
  935. package/skills/react-native-best-practices/references/images/controlled-textinput-pingpong.png +0 -0
  936. package/skills/react-native-best-practices/references/images/devtools-flamegraph.png +0 -0
  937. package/skills/react-native-best-practices/references/images/emerge-xray-ios.png +0 -0
  938. package/skills/react-native-best-practices/references/images/expo-atlas-treemap.png +0 -0
  939. package/skills/react-native-best-practices/references/images/flashlight-flatlist-vs-flashlist.png +0 -0
  940. package/skills/react-native-best-practices/references/images/fps-drop-graph.png +0 -0
  941. package/skills/react-native-best-practices/references/images/memory-heap-snapshot.png +0 -0
  942. package/skills/react-native-best-practices/references/images/tti-warm-start-diagram.png +0 -0
  943. package/skills/react-native-best-practices/references/images/view-hierarchy-flattening.png +0 -0
  944. package/skills/react-native-best-practices/references/images/xcode-instruments-templates.png +0 -0
  945. package/skills/react-native-best-practices/references/images/xcode-thread-view.png +0 -0
  946. package/skills/react-native-best-practices/references/js-animations-reanimated.md +254 -0
  947. package/skills/react-native-best-practices/references/js-atomic-state.md +245 -0
  948. package/skills/react-native-best-practices/references/js-concurrent-react.md +236 -0
  949. package/skills/react-native-best-practices/references/js-lists-flatlist-flashlist.md +236 -0
  950. package/skills/react-native-best-practices/references/js-measure-fps.md +180 -0
  951. package/skills/react-native-best-practices/references/js-memory-leaks.md +205 -0
  952. package/skills/react-native-best-practices/references/js-profile-react.md +161 -0
  953. package/skills/react-native-best-practices/references/js-react-compiler.md +368 -0
  954. package/skills/react-native-best-practices/references/js-uncontrolled-components.md +216 -0
  955. package/skills/react-native-best-practices/references/native-android-16kb-alignment.md +113 -0
  956. package/skills/react-native-best-practices/references/native-measure-tti.md +262 -0
  957. package/skills/react-native-best-practices/references/native-memory-leaks.md +240 -0
  958. package/skills/react-native-best-practices/references/native-memory-patterns.md +274 -0
  959. package/skills/react-native-best-practices/references/native-platform-setup.md +110 -0
  960. package/skills/react-native-best-practices/references/native-profiling.md +176 -0
  961. package/skills/react-native-best-practices/references/native-sdks-over-polyfills.md +183 -0
  962. package/skills/react-native-best-practices/references/native-threading-model.md +234 -0
  963. package/skills/react-native-best-practices/references/native-turbo-modules.md +292 -0
  964. package/skills/react-native-best-practices/references/native-view-flattening.md +201 -0
  965. package/skills/redis-development/FULL_GUIDE.md +2216 -0
  966. package/skills/redis-development/SKILL.md +124 -0
  967. package/skills/redis-development/agents/verdent.yaml +12 -0
  968. package/skills/redis-development/assets/icon-dark.png +0 -0
  969. package/skills/redis-development/assets/icon-light.png +0 -0
  970. package/skills/redis-development/assets/logo.png +0 -0
  971. package/skills/redis-development/rules/_contributing.md +97 -0
  972. package/skills/redis-development/rules/_sections.md +50 -0
  973. package/skills/redis-development/rules/_template.md +52 -0
  974. package/skills/redis-development/rules/cluster-hash-tags.md +78 -0
  975. package/skills/redis-development/rules/cluster-read-replicas.md +55 -0
  976. package/skills/redis-development/rules/conn-blocking.md +75 -0
  977. package/skills/redis-development/rules/conn-client-cache.md +70 -0
  978. package/skills/redis-development/rules/conn-pipelining.md +58 -0
  979. package/skills/redis-development/rules/conn-pooling.md +71 -0
  980. package/skills/redis-development/rules/conn-timeouts.md +41 -0
  981. package/skills/redis-development/rules/data-choose-structure.md +76 -0
  982. package/skills/redis-development/rules/data-hash-field-expiry.md +62 -0
  983. package/skills/redis-development/rules/data-incr.md +76 -0
  984. package/skills/redis-development/rules/data-key-naming.md +62 -0
  985. package/skills/redis-development/rules/data-transactions.md +74 -0
  986. package/skills/redis-development/rules/json-partial-updates.md +49 -0
  987. package/skills/redis-development/rules/json-vs-hash.md +105 -0
  988. package/skills/redis-development/rules/observe-commands.md +53 -0
  989. package/skills/redis-development/rules/observe-metrics.md +39 -0
  990. package/skills/redis-development/rules/ram-limits.md +42 -0
  991. package/skills/redis-development/rules/ram-ttl.md +55 -0
  992. package/skills/redis-development/rules/rqe-dialect.md +47 -0
  993. package/skills/redis-development/rules/rqe-field-types.md +81 -0
  994. package/skills/redis-development/rules/rqe-index-creation.md +73 -0
  995. package/skills/redis-development/rules/rqe-index-management.md +49 -0
  996. package/skills/redis-development/rules/rqe-query-optimization.md +49 -0
  997. package/skills/redis-development/rules/rqe-skip-initial-scan.md +82 -0
  998. package/skills/redis-development/rules/security-acls.md +41 -0
  999. package/skills/redis-development/rules/security-auth.md +78 -0
  1000. package/skills/redis-development/rules/security-network.md +52 -0
  1001. package/skills/redis-development/rules/semantic-cache-best-practices.md +72 -0
  1002. package/skills/redis-development/rules/semantic-cache-langcache-usage.md +86 -0
  1003. package/skills/redis-development/rules/stream-choosing-pattern.md +44 -0
  1004. package/skills/redis-development/rules/vector-algorithm-choice.md +60 -0
  1005. package/skills/redis-development/rules/vector-hybrid-search.md +49 -0
  1006. package/skills/redis-development/rules/vector-index-creation.md +83 -0
  1007. package/skills/redis-development/rules/vector-rag-pattern.md +51 -0
  1008. package/skills/refactor/agents/verdent.yaml +11 -0
  1009. package/skills/refactor/assets/icon-dark.png +0 -0
  1010. package/skills/refactor/assets/icon-light.png +0 -0
  1011. package/skills/runtime-inspector/SKILL.md +99 -0
  1012. package/skills/schema-markup/SKILL.md +179 -0
  1013. package/skills/schema-markup/evals/evals.json +87 -0
  1014. package/skills/schema-markup/references/schema-examples.md +398 -0
  1015. package/skills/screenshot/LICENSE.txt +201 -0
  1016. package/skills/screenshot/SKILL.md +271 -0
  1017. package/skills/screenshot/agents/verdent.yaml +7 -0
  1018. package/skills/screenshot/assets/icon-dark.png +0 -0
  1019. package/skills/screenshot/assets/icon-light.png +0 -0
  1020. package/skills/screenshot/assets/screenshot.png +0 -0
  1021. package/skills/screenshot/scripts/ensure_macos_permissions.sh +54 -0
  1022. package/skills/screenshot/scripts/macos_display_info.swift +22 -0
  1023. package/skills/screenshot/scripts/macos_permissions.swift +40 -0
  1024. package/skills/screenshot/scripts/macos_window_info.swift +126 -0
  1025. package/skills/screenshot/scripts/take_screenshot.ps1 +163 -0
  1026. package/skills/screenshot/scripts/take_screenshot.py +585 -0
  1027. package/skills/security-and-hardening/SKILL.md +349 -0
  1028. package/skills/security-best-practices/LICENSE.txt +201 -0
  1029. package/skills/security-best-practices/SKILL.md +91 -0
  1030. package/skills/security-best-practices/agents/verdent.yaml +7 -0
  1031. package/skills/security-best-practices/assets/icon-dark.png +0 -0
  1032. package/skills/security-best-practices/assets/icon-light.png +0 -0
  1033. package/skills/security-best-practices/references/golang-general-backend-security.md +988 -0
  1034. package/skills/security-best-practices/references/javascript-express-web-server-security.md +1151 -0
  1035. package/skills/security-best-practices/references/javascript-general-web-frontend-security.md +725 -0
  1036. package/skills/security-best-practices/references/javascript-jquery-web-frontend-security.md +672 -0
  1037. package/skills/security-best-practices/references/javascript-typescript-nextjs-web-server-security.md +1138 -0
  1038. package/skills/security-best-practices/references/javascript-typescript-react-web-frontend-security.md +975 -0
  1039. package/skills/security-best-practices/references/javascript-typescript-vue-web-frontend-security.md +789 -0
  1040. package/skills/security-best-practices/references/python-django-web-server-security.md +880 -0
  1041. package/skills/security-best-practices/references/python-fastapi-web-server-security.md +1030 -0
  1042. package/skills/security-best-practices/references/python-flask-web-server-security.md +835 -0
  1043. package/skills/security-ownership-map/LICENSE.txt +201 -0
  1044. package/skills/security-ownership-map/SKILL.md +212 -0
  1045. package/skills/security-ownership-map/agents/verdent.yaml +12 -0
  1046. package/skills/security-ownership-map/assets/icon-dark.png +0 -0
  1047. package/skills/security-ownership-map/assets/icon-light.png +0 -0
  1048. package/skills/security-ownership-map/references/neo4j-import.md +60 -0
  1049. package/skills/security-ownership-map/scripts/build_ownership_map.py +956 -0
  1050. package/skills/security-ownership-map/scripts/community_maintainers.py +544 -0
  1051. package/skills/security-ownership-map/scripts/query_ownership.py +483 -0
  1052. package/skills/security-ownership-map/scripts/run_ownership_map.py +200 -0
  1053. package/skills/security-threat-model/LICENSE.txt +201 -0
  1054. package/skills/security-threat-model/SKILL.md +94 -0
  1055. package/skills/security-threat-model/agents/verdent.yaml +7 -0
  1056. package/skills/security-threat-model/assets/icon-dark.png +0 -0
  1057. package/skills/security-threat-model/assets/icon-light.png +0 -0
  1058. package/skills/security-threat-model/references/prompt-template.md +254 -0
  1059. package/skills/security-threat-model/references/security-controls-and-assets.md +35 -0
  1060. package/skills/seo-audit/SKILL.md +527 -0
  1061. package/skills/seo-audit/evals/evals.json +136 -0
  1062. package/skills/seo-audit/references/ai-writing-detection.md +200 -0
  1063. package/skills/seo-audit/references/international-seo.md +230 -0
  1064. package/skills/sequential-thinking/SKILL.md +224 -0
  1065. package/skills/session-context-primer/SKILL.md +69 -0
  1066. package/skills/shipping-and-launch/SKILL.md +309 -0
  1067. package/skills/source-driven-development/SKILL.md +194 -0
  1068. package/skills/spec-writer/SKILL.md +200 -0
  1069. package/skills/speech/LICENSE.txt +201 -0
  1070. package/skills/speech/SKILL.md +150 -0
  1071. package/skills/speech/agents/verdent.yaml +12 -0
  1072. package/skills/speech/assets/icon-dark.png +0 -0
  1073. package/skills/speech/assets/icon-light.png +0 -0
  1074. package/skills/speech/assets/speech-small.svg +3 -0
  1075. package/skills/speech/assets/speech.png +0 -0
  1076. package/skills/speech/references/accessibility.md +32 -0
  1077. package/skills/speech/references/audio-api.md +31 -0
  1078. package/skills/speech/references/cli.md +99 -0
  1079. package/skills/speech/references/ivr.md +32 -0
  1080. package/skills/speech/references/narration.md +31 -0
  1081. package/skills/speech/references/network-notes.md +28 -0
  1082. package/skills/speech/references/prompting.md +38 -0
  1083. package/skills/speech/references/sample-prompts.md +44 -0
  1084. package/skills/speech/references/voice-directions.md +80 -0
  1085. package/skills/speech/references/voiceover.md +31 -0
  1086. package/skills/speech/scripts/text_to_speech.py +528 -0
  1087. package/skills/system-architect/SKILL.md +677 -0
  1088. package/skills/system-designer/SKILL.md +601 -0
  1089. package/skills/systematic-debugging/CREATION-LOG.md +119 -0
  1090. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  1091. package/skills/systematic-debugging/condition-based-waiting.md +115 -0
  1092. package/skills/systematic-debugging/defense-in-depth.md +122 -0
  1093. package/skills/systematic-debugging/find-polluter.sh +63 -0
  1094. package/skills/systematic-debugging/root-cause-tracing.md +169 -0
  1095. package/skills/systematic-debugging/test-academic.md +14 -0
  1096. package/skills/systematic-debugging/test-pressure-1.md +58 -0
  1097. package/skills/systematic-debugging/test-pressure-2.md +68 -0
  1098. package/skills/systematic-debugging/test-pressure-3.md +69 -0
  1099. package/skills/task-planner/SKILL.md +699 -0
  1100. package/skills/task-reviewer/SKILL.md +387 -0
  1101. package/skills/task-skill-router/SKILL.md +105 -0
  1102. package/skills/tech-evaluator/SKILL.md +181 -0
  1103. package/skills/tech-evaluator/references/ADR_TEMPLATE.md +80 -0
  1104. package/skills/tech-evaluator/scripts/evaluate_matrix.py +190 -0
  1105. package/skills/test-driven-development/SKILL.md +383 -0
  1106. package/skills/test-driven-development/testing-anti-patterns.md +299 -0
  1107. package/skills/theme-factory/LICENSE.txt +202 -0
  1108. package/skills/theme-factory/SKILL.md +64 -0
  1109. package/skills/theme-factory/agents/verdent.yaml +11 -0
  1110. package/skills/theme-factory/assets/icon-dark.png +0 -0
  1111. package/skills/theme-factory/assets/icon-light.png +0 -0
  1112. package/skills/theme-factory/theme-showcase.pdf +0 -0
  1113. package/skills/theme-factory/themes/arctic-frost.md +19 -0
  1114. package/skills/theme-factory/themes/botanical-garden.md +19 -0
  1115. package/skills/theme-factory/themes/desert-rose.md +19 -0
  1116. package/skills/theme-factory/themes/forest-canopy.md +19 -0
  1117. package/skills/theme-factory/themes/golden-hour.md +19 -0
  1118. package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  1119. package/skills/theme-factory/themes/modern-minimalist.md +19 -0
  1120. package/skills/theme-factory/themes/ocean-depths.md +19 -0
  1121. package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  1122. package/skills/theme-factory/themes/tech-innovation.md +19 -0
  1123. package/skills/transcribe/LICENSE.txt +201 -0
  1124. package/skills/transcribe/SKILL.md +86 -0
  1125. package/skills/transcribe/agents/verdent.yaml +12 -0
  1126. package/skills/transcribe/assets/icon-dark.png +0 -0
  1127. package/skills/transcribe/assets/icon-light.png +0 -0
  1128. package/skills/transcribe/assets/transcribe-small.svg +3 -0
  1129. package/skills/transcribe/assets/transcribe.png +0 -0
  1130. package/skills/transcribe/references/api.md +8 -0
  1131. package/skills/transcribe/scripts/transcribe_diarize.py +276 -0
  1132. package/skills/vercel-composition-patterns/FULL_GUIDE.md +946 -0
  1133. package/skills/vercel-composition-patterns/SKILL.md +92 -0
  1134. package/skills/vercel-composition-patterns/agents/verdent.yaml +12 -0
  1135. package/skills/vercel-composition-patterns/assets/icon-dark.png +0 -0
  1136. package/skills/vercel-composition-patterns/assets/icon-light.png +0 -0
  1137. package/skills/vercel-composition-patterns/rules/_sections.md +29 -0
  1138. package/skills/vercel-composition-patterns/rules/_template.md +24 -0
  1139. package/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  1140. package/skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
  1141. package/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  1142. package/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
  1143. package/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
  1144. package/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
  1145. package/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
  1146. package/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
  1147. package/skills/vercel-deploy/LICENSE.txt +21 -0
  1148. package/skills/vercel-deploy/SKILL.md +75 -0
  1149. package/skills/vercel-deploy/agents/verdent.yaml +7 -0
  1150. package/skills/vercel-deploy/assets/icon-dark.png +0 -0
  1151. package/skills/vercel-deploy/assets/icon-light.png +0 -0
  1152. package/skills/vercel-deploy/assets/vercel.png +0 -0
  1153. package/skills/vercel-deploy/scripts/deploy.sh +301 -0
  1154. package/skills/vercel-react-best-practices/FULL_GUIDE.md +3254 -0
  1155. package/skills/vercel-react-best-practices/SKILL.md +144 -0
  1156. package/skills/vercel-react-best-practices/agents/verdent.yaml +12 -0
  1157. package/skills/vercel-react-best-practices/assets/icon-dark.png +0 -0
  1158. package/skills/vercel-react-best-practices/assets/icon-light.png +0 -0
  1159. package/skills/vercel-react-best-practices/rules/_sections.md +46 -0
  1160. package/skills/vercel-react-best-practices/rules/_template.md +28 -0
  1161. package/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  1162. package/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  1163. package/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  1164. package/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  1165. package/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  1166. package/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  1167. package/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  1168. package/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  1169. package/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  1170. package/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  1171. package/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  1172. package/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  1173. package/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  1174. package/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  1175. package/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  1176. package/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  1177. package/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  1178. package/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  1179. package/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  1180. package/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  1181. package/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  1182. package/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  1183. package/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  1184. package/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
  1185. package/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  1186. package/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  1187. package/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  1188. package/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  1189. package/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  1190. package/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  1191. package/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  1192. package/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  1193. package/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  1194. package/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  1195. package/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  1196. package/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  1197. package/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  1198. package/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
  1199. package/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
  1200. package/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  1201. package/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  1202. package/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  1203. package/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  1204. package/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  1205. package/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  1206. package/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  1207. package/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  1208. package/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  1209. package/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  1210. package/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  1211. package/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
  1212. package/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  1213. package/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  1214. package/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  1215. package/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  1216. package/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  1217. package/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  1218. package/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  1219. package/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  1220. package/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +142 -0
  1221. package/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  1222. package/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  1223. package/skills/verdent-image-cli/SKILL.md +218 -0
  1224. package/skills/verdent-image-cli/agents/verdent.yaml +11 -0
  1225. package/skills/verdent-image-cli/assets/icon-dark.png +0 -0
  1226. package/skills/verdent-image-cli/assets/icon-light.png +0 -0
  1227. package/skills/verdent-skills-catalog/SKILL.md +72 -0
  1228. package/skills/verdent-skills-catalog/references/categories.json +158 -0
  1229. package/skills/verdent-skills-catalog/references/inventory.json +493 -0
  1230. package/skills/verification-before-completion/SKILL.md +139 -0
  1231. package/skills/web-quality-audit/SKILL.md +172 -0
  1232. package/skills/web-quality-audit/scripts/analyze.sh +113 -0
  1233. package/skills/webapp-testing/LICENSE.txt +202 -0
  1234. package/skills/webapp-testing/SKILL.md +302 -0
  1235. package/skills/webapp-testing/examples/console_logging.py +35 -0
  1236. package/skills/webapp-testing/examples/element_discovery.py +40 -0
  1237. package/skills/webapp-testing/examples/static_html_automation.py +33 -0
  1238. package/skills/webapp-testing/scripts/with_server.py +110 -0
  1239. package/skills/workers-best-practices/SKILL.md +132 -0
  1240. package/skills/workers-best-practices/agents/verdent.yaml +11 -0
  1241. package/skills/workers-best-practices/assets/icon-dark.png +0 -0
  1242. package/skills/workers-best-practices/assets/icon-light.png +0 -0
  1243. package/skills/workers-best-practices/references/review.md +174 -0
  1244. package/skills/workers-best-practices/references/rules.md +463 -0
  1245. package/skills/xlsx/SKILL.md +318 -0
  1246. package/skills/xlsx/agents/verdent.yaml +9 -0
  1247. package/skills/xlsx/assets/icon-dark.png +0 -0
  1248. package/skills/xlsx/assets/icon-light.png +0 -0
  1249. package/skills/xlsx/assets/spreadsheet.png +0 -0
  1250. package/skills/xlsx/references/advanced-analysis.md +272 -0
  1251. package/skills/xlsx/references/examples/openpyxl/create_basic_spreadsheet.py +51 -0
  1252. package/skills/xlsx/references/examples/openpyxl/create_spreadsheet_with_styling.py +96 -0
  1253. package/skills/xlsx/references/examples/openpyxl/read_existing_spreadsheet.py +59 -0
  1254. package/skills/xlsx/references/examples/openpyxl/styling_spreadsheet.py +79 -0
  1255. package/skills/xlsx/scripts/formula_engine.py +219 -0
  1256. package/skills/xlsx/scripts/profile.py +62 -0
  1257. package/src/commands/init.js +27 -3
  1258. package/src/commands/pipeline.js +31 -0
  1259. package/src/commands/recover.js +62 -0
  1260. package/src/commands/route.js +7 -0
  1261. package/src/commands/scaffold.js +7 -1
  1262. package/src/commands/skill.js +114 -0
  1263. package/src/commands/ui.js +50 -0
  1264. package/src/commands/upgrade.js +2 -2
  1265. package/src/lib/capability-router.js +4 -3
  1266. package/src/lib/contract.js +49 -0
  1267. package/src/lib/disabled-skills.js +86 -0
  1268. package/src/lib/doctor.js +32 -1
  1269. package/src/lib/env-flags.js +35 -0
  1270. package/src/lib/execution-policy.js +78 -4
  1271. package/src/lib/explanation.js +159 -0
  1272. package/src/lib/ide-sync.js +4 -3
  1273. package/src/lib/pipeline.js +68 -0
  1274. package/src/lib/recover.js +93 -0
  1275. package/src/lib/registry.js +79 -0
  1276. package/src/lib/route-engine.js +21 -1
  1277. package/src/lib/scaffold/index.js +23 -7
  1278. package/src/lib/scaffold/presets.js +200 -31
  1279. package/src/lib/ui-server.js +139 -0
  1280. package/src/lib/upgrade-matrix.js +16 -1
  1281. package/src/lib/workspace-boundary.js +60 -0
  1282. package/templates/minimal/AGENT.md +10 -1
  1283. package/templates/minimal/GUNLUK.md +12 -0
  1284. package/templates/minimal/docs/conventions/daily-use.md +130 -0
  1285. package/templates/minimal/docs/conventions/task-to-capability-cheatsheet.md +29 -0
  1286. package/templates/minimal/docs/kullanim-kilavuzu.md +374 -0
  1287. package/ui/app.js +167 -0
  1288. package/ui/index.html +75 -0
  1289. package/ui/styles.css +227 -0
  1290. package/workflows/audit.md +143 -0
  1291. package/workflows/blueprint.md +374 -0
  1292. package/workflows/challenge.md +322 -0
  1293. package/workflows/change.md +162 -0
  1294. package/workflows/craft.md +135 -0
  1295. package/workflows/design-system.md +248 -0
  1296. package/workflows/explore.md +226 -0
  1297. package/workflows/forge.md +570 -34
  1298. package/workflows/genesis.md +307 -0
  1299. package/workflows/ingest.md +145 -0
  1300. package/workflows/init.md +216 -0
  1301. package/workflows/probe.md +181 -0
  1302. package/workflows/query-to-page.md +134 -0
  1303. package/workflows/quickstart.md +111 -0
  1304. package/workflows/retro.md +78 -0
  1305. package/workflows/upgrade.md +146 -0
  1306. package/workflows/wiki-lint.md +159 -0
  1307. package/templates/bundle/skills/capability-router/SKILL.md +0 -12
  1308. package/templates/bundle/skills/context-memory-bridge/SKILL.md +0 -17
  1309. package/templates/bundle/skills/localization-hub/SKILL.md +0 -17
  1310. package/templates/bundle/skills/refactor/SKILL.md +0 -17
  1311. package/templates/bundle/skills/systematic-debugging/SKILL.md +0 -19
  1312. package/templates/bundle/workflows/forge.md +0 -51
@@ -0,0 +1,2216 @@
1
+ # Redis Development
2
+
3
+ **Version 1.0.0**
4
+ Redis, Inc.
5
+ January 2026
6
+
7
+ > **Note:**
8
+ > This document is mainly for agents and LLMs to follow when maintaining,
9
+ > generating, or refactoring Redis applications. Humans
10
+ > may also find it useful, but guidance here is optimized for automation
11
+ > and consistency by AI-assisted workflows.
12
+
13
+ ---
14
+
15
+ ## Abstract
16
+
17
+ Best practices for Redis including data structures, memory management, Redis Query Engine (RQE), vector search with RedisVL, semantic caching with LangCache, and performance optimization. Optimized for AI agents and LLMs.
18
+
19
+ ---
20
+
21
+ ## Table of Contents
22
+
23
+ 1. [Data Structures & Keys](#1-data-structures--keys) — **HIGH**
24
+ - 1.1 [Choose the Right Data Structure](#11-choose-the-right-data-structure)
25
+ - 1.2 [Use Consistent Key Naming Conventions](#12-use-consistent-key-naming-conventions)
26
+ - 1.3 [Use Hash Field Expiration for Per-Field TTL](#13-use-hash-field-expiration-for-per-field-ttl)
27
+ - 1.4 [Use INCR for Atomic Counters](#14-use-incr-for-atomic-counters)
28
+ - 1.5 [Use Transactions for Atomic Multi-Command Operations](#15-use-transactions-for-atomic-multi-command-operations)
29
+ 2. [Memory & Expiration](#2-memory--expiration) — **HIGH**
30
+ - 2.1 [Configure Memory Limits and Eviction Policies](#21-configure-memory-limits-and-eviction-policies)
31
+ - 2.2 [Set TTL on Cache Keys](#22-set-ttl-on-cache-keys)
32
+ 3. [Connection & Performance](#3-connection--performance) — **HIGH**
33
+ - 3.1 [Avoid Slow Commands in Production](#31-avoid-slow-commands-in-production)
34
+ - 3.2 [Configure Connection Timeouts](#32-configure-connection-timeouts)
35
+ - 3.3 [Use Client-Side Caching for Frequently Read Data](#33-use-client-side-caching-for-frequently-read-data)
36
+ - 3.4 [Use Connection Pooling or Multiplexing](#34-use-connection-pooling-or-multiplexing)
37
+ - 3.5 [Use Pipelining for Bulk Operations](#35-use-pipelining-for-bulk-operations)
38
+ 4. [JSON Documents](#4-json-documents) — **MEDIUM**
39
+ - 4.1 [Choose JSON vs Hash vs String Appropriately](#41-choose-json-vs-hash-vs-string-appropriately)
40
+ - 4.2 [Use JSON Paths for Partial Updates](#42-use-json-paths-for-partial-updates)
41
+ 5. [Redis Query Engine](#5-redis-query-engine) — **HIGH**
42
+ - 5.1 [Choose the Correct Field Type](#51-choose-the-correct-field-type)
43
+ - 5.2 [Index Only Fields You Query](#52-index-only-fields-you-query)
44
+ - 5.3 [Manage Indexes for Zero-Downtime Updates](#53-manage-indexes-for-zero-downtime-updates)
45
+ - 5.4 [Use DIALECT 2 for Query Syntax](#54-use-dialect-2-for-query-syntax)
46
+ - 5.5 [Use SKIPINITIALSCAN for New Data Only Indexes](#55-use-skipinitialscan-for-new-data-only-indexes)
47
+ - 5.6 [Write Efficient Queries](#56-write-efficient-queries)
48
+ 6. [Vector Search & RedisVL](#6-vector-search--redisvl) — **HIGH**
49
+ - 6.1 [Choose HNSW vs FLAT Based on Requirements](#61-choose-hnsw-vs-flat-based-on-requirements)
50
+ - 6.2 [Configure Vector Indexes Properly](#62-configure-vector-indexes-properly)
51
+ - 6.3 [Implement RAG Pattern Correctly](#63-implement-rag-pattern-correctly)
52
+ - 6.4 [Use Hybrid Search for Better Results](#64-use-hybrid-search-for-better-results)
53
+ 7. [Semantic Caching](#7-semantic-caching) — **MEDIUM**
54
+ - 7.1 [Configure Semantic Cache Properly](#71-configure-semantic-cache-properly)
55
+ - 7.2 [Use LangCache for LLM Response Caching](#72-use-langcache-for-llm-response-caching)
56
+ 8. [Streams & Pub/Sub](#8-streams--pub/sub) — **MEDIUM**
57
+ - 8.1 [Choose Streams vs Pub/Sub Appropriately](#81-choose-streams-vs-pubsub-appropriately)
58
+ 9. [Clustering & Replication](#9-clustering--replication) — **MEDIUM**
59
+ - 9.1 [Use Hash Tags for Multi-Key Operations](#91-use-hash-tags-for-multi-key-operations)
60
+ - 9.2 [Use Read Replicas for Read-Heavy Workloads](#92-use-read-replicas-for-read-heavy-workloads)
61
+ 10. [Security](#10-security) — **HIGH**
62
+ - 10.1 [Always Use Authentication in Production](#101-always-use-authentication-in-production)
63
+ - 10.2 [Secure Network Access](#102-secure-network-access)
64
+ - 10.3 [Use ACLs for Fine-Grained Access Control](#103-use-acls-for-fine-grained-access-control)
65
+ 11. [Observability](#11-observability) — **MEDIUM**
66
+ - 11.1 [Monitor Key Redis Metrics](#111-monitor-key-redis-metrics)
67
+ - 11.2 [Use Observability Commands for Debugging](#112-use-observability-commands-for-debugging)
68
+
69
+ ---
70
+
71
+ ## 1. Data Structures & Keys
72
+
73
+ **Impact: HIGH**
74
+
75
+ Choosing the right Redis data type and key naming conventions. Foundation for efficient Redis usage.
76
+
77
+ ### 1.1 Choose the Right Data Structure
78
+
79
+ **Impact: HIGH (Optimal memory usage and operation performance)**
80
+
81
+ Selecting the appropriate Redis data type for your use case is fundamental to performance and memory efficiency.
82
+
83
+ | Use Case | Recommended Type | Why |
84
+ |----------|------------------|-----|
85
+ | Simple values, counters | String | Fast, atomic operations |
86
+ | Object with fields | Hash | Memory efficient, partial updates, field-level expiration |
87
+ | Queue, recent items | List | O(1) push/pop at ends |
88
+ | Unique items, membership | Set | O(1) add/remove/check |
89
+ | Rankings, ranges | Sorted Set | Score-based ordering |
90
+ | Nested/hierarchical data | JSON | Path queries, nested structures, geospatial indexing with RQE |
91
+ | Event logs, messaging | Stream | Persistent, consumer groups |
92
+ | Similarity search | Vector Set | Native vector storage with built-in HNSW indexing |
93
+
94
+ **Incorrect: Using strings for everything.**
95
+
96
+ **Python** (redis-py):**
97
+
98
+ ```python
99
+ # Storing object as JSON string loses atomic field updates
100
+ redis.set("user:1001", json.dumps({"name": "Alice", "email": "alice@example.com"}))
101
+
102
+ # To update email, must fetch, parse, modify, and rewrite entire object
103
+ user = json.loads(redis.get("user:1001"))
104
+ user["email"] = "new@example.com"
105
+ redis.set("user:1001", json.dumps(user))
106
+ ```
107
+
108
+ **Java** (Jedis):**
109
+
110
+ ```java
111
+ // Bad: Storing as delimited string requires manual parsing
112
+ jedis.set("bicycle", "Deimos;Ergonom;Enduro bikes;4972");
113
+ String bike = jedis.get("bicycle");
114
+ String[] fields = bike.split(";");
115
+ String model = fields[0]; // Fragile and error-prone
116
+ ```
117
+
118
+ **Correct: Use Hash for objects with fields.**
119
+
120
+ **Python** (redis-py):**
121
+
122
+ ```python
123
+ # Hash allows atomic field updates
124
+ redis.hset("user:1001", mapping={"name": "Alice", "email": "alice@example.com"})
125
+
126
+ # Update single field without touching others
127
+ redis.hset("user:1001", "email", "new@example.com")
128
+ ```
129
+
130
+ **Java** (Jedis):**
131
+
132
+ ```java
133
+ import java.util.Map;
134
+ import java.util.HashMap;
135
+
136
+ // Good: Hash models properties naturally
137
+ Map<String, String> hashFields = new HashMap<>();
138
+ hashFields.put("model", "Deimos");
139
+ hashFields.put("brand", "Ergonom");
140
+ hashFields.put("type", "Enduro bikes");
141
+ hashFields.put("price", "4972");
142
+
143
+ jedis.hset("bicycle", hashFields);
144
+
145
+ // Read individual field
146
+ String model = jedis.hget("bicycle", "model");
147
+ ```
148
+
149
+ Reference: [https://redis.io/docs/latest/develop/data-types/compare-data-types/](https://redis.io/docs/latest/develop/data-types/compare-data-types/)
150
+
151
+ ### 1.2 Use Consistent Key Naming Conventions
152
+
153
+ **Impact: MEDIUM (Improved maintainability and debugging)**
154
+
155
+ Well-structured key names improve code maintainability, debugging, and enable efficient key scanning.
156
+
157
+ **Correct: Use colons as separators with a consistent hierarchy.**
158
+
159
+ ```python
160
+ # Pattern: service:entity:id:attribute
161
+ user:1001:profile
162
+ user:1001:settings
163
+ order:2024:items
164
+ cache:api:users:list
165
+ session:abc123
166
+ ```
167
+
168
+ **Python** (redis-py):**
169
+
170
+ ```python
171
+ # Good: Short, meaningful key
172
+ redis.set("product:8361", cached_html)
173
+ page = redis.get("product:8361")
174
+ ```
175
+
176
+ **Java** (Jedis):**
177
+
178
+ ```java
179
+ // Good: Short, meaningful key derived from URL
180
+ jedis.set("product:8361", "<some cached HTML>");
181
+ String page = jedis.get("product:8361");
182
+ ```
183
+
184
+ **Incorrect: Inconsistent naming, spaces, or very long keys.**
185
+
186
+ ```python
187
+ # These cause confusion and waste memory
188
+ User_1001_Profile
189
+ my key with spaces
190
+ com.mycompany.myapp.production.users.profile.data.1001
191
+ ```
192
+
193
+ **Java** (Jedis):**
194
+
195
+ ```java
196
+ // Bad: Using full URL as key wastes memory and slows comparisons
197
+ jedis.set("http://www.verylongurlkey.com/store/products/product.html?id=8361",
198
+ "<some cached HTML>");
199
+ ```
200
+
201
+ **Key naming tips:**
202
+
203
+ - Keep keys short but readable—they consume memory
204
+
205
+ - Consider key prefixes for multi-tenant applications
206
+
207
+ - Extract short identifiers from URLs or long strings rather than using the whole thing
208
+
209
+ - For large binary values, consider using a hash digest as the key instead of the value itself
210
+
211
+ - Use consistent separators (colons are conventional)
212
+
213
+ Reference: [https://redis.io/docs/latest/develop/use/keyspace/](https://redis.io/docs/latest/develop/use/keyspace/)
214
+
215
+ ### 1.3 Use Hash Field Expiration for Per-Field TTL
216
+
217
+ **Impact: MEDIUM (Fine-grained expiration without managing timers)**
218
+
219
+ Use hash field expiration (Redis 7.4+) to delete individual fields automatically from a hash after a specific period of time. This is useful for caching scenarios where different fields have different lifetimes, and is easier than managing expiration from your own code.
220
+
221
+ **Correct: Use HEXPIRE to set per-field TTL on hash fields.**
222
+
223
+ **Python** (redis-py):**
224
+
225
+ ```python
226
+ import redis
227
+
228
+ client = redis.Redis(host='localhost', port=6379)
229
+
230
+ # Set hash fields
231
+ client.hset("sensor:sensor1", mapping={
232
+ "air_quality": "256",
233
+ "battery_level": "89"
234
+ })
235
+
236
+ # Set 60-second TTL on specific fields (Redis 7.4+)
237
+ client.hexpire("sensor:sensor1", 60, "air_quality", "battery_level")
238
+ ```
239
+
240
+ **Java** (Jedis):**
241
+
242
+ ```java
243
+ import redis.clients.jedis.UnifiedJedis;
244
+ import java.util.Map;
245
+ import java.util.HashMap;
246
+
247
+ try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
248
+ Map<String, String> hashFields = new HashMap<>();
249
+ hashFields.put("air_quality", "256");
250
+ hashFields.put("battery_level", "89");
251
+
252
+ jedis.hset("sensor:sensor1", hashFields);
253
+
254
+ // Set 60-second TTL on specific fields (Redis 7.4+)
255
+ jedis.hexpire("sensor:sensor1", 60, "air_quality", "battery_level");
256
+ }
257
+ ```
258
+
259
+ **When to use:**
260
+
261
+ - Sensor data or metrics that become stale after a period
262
+
263
+ - Session attributes where different fields have different lifetimes
264
+
265
+ - Cached values within a hash that should auto-expire independently
266
+
267
+ - Temporary flags or tokens stored alongside persistent data
268
+
269
+ **When NOT needed:**
270
+
271
+ - Persistent user profiles or configuration
272
+
273
+ - Data where the entire hash should expire together (use `EXPIRE` on the key instead)
274
+
275
+ - Fields managed by application logic with explicit deletion
276
+
277
+ Reference: [https://redis.io/docs/latest/commands/hexpire/](https://redis.io/docs/latest/commands/hexpire/)
278
+
279
+ ### 1.4 Use INCR for Atomic Counters
280
+
281
+ **Impact: MEDIUM (Atomic increment avoids race conditions)**
282
+
283
+ If a string represents an integer value, use the `INCR` command to increment the number directly. The increment is atomic and always returns the new value. Use `INCRBY` to increment by any integer (positive or negative). This is more efficient and race-condition-free than reading, incrementing in code, and writing back.
284
+
285
+ **Correct: Use INCR/INCRBY for atomic counter updates.**
286
+
287
+ **Python** (redis-py):**
288
+
289
+ ```python
290
+ import redis
291
+
292
+ client = redis.Redis(host='localhost', port=6379)
293
+
294
+ # Initialize counter
295
+ client.set("counter", "0")
296
+
297
+ # Atomic increment - returns new value
298
+ new_value = client.incr("counter") # Returns 1
299
+
300
+ # Increment by specific amount
301
+ new_value = client.incrby("counter", 10) # Returns 11
302
+ ```
303
+
304
+ **Java** (Jedis):**
305
+
306
+ ```java
307
+ import redis.clients.jedis.UnifiedJedis;
308
+
309
+ try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
310
+ jedis.set("counter", "0");
311
+
312
+ // Atomic increment - returns new value
313
+ long newValue = jedis.incr("counter"); // Returns 1
314
+
315
+ // Increment by specific amount
316
+ newValue = jedis.incrBy("counter", 10); // Returns 11
317
+ }
318
+ ```
319
+
320
+ **Incorrect: Read-modify-write pattern creates race conditions.**
321
+
322
+ **Python** (redis-py):**
323
+
324
+ ```python
325
+ import redis
326
+
327
+ client = redis.Redis(host='localhost', port=6379)
328
+
329
+ client.set("counter", "0")
330
+
331
+ # BAD: Race condition - another client could modify between GET and SET
332
+ curr_value = int(client.get("counter"))
333
+ client.set("counter", str(curr_value + 1)) # Not atomic!
334
+ ```
335
+
336
+ **Java** (Jedis):**
337
+
338
+ ```java
339
+ import redis.clients.jedis.UnifiedJedis;
340
+
341
+ try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
342
+ jedis.set("counter", "0");
343
+
344
+ // BAD: Race condition between GET and SET
345
+ long currValue = Long.parseLong(jedis.get("counter"));
346
+ jedis.set("counter", Long.toString(currValue + 1)); // Not atomic!
347
+ }
348
+ ```
349
+
350
+ Reference: [https://redis.io/docs/latest/commands/incr/](https://redis.io/docs/latest/commands/incr/)
351
+
352
+ ### 1.5 Use Transactions for Atomic Multi-Command Operations
353
+
354
+ **Impact: MEDIUM (Prevents race conditions and data inconsistency)**
355
+
356
+ Use the `MULTI`/`EXEC` commands to create a transaction when you need to execute multiple commands atomically. No other client requests will be processed while the transaction is executing, preventing other clients from modifying the keys used in the transaction and avoiding inconsistent data.
357
+
358
+ **Correct: Use transactions when multiple related keys must be updated together.**
359
+
360
+ **Python** (redis-py):**
361
+
362
+ ```python
363
+ import redis
364
+
365
+ client = redis.Redis(host='localhost', port=6379)
366
+
367
+ # Transaction ensures all commands execute atomically
368
+ pipe = client.pipeline(transaction=True)
369
+ pipe.set("person:1:name", "Alex")
370
+ pipe.set("person:1:rank", "Captain")
371
+ pipe.set("person:1:serial", "AB1234")
372
+ pipe.execute() # All commands execute as one atomic unit
373
+ ```
374
+
375
+ **Java** (Jedis):**
376
+
377
+ ```java
378
+ import redis.clients.jedis.UnifiedJedis;
379
+ import redis.clients.jedis.Transaction;
380
+
381
+ try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
382
+ Transaction tran = (Transaction) jedis.multi();
383
+
384
+ tran.set("person:1:name", "Alex");
385
+ tran.set("person:1:rank", "Captain");
386
+ tran.set("person:1:serial", "AB1234");
387
+
388
+ tran.exec(); // All commands execute atomically
389
+ }
390
+ ```
391
+
392
+ **Incorrect: Executing related commands individually when atomicity is required.**
393
+
394
+ **Python** (redis-py):**
395
+
396
+ ```python
397
+ import redis
398
+
399
+ client = redis.Redis(host='localhost', port=6379)
400
+
401
+ # BAD when atomicity matters - another client could read partial state
402
+ client.set("person:1:name", "Alex")
403
+ # Another client could read here and see incomplete data
404
+ client.set("person:1:rank", "Captain")
405
+ client.set("person:1:serial", "AB1234")
406
+ ```
407
+
408
+ **When to use transactions:**
409
+
410
+ - Multiple keys must be updated as a single atomic unit
411
+
412
+ - Other clients reading partial state would cause bugs
413
+
414
+ - Implementing patterns like "transfer balance between accounts"
415
+
416
+ **When transactions are NOT needed:**
417
+
418
+ - Independent operations that don't need to be atomic
419
+
420
+ - Single-command operations (already atomic)
421
+
422
+ - When using pipelining purely for performance (use `pipeline(transaction=False)`)
423
+
424
+ **Note: Transactions add overhead. Only use them when atomicity is actually required.**
425
+
426
+ Reference: [https://redis.io/docs/latest/develop/interact/transactions/](https://redis.io/docs/latest/develop/interact/transactions/)
427
+
428
+ ---
429
+
430
+ ## 2. Memory & Expiration
431
+
432
+ **Impact: HIGH**
433
+
434
+ Memory limits, eviction policies, TTL strategies, and memory optimization techniques.
435
+
436
+ ### 2.1 Configure Memory Limits and Eviction Policies
437
+
438
+ **Impact: HIGH (Prevents out-of-memory crashes and unpredictable behavior)**
439
+
440
+ Always configure `maxmemory` and an eviction policy to prevent Redis from consuming all available memory.
441
+
442
+ **Correct: Set explicit memory limits.**
443
+
444
+ ```python
445
+ maxmemory 2gb
446
+ maxmemory-policy allkeys-lru
447
+ ```
448
+
449
+ | Policy | Use Case |
450
+ |--------|----------|
451
+ | `volatile-lru` | Evict keys with TTL, least recently used first |
452
+ | `allkeys-lru` | Evict any key, least recently used first |
453
+ | `volatile-ttl` | Evict keys closest to expiration |
454
+ | `noeviction` | Return errors when memory is full (use for critical data) |
455
+
456
+ **Incorrect: Running Redis without memory limits.**
457
+
458
+ ```python
459
+ # No maxmemory set - Redis will use all available RAM
460
+ # Can cause OOM killer to terminate Redis or other processes
461
+ ```
462
+
463
+ **Memory optimization tips:**
464
+
465
+ - Use Hashes for small objects (more memory-efficient than separate keys)
466
+
467
+ - Use `OBJECT ENCODING key` to check how Redis stores your data
468
+
469
+ - Use `MEMORY USAGE key` to check individual key memory consumption
470
+
471
+ - Enable compression in your client for large values
472
+
473
+ Reference: [https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/memory-optimization/](https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/memory-optimization/)
474
+
475
+ ### 2.2 Set TTL on Cache Keys
476
+
477
+ **Impact: HIGH (Prevents unbounded memory growth)**
478
+
479
+ Always set expiration times on cache keys to prevent unbounded memory growth.
480
+
481
+ **Correct: Set TTL at write time.**
482
+
483
+ **Python** (redis-py):**
484
+
485
+ ```python
486
+ # Good: TTL set atomically with the value
487
+ redis.setex("cache:user:1001", 3600, user_json)
488
+
489
+ # Good: For hashes, set TTL after
490
+ redis.hset("session:abc", mapping=session_data)
491
+ redis.expire("session:abc", 1800)
492
+ ```
493
+
494
+ **Java** (Jedis):**
495
+
496
+ ```java
497
+ import redis.clients.jedis.params.SetParams;
498
+
499
+ // Good: TTL set atomically with SetParams
500
+ jedis.set("cachedItem:1", "fe8c357903ac9", new SetParams().ex(120));
501
+ ```
502
+
503
+ **Incorrect: Forgetting TTL on cache keys.**
504
+
505
+ **Python** (redis-py):**
506
+
507
+ ```python
508
+ # Risk: This key may live forever
509
+ redis.set("cache:user:1001", user_json)
510
+ ```
511
+
512
+ **Java** (Jedis):**
513
+
514
+ ```java
515
+ // Risk: This key may live forever
516
+ jedis.set("cachedItem:1", "fe8c357903ac9");
517
+ ```
518
+
519
+ **TTL strategies:**
520
+
521
+ - Cache data: 1-24 hours depending on freshness requirements
522
+
523
+ - Sessions: 30 minutes to 24 hours
524
+
525
+ - Rate limiting: Seconds to minutes
526
+
527
+ - Temporary locks: Seconds with automatic release
528
+
529
+ Reference: [https://redis.io/commands/expire/](https://redis.io/commands/expire/)
530
+
531
+ ---
532
+
533
+ ## 3. Connection & Performance
534
+
535
+ **Impact: HIGH**
536
+
537
+ Connection pooling, pipelining, timeouts, and avoiding blocking commands.
538
+
539
+ ### 3.1 Avoid Slow Commands in Production
540
+
541
+ **Impact: HIGH (Prevents Redis from becoming unresponsive)**
542
+
543
+ Some Redis commands are slow because they scan large datasets. Use incremental alternatives to avoid blocking the server.
544
+
545
+ | Avoid | Use Instead |
546
+ |-------|-------------|
547
+ | `KEYS *` | `SCAN` with cursor |
548
+ | `SMEMBERS` on large sets | `SSCAN` |
549
+ | `HGETALL` on large hashes | `HSCAN` |
550
+ | `LRANGE 0 -1` on large lists | Paginate with `LRANGE 0 100` |
551
+
552
+ **Correct: Use SCAN for iteration.**
553
+
554
+ **Python** (redis-py):**
555
+
556
+ ```python
557
+ # Good: Non-blocking iteration
558
+ cursor = 0
559
+ while True:
560
+ cursor, keys = redis.scan(cursor, match="user:*", count=100)
561
+ for key in keys:
562
+ process(key)
563
+ if cursor == 0:
564
+ break
565
+ ```
566
+
567
+ **Java** (Jedis):**
568
+
569
+ ```java
570
+ import redis.clients.jedis.ScanIteration;
571
+ import redis.clients.jedis.UnifiedJedis;
572
+ import java.util.List;
573
+
574
+ try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
575
+ // ScanIteration manages the cursor automatically
576
+ ScanIteration scan = jedis.scanIteration(10, "user:*", "hash");
577
+
578
+ while (!scan.isIterationCompleted()) {
579
+ List<String> result = scan.nextBatch().getResult();
580
+ for (String key : result) {
581
+ process(key);
582
+ }
583
+ }
584
+ }
585
+ ```
586
+
587
+ **Incorrect: Using KEYS in production.**
588
+
589
+ **Python** (redis-py):**
590
+
591
+ ```python
592
+ # Bad: Scans all keys, slow on large datasets
593
+ keys = redis.keys("user:*")
594
+ ```
595
+
596
+ **Java** (Jedis):**
597
+
598
+ ```java
599
+ // Bad: Scans all keys, blocks the server
600
+ Set<String> result = jedis.keys("*");
601
+ ```
602
+
603
+ **Note: Truly blocking commands (like `BLPOP`, `BRPOP`, `BLMOVE`) that wait indefinitely for data are appropriate for some use cases like job queues, but should be used with timeouts.**
604
+
605
+ ```python
606
+ # Blocking pop with timeout - appropriate for queue consumers
607
+ result = redis.blpop("task_queue", timeout=5)
608
+ ```
609
+
610
+ Reference: [https://redis.io/docs/latest/commands/scan/](https://redis.io/docs/latest/commands/scan/)
611
+
612
+ ### 3.2 Configure Connection Timeouts
613
+
614
+ **Impact: MEDIUM (Improves connection resilience and failure recovery)**
615
+
616
+ Configure appropriate timeout values to improve your application's connection resilience. While most Redis clients set default timeouts, choosing well-tuned values based on your application's usage patterns leads to better failure recovery.
617
+
618
+ **Correct: Set timeouts based on your application needs.**
619
+
620
+ ```python
621
+ r = redis.Redis(
622
+ host='localhost',
623
+ socket_timeout=5.0, # Read/write timeout - tune based on expected operation time
624
+ socket_connect_timeout=2.0, # Connection timeout - shorter for fast failure detection
625
+ retry_on_timeout=True # Automatic retry on timeout
626
+ )
627
+ ```
628
+
629
+ **Incorrect: Relying solely on defaults without considering your use case.**
630
+
631
+ ```python
632
+ # Not ideal: Default timeouts may not match your application's needs
633
+ r = redis.Redis(host='localhost')
634
+
635
+ # For example, if your app needs fast failure detection,
636
+ # the default timeouts might be too generous
637
+ ```
638
+
639
+ **Considerations:**
640
+
641
+ - Set `socket_connect_timeout` shorter than `socket_timeout` for quick connection failure detection
642
+
643
+ - For latency-sensitive apps, use tighter timeouts with retry logic
644
+
645
+ - For batch operations, allow longer timeouts to complete large operations
646
+
647
+ - Consider using health checks alongside timeouts for robust failure handling
648
+
649
+ Reference: [https://redis.io/docs/latest/develop/clients/](https://redis.io/docs/latest/develop/clients/)
650
+
651
+ ### 3.3 Use Client-Side Caching for Frequently Read Data
652
+
653
+ **Impact: HIGH (Reduces network round-trips for repeated reads)**
654
+
655
+ Use a connection with client-side caching enabled for any data that will be read frequently but written only occasionally. Client-side caching avoids contacting the server for repeated access to data that has recently been read, reducing network traffic and improving performance.
656
+
657
+ **Correct: Enable client-side caching with RESP3 protocol for frequently accessed data.**
658
+
659
+ **Python** (redis-py):**
660
+
661
+ ```python
662
+ import redis
663
+
664
+ # Enable client-side caching with RESP3
665
+ client = redis.Redis(
666
+ host='localhost',
667
+ port=6379,
668
+ protocol=3, # RESP3 required for client-side caching
669
+ cache_config=redis.CacheConfig(max_size=1000)
670
+ )
671
+
672
+ # Cached reads avoid server round-trips
673
+ value = client.get("frequently:read:key")
674
+ ```
675
+
676
+ **Java** (Jedis):**
677
+
678
+ ```java
679
+ import redis.clients.jedis.DefaultJedisClientConfig;
680
+ import redis.clients.jedis.UnifiedJedis;
681
+ import redis.clients.jedis.HostAndPort;
682
+ import redis.clients.jedis.CacheConfig;
683
+
684
+ HostAndPort endpoint = new HostAndPort("localhost", 6379);
685
+
686
+ DefaultJedisClientConfig config = DefaultJedisClientConfig
687
+ .builder()
688
+ .password("secretPassword")
689
+ .protocol(RedisProtocol.RESP3)
690
+ .build();
691
+
692
+ CacheConfig cacheConfig = CacheConfig.builder().maxSize(1000).build();
693
+
694
+ UnifiedJedis client = new UnifiedJedis(endpoint, config, cacheConfig);
695
+ ```
696
+
697
+ **When to use:**
698
+
699
+ - Configuration data read frequently, updated rarely
700
+
701
+ - User session data accessed on every request
702
+
703
+ - Feature flags or settings checked repeatedly
704
+
705
+ - Any read-heavy workload with low write frequency
706
+
707
+ **When NOT needed:**
708
+
709
+ - Data that changes frequently (cache invalidation overhead outweighs benefits)
710
+
711
+ - Write-heavy workloads
712
+
713
+ - Simple applications where network latency is not a bottleneck
714
+
715
+ - When you need guaranteed real-time consistency
716
+
717
+ **Trade-offs:**
718
+
719
+ - Adds memory overhead on the client
720
+
721
+ - Requires RESP3 protocol
722
+
723
+ - Cache invalidation adds complexity for frequently changing data
724
+
725
+ Reference: [https://redis.io/docs/latest/develop/clients/client-side-caching/](https://redis.io/docs/latest/develop/clients/client-side-caching/)
726
+
727
+ ### 3.4 Use Connection Pooling or Multiplexing
728
+
729
+ **Impact: HIGH (Reduces connection overhead by 10x or more)**
730
+
731
+ Reuse connections via a pool or multiplexing instead of creating new connections per request.
732
+
733
+ **Correct: Use a connection pool.**
734
+
735
+ **Python** (redis-py):**
736
+
737
+ ```python
738
+ import redis
739
+
740
+ # Good: Connection pool - reuses existing connections
741
+ pool = redis.ConnectionPool(host='localhost', port=6379, max_connections=50)
742
+ r = redis.Redis(connection_pool=pool)
743
+ ```
744
+
745
+ **Java** (Jedis):**
746
+
747
+ ```java
748
+ import redis.clients.jedis.JedisPooled;
749
+
750
+ // JedisPooled manages a connection pool internally
751
+ try (JedisPooled jedis = new JedisPooled("redis://localhost:6379")) {
752
+ jedis.set("testKey", "testValue");
753
+ }
754
+ ```
755
+
756
+ **Correct: Use multiplexing (Lettuce, NRedisStack).**
757
+
758
+ ```java
759
+ // Lettuce uses multiplexing by default - single connection handles all traffic
760
+ RedisClient client = RedisClient.create("redis://localhost:6379");
761
+ StatefulRedisConnection<String, String> connection = client.connect();
762
+
763
+ // All commands share the single connection efficiently
764
+ connection.sync().set("key", "value");
765
+ ```
766
+
767
+ **Incorrect: Creating new connections per request.**
768
+
769
+ **Python** (redis-py):**
770
+
771
+ ```python
772
+ # Bad: New connection every time
773
+ def get_user(user_id):
774
+ r = redis.Redis(host='localhost', port=6379) # Don't do this
775
+ return r.get(f"user:{user_id}")
776
+ ```
777
+
778
+ **Java** (Jedis):**
779
+
780
+ ```java
781
+ // Bad: Creating new client per request
782
+ public String getUser(String userId) {
783
+ try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
784
+ return jedis.get("user:" + userId); // Don't do this
785
+ }
786
+ }
787
+ ```
788
+
789
+ **Pooling vs Multiplexing:**
790
+
791
+ - **Pooling**: Multiple connections shared across requests (redis-py, Jedis, go-redis)
792
+
793
+ - **Multiplexing**: Single connection handles all traffic (NRedisStack, Lettuce)
794
+
795
+ - Multiplexing cannot support blocking commands (BLPOP, etc.) as they would stall all callers
796
+
797
+ Reference: [https://redis.io/docs/latest/develop/clients/pools-and-muxing/](https://redis.io/docs/latest/develop/clients/pools-and-muxing/)
798
+
799
+ ### 3.5 Use Pipelining for Bulk Operations
800
+
801
+ **Impact: HIGH (Reduces round trips, 5-10x faster for batch operations)**
802
+
803
+ Batch multiple commands into a single round trip to reduce network latency.
804
+
805
+ **Correct: Use pipeline for multiple commands.**
806
+
807
+ **Python** (redis-py):**
808
+
809
+ ```python
810
+ # Good: Single round trip for multiple commands
811
+ pipe = redis.pipeline()
812
+ for user_id in user_ids:
813
+ pipe.get(f"user:{user_id}")
814
+ results = pipe.execute()
815
+ ```
816
+
817
+ **Java** (Jedis):**
818
+
819
+ ```java
820
+ import redis.clients.jedis.Pipeline;
821
+
822
+ // Good: Buffer commands and send as single batch
823
+ Pipeline pipe = (Pipeline) jedis.pipelined();
824
+
825
+ pipe.set("person:1:name", "Alex");
826
+ pipe.set("person:1:rank", "Captain");
827
+ pipe.set("person:1:serial", "AB1234");
828
+
829
+ pipe.sync();
830
+ ```
831
+
832
+ **Incorrect: Sequential commands in a loop.**
833
+
834
+ **Python** (redis-py):**
835
+
836
+ ```python
837
+ # Bad: N round trips
838
+ results = []
839
+ for user_id in user_ids:
840
+ results.append(redis.get(f"user:{user_id}"))
841
+ ```
842
+
843
+ **Java** (Jedis):**
844
+
845
+ ```java
846
+ // Bad: 3 separate round trips
847
+ jedis.set("person:1:name", "Alex");
848
+ jedis.set("person:1:rank", "Captain");
849
+ jedis.set("person:1:serial", "AB1234");
850
+ ```
851
+
852
+ Reference: [https://redis.io/docs/latest/develop/use/pipelining/](https://redis.io/docs/latest/develop/use/pipelining/)
853
+
854
+ ---
855
+
856
+ ## 4. JSON Documents
857
+
858
+ **Impact: MEDIUM**
859
+
860
+ Using Redis JSON for nested structures, partial updates, and integration with RQE.
861
+
862
+ ### 4.1 Choose JSON vs Hash vs String Appropriately
863
+
864
+ **Impact: MEDIUM (Optimal data model for your use case)**
865
+
866
+ Redis offers three ways to store structured data: JSON, Hash, and serialized strings. Each has distinct trade-offs around atomic partial operations and indexability.
867
+
868
+ | Feature | JSON | Hash | String (serialized JSON) |
869
+ |---------|------|------|--------------------------|
870
+ | **Structure** | Nested objects and arrays | Flat key-value pairs | Any structure |
871
+ | **Atomic partial reads** | Yes (`$.field`) | Yes (`HGET`) | No (must fetch entire value) |
872
+ | **Atomic partial writes** | Yes (`JSON.SET $.field`) | Yes (`HSET`) | No (must rewrite entire value) |
873
+ | **RQE indexing** | Yes | Yes | No |
874
+ | **Geospatial indexing** | Yes | Yes | No |
875
+ | **Memory efficiency** | Higher overhead | More efficient | Most compact |
876
+ | **Field-level expiration** | No | Yes (HEXPIRE) | No |
877
+
878
+ **When to use each:**
879
+
880
+ - **JSON**: Nested structures with atomic partial updates and indexing needs
881
+
882
+ - **Hash**: Flat objects with atomic field access, field-level expiration, or memory efficiency
883
+
884
+ - **String**: Simple caching where you always read/write the entire object and don't need indexing
885
+
886
+ **Correct: Use JSON for nested structures with atomic partial updates.**
887
+
888
+ **Python** (redis-py):**
889
+
890
+ ```python
891
+ # JSON supports nested structures and atomic deep updates
892
+ redis.json().set("user:1001", "$", {
893
+ "name": "Alice",
894
+ "preferences": {"theme": "dark", "notifications": True}
895
+ })
896
+
897
+ # Atomic update of nested field - no read-modify-write needed
898
+ redis.json().set("user:1001", "$.preferences.theme", "light")
899
+ ```
900
+
901
+ **Java** (Jedis):**
902
+
903
+ ```java
904
+ import redis.clients.jedis.UnifiedJedis;
905
+ import redis.clients.jedis.json.Path2;
906
+ import org.json.JSONObject;
907
+
908
+ try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
909
+ JSONObject user = new JSONObject();
910
+ user.put("name", "Alice");
911
+ user.put("preferences", new JSONObject().put("theme", "dark"));
912
+
913
+ jedis.jsonSet("user:1001", new Path2("$"), user);
914
+
915
+ // Atomic update of nested field
916
+ jedis.jsonSet("user:1001", new Path2("$.preferences.theme"), "light");
917
+ }
918
+ ```
919
+
920
+ **Correct: Use Hash for flat objects with atomic field access.**
921
+
922
+ **Python** (redis-py):**
923
+
924
+ ```python
925
+ # Hash is efficient for flat data with atomic field operations
926
+ redis.hset("session:abc", mapping={
927
+ "user_id": "1001",
928
+ "created_at": "2024-01-01",
929
+ "ip": "192.168.1.1"
930
+ })
931
+
932
+ # Atomic field read and update
933
+ ip = redis.hget("session:abc", "ip")
934
+ redis.hset("session:abc", "ip", "10.0.0.1")
935
+ ```
936
+
937
+ **Correct: Use String for simple caching without partial updates.**
938
+
939
+ **Python** (redis-py):**
940
+
941
+ ```python
942
+ import json
943
+
944
+ # String is fine when you always read/write the entire object
945
+ # and don't need indexing or partial updates
946
+ config = {"feature_flags": {"dark_mode": True}, "version": "1.0"}
947
+ redis.set("config:app", json.dumps(config), ex=3600)
948
+
949
+ # Must fetch and parse entire object
950
+ config = json.loads(redis.get("config:app"))
951
+ ```
952
+
953
+ **Incorrect: Using String when you need atomic partial updates.**
954
+
955
+ **Python** (redis-py):**
956
+
957
+ ```python
958
+ import json
959
+
960
+ # BAD: Must fetch, parse, modify, serialize, and rewrite entire object
961
+ data = json.loads(redis.get("user:1001"))
962
+ data["preferences"]["theme"] = "light" # Not atomic!
963
+ redis.set("user:1001", json.dumps(data))
964
+ # Another client could have modified the object between GET and SET
965
+ ```
966
+
967
+ Reference: [https://redis.io/docs/latest/develop/data-types/compare-data-types/#documents](https://redis.io/docs/latest/develop/data-types/compare-data-types/#documents)
968
+
969
+ ### 4.2 Use JSON Paths for Partial Updates
970
+
971
+ **Impact: MEDIUM (Avoids fetching and rewriting entire documents)**
972
+
973
+ Use JSON path syntax to update specific fields without fetching the entire document.
974
+
975
+ **Correct: Use JSON paths for targeted updates.**
976
+
977
+ ```python
978
+ # Store JSON document
979
+ redis.json().set("user:1001", "$", {
980
+ "name": "Alice",
981
+ "email": "alice@example.com",
982
+ "preferences": {"theme": "dark", "notifications": True}
983
+ })
984
+
985
+ # Update nested field without fetching entire document
986
+ redis.json().set("user:1001", "$.preferences.theme", "light")
987
+
988
+ # Get specific field
989
+ theme = redis.json().get("user:1001", "$.preferences.theme")
990
+
991
+ # Increment numeric field atomically
992
+ redis.json().numincrby("user:1001", "$.preferences.volume", 5)
993
+
994
+ # Append to array
995
+ redis.json().arrappend("user:1001", "$.tags", "premium")
996
+ ```
997
+
998
+ **Incorrect: Storing JSON as a string and parsing client-side.**
999
+
1000
+ ```python
1001
+ # Bad: Loses queryability and atomic updates
1002
+ redis.set("user:1001", json.dumps(user_data))
1003
+
1004
+ # Must fetch, parse, modify, serialize, and rewrite
1005
+ data = json.loads(redis.get("user:1001"))
1006
+ data["preferences"]["theme"] = "light"
1007
+ redis.set("user:1001", json.dumps(data))
1008
+ ```
1009
+
1010
+ Reference: [https://redis.io/docs/latest/develop/data-types/json/path/](https://redis.io/docs/latest/develop/data-types/json/path/)
1011
+
1012
+ ---
1013
+
1014
+ ## 5. Redis Query Engine
1015
+
1016
+ **Impact: HIGH**
1017
+
1018
+ FT.CREATE, FT.SEARCH, FT.AGGREGATE, index design, field types, and query optimization.
1019
+
1020
+ ### 5.1 Choose the Correct Field Type
1021
+
1022
+ **Impact: HIGH (Use TAG instead of TEXT for filtering to improve query speed 10x)**
1023
+
1024
+ Each field type has different capabilities and performance characteristics.
1025
+
1026
+ | Field Type | Use When | Notes |
1027
+ |------------|----------|-------|
1028
+ | TEXT | Full-text search needed | Tokenized, stemmed |
1029
+ | TAG | Exact match, filtering | Faster than TEXT for filtering |
1030
+ | NUMERIC | Range queries, sorting | Use for prices, counts, timestamps |
1031
+ | GEO | Point location queries | Lat/long coordinates (single points) |
1032
+ | GEOSHAPE | Area/region queries | Polygons, circles, rectangles |
1033
+ | VECTOR | Similarity search | HNSW or FLAT algorithm |
1034
+
1035
+ **Correct: Use TAG for exact matching.**
1036
+
1037
+ ```python
1038
+ # Good: TAG for exact category matching
1039
+ FT.CREATE idx:products ON HASH PREFIX 1 product:
1040
+ SCHEMA
1041
+ category TAG SORTABLE
1042
+ status TAG
1043
+ ```
1044
+
1045
+ **Java** (Jedis):**
1046
+
1047
+ ```java
1048
+ import redis.clients.jedis.search.*;
1049
+
1050
+ Schema schema = new Schema()
1051
+ .addTextField("name", 1)
1052
+ .addTagField("categories"); // TAG for exact matching
1053
+
1054
+ IndexDefinition def = new IndexDefinition(IndexDefinition.Type.HASH);
1055
+
1056
+ jedis.ftCreate("idx", IndexOptions.defaultOptions().setDefinition(def), schema);
1057
+
1058
+ // Query with TAG syntax
1059
+ SearchResult result = jedis.ftSearch("idx", "@categories:{chef|runner}");
1060
+ ```
1061
+
1062
+ **Incorrect: Using TEXT when you don't need full-text features.**
1063
+
1064
+ ```python
1065
+ # Overkill: TEXT for category adds unnecessary tokenization
1066
+ FT.CREATE idx:products ON HASH PREFIX 1 product:
1067
+ SCHEMA
1068
+ category TEXT
1069
+ status TEXT
1070
+ ```
1071
+
1072
+ **Java** (Jedis):**
1073
+
1074
+ ```java
1075
+ // Bad: TEXT for categories adds unnecessary overhead
1076
+ Schema schema = new Schema()
1077
+ .addTextField("name", 1)
1078
+ .addTextField("categories", 1); // Overkill for exact matching
1079
+ ```
1080
+
1081
+ **Correct: Use GEO for points, GEOSHAPE for areas.**
1082
+
1083
+ ```python
1084
+ # GEO for point locations (stores, users)
1085
+ FT.CREATE idx:stores ON HASH PREFIX 1 store:
1086
+ SCHEMA
1087
+ location GEO
1088
+
1089
+ # GEOSHAPE for areas (delivery zones, boundaries)
1090
+ FT.CREATE idx:zones ON JSON PREFIX 1 zone:
1091
+ SCHEMA
1092
+ $.boundary AS boundary GEOSHAPE
1093
+ ```
1094
+
1095
+ Reference: [https://redis.io/docs/latest/develop/interact/search-and-query/indexing/geoindex/](https://redis.io/docs/latest/develop/interact/search-and-query/indexing/geoindex/)
1096
+
1097
+ ### 5.2 Index Only Fields You Query
1098
+
1099
+ **Impact: HIGH (Reduces index size and improves write performance)**
1100
+
1101
+ Create indexes with only the fields you need to search, filter, or sort on.
1102
+
1103
+ **Correct: Index specific fields and use prefixes.**
1104
+
1105
+ ```python
1106
+ FT.CREATE idx:products ON HASH PREFIX 1 product:
1107
+ SCHEMA
1108
+ name TEXT WEIGHT 2.0
1109
+ description TEXT
1110
+ category TAG SORTABLE
1111
+ price NUMERIC SORTABLE
1112
+ location GEO
1113
+ ```
1114
+
1115
+ **Java** (Jedis):**
1116
+
1117
+ ```java
1118
+ import redis.clients.jedis.search.*;
1119
+
1120
+ Schema schema = new Schema()
1121
+ .addTextField("name", 1)
1122
+ .addTagField("categories");
1123
+
1124
+ // Good: Specify prefix to index only matching keys
1125
+ IndexDefinition def = new IndexDefinition(IndexDefinition.Type.HASH)
1126
+ .setPrefixes("person:");
1127
+
1128
+ jedis.ftCreate("idx", IndexOptions.defaultOptions().setDefinition(def), schema);
1129
+ ```
1130
+
1131
+ **Incorrect: Over-indexing or indexing unused fields.**
1132
+
1133
+ ```python
1134
+ # Bad: Indexing every field "just in case"
1135
+ FT.CREATE idx:products ON HASH PREFIX 1 product:
1136
+ SCHEMA
1137
+ name TEXT
1138
+ description TEXT
1139
+ category TEXT
1140
+ subcategory TEXT
1141
+ brand TEXT
1142
+ sku TEXT
1143
+ price NUMERIC
1144
+ cost NUMERIC
1145
+ margin NUMERIC
1146
+ ...
1147
+ ```
1148
+
1149
+ **Java** (Jedis):**
1150
+
1151
+ ```java
1152
+ // Bad: No prefix means all hashes get indexed
1153
+ IndexDefinition def = new IndexDefinition(IndexDefinition.Type.HASH);
1154
+ // This will index every hash in the database!
1155
+ ```
1156
+
1157
+ **Tips:**
1158
+
1159
+ - Start with the minimum required fields
1160
+
1161
+ - Add fields as query patterns emerge
1162
+
1163
+ - Use `FT.INFO` to monitor index size
1164
+
1165
+ - Always specify a prefix to avoid indexing unrelated keys
1166
+
1167
+ Reference: [https://redis.io/docs/latest/develop/interact/search-and-query/indexing/](https://redis.io/docs/latest/develop/interact/search-and-query/indexing/)
1168
+
1169
+ ### 5.3 Manage Indexes for Zero-Downtime Updates
1170
+
1171
+ **Impact: MEDIUM (Use aliases for seamless index updates)**
1172
+
1173
+ Use aliases to swap indexes without application changes.
1174
+
1175
+ **Correct: Use aliases for production indexes.**
1176
+
1177
+ ```python
1178
+ # Create versioned index
1179
+ FT.CREATE idx:products_v2 ON HASH PREFIX 1 product:
1180
+ SCHEMA
1181
+ name TEXT
1182
+ category TAG SORTABLE
1183
+ price NUMERIC SORTABLE
1184
+
1185
+ # Point alias to new index
1186
+ FT.ALIASADD products idx:products_v2
1187
+
1188
+ # Application queries use alias
1189
+ FT.SEARCH products "@category:{electronics}"
1190
+
1191
+ # Later, swap to new version
1192
+ FT.ALIASUPDATE products idx:products_v3
1193
+ ```
1194
+
1195
+ **Useful management commands:**
1196
+
1197
+ ```python
1198
+ # Check index info
1199
+ FT.INFO idx:products
1200
+
1201
+ # Drop and recreate (non-blocking)
1202
+ FT.DROPINDEX idx:products
1203
+ FT.CREATE idx:products ...
1204
+
1205
+ # List all indexes
1206
+ FT._LIST
1207
+ ```
1208
+
1209
+ Reference: [https://redis.io/docs/latest/develop/interact/search-and-query/administration/](https://redis.io/docs/latest/develop/interact/search-and-query/administration/)
1210
+
1211
+ ### 5.4 Use DIALECT 2 for Query Syntax
1212
+
1213
+ **Impact: MEDIUM (Ensures consistent query behavior and access to modern features)**
1214
+
1215
+ Use DIALECT 2 for consistent query behavior. Many Redis client libraries now default to DIALECT 2, and other dialects (1, 3, 4) are deprecated as of Redis 8.
1216
+
1217
+ **Correct: Use DIALECT 2 explicitly or rely on modern client defaults.**
1218
+
1219
+ ```python
1220
+ # In raw commands, specify DIALECT 2
1221
+ FT.SEARCH idx:products "@name:laptop" DIALECT 2
1222
+
1223
+ FT.AGGREGATE idx:products "@category:{electronics}"
1224
+ GROUPBY 1 @category
1225
+ REDUCE COUNT 0 AS count
1226
+ DIALECT 2
1227
+ ```
1228
+
1229
+ **Note: DIALECT 2 is required for vector search queries. Most modern client libraries (redis-py 6.0+, go-redis, Lettuce) now use DIALECT 2 by default.**
1230
+
1231
+ **Why DIALECT 2:**
1232
+
1233
+ - Consistent handling of special characters
1234
+
1235
+ - Better NULL value handling
1236
+
1237
+ - More predictable query parsing
1238
+
1239
+ - Required for vector search
1240
+
1241
+ Reference: [https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/dialects/](https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/dialects/)
1242
+
1243
+ ### 5.5 Use SKIPINITIALSCAN for New Data Only Indexes
1244
+
1245
+ **Impact: MEDIUM (Faster index creation, avoids indexing existing data)**
1246
+
1247
+ Enable the `SKIPINITIALSCAN` option when creating an index if you only want to include items that are added after the index is created. This makes index creation faster and avoids indexing existing data that you don't need to search.
1248
+
1249
+ **Correct: Use SKIPINITIALSCAN when you only need to index new data.**
1250
+
1251
+ **Python** (redis-py):**
1252
+
1253
+ ```python
1254
+ import redis
1255
+ from redis.commands.search.field import TextField, TagField
1256
+ from redis.commands.search.indexDefinition import IndexDefinition, IndexType
1257
+
1258
+ client = redis.Redis(host='localhost', port=6379)
1259
+
1260
+ # Create index that only indexes new documents
1261
+ schema = (
1262
+ TextField("name"),
1263
+ TagField("categories")
1264
+ )
1265
+
1266
+ definition = IndexDefinition(
1267
+ prefix=["person:"],
1268
+ index_type=IndexType.HASH
1269
+ )
1270
+
1271
+ # SKIPINITIALSCAN - only index documents added after creation
1272
+ client.ft("idx").create_index(
1273
+ schema,
1274
+ definition=definition,
1275
+ skip_initial_scan=True
1276
+ )
1277
+ ```
1278
+
1279
+ **Java** (Jedis):**
1280
+
1281
+ ```java
1282
+ import redis.clients.jedis.UnifiedJedis;
1283
+ import redis.clients.jedis.search.FTCreateParams;
1284
+ import redis.clients.jedis.search.IndexDataType;
1285
+ import redis.clients.jedis.search.schemafields.SchemaField;
1286
+ import redis.clients.jedis.search.schemafields.TagField;
1287
+ import redis.clients.jedis.search.schemafields.TextField;
1288
+
1289
+ try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
1290
+ FTCreateParams params = new FTCreateParams()
1291
+ .on(IndexDataType.HASH)
1292
+ .skipInitialScan(); // Only index new documents
1293
+
1294
+ jedis.ftCreate(
1295
+ "idx",
1296
+ params,
1297
+ new SchemaField[]{
1298
+ new TextField("name"),
1299
+ new TagField("categories")
1300
+ }
1301
+ );
1302
+ }
1303
+ ```
1304
+
1305
+ **When to use SKIPINITIALSCAN:**
1306
+
1307
+ - Creating an index for a new feature where existing data is irrelevant
1308
+
1309
+ - Setting up indexes in advance before data arrives
1310
+
1311
+ - When existing data would be too large to scan during index creation
1312
+
1313
+ - Event-driven architectures where you only care about new events
1314
+
1315
+ **When NOT to use: default behavior is correct**
1316
+
1317
+ - You need to search existing data immediately after index creation
1318
+
1319
+ - Migrating to a new index schema and need all data indexed
1320
+
1321
+ - Most typical use cases where historical data matters
1322
+
1323
+ **Note: The default behavior (without SKIPINITIALSCAN) indexes all existing matching keys, which is usually what you want.**
1324
+
1325
+ Reference: [https://redis.io/docs/latest/commands/ft.create/](https://redis.io/docs/latest/commands/ft.create/)
1326
+
1327
+ ### 5.6 Write Efficient Queries
1328
+
1329
+ **Impact: HIGH (Proper filtering reduces query time by orders of magnitude)**
1330
+
1331
+ Be specific and use filters to reduce the result set early.
1332
+
1333
+ **Correct: Use specific filters and limit results.**
1334
+
1335
+ ```python
1336
+ # Good: Specific query with filters
1337
+ FT.SEARCH idx:products "@category:{electronics} @price:[100 500]"
1338
+ LIMIT 0 20
1339
+ RETURN 3 name price category
1340
+
1341
+ # Good: Use SORTBY and LIMIT
1342
+ FT.SEARCH idx:products "@name:laptop"
1343
+ SORTBY price ASC
1344
+ LIMIT 0 10
1345
+ ```
1346
+
1347
+ **Incorrect: Broad queries returning large result sets.**
1348
+
1349
+ ```python
1350
+ # Bad: Wildcard prefix scans entire index
1351
+ FT.SEARCH idx:products "*" LIMIT 0 10000
1352
+
1353
+ # Bad: Loading all fields from source document
1354
+ FT.AGGREGATE idx:products "*" LOAD *
1355
+ ```
1356
+
1357
+ **Performance tips:**
1358
+
1359
+ ```python
1360
+ FT.PROFILE idx:products SEARCH QUERY "@category:{electronics}"
1361
+ ```
1362
+
1363
+ - Add `SORTABLE` to fields used in `SORTBY`
1364
+
1365
+ - Use `TAG SORTABLE UNF` for best performance on tag fields
1366
+
1367
+ - Use `NOSTEM` if you don't need stemming
1368
+
1369
+ - Profile queries with `FT.PROFILE`
1370
+
1371
+ Reference: [https://redis.io/docs/latest/develop/interact/search-and-query/query/](https://redis.io/docs/latest/develop/interact/search-and-query/query/)
1372
+
1373
+ ---
1374
+
1375
+ ## 6. Vector Search & RedisVL
1376
+
1377
+ **Impact: HIGH**
1378
+
1379
+ Vector indexes, HNSW vs FLAT, hybrid search, and RAG patterns with RedisVL.
1380
+
1381
+ ### 6.1 Choose HNSW vs FLAT Based on Requirements
1382
+
1383
+ **Impact: HIGH (HNSW trades accuracy for speed, FLAT provides exact results)**
1384
+
1385
+ Select the right algorithm based on your accuracy requirements and dataset size.
1386
+
1387
+ | Algorithm | Speed | Accuracy | Memory | Best For |
1388
+ |-----------|-------|----------|--------|----------|
1389
+ | HNSW | Fast (approximate) | ~95%+ recall tunable | Higher | Large datasets (>10k vectors) |
1390
+ | FLAT | Slower (exact) | 100% (exact) | Lower | Small datasets, accuracy-critical |
1391
+
1392
+ **Correct: Use HNSW for large-scale production workloads.**
1393
+
1394
+ ```python
1395
+ from redisvl.schema import IndexSchema
1396
+
1397
+ # HNSW - fast approximate search, tunable accuracy
1398
+ schema = IndexSchema.from_dict({
1399
+ "index": {"name": "idx:docs", "prefix": "doc:"},
1400
+ "fields": [
1401
+ {"name": "embedding", "type": "vector", "attrs": {
1402
+ "dims": 1536,
1403
+ "algorithm": "HNSW",
1404
+ "distance_metric": "COSINE",
1405
+ "M": 16, # Higher = more accurate, more memory
1406
+ "EF_CONSTRUCTION": 200 # Higher = better index quality, slower build
1407
+ }}
1408
+ ]
1409
+ })
1410
+ ```
1411
+
1412
+ **Correct: Use FLAT when exact results are required.**
1413
+
1414
+ ```python
1415
+ # FLAT - exact brute-force search, guaranteed accuracy
1416
+ schema = IndexSchema.from_dict({
1417
+ "index": {"name": "idx:small", "prefix": "small:"},
1418
+ "fields": [
1419
+ {"name": "embedding", "type": "vector", "attrs": {
1420
+ "dims": 1536,
1421
+ "algorithm": "FLAT",
1422
+ "distance_metric": "COSINE"
1423
+ }}
1424
+ ]
1425
+ })
1426
+ ```
1427
+
1428
+ **Tuning HNSW accuracy vs speed:**
1429
+
1430
+ - `M`: Connections per node (16-64). Higher = better recall, more memory
1431
+
1432
+ - `EF_CONSTRUCTION`: Build-time parameter (100-500). Higher = better graph quality
1433
+
1434
+ - `EF_RUNTIME`: Query-time parameter. Higher = better recall, slower queries
1435
+
1436
+ Reference: [https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/](https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/)
1437
+
1438
+ ### 6.2 Configure Vector Indexes Properly
1439
+
1440
+ **Impact: HIGH (Correct configuration is essential for vector search accuracy)**
1441
+
1442
+ Set the correct dimensions, algorithm, and distance metric for your embeddings. Vector indexes can be created via CLI, Redis Insight, or any client library.
1443
+
1444
+ **Correct: Create index via Redis CLI or Insight.**
1445
+
1446
+ ```python
1447
+ FT.CREATE idx:docs ON HASH PREFIX 1 doc:
1448
+ SCHEMA
1449
+ content TEXT
1450
+ embedding VECTOR HNSW 6
1451
+ TYPE FLOAT32
1452
+ DIM 1536
1453
+ DISTANCE_METRIC COSINE
1454
+ ```
1455
+
1456
+ **Correct: Create index via Python (redis-py).**
1457
+
1458
+ ```python
1459
+ from redis import Redis
1460
+ from redis.commands.search.field import TextField, VectorField
1461
+
1462
+ r = Redis()
1463
+
1464
+ # Define schema with vector field
1465
+ schema = [
1466
+ TextField("content"),
1467
+ VectorField(
1468
+ "embedding",
1469
+ algorithm="HNSW",
1470
+ attributes={
1471
+ "TYPE": "FLOAT32",
1472
+ "DIM": 1536, # Must match your embedding model
1473
+ "DISTANCE_METRIC": "COSINE"
1474
+ }
1475
+ )
1476
+ ]
1477
+
1478
+ r.ft("idx:docs").create_index(schema, definition=IndexDefinition(prefix=["doc:"]))
1479
+ ```
1480
+
1481
+ **Correct: Create index via RedisVL.**
1482
+
1483
+ ```python
1484
+ from redisvl.index import SearchIndex
1485
+ from redisvl.schema import IndexSchema
1486
+
1487
+ schema = IndexSchema.from_dict({
1488
+ "index": {"name": "idx:docs", "prefix": "doc:"},
1489
+ "fields": [
1490
+ {"name": "content", "type": "text"},
1491
+ {"name": "embedding", "type": "vector", "attrs": {
1492
+ "dims": 1536,
1493
+ "algorithm": "HNSW",
1494
+ "distance_metric": "COSINE"
1495
+ }}
1496
+ ]
1497
+ })
1498
+
1499
+ index = SearchIndex(schema)
1500
+ index.create(overwrite=True)
1501
+ ```
1502
+
1503
+ **Incorrect: Mismatched dimensions or wrong distance metric.**
1504
+
1505
+ ```python
1506
+ # Bad: Wrong dimensions for your model
1507
+ {"dims": 768} # But using OpenAI which outputs 1536
1508
+
1509
+ # Bad: Wrong metric for normalized embeddings
1510
+ {"distance_metric": "L2"} # When embeddings are normalized for COSINE
1511
+ ```
1512
+
1513
+ Reference: [https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/](https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/)
1514
+
1515
+ ### 6.3 Implement RAG Pattern Correctly
1516
+
1517
+ **Impact: HIGH (Proper RAG implementation improves LLM response quality)**
1518
+
1519
+ Store documents with embeddings, retrieve relevant context, and pass to LLM.
1520
+
1521
+ **Correct: Full RAG pipeline with RedisVL.**
1522
+
1523
+ ```python
1524
+ from redisvl.index import SearchIndex
1525
+ from redisvl.query import VectorQuery
1526
+
1527
+ # 1. Store documents with embeddings
1528
+ for doc in documents:
1529
+ embedding = embed_model.encode(doc["content"])
1530
+ index.load([{
1531
+ "content": doc["content"],
1532
+ "embedding": embedding.tolist(),
1533
+ "source": doc["source"]
1534
+ }])
1535
+
1536
+ # 2. Query with vector similarity
1537
+ query_embedding = embed_model.encode(user_question)
1538
+ results = index.search(VectorQuery(
1539
+ vector=query_embedding,
1540
+ vector_field_name="embedding",
1541
+ return_fields=["content", "source"],
1542
+ num_results=5
1543
+ ))
1544
+
1545
+ # 3. Pass context to LLM
1546
+ context = "\n".join([r["content"] for r in results])
1547
+ response = llm.generate(f"Context: {context}\n\nQuestion: {user_question}")
1548
+ ```
1549
+
1550
+ **Best practices:**
1551
+
1552
+ - Normalize vectors if using COSINE distance
1553
+
1554
+ - Batch inserts using `index.load()` with lists
1555
+
1556
+ - Set appropriate M and EF_CONSTRUCTION for HNSW based on dataset size
1557
+
1558
+ - Use filters to reduce the search space before vector comparison
1559
+
1560
+ - Consider chunking long documents for better retrieval
1561
+
1562
+ Reference: [https://redis.io/docs/latest/develop/get-started/rag/](https://redis.io/docs/latest/develop/get-started/rag/)
1563
+
1564
+ ### 6.4 Use Hybrid Search for Better Results
1565
+
1566
+ **Impact: MEDIUM (Combining vector + filters improves relevance and reduces search space)**
1567
+
1568
+ Combine vector similarity with attribute filtering for more relevant results.
1569
+
1570
+ **Correct: Apply filters to reduce search space.**
1571
+
1572
+ ```python
1573
+ from redisvl.query import VectorQuery
1574
+
1575
+ query = VectorQuery(
1576
+ vector=query_embedding,
1577
+ vector_field_name="embedding",
1578
+ return_fields=["content", "category", "date"],
1579
+ num_results=10,
1580
+ filter_expression="@category:{technology} @date:[2024 2025]"
1581
+ )
1582
+
1583
+ results = index.search(query)
1584
+ ```
1585
+
1586
+ **Incorrect: Searching entire vector space when filters apply.**
1587
+
1588
+ ```python
1589
+ # Bad: No filter - searches all vectors then filters client-side
1590
+ results = index.search(VectorQuery(
1591
+ vector=query_embedding,
1592
+ vector_field_name="embedding",
1593
+ num_results=1000
1594
+ ))
1595
+ # Client-side filtering - wasteful
1596
+ filtered = [r for r in results if r["category"] == "technology"]
1597
+ ```
1598
+
1599
+ **Tips:**
1600
+
1601
+ - Use TAG fields for category filters
1602
+
1603
+ - Use NUMERIC fields for date/price ranges
1604
+
1605
+ - Filters are applied before vector search, reducing computation
1606
+
1607
+ Reference: [https://redis.io/docs/latest/develop/interact/search-and-query/query/combined/](https://redis.io/docs/latest/develop/interact/search-and-query/query/combined/)
1608
+
1609
+ ---
1610
+
1611
+ ## 7. Semantic Caching
1612
+
1613
+ **Impact: MEDIUM**
1614
+
1615
+ LangCache for LLM response caching, distance thresholds, and cache strategies.
1616
+
1617
+ ### 7.1 Configure Semantic Cache Properly
1618
+
1619
+ **Impact: MEDIUM (Correct threshold tuning balances hit rate vs accuracy)**
1620
+
1621
+ > **Note:** LangCache is currently in preview on Redis Cloud. Features and behavior may change.
1622
+
1623
+ Tune similarity threshold and cache separation for optimal LangCache results.
1624
+
1625
+ **Correct: Tune similarity threshold for your use case.**
1626
+
1627
+ ```python
1628
+ from langcache import LangCache
1629
+
1630
+ lang_cache = LangCache(
1631
+ server_url=f"https://{os.getenv('HOST')}",
1632
+ cache_id=os.getenv("CACHE_ID"),
1633
+ api_key=os.getenv("API_KEY")
1634
+ )
1635
+
1636
+ # Stricter matching - fewer false positives (0.95 = very similar)
1637
+ result = lang_cache.search(
1638
+ prompt="What is Redis?",
1639
+ similarity_threshold=0.95
1640
+ )
1641
+
1642
+ # Looser matching - higher hit rate (0.8 = somewhat similar)
1643
+ result = lang_cache.search(
1644
+ prompt="What is Redis?",
1645
+ similarity_threshold=0.8
1646
+ )
1647
+ ```
1648
+
1649
+ **Correct: Use separate caches for different use cases.**
1650
+
1651
+ ```python
1652
+ # Create different cache IDs in Redis Cloud for different LLM tasks
1653
+ support_cache = LangCache(
1654
+ server_url=server_url,
1655
+ cache_id="support-cache-id",
1656
+ api_key=api_key
1657
+ )
1658
+
1659
+ code_cache = LangCache(
1660
+ server_url=server_url,
1661
+ cache_id="code-cache-id",
1662
+ api_key=api_key
1663
+ )
1664
+ ```
1665
+
1666
+ **Incorrect: Using a single cache for all LLM tasks.**
1667
+
1668
+ ```python
1669
+ # All tasks share one cache - responses may not be relevant
1670
+ result = lang_cache.search(prompt="How do I reset my password?")
1671
+ # Could return a code snippet if someone asked a similar coding question
1672
+ ```
1673
+
1674
+ **Best practices:**
1675
+
1676
+ - Start with threshold 0.9, adjust based on your use case
1677
+
1678
+ - Use custom attributes to filter results within a single cache
1679
+
1680
+ - Monitor cache hit rates to evaluate effectiveness
1681
+
1682
+ - Use separate cache IDs for fundamentally different LLM tasks
1683
+
1684
+ Reference: [https://redis.io/docs/latest/develop/ai/langcache/](https://redis.io/docs/latest/develop/ai/langcache/)
1685
+
1686
+ ### 7.2 Use LangCache for LLM Response Caching
1687
+
1688
+ **Impact: HIGH (Reduces LLM API costs by 50-90% for similar queries)**
1689
+
1690
+ > **Note:** LangCache is currently in preview on Redis Cloud. Features and behavior may change.
1691
+
1692
+ LangCache is a fully-managed semantic caching service on Redis Cloud that reduces LLM costs and latency.
1693
+
1694
+ **How it works:**
1695
+
1696
+ 1. Your app sends a prompt to LangCache via `POST /v1/caches/{cacheId}/entries/search`
1697
+
1698
+ 2. LangCache generates an embedding and searches for similar cached responses
1699
+
1700
+ 3. If found (cache hit), returns the cached response instantly
1701
+
1702
+ 4. If not found (cache miss), your app calls the LLM and stores the response
1703
+
1704
+ **Correct: Use the LangCache Python SDK.**
1705
+
1706
+ ```python
1707
+ from langcache import LangCache
1708
+ import os
1709
+
1710
+ lang_cache = LangCache(
1711
+ server_url=f"https://{os.getenv('HOST')}",
1712
+ cache_id=os.getenv("CACHE_ID"),
1713
+ api_key=os.getenv("API_KEY")
1714
+ )
1715
+
1716
+ # Search for cached response
1717
+ result = lang_cache.search(
1718
+ prompt="What is Redis?",
1719
+ similarity_threshold=0.9
1720
+ )
1721
+
1722
+ if result:
1723
+ response = result[0]["response"]
1724
+ else:
1725
+ response = llm.generate("What is Redis?")
1726
+ # Store for future queries
1727
+ lang_cache.set(
1728
+ prompt="What is Redis?",
1729
+ response=response
1730
+ )
1731
+ ```
1732
+
1733
+ **LangCache REST API:**
1734
+
1735
+ ```bash
1736
+ # Search cache
1737
+ curl -X POST "https://$HOST/v1/caches/$CACHE_ID/entries/search" \
1738
+ -H "Authorization: Bearer $API_KEY" \
1739
+ -H "Content-Type: application/json" \
1740
+ -d '{"prompt": "What is Redis?"}'
1741
+
1742
+ # Store a response
1743
+ curl -X POST "https://$HOST/v1/caches/$CACHE_ID/entries" \
1744
+ -H "Authorization: Bearer $API_KEY" \
1745
+ -H "Content-Type: application/json" \
1746
+ -d '{"prompt": "What is Redis?", "response": "Redis is an in-memory database..."}'
1747
+ ```
1748
+
1749
+ **With custom attributes for filtering:**
1750
+
1751
+ ```python
1752
+ # Store with attributes
1753
+ lang_cache.set(
1754
+ prompt="What is Redis?",
1755
+ response="Redis is an in-memory database...",
1756
+ attributes={"category": "database", "version": "v1"}
1757
+ )
1758
+
1759
+ # Search with attribute filter
1760
+ result = lang_cache.search(
1761
+ prompt="Tell me about Redis",
1762
+ attributes={"category": "database"},
1763
+ similarity_threshold=0.9
1764
+ )
1765
+ ```
1766
+
1767
+ Reference: [https://redis.io/docs/latest/develop/ai/langcache/](https://redis.io/docs/latest/develop/ai/langcache/)
1768
+
1769
+ ---
1770
+
1771
+ ## 8. Streams & Pub/Sub
1772
+
1773
+ **Impact: MEDIUM**
1774
+
1775
+ Choosing between Streams and Pub/Sub for messaging patterns.
1776
+
1777
+ ### 8.1 Choose Streams vs Pub/Sub Appropriately
1778
+
1779
+ **Impact: MEDIUM (Wrong choice leads to lost messages or unnecessary complexity)**
1780
+
1781
+ Redis supports two messaging approaches for different use cases.
1782
+
1783
+ **Incorrect: Using Pub/Sub when messages must not be lost.**
1784
+
1785
+ ```python
1786
+ # Pub/Sub - messages lost if no subscribers connected
1787
+ r.publish("orders", json.dumps(order)) # Fire and forget!
1788
+ ```
1789
+
1790
+ **Correct: Use Streams when message durability matters.**
1791
+
1792
+ ```python
1793
+ # Streams - messages persist and can be replayed
1794
+ r.xadd("orders:stream", {"order": json.dumps(order)})
1795
+
1796
+ # Consumer group for reliable processing
1797
+ r.xreadgroup("workers", "worker-1", {"orders:stream": ">"}, count=10)
1798
+ r.xack("orders:stream", "workers", message_id)
1799
+ ```
1800
+
1801
+ | Requirement | Use |
1802
+ |-------------|-----|
1803
+ | Real-time notifications, OK to miss messages | Pub/Sub |
1804
+ | Messages must not be lost | Streams |
1805
+ | Need to replay/reprocess messages | Streams |
1806
+ | Multiple workers processing same queue | Streams (consumer groups) |
1807
+ | Simple broadcast to connected clients | Pub/Sub |
1808
+ | Event sourcing or audit trail | Streams |
1809
+
1810
+ Reference: [https://redis.io/docs/latest/develop/data-types/streams/](https://redis.io/docs/latest/develop/data-types/streams/)
1811
+
1812
+ ---
1813
+
1814
+ ## 9. Clustering & Replication
1815
+
1816
+ **Impact: MEDIUM**
1817
+
1818
+ Hash tags for key colocation, read replicas, and cluster-aware patterns.
1819
+
1820
+ ### 9.1 Use Hash Tags for Multi-Key Operations
1821
+
1822
+ **Impact: HIGH (Enables multi-key operations in Redis Cluster)**
1823
+
1824
+ In Redis Cluster, keys are distributed across slots based on their hash. Use hash tags to ensure keys that must be used together in [multi-key operations](https://redis.io/docs/latest/operate/rs/databases/durability-ha/clustering/#multikey-operations) are on the same slot.
1825
+
1826
+ **Correct: Use hash tags for keys used in multi-key operations.**
1827
+
1828
+ **Python** (redis-py):**
1829
+
1830
+ ```python
1831
+ # These keys go to the same slot because {user:1001} is the hash tag
1832
+ redis.set("{user:1001}:profile", "...")
1833
+ redis.set("{user:1001}:settings", "...")
1834
+ redis.set("{user:1001}:cart", "...")
1835
+
1836
+ # Now you can use transactions and pipelines
1837
+ pipe = redis.pipeline()
1838
+ pipe.get("{user:1001}:profile")
1839
+ pipe.get("{user:1001}:settings")
1840
+ pipe.execute()
1841
+
1842
+ # Multi-key commands also work
1843
+ redis.lmove("{user:1001}:pending", "{user:1001}:processed", "LEFT", "RIGHT")
1844
+ ```
1845
+
1846
+ **Java** (Jedis):**
1847
+
1848
+ ```java
1849
+ import redis.clients.jedis.UnifiedJedis;
1850
+ import java.util.Set;
1851
+
1852
+ try (UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379")) {
1853
+ // Hash tags ensure keys go to the same slot
1854
+ jedis.sadd("{bikes:racing}:france", "bike:1", "bike:2", "bike:3");
1855
+ jedis.sadd("{bikes:racing}:usa", "bike:1", "bike:4");
1856
+
1857
+ // Multi-key operation works because of matching hash tags
1858
+ Set<String> result = jedis.sdiff("{bikes:racing}:france", "{bikes:racing}:usa");
1859
+ }
1860
+ ```
1861
+
1862
+ **Incorrect: Keys without hash tags that need multi-key operations.**
1863
+
1864
+ **Python** (redis-py):**
1865
+
1866
+ ```python
1867
+ # Bad: These may be on different slots
1868
+ redis.set("user:1001:profile", "...") # No hash tag
1869
+ redis.set("user:1001:settings", "...")
1870
+
1871
+ # This will fail in cluster mode
1872
+ pipe = redis.pipeline()
1873
+ pipe.get("user:1001:profile")
1874
+ pipe.get("user:1001:settings")
1875
+ pipe.execute() # CROSSSLOT error
1876
+ ```
1877
+
1878
+ **Java** (Jedis):**
1879
+
1880
+ ```java
1881
+ // Bad: No hash tags - keys may be on different slots
1882
+ jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3");
1883
+ jedis.sadd("bikes:racing:usa", "bike:1", "bike:4");
1884
+
1885
+ // This will fail in cluster mode with CROSSSLOT error
1886
+ Set<String> result = jedis.sdiff("bikes:racing:france", "bikes:racing:usa");
1887
+ ```
1888
+
1889
+ **Hash tag rules:**
1890
+
1891
+ - Only the part between `{` and `}` is hashed for slot assignment
1892
+
1893
+ - Use meaningful identifiers like `{user:1001}` not just `{1001}` to avoid unrelated keys (e.g., `purchase:{1001}`, `employee:{1001}`) saturating the same slot
1894
+
1895
+ - Use hash tags only where multi-key operations are needed, not as a general habit
1896
+
1897
+ Reference: [https://redis.io/docs/latest/operate/oss_and_stack/reference/cluster-spec/#hash-tags](https://redis.io/docs/latest/operate/oss_and_stack/reference/cluster-spec/#hash-tags)
1898
+
1899
+ ### 9.2 Use Read Replicas for Read-Heavy Workloads
1900
+
1901
+ **Impact: MEDIUM (Scales read throughput without adding primary nodes)**
1902
+
1903
+ For read-heavy workloads, distribute reads across replicas to reduce load on primaries.
1904
+
1905
+ **Correct: Configure replica reads in Redis Cluster.**
1906
+
1907
+ ```python
1908
+ from redis.cluster import RedisCluster
1909
+
1910
+ rc = RedisCluster(
1911
+ host='localhost',
1912
+ port=6379,
1913
+ read_from_replicas=True # Distribute reads to replicas
1914
+ )
1915
+
1916
+ # Writes go to primary
1917
+ rc.set("key", "value")
1918
+
1919
+ # Reads can be served by replicas (eventually consistent)
1920
+ value = rc.get("key")
1921
+ ```
1922
+
1923
+ **Correct: Use replica reads in standalone replication setup.**
1924
+
1925
+ ```python
1926
+ from redis import Redis
1927
+
1928
+ # Connect to primary for writes
1929
+ primary = Redis(host='primary-host', port=6379)
1930
+
1931
+ # Connect to replica for reads
1932
+ replica = Redis(host='replica-host', port=6379)
1933
+
1934
+ # Write to primary
1935
+ primary.set("key", "value")
1936
+
1937
+ # Read from replica (eventually consistent)
1938
+ value = replica.get("key")
1939
+ ```
1940
+
1941
+ **Considerations:**
1942
+
1943
+ - Replica reads are eventually consistent
1944
+
1945
+ - Don't read from replicas for data that was just written
1946
+
1947
+ - Use for read-heavy, slightly-stale-OK workloads (caches, analytics, dashboards)
1948
+
1949
+ Reference: [https://redis.io/docs/latest/operate/oss_and_stack/management/replication/](https://redis.io/docs/latest/operate/oss_and_stack/management/replication/)
1950
+
1951
+ ---
1952
+
1953
+ ## 10. Security
1954
+
1955
+ **Impact: HIGH**
1956
+
1957
+ Authentication, ACLs, TLS, and network security.
1958
+
1959
+ ### 10.1 Always Use Authentication in Production
1960
+
1961
+ **Impact: HIGH (Prevents unauthorized access to your data)**
1962
+
1963
+ Never run Redis without authentication in production environments.
1964
+
1965
+ **Correct: Use password and TLS.**
1966
+
1967
+ **Python** (redis-py):**
1968
+
1969
+ ```python
1970
+ r = redis.Redis(
1971
+ host='localhost',
1972
+ port=6379,
1973
+ password='your-strong-password',
1974
+ ssl=True,
1975
+ ssl_cert_reqs='required'
1976
+ )
1977
+ ```
1978
+
1979
+ **Java** (Jedis):**
1980
+
1981
+ ```java
1982
+ import redis.clients.jedis.*;
1983
+ import javax.net.ssl.*;
1984
+ import java.security.KeyStore;
1985
+
1986
+ // Create SSL context with trust store and key store
1987
+ KeyStore trustStore = KeyStore.getInstance("jks");
1988
+ trustStore.load(new FileInputStream("./truststore.jks"), "password".toCharArray());
1989
+
1990
+ TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
1991
+ tmf.init(trustStore);
1992
+
1993
+ SSLContext sslContext = SSLContext.getInstance("TLS");
1994
+ sslContext.init(null, tmf.getTrustManagers(), null);
1995
+
1996
+ JedisClientConfig config = DefaultJedisClientConfig.builder()
1997
+ .ssl(true)
1998
+ .sslSocketFactory(sslContext.getSocketFactory())
1999
+ .user("redisUser")
2000
+ .password("redisPassword")
2001
+ .build();
2002
+
2003
+ JedisPooled jedis = new JedisPooled(new HostAndPort("redis-host", 6379), config);
2004
+ ```
2005
+
2006
+ **Incorrect: Connecting without authentication.**
2007
+
2008
+ **Python** (redis-py):**
2009
+
2010
+ ```python
2011
+ # Bad: No authentication
2012
+ r = redis.Redis(host='localhost', port=6379)
2013
+ ```
2014
+
2015
+ **Java** (Jedis):**
2016
+
2017
+ ```java
2018
+ // Bad: No authentication or TLS
2019
+ UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
2020
+ ```
2021
+
2022
+ **Configuration:**
2023
+
2024
+ ```python
2025
+ # redis.conf
2026
+ requirepass your-strong-password
2027
+ tls-port 6380
2028
+ tls-cert-file /path/to/redis.crt
2029
+ tls-key-file /path/to/redis.key
2030
+ ```
2031
+
2032
+ Reference: [https://redis.io/docs/latest/operate/oss_and_stack/management/security/](https://redis.io/docs/latest/operate/oss_and_stack/management/security/)
2033
+
2034
+ ### 10.2 Secure Network Access
2035
+
2036
+ **Impact: HIGH (Reduces attack surface and prevents unauthorized access)**
2037
+
2038
+ Restrict network access to Redis to only trusted sources.
2039
+
2040
+ **Correct: Bind to specific interfaces.**
2041
+
2042
+ ```python
2043
+ # redis.conf
2044
+ bind 127.0.0.1 192.168.1.100
2045
+ protected-mode yes
2046
+ ```
2047
+
2048
+ **Correct: Use firewall rules.**
2049
+
2050
+ ```bash
2051
+ # Allow only application servers
2052
+ iptables -A INPUT -p tcp --dport 6379 -s 192.168.1.0/24 -j ACCEPT
2053
+ iptables -A INPUT -p tcp --dport 6379 -j DROP
2054
+ ```
2055
+
2056
+ **Incorrect: Exposing Redis to the internet.**
2057
+
2058
+ ```python
2059
+ # Bad: Binds to all interfaces
2060
+ bind 0.0.0.0
2061
+ protected-mode no
2062
+ ```
2063
+
2064
+ **Security checklist:**
2065
+
2066
+ ```python
2067
+ # Disable dangerous commands
2068
+ rename-command FLUSHALL ""
2069
+ rename-command DEBUG ""
2070
+ rename-command CONFIG ""
2071
+ ```
2072
+
2073
+ - Use TLS for connections
2074
+
2075
+ - Bind to specific interfaces, not `0.0.0.0`
2076
+
2077
+ - Use firewall rules to restrict access
2078
+
2079
+ - Disable dangerous commands in production
2080
+
2081
+ Reference: [https://redis.io/docs/latest/operate/oss_and_stack/management/security/](https://redis.io/docs/latest/operate/oss_and_stack/management/security/)
2082
+
2083
+ ### 10.3 Use ACLs for Fine-Grained Access Control
2084
+
2085
+ **Impact: HIGH (Limits blast radius if credentials are compromised)**
2086
+
2087
+ Create users with only the permissions they need (principle of least privilege).
2088
+
2089
+ **Correct: Create specific users with limited permissions.**
2090
+
2091
+ ```python
2092
+ # Read-only user for cache access
2093
+ ACL SETUSER app_readonly on >password ~cache:* +get +mget +scan
2094
+
2095
+ # Writer that can't run dangerous commands
2096
+ ACL SETUSER app_writer on >password ~* +@all -@dangerous
2097
+
2098
+ # Admin user (use sparingly)
2099
+ ACL SETUSER admin on >strong-password ~* +@all
2100
+ ```
2101
+
2102
+ **Incorrect: Using the default user for everything.**
2103
+
2104
+ ```python
2105
+ # Bad: Single password for all access
2106
+ requirepass shared-password
2107
+ ```
2108
+
2109
+ **ACL categories:**
2110
+
2111
+ - `@read` - Read commands
2112
+
2113
+ - `@write` - Write commands
2114
+
2115
+ - `@dangerous` - Commands like FLUSHALL, DEBUG
2116
+
2117
+ - `@admin` - Administrative commands
2118
+
2119
+ Reference: [https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/](https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/)
2120
+
2121
+ ---
2122
+
2123
+ ## 11. Observability
2124
+
2125
+ **Impact: MEDIUM**
2126
+
2127
+ SLOWLOG, INFO, MEMORY commands, monitoring metrics, and Redis Insight.
2128
+
2129
+ ### 11.1 Monitor Key Redis Metrics
2130
+
2131
+ **Impact: MEDIUM (Early detection of performance and capacity issues)**
2132
+
2133
+ Track these metrics to catch issues before they impact users.
2134
+
2135
+ | Metric | What It Tells You | Alert When |
2136
+ |--------|-------------------|------------|
2137
+ | `used_memory` | Current memory usage | > 80% of maxmemory |
2138
+ | `connected_clients` | Number of connections | Sudden spikes or drops |
2139
+ | `blocked_clients` | Clients waiting on blocking ops | > 0 sustained |
2140
+ | `instantaneous_ops_per_sec` | Current throughput | Significant drops |
2141
+ | `keyspace_hits/misses` | Cache hit ratio | Hit ratio < 80% |
2142
+ | `rejected_connections` | Connection limit issues | > 0 |
2143
+ | `rdb_last_save_time` | Last persistence snapshot | Too old |
2144
+
2145
+ **Correct: Export metrics to your monitoring system.**
2146
+
2147
+ ```python
2148
+ # Get key metrics
2149
+ info = redis.info()
2150
+ print(f"Memory: {info['used_memory_human']}")
2151
+ print(f"Connections: {info['connected_clients']}")
2152
+ print(f"Ops/sec: {info['instantaneous_ops_per_sec']}")
2153
+ print(f"Hit ratio: {info['keyspace_hits'] / (info['keyspace_hits'] + info['keyspace_misses']) * 100:.1f}%")
2154
+ ```
2155
+
2156
+ **Redis Insight:**
2157
+
2158
+ Use Redis Insight for visual monitoring, query profiling, and debugging. It includes Redis Copilot for natural language queries.
2159
+
2160
+ Reference: [https://redis.io/insight/](https://redis.io/insight/)
2161
+
2162
+ ### 11.2 Use Observability Commands for Debugging
2163
+
2164
+ **Impact: MEDIUM (Enables quick diagnosis of performance issues)**
2165
+
2166
+ Redis provides built-in commands for monitoring and debugging.
2167
+
2168
+ **Key commands:**
2169
+
2170
+ ```python
2171
+ # Slow query log - find slow commands
2172
+ SLOWLOG GET 10
2173
+ SLOWLOG LEN
2174
+ SLOWLOG RESET
2175
+
2176
+ # Server info - comprehensive stats
2177
+ INFO all
2178
+ INFO memory
2179
+ INFO stats
2180
+ INFO replication
2181
+ INFO clients
2182
+
2183
+ # Memory analysis
2184
+ MEMORY DOCTOR
2185
+ MEMORY STATS
2186
+ MEMORY USAGE mykey
2187
+
2188
+ # Client connections
2189
+ CLIENT LIST
2190
+ CLIENT INFO
2191
+
2192
+ # Index info (RQE)
2193
+ FT.INFO idx:products
2194
+ FT.PROFILE idx:products SEARCH QUERY "@name:laptop"
2195
+ ```
2196
+
2197
+ **Correct: Check SLOWLOG regularly.**
2198
+
2199
+ ```python
2200
+ # Get recent slow queries
2201
+ slow_queries = redis.slowlog_get(10)
2202
+ for query in slow_queries:
2203
+ print(f"Duration: {query['duration']}μs, Command: {query['command']}")
2204
+ ```
2205
+
2206
+ Reference: [https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/latency/](https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/latency/)
2207
+
2208
+ ---
2209
+
2210
+ ## References
2211
+
2212
+ 1. [https://redis.io/docs/](https://redis.io/docs/)
2213
+ 2. [https://redis.io/docs/latest/develop/interact/search-and-query/](https://redis.io/docs/latest/develop/interact/search-and-query/)
2214
+ 3. [https://redis.io/docs/latest/develop/clients/redisvl/](https://redis.io/docs/latest/develop/clients/redisvl/)
2215
+ 4. [https://redis.io/docs/latest/develop/ai/langcache/](https://redis.io/docs/latest/develop/ai/langcache/)
2216
+ 5. [https://redis.io/commands/](https://redis.io/commands/)