每日备份 2026-06-10 12:57:13
This commit is contained in:
1 parent
fda2ccb8c2
commit
3d2e638c6a
244 files changed
+58890
-3
No files matched your search
+219
@@ -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
@@ -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
@@ -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 "$@"
|
||||
Reference in new issue
Block a user