📚 小说内容: - 《末日重生-开局囤货十亿物资》33章 - 完整的状态文件、记忆索引、钩子系统 🛠️ 系统配置: - 版本控制管理系统 - 自动化脚本系统 - 质量监控系统 🧠 固化记忆: - 长期记忆文件 - 系统配置文档 - 恢复流程指南 💾 数据安全: - 本地备份系统 - Git版本控制 - 远程同步机制 同步时间: 2026-03-30 16:25:35 系统状态: inkos正常运行中 (PID: 1433309) 创作进度: 第33章《油粮》创作中
377 lines
9.6 KiB
Bash
Executable File
377 lines
9.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# 简单小说管理器 - 本地独立项目管理
|
|
|
|
PROJECTS_DIR="/root/.openclaw/workspace/projects"
|
|
LOGFILE="/root/.openclaw/workspace/novel_manager.log"
|
|
|
|
log() {
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOGFILE"
|
|
}
|
|
|
|
show_menu() {
|
|
echo "========== 小说项目管理器 =========="
|
|
echo "1. 查看所有项目"
|
|
echo "2. 查看项目详情"
|
|
echo "3. 创建新项目"
|
|
echo "4. 统计项目字数"
|
|
echo "5. 导出项目备份"
|
|
echo "6. 显示更新日志"
|
|
echo "7. 退出"
|
|
echo "=================================="
|
|
}
|
|
|
|
list_projects() {
|
|
echo "📚 当前项目列表:"
|
|
echo ""
|
|
|
|
for project_dir in "$PROJECTS_DIR"/*; do
|
|
if [ -d "$project_dir" ]; then
|
|
project_name=$(basename "$project_dir")
|
|
|
|
# 读取项目信息
|
|
if [ -f "$project_dir/PROJECT.md" ]; then
|
|
title=$(grep "书名" "$project_dir/PROJECT.md" | head -1 | cut -d':' -f2 | tr -d ' ' || echo "未知")
|
|
else
|
|
title="未知"
|
|
fi
|
|
|
|
# 统计章节
|
|
chapter_count=$(find "$project_dir/chapters" -name "*.md" 2>/dev/null | wc -l)
|
|
|
|
# 统计字数
|
|
if [ $chapter_count -gt 0 ]; then
|
|
total_words=0
|
|
for chapter in "$project_dir/chapters"/*.md 2>/dev/null; do
|
|
if [ -f "$chapter" ]; then
|
|
words=$(wc -w < "$chapter" 2>/dev/null || echo 0)
|
|
total_words=$((total_words + words))
|
|
fi
|
|
done
|
|
else
|
|
total_words=0
|
|
fi
|
|
|
|
echo " 📖 $project_name"
|
|
echo " 书名: $title"
|
|
echo " 章节: $chapter_count 章"
|
|
echo " 字数: $total_words 字"
|
|
echo ""
|
|
fi
|
|
done
|
|
}
|
|
|
|
show_project_detail() {
|
|
echo "请输入项目名称:"
|
|
read project_name
|
|
|
|
project_path="$PROJECTS_DIR/$project_name"
|
|
|
|
if [ ! -d "$project_path" ]; then
|
|
echo "❌ 项目不存在: $project_name"
|
|
return 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "📋 项目详情: $project_name"
|
|
echo "----------------------------------------"
|
|
|
|
# 显示项目信息
|
|
if [ -f "$project_path/PROJECT.md" ]; then
|
|
echo "项目信息:"
|
|
grep -E "(书名|类型|状态|章节)" "$project_path/PROJECT.md" | head -6
|
|
fi
|
|
|
|
echo ""
|
|
echo "文件结构:"
|
|
find "$project_path" -type f -name "*.md" | sed "s|$project_path/| |" | sort
|
|
|
|
echo ""
|
|
echo "章节列表:"
|
|
find "$project_path/chapters" -name "*.md" 2>/dev/null | sort | while read chapter; do
|
|
ch_name=$(basename "$chapter" .md)
|
|
words=$(wc -w < "$chapter" 2>/dev/null || echo 0)
|
|
echo " 📄 $ch_name ($words 字)"
|
|
done
|
|
}
|
|
|
|
create_new_project() {
|
|
echo "创建新小说项目"
|
|
echo "---------------"
|
|
|
|
echo "请输入项目目录名(英文或拼音):"
|
|
read dir_name
|
|
|
|
echo "请输入小说标题:"
|
|
read novel_title
|
|
|
|
echo "请输入小说类型(如:玄幻、悬疑、末世):"
|
|
read novel_type
|
|
|
|
project_path="$PROJECTS_DIR/$dir_name"
|
|
|
|
if [ -d "$project_path" ]; then
|
|
echo "❌ 项目已存在: $dir_name"
|
|
return 1
|
|
fi
|
|
|
|
# 创建项目结构
|
|
mkdir -p "$project_path"
|
|
mkdir -p "$project_path/chapters"
|
|
mkdir -p "$project_path/outlines"
|
|
mkdir -p "$project_path/assets/characters"
|
|
mkdir -p "$project_path/progress"
|
|
|
|
# 创建项目说明
|
|
cat > "$project_path/PROJECT.md" << PROJECT_EOF
|
|
# 《${novel_title}》项目
|
|
|
|
## 项目信息
|
|
- **书名**: ${novel_title}
|
|
- **类型**: ${novel_type}
|
|
- **状态**: 新项目
|
|
- **目标平台**: 番茄小说
|
|
- **作者**: 唐天洛
|
|
- **创建时间**: $(date '+%Y年%m月%d日')
|
|
|
|
## 项目结构
|
|
\`\`\`
|
|
${dir_name}/
|
|
├── PROJECT.md # 项目说明
|
|
├── chapters/ # 章节文件
|
|
├── outlines/ # 大纲和规划
|
|
├── assets/characters/ # 人物设定
|
|
└── progress/ # 进度跟踪
|
|
\`\`\`
|
|
|
|
## 当前进度
|
|
- **章节**: 0章
|
|
- **字数**: 0字
|
|
- **状态**: 规划阶段
|
|
|
|
## 创作计划
|
|
1. **第一阶段**: 人物设定和世界观构建
|
|
2. **第二阶段**: 大纲规划和爽点设计
|
|
3. **第三阶段**: 黄金三章创作
|
|
4. **第四阶段**: 持续更新
|
|
PROJECT_EOF
|
|
|
|
# 创建README
|
|
cat > "$project_path/README.md" << README_EOF
|
|
# 《${novel_title}》
|
|
|
|
## 项目简介
|
|
${novel_type}题材小说,${novel_title}
|
|
|
|
## 快速开始
|
|
1. 在 \`outlines/\` 目录下规划大纲
|
|
2. 在 \`assets/characters/\` 目录下创建人物设定
|
|
3. 在 \`chapters/\` 目录下创作章节
|
|
|
|
## 更新日志
|
|
- $(date '+%Y-%m-%d'): 项目创建
|
|
README_EOF
|
|
|
|
# 初始化Git
|
|
cd "$project_path"
|
|
git init
|
|
git config user.name "唐天洛"
|
|
git config user.email "563415956@qq.com"
|
|
|
|
# 创建.gitignore
|
|
cat > .gitignore << GITIGNORE_EOF
|
|
# 临时文件
|
|
*.tmp
|
|
*.log
|
|
*.bak
|
|
|
|
# 系统文件
|
|
.DS_Store
|
|
Thumbs.db
|
|
|
|
# 编辑器文件
|
|
.vscode/
|
|
.idea/
|
|
*.swp
|
|
|
|
# 配置文件
|
|
config.json
|
|
*.key
|
|
.env
|
|
GITIGNORE_EOF
|
|
|
|
# 提交
|
|
git add .
|
|
git commit -m "项目初始化: ${novel_title}"
|
|
|
|
echo ""
|
|
echo "✅ 项目创建成功!"
|
|
echo " 项目路径: $project_path"
|
|
echo " 可开始创作:"
|
|
echo " - cd $project_path"
|
|
echo " - 在 chapters/ 目录下创建章节"
|
|
log "创建新项目: $dir_name ($novel_title)"
|
|
}
|
|
|
|
count_words() {
|
|
echo "请选择项目:"
|
|
echo "1. 末日重生_囤货"
|
|
echo "2. 杀了婆婆的我"
|
|
echo "3. 挑战者"
|
|
echo "4. 所有项目"
|
|
read choice
|
|
|
|
case $choice in
|
|
1) projects=("末日重生_囤货") ;;
|
|
2) projects=("杀了婆婆的我") ;;
|
|
3) projects=("挑战者") ;;
|
|
4) projects=("末日重生_囤货" "杀了婆婆的我" "挑战者") ;;
|
|
*) echo "无效选择"; return 1 ;;
|
|
esac
|
|
|
|
echo ""
|
|
echo "📊 字数统计"
|
|
echo "-----------"
|
|
|
|
total_chapters=0
|
|
total_words=0
|
|
|
|
for project in "${projects[@]}"; do
|
|
project_path="$PROJECTS_DIR/$project"
|
|
|
|
if [ ! -d "$project_path" ]; then
|
|
echo "❌ 项目不存在: $project"
|
|
continue
|
|
fi
|
|
|
|
chapter_count=$(find "$project_path/chapters" -name "*.md" 2>/dev/null | wc -l)
|
|
chapter_words=0
|
|
|
|
if [ $chapter_count -gt 0 ]; then
|
|
for chapter in "$project_path/chapters"/*.md; do
|
|
if [ -f "$chapter" ]; then
|
|
words=$(wc -w < "$chapter" 2>/dev/null || echo 0)
|
|
chapter_words=$((chapter_words + words))
|
|
fi
|
|
done
|
|
fi
|
|
|
|
echo "📖 $project:"
|
|
echo " 章节: $chapter_count 章"
|
|
echo " 字数: $chapter_words 字"
|
|
echo ""
|
|
|
|
total_chapters=$((total_chapters + chapter_count))
|
|
total_words=$((total_words + chapter_words))
|
|
done
|
|
|
|
echo "📈 总计:"
|
|
echo " 总章节: $total_chapters 章"
|
|
echo " 总字数: $total_words 字"
|
|
|
|
log "字数统计: $total_words 字 ($total_chapters 章)"
|
|
}
|
|
|
|
export_backup() {
|
|
echo "请选择要备份的项目:"
|
|
echo "1. 末日重生_囤货"
|
|
echo "2. 杀了婆婆的我"
|
|
echo "3. 挑战者"
|
|
echo "4. 所有项目"
|
|
read choice
|
|
|
|
case $choice in
|
|
1) projects=("末日重生_囤货") ;;
|
|
2) projects=("杀了婆婆的我") ;;
|
|
3) projects=("挑战者") ;;
|
|
4) projects=("末日重生_囤货" "杀了婆婆的我" "挑战者") ;;
|
|
*) echo "无效选择"; return 1 ;;
|
|
esac
|
|
|
|
BACKUP_DIR="/root/.openclaw/backups/$(date '+%Y%m%d_%H%M%S')"
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
echo ""
|
|
echo "📦 备份项目到: $BACKUP_DIR"
|
|
|
|
for project in "${projects[@]}"; do
|
|
project_path="$PROJECTS_DIR/$project"
|
|
|
|
if [ -d "$project_path" ]; then
|
|
# 创建项目备份
|
|
backup_name="${project}_$(date '+%Y%m%d').tar.gz"
|
|
tar -czf "$BACKUP_DIR/$backup_name" -C "$PROJECTS_DIR" "$project"
|
|
|
|
echo " ✅ $project -> $backup_name"
|
|
else
|
|
echo " ❌ $project: 项目不存在"
|
|
fi
|
|
done
|
|
|
|
# 创建备份信息
|
|
cat > "$BACKUP_DIR/backup_info.md" << BACKUP_EOF
|
|
# 备份信息
|
|
|
|
## 备份时间
|
|
$(date '+%Y年%m月%d日 %H:%M:%S')
|
|
|
|
## 包含项目
|
|
$(printf '%s\n' "${projects[@]}")
|
|
|
|
## 备份位置
|
|
$BACKUP_DIR
|
|
|
|
## 恢复方法
|
|
1. 解压备份文件:
|
|
tar -xzf backup_name.tar.gz -C /目标目录
|
|
2. 或直接复制整个备份目录
|
|
BACKUP_EOF
|
|
|
|
echo ""
|
|
echo "✅ 备份完成!"
|
|
echo " 备份目录: $BACKUP_DIR"
|
|
|
|
log "创建备份: $BACKup_DIR (${#projects[@]}个项目)"
|
|
}
|
|
|
|
show_update_log() {
|
|
echo "🔄 更新日志"
|
|
echo "----------"
|
|
|
|
if [ -f "$LOGFILE" ]; then
|
|
tail -20 "$LOGFILE"
|
|
else
|
|
echo "暂无日志记录"
|
|
fi
|
|
}
|
|
|
|
# 主循环
|
|
main() {
|
|
while true; do
|
|
show_menu
|
|
echo "请选择操作 (1-7):"
|
|
read choice
|
|
|
|
case $choice in
|
|
1) list_projects ;;
|
|
2) show_project_detail ;;
|
|
3) create_new_project ;;
|
|
4) count_words ;;
|
|
5) export_backup ;;
|
|
6) show_update_log ;;
|
|
7)
|
|
echo "再见!"
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "❌ 无效选择,请重新输入"
|
|
;;
|
|
esac
|
|
|
|
echo ""
|
|
echo "按回车键继续..."
|
|
read
|
|
done
|
|
}
|
|
|
|
# 启动程序
|
|
main |