无双软著申请
> 版本 V1.1.2 | 作者:锤无双 | 交流 QQ 群:170621740
把「跑一遍官网六页表单 + 打印两摞代码 + 写一本手册」压成一条命令链。文字由开发记录推出来,页数由生成器算出来,不留占位符。
先定位技能目录
下文用 $SKILL 指代本技能所在目录的绝对路径。它由宿主平台决定——同一份技能装在不同 AI 工具里,路径和目录名都不一样,不要照抄任何一行示例,用你实际读到这份 SKILL.md 的那个目录。
| 宿主 | 技能根目录 | 本技能落地名 | 完整路径 |
|---|---|---|---|
| WorkBuddy | ~/.workbuddy/skills/ |
无双软著申请(与 name 一致) |
$HOME/.workbuddy/skills/无双软著申请 |
| 千问办公 | ~/.qwenworkcn/skills/ |
wushuang-ruanzhu(用 slug) |
$HOME/.qwenworkcn/skills/wushuang-ruanzhu |
| Claude Code 等兼容 Agent Skills 的工具 | 各家自定 | wushuang-ruanzhu |
$HOME/.claude/skills/wushuang-ruanzhu |
一轮对话只取一次,之后所有命令统一写 $SKILL/scripts/xxx.py:
SKILL="$HOME/.workbuddy/skills/无双软著申请" # WorkBuddy
SKILL="$HOME/.qwenworkcn/skills/wushuang-ruanzhu" # 千问办公
# 其他工具:把上表对应那一行的「完整路径」原样填进来
判断对不对:ls "$SKILL/SKILL.md" 能列出文件就是对的。
脚本全部按自身位置定位、按当前目录向上找 00_基本信息.json,不依赖任何平台路径,因此换平台不用改代码,只需改上面这一行。
工作目录(00_基本信息.json、两份 Word、PDF、自查单)建在项目目录之外,如 项目名_软著/。材料不要写进技能目录,技能升级时会被整体覆盖。
安装与首次使用(第 0 步,只做一次)
0.1 自检:先确认能不能出稿
用户一提「软著」,第一件事就是跑这个自检,不要等用户问,也不要跳过:
python $SKILL/scripts/bootstrap.py
报告四件事:Word 生成能力、PDF 出稿方式、PDF 截页合并能力、字体是否齐。原则是能不下载就不下载:
| 能力 | 首选(本机自带,零下载) | 兜底 |
|---|---|---|
| 生成 Word | python-docx(多数环境已有) | 缺失时 --install 走清华镜像装,几百 KB |
| 出 PDF | 本机 Word 的 COM 导出(3 秒出 43 页) | 依次降级 WPS → LibreOffice → 只能出 docx |
| PDF 截页合并 | pypdf(纯 Python,几十 KB) | 缺失时 --install,或直接在 Word 里导出指定页范围 |
刻意不依赖 PyMuPDF 这类大二进制包:国内拉取慢、失败率高,而交付需要的能力(导出、截页、合并)本机 Word + pypdf 已经够。
带 --install 时会自动补装缺的两个纯 Python 包(清华镜像 → 阿里镜像依次尝试),装不上不阻塞流程,只在报告里写清降级方案。
0.2 问三项,然后记住
自检完必须问用户这三项(其余字段后面按开发记录推):
- 申请人名称(营业执照全称,不是简称)
- 软件全称
- 版本号(建议 V1.0,与页眉、说明书三处必须一致)
问话模板(三句一次问完,不要挤牙膏):
> 开始前先确认三项:① 申请人名称(营业执照全称)② 软件全称 ③ 版本号(建议 V1.0)。
> 顺手能给的话,再补统一社会信用代码和公司成立日期,后面校验日期逻辑要用。
拿到后一次写入:
python $SKILL/scripts/bootstrap.py --owner "申请人全称" --name "软件全称" --version V1.0 \
--root <项目目录> --outdir <材料输出目录>
生成 00_基本信息.json。之后所有脚本都在当前目录向上找它,不用再传 --name / --version / --outdir。顺手能问到的还有统一社会信用代码与成立日期(成立日期是校验「开发完成日期不得早于成立日」的依据),问到就一起写进 --credit-code / --founded。
0.3 环境不满足时怎么走
| 情况 | 处理 |
|---|---|
| 没有 Word/WPS/LibreOffice | 只出 docx,让用户在自己机器上另存 PDF;其余环节照常 |
| 缺 Consolas 字体 | 加 --font-ascii "Courier New",宽度接近,不会跑版 |
| python-docx 装不上 | 换镜像重试一次;仍失败则告知用户需要该包,不做假交付 |
六步流水线
以下命令都在工作目录里执行,$SKILL 按「先定位技能目录」一节取一次即可。
第 1 步 扫描项目
python $SKILL/scripts/scan_project.py --root <项目目录> --out 02_项目扫描.json
输出语言分布、有效行数、依赖、技术栈、git 首末提交日期、疑似密钥文件清单。建议填表值.源程序量 就是「源程序量」栏要填的数。
第 2 步 起草字段 → 校验 → 填报清单
python $SKILL/scripts/check_form.py --init # 生成模板,已预填申请人/软件名/版本号
python $SKILL/scripts/check_form.py # 校验并出 01_填报清单.md
填 01_表单值.json 时按 references/01_字段规格与填法.md 逐字段对照,「软件的主要功能」按 references/02_主要功能写作模板.md 写,必须 500–1300 字。校验不通过(退出码 1)改到通过为止。
第 3 步 源代码 Word(两份)
python $SKILL/scripts/gen_source_docx.py
- 每页 50 行、全文无空行、页眉左=全称+版本号、右=第 X 页 共 N 页
- 无封面,第 1 页即代码;页脚留空;页眉下 0.75 磅实线
- 总页数 ≤ 60 只出完整稿;> 60 自动多出一份「前 30 页 + 后 30 页」
- 文件名含
secret/token/key/.env的文件自动排除并在统计里点名
口径说明:官方要求「每页不少于 50 行」,默认 50 即达标。若要求严格多于 50 行,加 --lines-per-page 51(14 磅行距下 51 行仍装得下,52 行需同时降 --line-pt 13.5)。
python $SKILL/scripts/check_docx.py 源代码_完整.docx --expect-lines 50
第 4 步 说明书 Word
先按 examples/操作说明书模板.md 写成 操作说明书.md(结构见 references/03 第二节),再转:
python $SKILL/scripts/gen_manual_docx.py --md 操作说明书.md --chapter-pagebreak
- 封面独占第 1 页(著作权人 / 软件全称 / 版本号 / 文档名称),封面不显示页眉页码;正文页码自 1 重新起算,「共 N 页」用 SECTIONPAGES 域,不含封面
- 页脚留空;页眉同源代码
- 含图段落与图注段落一律倍数行距(
line_spacing = 1.0),不能用固定行距——固定行距把行框钉死,行内图按行高裁剪,Word 与 PDF 里截图都只剩一条。生成器已处理,改模板时别改回去 - 文档名称用
--doc-title 用户手册(默认)或--doc-title 操作说明书;不要封面加--no-cover
截图必须主动向用户要,不要自己跳过。 官方没把截图写成强制项,但审查员靠界面截图判断「这份文档写的是不是这个软件」,纯文字手册更容易被要求补正。30 页的手册放 8–15 张,每 2–3 页一张。
图片用  引用真实截图;文件不存在时 Word 里留「【此处插入界面截图:…】」占位,并在同目录生成 截图清单.md,把该截什么列成表交给用户补拍。界面截图不得用 AI 生成图、不得带 AI 工具水印。
第 5 步 出 PDF(用户核对之后)
用户先在 Word 里看一眼页数和页码,确认无误后可用一条命令出 PDF,不必手动另存:
python $SKILL/scripts/docx2pdf.py --input 源代码_完整.docx --output 源代码_完整.pdf
python $SKILL/scripts/docx2pdf.py --input 源代码_前30后30.docx --output 源代码_前30后30.pdf
说明书超过 60 页时按页截取再合并(页码沿用原文真实页码):
python $SKILL/scripts/docx2pdf.py --input 操作说明书.docx --output 说明书_前30.pdf --pages 1-30
python $SKILL/scripts/docx2pdf.py --input 操作说明书.docx --output 说明书_后30.pdf --last 30
python $SKILL/scripts/docx2pdf.py --merge 说明书_提交稿.pdf 说明书_前30.pdf 说明书_后30.pdf
用户也可以不用这条命令,直接在 Word 里另存 PDF —— 两条路等价。
第 6 步 自查单
python $SKILL/scripts/make_checklist.py
把填表值与材料统计填进勾选项,用户照着打勾。最后一段「签章页」必须口头强调。
版式口径(封面 / 页眉 / 页脚)
三处定死,逐项规格与踩坑记录见 references/05_版式规范_封面页眉页脚.md:
| 部位 | 规定 |
|---|---|
| 页眉左 | 软件全称 V1.0,宋体 9pt,不加粗,与申请表逐字一致 |
| 页眉右 | 第 X 页 共 N 页,X 用 PAGE 域,靠右对齐制表位顶到右边界 |
| 页眉线 | 页眉下一道 0.75 磅黑色实线 |
| 页脚 | 留空。不写公司名、日期、水印、二维码 |
| 封面 | 仅文档鉴别材料有;独占第 1 页,不显示页眉页码;不放日期、Logo、网址 |
版式体检命令(只看版式、不判内容):
python $SKILL/scripts/check_docx.py 源代码_完整.docx --audit-only
python $SKILL/scripts/check_docx.py 操作说明书.docx --kind manual --audit-only
会报出:纸张与四条页边距、页眉字号、右制表位位置、是否残留居中/左对齐制表位、下框线、PAGE 域、页脚是否为空、封面是否带页眉、是否出现「AI 生成」等字样、含行内图片的段落是否用了固定行距(固定行距会把截图裁成一条)。别人做的材料也能拿它体检。
交付物
| 文件 | 用途 |
|---|---|
00_基本信息.json |
申请人、软件全称、版本号(一次登记,全流程复用) |
01_填报清单.md |
官网六页签逐项值 + 字数校验 + 可整段复制块 |
02_项目扫描.json |
开发事实与疑似密钥文件清单 |
源代码_完整.docx |
全部自研代码,每页 50 行、无空行、右上角页码 |
源代码_前30后30.docx |
总页数 > 60 时另出 |
操作说明书.docx |
文档鉴别材料 |
*.pdf |
由 Word 导出,用户核对后生成 |
05_自查单.md |
提交前逐项核对 |
硬约束
| 项 | 要求 | 违反后果 |
|---|---|---|
| 源代码每页行数 | ≥ 50 行,末页可为程序结束页 | 直接补正 |
| 空行 | 全文无空行 | 视为凑页数,补正 |
| 页码 | 右上角,连续,「共 N 页」与实际页数一致 | 材料不真实,补正 |
| 页眉 | 软件全称 + 版本号,与申请表逐字一致,宋体 9pt | 三处不一致被要求补正 |
| 页码位置 | 右上角,靠右对齐制表位顶到右边界 | 落在页面中间,不符「右上角」 |
| 页脚 | 留空 | 多一处比对点,易生歧义 |
| 封面 | 程序材料无封面;文档材料封面不带页眉页码 | 总页数口径混乱 |
| 主要功能 | 500–1300 字 | 少于 500 字系统拒收 |
| 环境类五字段 | 每栏 ≤ 50 字 | 超字无法保存 |
| 编程语言其他栏 | ≤ 120 字 | 超字无法保存 |
| 技术特点补充 | ≤ 100 字 | 超字无法保存 |
| 源程序量 | 与代码 Word 的有效行数同口径 | 数字对不上被质疑 |
只剩一件事要用户自己做
注册账号、企业实名认证、打印签章页盖鲜章、上传,必须本人在官网完成。指南见 references/04_官网填报与签章指南.md,其中「签署页」回传有时限,必须主动提醒。
反例(别做)
- 自检没过就往下跑 —— 后面每个环节都会在最后一步崩。
- 不登记三项就生成 —— 页眉写错一次,两份 Word 都得重出。
- 把整份代码硬压进 60 页 —— 行距固定、行数固定,页数由生成器算,不靠事后调。
- 用「无」填软件简称 —— 系统明确要求留空。
- 开发完成日期早于公司成立日期 —— 必补正。
- 功能描述全是形容词 —— 要与代码目录、类名、函数名对得上。
- 页脚写公司名、日期、「内部资料」—— 页脚只留空白。
- 页码写成「第 1 页 / 共 30 页」—— 斜杠格式不规范,且静态数字改页数不更新。
- 封面也显示页眉与「第 1 页」—— 封面独立成节,页眉页脚清空。
交流与反馈
作者:锤无双。使用中遇到问题、或官网表单改版导致字数限制变化,可在 QQ 群 170621740 反馈。
提问题时带上三样东西,定位最快:软件全称、卡住的那一步(自检 / 填报清单 / 源代码 / 说明书 / PDF)、报错原文。