skills/safe-ts/SKILL.md
Enforce "safe-ts" coding principles in TypeScript. Use when writing, reading, reviewing, or refactoring TypeScript code to ensure maximum safety, predictable execution, and zero technical debt.
npx skillsauth add thedumptruck/skills safe-tsInstall 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.
Build highly predictable, robust, and performant TypeScript/Node.js applications with a "zero technical debt" policy.
Always verify standards against the reference documentation before implementing.
| Resource | URL / Path |
|----------|------------|
| Safety & Control Flow | ./references/safety.md |
| Performance Patterns | ./references/performance.md |
| Developer Experience | ./references/dx.md |
Review the relevant documentation when writing new logic or performing code reviews.
throw / try-catch./references/safety.md - Control flow limits, bounded Promises, assertions, Result types./references/performance.md - Object pools, TypedArrays, monomorphic shapes./references/dx.md - Naming conventions, options structs, strict compiler flags, zero dependenciesSearch: no recursion, AbortSignal, ObjectPool, Result<T,E>, noUncheckedIndexedAccess, Zod
| Need | Example |
|------|---------|
| Predictable Execution | Bounded for loops, bounded Promises via AbortSignal.timeout() |
| Memory Stability | Pre-allocating arrays/pools at startup, Uint8Array, in-place object mutation |
| Operational Reliability | Returning explicit Result<T, E> types, never throwing operational errors |
| Maintainability | Maximum 70 lines per function, max 100 columns per line, options interfaces |
while(true) loops or Promises without timeoutsnew Object(), [], {}) inside hot paths (triggers GC pauses)any typesthrow and catch (Exceptions are for bugs/panics only)Proxy, Reflect, or runtime decorator magic// Always bound asynchronous operations with a timeout
async function fetchWithBounds(url: string, timeoutMs: number): Promise<Result<Response, Error>> {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(new Error("Timeout")), timeoutMs);
try {
const res = await fetch(url, { signal: controller.signal });
if (!res.ok) return { ok: false, error: new Error(`HTTP ${res.status}`) };
return { ok: true, value: res };
} catch (err) {
// Only catch native exceptions/abort errors to wrap them into Results
return { ok: false, error: err instanceof Error ? err : new Error(String(err)) };
} finally {
clearTimeout(timeoutId);
}
}
// Pre-allocate at startup to avoid GC pauses during execution
class BufferPool {
private pool: Uint8Array[];
constructor(size: number, bufferSize: number) {
this.pool = Array.from({ length: size }, () => new Uint8Array(bufferSize));
}
acquire(): Uint8Array | null {
return this.pool.pop() || null;
}
release(buf: Uint8Array): void {
// Reset state before returning to pool
buf.fill(0);
this.pool.push(buf);
}
}
const pool = new BufferPool(100, 1024);
function processData(target: Uint8Array): Result<void, Error> {
// Acquire from pool instead of `new Uint8Array(1024)`
const buf = pool.acquire();
if (!buf) return { ok: false, error: new Error("Pool exhausted") };
try {
// ... mutate target or buf in-place
return { ok: true, value: undefined };
} finally {
pool.release(buf);
}
}
// Define explicit union returns instead of throwing
type Result<T, E = Error> =
| { ok: true; value: T }
| { ok: false; error: E };
function parseData(input: string): Result<ParsedData, ValidationError> {
if (!input) return { ok: false, error: new ValidationError("Empty input") };
// ...
return { ok: true, value: data };
}
ifs up, push fors down.Result<T, E> or a Promise. Await everything.throw only for programmer errors/broken invariants (like assertion failures). Use standard explicit Result returns for operational issues.strict: true, noUncheckedIndexedAccess: true, and noImplicitReturns: true.zod).timeoutMs, latencyMaxMs).any or explicit type assertions (as Type) to bypass the compilerthrow new Error("Invalid User"))while(true) loops or new Promise(() => {}) without a reject mechanismnoUncheckedIndexedAccess)void myAsyncFunc())Proxy, Reflect, dynamically adding/deleting object properties delete obj.prop)development
Enforce "safe-rust" coding principles. Use when writing, reading, reviewing, or refactoring Rust code to ensure maximum memory safety, predictable execution, zero-cost abstractions, and idiomatic Rust patterns.
development
Enforce "safe-golang" coding principles in Go. Use when writing, reading, reviewing, or refactoring Go code to ensure maximum safety, predictable execution, and zero technical debt.
development
Enforce "safe-c" coding principles in C. Based on TigerBeetle's Tiger Style. Use when writing, reading, reviewing, or refactoring C code to ensure maximum safety, predictable execution, zero technical debt, and extreme performance.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.