生活分享
Skill 的脚本、参考文件与材料
把重复逻辑与大型资料拆到必要的支援档案,让技能按需要读取并验证相对路径。
阅读时间约 15 分钟 · 操作 30 分钟

返回 Codex 教学总目录Codex 学习中心:完整教程目录从安装、第一个任务到 MD 规则与进阶集成,规划 60 篇 Codex 教程、十个单元。按程度、平台、需求或命令搜索下一篇;尚未公开的教程会标示状态,方便安排学习路线。阅读全文
目标与准备
本段提到的教学与资源: Skills 入门Skills 与 SKILL.mdSkill 将固定工作流程整理成可重用的指示与资源。最小结构是一个资料夹与 SKILL.md,档案前段需要 name 和 description,正文描述操作与输出。安装技能不代表每个任务都必然使用,还要检查是否载入。阅读全文
可先下载完整练习档,解压后得到 codex-skill-lab,再逐档阅读下列说明。档案包也包含下一篇的 skill.test.mjs;不会替你安装全域技能。
资料夹存在不代表其中每个档案都自动执行。SKILL.md 负责说明何时使用及操作顺序;references 保存需要时再读的规格;assets 提供输出样板;scripts 才是实际程式。这次刻意只做「读取 JSON 并统计」,不加入网站修改、网路连线或自动发布,方便确认每个资源确实有用途。
| 资源 | 放什么 | 这次如何验证 |
|---|---|---|
| SKILL.md | 适用范围与顺序 | 确认连结及停止条件 |
| references | 输入资料契约 | 重复标题允许、重复 ID 拒绝 |
| assets | 空白报告范本 | 以真实输出填写,不留旧数字 |
| scripts | 可执行检查器 | 手动执行得到 3/1/2 |
步骤 1:建立独立技能与输入
用档案总管或编辑器建立下列结构,Windows、macOS、Linux 都使用相同档名。data 放在练习根目录,不放在技能内;技能可以重复使用,输入资料则依工作更换。检查编辑器没有把 SKILL.md 存成 SKILL.md.txt,也没有额外套一层同名资料夹。先不要把它复制到使用者全域的 .agents。
codex-skill-lab/
data/tasks.json
.agents/skills/todo-summary/
SKILL.md
references/input-format.md
assets/report.md
scripts/count-tasks.mjs
在 data/tasks.json 贴上完整输入。a 和 c 的标题都叫 Read,但它们是两笔不同任务;用识别码区分资料,不能用标题去重。这个设计会让错误合并资料的技能立即暴露问题。completed 的 true/false 是 JSON 布林值,不能加引号变成字串,也不能在最后一笔后面多放逗号。
[
{"id":"a","title":"Read","completed":true},
{"id":"b","title":"Build","completed":false},
{"id":"c","title":"Read","completed":true}
]
步骤 2:写出规格与报告范本
在 references/input-format.md 放入以下规格。这是本练习订定的资料契约,不是 Codex 自动要求所有 JSON 遵循的格式。它描述每一列需要哪些栏位、无效资料怎么处理,以及禁止修改输入的界线。若未来增加优先顺序栏位,应同步更新规格、程式与测试,不让三者各说各话。
# Task input contract
- Input is a JSON array. An empty array is valid.
- Each record has a nonempty string id, a nonempty string title,
and a boolean completed value.
- IDs are unique. Repeated titles are allowed and remain separate.
- Extra fields may be present; the summary ignores them.
- Invalid input must fail; do not silently drop or repair records.
- Read input only. Do not change, sort or overwrite the source file.
- Report total, active and completed. total = active + completed.
接著建立 assets/report.md。它保留固定栏位,让不同次执行容易比较;尖括号是需要填写的位置,不是已量测的结果。档案还没执行前,Exit code 与各数量都必须保持待填,不能因为范本看起来完整就把它当成报告。把范本和已完成报告分开,避免下一次把上次数字带入新工作。
# Task summary
Input: <relative input path>
Command: <exact command>
Exit code: <observed exit code>
Total: <observed total>
Active: <observed active>
Completed: <observed completed>
Input preserved: <verification and result>
Not checked: <remaining checks>
步骤 3:建立可独立验证的程式
把下面整段存进 scripts/count-tasks.mjs。程式只读命令列指定的档案,先验证完整输入才输出统计。遇到格式错误、重复 ID 或型别错误,标准错误输出会说明问题,退出码为 1;成功时只有 JSON 结果,退出码为 0。请先阅读再执行,不把下载到 scripts 的任何档案都视为已可信任。
import { readFileSync } from 'node:fs';
try {
if (process.argv.length !== 3) {
throw new Error('Usage: node count-tasks.mjs <input.json>');
}
const tasks = JSON.parse(readFileSync(process.argv[2], 'utf8'));
if (!Array.isArray(tasks)) throw new Error('Input must be an array');
const ids = new Set();
for (const [index, task] of tasks.entries()) {
if (!task || typeof task !== 'object'
|| typeof task.id !== 'string' || !task.id.trim()
|| typeof task.title !== 'string' || !task.title.trim()
|| typeof task.completed !== 'boolean') {
throw new Error(`Invalid task at index ${index}`);
}
if (ids.has(task.id)) throw new Error(`Duplicate id: ${task.id}`);
ids.add(task.id);
}
const completed = tasks.filter(task => task.completed).length;
const result = { total: tasks.length, active: tasks.length - completed, completed };
process.stdout.write(JSON.stringify(result, null, 2) + '\n');
} catch (error) {
process.stderr.write((error instanceof Error ? error.message : String(error)) + '\n');
process.exitCode = 1;
}
在 Windows PowerShell、macOS Terminal 或 Linux 终端机切换至 codex-skill-lab 根目录,先用 node --version 确认环境,再执行以下同一命令。相对路径 data/tasks.json 以目前工作目录为起点,并不是以 script 所在位置为起点;因此不要 cd 进 scripts 后照抄这个命令。这个差别也是技能要明确要求工作根目录的原因。
node .agents/skills/todo-summary/scripts/count-tasks.mjs data/tasks.json
{
"total": 3,
"active": 1,
"completed": 2
}
这三个数字是固定范例的预期结果,你仍需查看自己终端机的实际输出。PowerShell 用 $LASTEXITCODE 读取刚结束程式的退出码;macOS/Linux 用 echo $?。请在其他命令之前读取,否则可能拿到另一个程式的状态。重新开启 data/tasks.json,确认三笔资料、顺序、completed 值都保持原样。
路径反例:找到脚本,却读错输入位置
先确定目前位于 codex-skill-lab,且技能资料夹内没有另一份 data/tasks.json,再逐行执行下面两行。第一行移到技能根目录;第二行能找到 scripts/count-tasks.mjs,但会在错误位置找 data/tasks.json,预期 ENOENT、退出 1,没有成功 JSON。立即读取退出码后,用最后一行回到练习根目录,再重跑前面的完整命令,应恢复 3/1/2。不要把 SKILL.md 的相对连结基准套到脚本的输入参数。
cd .agents/skills/todo-summary
node scripts/count-tasks.mjs data/tasks.json
cd ../../..
步骤 4:把资源接回 SKILL.md
在 todo-summary/SKILL.md 写入完整内容。资源连结都相对于这份 SKILL.md;执行命令则明确要求在练习根目录操作。请注意两种相对位置不同。先前的 todo-acceptance 技能仍可保留,这次使用独立名称 todo-summary,让你能在选单辨识自己选到哪一个工作流程。
---
name: todo-summary
description: Summarize a local task JSON array with verified counts. Use for task-count reports, not for editing tasks, website styling, or deployment.
---
# Todo summary
1. Confirm the practice root and the exact input path with the user request.
2. Read [the input contract](references/input-format.md).
If any required resource is missing or unreadable, stop and report it.
3. Read [the checker](scripts/count-tasks.mjs) before running it.
4. From the practice root, run:
```sh
node .agents/skills/todo-summary/scripts/count-tasks.mjs data/tasks.json
```
Replace the input argument only if the request names another input file.
5. If the command fails, report the actual error. Do not guess counts or repair input.
6. If it succeeds, use [the report template](assets/report.md) in the reply.
7. Include the actual command, exit code and input-preservation check.
Say which checks were not performed. Do not claim browser testing.
8. Do not edit source data, skill resources, or project code, and do not publish.
Codex 会先用技能名称与描述判断适用情境,需要使用时才读完整指令。把稳定的短流程留在主档,长规格与程式移到可直接找到的连结,比将所有文件整包塞入每次提示更容易维护。但分档不是节省用量的保证;若工作每次都需要全部资源,仍会读取它们,不应把「存在连结」宣称成「程式已执行」。
步骤 5:使用技能并检查交付
从练习根目录开始新任务。桌面版在技能入口或输入 @ 后选择 todo-summary;CLI/IDE 用 /skills 或输入 $ 选择。先确认选单中的名称与档案位置,若没有出现,检查专案根目录和副档名,重新开启 Codex 后再试。以下是给代理的自然语言需求,不是要在 PowerShell 执行的命令。
Use the selected todo-summary skill for data/tasks.json.
Read the skill and its linked resources. Run the checker from this practice root.
Return the report in your reply only. Do not write a report file or modify any input.
Include actual output, exit code, and what you verified about input preservation.
验收时逐项看它是否读取规格与脚本、是否真的执行指定命令、是否得到 3/1/2,以及是否说清楚输入未变的确认方式。只回复「已使用技能」还不够;若没有工具执行纪录,就把执行状态记为未确认。这份报告不需要写入档案,你可以直接将对话中的结果与刚才手动执行的输出比较。
换一份输入,确认报告不是沿用旧数字
保留 tasks.json,另存下面内容为 data/tasks-next.json。从练习根目录手动执行下方命令,预期 total 2、active 2、completed 0。再开新任务,把前面的技能需求只改成此新路径;不要附上预期数字。新报告必须引用新路径及新工具输出,不能沿用 3/1/2。回头再执行旧路径,应仍是 3/1/2,才能同时确认两份输入没有被覆写。
[
{"id":"next-a","title":"Plan","completed":false},
{"id":"next-b","title":"Check","completed":false}
]
node .agents/skills/todo-summary/scripts/count-tasks.mjs data/tasks-next.json
失败案例、还原与下一步
把 input-format.md 暂时改名为 input-format.saved.md,接著开新任务、确认仍在 codex-skill-lab,再明确选用技能。新任务不要带入前次读过的规格或报告,才能观察缺档时的行为。预期应指出必要规格缺少并停止依此流程产生已验证报告,而不是自行补写一份规格。还原档名后再开另一个新任务重试。若缺档时仍产出数字,检查是否明确标示尚未验证,并把这次列为技能失败案例。
若找不到 count-tasks.mjs,先分辨技能根目录和工作根目录是否混淆;若 total 变成 2,检查是否错误合并同名标题;若 completed 字串仍通过,核对实际执行的脚本是否为这一版。不要直接重装所有技能。保留原始输入,针对缺档、资料错误、路径错误各做一次单独修正,才能知道是哪个条件造成差异。
本篇以 Node.js 检查器的可重现输入输出作为材料验证;技能选单、自动触发与代理是否遵从则要由你在自己的入口观察,不能用脚本成功代替。下一篇技能验收与修正Skill 触发与结果测试分开验证格式、选用条件及实际结果,用应触发与不应触发的案例修正技能描述。阅读全文会补入空资料、重复 ID、型别错误及不应触发的工作,并教你区分程式正确与技能使用正确。示意图 1 是输入与契约,2 是执行,3 是检查报告。
返回 Codex 教学总目录Codex 学习中心:完整教程目录从安装、第一个任务到 MD 规则与进阶集成,规划 60 篇 Codex 教程、十个单元。按程度、平台、需求或命令搜索下一篇;尚未公开的教程会标示状态,方便安排学习路线。阅读全文
阅读完整文字说明
Three numbered stages: identify the starting point, perform the exercise, and verify the result. Original illustration, not a product screenshot.
同主题延伸阅读
生活分享
Codex 学习中心:完整教程目录
从安装、第一个任务到 MD 规则与进阶集成,规划 60 篇 Codex 教程、十个单元。按程度、平台、需求或命令搜索下一篇;尚未公开的教程会标示状态,方便安排学习路线。
生活分享
Worktree 与多任务隔离
Worktree 让同一个 Git 程式库有不同的工作目录,各自承接不同分支。它适合让两项工作分开改档,但资料库、连接埠与外部服务仍可能共用,不能把档案隔离当成所有资源隔离。
生活分享
实战:制作小网站
从 brief.md 规划并制作 Small Steps 待办网站,完成新增、完成、删除、筛选与本机资料保存。将 HTML、CSS、资料函式、画面事件与测试分开,以 Node 测试和浏览器操作验收,并留下可重新启动与还原的交接纪录。
生活分享
用量与效率:减少重工
记录任务条件、模型选项、时间与成果,找出能减少无效重试和过多上下文的调整。
引用本文的文章
最新旅游情报攻略

攻略东京
东京住哪一区:新宿、上野、东京站、涩谷、浅草、池袋、银座七区比较,机场交通、住宿税、行李寄送一次看
东京住哪一区?用同一套标准比较新宿、上野、东京站、涩谷、浅草、池袋、银座七个区域:从成田、羽田机场怎么过来、有哪些线路、周边有什么、街区氛围、适合谁。附比较表与山手线示意图,以及 2026 年 9 月核实的东京都住宿税(2027 年 4 月改为 3%)和机场宅急便寄送行李的规则。
- 预算
- 酒店

攻略东京
东京交通票券怎么选:Suica/Welcome Suica、Tokyo Subway Ticket、JR Pass 值不值得买
第一次去东京,每人先用一张 IC 卡按次付费(Welcome Suica 免押金、有效期 28 天)。一天搭四趟以上地铁,再加买 2,000 日元的 Tokyo Subway Ticket 72 小时券;只玩东京、不去关西,买 JR Pass 一定不划算。用决策图比较 TOURIST PASMO、iPhone 里的 Suica、东京 Metro 一日券能搭什么、不能搭什么;价格于 2026 年 9 月核实。
- 交通
- 预算

攻略东京
东京迪士尼乐园、海洋攻略:票价、梦幻泉乡 Fantasy Springs、尊享卡 DPA 与预约等候卡怎么用,第一次去选哪个园区
东京迪士尼一日护照采用浮动票价,2026 年 9 月平日大多为 9,900 日元、周末为 10,900 日元,官网每天 14:00 开售两个月后同一天的门票;免费的优先通行卡已不在官网服务清单,缩短排队时间只剩付费的迪士尼尊享卡(每人每次 1,000 至 3,500 日元)。另有运营时间与 25 周年活动、预约等候卡与报名体验、梦幻泉乡如何进入,以及第一次去选乐园还是海洋;2026 年 9 月通过东京迪士尼度假区官网核实。
- 行程范例
- 亲子