ai/skills/aidd-observe/SKILL.md
Enforces Observe pattern best practices from @adobe/data/observe. Use when working with Observe, observables, reactive data flow, service Observe properties, or when the user asks about Observe.withMap, Observe.withFilter, Observe.fromConstant, Observe.fromProperties, or similar.
npx skillsauth add paralleldrive/aidd aidd-observeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Observe<T> from @adobe/data/observe — a subscription function: (notify: (value: T) => void) => Unobserve. Callback may be invoked synchronously or asynchronously, zero or more times. Returns Unobserve to stop observing.
| Helper | Usage |
|--------|-------|
| Observe.fromConstant(value) | Observe<T> from a constant value |
| Observe.fromProperties({ a, b }) | Combine named observables into Observe<{ a, b }> |
| Observe.fromArray([obs1, obs2]) | Combine array of observables into Observe<T[]> |
| Observe.fromPromise(() => Promise) | Lazy; notifies once when promise resolves |
| Observe.createState(initial?) | [Observe<T>, (value: T) => void] — mutable state |
const constant = Observe.fromConstant(42);
const combined = Observe.fromProperties({ a: db.observe.resources.a, b: db.observe.resources.b });
const [count, setCount] = Observe.createState(0);
| Helper | Usage |
|--------|-------|
| Observe.withMap(obs, fn) | Transform value; map from one type to another |
| Observe.withFilter(obs, fn) | Transform or filter; return undefined to skip |
| Observe.withDefault(default, obs) | Use default when value is undefined |
const doubled = Observe.withMap(count, n => n * 2);
const isDev = Observe.withMap(service.type, t => t === 'development');
const max = Observe.withFilter(
Observe.fromProperties({ a, b }),
({ a, b }) => Math.max(a, b)
);
const withFallback = Observe.withDefault('unknown', maybeName);
| Helper | Usage |
|--------|-------|
| Observe.toPromise(obs) | Resolve with first value (one-shot) |
const first = await Observe.toPromise(service.states);
Derived observable from service:
export const isDevelopment = memoize((service: Pick<EnvironmentService, 'type'>) =>
Observe.withMap(service.type, type => type === 'development')
);
Computed from multiple resources:
Observe.withFilter(
Observe.fromProperties({ a: db.observe.resources.a, b: db.observe.resources.b }),
({ a, b }) => Math.max(a, b)
);
Lazy creation: Observe.withLazy(() => expensiveObs) — defers until first subscription.
fn whenAddingOrUsingObserve() {
Constraints {
Use Observe.fromConstant for static values
Use Observe.fromProperties to combine multiple observables
Use Observe.withFilter when mapping and/or filtering
Use Observe.createState for mutable state with a setter
Call unobserve() when cleaning up (e.g. component unmount)
}
}
documentation
Top tier author skill for delivering essential truths with the persuasive power to inspire positive change. Use when writing, reviewing, editing, or scoring any content.
development
Guide for crafting high-quality AIDD skills. Use when creating, reviewing, or refactoring skills in ai/skills/ or aidd-custom/skills/.
testing
Reflective Thought Composition. Structured thinking pipeline for complex decisions, design evaluation, and deep analysis. Use when quality of reasoning matters more than speed of response.
tools
Teaches agents how to write correct riteway ai prompt evals (.sudo files) for multi-step flows that involve tool calls. Use when writing prompt evals, creating .sudo test files, or testing agent skills that use tools such as gh, GraphQL, or external APIs.