Tavily Search API Integration
andrewyng/context-hub
Guides building Tavily integrations for web search, URL extraction, site crawling and AI-assisted research in Python or JavaScript agent and RAG projects.
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.
$ npx skills add spencermountain/compromise --skill compromise-nlp -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install spencermountain/compromise compromise-nlp --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/docs .claude/skills/compromise-nlp && 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-nlp" agent skill from https://github.com/spencermountain/compromise/tree/master/docs into .claude/skills/compromise-nlp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise-nlp", 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/docsType 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-nlp -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install spencermountain/compromise compromise-nlp --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/docs .agents/skills/compromise-nlp && 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-nlp" agent skill from https://github.com/spencermountain/compromise/tree/master/docs into .agents/skills/compromise-nlp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise-nlp", 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-nlp -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install spencermountain/compromise compromise-nlp --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/docs .cursor/skills/compromise-nlp && 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-nlp" agent skill from https://github.com/spencermountain/compromise/tree/master/docs into .cursor/skills/compromise-nlp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise-nlp", 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 docs--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-nlp -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install spencermountain/compromise compromise-nlp --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/docs .gemini/skills/compromise-nlp && 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-nlp" agent skill from https://github.com/spencermountain/compromise/tree/master/docs into .gemini/skills/compromise-nlp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise-nlp", 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 compromise-nlpInstalls 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-nlp -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/docs .github/skills/compromise-nlp && 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-nlp" agent skill from https://github.com/spencermountain/compromise/tree/master/docs into .github/skills/compromise-nlp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise-nlp", 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-nlp -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-nlp --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/docs .opencode/skills/compromise-nlp && 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-nlp" agent skill from https://github.com/spencermountain/compromise/tree/master/docs into .opencode/skills/compromise-nlp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "compromise-nlp", 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.
compromise-nlpGuide 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.
compromise is a rule-based English NLP library for JavaScript that needs no network, model or dependencies. You turn text into a document, the library tags each word's part of speech, and you find and transform parts of the text with a chained, jQuery-like API. The skill exists because its match syntax and tag set are easy to get wrong from memory, and it asks the agent to consult it before guessing whenever code imports compromise or calls `nlp()`.
It leads with rules that prevent most mistakes. Transform methods such as `.toPastTense()` and `.replace()` change the document in place, so the result is read from the original variable, with `.clone()` available to leave it untouched. Only real tags work: there are around 88 in a hierarchy, and an invented one such as `#Name` or `#Location` silently matches nothing. Match syntax works on whole terms rather than characters, with `/regex/` tokens for character-level patterns. Reference files cover the API, recipes, match syntax and tag definitions; the excerpt ends after the third rule.
5 steps, taken from the step headings in SKILL.md.
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 for JavaScript loads about 1.8k tokens when it runs. Until then it costs about 189 tokens; SKILL.md has 569 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). 569 words, ~1,795 tokens.
.claude/skills/compromise-nlp/SKILL.md (or your agent's skills folder). This skill also uses 8 other files; get the full folder from GitHub.compromise is a rule-based English NLP library for JavaScript (no network, no model, no deps).
You tokenize text into a document, it tags each word's part-of-speech, and you find and
transform parts of the text with a jQuery-like chained API.
import nlp from 'compromise'
let doc = nlp('she sells seashells by the seashore.')
doc.verbs().toPastTense() // transform
doc.text() // 'she sold seashells by the seashore.'These are the things that are easy to get wrong from memory. Internalize them before writing code.
Every transform method (.toPastTense(), .replace(), .tag(), .normalize(), case/whitespace
methods…) changes the underlying document. The View it returns is the selection it acted on, not
the whole document. So calling .text() on the chain gives you only the selected fragment:
let doc = nlp('I walk to work')
doc.verbs().toPastTense()
doc.text() // ✅ 'I walked to work' (read from doc)
nlp('I walk to work').verbs().toPastTense().text() // ❌ 'walked work' (just the selection)To transform a copy and leave the original untouched, call .clone() first:
let past = doc.clone().verbs().toPastTense().text()Read-only methods (.match, .has, .if, .found, .text, .json, accessors) never mutate.
#Tag matches nothing, silentlyThere are ~88 valid part-of-speech tags, and they're a hierarchy (#FirstName ⊂ #Person ⊂
#Noun). A #Tag that isn't real does not error — it just matches nothing, which looks like a
logic bug. Common inventions that are NOT tags: #Name, #Location, #Subject, #Object,
#Adj, #Entity. (Valid ones include #Person, #Place, #Organization, #Noun, #Verb,
#Value, #Date.) When unsure, check node_modules/compromise/docs/tag-definitions.md.
.match() matches whole words/terms, not characters. + * ? . ^ $ operate on terms. For
character-level patterns, use a /regex/ token. Cheat sheet (see references for the rest):
| Token | Means | Example |
|---|---|---|
#Tag | a part-of-speech tag | #Person |
. | any one term | the . sat |
* | any run of terms | the * sat |
(a|b) | one of these | (cat|dog) |
word? | optional term | the big? cat |
#Tag+ | one or more | #Adjective+ |
! | negate a term | the !#Verb |
[ ] / [<name> ] | capture group | [<who>#Person+] |
^ / $ | sentence start / end | ^the / sat$ |
~word~ | fuzzy / typo-tolerant | ~organization~ |
{root} | match all conjugations | {walk} matches walked/walking |
/regex/ | character-level regex | /colou?r/ |
nlp('John Smith left').match('[<who>#Person+]').groups('who').text() // 'john smith'nlp("that's it. Back to Winnipeg!").has('it back') is false. For multi-sentence matching, use
the compromise-paragraphs plugin.
compromise is the full build — import it unless size is criticalimport nlp from 'compromise' — full library: .people(), .verbs(), .numbers(), all selections. Default.import nlp from 'compromise/two' — POS tags + .match(), but no named selections.import nlp from 'compromise/tokenize' (/one) — tokenize only, no tags (#Tag patterns won't work).There's no useful tree-shaking below these tiers; run the full build.
// entities
nlp(text).people().out('array') // ['Mary', 'Dr. John Smith']
nlp(text).topics().out('array') // people + places + organizations
// NOTE: out('array') keeps trailing punctuation ('Paris.'); use .text('normal') for clean tokens
// transform (remember rule #1 — read from doc)
let d = nlp('I walk'); d.verbs().toPastTense(); d.text() // 'I walked'
let n = nlp('one dog'); n.nouns().toPlural(); n.text() // 'one dogs'
// numbers
nlp('five hundred').numbers().toNumber().text() // '500'
nlp('it cost twelve dollars').numbers().get() // [12]
// find / route (boolean, never mutates)
nlp('the deal is closed').has('#Determiner #Noun') // true
// teach it words
nlp(text, { kermit: 'FirstName' }) // per-call lexicon
nlp.addWords({ frodo: 'FirstName' }) // global.redact() removes people, places, emails, and phone numbers — but not organizations,
despite some docs saying otherwise. Redact orgs yourself: doc.organizations().replaceWith('███')..money().currency(),
.fractions().toText(), .percentages().toFraction(). Use .money().json() / .fractions().get() instead..out('array') and .text() include surrounding punctuation; .text('normal') or .json() normal give cleaned forms.doc.debug() // prints how every word was actually tagged — start here
doc.json() // full structured data: terms, tags, offsets
nlp.verbose(true) // log the tagger's decision-makingIf .match() returns nothing: confirm the tag is real (rule #2), remember sentence boundaries
(rule #4), and recall exact words match literally (use {root} for all conjugations).
The authoritative docs ship inside the package the project actually installed, so they match its exact version. Read these when you need more than the cheat sheet above:
node_modules/compromise/docs/match-syntax.md — every match operator, with examplesnode_modules/compromise/docs/tag-definitions.md — the complete, valid tagset with the hierarchynode_modules/compromise/docs/api.md — every method, signature, and descriptionnode_modules/compromise/docs/recipes.md — copy-paste solutions to common tasksnode_modules/compromise/docs/concepts.md — the document/View/Term model in full(When working inside the compromise repo itself, these are at docs/… and AGENTS.md.)
© spencermountain, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 8 other files in docs of spencermountain/compromise.
Open the folder on GitHubat commit 2e7a1b9
Compromise NLP for JavaScript 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 for JavaScript this skillspencermountain/compromise | 12k | — | ~1.8k | Automated safety check: Pass | MIT | |
| Tavily Search API Integrationandrewyng/context-hub | 14k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Getting Startedlive-codes/livecodes | 1.5k | — | ~1.6k | Automated safety check: Pass | MIT | |
| Transformers.jshuggingface/skills | 11k | 1 repos | ~6.2k | Automated safety check: Pass | Apache-2.0 | |
| Langgraph Project Setupsoba-labs/langchain-agent-skills | 107 | — | ~2.4k | Automated safety check: Notes | MIT | |
| Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop | 5.4k | — | ~2.2k | Automated safety check: Pass | MIT |
andrewyng/context-hub
Guides building Tavily integrations for web search, URL extraction, site crawling and AI-assisted research in Python or JavaScript agent and RAG projects.
live-codes/livecodes
Quick start for standalone app at livecodes.io, embedding playgrounds with CDN or npm, and self-hosting basics.
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.
soba-labs/langchain-agent-skills
Initialize and configure LangGraph projects with proper structure, langgraph.json configuration, environment variables, and dependency management.
dmmulroy/anti-slop
Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.
ethereumjs/ethereumjs-monorepo
Runs a coordinated EthereumJS npm release round in six human-gated phases — intent and readiness, CHANGELOG, version bump, publish (human executes), post-publish verification, and announcements.
spencermountain/compromise
Helps write and debug JavaScript or TypeScript that uses the compromise English NLP library for matching, entity extraction, tagging and sentence transforms.
Works with
Categories
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. compromise is a rule-based English NLP library for JavaScript that needs no network, model or dependencies. You turn text into a document, the library tags each word's part of speech, and you find and transform parts of the text with a chained, jQuery-like API.
Compromise NLP for JavaScript fits situations like: writing or editing JavaScript that imports compromise or calls nlp(); extracting people, places, dates or numbers from English text with rules; changing verb tense, pluralizing or normalizing text in JavaScript; redacting or anonymizing names in a block of text.
Run `npx skills add spencermountain/compromise --skill compromise-nlp -a claude-code`. Or copy the skill folder (docs in spencermountain/compromise) into .claude/skills/compromise-nlp in your project. Claude Code loads it when a task matches its description.
Run `npx skills add spencermountain/compromise --skill compromise-nlp -a codex`. Or copy the skill folder (docs in spencermountain/compromise) into .agents/skills/compromise-nlp 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-nlp -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-nlp, .gemini/skills/compromise-nlp, .github/skills/compromise-nlp and .opencode/skills/compromise-nlp in your project.
SKILL.md names no scripts, command-line tools or credentials: Compromise NLP for JavaScript is instructions for the agent only. Our summary lists: The compromise npm package.
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 for JavaScript is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.8k tokens (SKILL.md is roughly 7.2k 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 for JavaScript: Tavily Search API Integration (andrewyng/context-hub, 14k stars), Getting Started (live-codes/livecodes, 1.5k stars), Transformers.js (huggingface/skills, 11k stars) and Langgraph Project Setup (soba-labs/langchain-agent-skills, 107 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,162 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 9, 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.