Skip to main content

Installation & Setup

This guide provides detailed instructions for installing the Qirvo Plugin SDK and setting up your development environment for plugin development.

Table of Contents

Prerequisites

System Requirements

  • Node.js: Version 16.0.0 or higher
  • npm: Version 8.0.0 or higher (or yarn 1.22.0+)
  • TypeScript: Version 4.5.0 or higher
  • Git: For version control and repository management
  • Visual Studio Code: With TypeScript and ESLint extensions
  • Qirvo Account: For testing and publishing plugins
  • Postman/Insomnia: For API testing (optional)

Verify Prerequisites

# Check Node.js version
node --version
# Should output v16.0.0 or higher

# Check npm version
npm --version
# Should output 8.0.0 or higher

# Check TypeScript installation
npx tsc --version
# Should output Version 4.5.0 or higher

# Check Git installation
git --version
# Should output git version 2.x.x or higher

SDK Installation

# Install globally for CLI access
npm install -g @qirvo/plugin-sdk

# Or install locally in your project
npm install @qirvo/plugin-sdk

# Install development dependencies
npm install -D typescript @types/node

Method 2: yarn

# Install globally
yarn global add @qirvo/plugin-sdk

# Or install locally
yarn add @qirvo/plugin-sdk

# Install development dependencies
yarn add -D typescript @types/node

Method 3: From Source

# Clone the repository
git clone https://github.com/qirvo/plugin-sdk.git
cd plugin-sdk

# Install dependencies
npm install

# Build the SDK
npm run build

# Link for global access
npm link

Verify Installation

# Check SDK version
qirvo-sdk --version

# Or if installed locally
npx qirvo-sdk --version

# List available commands
qirvo-sdk --help

Development Environment Setup

IDE Configuration

Visual Studio Code

  1. Install Extensions:

    # Install recommended extensions
    code --install-extension ms-vscode.vscode-typescript-next
    code --install-extension dbaeumer.vscode-eslint
    code --install-extension esbenp.prettier-vscode
    code --install-extension bradlc.vscode-tailwindcss
  2. Workspace Settings (.vscode/settings.json):

    {
    "typescript.preferences.importModuleSpecifier": "relative",
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "eslint.autoFixOnSave": true,
    "files.exclude": {
    "**/node_modules": true,
    "**/dist": true,
    "**/.git": true
    }
    }
  3. Launch Configuration (.vscode/launch.json):

    {
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Debug Plugin",
    "type": "node",
    "request": "launch",
    "program": "${workspaceFolder}/dist/index.js",
    "outFiles": ["${workspaceFolder}/dist/**/*.js"],
    "env": {
    "NODE_ENV": "development"
    }
    }
    ]
    }

WebStorm/IntelliJ

  1. TypeScript Configuration:

    • Enable TypeScript service
    • Set TypeScript version to project version
    • Enable ESLint integration
  2. Run Configuration:

    • Create Node.js run configuration
    • Set working directory to project root
    • Add environment variables as needed

Git Configuration

# Configure Git (if not already done)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

# Create .gitignore for plugin projects
cat > .gitignore << EOF
# Dependencies
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Build outputs
dist/
build/
*.tsbuildinfo

# Environment files
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

# IDE files
.vscode/
.idea/
*.swp
*.swo

# OS files
.DS_Store
Thumbs.db

# Logs
logs/
*.log

# Runtime data
pids/
*.pid
*.seed
*.pid.lock

# Coverage directory used by tools like istanbul
coverage/
.nyc_output/

# Dependency directories
jspm_packages/

# Optional npm cache directory
.npm

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# Plugin specific
.qirvo/
plugin-cache/
EOF

Project Initialization

Using SDK CLI

# Create new plugin project
qirvo-sdk create my-plugin

# Or with specific template
qirvo-sdk create my-plugin --template dashboard-widget

# Navigate to project
cd my-plugin

# Install dependencies
npm install

Manual Setup

# Create project directory
mkdir my-qirvo-plugin
cd my-qirvo-plugin

# Initialize npm project
npm init -y

# Install SDK and dependencies
npm install @qirvo/plugin-sdk
npm install -D typescript @types/node eslint prettier

# Create TypeScript configuration
npx tsc --init

TypeScript Configuration

Create or update tsconfig.json:

{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"lib": ["ES2020", "DOM"],
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"removeComments": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules",
"dist",
"**/*.test.ts",
"**/*.spec.ts"
]
}

ESLint Configuration

Create .eslintrc.js:

module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
project: './tsconfig.json'
},
plugins: ['@typescript-eslint'],
extends: [
'eslint:recommended',
'@typescript-eslint/recommended',
'@typescript-eslint/recommended-requiring-type-checking'
],
rules: {
'@typescript-eslint/no-unused-vars': 'error',
'@typescript-eslint/explicit-function-return-type': 'warn',
'@typescript-eslint/no-explicit-any': 'warn',
'@typescript-eslint/no-unsafe-assignment': 'warn',
'@typescript-eslint/no-unsafe-member-access': 'warn',
'prefer-const': 'error',
'no-var': 'error'
},
env: {
node: true,
es6: true
}
};

Prettier Configuration

Create .prettierrc:

{
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"printWidth": 100,
"tabWidth": 2,
"useTabs": false
}

Package.json Scripts

Update your package.json with useful scripts:

{
"scripts": {
"build": "tsc",
"build:watch": "tsc --watch",
"dev": "tsc --watch",
"clean": "rimraf dist",
"lint": "eslint src/**/*.ts",
"lint:fix": "eslint src/**/*.ts --fix",
"format": "prettier --write src/**/*.ts",
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
"prepublishOnly": "npm run clean && npm run build",
"package": "npm run build && npm pack",
"start": "node dist/index.js"
}
}

Verification

Test SDK Installation

# Check SDK commands
qirvo-sdk --help

# Validate project structure
qirvo-sdk validate

# Test TypeScript compilation
npm run build

# Run linting
npm run lint

Create Test Plugin

Create src/index.ts:

import { BasePlugin, PluginRuntimeContext } from '@qirvo/plugin-sdk';

export default class TestPlugin extends BasePlugin {
async onInstall(context: PluginRuntimeContext): Promise<void> {
this.log('info', 'Test plugin installed successfully!');
console.log('Plugin SDK is working correctly');
}

async onEnable(context: PluginRuntimeContext): Promise<void> {
this.log('info', 'Test plugin enabled');

// Test storage
await this.setStorage('test', 'Hello, Qirvo!');
const value = await this.getStorage('test');

console.log('Storage test:', value);

// Test notification
await this.notify('Test', 'Plugin SDK setup complete!', 'success');
}
}

Create manifest.json:

{
"manifest_version": 1,
"name": "Test Plugin",
"version": "1.0.0",
"description": "Test plugin to verify SDK installation",
"type": "dashboard-widget",
"author": {
"name": "Your Name",
"email": "your.email@example.com"
},
"category": "utilities",
"permissions": ["storage-read", "storage-write", "notifications"],
"main": "dist/index.js",
"license": "MIT"
}

Build and Test

# Build the plugin
npm run build

# Check build output
ls -la dist/

# Test the plugin (if you have Qirvo CLI)
qirvo plugin test ./

Troubleshooting

Common Issues

Node.js Version Issues

# If using nvm (Node Version Manager)
nvm install 16
nvm use 16

# Verify version
node --version

TypeScript Compilation Errors

# Clear TypeScript cache
npx tsc --build --clean

# Reinstall TypeScript
npm uninstall -g typescript
npm install -g typescript@latest

# Check TypeScript configuration
npx tsc --showConfig

SDK Installation Issues

# Clear npm cache
npm cache clean --force

# Reinstall SDK
npm uninstall @qirvo/plugin-sdk
npm install @qirvo/plugin-sdk

# Check for conflicting global installations
npm list -g --depth=0

Permission Issues (macOS/Linux)

# Fix npm permissions
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

# Or use nvm instead of global npm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

Windows-Specific Issues

# Run as Administrator if needed
# Set execution policy for PowerShell scripts
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

# Use Windows Subsystem for Linux (WSL) as alternative
wsl --install

Getting Help

Check SDK Status

# Verify SDK installation
qirvo-sdk doctor

# Check environment
qirvo-sdk env

# Validate project
qirvo-sdk validate

Debug Information

# Get detailed version information
qirvo-sdk --version --verbose

# Check Node.js and npm configuration
npm config list
node -p "process.versions"

# Check TypeScript configuration
npx tsc --showConfig

Support Resources

Environment Variables

Create .env file for development:

# Development environment
NODE_ENV=development

# Qirvo API configuration
QIRVO_API_URL=https://api.qirvo.ai
QIRVO_API_KEY=your_development_api_key

# Plugin development settings
PLUGIN_DEBUG=true
PLUGIN_LOG_LEVEL=debug

# External service keys (for testing)
WEATHER_API_KEY=your_weather_api_key

Load environment variables in your plugin:

import * as dotenv from 'dotenv';

// Load environment variables in development
if (process.env.NODE_ENV === 'development') {
dotenv.config();
}

export default class MyPlugin extends BasePlugin {
async onEnable(context: PluginRuntimeContext): Promise<void> {
const apiKey = process.env.WEATHER_API_KEY;
if (!apiKey && process.env.NODE_ENV === 'development') {
this.log('warn', 'WEATHER_API_KEY not set in development environment');
}
}
}

Next: Your First Plugin to start building your first plugin.