Thanks for your interest in contributing to YALC. Here's how to get started.
git clone https://github.com/Othmane-Khadri/YALC-the-GTM-operating-system.git
cd YALC-the-GTM-operating-system
pnpm install
cp .env.example .env.local # Add at least ANTHROPIC_API_KEY
pnpm typecheck # Verify everything compiles
pnpm test # Run the test suiteYALC follows a strict three-layer pattern:
Service (API wrapper) → Provider (StepExecutor) → Skill (user-facing operation)
Never skip layers. A skill should never call an API directly — it goes through a provider, which goes through a service.
- TypeScript with strict mode, ESM only (
"type": "module") - File names: kebab-case (
campaign-manager.ts) - Imports: Use
.jsextensions in relative imports (ESM requirement) andnode:prefix for built-ins - Tests: Vitest, co-located in
__tests__/directories, in-memory SQLite
pnpm typecheckpasses with no errorspnpm test— all tests pass- Any command that sends or writes supports
--dry-run - No API keys or secrets in code — use
sk-...redactedpattern in examples - Campaign outcomes are wired to the intelligence store
- Create
src/lib/providers/builtin/<name>-provider.ts - Implement the
StepExecutorinterface fromsrc/lib/providers/types.ts - Register it in
src/lib/providers/builtin/index.ts - Add required env vars to
.env.example - Write tests in
src/lib/providers/builtin/__tests__/<name>.test.ts - Document the provider in
docs/providers.md
- Create
src/lib/skills/builtin/<name>.ts - Export a
Skillobject with id, name, description, category, inputSchema, and execute function - Register it in
src/lib/skills/builtin/index.ts - Add the skill to
docs/skills.md
Open an issue at https://github.com/Othmane-Khadri/YALC-the-GTM-operating-system/issues with:
- What you expected to happen
- What actually happened
- Output of
yalc-gtm doctor - Your Node.js version (
node --version)
Do not file public issues for security vulnerabilities. See SECURITY.md for responsible disclosure instructions.