Agent skill

Sas

by sasjs in sasjs/core

Expert guidance for the SAS programming language - DATA step, PROC SQL, macro language, formats, ODS, and common procedures.

MITAuto-check passedDevelopment

Install Sas

skills CLI
$ npx skills add sasjs/core --skill sas -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install sasjs/core sas --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/sasjs/core.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/sas .claude/skills/sas && rm -rf skills-src

Use ~/.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/

Facts

Skill name
sas
GitHub stars
132
Token cost
~3.1k tokens
SKILL.md length
1,418 words
Files
1
Skills in repo
6
Repo updated
First seen
Licence
MIT

At a glance

Expert guidance for the SAS programming language - DATA step, PROC SQL, macro language, formats, ODS, and common procedures.

  • Works in 5 steps: Analyze the request. Identify the… → Draft the code. Write the minimum… → Run it (or describe the run). If a SAS… → …
  • Debugging .sas programs
  • SKILL.md covers Scope, Workflow, Non-negotiable: no WARNINGs and Style rules, plus 4 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Sas is an agent skill from sasjs/core. Expert guidance for the SAS programming language - DATA step, PROC SQL, macro language, formats, ODS, and common procedures. Pure SAS syntax only, no SASjs-framework content. Use when writing, reviewing, or debugging .sas programs, or answering SAS language questions.

Its SKILL.md is about 3.1k 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 Development, covering SQL. It works with SQL. The repository describes itself as: Macros for SAS® App Developers. The licence is MIT.

When your agent uses it

  • Debugging .sas programs
  • Answering SAS language questions

Example prompts

  • “/sas”

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. Analyze the request. Identify the input(s): datasets, columns, macro variables, platform (SAS 9 vs Viya). Note the desired output: a…
  2. Draft the code. Write the minimum correct program following the Style rules below. Use 2-level dataset names, explicit length for…
  3. Run it (or describe the run). If a SAS session is available, submit and capture the log. If not, trace the code mentally against the…
  4. Inspect the log. Treat any WARNING: or ERROR: as a defect to fix, not a note to ignore. Common culprits: uninitialized variables, implicit…
  5. Review against pitfalls. Re-read the final code against the Common pitfalls list before returning it. Fix or annotate anything flagged.

What it can do on your machine

Read from SKILL.md and the folder at commit b13a83f. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are sas).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Sas loads about 3.1k tokens when it runs. Until then it costs about 68 tokens; SKILL.md has 1,418 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~68
When it runs · the whole SKILL.md, loaded when a task matches
~3.1k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from sasjs/core at commit b13a83f, republished under its MIT licence (© sasjs). 1,418 words, ~3,101 tokens.

Download SKILL.mdSave it as .claude/skills/sas/SKILL.md (or your agent's skills folder).
name
sas
description
Expert guidance for the SAS programming language - DATA step, PROC SQL, macro language, formats, ODS, and common procedures. Pure SAS syntax only, no SASjs-framework content. Use when writing, reviewing, or debugging .sas programs, or answering SAS language questions.
license
MIT
copyright
Copyright (c) SASjs
spdx-license-identifier
MIT

SAS Language

<!-- SPDX-License-Identifier: MIT -->
<!-- Style rules derived from the @sasjs/core coding standards (https://github.com/sasjs/core), MIT licensed. -->

Write idiomatic, production-quality SAS code. This skill covers the SAS language itself, independent of any framework.

Scope

  • DATA step programming (SET/MERGE/BY, RETAIN, arrays, DO loops, hash objects, first./last. processing)
  • PROC SQL (joins, subqueries, views, pass-through with CONNECT TO)
  • Macro language (%macro/%mend, macro variables, %local/%global, conditional %IF logic, quoting functions %STR/%NRSTR/%BQUOTE, CALL SYMPUTX)
  • Common PROCs: SORT, MEANS/SUMMARY, FREQ, TRANSPOSE, REPORT, PRINT, CONTENTS, DATASETS, FORMAT, IMPORT/EXPORT
  • Formats and informats (user-defined via PROC FORMAT, picture formats)
  • ODS output (HTML, PDF, RTF, Excel, OUTPUT destination)
  • File I/O: LIBNAME, FILENAME, INFILE/INPUT, FILE/PUT

Workflow

Apply this loop to every request that produces SAS code - new program, edit, or debug:

  1. Analyze the request. Identify the input(s): datasets, columns, macro variables, platform (SAS 9 vs Viya). Note the desired output: a dataset, a report (ODS), a macro variable, a file. If the request is ambiguous, state your assumption and proceed.
  2. Draft the code. Write the minimum correct program following the Style rules below. Use 2-level dataset names, explicit length for character variables, %local inside macros, and quit; for proc sql. Prefer proc sort nodupkey over hand-rolled dedup.
  3. Run it (or describe the run). If a SAS session is available, submit and capture the log. If not, trace the code mentally against the Common pitfalls list - call out any step you could not verify.
  4. Inspect the log. Treat any WARNING: or ERROR: as a defect to fix, not a note to ignore. Common culprits: uninitialized variables, implicit numeric->character conversion, truncation from implicit length=8, "no observations", unresolved macro references, read-only automatic macro variables. Superfluous NOTEs should also be trimmed where reasonable.
  5. Review against pitfalls. Re-read the final code against the Common pitfalls list before returning it. Fix or annotate anything flagged.

Inputs: a request (natural language or a .sas file), optionally sample data or a log excerpt. Outputs: idiomatic SAS code (2-space indented, run;/quit; terminated) plus, when useful, a short note on any pitfall addressed or assumption made. Verification: the returned code passes a mental log-scan with zero WARNING/ERROR, and a real run (when available) produces a clean log.

Non-negotiable: no WARNINGs

Generated SAS code must run cleanly - zero WARNINGs (and zero ERRORs) in the log. Treat every WARNING: as a defect: uninitialized variables, implicit type conversions, truncation notes that should be warnings, "no observations", unresolved macro references, etc. If a warning is truly unavoidable, suppress it deliberately (e.g. an explicit option) and comment why. Likewise avoid superfluous NOTEs where reasonable.

Style rules

These follow the @sasjs/core coding standards - apply them to all SAS code:

  • One statement per line; indentation = 2 spaces, no tabs, no trailing whitespace
  • Consolidate multi-operand statements - %local/%global, length, attrib, retain, array, format/informat, label, keep/drop, var, rename - into a single statement listing all operands. Never split into duplicate statements (two %local lines, two length statements, etc.) just to stay under the line limit; if the line exceeds it, wrap to the next line - the statement ends at the semicolon, so continuation lines are free.
  • Lines no longer than 80 characters; unix (LF) line endings; UTF-8
  • Avoid non-ASCII / special characters entirely - maximum compatibility across SAS installations and encodings
  • Always end steps with run;; for proc sql (and CAS-connected procs) quit; is essential to avoid WARNING: You cannot disconnect or terminate session ... on Viya
  • All dataset references must be 2-level (work.blah, not blah) - protects against DATASTMTCHK=ALLKEYWORDS and an active USER library
  • Explicit length / attrib for character variables rather than relying on defaults (avoids implicit length=8 truncation)
  • Use literal suffixes for clarity ('01JAN2020'd, '12:30't)
  • Prefer proc sort with nodupkey over manual dedup logic
  • Macros:
    • Define with parentheses, even with no parameters: %macro x(); not %macro x;
    • Closing %mend; must repeat the macro name
    • Macro calls are not terminated with a semicolon: %my_macro() not %my_macro();
    • Mandatory parameters positional; optional parameters keyword (var=) style
    • Macro names lowercase, verb-noun convention
    • Macro variables without trailing dot (&var not &var.) unless needed to prevent incorrect resolution
    • Macro variable NAMES are case-insensitive: &Foo, &FOO, and &foo all resolve to the same symbol (same for %symexist/%superq/symget arguments, which take a NAME not a value). Don't chase case mismatches as a bug - it's never the cause.
    • ALL macro variables must be %local unless deliberately global (globals should use an application prefix to avoid collisions); use call symputx (not symput) in DATA steps
    • Comment with /* */ inside macros (asterisk comments are compiled into the macro)
    • Guard macro logic with %length(&var)=0 checks rather than &var= (empty comparisons are unsafe)
  • Avoid naming collisions: use %sysfunc-/&syslast-based work tables (e.g. data &output; set &syslast; run;) rather than hard-coded names
  • WORK library is auto-cleared on session termination: SAS deletes every table in WORK when the session ends, so explicit cleanup (proc datasets lib=work nolist; delete ...; quit;) is not required for ordinary temporary tables - do not add it, and do not flag its absence as a defect in review. Clean up explicitly only when temp files are large or voluminous enough to risk disk pressure mid-run; in that case, drop them as soon as they are no longer needed rather than leaving them for end-of-session disposal.
  • No open (non-macro) conditional code: wrap platform-branching or conditionally-executed blocks (e.g. %if %mf_getplatform()=VIYA %then %do; ... %end;) in a %macro ... %mend and invoke the macro. Open %if at program level fails in some execution contexts (job/scheduler/test harnesses) and hides scope leaks.
Show full SKILL.md (541 more words)Show less

Portability awareness

  • Note when code differs between SAS 9.4 and Viya (e.g. CAS actions vs procs, proc casutil for sashdat loading, no X command on locked-down servers)
  • Avoid hard-coded physical paths and engine-specific options unless asked
  • No open macro code with if/else logic: wrap branching blocks in %macro ... %mend and call them - open %if/%else does not behave as expected in all SAS environments.

Before / after examples

Each pair shows a common WARNING- or defect-prone pattern and the idiomatic fix, with the log issue it addresses.

DATA step: uninitialized variable + implicit length truncation

Before - region is referenced but never assigned or brought in via set, so the log shows WARNING: Variable region is uninitialized; and name inherits the length of first_name from the source (often $8), silently truncating the concatenated value:

sas
data work.customers;
  set work.source;
  region = upcase(region);                 /* region not in work.source */
  name = catx(' ', first_name, last_name); /* truncated to source length of name */
run;

After - region is brought in via set (or explicitly assigned), and an explicit length before set widens name so catx is not truncated:

sas
data work.customers;
  length name $ 50;
  set work.source;                          /* region must exist in work.source */
  region = upcase(region);
  name = catx(' ', first_name, last_name);
run;
PROC SQL: implicit conversion + cartesian product

Before - joining on character id vs numeric cust_id triggers NOTE: Character values have been converted to numeric (or a WARNING under some options), and the missing join key risks a cartesian blow-up:

sas
proc sql;
  create table work.joined as
  select a.*, b.balance
  from work.orders a, work.accounts b
  where a.id = b.cust_id;
quit;

After - explicit length/cast so types match, explicit inner join, and a guard against the cartesian if keys are missing:

sas
proc sql;
  create table work.joined as
  select a.id, a.amount, b.balance
  from work.orders as a
  inner join work.accounts as b
    on a.id = input(b.cust_id, 8.) /* explicit cast; or fix upstream length */
  ;
quit;

If a key column legitimately has duplicates on both sides, aggregate or dedup first - never rely on an accidental 1:1 join.

Macro: missing %local + unsafe empty check

Before - %let inside the macro creates dsid in global scope (no %local), and %if &filter= is unsafe - when &filter is empty it resolves to %if = %then, a syntax error rather than a clean branch:

sas
%macro apply_filter(filter=);
  %if &filter= %then %do;
    data work.out; set work.in; run;
  %end;
  %else %do;
    data work.out; set work.in; where &filter; run;
  %end;
  %let dsid = &syslast;
%mend apply_filter;

After - %local dsid keeps the temp variable in macro scope, %length(&filter)=0 guards the empty check safely, parentheses on the macro definition, and %mend repeats the name:

sas
%macro apply_filter(filter=);
  %local dsid;
  %if %length(&filter)=0 %then %do;
    data work.out; set work.in; run;
  %end;
  %else %do;
    data work.out; set work.in; where &filter; run;
  %end;
  %let dsid = &syslast;
%mend apply_filter;
Multi-operand statements: one statement, not duplicates

Before - two %local statements and two length statements for related operands. This is needless repetition; the operands belong in a single declaration:

sas
%local dbg libref1 libref2 loglocation fname1 fname2;
%local jobstate err_httpcode err_msg;

data work.staged;
  length customer_id 8;
  length customer_name $ 50;
  set work.source;
run;

After - consolidate each group into one statement; wrap to a continuation line when the single statement exceeds 80 chars (the statement ends at the semicolon, so wrapped lines are free):

sas
%local dbg libref1 libref2 loglocation fname1 fname2
       jobstate err_httpcode err_msg;

data work.staged;
  length customer_id 8 customer_name $ 50;
  set work.source;
run;

This applies to every statement that accepts a list of operands - %local/%global, length, attrib, retain, array, format/informat, label, keep/drop, var, rename.

Common pitfalls to flag when reviewing

  • Unintended many-to-many MERGEs
  • Automatic variable _ERROR_ / implicit RETAIN surprises
  • Macro timing issues: referencing &macrovar before it exists, %if evaluating data-step variables (use if/symget instead)
  • Automatic macro variables (&syscc, &syswarningtext, &syserrortext, &sysdate, &sysuserid, etc.) are READ-ONLY - attempting to overwrite them (e.g. %let syswarningtext=; or call symput('syscc',...)) raises ERROR: Unable to assign value to a macro variable that is read only (or similar). Never try to "clear" them.
  • Truncation from implicit length=8 on first assignment
  • proc sql cartesian product warnings

Limitations

This skill is a static language reference - it provides guidance for writing and reviewing SAS code. It does not execute SAS code, run shell commands, access the filesystem, connect to databases, or make network requests. All code examples are illustrative and must be submitted to a SAS session by the user. Terms like "File I/O", "PROC SQL", "command", and "execution" refer to SAS language concepts (file-handling statements, SQL procedure, macro execution contexts), not to operating-system-level operations performed by this skill.

© sasjs, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/sas of sasjs/core.

Open the folder on GitHubat commit b13a83f

Compare with similar skills

Sas 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.

Sas compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Sas this skillsasjs/core132—~3.1kAutomated safety check: PassMIT
Code Nest Project Specxiaou61/Code-Nest770—~1.3kAutomated safety check: PassMIT
Protheus Data Dictionary Lookuptotvs/engpro-advpl-tlpp-skills143—~1.5kAutomated safety check: PassMIT
Android Profilerarindamxd/camerax-android1322 repos~493Automated safety check: PassApache-2.0
Frappe Errors HooksImpertio-Studio/Frappe_Claude_Skill_Package187—~3.9kAutomated safety check: PassMIT
SQL Root Cause Analysiszj-unicom-ai/UniEmployee358—~433Automated safety check: PassMIT

Similar skills

  • Code Nest Project Spec

    xiaou61/Code-Nest

    Code-Nest 多模块全栈项目协作规范与落点导航。Use when modifying this repository for feature development, bug fixing, refactor, API change, SQL migration, or frontend-backend联调 so changes land in the correct module…

    770 GitHub stars~1.3k tokensUpdated today
    DevelopmentAuto-check passed
  • Protheus Data Dictionary Lookup

    totvs/engpro-advpl-tlpp-skills

    Queries the TOTVS Protheus ERP data dictionary for tables, fields, indexes, parameters, triggers and lookups, including impact checks during refactoring.

    143 GitHub stars~1.5k tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Android Profiler

    arindamxd/camerax-android

    Manages Android performance profiling and debugging. An agent skill from arindamxd/camerax-android.

    132 GitHub starsUsed in 2 repos~493 tokens
    DevelopmentAuto-check passed
  • Frappe Errors Hooks

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when debugging hooks.py errors in Frappe/ERPNext.

    187 GitHub stars~3.9k tokensUpdated 21 days ago
    DevelopmentAuto-check passed
  • SQL Root Cause Analysis

    zj-unicom-ai/UniEmployee

    SQL 版归因分析技能。当用户问为什么、指标异常、趋势下滑/增长、KPI 未达标、营收/订单/转化/成本波动时使用. An agent skill from zj-unicom-ai/UniEmployee.

    358 GitHub stars~433 tokensUpdated today
    DevelopmentAuto-check passed
  • External Mindstudio Ascend Profiler DB Explorer

    ascend-ai-coding/awesome-ascend-skills

    面向 Ascend PyTorch Profiler / msprof DB(如 ascendpytorchprofiler.db、msprof.db)的 SQL 分析技能。将自然语言问题(算子耗时、通信、下发、调度、schema/table 查询)转为安全可执行 SQL,并按需从官方文档提取表结构详情。

    174 GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check passed

More from sasjs/core

  • Sasjs Adapter

    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.

    132 GitHub stars~2.6k tokensUpdated 3 days ago
    Auto-check passed
  • Sasjs CLI

    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.

    132 GitHub stars~3.6k tokensUpdated 3 days ago
    Auto-check: notes
  • Sasjs Core

    sasjs/core

    Standards and conventions for the @sasjs/core SAS macro library (mf, mp, mm, ms, mv macros).

    132 GitHub stars~1.2k tokensUpdated 3 days ago
    Auto-check passed
  • Sasjs Framework

    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.

    132 GitHub stars~2.4k tokensUpdated 3 days ago
    Auto-check passed
  • Sasjs Server

    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…

    132 GitHub stars~2.4k tokensUpdated 3 days ago
    Auto-check: notes

Works with

Questions about Sas

What does Sas do?

Expert guidance for the SAS programming language - DATA step, PROC SQL, macro language, formats, ODS, and common procedures. Sas is an agent skill from sasjs/core. Expert guidance for the SAS programming language - DATA step, PROC SQL, macro language, formats, ODS, and common procedures.

When should I use Sas?

Sas fits situations like: debugging .sas programs; answering SAS language questions.

How do I install Sas in Claude Code?

Run `npx skills add sasjs/core --skill sas -a claude-code`. Or copy the skill folder (.agents/skills/sas in sasjs/core) into .claude/skills/sas in your project. Claude Code loads it when a task matches its description.

How do I install Sas in Codex?

Run `npx skills add sasjs/core --skill sas -a codex`. Or copy the skill folder (.agents/skills/sas in sasjs/core) into .agents/skills/sas in your project. Codex loads it when a task matches its description.

Can I use Sas in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add sasjs/core --skill sas -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sas, .gemini/skills/sas, .github/skills/sas and .opencode/skills/sas in your project.

What does Sas need to run?

SKILL.md names no scripts, command-line tools or credentials: Sas is instructions for the agent only.

Does Sas access the network?

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.

Is Sas safe to install?

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.

What licence does Sas use?

Sas is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Sas use?

About 3.1k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Sas?

Skills that share tags, products or a category with Sas: Code Nest Project Spec (xiaou61/Code-Nest, 770 stars), Protheus Data Dictionary Lookup (totvs/engpro-advpl-tlpp-skills, 143 stars), Android Profiler (arindamxd/camerax-android, 132 stars) and Frappe Errors Hooks (Impertio-Studio/Frappe_Claude_Skill_Package, 187 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Sas?

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.