home / skills / commontoolsinc / labs / pattern-implement
This skill helps you implement a minimal sub-pattern with a testable Stream-based interface and lightweight UI for data flow validation.
npx playbooks add skill commontoolsinc/labs --skill pattern-implementReview the files below or copy the command above to add this skill to your agents.
---
name: pattern-implement
description: Build sub-patterns with minimal UI
user-invocable: false
---
Use `Skill("ct")` for ct CLI documentation when running commands.
# Implement Sub-Pattern
## Core Rule
Write ONE sub-pattern with minimal stub UI. No styling, just basic inputs/buttons to verify data flow.
**Always use `pattern<Input, Output>()`** - expose actions as `Stream<T>` for testability.
## Order
1. Leaf patterns first (no dependencies on other patterns)
2. Container patterns (compose leaf patterns)
3. main.tsx last (composes everything)
## Read First
- `docs/common/patterns/` - especially `meta/` for generalizable idioms
- `docs/common/concepts/action.md` - action() for local state
- `docs/common/concepts/handler.md` - handler() for reusable logic
- `docs/common/concepts/reactivity.md` - Cell behavior, .get()/.set()
- `docs/common/concepts/identity.md` - equals() for object comparison
## Key Patterns
**action()** - Closes over local state in pattern body:
```tsx
const inputValue = Cell.of("");
const submit = action(() => {
items.push({ text: inputValue.get() });
inputValue.set("");
});
```
**handler()** - Reused with different bindings:
```tsx
const deleteItem = handler<void, { items: Writable<Item[]>; index: number }>(
(_, { items, index }) => items.set(items.get().toSpliced(index, 1))
);
// In JSX: onClick={deleteItem({ items, index })}
```
**Rendering sub-patterns** - Use function calls, not JSX:
```tsx
// ✅ Correct
{items.map((item) => ItemPattern({ item, allItems: items }))}
// ❌ Wrong - JSX fails with typed Output
{items.map((item) => <ItemPattern item={item} />)}
```
## Done When
- Pattern compiles: `deno task ct check pattern.tsx --no-run`
- Minimal UI renders inputs/buttons
- Ready for testing
This skill teaches how to implement a single sub-pattern with a minimal UI using TypeScript and the provided pattern primitives. It focuses on delivering one leaf or container pattern that exposes actions as Stream<T> and renders only basic inputs and buttons to verify data flow. The goal is a compilable pattern ready for automated checks and tests.
Follow the prescribed order: create leaf patterns first, then container patterns, and finally compose in main.tsx. Implement patterns with pattern<Input, Output>() and expose user interactions via action() and handler() primitives. Render sub-patterns by calling them as functions so typed Outputs remain intact, and use Cells for local reactive state.
Do I need to include styling or complex markup?
No. Keep the UI minimal—plain inputs and buttons are sufficient to verify data flow and actions.
How should I expose interactions for tests?
Always expose actions as Stream<T> by using pattern<Input, Output>() and action()/handler() so tests can subscribe to events.