Skip to content

v0.20.0

Choose a tag to compare

@fvarrui fvarrui released this 08 Oct 19:14
· 76 commits to main since this release

New features

  • Marketplaces (#29): extensions install from Claude Code marketplaces (marketplace.json). extension marketplace add|list|update|remove, extension search, extension add <plugin>@<marketplace>. Folder, github, url, git-subdir, npm (checked against the registry's sha512 integrity) and archive (a zip over HTTPS, checked against its sha256) sources; command sources never install. An agent's own marketplace is official and installs without asking; another asks for its name to be typed, and installing from it asks again (--yes answers for the person). npm and zip downloads are unpacked in-process (optional fflate), so a packaged agent needs neither npm nor tar, and nothing in them runs. Exports: addMarketplace(), listMarketplaces(), updateMarketplace(), removeMarketplace(), findPlugin(), installFromMarketplace(), readMarketplaceManifest(), inspectMarketplace().
  • Extensions on and off in a running session (#49): /extensions disable|enable on an installed extension takes effect without reopening the session (its tools, skills, commands and subagents go and come back); buildSessionOptions() returns switchExtension. The model is told what changed.
  • An extension declares the programs it needs (needs in its manifest): one whose program isn't on the PATH is off, with why; extension info shows them.
  • Denied paths as the SDK's own rules too: deniedPaths (and the SDK's credentials) also go to settings.permissions.deny, a second layer under the file scope gate. denyRules() is exported.
  • Each extension owns its options (#50): the kit's extensions are factories, exported from the package root: awareness({ guide }), sources({ dir, saveDescription }), knowledge({ dir, pageTypes, store }), memory({ dir }). A folder is a path or a function of the session's config (FolderOption). ExtensionContext.capabilities tells an extension what the active ones provide.

Breaking changes

  • AgentSpec.extensions takes Extension objects only: extensions: ["sources", "knowledge"] becomes extensions: [sources({ dir }), knowledge({ dir })].
  • Removed from BaseSessionConfig: knowledgeDir, sourcesDir, memoryDir; pass them to knowledge({ dir }), sources({ dir }), memory({ dir }), e.g. knowledge({ dir: (config) => path.join(config.projectDir, "knowledge") }).
  • Removed from AgentSpec: helpGuide (now awareness({ guide })), saveToSourcesDescription (sources({ saveDescription })), knowledgePageTypes (knowledge({ pageTypes })), knowledgeStore(config) (knowledge({ store: (config, dir) => … })). identity stays.
  • buildSessionOptions() no longer returns knowledgeStore: read apis.knowledge.knowledgeStore.
  • A folder of plain notes (formerly knowledgeDir without the knowledge extension) is an extraWritableDirs entry.
  • The knowledge base explains matching summaries to originals when the sources extension is active, not when a sources folder is configured.

Captain Whiskers

Captain Whiskers 0.2.0, the example agent built on agent-kit 0.20.0, as a Windows app: download the installer. It's unsigned, so SmartScreen warns about it; it asks for a Claude key on first start and keeps everything in ~/.captain-whiskers. New: his own marketplace, the shipyard, from which his jokebook installs; his extensions through their factories.

Internal

  • The core imports no extension, not even a type; ESLint enforces it.
  • The shipyard is checked with claude plugin validate by a test.