walkeros-create-cmp-so…
A CMP source is a specialized walkerOS source that listens to a consent management platform's events and translates consent…
Use when creating a new walkerOS source to capture events (browser source, dataLayer interception, server/HTTP source, webhook receiver, event capture), web or server-side. Example-driven workflow: research the input format and define step examples before implementing the push
$ npx -y skills add elbwalker/walkerOS --skill walkeros-create-source --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/walkeros-create-sourceContext preview
The summary Claude sees to decide when to auto-load this skill.
Use when creating a new walkerOS source to capture events (browser source, dataLayer interception, server/HTTP source, webhook receiver, event capture), web or server-side. Example-driven workflow: research the input format and define step examples before implementing the push
name: walkeros-create-source description: >- Use when creating a new walkerOS source to capture events (browser source, dataLayer interception, server/HTTP source, webhook receiver, event capture), web or server-side. Example-driven workflow: research the input format and define step examples before implementing the push interface, createTrigger, and env pattern.
Before starting, read these skills:
fit in architecture
interface
Transformer chaining from sources
structure sources emit
Transform raw input to events
env pattern and dev examples
Authoritative `Flow.StepExample` pattern, `createTrigger`, Three Type Zones
"Choosing a level on public endpoints": rejected client input is debug or warn plus a `rejected` counter and a 4xx, never an error-level log
Documentation standards (for Phase 9)
A source's identity is split into two fields:
| Field | Meaning | Examples | | ----------------- | --------------------------------------------------------------- | ---------------------------------------------- | | `source.type` | The kind of source (its role / mechanism) | `browser`, `dataLayer`, `cookiefirst`, `fetch` | | `source.platform` | The runtime that hosts the source (`web`, `server`, `app`, ...) | `web`, `server` |
| Platform | Input | Example types | | -------- | ----------------------- | ----------------------------------- | | `web` | DOM events, dataLayer | `browser`, `dataLayer` | | `server` | HTTP requests, webhooks | `gcp`, `express`, `lambda`, `fetch` |
Every source registers its `type` literal and any source-specific `source.*` fields by augmenting `SourceMap` from `@walkeros/core`. This is how the collector and downstream consumers know about the new source kind without loosening the union to `string`.
Add this to the source's `src/types.ts` (or `src/types/index.ts`):
import type { Source, Elb } from '@walkeros/core';
declare module '@walkeros/core' {
interface SourceMap {
// Replace `mySource` with the source's package-level identifier.
mySource: {
type: 'mySource'; // matches the literal you return from Source.Init
platform?: 'web'; // 'web' | 'server' | 'app' | ...
// Add any extra fields the source surfaces in `event.source.*` here.
// e.g. `version?: string;` is already on the base Source - only add
// truly source-specific keys.
};
}
}Reference implementations: `packages/web/sources/browser/src/types/index.ts`, `packages/web/sources/demo/src/types.ts`. Conflicting declarations cause compile errors on purpose, this surfaces naming collisions early.
| Category | Purpose | Examples | Key Concern | | ------------------ | ----------------------------------------- | ----------------------- | -------------------- | | **Transformation** | Convert external format → walkerOS events | `dataLayer`, `fetch` | Mapping accuracy | | **Transport** | Receive events from specific platform | `gcp`, `aws`, `express` | Platform integration |
| Complexity | Template | When to Use | | --------------------- | -------------- | ------------------------------------- | | Simple transformation | `fetch/` | Generic HTTP handler, data conversion | | Platform transport | `gcp/`, `aws/` | Cloud platform integration | | Browser interception | `dataLayer/` | DOM events, array interception |
1. Research → Deeply understand external system, SDK, and data format 2. Classify → Determine source type and integration approach 3. Examples → Define in/out pairs FIRST (start with the end result) 4. Mapping → Define input → walkerOS event transformation 5. Scaffold → Copy template and configure 6. Convention → Add walkerOS.json metadata and buildDev 7. Implement → Build using examples as test fixtures 8. Test → Verify against example variations 9. Document → Write README
---
**Goal:** Deeply understand the external system before writing any code. Research quality determines implementation quality.
Always prefer the vendor's official SDK package over raw HTTP API calls. The SDK handles transport, data formatting, and platform specifics - don't reinvent these.
Never duplicate type definitions. This ensures IntelliSense completeness and consistency with SDK updates.
export. What data structures does the platform provide? What request/event formats exist?
# Search npm for official packages npm search [vendor-name] npm search @[vendor] # Install
From browser to BigQuery and ad platforms - warehouse-native, and ready for AI agents via MCP.
A CMP source is a specialized walkerOS source that listens to a consent management platform's events and translates consent…
Use when creating a new walkerOS destination to send events to a vendor or API (GA4/gtag, Meta/Facebook Pixel, Mixpanel,…
| Symptom | Likely Cause | Check | | ---------------------------------- | ---------------------------- |…
Read [understanding-mapping](../walkeros-understanding-mapping/SKILL.md) first for core concepts.
You are an AI agent running inside a **code-execution host**, not issuing tool calls one at a time through the model. Examples: