How to Work with Internal Skills Using the `INSTALL_INTERNAL_SKILLS` Environment Variable
Set INSTALL_INTERNAL_SKILLS=1 or INSTALL_INTERNAL_SKILLS=true before running Skills CLI commands to reveal and install skills marked as internal: true in their SKILL.md metadata.
The Skills CLI from vercel-labs/skills filters out internal skills by default to prevent accidental installation of experimental or organization-specific tools. Understanding how to use the INSTALL_INTERNAL_SKILLS environment variable gives you controlled access to these hidden capabilities when needed.
How the INSTALL_INTERNAL_SKILLS Flag Works Internally
The opt-in mechanism is implemented across three layers in the source code: environment detection, skill filtering, and CLI integration.
Environment Variable Detection
In src/skills.ts, the shouldInstallInternalSkills() function parses the environment variable with strict value checking:
// src/skills.ts, lines 14-17
export function shouldInstallInternalSkills(): boolean {
const envValue = process.env.INSTALL_INTERNAL_SKILLS;
return envValue === '1' || envValue === 'true';
}
Only the exact strings '1' or 'true' enable internal skills. Values like 'yes', 'on', 'TRUE', or '0' are treated as disabled.
Skill Filtering Logic
When parsing a SKILL.md file, the code checks the metadata.internal flag against both the environment variable and optional parameters:
// src/skills.ts, lines 46-52
const isInternal = data.metadata?.internal === true;
if (isInternal && !shouldInstallInternalSkills() && !options?.includeInternal) {
return null; // skill omitted from results
}
A skill is excluded only when all three conditions are true: it's marked internal, the environment variable is not set, and no explicit includeInternal option was passed.
CLI-Wide Consistency
All discovery functions—discoverSkills, parseSkillMd, and their callers—share this filtering logic. This ensures uniform behavior across skills list, skills add, and any future commands that enumerate skills.
Setting INSTALL_INTERNAL_SKILLS for Different Scenarios
Choose the method that matches your workflow:
| Scenario | Command or Configuration |
|---|---|
| Single command | Prefix: INSTALL_INTERNAL_SKILLS=1 npx skills list |
| Session-wide | Export: export INSTALL_INTERNAL_SKILLS=1 in shell |
| Permanent | Add export to ~/.bashrc, ~/.zshrc, or ~/.bash_profile |
| Programmatic | Set process.env.INSTALL_INTERNAL_SKILLS = 'true' before API calls |
Practical Code Examples
List All Skills Including Internal Ones
# Show hidden internal skills in the repository
INSTALL_INTERNAL_SKILLS=1 npx skills list
Add a Specific Internal Skill
# "beta-tool" has internal: true in its SKILL.md metadata
INSTALL_INTERNAL_SKILLS=true npx skills add vercel-labs/beta-tool
Enable for Entire Terminal Session
# Add to shell configuration file
echo 'export INSTALL_INTERNAL_SKILLS=1' >> ~/.zshrc
# Or set for current session only
export INSTALL_INTERNAL_SKILLS=1
# Now all skills commands include internal skills
npx skills list
npx skills add some-org/internal-util
Using the Library Programmatically
import { discoverSkills } from './src/skills.js';
// Opt-in via environment before calling discovery
process.env.INSTALL_INTERNAL_SKILLS = 'true';
const skills = await discoverSkills('/path/to/repo');
console.log(skills.map(s => s.name));
// Output includes internal skills
Bypass Environment Variable for Single Call
For one-time inclusion without modifying the environment, pass the includeInternal option:
import { discoverSkills } from './src/skills.js';
const allSkills = await discoverSkills('/path/to/repo', undefined, {
includeInternal: true, // forces inclusion regardless of env
});
// This override is used internally when a user explicitly
// requests a skill by exact name
Key Source Files and Their Roles
| File | Purpose | GitHub Link |
|---|---|---|
src/skills.ts |
Core logic: shouldInstallInternalSkills(), discovery, and filtering |
view |
src/add.test.ts |
Test suite validating environment variable handling (lines 311-333) | view |
README.md |
User documentation mentioning the variable in environment settings | view |
src/add.ts |
CLI command implementation that relies on shared filtering helpers | view |
Summary
- Internal skills are hidden by default when
internal: trueappears inSKILL.mdmetadata - Enable access by setting
INSTALL_INTERNAL_SKILLS=1orINSTALL_INTERNAL_SKILLS=true - Strict parsing in
shouldInstallInternalSkills()rejects all other values - Override per-call with the
includeInternaloption in programmatic usage - Consistent behavior across all CLI commands via shared logic in
src/skills.ts
Frequently Asked Questions
What happens if I set INSTALL_INTERNAL_SKILLS=yes?
The value yes is not recognized as valid. The shouldInstallInternalSkills() function in src/skills.ts explicitly checks for '1' or 'true' only, so internal skills remain hidden. Use INSTALL_INTERNAL_SKILLS=1 or INSTALL_INTERNAL_SKILLS=true instead.
Can I enable internal skills for just one specific command?
Yes. Prefix the command with the environment variable: INSTALL_INTERNAL_SKILLS=1 npx skills list. This sets the variable only for that command execution without affecting your shell session or other commands.
What's the difference between using the environment variable and the includeInternal option?
The environment variable INSTALL_INTERNAL_SKILLS is the user-facing opt-in mechanism for CLI usage. The includeInternal option is a programmatic bypass used in code when calling functions like discoverSkills() directly. The CLI internally uses includeInternal: true when a user explicitly specifies a skill by name, bypassing the need for the environment variable in that specific case.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →