@wwkit/harness 1.0.27 → 1.0.29
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 +10 -0
- package/package.json +3 -2
- package/skills/extract/SKILL.md +43 -68
- package/skills/extract/references/detail.md +1 -1
- package/skills/extract/references/list.md +3 -3
- package/skills/extract/references/navi.md +1 -1
- package/skills/jstest/SKILL.md +561 -0
- package/skills/jstest/references/case-create.md +327 -0
- package/skills/jstest/references/case-fix.md +273 -0
- package/skills/jstest/references/config.md +148 -0
- package/skills/jstest/references/coverage-analyze.md +247 -0
- package/skills/jstest/references/env-ensure.md +210 -0
- package/skills/jstest/references/execute.md +168 -0
- package/skills/jstest/references/sample.md +166 -0
- package/skills/jstest/references/scoring-rules.md +75 -0
- package/skills/jstest/references/src/jstest-sample/Calculator.js +80 -0
- package/skills/jstest/references/src/jstest-sample/ConfigManager.js +72 -0
- package/skills/jstest/references/src/jstest-sample/FileProcessor.js +57 -0
- package/skills/jstest/references/src/jstest-sample/OrderService.js +98 -0
- package/skills/jstest/references/src/jstest-sample/TokenGenerator.js +60 -0
- package/skills/jstest/references/src/jstest-sample/UserService.js +56 -0
- package/skills/jstest/references/src/jstest-sample/index.js +6 -0
- package/skills/jstest/references/suitability-check.md +232 -0
- package/skills/jstest/references/test-standards.md +288 -0
- package/skills/pytest/SKILL.md +38 -30
- package/skills/query/SKILL.md +16 -47
- package/skills/revise/SKILL.md +52 -96
- package/skills/revise/references/article.md +12 -15
- package/skills/revise/references/gallery.md +11 -15
- package/skills/revise/references/question.md +11 -15
- package/skills/revise/references/status.md +10 -14
- package/src/config.js +29 -0
- package/src/config.json5 +19 -0
- package/skills/extract/references/format-aliases.json5 +0 -22
- package/skills/extract/references/input.schema.json5 +0 -23
- package/skills/query/references/input.schema.json5 +0 -25
- package/skills/revise/references/format-aliases.json5 +0 -22
- package/skills/revise/references/input.schema.json5 +0 -28
package/skills/revise/SKILL.md
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: revise
|
|
3
3
|
description: |
|
|
4
|
-
自包含内容创作 skill
|
|
5
|
-
format=question/status/gallery/article
|
|
6
|
-
调用方直接传原始任务消息,skill 自解析自包含。内部用 todowrite 管理固定 6 项 Sprint Backlog(每项带 DoD)。禁止 WebFetch/网络请求。
|
|
7
|
-
适用:内容创作(question/status/gallery/article 等)。
|
|
4
|
+
自包含内容创作 skill(固定 Sprint 范式):每次调用 = 一个固定 Sprint(Planning→Execution→Review),todowrite 落 3 项带 DoD 的 Sprint Backlog 并逐项验证,产出通过 schema 校验的 JSON 数组。
|
|
5
|
+
format=question/status/gallery/article(支持中文别名指定),count 控制条目数(默认1),language 控制输出语言(默认中文)。调用方直接传原始任务消息即可,无需预处理;禁止 WebFetch/网络请求。
|
|
8
6
|
license: MIT
|
|
9
7
|
metadata:
|
|
10
8
|
workflow: sequential
|
|
@@ -16,136 +14,95 @@ metadata:
|
|
|
16
14
|
|
|
17
15
|
每次调用 = 一个固定 Sprint,三个事件:
|
|
18
16
|
|
|
19
|
-
1. **Sprint Planning**:解析入参 → 定义 Sprint Goal → todowrite 落固定
|
|
17
|
+
1. **Sprint Planning**:解析入参 → 定义 Sprint Goal → todowrite 落固定 3 项 Sprint Backlog(每项带 DoD)
|
|
20
18
|
2. **Sprint Execution**:逐项执行,每项 = 执行 → 验证 DoD → todowrite 勾单 Done
|
|
21
|
-
3. **Sprint Review**:对照 Sprint Goal 验证 Increment(JSON
|
|
19
|
+
3. **Sprint Review**:对照 Sprint Goal 验证 Increment(JSON 数组)及输出语义
|
|
22
20
|
|
|
23
21
|
**Sprint Goal** = `产出 {{count}} 条符合 {{format}} 格式、{{language}} 语言的 JSON 数组,并通过 schema 校验`。
|
|
24
22
|
|
|
25
23
|
## 输入参数
|
|
26
24
|
|
|
27
|
-
入参为调用方传入的**原始任务消息**,可为 JSON 对象、key=value 或自然语言等任意形态,agent
|
|
25
|
+
入参为调用方传入的**原始任务消息**,可为 JSON 对象、key=value 或自然语言等任意形态,agent 依据字段语义自主提取。字段清单(字段/类型/必填/默认值):
|
|
28
26
|
|
|
29
27
|
| 字段 | 类型 | 必填 | 说明 |
|
|
30
28
|
|---|---|---|---|
|
|
31
|
-
| `format` | string | ✅ | 创作格式,标准值 `question`/`status`/`gallery`/`article
|
|
29
|
+
| `format` | string | ✅ | 创作格式,标准值 `question`/`status`/`gallery`/`article`,可用自然语言别名指定(见别名对照) |
|
|
32
30
|
| `source` | string | ✅ | 原始素材:文本 / JSON 字符串 / 文件路径 |
|
|
33
|
-
| `count` | integer | ❌ | 生成 item 数量,默认 1 |
|
|
34
|
-
| `language` | string | ❌ |
|
|
31
|
+
| `count` | integer | ❌ | 生成 item 数量,默认 1(非整数或 <1 按 1) |
|
|
32
|
+
| `language` | string | ❌ | 输出语言,默认 中文(空白按中文) |
|
|
33
|
+
| `style` | string | ❌ | 创作风格描述(自由文本),缺省用 format 默认风格(`<format>.md` 的 Style 模块) |
|
|
35
34
|
| `output` | string | ❌ | 输出文件路径(提供则写文件,否则 stdout) |
|
|
36
35
|
|
|
37
|
-
|
|
36
|
+
本技能仅使用上表六个字段,忽略所有其他字段(如 `url`)。
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
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 报错
|
|
47
|
-
|
|
48
|
-
## Sprint Execution
|
|
49
|
-
|
|
50
|
-
按固定 6 项逐项执行,每项周期 = 进度检查(刚完成什么/本项做什么/有无阻塞)→ 执行 → 验证 DoD → 勾单 Done。
|
|
51
|
-
|
|
52
|
-
### Item 1:解析入参
|
|
53
|
-
|
|
54
|
-
将第 1 项标记 in_progress,从原始任务消息中**自主提取**五个字段。入参可为 JSON 对象、key=value 或自然语言等任意形态,依据字段语义理解提取即可,无需固定解析规则。提取原则:
|
|
55
|
-
|
|
56
|
-
- **格式翻译**:若消息中以自然语言指定创作格式(如"问题/文章/图集/动态"),用 `read` 读取 `references/format-aliases.json5`,将命中的 `terms` 翻译为该 format 标准值;未命中则 `format` 取消息中明确给出的值。
|
|
57
|
-
- **count/language**:缺省时留空,由 Item 3 统一按默认值处理。
|
|
58
|
-
|
|
59
|
-
解析后得到 `format`、`source`、`count`、`language`、`output` 五个字段(字段说明见上文输入参数表)。
|
|
60
|
-
|
|
61
|
-
**短路规则(按顺序执行,命中即结束):**
|
|
38
|
+
**format 别名对照**:
|
|
62
39
|
|
|
63
|
-
|
|
64
|
-
|
|
40
|
+
| format 标准值 | 别名 terms |
|
|
41
|
+
|---|---|
|
|
42
|
+
| `question` | 问题 / 提问 / 互动话题 / 话题 / question |
|
|
43
|
+
| `status` | 动态 / 微博 / 朋友圈 / 状态 / 一句话 / status |
|
|
44
|
+
| `gallery` | 图集 / 相册 / 多图 / 图片合集 / gallery |
|
|
45
|
+
| `article` | 文章 / 图文 / 长文 / 推文 / article |
|
|
65
46
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
### Item 2:加载 Prompt 和 Schema
|
|
47
|
+
## 固定 Sprint Backlog(todowrite 落单,覆盖历史 todos)
|
|
69
48
|
|
|
70
|
-
|
|
49
|
+
1. 解析入参 + 准备素材 + 加载 references | DoD: 六字段已提取、素材已就绪(文件已读)、prompt 与 schema 已读且 schema 绝对路径已记录(或 stderr 报错结束)
|
|
50
|
+
2. 内容生成 + Schema 校验(失败修复重试 ≤3 次) | DoD: 产出含 `{{count}}` 个 item、`{{language}}` 语言的裸 JSON 数组且 `node validate-schema.js` 校验通过(或重试耗尽 stderr 报错)
|
|
51
|
+
3. 输出 | DoD: 按输出语义交付 JSON 数组(文件路径或 stdout)
|
|
71
52
|
|
|
72
|
-
|
|
73
|
-
- Schema 文件:`references/{{ format }}.schema.json5` — 输出校验规则(JSON Schema)
|
|
53
|
+
## Sprint Execution
|
|
74
54
|
|
|
75
|
-
|
|
55
|
+
按固定 3 项逐项执行(勾单机制见执行范式)。
|
|
76
56
|
|
|
77
|
-
|
|
57
|
+
### Item 1:解析入参 + 准备素材 + 加载 references
|
|
78
58
|
|
|
79
|
-
|
|
59
|
+
从原始任务消息中自主提取 `format`/`source`/`count`/`language`/`style`/`output` 六个字段;自然语言格式按「format 别名对照」翻译。`source` 为文件路径时用 `read` 读取其内容作为素材。
|
|
80
60
|
|
|
81
|
-
|
|
61
|
+
**短路规则(命中即结束,禁止继续执行):**
|
|
82
62
|
|
|
83
|
-
1.
|
|
84
|
-
2.
|
|
85
|
-
3. **否则**:素材作为纯文本字符串。
|
|
63
|
+
1. `source` 为空、null 或仅含空白 → 将错误信息输出到 stderr 并结束
|
|
64
|
+
2. `format` 未提供或经别名对照翻译后仍为空 → 将错误信息输出到 stderr 并结束
|
|
86
65
|
|
|
87
|
-
|
|
66
|
+
未短路时**并行读取** `references/{{format}}.md`(LLM 创作指令)与 `references/{{format}}.schema.json5`(输出校验规则),记录 schema 绝对路径(Item 2 校验用);references 文件不存在 → 将错误信息输出到 stderr 并结束。
|
|
88
67
|
|
|
89
|
-
|
|
68
|
+
### Item 2:内容生成 + Schema 校验
|
|
90
69
|
|
|
91
|
-
|
|
92
|
-
- 原始素材(完整 source,已解析为可读格式)
|
|
93
|
-
- Prompt 文件内容(创作指令)
|
|
94
|
-
- `{{ count }}`(生成 item 数量)
|
|
95
|
-
- `{{ language }}`(输出语言)
|
|
96
|
-
- 输出格式说明和示例
|
|
70
|
+
将素材结合 Prompt 文件内容调用 LLM 生成:**必须生成 `{{count}}` 个 item,整体输出为 JSON 数组(即使 count=1)**,内容语言使用 `{{language}}`(缺省按参数表默认值)。生成时向 LLM 传入:原始素材、Prompt 文件内容、`{{count}}`、`{{language}}`、输出格式说明和示例。
|
|
97
71
|
|
|
98
|
-
|
|
72
|
+
**style 覆盖**:若提供 `style`,以 `{{style}}` 取代 `<format>.md` 的 **Style 模块**(默认创作风格);**Format 模块(输出契约)不可变**——结构、schema 字段、长度、图片数量上限、真实性约束均以 Format 模块与 schema 为准。
|
|
99
73
|
|
|
100
|
-
|
|
74
|
+
**裸 JSON 硬约束**:输出必须为裸 JSON 数组——不使用 markdown 代码围栏(```json)、不输出任何解释、思考过程或额外文本、无尾注,直接以 `[` 开始、`]` 结束。
|
|
101
75
|
|
|
102
|
-
|
|
76
|
+
用 `write` 将 `{"data": <JSON 数组>, "schema_path": "<schema 绝对路径>"}` 写入**单个**临时 JSON 输入文件(数组内嵌于 `data`,无需单独写待校验数组文件),stdin 重定向交给 Node.js 校验:
|
|
103
77
|
|
|
104
78
|
```bash
|
|
105
79
|
node '<技能目录>/references/validate-schema.js' < <临时 JSON 输入文件>
|
|
106
80
|
```
|
|
107
81
|
|
|
108
|
-
-
|
|
109
|
-
-
|
|
110
|
-
|
|
111
|
-
### Item 5:校验失败时修复重试
|
|
112
|
-
|
|
113
|
-
将第 5 项标记 in_progress,将错误信息反馈给 LLM,要求其根据原始素材重新生成。
|
|
82
|
+
- 通过 → 进入 Item 3
|
|
83
|
+
- 失败 → 将 Schema 校验错误反馈给 LLM(原始素材 + Prompt 文件内容 + 上一轮不合格内容 + 错误详情)重新生成后再次校验,**最多重试 3 次**;耗尽 → 将最后一次错误及「重试 3 次后 schema 校验仍然失败」输出到 stderr 并结束
|
|
114
84
|
|
|
115
|
-
|
|
116
|
-
- 原始素材(完整 source)
|
|
117
|
-
- Prompt 文件内容
|
|
118
|
-
- 上一轮生成的不合格内容
|
|
119
|
-
- Schema 校验错误详情
|
|
85
|
+
### Item 3:输出
|
|
120
86
|
|
|
121
|
-
|
|
87
|
+
本项执行时校验必已通过:
|
|
122
88
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
### Item 6:输出
|
|
126
|
-
|
|
127
|
-
将第 6 项标记 in_progress。进入本项时校验必已通过(重试耗尽场景已在 Item 5 结束):
|
|
128
|
-
|
|
129
|
-
- 提供 `output` 参数:用 `write` 工具将最终 JSON 数组写入 `output` 指定文件(**禁止创建其他文件**),stdout 输出该文件路径。
|
|
130
|
-
- 未提供 `output` 参数:将最终 JSON 数组直接输出到 stdout,**不写任何文件**。
|
|
131
|
-
|
|
132
|
-
**验证 DoD**:按输出语义交付(文件路径或 stdout 数组)。通过后标记 Done。
|
|
89
|
+
- 提供 `output` → 用 `write` 将最终 JSON 数组写入该文件(**禁止创建其他文件**),stdout 输出文件路径
|
|
90
|
+
- 未提供 `output` → 将最终 JSON 数组直接输出到 stdout,**不写任何文件**
|
|
133
91
|
|
|
134
92
|
## Sprint Review
|
|
135
93
|
|
|
136
|
-
|
|
94
|
+
本 skill 每次调用 = 无状态独立 Sprint,无跨轮次状态,故不进行 Retrospective。所有 Backlog Items 完成后:
|
|
137
95
|
|
|
138
96
|
- **对照 Sprint Goal 验证**:产出的是否为 `{{count}}` 条符合 `{{format}}` 格式、`{{language}}` 语言的 JSON 数组且通过 schema 校验?输出语义是否正确(写文件输出路径 / stdout 输出数组)?
|
|
139
97
|
- **展示 Increment**:输出文件路径或 stdout 的 JSON 数组。
|
|
140
|
-
- **简要回顾(Retrospective)**:沉淀 1 条改进项供下一轮采纳。
|
|
141
98
|
|
|
142
99
|
## 约束
|
|
143
100
|
|
|
144
101
|
- 只处理已声明字段(source/format/count/language/output),忽略所有其他传入参数(如 `url`),**禁止**以任何形式使用它们。
|
|
145
|
-
- **禁止使用 WebFetch 或任何网络请求、禁止访问外部网络**;`source`
|
|
146
|
-
- 写文件一律用 `write` 工具;读文件用 `read`
|
|
147
|
-
- 禁止使用未授权的 `cp`/`rm`/`mv`
|
|
148
|
-
-
|
|
102
|
+
- **禁止使用 WebFetch 或任何网络请求、禁止访问外部网络**;`source`/`format` 不合法时向 stderr 输出错误信息,绝不自行获取内容。
|
|
103
|
+
- 写文件一律用 `write` 工具;读文件用 `read` 工具;中间数据写入临时文件,以 stdin 重定向传给 node。
|
|
104
|
+
- 禁止使用未授权的 `cp`/`rm`/`mv` 等命令;需要复制、移动或删除临时文件时用 `node -e` 的 fs 模块完成。
|
|
105
|
+
- 中间产物完成后清理,禁止写入 output 以外的任何持久文件。
|
|
149
106
|
|
|
150
107
|
## references/ 目录结构
|
|
151
108
|
|
|
@@ -153,14 +110,13 @@ node '<技能目录>/references/validate-schema.js' < <临时 JSON 输入文件>
|
|
|
153
110
|
|
|
154
111
|
```
|
|
155
112
|
references/
|
|
156
|
-
├──
|
|
157
|
-
├── question.
|
|
158
|
-
├──
|
|
159
|
-
├── status.md # 社交媒体动态 prompt
|
|
113
|
+
├── question.md # 社交媒体问题 prompt
|
|
114
|
+
├── question.schema.json5 # 输出 JSON Schema
|
|
115
|
+
├── status.md # 社交媒体动态 prompt
|
|
160
116
|
├── status.schema.json5
|
|
161
|
-
├── gallery.md
|
|
117
|
+
├── gallery.md # 社交媒体图集 prompt
|
|
162
118
|
├── gallery.schema.json5
|
|
163
|
-
├── article.md
|
|
119
|
+
├── article.md # 社交媒体图文文章 prompt
|
|
164
120
|
├── article.schema.json5
|
|
165
|
-
└──
|
|
166
|
-
```
|
|
121
|
+
└── validate-schema.js # schema 校验脚本(stdin 输入)
|
|
122
|
+
```
|
|
@@ -2,20 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
## Sprint Goal
|
|
4
4
|
|
|
5
|
-
产出 `{{count}}`
|
|
5
|
+
产出 `{{count}}` 篇适合社交媒体传播的图文文章,整体为 JSON 数组。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Style(默认创作风格,可由 `style` 参数覆盖)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
基于原始素材创作:
|
|
10
10
|
|
|
11
|
-
1.
|
|
12
|
-
2.
|
|
13
|
-
3. **图片按需提取**:从素材中提取图片地址作为 `{"type": "image"}` 块,最多 5 个图片块;素材无图片时全部用 `{"type": "text"}` 块
|
|
14
|
-
4. **基于素材**:从素材中提炼核心信息,重组为流畅文章,不能凭空编造
|
|
11
|
+
1. **标题抓人**:有吸引力、有冲突点,读者靠标题决定是否点开
|
|
12
|
+
2. **节奏快**:段落短、节奏快,适合快速阅读
|
|
15
13
|
|
|
16
|
-
##
|
|
14
|
+
## Format(输出契约,不可被 `style` 覆盖)
|
|
17
15
|
|
|
18
|
-
|
|
16
|
+
- **结构**:每 item = `title`(10-30 cn_length)+ `blocks`(array,1-20 个,每个含 `type`(text/image)+ `content`)
|
|
17
|
+
- **图文混排**:文本块与图片块交替出现,建议文本为主、图片辅助
|
|
18
|
+
- **图片**:从素材中提取图片地址作为 `{"type": "image"}` 块,最多 5 个图片块;素材无图片时全部用 `{"type": "text"}` 块
|
|
19
|
+
- **真实性**:从素材中提炼核心信息,重组为流畅文章,不能凭空编造
|
|
20
|
+
- **输出形式**:整体为 JSON 数组,含 `{{count}}` 个 item;仅输出数组,不包含任何解释、思考过程或额外文本,禁止输出单个对象
|
|
19
21
|
|
|
20
22
|
> 字数计算采用 **cn_length** 规则:中文字符算 1,非中文字符(英文/数字/符号)算 0.5,结果向上取整。
|
|
21
23
|
|
|
@@ -32,9 +34,4 @@
|
|
|
32
34
|
]
|
|
33
35
|
}
|
|
34
36
|
]
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## 铁律
|
|
38
|
-
|
|
39
|
-
- 仅输出 JSON 数组,不要包含任何解释、思考过程或额外文本
|
|
40
|
-
- 输出始终为数组,包含 `{{count}}` 个 item(默认 1),禁止输出单个对象
|
|
37
|
+
```
|
|
@@ -2,20 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
## Sprint Goal
|
|
4
4
|
|
|
5
|
-
产出 `{{count}}`
|
|
5
|
+
产出 `{{count}}` 个适合社交媒体传播的图集内容,整体为 JSON 数组。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Style(默认创作风格,可由 `style` 参数覆盖)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
基于原始素材创作:
|
|
10
10
|
|
|
11
|
-
1.
|
|
12
|
-
2. **每张图配说明**:`images[].title` 简要说明图片内容,有助于读者理解
|
|
13
|
-
3. **图片从素材提取**:从原始素材中提取图片地址,素材中图片不足时可适当精选
|
|
14
|
-
4. **基于素材**:从素材中提炼主题,不能凭空编造
|
|
11
|
+
1. **标题吸引**:点明图集主题,有看点、让人想点开
|
|
15
12
|
|
|
16
|
-
##
|
|
13
|
+
## Format(输出契约,不可被 `style` 覆盖)
|
|
17
14
|
|
|
18
|
-
|
|
15
|
+
- **结构**:每 item = `title`(10-30 cn_length)+ `images`(array,1-50 个,每个含 `url` + `title`(10-30 cn_length))
|
|
16
|
+
- **配说明**:每张图必须带 `title` 简要说明图片内容——schema 必填,不可省略
|
|
17
|
+
- **图片来源**:从原始素材中提取图片地址,素材中图片不足时可适当精选
|
|
18
|
+
- **真实性**:从素材中提炼主题,不能凭空编造
|
|
19
|
+
- **输出形式**:整体为 JSON 数组,含 `{{count}}` 个 item;仅输出数组,不包含任何解释、思考过程或额外文本,禁止输出单个对象
|
|
19
20
|
|
|
20
21
|
> 字数计算采用 **cn_length** 规则:中文字符算 1,非中文字符(英文/数字/符号)算 0.5,结果向上取整。
|
|
21
22
|
|
|
@@ -31,9 +32,4 @@
|
|
|
31
32
|
]
|
|
32
33
|
}
|
|
33
34
|
]
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## 铁律
|
|
37
|
-
|
|
38
|
-
- 仅输出 JSON 数组,不要包含任何解释、思考过程或额外文本
|
|
39
|
-
- 输出始终为数组,包含 `{{count}}` 个 item(默认 1),禁止输出单个对象
|
|
35
|
+
```
|
|
@@ -2,20 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
## Sprint Goal
|
|
4
4
|
|
|
5
|
-
产出 `{{count}}`
|
|
5
|
+
产出 `{{count}}` 条适合社交媒体传播的问题内容,整体为 JSON 数组。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Style(默认创作风格,可由 `style` 参数覆盖)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
基于原始素材创作:
|
|
10
10
|
|
|
11
|
-
1.
|
|
12
|
-
2.
|
|
13
|
-
3. **图片按需提取**:从素材中提取图片地址,最多 5 张;素材无图片时为空数组
|
|
14
|
-
4. **基于素材**:从素材中提取核心矛盾点,不能凭空编造
|
|
11
|
+
1. **标题尖锐**:有争议性、冲突点,能激发讨论欲和互动
|
|
12
|
+
2. **描述简洁**:说明背景,引出矛盾点,不要太长
|
|
15
13
|
|
|
16
|
-
##
|
|
14
|
+
## Format(输出契约,不可被 `style` 覆盖)
|
|
17
15
|
|
|
18
|
-
|
|
16
|
+
- **结构**:每 item = `title`(10-30 cn_length)+ `content`(20-500 cn_length)+ `images`(string[],≤5 张)
|
|
17
|
+
- **图片**:从素材提取图片地址,最多 5 张;素材无图片时为空数组
|
|
18
|
+
- **真实性**:从素材中提取核心矛盾点,不能凭空编造
|
|
19
|
+
- **输出形式**:整体为 JSON 数组,含 `{{count}}` 个 item;仅输出数组,不包含任何解释、思考过程或额外文本,禁止输出单个对象
|
|
19
20
|
|
|
20
21
|
> 字数计算采用 **cn_length** 规则:中文字符算 1,非中文字符(英文/数字/符号)算 0.5,结果向上取整。
|
|
21
22
|
|
|
@@ -29,9 +30,4 @@
|
|
|
29
30
|
"images": ["https://example.com/pic1.jpg"]
|
|
30
31
|
}
|
|
31
32
|
]
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## 铁律
|
|
35
|
-
|
|
36
|
-
- 仅输出 JSON 数组,不要包含任何解释、思考过程或额外文本
|
|
37
|
-
- 输出始终为数组,包含 `{{count}}` 个 item(默认 1),禁止输出单个对象
|
|
33
|
+
```
|
|
@@ -2,20 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
## Sprint Goal
|
|
4
4
|
|
|
5
|
-
产出 `{{count}}`
|
|
5
|
+
产出 `{{count}}` 条适合社交媒体传播的动态内容,整体为 JSON 数组。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Style(默认创作风格,可由 `style` 参数覆盖)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
基于原始素材创作:
|
|
10
10
|
|
|
11
|
-
1.
|
|
11
|
+
1. **正文精炼**:短平快,提炼核心信息,避免大段照抄原文
|
|
12
12
|
2. **有观点、易互动**:口语化表达,带个人观点或情绪,能引发讨论和转发
|
|
13
|
-
3. **图片按需提取**:从素材中提取图片地址,最多 5 张;素材无图片时为空数组
|
|
14
|
-
4. **基于素材**:从素材中提炼要点,不能凭空编造
|
|
15
13
|
|
|
16
|
-
##
|
|
14
|
+
## Format(输出契约,不可被 `style` 覆盖)
|
|
17
15
|
|
|
18
|
-
|
|
16
|
+
- **结构**:每 item = `content`(20-500 cn_length)+ `images`(string[],≤5 张)
|
|
17
|
+
- **图片**:从素材中提取图片地址,最多 5 张;素材无图片时为空数组
|
|
18
|
+
- **真实性**:从素材中提炼要点,不能凭空编造
|
|
19
|
+
- **输出形式**:整体为 JSON 数组,含 `{{count}}` 个 item;仅输出数组,不包含任何解释、思考过程或额外文本,禁止输出单个对象
|
|
19
20
|
|
|
20
21
|
> 字数计算采用 **cn_length** 规则:中文字符算 1,非中文字符(英文/数字/符号)算 0.5,结果向上取整。
|
|
21
22
|
|
|
@@ -28,9 +29,4 @@
|
|
|
28
29
|
"images": ["https://example.com/pic1.jpg"]
|
|
29
30
|
}
|
|
30
31
|
]
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## 铁律
|
|
34
|
-
|
|
35
|
-
- 仅输出 JSON 数组,不要包含任何解释、思考过程或额外文本
|
|
36
|
-
- 输出始终为数组,包含 `{{count}}` 个 item(默认 1),禁止输出单个对象
|
|
32
|
+
```
|
package/src/config.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// src/config.js — harness 配置加载(只读参考 + 初始化检测)
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { createConfigLoader, getXdgConfigDir } from '@wwkit/shared'
|
|
5
|
+
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
7
|
+
|
|
8
|
+
const _loader = createConfigLoader({
|
|
9
|
+
builtinConfigPath: path.join(__dirname, 'config.json5'),
|
|
10
|
+
userConfigDir: getXdgConfigDir('harness'),
|
|
11
|
+
envContentVar: 'HARNESS_CONFIG_CONTENT',
|
|
12
|
+
envDirVar: 'HARNESS_CONFIG_DIR',
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 获取用户配置文件路径
|
|
17
|
+
* @returns {string}
|
|
18
|
+
*/
|
|
19
|
+
export function getConfigPath() {
|
|
20
|
+
return _loader.userConfigPath
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 合并内置配置到用户配置文件(追加缺失 key,不覆盖已有值)
|
|
25
|
+
* @returns {boolean} 是否写入了文件
|
|
26
|
+
*/
|
|
27
|
+
export function mergeBuiltinConfig() {
|
|
28
|
+
return _loader.mergeBuiltinConfig()
|
|
29
|
+
}
|
package/src/config.json5
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// config.json5 — harness 内置配置(只读参考)
|
|
2
|
+
//
|
|
3
|
+
// 此文件为只读配置,由 postinstall 或首次运行时复制到
|
|
4
|
+
// ~/.config/harness/config.json5(或 $XDG_CONFIG_HOME/harness/config.json5)。
|
|
5
|
+
// 实际运行配置通过环境变量生效,此文件主要用于:
|
|
6
|
+
// 1. 配置初始化检测(existsSync 判断是否需要复制)
|
|
7
|
+
// 2. 文档参考(记录 harness 依赖的环境变量)
|
|
8
|
+
//
|
|
9
|
+
// 修改此文件不会影响运行时行为,请通过 shell profile 直接管理环境变量。
|
|
10
|
+
|
|
11
|
+
{
|
|
12
|
+
// 环境变量声明(只读 — 由 postinstall 通过 Shell.setEnvVar 自动设置)
|
|
13
|
+
env: {
|
|
14
|
+
// harness 包安装目录(agents/skills/commands 所在路径)
|
|
15
|
+
OPENCODE_CONFIG_DIR: "",
|
|
16
|
+
// 启用 opencode 实验性 LSP 工具
|
|
17
|
+
OPENCODE_EXPERIMENTAL_LSP_TOOL: "true",
|
|
18
|
+
},
|
|
19
|
+
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// format 别名映射表:供 agent 将用户的自然语言描述翻译为 format 标准值。
|
|
3
|
-
// 用户可能用中文/口语而非英文标识,按以下 terms 命中匹配。
|
|
4
|
-
"aliases": {
|
|
5
|
-
"list": {
|
|
6
|
-
"description": "列表提取:从列表页提取多条目(HTML 或结构化 JSON 两种来源)",
|
|
7
|
-
"terms": ["列表", "多条", "集合", "条目", "list"]
|
|
8
|
-
},
|
|
9
|
-
"detail": {
|
|
10
|
-
"description": "详情提取:单条详情/正文内容",
|
|
11
|
-
"terms": ["详情", "正文", "单条", "内容页", "detail"]
|
|
12
|
-
},
|
|
13
|
-
"text": {
|
|
14
|
-
"description": "纯文本提取:HTML 转纯文本",
|
|
15
|
-
"terms": ["纯文本", "文字", "文本", "转文本", "text"]
|
|
16
|
-
},
|
|
17
|
-
"navi": {
|
|
18
|
-
"description": "导航提取:生成栏目/链接导航的 XPath",
|
|
19
|
-
"terms": ["导航", "栏目", "链接导航", "navi"]
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// extract 技能入参字段清单(纯文档用途,供 agent 解析入参时参照,不做运行时校验)。
|
|
3
|
-
"title": "extract 技能入参字段清单",
|
|
4
|
-
"type": "object",
|
|
5
|
-
"properties": {
|
|
6
|
-
"source": {
|
|
7
|
-
"type": "string",
|
|
8
|
-
"description": "网页 HTML/文本内容,或本地文件路径",
|
|
9
|
-
"required": true
|
|
10
|
-
},
|
|
11
|
-
"format": {
|
|
12
|
-
"type": "string",
|
|
13
|
-
"description": "提取类型。标准值为 list/detail/text/navi 之一",
|
|
14
|
-
"enum": ["list", "detail", "text", "navi"],
|
|
15
|
-
"required": true
|
|
16
|
-
},
|
|
17
|
-
"url": {
|
|
18
|
-
"type": "string",
|
|
19
|
-
"description": "页面 URL;source 为相对路径时基于它转为绝对路径",
|
|
20
|
-
"required": false
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// query 技能入参字段清单(纯文档用途,供 agent 解析入参时参照,不做运行时校验)。
|
|
3
|
-
"title": "query 技能入参字段清单",
|
|
4
|
-
"type": "object",
|
|
5
|
-
"properties": {
|
|
6
|
-
"prompt": {
|
|
7
|
-
"type": "string",
|
|
8
|
-
"description": "任务要求,包含输出格式说明",
|
|
9
|
-
"required": true
|
|
10
|
-
},
|
|
11
|
-
"source": {
|
|
12
|
-
"type": "string",
|
|
13
|
-
"description": "原始素材:普通文本或本地文件路径"
|
|
14
|
-
},
|
|
15
|
-
"language": {
|
|
16
|
-
"type": "string",
|
|
17
|
-
"description": "输出内容语言,默认 中文",
|
|
18
|
-
"default": "中文"
|
|
19
|
-
},
|
|
20
|
-
"output": {
|
|
21
|
-
"type": "string",
|
|
22
|
-
"description": "输出文件路径,未提供时输出到 stdout"
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// format 别名映射表:供 agent 将用户的自然语言描述翻译为 format 标准值。
|
|
3
|
-
// 用户可能用中文/口语而非英文标识,按以下 terms 命中匹配。
|
|
4
|
-
"aliases": {
|
|
5
|
-
"question": {
|
|
6
|
-
"description": "社交媒体风格问题:尖锐标题 + 简洁描述,激发讨论/互动",
|
|
7
|
-
"terms": ["问题", "提问", "互动话题", "话题", "question"]
|
|
8
|
-
},
|
|
9
|
-
"status": {
|
|
10
|
-
"description": "简短社交动态:微博/朋友圈式的一句话或短文字",
|
|
11
|
-
"terms": ["动态", "微博", "朋友圈", "状态", "一句话", "status"]
|
|
12
|
-
},
|
|
13
|
-
"gallery": {
|
|
14
|
-
"description": "多图图集:以图片为主的多图形式",
|
|
15
|
-
"terms": ["图集", "相册", "多图", "图片合集", "gallery"]
|
|
16
|
-
},
|
|
17
|
-
"article": {
|
|
18
|
-
"description": "图文文章:较长的图文长文",
|
|
19
|
-
"terms": ["文章", "图文", "长文", "推文", "article"]
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// revise 技能入参字段清单(纯文档用途,供 agent 解析入参时参照,不做运行时校验)。
|
|
3
|
-
"title": "revise 技能入参字段清单",
|
|
4
|
-
"type": "object",
|
|
5
|
-
"properties": {
|
|
6
|
-
"source": {
|
|
7
|
-
"type": "string",
|
|
8
|
-
"description": "原始素材:普通文本或 JSON 字符串,或本地文件路径",
|
|
9
|
-
"required": true
|
|
10
|
-
},
|
|
11
|
-
"format": {
|
|
12
|
-
"type": "string",
|
|
13
|
-
"description": "创作格式。标准值为 question/status/gallery/article 之一",
|
|
14
|
-
"enum": ["question", "status", "gallery", "article"],
|
|
15
|
-
"required": true
|
|
16
|
-
},
|
|
17
|
-
"count": {
|
|
18
|
-
"type": "integer",
|
|
19
|
-
"description": "生成的 item 数量,默认 1",
|
|
20
|
-
"default": 1
|
|
21
|
-
},
|
|
22
|
-
"language": {
|
|
23
|
-
"type": "string",
|
|
24
|
-
"description": "输出内容语言,默认 中文",
|
|
25
|
-
"default": "中文"
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|