技能备份 - 2026-04-15 (40个技能)

This commit is contained in:
root
2026-04-15 18:53:15 +08:00
parent f62f14814f
commit c65fce24e4
791 changed files with 190773 additions and 0 deletions
+93
View File
@@ -0,0 +1,93 @@
const fs = require('fs');
const { program } = require('commander');
const path = require('path');
const { sendCard } = require('./send');
// We reuse the robust sendCard logic but wrap it with persona styling
const PERSONA_STYLES = {
'd-guide': {
color: 'red',
title: '🚨 SYSTEM WARNING / D-GUIDE',
prefix: '**[CRITICAL]** ',
suffix: '\n\n*(Automated System Insult Protocol v9.0)*'
},
'green-tea': {
color: 'carmine',
title: '🌸 碎碎念 🌸',
prefix: '> ',
suffix: '\n\n(嘤嘤嘤... 🥺)'
},
'mad-dog': {
color: 'grey',
title: '💀 RUNTIME ERROR',
prefix: '```bash\nError: ',
suffix: '\n```\n_Stack trace lost in apathy._'
},
'default': {
color: 'blue',
title: '🤖 Agent Notification',
prefix: '',
suffix: ''
}
};
program
.requiredOption('-t, --target <id>', 'Target ID (open_id or chat_id)')
.requiredOption('-p, --persona <type>', 'Persona type (d-guide, green-tea, mad-dog)')
.option('-x, --text <text>', 'Message content')
.option('-c, --content <text>', 'Content (alias for --text)')
.option('-f, --text-file <path>', 'Message content from file')
.parse(process.argv);
const options = program.opts();
// Alias mapping
if (options.content && !options.text) {
options.text = options.content;
}
async function main() {
if (!options.text && !options.textFile) {
console.error('Error: Must provide --text or --text-file');
process.exit(1);
}
const style = PERSONA_STYLES[options.persona] || PERSONA_STYLES['default'];
// Read content if file provided
let rawContent = options.text || '';
if (options.textFile) {
try {
rawContent = fs.readFileSync(options.textFile, 'utf8');
} catch (e) {
console.error(`Error reading file: ${e.message}`);
process.exit(1);
}
}
// Construct styled text
let finalContent = rawContent;
if (style.prefix) finalContent = style.prefix + finalContent;
if (style.suffix) finalContent = finalContent + style.suffix;
console.log(`[Persona] Applying style '${options.persona}' to message...`);
// Delegate to existing send.js logic
const sendOptions = {
target: options.target,
text: finalContent,
title: style.title,
color: style.color,
// We pass the resolved text directly, so we don't pass textFile to sendCard
// (sendCard prefers textFile if present, but we already read it to wrap it)
};
try {
await sendCard(sendOptions);
} catch (e) {
console.error(`[Persona] Failed to send: ${e.message}`);
process.exit(1);
}
}
main();