npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@enjoys/context-engine

v1.18.3

Published

Monaco Editor language intelligence engine — 96 languages, 29 providers, 119 themes, 466 CLI command files (448 unique). Completions, hover, definitions, code actions, formatting, symbols, monarch tokenizers, multi-document highlights, AI rename suggestio

Readme

@enjoys/context-engine

Comprehensive Monaco Editor language intelligence engine with 94 languages, 26 providers, and 464 CLI command files (447 unique) — completions, hover docs, definitions, code actions, code lens, document symbols, formatting, signature help, semantic tokens, inline completions, and more, all as pre-built JSON data with zero backend required.

Why Context Engine?

Traditional LSP (Language Server Protocol) setups require a backend server running a separate language server process for every language you want to support. Each language server needs its own binary installed — Go, Rust, Python, TypeScript, and so on. At scale, this makes the backend heavy, memory-hungry, and CPU-intensive. Supporting all languages can easily consume 1 GB+ of disk space and significant runtime resources just to keep those servers alive.

Context Engine takes a fundamentally different approach. Instead of running language servers on the backend, it ships pre-built, Monaco-compatible JSON data for 94 languages across 26 provider types — completions, hover docs, definitions, code actions, formatting rules, semantic tokens, and 464 CLI tool definitions — all in a single package. No language binaries to install. No background processes to manage. No backend required for intelligence.

Note: Context Engine does not provide path-based intelligence (file resolution, go-to-definition across files, etc.) the way a full LSP does. It focuses on language-aware completions, hover documentation, code actions, formatting, symbols, and terminal command autocomplete — the features that matter most in web-based terminal and editor experiences, without the infrastructure overhead.

Install

npm install @enjoys/context-engine

What's Inside

data/                        # 2,444 JSON files — 94 languages × 26 providers + 256 commands
├── codeActions/             # Quick-fix and refactoring actions
├── codeLens/                # Inline actionable annotations (references, tests)
├── color/                   # Color picker and decorator support
├── commands/                # 464 CLI tool definitions (git, docker, kubectl, ...)
├── completion/              # Monaco CompletionItem[] with snippets
├── declaration/             # Go-to-declaration data
├── definition/              # Definitions (signatures, descriptions, types)
├── documentHighlight/       # Symbol highlight on selection
├── documentRangeFormatting/ # Format-selection rules
├── documentSymbol/          # Outline / symbol tree patterns
├── foldingRange/            # Code folding regions
├── formatting/              # Full-document formatting rules
├── hover/                   # Hover documentation (IMarkdownString[])
├── implementation/          # Go-to-implementation data
├── inlayHints/              # Inline parameter/type hints
├── inlineCompletions/       # Ghost-text inline completions
├── linkedEditingRange/      # Linked editing (e.g. HTML tag pairs)
├── links/                   # Clickable document link patterns
├── onTypeFormatting/        # Format-as-you-type rules
├── rangeSemanticTokens/     # Range-scoped semantic tokens
├── references/              # Find-all-references patterns
├── rename/                  # Symbol rename validation and patterns
├── selectionRange/          # Smart selection expansion
├── semanticTokens/          # Full semantic tokenization
├── signatureHelp/           # Function signature tooltips
├── typeDefinition/          # Go-to-type-definition data
└── manifest.json            # Language registry with file mappings

Quick Start — Full Monaco Integration

This single example registers completions, hover, definitions, and command-line autocomplete for any language:

import * as monaco from 'monaco-editor';

// ── 1. Import language data (e.g., nginx) ──
import nginxCompletions from '@enjoys/context-engine/completion/nginx.json';
import nginxDefinitions from '@enjoys/context-engine/definition/nginx.json';
import nginxHovers from '@enjoys/context-engine/hover/nginx.json';

// ── 2. Import command data ──
import { getCommand, searchCommands, getSubcommands } from '@enjoys/context-engine';

// =============================================
// REGISTER COMPLETION PROVIDER
// =============================================
monaco.languages.registerCompletionItemProvider('nginx', {
  provideCompletionItems(model, position) {
    const word = model.getWordUntilPosition(position);
    const range = {
      startLineNumber: position.lineNumber,
      endLineNumber: position.lineNumber,
      startColumn: word.startColumn,
      endColumn: word.endColumn,
    };

    // Map data to Monaco CompletionItems
    const suggestions = nginxCompletions.completions.map((item) => ({
      label: item.label,
      kind: item.kind,                              // e.g. 15 = Snippet
      detail: item.detail,
      documentation: item.documentation?.value
        ? { value: item.documentation.value, isTrusted: true }
        : undefined,
      insertText: item.insertText,
      insertTextRules: item.insertTextRules,         // 4 = InsertAsSnippet
      sortText: item.sortText,
      range,
    }));

    return { suggestions };
  },
});

// =============================================
// REGISTER HOVER PROVIDER
// =============================================
monaco.languages.registerHoverProvider('nginx', {
  provideHover(model, position) {
    const word = model.getWordAtPosition(position);
    if (!word) return null;

    const key = word.word.toLowerCase();
    const hover = nginxHovers.hovers[key];
    if (!hover) return null;

    return {
      range: new monaco.Range(
        position.lineNumber,
        word.startColumn,
        position.lineNumber,
        word.endColumn
      ),
      contents: hover.contents.map((c) => ({
        value: c.value,
        isTrusted: true,
        supportThemeIcons: true,
      })),
    };
  },
});

// =============================================
// REGISTER DEFINITION PROVIDER (Peek Definition)
// =============================================
monaco.languages.registerDefinitionProvider('nginx', {
  provideDefinition(model, position) {
    const word = model.getWordAtPosition(position);
    if (!word) return null;

    const key = word.word.toLowerCase();
    const def = nginxDefinitions.definitions[key];
    if (!def) return null;

    // Search the document for the first occurrence of this keyword
    const text = model.getValue();
    const lines = text.split('\n');
    for (let i = 0; i < lines.length; i++) {
      const col = lines[i].indexOf(word.word);
      if (col !== -1) {
        return {
          uri: model.uri,
          range: new monaco.Range(i + 1, col + 1, i + 1, col + 1 + word.word.length),
        };
      }
    }
    return null;
  },
});

// =============================================
// SHOW DEFINITION INFO IN A CUSTOM WIDGET
// =============================================
// You can use definitions data to build a sidebar, tooltip, or panel:
function getDefinitionInfo(keyword) {
  const def = nginxDefinitions.definitions[keyword];
  if (!def) return null;
  return {
    signature: def.signature,     // e.g. "proxy_pass URL"
    description: def.description, // e.g. "Forwards requests to backend..."
    type: def.type,               // e.g. "directive"
    module: def.module,           // e.g. "ngx_http_proxy_module"
  };
}

// Example:
// getDefinitionInfo('proxy_pass')
// → { signature: "proxy_pass URL", description: "Sets the protocol and address...", type: "directive", module: "ngx_http_proxy_module" }

Register Multiple Languages at Once

import manifest from '@enjoys/context-engine/data/manifest.json';

// Dynamically register all 94 languages
for (const lang of manifest.languages) {
  const completionData = await import(`@enjoys/context-engine/${lang.files.completion}`);
  const hoverData = await import(`@enjoys/context-engine/${lang.files.hover}`);
  const defData = await import(`@enjoys/context-engine/${lang.files.definition}`);

  monaco.languages.registerCompletionItemProvider(lang.id, {
    provideCompletionItems(model, position) {
      const word = model.getWordUntilPosition(position);
      const range = {
        startLineNumber: position.lineNumber,
        endLineNumber: position.lineNumber,
        startColumn: word.startColumn,
        endColumn: word.endColumn,
      };
      return {
        suggestions: completionData.completions.map((item) => ({
          label: item.label,
          kind: item.kind,
          detail: item.detail,
          documentation: item.documentation?.value
            ? { value: item.documentation.value, isTrusted: true }
            : undefined,
          insertText: item.insertText,
          insertTextRules: item.insertTextRules,
          sortText: item.sortText,
          range,
        })),
      };
    },
  });

  monaco.languages.registerHoverProvider(lang.id, {
    provideHover(model, position) {
      const word = model.getWordAtPosition(position);
      if (!word) return null;
      const hover = hoverData.hovers[word.word.toLowerCase()];
      if (!hover) return null;
      return {
        range: new monaco.Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn),
        contents: hover.contents.map((c) => ({ value: c.value, isTrusted: true })),
      };
    },
  });
}

Register Additional Providers

import codeActionsData from '@enjoys/context-engine/data/codeActions/typescript.json';
import codeLensData from '@enjoys/context-engine/data/codeLens/typescript.json';
import symbolData from '@enjoys/context-engine/data/documentSymbol/typescript.json';
import highlightData from '@enjoys/context-engine/data/documentHighlight/typescript.json';
import signatureData from '@enjoys/context-engine/data/signatureHelp/typescript.json';

// ── Code Actions (Quick Fix, Refactor) ──
monaco.languages.registerCodeActionProvider('typescript', {
  provideCodeActions(model, range, context) {
    return {
      actions: codeActionsData.codeActions.map((a) => ({
        title: a.title,
        kind: a.kind,
        diagnostics: [],
        isPreferred: a.isPreferred || false,
      })),
      dispose() {},
    };
  },
});

// ── Code Lens (References, Run Test) ──
monaco.languages.registerCodeLensProvider('typescript', {
  provideCodeLenses(model) {
    const lenses = [];
    const text = model.getValue();
    for (const pattern of codeLensData.codeLensPatterns) {
      const regex = new RegExp(pattern.pattern, 'gm');
      let match;
      while ((match = regex.exec(text))) {
        const line = model.getPositionAt(match.index).lineNumber;
        lenses.push({
          range: new monaco.Range(line, 1, line, 1),
          command: { id: pattern.commandId, title: pattern.title },
        });
      }
    }
    return { lenses, dispose() {} };
  },
});

// ── Document Symbols (Outline) ──
monaco.languages.registerDocumentSymbolProvider('typescript', {
  provideDocumentSymbols(model) {
    const symbols = [];
    const text = model.getValue();
    for (const sp of symbolData.symbolPatterns) {
      const regex = new RegExp(sp.pattern, 'gm');
      let match;
      while ((match = regex.exec(text))) {
        const pos = model.getPositionAt(match.index);
        const name = match[sp.captureGroup || 1] || match[0];
        symbols.push({
          name,
          kind: sp.kind,
          range: new monaco.Range(pos.lineNumber, 1, pos.lineNumber, model.getLineMaxColumn(pos.lineNumber)),
          selectionRange: new monaco.Range(pos.lineNumber, pos.column, pos.lineNumber, pos.column + name.length),
        });
      }
    }
    return symbols;
  },
});

// ── Signature Help ──
monaco.languages.registerSignatureHelpProvider('typescript', {
  signatureHelpTriggerCharacters: signatureData.triggerCharacters || ['(', ','],
  provideSignatureHelp(model, position) {
    const word = model.getWordAtPosition(position);
    if (!word || !signatureData.signatures) return null;
    const sig = signatureData.signatures[word.word];
    if (!sig) return null;
    return {
      value: {
        signatures: [{
          label: sig.label,
          parameters: (sig.params || []).map((p) => ({ label: p.label, documentation: p.documentation })),
          documentation: sig.documentation,
        }],
        activeSignature: 0,
        activeParameter: 0,
      },
      dispose() {},
    };
  },
});

Terminal Autocomplete — Command Engine API

Use the command engine to build intelligent terminal autocomplete (like Fig or Warp):

import {
  getCommand,
  getAllCommands,
  listCommandNames,
  searchCommands,
  getCommandsByCategory,
  getCommandsByPlatform,
  getCategories,
  getContextEngine,
  getSubcommands,
  getGlobalOptions,
  getExamples,
  count,
} from '@enjoys/context-engine';

getCommand(name)

Get a single command definition by name.

const git = getCommand('git');
console.log(git.subcommands.map((s) => s.name));
// ['init', 'clone', 'add', 'commit', 'push', ...]

searchCommands(query)

Search commands by name, description, or category (case-insensitive).

searchCommands('docker');
// [{ name: 'docker', ... }, { name: 'docker-compose', ... }]

searchCommands('database');
// [{ name: 'psql', ... }, { name: 'mysql', ... }, { name: 'mongosh', ... }]

getSubcommands(name)

getSubcommands('systemctl');
// [{ name: 'start', description: 'Start (activate) one or more units', args: [...], examples: [...] },
//  { name: 'stop', ... }, { name: 'restart', ... }, { name: 'status', ... },
//  { name: 'enable', options: [{ name: '--now' }], ... }, ... ]  (35 subcommands)

getGlobalOptions(name)

getGlobalOptions('journalctl');
// [{ name: '-u', description: 'Show logs for a specific unit' },
//  { name: '-f', description: 'Follow — show new log entries' },
//  { name: '-n', description: 'Number of lines to show' }, ...]  (32 options)

getExamples(name)

getExamples('nginx');
// ['nginx -t', 'nginx -s reload', 'sudo nginx -t && sudo nginx -s reload', ...]

getContextEngine(name)

Get runtime context detectors for a command — shell commands that gather live context.

const ctx = getContextEngine('docker');
// {
//   detectors: [
//     { name: 'containers', command: 'docker ps ...', parser: 'lines', cacheFor: 10 },
//     { name: 'images', command: 'docker images ...', parser: 'lines', cacheFor: 30 },
//     ...
//   ]
// }

getCommandsByCategory(category) / getCommandsByPlatform(platform)

getCommandsByCategory('database');
// [psql, mysql, mongosh, sqlite3, redis-cli, cockroach, influx, clickhouse-client, ...]

getCommandsByPlatform('windows');
// [choco, winget, ...]

getCategories()

getCategories();
// ['Build Tools', 'Cloud CLIs', 'Container', 'Database', 'DevOps', ...]

count()

count(); // 395

resolveCommandPath(name) / dataDir

resolveCommandPath('git');
// '/path/to/node_modules/@enjoys/context-engine/data/commands/git.json'

clearCache()

Clear the in-memory cache (useful in tests).


Full Terminal Autocomplete Example

Build a terminal autocomplete that suggests subcommands, options, and uses context detectors:

import { getCommand, getContextEngine, searchCommands } from '@enjoys/context-engine';
import { exec } from 'child_process';
import { promisify } from 'util';

const execAsync = promisify(exec);

// ── Run a context detector and cache results ──
const cache = new Map();

async function runDetector(detector) {
  const cached = cache.get(detector.name);
  if (cached && Date.now() - cached.time < (detector.cacheFor || 30) * 1000) {
    return cached.data;
  }

  try {
    const { stdout } = await execAsync(detector.command, { timeout: 5000 });
    let data;
    switch (detector.parser) {
      case 'lines': data = stdout.trim().split('\n').filter(Boolean); break;
      case 'json':  data = JSON.parse(stdout); break;
      default:      data = stdout.trim(); break;
    }
    cache.set(detector.name, { data, time: Date.now() });
    return data;
  } catch {
    return null;
  }
}

// ── Autocomplete function ──
async function getCompletions(inputLine) {
  const parts = inputLine.trim().split(/\s+/);
  const cmdName = parts[0];
  const cmd = getCommand(cmdName);
  if (!cmd) {
    // Suggest matching command names
    return searchCommands(cmdName).map((c) => ({
      label: c.name,
      detail: c.description,
    }));
  }

  // User typed "systemctl " — suggest subcommands
  if (parts.length === 1 || (parts.length === 2 && !parts[1].startsWith('-'))) {
    const items = cmd.subcommands.map((s) => ({
      label: s.name,
      detail: s.description,
    }));

    // Also add context detectors (e.g., running services, failed units)
    const ctx = getContextEngine(cmdName);
    if (ctx) {
      for (const detector of ctx.detectors) {
        const data = await runDetector(detector);
        if (Array.isArray(data)) {
          items.push(...data.map((d) => ({
            label: d,
            detail: `[${detector.name}]`,
          })));
        }
      }
    }
    return items;
  }

  // User typed "systemctl start " — suggest from detectors
  const subName = parts[1];
  const sub = cmd.subcommands.find((s) => s.name === subName);
  if (sub?.options) {
    return sub.options.map((o) => ({
      label: o.name,
      detail: o.description,
    }));
  }

  return cmd.globalOptions.map((o) => ({
    label: o.name,
    detail: o.description,
  }));
}

// Usage:
// await getCompletions('systemctl ')      → 35 subcommands + live context
// await getCompletions('systemctl start') → running/enabled services
// await getCompletions('docker ')         → subcommands + running containers
// await getCompletions('git ')            → subcommands + branches

Direct JSON Import

Access raw JSON files directly:

// Command data
const git = require('@enjoys/context-engine/commands/git.json');

// Language data
const nginxCompletion = require('@enjoys/context-engine/completion/nginx.json');
const nginxDefinition = require('@enjoys/context-engine/definition/nginx.json');
const nginxHover = require('@enjoys/context-engine/hover/nginx.json');

// Manifest (all languages)
const manifest = require('@enjoys/context-engine/data/manifest.json');

Data Formats

Completion Item (data/completion/*.json)

{
  "language": "nginx",
  "completions": [
    {
      "label": "server block",
      "kind": 15,
      "detail": "Server block",
      "documentation": { "value": "Defines a virtual server." },
      "insertText": "server {\n    listen ${1:80};\n    server_name ${2:example.com};\n    ...\n}",
      "insertTextRules": 4,
      "sortText": "00_server"
    }
  ]
}

kind values (CompletionItemKind): 0 = Method, 1 = Function, 2 = Constructor, 3 = Field, 4 = Variable, 5 = Class, 6 = Struct, 7 = Interface, 8 = Module, 9 = Property, 10 = Event, 11 = Operator, 12 = Unit, 13 = Value, 14 = Constant, 15 = Enum, 16 = EnumMember, 17 = Keyword, 18 = Text, 19 = Color, 20 = File, 21 = Reference, 22 = Customcolor, 23 = Folder, 24 = TypeParameter, 25 = User, 26 = Issue, 27 = Tool, 28 = Snippet
insertTextRules: 0 = None, 1 = KeepWhitespace, 4 = InsertAsSnippet (supports ${1:placeholder} tab stops)

Definition Item (data/definition/*.json)

{
  "language": "nginx",
  "definitions": {
    "proxy_pass": {
      "signature": "proxy_pass URL",
      "description": "Sets the protocol and address of a proxied server.",
      "type": "directive",
      "module": "ngx_http_proxy_module"
    }
  }
}

Hover Item (data/hover/*.json)

{
  "language": "nginx",
  "hovers": {
    "server": {
      "contents": [
        {
          "value": "```nginx\nserver {\n    listen 80;\n    server_name example.com;\n    ...\n}\n```\n**server** block defines a virtual host."
        }
      ]
    }
  }
}

Command Definition (data/commands/*.json)

{
  "name": "systemctl",
  "description": "Control the systemd system and service manager",
  "category": "system",
  "platforms": ["linux"],
  "shells": ["bash", "zsh", "fish"],
  "subcommands": [
    {
      "name": "start",
      "description": "Start one or more units",
      "args": [{ "name": "<unit>", "type": "string", "required": true }],
      "examples": ["systemctl start nginx"]
    }
  ],
  "globalOptions": [
    { "name": "--no-pager", "description": "Do not pipe output into pager" }
  ],
  "examples": ["systemctl start nginx", "systemctl status nginx -l"],
  "relatedCommands": ["journalctl", "systemd-analyze"],
  "contextEngine": {
    "detectors": [
      {
        "name": "failed_units",
        "command": "systemctl --failed --no-legend --plain 2>/dev/null | head -20",
        "parser": "lines",
        "cacheFor": 10,
        "requiresCmd": "systemctl"
      }
    ]
  }
}

Supported Languages (94)

Each language has up to 26 provider files — completions, hover, definitions, code actions, formatting, symbols, and more.

| Category | Languages | |----------|-----------| | Web | JavaScript, TypeScript, HTML, CSS, Less, SCSS, React, Angular, Next.js, Nest.js, Tailwind CSS | | UI / Templating | Liquid, Twig, FreeMarker2, Razor, shadcn, MDX | | Systems | C, C++, Rust, Go, Swift, Objective-C | | JVM | Java, Kotlin, Scala, Clojure | | .NET | C#, VB, Q# | | Scripting | Python, Ruby, Perl, Lua, PHP, Elixir, CoffeeScript, R | | Shell | Shell/Bash, PowerShell, AWK, Azure CLI | | Functional | Scheme, Julia, CameLIGO, PascaLIGO, Dart | | Database / Query | SQL, MySQL, PostgreSQL, Redshift, Redis, redis-cli, Cypher, SPARQL | | Config / Infrastructure | Dockerfile, Docker Compose, YAML, TOML, JSON, XML, INI, Dotenv, SSH Config, HCL, Makefile, Nginx, systemd, Caddy | | Docs / Markup | Markdown, MDX, reStructuredText | | Data / BI | MSDAX, Power Query, GraphQL | | Blockchain | Solidity, Lexon, Bicep | | Hardware / Low-Level | MIPS, SystemVerilog, WGSL, Structured Text | | Enterprise / Niche | ABAP, Apex, ECL, Flow9, M3, Pascal, PLA, Postiats, SB | | Other | Crontab, Protobuf, Doctest |

Covered Commands (464 files, 447 unique)

| Category | Tools | |----------|-------| | Cloud CLIs & APIs | aws, az, gcloud, doctl, linode-cli, vercel, netlify, firebase, supabase, railway, render, flyctl, cloudflare, aws-vault, auth0, stripe, twilio, sfdx, cdk, sam, serverless, eksctl, wrangler, func, heroku, oci, ibmcloud, aliyun, openstack, civo, scw, vultr, hcloud, upcloud, aws-copilot, amplify, eb, s3cmd, chamber, gsutil, bq, az-devops, ecs-cli, lightsail, rclone, mc | | Containers & Orchestration | docker, docker-compose, dockerfile, kubectl, helm, minikube, k9s, podman, buildah, skopeo, kind, kustomize, argocd, istioctl, crane, ko, rancher, linkerd, flux, tkn, crossplane, argo, velero, kubectx, kubens, stern, k3s, k3d, helmfile, kubeconform, popeye, kube-score, skaffold, tilt, telepresence, devspace, okteto, garden, cilium, calicoctl, cmctl, kn, kamel | | Version Control & Git Workflow | git, gh, glab, svn, hg, git-lfs, husky, commitlint, semantic-release, conventional-commits, pre-commit | | Node.js Ecosystem | node, npm, npx, yarn, pnpm, bun, deno, eslint, prettier, tsc, turbo, nx, vite, next, nest | | JS Build Tools | webpack, esbuild, rollup, swc, babel, storybook, lerna, changeset, concurrently | | Frameworks | angular, react, nextjs, nestjs, nuxt, vue, shadcn, tailwindcss, rails, artisan | | Static Site Generators | hugo, jekyll, gatsby, astro, eleventy, hexo, svelte, remix | | Python Ecosystem | python, pip, pipx, poetry, pipenv, conda, pytest, uvicorn, gunicorn, django-admin, flask, locust | | Rust & Go | rust, cargo, rustup, wasm-pack, rustc, go, gofmt, golangci-lint, air | | Java/JVM | java, javac, gradle, mvn, kotlin, scala, clojure, sdkman | | Haskell | ghc, cabal, stack | | Elixir & Erlang | mix, rebar3, erlang | | OCaml | ocaml, opam | | Other Languages | dotnet, zig, nim, crystal, swiftc, c (gcc/clang), cpp (g++), javascript, typescript, csharp, objective-c, swift, perl, lua, r, scheme, julia, pascal, tcl, vb, qsharp, coffee | | PHP | php, composer, artisan, symfony, wp | | Ruby | ruby, gem, bundle, rails, rake, rspec, rbenv, pod, fastlane | | Mobile | adb, dart, flutter, expo, react-native, xcodebuild, fastlane | | Database | sql, psql, pgsql, pg_dump, pg_restore, mysql, mongosh, redis, redis-cli, sqlite3, cockroach, influx, clickhouse-client, cypher, redshift | | Database ORMs/Migrations | prisma, drizzle-kit, typeorm, sequelize, alembic, dbmate, flyway, liquibase, atlas | | DevOps & Infrastructure | terraform, terragrunt, pulumi, packer, vault, consul, nomad, ansible, vagrant | | DevOps Quality | shellcheck, hadolint, act, semgrep, checkov, tflint | | Web Servers | nginx, caddy, httpd, apachectl | | Networking | curl, wget, rsync, ssh, ssh-keygen, ip, ss, ping, dig, nslookup, traceroute, tracert, netstat, ifconfig, route, hostname, nc, socat, nmap, tcpdump, wireshark, cloudflared | | Security | openssl, certbot, snyk, trivy, sonar-scanner, gpg, age, sops, cosign, syft, grype, doppler, infisical | | System & Monitoring | systemctl, journalctl, systemd-analyze, systemd, pm2, tmux, screen, htop, btop, top, ps, linux, crontab, kill, killall, df, du, free, lsof, mount, umount, env, watch, dmesg, strace, nohup, at, cron, hostname, prometheus, grafana-cli | | Linux Coreutils | ls, cp, mv, rm, cat, find, tar, chmod, chown, cd, sudo, scp, unzip, zip, ufw, iptables, nft, mkdir, touch, echo, head, tail, wc, sort, uniq, cut, diff, patch, ln, xargs, tee, which, whoami, id | | Build Tools | make, makefile, cmake, bazel, just, gradle | | Version Managers | nvm, fnm, pyenv, rbenv, asdf, volta, sdkman, mise | | HTTP/API Testing | httpie, ab, wrk, hey, vegeta, grpcurl, postman | | Data Processing | csvkit, miller, xsv, q, sqlite-utils | | Media & Documents | ffmpeg, imagemagick, pandoc, latex, ghostscript | | Package Managers | apt, apt-get, yum, dnf, pacman, brew, choco, winget, pipx, composer, bundle | | Testing | jest, vitest, mocha, playwright, cypress, k6, locust | | Text Processing & Utilities | grep, sed, awk, jq, yq, bat, cat, fd, fzf, rg, parallel, entr, inotifywait | | Text Editors | nvim, vim | | Config & Data Formats | json, xml, yaml, toml, ini, hcl, dotenv, markdown, mdx, restructuredtext, protobuf, graphql, scss, less, css, html, liquid, twig, razor, freemarker2 | | Niche & Specialized | abap, bicep, azcli, cameligo, pascaligo, ecl, flow9, lexon, m3, mips, msdax, pla, postiats, powerquery, sb, sol, sparql, st, systemverilog, wgsl, doctest |

Context Engine

Each command can include a contextEngine with runtime detectors — shell commands that gather live context (running containers, git branches, installed packages, etc.) for intelligent autocomplete:

const { getContextEngine } = require('@enjoys/context-engine');

const ctx = getContextEngine('systemctl');
// {
//   detectors: [
//     { name: 'failed_units', command: 'systemctl --failed ...', parser: 'lines', cacheFor: 10 },
//     { name: 'running_services', command: 'systemctl list-units ...', parser: 'text', cacheFor: 15 },
//     { name: 'active_timers', command: 'systemctl list-timers ...', parser: 'lines', cacheFor: 30 },
//     ...
//   ]
// }

Parser types: text | lines | json | csv | keyvalue | regex | table

All 26 Monaco Provider Types — Shipped

Every provider below is fully implemented for all 94 languages with spec-compliant JSON data:

| Provider | Registration Method | Data Key | |----------|-------------------|----------| | Completion | registerCompletionItemProvider | completions[] | | Hover | registerHoverProvider | hovers{} | | Definition | registerDefinitionProvider | definitions{} | | Code Actions | registerCodeActionProvider | codeActions[] | | Code Lens | registerCodeLensProvider | codeLensPatterns[] | | Color | registerColorProvider | colorPatterns[] | | Declaration | registerDeclarationProvider | declarations{} | | Document Highlight | registerDocumentHighlightProvider | highlights{} | | Document Symbol | registerDocumentSymbolProvider | symbolPatterns[] | | Document Range Formatting | registerDocumentRangeFormattingEditProvider | formatting{} | | Folding Range | registerFoldingRangeProvider | foldingRules[] | | Formatting | registerDocumentFormattingEditProvider | formatting{} | | Implementation | registerImplementationProvider | implementations{} | | Inlay Hints | registerInlayHintsProvider | inlayHints[] | | Inline Completions | registerInlineCompletionsProvider | inlineCompletions[] | | Linked Editing Range | registerLinkedEditingRangeProvider | linkedEditingPatterns[] | | Links | registerLinkProvider | linkPatterns[] | | On-Type Formatting | registerOnTypeFormattingEditProvider | formatting{} | | Range Semantic Tokens | registerDocumentRangeSemanticTokensProvider | tokenTypes[] | | References | registerReferenceProvider | referencePatterns[] | | Rename | registerRenameProvider | renameValidation{} | | Selection Range | registerSelectionRangeProvider | selectionRanges{} | | Semantic Tokens | registerDocumentSemanticTokensProvider | tokenTypes[] | | Signature Help | registerSignatureHelpProvider | signatures{} | | Type Definition | registerTypeDefinitionProvider | typeDefinitions{} | | Commands (CLI) | Custom API | subcommands[], globalOptions[] |

License

MIT © Enjoys Inc