NestJS Expert
Jeffallan/claude-skills
Scaffolds NestJS modules, controllers, services, DTOs and guards for TypeScript backends, with validation, JWT and Passport auth, Swagger docs and unit and E2E tests.
Diagrams and checkable docs from a codebase. An agent skill from Raja0sama/vibex.
$ npx skills add Raja0sama/vibex --skill vibex -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Raja0sama/vibex vibex --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
Claude Code skills documentation · loads skills from .claude/skills/
Install the "vibex" agent skill from https://github.com/Raja0sama/vibex/tree/main into .claude/skills/vibex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vibex", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Raja0sama/vibex --skill vibex -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Raja0sama/vibex vibex --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "vibex" agent skill from https://github.com/Raja0sama/vibex/tree/main into .agents/skills/vibex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vibex", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Raja0sama/vibex --skill vibex -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Raja0sama/vibex vibex --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "vibex" agent skill from https://github.com/Raja0sama/vibex/tree/main into .cursor/skills/vibex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vibex", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Raja0sama/vibex --skill vibex -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Raja0sama/vibex vibex --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "vibex" agent skill from https://github.com/Raja0sama/vibex/tree/main into .gemini/skills/vibex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vibex", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Raja0sama/vibex vibexInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Raja0sama/vibex --skill vibex -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "vibex" agent skill from https://github.com/Raja0sama/vibex/tree/main into .github/skills/vibex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vibex", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Raja0sama/vibex --skill vibex -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Raja0sama/vibex vibex --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "vibex" agent skill from https://github.com/Raja0sama/vibex/tree/main into .opencode/skills/vibex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vibex", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
vibexDiagrams and checkable docs from a codebase. An agent skill from Raja0sama/vibex.
Vibex is an agent skill from Raja0sama/vibex. Diagrams and checkable docs from a codebase. Draws ERDs, C4 context/container/component views, API endpoint catalogues, lifecycle/state machines, and service-to-service call maps as a validated JSON spec plus a standalone HTML viewer, with Mermaid export. Imports OpenAPI, GraphQL SDL and Prisma; otherwise reads the code (NestJS, TypeORM, Express) and writes the spec. Use for: database diagram, ERD, data model, table relationships, C4 or architecture diagram, system context, API map, endpoint list, "show me the…
Its SKILL.md is about 7.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 136 other files, including assets (for example `.claude-plugin/marketplace.json`, `.claude-plugin/plugin.json` and `.github/ISSUE_TEMPLATE/1-doc-request.yml`).
It sits in Backend & APIs, covering Diagrams, GraphQL and OpenAPI specifications. It works with Mermaid, GraphQL, OpenAPI and Prisma. The repository describes itself as: Architecture diagrams and checkable docs from your codebase — ERD, C4, API and lifecycle — generated from Prisma, OpenAPI or GraphQL. One HTML file, no server. The licence is MIT.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 95f4b3f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (JavaScript, from the files we listed), which the agent can run.
Shell commands in SKILL.md call:
nodenpmgitFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Vibex loads about 7.8k tokens when it runs. Until then it costs about 233 tokens; SKILL.md has 3,989 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Raja0sama/vibex at commit 95f4b3f, republished under its MIT licence (© Raja0sama). 3,989 words, ~7,764 tokens.
.claude/skills/vibex/SKILL.md (or your agent's skills folder). This skill also uses 131 other files; get the full folder from GitHub.You vibed it into existence. vibeX shows you what you actually built.
Output is always two files: <name>.<type>.json (the spec, the source of truth) and <name>.<type>.html (self-contained viewer: pan/zoom, search, click-for-details, dark/light, SVG/PNG export). Not fancy. Correct and readable.
Skill root: the directory containing this file. Every command below is node <skill-root>/bin/vibex.mjs ….
Pick the type from the ask. One diagram per type per question; do not mix.
| Ask | Type | Spec file |
|---|---|---|
| tables, models, schema, relations, FKs, data model | erd | schemas/erd.schema.json |
| context, containers, components, who talks to what, system boundary | c4 | schemas/c4.schema.json |
| endpoints, routes, API surface, GraphQL operations, events/topics | endpoints | schemas/endpoints.schema.json |
| statuses, state machine, lifecycle, what happens after X, allowed transitions | lifecycle | schemas/lifecycle.schema.json |
Find a machine-readable source first. Search the repo before reading code:
endpoints: openapi.*, swagger.*, *.graphql, schema.gql, or a generated schema endpoint dump. Run import openapi or import graphql.erd: schema.prisma → import prisma. A GraphQL SDL can also seed an ERD with import graphql <file> out.json --erd.c4: never importable. Author it (step 3).node bin/vibex.mjs import openapi path/to/openapi.yaml out/api.endpoints.json
node bin/vibex.mjs import graphql path/to/schema.graphql out/api.endpoints.json
node bin/vibex.mjs import prisma prisma/schema.prisma out/db.erd.jsonAfter an import, open the JSON and edit it like a human would: rename groups, drop noise endpoints (health, metrics), add entities links on endpoints, add sources. The import is a starting point, not the deliverable.
No source file? Dig in the code. Read the schema file for your type once, then read one example in examples/. Author the JSON fresh. Where to look:
@Controller('prefix') + @Get/@Post/@Put/@Patch/@Delete('path') → one endpoint each, path = prefix + path with :id rewritten as {id}. @UseGuards(...)/@Roles(...) → auth. @Body() DTO class → request. Return type / @ApiOkResponse → response. One group per controller. Put sources: [{path, line}] on every endpoint pointing at the handler method. Prepend app.setGlobalPrefix() and @Version()/VersioningType.URI segments to every path. @Param() → params[].in: "path", @Query() → "query", @Headers() → "header"; a DTO class in @Query() becomes one param per property.@Query(), @Mutation(), @Subscription() in *.resolver.ts → method QUERY/MUTATION/SUBSCRIPTION, path = name(arg: Type). @ObjectType/@InputType classes → types.router.get('/x', …), app.post(...), fastify.route({method, url}).@Entity('table') classes; @PrimaryGeneratedColumn/@PrimaryColumn → pk; @Column({nullable, unique, type}); @ManyToOne + @JoinColumn → FK on this side, relationship from this entity to target with from_cardinality: many; @OneToOne → one/zero-or-one; @ManyToMany + @JoinTable → a join entity or a many↔many relationship.sources (path + model line); add description and groups by hand. It names entities by the lowercased model name (OrderItem → orderitem; @@map only changes the label).CREATE TABLE, REFERENCES, PRIMARY KEY, UNIQUE.docker-compose.yml, k8s/, serverless.yml, infra/ for containers and datastores; package.json/*.module.ts for tech; HTTP clients, queue clients, SDK imports (stripe, @aws-sdk/client-sqs, nodemailer) for external systems and relationships. People come from auth roles.Keep IDs stable and boring: user, order_item, bff, list-orders. Reuse the same ID for the same thing across diagrams so ERD entity IDs can go into endpoints[].entities. With a Prisma-imported ERD, use exactly the importer's ids (orderitem, not order_item); run dashboard and check the "which endpoints touch which tables" table is non-empty.
Validate, then render.
node bin/vibex.mjs validate out/db.erd.json
node bin/vibex.mjs render out/db.erd.json out/db.erd.htmlExit 1 means errors: fix the named field and rerun. Warnings never block; fix the ones about layout (row/col hints) when they appear, ignore missing-summary warnings unless the user wants prose. Add --open to the render to open the browser.
Several diagrams for one system? Build the dashboard too. Keep all specs in one folder (e.g. docs/arch/), then:
node bin/vibex.mjs dashboard docs/arch/index.html docs/arch --title "My system"The overview page lists every diagram, shows which endpoints touch which tables (from endpoints[].entities), and resolves C4 link values that name another spec file in the folder (link: "bff.c4.html" → the bff.c4.json panel; both specs must be in the same dashboard invocation, matching is by file name). Re-run it after every spec change; it is cheap.
Report: the two paths, counts (entities/elements/endpoints and relationships), what was imported vs inferred, and anything you left out on purpose. If code reading left ambiguity (cardinality, auth), say so in one line and put it in a cards note with tone: "warning".
docs)A docs spec is not a diagram. Its unit is a claim: one checkable sentence with a source. The build turns claims plus the diagram specs into docs.json — the fact graph humans read in the dashboard and agents read directly.
node bin/vibex.mjs docs docs/arch/system.docs.json docs/arch --repo . --reanchor # pin anchors
node bin/vibex.mjs docs docs/arch/system.docs.json docs/arch --repo . --check # exit 1 on drift
node bin/vibex.mjs docs docs/arch/system.docs.json docs/arch --repo . --md DOCS.md # a file for the repoCommit docs.lock.json next to the spec. It records the commit each anchor last verified at, so a rebuild only re-reads the files git says have moved — and so a claim can say when it was last true, not just that the build ran. Delete it to force a full check.
Read schemas/docs.schema.json once, then examples/shop.docs.json (a system overview) and examples/auth.docs.json (one topic, in depth). Build the diagrams first: a docs spec documents specs that already exist.
Put the docs spec in the same folder as the diagrams and it becomes a Documentation panel in the dashboard, first in the sidebar:
node bin/vibex.mjs dashboard docs/arch/index.html docs/arch --title "My system" --repo .Pass --repo or every anchored claim renders as unverifiable.
Write a separate *.docs.json per topic — auth.docs.json, payments.docs.json, onboarding.docs.json — not one document trying to be the whole system. Every docs spec in the folder becomes its own entry under Documentation in the dashboard.
A topic document answers one question a person actually asks. It covers whatever specs it needs to point at, generates little or nothing, and earns its keep through prose and anchored claims. Undocumented nodes in a spec are only reported as gaps when the document derives facts from that spec, so a focused document is not nagged about the forty things it was never about.
Keep one system overview alongside them: it generates the structural facts (elements, entities, operations) and stays shallow. Do not restate a topic document's claims in it.
This is the main way a good document gets written, and the path the hard rules below are built around.
anchored claim and their word became a pointer, not the evidence.asserted claim with their name and today's date, and their reasoning in source.rationale.coverage.out_of_scope with "Not documented yet" and what specifically is unknown. This is the most valuable part of a document written from a conversation, because it is the part nobody remembers to write.Ask in this order and stop at the first yes.
erd.entities, erd.relationships, c4.elements, c4.relationships, c4.boundaries, endpoints.operations, endpoints.types, lifecycle.states, lifecycle.transitions, coverage. Column counts, keys, cardinalities, delete rules, who-calls-what, transitions, guards, operation lists — all derived. Writing them by hand is the most common way to make this feature worthless.anchored, pointing at that file and symbol. This is where most real documentation lives: invariants, ownership of a write path, what a guard actually enforces.asserted — and see the hard rule below.coverage.out_of_scope with a reason.A document nobody reads top to bottom is a database with headings. Give each section a narrative: Markdown that a person reads straight through, citing claims with [[claim-id]].
"narrative": "There is exactly one way in. The BFF is the only container reachable from the public internet [[network.public-entry]], and nothing behind it accepts outside connections [[network.private-isolated]]."asserted claim. source.by names a human who stands behind it, and source.at is the date they confirmed it. You may only write one when the user told you the fact in this conversation, or it is signed in a file you can cite (an ADR, a CODEOWNERS entry, a README with an author). Otherwise anchor it or omit it. An asserted claim you made up is a human's name on your guess — it is the one failure this whole design exists to prevent.confidence. The validator rejects it. You declare evidence; the build computes trust., and or a semicolon, it is two claims. The validator warns; split rather than rephrase around it. Separate claims can be cited, checked and retracted on their own — a compound one cannot.hash yourself. Write "hash": "000000000000" and run --reanchor. Anchor the smallest region that proves the claim: a method, not a file. A whole-file anchor goes stale on every unrelated edit and trains the reader to ignore the warning.should, probably, might, will be, TODO — those are not claims about the system. No instructions to the reader. Reasons go in source.rationale, not in text.subject (shop.c4#bff, orders.erd#order) unless it is about the whole system. That is what puts it on the node's page and what lets an agent ask "what is known about X". Subjects that do not resolve are reported in coverage.unknown — fix them, do not leave them.coverage.out_of_scope is mandatory in practice. Name every area a reader might expect and not find, with a reason. "Not documented yet" is a valid reason; silence is not. A document that implies completeness gets believed exactly where it is wrong.CI proves a claim's evidence has not moved. It cannot prove the claim was ever true — that was your reading of the code at authoring time. The review is the only moment initial truth is established, and after it passes, arithmetic will defend a wrong claim just as faithfully as a right one.
So hand over a review list, do not just hand over a document. In your report, name:
asserted claim and whose name is on itTell the reviewer to work in this order, which catches the most per minute:
coverage.out_of_scope, before any claim. A thin or generic gap list means the document is silently incomplete, which is more dangerous than any single wrong sentence — and it calibrates how far to trust the rest. "Future work" is not a gap; "whether the domain APIs authenticate each other is unknown" is.asserted claim, one by one. These carry a person's name and nothing checks them. Did that person actually say it? Is the date the day they confirmed it, not the day it was typed? This is where fabrication is easiest and most damaging.Push back on: an asserted claim whose by is a team, a role, or a model rather than a person; a claim that reads as two facts; a gap list that names nothing specific.
Set meta.repository and the rendered pages grow a way to report things: a quiet flag on every claim, one on every node's details panel, and three buttons in the docs toolbar for requests that are not about a single claim.
Each opens a prefilled issue whose body carries a fenced block an agent can read:
intent: doc-problem
document: relay.docs
claim: session.ttl
confidence: verified
spec: relay.c4#bff
commit: 42d3ee6c27fdc16a1933a96ec9e2d7293161d251Nothing is sent anywhere — the link opens a form the person still has to submit. When you pick one of these issues up, read that block first: it tells you exactly which claim, which node and which tree the reader was looking at, which is usually more precise than the prose above it. If the block is missing or the prose is too vague to act on, reply asking rather than guessing.
When the user asks what a change would look like, set meta.proposed: true and meta.proposal (who, when, which issue, one sentence of why) on every spec you write for it.
A proposal renders with a banner, a purple badge, a stamp burned into the SVG so an exported image still says what it is, and its claims read proposed rather than verified. --check ignores it — there is nothing for it to drift from.
Two rules the validator enforces, because breaking either would make a proposal indistinguishable from the system:
meta.proposal without meta.proposed renders as though it describes something real, and is warned about.Put what the proposer has not worked out in coverage.out_of_scope. On a proposal that section is the most valuable one — it is the difference between a design and a daydream.
Issues labelled intake come from someone reading a diagram or a document. Read the fenced vibex block first: it names the claim, spec or node they were looking at and the commit they saw. That is usually more precise than the prose above it.
.github/workflows/intake.yml triages before you see it, and refuses to guess — an unresolvable claim id or an unnamed diagram gets a question, not a pull request. If you pick one up by hand, hold the same line: reply asking rather than produce a confident wrong change.
Whatever you do, open a pull request and let the drift check run on it. Nothing here merges on its own.
A layout issue, or JSON pasted to you from "Save layout", carries { "spec", "positions" }.
node bin/vibex.mjs layout <spec file> <that file>. It merges into layout.positions and skips ids the spec no longer has.Never hand-edit positions to "tidy" a layout someone saved: they placed it on purpose. --clear drops every pin, only when asked.
Add this once, in the project being documented. It is the step that makes the rest binding rather than advisory — without it a stale claim is a warning nobody reads.
- uses: actions/checkout@v4
with: { fetch-depth: 0 } # a shallow clone cannot diff against the lock's commit
- run: npx @vibex/vibex docs docs/arch/system.docs.json docs/arch --repo . --check --no-lock--no-lock on purpose: the lock file is an optimisation for local iteration, and it reaches CI from a contributor's machine asserting that claims were verified. CI re-reads every anchor from scratch rather than taking that on trust. A full check of ~60 claims runs in well under a second, with no dependencies, no network and no model — so there is no reason to skip it.
--check reports driftstale — the anchored code changed. Re-read the code and decide: still true → --reanchor; no longer true → rewrite the claim, or delete it and add a replacement with supersedes pointing at the old id. Never --reanchor without reading; it silently re-certifies a claim that may now be false.broken — the file or symbol is gone, or --repo was not given. Re-anchor to where the code moved, or drop the claim.expired — nobody has confirmed the assertion inside review_window_days. Ask the user; do not refresh the date yourself.A claim that did not verify is re-read on every build until it does, so a problem cannot go quiet just because nobody touched the file again.
--md writes the document as a Markdown file containing no raw HTML, so it survives a paste into Confluence, a wiki, or a README unchanged. Every claim appears with its confidence marker and source; the panel can hide evidence behind a disclosure, a file that travels cannot.
node bin/vibex.mjs docs docs/arch/auth.docs.json docs/arch --repo . --md docs/AUTH.mdRegenerate and re-paste rather than editing the Markdown: it is an output, and an edit there is lost on the next build and invisible to --check. If the user maintains docs in Confluence, the spec and its lock file are what lives in the repository and gets reviewed; the Confluence page is a copy that is republished, the same way the HTML is.
Give the counts line verbatim (N claims — X verified, …), every coverage.unknown entry, and which claims you anchored versus which the user asserted. If you left something undocumented, say so — it should already be in out_of_scope. When the document came out of a conversation, list what you attributed to them by name, so they can correct it before it hardens into documentation.
links)Use when the system is more than one service: "how do these services talk", "what calls the order API", "map the microservices". One *.links.json records every call between services, anchored on both ends.
*_SERVICE_URL).from, to, kind, route, env, and client + handler anchors. Anchor the method, not the file. Hashes are "000000000000".node bin/vibex.mjs links docs/arch/system.links.json docs/arch \
--repo bff=../bff --repo orders=../orders --reanchor
node bin/vibex.mjs links docs/arch/system.links.json docs/arch --repo bff=../bff --repo orders=../orders --checkservices[].repo, use root-relative paths, pass one --repo ..render system.links.json draws the System view; dashboard puts it first.Rules:
"external": true; its side needs no anchor.services[].spec to the service's endpoints spec id: vibex links then lists endpoints nothing calls. Hide health/docs routes with services[].ignore: ["/actuator/**"]./items/${kind}) that reaches several endpoints: give endpoint a list.services[].c4: ["shop.c4#order_api"]. vibex links then reports arrows with no call behind them, calls with no arrow, and neighbours a diagram leaves out. Fix the C4, not the links.orderId, customerId) in shared_ids.meta.id (orders.endpoints, not api.endpoints). Same-named files in two services otherwise collide.changelog)node bin/vibex.mjs changelog v1.2.0..main --specs docs/arch --md RELEASE.md -o changelog.jsonReads the commits in a range and writes two things: a JSON artefact to keep in the repository, and Markdown with no raw HTML so it survives a paste into release notes or a wiki.
--specs <dir> is what makes it worth running here. It builds the fact graph at both ends of the range and reports what the release did to the documentation: claims written, reworded, superseded, removed. Derived facts are counted, never listed.internal when every path it touched was.Write changelog.json next to the specs and vibex dashboard picks it up as a Changes panel, where each entry's specs are chips that open the diagram they touched:
node bin/vibex.mjs changelog v1.2.0..main --specs docs/arch -o docs/arch/changelog.json
node bin/vibex.mjs dashboard docs/arch/index.html docs/arch --repo .Report the counts line as it prints, and if claims were removed, say so out loud — a claim that vanished took whatever it documented with it, and that is worth a human checking.
groups, C4 level, or endpoint group, and link with link (C4) or a card.from is the FK/child side, to is the referenced/parent side. Default many → one. Set to_cardinality: zero-or-one when the FK column is nullable. Unique FK → from_cardinality: one or zero-or-one. Use groups to frame bounded contexts; the renderer lays each group out as its own block.description. Every relationship gets a verb label; add technology when it is not obvious. external: true for anything the team does not own. One meta.level per diagram; drill down with link to another rendered HTML.subject per diagram (Order.status, not the whole system). State ids = the enum values in code. Exactly one kind: initial; every state either reaches a terminal or is explicitly failure. Each transition names event and actor; put conditions in guard (no brackets) and side effects in action. kind: auto|timeout for system-driven moves, failure for error paths. Find them in code: status enums, switch (status) / state-machine tables, guards like assertTransition(from, to), service methods that set status =.{param}. GraphQL path is the signature name(arg: Type!). Use EVENT for topics, queues, webhooks the service publishes. Put ERD entity IDs in entities so the reader can jump from an endpoint to the tables it touches. Do not paste full descriptions into summary; one line.meta.repository: {"url": "https://github.com/org/repo", "revision": "main"} (web root, no .git) plus sources: [{"path": "src/orders/orders.controller.ts", "line": 42}] makes the viewer link to <url>/blob/<revision>/<path>#L<line>. Works for GitHub and GitLab; omit revision to link HEAD. Fill them whenever the diagram came from code.row/col when a layout warning asks for it or the user complains.validate <spec.json> [--json]
render <spec.json> [out.html] [--linked] [--open] [--json]
import openapi <file.json|yaml> [out.json] [--title T] [--all-types]
import graphql <schema.graphql> [out.json] [--title T] [--erd]
import prisma <schema.prisma> [out.json] [--title T]
dashboard <out.html> <spec.json|dir>... [--title T] [--subtitle S] [--linked] [--open] [--json]
one HTML: sidebar of all diagrams, overview tiles, entity↔endpoint cross-links
docs <docs.json> <spec.json|dir>... [-o docs.json] [--md doc.md] [--repo dir]
[--check] [--reanchor] [--lock docs.lock.json] [--no-lock] [--json]
fact graph: derived facts + authored claims, each with provenance
and a computed confidence. --check exits 1 on stale/broken/expired.
--md also writes the document as Markdown. Re-reads only the anchors
git says moved since the commit in the lock file.
mermaid <spec.json> [out.mmd]
the diagram as Mermaid (erDiagram, flowchart, stateDiagram-v2)
layout <spec.json> <layout.json|-> [--replace] [--clear]
write positions saved in the viewer into layout.positions
links <links.json> [spec dirs...] --repo [name=]dir... [--check] [--reanchor] [--json]
check every service-to-service call against the code on both ends
demo [dir] [--linked] render examples/ into dir (+ dashboard.html)
--linked write the HTML as a placeholder page: data in <name>.data.js, viewer in
vibex-viewer.js/.css beside it. Opens from disk; keep the files together.
outdated [dir] which generated files this version would now render differently.
Exits 1 if any is stale, so CI can gate on it.
types list types with schema and example pathsNever answer from a generated file without checking it first. Run
vibex outdated <dir>. If it reports anything stale, regenerate from the spec and
read the new file — a stale artifact and a broken feature look identical to
whoever opens one, and reasoning from the wrong one wastes everybody's time.
Regenerate; never hand-edit generated HTML to bring it up to date. The file is derived from the spec the same way a binary is derived from source, and a hand-patched artifact is one no version of this tool would ever have produced. If the spec is what is wrong, fix the spec and re-render.
YAML OpenAPI needs the optional yaml package: run npm install inside the skill root once (already present if the skill came from a global npm i -g @vibex/vibex), or convert the file to JSON.
Click a node for details (columns, fields, params, sources, relationships). / searches, Esc clears, t toggles theme, 0 fits, +/- zoom. Dragging a box moves it (a C4 boundary or an endpoint card carries what is inside it) and re-routes its lines; the layout lives in memory until reload, r or Reset layout puts it back. s or Save layout hands back a prompt for an agent, the JSON, or a prefilled layout issue, for vibex layout to write into layout.positions. #node=<id> in the URL deep-links to a node. SVG and PNG export buttons produce standalone files in the current theme; Mermaid downloads the .mmd. render always writes <name>.mmd beside the HTML: when the user wants the diagram inside a README, PR or wiki page, paste that (in a ```mermaid fence) rather than linking the HTML.
© Raja0sama, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 131 other files (assets) in the repository root of Raja0sama/vibex.
Open the folder on GitHubat commit 95f4b3f
Vibex next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Vibex this skillRaja0sama/vibex | 388 | — | ~7.8k | Automated safety check: Pass | MIT | |
| NestJS ExpertJeffallan/claude-skills | 12k | — | ~2k | Automated safety check: Pass | MIT | |
| API Designericrisco/rsc-harness | 167 | — | ~3.1k | Automated safety check: Pass | MIT | |
| API DesignerJeffallan/claude-skills | 12k | 2 repos | ~2k | Automated safety check: Pass | MIT | |
| SpikardGoldziher/spikard | 123 | — | ~799 | Automated safety check: Pass | MIT | |
| Executor Usagejeremyosih/pi-executor | 104 | — | ~1.4k | Automated safety check: Pass | MIT |
Jeffallan/claude-skills
Scaffolds NestJS modules, controllers, services, DTOs and guards for TypeScript backends, with validation, JWT and Passport auth, Swagger docs and unit and E2E tests.
ericrisco/rsc-harness
A skill your agent uses when settling the contract of an API you expose, before implementation: resources/URLs, REST vs GraphQL, versioning, one RFC 9457 error envelope, pagination, idempotency —…
Jeffallan/claude-skills
Designs REST and GraphQL APIs from resource modeling to an OpenAPI 3.1 contract, with versioning, pagination and RFC 7807 error handling.
Goldziher/spikard
Scaffold Spikard projects and generate code from OpenAPI, AsyncAPI, OpenRPC, GraphQL, and Protobuf schemas using the Spikard CLI or its MCP server.
jeremyosih/pi-executor
Load this skill before using the execute tool. An agent skill from jeremyosih/pi-executor.
ShawnPana/aurl
Turn any API into a CLI command. An agent skill from ShawnPana/aurl.
Categories
Diagrams and checkable docs from a codebase. An agent skill from Raja0sama/vibex. Vibex is an agent skill from Raja0sama/vibex. Diagrams and checkable docs from a codebase.
Vibex fits situations like: : database diagram; table relationships; architecture diagram; show me the endpoints.
Run `npx skills add Raja0sama/vibex --skill vibex -a claude-code`. Or copy the skill folder (the Raja0sama/vibex repository) into .claude/skills/vibex in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Raja0sama/vibex --skill vibex -a codex`. Or copy the skill folder (the Raja0sama/vibex repository) into .agents/skills/vibex in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Raja0sama/vibex --skill vibex -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/vibex, .gemini/skills/vibex, .github/skills/vibex and .opencode/skills/vibex in your project.
Going by SKILL.md and its folder, Vibex needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node, npm and git). Our summary lists: Node.js; Docker.
SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Vibex is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.8k tokens (SKILL.md is roughly 31k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Vibex: NestJS Expert (Jeffallan/claude-skills, 12k stars), API Design (ericrisco/rsc-harness, 167 stars), API Designer (Jeffallan/claude-skills, 12k stars) and Spikard (Goldziher/spikard, 123 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Raja0sama (a GitHub user) maintains it in Raja0sama/vibex, which has 388 GitHub stars. The repository was last updated on October 6, 2026.
Source: Raja0sama/vibex on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.