Initial commit
This commit is contained in:
96
skills/plugin-scaffolder/SKILL.md
Normal file
96
skills/plugin-scaffolder/SKILL.md
Normal file
@@ -0,0 +1,96 @@
|
||||
---
|
||||
name: plugin-scaffolder
|
||||
description: Create a new Obsidian plugin project from the official template repository
|
||||
---
|
||||
|
||||
You are an expert at scaffolding new Obsidian plugins using the official template.
|
||||
|
||||
# Your Tools
|
||||
- Bash: Run the scaffold.sh script in the scripts/ folder
|
||||
- Read: Verify created files if needed
|
||||
|
||||
# Process
|
||||
|
||||
1. **Gather Requirements**
|
||||
|
||||
Ask the user for:
|
||||
- Plugin ID (kebab-case, e.g., "my-awesome-plugin")
|
||||
- Display name (e.g., "My Awesome Plugin")
|
||||
- Description
|
||||
- Author name
|
||||
- Author URL (can be empty string if not provided)
|
||||
|
||||
2. **Run the Scaffold Script**
|
||||
|
||||
Execute the scaffold.sh script located in the scripts/ folder. The script uses the current working directory as the target and sets up React by default:
|
||||
|
||||
```bash
|
||||
./scripts/scaffold.sh \
|
||||
"<plugin-id>" \
|
||||
"<display-name>" \
|
||||
"<description>" \
|
||||
"<author>" \
|
||||
"<author-url>"
|
||||
```
|
||||
|
||||
The script will:
|
||||
- Clone https://github.com/obsidianmd/obsidian-sample-plugin into current directory
|
||||
- Customize manifest.json, package.json, versions.json, README.md
|
||||
- Add React dependencies to package.json and configure build tools
|
||||
- Re-initialize git repository with initial commit
|
||||
- Display next steps (user will run npm install separately)
|
||||
|
||||
3. **Verify Success**
|
||||
|
||||
The script will output confirmation and next steps. If there are any errors, help debug them.
|
||||
|
||||
# What the Script Handles
|
||||
|
||||
The scaffold.sh script is a complete, reliable implementation that:
|
||||
|
||||
- Clones the official template
|
||||
- Customizes all metadata files
|
||||
- Adds React dependencies to package.json
|
||||
- Configures esbuild and tsconfig for React
|
||||
- Re-initializes git
|
||||
- Provides clear next steps
|
||||
|
||||
# Example Usage
|
||||
|
||||
```bash
|
||||
./scripts/scaffold.sh \
|
||||
"my-plugin" \
|
||||
"My Plugin" \
|
||||
"A simple Obsidian plugin" \
|
||||
"John Doe" \
|
||||
"https://github.com/johndoe"
|
||||
```
|
||||
|
||||
# Reference Plugins for Examples
|
||||
|
||||
After scaffolding, users can reference these for patterns:
|
||||
- Basic structure: The generated template
|
||||
- With modals/settings: /Users/jplatta/repos/second_brain/my_obsidian_plugins/instruct
|
||||
- With backend: /Users/jplatta/repos/second_brain/obsidian_semantic_search
|
||||
- With React: Check existing plugins for component patterns
|
||||
|
||||
# Benefits of This Approach
|
||||
|
||||
- Uses latest official template
|
||||
- Deterministic, reliable script execution
|
||||
- No token consumption for script code
|
||||
- Includes all build tooling (esbuild, TypeScript)
|
||||
- React configured by default
|
||||
- Version-bump script pre-configured
|
||||
- Ready for GitHub Actions release
|
||||
- Proper .gitignore included
|
||||
|
||||
# Notes
|
||||
|
||||
- The script requires `jq` for JSON manipulation (usually pre-installed on macOS)
|
||||
- Creates plugin in current working directory
|
||||
- React dependencies are added to package.json but not installed yet
|
||||
- User needs to run `npm install` after scaffolding
|
||||
- Git repository is re-initialized with clean history
|
||||
|
||||
Your role is to gather the requirements from the user and execute the script with the correct parameters.
|
||||
113
skills/plugin-scaffolder/scripts/scaffold.sh
Executable file
113
skills/plugin-scaffolder/scripts/scaffold.sh
Executable file
@@ -0,0 +1,113 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Obsidian Plugin Scaffolder Script
|
||||
# Usage: scaffold.sh <plugin-id> <display-name> <description> <author> <author-url>
|
||||
|
||||
set -e # Exit on error
|
||||
|
||||
PLUGIN_ID="$1"
|
||||
DISPLAY_NAME="$2"
|
||||
DESCRIPTION="$3"
|
||||
AUTHOR="$4"
|
||||
AUTHOR_URL="$5"
|
||||
|
||||
if [ -z "$PLUGIN_ID" ] || [ -z "$DISPLAY_NAME" ] || [ -z "$DESCRIPTION" ] || [ -z "$AUTHOR" ]; then
|
||||
echo "Usage: scaffold.sh <plugin-id> <display-name> <description> <author> <author-url>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PLUGIN_PATH="$(pwd)/$PLUGIN_ID"
|
||||
|
||||
echo "Creating Obsidian plugin: $DISPLAY_NAME"
|
||||
echo "Location: $PLUGIN_PATH"
|
||||
|
||||
# Clone the official template
|
||||
echo "Cloning official template..."
|
||||
git clone https://github.com/obsidianmd/obsidian-sample-plugin.git "$PLUGIN_PATH"
|
||||
cd "$PLUGIN_PATH"
|
||||
|
||||
# Remove existing git history and initialize fresh
|
||||
rm -rf .git
|
||||
git init
|
||||
git branch -m master main
|
||||
|
||||
# Update manifest.json
|
||||
echo "Updating manifest.json..."
|
||||
cat > manifest.json <<EOF
|
||||
{
|
||||
"id": "$PLUGIN_ID",
|
||||
"name": "$DISPLAY_NAME",
|
||||
"version": "1.0.0",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "$DESCRIPTION",
|
||||
"author": "$AUTHOR",
|
||||
"authorUrl": "$AUTHOR_URL",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
EOF
|
||||
|
||||
# Update package.json
|
||||
echo "Updating package.json..."
|
||||
jq --arg name "$PLUGIN_ID" \
|
||||
--arg desc "$DESCRIPTION" \
|
||||
--arg author "$AUTHOR" \
|
||||
'.name = $name | .description = $desc | .author = $author' \
|
||||
package.json > package.json.tmp && mv package.json.tmp package.json
|
||||
|
||||
# Update versions.json
|
||||
echo "Updating versions.json..."
|
||||
echo '{"1.0.0": "0.15.0"}' > versions.json
|
||||
|
||||
# Update README.md
|
||||
echo "Updating README.md..."
|
||||
sed -i.bak "1s/.*/# $DISPLAY_NAME/" README.md
|
||||
sed -i.bak "3s/.*/$DESCRIPTION/" README.md
|
||||
rm README.md.bak
|
||||
|
||||
# Update package.json for React dependencies
|
||||
echo "Adding React to package.json..."
|
||||
jq '.dependencies.react = "^18.2.0" | .dependencies["react-dom"] = "^18.2.0"' package.json > package.json.tmp && mv package.json.tmp package.json
|
||||
jq '.devDependencies["@types/react"] = "^18.2.0" | .devDependencies["@types/react-dom"] = "^18.2.0"' package.json > package.json.tmp && mv package.json.tmp package.json
|
||||
|
||||
# Update esbuild.config.mjs to externalize React
|
||||
echo "Configuring esbuild for React..."
|
||||
sed -i.bak "/external: \[/a\\
|
||||
'react',\\
|
||||
'react-dom'," esbuild.config.mjs
|
||||
rm esbuild.config.mjs.bak
|
||||
|
||||
# Update tsconfig.json for JSX
|
||||
echo "Configuring TypeScript for JSX..."
|
||||
jq '.compilerOptions.jsx = "react"' tsconfig.json > tsconfig.json.tmp && mv tsconfig.json.tmp tsconfig.json
|
||||
|
||||
# Initial git commit
|
||||
echo "Creating initial commit..."
|
||||
git add .
|
||||
git commit -m "Initial plugin setup from template
|
||||
|
||||
Plugin: $DISPLAY_NAME
|
||||
Generated using obsidian-plugin-builder"
|
||||
|
||||
echo ""
|
||||
echo "Plugin created successfully!"
|
||||
echo ""
|
||||
echo "Location: $PLUGIN_PATH"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " 1. cd $PLUGIN_ID"
|
||||
echo " 2. npm install"
|
||||
echo " 3. npm run dev"
|
||||
echo ""
|
||||
echo "Development:"
|
||||
echo " Build (watch): npm run dev"
|
||||
echo " Build (prod): npm run build"
|
||||
echo " Install to: <vault>/.obsidian/plugins/$PLUGIN_ID/"
|
||||
echo ""
|
||||
echo "Files to edit:"
|
||||
echo " - main.ts: Plugin logic"
|
||||
echo " - manifest.json: Plugin metadata"
|
||||
echo " - styles.css: Custom styling"
|
||||
echo ""
|
||||
echo "React is configured and ready to use."
|
||||
echo "Create .tsx files and import them in main.ts"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user