Adopt better-result incrementally in existing codebases without rewriting everything at once.
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionbetter-result-adoptExecute the skills CLI command in your project's root directory to begin installation:
Fetches better-result-adopt from dmmulroy/better-result and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
Restart Cursor to activate better-result-adopt. Access via /better-result-adopt in your agent's command palette.
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your environment. Always review source, verify the publisher, and test in isolation before production.
Submit your Claude Code skill and start earning
Create detailed user stories, acceptance criteria, and feature specs
Example
Generate user stories for 'password reset feature' with acceptance criteria, edge cases, and test scenarios
Reduce spec writing time by 50%, ensure comprehensive coverage
Research competitors, compare features, identify gaps
Example
Analyze 5 competitor products, create feature comparison matrix, suggest differentiation opportunities
Complete competitive research in 2 hours instead of 2 days
Evaluate features using frameworks (RICE, ICE, Kano) and create prioritized backlogs
Example
Score 20 feature ideas using RICE framework, generate prioritized roadmap with rationale
2
total installs
2
this week
1.2K
GitHub stars
0
upvotes
Run in your terminal
2
installs
2
this week
1.2K
stars
Adopt better-result incrementally in existing codebases without rewriting everything at once.
Use this skill when the user wants to:
Result.try or Result.tryPromiseResult<T, E>TaggedError typesandThen chains or Result.gen| Task | Files to Read |
|---|---|
| Adopt better-result in a module | This file |
| Define or review error types | references/tagged-errors.md |
| Inspect library implementation details | opensrc/ if present |
Before editing code:
better-result is already installed in the target project.opensrc/ directory. If present, read the package source there for current patterns.Begin with I/O boundaries and exception-heavy code:
Do not convert the whole codebase at once.
| Category | Examples | Target shape |
|---|---|---|
| Domain errors | not found, validation, auth | TaggedError + Result.err |
| Infrastructure errors | network, DB, file I/O | Result.tryPromise + mapped error |
| Programmer defects | bad assumptions, null deref | leave throwing; defects become Panic inside Result callbacks |
Result.try / Result.tryPromise.Result.Result values.andThen, mapError, or Result.gen.Result.tryfunction parseConfig(json: string): Result<Config, ParseError> {
return Result.try({
try: () => JSON.parse(json) as Config,
catch: (cause) => new ParseError({ cause, message: `Parse failed: ${cause}` }),
});
}
Result.tryPromiseasync function fetchUser(id: string): Promise<Result<User, ApiError | UnhandledException>> {
return Result.tryPromise({
try: async () => {
const res = await fetch(`/api/users/${id}`);
if (!res.ok) throw new ApiError({ status: res.status, message: `API ${res.status}` });
return res.json() as Promise<User>;
},
catch: (cause) => (cause instanceof ApiError ? cause : new UnhandledException({ cause })),
});
}
Resultfunction findUser(id: string): Result<User, NotFoundError> {
const user = users.find((candidate) => candidate.id === id);
return user
? Result.ok(user)
: Result.err(new NotFoundError({ id, message: `User ${id} not found` }));
}
Result.genasync function processOrder(orderId: string): Promise<Result<OrderResult, OrderError>> {
return Result.gen(async function* () {
const order = yield* Result.await(fetchOrder(orderId));
const validated = yield* validateOrder(order);
const result = yield* Result.await(submitOrder(validated));
return Result.ok(result);
});
}
try, catch, .catch(...), throw, null, undefined, and status-flag error handling.TaggedError classes before changing control flow.Result<T, E> or Promise<Result<T, E>>.Result.Result.gen or andThen.cause, IDs, messages, and other structured fields.A migration is complete when:
Result valuesTaggedError classesResult or explicitly unwrap/match itthrow-based and Result-based APIs deep in the same flowPanic instead of fixing the underlying defect| File | Purpose |
|---|---|
references/tagged-errors.md |
TaggedError patterns, matching, type guards, and examples |
If opensrc/ exists, treat it as the source of truth for implementation details and current API behavior.
Make data-driven prioritization decisions faster
Draft PRDs, status updates, and stakeholder presentations
Example
Create executive summary of Q3 roadmap, monthly progress report, feature launch announcement
Save 3-5 hours/week on communication overhead
Prerequisites
Time Estimate
30-60 minutes to see productivity improvements
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ Use when
Use for user story writing, competitive research, roadmap prioritization, stakeholder communication, and PRD drafting. Best for reducing repetitive documentation and research work.
✗ Avoid when
Avoid for strategic product vision (requires deep customer empathy), pricing decisions (needs market and financial expertise), or when face-to-face customer discovery is more valuable than speed.
mattpocock/skills
parcadei/continuous-claude-v3
cursor/plugins
ailabs-393/ai-labs-claude-skills
ailabs-393/ai-labs-claude-skills
pproenca/dot-skills
Keeps context tight: better-result-adopt is the kind of skill you can hand to a new teammate without a long onboarding doc.
Keeps context tight: better-result-adopt is the kind of skill you can hand to a new teammate without a long onboarding doc.
I recommend better-result-adopt for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
Useful defaults in better-result-adopt — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
Registry listing for better-result-adopt matched our evaluation — installs cleanly and behaves as described in the markdown.
better-result-adopt reduced setup friction for our internal harness; good balance of opinion and flexibility.
Keeps context tight: better-result-adopt is the kind of skill you can hand to a new teammate without a long onboarding doc.
better-result-adopt has been reliable in day-to-day use. Documentation quality is above average for community skills.
better-result-adopt has been reliable in day-to-day use. Documentation quality is above average for community skills.
Solid pick for teams standardizing on skills: better-result-adopt is focused, and the summary matches what you get after install.
showing 1-10 of 25