Install
$ agentstack add skill-salesforcecommercecloud-b2c-developer-tooling-sdk-module-development ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
SDK Module Development
This skill covers adding new modules and exports to the @salesforce/b2c-tooling-sdk package.
Package Structure
The SDK is organized into functional layers:
packages/b2c-tooling-sdk/src/
├── auth/ # Authentication strategies
├── instance/ # B2CInstance entry point
├── clients/ # HTTP clients (WebDAV, OCAPI, SLAS, ODS, MRT)
├── platform/ # Platform APIs
├── operations/ # High-level business operations
│ ├── code/ # Code deployment
│ ├── jobs/ # Job execution
│ ├── sites/ # Site management
│ └── mrt/ # MRT deployments
├── cli/ # Base command classes for oclif
├── logging/ # Pino-based logging
├── errors/ # Error types
├── config/ # Configuration loading
└── i18n/ # Internationalization
Barrel File Pattern
Each module uses an index.ts barrel file that exports the public API:
/**
* Authentication strategies for B2C Commerce APIs.
*
* This module provides various authentication mechanisms for B2C Commerce:
* - OAuth 2.0 client credentials flow
* - Basic authentication for WebDAV
* - API key authentication
*
* @example
* ```typescript
* import { OAuthStrategy } from '@salesforce/b2c-tooling-sdk/auth';
*
* const auth = new OAuthStrategy({
* clientId: 'my-client',
* clientSecret: 'my-secret',
* });
* ```
*
* @module auth
*/
// Types
export type { AuthStrategy, AuthConfig } from './types.js';
// Strategies
export { BasicAuthStrategy } from './basic.js';
export { OAuthStrategy, decodeJWT } from './oauth.js';
// Resolution helpers
export { resolveAuthStrategy, checkAvailableAuthMethods } from './resolve.js';
Key points:
- Module-level JSDoc with
@moduletag for TypeDoc - Include usage examples in the JSDoc
- Group exports logically (types, classes, functions)
- Only export public API items
Package.json Exports
The exports field in packages/b2c-tooling-sdk/package.json uses a development condition pattern:
{
"exports": {
"./newmodule": {
"development": "./src/newmodule/index.ts",
"import": {
"types": "./dist/esm/newmodule/index.d.ts",
"default": "./dist/esm/newmodule/index.js"
},
"require": {
"types": "./dist/cjs/newmodule/index.d.ts",
"default": "./dist/cjs/newmodule/index.js"
}
}
}
}
The development condition:
- Points directly to TypeScript source files
- Used when running with
--conditions=development(viabin/dev.js) - Enables hot-reloading during development without rebuilding
Client Factory Pattern
HTTP clients follow a consistent factory function pattern:
// src/clients/newapi.ts
import createClient, { type Client } from 'openapi-fetch';
import type { AuthStrategy } from '../auth/types.js';
import type { paths, components } from './newapi.generated.js';
import { createAuthMiddleware, createLoggingMiddleware } from './middleware.js';
// Re-export generated types for consumers
export type { paths, components };
// Define client type alias
export type NewApiClient = Client;
// Factory function (not class)
export function createNewApiClient(
hostname: string,
auth: AuthStrategy,
options?: { apiVersion?: string }
): NewApiClient {
const { apiVersion = 'v1' } = options ?? {};
const client = createClient({
baseUrl: `https://${hostname}/api/newapi/${apiVersion}`,
});
// Middleware order: auth first (runs last), logging last (sees complete request)
client.use(createAuthMiddleware(auth));
client.use(createLoggingMiddleware('NEWAPI'));
return client;
}
Then export from the clients barrel:
// src/clients/index.ts
export { createNewApiClient } from './newapi.js';
export type { NewApiClient, paths as NewApiPaths, components as NewApiComponents } from './newapi.js';
For SCAPI clients with OAuth scope requirements, see [API Client Development](../api-client-development/SKILL.md) for advanced patterns including scope injection and tenant ID handling.
OpenAPI Type Generation
For APIs with OpenAPI specs, generate TypeScript types:
- Add the spec file to
packages/b2c-tooling-sdk/specs/
- Update the generate script in
package.json:
{
"scripts": {
"generate:types": "openapi-typescript specs/data-api.json -o src/clients/ocapi.generated.ts && openapi-typescript specs/newapi-v1.yaml -o src/clients/newapi.generated.ts"
}
}
- Run generation:
pnpm --filter @salesforce/b2c-tooling-sdk run generate:types
- Import the generated types in your client:
import type { paths, components } from './newapi.generated.js';
Operations Module Pattern
Operations group related business logic:
src/operations/newfeature/
├── index.ts # Barrel file with module JSDoc
├── list.ts # List operation
├── create.ts # Create operation
└── types.ts # Shared types (if needed)
Example operation:
// src/operations/newfeature/list.ts
import type { NewApiClient } from '../../clients/newapi.js';
export interface ListOptions {
filter?: string;
limit?: number;
}
export interface ListResult {
items: Item[];
total: number;
}
/**
* Lists items from the new feature API.
*
* @param client - The NewApi client instance
* @param options - List options
* @returns List result with items and total count
*
* @example
* ```typescript
* const result = await listItems(client, { limit: 10 });
* console.log(result.items);
* ```
*/
export async function listItems(
client: NewApiClient,
options?: ListOptions
): Promise {
const { data, error } = await client.GET('/items', {
params: {
query: {
filter: options?.filter,
limit: options?.limit,
},
},
});
if (error) {
throw new Error(`Failed to list items: ${error.message}`);
}
return {
items: data.items,
total: data.total,
};
}
Barrel file:
// src/operations/newfeature/index.ts
/**
* Operations for the new feature.
*
* @example
* ```typescript
* import { listItems, createItem } from '@salesforce/b2c-tooling-sdk/operations/newfeature';
* ```
*
* @module operations/newfeature
*/
export { listItems, type ListOptions, type ListResult } from './list.js';
export { createItem, type CreateOptions } from './create.js';
Adding a New Module - Step by Step
1. Create the module directory
mkdir -p packages/b2c-tooling-sdk/src/newmodule
2. Create the implementation file(s)
// src/newmodule/feature.ts
export interface FeatureConfig {
setting: string;
}
export class Feature {
constructor(private config: FeatureConfig) {}
doSomething(): string {
return this.config.setting;
}
}
3. Create the barrel file with module JSDoc
// src/newmodule/index.ts
/**
* New module for feature X.
*
* @example
* ```typescript
* import { Feature } from '@salesforce/b2c-tooling-sdk/newmodule';
* const f = new Feature({ setting: 'value' });
* ```
*
* @module newmodule
*/
export { Feature, type FeatureConfig } from './feature.js';
4. Add to package.json exports
{
"exports": {
"./newmodule": {
"development": "./src/newmodule/index.ts",
"import": {
"types": "./dist/esm/newmodule/index.d.ts",
"default": "./dist/esm/newmodule/index.js"
},
"require": {
"types": "./dist/cjs/newmodule/index.d.ts",
"default": "./dist/cjs/newmodule/index.js"
}
}
}
}
5. Optionally export from main index
If the module should be accessible from the main package export:
// src/index.ts
export { Feature } from './newmodule/index.js';
export type { FeatureConfig } from './newmodule/index.js';
6. Add to TypeDoc entry points
Add the new module's barrel file to docs/typedoc.json so API documentation is generated:
{
"entryPoints": [
"...",
"../packages/b2c-tooling-sdk/src/newmodule/index.ts"
]
}
7. Build and test
pnpm --filter @salesforce/b2c-tooling-sdk run build
pnpm --filter @salesforce/b2c-tooling-sdk run test
Build System
The SDK builds to both ESM and CommonJS:
{
"scripts": {
"build": "pnpm run generate:types && pnpm run build:esm && pnpm run build:cjs",
"build:esm": "tsc -p tsconfig.esm.json",
"build:cjs": "tsc -p tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json"
}
}
TypeScript configs:
tsconfig.json- Base config with strict settingstsconfig.esm.json- ESM build todist/esm/tsconfig.cjs.json- CJS build todist/cjs/
Import Patterns
For consumers of the SDK:
// Main export
import { B2CInstance } from '@salesforce/b2c-tooling-sdk';
// Sub-module exports
import { OAuthStrategy } from '@salesforce/b2c-tooling-sdk/auth';
import { WebDavClient } from '@salesforce/b2c-tooling-sdk/clients';
import { findAndDeployCartridges } from '@salesforce/b2c-tooling-sdk/operations/code';
import { createLogger } from '@salesforce/b2c-tooling-sdk/logging';
import { CartridgeCommand } from '@salesforce/b2c-tooling-sdk/cli';
In tests, always use package imports (not relative paths):
// Good - uses package exports
import { WebDavClient } from '@salesforce/b2c-tooling-sdk/clients';
// Avoid - relative paths
import { WebDavClient } from '../../src/clients/webdav.js';
New Module Checklist
- Create module directory under
src/ - Implement feature in separate files
- Create
index.tsbarrel with module-level JSDoc - Add export to
package.jsonwith development condition - Optionally add to main
src/index.tsexports - Add entry point to
docs/typedoc.jsonfor API doc generation - Write tests in
test/mirroring the src structure - Run
pnpm run buildto verify compilation - Run
pnpm run testto verify tests pass
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: SalesforceCommerceCloud
- Source: SalesforceCommerceCloud/b2c-developer-tooling
- License: Apache-2.0
- Homepage: https://salesforcecommercecloud.github.io/b2c-developer-tooling/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.