Skip to content

feat(skills)!: promote Agent Skills to core - #159

Open
jeffdupont wants to merge 6 commits into
mainfrom
jdupont/aic-3655-skills-core
Open

jeffdupont wants to merge 6 commits into
mainfrom
jdupont/aic-3655-skills-core

Conversation

@jeffdupont

@jeffdupont jeffdupont commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Jira: AIC-3655

Do not merge until the blockers linked on AIC-3655 are fixed. This PR releases together with the Python and Go promotion PRs (links added later).

What changed

  • Agent Skills is core. All 35 Agent Skills names (functions, stores, watcher, constants, factories and types) are exported from the @launchdarkly/ai-server root with the same spelling, and are removed from @launchdarkly/ai-server/experimental. This is breaking under the 0.x rule, so it bumps the minor version.
  • @launchdarkly/ai-node gets the names from its root through its existing export *. Its /experimental entry keeps working and still re-exports Evaluations from Code.
  • Evaluations from Code stays experimental. The /experimental entry point stays.
  • The API reports (etc/ai-server.api.md, etc/ai-server-experimental.api.md) are regenerated. The skills names are added to api-surface/ai-server.txt as + (joining) and marked - (leaving) in api-surface/ai-server.experimental.txt.
  • The skills rows are removed from changelog-sections in release-please-config.json. AGENTS.md now says skills is a core scope.
  • The shutdown hook is renamed from experimental Agent Skills to Agent Skills. The no-store error message now points to @launchdarkly/ai-server. Core doc comments no longer call Agent Skills experimental.
  • Tests: the root export snapshot now includes the skills values, the experimental entry exports only the Evaluations values, a new test checks that the API reports list every skills name at the root and none in the experimental report, and the lifecycle test now expects the Agent Skills hook after loading the root and no experimental hook.
  • The integration fixtures import skills from the root and check that getSkill is on the root and not on either /experimental subpath.
  • The READMEs and both agents.md files are updated, including the promotion note.
  • Usage IDs: main reports no experimental.* skills usage IDs, so this PR adds none. When the skills usage-reporting work (AIC-3555) lands in this SDK, it must use client.* IDs.

Migration

Change the import path from '@launchdarkly/ai-server/experimental' to '@launchdarkly/ai-server' (or from '@launchdarkly/ai-node/experimental' to '@launchdarkly/ai-node'). Nothing else changes: names, signatures and behavior are the same.

Test plan

Run in the worktree after yarn install:

  • yarn code:check: exit 0
  • yarn build: exit 0
  • yarn typecheck: exit 0
  • yarn test: exit 0 (client: 1826 passed, 11 skipped)
  • yarn test:integration: exit 0 (36 passed)
  • yarn api:surface: exit 0
  • yarn test:api-surface, yarn test:api-breaking, yarn lint:pkg: exit 0
  • yarn workspace @launchdarkly/ai-server api:check: exit 0
  • yarn api:check: exit 1, only because packages/claude-agents/etc/ai-claude-agents.api.md is already out of date on main (ClaudeAgentsHostOptions came in after the report was last generated). This PR doesn't touch that package.

🤖 Generated with Claude Code

Related PRs

Releases together with:


Note

Overview
Agent Skills moves from @launchdarkly/ai-server/experimental to the package root (and the same via @launchdarkly/ai-node). All skills APIs—stores, accessors, writeSkills/watchSkills, types—are removed from the experimental entry point; Evaluations from Code remains on /experimental only. This is a breaking 0.x change: imports must switch from .../experimental to the root; names and behavior are unchanged.

API Extractor reports and api-surface/*.txt are updated accordingly; skills is dropped from release-please Experimental changelog sections and AGENTS.md now treats skills as a core scope. Docs call out that loading the root now pulls in Node built-ins (node:fs, node:path, etc.) for skills, which can break non-Node edge runtimes (tracked as AIC-3674).

Implementation follow-ups: shutdown hook renamed to Agent Skills; skills helpers emit client.* $ld:ai:sdk:usage IDs; watchSkills uses writeSkillsInternal so only the watcher reports usage. Tests, webpack integration fixtures, and re-export assertions are aligned with the new surface.

Reviewed by Cursor Bugbot for commit ecef311. Bugbot is set up for automated code reviews on this repo. Configure here.

Move all 35 Agent Skills names from @launchdarkly/ai-server/experimental
to the package root, with the same spelling, and remove them from the
experimental entry point (breaking under the 0.x rule). Evaluations from
Code stays experimental. @launchdarkly/ai-node picks the names up through
its root re-export.

Regenerate the API reports, add the names to the root surface list and
mark them leaving the experimental one, drop the skills rows from
changelog-sections, rename the shutdown hook to 'Agent Skills', and
update tests, integration fixtures, READMEs and agents docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f7ffdf6. Configure here.

Comment thread packages/client/src/index.ts

@XieX XieX left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review notes below. The main one is the edge-runtime regression on index.ts.

One more that has no line to attach to: the title's scope is AIC-3655, so the squash commit puts the Jira key in the public changelog ("AIC-3655: promote Agent Skills to core"). AGENTS.md on main says a change to an experimental feature uses that feature's scope. feat(skills)!: promote Agent Skills to core would still land under Features, because this PR removes the skills rows, and would still bump the minor version.

Comment thread packages/client/src/index.ts
Comment thread api-surface/ai-server.txt Outdated
Comment thread packages/client/src/__tests__/skills.test.ts Outdated
Comment thread packages/client/src/__tests__/skills.test.ts Outdated
Comment thread integration-tests/commonjs-webpack/fixture/types.ts
Comment thread packages/client/src/shutdown-hooks.ts
jeffdupont and others added 2 commits October 23, 2026 13:54
- Match each skills name on its own declaration in the API report, so a name that only appears
  in another export's signature no longer counts as exported.
- Check initClient's options through INIT_CLIENT_OPTIONS (typed against the options type)
  instead of scanning the whole report for skillStore.
- Assert at compile time that @launchdarkly/ai-server/experimental no longer declares getSkill.
- Say why the shutdown-hook registry stays now that Agent Skills is core.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent Skills in core makes the @launchdarkly/ai-server root import node:fs, node:path, node:os and
node:crypto when it loads, so an edge runtime without them fails at import. For 1.0 this is
documented rather than fixed. AIC-3674 tracks restoring edge support.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jeffdupont jeffdupont changed the title feat(AIC-3655)!: promote Agent Skills to core feat(skills)!: promote Agent Skills to core Oct 23, 2026
skillRefs, getSkill, getSkillResult, getSkills, allSkills, writeSkills and watchSkills now report
their client.* $ld:ai:sdk:usage ID as their first statement (TESTING.md §3.27), so a call that
raises still reports. The watcher's initial and repeat reconciles call writeSkillsInternal, so
watchSkills reports only itself.

api-surface/ai-server.txt and ai-server.experimental.txt are synced from ai-sdks-monorepo#86,
which gives the seven root names their usage= fields. The usage tests derive one row per ID from
those fields. New tests cover once per client, held until a client exists, a raising call, and the
watcher's re-reconcile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jeffdupont
jeffdupont requested a review from XieX October 23, 2026 21:30

@XieX XieX left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks for working through these. I checked the fixes in 75548c7, e32582d and ecef311, and they hold up. The new usage reporting looks right too. Approving, with three non-blocking notes:

  1. The edge break isn't in the changelog. The squash commit only describes the promotion, so someone upgrading from 0.4 on Vercel Edge or Cloudflare Workers would only find out when the import fails. Could you add a line for it, e.g. through a BEGIN_COMMIT_OVERRIDE block in the description?
  2. The public README names an internal ticket. The new note in the root README points readers to AIC-3674, which they can't open. A public GitHub issue would give them something to follow.
  3. Merge order with ai-sdks-monorepo#86. The api-surface lists match that PR's head, but it's still open. If it changes before merging, the next sync will undo these lists again, so it's worth landing it first or rechecking afterwards.

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.

2 participants