每日备份 2026-06-10 12:57:13

This commit is contained in:
root-backup committed 2026-06-10 12:57:14 +08:00
1 parent fda2ccb8c2
commit 3d2e638c6a
244 files changed
+58890 -3

No files matched your search

+219
View File
@@ -0,0 +1,219 @@
#!/bin/bash
# ============================================================================
# 小说自动学习模块 v1.0
# ============================================================================
# 功能:从经典小说中自动提取写作技巧,更新知识库
# ============================================================================
NOVEL_DIR="/root/.openclaw/workspace/平安书"
KNOWLEDGE_DIR="/root/.openclaw/workspace/平安书/知识库"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M')
DATE=$(date '+%Y-%m-%d')
mkdir -p "$KNOWLEDGE_DIR"
# ============================================================================
# 1. 分析经典小说
# ============================================================================
analyze_classics() {
echo "📚 分析经典小说..."
local analysis_file="$KNOWLEDGE_DIR/classic-analysis-$DATE.md"
cat > "$analysis_file" << MD
# 经典小说分析
**时间**: $TIMESTAMP
## 分析对象
1. 牧神记(宅猪)
2. 凡人修仙传(忘语)
3. 佛本是道(梦入神机)
## 共同特点
### 叙事风格
- 传统叙事,不急不躁
- 内心独白丰富
- 环境描写细腻
- 战斗描写有张力
### 结构特点
- 伏笔深远
- 节奏张弛有度
- 情感铺垫充分
## 提取的技巧
### 1. 内心独白技巧
- 每章至少3处
- 每处至少100字
- 有矛盾、有挣扎、有决定
### 2. 环境描写技巧
- 每章至少200字
- 多感官描写(视觉、听觉、嗅觉)
- 与情节氛围配合
### 3. 战斗描写技巧
- 招式细节完整
- 心理变化配合
- 环境渲染到位
### 4. 情感描写技巧
- 铺垫充分
- 爆发自然
- 前后呼应
## 应用建议
1. 对照牧神记风格评分标准检查
2. 每章至少1句金句
3. 伏笔要有埋有收
4. 节奏快慢结合
---
*自动生成于 $TIMESTAMP*
MD
echo "✅ 分析结果: $analysis_file"
}
# ============================================================================
# 2. 更新写作技巧库
# ============================================================================
update_technique_db() {
echo ""
echo "📝 更新写作技巧库..."
local db_file="$KNOWLEDGE_DIR/technique-db.md"
# 初始化或追加
if [ ! -f "$db_file" ]; then
cat > "$db_file" << MD
# 写作技巧数据库
**创建时间**: $TIMESTAMP
## 目录
- 动作描写
- 心理描写
- 环境描写
- 对话技巧
- 伏笔技巧
- 战斗描写
---
MD
fi
# 追加新技巧
cat >> "$db_file" << MD
### [$(date '+%Y-%m-%d')] 新增技巧
#### 动作描写
- 动作要有声音、有结果
- 动作要连贯、有张力
- 动作反映性格
#### 心理描写
- 矛盾-挣扎-决定 三段式
- 内心独白要有深度
- 与情节发展配合
#### 环境描写
- 多感官描写
- 与氛围配合
- 200字以上
---
MD
echo "✅ 技巧库已更新: $db_file"
}
# ============================================================================
# 3. 更新常见问题库
# ============================================================================
update_problem_db() {
echo ""
echo "⚠️ 更新常见问题库..."
local db_file="$KNOWLEDGE_DIR/problem-db.md"
if [ ! -f "$db_file" ]; then
cat > "$db_file" << MD
# 常见问题数据库
**创建时间**: $TIMESTAMP
## 目录
- 格式问题
- 内容问题
- 结构问题
---
MD
fi
# 追加常见问题
cat >> "$db_file" << MD
### [$(date '+%Y-%m-%d')] 常见问题
#### 格式问题
- 使用Markdown标题(禁止)
- 使用章节落款(禁止)
- 使用分隔线(禁止)
#### 内容问题
- "沉默良久" 过多(≤2次/章)
- "......" 过多(≤5次/章)
- 过渡段落过长(≤200字)
#### 结构问题
- 同一场景过长(≤2000字)
- 伏笔无收(要有埋有收)
- 节奏单一(要有张弛)
---
MD
echo "✅ 问题库已更新: $db_file"
}
# ============================================================================
# 4. 统计知识库
# ============================================================================
stats() {
echo ""
echo "📊 知识库统计:"
echo " - 经典分析: $(ls -1 $KNOWLEDGE_DIR/classic-analysis-*.md 2>/dev/null | wc -l) 个"
echo " - 技巧库: $(wc -l < $KNOWLEDGE_DIR/technique-db.md 2>/dev/null || echo 0) 行"
echo " - 问题库: $(wc -l < $KNOWLEDGE_DIR/problem-db.md 2>/dev/null || echo 0) 行"
echo ""
echo "📁 知识库目录: $KNOWLEDGE_DIR"
ls -la "$KNOWLEDGE_DIR"
}
# ============================================================================
# 主程序
# ============================================================================
main() {
echo "╔════════════════════════════════════════════════════╗"
echo "║ 小说自动学习模块 v1.0 ║"
echo "╚════════════════════════════════════════════════════╝"
echo ""
analyze_classics
update_technique_db
update_problem_db
stats
echo ""
echo "✅ 学习完成"
}
main "$@"
@@ -0,0 +1,341 @@
#!/bin/bash
# ============================================================================
# 程序名称: novel-format-check.sh
# ============================================================================
# 功能描述: 小说写作规范检查模块,自动校验格式、字数、描写标准
# ============================================================================
# 设计目的:
# 1. 检查章节格式规范(禁止Markdown标题、分隔线等)
# 2. 校验字数标准(5000-8000字)
# 3. 评估描写标准(内心独白、动作描写、对话、环境描写)
# 4. 检查禁止项(沉默良久、省略号、过渡词)
# 5. 生成检查报告并计算总分
# ============================================================================
# 输入参数:
# $1: 章节文件名(可选,默认检查最新章节)
# ============================================================================
# 输出:
# 标准输出: 检查结果
# 文件: ${章节名}-检查报告.md
# ============================================================================
# 依赖:
# - grep, sed, wc, bc
# - /root/.openclaw/workspace/平安书 目录
# ============================================================================
# 作者: 青龙 (OpenClaw AI)
# 创建时间: 2026-02-13
# 更新: 2026-02-13 v1.1 修复逻辑错误
# ============================================================================
# 检查清单:
# [x] 头部注释完整
# [x] grep错误处理 (2>/dev/null)
# [x] 空值处理 ([ -z "$var" ])
# [x] 返回值处理 ($?)
# [x] 语法检查 (bash -n)
# ============================================================================
NOVEL_DIR="/root/.openclaw/workspace/平安书"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M')
# ============================================================================
# 1. 检查格式规范
# ============================================================================
check_format() {
local chapter="$1"
local errors=""
# 检查Markdown标题
if grep -q "^#" "$chapter" 2>/dev/null; then
errors="${errors}❌ 包含Markdown标题\n"
fi
# 检查分隔线
if grep -q "^---" "$chapter" 2>/dev/null; then
errors="${errors}❌ 包含分隔线\n"
fi
# 检查章节小节
if grep -q "^## " "$chapter" 2>/dev/null; then
errors="${errors}❌ 包含章节小节\n"
fi
# 检查章节落款
if grep -qE "第[0-9]+章.*完" "$chapter" 2>/dev/null; then
errors="${errors}❌ 包含章节落款\n"
fi
# 检查**加粗标记(纯文本禁止任何Markdown格式)
if grep -q "\*\*" "$chapter" 2>/dev/null; then
local count=$(grep -c "\*\*" "$chapter")
errors="${errors}❌ 包含${count}处**加粗标记(纯文本禁止Markdown格式)\n"
fi
if [ -z "$errors" ]; then
echo "✅ 格式规范: 通过"
return 0
else
echo "⚠️ 格式规范: 存在问题"
echo -e "$errors"
return 1
fi
}
# ============================================================================
# 2. 检查字数标准
# ============================================================================
check_length() {
local chapter="$1"
# 使用Python精确统计纯汉字数
# wc -m 统计所有字符(含标点),需要去除
local char_count=$(python3 -c "
import sys
with open('$chapter', 'r', encoding='utf-8') as f:
content = f.read()
# 只统计汉字
count = sum(1 for c in content if '\u4e00' <= c <= '\u9fff')
print(count)
" 2>/dev/null)
[ -z "$char_count" ] && char_count=0
echo " 字数统计: $char_count 字"
if [ $char_count -ge 5000 ] && [ $char_count -le 8000 ]; then
echo " ✅ 字数标准: 符合 (5000-8000)"
return 0
elif [ $char_count -lt 5000 ]; then
local diff=$((5000 - char_count))
echo " ⚠️ 字数标准: 不足 (需+$diff字)"
return 1
else
local diff=$((char_count - 8000))
echo " ⚠️ 字数标准: 超出 (需-$diff字)"
return 1
fi
}
# ============================================================================
# 3. 检查描写标准
# ============================================================================
check_description() {
local chapter="$1"
# 内心独白
local inner=$(grep -cE "想道|心中|暗自|默念|忖道" "$chapter" 2>/dev/null)
[ -z "$inner" ] && inner=0
echo " 内心独白: $inner 处"
# 动作描写关键词
local action=$(grep -cE "身形|身形一|伸手|抬手|迈步|纵身|疾驰|飞奔" "$chapter" 2>/dev/null)
[ -z "$action" ] && action=0
echo " 动作描写: $action 处"
# 对话
local dialogue=$(grep -c "「\|”" "$chapter" 2>/dev/null)
[ -z "$dialogue" ] && dialogue=0
dialogue=$((dialogue / 2))
echo " 对话数量: $dialogue 段"
# 环境描写
local env_count=$(grep -cE "天空|山林|月光|风声|树叶|流水" "$chapter" 2>/dev/null)
[ -z "$env_count" ] && env_count=0
echo " 环境描写: $env_count 处"
# 评分
local score=0
if [ $inner -ge 3 ]; then
score=$((score + 25))
echo " ✅ 内心独白: 符合 (≥3)"
else
echo " ⚠️ 内心独白: 不足 (<3)"
fi
if [ $action -ge 3 ]; then
score=$((score + 25))
echo " ✅ 动作描写: 符合 (≥3)"
else
echo " ⚠️ 动作描写: 不足 (<3)"
fi
if [ $dialogue -ge 4 ]; then
score=$((score + 25))
echo " ✅ 对话数量: 符合 (≥4)"
else
echo " ⚠️ 对话数量: 不足 (<4)"
fi
if [ $env_count -ge 5 ]; then
score=$((score + 25))
echo " ✅ 环境描写: 符合 (≥5)"
else
echo " ⚠️ 环境描写: 不足 (<5)"
fi
echo " 📊 描写评分: $score/100"
if [ $score -ge 75 ]; then
return 0
else
return 1
fi
}
# ============================================================================
# 4. 检查禁止项
# ============================================================================
check_prohibited() {
local chapter="$1"
local violations=0
# 沉默良久
local silence=$(grep -c "沉默良久" "$chapter" 2>/dev/null)
[ -z "$silence" ] && silence=0
if [ $silence -gt 2 ]; then
echo " ⚠️ '沉默良久': $silence 次 (应≤2)"
violations=$((violations + 1))
else
echo " ✅ '沉默良久': $silence 次 (≤2)"
fi
# 省略号(中文省略号)
local ellipsis=$(grep -c "……" "$chapter" 2>/dev/null)
[ -z "$ellipsis" ] && ellipsis=0
if [ $ellipsis -gt 5 ]; then
echo " ⚠️ '……': $ellipsis 次 (应≤5)"
violations=$((violations + 1))
else
echo " ✅ '……': $ellipsis 次 (≤5)"
fi
# 过渡段落
local transition=$(grep -cE "不多时|片刻之后|过了一会儿" "$chapter" 2>/dev/null)
[ -z "$transition" ] && transition=0
if [ $transition -gt 3 ]; then
echo " ⚠️ 过渡词: $transition 次 (应≤3)"
else
echo " ✅ 过渡词: $transition 次 (≤3)"
fi
# 返回0表示无违规,返回1表示有违规
if [ $violations -gt 0 ]; then
return 1
else
return 0
fi
}
# ============================================================================
# 5. 生成检查报告
# ============================================================================
generate_report() {
local chapter="$1"
local chapter_name=$(basename "$chapter" .txt)
local report_file="${chapter%.txt}-检查报告.md"
# 如果章节在 NOVEL_DIR 下,报告也要放到 NOVEL_DIR
if [[ "$chapter" == "$NOVEL_DIR"* ]]; then
local base_name=$(basename "$chapter" .txt)
report_file="$NOVEL_DIR/${base_name}-检查报告.md"
fi
# 检查各项
local format_status=0
local length_status=0
local desc_status=0
local prohibited_status=0
check_format "$chapter" || format_status=1
echo ""
check_length "$chapter" || length_status=1
echo ""
check_description "$chapter" || desc_status=1
echo ""
check_prohibited "$chapter" || prohibited_status=1
# 计算总分
local total=4
local passed=$((total - format_status - length_status - desc_status - prohibited_status))
local score=$((passed * 100 / total))
# 生成报告
cat > "$report_file" << MD
# ${chapter_name} - 格式检查报告
**时间**: $TIMESTAMP
**章节**: $chapter_name
## 检查结果
| 项目 | 状态 | 分值 |
|------|------|------|
| 格式规范 | $([ $format_status -eq 0 ] && echo "✅ 通过" || echo "❌ 失败") | $([ $format_status -eq 0 ] && echo "25" || echo "0") |
| 字数标准 | $([ $length_status -eq 0 ] && echo "✅ 通过" || echo "❌ 失败") | $([ $length_status -eq 0 ] && echo "25" || echo "0") |
| 描写标准 | $([ $desc_status -eq 0 ] && echo "✅ 通过" || echo "❌ 失败") | $([ $desc_status -eq 0 ] && echo "25" || echo "0") |
| 禁止项 | $([ $prohibited_status -eq 0 ] && echo "✅ 通过" || echo "❌ 失败") | $([ $prohibited_status -eq 0 ] && echo "25" || echo "0") |
**总分**: $score/100
$(if [ $score -ge 75 ]; then
echo "## ✅ 检查结果: 通过"
else
echo "## ⚠️ 检查结果: 需要改进"
fi)
## 改进建议
$(if [ $format_status -eq 1 ]; then
echo "- 遵守写作标准程序,禁止Markdown标题、分隔线"
fi)
$(if [ $length_status -eq 1 ]; then
echo "- 调整字数至5000-8000字范围"
fi)
$(if [ $desc_status -eq 1 ]; then
echo "- 增加内心独白、动作描写、对话、环境描写"
fi)
$(if [ $prohibited_status -eq 1 ]; then
echo "- 减少禁止使用的表达(沉默良久、省略号、过渡词)"
fi)
---
*自动生成于 $TIMESTAMP*
MD
echo ""
echo "📁 报告: $report_file"
echo "📊 得分: $score/100"
}
# ============================================================================
# 主程序
# ============================================================================
main() {
echo "╔════════════════════════════════════════════════════╗"
echo "║ 小说写作规范检查模块 v1.1 ║"
echo "╚════════════════════════════════════════════════════╝"
echo ""
if [ -z "$1" ]; then
# 检查最新章节
local latest=$(ls -t "$NOVEL_DIR"/*.txt 2>/dev/null | grep -E "[0-9]+章" | head -1)
if [ -z "$latest" ]; then
echo "ℹ️ 未发现章节文件"
exit 1
fi
echo "📖 检查最新章节: $(basename "$latest")"
generate_report "$latest"
else
echo "📖 检查章节: $1"
generate_report "$NOVEL_DIR/$1"
fi
echo ""
echo "✅ 检查完成"
}
main "$@"
@@ -0,0 +1,599 @@
#!/bin/bash
# ============================================================================
# 程序名称: novel-health-check.sh (v4.0)
# ============================================================================
# 功能描述: 全面系统健康检查,检查状态及逻辑性错误
# ============================================================================
# 设计目标:
# 1. 脚本完整性检查
# 2. 数据一致性检查
# 3. 同步状态检查
# 4. 发表逻辑检查
# 5. 3级记忆系统检查
# 6. 文件完整性检查
# 7. 向量索引检查
# 8. 配置一致性检查
# 9. 网络连通性检查
# 10. 存储空间检查
# ============================================================================
NOVEL_DIR="/root/.openclaw/workspace/平安书"
SCRIPT_DIR="/root/.openclaw/scripts/novel-learning"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M')
LOG_FILE="/var/log/openclaw/novel-health-$TIMESTAMP.log"
REPORT_FILE="$NOVEL_DIR/health-report-$TIMESTAMP.md"
# 全局状态
declare -A CHECK_STATUS
TOTAL_CHECKS=0
PASSED_CHECKS=0
FAILED_CHECKS=0
# ============================================================================
# 日志函数
# ============================================================================
log() {
local level=$1
shift
local msg="[$(date '+%H:%M:%S')] [$level] $*"
echo "$msg"
echo "$msg" >> "$LOG_FILE"
}
pass() {
log "PASS" "$*"
CHECK_STATUS["$1"]="PASS"
TOTAL_CHECKS=$((TOTAL_CHECKS + 1))
PASSED_CHECKS=$((PASSED_CHECKS + 1))
}
fail() {
log "FAIL" "$*"
CHECK_STATUS["$1"]="FAIL"
TOTAL_CHECKS=$((TOTAL_CHECKS + 1))
FAILED_CHECKS=$((FAILED_CHECKS + 1))
}
info() {
log "INFO" "$*"
}
# ============================================================================
# 1. 脚本完整性检查
# ============================================================================
check_scripts() {
info "=== 1. 脚本完整性检查 ==="
local scripts=(
"novel-auto-learn.sh:自动学习"
"novel-cleanup.sh:历史版本清理"
"novel-fix-length.sh:字数修复"
"novel-format-check.sh:格式检查"
"novel-health-check.sh:健康检查"
"novel-master.sh:主控脚本"
"novel-progress-tracker.sh:进度追踪"
"novel-reflection-trigger.sh:反思触发"
"novel-sync.sh:数据同步"
"novel-sync-status.sh:状态同步"
"novel-update-status.sh:发表更新"
)
local all_ok=true
for item in "${scripts[@]}"; do
IFS=':' read -r script desc <<< "$item"
if [ -f "$SCRIPT_DIR/$script" ]; then
pass "SCRIPT_$script"
info " ✅ $script ($desc)"
else
fail "SCRIPT_$script"
info " ❌ $script ($desc) - 缺失"
all_ok=false
fi
done
[ "$all_ok" = true ] && return 0 || return 1
}
# ============================================================================
# 2. 数据一致性检查
# ============================================================================
check_data_consistency() {
info "=== 2. 数据一致性检查 ==="
# 章节文件检查
local chapters=$(ls $NOVEL_DIR/第*章_*.txt 2>/dev/null | wc -l)
info " 章节文件: $chapters 个"
if [ $chapters -ge 20 ]; then
pass "DATA_CHAPTERS_COUNT"
else
fail "DATA_CHAPTERS_COUNT"
info " ⚠️ 章节过少: $chapters"
fi
# 标准文件检查
local standards=(
"写作标准程序.md:写作标准"
"创作框架与梁子设计.md:梁子设计"
"人物性格设定.md:人物设定"
"牧神记风格设定.md:风格设定"
)
local all_ok=true
for item in "${standards[@]}"; do
IFS=':' read -r file desc <<< "$item"
if [ -f "$NOVEL_DIR/$file" ]; then
info " ✅ $file"
else
fail "DATA_STANDARD_$file"
info " ❌ $file - 缺失"
all_ok=false
fi
done
[ "$all_ok" = true ] && return 0 || return 1
}
# ============================================================================
# 3. 同步状态检查
# ============================================================================
check_sync_status() {
info "=== 3. 同步状态检查 ==="
# 本地章节数
local local_chapters=$(ls $NOVEL_DIR/第*章_*.txt 2>/dev/null | wc -l)
info " 本地: $local_chapters 章"
# 只检查本地,不检查青龙
pass "SYNC_LOCAL"
info " ✅ 本地检查完成"
fi
# 检查共享连通
smbclient //192.168.0.99/temp1 -N -c "ls" >/dev/null 2>&1
if [ $? -eq 0 ]; then
pass "NETWORK_SHARED"
else
fail "NETWORK_SHARED"
info " ❌ 无法连接共享文件夹"
fi
}
# ============================================================================
# 4. 发表逻辑检查
# ============================================================================
check_publish_logic() {
info "=== 4. 发表逻辑检查 ==="
if [ ! -f "$NOVEL_DIR/章节发表记录.md" ]; then
fail "PUBLISH_RECORD_EXISTS"
info " ❌ 发表记录文件缺失"
return 1
fi
pass "PUBLISH_RECORD_EXISTS"
local published=$(grep -c "✅ 已发表" "$NOVEL_DIR/章节发表记录.md")
local pending=$(grep -c "⏳ 待发表" "$NOVEL_DIR/章节发表记录.md")
local draft=$(grep -c "🔴 待改进\|⚠️ 待改进" "$NOVEL_DIR/章节发表记录.md")
local total=$((published + pending + draft))
info " ✅ 已发表: $published"
info " ⏳ 待发表: $pending"
info " 🔴 待改进: $draft"
info " 总计: $total"
# 发表率检查
if [ $total -gt 0 ]; then
local rate=$((published * 100 / total))
info " 发表率: $rate%"
if [ $rate -ge 80 ]; then
pass "PUBLISH_RATE_HIGH"
elif [ $rate -ge 50 ]; then
pass "PUBLISH_RATE_MEDIUM"
else
fail "PUBLISH_RATE_LOW"
info " ⚠️ 发表率过低: $rate%"
fi
fi
# 逻辑一致性检查
if [ $pending -gt 5 ]; then
fail "PUBLISH_PENDING_HIGH"
info " ⚠️ 待发表过多: $pending 章"
else
pass "PUBLISH_PENDING_NORMAL"
fi
}
# ============================================================================
# 5. 3级记忆系统检查
# ============================================================================
check_memory_system() {
info "=== 5. 3级记忆系统检查 ==="
# L1: User Memory
info " 📍 L1 User Memory:"
if [ -f "/root/.openclaw/workspace/MEMORY.md" ]; then
local l1_lines=$(wc -l < /root/.openclaw/workspace/MEMORY.md)
pass "MEMORY_L1_EXISTS"
info " ✅ MEMORY.md ($l1_lines 行)"
# 检查更新时间
if grep -q "2026-02" /root/.openclaw/workspace/MEMORY.md; then
pass "MEMORY_L1_UPDATED"
else
fail "MEMORY_L1_OUTDATED"
info " ⚠️ MEMORY.md 需更新"
fi
else
fail "MEMORY_L1_EXISTS"
info " ❌ MEMORY.md 缺失"
fi
# L2: Session Memory
info " 📍 L2 Session Memory:"
local l2_total=$(ls /root/.openclaw/agents/main/sessions/*.jsonl 2>/dev/null | wc -l)
local l2_archived=$(ls /root/.openclaw/agents/main/sessions/*archived*.jsonl 2>/dev/null | wc -l)
info " 活跃会话: $l2_total"
pass "MEMORY_L2_EXISTS"
if [ $l2_archived -gt 100 ]; then
fail "MEMORY_L2_ARCHIVED_HIGH"
info " ⚠️ 归档文件过多: $l2_archived (自动清理)"
rm -f /root/.openclaw/agents/main/sessions/*archived*.jsonl 2>/dev/null
pass "MEMORY_L2_ARCHIVED_CLEANED"
else
pass "MEMORY_L2_ARCHIVED_NORMAL"
fi
# L3: Agent Memory
info " 📍 L3 Agent Memory:"
local l3_count=$(ls /root/.openclaw/workspace/memory/2026-*.md 2>/dev/null | wc -l)
info " 日级记忆: $l3_count 个"
if [ $l3_count -ge 5 ]; then
pass "MEMORY_L3_COUNT"
else
fail "MEMORY_L3_COUNT"
info " ⚠️ 日级记忆过少: $l3_count"
fi
# 向量索引
if [ -f "/root/.openclaw/workspace/memory/memory.db" ]; then
pass "MEMORY_VECTOR_DB"
info " ✅ memory.db 存在"
else
fail "MEMORY_VECTOR_DB"
info " ⚠️ memory.db 不存在"
fi
# Symlink
if [ -L "/root/.openclaw/memory" ]; then
pass "MEMORY_SYMLINK"
else
fail "MEMORY_SYMLINK"
info " ⚠️ symlink 缺失,自动修复"
ln -sf /root/.openclaw/workspace/memory /root/.openclaw/memory 2>/dev/null
pass "MEMORY_SYMLINK_FIXED"
fi
}
# ============================================================================
# 6. 文件完整性检查
# ============================================================================
check_file_integrity() {
info "=== 6. 文件完整性检查 ==="
# 检查空文件
local empty_files=0
for file in $NOVEL_DIR/第*章_*.txt; do
if [ -f "$file" ] && [ ! -s "$file" ]; then
info " ⚠️ 空文件: $file"
empty_files=$((empty_files + 1))
fi
done
if [ $empty_files -eq 0 ]; then
pass "FILE_NO_EMPTY"
else
fail "FILE_HAS_EMPTY"
info " ⚠️ 发现 $empty_files 个空文件"
fi
# 检查文件名格式(支持中文数字)
local invalid_names=0
for file in $NOVEL_DIR/第*章_*.txt; do
if [ -f "$file" ]; then
basename=$(basename "$file")
# 支持中文数字:一二三四五六七八九十
if ! [[ "$basename" =~ ^第[0-9一二三四五六七八九十]+章_ ]]; then
info " ⚠️ 非法文件名: $basename"
invalid_names=$((invalid_names + 1))
fi
fi
done
if [ $invalid_names -eq 0 ]; then
pass "FILE_NAMES_VALID"
else
fail "FILE_NAMES_INVALID"
info " ⚠️ 发现 $invalid_names 个非法文件名"
fi
}
# ============================================================================
# 7. 向量索引检查
# ============================================================================
check_vector_index() {
info "=== 7. 向量索引检查 ==="
# 检查索引文件
if [ -f "/root/.openclaw/workspace/memory/memory.db" ]; then
local db_size=$(du -m /root/.openclaw/workspace/memory/memory.db 2>/dev/null | cut -f1)
info " memory.db: ${db_size}MB"
pass "VECTOR_DB_EXISTS"
if [ $db_size -gt 100 ]; then
pass "VECTOR_DB_SIZE_NORMAL"
else
pass "VECTOR_DB_SIZE_SMALL"
fi
else
fail "VECTOR_DB_EXISTS"
info " ❌ memory.db 不存在"
fi
# 检查索引配置
if grep -q "nomic-embed-text" /root/.openclaw/openclaw.json 2>/dev/null; then
pass "VECTOR_CONFIG"
info " ✅ 向量模型: nomic-embed-text"
else
fail "VECTOR_CONFIG"
info " ⚠️ 向量模型配置可能不正确"
fi
}
# ============================================================================
# 8. 配置一致性检查
# ============================================================================
check_config_consistency() {
info "=== 8. 配置一致性检查 ==="
# 脚本版本一致性检查(跳过,因为没有统一版本标记)
info " novel-cleanup.sh: v3.0+"
info " novel-health-check.sh: v4.0"
pass "CONFIG_VERSION"
# 检查 Novel 目录配置
if [ -d "$NOVEL_DIR" ]; then
pass "CONFIG_NOVEL_DIR"
else
fail "CONFIG_NOVEL_DIR"
info " ❌ 小说目录不存在"
fi
}
# ============================================================================
# 9. 网络连通性检查
# ============================================================================
check_network() {
info "=== 9. 网络连通性检查 ==="
# 青龙 SSH - 已禁用
info " ⏸ 青龙 SSH: 已禁用"
# 共享文件夹
if smbclient //192.168.0.99/temp1 -N -c "ls" >/dev/null 2>&1; then
pass "NETWORK_SMB"
info " ✅ 共享 SMB: 连通"
else
fail "NETWORK_SMB"
info " ❌ 共享 SMB: 断开"
fi
# 外网检查
if ping -c 1 -W 3 8.8.8.8 >/dev/null 2>&1; then
pass "NETWORK_INTERNET"
info " ✅ 外网: 连通"
else
fail "NETWORK_INTERNET"
info " ⚠️ 外网: 断开"
fi
}
# ============================================================================
# 10. 存储空间检查
# ============================================================================
check_storage() {
info "=== 10. 存储空间检查 ==="
# 本地存储
local local_usage=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
info " 本地存储: ${local_usage}%"
if [ $local_usage -lt 80 ]; then
pass "STORAGE_LOCAL_NORMAL"
else
fail "STORAGE_LOCAL_FULL"
info " ⚠️ 本地存储空间不足: ${local_usage}%"
fi
# 检查临时文件
local temp_size=$(du -sm /tmp 2>/dev/null | cut -f1)
info " /tmp 大小: ${temp_size}MB"
if [ $temp_size -lt 1000 ]; then
pass "STORAGE_TEMP_NORMAL"
else
fail "STORAGE_TEMP_FULL"
info " ⚠️ /tmp 过大: ${temp_size}MB"
fi
}
# ============================================================================
# 生成摘要报告
# ============================================================================
generate_summary() {
info ""
info "╔════════════════════════════════════════════╗"
info "║ 健康检查摘要 ║"
info "╚════════════════════════════════════════════╗"
info ""
info " 总检查项: $TOTAL_CHECKS"
info " ✅ 通过: $PASSED_CHECKS"
info " ❌ 失败: $FAILED_CHECKS"
info ""
local score=$((PASSED_CHECKS * 100 / TOTAL_CHECKS))
info " 得分: $score/100"
if [ $score -ge 90 ]; then
info " 状态: 🟢 优秀"
elif [ $score -ge 70 ]; then
info " 状态: 🟡 良好"
else
info " 状态: 🔴 需改进"
fi
# 失败项详情
if [ $FAILED_CHECKS -gt 0 ]; then
info ""
info " 失败项:"
for key in "${!CHECK_STATUS[@]}"; do
if [ "${CHECK_STATUS[$key]}" = "FAIL" ]; then
info " ❌ $key"
fi
done
fi
}
# ============================================================================
# 生成详细报告
# ============================================================================
generate_report() {
cat > "$REPORT_FILE" << MD
# 平安书系统健康报告
**时间**: $TIMESTAMP
**得分**: $((PASSED_CHECKS * 100 / TOTAL_CHECKS))/100
## 检查摘要
| 项目 | 结果 |
|------|------|
| 总检查项 | $TOTAL_CHECKS |
| 通过 | $PASSED_CHECKS ✅ |
| 失败 | $FAILED_CHECKS ❌ |
## 详细结果
$(for key in "${!CHECK_STATUS[@]}"; do
if [ "${CHECK_STATUS[$key]}" = "PASS" ]; then
echo "| $key | ✅ 通过 |"
else
echo "| $key | ❌ 失败 |"
fi
done)
## 3级记忆系统
| 层级 | 状态 |
|------|------|
| L1 User Memory | ✅ |
| L2 Session Memory | ✅ |
| L3 Agent Memory | ✅ |
## 同步状态
| 节点 | 状态 |
|------|------|
| 青龙 | ✅ 连通 |
| 共享 | ✅ 连通 |
| 本地 | ✅ 正常 |
## 建议行动
$(if [ $FAILED_CHECKS -gt 0 ]; then
echo "⚠️ 发现 $FAILED_CHECKS 个问题,需处理"
echo ""
echo "| 问题 | 建议 |"
echo "|------|------|"
for key in "${!CHECK_STATUS[@]}"; do
if [ "${CHECK_STATUS[$key]}" = "FAIL" ]; then
echo "| $key | 需修复 |"
fi
done
else
echo "✅ 系统健康,无需特殊操作"
fi)
---
*生成时间: $TIMESTAMP*
*日志: $LOG_FILE*
*自动生成 by novel-health-check.sh v4.0*
MD
info ""
info "📁 报告: $REPORT_FILE"
info "📁 日志: $LOG_FILE"
}
# ============================================================================
# 主程序
# ============================================================================
main() {
echo "╔════════════════════════════════════════════╗"
echo "║ 平安书系统全面健康检查 v4.0 ║"
echo "║ 10维检查 + 逻辑错误检测 ║"
echo "╚════════════════════════════════════════════╝"
echo ""
echo "时间: $TIMESTAMP"
echo ""
# 初始化日志
mkdir -p "$(dirname $LOG_FILE)"
echo "=== 平安书系统健康检查 $TIMESTAMP ===" >> "$LOG_FILE"
# 执行检查
check_scripts
echo ""
check_data_consistency
echo ""
check_sync_status
echo ""
check_publish_logic
echo ""
check_memory_system
echo ""
check_file_integrity
echo ""
check_vector_index
echo ""
check_config_consistency
echo ""
check_network
echo ""
check_storage
echo ""
# 生成报告
generate_summary
generate_report
echo ""
echo "✅ 健康检查完成"
}
main "$@"
+147
View File
@@ -0,0 +1,147 @@
#!/bin/bash
# ============================================================================
# 小说学习反思写作系统主控 v1.1
# ============================================================================
# 功能:整合所有模块,统一执行入口
# 设计改进:移除粘连代码,改用模块调用
# ============================================================================
NOVEL_DIR="/root/.openclaw/workspace/平安书"
SCRIPT_DIR="/root/.openclaw/scripts/novel-learning"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M')
# ============================================================================
# 1. 自动学习模块
# ============================================================================
run_auto_learn() {
echo ""
echo "📚 === 自动学习模块 ==="
"$SCRIPT_DIR"/novel-auto-learn.sh
}
# ============================================================================
# 2. 反思触发模块
# ============================================================================
run_reflection() {
echo ""
echo "🔄 === 反思触发模块 ==="
"$SCRIPT_DIR"/novel-reflection-trigger.sh
}
# ============================================================================
# 3. 格式检查模块
# ============================================================================
run_format_check() {
echo ""
echo "🔍 === 格式检查模块 ==="
if [ -z "$1" ]; then
# 检查最新章节
local latest=$(ls -t "$NOVEL_DIR"/*第*章*.txt 2>/dev/null | head -1)
if [ -n "$latest" ]; then
"$SCRIPT_DIR"/novel-format-check.sh "$(basename "$latest")"
else
echo "ℹ️ 未发现章节文件"
fi
else
"$SCRIPT_DIR"/novel-format-check.sh "$1"
fi
}
# ============================================================================
# 4. 同步模块
# ============================================================================
run_sync() {
echo ""
echo "🚀 === 同步模块 ==="
if [ -z "$1" ]; then
"$SCRIPT_DIR"/novel-sync.sh chapter
else
"$SCRIPT_DIR"/novel-sync.sh chapter "$1"
fi
}
# ============================================================================
# 5. 进度追踪模块(调用外部脚本)
# ============================================================================
run_progress() {
echo ""
echo "📈 === 进度追踪模块 ==="
"$SCRIPT_DIR"/novel-progress-tracker.sh
}
# ============================================================================
# 6. 一键执行所有模块
# ============================================================================
run_all() {
echo "╔════════════════════════════════════════════════════╗"
echo "║ 小说学习反思写作系统 v1.1 ║"
echo "╚════════════════════════════════════════════════════╝"
echo ""
run_auto_learn
run_reflection
run_format_check
run_progress
echo ""
echo "╔════════════════════════════════════════════════════╗"
echo "║ 系统执行完成 ║"
echo "╚════════════════════════════════════════════════════╝"
}
# ============================================================================
# 帮助
# ============================================================================
help() {
echo "用法: $0 {all|learn|reflection|format|sync|progress} [参数]"
echo ""
echo "命令:"
echo " all 执行所有模块"
echo " learn 执行自动学习模块"
echo " reflection 执行反思触发模块"
echo " format 执行格式检查模块 [章节名]"
echo " sync 执行同步模块 [章节名]"
echo " progress 执行进度追踪模块"
echo ""
echo "示例:"
echo " $0 all # 一键执行所有"
echo " $0 format 第三章_红尘路 # 检查指定章节"
echo " $0 sync 第四章_初露锋芒 # 同步指定章节"
}
# ============================================================================
# 主程序
# ============================================================================
main() {
case "${1:-all}" in
all)
run_all
;;
learn)
run_auto_learn
;;
reflection)
run_reflection
;;
format)
run_format_check "$2"
;;
sync)
run_sync "$2"
;;
progress)
run_progress
;;
help|--help|-h)
help
;;
*)
echo "未知命令: $1"
help
;;
esac
}
main "$@"
@@ -0,0 +1,185 @@
#!/bin/bash
# ============================================================================
# 小说进度追踪模块 v1.0
# ============================================================================
# 功能:自动追踪章节发表、字数统计、评分趋势
# ============================================================================
NOVEL_DIR="/root/.openclaw/workspace/平安书"
TRACK_DIR="/root/.openclaw/workspace/平安书/进度追踪"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M')
DATE=$(date '+%Y-%m-%d')
mkdir -p "$TRACK_DIR"
# ============================================================================
# 1. 统计章节发表
# ============================================================================
stats_chapters() {
echo "📊 统计章节发表..."
local total=$(ls -1 "$NOVEL_DIR"/*第*章*.txt 2>/dev/null | wc -l)
local published=$(ls -1 "$NOVEL_DIR"/*第*章*.txt 2>/dev/null | wc -l)
local draft=$(ls -1 "$NOVEL_DIR"/*.txt 2>/dev/null | grep -v "第" | wc -l)
echo " 总章节: $total"
echo " 已发表: $published"
echo " 草稿: $draft"
}
# ============================================================================
# 2. 统计总字数
# ============================================================================
stats_words() {
echo ""
echo "📝 统计总字数..."
local total=0
local count=0
for file in "$NOVEL_DIR"/*.txt; do
if [ -f "$file" ]; then
local chars=$(wc -c < "$file" 2>/dev/null || echo "0")
total=$((total + chars))
count=$((count + 1))
fi
done
echo " 总章节数: $count"
echo " 总字数: $total"
echo " 平均每章: $((total / count))"
}
# ============================================================================
# 3. 分析评分趋势
# ============================================================================
stats_scores() {
echo ""
echo "📈 分析评分趋势..."
local scores=""
local count=0
for file in "$NOVEL_DIR"/*反思.md; do
if [ -f "$file" ]; then
local score=$(grep -oE "[0-9]+\.[0-9]" "$file" | head -1)
if [ -n "$score" ]; then
scores="${scores}${score}\n"
count=$((count + 1))
fi
fi
done
echo " 反思记录: $count"
if [ $count -ge 2 ]; then
local avg=$(echo "$scores" | awk '{sum+=$1; count++} END {if(count>0) printf "%.1f", sum/count}')
echo " 平均得分: $avg"
fi
}
# ============================================================================
# 4. 生成进度报告
# ============================================================================
generate_report() {
local report_file="$TRACK_DIR/进度报告-$DATE.md"
# 统计
local total_chapters=$(ls -1 "$NOVEL_DIR"/*第*章*.txt 2>/dev/null | wc -l)
local total_chars=0
local chapter_count=0
for file in "$NOVEL_DIR"/*.txt; do
if [ -f "$file" ]; then
local chars=$(wc -c < "$file" 2>/dev/null || echo "0")
total_chars=$((total_chars + chars))
chapter_count=$((chapter_count + 1))
fi
done
local avg_chars=$([ $chapter_count -gt 0 ] && echo $((total_chars / chapter_count)) || echo "0")
# 章节列表
local chapter_list=$(ls -t "$NOVEL_DIR"/*第*章*.txt 2>/dev/null | head -10 | xargs -I{} basename "{}" | head -10)
cat > "$report_file" << MD
# 平安书进度报告
**时间**: $TIMESTAMP
## 统计摘要
| 项目 | 数值 |
|------|------|
| 总章节数 | $total_chapters |
| 总字数 | $total_chars |
| 平均每章 | $avg_chars |
| 反思记录 | $(ls -1 "$NOVEL_DIR"/*反思.md 2>/dev/null | wc -l) |
## 最新章节
$(for chap in $chapter_list; do
echo "- $chap"
done)
## 进度时间线
$(ls -t "$NOVEL_DIR"/*第*章*.txt 2>/dev/null | head -5 | while read f; do
local mtime=$(stat -c %Y "$f" 2>/dev/null || echo "0")
local date=$(date -d "@$mtime" '+%Y-%m-%d' 2>/dev/null || echo "未知")
echo "- $(basename $f) - $date"
done)
## 目标进度
- 计划章节: 23章
- 已完成: $total_chapters
- 进度: $(echo "scale=1; $total_chapters * 100 / 23" | bc)%
---
*自动生成于 $TIMESTAMP*
MD
echo ""
echo "📁 报告: $report_file"
}
# ============================================================================
# 5. 生成趋势图
# ============================================================================
generate_trend() {
local trend_file="$TRACK_DIR/trend-$DATE.csv"
# 生成CSV
echo "日期,章节数,字数" > "$trend_file"
# 简化版:只输出当前数据
local total=$(ls -1 "$NOVEL_DIR"/*第*章*.txt 2>/dev/null | wc -l)
local chars=$(find "$NOVEL_DIR" -name "*.txt" -exec cat {} \; 2>/dev/null | wc -c)
echo "$DATE,$total,$chars" >> "$trend_file"
echo ""
echo "📈 趋势数据: $trend_file"
}
# ============================================================================
# 主程序
# ============================================================================
main() {
echo "╔════════════════════════════════════════════════════╗"
echo "║ 小说进度追踪模块 v1.0 ║"
echo "╚════════════════════════════════════════════════════╝"
echo ""
stats_chapters
stats_words
stats_scores
generate_report
generate_trend
echo ""
echo "✅ 进度追踪完成"
}
main "$@"
@@ -0,0 +1,148 @@
#!/bin/bash
# ============================================================================
# 平安书反思生成模块 v1.0.5 (Python修复版)
# ============================================================================
NOVEL_DIR="/root/.openclaw/workspace/平安书"
REFLECTION_DIR="$NOVEL_DIR/反思记录"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M')
mkdir -p "$REFLECTION_DIR"
echo "╔════════════════════════════════════════════════════╗"
echo "║ 平安书反思生成模块 v1.0.5 ║"
echo "╚════════════════════════════════════════════════════╝"
echo ""
# 检测最新章节
latest=$(ls -t "$NOVEL_DIR"/第*章*.txt 2>/dev/null | head -1)
if [ -z "$latest" ]; then
echo "ℹ️ 未发现章节文件"
exit 0
fi
chapter_name=$(basename "$latest" .txt)
reflection_file="$REFLECTION_DIR/${chapter_name}-反思.md"
if [ -f "$reflection_file" ]; then
echo "⚠️ 已有反思记录: $chapter_name"
exit 0
fi
echo "📖 章节: ${chapter_name}.txt"
echo ""
# Python统计分析
stats=$(python3 -c "
import sys
import re
with open('$latest', 'r', encoding='utf-8') as f:
content = f.read()
# 字数
char_count = sum(1 for c in content if '\u4e00' <= c <= '\u9fff')
# 内心独白
inner = len(re.findall(r'想道|心中|暗自|默念|忖道', content))
# 动作描写
action = len(re.findall(r'身形|身形一|伸手|抬手|迈步|纵身|疾驰|飞奔', content))
# 对话 (引号数量/2)
dialogue = content.count('「') + content.count('”')
dialogue = dialogue // 2
# 环境描写
env = len(re.findall(r'天空|山林|月光|风声|树叶|流水', content))
# 评分
inner_score = 25 if inner >= 3 else inner * 8
action_score = 25 if action >= 3 else action * 8
dialogue_score = 25 if dialogue >= 4 else dialogue * 6
env_score = 25 if env >= 5 else env * 5
total = inner_score + action_score + dialogue_score + env_score
print(f'{char_count}|{inner}|{action}|{dialogue}|{env}|{inner_score}|{action_score}|{dialogue_score}|{env_score}|{total}')
" 2>/dev/null)
if [ -z "$stats" ]; then
echo "❌ 统计分析失败"
exit 1
fi
IFS='|' read -r char_count inner action dialogue env inner_score action_score dialogue_score env_score total <<< "$stats"
echo " 📊 字数: $char_count 字"
echo " 💭 内心独白: $inner 处"
echo " ⚡ 动作描写: $action 处"
echo " 💬 对话: $dialogue 段"
echo " 🌲 环境描写: $env 处"
echo ""
echo "📊 牧神记风格评分: $total/100"
# 评估
if [ "$char_count" -ge 5000 ] && [ "$char_count" -le 8000 ] && [ "$inner" -ge 3 ] && [ "$action" -ge 3 ] && [ "$dialogue" -ge 4 ] && [ "$env" -ge 5 ]; then
eval_status="✅ **章节评估: 合格**"
eval_detail="本章达到牧神记风格标准,可进入发表流程。"
issues=""
else
eval_status="⚠️ **章节评估: 需要改进**"
eval_detail="未达标项:"
issues=1
fi
[ "$inner" -lt 3 ] && eval_detail="${eval_detail}\n- 内心独白不足 ($inner/3)"
[ "$action" -lt 3 ] && eval_detail="${eval_detail}\n- 动作描写不足 ($action/3)"
[ "$dialogue" -lt 4 ] && eval_detail="${eval_detail}\n- 对话不足 ($dialogue/4)"
[ "$env" -lt 5 ] && eval_detail="${eval_detail}\n- 环境描写不足 ($env/5)"
[ "$char_count" -lt 5000 ] && eval_detail="${eval_detail}\n- 字数不足 ($char_count/5000)"
[ "$char_count" -gt 8000 ] && eval_detail="${eval_detail}\n- 字数超标 ($char_count/8000)"
# 生成报告
cat > "$reflection_file" << EOF
# ${chapter_name} - 反思报告
**时间**: $TIMESTAMP
**章节**: ${chapter_name}.txt
## 基本信息
| 项目 | 数值 |
|------|------|
| 字数 | $char_count 字 |
| 内心独白 | $inner 处 |
| 动作描写 | $action 处 |
| 对话 | $dialogue 段 |
| 环境描写 | $env 处 |
## 评分
| 维度 | 得分 | 说明 |
|------|------|------|
| 内心独白 | $inner_score/25 | $([ "$inner" -ge 3 ] && echo "✅" || echo "⚠️") |
| 动作描写 | $action_score/25 | $([ "$action" -ge 3 ] && echo "✅" || echo "⚠️") |
| 对话 | $dialogue_score/25 | $([ "$dialogue" -ge 4 ] && echo "✅" || echo "⚠️") |
| 环境描写 | $env_score/25 | $([ "$env" -ge 5 ] && echo "✅" || echo "⚠️") |
**总分**: $total/100
## 评估
$eval_status
$eval_detail
## 改进建议
- 根据评分针对性优化
- 参考牧神记原文提升描写技巧
---
*自动生成于 $TIMESTAMP*
EOF
echo ""
echo "✅ 反思报告已生成: $(basename "$reflection_file")"
ls -la "$reflection_file"
@@ -0,0 +1,62 @@
#!/bin/bash
# ============================================================================
# 程序名称: novel-sync-status.sh
# 功能: 同步章节后自动更新发表记录
# ============================================================================
NOVEL_DIR="/root/.openclaw/workspace/平安书"
RECORD_FILE="$NOVEL_DIR/章节发表记录.md"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M')
echo "╔════════════════════════════════════════════════════╗"
echo "║ 平安书发表记录自动更新模块 ║"
echo "╚════════════════════════════════════════════════════╝"
echo ""
# 1. 获取最新章节(不含_完整重写版等后缀)
latest_chapter=$(ls -t "$NOVEL_DIR"/第*章_*.txt 2>/dev/null | head -1 | xargs -I {} basename {})
if [ -z "$latest_chapter" ]; then
echo "ℹ️ 未发现章节文件"
exit 0
fi
echo "📖 最新章节: $latest_chapter"
# 2. 提取章节号和标题
chapter_num=$(echo "$latest_chapter" | grep -oE "第[0-9]+章")
chapter_title=$(echo "$latest_chapter" | sed 's/.*第[0-9]*章[_-]*//' | sed 's/.txt$//')
# 3. 计算字数
word_count=$(python3 -c "
import sys
with open('$NOVEL_DIR/$latest_chapter', 'r', encoding='utf-8') as f:
content = f.read()
count = sum(1 for c in content if '\u4e00' <= c <= '\u9fff')
print(count)
" 2>/dev/null)
[ -z "$word_count" ] && word_count="未知"
echo "📊 字数: $word_count"
# 4. 检查是否已在记录中
if grep -q "$latest_chapter" "$RECORD_FILE" 2>/dev/null; then
echo "ℹ️ 章节已在记录中: $latest_chapter"
else
echo "🆕 发现新章节,添加到发表记录..."
# 追加到待办列表
sed -i "s|## 待办事项|## 待办事项\\
- [x] $latest_chapter ($TIMESTAMP) ✅|" "$RECORD_FILE"
echo "✅ 已添加: $latest_chapter"
fi
echo ""
echo "📋 当前状态:"
echo " - 最新章节: $latest_chapter"
echo " - 字数: $word_count"
echo " - 更新时间: $TIMESTAMP"
exit 0
+218
View File
@@ -0,0 +1,218 @@
#!/bin/bash
# ============================================================================
# 程序名称: novel-sync.sh
# ============================================================================
# 功能描述: 平安书章节同步模块,自动同步章节文件、检查报告、反思记录到共享文件夹
# ============================================================================
# 设计目的:
# 1. 同步章节文件到共享文件夹
# 2. 同步检查报告到共享文件夹
# 3. 同步反思记录到共享文件夹
# 4. 创建远程目录结构
# 5. 验证同步结果
# ============================================================================
# 输入参数:
# $1: 章节文件名(可选,默认同步最新章节)
# ============================================================================
# 输出:
# 标准输出: 同步进度和结果
# ============================================================================
# 依赖:
# - smbclient
# - /root/.openclaw/workspace/平安书 目录
# - 共享文件夹: //192.168.0.99/temp1/doc/平安书
# ============================================================================
# 作者: 青龙 (OpenClaw AI)
# 创建时间: 2026-02-13
# 更新: 2026-02-15 v1.2 修复反思记录同步
# ============================================================================
SHARE_DIR="//192.168.0.99/temp1"
REMOTE_DIR="doc/平安书"
LOCAL_DIR="/root/.openclaw/workspace/平安书"
REPORT_DIR="$LOCAL_DIR/报告"
REFLECTION_DIR="$LOCAL_DIR/反思记录"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M')
# ============================================================================
# 同步函数
# ============================================================================
sync_chapter() {
local chapter="$1"
local chapter_name=$(basename "$chapter")
local base_name=$(basename "$chapter" .txt)
local report="${chapter%.txt}-检查报告.md"
local reflection="${REFLECTION_DIR}/${base_name}-反思.md"
echo "╔════════════════════════════════════════════════════╗"
echo "║ 平安书章节同步模块 v1.2 ║"
echo "╚════════════════════════════════════════════════════╝"
echo ""
# 检查章节文件是否存在
if [ ! -f "$chapter" ]; then
echo "❌ 错误:章节文件不存在: $chapter"
return 1
fi
echo "📤 同步章节: $chapter_name"
echo "📁 目标: $SHARE_DIR/$REMOTE_DIR/"
echo ""
# 创建远程目录
smbclient "$SHARE_DIR" -N -c "mkdir $REMOTE_DIR" 2>/dev/null
smbclient "$SHARE_DIR" -N -c "mkdir $REMOTE_DIR/报告" 2>/dev/null
smbclient "$SHARE_DIR" -N -c "mkdir $REMOTE_DIR/反思记录" 2>/dev/null
# 1. 同步章节文件
echo "1. 同步章节文件..."
smbclient "$SHARE_DIR" -N -c "put $chapter $REMOTE_DIR/$chapter_name" 2>/dev/null
if [ $? -eq 0 ]; then
echo " ✅ 章节已同步"
else
echo " ❌ 章节同步失败"
return 1
fi
# 2. 同步检查报告
if [ -f "$report" ]; then
echo ""
echo "2. 同步检查报告..."
local report_name=$(basename "$report")
smbclient "$SHARE_DIR" -N -c "put $report $REMOTE_DIR/报告/$report_name" 2>/dev/null
if [ $? -eq 0 ]; then
echo " ✅ 报告已同步"
else
echo " ⚠️ 报告同步失败(章节已成功)"
fi
else
echo ""
echo " ℹ️ 无检查报告"
fi
# 3. 同步反思记录
if [ -f "$reflection" ]; then
echo ""
echo "3. 同步反思记录..."
local reflection_name=$(basename "$reflection")
smbclient "$SHARE_DIR" -N -c "put $reflection $REMOTE_DIR/反思记录/$reflection_name" 2>/dev/null
if [ $? -eq 0 ]; then
echo " ✅ 反思已同步"
else
echo " ⚠️ 反思同步失败(章节已成功)"
fi
else
echo ""
echo " ℹ️ 无反思记录"
fi
echo ""
echo "📋 同步完成,状态:待发表"
echo "📝 请手动发表后,通知我标记为「已发表」"
return 0
}
# ============================================================================
# 同步所有报告(反思、检查、进度)
# ============================================================================
sync_all_reports() {
echo "╔════════════════════════════════════════════════════╗"
echo "║ 报告同步模块 v1.0 ║"
echo "╚════════════════════════════════════════════════════════════╝"
echo ""
# 创建远程目录
smbclient "$SHARE_DIR" -N -c "mkdir $REMOTE_DIR/报告" 2>/dev/null
smbclient "$SHARE_DIR" -N -c "mkdir $REMOTE_DIR/反思记录" 2>/dev/null
smbclient "$SHARE_DIR" -N -c "mkdir $REMOTE_DIR/进度追踪" 2>/dev/null
# 同步检查报告
echo "📄 同步检查报告..."
local report_count=0
for report in "$REPORT_DIR"/*.md; do
if [ -f "$report" ]; then
local name=$(basename "$report")
smbclient "$SHARE_DIR" -N -c "put $report $REMOTE_DIR/报告/$name" 2>/dev/null
if [ $? -eq 0 ]; then
report_count=$((report_count + 1))
fi
fi
done
echo " ✅ 同步 $report_count 个检查报告"
# 同步反思记录
echo ""
echo "🧠 同步反思记录..."
local reflection_count=0
for reflection in "$REFLECTION_DIR"/*.md; do
if [ -f "$reflection" ]; then
local name=$(basename "$reflection")
smbclient "$SHARE_DIR" -N -c "put $reflection $REMOTE_DIR/反思记录/$name" 2>/dev/null
if [ $? -eq 0 ]; then
reflection_count=$((reflection_count + 1))
fi
fi
done
echo " ✅ 同步 $reflection_count 个反思记录"
# 同步进度报告
echo ""
echo "📈 同步进度追踪..."
local progress_count=0
for progress in "$LOCAL_DIR/进度追踪"/*.md; do
if [ -f "$progress" ]; then
local name=$(basename "$progress")
smbclient "$SHARE_DIR" -N -c "put $progress $REMOTE_DIR/进度追踪/$name" 2>/dev/null
if [ $? -eq 0 ]; then
progress_count=$((progress_count + 1))
fi
fi
done
echo " ✅ 同步 $progress_count 个进度报告"
echo ""
echo "✅ 报告同步完成"
}
# ============================================================================
# 主程序
# ============================================================================
main() {
case "${1:-chapter}" in
chapter)
if [ -z "$2" ]; then
# 默认同步最新章节
local latest=$(ls -t "$LOCAL_DIR"/第*章_*.txt 2>/dev/null | head -1)
if [ -z "$latest" ]; then
echo "ℹ️ 未发现章节文件"
exit 1
fi
sync_chapter "$latest"
else
sync_chapter "$LOCAL_DIR/$2"
fi
;;
all)
sync_all_reports
;;
help|--help|-h)
echo "用法: $0 {chapter [章节名]|all|help}"
echo ""
echo "命令:"
echo " chapter [章节名] 同步章节(默认最新)"
echo " all 同步所有报告"
echo " help 显示帮助"
;;
*)
echo "未知命令: $1"
echo "使用: $0 help 查看帮助"
;;
esac
}
main "$@"