Expansion Signal Spotter
gooseworks-ai/goose-skills
Monitor existing customer accounts for upsell and cross-sell signals: team growth on LinkedIn, new job postings, product usage patterns, funding announcements, and public company news.
Read and write LinkedIn profiles and company pages with the Curviate CLI, and resolve human search terms into the opaque filter ids the search commands need.
$ npx skills add davila7/claude-code-templates --skill curviate-profile -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install davila7/claude-code-templates curviate-profile --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/davila7/claude-code-templates.git skills-src && mkdir -p .claude/skills && cp -r skills-src/cli-tool/components/skills/curviate/curviate-profile .claude/skills/curviate-profile && 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 "curviate-profile" agent skill from https://github.com/davila7/claude-code-templates/tree/main/cli-tool/components/skills/curviate/curviate-profile into .claude/skills/curviate-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "curviate-profile", 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/davila7/claude-code-templates/tree/main/cli-tool/components/skills/curviate/curviate-profileType 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 davila7/claude-code-templates --skill curviate-profile -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install davila7/claude-code-templates curviate-profile --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davila7/claude-code-templates.git skills-src && mkdir -p .agents/skills && cp -r skills-src/cli-tool/components/skills/curviate/curviate-profile .agents/skills/curviate-profile && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "curviate-profile" agent skill from https://github.com/davila7/claude-code-templates/tree/main/cli-tool/components/skills/curviate/curviate-profile into .agents/skills/curviate-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "curviate-profile", 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 davila7/claude-code-templates --skill curviate-profile -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install davila7/claude-code-templates curviate-profile --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davila7/claude-code-templates.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/cli-tool/components/skills/curviate/curviate-profile .cursor/skills/curviate-profile && 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 "curviate-profile" agent skill from https://github.com/davila7/claude-code-templates/tree/main/cli-tool/components/skills/curviate/curviate-profile into .cursor/skills/curviate-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "curviate-profile", 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/davila7/claude-code-templates.git --path cli-tool/components/skills/curviate/curviate-profile--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 davila7/claude-code-templates --skill curviate-profile -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install davila7/claude-code-templates curviate-profile --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davila7/claude-code-templates.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/cli-tool/components/skills/curviate/curviate-profile .gemini/skills/curviate-profile && 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 "curviate-profile" agent skill from https://github.com/davila7/claude-code-templates/tree/main/cli-tool/components/skills/curviate/curviate-profile into .gemini/skills/curviate-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "curviate-profile", 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 davila7/claude-code-templates curviate-profileInstalls 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 davila7/claude-code-templates --skill curviate-profile -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/davila7/claude-code-templates.git skills-src && mkdir -p .github/skills && cp -r skills-src/cli-tool/components/skills/curviate/curviate-profile .github/skills/curviate-profile && 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 "curviate-profile" agent skill from https://github.com/davila7/claude-code-templates/tree/main/cli-tool/components/skills/curviate/curviate-profile into .github/skills/curviate-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "curviate-profile", 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 davila7/claude-code-templates --skill curviate-profile -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install davila7/claude-code-templates curviate-profile --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/davila7/claude-code-templates.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/cli-tool/components/skills/curviate/curviate-profile .opencode/skills/curviate-profile && 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 "curviate-profile" agent skill from https://github.com/davila7/claude-code-templates/tree/main/cli-tool/components/skills/curviate/curviate-profile into .opencode/skills/curviate-profile/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "curviate-profile", 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.
curviate-profileRead and write LinkedIn profiles and company pages with the Curviate CLI, and resolve human search terms into the opaque filter ids the search commands need.
Curviate Profile is an agent skill from davila7/claude-code-templates. Read and write LinkedIn profiles and company pages with the Curviate CLI, and resolve human search terms into the opaque filter ids the search commands need. Covers profile (me, detail, sections, update, subscription, analytics, visitors, SSI), company (detail, employees, posts, jobs, followers, page inbox, follow-invite), search parameters, retrieval mode (--mode/--max-age), and the session/account commands (login, config, account). Use when fetching or updating a member or company profile, resolving a filter…
Its SKILL.md is about 7.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Productivity & Automation, covering Email management and Resume and CV writing. It works with LinkedIn. The repository describes itself as: CLI tool for configuring and monitoring Claude Code. The licence is MIT.
Read from SKILL.md and the folder at commit c0ca7da. 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.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
CURVIATE_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Curviate Profile loads about 7.6k tokens when it runs. Until then it costs about 159 tokens; SKILL.md has 3,540 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 davila7/claude-code-templates at commit c0ca7da, republished under its MIT licence (© davila7). 3,540 words, ~7,622 tokens.
.claude/skills/curviate-profile/SKILL.md (or your agent's skills folder).Profiles are the entry point for almost every LinkedIn workflow: you resolve a person or a company, then act. This skill covers that resolution, the company page surface, the parameter lookup every structured search depends on, and the account plumbing underneath all of it.
Command surface established against CLI 0.33.0.
npm install -g @curviate/cli && curviate --version # needs Node 18 or newer
curviate login --api-key <key> # or export CURVIATE_API_KEY
curviate account list --json # verify: your connected LinkedIn accountscurviate --version fails, install it. Do not substitute a raw
HTTP call for a command you could not find; the command surface is the contract.CURVIATE_API_KEY,
CURVIATE_BASE_URL and CURVIATE_ACCOUNT are the right path for a scripted run: the key stays out
of argv, out of ps, and out of shell history.--json on anything you parse. It is already the default when stdout is not a terminal; ask
for it explicitly when a human might also be watching.--preview before every write. It renders the resolved request without sending it. On a read
command it is refused with exit 2.--fields a,b,c to project. Profile responses carry 18 or more fields; projecting cuts most of
that away.--verbose when a slim response looks suspiciously empty. An empty slim field is not proof the
data does not exist; see Traps.--profile and --account are different questionsBoth exist on every command and they answer different questions. Pass either, both, or neither:
| Flag | Chooses | Reach for it when |
|---|---|---|
--profile <name> | The stored credential set: API key, base URL, and a default account. | You hold several tenants or keys locally, or you want the call site to read as a name rather than an opaque id. |
--account <acc_id> | Which connected LinkedIn account performs this one command, overriding the profile's default. | The tenant has more than one connected account and this command must act as a specific one. |
--account takes an account id only; an account name comes back ACCOUNT_NOT_FOUND, exit 4.
A structurally malformed value is refused at exit 2 before the request is built. Resolve ids live
with curviate account list --json; they change when an account is reconnected, so never hard-code
one.
--mode and --max-ageExactly four reads decide between a stored copy and a live LinkedIn call: profile me,
profile <id>, inbox get and inbox messages. Two of them are here.
--mode | Behaviour |
|---|---|
auto (default) | A stored copy while it is fresh, otherwise fetch. |
live | Always fetch from LinkedIn. |
refill | A stored copy at any age; fetch only when nothing is stored. |
cache_only | Never fetch. A store miss is refused, not fetched. |
--max-age <seconds> (0 to 31536000) overrides those presets in both directions; --max-age 0 is
the same as --mode live.
Every response carries its provenance: source: store | live plus observed_at under --json, and
a provenance: line on stderr in human mode. Read source rather than assuming.
curviate profile me --mode live --json # source: live
curviate profile me --mode cache_only --json # source: store, with observed_atThree mechanics that decide whether a retrieval-mode call works:
cache_only with --max-age is a usage error, exit 2, raised before any network call.
cache_only never reaches LinkedIn at any age, so a freshness threshold cannot change its answer.
Drop --max-age, or use --mode refill.cache_only on a store miss is exit 14 (NOT_STORED): the profile may exist perfectly well
on LinkedIn, this API just holds no copy. It is not "not found" (4), so re-checking the
identifier is the wrong move, and it is not retryable as sent. Re-read with --mode refill (fetch
once, store it), auto, or live.unknown flag --mode, exit 2. A retrieval-mode habit applied to search people fails loudly, which is the
good case: you are never silently served an unintended freshness.One same-named flag is unrelated: job publish --mode FREE|PROMOTED|PROMOTED_PLUS selects a
publishing mode and spends money. It has nothing to do with retrieval.
profile: membersprofile <id> accepts a vanity slug, a full profile URL (country subdomains such as
de.linkedin.com included), a URN, a native member id (ACoAA…), or me.
| Command | What it does | Confidence |
|---|---|---|
curviate profile <id> | One member's profile. Accepts --mode/--max-age, --sections, and the activity flags below. | proven |
curviate profile me | Your own connected profile. Accepts --mode/--max-age. | proven |
curviate profile <id> --posts | That member's activity feed (posts and reposts). Same data as post user-posts <id>. | proven |
curviate profile <id> --comments | That member's comments on other people's posts. Same data as comment user <id>. | proven |
curviate profile <id> --reactions | That member's reactions. Works on any public profile. Returns value and post_id; no timestamp exists. | proven |
curviate profile <id> --sections <list> | LinkedIn sections: linkedin_experience, linkedin_education, linkedin_languages, linkedin_skills, linkedin_certifications, linkedin_volunteer_experience, linkedin_projects, linkedin_recommendations, linkedin_interests, or linkedin_* for all. A bare skills auto-prefixes. Pair with --verbose every time. | proven |
curviate profile update [--headline] [--bio] [--first-name] [--last-name] [--skills] [--picture] [--background-picture] | Update your own profile. Only the flags you pass are sent. | proven |
curviate profile subscription | Your premium entitlements and plan. A free account is a valid result (has_premium: false), not an error. | proven |
curviate profile analytics | Profile viewers, followers, post impressions and search appearances over LinkedIn's own fixed reporting windows. No window selector exists. | proven |
curviate profile visitors | Recent profile viewers, classified by disclosure fidelity: identified, semi-anonymous, or aggregate. Premium accounts see more identified viewers. | proven |
curviate profile ssi | Social Selling Index: overall score, four pillar breakdowns, industry and network percentile ranks. | proven |
curviate profile endorse <id> --endorsement-id <id> | Endorse a skill. Irreversible: there is no unendorse. | wired, never live-fired |
profile follow, unfollow, relations, followers and following belong to the network
workflow; see curviate-network.
--sections returns zero items unless you also pass --verbose. The slim projection strips
the section payload even when you asked for that exact section. Always pair them.emails and phone_numbers need --verbose, and --fields does not escalate for you.
profile <id> slim strips both; profile me slim keeps emails and drops phone_numbers.
--fields emails,phone_numbers without --verbose returns {} and a stderr warning, which
reads exactly like "this member published no contact details". It is not.emails and social_handles are missing from the response entirely and
phone_numbers is []. Fetch from whichever account is actually connected, and re-fetch after an
invitation is accepted. A profile read costs the same either way, so pass --verbose up front
rather than paying for two reads.specifics.throttled_sections is --verbose-only, and it is a correctness signal. It names
the sections LinkedIn rate-limited on this request. Without it you cannot tell "this member has no
listed experience" from "the experience section was throttled, retry it". Read it before treating
an empty section as ground truth, and requery only sections that actually appear in it.LINKEDIN_FEATURE_NOT_SUBSCRIBED, exit 5, never 404/exit 4. Deep
reads of some out-of-network members hit the same gate even though the search that found them
needed no subscription at all. Verify a handle through search people before concluding that a
subscription would fix it.profile update --headline reads back on the description field, and there is no --description
flag. The write takes --headline; the read response mirrors that text under description
("NOT the About/Summary section", which is bio). --fields headline on a read matches nothing and
is silently dropped like any unmatched path; project it as --fields description.profile update returning exit 0 was accepted. A stale-looking read immediately after is not
evidence the write failed.profile me relations. The command is profile relations. Older builds silently
discarded relations and answered with your own profile at exit 0; current builds exit 2.company: company pagescompany <id> takes a slug, URL or numeric id. Its sub-resources need the numeric provider id
returned by that first call, so it is always two steps.
| Command | What it does | Confidence |
|---|---|---|
curviate company <id> | The company profile: name, employee count, website, industry. | proven |
curviate company <id> employees | People who currently work there. Supports --keywords. | proven |
curviate company <id> posts | The page's posts. | proven |
curviate company <id> jobs | The page's open postings. | proven |
curviate company managed | The pages this account administers. An empty result is valid. | proven |
curviate company <id> followers | A page's followers, newest first. Admin-gated. | proven |
curviate company <id> invitable-followers | First-degree connections eligible to be invited to follow the page. Items carry no name or headline; hydrate a candidate with profile <id> before deciding. invite_token is always base64. | proven |
curviate company <id> follow-invite --invitee <member_id> | Invite those connections to follow the page. Admin-gated write, one --invitee per person. | proven |
curviate company <id> chats | The page's admin message inbox. Admin-gated. Beta. | proven |
curviate company <id> chat <chat_id> | One conversation from that inbox. Admin-gated. Beta. | proven |
curviate company <id> messages <chat_id> | A page conversation's messages, newest first. Admin-gated. | proven |
curviate company <id> message <chat_id> <message_id> | One message from a page conversation. Admin-gated. | proven |
curviate company <id> search-chats [query] | Search the page inbox. Exactly one mode per call: free text, --topic, or --unread, mutually exclusive, enforced server-side. Admin-gated. | proven |
curviate company <id> reply <chat_id> <text> | Reply in a page conversation, as the page. Admin-gated write. Reply-only: it cannot start a conversation. | proven |
follow-invite is all-or-nothing. A request where every invitee id is valid returns one outcome
per invitee in request order (invited, already_invited, ineligible, not_found). A single
invalid id rejects the whole request with a 404 rather than a partial result. Re-inviting someone
already invited is a safe no-op that returns the same invitation id, never a duplicate.
search parameters: turning words into filter idsStructured search filters take opaque ids, not human text. Resolve first, then search.
curviate search parameters --type LOCATION --keywords "Germany" --limit 5 --json
curviate search people --location <id> --keywords "AI engineer" --json| Command | What it does | Confidence |
|---|---|---|
curviate search parameters --type <T> --keywords "<term>" | Resolve a term to filter ids. --type is one of LOCATION, PEOPLE, CONNECTIONS, COMPANY, SCHOOL, INDUSTRY, SERVICE, JOB_FUNCTION, JOB_TITLE, EMPLOYMENT_TYPE, SKILL. Both flags required for every type. | proven |
curviate search service-parameters --keywords "<term>" [--type service_category|location] | The same resolution for the Services Marketplace filters search services accepts. --type defaults to service_category. | proven |
0. --location "Germany" has returned results from New York, Bengaluru and
Toronto with no warning at all. Resolve every --location, --industry, --company and
--school value through this command first.JOB_FUNCTION returns string tokens (eng, sale), not numeric ids, unlike every other type.
Pass the string straight into search jobs --function.--type PEOPLE is a working name-to-member lookup and returns real member profiles; it is also
how you resolve search people --followers-of.id and public_identifier, so they chain directly into a connect or a message.| Command | What it does | Confidence |
|---|---|---|
curviate setup | Connect this machine to your workspace: opens the dashboard, takes the code it shows you, and saves an API key. --no-browser prints the link instead of opening it; --code - reads the code from stdin, keeping it out of argv, ps and shell history. | proven |
curviate doctor | Check this machine can call the API: config, credential source, workspace, reachability and connected accounts. The first thing to run when a command fails for no obvious reason. | proven |
curviate login --api-key <key> | Store an API key in a local profile. | proven |
curviate config list | Every stored profile and the active one. Keys are redacted. | proven |
curviate config path | The config file path. | proven |
curviate config use <name> | Set the active profile. | proven |
curviate config rename <old> <new> | Rename a profile. | proven |
curviate config set-account <acc_id> | Set a profile's default acting account. | proven |
curviate config set-base-url [url] | Set or clear a profile's base URL. | proven |
curviate config reset | Remove the config file, or one profile. | proven |
curviate account list | Connected LinkedIn accounts: where an acc_id comes from. | proven |
curviate account get <acc_id> | One account, including quotas[]: per-action daily allowances with their reset times. This is the one command that reads your remaining allowance back. The id is positional even when the profile has a default. | proven |
curviate account seats | The workspace's live seats: seat_id, occupied, and account_id where occupied. A free seat (occupied: false) is the source of the --seat-id account link needs; not paginated, --all is refused. | wired, never live-fired |
curviate account link --seat-id <id> --auth-method <m> | Connect a LinkedIn account to an empty seat. Get a free seat_id from curviate account seats first. Prompts for a verification code interactively; a non-interactive shell exits 12 and you finish with account checkpoint solve. | proven |
curviate account connect-session poll --session <id> | Poll an in-progress connect. status is pending, resolved, expired or failed. --wait blocks until a terminal state. | proven |
curviate account checkpoint solve <acc_id> --code <otp> | Answer a checkpoint challenge with a one-time code. | proven |
curviate account checkpoint poll <acc_id> | Poll for mobile-app approval of a pending challenge. --wait blocks. | proven |
curviate account checkpoint request <acc_id> | Re-send the challenge notification. Not every challenge type can: an authenticator-app code has nothing to re-send. The response's resent boolean is honest; the command exits 0 either way, so read the field. | proven |
curviate account update <acc_id> | Update account metadata or custom-proxy configuration. | proven |
curviate account disconnect <acc_id> | Hard-disconnect an account and release its seat. | proven |
Zero connected accounts is a valid state, not an error: a fresh tenant authenticates fine and
account list returns an empty list. Every account-scoped command is unusable until an account is
connected.
Verify each account, not just the first. account list proves an account exists and reads
status: "active"; it does not prove the session round-trips. For each id:
curviate profile me --account <acc_id> --fields first_name,last_name,description --jsonExit 0 with a populated name proves auth, account scoping and field projection work together.
<!-- generated: command surface, CLI 0.33.0 -->
Read from the CLI's own --help at version 0.33.0. Descriptions, traps and confidence
tags elsewhere in this skill are hand-written and carry the version they were established against.
Every command below that takes flags at all also accepts --json.
| Command | Arguments | Flags |
|---|---|---|
curviate config list | (none) | (none) |
curviate config path | (none) | (none) |
curviate config use | NAME | (none) |
curviate config rename | OLD NEW | (none) |
curviate config set-account | ACCOUNT | --profile |
curviate config set-base-url | URL | --profile, --reset |
curviate config reset | (none) | --profile, --yes |
curviate profile | ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta, --posts, --comments, --reactions, --followers, --is-company, --mode, --max-age, --sections |
curviate profile me | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta, --mode, --max-age, --sections, --posts, --comments, --reactions, --followers |
curviate profile endorse | ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --preview, --verbose, --beta, --endorsement-id (required) |
curviate profile update | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta, --headline, --bio, --first-name, --last-name, --skills, --picture, --background-picture |
curviate profile subscription | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta |
curviate profile analytics | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta |
curviate profile visitors | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta |
curviate profile ssi | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta |
curviate company | ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --preview, --verbose, --beta, --sections |
curviate company employees | ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta, --keywords, --location |
curviate company posts | ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta |
curviate company jobs | ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta, --keywords |
curviate company invitable-followers | ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta |
curviate company follow-invite | ID | --api-key, --profile, --account, --base-url, --timeout, --preview, --verbose, --beta, --invitee |
curviate company reply | ID CHATID TEXT | --api-key, --profile, --account, --base-url, --timeout, --preview, --verbose, --beta, --attach |
curviate company managed | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta |
curviate company followers | ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta |
curviate company chats | ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta |
curviate company chat | ID CHATID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --preview, --verbose, --beta |
curviate company messages | ID CHATID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta |
curviate company message | ID CHATID MESSAGEID | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --preview, --verbose, --beta |
curviate company search-chats | ID QUERY | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta, --topic, --unread |
curviate search parameters | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --preview, --verbose, --beta, --type (required), --keywords (required) |
curviate search service-parameters | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --preview, --verbose, --beta, --type, --keywords (required) |
curviate account list | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --limit, --cursor, --all, --max-pages, --page-delay, --preview, --verbose, --beta |
curviate account get | ACCOUNT-ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta |
curviate account seats | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta |
curviate account link | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta, --seat-id (required), --auth-method (required), --email, --password, --password-stdin, --li-at, --li-at-stdin, --li-a, --country, --ip, --proxy-protocol, --proxy-host, --proxy-port, --proxy-username, --proxy-password, --user-agent, --recruiter-contract-id, --linkedin-premium, --account-id, --no-interactive |
curviate account connect-session poll | (none) | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta, --session (required), --wait |
curviate account update | ACCOUNT-ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta, --metadata, --clear-proxy, --proxy-protocol, --proxy-host, --proxy-port, --proxy-username, --proxy-password |
curviate account disconnect | ACCOUNT-ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta |
curviate account checkpoint solve | ACCOUNT-ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta, --code (required) |
curviate account checkpoint poll | ACCOUNT-ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta, --wait |
curviate account checkpoint request | ACCOUNT-ID | --api-key, --profile, --account, --base-url, --timeout, --fields, --preview, --verbose, --beta |
<!-- /generated -->
Branch on the exit code, never on the message text. Under --json an error prints
{"error": {"code", "message", …}}.
| Code | Meaning | What to do |
|---|---|---|
1 | INTERNAL from the server itself: a genuine bug on the platform side. | Worth one retry; if it repeats it is a bug to report, not a state to work around. |
2 | Usage or invalid input, often raised before any network call. | Fix the invocation. Never retry unchanged. |
4 | Not found. | Wrong identifier, or the resource is gone. |
5 | Three causes, one code: read error.code. NO_ACTIVE_SEAT: the account is on no active seat. LINKEDIN_FEATURE_NOT_SUBSCRIBED: LinkedIn itself lacks the feature. BETA_NOT_ENABLED: the operation is beta-gated and this workspace has not opted in. | Branch on error.code: the three fixes have nothing in common, and none is fixed by retrying unchanged. |
6 | PLATFORM_RATE_LIMIT and its siblings. Carries retry_after in whole seconds. A response naming budgetRow means only that row is paused; every other row on the account keeps working. | Back off and retry after that many seconds. On a named budgetRow, switch to other work on the account rather than backing off across the board. |
7 | Transient platform fault: a request that got no response at all (network error, DNS failure, timeout) or one that came back as something other than a valid API answer. Carries retryLikelyToSucceed: true. | Retry with backoff. |
8 | Account or connection state. Read error.code: ACCOUNT_RESTRICTED, LINKEDIN_AUTH_FAILED and LINKEDIN_COOKIE_INVALID need a reconnect; LINKEDIN_OPERATION_NOT_SUPPORTED is a permanent platform limitation and never retryable; ACCOUNT_ALREADY_LINKED means account link targeted a seat or account that is already connected. | Depends on error.code; do not assume "reconnect" covers all of them. On ACCOUNT_ALREADY_LINKED, pass --account-id <existing acc_...> to account link to re-authenticate that account in place, or use the account it already names instead of retrying the original call. |
9 | Checkpoint failure, the challenge is dead: CHECKPOINT_NOT_FOUND, CHECKPOINT_EXPIRED, CHECKPOINT_INVALID_CODE, CHECKPOINT_MAX_ATTEMPTS, CHECKPOINT_ALREADY_RESOLVED or CHECKPOINT_UNSUPPORTED. Raised by checkpoint solve on a wrong or stale code, checkpoint poll --wait timing out into a terminal state, or checkpoint request against a checkpoint that is already gone. | Start over: curviate account link (pass --account-id <acc_...> to reconnect an existing account in place). Distinct from 12, which is still resolvable with the next step. |
12 | A connect flow needs its next authentication step. | Run the checkpoint flow, or poll the connect session. Distinct from 9, a checkpoint failure. |
13 | BUDGET_EXHAUSTED: a safety rule of your own refused the action, not LinkedIn. Read error.safetyReason: ceiling means the row named in error.budgetRow hit its configured limit; activity_window means the account is outside the hours it works in (no budgetRow on that one). Nothing reached LinkedIn and nothing was spent. reset_at can be weeks out, and may be null where no clock frees it. | Do not back off and retry. error.safetyHint.parameter names the exact setting to change (for example profile_views.ceiling, or posture where no ceiling applies). Read quotas[] via account get, then either wait for the named reset or change that setting. A retry loop here only burns time. |
14 | NOT_STORED: a cache_only read the store cannot answer. | Re-read with refill, auto or live. Re-checking the id is the wrong move. |
© davila7, 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 cli-tool/components/skills/curviate/curviate-profile of davila7/claude-code-templates.
Open the folder on GitHubat commit c0ca7da
Curviate Profile 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 |
|---|---|---|---|---|---|---|
| Curviate Profile this skilldavila7/claude-code-templates | 33k | — | ~7.6k | Automated safety check: Pass | MIT | |
| Expansion Signal Spottergooseworks-ai/goose-skills | 1.2k | 1 repos | ~2.3k | Automated safety check: Pass | MIT | |
| Li InboxJakeschincariol/linkedin-agent-skill | 1.7k | — | ~723 | Automated safety check: Pass | MIT | |
| Linkedin Message Writergooseworks-ai/goose-skills | 1.2k | 1 repos | ~3.4k | Automated safety check: Notes | MIT | |
| Linkedin Inboxsundial-org/awesome-openclaw-skills | 663 | — | ~1.5k | Automated safety check: Pass | None | |
| Pp Unipilemvanhorn/printing-press-library | 2.1k | — | ~8.9k | Automated safety check: Notes | Apache-2.0 |
gooseworks-ai/goose-skills
Monitor existing customer accounts for upsell and cross-sell signals: team growth on LinkedIn, new job postings, product usage patterns, funding announcements, and public company news.
Jakeschincariol/linkedin-agent-skill
Triage the LinkedIn inbox - sort connection requests and DMs into leads, recruiters, peers and spam, and draft the replies worth sending.
gooseworks-ai/goose-skills
Research LinkedIn profiles and write personalized messages for any LinkedIn message type — connection requests, InMails, DMs, message requests, post comments, and comment replies.
sundial-org/awesome-openclaw-skills
LinkedIn inbox management with scheduled scanning, auto-draft responses following user's communication style, and approval workflows.
mvanhorn/printing-press-library
Every Unipile endpoint as a typed command, plus a local mirror that makes cross-provider search possible and an invitation ledger that shows how much LinkedIn headroom you have left.
sundial-org/awesome-openclaw-skills
Bulletproof LinkedIn inbox monitoring with progressive autonomy.
davila7/claude-code-templates
Runs web-grounded searches through Perplexity's Sonar models over OpenRouter for current events, recent literature and cited facts beyond the model's training cutoff.
davila7/claude-code-templates
Analyzes Neuropixels recordings from SpikeGLX or Open Ephys through preprocessing, drift correction, Kilosort4 spike sorting, quality metrics and curation.
davila7/claude-code-templates
Supplies LaTeX templates and formatting rules for journals, conferences, posters, and grant proposals, then can check a draft against them.
davila7/claude-code-templates
Analyzes a brand's existing writing to lock in a consistent voice, then builds SEO blog posts and platform-specific social content around it.
davila7/claude-code-templates
Guides corrective and preventive action (CAPA) work in a quality management system, from initiation and root cause analysis through effectiveness verification.
davila7/claude-code-templates
Senior FDA consultant and specialist for medical device companies including HIPAA compliance and requirement management.
Works with
Read and write LinkedIn profiles and company pages with the Curviate CLI, and resolve human search terms into the opaque filter ids the search commands need. Curviate Profile is an agent skill from davila7/claude-code-templates. Read and write LinkedIn profiles and company pages with the Curviate CLI, and resolve human search terms into the opaque filter ids the search commands need.
Curviate Profile fits situations like: updating a member; company profile; resolving a filter id; choosing between a stored copy and a live LinkedIn read.
Run `npx skills add davila7/claude-code-templates --skill curviate-profile -a claude-code`. Or copy the skill folder (cli-tool/components/skills/curviate/curviate-profile in davila7/claude-code-templates) into .claude/skills/curviate-profile in your project. Claude Code loads it when a task matches its description.
Run `npx skills add davila7/claude-code-templates --skill curviate-profile -a codex`. Or copy the skill folder (cli-tool/components/skills/curviate/curviate-profile in davila7/claude-code-templates) into .agents/skills/curviate-profile 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 davila7/claude-code-templates --skill curviate-profile -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/curviate-profile, .gemini/skills/curviate-profile, .github/skills/curviate-profile and .opencode/skills/curviate-profile in your project.
Going by SKILL.md and its folder, Curviate Profile needs the command-line tools its instructions call (npm) and credentials named CURVIATE_API_KEY. Our summary lists: Node.js; A credential in CURVIATE_API_KEY.
SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. 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.
Curviate Profile is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.6k tokens (SKILL.md is roughly 30k 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 Curviate Profile: Expansion Signal Spotter (gooseworks-ai/goose-skills, 1.2k stars), Li Inbox (Jakeschincariol/linkedin-agent-skill, 1.7k stars), Linkedin Message Writer (gooseworks-ai/goose-skills, 1.2k stars) and Linkedin Inbox (sundial-org/awesome-openclaw-skills, 663 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
davila7 (a GitHub user) maintains it in davila7/claude-code-templates, which has 32,512 GitHub stars. The repository holds 479 skills in this directory. The repository was last updated on October 10, 2026.
Source: davila7/claude-code-templates on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.