✦ ✦
✧ ███████╗██████╗ ███╗ ██╗ ██████╗██╗ ██╗ ✧
· ██╔════╝██╔══██╗████╗ ██║ ██╔════╝██║ ██║ ·
███████╗██████╔╝██╔██╗ ██║ ██║ ██║ ██║
· ╚════██║██╔═══╝ ██║╚██╗██║ ██║ ██║ ██║ ·
✧ ███████║██║ ██║ ╚████║ ╚██████╗███████╗██║ ✧
╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═════╝╚══════╝╚═╝
✦ ✦
🌟 SuperNovae CLI
The Agentic AI Toolkit
✨ Local models • MCP servers • LLM providers • Secrets • Status Dashboard ✨
spn — The Agentic AI Toolkit Local models, MCP servers, LLM providers, and secrets. Works with Ollama, Claude, OpenAI, and any AI editor (Claude Code, Cursor, Windsurf, Continue.dev).
╔═══════════════════════════════════════════════════════════════════════╗
║ ║
║ 🌟 "The Agentic AI Toolkit" ║
║ ║
║ • 7 LLM providers • Any AI editor ║
║ • 48 MCP server aliases • OS Keychain secrets ║
║ • Ollama model manager • Status dashboard ║
║ • Nika direct integration • Open source first ║
║ ║
╚═══════════════════════════════════════════════════════════════════════╝
✨ Highlights
- 🦙 Open Source First — Works with Ollama, Continue.dev, and local models out of the box
- 🤖 7 LLM Providers — Claude, OpenAI, Mistral, Groq, DeepSeek, Gemini, Ollama
- 🦋 Nika Direct Integration — MCP configs read directly from
~/.spn/mcp.yaml(no sync needed) - 📦 Rich Ecosystem — 48 MCP server aliases, 57K+ skills from skills.sh
- 🔐 Secure by Design — OS Keychain integration with memory protection
- ⚡ Cargo-style Index — Sparse registry for lightning-fast package resolution
- 🎯 Three-Level Config — Global/Team/Local scope hierarchy (like git)
- 🔄 Universal Sync — Claude Code, Cursor, Windsurf, VS Code — any AI editor
📑 Table of Contents
- Installation
- Quick Start
- Architecture
- Commands Reference
- Configuration Files
- The SuperNovae Ecosystem
- FAQ
- Troubleshooting
- Directory Structure
- Contributing
🚀 Installation
Homebrew (Recommended)
Cargo
From Source
Docker
# Run directly
# With project mount
# With API keys (env vars)
Note: Docker cannot access OS Keychain. Use environment variables for secrets in containers.
Platform Support: macOS and Linux are fully supported. Windows is not yet supported (the daemon uses Unix sockets).
Verify Installation
# Enable shell completions
⚡ Quick Start
# 1. Initialize a project
# 2. Add packages
# 3. Configure providers
# 4. Sync to your editor
🏗️ Architecture
Three-Level Config Scope
spn uses a three-level configuration hierarchy following industry standards (npm, cargo, git):
%%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#6366f1', 'primaryTextColor': '#fff', 'primaryBorderColor': '#818cf8', 'lineColor': '#a5b4fc', 'secondaryColor': '#1e1b4b', 'tertiaryColor': '#312e81'}}}%%
flowchart TB
subgraph GLOBAL["🌍 Global Scope (~/.spn/config.toml)"]
G1["Provider settings"]
G2["Default MCP servers"]
G3["User preferences"]
end
subgraph TEAM["👥 Team Scope (./mcp.yaml)"]
T1["Project MCP servers"]
T2["Shared workflows"]
T3["Team schemas"]
end
subgraph LOCAL["💻 Local Scope (./.spn/local.yaml)"]
L1["Developer overrides"]
L2["Local API keys"]
L3["Debug settings"]
end
GLOBAL -->|"Merged"| RESOLVER["⚙️ Config Resolver"]
TEAM -->|"Overrides"| RESOLVER
LOCAL -->|"Final Override"| RESOLVER
RESOLVER --> APP["🚀 Application"]
style GLOBAL fill:#1e293b
style TEAM fill:#334155
style LOCAL fill:#475569
style RESOLVER fill:#6366f1
Precedence: Local > Team > Global (innermost wins)
Global Scope (~/.spn/config.toml)
User-level settings that apply to all projects:
[]
= "claude-opus-4"
= "https://api.anthropic.com"
[]
= "gpt-4"
[]
= ["claude-code"]
= true
[]
= "npx"
= ["-y", "@modelcontextprotocol/server-github"]
Team Scope (./mcp.yaml)
Project-level MCP servers shared with the team:
servers:
neo4j:
command: "npx"
args:
env:
NEO4J_URI: "bolt://localhost:7687"
perplexity:
command: "npx"
args:
Committed to git — Shared with team members.
Local Scope (./.spn/local.yaml)
Developer-specific overrides:
servers:
neo4j:
env:
NEO4J_PASSWORD: "dev-password"
NEO4J_DATABASE: "test"
providers:
anthropic:
model: "claude-haiku-4" # Override for local testing
Gitignored — Never committed.
Config Resolution Flow
%%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#10b981', 'primaryTextColor': '#fff', 'primaryBorderColor': '#34d399', 'lineColor': '#6ee7b7', 'secondaryColor': '#064e3b', 'tertiaryColor': '#065f46'}}}%%
sequenceDiagram
participant User
participant CLI as spn CLI
participant Global as 🌍 Global
participant Team as 👥 Team
participant Local as 💻 Local
participant Resolver
participant App
User->>CLI: spn config show
CLI->>Global: Load ~/.spn/config.toml
Global-->>CLI: Base config
CLI->>Team: Load ./mcp.yaml
Team-->>CLI: Project config
CLI->>Local: Load ./.spn/local.yaml
Local-->>CLI: Overrides
CLI->>Resolver: Merge all configs
Note over Resolver: Local > Team > Global
Resolver-->>CLI: Resolved config
CLI->>App: Apply configuration
App-->>User: Display merged result
Selective Package Sync
Not all package types need editor integration. spn intelligently determines what to sync based on package type:
%%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#f59e0b', 'primaryTextColor': '#fff', 'primaryBorderColor': '#fbbf24', 'lineColor': '#fcd34d', 'secondaryColor': '#78350f', 'tertiaryColor': '#92400e'}}}%%
flowchart LR
subgraph PACKAGES["📦 Installed Packages"]
SKILLS["@skills/<br/>brainstorming"]
WORKFLOWS["@workflows/<br/>generate-page"]
AGENTS["@agents/<br/>code-reviewer"]
PROMPTS["@prompts/<br/>seo-meta"]
end
subgraph DECISION["🎯 Sync Decision"]
SKILLS --> YES1["✅ Requires Sync"]
WORKFLOWS --> NO1["❌ No Sync"]
AGENTS --> NO2["❌ No Sync"]
PROMPTS --> NO3["❌ No Sync"]
end
subgraph REASON["📝 Reason"]
YES1 --> R1["Skills need .claude/skills/<br/>for editor integration"]
NO1 --> R2["Standalone execution<br/>via nika CLI"]
NO2 --> R3["CLI subagents<br/>no editor presence needed"]
NO3 --> R4["Template files<br/>accessed programmatically"]
end
subgraph EDITORS["📂 Editor Configs"]
R1 --> ED[".claude/skills/<br/>.cursor/skills/<br/>.windsurf/skills/"]
end
style YES1 fill:#10b981
style NO1 fill:#ef4444
style NO2 fill:#ef4444
style NO3 fill:#ef4444
Sync Behavior Table
| Package Type | Default Sync | Reason | Override |
|---|---|---|---|
| @skills/ | ✅ YES | Requires .claude/skills/ for editor integration |
N/A |
| @workflows/ | ❌ NO | Standalone execution via nika CLI |
integration.requires_sync: true in manifest |
| @agents/ | ❌ NO | CLI subagents, no editor presence needed | integration.requires_sync: true in manifest |
| @prompts/ | ❌ NO | Template files accessed programmatically | integration.requires_sync: true in manifest |
| @jobs/ | ❌ NO | Cron/webhook triggers, no editor integration | integration.requires_sync: true in manifest |
| @schemas/ | ❌ NO | NovaNet database schemas, no editor integration | integration.requires_sync: true in manifest |
Sync Flow
%%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#8b5cf6', 'primaryTextColor': '#fff', 'primaryBorderColor': '#a78bfa', 'lineColor': '#c4b5fd', 'secondaryColor': '#4c1d95', 'tertiaryColor': '#5b21b6'}}}%%
flowchart TB
CMD["spn sync --interactive"]
subgraph PHASE1["Phase 1: MCP Servers"]
MCP_LOAD["Load MCP config<br/>from all scopes"]
MCP_MERGE["Merge configs<br/>(Local > Team > Global)"]
MCP_SYNC["Sync to editors:<br/>.claude/settings.json<br/>.cursor/mcp.json<br/>.windsurf/mcp.json"]
end
subgraph PHASE2["Phase 2: Package Sync"]
PKG_LIST["List installed packages"]
PKG_FILTER["Filter by requires_sync()"]
PKG_LINK["Create symlinks:<br/>.claude/skills/<br/>.claude/hooks/"]
end
subgraph CONFIRM["Interactive Confirmation"]
DIFF["Show colored diffs"]
PROMPT["Ask for confirmation"]
APPLY["Apply changes"]
end
CMD --> PHASE1
MCP_LOAD --> MCP_MERGE
MCP_MERGE --> MCP_SYNC
PHASE1 --> PHASE2
PKG_LIST --> PKG_FILTER
PKG_FILTER --> PKG_LINK
PHASE2 --> CONFIRM
DIFF --> PROMPT
PROMPT -->|Yes| APPLY
PROMPT -->|No| CANCEL["❌ Cancel"]
style CMD fill:#6366f1
style APPLY fill:#10b981
style CANCEL fill:#ef4444
Security Architecture
%%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#10b981', 'primaryTextColor': '#fff', 'primaryBorderColor': '#34d399', 'lineColor': '#6ee7b7', 'secondaryColor': '#064e3b', 'tertiaryColor': '#065f46'}}}%%
flowchart TB
subgraph STORAGE["🔐 Layer 1: Storage"]
KC["OS Keychain<br/>(macOS/Windows/Linux)"]
ENV["Environment Variables"]
DOT[".env Files"]
end
subgraph MEMORY["🧠 Layer 2: Memory Protection"]
ZERO["Zeroizing<T><br/>(Auto-clear on drop)"]
SECRET["SecretString<br/>(No Debug/Display)"]
MLOCK["mlock()<br/>(Prevent swap to disk)"]
DUMP["MADV_DONTDUMP<br/>(Exclude from core dumps)"]
end
subgraph VALIDATION["✅ Layer 3: Validation"]
FORMAT["Format Check<br/>(Provider-specific patterns)"]
MASK["Masked Display<br/>(sk-ant...X format)"]
TEST["Connection Test<br/>(Optional)"]
end
KC -->|Priority 1| ZERO
ENV -->|Priority 2| ZERO
DOT -->|Priority 3| ZERO
ZERO --> SECRET
SECRET --> MLOCK
MLOCK --> DUMP
DUMP --> FORMAT
FORMAT --> MASK
MASK --> TEST
TEST --> APP["🚀 Application"]
style KC fill:#10b981
style ENV fill:#f59e0b
style DOT fill:#ef4444
style APP fill:#6366f1
Defense-in-depth protection:
| Layer | Protection | Technology | Platform |
|---|---|---|---|
| Storage | Encrypted at rest | macOS Keychain | macOS |
| Storage | Encrypted at rest | Windows Credential Manager | Windows |
| Storage | Encrypted at rest | Linux Secret Service | Linux |
| Memory | Auto-clear on drop | zeroize crate |
All |
| Memory | Prevent debug exposure | secrecy crate |
All |
| Memory | Prevent swap to disk | mlock() via libc |
Unix |
| Memory | Exclude from core dumps | MADV_DONTDUMP |
Linux |
| Validation | Format verification | Provider-specific regex | All |
| Display | Masked output | sk-ant...X format |
All |
📖 Commands Reference
📊 Status Dashboard
View the complete state of your SuperNovae ecosystem at a glance.
spn status [--json]
Display the unified status dashboard showing local models, credentials, MCP servers, and daemon status.
# ASCII dashboard (default)
# Machine-readable JSON output
Output:
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ✦ spn status The Agentic AI Toolkit ✦ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┌─ 🦙 LOCAL MODELS ────────────────────────────────────────────────────────────┐
│ Ollama → http://localhost:11434 ✅ running │
│ Memory 2.1 / 16.0 GB ████░░░░░░░░░░░░ 13% │
│ Models │
│ ├── ● llama3.2:1b 1.2 GB ← active │
│ └── ○ mistral:7b 4.1 GB │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ 🔑 CREDENTIALS ─────────────────────────────────────────────────────────────┐
│ Name Type Status Source Endpoint │
│ anthropic LLM ✅ ready 🔐 keychain api.anthropic.com │
│ openai LLM ✅ ready 📦 env api.openai.com │
│ ollama LLM ✅ local 🦙 local localhost:11434 │
│ neo4j MCP ✅ ready 🔐 keychain bolt://localhost:7687 │
│ 7/13 configured │ 🔐 2 keychain 📦 4 env 🦙 1 local │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ 🔌 MCP SERVERS ───────────────────────────────────────────────────────────────┐
│ Server Status Transport Command Credential │
│ neo4j ○ ready stdio uvx → neo4j │
│ perplexity ○ ready stdio npx → perplexity │
│ 7/8 active │
└──────────────────────────────────────────────────────────────────────────────┘
┌─ 📡 DAEMON ──────────────────────────────────────────────────────────────────┐
│ spn daemon ✅ running PID 12345 ~/.spn/daemon.sock Uptime 2h 15m │
└──────────────────────────────────────────────────────────────────────────────┘
🔑 7/13 Keys 🔌 7/8 MCPs 🦙 2 Models 📡 Daemon OK
Dashboard sections:
| Section | Shows |
|---|---|
| 🦙 LOCAL MODELS | Ollama status, memory usage, installed/loaded models |
| 🔑 CREDENTIALS | All LLM + MCP credentials, their sources (keychain/env/.env/local) |
| 🔌 MCP SERVERS | Configured servers, their status, transport, and linked credentials |
| 📡 DAEMON | spn daemon status, PID, socket path, uptime |
Use cases:
- Quick health check before starting work
- Verify API keys are configured correctly
- Debug "why isn't X working" issues
- Confirm local models are loaded
📦 Package Management
Commands for installing and managing packages from the SuperNovae registry.
spn add <package>
Add a package to the manifest and install it.
# Add a workflow
# Add a schema
# Add a job
# Add with specific version
# Add with version constraint
What happens:
- Downloads package from registry
- Adds to
spn.yamlmanifest - Updates
spn.lockwith resolved version - Installs to
~/.spn/packages/ - Syncs to editors (if applicable)
spn remove <package>
Remove a package from the project.
What happens:
- Removes from
spn.yamlmanifest - Updates
spn.lock - Removes from
~/.spn/packages/ - Removes editor symlinks
spn install
Install all packages from spn.yaml.
# Install all packages
# Install exact versions from lockfile (CI mode)
Use cases:
- After cloning a project
- After pulling changes to
spn.yaml - In CI/CD pipelines (use
--frozen)
spn update [package]
Update packages to latest compatible versions.
# Update all packages
# Update specific package
What happens:
- Checks registry for latest compatible versions
- Updates
spn.lock - Downloads new versions
- Re-syncs to editors
spn search <query>
Search the registry for packages.
Output:
📦 @nika/generate-page v1.2.0
Generate landing pages from semantic templates
📦 @nika/seo-audit v2.0.1
Comprehensive SEO analysis workflow
📦 @workflows/content-generator v0.5.0
AI-powered content generation
spn info <package>
Show detailed information about a package.
Output:
📦 @nika/generate-page
Version: 1.2.0
Type: workflow
Author: SuperNovae Studio
License: MIT
Repository: https://github.com/supernovae-st/nika-workflows
Description:
Generate landing pages from semantic templates with NovaNet context.
Dependencies:
- @novanet/core-schema ^0.14.0
Files:
- generate-page.yaml (workflow)
- templates/ (assets)
Installation:
spn add @nika/generate-page
spn list
List all installed packages.
Output:
Installed Packages:
Workflows (2):
@nika/generate-page v1.2.0
@nika/seo-audit v2.0.1
Schemas (1):
@novanet/core-schema v0.14.0
Skills (3):
brainstorming (via skills.sh)
superpowers/tdd (via skills.sh)
coding-standards (via skills.sh)
MCP Servers (2):
neo4j (@neo4j/mcp-server-neo4j v0.1.0)
github (@modelcontextprotocol/server-github v0.2.0)
spn outdated
Show packages with available updates.
Output:
Outdated Packages:
Package Current Latest Type
@nika/generate-page 1.2.0 1.3.0 minor
@novanet/core-schema 0.14.0 0.15.0 minor
@nika/seo-audit 2.0.1 3.0.0 major ⚠️
Run 'spn update' to update all packages.
Run 'spn update <package>' to update a specific package.
spn publish
Publish the current package to the registry.
# Dry run (preview)
# Actual publish
Requirements:
spn.jsonmanifest in current directory- Authenticated with registry
- Unique version (not already published)
⚙️ Configuration Management
Commands for managing configuration across three scopes.
spn config show [section]
Show the resolved configuration (merged from all scopes).
# Show all configuration
# Show specific section
Output:
⚙️ Resolved Configuration
Providers:
anthropic model = claude-opus-4
openai model = gpt-4
Sync:
enabled_editors = ["claude-code"]
auto_sync = true
MCP Servers:
neo4j npx -y @neo4j/mcp-server-neo4j
github npx -y @modelcontextprotocol/server-github
spn config where
Show the locations of all config files.
Output:
📁 Config File Locations
Precedence: Local > Team > Global
✓ 🌍 Global ~/.spn/config.toml
✓ 👥 Team ./mcp.yaml
○ 💻 Local ./.spn/local.yaml
✓ = exists, ○ = not found
spn config list [--show-origin]
List all configuration values.
# List all values
# Show which scope defined each value
Output with --show-origin:
📋 Configuration Values
providers.anthropic.model = claude-opus-4 (🌍 global)
providers.openai.model = gpt-4 (🌍 global)
servers.neo4j = <configured> (👥 team)
servers.github = <configured> (🌍 global)
sync.enabled_editors = ["claude-code"] (💻 local)
Use 'spn config get <key> --show-origin' for detailed origin info
spn config get <key> [--show-origin]
Get a specific configuration value.
# Get value
# Show which scope defined it
Output:
🔍 Getting value for key: providers.anthropic.model
Value: claude-opus-4
Origin: 🌍 Global (~/.spn/config.toml)
spn config set <key> <value> [--scope=<scope>]
Set a configuration value in a specific scope.
# Set in global scope (default)
# Set in team scope
# Set in local scope
Scopes:
global(default) — User-level (~/.spn/config.toml)team— Project-level (./mcp.yaml)local— Developer overrides (./.spn/local.yaml)
spn config edit [--local|--user|--mcp]
Open a configuration file in your editor.
# Edit team config (default)
# Edit local config
# Edit global config
# Edit MCP config
Environment variables used:
$EDITOR(preferred)$VISUAL(fallback)vi(final fallback)
spn config import <file> [--scope=<scope>] [--yes]
Import MCP servers from an editor config file.
# Import from Claude Code settings
# Import to specific scope
# Skip confirmation prompt
What happens:
- Parses
.claude/settings.jsonor.cursor/mcp.json - Extracts
mcpServerssection - Shows preview of what will be imported
- Asks for confirmation (unless
--yes) - Imports to specified scope
- Creates target config file if it doesn't exist
Example:
Supported formats:
.claude/settings.json(Claude Code).cursor/mcp.json(Cursor).windsurf/mcp.json(Windsurf)
🚀 Onboarding
Commands for first-time setup and configuration.
spn setup
Interactive onboarding wizard for first-time users.
# Full interactive wizard
# Quick setup: auto-detect and migrate keys
# Verbose output
What happens:
- Detects existing API keys in environment
- Shows provider signup URLs with descriptions
- Prompts to migrate keys to OS Keychain
- Configures default providers
- Sets up MCP server aliases
Provider Information (Open Source First):
| Provider | Signup URL | Description | Cost |
|---|---|---|---|
| 🦙 Ollama | ollama.ai | Local inference, full privacy, no API key | Free |
| Anthropic | console.anthropic.com | Best for complex reasoning, extended thinking | Paid |
| OpenAI | platform.openai.com | Versatile, great for chat and embeddings | Paid |
| Mistral | console.mistral.ai | European, strong code generation | Paid |
| Groq | console.groq.com | Fastest inference, great for real-time | Free tier |
| DeepSeek | platform.deepseek.com | Cost-effective, strong reasoning | Paid |
| Gemini | aistudio.google.com | Google's model, multimodal capabilities | Free tier |
💡 Tip: Start with Ollama for local development — no API keys, no costs, full privacy.
spn setup nika
Install and configure Nika workflow engine with 5-step wizard.
What happens:
| Step | Action | Description |
|---|---|---|
| 1 | Install CLI | Downloads nika binary via cargo or homebrew |
| 2 | Install LSP | Sets up nika-lsp for IDE support |
| 3 | Start Daemon | Auto-starts spn daemon for unified secret management |
| 4 | Check Providers | Verifies LLM API keys are configured |
| 5 | Configure Editors | Auto-detects and configures IDE integrations |
Editor Integration:
- Claude Code — Syncs MCP config via
spn sync - VS Code — Adds YAML schema for
.nika.yamlvalidation - Cursor — Adds YAML schema for
.nika.yamlvalidation - Windsurf — Adds YAML schema for
.nika.yamlvalidation
🦋 Nika Setup Complete!
WHAT'S NEXT?
nika Launch TUI (Home View)
nika chat Start chat session
nika studio Open workflow studio
nika --help Show all commands
spn setup novanet
Install and configure NovaNet knowledge graph.
What happens:
- Installs
novanetCLI - Configures Neo4j connection
- Sets up MCP server integration
🔑 Secrets Management
Commands for managing and auditing secrets configuration.
spn secrets doctor
Run health checks on secrets configuration.
Output:
🏥 Secrets Health Check
Storage Status:
✅ OS Keychain accessible
✅ Environment variables loaded
⚠️ .env file found (consider migration)
Key Analysis:
🔐 0 keys in OS Keychain
📦 6 keys in environment variables
⚠️ 2 keys in .env files (insecure)
Recommendations:
1. Migrate environment keys to OS Keychain
Run: spn provider migrate
2. Remove .env files from version control
Add to .gitignore: .env
Memory Protection:
✅ mlock available (limit: unlimited)
✅ MADV_DONTDUMP available
spn secrets export <file> [--format=<format>]
Export secrets to encrypted file.
# Export to SOPS-encrypted file
# Export as JSON
# Export masked (for sharing config structure)
Formats:
yaml(default) — SOPS-encrypted YAMLjson— SOPS-encrypted JSONenv— Encrypted .env format
Security:
- Uses SOPS (Secrets OPerationS) for encryption
- Supports age, PGP, AWS KMS, GCP KMS, Azure Key Vault
- Never exports unencrypted secrets
spn secrets import <file>
Import secrets from encrypted file.
# Import from SOPS-encrypted file
# Import with verbose output
What happens:
- Decrypts file using SOPS
- Validates key formats
- Shows preview of keys to import
- Asks for confirmation
- Stores in OS Keychain
🔐 Security
Commands for managing API keys and credentials securely.
spn provider list [--show-source]
List all stored API keys (masked for security).
# List all keys
# Show where each key is stored
Output:
🔐 Stored API Keys
anthropic: sk-ant-***************X (OS Keychain) ✓
openai: sk-***************X (Environment)
neo4j: bolt://***:***@localhost:7687 (.env file) ⚠️
Legend:
✓ = Secure (OS Keychain)
⚠️ = Less secure (env var or .env file)
Migrate to keychain: spn provider migrate
spn provider set <name> [--key=<key>]
Store an API key in the OS Keychain.
# Interactive (prompts for key)
# Non-interactive (for scripts)
Prompts for key (interactive):
🔐 Setting API key for: anthropic
Enter API key (input hidden):
Confirm API key:
✅ Key stored in OS Keychain
Security: Encrypted at rest
Location: macOS Keychain
Test connection: spn provider test anthropic
Security features:
- Input hidden during typing
- Key confirmed before storing
- Stored encrypted in OS-native keychain
- Memory protected with
mlock() - Auto-cleared on drop with
zeroize
spn provider get <name> [--unmask]
Get a stored API key (masked by default).
# Get masked key
# Get full key (for scripts)
Output (masked):
🔍 API Key for: anthropic
Key: sk-ant-***************X
Source: OS Keychain
Output (unmasked):
🔍 API Key for: anthropic
⚠️ WARNING: Full key displayed below. Keep this secure!
Key: sk-ant-api03-xxxxxxxxxxxxxxxxxxxx
Source: OS Keychain
Use in scripts:
export ANTHROPIC_API_KEY=$(spn provider get anthropic --unmask)
spn provider delete <name>
Remove an API key from the OS Keychain.
Confirmation prompt:
⚠️ Delete API key for: anthropic
This will remove the key from OS Keychain.
You will need to set it again to use this provider.
Delete? [y/N] y
✅ Key deleted from OS Keychain
spn provider migrate [--yes]
Migrate API keys from environment variables to OS Keychain.
# Interactive (asks for confirmation)
# Non-interactive (for scripts)
What happens:
- Scans environment variables for known patterns
- Scans
.envfiles in current directory - Shows what will be migrated
- Asks for confirmation (unless
--yes) - Stores each key in OS Keychain
- Shows reminder to remove from
.envfiles
Output:
🔄 Migrating API keys to OS Keychain
Found keys in environment:
• ANTHROPIC_API_KEY (from .env)
• OPENAI_API_KEY (from environment)
• NEO4J_PASSWORD (from .env)
Migrate 3 keys to OS Keychain? [Y/n] y
✅ anthropic migrated
✅ openai migrated
✅ neo4j migrated
⚠️ Remember to:
1. Remove keys from .env files
2. Add .env to .gitignore
3. Update team documentation
Test: spn provider test all
spn provider test <name|all>
Test provider connection and key validity.
# Test specific provider
# Test all providers
Output:
🧪 Testing: anthropic
Format: ✅ Valid (sk-ant-api03-...)
Length: ✅ Correct (64 characters)
Prefix: ✅ Valid (sk-ant-api03-)
Connection test: Not implemented yet
(Use provider's CLI tools to verify)
Key is valid and ready to use!
Supported Providers (7 LLM + 6 MCP):
| Type | Provider | Environment Variable | Key Format | Notes |
|---|---|---|---|---|
| 🦙 LLM | ollama | OLLAMA_API_BASE_URL |
http://... |
Local, free, private |
| LLM | anthropic | ANTHROPIC_API_KEY |
sk-ant-api03-... |
Claude models |
| LLM | openai | OPENAI_API_KEY |
sk-... |
GPT models |
| LLM | mistral | MISTRAL_API_KEY |
... |
EU provider |
| LLM | groq | GROQ_API_KEY |
gsk_... |
Fast inference |
| LLM | deepseek | DEEPSEEK_API_KEY |
... |
Cost-effective |
| LLM | gemini | GEMINI_API_KEY |
AI... |
Multimodal |
| MCP | neo4j | NEO4J_PASSWORD |
... |
Graph database |
| MCP | github | GITHUB_TOKEN |
ghp_... |
Code integration |
| MCP | slack | SLACK_BOT_TOKEN |
xoxb-... |
Team messaging |
| MCP | perplexity | PERPLEXITY_API_KEY |
... |
AI search |
| MCP | firecrawl | FIRECRAWL_API_KEY |
fc-... |
Web scraping |
| MCP | supadata | SUPADATA_API_KEY |
... |
Data API |
🦙 Model Management
Commands for managing local LLM models via Ollama. Requires daemon running (spn daemon start).
spn model list [--json] [--running]
List installed models.
# List all installed models
# Output as JSON
# Only show currently loaded models
Output:
Installed Models
NAME SIZE QUANT
----------------------------------------------------
llama3.2:1b 1.2 GB Q8_0
mistral:7b 4.1 GB Q4_K_M
2 model(s) installed
spn model pull <name>
Download a model from the Ollama registry.
# Pull latest version
# Pull specific variant
Output:
-> Pulling model: llama3.2:1b
This may take a while...
* Model 'llama3.2:1b' pulled successfully
spn model load <name> [--keep-alive]
Load a model into GPU/RAM memory.
# Load model (auto-unloads after inactivity)
# Keep loaded until manually unloaded
Output:
-> Loading model: llama3.2:1b
* Model 'llama3.2:1b' loaded
Model will stay loaded until manually unloaded
spn model unload <name>
Unload a model from memory to free GPU/RAM.
Output:
-> Unloading model: llama3.2:1b
* Model 'llama3.2:1b' unloaded
spn model delete <name> [-y]
Delete a model from disk.
# Interactive (asks for confirmation)
# Skip confirmation
spn model status [--json]
Show running models and VRAM usage.
Output:
Model Status
MODEL VRAM
--------------------------------------------
* llama3.2:1b 1.6 GB
* mistral:7b 5.2 GB
--------------------------------------------
Total VRAM 6.8 GB
Use with Nika:
# Use local model in Nika workflow
🎯 Skills
Commands for managing skills from skills.sh (57K+ skills).
spn skill add <name>
Add a skill to the project.
# Add a skill
# Add from a specific publisher
# Add with version
What happens:
- Downloads skill from skills.sh
- Adds to
spn.yamlunderskills: - Installs to
~/.spn/packages/@skills/<name>/ - Syncs to
.claude/skills/,.cursor/skills/, etc.
spn skill remove <name>
Remove a skill from the project.
What happens:
- Removes from
spn.yaml - Removes from
~/.spn/packages/ - Removes symlinks from editor configs
spn skill list
List all installed skills.
Output:
🎯 Installed Skills
brainstorming v1.2.0
superpowers/tdd v2.0.1
coding-standards v0.5.0
Total: 3 skills
Usage in Claude Code:
/brainstorming
/spn-powers:tdd
/coding-standards
spn skill search <query>
Search skills on skills.sh.
Output:
🔍 Skills matching "workflow":
brainstorming v1.2.0
Interactive design refinement using Socratic method
superpowers/workflow-design v2.0.0
Design workflow architecture with validation
agile/sprint-planning v1.5.0
Sprint planning with story estimation
Search performed via skills.sh
Add with: spn skill add <name>
🔌 MCP Servers
Commands for managing MCP servers from npm (97M+ downloads).
spn mcp add <name> [options]
Add an MCP server to the project.
# Add to team scope (default)
# Add to global scope
# Add to project scope
# Skip automatic sync
# Sync only to specific editors
What happens:
- Resolves alias to npm package (e.g.,
neo4j→@neo4j/mcp-server-neo4j) - Installs npm package globally
- Adds to specified config scope
- Syncs to enabled editors (unless
--no-sync)
48 Built-in Aliases:
# Database
# Development
# Search & AI
# Web Scraping
# Communication
# And 33 more...
Run spn mcp list --all to see complete list.
spn mcp remove <name> [--global|--project]
Remove an MCP server.
# Remove from team scope (default)
# Remove from global scope
# Remove from project scope
What happens:
- Removes from specified config scope
- Removes from editor configs
- Keeps npm package installed (manual cleanup:
npm uninstall -g <package>)
spn mcp list [--global|--project|--json]
List installed MCP servers.
# List all servers
# Show only global servers
# Show only project servers
# Output as JSON
Output:
🔌 Installed MCP Servers
Global Servers (from ~/.spn/config.toml):
github @modelcontextprotocol/server-github v0.2.0
Team Servers (from ./mcp.yaml):
neo4j @neo4j/mcp-server-neo4j v0.1.0
perplexity perplexity-mcp v1.0.0
Local Overrides (from ./.spn/local.yaml):
neo4j (env overrides: NEO4J_PASSWORD)
Total: 3 servers
Test: spn mcp test <name>
spn mcp test <name>
Test MCP server connection.
# Test specific server
# Test all servers
Output:
🧪 Testing: neo4j
Package: @neo4j/mcp-server-neo4j v0.1.0
Command: npx -y @neo4j/mcp-server-neo4j
Environment:
NEO4J_URI: bolt://localhost:7687 ✓
NEO4J_PASSWORD: ********** ✓
Connection: ✅ Server responds
Tools: 8 available
- neo4j_query
- neo4j_execute
- neo4j_schema
- ...
Server is healthy and ready to use!
🦋 Nika Integration
🎯 Direct Integration: Nika reads MCP configs directly from
~/.spn/mcp.yaml— no sync required!This means your MCP servers are instantly available to Nika workflows without running
spn sync.
Commands for interacting with the Nika workflow runtime.
spn nk run <file>
Run a Nika workflow.
# Run a workflow
# Run with variables
Proxy to: nika run <file>
spn nk check <file>
Validate workflow syntax.
Output:
✅ Workflow is valid
Steps: 5
Verbs used: infer (2), invoke (2), fetch (1)
Dependencies resolved: ✓
spn nk studio
Open Nika Studio TUI (interactive workflow editor).
Features:
- Visual workflow editor
- Real-time syntax validation
- Step-by-step execution
- Variable inspector
- Debug mode
spn nk jobs start|status|stop
Manage the Nika jobs daemon.
# Start daemon
# Check status
# Stop daemon
Jobs daemon:
- Runs workflows on schedule (cron)
- Handles webhook triggers
- Processes background tasks
🧠 NovaNet Integration
Commands for interacting with the NovaNet knowledge graph.
spn nv tui
Open NovaNet TUI (interactive graph explorer).
Features:
- Browse node classes and arc classes
- Query the graph with Cypher
- Visualize relationships
- Generate native content
spn nv query <query>
Query the knowledge graph with Cypher.
spn nv mcp start|stop
Start or stop the NovaNet MCP server.
# Start MCP server
# Stop MCP server
MCP Tools provided:
novanet_generate— Generate native contentnovanet_describe— Describe entitiesnovanet_traverse— Navigate relationshipsnovanet_introspect— Query schema
spn nv add-node|add-arc
Add node or arc types to the schema.
# Add a node type
# Add an arc type
spn nv db start|seed|reset
Manage the Neo4j database.
# Start Neo4j
# Seed with initial data
# Reset and reseed
🔄 Sync & Editor Integration
🦋 Nika Exception: Nika reads
~/.spn/mcp.yamldirectly — no sync required for Nika workflows.The sync command is only needed for IDE integration (Claude Code, Cursor, Windsurf).
Commands for syncing packages to editor configurations.
spn sync [options]
Sync packages and MCP servers to editor configs.
# Sync to all enabled editors
# Sync to specific editor
# Preview changes without applying
# Interactive mode with diff preview
# Combine options
What gets synced:
%%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#ec4899', 'primaryTextColor': '#fff', 'primaryBorderColor': '#f472b6', 'lineColor': '#f9a8d4', 'secondaryColor': '#831843', 'tertiaryColor': '#9f1239'}}}%%
flowchart LR
subgraph SOURCES["📦 Sources"]
MCP_CONFIG["MCP Config<br/>(3 scopes merged)"]
SKILLS["@skills/<br/>packages"]
HOOKS["Hook configs"]
end
subgraph EDITORS["📂 Editors"]
CLAUDE[".claude/<br/>settings.json<br/>skills/<br/>hooks/"]
CURSOR[".cursor/<br/>mcp.json<br/>skills/<br/>hooks/"]
WINDSURF[".windsurf/<br/>mcp.json<br/>skills/<br/>hooks/"]
end
MCP_CONFIG --> CLAUDE
MCP_CONFIG --> CURSOR
MCP_CONFIG --> WINDSURF
SKILLS --> CLAUDE
SKILLS --> CURSOR
SKILLS --> WINDSURF
HOOKS --> CLAUDE
style MCP_CONFIG fill:#6366f1
style SKILLS fill:#10b981
style HOOKS fill:#f59e0b
Supported Editors:
| Editor | Config Directory | MCP File | Skills Directory |
|---|---|---|---|
| Claude Code | .claude/ |
settings.json |
.claude/skills/ |
| Cursor | .cursor/ |
mcp.json |
.cursor/skills/ |
| Windsurf | .windsurf/ |
mcp.json |
.windsurf/skills/ |
| VS Code | .vscode/ |
N/A | N/A (not supported) |
spn sync --enable <editor>
Enable automatic sync for an editor.
What happens:
- Adds editor to
~/.spn/config.tomlundersync.enabled_editors - Editor will be synced on every
spn add,spn install,spn mcp add
spn sync --disable <editor>
Disable automatic sync for an editor.
What happens:
- Removes editor from
sync.enabled_editors - Editor will no longer be synced automatically
spn sync --status
Show sync status and configuration.
Output:
📊 Sync Status
Enabled targets:
✅ Claude Code
✅ Cursor
Detected IDEs in current directory:
✓ Claude Code (.claude/settings.json)
✓ Cursor (.cursor/mcp.json)
○ Windsurf (no config found)
Last sync: 2024-03-15 14:32:05 UTC
Auto-sync: Enabled
Sync on: add, install, mcp add
Configure: spn sync --enable <editor>
🏥 System Diagnostic
spn doctor
Run comprehensive system diagnostic.
Checks:
- ✅ spn installation
- ✅ Nika binary available
- ✅ NovaNet binary available
- ✅ Node.js and npm installed
- ✅ Git configuration
- ✅ Neo4j connection
- ✅ API keys configured
- ✅ Editor configs valid
- ✅ Package manifest syntax
- ✅ Lockfile consistency
Output:
🏥 SuperNovae System Diagnostic
Installation:
✅ spn v0.15.2 installed
✅ nika v0.21.1 available
✅ novanet v0.14.0 available
Dependencies:
✅ Node.js v20.11.0
✅ npm v10.2.4
✅ Git v2.43.0
Configuration:
✅ ~/.spn/config.toml exists
✅ ./mcp.yaml valid
○ ./.spn/local.yaml not found (optional)
API Keys:
✅ anthropic (OS Keychain)
✅ openai (Environment)
⚠️ neo4j (not configured)
Database:
✅ Neo4j running at bolt://localhost:7687
✅ 1,234 nodes, 5,678 relationships
Editors:
✅ Claude Code (.claude/settings.json)
✅ Cursor (.cursor/mcp.json)
Packages:
✅ 5 packages installed
✅ spn.lock matches spn.yaml
Overall: ✅ System is healthy
Issues:
⚠️ Neo4j credentials not configured
Fix: spn provider set neo4j
Run 'spn doctor --verbose' for detailed diagnostics.
🚀 Project Initialization
spn init [options]
Initialize a new SuperNovae project.
# Interactive wizard
# Create local config
# Create MCP config
# Initialize from template
Interactive Wizard:
🌟 SuperNovae Project Setup
What would you like to create?
> Nika workflow project
NovaNet schema project
Full-stack (Nika + NovaNet)
Empty project
Project name: my-project
Description: My awesome AI project
Initialize git repository? Yes
Which editors do you use?
[x] Claude Code
[ ] Cursor
[ ] Windsurf
Add example workflows? Yes
✅ Created my-project/
├── spn.yaml
├── mcp.yaml
├── .gitignore
├── README.md
└── examples/
└── hello-workflow.yaml
Next steps:
cd my-project
spn add @nika/generate-page
spn sync
📄 Configuration Files
Project Manifest (spn.yaml)
Main project configuration file (committed to git).
name: my-project
version: 0.1.0
description: My awesome AI project
# Package dependencies
workflows:
- "@nika/generate-page@^1.0.0"
- "@nika/seo-audit@^2.0.0"
schemas:
- "@novanet/core-schema@^0.14.0"
jobs:
- "@jobs/daily-report@^1.0.0"
# Interop packages (via skills.sh)
skills:
- "brainstorming"
- "superpowers/tdd"
# Interop packages (via npm)
mcp:
- "neo4j"
- "perplexity"
# Editor sync preferences
sync:
claude: true
cursor: true
nika: true
auto_sync: true
Team MCP Config (./mcp.yaml)
Team-level MCP server configuration (committed to git).
servers:
neo4j:
command: "npx"
args:
env:
NEO4J_URI: "bolt://localhost:7687"
NEO4J_DATABASE: "neo4j"
perplexity:
command: "npx"
args:
github:
command: "npx"
args:
env:
GITHUB_REPO: "supernovae-st/my-project"
Local Overrides (./.spn/local.yaml)
Developer-specific overrides (gitignored).
# Override MCP server settings
servers:
neo4j:
env:
NEO4J_PASSWORD: "dev-password"
NEO4J_DATABASE: "test"
# Override provider settings
providers:
anthropic:
model: "claude-haiku-4" # Use cheaper model for local testing
endpoint: "http://localhost:8080" # Local proxy
# Override sync settings
sync:
auto_sync: false # Disable auto-sync during development
Add to .gitignore:
.spn/local.yaml
Global User Config (~/.spn/config.toml)
User-level configuration (never committed).
# Provider defaults
[]
= "claude-opus-4"
= "https://api.anthropic.com"
[]
= "gpt-4"
# Sync preferences
[]
= ["claude-code", "cursor"]
= true
# Global MCP servers (available in all projects)
[]
= "npx"
= ["-y", "@modelcontextprotocol/server-github"]
[]
= "npx"
= ["-y", "@modelcontextprotocol/server-filesystem"]
Package Lockfile (spn.lock)
Resolved package versions (committed to git).
Important: Always commit spn.lock to ensure reproducible builds.
🌌 The SuperNovae Ecosystem
%%{init: {'theme': 'dark', 'themeVariables': { 'primaryColor': '#6366f1', 'primaryTextColor': '#fff', 'primaryBorderColor': '#818cf8', 'lineColor': '#a5b4fc', 'secondaryColor': '#1e1b4b', 'tertiaryColor': '#312e81'}}}%%
flowchart TB
subgraph SPN["🌟 spn — The Agentic AI Toolkit v0.15.2"]
direction LR
subgraph OWNED["We Own"]
W["📋 workflows/<br/>YAML DAGs"]
S["🧬 schemas/<br/>Graph models"]
J["⏰ jobs/<br/>Cron triggers"]
end
subgraph INTEROP["Interop"]
SK["🎯 skills/<br/>57K+ from skills.sh"]
MCP["🔌 mcp/<br/>97M+ from npm"]
end
end
subgraph CONFIG["⚙️ Configuration System"]
GLOBAL["🌍 Global<br/>~/.spn/config.toml"]
TEAM["👥 Team<br/>./mcp.yaml"]
LOCAL["💻 Local<br/>./.spn/local.yaml"]
RESOLVER["Config Resolver<br/>(Local > Team > Global)"]
GLOBAL --> RESOLVER
TEAM --> RESOLVER
LOCAL --> RESOLVER
end
subgraph RUNTIME["🚀 Runtime Engines"]
NIKA["🦋 Nika v0.21.1<br/>Workflow Runtime<br/><i>5 Semantic Verbs</i>"]
NOVANET["🧠 NovaNet v0.17.2<br/>Knowledge Graph<br/><i>Neo4j + MCP Server</i>"]
end
subgraph EDITORS["📂 Editor Integration"]
CLAUDE[".claude/<br/>settings.json<br/>skills/<br/>hooks/"]
CURSOR[".cursor/<br/>mcp.json<br/>skills/"]
WINDSURF[".windsurf/<br/>mcp.json<br/>skills/"]
end
SPN --> RESOLVER
RESOLVER --> NIKA
RESOLVER --> NOVANET
NIKA <-->|MCP Protocol| NOVANET
RESOLVER -.->|Sync| CLAUDE
RESOLVER -.->|Sync| CURSOR
RESOLVER -.->|Sync| WINDSURF
SK -.-> |"skills.sh"| SKILLS[(skills.sh<br/>57K+ skills)]
MCP -.-> |"npm registry"| NPM[(npm<br/>97M+ downloads)]
style SPN fill:#1e293b
style CONFIG fill:#334155
style RUNTIME fill:#475569
style EDITORS fill:#64748b
style RESOLVER fill:#6366f1
Mascots & Roles
| Mascot | Role | Description |
|---|---|---|
| spn 🌟 | CLI | The Agentic AI Toolkit — models, MCP servers, providers, secrets |
| Nika 🦋 | Runtime | Orchestrates workflows via 5 semantic verbs: infer, exec, fetch, invoke, agent |
| NovaNet 🧠 | Brain | Knowledge graph for localization, entities, and semantic relationships |
Note: Nika reads MCP configs directly from
~/.spn/mcp.yaml— no sync needed between spn and Nika.
Package Types
| Type | Scope | Sync? | Description | Example |
|---|---|---|---|---|
| workflow | @nika/, @workflows/ |
❌ NO | YAML DAG definitions | @nika/generate-page |
| schema | @novanet/, @schemas/ |
❌ NO | Graph node/arc classes | @novanet/core-schema |
| job | @jobs/ |
❌ NO | Cron/webhook triggers | @jobs/daily-report |
| skill | @skills/ |
✅ YES | Reusable prompts | brainstorming |
| agent | @agents/ |
❌ NO | Agent configurations | @agents/code-reviewer |
| prompt | @prompts/ |
❌ NO | Prompt templates | @prompts/seo-meta |
❓ FAQ
General
Q: What's the difference between spn and Nika?
spn is the package manager (install, configure, sync). Nika is the runtime engine (execute workflows). They work together: spn manages what's installed, Nika runs it.
Q: Do I need all three tools (spn, Nika, NovaNet)?
No. Start with spn alone for MCP servers and skills. Add Nika when you need AI workflows. Add NovaNet when you need a knowledge graph for localization.
Q: Is this only for Claude Code?
No. spn supports Claude Code, Cursor, Windsurf, and any editor with MCP support. Skills sync to all enabled editors.
Configuration
Q: Where are my API keys stored?
In your OS keychain (macOS Keychain, Windows Credential Manager, or Linux Secret Service). Run spn provider list --show-source to see each key's location.
Q: What's the difference between global, team, and local config?
- Global (
~/.spn/config.toml): User settings, applies everywhere - Team (
./mcp.yaml): Project settings, committed to git - Local (
./.spn/local.yaml): Your overrides, gitignored
Q: How do I share MCP servers with my team?
Add them to ./mcp.yaml and commit to git. Team members run spn sync after pulling.
Troubleshooting
Q: spn mcp add fails with npm error
Ensure Node.js 18+ is installed: node --version. If using nvm, run nvm use 18 or higher.
Q: API key not found after setting it
Check the key exists: spn provider list. If using Docker, environment variables are required (no keychain access).
Q: Sync not updating editor config
- Check enabled editors:
spn sync --status - Enable missing editor:
spn sync --enable claude-code - Force sync:
spn sync
🔧 Troubleshooting
Common Issues
"command not found: spn"
Cause: spn binary not in PATH.
# Check installation
||
# Reinstall via Homebrew
# Or reinstall via Cargo
"Failed to access keychain"
Cause: OS keychain permissions.
# macOS: Reset keychain permissions
# Linux: Ensure secret service is running
"MCP server failed to start"
Cause: Missing npm package or environment variables.
# Check server config
# Test specific server
# Check npm package
"Sync has no effect"
Cause: Editor not enabled or config already up-to-date.
# Check sync status
# Enable editor
# Force sync with preview
"Provider test fails"
Cause: Invalid key format or network issue.
# Test key format only
# Re-set key
# Check key source
Debug Mode
For detailed diagnostics:
# Run any command with verbose output
# Check all systems
# Export diagnostics
Getting Help
- GitHub Issues: supernovae-st/supernovae-cli/issues
- Discord: discord.gg/supernovae
- Documentation: supernovae.studio/docs
🗂️ Directory Structure
~/.spn/ # Global spn directory
├── config.toml # Global user config (v0.7.0)
├── packages/ # Downloaded packages
│ ├── @nika/
│ ├── @novanet/
│ ├── @skills/
│ └── @jobs/
├── registry/ # Cached registry index
└── bin/ # Binary stubs (nika, novanet)
./ # Project directory
├── spn.yaml # Package manifest (committed)
├── spn.lock # Resolved versions (committed)
├── mcp.yaml # Team MCP servers (committed) (v0.7.0)
├── .spn/
│ └── local.yaml # Local overrides (gitignored) (v0.7.0)
├── .claude/
│ ├── settings.json # Claude Code config (generated)
│ ├── skills/ # Skill symlinks (generated)
│ └── hooks/ # Hook configs (generated)
├── .cursor/
│ ├── mcp.json # Cursor MCP config (generated)
│ └── skills/ # Skill symlinks (generated)
└── .windsurf/
├── mcp.json # Windsurf MCP config (generated)
└── skills/ # Skill symlinks (generated)
What to commit:
- ✅
spn.yaml— Package manifest - ✅
spn.lock— Resolved versions - ✅
mcp.yaml— Team MCP servers - ❌
.spn/local.yaml— Local overrides - ❌
.claude/,.cursor/,.windsurf/— Generated configs
🔗 Related Projects
| Repository | Description | Version |
|---|---|---|
| nika | 🦋 Semantic YAML workflow engine | v0.21.1 |
| novanet | 🧠 Knowledge graph for localization | v0.17.2 |
| supernovae-registry | 📦 Public package registry | - |
| supernovae-index | 📇 Sparse package index | - |
| homebrew-tap | 🍺 Homebrew formulas | - |
🤝 Contributing
We welcome contributions! Here's how to get started:
Development Setup
# Clone the repository
# Build the project
# Run tests (920+ tests)
# Run linter
# Format code
# Install locally for testing
Running Tests
# Run all tests
# Run with output
# Run specific test
# Run tests with coverage
Conventions
- Commits:
type(scope): description- Types:
feat,fix,docs,refactor,test,chore - Examples:
feat(config): add import command,fix(sync): resolve path issue
- Types:
- Code style: Run
cargo fmtbefore committing - Linting: Run
cargo clippyand fix all warnings - Testing: TDD preferred, aim for 80%+ coverage
Project Structure
src/
├── main.rs // CLI entry point
├── commands/ // Command implementations
│ ├── add.rs
│ ├── config.rs
│ ├── provider.rs
│ ├── sync.rs
│ └── ...
├── config/ // Configuration system (v0.7.0)
│ ├── mod.rs // Module exports
│ ├── types.rs // Config data types
│ ├── scope.rs // Scope definitions
│ ├── resolver.rs // Config merging
│ ├── global.rs // Global config I/O
│ ├── team.rs // Team config I/O
│ └── local.rs // Local config I/O
├── index/ // Registry client
├── manifest/ // spn.yaml parsing
├── storage/ // Package storage
├── sync/ // Editor sync (v0.7.0)
│ ├── types.rs // Sync types
│ ├── adapters.rs // Editor adapters
│ └── mcp_sync.rs // MCP sync logic
├── secrets/ // Credential management (v0.6.0)
│ ├── keyring.rs // OS keychain
│ ├── types.rs // Provider types
│ ├── memory.rs // Memory protection
│ ├── storage.rs // Storage abstraction (v0.8.0)
│ ├── env_storage.rs // Environment storage (v0.8.0)
│ └── wizard.rs // Setup wizard (v0.8.0)
└── error.rs // Error types
📄 License
MIT © SuperNovae Studio
🌟 Part of the SuperNovae Ecosystem
SuperNovae Studio
Building the future of AI workflows 🚀
Made with 💜 and 🦀 by the SuperNovae team
⭐ Star us on GitHub — it helps others discover SuperNovae!
Zero Clippy Warnings • Open Source First • Nika Direct Integration • 7 LLM Providers • Automated Releases