Repository navigation
feat(skills)!: rename FDv2SkillStore to LaunchDarklySkillStore - #223
Conversation
The store's public name now says where skill content comes from rather than which protocol version carries it. The base SDKs keep "FDv2" out of their public type names (Python's DataSystemConfig, Go's internal datasystem.NewFDv2), and FDv2 is still Early Access, so a type named after it would date the API. Only the exported class is renamed. The `skills_fdv2` module, its wire-kind constants and the prose describing the FDv2 channel are unchanged, since they describe the protocol itself. The root export has not shipped yet (it arrives with the #210 promotion in the pending release), so no deprecated alias is kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jeffdupont
left a comment
There was a problem hiding this comment.
The rename itself is clean: no stray FDv2SkillStore left, the API report is regenerated, usage IDs are unaffected, and it matches launchdarkly/ai-sdks-monorepo#95's surface list.
One thing changed under it today: #206 merged at 17:01Z and published launchdarkly-ai-server 0.5.0, which exports FDv2SkillStore from the root (__init__.py:69,274 at the launchdarkly-ai-server-0.5.0 tag). So the "no released version has exported it" reason no longer holds, and code written against 0.5.0 (from launchdarkly_ai_server import FDv2SkillStore) would hit an ImportError on 1.0.0.
That's the same situation js-ai-sdk#172 handles with deprecated aliases "so 0.5.0 code still compiles". Let's match it here:
- Keep the old name as a deprecated alias of the new class (inline below), and add
"FDv2SkillStore"to__all__. - Run
make api-reportso the report lists both names. - Add one test that
FDv2SkillStore is LaunchDarklySkillStore. - Update the PR body's "No deprecated alias" section.
launchdarkly/ai-sdks-monorepo#95's A.12 Python row needs the same change ("No alias… renamed before any release exported it"). I'll comment there too. This rename is breaking, so all three need to merge before the 1.0 cut.
launchdarkly-ai-server 0.5.0 (#206) shipped FDv2SkillStore from the package root, so the old name stays importable until the next major release, matching the JS aliases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
## Summary **Breaking change.** Renames the store's exported names and keeps the old ones as `@deprecated` aliases. It's one of three companion PRs: launchdarkly/python-ai-sdk#223 and the spec change in launchdarkly/ai-sdks-monorepo#95. | Old (0.5.0) | New | | --- | --- | | `FDv2SkillStore` | `LaunchDarklySkillStore` | | `FDv2SkillStoreOptions` | `LaunchDarklySkillStoreOptions` | | `FDv2Mode` | `LaunchDarklySkillStoreMode` | **Why.** The base LaunchDarkly SDKs keep "FDv2" out of their public type names. Java has `Components.dataSystem()`, React Native has a `dataSystem` option, and Go's `NewFDv2` is in `internal/datasystem`. FDv2 is also still Early Access, so a type named after the protocol version would date the API. The new name says where the content comes from, and it pairs with `InMemorySkillStore`. **Why it's marked breaking (`!`).** The old names now resolve to `@deprecated` aliases instead of their own declarations. `FDv2SkillStore` is now an alias `const` plus a type, not a class, and the options and mode types are now aliases. The API compatibility check flags all three as breaking changes. Ordinary code written against 0.5.0 keeps compiling and running: `new FDv2SkillStore(...)` and `instanceof` still work, and a new test asserts it. The exception is code that augments the old `FDv2SkillStore` class declaration, which no longer has one to merge into. Before 1.0, `!` means a minor bump. `ai-server` is already going to 0.6.0 with breaking changes in release PR #171, so its version is unchanged. `ai-node` also gets a minor bump, because this PR touches one of its tests. The README's type table lists the aliases, which stay until the next major release. **What stays.** The `skills-fdv2.ts` module, the `FDV2_*` wire-kind constants, and prose that describes the FDv2 channel itself. Those name the protocol, which is accurate. **API surface.** `api-surface/ai-server.txt` marks the three old names as leaving (`-`) and adds the new ones (`+`). The API Extractor report is regenerated. ## Testing - `yarn test`: all workspaces pass (client: 1926 passed, 11 skipped) - `yarn typecheck`, `yarn code:check`, `yarn api:check` and `yarn api:surface` all pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Overview** > Renames the Agent Skills delivery store from **FDv2**-prefixed public types to **`LaunchDarklySkillStore`**, **`LaunchDarklySkillStoreOptions`**, and **`LaunchDarklySkillStoreMode`**, aligning naming with other LaunchDarkly SDKs and de-emphasizing the internal FDv2 protocol in customer-facing APIs. > > The implementation class and all user-facing errors, docs, and examples now use the new names. **`FDv2SkillStore`**, **`FDv2SkillStoreOptions`**, and **`FDv2Mode`** remain as **`@deprecated` aliases** (const/type aliases, not a separate class declaration) so 0.5.0 call sites keep compiling; **`new FDv2SkillStore(...)`** and **`instanceof`** still work via the alias. Package exports, API Extractor report, **`api-surface/ai-server.txt`**, and tests are updated accordingly—including a test that the deprecated name equals **`LaunchDarklySkillStore`**. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 7aaa1a8. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
## Summary Renames the Agent Skills delivery store, so Go matches launchdarkly/python-ai-sdk#223 and launchdarkly/js-ai-sdk#172. The spec change is launchdarkly/ai-sdks-monorepo#96, which follows launchdarkly/ai-sdks-monorepo#95. **Why.** FDv2 is still Early Access, and the base SDKs keep it out of their public type names. The store is now named for its source rather than its protocol. | Before | After | | --- | --- | | `FDv2SkillStore` | `LaunchDarklySkillStore` | | `NewFDv2SkillStore` | `NewLaunchDarklySkillStore` | | `FDv2SkillStoreOptions` | `LaunchDarklySkillStoreOptions` | | `FDv2Mode` | `LaunchDarklySkillStoreMode` | | `FDv2ModeStream` / `FDv2ModePoll` | `LaunchDarklySkillStoreModeStream` / `LaunchDarklySkillStoreModePoll` | **No deprecated aliases.** No Go version has been released: there are no tags or GitHub releases, and the release-please manifest is at `0.0.0`. So this is a clean rename, as in Python. TypeScript kept aliases because 0.5.0 shipped the old names. The rename covers `internal/skills`, the `aiserver/experimental` aliases and wrappers, the documented-surface test list, error and log strings that name the type, `README.md` and `agents.md`. **Unchanged:** the `internal/skills/fdv2_*.go` file names, the wire-kind constants (`FDv2PayloadKind`, `FDv2ObjectKind`), the unexported `newFDv2Reader`, the `TestFDv2*` test names, and prose that describes the FDv2 protocol. **Conflicts with #14.** #14 (promote Agent Skills to core) moves these files into `aiserver/skills_*.go` and keeps the FDv2 names. Whichever lands second has to carry the rename across. If #14 lands first, rerunning the same word-boundary replacement over `aiserver/` redoes this PR. ## Checks - `go build ./...`, `go vet ./...` and `go test -race ./...` pass. - `gofmt -l .` is clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Overview** > **Breaking rename** of the experimental Agent Skills delivery store public API so Go aligns with the Python and JS AI SDKs: types are named for LaunchDarkly as the content source rather than the FDv2 wire protocol. > > Public symbols move from `FDv2SkillStore` / `NewFDv2SkillStore` / `FDv2SkillStoreOptions` / `FDv2Mode` to **`LaunchDarklySkillStore`**, **`NewLaunchDarklySkillStore`**, **`LaunchDarklySkillStoreOptions`**, and **`LaunchDarklySkillStoreMode`** (with `LaunchDarklySkillStoreModeStream` / `LaunchDarklySkillStoreModePoll`). The change threads through `internal/skills`, `aiserver/experimental` aliases, README/agents docs, the pinned `skillsSurface` test list, and user-facing error/log strings (including `ErrStoreClosed` and `noStoreMessage`). > > **No deprecated aliases** — the package has not shipped a release yet. **Behavior and FDv2 transport are unchanged**: `fdv2_store.go` / `fdv2_reader.go` filenames, internal reader helpers, and `TestFDv2*` names stay as-is. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 4cd495a. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Renames the exported
FDv2SkillStoreclass toLaunchDarklySkillStore. It's one of three companion PRs, with launchdarkly/js-ai-sdk#172 and the spec change in launchdarkly/ai-sdks-monorepo#95.Why. The base LaunchDarkly SDKs keep "FDv2" out of their public type names. Python's
ldclientusesDataSystemConfigand keeps theFDv2class underldclient/impl/. Go'sNewFDv2is ininternal/datasystem. FDv2 is also still Early Access: the Python and .NET changelogs and the data saving mode docs say so. A type named after the protocol version would date the API. The new name says where the content comes from, and it pairs withInMemorySkillStore.What changes. The class name, everywhere it appears: the root export,
__all__, the API report, error messages, docstrings, both READMEs,agents.md, the Claude Agents package's example, and tests.What stays. The
skills_fdv2module, theFDV2_*wire-kind constants, and prose that describes the FDv2 channel itself. Those name the protocol, which is accurate.FDv2SkillStorestays as a deprecated alias. 0.5.0 (#206, released 2026-10-27) exportsFDv2SkillStorefrom the root, so the old name is kept asFDv2SkillStore = LaunchDarklySkillStoreand stays in__all__until the next major release, matching the JS aliases. It's a plain alias rather than a warning shim, becausewarnings.deprecatedneeds Python 3.13 and the package supports 3.12. A test assertsFDv2SkillStore is LaunchDarklySkillStore. The title keeps!: the class's own name (__name__, reprs, the API report) changes, and the old name goes away in the next major release.Testing
pytest packages/client/tests packages/claude-agents/tests: 2170 passed, 1 skippedmake typecheck,ruff check,ruff format --checkandmake api-report-checkall passuv.lockis unchanged🤖 Generated with Claude Code
Note
Overview
Breaking rename: the public Agent Skills delivery store class is now
LaunchDarklySkillStoreinstead ofFDv2SkillStore. Imports fromlaunchdarkly_ai_server,__all__, the API report, and companion packages (e.g. Claude Agents examples) are updated accordingly.Unchanged: implementation still lives in
skills_fdv2.py, FDv2 wire/protocol naming in internals, and store behavior (FDv2 poll/stream channel, lifecycle, diagnostics). Docstrings and user-facing errors now sayLaunchDarklySkillStore.No shim: there is no deprecated alias—callers must switch the symbol name (aligned with JS AI SDK and monorepo spec changes).
Reviewed by Cursor Bugbot for commit a3d82cb. Bugbot is set up for automated code reviews on this repo. Configure here.