xiaohongshu
xiaohongshu
connection-schema-design
Connection profile and state schema design rules and core profile selection
Full skill instructions
Rules for designing connectionProfile.yml and connectionState.yml schemas
NEVER create custom profiles from scratch - ALWAYS extend core profiles
# ❌ WRONG - Custom profile
type: object
properties:
apiKey:
type: string
# ✅ CORRECT - Extend core profile
$ref: './node_modules/@zerobias-org/types-core/schema/tokenProfile.yml'
🚨 MANDATORY: connectionState.yml MUST extend baseConnectionState.yml for expiresIn
# ✅ CORRECT - Extends base with expiresIn
allOf:
- $ref: './node_modules/@zerobias-org/types-core/schema/baseConnectionState.yml'
- type: object
properties:
accessToken:
type: string
# ❌ WRONG - Missing baseConnectionState
type: object
properties:
accessToken:
type: string
# Missing expiresIn!
WHY: Server uses expiresIn to schedule automatic token refresh cronjobs
# ✅ CORRECT
expiresIn:
type: integer
description: Token expiry time in SECONDS from now
# ❌ WRONG
expiresAt:
type: string # Don't use expiresAt, convert to expiresIn
Calculation: expiresIn = Math.floor((expiresAt - now) / 1000)
| Profile | When to Use | Contains |
|---|---|---|
| tokenProfile.yml | API Key, Bearer Token, PAT | token |
| oauthClientProfile.yml | OAuth2 Client Credentials | clientId, clientSecret |
| oauthTokenProfile.yml | OAuth2 with Refresh | clientId, clientSecret |
| basicConnection.yml | Username/Password, Email/Password | username, password |
Path: ./node_modules/@zerobias-org/types-core/schema/{profileName}.yml
@credential-manager provides authMethodType:
IF authMethodType == "bearer-token" OR "api-key"
→ EXTEND tokenProfile.yml
IF authMethodType == "oauth2-client-credentials"
→ EXTEND oauthClientProfile.yml
IF authMethodType == "oauth2-authorization-code"
→ EXTEND oauthTokenProfile.yml
IF authMethodType == "basic-auth"
→ EXTEND basicConnection.yml
| State | When to Use | Contains |
|---|---|---|
| tokenConnectionState.yml | Simple token auth | accessToken + expiresIn |
| oauthTokenState.yml | OAuth with refresh | accessToken + refreshToken + expiresIn |
IF requiresRefresh == false
→ EXTEND tokenConnectionState.yml
IF requiresRefresh == true
→ EXTEND oauthTokenState.yml
# connectionProfile.yml
$ref: './node_modules/@zerobias-org/types-core/schema/tokenProfile.yml'
# connectionState.yml
$ref: './node_modules/@zerobias-org/types-core/schema/tokenConnectionState.yml'
# connectionProfile.yml
$ref: './node_modules/@zerobias-org/types-core/schema/oauthClientProfile.yml'
# connectionState.yml (no refresh)
$ref: './node_modules/@zerobias-org/types-core/schema/tokenConnectionState.yml'
# connectionProfile.yml
$ref: './node_modules/@zerobias-org/types-core/schema/oauthTokenProfile.yml'
# connectionState.yml
$ref: './node_modules/@zerobias-org/types-core/schema/oauthTokenState.yml'
# connectionProfile.yml - Add organizationId
allOf:
- $ref: './node_modules/@zerobias-org/types-core/schema/tokenProfile.yml'
- type: object
required: [organizationId]
properties:
organizationId:
type: string
description: Organization identifier for API access
# connectionState.yml - Add extra state
allOf:
- $ref: './node_modules/@zerobias-org/types-core/schema/tokenConnectionState.yml'
- type: object
properties:
organizationName:
type: string
description: Cached organization name
ONLY connection parameters - minimal set needed to CONNECT
# ✅ GOOD - Connection parameters
- token / apiKey / clientId / clientSecret
- baseUrl (if API has multiple environments)
- organizationId (if required to authenticate)
# ❌ BAD - Operation parameters
- limit (pagination parameter)
- projectId (operation scope, not connection scope)
- fields (query parameter)
Rule: If you can connect WITHOUT it, it's an operation parameter (not profile)
Always review API docs for environment-specific optional parameters:
# Example: Service has optional region parameter
allOf:
- $ref: './node_modules/@zerobias-org/types-core/schema/tokenProfile.yml'
- type: object
properties:
region:
type: string
description: Optional region for multi-region deployments
enum: [us-east-1, eu-west-1, ap-southeast-1]
# region is optional, but include it if API docs mention it
Don't omit parameters that some environments might need!
Before adding ANY property, check what the parent schema provides:
# Check what tokenProfile.yml provides
cat node_modules/@zerobias-org/types-core/schema/tokenProfile.yml
# Check what basicConnection.yml provides
cat node_modules/@zerobias-org/types-core/schema/basicConnection.yml
# Check what baseConnectionState.yml provides
cat node_modules/@zerobias-org/types-core/schema/baseConnectionState.yml
# ❌ WRONG - basicConnection already has uri
allOf:
- $ref: './node_modules/@zerobias-org/types-core/schema/basicConnection.yml'
- type: object
properties:
url: # Duplicate! basicConnection has uri
type: string
# ✅ CORRECT - Use parent's uri, or extend if truly different
allOf:
- $ref: './node_modules/@zerobias-org/types-core/schema/basicConnection.yml'
# uri is already provided by basicConnection
Semantic duplicates to avoid:
Before finalizing connectionProfile, check product docs for ALL auth parameters:
# Example: Missing mfaCode from product docs
allOf:
- $ref: './node_modules/@zerobias-org/types-core/schema/basicConnection.yml'
- type: object
properties:
mfaCode: # Found in product docs!
type: string
description: Multi-factor authentication code (optional)
Don't assume - verify:
NEVER add organization/project/workspace IDs to connection:
# ❌ WRONG - Limits connection to single organization
connectionState:
allOf:
- $ref: './node_modules/@zerobias-org/types-core/schema/baseConnectionState.yml'
- type: object
properties:
accessToken:
type: string
organizationId: # NO! Limits scope
type: string
# ✅ CORRECT - Connection works across all organizations
connectionState:
allOf:
- $ref: './node_modules/@zerobias-org/types-core/schema/baseConnectionState.yml'
- type: object
properties:
accessToken:
type: string
# organizationId is operation parameter, NOT connection parameter
WHY: Connection should be reusable across all scopes. Use operation parameters for scope.
Scope identifiers belong in operation parameters, NOT connection:
For connectionState - don't add fields "just in case" - only add what's actually USED:
# ❌ WRONG - identityId not used anywhere
connectionState:
properties:
accessToken: string
identityId: string # Where is this used? Nowhere!
# ✅ CORRECT - Only fields that are actually used
connectionState:
properties:
accessToken: string
# If connect() doesn't return identityId, don't add it
Ask:
For connectionProfile - include environment-optional fields:
# ✅ CORRECT - Include optional fields that some environments need
allOf:
- $ref: './node_modules/@zerobias-org/types-core/schema/tokenProfile.yml'
- type: object
properties:
region:
type: string
description: Optional region (needed in some deployments)
mfaCode:
type: string
description: Multi-factor authentication code (optional)
# These aren't required, but include them if product docs mention them
connectionProfile vs connectionState:
Before finalizing connection schemas:
# DON'T DO THIS
type: object
properties:
apiKey: string
baseUrl: string
Fix: Extend tokenProfile.yml
# DON'T DO THIS
type: object
properties:
accessToken: string
Fix: Extend baseConnectionState or tokenConnectionState
# DON'T DO THIS
expiresAt:
type: string
format: date-time
Fix: Convert to expiresIn (seconds) in connect() method
# DON'T DO THIS
properties:
accessToken: string
refreshToken: string
# Missing expiresIn!
Fix: MUST extend baseConnectionState for expiresIn
Connection schemas are YAML schemas - design them like api.yml schemas!
xiaohongshu
technical spec
product ux expert
database patterns
Conduct multi-agent task orchestration and workflow coordination.
Initialize project with Conductor artifacts (product definition,
Expert in web animations, transitions, and motion design using Framer Motion and CSS
Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...
PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.
Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...
Display project status, active tracks, and next actions
Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience