walkeros-create-cmp-so…
A CMP source is a specialized walkerOS source that listens to a consent management platform's events and translates consent…
walkerOS follows extreme programming principles with strict conventions. This skill is your foundation before writing any code.
$ npx -y skills add elbwalker/walkerOS --skill walkeros-understanding-development --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/walkeros-understanding-developmentContext preview
The summary Claude sees to decide when to auto-load this skill.
walkerOS follows extreme programming principles with strict conventions. This skill is your foundation before writing any code.
name: walkeros-understanding-development description: Use when contributing to walkerOS, before writing code, or when unsure about project conventions. Covers build/test/lint workflow, XP principles, folder structure, and package usage.
walkerOS follows extreme programming principles with strict conventions. This skill is your foundation before writing any code.
**Core principle:** DRY, KISS, YAGNI. Test first. Verify before claiming complete.
| Command | Purpose | | ---------------- | --------------------------- | | `npm install` | Install all dependencies | | `npm run dev` | Watch mode for all packages | | `npm run build` | Build all packages | | `npm run format` | Prettier formatting |
**Verification cheatsheet:**
`npm run verify:affected`
See `/workspaces/developer/AGENT.md` rule 11 for the full doctrine.
| Principle | In Practice | | ------------ | -------------------------------------------------------- | | **DRY** | Use `@walkeros/core` utilities, don't reimplement | | **KISS** | Minimal code to solve the problem | | **YAGNI** | Only implement what's requested | | **TDD** | Test first, watch it fail, then implement | | **No `any`** | Never use `any` in production code (tests are exception) |
packages/
├── core/ # Platform-agnostic types, utilities, schemas
├── collector/ # Central event processing engine
├── config/ # Shared config (eslint, jest, tsconfig, tsup)
├── web/
│ ├── core/ # Web-specific utilities
│ ├── sources/ # browser, dataLayer
│ └── destinations/ # gtag, meta, api, piwikpro, plausible
└── server/
├── core/ # Server-specific utilities
├── sources/ # gcp
└── destinations/ # aws, gcp, meta
apps/
├── walkerjs/ # Zero-config browser file for GTM
├── quickstart/ # Code examples (source of truth for patterns)
└── demos/ # Demo applications**Always import from `@walkeros/core`:**
// Types
import type { WalkerOS } from '@walkeros/core';
// Utilities
import {
getEvent,
createEvent, // Event creation
getMappingEvent,
getMappingValue, // Transformations
isString,
isObject,
isDefined, // Type checking
assign,
clone, // Object operations
tryCatch,
tryCatchAsync, // Error handling
} from '@walkeros/core';**Config package for shared tooling:**
Core component configs live in two places:
`packages/core/src/types/{destination,source,transformer,store,collector}.ts`
`packages/core/src/schemas/{destination,source,transformer,store,collector}.ts`
Both are hand-written and mirror each other. TS stays authoritative because Zod's inferencer collapses recursive types (`Routes`, `MatchExpression`, `Value`) to `unknown`. Zod drives runtime validation, JSON Schema emission, and website Configuration reference tables.
When adding, renaming, or removing a Config field, update BOTH files. A compile-time drift guard at `packages/core/src/schemas/__tests__/config-drift.test-d.ts` fails `tsc` if the key sets diverge. The guard checks keys only; value types may differ (recursion, generic slots). Run `npm run verify:touched -- core` to verify.
Top-level boundaries in the collector (`createPush` in `push.ts`, `createCommand` in `command.ts`) wrap their inner pipeline in `tryCatchAsync`. The `onError` callback MUST do two things:
enough context to reproduce (event/ingest for push, command/data for command),
An empty `onError` is a defect: it swallows the exception, returns `{ ok: false }` silently, and leaves the operator blind. Use `packages/collector/src/push.ts` and `packages/collector/src/command.ts` as the canonical pattern.
Two categories of caught error:
1. **Internal walkerOS pipeline failures** (push, command, mapping outer wrap in `mapping.ts`, source factory / init / queueOn flush in `source.ts`, transformer init in `transformer.ts`, destination init in `destination.ts`): log AND `status.failed++`. 2. **User-supplied callbacks** (mapping `condition` / `fn` / `validate`, `on` subscriptions in `on.ts`): log only. `status.failed` stays a pipeline-health signal; user-code visibility goes via logs.
For invariant violations or operator-initiated aborts that must crash the host process, throw `FatalError` (exported from `@walkeros/core`). `FatalError` bypasses every boundary catch in both categories so a supervisor can terminate cleanly. Standard `Error` is absorbed, logged, and (for category 1) counted.
The log message verb identifies the site: `'mapping condition failed'`, `'source factory failed'`, `'transformer init failed'`, `'on callback failed'`, etc. Operators grep for the verb. No `kind` field is required except in `on.ts`, where seven sites share one verb and disambiguate via a typed `kind` field on the structured payload.
**REQUIRED SKILL:** Use `testing-strategy` for detailed testing patterns.
Quick reference:
patterns and env
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,…
Use when creating a new walkerOS source to capture events (browser source, dataLayer interception, server/HTTP source, webhook…
| Symptom | Likely Cause | Check | | ---------------------------------- | ---------------------------- |…
Read [understanding-mapping](../walkeros-understanding-mapping/SKILL.md) first for core concepts.