Monitor CI
nrwl/nx
Monitor Nx Cloud CI pipeline and handle self-healing fixes. An agent skill from nrwl/nx.
Using the SASjs CLI (@sasjs/cli) to create, compile, build, deploy, run, and test SASjs projects against SAS 9, Viya, and SASjs server targets.
$ npx skills add sasjs/core --skill sasjs-cli -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install sasjs/core sasjs-cli --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/sasjs/core.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/sasjs-cli .claude/skills/sasjs-cli && 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 "sasjs-cli" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sasjs-cli into .claude/skills/sasjs-cli/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sasjs-cli", 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/sasjs/core/tree/main/.agents/skills/sasjs-cliType 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 sasjs/core --skill sasjs-cli -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install sasjs/core sasjs-cli --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/sasjs/core.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/sasjs-cli .agents/skills/sasjs-cli && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "sasjs-cli" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sasjs-cli into .agents/skills/sasjs-cli/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sasjs-cli", 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 sasjs/core --skill sasjs-cli -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install sasjs/core sasjs-cli --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/sasjs/core.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/sasjs-cli .cursor/skills/sasjs-cli && 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 "sasjs-cli" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sasjs-cli into .cursor/skills/sasjs-cli/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sasjs-cli", 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/sasjs/core.git --path .agents/skills/sasjs-cli--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 sasjs/core --skill sasjs-cli -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install sasjs/core sasjs-cli --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/sasjs/core.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/sasjs-cli .gemini/skills/sasjs-cli && 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 "sasjs-cli" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sasjs-cli into .gemini/skills/sasjs-cli/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sasjs-cli", 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 sasjs/core sasjs-cliInstalls 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 sasjs/core --skill sasjs-cli -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/sasjs/core.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/sasjs-cli .github/skills/sasjs-cli && 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 "sasjs-cli" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sasjs-cli into .github/skills/sasjs-cli/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sasjs-cli", 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 sasjs/core --skill sasjs-cli -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install sasjs/core sasjs-cli --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/sasjs/core.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/sasjs-cli .opencode/skills/sasjs-cli && 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 "sasjs-cli" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sasjs-cli into .opencode/skills/sasjs-cli/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sasjs-cli", 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.
sasjs-cliUsing the SASjs CLI (@sasjs/cli) to create, compile, build, deploy, run, and test SASjs projects against SAS 9, Viya, and SASjs server targets.
Sasjs CLI is an agent skill from sasjs/core. Using the SASjs CLI (@sasjs/cli) to create, compile, build, deploy, run, and test SASjs projects against SAS 9, Viya, and SASjs server targets. Use for any sasjs <command usage, CI/CD pipelines, target/auth config, sasjsconfig.json, service packs, or frontend streaming builds.
Its SKILL.md is about 3.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 DevOps & Cloud, covering CI/CD. The repository describes itself as: Macros for SAS® App Developers. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit b13a83f. 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:
ACCESS_TOKENREFRESH_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Sasjs CLI loads about 3.6k tokens when it runs. Until then it costs about 73 tokens; SKILL.md has 1,925 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 noted patterns worth knowing about, such as sudo or a known installer.
s files are per-target: env files named `.env.<targetname>` (e.g. `.env.server`) with `CLIENT`, `ACCESS_TOKEN`, and `REFpair is persisted to a local env file (`.env.<target>`) or `~/.sasjsrc` (global) and verified via `/identities/users/@conment. References to credential files (`.env`, `~/.sasjsrc`) describe where the CLI stores authentication tokens - thisAutomated 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 sasjs/core at commit b13a83f, republished under its MIT licence (© sasjs). 1,925 words, ~3,638 tokens.
.claude/skills/sasjs-cli/SKILL.md (or your agent's skills folder).The SASjs CLI (npm i -g @sasjs/cli, invoked as sasjs) automates compiling, building, and deploying SAS projects. All commands support -t <target> to select a target from sasjsconfig.json.
{ name, serverUrl, serverType, appLoc }. serverType is one of SAS9, SASVIYA, SASJS.sasjs add cred (or a local env file). Viya uses client/secret or sasjs auth login (user/pass, no client/secret needed - see below); SAS 9 uses user/pass; SASJS server uses an access token.sasjs context manages Viya compute contexts; sasjs add target adds a new target.sasjs create myapp # scaffold a new app (templates available)
sasjs compile # gather macros/services/jobs into per-file build outputs (sasjsbuild/)
sasjs build # produce deployable artefacts: JSON + .sas per target
sasjs deploy # deploy compiled/built artefacts to the target server
sasjs cbd # compile + build + deploy in one step (-t viya etc.)| Command | Purpose |
|---|---|
sasjs create / init | Scaffold new app or add SASjs to existing repo |
sasjs compile | Resolve dependencies (<h4> SAS Macros </h4> etc.) into sasjsbuild/ |
sasjs build | Create build JSON / service pack per target |
sasjs deploy / cbd | Deploy to server (servicepack or direct) |
sasjs run <file.sas> | Execute an arbitrary SAS file on the server, return log |
sasjs request <path> | Execute a deployed service/job with input data (-d) |
sasjs job execute | Run a deployed job |
sasjs flow execute | Run a sequence of jobs with dependencies (CSV-defined flows) |
sasjs servicepack deploy | Deploy from a JSON service pack |
sasjs web | Build the frontend and stream it into the SAS web root (streamConfig) |
sasjs db | Build database DDL/data load scripts from sasjs/db |
sasjs doc | Generate doxygen documentation + lineage |
sasjs folder create/delete/move | Manage folders in SAS metadata / SAS Drive |
sasjs fs | File-system operations against the server (sync folders) |
sasjs test | Execute tests defined in sasjs/tests with init/term programs |
sasjs lint | Lint .sas files per .sasjslint config |
sasjs version | Print/set version info |
Test coverage is generated only from a sasjs compile (or sasjs c). It accepts a target (-t <target>), but nothing is deployed to that target - compilation and coverage are fully local/offline, so no server needs to be available or reachable. Missing macro dependencies (e.g. mp_ds2csv.sas) mean @sasjs/core isn't installed - run npm i first.
Dependencies are declared in doxygen headers: <h4> SAS Macros </h4>, <h4> SAS Files </h4>, <h4> SAS Folders </h4>, and @li item entries - the CLI builds the dependency tree from these.
The @li list is the compiler's only dependency source: a macro that is called in the code but not declared is not inlined into the build, and the deployed job fails at runtime with Apparent invocation of macro X not resolved. It can still work by accident when another declared macro's own @li chain happens to inline it (transitive resolution) - which breaks as soon as that macro's dependencies change. Declare every macro the code calls, indirect helpers (e.g. mf_getuser.sas) included; when editing an existing service, re-audit the %macro() calls in the body against the @li entries.
sasjs compile output goes to the sasjsbuild/ folder (git-ignore it); sasjsresults/ holds test/run outputs.
CI/CD: sasjs cbd -t viya is the standard deploy step; combine with sasjs servicepack deploy for artefact-based releases.
Exit codes are non-zero on failure - safe for pipelines.
npm i before sasjs cb - macro dependency resolution needs node_modules/@sasjs/core present, and @sasjs/core (and @sasjs/adapter if used) must be listed in package.json..env.<targetname> (e.g. .env.server) with CLIENT, ACCESS_TOKEN, and REFRESH_TOKEN entries. Never commit them - gitignore .env*.sasjs auth login)sasjs auth login -t <target> authenticates with a regular SAS username/password via the OAuth2 password grant against the built-in, secret-less sas.cli public client. No admin-registered OAuth client is needed - the fastest way to get sasjs run/deploy working on dev/demo estates. The password is never stored; the minted token pair is persisted to a local env file (.env.<target>) or ~/.sasjsrc (global) and verified via /identities/users/@currentUser (Logged in as <id> (<name>)). Bare sasjs auth is still an alias for sasjs add cred.
sasjs auth login.sas.cli a short access-token TTL (e.g. 1h); a refresh on most invocations is normal.sas.cli (default on Viya 3.5+/4); ROPC is deprecated in OAuth 2.1 - use a registered client/secret for CI/production.sasjs run 403 on session creation = the account isn't authorised for the configured compute context - set contextName: "SAS Studio compute context" on the target. First run on a cold estate can take many minutes (compute pod spin-up) and may appear to hang.--insecure on auth login, or configure httpsAgentOptions on the target.This skill is a static reference for the SASjs CLI - it provides guidance on using the sasjs command-line tool. It does not execute CLI commands, access the filesystem, read credentials, or make network requests. All commands shown are illustrative; the user must run them in their own environment. References to credential files (.env, ~/.sasjsrc) describe where the CLI stores authentication tokens - this skill does not read, write, or access those files itself.
With streamWeb: true, sasjs web/cbd -t viya deploys the frontend into SAS Files Service: a streaming job at <appLoc>/services/<streamServiceName>.html serves index.html, and assets land in <appLoc>/services/web/.... At build time every asset/script/css URL in the HTML is rewritten to /SASJobExecution?_FILE=<appLoc>/services/web/... and the adapter config element (<sasjs apploc=...>) is stamped with the target appLoc.
Consequence: the app only works when served from the exact appLoc it was deployed against. If the streaming HTML is placed anywhere else (e.g. manually uploaded to a user home folder like /Users/<id>/myapp/...), all rewritten /Public/app/... asset links 404 and the adapter calls the wrong service paths - the page renders with no CSS/JS and no backend. Fix by redeploying. The original build (sasjs cb) has the apploc from the sasjsconfig.json - when the app is deployed as a SAS program, the supplied %let apploc = (runtime value) is swapped with the compiled_apploc (build time value) to allow apps to be dynamically deployed to a given apploc at deploy time.
sasjs auth login -t <target> takes care of the OAuth flow and token storage. If you need the token for curl anyway, mint it from the public secret-less client (sas.ec) via the OAuth password grant on /SASLogon/oauth/token - see the SAS Viya REST auth docs; do not embed real credentials in scripts or command lines.GET /SASJobExecution/?_FILE=<appLoc>/services/<name>.html with Authorization: Bearer -> expect 200 and the full index.html. 401 = auth, anything else = not deployed there.200 with file content -> asset deployed correctly.202 + a tiny plain-text body (e.g. Parameter Error\nFile error) -> file does not exist at that Drive path (classic appLoc-mismatch symptom). Note _FILE responses can be async: add &_action=wait to get content synchronously.POST /SASJobExecution/?_program=<appLoc>/services/<svc>&_action=wait -> Parameter Error / Unable to get job definition means the service was never deployed as a JES job (files on Drive alone are not enough - only sasjs deploy/cbd/servicepack deploy registers them).When executing a SAS service or job for any purpose (debugging, reproduction, CI), always go through the @sasjs/adapter or sasjs CLI - never hand-roll curl against SASJobExecution. The adapter and CLI handle the things that are trivial to get wrong by hand: the input-data CSV format (space-separated name:$format. headers, CRLF, double-quoted special values, %nrstr(...) wrapping), the execution-mode routing (_executionTasks=true reads sasjs<N>data as macro variables, not file uploads), the _debug/>>weboutBEGIN<</>>weboutEND<< wrapper parsing, the token refresh, and the _contextname URL param. A hand-built comma-separated CSV will read as blanks, silently skip guarded macro blocks, and send you down a rabbit hole of phantom bugs.
{ "<table>": [{ "<col>": "<val>", ... }] }, e.g. { "config": [{ "rootdir": "/export/...", "runastask": "true", "usecomputeapi": "null", "contextname": "Compute Reusable" }] }.sasjs request '<appLoc>/services/common/<svc>' -t viya -d data.json -l <path>.log -o <path>.json. The CLI hardcodes debug: true, so the -l flag always captures the full MPRINT/NOTE/&syscc log; -o saves the parsed webout. Always pass -l - reproducing a bug without the log means re-running the whole thing.Authorization: Bearer) for folder/file/member management and for GET /SASJobExecution/?_FILE=... asset checks - just not for executing your own services with input data._contextname=<value> as a URL parameter to every Viya JES request (you do NOT need to pass it yourself). BUT JES request params are NOT auto-promoted to SAS macro variables - %symexist(_contextname) is false inside the service. If the service needs the chosen context name (e.g. to stamp it into the streamed HTML), pass it in the input data table (a contextname column) and read it with call symputx - that is the reliable channel.contextName in sasjsconfig.json decides which compute context the service runs under (and thus the runAs identity). The adapter's URL _contextname param is the same value. To reproduce a service under a batch/reusable context via sasjs request, set the target's contextName to that reusable context (e.g. Compute Reusable, runAs=sasbatch) - otherwise it runs as your own identity and write-test steps to batch-owned folders fail with User does not have appropriate authorization level.NOTE: The infile ... is: RULE in the log correctly): row 1 is the header with name:$informat. pairs space-separated; data rows are comma-separated (CRLF), with values double-quoted only if they contain a special char (,, ", tab, newline). The sasjs/core webout reader reads it back with dsd + firstobs=2 + an input <name>:$informat.; statement derived from the header._executionTasks=true (runAsTask) changes how input data arrives: as sasjs<N>data macro variables (chunked into sasjs<N>data0..N), NOT as _WEBIN_FILE uploads. The core webout mv_webout macro handles both, but it branches on _EXECUTIONTASKS - be aware when reading logs.Re-running sasjs cbd/sasjs run viya.sas against an existing appLoc often fails mid-deploy with 409 Conflict (and an mp_abort -> abort cancel): mv_createfile DELETEs the old file id then tries to recreate it, but when an intermediate folder already exists (e.g. <appLoc>/services/web/js) the recreate step conflicts and the whole deploy aborts - leaving a half-deployed app (services present, some assets missing). The ?recursive=true folder DELETE also returns 409 You cannot delete the folder because it is not empty, and individual member/folder DELETEs can return 403 even as the owner, so you cannot easily tear the tree down by hand.
The reliable workaround is to move the top appLoc folder out of the way and redeploy to the original path - the deploy creates a fresh folder tree with no conflicts, and the old folder is retained as a backup. This is far faster and more reliable than fighting per-member deletes, and is the recommended pre-deploy step for any non-CI redeploy on Viya. Two ways to move it:
PATCH /folders/folders/{id} with {"name":"<old>.bak.<ts>","version":2} - frees the original name, keeps the old folder as a sibling backup./Users/<id>/macrodash-backups, then POST /folders/folders/{backupParentId}/members/{appLocFolderId}?action=move moves the whole tree (with contents) into it, freeing the original path for the fresh deploy.(On sasjs/server just sasjs fs delete the appLoc first - Drive there supports clean recursive deletes.)
JES applies its own CSP header when streaming (includes unsafe-inline/unsafe-eval); a strict CSP meta tag in the app's HTML still applies and is the one that matters for the app code.
© sasjs, 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 .agents/skills/sasjs-cli of sasjs/core.
Open the folder on GitHubat commit b13a83f
Sasjs CLI 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 |
|---|---|---|---|---|---|---|
| Sasjs CLI this skillsasjs/core | 132 | — | ~3.6k | Automated safety check: Notes | MIT | |
| Monitor CInrwl/nx | 29k | 6 repos | ~4.7k | Automated safety check: Pass | MIT | |
| Terraform and OpenTofu Guideagentscope-ai/QwenPaw | 35k | 6 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Analyze GitHub Action Logswithastro/astro | 63k | 1 repos | ~1.3k | Automated safety check: Pass | Custom licence | |
| Azure Pipelines Log Downloaderansible/ansible | 71k | — | ~825 | Automated safety check: Pass | GPL-3.0 | |
| GitHub Actions Templatesbartstc/vite-ts-react-template | 122 | 14 repos | ~1.9k | Automated safety check: Pass | MIT |
nrwl/nx
Monitor Nx Cloud CI pipeline and handle self-healing fixes. An agent skill from nrwl/nx.
agentscope-ai/QwenPaw
Guidance for writing and testing Terraform and OpenTofu code: module structure, naming, test approaches, CI/CD workflows, state handling and security scanning.
withastro/astro
Analyze recent GitHub Actions workflow runs to identify patterns, mistakes, and improvements.
ansible/ansible
Downloads Azure Pipelines CI logs for an Ansible pull request or build so the agent can analyze test failures, after asking you first.
bartstc/vite-ts-react-template
Create production-ready GitHub Actions workflows for automated testing, building, and deploying applications.
ccusage/ccusage
Guides ccusage Nushell scripts. An agent skill from ccusage/ccusage.
sasjs/core
Expert guidance for the SAS programming language - DATA step, PROC SQL, macro language, formats, ODS, and common procedures.
sasjs/core
Frontend/Node integration with SAS backends using @sasjs/adapter - configuring the SASjs class, the exact request() inputs and response shape, authentication, file upload, and session management.
sasjs/core
Standards and conventions for the @sasjs/core SAS macro library (mf, mp, mm, ms, mv macros).
sasjs/core
Building full SASjs applications - project structure, sasjsconfig.json, services/jobs/macros folders, multi-target (SAS 9 / Viya / SASjs server) configuration, streaming frontends, mocks and tests.
sasjs/core
Installing, configuring, and running @sasjs/server - the open-source NodeJS wrapper around the SAS binary that provides a REST API, filesystem (SASjs Drive), Stored Program execution, and web app…
Categories
Using the SASjs CLI (@sasjs/cli) to create, compile, build, deploy, run, and test SASjs projects against SAS 9, Viya, and SASjs server targets. Sasjs CLI is an agent skill from sasjs/core. Using the SASjs CLI (@sasjs/cli) to create, compile, build, deploy, run, and test SASjs projects against SAS 9, Viya, and SASjs server targets.
Sasjs CLI fits situations like: any sasjs <command usage; CI/CD pipelines; target/auth config; sasjsconfig.json.
Run `npx skills add sasjs/core --skill sasjs-cli -a claude-code`. Or copy the skill folder (.agents/skills/sasjs-cli in sasjs/core) into .claude/skills/sasjs-cli in your project. Claude Code loads it when a task matches its description.
Run `npx skills add sasjs/core --skill sasjs-cli -a codex`. Or copy the skill folder (.agents/skills/sasjs-cli in sasjs/core) into .agents/skills/sasjs-cli 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 sasjs/core --skill sasjs-cli -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sasjs-cli, .gemini/skills/sasjs-cli, .github/skills/sasjs-cli and .opencode/skills/sasjs-cli in your project.
Going by SKILL.md and its folder, Sasjs CLI needs the command-line tools its instructions call (npm) and credentials named ACCESS_TOKEN and REFRESH_TOKEN. Our summary lists: Node.js; A credential in ACCESS_TOKEN; A credential in REFRESH_TOKEN.
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 notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Sasjs CLI is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 15k 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 Sasjs CLI: Monitor CI (nrwl/nx, 29k stars), Terraform and OpenTofu Guide (agentscope-ai/QwenPaw, 35k stars), Analyze GitHub Action Logs (withastro/astro, 63k stars) and Azure Pipelines Log Downloader (ansible/ansible, 71k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
sasjs (a GitHub organization) maintains it in sasjs/core, which has 132 GitHub stars. The repository holds 6 skills in this directory. The repository was last updated on October 5, 2026.
Source: sasjs/core on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.