@hunter-harness/workflow-harness 0.4.12 → 0.4.13
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/harness/bundles/general/claude-code/.harness-build.json +1 -1
- package/harness/bundles/general/claude-code/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-execute/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-pull/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/scripts/harness_knowledge_candidates.py +58 -12
- package/harness/bundles/general/claude-code/scripts/harness_review.py +16 -2
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-execute/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-pull/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/scripts/harness_knowledge_candidates.py +58 -12
- package/harness/bundles/general/codebuddy/scripts/harness_review.py +16 -2
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- package/harness/bundles/general/codex/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-execute/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-pull/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codex/scripts/harness_knowledge_candidates.py +58 -12
- package/harness/bundles/general/codex/scripts/harness_review.py +16 -2
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- package/harness/bundles/general/cursor/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-execute/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-pull/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/cursor/scripts/harness_knowledge_candidates.py +58 -12
- package/harness/bundles/general/cursor/scripts/harness_review.py +16 -2
- package/harness/bundles/general/pi/.harness-build.json +1 -1
- package/harness/bundles/general/pi/harness-archive/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-execute/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-pull/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-push/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-submit/SKILL.md +1 -1
- package/harness/bundles/general/pi/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/pi/scripts/harness_knowledge_candidates.py +58 -12
- package/harness/bundles/general/pi/scripts/harness_review.py +16 -2
- package/harness/bundles/java/claude-code/.harness-build.json +1 -1
- package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-execute/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-pull/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/scripts/harness_knowledge_candidates.py +58 -12
- package/harness/bundles/java/claude-code/scripts/harness_review.py +16 -2
- package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-execute/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-pull/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/scripts/harness_knowledge_candidates.py +58 -12
- package/harness/bundles/java/codebuddy/scripts/harness_review.py +16 -2
- package/harness/bundles/java/codex/.harness-build.json +1 -1
- package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-execute/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-pull/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codex/scripts/harness_knowledge_candidates.py +58 -12
- package/harness/bundles/java/codex/scripts/harness_review.py +16 -2
- package/harness/bundles/java/cursor/.harness-build.json +1 -1
- package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-execute/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-pull/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/cursor/scripts/harness_knowledge_candidates.py +58 -12
- package/harness/bundles/java/cursor/scripts/harness_review.py +16 -2
- package/harness/bundles/java/pi/.harness-build.json +1 -1
- package/harness/bundles/java/pi/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-archive/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-execute/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-pull/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-push/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-submit/SKILL.md +1 -1
- package/harness/bundles/java/pi/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/pi/scripts/harness_knowledge_candidates.py +58 -12
- package/harness/bundles/java/pi/scripts/harness_review.py +16 -2
- package/harness/manifests/general/claude-code.json +14 -14
- package/harness/manifests/general/codebuddy.json +14 -14
- package/harness/manifests/general/codex.json +14 -14
- package/harness/manifests/general/cursor.json +14 -14
- package/harness/manifests/general/pi.json +14 -14
- package/harness/manifests/java/claude-code.json +16 -16
- package/harness/manifests/java/codebuddy.json +16 -16
- package/harness/manifests/java/codex.json +16 -16
- package/harness/manifests/java/cursor.json +16 -16
- package/harness/manifests/java/pi.json +16 -16
- package/hunter-workflow-family.json +2 -2
- package/package.json +1 -1
|
@@ -21,7 +21,7 @@ disallowed-tools:
|
|
|
21
21
|
- Bash(awk *)
|
|
22
22
|
- Bash(curl *)
|
|
23
23
|
---
|
|
24
|
-
<!-- generated by harness_deploy.py; core=
|
|
24
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=claude-code; do not edit -->
|
|
25
25
|
# harness-archive — 变更归档
|
|
26
26
|
|
|
27
27
|
## Purpose
|
|
@@ -20,7 +20,7 @@ disallowed-tools:
|
|
|
20
20
|
- Bash(awk *)
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
---
|
|
23
|
-
<!-- generated by harness_deploy.py; core=
|
|
23
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=claude-code; do not edit -->
|
|
24
24
|
# harness-codebase-map — 代码库地图
|
|
25
25
|
|
|
26
26
|
## Purpose
|
|
@@ -23,7 +23,7 @@ disallowed-tools:
|
|
|
23
23
|
- Bash(node *)
|
|
24
24
|
- Bash(codegraph *)
|
|
25
25
|
---
|
|
26
|
-
<!-- generated by harness_deploy.py; core=
|
|
26
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=claude-code; do not edit -->
|
|
27
27
|
# harness-execute — 执行(编码 + 验证)
|
|
28
28
|
|
|
29
29
|
> 2026-08 阶段合并:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段;
|
|
@@ -8,7 +8,7 @@ disallowed-tools:
|
|
|
8
8
|
- Bash(git *)
|
|
9
9
|
- Bash(curl *)
|
|
10
10
|
---
|
|
11
|
-
<!-- generated by harness_deploy.py; core=
|
|
11
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=claude-code; do not edit -->
|
|
12
12
|
# harness-knowledge-ingest
|
|
13
13
|
|
|
14
14
|
知识 ingest 完全由 Hunter Platform 负责。归档完成时,客户端生成一个确定性 ZIP;
|
|
@@ -8,7 +8,7 @@ disallowed-tools:
|
|
|
8
8
|
- Bash(git *)
|
|
9
9
|
- Bash(curl *)
|
|
10
10
|
---
|
|
11
|
-
<!-- generated by harness_deploy.py; core=
|
|
11
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=claude-code; do not edit -->
|
|
12
12
|
# harness-knowledge-query
|
|
13
13
|
|
|
14
14
|
项目知识以 Hunter Platform 的服务端索引为唯一真源。客户端只提交查询并消费结果:
|
|
@@ -21,7 +21,7 @@ disallowed-tools:
|
|
|
21
21
|
- Bash(awk *)
|
|
22
22
|
- Bash(curl *)
|
|
23
23
|
---
|
|
24
|
-
<!-- generated by harness_deploy.py; core=
|
|
24
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=claude-code; do not edit -->
|
|
25
25
|
# harness-plan — 需求规划
|
|
26
26
|
|
|
27
27
|
## Purpose
|
|
@@ -21,7 +21,7 @@ disallowed-tools:
|
|
|
21
21
|
- Bash(awk *)
|
|
22
22
|
- Bash(curl *)
|
|
23
23
|
---
|
|
24
|
-
<!-- generated by harness_deploy.py; core=
|
|
24
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=claude-code; do not edit -->
|
|
25
25
|
# harness-pull — 从 Hunter Platform 下拉与恢复
|
|
26
26
|
|
|
27
27
|
## Purpose
|
|
@@ -21,7 +21,7 @@ disallowed-tools:
|
|
|
21
21
|
- Bash(awk *)
|
|
22
22
|
- Bash(curl *)
|
|
23
23
|
---
|
|
24
|
-
<!-- generated by harness_deploy.py; core=
|
|
24
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=claude-code; do not edit -->
|
|
25
25
|
# harness-push — 上传到 Hunter Platform
|
|
26
26
|
|
|
27
27
|
## Purpose
|
|
@@ -22,7 +22,7 @@ disallowed-tools:
|
|
|
22
22
|
- Bash(curl *)
|
|
23
23
|
- Bash(codegraph *)
|
|
24
24
|
---
|
|
25
|
-
<!-- generated by harness_deploy.py; core=
|
|
25
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=claude-code; do not edit -->
|
|
26
26
|
# harness-review — 代码审查
|
|
27
27
|
|
|
28
28
|
## Purpose
|
|
@@ -21,7 +21,7 @@ disallowed-tools:
|
|
|
21
21
|
- Bash(awk *)
|
|
22
22
|
- Bash(curl *)
|
|
23
23
|
---
|
|
24
|
-
<!-- generated by harness_deploy.py; core=
|
|
24
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=claude-code; do not edit -->
|
|
25
25
|
# harness-submit — 最终提交(含 worktree 合并)
|
|
26
26
|
|
|
27
27
|
## Purpose
|
|
@@ -19,7 +19,7 @@ disallowed-tools:
|
|
|
19
19
|
- Bash(awk *)
|
|
20
20
|
- Bash(curl *)
|
|
21
21
|
---
|
|
22
|
-
<!-- generated by harness_deploy.py; core=
|
|
22
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=claude-code; do not edit -->
|
|
23
23
|
# harness-sync
|
|
24
24
|
|
|
25
25
|
## Purpose
|
|
@@ -30,6 +30,8 @@ from __future__ import annotations
|
|
|
30
30
|
|
|
31
31
|
import hashlib
|
|
32
32
|
import json
|
|
33
|
+
import re
|
|
34
|
+
import sys
|
|
33
35
|
from typing import Any
|
|
34
36
|
|
|
35
37
|
SCHEMA_VERSION = 1
|
|
@@ -44,6 +46,44 @@ _DISPOSITION_ENTRY_TYPES = {
|
|
|
44
46
|
"DEFERRED": "risk",
|
|
45
47
|
}
|
|
46
48
|
_SEVERITY_CONFIDENCE = {"RED": 0.95, "YELLOW": 0.85}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _valid_source_path(path: Any) -> str | None:
|
|
52
|
+
"""source_ref 的结构校验(与服务端 ARCHIVE_CANDIDATE_SOURCE_UNBOUND 同规则)。
|
|
53
|
+
|
|
54
|
+
合法形态:`relative/path/to/file.ext`(调用方再附 `#L<line>`)。
|
|
55
|
+
拒绝:目录引用(尾部斜杠)、空路径段、`.`/`..` 段、绝对路径、盘符、
|
|
56
|
+
反斜杠。返回规范化路径;不合法返回 None——调用方必须跳过该候选,
|
|
57
|
+
不得生成「目录 + 行号」的伪来源(2026-08-31 demo-datasource 实测:
|
|
58
|
+
`quality/#L1` 一条不合法 ref 挡掉整份 42 条候选的包)。
|
|
59
|
+
"""
|
|
60
|
+
if not isinstance(path, str):
|
|
61
|
+
return None
|
|
62
|
+
raw = path.strip()
|
|
63
|
+
if not raw:
|
|
64
|
+
return None
|
|
65
|
+
if "\\" in raw: # 反斜杠路径不合法(服务端拒绝,不做静默转换)
|
|
66
|
+
return None
|
|
67
|
+
if raw.startswith("/") or re.match(r"^[A-Za-z]:", raw):
|
|
68
|
+
return None
|
|
69
|
+
if raw.endswith("/"): # 目录引用——尾部斜杠形成空路径段
|
|
70
|
+
return None
|
|
71
|
+
segments = raw.split("/")
|
|
72
|
+
if any(segment in ("", ".", "..") for segment in segments):
|
|
73
|
+
return None
|
|
74
|
+
return raw
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _bound_source_refs(path: Any, line: Any, archive_id: str) -> list[str] | None:
|
|
78
|
+
"""构造可绑定文件来源;path 缺失时回退 archive 级来源,非法时返回 None。"""
|
|
79
|
+
if not path or not isinstance(path, str) or not path.strip():
|
|
80
|
+
return [f"archive:{archive_id}"]
|
|
81
|
+
valid = _valid_source_path(path)
|
|
82
|
+
if valid is None:
|
|
83
|
+
return None
|
|
84
|
+
if isinstance(line, int) and line > 0:
|
|
85
|
+
return [f"{valid}#L{line}"]
|
|
86
|
+
return [valid]
|
|
47
87
|
_KNOWN_RISK_CONFIDENCE = 0.85
|
|
48
88
|
|
|
49
89
|
# decisions[](来自 change 的 evidence/decisions.json,经 summary.decisions 传入)
|
|
@@ -141,12 +181,16 @@ def _finding_candidate(
|
|
|
141
181
|
disposition,
|
|
142
182
|
)
|
|
143
183
|
source_ref = f"archive:{archive_id}#{finding_id}" if finding_id else f"archive:{archive_id}"
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
184
|
+
source_refs = _bound_source_refs(path, line, archive_id)
|
|
185
|
+
if source_refs is None:
|
|
186
|
+
# 目录/非法路径——跳过整条候选,不生成伪来源(服务端会拒绝整包);
|
|
187
|
+
# 跳过必须可见,否则「少了一条候选」无从追溯
|
|
188
|
+
print(
|
|
189
|
+
"[harness-knowledge-candidates] 跳过候选:source_refs 非法"
|
|
190
|
+
f"(path={path!r},finding={finding_id or title!r})",
|
|
191
|
+
file=sys.stderr,
|
|
192
|
+
)
|
|
193
|
+
return None
|
|
150
194
|
|
|
151
195
|
return {
|
|
152
196
|
"schema_version": SCHEMA_VERSION,
|
|
@@ -266,12 +310,14 @@ def _decision_candidate(
|
|
|
266
310
|
segments[-2] if len(segments) >= 2 else "",
|
|
267
311
|
entry_type,
|
|
268
312
|
)
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
313
|
+
source_refs = _bound_source_refs(path, line, archive_id)
|
|
314
|
+
if source_refs is None:
|
|
315
|
+
print(
|
|
316
|
+
"[harness-knowledge-candidates] 跳过候选:source_refs 非法"
|
|
317
|
+
f"(path={path!r})",
|
|
318
|
+
file=sys.stderr,
|
|
319
|
+
)
|
|
320
|
+
return None
|
|
275
321
|
|
|
276
322
|
return {
|
|
277
323
|
"schema_version": SCHEMA_VERSION,
|
|
@@ -176,10 +176,24 @@ def write_findings(change_dir: Path, doc: dict[str, Any]) -> dict[str, Any]:
|
|
|
176
176
|
"changeName": doc.get("changeName") or Path(change_dir).name,
|
|
177
177
|
"findings": assigned,
|
|
178
178
|
}
|
|
179
|
+
# 目录路径的 finding 下游产不出可绑定的知识候选(source_refs 会拒整包),
|
|
180
|
+
# 写入时提前可见——demo-datasource 的 quality/#L1 就是这么漏出去的
|
|
181
|
+
directory_paths = [
|
|
182
|
+
str(f.get("path"))
|
|
183
|
+
for f in assigned
|
|
184
|
+
if isinstance(f.get("path"), str) and f["path"].rstrip().endswith("/")
|
|
185
|
+
]
|
|
179
186
|
out = findings_path(change_dir)
|
|
180
187
|
_write_json_atomic(out, payload)
|
|
181
|
-
|
|
182
|
-
|
|
188
|
+
result = {"ok": True, "code": "FINDINGS_WRITTEN", "path": str(out),
|
|
189
|
+
"count": len(assigned)}
|
|
190
|
+
if directory_paths:
|
|
191
|
+
result["warnings"] = [
|
|
192
|
+
"以下 finding 的 path 是目录而非文件,知识候选生成时会整条跳过"
|
|
193
|
+
"(source_refs 无法绑定文件):" + "; ".join(directory_paths) +
|
|
194
|
+
"。请改为具体文件路径后重新写入"
|
|
195
|
+
]
|
|
196
|
+
return result
|
|
183
197
|
|
|
184
198
|
|
|
185
199
|
def _load_findings(change_dir: Path) -> dict[str, Any] | None:
|
|
@@ -3,7 +3,7 @@ name: harness-archive
|
|
|
3
3
|
description: 归档所有变更产出(计划/测试报告/审查/SQL/API文档)到 .harness/archive/,含归档元数据。仅当用户显式调用
|
|
4
4
|
/harness-archive 时使用;不得被其他阶段 skill 自动接续触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-archive — 变更归档
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -3,7 +3,7 @@ name: harness-codebase-map
|
|
|
3
3
|
description: 分析现有代码库并生成 .harness/codebase/map/
|
|
4
4
|
下的结构化代码库地图。用于陌生项目理解、重大改造前梳理、harness-sync 提示 map 过期后的人工刷新。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-codebase-map — 代码库地图
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -4,7 +4,7 @@ description: 执行阶段:按变更簇执行 TDD
|
|
|
4
4
|
编码循环(RED→GREEN→REFACTOR→编译验证),随后完成单元/接口/数据兼容验证并输出测试报告。仅当用户显式调用
|
|
5
5
|
/harness-execute 时使用;不得因用户提到编码/实现/测试就自动触发,也不得被其他阶段 skill 自动接续。
|
|
6
6
|
---
|
|
7
|
-
<!-- generated by harness_deploy.py; core=
|
|
7
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=codebuddy; do not edit -->
|
|
8
8
|
# harness-execute — 执行(编码 + 验证)
|
|
9
9
|
|
|
10
10
|
> 2026-08 阶段合并:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-knowledge-ingest
|
|
3
3
|
description: 确认归档 ZIP 已上传并由 Hunter Platform 在服务端解包、校验和入库。客户端不再构建或维护本地知识索引。
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=codebuddy; do not edit -->
|
|
6
6
|
# harness-knowledge-ingest
|
|
7
7
|
|
|
8
8
|
知识 ingest 完全由 Hunter Platform 负责。归档完成时,客户端生成一个确定性 ZIP;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-knowledge-query
|
|
3
3
|
description: 在规划、实现或排查前,通过 hunter-harness CLI 查询远端项目知识库。远端不可用时直接报告不可用,不建立本地索引或离线回退。
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=codebuddy; do not edit -->
|
|
6
6
|
# harness-knowledge-query
|
|
7
7
|
|
|
8
8
|
项目知识以 Hunter Platform 的服务端索引为唯一真源。客户端只提交查询并消费结果:
|
|
@@ -3,7 +3,7 @@ name: harness-plan
|
|
|
3
3
|
description: 将需求转化为设计文档+实施计划+完整测试场景表,必须在编码前完成。仅当用户显式调用 /harness-plan 或明确要求进入
|
|
4
4
|
Harness 规划阶段时使用;不得因用户描述需求就自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-plan — 需求规划
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -3,7 +3,7 @@ name: harness-pull
|
|
|
3
3
|
description: 从 Hunter Platform 下拉配置/规则/架构/指令(及显式来源分支的分支文件恢复)。仅当用户显式调用
|
|
4
4
|
/harness-pull 或明确说'从平台拉取/恢复'时使用;不得自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-pull — 从 Hunter Platform 下拉与恢复
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -3,7 +3,7 @@ name: harness-push
|
|
|
3
3
|
description: 上传本地配置/规则/架构/指令(及显式归档)到 Hunter Platform。仅当用户显式调用 /harness-push
|
|
4
4
|
或明确说'上传到平台'时使用;不得因存在本地修改就自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-push — 上传到 Hunter Platform
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -4,7 +4,7 @@ description: 6维度代码审查(架构/安全/规范/兼容/测试/性能)
|
|
|
4
4
|
.harness/context-index.json)和测试场景表,在隔离上下文运行。仅当用户显式调用 /harness-review 时使用;不得在
|
|
5
5
|
test 结束后自动接续执行。
|
|
6
6
|
---
|
|
7
|
-
<!-- generated by harness_deploy.py; core=
|
|
7
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=codebuddy; do not edit -->
|
|
8
8
|
# harness-review — 代码审查
|
|
9
9
|
|
|
10
10
|
## Purpose
|
|
@@ -3,7 +3,7 @@ name: harness-submit
|
|
|
3
3
|
description: 最终提交封装:验证→中文 commit→提交/推送;worktree 模式含 --no-ff 合并回主分支。仅当用户显式调用
|
|
4
4
|
/harness-submit(或 /harness-merge 重入合并段)时使用;用户口头说'提交/commit/push'时必须先确认,不得自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=codebuddy; do not edit -->
|
|
7
7
|
# harness-submit — 最终提交(含 worktree 合并)
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -4,7 +4,7 @@ description: Use when the user asks to synchronize, refresh, or validate Harness
|
|
|
4
4
|
metadata, adapters, remote knowledge ownership, instruction entrypoints,
|
|
5
5
|
config origins, or CodeGraph status.
|
|
6
6
|
---
|
|
7
|
-
<!-- generated by harness_deploy.py; core=
|
|
7
|
+
<!-- generated by harness_deploy.py; core=dbe8841e3e01b1c7; overlay=none; agent=codebuddy; do not edit -->
|
|
8
8
|
# harness-sync
|
|
9
9
|
|
|
10
10
|
## Purpose
|
|
@@ -30,6 +30,8 @@ from __future__ import annotations
|
|
|
30
30
|
|
|
31
31
|
import hashlib
|
|
32
32
|
import json
|
|
33
|
+
import re
|
|
34
|
+
import sys
|
|
33
35
|
from typing import Any
|
|
34
36
|
|
|
35
37
|
SCHEMA_VERSION = 1
|
|
@@ -44,6 +46,44 @@ _DISPOSITION_ENTRY_TYPES = {
|
|
|
44
46
|
"DEFERRED": "risk",
|
|
45
47
|
}
|
|
46
48
|
_SEVERITY_CONFIDENCE = {"RED": 0.95, "YELLOW": 0.85}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _valid_source_path(path: Any) -> str | None:
|
|
52
|
+
"""source_ref 的结构校验(与服务端 ARCHIVE_CANDIDATE_SOURCE_UNBOUND 同规则)。
|
|
53
|
+
|
|
54
|
+
合法形态:`relative/path/to/file.ext`(调用方再附 `#L<line>`)。
|
|
55
|
+
拒绝:目录引用(尾部斜杠)、空路径段、`.`/`..` 段、绝对路径、盘符、
|
|
56
|
+
反斜杠。返回规范化路径;不合法返回 None——调用方必须跳过该候选,
|
|
57
|
+
不得生成「目录 + 行号」的伪来源(2026-08-31 demo-datasource 实测:
|
|
58
|
+
`quality/#L1` 一条不合法 ref 挡掉整份 42 条候选的包)。
|
|
59
|
+
"""
|
|
60
|
+
if not isinstance(path, str):
|
|
61
|
+
return None
|
|
62
|
+
raw = path.strip()
|
|
63
|
+
if not raw:
|
|
64
|
+
return None
|
|
65
|
+
if "\\" in raw: # 反斜杠路径不合法(服务端拒绝,不做静默转换)
|
|
66
|
+
return None
|
|
67
|
+
if raw.startswith("/") or re.match(r"^[A-Za-z]:", raw):
|
|
68
|
+
return None
|
|
69
|
+
if raw.endswith("/"): # 目录引用——尾部斜杠形成空路径段
|
|
70
|
+
return None
|
|
71
|
+
segments = raw.split("/")
|
|
72
|
+
if any(segment in ("", ".", "..") for segment in segments):
|
|
73
|
+
return None
|
|
74
|
+
return raw
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _bound_source_refs(path: Any, line: Any, archive_id: str) -> list[str] | None:
|
|
78
|
+
"""构造可绑定文件来源;path 缺失时回退 archive 级来源,非法时返回 None。"""
|
|
79
|
+
if not path or not isinstance(path, str) or not path.strip():
|
|
80
|
+
return [f"archive:{archive_id}"]
|
|
81
|
+
valid = _valid_source_path(path)
|
|
82
|
+
if valid is None:
|
|
83
|
+
return None
|
|
84
|
+
if isinstance(line, int) and line > 0:
|
|
85
|
+
return [f"{valid}#L{line}"]
|
|
86
|
+
return [valid]
|
|
47
87
|
_KNOWN_RISK_CONFIDENCE = 0.85
|
|
48
88
|
|
|
49
89
|
# decisions[](来自 change 的 evidence/decisions.json,经 summary.decisions 传入)
|
|
@@ -141,12 +181,16 @@ def _finding_candidate(
|
|
|
141
181
|
disposition,
|
|
142
182
|
)
|
|
143
183
|
source_ref = f"archive:{archive_id}#{finding_id}" if finding_id else f"archive:{archive_id}"
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
184
|
+
source_refs = _bound_source_refs(path, line, archive_id)
|
|
185
|
+
if source_refs is None:
|
|
186
|
+
# 目录/非法路径——跳过整条候选,不生成伪来源(服务端会拒绝整包);
|
|
187
|
+
# 跳过必须可见,否则「少了一条候选」无从追溯
|
|
188
|
+
print(
|
|
189
|
+
"[harness-knowledge-candidates] 跳过候选:source_refs 非法"
|
|
190
|
+
f"(path={path!r},finding={finding_id or title!r})",
|
|
191
|
+
file=sys.stderr,
|
|
192
|
+
)
|
|
193
|
+
return None
|
|
150
194
|
|
|
151
195
|
return {
|
|
152
196
|
"schema_version": SCHEMA_VERSION,
|
|
@@ -266,12 +310,14 @@ def _decision_candidate(
|
|
|
266
310
|
segments[-2] if len(segments) >= 2 else "",
|
|
267
311
|
entry_type,
|
|
268
312
|
)
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
313
|
+
source_refs = _bound_source_refs(path, line, archive_id)
|
|
314
|
+
if source_refs is None:
|
|
315
|
+
print(
|
|
316
|
+
"[harness-knowledge-candidates] 跳过候选:source_refs 非法"
|
|
317
|
+
f"(path={path!r})",
|
|
318
|
+
file=sys.stderr,
|
|
319
|
+
)
|
|
320
|
+
return None
|
|
275
321
|
|
|
276
322
|
return {
|
|
277
323
|
"schema_version": SCHEMA_VERSION,
|
|
@@ -176,10 +176,24 @@ def write_findings(change_dir: Path, doc: dict[str, Any]) -> dict[str, Any]:
|
|
|
176
176
|
"changeName": doc.get("changeName") or Path(change_dir).name,
|
|
177
177
|
"findings": assigned,
|
|
178
178
|
}
|
|
179
|
+
# 目录路径的 finding 下游产不出可绑定的知识候选(source_refs 会拒整包),
|
|
180
|
+
# 写入时提前可见——demo-datasource 的 quality/#L1 就是这么漏出去的
|
|
181
|
+
directory_paths = [
|
|
182
|
+
str(f.get("path"))
|
|
183
|
+
for f in assigned
|
|
184
|
+
if isinstance(f.get("path"), str) and f["path"].rstrip().endswith("/")
|
|
185
|
+
]
|
|
179
186
|
out = findings_path(change_dir)
|
|
180
187
|
_write_json_atomic(out, payload)
|
|
181
|
-
|
|
182
|
-
|
|
188
|
+
result = {"ok": True, "code": "FINDINGS_WRITTEN", "path": str(out),
|
|
189
|
+
"count": len(assigned)}
|
|
190
|
+
if directory_paths:
|
|
191
|
+
result["warnings"] = [
|
|
192
|
+
"以下 finding 的 path 是目录而非文件,知识候选生成时会整条跳过"
|
|
193
|
+
"(source_refs 无法绑定文件):" + "; ".join(directory_paths) +
|
|
194
|
+
"。请改为具体文件路径后重新写入"
|
|
195
|
+
]
|
|
196
|
+
return result
|
|
183
197
|
|
|
184
198
|
|
|
185
199
|
def _load_findings(change_dir: Path) -> dict[str, Any] | None:
|
|
@@ -3,7 +3,7 @@ name: harness-archive
|
|
|
3
3
|
description: 归档所有变更产出(计划/测试报告/审查/SQL/API文档)到 .harness/archive/,含归档元数据。仅当用户显式调用
|
|
4
4
|
/harness-archive 时使用;不得被其他阶段 skill 自动接续触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=b2c7fb2239c7aa77; overlay=none; agent=codex; do not edit -->
|
|
7
7
|
# harness-archive — 变更归档
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -3,7 +3,7 @@ name: harness-codebase-map
|
|
|
3
3
|
description: 分析现有代码库并生成 .harness/codebase/map/
|
|
4
4
|
下的结构化代码库地图。用于陌生项目理解、重大改造前梳理、harness-sync 提示 map 过期后的人工刷新。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=b2c7fb2239c7aa77; overlay=none; agent=codex; do not edit -->
|
|
7
7
|
# harness-codebase-map — 代码库地图
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -4,7 +4,7 @@ description: 执行阶段:按变更簇执行 TDD
|
|
|
4
4
|
编码循环(RED→GREEN→REFACTOR→编译验证),随后完成单元/接口/数据兼容验证并输出测试报告。仅当用户显式调用
|
|
5
5
|
/harness-execute 时使用;不得因用户提到编码/实现/测试就自动触发,也不得被其他阶段 skill 自动接续。
|
|
6
6
|
---
|
|
7
|
-
<!-- generated by harness_deploy.py; core=
|
|
7
|
+
<!-- generated by harness_deploy.py; core=b2c7fb2239c7aa77; overlay=none; agent=codex; do not edit -->
|
|
8
8
|
# harness-execute — 执行(编码 + 验证)
|
|
9
9
|
|
|
10
10
|
> 2026-08 阶段合并:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-knowledge-ingest
|
|
3
3
|
description: 确认归档 ZIP 已上传并由 Hunter Platform 在服务端解包、校验和入库。客户端不再构建或维护本地知识索引。
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=b2c7fb2239c7aa77; overlay=none; agent=codex; do not edit -->
|
|
6
6
|
# harness-knowledge-ingest
|
|
7
7
|
|
|
8
8
|
知识 ingest 完全由 Hunter Platform 负责。归档完成时,客户端生成一个确定性 ZIP;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: harness-knowledge-query
|
|
3
3
|
description: 在规划、实现或排查前,通过 hunter-harness CLI 查询远端项目知识库。远端不可用时直接报告不可用,不建立本地索引或离线回退。
|
|
4
4
|
---
|
|
5
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=b2c7fb2239c7aa77; overlay=none; agent=codex; do not edit -->
|
|
6
6
|
# harness-knowledge-query
|
|
7
7
|
|
|
8
8
|
项目知识以 Hunter Platform 的服务端索引为唯一真源。客户端只提交查询并消费结果:
|
|
@@ -3,7 +3,7 @@ name: harness-plan
|
|
|
3
3
|
description: 将需求转化为设计文档+实施计划+完整测试场景表,必须在编码前完成。仅当用户显式调用 /harness-plan 或明确要求进入
|
|
4
4
|
Harness 规划阶段时使用;不得因用户描述需求就自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=b2c7fb2239c7aa77; overlay=none; agent=codex; do not edit -->
|
|
7
7
|
# harness-plan — 需求规划
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -3,7 +3,7 @@ name: harness-pull
|
|
|
3
3
|
description: 从 Hunter Platform 下拉配置/规则/架构/指令(及显式来源分支的分支文件恢复)。仅当用户显式调用
|
|
4
4
|
/harness-pull 或明确说'从平台拉取/恢复'时使用;不得自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=b2c7fb2239c7aa77; overlay=none; agent=codex; do not edit -->
|
|
7
7
|
# harness-pull — 从 Hunter Platform 下拉与恢复
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -3,7 +3,7 @@ name: harness-push
|
|
|
3
3
|
description: 上传本地配置/规则/架构/指令(及显式归档)到 Hunter Platform。仅当用户显式调用 /harness-push
|
|
4
4
|
或明确说'上传到平台'时使用;不得因存在本地修改就自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=b2c7fb2239c7aa77; overlay=none; agent=codex; do not edit -->
|
|
7
7
|
# harness-push — 上传到 Hunter Platform
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -4,7 +4,7 @@ description: 6维度代码审查(架构/安全/规范/兼容/测试/性能)
|
|
|
4
4
|
.harness/context-index.json)和测试场景表,在隔离上下文运行。仅当用户显式调用 /harness-review 时使用;不得在
|
|
5
5
|
test 结束后自动接续执行。
|
|
6
6
|
---
|
|
7
|
-
<!-- generated by harness_deploy.py; core=
|
|
7
|
+
<!-- generated by harness_deploy.py; core=b2c7fb2239c7aa77; overlay=none; agent=codex; do not edit -->
|
|
8
8
|
# harness-review — 代码审查
|
|
9
9
|
|
|
10
10
|
## Purpose
|
|
@@ -3,7 +3,7 @@ name: harness-submit
|
|
|
3
3
|
description: 最终提交封装:验证→中文 commit→提交/推送;worktree 模式含 --no-ff 合并回主分支。仅当用户显式调用
|
|
4
4
|
/harness-submit(或 /harness-merge 重入合并段)时使用;用户口头说'提交/commit/push'时必须先确认,不得自动触发。
|
|
5
5
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
6
|
+
<!-- generated by harness_deploy.py; core=b2c7fb2239c7aa77; overlay=none; agent=codex; do not edit -->
|
|
7
7
|
# harness-submit — 最终提交(含 worktree 合并)
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -4,7 +4,7 @@ description: Use when the user asks to synchronize, refresh, or validate Harness
|
|
|
4
4
|
metadata, adapters, remote knowledge ownership, instruction entrypoints,
|
|
5
5
|
config origins, or CodeGraph status.
|
|
6
6
|
---
|
|
7
|
-
<!-- generated by harness_deploy.py; core=
|
|
7
|
+
<!-- generated by harness_deploy.py; core=b2c7fb2239c7aa77; overlay=none; agent=codex; do not edit -->
|
|
8
8
|
# harness-sync
|
|
9
9
|
|
|
10
10
|
## Purpose
|