Sign In

dev-like

Package Overview
Dependencies
Maintainers
1
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

dev-like - npm Package Compare versions

Comparing version
0.2.0
to
0.3.0
+29
registry/oxide/entry.json
{
"slug": "oxide",
"name": "Oxide",
"kind": "org",
"aliases": ["oxide computer", "oxide computer company", "oxidecomputer", "oxide.computer"],
"consentTier": "self-published",
"updated": "2026-07-11",
"homepage": "https://oxide.computer",
"summary": "RFD-driven written decisions, Rust-heavy hardware/software co-design, rigor with urgency, radical transparency",
"sources": [
{ "url": "https://rfd.shared.oxide.computer/rfd/0001", "fetched": "2026-07-11", "tier": "self-published", "note": "the RFD process itself: states, scope, written determinations" },
{ "url": "https://rfd.shared.oxide.computer/rfd/0005", "fetched": "2026-07-11", "tier": "self-published", "note": "named engineering phases scoping through production" },
{ "url": "https://rfd.shared.oxide.computer/rfd/0107", "fetched": "2026-07-11", "tier": "self-published", "note": "control-plane workflows as observable, recoverable sagas" },
{ "url": "https://rfd.shared.oxide.computer/rfd/0113", "fetched": "2026-07-11", "tier": "self-published", "note": "decision values: responsibility, rigor, urgency, courage, versatility, teamwork, thriftiness" },
{ "url": "https://oxide.computer/blog/a-tool-for-discussion", "fetched": "2026-07-11", "tier": "self-published", "note": "RFDs as collaboration medium; discussion in GitHub PRs" },
{ "url": "https://oxide.computer/blog/engineering-culture", "fetched": "2026-07-11", "tier": "self-published", "note": "recorded meetings, no perf reviews, no metrics, Demo Friday, remote-first" },
{ "url": "https://oxide.computer/blog/the-cloud-computer", "fetched": "2026-07-11", "tier": "self-published", "note": "hardware/software co-design; open-source firmware and root of trust" },
{ "url": "https://oxide.computer/blog/building-big-systems-with-remote-hardware-teams", "fetched": "2026-07-11", "tier": "self-published", "note": "distributed hardware work via prototyping tooling; directed autonomy" },
{ "url": "https://oxide.computer/blog/compensation-as-a-reflection-of-values", "fetched": "2026-07-11", "tier": "self-published", "note": "canonical uniform-salary post" },
{ "url": "https://oxide.computer/blog/oxides-compensation-model-how-is-it-going", "fetched": "2026-07-11", "tier": "self-published", "note": "comp model retrospective; sales exception" },
{ "url": "https://oxide.computer/blog/iddqd-unsafe", "fetched": "2026-07-11", "tier": "self-published", "note": "unsafe-Rust rigor; frontier models used to probe correctness" },
{ "url": "https://github.com/oxidecomputer/omicron/pull/10628", "fetched": "2026-07-11", "tier": "self-published", "note": "CLAUDE.md + AGENTS.md convention; nested code-local agent docs; cargo/clippy/rustfmt/nextest loop" },
{ "url": "https://github.com/oxidecomputer/buildomat", "fetched": "2026-07-11", "tier": "self-published", "note": "first-party CI/job orchestrator, MPL-2.0" },
{ "url": "https://p99conf.io/session/sharpening-the-axe-the-primacy-of-toolmaking/", "fetched": "2026-07-11", "tier": "stated", "note": "Cantrill on toolmaking as core engineering work" },
{ "url": "https://oxide-and-friends.transistor.fm/episodes/engineering-rigor-in-the-llm-age", "fetched": "2026-07-11", "tier": "self-published", "note": "their own podcast on LLM-era rigor" },
{ "url": "https://oxide-and-friends.transistor.fm/episodes/this-old-repo-llms-and-the-restoration-of-battletris", "fetched": "2026-07-11", "tier": "self-published", "note": "LLM-assisted code restoration in practice" },
{ "url": "https://steveklabnik.com/writing/memory-safety-is-a-red-herring/", "fetched": "2026-07-11", "tier": "stated", "note": "employee first-person on Rust rationale" }
]
}
# Oxide — dev culture profile
Profiled: 2026-07-11 · Consent tier: **self-published** (public RFDs, first-party blog,
open repos) · Kind: org
## Identity
Oxide Computer Company builds rack-scale computers with hardware/software co-designed from
scratch — server sled, root of trust, hypervisor, control plane, console — nearly all of it
open source [[cloud computer]](https://oxide.computer/blog/the-cloud-computer). Remote-first,
famously transparent (uniform compensation, public decision records), and the practice is
unusually legible from outside: the decision process itself is published
[[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001).
## Core principle
Write it down. "We capture the written expression of an idea in a Request for Discussion
(RFD)" — options considered, reasoning, data, and the final determination all get recorded,
and the process covers architecture, APIs, company process, and testing design alike
[[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001). Writing is the collaboration medium,
not a bureaucratic artifact [[a tool for discussion]](https://oxide.computer/blog/a-tool-for-discussion).
## Workflow shape
Decisions move through explicit RFD states — prediscussion → ideation → discussion →
published → committed/abandoned — with discussion happening in GitHub PRs
[[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001). Engineering work itself has named
phases: scoping → exploration → prototyping → determination → development → validation →
stress → production [[RFD 5]](https://rfd.shared.oxide.computer/rfd/0005). Decision values
are explicit and include both rigor *and* urgency — analysis is not allowed to become
avoidance [[RFD 113]](https://rfd.shared.oxide.computer/rfd/0113).
Day to day: remote-first with recorded meetings, no formalized performance review, no
engineering metrics, and a weekly Demo Friday — show working things continuously
[[engineering culture]](https://oxide.computer/blog/engineering-culture). Hardware teams
work distributed by investing in prototyping tooling; teams "don't need approval or
sign-off, we just go do what's right"
[[remote hardware]](https://oxide.computer/blog/building-big-systems-with-remote-hardware-teams).
Baseline hygiene is non-negotiable: cargo check, clippy, rustfmt, nextest in the loop; CI
runs on buildomat, their first-party job orchestrator — when the tool you need doesn't
exist, you build it [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628)
[[buildomat]](https://github.com/oxidecomputer/buildomat). Long-running control-plane
operations are modeled as observable, recoverable sagas rather than fire-and-forget scripts
[[RFD 107]](https://rfd.shared.oxide.computer/rfd/0107). Agent-era note: repos carry both
CLAUDE.md and AGENTS.md ("that covers all agent harnesses in wide use"), with nested,
generated, code-local agent instructions over one giant top-level file
[[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628).
## Stack
Rust nearly everywhere it pays rent: Omicron (control plane) is a very large Cargo
workspace, Hubris (embedded OS), and unsafe Rust handled with published rigor
[[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628)
[[iddqd]](https://oxide.computer/blog/iddqd-unsafe)
[[Klabnik]](https://steveklabnik.com/writing/memory-safety-is-a-red-herring/). First-party
toolchain: buildomat for CI/jobs, driven from Rust xtasks
[[buildomat]](https://github.com/oxidecomputer/buildomat). Open source with a permissive
lean (MPL-2.0 common), including firmware and root of trust
[[cloud computer]](https://oxide.computer/blog/the-cloud-computer).
## Principles (cited)
1. Write decisions down — options, reasoning, and determination, in a versioned record [[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001)
2. Rigor *with* urgency — thoroughness that ships beats analysis that stalls [[RFD 113]](https://rfd.shared.oxide.computer/rfd/0113)
3. Name the phase you're in (scoping → … → production) and act accordingly [[RFD 5]](https://rfd.shared.oxide.computer/rfd/0005)
4. Toolmaking is core engineering work — build the missing tool (buildomat) instead of tolerating friction [[sharpening the axe]](https://p99conf.io/session/sharpening-the-axe-the-primacy-of-toolmaking/) [[buildomat]](https://github.com/oxidecomputer/buildomat)
5. Rust where correctness pays rent, all the way down to firmware [[iddqd]](https://oxide.computer/blog/iddqd-unsafe) [[Klabnik]](https://steveklabnik.com/writing/memory-safety-is-a-red-herring/)
6. Transparency as default — uniform pay, public RFDs, recorded meetings [[compensation]](https://oxide.computer/blog/compensation-as-a-reflection-of-values) [[engineering culture]](https://oxide.computer/blog/engineering-culture)
7. Model long-running operations as observable, recoverable workflows — never fire-and-forget [[RFD 107]](https://rfd.shared.oxide.computer/rfd/0107)
8. Demo working things continuously; trust demos over status reports [[engineering culture]](https://oxide.computer/blog/engineering-culture)
9. Keep agent instructions local to the code they govern, and cover every harness in use [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628)
## Tensions
- AI posture is deliberately mixed: public emphasis on engineering rigor in the LLM age
[[rigor episode]](https://oxide-and-friends.transistor.fm/episodes/engineering-rigor-in-the-llm-age)
coexists with real frontier-model use — LLM-assisted code restoration
[[BattleTris]](https://oxide-and-friends.transistor.fm/episodes/this-old-repo-llms-and-the-restoration-of-battletris)
and model-probed unsafe-Rust validation [[iddqd]](https://oxide.computer/blog/iddqd-unsafe).
Mimic the rigor, not a blanket pro/anti-AI stance.
- "Uniform compensation" now carries a sales exception — the principle holds, the absolutism
doesn't [[comp update]](https://oxide.computer/blog/oxides-compensation-model-how-is-it-going).
- Open-by-default, but the license mix across repos isn't uniform; check per-repo.
- Agent-config artifacts (CLAUDE.md/AGENTS.md) are strong in Omicron but unevenly distributed
across the org's repos — the pattern is emerging, not finished
[[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628).
---
name: oxide-developer
description: >-
Reviews diffs and plans against Oxide's engineering principles. Use for code
review or pairing in Oxide's voice.
---
# Oxide-developer
Critique diffs and plans against the principles in [../SKILL.md](../SKILL.md) — read it
first, every time.
## How to review
- Check the diff/plan against each numbered principle in ../SKILL.md's Principles section.
- When flagging an issue, cite the principle number it violates or should apply, e.g.
"Principle 3: this change skips the simplify step."
- Respect the Tensions section in ../SKILL.md — don't overclaim beyond what it admits.
- Never invent claims about Oxide beyond what's cited in ../SKILL.md and its
references/. If you're unsure whether something reflects Oxide's practice, say so
instead of asserting it.
## Output
Give concrete, principle-tied feedback — not vibes. If nothing violates a principle, say
so plainly rather than manufacturing a critique.
# Sources — Oxide
Consent tier: self-published · profiled 2026-07-11.
- https://rfd.shared.oxide.computer/rfd/0001 — fetched 2026-07-11 · tier: self-published, the RFD process itself: states, scope, written determinations
- https://rfd.shared.oxide.computer/rfd/0005 — fetched 2026-07-11 · tier: self-published, named engineering phases scoping through production
- https://rfd.shared.oxide.computer/rfd/0107 — fetched 2026-07-11 · tier: self-published, control-plane workflows as observable, recoverable sagas
- https://rfd.shared.oxide.computer/rfd/0113 — fetched 2026-07-11 · tier: self-published, decision values: responsibility, rigor, urgency, courage, versatility, teamwork, thriftiness
- https://oxide.computer/blog/a-tool-for-discussion — fetched 2026-07-11 · tier: self-published, RFDs as collaboration medium; discussion in GitHub PRs
- https://oxide.computer/blog/engineering-culture — fetched 2026-07-11 · tier: self-published, recorded meetings, no perf reviews, no metrics, Demo Friday, remote-first
- https://oxide.computer/blog/the-cloud-computer — fetched 2026-07-11 · tier: self-published, hardware/software co-design; open-source firmware and root of trust
- https://oxide.computer/blog/building-big-systems-with-remote-hardware-teams — fetched 2026-07-11 · tier: self-published, distributed hardware work via prototyping tooling; directed autonomy
- https://oxide.computer/blog/compensation-as-a-reflection-of-values — fetched 2026-07-11 · tier: self-published, canonical uniform-salary post
- https://oxide.computer/blog/oxides-compensation-model-how-is-it-going — fetched 2026-07-11 · tier: self-published, comp model retrospective; sales exception
- https://oxide.computer/blog/iddqd-unsafe — fetched 2026-07-11 · tier: self-published, unsafe-Rust rigor; frontier models used to probe correctness
- https://github.com/oxidecomputer/omicron/pull/10628 — fetched 2026-07-11 · tier: self-published, CLAUDE.md + AGENTS.md convention; nested code-local agent docs; cargo/clippy/rustfmt/nextest loop
- https://github.com/oxidecomputer/buildomat — fetched 2026-07-11 · tier: self-published, first-party CI/job orchestrator, MPL-2.0
- https://p99conf.io/session/sharpening-the-axe-the-primacy-of-toolmaking/ — fetched 2026-07-11 · tier: stated, Cantrill on toolmaking as core engineering work
- https://oxide-and-friends.transistor.fm/episodes/engineering-rigor-in-the-llm-age — fetched 2026-07-11 · tier: self-published, their own podcast on LLM-era rigor
- https://oxide-and-friends.transistor.fm/episodes/this-old-repo-llms-and-the-restoration-of-battletris — fetched 2026-07-11 · tier: self-published, LLM-assisted code restoration in practice
- https://steveklabnik.com/writing/memory-safety-is-a-red-herring/ — fetched 2026-07-11 · tier: stated, employee first-person on Rust rationale
# Stack — Oxide
> Profiled as of 2026-07-11 · consent tier: self-published · full bibliography in [sources.md](sources.md).
Rust nearly everywhere it pays rent: Omicron (control plane) is a very large Cargo
workspace, Hubris (embedded OS), and unsafe Rust handled with published rigor
[[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628)
[[iddqd]](https://oxide.computer/blog/iddqd-unsafe)
[[Klabnik]](https://steveklabnik.com/writing/memory-safety-is-a-red-herring/). First-party
toolchain: buildomat for CI/jobs, driven from Rust xtasks
[[buildomat]](https://github.com/oxidecomputer/buildomat). Open source with a permissive
lean (MPL-2.0 common), including firmware and root of trust
[[cloud computer]](https://oxide.computer/blog/the-cloud-computer).
# Workflow — Oxide
> Profiled as of 2026-07-11 · consent tier: self-published · full bibliography in [sources.md](sources.md).
Decisions move through explicit RFD states — prediscussion → ideation → discussion →
published → committed/abandoned — with discussion happening in GitHub PRs
[[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001). Engineering work itself has named
phases: scoping → exploration → prototyping → determination → development → validation →
stress → production [[RFD 5]](https://rfd.shared.oxide.computer/rfd/0005). Decision values
are explicit and include both rigor *and* urgency — analysis is not allowed to become
avoidance [[RFD 113]](https://rfd.shared.oxide.computer/rfd/0113).
Day to day: remote-first with recorded meetings, no formalized performance review, no
engineering metrics, and a weekly Demo Friday — show working things continuously
[[engineering culture]](https://oxide.computer/blog/engineering-culture). Hardware teams
work distributed by investing in prototyping tooling; teams "don't need approval or
sign-off, we just go do what's right"
[[remote hardware]](https://oxide.computer/blog/building-big-systems-with-remote-hardware-teams).
Baseline hygiene is non-negotiable: cargo check, clippy, rustfmt, nextest in the loop; CI
runs on buildomat, their first-party job orchestrator — when the tool you need doesn't
exist, you build it [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628)
[[buildomat]](https://github.com/oxidecomputer/buildomat). Long-running control-plane
operations are modeled as observable, recoverable sagas rather than fire-and-forget scripts
[[RFD 107]](https://rfd.shared.oxide.computer/rfd/0107). Agent-era note: repos carry both
CLAUDE.md and AGENTS.md ("that covers all agent harnesses in wide use"), with nested,
generated, code-local agent instructions over one giant top-level file
[[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628).
---
name: develop-like-oxide
description: >-
Develop the way Oxide (the company) does: RFD-driven written decisions, Rust-heavy hardware/software co-design, rigor with urgency, radical transparency. Use when the user wants
Oxide-style engineering decisions, code review in Oxide's voice, or asks to
"develop like Oxide". Profiled 2026-07-11 from public sources.
license: MIT
metadata:
author: marcusrbrown
generator: dev-like
profiled: "2026-07-11"
consent-tier: "self-published"
source: https://github.com/marcusrbrown/dev-like/tree/main/registry/oxide
---
# Develop like Oxide
> Profiled as of 2026-07-11 · consent tier: self-published · full bibliography in [references/sources.md](references/sources.md). Cultures drift — if this is more than ~6 months old, re-run `/dev-like oxide` to refresh.
## Core principle
Write it down. "We capture the written expression of an idea in a Request for Discussion
(RFD)" — options considered, reasoning, data, and the final determination all get recorded,
and the process covers architecture, APIs, company process, and testing design alike
[[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001). Writing is the collaboration medium,
not a bureaucratic artifact [[a tool for discussion]](https://oxide.computer/blog/a-tool-for-discussion).
## Principles
1. Write decisions down — options, reasoning, and determination, in a versioned record [[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001)
2. Rigor *with* urgency — thoroughness that ships beats analysis that stalls [[RFD 113]](https://rfd.shared.oxide.computer/rfd/0113)
3. Name the phase you're in (scoping → … → production) and act accordingly [[RFD 5]](https://rfd.shared.oxide.computer/rfd/0005)
4. Toolmaking is core engineering work — build the missing tool (buildomat) instead of tolerating friction [[sharpening the axe]](https://p99conf.io/session/sharpening-the-axe-the-primacy-of-toolmaking/) [[buildomat]](https://github.com/oxidecomputer/buildomat)
5. Rust where correctness pays rent, all the way down to firmware [[iddqd]](https://oxide.computer/blog/iddqd-unsafe) [[Klabnik]](https://steveklabnik.com/writing/memory-safety-is-a-red-herring/)
6. Transparency as default — uniform pay, public RFDs, recorded meetings [[compensation]](https://oxide.computer/blog/compensation-as-a-reflection-of-values) [[engineering culture]](https://oxide.computer/blog/engineering-culture)
7. Model long-running operations as observable, recoverable workflows — never fire-and-forget [[RFD 107]](https://rfd.shared.oxide.computer/rfd/0107)
8. Demo working things continuously; trust demos over status reports [[engineering culture]](https://oxide.computer/blog/engineering-culture)
9. Keep agent instructions local to the code they govern, and cover every harness in use [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628)
## Workflow
Decisions move through explicit RFD states — prediscussion → ideation → discussion →
published → committed/abandoned — with discussion happening in GitHub PRs
[[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001). Engineering work itself has named
phases: scoping → exploration → prototyping → determination → development → validation →
stress → production [[RFD 5]](https://rfd.shared.oxide.computer/rfd/0005). Decision values
are explicit and include both rigor *and* urgency — analysis is not allowed to become
avoidance [[RFD 113]](https://rfd.shared.oxide.computer/rfd/0113).
Day to day: remote-first with recorded meetings, no formalized performance review, no
engineering metrics, and a weekly Demo Friday — show working things continuously
[[engineering culture]](https://oxide.computer/blog/engineering-culture). Hardware teams
work distributed by investing in prototyping tooling; teams "don't need approval or
sign-off, we just go do what's right"
[[remote hardware]](https://oxide.computer/blog/building-big-systems-with-remote-hardware-teams).
Baseline hygiene is non-negotiable: cargo check, clippy, rustfmt, nextest in the loop; CI
runs on buildomat, their first-party job orchestrator — when the tool you need doesn't
exist, you build it [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628)
[[buildomat]](https://github.com/oxidecomputer/buildomat). Long-running control-plane
operations are modeled as observable, recoverable sagas rather than fire-and-forget scripts
[[RFD 107]](https://rfd.shared.oxide.computer/rfd/0107). Agent-era note: repos carry both
CLAUDE.md and AGENTS.md ("that covers all agent harnesses in wide use"), with nested,
generated, code-local agent instructions over one giant top-level file
[[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628).
See [references/stack.md](references/stack.md) for the stack and [references/workflow.md](references/workflow.md) for workflow detail.
## Tensions
- AI posture is deliberately mixed: public emphasis on engineering rigor in the LLM age
[[rigor episode]](https://oxide-and-friends.transistor.fm/episodes/engineering-rigor-in-the-llm-age)
coexists with real frontier-model use — LLM-assisted code restoration
[[BattleTris]](https://oxide-and-friends.transistor.fm/episodes/this-old-repo-llms-and-the-restoration-of-battletris)
and model-probed unsafe-Rust validation [[iddqd]](https://oxide.computer/blog/iddqd-unsafe).
Mimic the rigor, not a blanket pro/anti-AI stance.
- "Uniform compensation" now carries a sales exception — the principle holds, the absolutism
doesn't [[comp update]](https://oxide.computer/blog/oxides-compensation-model-how-is-it-going).
- Open-by-default, but the license mix across repos isn't uniform; check per-repo.
- Agent-config artifacts (CLAUDE.md/AGENTS.md) are strong in Omicron but unevenly distributed
across the org's repos — the pattern is emerging, not finished
[[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628).
Want a reviewer/pair persona in Oxide's voice? See [agents/oxide-developer.md](agents/oxide-developer.md).
#!/usr/bin/env node
// Provenance link-rot checker: every URL cited in registry/ must still resolve.
// Zero deps by design — mirrors validate.mjs conventions (plain node, exported fns for tests).
import { readFile, readdir, stat, writeFile } from 'node:fs/promises';
import { join, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
const CONCURRENCY = 4;
const STAGGER_MS = 250;
const TIMEOUT_MS = 15_000;
const MD_LINK_RE = /\]\((https:\/\/[^)\s]+)\)/g;
// Collect every URL cited from a registry entry.json/profile.md pair, tagged with citing file.
async function collectUrls() {
const regDir = join(ROOT, 'registry');
const found = new Map(); // url -> Set of citing file paths (relative to ROOT)
const add = (url, file) => {
if (!found.has(url)) found.set(url, new Set());
found.get(url).add(file);
};
for (const name of await readdir(regDir)) {
const dir = join(regDir, name);
if (!(await stat(dir)).isDirectory() || name === 'schema') continue;
const entryPath = join(dir, 'entry.json');
const entryRel = `registry/${name}/entry.json`;
const entryText = await readFile(entryPath, 'utf8').catch(() => null);
if (entryText) {
const entry = JSON.parse(entryText);
if (entry.homepage) add(entry.homepage, entryRel);
for (const s of entry.sources ?? []) {
if (s.url) add(s.url, entryRel);
}
}
const profilePath = join(dir, 'profile.md');
const profileRel = `registry/${name}/profile.md`;
const profileText = await readFile(profilePath, 'utf8').catch(() => null);
if (profileText) {
for (const m of profileText.matchAll(MD_LINK_RE)) {
add(m[1], profileRel);
}
}
}
return found;
}
// Classify a check outcome into ok | warn | fail.
// Pass either an HTTP status or an Error (network/timeout).
export function classify(statusOrError) {
if (statusOrError instanceof Error) return 'fail';
const status = statusOrError;
if (status >= 200 && status < 400) return 'ok';
if (status === 403 || status === 429) return 'warn';
return 'fail'; // 404/410/5xx/other 4xx
}
async function checkUrl(url) {
const attempt = async (method) =>
fetch(url, { method, redirect: 'follow', signal: AbortSignal.timeout(TIMEOUT_MS) });
try {
let res = await attempt('HEAD');
if (res.status === 405 || res.status === 403) {
res = await attempt('GET');
}
return { url, status: res.status, classification: classify(res.status) };
} catch (err) {
return { url, error: err.message, classification: classify(err) };
}
}
// Run checks with bounded concurrency and a stagger between dispatches.
async function checkAll(urls) {
const results = [];
let i = 0;
let inFlight = 0;
let resolveDone;
const done = new Promise((r) => { resolveDone = r; });
function launchNext() {
if (i >= urls.length) {
if (inFlight === 0) resolveDone();
return;
}
const url = urls[i++];
inFlight++;
checkUrl(url).then((r) => {
results.push(r);
inFlight--;
if (i < urls.length) setTimeout(launchNext, STAGGER_MS);
else if (inFlight === 0) resolveDone();
});
}
for (let c = 0; c < Math.min(CONCURRENCY, urls.length); c++) {
launchNext();
}
if (urls.length === 0) resolveDone();
await done;
return results;
}
export async function run({ json = false } = {}) {
const urlMap = await collectUrls();
const urls = [...urlMap.keys()];
const results = await checkAll(urls);
results.sort((a, b) => a.url.localeCompare(b.url));
const counts = { ok: 0, warn: 0, fail: 0 };
const failures = [];
const warnings = [];
for (const r of results) {
counts[r.classification]++;
const citedBy = [...urlMap.get(r.url)].sort();
if (r.classification === 'fail') failures.push({ ...r, citedBy });
if (r.classification === 'warn') warnings.push({ ...r, citedBy });
}
if (json) {
console.log(JSON.stringify({ counts, results: results.map((r) => ({ ...r, citedBy: [...urlMap.get(r.url)].sort() })) }, null, 2));
} else {
for (const r of results) {
if (r.classification === 'ok') {
console.log(` ok ${r.url} (${r.status})`);
} else if (r.classification === 'warn') {
console.warn(`WARN ${r.url} (${r.status ?? r.error}) — cited by: ${[...urlMap.get(r.url)].sort().join(', ')}`);
} else {
console.error(`FAIL ${r.url} (${r.status ?? r.error}) — cited by: ${[...urlMap.get(r.url)].sort().join(', ')}`);
}
}
console.log(`\n${counts.ok} ok, ${counts.warn} warn, ${counts.fail} fail (of ${urls.length} unique URLs)`);
}
if (failures.length) {
const lines = [`# Link rot detected — ${failures.length} failure(s)`, ''];
for (const f of failures) {
lines.push(`- ${f.url} (${f.status ?? f.error})`);
for (const c of f.citedBy) lines.push(` - cited by \`${c}\``);
}
await writeFile(join(ROOT, 'link-failures.md'), lines.join('\n') + '\n', 'utf8');
}
return failures.length === 0;
}
export { collectUrls };
if (process.argv[1] === fileURLToPath(import.meta.url)) {
const json = process.argv.includes('--json');
run({ json }).then((passed) => { process.exitCode = passed ? 0 : 1; });
}
+2
-1
{
"name": "dev-like",
"version": "0.2.0",
"version": "0.3.0",
"description": "Profile a shop's engineering culture from public sources and install develop-like-<target> agent skills. /dev-like Every",

@@ -38,2 +38,3 @@ "keywords": [

"validate": "node scripts/validate.mjs",
"eval:paired": "node evals/paired/run.mjs",
"test": "node --test tests/*.test.mjs",

@@ -40,0 +41,0 @@ "prepublishOnly": "bun run validate && bun run test",

@@ -12,2 +12,9 @@ {

},
"oxide": {
"name": "Oxide",
"kind": "org",
"aliases": ["oxide computer", "oxide computer company", "oxidecomputer", "oxide.computer"],
"consentTier": "self-published",
"updated": "2026-07-11"
},
"theo": {

@@ -14,0 +21,0 @@ "name": "Theo Browne",