Skip to content

feat(core): add namespace support to LocalStorageAdapter for micro-fr…#97

Merged
purushpsm147 merged 3 commits intomainfrom
core-update-2
Mar 29, 2026
Merged

feat(core): add namespace support to LocalStorageAdapter for micro-fr…#97
purushpsm147 merged 3 commits intomainfrom
core-update-2

Conversation

@purushpsm147
Copy link
Copy Markdown
Collaborator

@purushpsm147 purushpsm147 commented Mar 29, 2026

This pull request introduces a new namespacing feature for localStorage keys across the PassiveIntent core SDK, which is crucial for preventing key collisions when multiple PassiveIntent instances (such as in micro-frontend architectures) share the same browser origin. It also includes a significant internal refactor to the module export structure, removing the internal barrel file and exporting all symbols directly from their canonical modules. Documentation and tests have been updated to reflect these changes.

Key changes:

Namespacing and Persistence Isolation

  • Added an optional namespace parameter to the BrowserStorageAdapter and LocalStorageAdapter constructors, defaulting to 'passiveintent:'. This prefix is prepended to every localStorage key to isolate data between multiple PassiveIntent instances. The IntentManagerConfig and BrowserConfig interfaces now also accept a namespace field, which is forwarded to the storage adapter. [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]

  • Cypress tests and sandboxes updated to expect namespaced keys in localStorage, ensuring correct usage and coverage of the new feature. [1] [2] [3]

Internal Refactoring & Exports

  • Removed the internal intent-sdk.ts barrel file; all exports now resolve directly from their source modules, improving maintainability and clarity. This is a non-breaking internal change; all exports remain available from @passiveintent/core. [1] [2] [3] [4] [5] [6] [7] [8]

Documentation

  • Updated README.md and CHANGELOG.md to document the new namespace option, its default value, and usage examples for both the storage adapters and configuration objects. [1] [2] [3] [4]

Version Bump

  • Bumped package version to 1.3.0 to reflect the new feature and internal refactor.…ontend isolation
  • Introduced a namespace parameter to LocalStorageAdapter to prevent key collisions between multiple instances sharing the same origin.
  • Updated methods to use namespaced keys for load, save, and delete operations.
  • Added documentation for namespace usage in the adapter.

feat(core): extend IntentManagerConfig and IntentEngineConfig with namespace option

  • Added namespace option to IntentManagerConfig and IntentEngineConfig to allow configuration of localStorage key prefixes for instance isolation.

fix(tests): update import paths in tests to use the correct index file

  • Changed import statements in various test files to reference the correct module entry point.

chore(react): deprecate usePropensityScore hook in favor of usePropensity

  • Marked usePropensityScore as deprecated and updated documentation to recommend usePropensity.
  • Added a console warning for the deprecated hook to guide users towards migration.

fix(remix): improve error handling in createIntentClientLoader

  • Wrapped serverLoader calls in try-catch to provide clearer diagnostic messages when serverLoader is missing.

test(remix): enhance tests for new features and deprecations

  • Added tests for deprecation warnings in usePropensityScore.
  • Expanded test coverage for createIntentClientLoader and useRoutePassiveIntent to ensure correct behavior with new implementations.

Description

Type of change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Refactor / chore

Checklist

  • My code follows the project's style guidelines
  • I have run npm run lint and npm run typecheck locally
  • I have added/updated tests that prove my fix or feature works
  • All existing tests pass (npm run test:unit -w @passiveintent/core)
  • I have updated documentation where applicable

Summary by CodeRabbit

  • New Features

    • Optional storage key namespacing (default "passiveintent:") to isolate persisted keys; opt-out by using an empty namespace.
    • Added persistence adapter delete() to remove stored keys (silently no-ops when storage is unavailable).
  • Deprecation

    • Marked usePropensityScore hook as deprecated; usePropensity is the recommended drop-in replacement.
  • Bug Fixes

    • Clearer loader error when a server loader is missing.
    • Fixed stale-closure in route tracking via ref forwarding.
  • Documentation

    • Migration guide and dev-only warnings for config changes added.

…ontend isolation

- Introduced a `namespace` parameter to `LocalStorageAdapter` to prevent key collisions between multiple instances sharing the same origin.
- Updated methods to use namespaced keys for `load`, `save`, and `delete` operations.
- Added documentation for namespace usage in the adapter.

feat(core): extend IntentManagerConfig and IntentEngineConfig with namespace option

- Added `namespace` option to `IntentManagerConfig` and `IntentEngineConfig` to allow configuration of localStorage key prefixes for instance isolation.

fix(tests): update import paths in tests to use the correct index file

- Changed import statements in various test files to reference the correct module entry point.

chore(react): deprecate usePropensityScore hook in favor of usePropensity

- Marked `usePropensityScore` as deprecated and updated documentation to recommend `usePropensity`.
- Added a console warning for the deprecated hook to guide users towards migration.

fix(remix): improve error handling in createIntentClientLoader

- Wrapped serverLoader calls in try-catch to provide clearer diagnostic messages when serverLoader is missing.

test(remix): enhance tests for new features and deprecations

- Added tests for deprecation warnings in `usePropensityScore`.
- Expanded test coverage for `createIntentClientLoader` and `useRoutePassiveIntent` to ensure correct behavior with new implementations.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 29, 2026

📝 Walkthrough

Walkthrough

Adds optional namespacing for browser/localStorage persistence (default "passiveintent:"), a delete() persistence adapter method, wires namespace through factory/engine/config normalization, refactors the public barrel exports (removes intent-sdk.ts), and applies related test, doc, and Remix/React integration updates.

Changes

Cohort / File(s) Summary
Persistence Adapters
packages/core/src/adapters.ts, packages/core/src/plugins/web/LocalStorageAdapter.ts
Add optional namespace constructor param (default 'passiveintent:'); use nsKey() to prefix keys; get/load falls back to legacy unprefixed key (migrates value) when using default namespace; add delete(key) to LocalStorageAdapter; preserve SSR/no-window no-ops.
Config, Types & Normalization
packages/core/src/types/events.ts, packages/core/src/types/microkernel.ts, packages/core/src/engine/config-normalizer.ts, packages/core/src/factory.ts
Introduce optional namespace?: string on config interfaces (IntentManagerConfig, IntentEngineConfig, BrowserConfig); resolve namespace in normalizer (default 'passiveintent:') and pass through factory to IntentManager.
IntentManager Persistence Wiring
packages/core/src/engine/intent-manager.ts
When default storage is used, construct BrowserStorageAdapter with the resolved opts.namespace instead of no-arg adapter.
Public Barrel & Export Refactor
packages/core/src/index.ts, packages/core/src/intent-sdk.ts
Remove intent-sdk.ts barrel (file deleted) and re-export canonical modules directly from index.ts (engine/core/sync/utils/types/constants/perf exports reorganized); public API names preserved but sources changed.
Tests, Sandboxes & Scripts Import Updates
packages/core/tests/*, packages/core/cypress/e2e/*.cy.ts, packages/core/scripts/*.mjs, packages/core/sandbox/*, packages/core/src/intent-sdk-performance.ts
Update many imports to use ../dist/src/index.js instead of ../dist/src/intent-sdk.js; update E2E/local tests to assert namespaced localStorage keys (e.g., passiveintent:...).
Local Docs & Changelog
packages/core/CHANGELOG.md, packages/core/README.md, packages/core/package.json
Document namespace option and delete() change; update README adapter/factory docs and bump core package version to 1.3.0.
React Deprecation & Tests
packages/react/src/hooks.ts, packages/react/CHANGELOG.md, packages/react/README.md, packages/react/package.json, packages/react/tests/use-propensity-score-deprecation.test.ts
Mark usePropensityScore deprecated, add dev-only console.warn once-per-mount, document migration to usePropensity, add Vitest ensuring warning semantics and production suppression; bump react package to 1.3.1.
Remix Integration & Tests
packages/remix/src/useRoutePassiveIntent.ts, packages/remix/src/loaders.ts, packages/remix/src/withPassiveIntent.tsx, packages/remix/tests/*, packages/remix/CHANGELOG.md, packages/remix/README.md, packages/remix/package.json
Use useRef to forward latest intent.track into effect, add diagnostic wrapping for createIntentClientLoader(true) missing server loader, add dev-only config-change warning in HOC; add/adjust tests and bump remix package to 1.0.2.

Sequence Diagram(s)

sequenceDiagram
  participant Consumer
  participant BrowserStorageAdapter
  participant localStorage as LocalStorage
  Note over BrowserStorageAdapter: namespace = "passiveintent:"
  Consumer->>BrowserStorageAdapter: getItem(key)
  BrowserStorageAdapter->>localStorage: getItem("passiveintent:" + key)
  alt namespaced value found
    localStorage-->>BrowserStorageAdapter: value
    BrowserStorageAdapter-->>Consumer: value
  else not found AND using default namespace
    localStorage-->>BrowserStorageAdapter: null
    BrowserStorageAdapter->>localStorage: getItem(key)  %% legacy lookup
    alt legacy value found
      localStorage-->>BrowserStorageAdapter: legacyValue
      BrowserStorageAdapter->>localStorage: setItem("passiveintent:" + key, legacyValue)
      BrowserStorageAdapter->>localStorage: removeItem(key)
      BrowserStorageAdapter-->>Consumer: legacyValue
    else
      localStorage-->>BrowserStorageAdapter: null
      BrowserStorageAdapter-->>Consumer: null
    end
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

Poem

🐰 Hop, a tiny namespace bound,

keys now wear a cautious crown.
Adapters tidy, old keys moved home,
Exports cleaner, no more roaming dome.
A gentle warn when configs roam.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title focuses on adding namespace support to LocalStorageAdapter for micro-frontends, which aligns with a major feature in the changeset. However, the PR also includes significant internal export refactoring (removal of intent-sdk.ts barrel), deprecation of usePropensityScore, and version bumps across multiple packages—changes that are substantial but not reflected in the title.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch core-update-2

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/remix/src/withPassiveIntent.tsx (1)

1-56: ⚠️ Potential issue | 🟡 Minor

Address Prettier formatting warning.

The CI pipeline reports a Prettier formatting issue in this file. Please run prettier --write to resolve the warning.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/remix/src/withPassiveIntent.tsx` around lines 1 - 56, Run Prettier
to fix formatting issues in this file: format the file containing
withPassiveIntent and ClientOnly by running your project's Prettier config
(e.g., prettier --write) so the export function withPassiveIntent, the
PassiveIntentRoot component, imports, and JSDoc block match repo style; ensure
the JSX return and multi-line strings are wrapped/indented according to Prettier
rules and commit the reformatted file.
🧹 Nitpick comments (1)
packages/core/tests/integration-contract.test.mjs (1)

97-123: Consider adding one custom-namespace integration case.

Lines [97-123] and Line [222] validate the default prefix well. Adding one test using a non-default namespace would close the key objective’s most important regression gap.

Also applies to: 222-222

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/tests/integration-contract.test.mjs` around lines 97 - 123, Add
a new integration test that exercises IntentManager with a custom/non-default
storage key to verify the prefixing behavior and persistence semantics;
instantiate IntentManager with a unique storageKey (e.g.,
'custom-namespace-test'), call manager.track(...) and manager.flushNow(), assert
storage.getItem('custom-namespace-test') exists and equals the persisted
payload, then call manager.track(...) again, flushNow(), and assert the stored
value changed as expected; reference IntentManager, storageKey, track, flushNow,
and storage.getItem to locate where to add the test alongside the existing
dirty-flag tests.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/core/cypress/e2e/browser-intent.cy.ts`:
- Line 113: The test reads localStorage key
'passiveintent:passive-intent-browser-test' (seen in the stored =
win.localStorage.getItem(...) line) but the test setup/teardown still clears
'passive-intent-browser-test'; update the cleanup in the beforeEach/afterEach
block that currently removes 'passive-intent-browser-test' to remove the
namespaced key 'passiveintent:passive-intent-browser-test' (and search/replace
any other occurrences of the old key), ensuring tests fully isolate persisted
state.

In `@packages/core/src/adapters.ts`:
- Around line 55-70: The current BrowserStorageAdapter changes keys by
prepending the namespace which breaks restores for existing installs; update
BrowserStorageAdapter so when the constructor receives the default namespace
('passiveintent:'), the storage access methods (at minimum getItem, and also
setItem and removeItem if present) first try the namespaced key (nsKey(key)) and
if that returns null fall back to the legacy unprefixed key (key); implement the
same fallback logic in the corresponding LocalStorageAdapter
(packages/core/src/plugins/web/LocalStorageAdapter.ts) to ensure compatibility
for existing persisted graph/Bloom state.

In `@packages/core/src/plugins/web/LocalStorageAdapter.ts`:
- Around line 51-52: The class LocalStorageAdapter implements
IPersistenceAdapter but adds a delete(key) method that isn't declared on the
IPersistenceAdapter interface, so callers using the interface can't see or call
it; update the IPersistenceAdapter interface to include an optional delete?(key:
string): void (so existing adapters remain compatible) and update callsites to
invoke persistenceAdapter.delete?.(key) (optional chaining) where deletion may
occur; ensure both occurrences referenced in the diff (the LocalStorageAdapter
class and the other implementation block around lines 106-117) are consistent
with the new optional method.

In `@packages/core/src/types/microkernel.ts`:
- Around line 254-259: IntentEngineConfig exposes a namespace string that should
be prepended to every persistence key but IntentEngine currently uses storageKey
directly; update the IntentEngine constructor and persistence usage to compose a
namespaced key (e.g., const persistedKey = `${config.namespace ??
'passiveintent:'}${this.storageKey}`) and use that composed key when calling
persistence.load(...) and _persist(...); ensure any other internal places that
reference this.storageKey for persistence (in methods like persistence.load and
_persist) use the composed persistedKey so the namespace is consistently
applied.

In `@packages/remix/tests/with-passive-intent.test.tsx`:
- Around line 158-197: The tests are only asserting the absence of warnings but
never the positive case; update the suite to actually assert that console.warn
is called with a PassiveIntent-prefixed message when the HOC is created with a
different config reference. Specifically, in the first or second test use
vi.spyOn(console, 'warn') as warnSpy, call withPassiveIntent(Page, configA) then
withPassiveIntent(Page, configB) (or render two wrapped components created with
different config objects), render the second wrapped component to trigger the
warning inside withPassiveIntent, and add
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('[PassiveIntent]'));
then restore warnSpy; reference withPassiveIntent, Page, warnSpy, render and
rerender to locate where to change.

---

Outside diff comments:
In `@packages/remix/src/withPassiveIntent.tsx`:
- Around line 1-56: Run Prettier to fix formatting issues in this file: format
the file containing withPassiveIntent and ClientOnly by running your project's
Prettier config (e.g., prettier --write) so the export function
withPassiveIntent, the PassiveIntentRoot component, imports, and JSDoc block
match repo style; ensure the JSX return and multi-line strings are
wrapped/indented according to Prettier rules and commit the reformatted file.

---

Nitpick comments:
In `@packages/core/tests/integration-contract.test.mjs`:
- Around line 97-123: Add a new integration test that exercises IntentManager
with a custom/non-default storage key to verify the prefixing behavior and
persistence semantics; instantiate IntentManager with a unique storageKey (e.g.,
'custom-namespace-test'), call manager.track(...) and manager.flushNow(), assert
storage.getItem('custom-namespace-test') exists and equals the persisted
payload, then call manager.track(...) again, flushNow(), and assert the stored
value changed as expected; reference IntentManager, storageKey, track, flushNow,
and storage.getItem to locate where to add the test alongside the existing
dirty-flag tests.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4ae8e8de-282c-4f9e-badd-884239d906aa

📥 Commits

Reviewing files that changed from the base of the PR and between c106028 and 0d52970.

📒 Files selected for processing (44)
  • packages/core/CHANGELOG.md
  • packages/core/README.md
  • packages/core/cypress/e2e/amazon.cy.ts
  • packages/core/cypress/e2e/browser-intent.cy.ts
  • packages/core/cypress/e2e/intent.cy.ts
  • packages/core/package.json
  • packages/core/sandbox/amazon/app.ts
  • packages/core/sandbox/app.ts
  • packages/core/scripts/perf-runner.mjs
  • packages/core/scripts/roc-experiment.mjs
  • packages/core/scripts/smoothing-alpha-benchmark.mjs
  • packages/core/src/adapters.ts
  • packages/core/src/engine/config-normalizer.ts
  • packages/core/src/engine/intent-manager.ts
  • packages/core/src/factory.ts
  • packages/core/src/index.ts
  • packages/core/src/intent-sdk-performance.ts
  • packages/core/src/intent-sdk.ts
  • packages/core/src/plugins/web/LocalStorageAdapter.ts
  • packages/core/src/types/events.ts
  • packages/core/src/types/microkernel.ts
  • packages/core/tests/anomaly-dispatcher.test.mjs
  • packages/core/tests/exit-intent.test.mjs
  • packages/core/tests/idle-detection.test.mjs
  • packages/core/tests/integration-contract.test.mjs
  • packages/core/tests/policies.test.mjs
  • packages/core/tests/probabilistic.test.mjs
  • packages/core/tests/propensity-calculator.test.mjs
  • packages/core/tests/property-based.test.mjs
  • packages/core/tests/unit-fast.test.mjs
  • packages/react/CHANGELOG.md
  • packages/react/README.md
  • packages/react/package.json
  • packages/react/src/hooks.ts
  • packages/react/tests/use-propensity-score-deprecation.test.ts
  • packages/remix/CHANGELOG.md
  • packages/remix/README.md
  • packages/remix/package.json
  • packages/remix/src/loaders.ts
  • packages/remix/src/useRoutePassiveIntent.ts
  • packages/remix/src/withPassiveIntent.tsx
  • packages/remix/tests/loaders.test.ts
  • packages/remix/tests/use-route-passive-intent.test.tsx
  • packages/remix/tests/with-passive-intent.test.tsx
💤 Files with no reviewable changes (1)
  • packages/core/src/intent-sdk.ts

Comment thread packages/core/cypress/e2e/browser-intent.cy.ts
Comment thread packages/core/src/adapters.ts
Comment thread packages/core/src/plugins/web/LocalStorageAdapter.ts
Comment thread packages/core/src/types/microkernel.ts
Comment thread packages/remix/tests/with-passive-intent.test.tsx
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
packages/react/tests/use-propensity-score-deprecation.test.ts (1)

139-155: Consider using vi.stubEnv() for more reliable environment stubbing.

Directly mutating process.env.NODE_ENV can be fragile if the value is statically replaced at build time. Vitest provides vi.stubEnv() for this purpose.

♻️ Proposed refactor using vi.stubEnv
   describe('3 — suppressed in production', () => {
     it('does not call console.warn when NODE_ENV is production', () => {
-      const original = process.env.NODE_ENV;
-      // `@ts-expect-error` — overriding read-only env for test
-      process.env.NODE_ENV = 'production';
+      vi.stubEnv('NODE_ENV', 'production');
 
       try {
         renderHook(() => usePropensityScore('/checkout'), {
           wrapper: ({ children }) => withProvider(children),
         });
         expect(warnSpy).not.toHaveBeenCalled();
       } finally {
-        // `@ts-expect-error`
-        process.env.NODE_ENV = original;
+        vi.unstubAllEnvs();
       }
     });
   });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/react/tests/use-propensity-score-deprecation.test.ts` around lines
139 - 155, The test directly mutates process.env.NODE_ENV which is brittle;
replace that mutation with Vitest's vi.stubEnv('NODE_ENV', 'production') before
calling renderHook (in the "does not call console.warn when NODE_ENV is
production" case) and remove the manual restore in the finally block, instead
calling vi.unstubAllEnvs() in the finally to revert the stub; update the test to
use vi.stubEnv and vi.unstubAllEnvs while keeping the same renderHook(() =>
usePropensityScore('/checkout'), { wrapper: ({ children }) =>
withProvider(children) }) and the warnSpy assertion.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@packages/react/tests/use-propensity-score-deprecation.test.ts`:
- Around line 139-155: The test directly mutates process.env.NODE_ENV which is
brittle; replace that mutation with Vitest's vi.stubEnv('NODE_ENV',
'production') before calling renderHook (in the "does not call console.warn when
NODE_ENV is production" case) and remove the manual restore in the finally
block, instead calling vi.unstubAllEnvs() in the finally to revert the stub;
update the test to use vi.stubEnv and vi.unstubAllEnvs while keeping the same
renderHook(() => usePropensityScore('/checkout'), { wrapper: ({ children }) =>
withProvider(children) }) and the warnSpy assertion.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 43f51da1-a132-4a74-a1a3-2e08fef8c49c

📥 Commits

Reviewing files that changed from the base of the PR and between 0d52970 and 2944335.

📒 Files selected for processing (12)
  • packages/core/CHANGELOG.md
  • packages/core/README.md
  • packages/core/cypress/e2e/browser-intent.cy.ts
  • packages/core/src/adapters.ts
  • packages/core/src/plugins/web/LocalStorageAdapter.ts
  • packages/core/src/types/microkernel.ts
  • packages/react/README.md
  • packages/react/src/hooks.ts
  • packages/react/tests/use-propensity-score-deprecation.test.ts
  • packages/remix/src/loaders.ts
  • packages/remix/src/withPassiveIntent.tsx
  • packages/remix/tests/with-passive-intent.test.tsx
✅ Files skipped from review due to trivial changes (2)
  • packages/core/CHANGELOG.md
  • packages/react/src/hooks.ts
🚧 Files skipped from review as they are similar to previous changes (8)
  • packages/core/cypress/e2e/browser-intent.cy.ts
  • packages/remix/src/withPassiveIntent.tsx
  • packages/remix/src/loaders.ts
  • packages/remix/tests/with-passive-intent.test.tsx
  • packages/core/src/plugins/web/LocalStorageAdapter.ts
  • packages/core/src/adapters.ts
  • packages/react/README.md
  • packages/core/README.md

@purushpsm147 purushpsm147 merged commit d60e6e7 into main Mar 29, 2026
22 checks passed
@purushpsm147 purushpsm147 deleted the core-update-2 branch March 29, 2026 07:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant