Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
172 commits
Select commit Hold shift + click to select a range
fde9352
RI-7390 Promote dev-vectorSet flag to regular vectorSet flag (#6036)
dantovska Jun 9, 2026
89c43a8
build(desktop): pin electron-builder to 26.14.0 (snap fix + Wayland)
valkirilov Jun 11, 2026
450981a
fix(snap): migrate snap to core24 to fix launch on modern Linux
valkirilov Jun 12, 2026
90490eb
build(desktop): bump Electron to 41.7.2 (#6063)
pawelangelow Jun 15, 2026
98016b6
Merge pull request #6044 from redis/release/3.6.0
dantovska Jun 15, 2026
79a62af
fix(copilot): block HTML exfiltration vectors in AI chat rendering (R…
DimoHG Jul 6, 2026
4821e4f
Make host/port editable for non-managed databases (#6155)
pawelangelow Jul 9, 2026
ccde3a9
fix(copilot): preserve markdown links, block <style> in AI chat rende…
DimoHG Jul 9, 2026
0064f61
feat(ui): copy changes for WhatsNew feature (#6182)
KrumTy Jul 9, 2026
8f2d230
RI-8228 Markdown value encoding (all key types) (#6175)
VaskoAtanasovRedis Jul 9, 2026
2894376
fix(ui): drop redundant row expand in array View tab (#6185)
VaskoAtanasovRedis Jul 9, 2026
ccd7e61
RI-8310: Move array Delete range next to Add Elements above the table…
pawelangelow Jul 9, 2026
8d18682
fix(copilot): drop <link> regex, block background attr in AI chat
DimoHG Jul 9, 2026
7ccf88f
RI-8312,RI-8314: Align array results table columns and expanded rows …
pawelangelow Jul 9, 2026
533ddde
RI-8219 Reuse the Array command preview in Vector Set (#6178)
dantovska Jul 9, 2026
2cee692
RI-8172 Replace RQE with Redis Search (#6177)
dantovska Jul 9, 2026
4d8ec8e
RI-8311: Move Search-flow Context control above the results table (#6…
pawelangelow Jul 10, 2026
a86559a
E2E: stabilize databases-list row actions and edit-dialog locator (#6…
dantovska Jul 10, 2026
18327ab
RI-8290 Expand index view when clicking on View Index (in key details…
dantovska Jul 10, 2026
6b97178
RI-8315: Edit array element values in a Monaco drawer (#6181)
pawelangelow Jul 10, 2026
da94693
Polish the array actions column (#6188)
pawelangelow Jul 10, 2026
20248a8
RI-8275 i18n: migrate Workbench (#6189)
valkirilov Jul 13, 2026
7c4044b
chore: drop AI-Made PR label instruction (#6191)
valkirilov Jul 13, 2026
8270a97
RI-8275 i18n: migrate Vector Search (#6190)
valkirilov Jul 13, 2026
ab9ad28
Fix jest watch scoping and add typeahead filtering (#6192)
pawelangelow Jul 13, 2026
4a791f1
feat(i18n): migrate cluster-details analytics page (RI-8276) (#6198)
valkirilov Jul 14, 2026
6d1eb7e
RI-8308: Add ability to choose IPv4/IPv6 when connecting to a databas…
pawelangelow Jul 14, 2026
177a6a3
RI-8308: Support multi-tenant Azure Entra ID sign-in (#6194)
pawelangelow Jul 14, 2026
83d2d10
Merge pull request #6156 from redis/fe/bugfix/RED-194228/copilot-bloc…
DimoHG Jul 14, 2026
249154f
feat(ui): Add value decoder (#6143)
saidake Jul 14, 2026
0ff9f87
ci: match draft release by name so installers upload reliably (#6193)
valkirilov Jul 14, 2026
b72b452
RI-8275 E2E: fix Vector Search run button locator (#6201)
dantovska Jul 14, 2026
df1db8d
RI-8174 Promote dev-array feature flag to array (#6203)
VaskoAtanasovRedis Jul 14, 2026
83c87e5
chore(deps): bump dorny/paths-filter from 4.0.1 to 4.0.2 (#6171)
dependabot[bot] Jul 15, 2026
1d4a45f
chore(deps): bump slackapi/slack-github-action from 3.0.3 to 3.0.5 (#…
dependabot[bot] Jul 15, 2026
e9d3f04
chore(deps): bump github/codeql-action from 4.36.2 to 4.37.0 (#6206)
dependabot[bot] Jul 15, 2026
bcab4dc
chore(deps): bump actions/setup-node from 4 to 6.4.0 (#6207)
dependabot[bot] Jul 15, 2026
b285d21
ci: remove failing yarn audit dependency scans (#6212)
valkirilov Jul 16, 2026
1197f67
revert(browser): remove tree-list searchable namespaces (RI-8319) (#6…
dantovska Jul 16, 2026
313a141
feat(ui): add What's New content for 3.8.0 release (#6213)
KrumTy Jul 16, 2026
a99860f
feat(browser): refresh key indexes on key details refresh (#6208)
dantovska Jul 16, 2026
5389246
RI-8171 Create index when no data exists (#6195)
dantovska Jul 16, 2026
bdbb6ec
chore: bump version to 3.8.0 (#6214)
VaskoAtanasovRedis Jul 16, 2026
6f0a087
Run tests on fork PRs via unified pull_request triggers (#6204)
pawelangelow Jul 16, 2026
80f7a9e
RI-8316 Match key type when finding indexes for a key (#6200)
dantovska Jul 16, 2026
062b3db
feat(i18n): migrate database-analysis page (RI-8276) (#6199)
valkirilov Jul 16, 2026
f346e68
feat(i18n): migrate slow-log analytics page (RI-8276) (#6196)
valkirilov Jul 16, 2026
bcf5585
feat(feature-flags): roll out whatsNew to 50% of users (#6220)
KrumTy Jul 17, 2026
474f475
feat(i18n): migrate pub-sub page (RI-8277) (#6218)
valkirilov Jul 17, 2026
c2767e7
feat(i18n): migrate redis-cluster autodiscovery page (RI-8277) (#6219)
valkirilov Jul 17, 2026
a75a080
RI-8277 Migrate vector-search sample datasets to i18n (#6224)
valkirilov Jul 17, 2026
c1015d3
feat(i18n): migrate rdi home & statistics pages (RI-8277) (#6221)
valkirilov Jul 17, 2026
d1e369e
RI-8277 Migrate rdi instance pipeline header to i18n (#6222)
valkirilov Jul 20, 2026
8b8a091
RI-8321: Enforce x-window-id auth on WebSocket connections (#6225)
pawelangelow Jul 20, 2026
a05d057
RI-8322: plugin command sandbox bypass via startsWith() (#6227)
pawelangelow Jul 20, 2026
900d231
RI-8277 Migrate rdi pipeline-management to i18n (#6223)
valkirilov Jul 20, 2026
a6e60e5
Merge remote-tracking branch 'origin/release/3.8.0' into chore/merge-…
pawelangelow Jul 20, 2026
815499a
Merge pull request #6237 from redis/chore/merge-release-3.8.0-into-la…
VaskoAtanasovRedis Jul 20, 2026
2848c4c
Remove obsolete Vector Search E2E specs (RI-8319 / RI-8171) (#6235)
dantovska Jul 20, 2026
b5c91ed
feat(i18n): migrate autodiscover-azure to i18n (RI-8273) (#6240)
valkirilov Jul 20, 2026
c5ec0a2
feat(i18n): migrate autodiscover-cloud to i18n (RI-8273) (#6241)
valkirilov Jul 21, 2026
18c3fde
Merge pull request #6248 from redis/latest
VaskoAtanasovRedis Jul 21, 2026
ed4e4ac
feat(api): enable whatsNew for everyone (#6247)
KrumTy Jul 21, 2026
4db705f
feat(i18n): migrate autodiscover-sentinel to i18n (RI-8273) (#6242)
valkirilov Jul 21, 2026
723eb3c
feat(i18n): migrate add-database & connection forms to i18n (RI-8273)…
valkirilov Jul 21, 2026
0e2bdba
Migrate package manager from yarn to npm (#6216)
pawelangelow Jul 21, 2026
8dd691e
Fix Windows build: use cmd.exe-valid path for build:statics:win (#6251)
pawelangelow Jul 21, 2026
a159067
chore: remove prodMode feature flag code references (#6257)
KrumTy Jul 22, 2026
6bdff11
chore: remove whatsNew feature flag code references (#6258)
KrumTy Jul 22, 2026
bc24d22
Fix e2e navigation helper hanging on an empty databases list (#6259)
pawelangelow Jul 22, 2026
288862d
chore(deps): bump github/codeql-action from 4.37.0 to 4.37.1 (#6252)
dependabot[bot] Jul 22, 2026
ddf1582
chore(deps): bump slackapi/slack-github-action from 3.0.5 to 4.0.0 (#…
dependabot[bot] Jul 22, 2026
b20ea6d
chore(deps): bump actions/checkout from 7.0.0 to 7.0.1 (#6254)
dependabot[bot] Jul 22, 2026
e82644a
chore(deps): bump actions/setup-node from 6.4.0 to 7.0.0 (#6255)
dependabot[bot] Jul 22, 2026
e931052
Resolve npm audit critical & high vulnerabilities (#6229)
pawelangelow Jul 22, 2026
c23ddf8
chore(deps-dev): bump brace-expansion in /tests/e2e-playwright (#6250)
dependabot[bot] Jul 22, 2026
bc49f20
Add scheduled dependency vulnerability audit + dead-dependencies skil…
pawelangelow Jul 22, 2026
63d86f4
chore(deps): bump typeorm from 0.3.29 to 0.3.31 in /redisinsight/api …
dependabot[bot] Jul 22, 2026
21c6c60
chore(deps-dev): bump csv-stringify from 6.4.0 to 6.8.1 (#6134)
dependabot[bot] Jul 22, 2026
f8dfa40
Split FieldsSchemaEditor into smaller components (#6217)
saidake Jul 22, 2026
8acf29f
chore(deps): bump dompurify from 3.4.11 to 3.4.12 (#6264)
dependabot[bot] Jul 22, 2026
9b1cbca
RI-8317 Detect and highlight large vector embeddings in the query edi…
dantovska Jul 22, 2026
48d8547
chore: add npm min-release-age to prevent installing fresh packages (…
valkirilov Jul 22, 2026
4ae4b4d
chore(deps): remediate high/critical npm audit findings across all tr…
pawelangelow Jul 23, 2026
1b1076f
chore: yarn to npm leftovers (#6270)
pawelangelow Jul 23, 2026
8687639
feat(vector-search): drop the vectorSearchV2 feature flag (#6256)
valkirilov Jul 23, 2026
1ebae48
Fail E2E CI runs fast after 20 test failures (#6275)
pawelangelow Jul 23, 2026
8c1e5e3
chore(deps): bump body-parser in /redisinsight/api (#6271)
dependabot[bot] Jul 24, 2026
4df1c72
chore(deps-dev): bump @babel/core in /redisinsight/api (#6273)
dependabot[bot] Jul 24, 2026
ac806fd
RI-8326 Collapse large vector embeddings in the query editor (#6267)
dantovska Jul 24, 2026
32fcfa5
RI-8329: Warn before editing values in a non-Unicode format (#6274)
pawelangelow Jul 24, 2026
5f373e9
test(e2e): harden flaky page-object waits (#6282)
pawelangelow Jul 24, 2026
71d18f5
Remove vectorSet feature flag (#6283)
dantovska Jul 24, 2026
d1b5b02
Update readme for supported features and data types (#6294)
dantovska Jul 27, 2026
e03e416
fix: use CLUSTER SLOTS preferred endpoint for cluster discovery (#6180)
MickeyShnaiderman-RecoLabs Jul 27, 2026
f377402
feat(i18n): migrate browser left panel & search bar to i18n (RI-8274)…
valkirilov Jul 27, 2026
4de64c2
Add vector set integration tests (#6295)
dantovska Jul 27, 2026
e31b888
test(api): fix flaky vector-set similarity-search ordering assertion …
dantovska Jul 28, 2026
1dbede1
feat(i18n): migrate browser right panel (add-key) & bulk actions to i…
valkirilov Jul 28, 2026
1305091
RED-195979: Gate vector search enhancements behind vs-enhancements fl…
dantovska Jul 28, 2026
919cf03
RI-8353 Sentry hygiene: drop noise & fingerprint fragmented issues (#…
KrumTy Jul 28, 2026
90748a8
fix(workbench): guard null in findStopArgumentWithSuggestions (RI-834…
KrumTy Jul 28, 2026
d044065
feat(browser): promote Array & Vector Set key types on unsupported Re…
dantovska Jul 28, 2026
6c63d13
fix(virtual-grid): guard getRowHeight against a missing row-height en…
KrumTy Jul 28, 2026
12097d5
fix: display WITHSUFFIXTRIE for RediSearch text fields (#6231)
trippyogi Jul 29, 2026
f4a2519
fix(api): correct TS7053 error count in context.util.ts (#6310) (#6308)
valkirilov Jul 29, 2026
a85cb8b
test(browser): update Vector Set gating e2e for promoted-disabled key…
dantovska Jul 29, 2026
bfc1897
Merge pull request #6288 from redis/feature/RI-8328/cloud-totp-mfa-login
VaskoAtanasovRedis Jul 29, 2026
f035f4c
VDP-4556: Block server-side file reads on database import for non-des…
pawelangelow Jul 29, 2026
3e5f5a5
RI-8204: Replace react-jsx-parser with react-markdown (#6296)
pawelangelow Jul 29, 2026
b8e5989
fix(instance): connect on deep-link to refresh modules (#6230)
trippyogi Jul 29, 2026
6f7c3f9
feat(i18n): migrate browser key-details framework to i18n (RI-8274) (…
valkirilov Jul 30, 2026
5a88d56
feat(i18n): migrate browser simple value editors to i18n (RI-8274) (#…
valkirilov Jul 30, 2026
e825f16
feat(i18n): migrate browser advanced value editors to i18n (RI-8274) …
valkirilov Jul 30, 2026
79c9edf
docs(skills): use Refs instead of Closes in PR template (#6313)
valkirilov Aug 3, 2026
408d7c8
fix(i18n): localize shared browser error/help constants & stabilize s…
valkirilov Aug 3, 2026
25ed214
RI-8357 Add search to the index drop-down and the search indexes list…
VaskoAtanasovRedis Aug 6, 2026
5f13317
fix(workbench): show module command results when ACL hides module lis…
trippyogi Aug 6, 2026
58c7262
test(ui): fix flaky AutoRefresh interval test (#6329)
valkirilov Aug 6, 2026
71e6262
RI-8271 i18n: migrate not-found, redis-stack, and home database list …
valkirilov Aug 7, 2026
0b53c6c
RI-8271 i18n: migrate home connection forms (#6315)
valkirilov Aug 7, 2026
f39c7b8
RI-8308: Fix Azure Entra ID token reuse across tenants (#6319)
pawelangelow Aug 7, 2026
efbe8fc
Fix failing Playwright e2e tests (#6331)
pawelangelow Aug 7, 2026
6e72ea5
Bump better-sqlite3 to v13 (N-API) and Electron to 43 (#6332)
pawelangelow Aug 7, 2026
213e76a
ci: group Dependabot updates and stop generating unmergeable bumps (#…
pawelangelow Aug 10, 2026
8ab4c40
chore(deps): bump the github-actions group with 2 updates (#6347)
dependabot[bot] Aug 10, 2026
029feed
ci: stop Dependabot proposing major updates (#6361)
pawelangelow Aug 10, 2026
d88fec1
chore(deps): bump the production-patch group across 1 directory with …
dependabot[bot] Aug 10, 2026
99299fd
chore(deps): bump fast-uri from 3.1.4 to 3.1.5 (#6325)
dependabot[bot] Aug 10, 2026
b425c5f
chore(deps-dev): bump fast-uri from 3.1.4 to 3.1.5 in /redisinsight/a…
dependabot[bot] Aug 10, 2026
78353a4
chore(deps): bump socket.io-parser from 4.2.6 to 4.2.7 (#6322)
dependabot[bot] Aug 10, 2026
adceeff
chore(deps): bump socket.io-parser in /redisinsight/api (#6321)
dependabot[bot] Aug 10, 2026
146f1ed
chore(deps): bump undici (#6318)
dependabot[bot] Aug 10, 2026
be0b514
chore(deps): bump postcss in /redisinsight/ui/src/packages (#6334)
dependabot[bot] Aug 10, 2026
325bffd
chore(deps-dev): bump js-yaml in /tests/e2e-playwright (#6335)
dependabot[bot] Aug 10, 2026
ca6d54d
chore(deps-dev): bump i18next-cli in the internationalization group (…
dependabot[bot] Aug 10, 2026
00ca729
chore(deps): bump postcss from 8.5.10 to 8.5.26 (#6337)
dependabot[bot] Aug 10, 2026
dddadc4
chore(deps-dev): bump redux-mock-store (#6341)
dependabot[bot] Aug 10, 2026
025d9a1
chore(deps): bump the react group across 1 directory with 2 updates (…
dependabot[bot] Aug 10, 2026
e4d6f74
fix(deps): dedupe @sentry/core and align the Sentry packages (#6372)
pawelangelow Aug 10, 2026
5431f9e
chore(deps): bump the nestjs group across 1 directory with 12 updates…
dependabot[bot] Aug 10, 2026
cd284d5
chore(deps): bump better-sqlite3 in /redisinsight (#6358)
dependabot[bot] Aug 10, 2026
d83df47
chore(api): drop the glob override and stop deep-importing from @nest…
pawelangelow Aug 10, 2026
d6541dd
chore(deps): bump socket.io-client (#6375)
dependabot[bot] Aug 10, 2026
d8b91ec
chore(deps-dev): bump the testing group across 1 directory with 6 upd…
dependabot[bot] Aug 10, 2026
2231c36
Fix dependabot package-lock.json drift (#6377)
pawelangelow Aug 10, 2026
554c0e8
fix(api): restore named enum schemas for NodeRole and HealthStatus (#…
pawelangelow Aug 10, 2026
e83b270
chore(deps-dev): bump the development-minor group across 1 directory …
dependabot[bot] Aug 10, 2026
d502df2
chore(deps-dev): bump brace-expansion from 1.1.16 to 1.1.18 (#6373)
dependabot[bot] Aug 10, 2026
de19d6a
chore(deps): bump the production-patch group across 1 directory with …
dependabot[bot] Aug 10, 2026
a302975
chore(deps-dev): bump the babel group across 1 directory with 2 updat…
dependabot[bot] Aug 10, 2026
a66f4ce
chore(deps): bump the electron-build group across 1 directory with 2 …
dependabot[bot] Aug 10, 2026
a66fb72
chore(deps-dev): bump the types group across 1 directory with 4 updat…
dependabot[bot] Aug 10, 2026
697a32c
fix(configs): use modern module resolution in the build config projec…
pawelangelow Aug 11, 2026
6a4de27
chore(deps-dev): bump the observability group across 1 directory with…
dependabot[bot] Aug 11, 2026
28fc24b
Add auto-update strategy: notify vs auto mode (#6326)
valkirilov Aug 11, 2026
c7da319
Add Settings toggle to change update strategy (#6327)
valkirilov Aug 11, 2026
c7c390d
chore(deps): bump the production-minor group across 1 directory with …
dependabot[bot] Aug 11, 2026
497264d
RI-8270 Migrate Tips recommendation strings to i18n (#6384)
valkirilov Aug 11, 2026
0594db4
chore(deps): bump brace-expansion and js-yaml to clear high advisorie…
pawelangelow Aug 11, 2026
561870e
fix(ui): adopt stricter AutoSizer types and keep monitor autoscroll w…
pawelangelow Aug 11, 2026
16f96dc
chore(deps-dev): bump i18next-cli in the internationalization group (…
dependabot[bot] Aug 12, 2026
96f36ff
RI-8373 Use a literal encryption key for E2E tests (#6407)
pawelangelow Aug 12, 2026
c570678
RI-8373 Run E2E on dependency branches and stop label events cancelli…
pawelangelow Aug 12, 2026
ddbb0c4
chore(deps): bump the production-minor group across 1 directory with …
dependabot[bot] Aug 13, 2026
3482f1a
chore(deps-dev): bump the development-patch group across 1 directory …
dependabot[bot] Aug 13, 2026
4684684
chore(deps-dev): bump the development-minor group across 1 directory …
dependabot[bot] Aug 13, 2026
1dba2d4
chore(deps-dev): bump the babel group across 1 directory with 3 updat…
dependabot[bot] Aug 13, 2026
6ff7e8e
chore(deps): bump the electron-runtime group across 1 directory with …
dependabot[bot] Aug 13, 2026
0680640
RI-8373 Re-configure Dependabot (#6408)
pawelangelow Aug 13, 2026
7821155
chore: merge main into agent memory branch
abrookins Aug 14, 2026
afa3758
fix(agent-memory): address review feedback
abrookins Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .ai/commands/pull-request-review.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ standards with good test coverage.
1. **Code Style** (Style)
- File: Multiple files
- Issue: Inconsistent import ordering
- Recommendation: Run `yarn prettier:fix`
- Recommendation: Run `npm run prettier:fix`

## Risk Assessment

Expand Down
6 changes: 3 additions & 3 deletions .ai/skills/code-quality/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ description: >-

## Critical Rules

- **ALWAYS run linter** after code changes: `yarn lint`
- **ALWAYS run linter** after code changes: `npm run lint`
- Linter must pass before committing
- No console.log in production code (use console.warn/error only)

Expand Down Expand Up @@ -117,7 +117,7 @@ Also avoid:

When updating npm packages (especially `@redis-ui/*` packages):

1. **Clear Vite cache** after `yarn install`:
1. **Clear Vite cache** after `npm install`:

```bash
rm -rf node_modules/.vite
Expand All @@ -130,7 +130,7 @@ When updating npm packages (especially `@redis-ui/*` packages):

## Pre-Commit Checklist

- [ ] `yarn lint` passes
- [ ] `npm run lint` passes
- [ ] No TypeScript errors
- [ ] Import order is correct
- [ ] No `any` types without reason
Expand Down
134 changes: 134 additions & 0 deletions .ai/skills/dead-dependencies/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
---
name: dead-dependencies
description: >-
Find and safely remove unused ("dead") npm dependencies in RedisInsight
using a grep + leaf-check + build-gate recipe. Use when cleaning up
dependencies, investigating whether a package is still used, removing a
suspected leftover, or when the user mentions dead deps, unused
dependencies, dependency cleanup, leftover packages, or "is this safe to
remove". Complements the weekly vulnerability audit
(`scripts/dependency-audit-report.mjs`), which only reports vulnerabilities.
---

# Dead Dependencies

Identify and safely remove unused npm dependencies. This is a **local,
interactive** workflow — a scheduled report can only ever guess; confirming a
dependency is dead requires grepping real usage and running the build.

## Why manual (not knip/depcheck)

Static tools over-report badly in this repo and must not be trusted blindly:

- The root `package.json` is a **mega-manifest** (UI + desktop + build + test
+ storybook + electron), so a tool scanning one area flags everything used
elsewhere as "unused".
- Lots of dependencies are referenced **without an `import`**: webpack loaders
and eslint/jest/babel plugins by string in config, tools invoked from
`package.json` `scripts`, runtime `-r` preloads, dynamic `require`, and
ambient `@types/*`.
- The webpack→Vite migration left **genuinely dead** build tooling behind,
mixed in with false positives.

The reliable signal is: **grep for usage → confirm it's a leaf → remove it and
run the build gate.** That is exactly how `jsonpath` was confirmed dead and
removed (worked example at the bottom).

## The recipe (per candidate)

### 1. Grep the whole repo for real usage

```bash
PKG=jsonpath # the dependency to check
grep -rn "$PKG" \
redisinsight configs scripts tests .storybook \
--include=*.ts --include=*.tsx --include=*.js --include=*.jsx \
--include=*.mjs --include=*.cjs --include=*.json \
2>/dev/null | grep -v node_modules
```

Look for `import ... from '$PKG'`, `require('$PKG')`, `import('$PKG')`, and
bare references. Ignore unrelated substring hits (e.g. `nestjs-form-data` when
checking `form-data`, or a package name appearing only in tutorial/`manifest`
text). **Zero real references → candidate for the next steps.**

### 2. Rule out no-import usage

A clean grep is **necessary but not sufficient**. Check the ways a package is
used without an `import`:

- **Config string references** — search the build/test config for the bare
name: `.eslintrc.js`, `configs/webpack.config.*.ts`,
`redisinsight/ui/vite.config.mjs`, `jest.config.cjs`, `babel.config.cjs`,
`electron-builder.json`, `.mocharc*`. eslint plugins, webpack loaders, and
jest/mocha reporters live here.
- **`package.json` scripts** — a tool like `concurrently`, `lint-staged`, or a
reporter is "used" if a `scripts` entry (any workspace) invokes it.
- **Runtime preloads / dynamic** — `node -r <pkg>`, `require(variable)`, or a
wasm/worker loader with a computed path.

### 3. Leaf check

```bash
npm ls "$PKG" # in the workspace that declares it
```

Confirm nothing else in the tree depends on it, and note any transitive deps it
uniquely pulls (removing `jsonpath` also dropped `underscore`).

### 4. Classify before acting

| Situation | Action |
| --- | --- |
| Plain runtime/dev dep, zero references anywhere | **Delete** (after the gate below) |
| `@types/x` where base `x` bundles its own types (`node_modules/x/package.json` has `types`/`typings`) | **Delete** — the DefinitelyTyped package is obsolete |
| `@types/x` that's ambient/global-only (e.g. `@types/webpack-env`) | **Keep** — never imported by design |
| Declared in more than one workspace (`package.json`), used in only one | **Relocate/dedupe** — remove the *unused* declaration, never the used copy |
| Shadows a Node builtin (`buffer`, `assert`, …) | **Keep** — usually a false positive |
| Referenced only in a config/`scripts` (step 2 hit) | **Keep** |

### 5. The gate — the only real proof

Remove it, reinstall (per the repo's dependency rules — never hand-edit
`package.json`/lockfile, never `--ignore-scripts`), and verify the affected
area builds:

```bash
npm uninstall "$PKG" # in the declaring workspace; updates the lockfile
npm run type-check # or the affected workspace's type-check
npm run test # / test:api, as relevant
npm run build # if it's a build-time dep
```

Green across the relevant checks = safe. Commit the `package.json` +
`package-lock.json` change (see the git-safety / dependency rules in
`CLAUDE.md`). If anything goes red, it wasn't dead — restore it.

## Optional: enumerate candidates to sweep

To triage the whole surface rather than one package, list declared deps and
grep each for an import, then apply steps 2–5 to the ones with zero hits:

```bash
node -e "const p=require('./package.json');console.log([...Object.keys(p.dependencies||{}),...Object.keys(p.devDependencies||{})].join('\n'))" \
| while read PKG; do
hits=$(grep -rl --include=*.ts --include=*.tsx --include=*.js --include=*.jsx --include=*.mjs \
-e "from ['\"]$PKG" -e "require(['\"]$PKG" redisinsight configs scripts tests 2>/dev/null | grep -vc node_modules)
[ "$hits" = "0" ] && echo "candidate: $PKG"
done
```

This is a **first filter only** — every candidate still goes through steps 2–5.
Expect false positives (config/string/dynamic/ambient use). Never delete straight
from this list.

## Worked example — `jsonpath`

1. Grep across the repo → the only hits were unrelated tutorial text in a
`manifest.json`; **no `import`/`require`**.
2. Not referenced in any config or script.
3. `npm ls jsonpath` → a leaf; it was also the sole reason `underscore` was
installed.
4. Plain runtime dep, zero references → likely deletable.
5. Removed `jsonpath` + `@types/jsonpath`, `npm install`, `npm run type-check`
→ green. Confirmed dead; committed. (`underscore` dropped with it.)
36 changes: 30 additions & 6 deletions .ai/skills/e2e-testing/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,10 @@ npx playwright test # All projects

Put a test in `tests/serial/` when it:
- Shares database state across tests via `beforeAll`
- Runs dangerous commands or mutates global app state
- Runs dangerous commands or mutates global app state. Settings are global:
`scanThreshold`, `dateFormat`, `timezone` and `batchSize` are one shared resource,
so a spec that changes one and holds it across other work breaks every concurrent
test that reads it
- Cannot tolerate concurrent execution with other tests
- Would cause flakiness when run with other tests
- Require special environment configuration
Expand Down Expand Up @@ -310,15 +313,36 @@ const config = ConfigFactory.build({ name: 'custom-name' });

### Cleanup Pattern

Always prefix test data with `test-` for easy cleanup:
Prefix test data with `test-` so leftovers are identifiable, but **never clean up by
that prefix**. Specs share a Redis instance and different files run on different
workers, so deleting every `test-*` key also removes keys the specs alongside it are
still asserting on, and their rows disappear mid-test.

Track what a test creates and delete only that:

```typescript
// In apiHelper
async deleteTestData(): Promise<number> {
return this.deleteByPattern(new RegExp(`^${TEST_PREFIX}`));
}
import { createKeyTracker } from 'e2eSrc/helpers';

test.describe('Browser > Add Key', () => {
const keys = createKeyTracker();

test.afterEach(async ({ apiHelper }) => {
await keys.cleanup(apiHelper, database.id);
});

test('should add a Hash key', async ({ browserPage }) => {
const keyData = keys.track(HashKeyFactory.build());
// keys.add(name) records a name built without a factory, e.g. a rename target.
});
});
```

Miss a `track()` and the key is never deleted, which is harmless in CI (the test
environment is recreated per run) but accumulates locally until the RTE restarts.

Databases need no such care: each spec deletes its own in `afterAll`, and
`browser.setup` clears leftover `test-` databases once before the run.

## Fixtures

### Add New Fixtures to base.ts
Expand Down
32 changes: 28 additions & 4 deletions .ai/skills/i18n/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,29 @@ import { Trans } from 'uiSrc/i18n';
// getTranslatedApiError() fills {{databaseId}} from response.data.resource — no extra code.
```

## Plurals

Use i18next's native **`count`-based** plurals — never a hand-rolled `isPlural` branch with
`.single`/`.plural` keys.

- Add one key per plural form with the i18next suffix: `key_one`, `key_other` (a language may
need more forms — `_few`, `_many` — but `en`/`bg` only use `_one`/`_other`).
- Reference the **base** key (no suffix) and pass `count`; i18next selects the form:
`t('key', { count })` or `<Trans i18nKey="key" count={n} …/>`.
- The base key type-checks even though only the suffixed forms are in `en.json` — i18next's
types resolve it from the `_one`/`_other` entries.
- **Write the whole sentence in each form.** Don't interpolate the one differing word as a
fragment — word order, agreement, and the number of plural forms vary by language.
- Renaming a key (e.g. `.single` → `_one`) leaves the old key behind in `bg.json` because
`i18n:extract` doesn't prune — delete the orphan so en/bg parity holds.

```tsx
// en.json:
// "workbench.runConfirm.body_one": "…This command is part of…"
// "workbench.runConfirm.body_other": "…These commands are part of…"
<Trans i18nKey="workbench.runConfirm.body" count={commands.length} components={{ bold }} />
```

## Keys

- **Flat, dotted keys** — `keySeparator` and `nsSeparator` are `false`, so a dot is a literal character, not nesting. `"api.error.code.11000.title"` is a single key.
Expand Down Expand Up @@ -130,13 +153,13 @@ The backend ships a stable `errorCode` on every user-facing error (see
1. Add the key + English value to `en.json` **and** the same key to `bg.json` (translated, or empty to defer). Keep both sorted and in parity.
2. Reference it: `t('my.key')` / `i18n.t('my.key')` / `<Trans i18nKey="my.key" …/>`.
3. For dynamic values, pass `values` (interpolation) or `resource` (backend errors).
4. Run `yarn i18n:extract` to sync/sort, and `yarn i18n:check` to catch duplicate keys.
5. `yarn type-check` (new literal keys must resolve) and `yarn lint:ui`.
4. Run `npm run i18n:extract` to sync/sort, and `npm run i18n:check` to catch duplicate keys.
5. `npm run type-check` (new literal keys must resolve) and `npm run lint:ui`.

## Tooling

- `yarn i18n:extract` — scans `t()`/`<Trans>` usages and syncs `en.json`/`bg.json` (alphabetical; does **not** prune unused keys). Note: dynamic (`as never`) keys aren't discovered by extraction — keep them in the locale files manually.
- `yarn i18n:check` — fails if a locale file has a **duplicate key** (JSON silently keeps the last, so a dup would shadow a value). Runs in CI on PRs touching `locales/**`.
- `npm run i18n:extract` — scans `t()`/`<Trans>` usages and syncs `en.json`/`bg.json` (alphabetical; does **not** prune unused keys). Note: dynamic (`as never`) keys aren't discovered by extraction — keep them in the locale files manually.
- `npm run i18n:check` — fails if a locale file has a **duplicate key** (JSON silently keeps the last, so a dup would shadow a value). Runs in CI on PRs touching `locales/**`.
- Dev override: append `?lang=bg` to the URL to preview Bulgarian.

## Do / Don't
Expand All @@ -146,3 +169,4 @@ The backend ships a stable `errorCode` on every user-facing error (see
- ✅ Keep en/bg key parity; empty bg is an acceptable "later" placeholder.
- ❌ Don't hardcode user-facing strings — add a key.
- ❌ Don't hand-edit the locale-file key order — let `i18n:extract` sort.
- ❌ Don't hand-roll plurals with a JS branch — use `count` + `key_one`/`key_other` (see Plurals).
7 changes: 2 additions & 5 deletions .ai/skills/pull-requests/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@ description: >-

## Creating a PR

### Labels

When creating PRs with AI assistance, always add the **"AI-Made"** label.

### PR Title

Include issue number at the start:
Expand All @@ -36,7 +32,7 @@ Describe how to test the changes.

---

Closes #RI-123
Refs #RI-123
```

**PR Description Guidelines:**
Expand All @@ -45,6 +41,7 @@ Closes #RI-123
- **Focus on high-level changes** - Don't list every code change in the #What section
- **Brief and to the point** - The diff shows the details; describe the "why" and "what" at a high level
- **Technical decisions** - Only mention significant architectural or design decisions if relevant
- **Link, don't auto-close** - Use `Refs #RI-123` / `Addresses #RI-123`, not `Closes`/`Fixes`/`Resolves` - those keywords auto-close the issue when the PR merges, and tickets should be closed manually, not by the merge

## Review Process

Expand Down
4 changes: 2 additions & 2 deletions .ai/skills/redis-insight-plugin/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ See [references/official-docs-summary.md](references/official-docs-summary.md) f
> - **[redis-ui-components](../redis-ui-components/)** — build all plugin UI from Redis UI
> components. Import the internal `uiSrc/components/ui` wrappers; **never** import raw
> `@redis-ui/*`. (This skill is a symlink into the installed `@redis-ui/components` package,
> so it resolves after `yarn install`; if it is missing, run install — the canonical source is
> so it resolves after `npm install`; if it is missing, run install — the canonical source is
> `node_modules/@redis-ui/components/skills/redis-ui-components/`.)
> - **[code-quality](../code-quality/SKILL.md)** — TypeScript everywhere (no `any`), naming
> (`PascalCase` / `camelCase` / `UPPER_SNAKE_CASE`), import order, no magic numbers, no
Expand Down Expand Up @@ -161,7 +161,7 @@ See [references/review-hardening.md](references/review-hardening.md).
## Build and Verify

```bash
yarn build
npm run build
test -f dist/index.js
test -f dist/styles.css # if "styles" is declared
grep -c "process.env" dist/index.js # must be 0 in a Parcel build
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,4 @@ Validate persisted state before applying — fields can disappear or change shap
| Values mapped to wrong field/axis | Response shape assumption wrong | Branch on the actual runtime shape, not the command name. |
| Theme looks wrong | No `theme_DARK` handling | Read `document.body.classList` or `getTheme()` from SDK. |
| Plugin disappears after Insight upgrade | Manifest field changed | Re-read official docs and update `package.json`. |
| Large bundle, slow load | Missing minify, full lodash | Run `yarn minify:js`; switch to scoped imports. |
| Large bundle, slow load | Missing minify, full lodash | Run `npm run minify:js`; switch to scoped imports. |
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Recommended scripts (see [../templates/external-parcel-package.json](../template
```json
"scripts": {
"start": "parcel src/index.html",
"build": "concurrently \"yarn build:js\" \"yarn build:css\"",
"build": "concurrently \"npm run build:js\" \"npm run build:css\"",
"build:js":"parcel build src/main.tsx --no-source-maps --dist-dir dist --target module",
"build:css":"parcel build src/styles/styles.scss --no-source-maps --dist-dir dist",
"minify:js":"terser dist/index.js -o dist/index.js -c -m",
Expand Down Expand Up @@ -95,7 +95,7 @@ Strip the rest before copying into `~/.redis-insight/plugins/<name>/`. The deplo

## Outputs

After `yarn build`:
After `npm run build`:

- `dist/index.js` — single bundled module.
- `dist/styles.css` — single stylesheet.
Expand All @@ -107,8 +107,8 @@ For RedisInsight product UI fidelity, copy `templates/external-styles.scss` to `
## Verification

```bash
yarn build
yarn verify # runs templates/verify-plugin.sh
npm run build
npm run verify # runs templates/verify-plugin.sh
```

`verify` should report:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,8 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: yarn install --frozen-lockfile
- run: yarn build
- run: npm ci
- run: npm run build
- run: bash scripts/verify-plugin.sh
- uses: actions/upload-artifact@v4
with:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ export default { renderExampleView };

## Testing & Verification

- `yarn build` produces `dist/index.js` and `dist/styles.css`.
- `npm run build` produces `dist/index.js` and `dist/styles.css`.
- `templates/verify-plugin.sh` confirms file presence, no `process.env`, and that activation method names appear in the bundle.
- Deploy with `templates/deploy-external.sh` (folder install) or `templates/deploy-internal-docker.sh` (Docker container).
- After deploy, `curl http://localhost:5540/api/plugins` and grep for the plugin name.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,15 @@ That's it. Nothing else is required at deploy time.
External (host install):

```bash
yarn build
npm run build
bash templates/verify-plugin.sh
bash templates/deploy-external.sh
```

Inside Docker RedisInsight:

```bash
yarn build
npm run build
bash templates/verify-plugin.sh
bash templates/deploy-internal-docker.sh
```
Expand Down
Loading