Agent skill

Vibex

by Raja0sama in Raja0sama/vibex

Diagrams and checkable docs from a codebase. An agent skill from Raja0sama/vibex.

MITAuto-check passedBackend & APIs

Install Vibex

skills CLI
$ npx skills add Raja0sama/vibex --skill vibex -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Raja0sama/vibex vibex --agent claude-code

Project 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/

Facts

Skill name
vibex
GitHub stars
388
Token cost
~7.8k tokens
SKILL.md length
3,989 words
Files
132 (incl. assets)
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Diagrams and checkable docs from a codebase. An agent skill from Raja0sama/vibex.

  • Works in 6 steps: Pick the type from the ask. One diagram… → Find a machine-readable source first.… → No source file? Dig in the code. Read… → …
  • : database diagram
  • SKILL.md covers Steps, Documentation (docs), Service links (links) and Release notes (changelog), plus 3 more sections
  • Runs JavaScript scripts from its folder; calls node, npm and git; reaches github.com

What it does

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.

When your agent uses it

  • : database diagram
  • Table relationships
  • Architecture diagram
  • Show me the endpoints

Example prompts

  • “show me the endpoints”
  • “what happens after X is approved”
  • “Use the vibex skill to diagram and checkable docs from a codebase. An agent skill from Raja0sama/vibex”
  • “/vibex”

Requirements

  • Node.js
  • Docker

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Pick the type from the ask. One diagram per type per question; do not mix.
  2. Find a machine-readable source first. Search the repo before reading code
  3. 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…
  4. Validate, then render.
  5. Several diagrams for one system? Build the dashboard too. Keep all specs in one folder (e.g. docs/arch/), then
  6. Report: the two paths, counts (entities/elements/endpoints and relationships), what was imported vs inferred, and anything you left out on…

What it can do on your machine

Read from SKILL.md and the folder at commit 95f4b3f. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Ships script files (JavaScript, from the files we listed), which the agent can run.

    Shell commands in SKILL.md call:

    • node
    • npm
    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~233
When it runs · the whole SKILL.md, loaded when a task matches
~7.8k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from Raja0sama/vibex at commit 95f4b3f, republished under its MIT licence (© Raja0sama). 3,989 words, ~7,764 tokens.

Download SKILL.mdSave it as .claude/skills/vibex/SKILL.md (or your agent's skills folder). This skill also uses 131 other files; get the full folder from GitHub.
name
vibex
description
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 endpoints", status flow, state machine, allowed transitions, "what happens after X is approved", how services call each other, microservice map, Mermaid diagram. Also writes documentation as a fact graph: each statement carries its source and a computed confidence, and a drift check fails CI when the code moves. Use to document a system, write architecture or onboarding docs, or explain how a system works.
license
MIT
metadata.version
0.7.2
metadata.cli
node bin/vibex.mjs
metadata.repository
https://github.com/Raja0sama/vibex

vibeX

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 ….

Steps

  1. Pick the type from the ask. One diagram per type per question; do not mix.

    AskTypeSpec file
    tables, models, schema, relations, FKs, data modelerdschemas/erd.schema.json
    context, containers, components, who talks to what, system boundaryc4schemas/c4.schema.json
    endpoints, routes, API surface, GraphQL operations, events/topicsendpointsschemas/endpoints.schema.json
    statuses, state machine, lifecycle, what happens after X, allowed transitionslifecycleschemas/lifecycle.schema.json
  2. 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).
    bash
    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.json

    After 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.

  3. 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:

    • NestJS REST: @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.
    • NestJS GraphQL: @Query(), @Mutation(), @Subscription() in *.resolver.ts → method QUERY/MUTATION/SUBSCRIPTION, path = name(arg: Type). @ObjectType/@InputType classes → types.
    • Express/Fastify: router.get('/x', …), app.post(...), fastify.route({method, url}).
    • TypeORM: @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.
    • Prisma: prefer the importer. The importer already fills 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).
    • SQL migrations: CREATE TABLE, REFERENCES, PRIMARY KEY, UNIQUE.
    • C4: 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.

  4. Validate, then render.

    bash
    node bin/vibex.mjs validate out/db.erd.json
    node bin/vibex.mjs render   out/db.erd.json out/db.erd.html

    Exit 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.

  5. Several diagrams for one system? Build the dashboard too. Keep all specs in one folder (e.g. docs/arch/), then:

    bash
    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.

  6. 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".

Documentation (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.

bash
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 repo

Commit 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:

bash
node bin/vibex.mjs dashboard docs/arch/index.html docs/arch --title "My system" --repo .

Pass --repo or every anchored claim renders as unverifiable.

One document per question

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.

When the user tells you how something works

This is the main way a good document gets written, and the path the hard rules below are built around.

  1. Find it in the code first. They said sessions expire after twelve hours — go find the constant. If you find it, that is an anchored claim and their word became a pointer, not the evidence.
  2. What you cannot find, ask about, then attribute. "There are no refresh tokens" may be a decision with no artefact. That is an asserted claim with their name and today's date, and their reasoning in source.rationale.
  3. Write the prose around it. Their explanation is the narrative; the claims are what makes it checkable. Cite each load-bearing sentence.
  4. Say what they did not tell you. Whatever the conversation left open goes in 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.
Where a fact belongs

Ask in this order and stop at the first yes.

  1. Can a generator derive it? Then never write it. Add the generator to a section and the build computes the sentence from the spec, so it can never disagree with the diagram. Available: 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.
  2. Does a specific piece of code prove it? Write it 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.
  3. Is it a decision only a person can confirm? Write it asserted — and see the hard rule below.
  4. None of the above? Leave it out and put the gap in coverage.out_of_scope with a reason.
Writing the prose

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]].

json
"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]]."
  • Every load-bearing sentence carries a citation. The citation renders as a coloured pip showing that claim's confidence, so a reader sees which words are backed and which are connective tissue. Prose with no citations is an opinion piece inside a document whose point is traceability — the validator warns when a long narrative cites nothing.
  • Write the connective tissue, not the facts. Counts, keys, cardinalities and routes come from generators. Narrative says what they mean: what the shape implies, what breaks if it changes, what a newcomer would get wrong.
  • Cited claims render as collapsible evidence under the prose, so the section reads as a document and proves itself on demand.
  • Markdown supported: headings, paragraphs, lists, blockquotes, fenced code, tables, rules, inline bold/italic/code/link. Raw HTML is escaped, never rendered.
Hard rules
  • Never invent an 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.
  • Never write confidence. The validator rejects it. You declare evidence; the build computes trust.
  • One claim = one assertion. If the sentence needs , 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.
  • Never compute a 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.
  • State what is true, in the present tense. No 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.
  • Every claim gets a 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.
Getting it reviewed

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:

  • every asserted claim and whose name is on it
  • every anchor covering a whole file rather than a symbol
  • anything you inferred rather than read directly

Tell the reviewer to work in this order, which catches the most per minute:

  1. 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.
  2. Every 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.
  3. A sample of anchors, opened at the line. Does the code say what the claim says? Is the anchor tight — a method rather than a file? A whole-file anchor is legitimate for a small single-purpose file and a smell for anything else, because it goes stale on edits that have nothing to do with the claim.
  4. Narrative sentences with no citation near them. Those are the unverified glue between claims, and the easiest place for an unsupported assertion to ride along.
  5. Not the derived claims. They are mechanical and cannot disagree with the spec. Review the generator choice instead: did the section ask for the right ones, and is anything structural missing because no generator was requested?

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.

Letting readers file what they notice

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:

vibex
intent: doc-problem
document: relay.docs
claim: session.ttl
confidence: verified
spec: relay.c4#bff
commit: 42d3ee6c27fdc16a1933a96ec9e2d7293161d251

Nothing 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.

Proposals: documenting something that does not exist

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:

  • A proposal may not contain an anchored claim. There is no code to anchor to. Everything is asserted, in the proposer's name.
  • Say where it came from. 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.

Show full SKILL.md (1,637 more words)Show less
Picking up an intake issue

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.

Saving a layout someone dragged

A layout issue, or JSON pasted to you from "Save layout", carries { "spec", "positions" }.

  1. Save it to a file (the whole issue body is fine).
  2. node bin/vibex.mjs layout <spec file> <that file>. It merges into layout.positions and skips ids the spec no longer has.
  3. Re-render that spec. Change nothing else.

Never hand-edit positions to "tidy" a layout someone saved: they placed it on purpose. --clear drops every pin, only when asked.

Wiring it into CI

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.

yaml
- 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.

When --check reports drift
  • stale — 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.

Publishing it as Markdown

--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.

bash
node bin/vibex.mjs docs docs/arch/auth.docs.json docs/arch --repo . --md docs/AUTH.md

Regenerate 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.

Report

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.

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.

  1. Find the clients in each service: HTTP/GraphQL client classes (Feign, axios/HttpService, a shared request wrapper), and the env var holding the base URL (*_SERVICE_URL).
  2. Find each call's handler in the target repo: the controller or resolver method serving that route.
  3. Write one link per call: from, to, kind, route, env, and client + handler anchors. Anchor the method, not the file. Hashes are "000000000000".
  4. Pin and check:
    bash
    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 --check
    Monorepo: drop services[].repo, use root-relative paths, pass one --repo ..
  5. Show it: render system.links.json draws the System view; dashboard puts it first.

Rules:

  • Only write a link you found on both ends. One end only is a finding: report it, don't invent the other side.
  • A third party (Stripe, a supplier) is a service with "external": true; its side needs no anchor.
  • Set services[].spec to the service's endpoints spec id: vibex links then lists endpoints nothing calls. Hide health/docs routes with services[].ignore: ["/actuator/**"].
  • One templated call (/items/${kind}) that reaches several endpoints: give endpoint a list.
  • Map each service to its C4 elements: 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.
  • Put ids one service owns and others store (orderId, customerId) in shared_ids.
  • Give every spec a unique meta.id (orders.endpoints, not api.endpoints). Same-named files in two services otherwise collide.

Release notes (changelog)

bash
node bin/vibex.mjs changelog v1.2.0..main --specs docs/arch --md RELEASE.md -o changelog.json

Reads 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.
  • Sections are a guess unless the project uses conventional commits. When they are, the artefact and the Markdown both say so. Do not present an inferred grouping as the author's intent.
  • A commit is only 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:

bash
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.

Authoring rules

  • Under ~25 entities, ~15 C4 elements, ~80 endpoints per diagram. Past that, split by ERD groups, C4 level, or endpoint group, and link with link (C4) or a card.
  • ERD: 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.
  • C4: every element except persons gets a one-sentence 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.
  • Lifecycle: one 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 =.
  • Endpoints: REST paths use {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.
  • Layout is automatic. Only set row/col when a layout warning asks for it or the user complains.
  • Do not hand-edit the generated HTML. Change the JSON and re-render.

Commands

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 paths

Never 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.

Viewer

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

Files

SKILL.md and 131 other files (assets) in the repository root of Raja0sama/vibex.

  • SKILL.md
  • .claude-plugin/marketplace.json
  • .claude-plugin/plugin.json
  • .editorconfig
  • .github/ISSUE_TEMPLATE/1-doc-request.yml
  • .github/ISSUE_TEMPLATE/2-doc-problem.yml
  • .github/ISSUE_TEMPLATE/3-spec-gap.yml
  • .github/ISSUE_TEMPLATE/4-proposal.yml
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/dependabot.yml
  • .github/pull_request_template.md
  • .github/scripts/triage-issue.mjs
  • .github/workflows/ci.yml
  • .github/workflows/intake.yml
  • .github/workflows/publish.yml
  • .gitignore
  • … and 116 more

Open the folder on GitHubat commit 95f4b3f

Compare with similar skills

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.

Vibex compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Vibex this skillRaja0sama/vibex388—~7.8kAutomated safety check: PassMIT
NestJS ExpertJeffallan/claude-skills12k—~2kAutomated safety check: PassMIT
API Designericrisco/rsc-harness167—~3.1kAutomated safety check: PassMIT
API DesignerJeffallan/claude-skills12k2 repos~2kAutomated safety check: PassMIT
SpikardGoldziher/spikard123—~799Automated safety check: PassMIT
Executor Usagejeremyosih/pi-executor104—~1.4kAutomated safety check: PassMIT

Similar skills

  • 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.

    12k GitHub stars~2k tokensUpdated 5 days ago
    Backend & APIsAuto-check passed
  • API Design

    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 —…

    167 GitHub stars~3.1k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • API Designer

    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.

    12k GitHub starsUsed in 2 repos~2k tokens
    Backend & APIsAuto-check passed
  • Spikard

    Goldziher/spikard

    Scaffold Spikard projects and generate code from OpenAPI, AsyncAPI, OpenRPC, GraphQL, and Protobuf schemas using the Spikard CLI or its MCP server.

    123 GitHub stars~799 tokensUpdated 5 days ago
    Backend & APIsAuto-check passed
  • Executor Usage

    jeremyosih/pi-executor

    Load this skill before using the execute tool. An agent skill from jeremyosih/pi-executor.

    104 GitHub stars~1.4k tokensUpdated 3 mo ago
    Backend & APIsAuto-check passed
  • Aurl

    ShawnPana/aurl

    Turn any API into a CLI command. An agent skill from ShawnPana/aurl.

    168 GitHub stars~536 tokensUpdated 6 mo ago
    Backend & APIsAuto-check passed

Questions about Vibex

What does Vibex do?

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.

When should I use Vibex?

Vibex fits situations like: : database diagram; table relationships; architecture diagram; show me the endpoints.

How do I install Vibex in Claude Code?

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.

How do I install Vibex in Codex?

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.

Can I use Vibex in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Vibex need to run?

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.

Does Vibex access the network?

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.

Is Vibex safe to install?

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.

What licence does Vibex use?

Vibex is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Vibex use?

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.

What are the alternatives to Vibex?

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.

Who maintains Vibex?

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.