Install
$ agentstack add skill-lugassawan-swe-workbench-language-typescript ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
TypeScript / JavaScript
Strict mode or nothing
Enable in tsconfig.json:
{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
"exactOptionalPropertyTypes": true
}
}
Without these, types lie.
Prefer unknown over any
any turns off the type system. unknown forces narrowing.
function parse(input: unknown): User {
if (!isUser(input)) throw new Error("invalid user");
return input;
}
Discriminated unions over enums
Enums have runtime quirks and poor exhaustiveness. Use string-literal unions with a discriminant.
type Event =
| { kind: "click"; x: number; y: number }
| { kind: "submit"; form: FormData };
function handle(e: Event) {
switch (e.kind) {
case "click": return trackClick(e.x, e.y);
case "submit": return submit(e.form);
default: {
const _exhaustive: never = e; return _exhaustive;
}
}
}
Branded types for domain primitives
Stop UserId from being passed where an OrderId is expected.
type Brand = K & { readonly __brand: T };
type UserId = Brand;
type OrderId = Brand;
const makeUserId = (s: string): UserId => s as UserId;
Async patterns
awaiteverything that returns a promise. Floating promises silently swallow errors.- Enable
@typescript-eslint/no-floating-promises. Promise.allfor all-or-fail;Promise.allSettledwhen partial failure is acceptable.- Don't mix
.then()chains withawaitin the same function. - Timeouts belong on every external call.
AbortControlleris the standard.
const ac = new AbortController();
const t = setTimeout(() => ac.abort(), 5_000);
try {
const r = await fetch(url, { signal: ac.signal });
return await r.json();
} finally {
clearTimeout(t);
}
Structural typing gotchas
TypeScript types are shapes, not identities. Two unrelated types with the same fields are interchangeable. Brand when you need nominal behavior.
Error handling
- Throw
Errorsubclasses, not strings. - Catch
unknownat boundaries; narrow before use. - For domain code, consider
Result-style unions over throwing — explicit, typed, exhaustively handled.
Modules and imports
- ESM (
"type": "module") in new projects. - Absolute imports via
pathsintsconfig; don't ship../../../ladders. - Keep barrels (
index.ts) shallow — deep barrels slow cold-start and break tree-shaking.
React / TSX notes
ReactNodefor children props.JSX.Elementis narrower than you usually want.- Avoid
FC— it adds implicitchildrenand breaks generic components. Preferfunction Thing(props: Props) { ... }. useEffectonly for synchronizing with external systems. Derived state belongs in render.
Tooling
- Imports:
npx organize-imports-cli(reliable regardless of ESLint config); oreslint --fixifeslint-plugin-import/@typescript-eslint/consistent-type-importsis configured - Format:
prettier --write . - Lint:
eslint .+tsc --noEmit - Test:
vitest/jest(see Testing below)
Testing
- Vitest or Jest — pick one.
tsdorexpectTypefor type-level tests of public APIs.- Avoid snapshot tests of implementation details.
Avoid
any,// @ts-ignore,as unknown as Tin production code.- Non-null assertions (
!) without a comment explaining why. Object,Function,{}as types — they are never what you want.- Classes where a function and a closure would do.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: lugassawan
- Source: lugassawan/swe-workbench
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.