@cyning/harness 2.11.0 → 2.11.1
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/CHANGELOG.md +13 -0
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/ONBOARDING.md +4 -0
- package/docs/USER_GUIDE_v1.0_zh.md +12 -12
- package/docs/methodology/graph/HARNESS_GRAPH_MODEL_design_v0_zh.md +4 -2
- package/docs/methodology/graph/README.md +6 -4
- package/package.json +1 -1
- package/wizard/lib/common.sh +17 -0
- package/wizard/lib/manifest.sh +34 -0
- package/wizard/upgrade.sh +10 -10
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,18 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [2.11.1] - 2026-07-25
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **F1 · `upgrade` 自绊 S5(ops-desk-web dogfood)**:`local.json` 改为 **sync apply 成功后** 写入(compare-before-write)。避免 npx 缓存路径变化时先脏工作区再被 git-clean 中止。
|
|
12
|
+
- **F2 · manifest 静默丢字段**:`write_manifest_upgrade` 重写前对 schema 外字段与 `ide` 裁剪打 **WARN** 清单(知情);**仍不**合并保留(`additionalProperties: false`)。
|
|
13
|
+
|
|
14
|
+
### Notes
|
|
15
|
+
|
|
16
|
+
- 摩擦报告:`Projects/docs/harness/guides/ANALYSIS_upgrade_wizard_friction_20260725_v1_zh.md`
|
|
17
|
+
- patch · 2.3+ manifest 仅五字段:`version` / `preset` / `ide` / `from_version` / `upgraded_at`(`name` / `tech_graph_dir` / `tasks_dir` / `hooks` 等已废弃)
|
|
18
|
+
|
|
7
19
|
## [2.11.0] - 2026-07-25
|
|
8
20
|
|
|
9
21
|
### Added
|
|
@@ -19,6 +31,7 @@
|
|
|
19
31
|
- SPEC:`docs/spec/SPEC-lifecycle-guard-expand_v1.md` · `docs/spec/SPEC-discipline-show_v1.md`
|
|
20
32
|
- minor · `lifecycle show` / verify 硬闸语义不变
|
|
21
33
|
- `discipline-coverage.yaml` `as_of_package_version` → **2.11.0**
|
|
34
|
+
- **已发布**:`@cyning/harness@2.11.0`(npm `latest` · 2026-07-25)· tag `v2.11.0` 已推送
|
|
22
35
|
|
|
23
36
|
## [2.10.0] - 2026-07-25
|
|
24
37
|
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -68,5 +68,5 @@ CLI/Worker 与模板 **同一仓库** 演进,避免多仓割裂。
|
|
|
68
68
|
Track / Hat / Sync / SDD 公理与扩展规则见 [`methodology/product/DESIGN_ONTOLOGY_v1_zh.md`](./methodology/product/DESIGN_ONTOLOGY_v1_zh.md)(**v1.3**)。
|
|
69
69
|
**帽链流程(人读)**:[`methodology/product/SDD_HAT_FLOW_v2_zh.md`](./methodology/product/SDD_HAT_FLOW_v2_zh.md)
|
|
70
70
|
**方法论总指引**:[`methodology/README.md`](./methodology/README.md) · 关系图 [`methodology/DOCUMENT_MAP_v1_zh.md`](./methodology/DOCUMENT_MAP_v1_zh.md)
|
|
71
|
-
远期 **过程实例图 + 事件历史** 见 [`methodology/graph/HARNESS_GRAPH_MODEL_design_v0_zh.md`](./methodology/graph/HARNESS_GRAPH_MODEL_design_v0_zh.md)
|
|
71
|
+
远期 **过程实例图 + 事件历史** 见 [`methodology/graph/HARNESS_GRAPH_MODEL_design_v0_zh.md`](./methodology/graph/HARNESS_GRAPH_MODEL_design_v0_zh.md)(**PIP(过程实例投影)** · **v2.0+** · v1.0 后)。
|
|
72
72
|
与 **战略本体**(工作区 `docs/harness/guides/STRATEGY_ONTOLOGY_*`)分层:本文件描述 **产品如何实现**,战略文档描述 **对外演进**。
|
package/docs/ONBOARDING.md
CHANGED
|
@@ -26,6 +26,10 @@ npx @cyning/harness check # 仅检查是否有新版本
|
|
|
26
26
|
写入 `.cyning-harness/manifest.json`(钉版本 · preset · ide)与 `profile.json`。
|
|
27
27
|
Schema:[`schema/manifest.v1.schema.json`](../schema/manifest.v1.schema.json)
|
|
28
28
|
|
|
29
|
+
**manifest(2.3+)仅五字段**:`version` / `preset` / `ide` / `from_version` / `upgraded_at`(`additionalProperties: false`)。
|
|
30
|
+
旧字段 `name` / `harness_version` / `tech_graph_dir` / `tasks_dir` / `hooks` 已废弃且无消费方;`upgrade` 会整体重写并(v2.11.1+)对将被移除的字段打 WARN,**不会**合并保留。
|
|
31
|
+
`upgrade` 的 `local.json` 簿记在 sync apply **成功之后**写入(v2.11.1+),避免自绊 S5 git-clean。
|
|
32
|
+
|
|
29
33
|
**维护者 / 离线 · clone 路径:**
|
|
30
34
|
|
|
31
35
|
```bash
|
|
@@ -185,7 +185,7 @@ Schema:[`schema/verify_result.v1.schema.json`](../schema/verify_result.v1.sche
|
|
|
185
185
|
| 命令 | 用途 |
|
|
186
186
|
| --- | --- |
|
|
187
187
|
| `npx @cyning/harness init` | 首次安装模板与 manifest(可选 `--with-scripts`) |
|
|
188
|
-
| `npx @cyning/harness upgrade` | 同步产品包更新(可加 `--gate-check`
|
|
188
|
+
| `npx @cyning/harness upgrade` | 同步产品包更新(可加 `--gate-check`);v2.11.1+:`local.json` 在 apply 后写入;manifest 重写前 WARN 非标准字段(2.3+ 仅五字段) |
|
|
189
189
|
| `npx @cyning/harness check` | 检查是否有新版本 |
|
|
190
190
|
| `npx @cyning/harness verify` | 全量:双路径 + reviews(v2.9+);`--task`:30 前聚合;`--spec`:SPEC→00(v2.8+ · 互斥) |
|
|
191
191
|
| `npx @cyning/harness lifecycle show` | 只读展示 `harness/lifecycle.yaml`(登记 · v2.7+) |
|
|
@@ -284,9 +284,9 @@ npm run harness -- check --target /tmp/foo
|
|
|
284
284
|
| --- | --- | --- | --- |
|
|
285
285
|
| **MD 人类轨** | `docs/_tech_graph/*.md` | 代码审阅、README 引用、Mermaid 渲染 | v1.0+ |
|
|
286
286
|
| **YAML 编辑源** | `docs/_tech_graph/*.graph.yaml` | 结构化编辑、diff、CI 校验 | **v1.1+** |
|
|
287
|
-
| **
|
|
287
|
+
| **PIP(过程实例投影)过程轨** | `.cyning-harness/events/*.jsonl` | Task / Gate / Review 实例与事件史 | **v2.0+** |
|
|
288
288
|
|
|
289
|
-
**原则**:YAML 为 Inform 编辑源,
|
|
289
|
+
**原则**:YAML 为 Inform 编辑源,PIP(过程实例投影)为过程事件图;YAML **不替代** task/review 真值,PIP(过程实例投影)**不替代** YAML/MD Inform 正文。
|
|
290
290
|
|
|
291
291
|
### 10.2 最小工作流
|
|
292
292
|
|
|
@@ -327,9 +327,9 @@ npx @cyning/harness graph yaml check --all --input docs/_tech_graph
|
|
|
327
327
|
| bench `100` | [SDD-Compliance](../examples/compliance_bench/README.md) 五场景合规率 · 见上文 §6.1 |
|
|
328
328
|
| Extended 帽 | 00/50/链式 PROMPT 不在 Starter 默认包 · 见 [`harness/prompts/README.md`](../harness/prompts/README.md) |
|
|
329
329
|
| Inform-YAML | **v1.1+** · 可选编辑源 · 须 `graph yaml check` 与 `graph.json` 一致 |
|
|
330
|
-
|
|
|
330
|
+
| PIP(过程实例投影)/ 图数据库 | **v2.0+ 已实现** `graph ingest|snapshot|axioms` · 本地 JSONL + snapshot;Neo4j / 远端同步 **仍提案** |
|
|
331
331
|
| Agent-shell | 研究轨 #9,非 npm 功能 |
|
|
332
|
-
| rejected→draft | **v2.0.1+** bench S5 +
|
|
332
|
+
| rejected→draft | **v2.0.1+** bench S5 + PIP(过程实例投影)axioms 事件流精确匹配 |
|
|
333
333
|
|
|
334
334
|
---
|
|
335
335
|
|
|
@@ -350,21 +350,21 @@ A:不会(S2 域)。若 prompts 模板有更新,apply 会更新 **模板
|
|
|
350
350
|
**Q:如何编辑 Inform 架构图?**
|
|
351
351
|
A:v1.1+ 可选 `docs/_tech_graph/*.graph.yaml` 作为编辑源,运行 `npx @cyning/harness graph yaml compile|check` 生成 MD / 校验 graph.json。
|
|
352
352
|
|
|
353
|
-
**Q:
|
|
354
|
-
A:Inform-YAML 是 **架构图谱** 的编辑源;
|
|
353
|
+
**Q:PIP(过程实例投影)与 Inform-YAML 是什么关系?**
|
|
354
|
+
A:Inform-YAML 是 **架构图谱** 的编辑源;PIP(过程实例投影,v2.0+)是 **过程协作** 的事件图。二者并列,PIP(过程实例投影)通过 `InformArtifact` 节点引用 Inform 产物,但不覆盖其正文。
|
|
355
355
|
|
|
356
356
|
**Q:如何贡献或报 issue?**
|
|
357
357
|
A:GitHub [Cyning12/cyning-harness](https://github.com/Cyning12/cyning-harness) · MIT。
|
|
358
358
|
|
|
359
359
|
---
|
|
360
360
|
|
|
361
|
-
## 13.
|
|
361
|
+
## 13. PIP(过程实例投影)过程轨(v2.0+)
|
|
362
362
|
|
|
363
|
-
|
|
363
|
+
PIP(过程实例投影;Process Instance Projection)把 task、gate、review、invoke、sync 等过程实例变成 **append-only 事件流** 与 **可重放图快照**,用于机械检查 SDD 公理。
|
|
364
364
|
|
|
365
365
|
### 13.1 事件文件
|
|
366
366
|
|
|
367
|
-
|
|
367
|
+
PIP(过程实例投影) 事件写入 `.cyning-harness/events/YYYY-MM.jsonl`,修正 = 追加 `CorrectionEvent`,**禁止删改历史**。
|
|
368
368
|
|
|
369
369
|
### 13.2 CLI
|
|
370
370
|
|
|
@@ -397,7 +397,7 @@ chmod +x .git/hooks/pre-commit
|
|
|
397
397
|
|
|
398
398
|
- `InformArtifact` 节点 ID:`inform:{repo_rel_path}`
|
|
399
399
|
- Task → InformArtifact 边:`MUST_READ`
|
|
400
|
-
-
|
|
400
|
+
- PIP(过程实例投影)**不存储** Inform 正文,只存路径指针与 schema 版本
|
|
401
401
|
|
|
402
402
|
### 13.5 局限
|
|
403
403
|
|
|
@@ -432,4 +432,4 @@ chmod +x .git/hooks/pre-commit
|
|
|
432
432
|
| 2026-06-16 | v1.0.1:verify / gate-check / sync index CLI · `--with-scripts` · QUICKREF |
|
|
433
433
|
| 2026-06-17 | v1.1.0:新增 §10 Inform-YAML · `graph yaml compile|check` · 三轨边界说明 |
|
|
434
434
|
| 2026-06-17 | v2.0.1:D4-a axioms · rejected→draft 精确化 · S5 bench · optional pre-commit hook |
|
|
435
|
-
| 2026-06-17 | v2.0.0:新增 §13
|
|
435
|
+
| 2026-06-17 | v2.0.0:新增 §13 PIP(过程实例投影)过程轨 · `graph ingest|snapshot|axioms` · InformArtifact 与 MUST_READ 边 |
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# PIP(过程实例投影;Process Instance Projection)· 设计草案 v0
|
|
2
|
+
|
|
3
|
+
> 文件名历史:`HARNESS_GRAPH_MODEL_*`(路径兼容)。
|
|
2
4
|
|
|
3
5
|
|
|
4
6
|
| 项 | 内容 |
|
|
@@ -20,7 +22,7 @@
|
|
|
20
22
|
### 0.1 一句话
|
|
21
23
|
|
|
22
24
|
```text
|
|
23
|
-
|
|
25
|
+
PIP(过程实例投影)
|
|
24
26
|
= OOP 的结构化对象(本体 Class 的实例)
|
|
25
27
|
+ 显式带类型的边(ObjectProperty · HatRef · 基数)
|
|
26
28
|
+ 不可变事件历史(append-only · 可重放投影)
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
# graph ·
|
|
1
|
+
# graph · PIP(过程实例投影;Process Instance Projection)
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **对外名**:PIP(过程实例投影)。对内历史文件名可含 `HGM` / `hgm_*`(路径兼容,正文不用曾称括注)。
|
|
4
|
+
|
|
5
|
+
> **Track G · G1 / v2.0+**:PIP(过程实例投影)为 **v1.0 公理稳定后的可选增强**(proposal · 未实现)· 详见 [`../ROADMAP_v1_zh.md`](../ROADMAP_v1_zh.md) §2.0 · §2.2。
|
|
4
6
|
|
|
5
7
|
| 文档 | 状态 | 说明 |
|
|
6
8
|
| --- | --- | --- |
|
|
@@ -10,7 +12,7 @@
|
|
|
10
12
|
| [`HARNESS_GRAPH_MODEL_dialogue_archive_v1_zh.md`](./HARNESS_GRAPH_MODEL_dialogue_archive_v1_zh.md) | archive | 对话参考 · **非真值** |
|
|
11
13
|
|
|
12
14
|
```text
|
|
13
|
-
|
|
15
|
+
PIP(过程实例投影) = 结构化对象 + 显式带类型的边 + 不可变事件历史 + 可推理的公理
|
|
14
16
|
```
|
|
15
17
|
|
|
16
18
|
**勿混淆**:
|
|
@@ -19,6 +21,6 @@ HGM = 结构化对象 + 显式带类型的边 + 不可变事件历史 + 可推
|
|
|
19
21
|
| --- | --- |
|
|
20
22
|
| **GraphTrack** | `docs/_tech_graph/` · Inform 架构地图 |
|
|
21
23
|
| **gate-check --graph** | Inform 模块依赖图(Q3 · v1.0) |
|
|
22
|
-
| **
|
|
24
|
+
| **PIP(过程实例投影)** | Process 实例图 · Task / Gate / Review 时序 |
|
|
23
25
|
|
|
24
26
|
**依赖**:[`../product/DESIGN_ONTOLOGY_v1_zh.md`](../product/DESIGN_ONTOLOGY_v1_zh.md) v1.2
|
package/package.json
CHANGED
package/wizard/lib/common.sh
CHANGED
|
@@ -198,6 +198,23 @@ profile_ide_cursor_rel() {
|
|
|
198
198
|
echo "$rel"
|
|
199
199
|
}
|
|
200
200
|
|
|
201
|
+
# 写入 .cyning-harness/local.json(compare-before-write · 内容不变则跳过)
|
|
202
|
+
# 供 upgrade post-apply 簿记;避免在 sync apply 前改已跟踪文件触发 S5
|
|
203
|
+
write_local_json_if_changed() {
|
|
204
|
+
local target="$1" root="$2"
|
|
205
|
+
local dir="$target/.cyning-harness"
|
|
206
|
+
local path="$dir/local.json"
|
|
207
|
+
local payload
|
|
208
|
+
payload="$(printf '%s\n' "{\"cyning_harness_root\":\"$root\"}")"
|
|
209
|
+
mkdir -p "$dir"
|
|
210
|
+
if [[ -f "$path" ]] && [[ "$(cat "$path")" == "$payload" ]]; then
|
|
211
|
+
echo "local.json 未变(跳过写入)→ cyning_harness_root=$root"
|
|
212
|
+
return 0
|
|
213
|
+
fi
|
|
214
|
+
printf '%s\n' "$payload" > "$path"
|
|
215
|
+
echo "已更新 local.json → cyning_harness_root=$root"
|
|
216
|
+
}
|
|
217
|
+
|
|
201
218
|
# 从 CLAUDE.md / AGENTS.md 剥离 Harness marker 块;若仅剩空文件则删除
|
|
202
219
|
# S5 · sync/apply 前检测 Git 工作区干净(v0.3+)
|
|
203
220
|
# 非 git 仓跳过;--force 或 HARNESS_SYNC_FORCE=1 跳过
|
package/wizard/lib/manifest.sh
CHANGED
|
@@ -77,6 +77,38 @@ EOF
|
|
|
77
77
|
echo "已写入 manifest: $mf"
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
# upgrade 重写前:对 schema 外字段 / ide 裁剪打 warning(知情而非静默)
|
|
81
|
+
# 标准五字段:version / preset / ide / from_version / upgraded_at(additionalProperties: false)
|
|
82
|
+
warn_manifest_upgrade_drops() {
|
|
83
|
+
local mf="$1" new_ide_json="$2"
|
|
84
|
+
[[ -f "$mf" ]] || return 0
|
|
85
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
86
|
+
echo "WARN: 未找到 node,跳过 manifest 字段变更预检" >&2
|
|
87
|
+
return 0
|
|
88
|
+
fi
|
|
89
|
+
node -e '
|
|
90
|
+
const fs = require("fs");
|
|
91
|
+
const mf = process.argv[1];
|
|
92
|
+
const newIde = JSON.parse(process.argv[2]);
|
|
93
|
+
const schema = new Set(["version", "preset", "ide", "from_version", "upgraded_at"]);
|
|
94
|
+
let old;
|
|
95
|
+
try { old = JSON.parse(fs.readFileSync(mf, "utf8")); } catch { process.exit(0); }
|
|
96
|
+
const extra = Object.keys(old).filter((k) => !schema.has(k));
|
|
97
|
+
if (extra.length) {
|
|
98
|
+
console.log(
|
|
99
|
+
"WARN: manifest 以下非标准字段将被移除(2.3+ 仅五字段 · 见 ONBOARDING): " +
|
|
100
|
+
extra.join(", "),
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
const oldIde = old.ide;
|
|
104
|
+
const oldS = JSON.stringify(oldIde ?? null);
|
|
105
|
+
const newS = JSON.stringify(newIde);
|
|
106
|
+
if (oldS !== newS) {
|
|
107
|
+
console.log("WARN: manifest.ide 将从 profile 重算: " + oldS + " → " + newS);
|
|
108
|
+
}
|
|
109
|
+
' "$mf" "$new_ide_json"
|
|
110
|
+
}
|
|
111
|
+
|
|
80
112
|
# upgrade apply 后更新 manifest
|
|
81
113
|
write_manifest_upgrade() {
|
|
82
114
|
local target="$1" version="$2"
|
|
@@ -96,6 +128,8 @@ write_manifest_upgrade() {
|
|
|
96
128
|
preset="$(grep '"preset"' "$mf" | head -1 | sed -E 's/.*:[[:space:]]*"([^"]+)".*/\1/' || echo "$preset")"
|
|
97
129
|
fi
|
|
98
130
|
|
|
131
|
+
warn_manifest_upgrade_drops "$mf" "$ide_json"
|
|
132
|
+
|
|
99
133
|
mkdir -p "$target/.cyning-harness"
|
|
100
134
|
cat > "$mf" <<EOF
|
|
101
135
|
{
|
package/wizard/upgrade.sh
CHANGED
|
@@ -101,10 +101,8 @@ echo "preset: $(profile_preset_name "$PROFILE_FILE")"
|
|
|
101
101
|
echo "当前 IDE: $(profile_ide_summary "$PROFILE_FILE")"
|
|
102
102
|
echo ""
|
|
103
103
|
|
|
104
|
-
#
|
|
105
|
-
|
|
106
|
-
echo "已更新 local.json → cyning_harness_root=$CYNING_HARNESS"
|
|
107
|
-
echo ""
|
|
104
|
+
# 注意:local.json / manifest 簿记放在 sync apply **成功之后**(F1)。
|
|
105
|
+
# 勿在 apply 前改已跟踪的 .cyning-harness/local.json,否则 S5 git-clean 自绊。
|
|
108
106
|
|
|
109
107
|
if [[ -z "$IDE_LIST" ]] && [[ "$ASSUME_YES" -eq 0 ]]; then
|
|
110
108
|
if prompt_yes_no "是否更新 IDE 勾选(cursor / claude / agents)?" "n"; then
|
|
@@ -140,14 +138,16 @@ if [[ "$DO_APPLY" -eq 1 ]]; then
|
|
|
140
138
|
SYNC_ARGS=(apply --target "$TARGET")
|
|
141
139
|
[[ "$SYNC_FORCE" -eq 1 ]] && SYNC_ARGS+=(--force)
|
|
142
140
|
"$SCRIPT_DIR/harness-sync.sh" "${SYNC_ARGS[@]}"
|
|
141
|
+
# post-sync 簿记:apply 失败则不落(set -e 已中止)
|
|
142
|
+
write_local_json_if_changed "$TARGET" "$CYNING_HARNESS"
|
|
143
143
|
write_manifest_upgrade "$TARGET" "$VERSION"
|
|
144
144
|
cp "$CYNING_HARNESS/harness/templates/QUICKREF_v1_zh.md" "$TARGET/.cyning-harness/QUICKREF.md"
|
|
145
|
-
echo ""
|
|
146
|
-
echo "升级完成。"
|
|
147
|
-
echo "常用命令:"
|
|
148
|
-
echo " npx @cyning/harness verify --target $TARGET"
|
|
149
|
-
echo " npx @cyning/harness gate-check --target $TARGET"
|
|
150
|
-
echo " npx @cyning/harness upgrade --target $TARGET --yes"
|
|
145
|
+
echo ""
|
|
146
|
+
echo "升级完成。"
|
|
147
|
+
echo "常用命令:"
|
|
148
|
+
echo " npx @cyning/harness verify --target $TARGET"
|
|
149
|
+
echo " npx @cyning/harness gate-check --target $TARGET"
|
|
150
|
+
echo " npx @cyning/harness upgrade --target $TARGET --yes"
|
|
151
151
|
else
|
|
152
152
|
echo "已取消 apply(仅预览)。"
|
|
153
153
|
exit 0
|