课程报告大纲规划
为以下项目规划课程报告:$ARGUMENTS
常量
- SUBJECT_DOMAIN — 学科领域(cs / humanities / economics / engineering)
- WORD_COUNT_TARGET — 目标字数(默认 10000)
- SKIP_FIGURES — 是否跳过数据图表(默认 false)
- SKIP_DRAWIO — 是否跳过架构图/流程图(默认 false)
- CUSTOM_REQUIREMENTS — 用户自定义要求
输入
- 项目主题($ARGUMENTS)
- 用户上传的项目源码(
user_data/ 中的代码文件,可选) - 用户上传的要求文档(
user_data/*_extracted.txt,可选) - 用户上传的数据文件(
user_data/*.csv|json|xlsx,可选)
⛔ 数据/源码存在性 Gate
bash
echo "=== 输入资产清单 ==="
# 1. 源码(决定项目事实底稿是否能成立)
SOURCE_FILES=$(find user_data -type f \( -name "*.py" -o -name "*.js" -o -name "*.ts" -o -name "*.java" -o -name "*.cpp" -o -name "*.c" -o -name "*.go" -o -name "*.rs" -o -name "*.php" -o -name "*.rb" -o -name "*.cs" \) 2>/dev/null | wc -l)
echo "源码文件数: $SOURCE_FILES"
# 2. 数据文件(决定数据图表是否规划)
DATA_FILES=""
for f in user_data/*.csv user_data/*.json user_data/*.xlsx user_data/*.xls; do
[ -f "$f" ] && DATA_FILES="$DATA_FILES $f"
done
echo "数据文件: ${DATA_FILES:-(无)}"
# 3. 用户上传的图片
USER_IMAGES=""
mkdir -p figures
for f in user_data/*.png user_data/*.jpg user_data/*.jpeg; do
[ -f "$f" ] || continue
bn=$(basename "$f")
cp "$f" "figures/$bn"
USER_IMAGES="$USER_IMAGES figures/$bn"
done
echo "用户图片已复制到 figures/: ${USER_IMAGES:-(无)}"
# 4. 用户上传的格式模板(.docx)
TEMPLATE_DOCX=$(find user_data -maxdepth 1 -name "*.docx" 2>/dev/null | head -1)
if [ -n "$TEMPLATE_DOCX" ]; then
echo "检测到用户上传的 docx 模板: $TEMPLATE_DOCX"
echo "(docx-format-check 步骤会自动提取该模板格式并应用到导出 Word)"
fi
# 5. 用户标志
SKIP_FIGURES=$(grep -E '^- skip_figures:\s*[Tt]rue' CLAUDE.md 2>/dev/null | head -1)
SKIP_DRAWIO=$(grep -E '^- skip_drawio:\s*[Tt]rue' CLAUDE.md 2>/dev/null | head -1)
echo "跳过数据图表: ${SKIP_FIGURES:-否}"
echo "跳过架构图: ${SKIP_DRAWIO:-否}"
硬规则:
skip_figures=true → PAPER_PLAN.md 不许列任何 fig_<数据图> 和 TABLE_skip_figures=false 且无数据 → 仍然规划图表,标注「使用仿真数据」(paper-analysis 会生成)skip_drawio=true → 不许列任何架构/流程图(fig_arch / fig_er / fig_flow_*)- 无源码 → PROJECT_FACTS.md 必须明确写「无源码」,不许编造模块
硬约束(借鉴 lunwen-skill fact_extractor)
- 必须产出
PROJECT_FACTS.md / OUTLINE.md / PAPER_PLAN.md 三个文件。 - 项目事实只能来源于真实代码或用户主题描述,禁止编造功能模块。
- 大纲中"系统实现"必须是最长章节(30-40%)。
- 图表规划与可用资源严格匹配(无源码无项目 → 不规划架构图;无数据 → 不规划数据图)。
- 本步骤只规划,不写正文。
⛔⛔⛔ 完成铁律(最高优先级)
本步骤必须产出 `OUTLINE.md`(≥ 800 字节,完整的报告大纲)+ `PROJECT_FACTS.md`(项目事实摘要)。
⛔ 结束前必跑产出验证:
bash
PASS=true
[ -f OUTLINE.md ] && SZ=$(wc -c < OUTLINE.md) || SZ=0
[ "$SZ" -ge 800 ] && echo "✅ OUTLINE.md ($SZ)" || { echo "❌ OUTLINE.md 缺失或过小"; PASS=false; }
[ -f PROJECT_FACTS.md ] && PSZ=$(wc -c < PROJECT_FACTS.md) || PSZ=0
[ "$PSZ" -ge 300 ] && echo "✅ PROJECT_FACTS.md ($PSZ)" || { echo "❌ PROJECT_FACTS.md 缺失"; PASS=false; }
[ "$PASS" != true ] && echo "⛔ 产出验证失败 — 必须补全后重新跑验证, 不要结束本步骤"
工作流程
Step 1: 检查输入
(已在数据存在性 Gate 中完成)
Step 2: 提取项目事实(PROJECT_FACTS.md)
有源码时(必做):扫描代码结构,写入 PROJECT_FACTS.md:
markdown
# 项目事实底稿(不许编造,只许据实记录)
## 1. 项目基本信息
-项目名称:(从 README/package.json/setup.py 提取)
-编程语言:
-框架/库:(从依赖文件提取)
-项目类型:
## 2. 技术栈
(按文件提取)
## 3. 模块结构
(列出主要目录及其职责,每个目录一行)
## 4. 数据库设计
(如有数据库,列出主要表和字段,无则写「无数据库」)
## 5. 核心业务逻辑
(每个关键模块 100-200 字,必须基于真实代码)
## 6. API/接口设计
(如有 API 列出路由与参数,无则写「无 API」)
## 7. 已实现功能清单
(基于代码实际实现,不许写"具有良好的扩展性"等空话)
-功能 A(位置:xxx.py:LineN)
-功能 B(位置:yyy.py:LineN)
## 8. 测试覆盖
(如有 tests/ 目录列出测试文件,无则写「无测试」)
无源码时:在 PROJECT_FACTS.md 顶部明确标注:
markdown
# 项目事实底稿
⚠ 用户未上传项目源码,本报告基于主题描述撰写。
## 项目设想(基于主题描述)
-项目名称:[从主题推断]
-项目类型:[从主题推断]
-技术栈设想:[基于主题选择典型栈,并说明为推测]
-模块设想:[列出 3-5 个核心模块]
## 写作策略
-撰写时使用"本系统拟采用..."、"建议..."等推测性措辞
-不得给出具体函数名、行号
-代码片段标注为「示例代码」
Step 3: 生成大纲(OUTLINE.md)
按项目类型选大纲。每章必须给出 预期字数 / 关键术语 / 是否需要图。
默认结构(项目实践类):
markdown
# [项目名称] 课程报告
## 摘要(200-300 字)
## 第一章 项目概述(10%)
### 1.1 项目背景
### 1.2 项目目标
### 1.3 开发环境与工具
## 第二章 需求分析(15%)
### 2.1 功能需求
### 2.2 非功能需求
### 2.3 用例分析
## 第三章 系统设计(20%)
### 3.1 总体架构(如不跳过架构图,含 fig_arch;否则用文字描述)
### 3.2 模块设计
### 3.3 数据库设计(含 fig_er,仅在有数据库时)
### 3.4 接口设计
## 第四章 系统实现(35%,最长章节)
### 4.1 [模块A] 实现
### 4.2 [模块B] 实现
### 4.3 [模块C] 实现
…(基于 PROJECT_FACTS 的真实模块清单展开)
## 第五章 测试与结果分析(10%)
### 5.1 测试环境
### 5.2 功能测试用例(Markdown 表格)
### 5.3 性能/数据结果(仅在有数据时放图表)
## 第六章 总结与展望(10%)
## 参考文献(5-15 篇)
⛔ 如果无源码,调整大纲:
- 第三章合并为「方案设计」
- 第四章改为「关键技术分析」(不写实现细节)
- 第五章简化或删除
末尾追加 Claims-Evidence Matrix:
markdown
## Claims-Evidence Matrix
| Claim | Evidence | Section | Status |
|-------|----------|---------|--------|
| 系统实现了功能 A | PROJECT_FACTS §7 + 代码 xxx.py | §4.1 | 已支撑 |
| 系统在性能 X 上达到 Y | RESULTS.md(如有数据) / 文献 [N] | §5.3 | 待定 |
Step 4: 数据/图表/架构图规划(PAPER_PLAN.md)
按多种组合分支规划:
(A) 有源码 + 有数据 + 不跳架构图: 全量规划
markdown
# 课程报告:图表与数据规划
## 架构图(drawio)规划
-[ ] fig_arch — 系统总体架构 → §3.1
-[ ] fig_er — 数据库 E-R 图(如有数据库) → §3.3
-[ ] fig_flow_<module> — 各核心模块流程 → §4.x
## 数据分析图表规划
-[ ] fig_desc — 数据描述性统计 → §5.3
-[ ] fig_perf — 性能/精度对比 → §5.3
-[ ] TABLE_test — 测试用例表 → §5.2
## 输出文件命名规范
-数据图:figures/fig_*.png(Word 模式只用 PNG,DPI 350)
-架构图:figures/fig_*.drawio + figures/fig_*.png(Word 模式不输出 PDF)
-表格:figures/TABLE_*.md(⛔ 课程报告是 Word 输出,表格用 Markdown 三线表 .md,**不是 .tex**)
(B) 有源码 + 无数据 + 用户开启图表 + 不跳架构图: 架构图 + 仿真数据图表
markdown
## 架构图(drawio)规划
-[ ] fig_arch / fig_flow_* / ...
## 数据分析图表规划
**用户未提供数据,将使用仿真/示例数据**(paper-analysis 步骤生成)。
基于项目主题构造合理仿真测试数据:
-数据规模:N=200 测试样本
-字段:input/expected/actual/latency_ms
-[ ] fig_perf — 性能对比(仿真)→ §5.3
-[ ] fig_latency — 延迟分布(仿真)→ §5.3
-[ ] TABLE_test — 测试用例表 → §5.2
(C) 跳过架构图 (skip_drawio=true):
markdown
## 架构图(drawio)规划
(用户已禁用 — paper-figure 将被跳过)
## 数据分析图表规划
(按是否开启图表 + 是否有数据分支,规则同 A/B)
(D) 用户关闭图表 (skip_figures=true):
markdown
**本报告不规划任何 fig_ 或 TABLE_。**
所有论点用文献支撑,撰写时不得说「如图 X 所示」。
Step 5: 自检
bash
echo "=== PAPER_PLAN 自检 ==="
HAS_DATA_FIG=$(grep -cE '^- \[ \] fig_(desc|perf|main|trend|box|bar|hist|scatter|heatmap|roc|latency)|^- \[ \] TABLE_' PAPER_PLAN.md)
HAS_DRAWIO=$(grep -cE '^- \[ \] fig_(arch|er|flow|module)' PAPER_PLAN.md)
SKIP_FIGURES_FLAG=$(grep -ciE '^- skip_figures:\s*[Tt]rue' CLAUDE.md 2>/dev/null)
SKIP_DRAWIO_FLAG=$(grep -ciE '^- skip_drawio:\s*[Tt]rue' CLAUDE.md 2>/dev/null)
if [ "$SKIP_FIGURES_FLAG" -ge 1 ] && [ "$HAS_DATA_FIG" -ge 1 ]; then
echo "❌ 自检失败:用户已禁用图表(skip_figures=true)但 PAPER_PLAN 列了数据图"
exit 1
fi
if [ "$SKIP_DRAWIO_FLAG" -ge 1 ] && [ "$HAS_DRAWIO" -ge 1 ]; then
echo "❌ 自检失败:用户已禁用架构图(skip_drawio=true)但 PAPER_PLAN 列了 fig_arch/fig_flow_*"
exit 1
fi
if [ "$SKIP_FIGURES_FLAG" -eq 0 ] && [ "$HAS_DATA_FIG" -eq 0 ]; then
echo "⚠ 警告:用户启用了图表但 PAPER_PLAN 中没列任何数据图,请补全(无数据时用仿真数据)"
fi
echo "✅ PAPER_PLAN.md 自检 OK"
Step 6: 文献关键词
在 OUTLINE.md 末尾追加:
markdown
## 文献调研关键词
-核心:[项目领域关键词]
-扩展:[相关技术关键词]
-时间范围:近 5 年优先
输出文件
PROJECT_FACTS.md — 项目事实底稿(有源码必有;无源码注明)OUTLINE.md — 报告大纲 + Claims-Evidence Matrix + 文献关键词PAPER_PLAN.md — 数据/图表/架构图规划(按四种分支)
关键规则
- 只规划,不写正文。
- 是否规划图表只看 `skip_figures` / `skip_drawio` 开关:
- 用户开启图表 → 规划数据图(有数据用真实,没数据用仿真)
- 用户开启架构图 → 规划 fig_arch/fig_er/fig_flow_*
- 关闭对应开关时才不规划
- 无源码不许编造功能,PROJECT_FACTS.md 必须诚实说明「无源码」。
- Claims-Evidence Matrix 必须存在。
- PAPER_PLAN.md 自检必须通过。
- 学术诚信:仿真数据必须在文档中明确注明。
⛔⛔⛔ FIGURE_MANIFEST(机器可读对账清单,必须输出)
写完上面的图表清单后,在产出文档(PAPER_PLAN.md / PROBLEM_ANALYSIS.md / 等)的最后追加一个机器可读的清单区块。下游 paper-figure / paper-figure / 写作 SKILL / workflow_engine.py 都按此清单对账。少一张就触发 AUTO-RECOVER。
格式严格按此输出:
markdown
<!-- BEGIN FIGURE_MANIFEST -->
## 图表清单(FIGURE_MANIFEST)
**数据图(matplotlib gen_fig_*.py,paper-figure 产出 .png/.pdf):**
-fig_xxx
-fig_yyy
**DrawIO 流程/架构图(paper-figure 产出 .drawio + .png/.pdf):**
-fig_arch
-fig_flow_xxx
**TikZ 图(paper-figure 产出 tikz_*.pdf):**
-tikz_xxx
**总数:DATA=N, DRAWIO=M, TIKZ=K, ALL=N+M+K**
<!-- END FIGURE_MANIFEST -->
⛔ 铁律:
- 每条只写文件名主干(不带 .py / .drawio / .png / .pdf 后缀)
- 数量必须跟上面三类图清单完全一致(一一对应)
- 如果用户禁用了 skip_figures / skip_drawio,对应类别留空但 BEGIN/END 标记必须存在
- 纯文字论文(无图):写
**总数:ALL=0** 但 BEGIN/END 标记仍必须存在
⛔ 结束前必跑产出验证(如果产出文档是 PAPER_PLAN.md / PROBLEM_ANALYSIS.md / TOPIC_PLAN.md):
bash
# 自动找产出文档
PLAN_FILE=""
for f in PAPER_PLAN.md PROBLEM_ANALYSIS.md TOPIC_PLAN.md MODELING_REPORT.md; do
[ -f "$f" ] && PLAN_FILE="$f" && break
done
if [ -n "$PLAN_FILE" ]; then
if grep -q '<!-- BEGIN FIGURE_MANIFEST -->' "$PLAN_FILE" && grep -q '<!-- END FIGURE_MANIFEST -->' "$PLAN_FILE"; then
echo "✅ FIGURE_MANIFEST 区块存在"
else
echo "❌ FIGURE_MANIFEST 区块缺失,必须按上面格式追加(即使无图也要写 ALL=0)"
fi
fi