一键导入
academic-coursework-cn
辅助中国高校学生完成课程实践报告、专题调研、记录册、上汇报讲稿等 课程作业任务。覆盖"形势与政策""思政课""专业实习"等典型场景。 触发:用户给出课程材料(.docx/.pdf/资料)并要求"根据这份文档写报告/填记录册/ 做讲稿",或"完成附件1的实践手册"。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
辅助中国高校学生完成课程实践报告、专题调研、记录册、上汇报讲稿等 课程作业任务。覆盖"形势与政策""思政课""专业实习"等典型场景。 触发:用户给出课程材料(.docx/.pdf/资料)并要求"根据这份文档写报告/填记录册/ 做讲稿",或"完成附件1的实践手册"。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Diagnose and fix the dual-channel memory problem in Hermes Agent — when `memory.provider: holographic` (or any external provider) is configured but the agent keeps writing only to `memories/MEMORY.md`, bypassing it. Covers why agents default to the markdown file, the four root causes of routing failure, and three remediation options (SOUL.md rules / disable MEMORY.md / mirror via code). Triggers on 'memory 不生效', 'holographic 没在用', 'agent 都写到 MEMORY.md', '双 memory 系统', 'memory tool vs fact_store', 'on_memory_write', 'memory drift', 'Mirrors 不到', or any 'why is my agent ignoring the configured memory provider' question.
Use when the user works inside ~/Projects/Config/Guix-configs and mentions '改 dotfiles', 'blue home', 'guix system reconfigure', 'shepherd service', 'stow 死链', 'blue stow', 'AGENTS.md 翻新', 'fcitx', 'IME 没输入法', 'Electron 没输入法', 'wireplumber', '二轨 dotfiles', '恢复被删除的 dotfiles', or related. Ten sub-protocols — dotfiles deploy verification, worker delegation, multi-line edit safety, Guix service debugging, GNU Stow mutable config, restoring deleted dotfiles, ISO 移植, 需求澄清, 模块归属陷阱.
跨 agent KB 健康度维护。**触发信号**:每周/长会话后例行维护 / 卡片 >50 张 / 检索质量明显下降 / 用户触发 `/agenote-curate` / 发现重复卡片或矛盾结论 / 新增了对话抽取源。**当上述任一信号出现时立即调用本 skill** 做健康检查+去重+归档+权重重分配+reconcile 多源 memory。基础用法见 `agenote-base`;会话中单次经验记录见 `agenote-review`。
Maintain the personal Guix channel at ~/Projects/Config/jeans (Just Enough AI-geNerated Slops). Use when the user asks to "fix the CI build failure issue", "升级 X 包", "add a package", "check upstream updates", "跑 maak upgrade", "修复 auto-update 流水线的 issue
How to author a Hermes Agent skill the right way. Covers the two non-negotiable structural principles every skill must follow — **self-contained** (all runnable artifacts ship inside the skill directory so backup = usable) and **progressive disclosure** (SKILL.md is a thin router; details live under `references/`, `templates/`, `scripts/`) — the directory layout, file-type rules, decision trees for what goes in SKILL.md vs. a support file, **which of the 12 existing categories a new skill belongs to (never top-level `<skill-name>/`)**, and a checklist before declaring a skill done. Trigger when: writing a new skill, refactoring an existing skill's structure, wondering 'should this go in SKILL.md or references()' / 'which category directory should this skill live into', preparing a skill for backup/share, noticing a self-contained violation, or auditing existing skills. Also trigger when the user complains something is 'too verbose' or 'in the wrong place' — those are progressive-disclosure violations.
When the user says '校对文档 / 检查文档是否还有效 / sync doc with code / 扩写 README / 改写文档 / 把这个 PLAN/plan/任务书做成文档 / 文档并入主文档', or when a `refs/*.md` document may be drifting from the tool/CLI/源码 it describes, or when a PLAN file needs to become a user-facing reference doc. Covers three entry points — check, rewrite, plan-to-doc — backed by a `scripts/doc-check.py` checker that catches silent drift between a doc and its source-of-truth (CLI flags, MCP tool names, file paths). Trigger when the user names a doc path and asks whether it's still accurate, when adding a new CLI/MCP/API surface that old docs don't mention, or when a PLAN/任务书/thread needs to graduate into a stable reference.
| name | academic-coursework-cn |
| description | 辅助中国高校学生完成课程实践报告、专题调研、记录册、上汇报讲稿等 课程作业任务。覆盖"形势与政策""思政课""专业实习"等典型场景。 触发:用户给出课程材料(.docx/.pdf/资料)并要求"根据这份文档写报告/填记录册/ 做讲稿",或"完成附件1的实践手册"。 |
中国高校常见的几类课程作业:
| 任务类型 | 典型要求 | 产出形态 |
|---|---|---|
| 专题调研报告 | "结合 XX 谈 XX",1500-5000 字 | 单文件 .docx |
| 实践记录册/活动手册 | 封面+成员表+讨论记录+报告+附录 | 带占位的多页 .docx |
| 课堂汇报讲稿 | 3-5 分钟口播,对应 PPT 6-10 页 | 讲稿 .docx + 可选 PPT |
| 案例分析报告 | "案例简介+问题+举措+成效+启示"五段 | 单文件 .docx |
.docx 直接 pandoc input.docx -o /tmp/raw.md.doc(二进制)pandoc 不能直接读,需要先 LibreOffice 转 docx,
或者用 olefile 解析 WordDocument 流(OLE2 复合文档,UTF-16 LE).pdf 用 pdftotext 或 pdf skill 提取import re
text = open("/tmp/report.md").read()
clean = re.sub(r"\s+", "", text)
zh = sum(1 for c in clean if '\u4e00' <= c <= '\u9fff')
print(f"中文字数: {zh}") # 这是学校通常核的"字数"
注意:汉字数 ≠ 总字符数。引号、标点、英文字母都算字符但不算"字"。 方案里写"5000 字"一般指汉字数。
绝对不能编造:
可以做的合理化表达:
主动声明边界:在产出前,向用户明确:
"如果这些数字/姓名/单位不是真实发生的,建议你在小组内对一下口径, 或者把它们弱化。我现在的版本是基于源材料做的合理化表达。"
系统必备字体(已验证 Guix 系统可用):
Noto Serif CJK SC(衬线,正式感)Noto Sans CJK SC(无衬线,现代感)Sarasa Mono SCpandoc input.md -o output.docx \
--toc --toc-depth=3 \
-V mainfont="Noto Serif CJK SC" \
-V monofont="Sarasa Mono SC" \
-V geometry:margin=2.5cm \
-V fontsize=12pt
注意:
geometry:margin= 写法(不是 geometry=[margin=2.5cm]),后者是 YAML 头写法--header-includes 或 header.tex 模板所有需要真实数据的地方(姓名、学号、分数、签名),用统一格式:
[待填:XXX]
[待填:组长姓名]
[待填:2026-XX-XX]
[待填:XX 分]
这样用户拿到 docx 后,Word/WPS 全文替换 \[待填:[^]]+\] 即可一键替换。
核验清单(写完后跑一遍):
import re
ph = re.findall(r"\[待填:[^]]+\]", all_text)
print(f"待填项共 {len(ph)} 处")
理想情况 20-50 处,覆盖:封面、成员表、学习记录、讨论记录、教师评价栏。
参考 templates/course-handbook.md:
\u4e00-\u9fff 范围核验。--header-includes 不稳。生产级做法是写 header.tex 模板。用户原话:"你写的文档与附件一中的格式完全不一样!修复相关格式,需要让其保持一致"
中国高校下发的 .docx 模板("附件 1""实践记录册""课程手册"等)几乎都有一个反直觉的特征:
模板不使用 Word 的标题样式(Heading 1/2/3),而是用 Normal 样式 + 直接设字号/粗体/对齐来"伪分级"。
这是国内 Office 模板的常见做法(继承自 WPS + 早期 Word 的字体回退策略)。
如果你直接 pandoc input.md -o output.docx(用 Markdown 的 #/## 自动生成 Heading 1/2/3),
会得到一份目录结构正确但视觉完全不同的文档——用户一眼看出来"格式不对"。
第一步:用 python-docx 直接读取模板,提取格式特征
import docx
doc = docx.Document("/path/to/附件1.docx")
for p in doc.paragraphs:
text = p.text.strip()
if not text: continue
# 取首个 run 的字号/粗体
run0 = p.runs[0] if p.runs else None
sz = run0.font.size.pt if run0 and run0.font.size else None
bold = run0.font.bold if run0 else False
align = {0:'L', 1:'C', 2:'R', None:'-'}.get(p.paragraph_format.alignment, '?')
print(f"sz={sz} 粗={bold} 对齐={align} {text[:60]}")
# 看表数与行列
for t in doc.tables:
print(f"表: {len(t.rows)}行 × {len(t.columns)}列")
第二步:用 python-docx 逐段复刻,绕开 pandoc:
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
def set_run_font(run, size_pt, bold, east='宋体', ascii_='Times New Roman'):
run.font.name = ascii_
run.font.size = Pt(size_pt)
run.font.bold = bold
rPr = run._element.get_or_add_rPr()
rFonts = OxmlElement('w:rFonts')
rFonts.set(qn('w:ascii'), ascii_)
rFonts.set(qn('w:hAnsi'), ascii_)
rFonts.set(qn('w:eastAsia'), east)
rFonts.set(qn('w:cs'), ascii_)
rPr.append(rFonts)
def add_para(doc, text, size_pt, bold, align=None):
p = doc.add_paragraph()
if align is not None:
p.alignment = align
if text:
run = p.add_run(text)
set_run_font(run, size_pt, bold)
return p
def add_table_borders(table):
tbl = table._tbl
tblPr = tbl.find(qn('w:tblPr'))
tblBorders = OxmlElement('w:tblBorders')
for edge in ('top','left','bottom','right','insideH','insideV'):
b = OxmlElement('w:' + edge)
b.set(qn('w:val'), 'single'); b.set(qn('w:sz'), '4')
b.set(qn('w:space'), '0'); b.set(qn('w:color'), '000000')
tblBorders.append(b)
tblPr.append(tblBorders)
| 元素 | 字号 | 粗体 | 对齐 |
|---|---|---|---|
| 封面主标题(两行) | 26pt | ✓ | 居中 |
| 封面信息行(授课时间等) | 16pt | ✓ | 左对齐 |
| 封面制表行(马克思主义学院制表) | 16pt | ✓ | 居中 |
| 表标题(一、二、三) | 14pt | ✓ | 居中 |
| "注意"提示 | 11pt | ✗ | 左对齐 |
| 实践记录表标题(两行) | 12pt | ✓ | 左/居中 |
| 实践记录表说明 | 12pt | ✗ | 左对齐 |
| 报告大标题(XXX小组 XXX报告) | 14pt | ✓ | 居中 |
| 报告章节标题(一、二、三、四) | 14pt | ✓ | 默认(不指定) |
| 章节说明文字 + 问题/对策/启示标签 | 14pt | ✗ | 默认 |
关键点:
<w:tblBorders> 全边框(附件 1 全部是 single 黑边框)写完跑一遍,对照模板逐段对比:
def check(doc_path, ref_path):
new = docx.Document(doc_path)
ref = docx.Document(ref_path)
# 提取所有非空段落 (字号, 粗体, 对齐, 文本)
def sig(d):
return [(p.runs[0].font.size.pt if p.runs and p.runs[0].font.size else None,
p.runs[0].font.bold if p.runs else False,
{0:'L',1:'C',2:'R',None:'-'}.get(p.paragraph_format.alignment,'?'),
p.text[:30]) for p in d.paragraphs if p.text.strip()]
new_s, ref_s = sig(new), sig(ref)
print(f"新文档 {len(new_s)} 段 vs 模板 {len(ref_s)} 段")
# 一一比对前 N 段格式
for i, (n, r) in enumerate(zip(new_s, ref_s)):
ok = n[:3] == r[:3]
if not ok:
print(f" ✗ 段{i}: 新{n[:3]} vs 模板{r[:3]} | {r[3]}")
| 场景 | 工具 |
|---|---|
| 没有提供模板,用户要 Markdown 直接生成 docx | pandoc |
| 用户给了附件 1/模板,要求"格式保持一致" | python-docx |
| 用户给了文档但只要求"按这个写",没要求格式 | pandoc |
| 模板里大量表格 / 自定义边框 / 单元格合并 | python-docx |
| 只是 Markdown 章节 + 简单表格 | pandoc |
完整骨架见 references/template-format-mimicry.md。
学校"汇报展示方案"常要求"每组 3-4 分钟""不可以超时"——汇报人最容易在中间段落超时。 在 PPT 每页右上角加时间戳提示(⏱ 00:00–00:30),让汇报人抬头就能看到当前进度, 能显著降低超时机率。
# PptxBuilder 添加方法
def add_page_header(slide, page_num, total, title, time_hint=None):
# 顶部细色条
add_rect(slide, 0, 0, SW, Inches(0.05), COLOR_PRIMARY)
# 左标题
add_text(slide, Inches(0.5), Inches(0.15), Inches(8), Inches(0.5),
title, size=14, bold=True, color=COLOR_PRIMARY)
# 右页码 + 时间提示
add_text(slide, Inches(10.5), Inches(0.15), Inches(2.5), Inches(0.4),
f"P{page_num} / {total}", size=11, color=COLOR_GRAY, align='right')
if time_hint:
add_text(slide, Inches(10.5), Inches(0.45), Inches(2.5), Inches(0.4),
f"⏱ {time_hint}", size=10, color=COLOR_ACCENT, bold=True, align='right')
页数与节拍对应表(3 分 30 秒讲稿为例):
| 页码 | 内容 | 时间戳 | 讲稿段 |
|---|---|---|---|
| P2 | 实践方式(27/3/42 一图流) | ⏱ 00:00–00:30 | 开场 30 秒 |
| P3 | 三问题(三栏卡片) | ⏱ 00:30–01:00 | 问题 30 秒 |
| P4 | 三对策(三栏卡片) | ⏱ 01:00–02:00 | 对策 60 秒(重点) |
| P5 | 三启示(三层阶梯) | ⏱ 02:00–02:45 | 启示 45 秒 |
| P6 | 结语金句 | ⏱ 02:45–03:00 | 收尾 15 秒 |
| P7 | 谢谢 + 候补答疑 | — | 备用 |
配色建议:用主题文化色(花山岩画用赭红 + 土黄),配合米色背景与深蓝灰文字,学术感 + 民族文化感并存。
templates/course-handbook.md — 学校课程手册通用 Markdown 模板(含占位符,不保证格式——需用 python-docx 复刻)
references/template-format-mimicry.md — 附件 1 格式复刻范式(python-docx 骨架 + 字号特征表 + 验证脚本)
references/word-count-verification.md — 中文字数核验脚本与边界情况
references/pandoc-cjk.md — pandoc 渲染中文 docx 的完整配置范例
scripts/check_word_count.py — 字数核验 CLI:
python3 scripts/check_word_count.py handbook.md "社会实践简介" "附录 A"
[待填:XXX] 统一格式