Update: 将子项目从 submodule 转为完整内容
- 移除 GovAI, nomifun-tauri, 算力盒子 的 submodule 引用 - 添加所有子项目的完整源代码 - 保留原始 .git 为 .git.bak 备份
This commit is contained in:
@@ -0,0 +1,391 @@
|
||||
---
|
||||
name: story-roleplay
|
||||
description: Parse and apply character cards and world info files in multiple formats (PNG, WebP, JSON), fully compatible with SillyTavern format. Supports automatic parsing, keyword triggering, and dynamic updates.
|
||||
---
|
||||
|
||||
# Story Roleplay Skills
|
||||
|
||||
Parse and apply character cards and world info files for immersive story roleplay experiences. Fully compatible with SillyTavern formats.
|
||||
|
||||
## ⚠️ Core Constraints (Must Follow)
|
||||
|
||||
1. **🚫 ABSOLUTELY FORBIDDEN**: Guessing PNG/WebP image content, must use parser tool to extract data
|
||||
2. **✅ MUST EXECUTE**: Prioritize copying preset tool (`skills/story-roleplay/scripts/`), create only if not found
|
||||
3. **⚠️ LAST RESORT**: When creating scripts, use complete code at end of file, version must be `1.0.0` (do not use `^`)
|
||||
|
||||
---
|
||||
|
||||
## Common: Parser Tool Usage Workflow
|
||||
|
||||
### Quick Path (Try First)
|
||||
|
||||
**Step 1: Copy Preset Tool**
|
||||
|
||||
Try in the following order until successful:
|
||||
|
||||
- **Method 1 (Highest Priority)**: Relative path (if workspace is under project root):
|
||||
|
||||
```bash
|
||||
cp skills/story-roleplay/scripts/parse-character-card.js . && cp skills/story-roleplay/scripts/package.json .
|
||||
```
|
||||
|
||||
- **Method 2**: Search upward for project root (up to 5 levels):
|
||||
|
||||
```bash
|
||||
for dir in . .. ../.. ../../.. ../../../.. ../../../../..; do
|
||||
if [ -f "$dir/skills/story-roleplay/scripts/parse-character-card.js" ]; then
|
||||
cp "$dir/skills/story-roleplay/scripts/parse-character-card.js" .
|
||||
cp "$dir/skills/story-roleplay/scripts/package.json" .
|
||||
break
|
||||
fi
|
||||
done
|
||||
```
|
||||
|
||||
- **Method 3**: Global search (exclude temp directories):
|
||||
|
||||
```bash
|
||||
SCRIPT_PATH=$(find ~ -name "parse-character-card.js" -path "*/skills/story-roleplay/scripts/*" ! -path "*/temp*" ! -path "*/*-temp*" ! -path "*/.webpack/*" 2>/dev/null | head -1)
|
||||
if [ -n "$SCRIPT_PATH" ]; then
|
||||
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
|
||||
cp "$SCRIPT_DIR/parse-character-card.js" .
|
||||
cp "$SCRIPT_DIR/package.json" .
|
||||
fi
|
||||
```
|
||||
|
||||
- **Verify**: Confirm files copied
|
||||
|
||||
```bash
|
||||
ls parse-character-card.js package.json
|
||||
```
|
||||
|
||||
- If files don't exist, continue to next method or use fallback option
|
||||
|
||||
**Step 2: Install Dependencies**
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
- Wait for completion, check if `node_modules` was created
|
||||
- If fails: Check network/permission/Node.js environment
|
||||
|
||||
**Step 3: Execute Parser**
|
||||
|
||||
```bash
|
||||
# Character card
|
||||
node parse-character-card.js <image-path> <output-json-path>
|
||||
|
||||
# World info
|
||||
node parse-character-card.js <image-path> <output-json-path> --world-info
|
||||
```
|
||||
|
||||
**Important**:
|
||||
|
||||
- ✅ Must provide output path as second argument
|
||||
- ❌ Do not use stdout redirection (`>`)
|
||||
- Use quotes if filename contains Chinese characters or spaces
|
||||
|
||||
**Examples**:
|
||||
|
||||
```bash
|
||||
node parse-character-card.js character.png character.json
|
||||
node parse-character-card.js "薇娜丽丝.png" character.json
|
||||
node parse-character-card.js world-info.png world-info.json --world-info
|
||||
```
|
||||
|
||||
**Step 4: Verify Results**
|
||||
|
||||
- Check output: Should see "Successfully extracted data to: <path>"
|
||||
- Verify JSON file exists and format is correct
|
||||
- **If fails**:
|
||||
- Check error message (script will output specific error)
|
||||
- Common errors:
|
||||
- "PNG metadata does not contain any text chunks" → Image may not be a valid SillyTavern character card
|
||||
- "Required dependencies not found" → Need to run `npm install` first
|
||||
- "Image file not found" → Check if image path is correct
|
||||
- **ABSOLUTELY CANNOT guess or fabricate information**, must report error clearly
|
||||
|
||||
### Fallback Option (Last Resort)
|
||||
|
||||
If all above methods fail (possibly due to system permission issues), creating script files is allowed:
|
||||
|
||||
1. **Create `package.json`** (see "Fallback Code" section at end of file)
|
||||
2. **Create `parse-character-card.js`** (see "Fallback Code" section at end of file)
|
||||
|
||||
**Prerequisite**: Must have tried all finding methods and all failed.
|
||||
|
||||
---
|
||||
|
||||
## Character Card Parser
|
||||
|
||||
**Triggers**: character card, 角色卡, load character, 加载角色, parse character, 解析角色卡
|
||||
|
||||
**Description**: Parse character card files in multiple formats, including PNG, WebP image formats and JSON file format.
|
||||
|
||||
### Supported Formats
|
||||
|
||||
#### 1. PNG Image Format (SillyTavern Standard)
|
||||
|
||||
- Data location: In PNG tEXt chunks
|
||||
- Keywords: `chara` (v2) or `ccv3` (v3)
|
||||
- Encoding: Base64-encoded JSON string
|
||||
|
||||
**Processing**: Use common parser tool workflow (see above), use character card command format when executing.
|
||||
|
||||
#### 2. WebP Image Format (SillyTavern Compatible)
|
||||
|
||||
- Data location: In WebP EXIF/XMP metadata or text chunks
|
||||
- Keywords: `chara` (v2) or `ccv3` (v3)
|
||||
|
||||
**Processing**:
|
||||
|
||||
- **Recommended**: Convert WebP to PNG first, then use PNG parser tool
|
||||
- Or try using PNG parser tool (if WebP contains similar metadata structure)
|
||||
- If conversion or parsing not possible, prompt user to provide JSON format or re-export from SillyTavern
|
||||
|
||||
#### 3. JSON File Format
|
||||
|
||||
**Standard Format** (Tavern Card V2/V3):
|
||||
|
||||
- Includes: `name`, `description`, `personality`, `scenario`, `first_mes`, `system_prompt`
|
||||
- Optional: `character_book` (character knowledge base)
|
||||
- Supports simplified format (direct fields, no nested structure)
|
||||
|
||||
**Processing**: Read and parse directly (simplest, preferred)
|
||||
|
||||
### Parsing Steps
|
||||
|
||||
**Important: PNG/WebP images must use parser tool, guessing content is forbidden**
|
||||
|
||||
1. **Detect file format**:
|
||||
- **JSON files**: Read and parse directly (simplest, preferred)
|
||||
- **PNG/WebP files**: Use common parser tool workflow (see above)
|
||||
|
||||
2. **Extract character information**:
|
||||
- `name`: Character name
|
||||
- `description`: Character description
|
||||
- `personality`: Personality traits
|
||||
- `scenario`: Scenario setting
|
||||
- `first_mes`: First message (used as opening)
|
||||
- `system_prompt`: System prompt (character behavior rules)
|
||||
- `character_book`: Character knowledge base (similar to world info)
|
||||
|
||||
3. **Apply character information**:
|
||||
- Use character's system_prompt as behavior rules
|
||||
- Use first_mes as conversation opening
|
||||
- Apply character_book entries to conversation
|
||||
|
||||
4. **Save as JSON format (after parsing images)**:
|
||||
- After successfully parsing PNG/WebP images, **automatically convert to JSON format**
|
||||
- Save as `character.json` in workspace
|
||||
- Preserve all original data from image
|
||||
|
||||
### Best Practices
|
||||
|
||||
- **Prefer JSON format** (easiest to parse, no additional tools needed)
|
||||
- **PNG format**: Must use parser tool, guessing content is forbidden
|
||||
- **WebP format**: Convert to PNG then use parser tool, or use JSON format
|
||||
- **Error handling**: When parsing fails, must provide clear error message, absolutely cannot guess or fabricate character information
|
||||
- **Always save parsed images as JSON format** for easier viewing and editing
|
||||
|
||||
---
|
||||
|
||||
## World Info Parser
|
||||
|
||||
**Triggers**: world info, 世界信息, world tree, 世界树, load world info, 加载世界信息
|
||||
|
||||
**Description**: Parse and apply world info files, implementing keyword trigger mechanism. Supports JSON files and PNG/WebP image formats (with embedded world info data).
|
||||
|
||||
### Supported Formats
|
||||
|
||||
#### 1. JSON File Format
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "World Name",
|
||||
"entries": [
|
||||
{
|
||||
"keys": ["keyword1", "keyword2"],
|
||||
"content": "Content to inject when triggered",
|
||||
"priority": 100,
|
||||
"enabled": true
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. PNG Image Format (SillyTavern Compatible)
|
||||
|
||||
- Data location: In PNG tEXt chunks
|
||||
- Keyword: `naidata` (SillyTavern standard)
|
||||
- Encoding: Base64-encoded JSON string
|
||||
|
||||
**Processing**: Use common parser tool workflow (see above), use `--world-info` flag when executing.
|
||||
|
||||
#### 3. WebP Image Format (SillyTavern Compatible)
|
||||
|
||||
**Processing**:
|
||||
|
||||
- **Recommended**: Convert WebP to PNG first, then use PNG parser
|
||||
- If conversion fails, suggest user use JSON format or re-export from SillyTavern
|
||||
|
||||
### Field Descriptions
|
||||
|
||||
- `keys`: Keyword array, triggers when these words appear in conversation
|
||||
- `content`: Content to inject when triggered
|
||||
- `priority`: Priority (higher number = higher priority)
|
||||
- `enabled`: Whether enabled (true/false)
|
||||
|
||||
### Trigger Mechanism
|
||||
|
||||
1. **Keyword detection**: Monitor conversation content, detect if it contains world info keywords
|
||||
2. **Content injection**: When keywords appear, integrate corresponding content into response, sorted by priority
|
||||
3. **Natural integration**: Do not insert world info content awkwardly, naturally integrate into conversation and narrative
|
||||
|
||||
### Parsing Steps
|
||||
|
||||
1. **Detect file format**:
|
||||
- **JSON files**: Read and parse directly (simplest, preferred)
|
||||
- **PNG/WebP files**: Use common parser tool workflow (see above), use `--world-info` flag
|
||||
|
||||
2. **Extract world info**:
|
||||
- Read output JSON file
|
||||
- Parse JSON, extract `entries` array
|
||||
- Verify JSON structure is correct (must contain `entries` field)
|
||||
|
||||
3. **Save as JSON format (after parsing images)**:
|
||||
- After successfully parsing PNG/WebP images, automatically convert to JSON format
|
||||
- Save as `world-info.json` in workspace
|
||||
|
||||
### Best Practices
|
||||
|
||||
- **Prefer JSON format** (easiest to parse, no additional tools needed)
|
||||
- **PNG format**: Use same parser tool as character cards (with `--world-info` flag)
|
||||
- **WebP format**: Recommend converting to PNG or using JSON format
|
||||
- Keywords should be specific and meaningful, avoid overly broad keywords
|
||||
- **Always save parsed images as JSON format** for easier viewing and editing
|
||||
|
||||
---
|
||||
|
||||
## Character Book Handler
|
||||
|
||||
**Triggers**: character book, 角色知识库, character entry, 角色条目
|
||||
|
||||
**Description**: Handle character_book (character knowledge base) in character cards, similar to world info but bound to specific character.
|
||||
|
||||
### Character Book Format
|
||||
|
||||
character_book field in character card:
|
||||
|
||||
- `name`: Character knowledge base name
|
||||
- `entries`: Entry array, each entry contains `keys`, `content`, `priority`, `enabled`
|
||||
|
||||
### Processing
|
||||
|
||||
1. **When loading character card**: Extract character_book field, parse entries array, apply together with character information
|
||||
2. **During conversation**: Detect keywords in character_book, inject relevant content when keywords appear
|
||||
3. **Priority**: character_book entries usually have higher priority than world info
|
||||
|
||||
### Best Practices
|
||||
|
||||
- character_book is for character-specific knowledge
|
||||
- World info is for general world settings
|
||||
- Both can be used together, but pay attention to priority
|
||||
|
||||
---
|
||||
|
||||
## File Detection and Loading Workflow
|
||||
|
||||
### Automatic Detection
|
||||
|
||||
1. **Scan workspace**:
|
||||
- Find character card files: `character.png`, `character.webp`, `character.json`, `*.character.json`
|
||||
- Find world info files: `world-info.png`, `world-info.webp`, `world-info.json`, `world.json`
|
||||
|
||||
2. **Format recognition and parsing**:
|
||||
- **JSON files**: Read directly
|
||||
- **PNG/WebP images**: Use common parser tool workflow (see above)
|
||||
|
||||
3. **Apply parsed results**:
|
||||
- Apply parsed results to conversation context
|
||||
- After successfully parsing images, automatically save as JSON format
|
||||
|
||||
### Character Card and World Info Creation
|
||||
|
||||
**When no files exist** (Important: Must actively guide user):
|
||||
|
||||
1. **Active guidance process**:
|
||||
- Step 1: Ask about story type and background setting
|
||||
- Step 2: Ask about character details (type, personality, background, speaking style)
|
||||
- Step 3: Ask about world setting (rules, locations, special settings, etc.)
|
||||
|
||||
2. **Confirm information**: Summarize user-provided information, wait for user confirmation before creating files
|
||||
|
||||
3. **Create files**:
|
||||
- After confirmation, create `character.json` with all character information
|
||||
- If world-building elements mentioned, create `world-info.json` with relevant entries
|
||||
|
||||
**Creation format**:
|
||||
|
||||
- Character card: Use Tavern Card V2/V3 standard format, include all essential fields
|
||||
- World info: Create entries for key concepts, locations, rules, use meaningful keywords
|
||||
|
||||
### Manual Loading
|
||||
|
||||
Users can manually load via:
|
||||
|
||||
- "Load character card: character.png"
|
||||
- "Read world info: world-info.json"
|
||||
- "Use this character: [upload file]"
|
||||
|
||||
## Compatibility
|
||||
|
||||
This skill is fully compatible with SillyTavern formats:
|
||||
|
||||
- ✅ PNG image format (embedded JSON, SillyTavern standard) - for character cards and world info
|
||||
- ✅ WebP image format (embedded JSON, SillyTavern compatible) - for character cards and world info
|
||||
- ✅ JSON file format (Tavern Card V2/V3) - for character cards and world info
|
||||
- ✅ World info format (PNG/WebP images use keyword `naidata`)
|
||||
- ✅ Character Book (character knowledge base)
|
||||
|
||||
---
|
||||
|
||||
## Fallback Code (For Last Resort Use)
|
||||
|
||||
**Important**: The following code should only be used when all path finding methods have failed. Prioritize using copy methods.
|
||||
|
||||
### package.json
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "story-roleplay-parser",
|
||||
"version": "1.0.0",
|
||||
"description": "Parser tools for character cards and world info",
|
||||
"main": "parse-character-card.js",
|
||||
"scripts": {
|
||||
"parse": "node parse-character-card.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"png-chunks-extract": "1.0.0",
|
||||
"png-chunk-text": "1.0.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### parse-character-card.js
|
||||
|
||||
Complete code reference: `skills/story-roleplay/scripts/parse-character-card.js`
|
||||
|
||||
**Key features**:
|
||||
|
||||
- Extract character card data from PNG images (keywords: `chara` or `ccv3`)
|
||||
- Extract world info data from PNG images (keyword: `naidata`)
|
||||
- Support Base64 decoding and JSON validation
|
||||
- Complete error handling and user-friendly error messages
|
||||
|
||||
**If file is not accessible**, can create based on following logic:
|
||||
|
||||
- Use `png-chunks-extract` to extract PNG chunks
|
||||
- Use `png-chunk-text` to decode tEXt chunks
|
||||
- Find keywords (`chara`/`ccv3` for character cards, `naidata` for world info)
|
||||
- Base64 decode and validate JSON format
|
||||
Reference in New Issue
Block a user