Transformers.js
huggingface/skills
Runs pre-trained Hugging Face models in JavaScript or TypeScript with Transformers.js, in browsers or Node.js, Bun and Deno, for text, vision, audio and multimodal tasks.
Helps write and debug JavaScript or TypeScript that uses the compromise English NLP library for matching, entity extraction, tagging and sentence transforms.
$ npx skills add spencermountain/compromise --skill compromise -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install spencermountain/compromise compromise --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/spencermountain/compromise.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/compromise .claude/skills/compromise && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "compromise" agent skill from https://github.com/spencermountain/compromise/tree/master/skills/compromise into .claude/skills/compromise/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise", 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.
$skill-installer install https://github.com/spencermountain/compromise/tree/master/skills/compromiseType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add spencermountain/compromise --skill compromise -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install spencermountain/compromise compromise --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spencermountain/compromise.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/compromise .agents/skills/compromise && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "compromise" agent skill from https://github.com/spencermountain/compromise/tree/master/skills/compromise into .agents/skills/compromise/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise", 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 spencermountain/compromise --skill compromise -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install spencermountain/compromise compromise --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spencermountain/compromise.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/compromise .cursor/skills/compromise && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "compromise" agent skill from https://github.com/spencermountain/compromise/tree/master/skills/compromise into .cursor/skills/compromise/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise", 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.
$ gemini skills install https://github.com/spencermountain/compromise.git --path skills/compromise--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add spencermountain/compromise --skill compromise -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install spencermountain/compromise compromise --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spencermountain/compromise.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/compromise .gemini/skills/compromise && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "compromise" agent skill from https://github.com/spencermountain/compromise/tree/master/skills/compromise into .gemini/skills/compromise/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise", 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 spencermountain/compromise compromiseInstalls 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 spencermountain/compromise --skill compromise -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/spencermountain/compromise.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/compromise .github/skills/compromise && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "compromise" agent skill from https://github.com/spencermountain/compromise/tree/master/skills/compromise into .github/skills/compromise/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise", 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 spencermountain/compromise --skill compromise -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install spencermountain/compromise compromise --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/spencermountain/compromise.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/compromise .opencode/skills/compromise && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "compromise" agent skill from https://github.com/spencermountain/compromise/tree/master/skills/compromise into .opencode/skills/compromise/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise", 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.
compromiseHelps write and debug JavaScript or TypeScript that uses the compromise English NLP library for matching, entity extraction, tagging and sentence transforms.
Compromise is a rule-based English NLP library that runs locally in Node.js and browsers, and the skill is plain about its limits: tagging and transformations are heuristic, and there is no dependency parse tree, semantic understanding or LLM service. Before choosing APIs, the agent inspects the project's compromise version, imports and registered plugins.
A table of build tiers tells it what each import offers. The full compromise or compromise/three build has tokenization, tagging and named selections and transforms. The compromise/two build has tokenization and tagging without .people(), .verbs() or .numbers(), and compromise/one or compromise/tokenize only tokenizes. When a method is missing, the agent checks tier, version and plugins before inventing a replacement, and specialized transforms belong on specialized selections, such as .verbs().toPastTense().
It points to docs for the API, match syntax, tag definitions, concepts, recipes and tagging differences, and says to read the docs for the installed version rather than the latest. It also stresses that nlp(text) returns a View of the whole document, that selections share that document, and that transforms mutate it.
Read from SKILL.md and the folder at commit 2e7a1b9. 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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are javascript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From 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.
Compromise NLP Library loads about 2k tokens when it runs. Until then it costs about 84 tokens; SKILL.md has 909 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 spencermountain/compromise at commit 2e7a1b9, republished under its MIT licence (© spencermountain). 909 words, ~2,031 tokens.
.claude/skills/compromise/SKILL.md (or your agent's skills folder).Compromise is a rule-based English NLP library that runs locally in Node.js and browsers. Its tagging and transformations are heuristic; it does not provide a dependency parse tree, semantic understanding, or an LLM service.
Inspect the project's compromise version, import, and registered plugins before choosing APIs.
Prefer the full import nlp from 'compromise' for ordinary use:
| Import | Available features |
|---|---|
compromise or compromise/three | Tokenization, tagging, named selections and transforms |
compromise/two | Tokenization and tagging; no .people(), .verbs(), or .numbers() |
compromise/one or compromise/tokenize | Tokenization; no automatic part-of-speech tagging |
Use the existing module system; CommonJS can use const nlp = require('compromise').
If a method is missing, check the build tier, version, and plugins before inventing a replacement API.
Specialized transforms belong on specialized selections: use .verbs().toPastTense(),
not .match('#Verb').toPastTense().
Read only the detailed docs needed for the task. These paths resolve inside this repository
and packages that ship this skill alongside docs/:
If this skill was installed separately, look for these files in the consuming project's
node_modules/compromise/docs/ or its resolved package directory. If unavailable, consult the
upstream repository at the installed version's
tag when available. Do not assume the latest docs describe an older installed version.
When docs and behavior disagree, reproduce against that version and inspect its source/types.
nlp(text) returns a View of the whole document. Selections return Views sharing that document.
Transforms mutate the shared document; reading .text() from a selection gives only that fragment.
Keep the whole-document variable when the requested output is the rewritten input:
import nlp from 'compromise'
const original = nlp('She walks home.')
const past = original.clone()
past.verbs().toPastTense()
past.text() // 'She walked home.'
original.text() // 'She walks home.'Clone before transforming when the original must be preserved. Cloning a selection does not
turn it into a whole-document selection. .all() returns a View of the whole underlying document.
.match(pattern) extracts matching terms; .has(pattern) returns a boolean..if(pattern) filters the current phrases, retaining each whole phrase containing a match.
Use .sentences().if(pattern) to retain matching sentences..found is a boolean property, not a method. An empty View is still a truthy JavaScript object..replace(from, to) finds a pattern and replaces it; .replaceWith(to) replaces the selection..text() returns a string; .out('array') returns strings per match;
.json() returns structured records. These are outputs, not chainable Views..text('normal') is not a universal punctuation
stripper. Choose and verify normalization for the requested output rather than stripping blindly.Patterns operate on tokenized terms within each sentence. Literal words match case-insensitively;
use {walk} to include inflections such as walked. Use real tag names: #Person, #Place,
#Organization, #Noun, #Verb, #Adjective, #Value, and #Date are useful starting points.
Tags form a hierarchy, so #FirstName also matches #Person and #Noun.
Unknown tags silently match nothing unless explicitly defined by an extension.
Do not invent tags such as #Name, #Location, #Subject, #Object, or #Adj.
| Pattern | Meaning |
|---|---|
#Adjective+ #Noun | One or more adjective terms followed by a noun |
the big? cat | Optional big term |
(cat|dog) | Alternatives |
the . sat | Exactly one intervening term |
the * sat | Zero or more intervening terms |
the !#Verb | A term that is not a verb after the |
^the / sat$ | Start / end of the current sentence or selection |
/^colou?r$/ | Character regex within a term |
[<who>#Person+] | Named capture, retrieved with .groups('who') |
const doc = nlp('John Smith arrived. Mary left.')
doc.match('[<who>#Person+] arrived').groups('who').text() // 'John Smith'
doc.sentences().if('arrived').out('array') // ['John Smith arrived.']
doc.has('#Person') // trueMatches do not cross sentence boundaries. Nested groups are unsupported; express complex logic
as separate patterns or successive selections, verifying the scope at each step.
Slashes in input split terms; do not assume a slash-joined string is one token.
For literal word lists, consider .lookup(words) instead of constructing match syntax from
arbitrary user input. For advanced patterns, consult the match reference before guessing.
nlp('John Smith arrived.').people().out('array') // ['John Smith']
nlp('It costs twelve dollars.').numbers().get() // [12]
nlp('five hundred').numbers().toNumber().text() // '500' (selected number)
nlp('kermit waved', { kermit: 'FirstName' }).people().out('array') // ['kermit']Use .people(), .places(), and .organizations() for named entities; .nouns() selects noun
phrases and is not a generic entity detector. Domain vocabulary can be supplied at parse time
as above. nlp.addWords({...}) and nlp.plugin({...}) customize subsequent parsing globally;
register shared configuration once, rather than repeatedly inside request handlers.
Plugins add APIs beyond the full core build. For example, parsing dates into calendar values
requires compromise-dates; a #Date match only selects tagged text. Import a required plugin
and call nlp.plugin(plugin) before parsing. Consult that plugin's version-matched docs for
options such as the reference date and timezone. Do not assume every plugin API is in core.
Run small examples against the installed build when execution is available. Check exact outputs, including punctuation and whether the result is a fragment or the full document. For matching, include a positive example and a near miss; for transforms, check preservation of surrounding text and, when cloning, the original. Include representative user input rather than only ideal grammar.
When a result is wrong, inspect doc.debug() and doc.json() to see the actual terms and tags.
Then check selection scope, sentence boundaries, tag spelling, and method availability.
Use nlp.verbose(true) for tagger tracing when needed, and disable it with nlp.verbose(false)
after diagnosis. Correct domain tagging with a narrow lexicon or rule rather than treating a
failed example as evidence that a guessed pattern is valid.
For entity removal, explicitly select the categories the user needs and verify their coverage;
do not assume .redact() includes every category or that heuristic detection guarantees anonymization.
If examples cannot be run, distinguish expected behavior from verified output.
© spencermountain, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/compromise of spencermountain/compromise.
Open the folder on GitHubat commit 2e7a1b9
Compromise NLP Library 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 |
|---|---|---|---|---|---|---|
| Compromise NLP Library this skillspencermountain/compromise | 12k | — | ~2k | Automated safety check: Pass | MIT | |
| Transformers.jshuggingface/skills | 11k | 1 repos | ~6.2k | Automated safety check: Pass | Apache-2.0 | |
| Generate Release Notesteambit/bit | 18k | — | ~2.2k | Automated safety check: Pass | Custom licence | |
| ast-grep Codemod Referencewarp-drive-data/warp-drive | 3.2k | — | ~2.6k | Automated safety check: Pass | MIT | |
| Coding Standardskurealnum/dotfiles | 290 | 17 repos | ~2.9k | Automated safety check: Pass | None | |
| Bit CLIteambit/bit | 18k | — | ~2k | Automated safety check: Warn | Custom licence |
huggingface/skills
Runs pre-trained Hugging Face models in JavaScript or TypeScript with Transformers.js, in browsers or Node.js, Bun and Deno, for text, vision, audio and multimodal tasks.
teambit/bit
Generate comprehensive release notes for Bit from git commits and pull requests.
warp-drive-data/warp-drive
Reference for writing and debugging TypeScript and JavaScript codemods with @ast-grep/napi: parsing, node queries, meta-variables, rule objects and editing.
kurealnum/dotfiles
Universal coding standards, best practices, and patterns for TypeScript, JavaScript, React, and Node.js development.
teambit/bit
MUST consult before running ANY bit command. An agent skill from teambit/bit.
mweinbach/agent-coworker
Quick reference for using Bun to run TypeScript and JavaScript, install packages, bundle code, run tests and serve HTTP, with the key files and commands.
spencermountain/compromise
Guide for writing correct code with the compromise rule-based NLP library: tagging, match syntax, in-place transforms and common tasks like tense changes and redaction.
Works with
Categories
Helps write and debug JavaScript or TypeScript that uses the compromise English NLP library for matching, entity extraction, tagging and sentence transforms. js and browsers, and the skill is plain about its limits: tagging and transformations are heuristic, and there is no dependency parse tree, semantic understanding or LLM service. Before choosing APIs, the agent inspects the project's compromise version, imports and registered plugins.
Compromise NLP Library fits situations like: writing JavaScript or TypeScript that uses the compromise library; matching text patterns or extracting entities and numbers from English sentences; debugging a compromise selection or transform that behaves unexpectedly; customizing tags or adding a compromise plugin.
Run `npx skills add spencermountain/compromise --skill compromise -a claude-code`. Or copy the skill folder (skills/compromise in spencermountain/compromise) into .claude/skills/compromise in your project. Claude Code loads it when a task matches its description.
Run `npx skills add spencermountain/compromise --skill compromise -a codex`. Or copy the skill folder (skills/compromise in spencermountain/compromise) into .agents/skills/compromise 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 spencermountain/compromise --skill compromise -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/compromise, .gemini/skills/compromise, .github/skills/compromise and .opencode/skills/compromise in your project.
SKILL.md names no scripts, command-line tools or credentials: Compromise NLP Library is instructions for the agent only. Our summary lists: The compromise package, installed in a Node.js or browser project.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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.
Compromise NLP Library is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2k tokens (SKILL.md is roughly 8.1k 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 Compromise NLP Library: Transformers.js (huggingface/skills, 11k stars), Generate Release Notes (teambit/bit, 18k stars), ast-grep Codemod Reference (warp-drive-data/warp-drive, 3.2k stars) and Coding Standards (kurealnum/dotfiles, 290 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
spencermountain (a GitHub user) maintains it in spencermountain/compromise, which has 12,164 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 7, 2026.
Source: spencermountain/compromise on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.