@wwkit/harness 1.0.26 → 1.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/index.js +15 -0
- package/package.json +2 -2
- package/scripts/postinstall.js +18 -0
- package/skills/extract/SKILL.md +66 -83
- package/skills/extract/references/detail.md +3 -8
- package/skills/extract/references/list.md +135 -0
- package/skills/extract/references/navi.md +3 -7
- package/skills/extract/references/text.md +3 -8
- package/skills/lint/SKILL.md +40 -33
- package/skills/pytest/SKILL.md +38 -30
- package/skills/query/SKILL.md +47 -56
- package/skills/revise/SKILL.md +70 -78
- package/skills/revise/references/article.md +15 -19
- package/skills/revise/references/gallery.md +16 -20
- package/skills/revise/references/question.md +15 -19
- package/skills/revise/references/status.md +15 -19
- package/skills/extract/references/list_from_html.md +0 -74
- package/skills/extract/references/list_from_json.md +0 -52
- package/skills/extract/references/list_from_text.md +0 -60
package/skills/pytest/SKILL.md
CHANGED
|
@@ -11,23 +11,26 @@ metadata:
|
|
|
11
11
|
workflow: sequential
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
-
# pytest
|
|
14
|
+
# pytest 技能(固定 Sprint 冲刺)
|
|
15
15
|
|
|
16
|
-
##
|
|
16
|
+
## 执行范式
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
- **MUST**:子工作流通过 `read` 加载 `references/xxx.md` 并按其指令执行,**不再调用独立 skill**(原 pytest-* 子 skill 已合并入 references/)。
|
|
18
|
+
每次调用 = 一个固定 Sprint,三个事件:
|
|
19
|
+
|
|
20
|
+
1. **Sprint Planning**:解析入参 → 定义 Sprint Goal → todowrite 落固定 7 项 Sprint Backlog(每项带 DoD)
|
|
21
|
+
2. **Sprint Execution**:7 步 + 双层 loop 逐项执行,每项 = 执行 → 验证 DoD → todowrite 勾单 Done
|
|
22
|
+
3. **Sprint Review**:对照 Sprint Goal 验证 Increment(测试报告)及输出语义,沉淀 1 条回顾
|
|
24
23
|
|
|
25
|
-
|
|
24
|
+
**Sprint Goal** = `对 {{source}} 执行 {{test_type}} 测试,产出测试质量报告(unit 达标 score≥90,integration 达标 score≥70)`。
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
**铁律(最高优先级):**
|
|
27
|
+
|
|
28
|
+
- **没有 Sprint Backlog 不能开始执行**:收到任务消息后,先做 Sprint Planning(解析入参)再 todowrite 落固定 7 项 Sprint Backlog,然后才进入 Sprint Execution。
|
|
29
|
+
- **每项执行周期** = 进度检查(Daily Scrum 映射)→ 执行 → 验证 DoD → 勾单 Done。
|
|
30
|
+
- **子工作流通过 `read` 加载 `references/xxx.md` 并按其指令执行**,**不再调用独立 skill**(原 pytest-* 子 skill 已合并入 references/)。
|
|
31
|
+
- **禁止**:混合测试类型(unit 不混合 integration,反之亦然)。
|
|
32
|
+
- **禁止**:修改 conftest.py(除非直接导致失败)。
|
|
33
|
+
- **禁止**:使用 WebFetch 或任何网络请求。
|
|
31
34
|
|
|
32
35
|
## 配置表(按 test_type 分支)
|
|
33
36
|
|
|
@@ -57,14 +60,7 @@ metadata:
|
|
|
57
60
|
|
|
58
61
|
## 输入参数(自包含)
|
|
59
62
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
- **JSON 对象**:`{test_type, source, test_dir}`,直接取字段值。
|
|
63
|
-
- **key=value**:`test_type=unit, source=src/mymodule`,按 `,` 和 `=` 拆分为字段。
|
|
64
|
-
- **纯文本 prose**:含 "集成/integration" → integration;含 "单元/unit" → unit;默认 unit。`source` 从文本中出现的路径推断。
|
|
65
|
-
- **命令风格**:`unit src/mymodule` 或 `integration src/mymodule tests/integration/mymodule`,第一段为 test_type,第二段为 source,第三段(可选)为 test_dir。
|
|
66
|
-
|
|
67
|
-
字段清单:
|
|
63
|
+
入参为调用方传入的**原始任务消息**,可为 JSON 对象、key=value、自然语言或命令风格等任意形态,agent 依据字段语义自主提取(详见 Step 1)。字段清单:
|
|
68
64
|
|
|
69
65
|
| 字段 | 类型 | 必填 | 说明 |
|
|
70
66
|
|------|------|------|------|
|
|
@@ -72,6 +68,8 @@ metadata:
|
|
|
72
68
|
| source | string | 是 | 源码包目录或 .py 文件路径 |
|
|
73
69
|
| test_dir | string | 否 | 测试目录;未指定时按 `tests/{test_type}/{归一化路径}/` 自动推导 |
|
|
74
70
|
|
|
71
|
+
**提取原则**:从消息中自主识别三个字段——命令风格(`unit src/mymodule` 或 `integration src/mymodule tests/integration/mymodule`,第一段为 test_type,第二段为 source,第三段可选为 test_dir)、JSON 对象(`{test_type, source, test_dir}`)、key=value(`test_type=..., source=...`)、或自然语言(含 "集成/integration" → integration;含 "单元/unit" → unit;默认 unit;`source` 从出现的路径推断)。
|
|
72
|
+
|
|
75
73
|
**必填校验**:若无法解析出 `test_type` 或 `source`,将错误信息输出到 stderr 并结束,**禁止**继续执行。
|
|
76
74
|
|
|
77
75
|
**test_type 校验**:解析后若 `test_type` 不在 `{unit, integration, sample}` 中,输出 "test_type 只能是 unit、integration 或 sample,得到: {value}" 并结束。
|
|
@@ -84,17 +82,19 @@ metadata:
|
|
|
84
82
|
|
|
85
83
|
## 工作流程
|
|
86
84
|
|
|
87
|
-
### 阶段 0:todowrite
|
|
85
|
+
### 阶段 0:todowrite 落单(Sprint Backlog)
|
|
88
86
|
|
|
89
|
-
收到任务消息后,先用 `todowrite`
|
|
87
|
+
收到任务消息后,先用 `todowrite` 创建固定 7 项 Sprint Backlog(status=pending),每项带 DoD:
|
|
90
88
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
89
|
+
| # | 任务 | 对应 Step | DoD |
|
|
90
|
+
|---|------|----------|-----|
|
|
91
|
+
| 1 | 入参校验与目录映射 | Step 1 | test_type/source/test_dir 已校验,target/test_dir/report_dir/flow_start_time 已确定,7 项清单已建 |
|
|
92
|
+
| 2 | 模块适用性评估 | Step 2 | 得到 testable_classes(或为空已按原因退出) |
|
|
93
|
+
| 3 | 环境检查 | Step 3 | 得到 config(或 env-ensure 失败已退出);integration 补充检查已记录警告 |
|
|
94
|
+
| 4 | 覆盖率分析(外层 loop) | Step 4 | 得到 score/uncovered_areas,按退出条件结束或进入下一轮 |
|
|
95
|
+
| 5 | 用例创建 | Step 5 | 得到 new_cases_count(=0 已跳过 execute+fix 直接轮尾评分) |
|
|
96
|
+
| 6 | 测试执行 | Step 6 | 得到通过/失败结果(有失败已进入 Step 7) |
|
|
97
|
+
| 7 | 用例修复(内层 loop) | Step 7 | 得到修复结果,按内层退出条件回到 Step 6 或 Step 4 轮尾评分 |
|
|
98
98
|
|
|
99
99
|
每步完成立即 todowrite 勾单(status=completed)。
|
|
100
100
|
|
|
@@ -502,6 +502,14 @@ integration:
|
|
|
502
502
|
- 内容:上述完整报告(含源码 Bug 汇总)
|
|
503
503
|
- 同时在 chat 中输出报告摘要
|
|
504
504
|
|
|
505
|
+
## Sprint Review
|
|
506
|
+
|
|
507
|
+
所有 Backlog Items 完成后:
|
|
508
|
+
|
|
509
|
+
- **对照 Sprint Goal 验证**:是否对 `{{source}}` 完成 `{{test_type}}` 测试并产出测试质量报告?得分是否达标(unit≥90,integration≥70)?报告是否写入 `report_dir/test_report.md`?
|
|
510
|
+
- **展示 Increment**:测试报告路径 + chat 摘要。
|
|
511
|
+
- **简要回顾(Retrospective)**:沉淀 1 条改进项供下一轮采纳。
|
|
512
|
+
|
|
505
513
|
## 规则
|
|
506
514
|
|
|
507
515
|
**共同规则**:
|
package/skills/query/SKILL.md
CHANGED
|
@@ -1,107 +1,98 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: query
|
|
3
3
|
description: |
|
|
4
|
-
自包含内容生成 skill
|
|
4
|
+
自包含内容生成 skill:每次调用 = 一个固定 Sprint——Sprint Planning(解析入参、定义 Sprint Goal、todowrite 落固定 Sprint Backlog)→ Sprint Execution(逐项执行并验证 DoD)→ Sprint Review(对照 Sprint Goal 校验交付 + 简要回顾)。
|
|
5
5
|
prompt 为任务要求(含输出格式说明),source 为可选素材,language 控制输出语言(默认中文)。
|
|
6
|
-
调用方直接传原始任务消息,skill 自解析自包含。内部用 todowrite
|
|
6
|
+
调用方直接传原始任务消息,skill 自解析自包含。内部用 todowrite 管理固定 3 项 Sprint Backlog(每项带 DoD)。禁止 WebFetch/网络请求。
|
|
7
7
|
适用:通用内容生成(摘要/改写/翻译/结构化提取等任意 prompt 驱动任务)。
|
|
8
8
|
license: MIT
|
|
9
9
|
metadata:
|
|
10
10
|
workflow: sequential
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
-
# query
|
|
13
|
+
# query 技能(固定 Sprint 冲刺)
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## 执行范式
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
- **MUST**:每步完成立即 todowrite 勾单。
|
|
19
|
-
- **禁止**:使用 WebFetch 或任何网络请求获取内容。
|
|
20
|
-
- **禁止**:写入 output 以外的任何文件;中间产物用临时文件,完成后清理。
|
|
21
|
-
- **禁止**:以任何形式使用未声明字段(url 等不属于 query 的字段)。
|
|
17
|
+
每次调用 = 一个固定 Sprint,三个事件:
|
|
22
18
|
|
|
23
|
-
|
|
19
|
+
1. **Sprint Planning**:解析入参 → 定义 Sprint Goal → todowrite 落固定 3 项 Sprint Backlog(每项带 DoD)
|
|
20
|
+
2. **Sprint Execution**:逐项执行,每项 = 执行 → 验证 DoD → todowrite 勾单 Done
|
|
21
|
+
3. **Sprint Review**:对照 Sprint Goal 验证 Increment(生成内容)及输出语义,沉淀 1 条回顾
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
> 我是否已用 todowrite 落单 3 步?
|
|
27
|
-
> - 未落单 → 立即 todowrite 创建清单。
|
|
28
|
-
> - 已落单 → 继续。
|
|
23
|
+
**Sprint Goal** = `按 {{prompt}} 生成内容(语言 {{language}}),并按输出语义交付`。
|
|
29
24
|
|
|
30
25
|
## 输入参数
|
|
31
26
|
|
|
32
|
-
|
|
33
|
-
- **JSON 对象**:如 `{prompt, source, language, output}`,直接取字段值;
|
|
34
|
-
- **key=value**:如 `prompt=写一篇关于AI的文章, output=/tmp/out.txt`,按 `,` 和 `=` 拆分为字段;
|
|
35
|
-
- **纯文本 prose**:尝试从文本中推断提取参数(如"输出到xxx"→`output`、"素材xxx"→`source`、"用英文"→`language`),剩余内容作为 `prompt`;若无法提取,整段文本作为 `prompt`。
|
|
27
|
+
入参为调用方传入的**原始任务消息**,可为 JSON 对象、key=value 或自然语言等任意形态,agent 依据字段语义自主提取(详见 Item 1)。字段清单(字段/类型/必填/默认值)以 `references/input.schema.json5` 为准:
|
|
36
28
|
|
|
37
|
-
|
|
29
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| `prompt` | string | ✅ | 任务要求,包含输出格式说明 |
|
|
32
|
+
| `source` | string | ❌ | 原始素材:普通文本或本地文件路径 |
|
|
33
|
+
| `language` | string | ❌ | 输出内容语言,默认 中文 |
|
|
34
|
+
| `output` | string | ❌ | 输出文件路径(提供则写文件,否则 stdout) |
|
|
38
35
|
|
|
39
|
-
|
|
36
|
+
本技能仅使用上表四个字段,忽略所有其他字段(如 `url`),不得读取、写入或据此推断任何行为。
|
|
40
37
|
|
|
41
|
-
|
|
42
|
-
- 未提供 `output` 参数:将生成内容直接输出到 stdout,**不写任何文件**。
|
|
43
|
-
- 生成失败或结果为空:不写文件,将错误信息输出到 stderr 并结束。
|
|
44
|
-
|
|
45
|
-
## 工作流程
|
|
46
|
-
|
|
47
|
-
### 阶段 0:todowrite 落单
|
|
38
|
+
## 固定 Sprint Backlog(todowrite 落单,覆盖历史 todos)
|
|
48
39
|
|
|
49
|
-
|
|
40
|
+
1. 解析入参(从任意形态任务消息自主提取 prompt/source/language/output) | DoD: 得到四个字段值(或 prompt 缺失时 stderr 报错结束)
|
|
41
|
+
2. 内容生成(LLM 创作) | DoD: 按 prompt 生成内容,语言 language(默认中文),source 已按需解析为素材
|
|
42
|
+
3. 输出(写 output 文件或 stdout) | DoD: 按输出语义交付(文件路径或 stdout),结果为空/失败时 stderr 报错
|
|
50
43
|
|
|
51
|
-
|
|
52
|
-
2. 内容生成(LLM 创作)
|
|
53
|
-
3. 输出(写 output 文件或 stdout)
|
|
44
|
+
## Sprint Execution
|
|
54
45
|
|
|
55
|
-
|
|
46
|
+
按固定 3 项逐项执行,每项周期 = 进度检查(刚完成什么/本项做什么/有无阻塞)→ 执行 → 验证 DoD → 勾单 Done。
|
|
56
47
|
|
|
57
|
-
###
|
|
48
|
+
### Item 1:解析入参
|
|
58
49
|
|
|
59
|
-
将第 1
|
|
50
|
+
将第 1 项标记 in_progress,从原始任务消息中**自主提取**四个字段。入参可为 JSON 对象、key=value 或自然语言等任意形态,依据字段语义理解提取即可,无需固定解析规则。提取原则:
|
|
60
51
|
|
|
61
|
-
-
|
|
62
|
-
- **key=value**:按 `,` 分割、按 `=` 拆分为键值对,取上述四字段。
|
|
63
|
-
- **纯文本 prose**:尝试从文本中推断提取参数(如"输出到xxx"→`output`、"素材xxx"→`source`、"用英文"→`language`),剩余内容作为 `prompt`;若无法提取,整段文本作为 `prompt`。
|
|
52
|
+
- **自然语言推断**:从文本中推断提取参数(如"输出到xxx"→`output`、"素材xxx"→`source`、"用英文"→`language`),剩余内容作为 `prompt`;若无法提取,整段文本作为 `prompt`。
|
|
64
53
|
|
|
65
|
-
|
|
66
|
-
- `prompt`(必填,任务要求,包含输出格式说明)
|
|
67
|
-
- `source`(可选,素材文本或文件路径)
|
|
68
|
-
- `language`(可选,缺省按 中文 处理)
|
|
69
|
-
- `output`(可选,输出文件路径)
|
|
54
|
+
解析后得到 `prompt`、`source`、`language`、`output` 四个字段(字段说明见上文输入参数表;`source`/`language`/`output` 缺省时留空由后续 Item 处理)。
|
|
70
55
|
|
|
71
56
|
**必填校验**:若 `prompt` 为空、null 或仅含空白字符,将错误信息输出到 stderr 并结束,**禁止**继续执行。
|
|
72
57
|
|
|
73
|
-
|
|
58
|
+
**验证 DoD**:四个字段值已得到(或 prompt 缺失已报错结束)。通过后标记 Done。
|
|
74
59
|
|
|
75
|
-
###
|
|
60
|
+
### Item 2:内容生成
|
|
61
|
+
|
|
62
|
+
将第 2 项标记 in_progress,先判断 `source` 是否提供:
|
|
76
63
|
|
|
77
|
-
先判断 `source` 是否提供:
|
|
78
64
|
- `source` 非空时,若值为现有文件路径则用 `read` 读取文件内容作为素材;否则直接以值作为素材。
|
|
79
65
|
- `source` 为空时,仅依据 `prompt` 生成内容。
|
|
80
66
|
|
|
81
67
|
利用自身能力按 `prompt` 要求生成内容,输出语言使用 `language`(默认中文)。**禁止用 bash 解析 JSON**,直接依据内容理解处理。
|
|
82
68
|
|
|
83
|
-
|
|
69
|
+
**验证 DoD**:已按 prompt 生成内容,语言 language(默认中文),source 已按需解析为素材。通过后标记 Done。
|
|
84
70
|
|
|
85
|
-
###
|
|
71
|
+
### Item 3:输出
|
|
86
72
|
|
|
87
|
-
|
|
88
|
-
|
|
73
|
+
将第 3 项标记 in_progress:
|
|
74
|
+
|
|
75
|
+
- 提供 `output` 参数:用 `write` 工具将生成内容写入 `output` 指定文件(**禁止创建其他文件**),stdout 输出该文件路径。
|
|
76
|
+
- 未提供 `output` 参数:将生成内容直接输出到 stdout,**不写任何文件**。
|
|
89
77
|
|
|
90
78
|
若结果为空或生成失败,将错误信息输出到 stderr 并结束,**不写任何文件**。
|
|
91
79
|
|
|
92
|
-
|
|
80
|
+
**验证 DoD**:按输出语义交付(文件路径或 stdout 数组),或结果为空/失败时 stderr 已报错。通过后标记 Done。
|
|
93
81
|
|
|
94
|
-
##
|
|
82
|
+
## Sprint Review
|
|
95
83
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
84
|
+
所有 Backlog Items 完成后:
|
|
85
|
+
|
|
86
|
+
- **对照 Sprint Goal 验证**:生成内容是否符合 `{{prompt}}` 要求、语言 `{{language}}`?输出语义是否正确(写文件输出路径 / stdout 输出内容)?
|
|
87
|
+
- **展示 Increment**:输出文件路径或 stdout 的生成内容。
|
|
88
|
+
- **简要回顾(Retrospective)**:沉淀 1 条改进项供下一轮采纳。
|
|
100
89
|
|
|
101
90
|
## 约束
|
|
102
91
|
|
|
103
92
|
- 只处理已声明字段(prompt/source/language/output),忽略所有其他传入参数(如 `url`),**禁止**以任何形式使用它们。
|
|
104
|
-
- **禁止使用 WebFetch
|
|
93
|
+
- **禁止使用 WebFetch 或任何网络请求、禁止访问外部网络**;`source` 仅为素材透传,绝不自行获取内容。
|
|
94
|
+
- 写文件一律用 `write` 工具;读文件用 `read` 工具;需要中间数据时写入临时文件,以 stdin 重定向传给 node。
|
|
95
|
+
- 禁止使用未授权的 `cp`/`rm`/`mv` 等命令;需要复制、移动或删除临时文件时,一律用允许的 `node -e` 的 fs 模块完成。
|
|
105
96
|
- 中间产物用临时文件,完成后清理,禁止写入 output 以外的任何持久文件。
|
|
106
97
|
|
|
107
98
|
## references/ 目录结构
|
package/skills/revise/SKILL.md
CHANGED
|
@@ -1,101 +1,92 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: revise
|
|
3
3
|
description: |
|
|
4
|
-
自包含内容创作 skill
|
|
4
|
+
自包含内容创作 skill:每次调用 = 一个固定 Sprint——Sprint Planning(解析入参、定义 Sprint Goal、todowrite 落固定 Sprint Backlog)→ Sprint Execution(逐项执行并验证 DoD)→ Sprint Review(对照 Sprint Goal 校验交付 + 简要回顾)。
|
|
5
5
|
format=question/status/gallery/article。count 控制条目数(默认1),language 控制输出语言(默认中文)。
|
|
6
|
-
调用方直接传原始任务消息,skill 自解析自包含。内部用 todowrite
|
|
6
|
+
调用方直接传原始任务消息,skill 自解析自包含。内部用 todowrite 管理固定 6 项 Sprint Backlog(每项带 DoD)。禁止 WebFetch/网络请求。
|
|
7
7
|
适用:内容创作(question/status/gallery/article 等)。
|
|
8
8
|
license: MIT
|
|
9
9
|
metadata:
|
|
10
10
|
workflow: sequential
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
-
# revise
|
|
13
|
+
# revise 技能(固定 Sprint 冲刺)
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## 执行范式
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
- **MUST**:每步完成立即 todowrite 勾单。
|
|
19
|
-
- **禁止**:使用 WebFetch 或任何网络请求获取内容。
|
|
20
|
-
- **禁止**:写入 output 以外的任何文件;中间产物用临时文件,完成后清理。
|
|
21
|
-
- **禁止**:以任何形式使用未声明字段(url 等不属于 revise 的字段)。
|
|
17
|
+
每次调用 = 一个固定 Sprint,三个事件:
|
|
22
18
|
|
|
23
|
-
|
|
19
|
+
1. **Sprint Planning**:解析入参 → 定义 Sprint Goal → todowrite 落固定 6 项 Sprint Backlog(每项带 DoD)
|
|
20
|
+
2. **Sprint Execution**:逐项执行,每项 = 执行 → 验证 DoD → todowrite 勾单 Done
|
|
21
|
+
3. **Sprint Review**:对照 Sprint Goal 验证 Increment(JSON 数组)及输出语义,沉淀 1 条回顾
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
> 我是否已用 todowrite 落单 6 步?
|
|
27
|
-
> - 未落单 → 立即 todowrite 创建清单。
|
|
28
|
-
> - 已落单 → 继续。
|
|
23
|
+
**Sprint Goal** = `产出 {{count}} 条符合 {{format}} 格式、{{language}} 语言的 JSON 数组,并通过 schema 校验`。
|
|
29
24
|
|
|
30
25
|
## 输入参数
|
|
31
26
|
|
|
32
|
-
|
|
33
|
-
- **JSON 对象**:如 `{format, source, count, language, output}`,直接取字段值;
|
|
34
|
-
- **key=value**:如 `format=question, source=xxx`,按 `,` 和 `=` 拆分为字段;
|
|
35
|
-
- **纯文本 prose**:不做格式推断(同一 source 可有多种 format)。仅当文本命中 `references/format-aliases.json5` 中某 format 的 `terms`(如"问题/文章/图集/动态")时才翻译为该 format 标准值,`source` 取文本本身。
|
|
27
|
+
入参为调用方传入的**原始任务消息**,可为 JSON 对象、key=value 或自然语言等任意形态,agent 依据字段语义自主提取(详见 Item 1)。字段清单(字段/类型/必填/默认值)以 `references/input.schema.json5` 为准:
|
|
36
28
|
|
|
37
|
-
|
|
29
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| `format` | string | ✅ | 创作格式,标准值 `question`/`status`/`gallery`/`article`,可由别名表翻译 |
|
|
32
|
+
| `source` | string | ✅ | 原始素材:文本 / JSON 字符串 / 文件路径 |
|
|
33
|
+
| `count` | integer | ❌ | 生成 item 数量,默认 1 |
|
|
34
|
+
| `language` | string | ❌ | 输出内容语言,默认 中文 |
|
|
35
|
+
| `output` | string | ❌ | 输出文件路径(提供则写文件,否则 stdout) |
|
|
38
36
|
|
|
39
|
-
|
|
37
|
+
本技能仅使用上表五个字段,忽略所有其他字段(如 `url`),不得读取、写入或据此推断任何行为。
|
|
40
38
|
|
|
41
|
-
|
|
42
|
-
- 未提供 `output` 参数:将 JSON 数组直接输出到 stdout,**不写任何文件**。
|
|
43
|
-
- 校验失败未能产出数组:不写文件、不输出数组,将错误信息输出到 stderr 并结束。
|
|
39
|
+
## 固定 Sprint Backlog(todowrite 落单,覆盖历史 todos)
|
|
44
40
|
|
|
45
|
-
|
|
41
|
+
1. 解析入参(从任意形态任务消息自主提取 format/source/count/language/output) | DoD: 得到五个字段值(或按短路规则输出 `[]`/错误并结束)
|
|
42
|
+
2. 加载 references(format prompt 文件 + schema 文件) | DoD: `references/{{format}}.md` 与 `references/{{format}}.schema.json5` 已读取,schema 绝对路径已记录(或 format 无效时输出 `[]`)
|
|
43
|
+
3. 内容生成(LLM 创作) | DoD: 产出含 `{{count}}` 个 item、`{{language}}` 语言的 JSON 数组
|
|
44
|
+
4. Schema 校验 | DoD: `node validate-schema.js` 执行完成,返回通过/失败结果
|
|
45
|
+
5. 校验失败修复重试(≤3 次) | DoD: 重试后校验通过,或重试 3 次耗尽后 stderr 输出错误
|
|
46
|
+
6. 输出(写 output 文件或 stdout) | DoD: 按输出语义交付 JSON 数组(文件路径或 stdout),校验未通过时 stderr 报错
|
|
46
47
|
|
|
47
|
-
|
|
48
|
+
## Sprint Execution
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
按固定 6 项逐项执行,每项周期 = 进度检查(刚完成什么/本项做什么/有无阻塞)→ 执行 → 验证 DoD → 勾单 Done。
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
2. 加载 references(format prompt 文件 + schema 文件)
|
|
53
|
-
3. 内容生成(LLM 创作)
|
|
54
|
-
4. Schema 校验
|
|
55
|
-
5. 校验失败修复重试(≤3 次)
|
|
56
|
-
6. 输出(写 output 文件或 stdout)
|
|
52
|
+
### Item 1:解析入参
|
|
57
53
|
|
|
58
|
-
|
|
54
|
+
将第 1 项标记 in_progress,从原始任务消息中**自主提取**五个字段。入参可为 JSON 对象、key=value 或自然语言等任意形态,依据字段语义理解提取即可,无需固定解析规则。提取原则:
|
|
59
55
|
|
|
60
|
-
|
|
56
|
+
- **格式翻译**:若消息中以自然语言指定创作格式(如"问题/文章/图集/动态"),用 `read` 读取 `references/format-aliases.json5`,将命中的 `terms` 翻译为该 format 标准值;未命中则 `format` 取消息中明确给出的值。
|
|
57
|
+
- **count/language**:缺省时留空,由 Item 3 统一按默认值处理。
|
|
61
58
|
|
|
62
|
-
|
|
59
|
+
解析后得到 `format`、`source`、`count`、`language`、`output` 五个字段(字段说明见上文输入参数表)。
|
|
63
60
|
|
|
64
|
-
|
|
65
|
-
- **key=value**:按 `,` 分割、按 `=` 拆分为键值对,取上述五字段。
|
|
66
|
-
- **纯文本 prose**:用 `read` 读取 `references/format-aliases.json5`,仅当文本命中某 format 的 `terms` 时翻译为该 format 标准值,`source` 取文本本身;未命中则 `format` 视为未提供。
|
|
61
|
+
**短路规则(按顺序执行,命中即结束):**
|
|
67
62
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
- `source`(必填,素材文本或文件路径,原样透传由后续阶段解析)
|
|
71
|
-
- `count`(可选,数值,缺省透传空由阶段 3 按默认 1 处理)
|
|
72
|
-
- `language`(可选,缺省透传空由阶段 3 按默认 中文 处理)
|
|
73
|
-
- `output`(可选,输出文件路径)
|
|
63
|
+
1. **空 source 短路**:若 `source` 为空、null 或仅含空白:直接输出 `[]` 并结束,**禁止**继续执行。
|
|
64
|
+
2. **format 缺失校验**:若 `format` 未提供或经别名表翻译后仍为空:将错误信息输出到 stderr 并结束,**禁止**继续执行。
|
|
74
65
|
|
|
75
|
-
|
|
66
|
+
**验证 DoD**:五个字段值已得到(或按短路规则结束)。通过后标记 Done。
|
|
76
67
|
|
|
77
|
-
|
|
68
|
+
### Item 2:加载 Prompt 和 Schema
|
|
78
69
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
### 阶段 2:加载 Prompt 和 Schema
|
|
82
|
-
|
|
83
|
-
从技能目录的 `references/` 加载对应格式的文件:
|
|
70
|
+
将第 2 项标记 in_progress,从技能目录的 `references/` 加载对应格式的文件:
|
|
84
71
|
|
|
85
72
|
- Prompt 文件:`references/{{ format }}.md` — LLM 创作指令
|
|
86
73
|
- Schema 文件:`references/{{ format }}.schema.json5` — 输出校验规则(JSON Schema)
|
|
87
74
|
|
|
88
|
-
用 `read` 工具读取两个文件内容,并**记录 schema
|
|
75
|
+
用 `read` 工具读取两个文件内容,并**记录 schema 文件的绝对路径**(Item 4 校验时需要)。若对应 references 文件不存在:直接输出 `[]` 并结束(`format` 缺失已在 Item 1 处理)。
|
|
89
76
|
|
|
90
|
-
|
|
77
|
+
**验证 DoD**:两个文件已读取、schema 绝对路径已记录(或 references 文件不存在已短路)。通过后标记 Done。
|
|
91
78
|
|
|
92
|
-
###
|
|
79
|
+
### Item 3:内容生成
|
|
93
80
|
|
|
94
|
-
|
|
81
|
+
将第 3 项标记 in_progress,将 `source` 解析为素材。判断顺序:
|
|
95
82
|
|
|
96
|
-
|
|
83
|
+
1. **文件路径**:`source` 为现有文件路径 → 用 `read` 读取文件内容作为素材;
|
|
84
|
+
2. **JSON 字符串**:素材以 `{` 或 `[` 开头且可整体解析为 JSON → 解析为结构化对象作为素材;
|
|
85
|
+
3. **否则**:素材作为纯文本字符串。
|
|
97
86
|
|
|
98
|
-
`count`
|
|
87
|
+
**禁止用 bash 解析 JSON**,JSON 判断与解析直接依据文本内容理解完成。素材确定后,将素材结合 Prompt 文件内容调用 LLM 生成符合格式的结果。**必须生成 `{{ count }}` 个 item,整体输出为 JSON 数组(即使 count=1)。** 内容语言使用 `{{ language }}`(默认中文)。
|
|
88
|
+
|
|
89
|
+
`count` 缺省、非整数或小于 1 时按 1 处理;`language` 缺省或仅含空白时按 `中文` 处理。
|
|
99
90
|
|
|
100
91
|
生成时向 LLM 传入:
|
|
101
92
|
- 原始素材(完整 source,已解析为可读格式)
|
|
@@ -104,22 +95,22 @@ metadata:
|
|
|
104
95
|
- `{{ language }}`(输出语言)
|
|
105
96
|
- 输出格式说明和示例
|
|
106
97
|
|
|
107
|
-
|
|
98
|
+
**验证 DoD**:已产出含 `{{count}}` 个 item、`{{language}}` 语言的 JSON 数组。通过后标记 Done。
|
|
108
99
|
|
|
109
|
-
###
|
|
100
|
+
### Item 4:Schema 校验
|
|
110
101
|
|
|
111
|
-
|
|
102
|
+
将第 4 项标记 in_progress,用 `write` 工具将待校验的 JSON 数组写入临时文件,再用 `write` 工具将 `{"data": <JSON 数组>, "schema_path": "<schema 绝对路径>"}` 写入 JSON 输入文件,stdin 重定向交给 Node.js 校验:
|
|
112
103
|
|
|
113
104
|
```bash
|
|
114
105
|
node '<技能目录>/references/validate-schema.js' < <临时 JSON 输入文件>
|
|
115
106
|
```
|
|
116
107
|
|
|
117
|
-
-
|
|
118
|
-
-
|
|
108
|
+
- 若校验通过:**验证 DoD**(校验执行完成且返回通过),标记 Done,跳过 Item 5,进入 Item 6
|
|
109
|
+
- 若校验失败:**验证 DoD**(校验执行完成且返回失败),标记 Done,进入 Item 5 进行修复重试(最多 3 次)
|
|
119
110
|
|
|
120
|
-
###
|
|
111
|
+
### Item 5:校验失败时修复重试
|
|
121
112
|
|
|
122
|
-
|
|
113
|
+
将第 5 项标记 in_progress,将错误信息反馈给 LLM,要求其根据原始素材重新生成。
|
|
123
114
|
|
|
124
115
|
传入内容:
|
|
125
116
|
- 原始素材(完整 source)
|
|
@@ -127,33 +118,34 @@ node '<技能目录>/references/validate-schema.js' < <临时 JSON 输入文件>
|
|
|
127
118
|
- 上一轮生成的不合格内容
|
|
128
119
|
- Schema 校验错误详情
|
|
129
120
|
|
|
130
|
-
|
|
121
|
+
重新生成后,再次执行 Item 4 校验。**最多重试 3 次**。
|
|
131
122
|
|
|
132
|
-
|
|
123
|
+
**验证 DoD**:重试后校验通过 → 标记 Done,进入 Item 6;重试 3 次耗尽 → stderr 输出错误并结束(**不进入 Item 6**)。
|
|
133
124
|
|
|
134
|
-
###
|
|
125
|
+
### Item 6:输出
|
|
135
126
|
|
|
136
|
-
|
|
127
|
+
将第 6 项标记 in_progress。进入本项时校验必已通过(重试耗尽场景已在 Item 5 结束):
|
|
137
128
|
|
|
138
|
-
**若校验通过:**
|
|
139
129
|
- 提供 `output` 参数:用 `write` 工具将最终 JSON 数组写入 `output` 指定文件(**禁止创建其他文件**),stdout 输出该文件路径。
|
|
140
130
|
- 未提供 `output` 参数:将最终 JSON 数组直接输出到 stdout,**不写任何文件**。
|
|
141
131
|
|
|
142
|
-
|
|
132
|
+
**验证 DoD**:按输出语义交付(文件路径或 stdout 数组)。通过后标记 Done。
|
|
143
133
|
|
|
144
|
-
##
|
|
134
|
+
## Sprint Review
|
|
145
135
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
-
|
|
149
|
-
-
|
|
136
|
+
所有 Backlog Items 完成后:
|
|
137
|
+
|
|
138
|
+
- **对照 Sprint Goal 验证**:产出的是否为 `{{count}}` 条符合 `{{format}}` 格式、`{{language}}` 语言的 JSON 数组且通过 schema 校验?输出语义是否正确(写文件输出路径 / stdout 输出数组)?
|
|
139
|
+
- **展示 Increment**:输出文件路径或 stdout 的 JSON 数组。
|
|
140
|
+
- **简要回顾(Retrospective)**:沉淀 1 条改进项供下一轮采纳。
|
|
150
141
|
|
|
151
142
|
## 约束
|
|
152
143
|
|
|
153
144
|
- 只处理已声明字段(source/format/count/language/output),忽略所有其他传入参数(如 `url`),**禁止**以任何形式使用它们。
|
|
154
|
-
- **禁止使用 WebFetch
|
|
145
|
+
- **禁止使用 WebFetch 或任何网络请求、禁止访问外部网络**;`source` 为空时必须输出 `[]`,绝不自行获取内容。
|
|
146
|
+
- 写文件一律用 `write` 工具;读文件用 `read` 工具;需要中间数据时写入临时文件,以 stdin 重定向传给 node。
|
|
147
|
+
- 禁止使用未授权的 `cp`/`rm`/`mv` 等命令;需要复制、移动或删除临时文件时,一律用允许的 `node -e` 的 fs 模块完成。
|
|
155
148
|
- 内部重试步骤的中间产物用临时文件,完成后清理,禁止写入 output 以外的任何持久文件。
|
|
156
|
-
- 禁止访问外部网络。
|
|
157
149
|
|
|
158
150
|
## references/ 目录结构
|
|
159
151
|
|
|
@@ -171,4 +163,4 @@ references/
|
|
|
171
163
|
├── article.md # 社交媒体图文文章 prompt
|
|
172
164
|
├── article.schema.json5
|
|
173
165
|
└── ...
|
|
174
|
-
```
|
|
166
|
+
```
|
|
@@ -1,29 +1,25 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 社交媒体图文文章(article)创作 Sprint
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Sprint Goal
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
产出 `{{count}}` 篇适合社交媒体传播的图文文章(抓人标题 + 图文混排正文),整体为 JSON 数组。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 创作原则
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- `count`:生成的文章数量(默认 1,输出为数组)
|
|
11
|
-
- 创作格式要求见下方
|
|
9
|
+
基于原始素材创作,聚焦 format 特有要点:
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
1. **标题要抓人**:有吸引力、有冲突点,读者靠标题决定是否点开
|
|
12
|
+
2. **正文适合快速阅读**:图文混排,段落短、节奏快,文本块与图片块交替出现,建议文本为主、图片辅助,整体 1-20 行
|
|
13
|
+
3. **图片按需提取**:从素材中提取图片地址作为 `{"type": "image"}` 块,最多 5 个图片块;素材无图片时全部用 `{"type": "text"}` 块
|
|
14
|
+
4. **基于素材**:从素材中提炼核心信息,重组为流畅文章,不能凭空编造
|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
## 输出契约
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
每个 item 结构严格符合 schema `references/article.schema.json5`:`title`(10-30 cn_length)、`blocks`(array,1-20 个,每个含 `type`(text/image)+ `content`)。**整体输出为 JSON 数组,含 `{{count}}` 个 item。**
|
|
20
19
|
|
|
21
|
-
1.
|
|
22
|
-
2. **正文适合快速阅读**:图文混排,段落短、节奏快,文本块与图片块交替出现,建议文本为主、图片辅助,整体 1-20 行
|
|
23
|
-
3. **图片按需提取**:从原始素材中提取图片地址作为 `{"type": "image"}` 块,**最多 5 个图片块**;素材无图片时全部用 `{"type": "text"}` 块
|
|
24
|
-
4. **基于素材创作**:从素材中提炼核心信息,重组为流畅文章,不能凭空编造
|
|
20
|
+
> 字数计算采用 **cn_length** 规则:中文字符算 1,非中文字符(英文/数字/符号)算 0.5,结果向上取整。
|
|
25
21
|
|
|
26
|
-
|
|
22
|
+
示例:
|
|
27
23
|
|
|
28
24
|
```json
|
|
29
25
|
[
|
|
@@ -38,7 +34,7 @@
|
|
|
38
34
|
]
|
|
39
35
|
```
|
|
40
36
|
|
|
41
|
-
##
|
|
37
|
+
## 铁律
|
|
42
38
|
|
|
43
39
|
- 仅输出 JSON 数组,不要包含任何解释、思考过程或额外文本
|
|
44
|
-
- 输出始终为数组,包含 count 个 item(默认 1),禁止输出单个对象
|
|
40
|
+
- 输出始终为数组,包含 `{{count}}` 个 item(默认 1),禁止输出单个对象
|
|
@@ -1,29 +1,25 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 社交媒体图集(gallery)创作 Sprint
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Sprint Goal
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
产出 `{{count}}` 个适合社交媒体传播的图集内容(吸睛标题 + 图片列表),整体为 JSON 数组。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 创作原则
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- `count`:生成的图集数量(默认 1,输出为数组)
|
|
11
|
-
- 创作格式要求见下方
|
|
9
|
+
基于原始素材创作,聚焦 format 特有要点:
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
1. **标题要吸引**:点明图集主题,有看点、让人想点开
|
|
12
|
+
2. **每张图配说明**:`images[].title` 简要说明图片内容,有助于读者理解
|
|
13
|
+
3. **图片从素材提取**:从原始素材中提取图片地址,素材中图片不足时可适当精选
|
|
14
|
+
4. **基于素材**:从素材中提炼主题,不能凭空编造
|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
## 输出契约
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
每个 item 结构严格符合 schema `references/gallery.schema.json5`:`title`(10-30 cn_length)、`images`(array,1-50 个,每个含 `url` + `title`(10-30 cn_length))。**整体输出为 JSON 数组,含 `{{count}}` 个 item。**
|
|
20
19
|
|
|
21
|
-
1.
|
|
22
|
-
2. **每张图配说明**:title 简要说明图片内容,有助于读者理解
|
|
23
|
-
3. **图片从素材提取**:从原始素材中提取图片地址,素材中图片不足时可适当精选
|
|
24
|
-
4. **基于素材创作**:从素材中提炼主题,不能凭空编造
|
|
20
|
+
> 字数计算采用 **cn_length** 规则:中文字符算 1,非中文字符(英文/数字/符号)算 0.5,结果向上取整。
|
|
25
21
|
|
|
26
|
-
|
|
22
|
+
示例:
|
|
27
23
|
|
|
28
24
|
```json
|
|
29
25
|
[
|
|
@@ -31,13 +27,13 @@
|
|
|
31
27
|
"title": "三星电子二季度财报亮点图集",
|
|
32
28
|
"images": [
|
|
33
29
|
{"url": "https://example.com/pic1.jpg", "title": "三星第二季度初步财报发布"},
|
|
34
|
-
{"url": "https://example.com/pic2.jpg", "title": "
|
|
30
|
+
{"url": "https://example.com/pic2.jpg", "title": "全球存储芯片供需格局"}
|
|
35
31
|
]
|
|
36
32
|
}
|
|
37
33
|
]
|
|
38
34
|
```
|
|
39
35
|
|
|
40
|
-
##
|
|
36
|
+
## 铁律
|
|
41
37
|
|
|
42
38
|
- 仅输出 JSON 数组,不要包含任何解释、思考过程或额外文本
|
|
43
|
-
- 输出始终为数组,包含 count 个 item(默认 1),禁止输出单个对象
|
|
39
|
+
- 输出始终为数组,包含 `{{count}}` 个 item(默认 1),禁止输出单个对象
|