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…
Expert guidance for the SAS programming language - DATA step, PROC SQL, macro language, formats, ODS, and common procedures.
$ npx skills add sasjs/core --skill sas -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install sasjs/core sas --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/sas .claude/skills/sas && 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 "sas" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sas into .claude/skills/sas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sas", 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/sasType 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 sas -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install sasjs/core sas --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/sas .agents/skills/sas && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "sas" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sas into .agents/skills/sas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sas", 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 sas -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install sasjs/core sas --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/sas .cursor/skills/sas && 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 "sas" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sas into .cursor/skills/sas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sas", 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/sas--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 sas -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install sasjs/core sas --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/sas .gemini/skills/sas && 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 "sas" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sas into .gemini/skills/sas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sas", 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 sasInstalls 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 sas -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/sas .github/skills/sas && 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 "sas" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sas into .github/skills/sas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sas", 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 sas -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 sas --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/sas .opencode/skills/sas && 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 "sas" agent skill from https://github.com/sasjs/core/tree/main/.agents/skills/sas into .opencode/skills/sas/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sas", 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.
sasExpert 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. 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.
5 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.
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.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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 sasjs/core at commit b13a83f, republished under its MIT licence (© sasjs). 1,418 words, ~3,101 tokens.
.claude/skills/sas/SKILL.md (or your agent's skills folder).<!-- 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.
Apply this loop to every request that produces SAS code - new program, edit, or debug:
length for character variables, %local inside macros, and quit; for proc sql. Prefer proc sort nodupkey over hand-rolled dedup.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.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.
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.
These follow the @sasjs/core coding standards - apply them to all SAS code:
%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.run;; for proc sql (and CAS-connected procs) quit; is essential to avoid WARNING: You cannot disconnect or terminate session ... on Viyawork.blah, not blah) - protects against DATASTMTCHK=ALLKEYWORDS and an active USER librarylength / attrib for character variables rather than relying on defaults (avoids implicit length=8 truncation)'01JAN2020'd, '12:30't)proc sort with nodupkey over manual dedup logic%macro x(); not %macro x;%mend; must repeat the macro name%my_macro() not %my_macro();var=) style&var not &var.) unless needed to prevent incorrect resolution&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.%local unless deliberately global (globals should use an application prefix to avoid collisions); use call symputx (not symput) in DATA steps/* */ inside macros (asterisk comments are compiled into the macro)%length(&var)=0 checks rather than &var= (empty comparisons are unsafe)%sysfunc-/&syslast-based work tables (e.g. data &output; set &syslast; run;) rather than hard-coded namesproc 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.%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.proc casutil for sashdat loading, no X command on locked-down servers)%macro ... %mend and call them - open %if/%else does not behave as expected in all SAS environments.Each pair shows a common WARNING- or defect-prone pattern and the idiomatic fix, with the log issue it addresses.
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:
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:
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;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:
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:
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.
%local + unsafe empty checkBefore - %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:
%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:
%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;Before - two %local statements and two length statements for related operands. This is needless repetition; the operands belong in a single declaration:
%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):
%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.
_ERROR_ / implicit RETAIN surprises¯ovar before it exists, %if evaluating data-step variables (use if/symget instead)&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.proc sql cartesian product warningsThis 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
Just SKILL.md in .agents/skills/sas of sasjs/core.
Open the folder on GitHubat commit b13a83f
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Sas this skillsasjs/core | 132 | — | ~3.1k | Automated safety check: Pass | MIT | |
| Code Nest Project Specxiaou61/Code-Nest | 770 | — | ~1.3k | Automated safety check: Pass | MIT | |
| Protheus Data Dictionary Lookuptotvs/engpro-advpl-tlpp-skills | 143 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Android Profilerarindamxd/camerax-android | 132 | 2 repos | ~493 | Automated safety check: Pass | Apache-2.0 | |
| Frappe Errors HooksImpertio-Studio/Frappe_Claude_Skill_Package | 187 | — | ~3.9k | Automated safety check: Pass | MIT | |
| SQL Root Cause Analysiszj-unicom-ai/UniEmployee | 358 | — | ~433 | Automated safety check: Pass | MIT |
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…
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.
arindamxd/camerax-android
Manages Android performance profiling and debugging. An agent skill from arindamxd/camerax-android.
Impertio-Studio/Frappe_Claude_Skill_Package
A skill your agent uses when debugging hooks.py errors in Frappe/ERPNext.
zj-unicom-ai/UniEmployee
SQL 版归因分析技能。当用户问为什么、指标异常、趋势下滑/增长、KPI 未达标、营收/订单/转化/成本波动时使用. An agent skill from zj-unicom-ai/UniEmployee.
ascend-ai-coding/awesome-ascend-skills
面向 Ascend PyTorch Profiler / msprof DB(如 ascendpytorchprofiler.db、msprof.db)的 SQL 分析技能。将自然语言问题(算子耗时、通信、下发、调度、schema/table 查询)转为安全可执行 SQL,并按需从官方文档提取表结构详情。
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
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/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…
Works with
Categories
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.
Sas fits situations like: debugging .sas programs; answering SAS language questions.
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.
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.
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.
SKILL.md names no scripts, command-line tools or credentials: Sas is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Sas is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
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.
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.
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.