Agent Skill
2/7/2026

share-skill

Push a local skill to the Notion skills database. Load when user mentions "share skill", "export skill", "push to notion", "add skill to database", or after creating a new skill with create-skill.

A
abdullahbeam
2GitHub Stars
1Views
npx skills add abdullahbeam/nexus-design-abdullah

SKILL.md

Nameshare-skill
DescriptionPush a local skill to the Notion skills database. Load when user mentions "share skill", "export skill", "push to notion", "add skill to database", or after creating a new skill with create-skill.

name: share-skill description: Push a local skill to the Notion skills database. Load when user mentions "share skill", "export skill", "push to notion", "add skill to database", or after creating a new skill with create-skill.

Export Skill to Notion

Push a local skill's metadata and file to the Beam Nexus Skills database in Notion.

Purpose

This skill takes a local skill from 03-skills/ and creates a new entry in the company's Notion skills database. It handles:

  • Validating SKILL.md format before upload
  • Reading SKILL.md to extract metadata (including version)
  • Automatically uploading all skill files via JSON bundle
  • Mapping fields to Notion properties
  • MANDATORY user confirmation before pushing
  • Setting Owner from user-config.yaml
  • Inferring appropriate Team (or creating new one)
  • Creating the database entry with file attachment

Typically used after create-skill to share new skills with the company.


CRITICAL RULES

  1. ALWAYS confirm with user before pushing - Never auto-push
  2. ALWAYS set Owner - Use notion_user_id from user-config.yaml
  3. ALWAYS upload the skill file - Use Notion File Upload API (see Step 5)
  4. INFER appropriate Team - Don't default to Solutions. Think about scope:
    • "General" for company-wide utility skills
    • "Solutions" for client-facing/implementation skills
    • "Engineering" for dev tools
    • Create new team if needed
  5. ALWAYS check for duplicates first - Cannot overwrite others' skills
  6. NEVER delete skills from Notion - Deletion must be done manually in Notion UI
  7. Use --as-new for improved versions - Don't overwrite, create new entries

Safeguards

Pre-Flight Check (ALWAYS Run First)

Before ANY export operation, verify Notion setup:

python ../../notion-master/scripts/check_notion_config.py

If configuration missing:

Expected output if configured:

✅ ALL CHECKS PASSED
You're ready to use Notion skills

SKILL.md Validation

The upload script automatically validates SKILL.md before uploading:

[INFO] Validating SKILL.md...
[OK] SKILL.md valid

Validation checks:

  • YAML frontmatter exists (starts with ---)
  • Required fields present: name, description
  • Description contains trigger phrases (contains "when")
  • Version format is valid (semantic versioning: 1.0, 1.0.0)

If validation fails:

[ERROR] SKILL.md validation failed:
  ✗ Missing required field: description
  ✗ Description should include trigger phrases

Fix these issues or use --skip-validation to bypass.

Duplicate Detection

When skill name already exists in Notion:

[ERROR] Skill 'my-skill' already exists in Notion!
  Owner: Jack Li
  Version: 1.0
  URL: https://notion.so/my-skill-abc123

Options:
  1. Use --as-new "new-name" to upload as improved version
  2. Delete existing skill in Notion first

No overwriting allowed - This prevents accidental data loss and maintains clear ownership.

Prohibited Operations

OperationStatusNotes
Create new skill✅ AllowedWith confirmation
Create improved version✅ AllowedUse --as-new flag
Overwrite existing❌ BlockedMust delete in Notion first
Delete any skill❌ BlockedMust use Notion UI
Bulk push❌ BlockedOne at a time only

Workflow

Step 1: Read Local Skill

# Get skill metadata from SKILL.md
cat 03-skills/{skill-name}/SKILL.md

Extract from YAML header:

  • name → Skill Name
  • description → Description
  • version → Version (defaults to 1.0)

Extract from content:

  • Purpose section → Purpose field

Step 2: Prepare Skill Bundle

The upload script automatically creates a JSON bundle containing all skill files:

  • SKILL.md (required)
  • scripts/ folder (optional)
  • references/ folder (optional)
  • assets/ folder (optional)

Bundle format: {skill-name}.skill.json

{
  "skill_name": "my-skill",
  "version": "1.0",
  "bundle_format": "nexus-skill-bundle-v1",
  "created": "2025-12-10",
  "files": {
    "SKILL.md": "<base64-encoded content>",
    "scripts/script.py": "<base64-encoded content>",
    "references/guide.md": "<base64-encoded content>"
  }
}

Note: Notion File Upload API doesn't support .zip files, so we use JSON with base64-encoded file contents. This preserves the full skill structure including scripts and references.

Step 3: Infer Team and Gather Info

AI should infer the Team based on skill purpose:

  • General: Utility skills usable by anyone (query tools, import/export, etc.)
  • Solutions: Client implementation, onboarding, customer-facing
  • Engineering: Developer tools, CI/CD, testing
  • Sales: Sales-specific workflows
  • Other: Ask user if unclear

Present inference to user for confirmation:

Based on the skill's purpose, I suggest Team: "General"
(This is a utility skill for querying Notion databases)

Is this correct, or would you prefer a different team?

Step 4: Preview Before Push (MANDATORY)

Use --dry-run to preview without uploading:

python ../../notion-master/scripts/upload_skill.py 03-skills/{skill-name} --team General --dry-run

Output:

==================================================
[PREVIEW] Upload Summary
==================================================
  Skill Name:  my-skill
  Version:     1.0
  Team:        General
  Owner:       Fredrik Falk
  Bundle:      my-skill.skill.json
  Size:        4,521 bytes
  Files:       3
==================================================

[DRY-RUN] No changes made. Remove --dry-run to upload.

WAIT FOR USER CONFIRMATION BEFORE PROCEEDING

Step 5: Create Notion Entry with File

Use the upload script:

python ../../notion-master/scripts/upload_skill.py 03-skills/{skill-name} --team General

Optional parameters:

# With integrations
python ../../notion-master/scripts/upload_skill.py 03-skills/my-skill --team General --integration "Beam AI,Linear"

# Dry run (preview without uploading)
python ../../notion-master/scripts/upload_skill.py 03-skills/my-skill --team General --dry-run

# Upload as new skill with different name (for improved versions)
python ../../notion-master/scripts/upload_skill.py 03-skills/my-skill --team General --as-new "my-skill-enhanced"

# Skip validation (not recommended)
python ../../notion-master/scripts/upload_skill.py 03-skills/my-skill --team General --skip-validation

The script handles:

  1. Validating SKILL.md format
  2. Reading SKILL.md metadata (including version)
  3. Checking for duplicates
  4. Creating JSON bundle with all files
  5. Creating file upload object
  6. Uploading file content
  7. Creating database entry with attachment

Step 6: Confirm Success

✅ Skill pushed to Notion!

📄 Skill Name: {skill-name}
📊 Version: 1.0
🔗 Notion URL: {url}
👥 Owner: {owner-name}
📁 Team: {team}
📎 Files in bundle: 3

The skill is now discoverable by anyone at Beam AI.

Version Tracking

Add version to SKILL.md frontmatter:

---
name: my-skill
description: Load when user says "do the thing"...
version: 1.0
---

Version Format Standard

Format: MAJOR.MINOR or MAJOR.MINOR.PATCH

ValidInvalid
1.0v1.0 (no "v" prefix)
1.11 (needs MAJOR.MINOR)
2.0latest (must be numeric)
1.0.01.0.0.0 (too many segments)

When to Increment

Change TypeVersion BumpExample
Bug fixes, typosIncrement MINOR1.01.1
Minor improvementsIncrement MINOR1.11.2
New features addedIncrement MINOR1.21.3
Breaking changesIncrement MAJOR1.x2.0
Complete rewriteIncrement MAJOR2.x3.0

Version Tracking Locations

Version is tracked in 3 places:

  1. SKILL.md frontmatter - Source of truth (version: field)
  2. JSON bundle - Embedded in upload ("version": "1.0")
  3. Notion database - Displayed in Version column

Uploading Improved Versions

For significant improvements, use --as-new:

python upload_skill.py 03-skills/my-skill --team General --as-new "my-skill-v2"

This creates a new database entry rather than overwriting (which is blocked).


Field Mapping

See complete database schema:

Quick reference:

Local (SKILL.md)Notion PropertyTypeRequiredNotes
name: in YAMLSkill NametitleYes
description: in YAMLDescriptionrich_textYes
version: in YAMLVersionrich_textYesDefaults to 1.0
Purpose sectionPurposerich_textNoExtract from ## Purpose
AI infers + user confirmsTeamselectYesCreate if doesn't exist
AI infers from contentIntegrationmulti_selectNoBeam AI, Linear, Notion, etc.
user-config.yamlOwnerpeopleYesnotion_user_id
Today's dateCreateddateYesAuto-set
JSON bundleSkillfilesYesAuto-uploaded via File Upload API

Configuration

From .env:

  • NOTION_API_KEY - Your Notion integration token
  • NOTION_SKILLS_DB_ID - Database ID: 2bc2cadf-bbbc-80be-af8a-d45dfc8dfa2e

From user-config.yaml:

  • notion_user_id - Your Notion user ID for Owner field
  • notion_user_name - Display name

Available Teams (can create new):

  • General (for utility/company-wide skills)
  • Solutions (for client-facing skills)
  • Engineering (for dev tools)
  • Sales (for sales workflows)

Available Integrations:

  • Beam AI
  • Linear
  • Notion

Team Inference Rules

Skill TypeSuggested TeamReasoning
Query/import/export toolsGeneralUsed by everyone
Notion/Linear integrationsGeneralCross-functional
Client onboardingSolutionsClient-facing
Agent building/testingSolutionsImplementation work
CI/CD, testing toolsEngineeringDev-focused
Proposal generatorsSalesSales-specific
UnknownAsk userWhen unclear

Example Usage

Export a New Skill

User: "Push query-notion-db to Notion"

AI: [Validates SKILL.md - passes]
    [Checks for duplicates - none found]

    Based on the skill's purpose (querying Notion databases for any use),
    I suggest Team: "General"

    This is a utility skill that anyone at Beam AI could use.
    Is this correct? (yes/no/specify different)

User: "yes"

AI: Running dry-run preview...

    ==================================================
    [PREVIEW] Upload Summary
    ==================================================
      Skill Name:  query-notion-db
      Version:     1.0
      Team:        General
      Owner:       Fredrik Falk
      Bundle:      query-notion-db.skill.json
      Size:        4,521 bytes
      Files:       2
    ==================================================

    Do you want to push this to Notion? (yes/no)

User: "yes"

AI: ✅ Skill pushed to Notion!
    📄 Skill Name: query-notion-db
    📊 Version: 1.0
    🔗 https://notion.so/query-notion-db-abc123
    👥 Owner: Fredrik Falk
    📁 Team: General

Export Improved Version of Existing Skill

User: "Push my improved version of setup-linear-onboarding-template"

AI: [Validates SKILL.md - passes]
    [Checks for duplicates]

    ⚠️ Skill "setup-linear-onboarding-template" already exists in Notion!
      Owner: Jack Li
      Version: 1.0

    Since you've made improvements, I recommend uploading as a new skill.
    Suggested name: "setup-linear-onboarding-template-enhanced"

    Would you like to:
    1. Upload as "setup-linear-onboarding-template-enhanced"
    2. Choose a different name
    3. Cancel

User: "1"

AI: ✅ Skill pushed to Notion!
    📄 Skill Name: setup-linear-onboarding-template-enhanced
    📊 Version: 1.0
    🔗 https://notion.so/setup-linear-onboarding-template-enhanced-def456

Error Handling

Common errors:

ErrorCauseSolution
401 UnauthorizedInvalid API keyCheck NOTION_API_KEY in .env
400 Bad RequestInvalid property formatCheck field mapping
Skill already existsDuplicate in NotionUse --as-new or delete in Notion
Missing notion_user_idNot in user-config.yamlPrompt to add it
Missing SKILL.mdInvalid skill pathVerify path
Validation failedInvalid SKILL.md formatFix issues or use --skip-validation

For detailed troubleshooting:


Notes

  • File upload: Uses Notion's File Upload API (3-step process: create upload object → send file → attach to page). Skills are packaged as JSON bundles (.skill.json) containing all files with base64-encoded contents. This preserves the complete skill structure including scripts/, references/, and assets/ folders.
  • Validation: SKILL.md is validated before upload. Use --skip-validation to bypass (not recommended).
  • Dry-run: Use --dry-run to preview what would be uploaded without actually pushing.
  • Improved versions: Use --as-new "new-name" to upload improved versions without overwriting.
  • Version tracking: Add version: to SKILL.md frontmatter. Tracked in bundle AND Notion.
  • New teams auto-create: If you specify a team that doesn't exist, Notion will create it automatically.
  • Owner is mandatory: Always set from user-config.yaml to maintain audit trail.
  • Always confirm: Never push without explicit user approval.

Additional References

For more details:

Skills Info
Original Name:share-skillAuthor:abdullahbeam