@hunter-harness/workflow-harness 0.2.49 → 0.2.51
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/README.md +4 -4
- package/harness/bundles/general/claude-code/harness-archive/SKILL.md +11 -3
- package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +6 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +45 -244
- package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +41 -112
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +9 -4
- package/harness/bundles/general/claude-code/harness-plan/checklist.md +2 -2
- package/harness/bundles/general/claude-code/harness-review/SKILL.md +7 -2
- package/harness/bundles/general/claude-code/harness-run/SKILL.md +8 -3
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +7 -2
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +12 -7
- package/harness/bundles/general/claude-code/harness-sync/reference.md +18 -11
- package/harness/bundles/general/claude-code/harness-test/SKILL.md +7 -2
- package/harness/bundles/general/claude-code/protocols/archive-report-protocol.md +5 -7
- package/harness/bundles/general/claude-code/protocols/state-layout-protocol.md +17 -11
- package/harness/bundles/general/claude-code/scripts/harness_archive.py +769 -191
- package/harness/bundles/general/claude-code/scripts/harness_events_sync.py +90 -12
- package/harness/bundles/general/claude-code/scripts/harness_gate.py +17 -0
- package/harness/bundles/general/claude-code/scripts/harness_profile.py +0 -1
- package/harness/bundles/general/claude-code/scripts/harness_state.py +3 -5
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/general/codebuddy/README.md +4 -4
- package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +11 -3
- package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +6 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +42 -230
- package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +38 -98
- package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +9 -4
- package/harness/bundles/general/codebuddy/harness-plan/checklist.md +2 -2
- package/harness/bundles/general/codebuddy/harness-review/SKILL.md +7 -2
- package/harness/bundles/general/codebuddy/harness-run/SKILL.md +8 -3
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +7 -2
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +13 -8
- package/harness/bundles/general/codebuddy/harness-sync/reference.md +18 -11
- package/harness/bundles/general/codebuddy/harness-test/SKILL.md +7 -2
- package/harness/bundles/general/codebuddy/protocols/archive-report-protocol.md +5 -7
- package/harness/bundles/general/codebuddy/protocols/state-layout-protocol.md +17 -11
- package/harness/bundles/general/codebuddy/scripts/harness_archive.py +769 -191
- package/harness/bundles/general/codebuddy/scripts/harness_events_sync.py +90 -12
- package/harness/bundles/general/codebuddy/scripts/harness_gate.py +17 -0
- package/harness/bundles/general/codebuddy/scripts/harness_profile.py +0 -1
- package/harness/bundles/general/codebuddy/scripts/harness_state.py +3 -5
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- package/harness/bundles/general/codex/README.md +4 -4
- package/harness/bundles/general/codex/harness-archive/SKILL.md +11 -3
- package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +6 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +42 -230
- package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +38 -98
- package/harness/bundles/general/codex/harness-plan/SKILL.md +9 -4
- package/harness/bundles/general/codex/harness-plan/checklist.md +2 -2
- package/harness/bundles/general/codex/harness-review/SKILL.md +7 -2
- package/harness/bundles/general/codex/harness-run/SKILL.md +8 -3
- package/harness/bundles/general/codex/harness-submit/SKILL.md +7 -2
- package/harness/bundles/general/codex/harness-sync/SKILL.md +13 -8
- package/harness/bundles/general/codex/harness-sync/reference.md +18 -11
- package/harness/bundles/general/codex/harness-test/SKILL.md +7 -2
- package/harness/bundles/general/codex/protocols/archive-report-protocol.md +5 -7
- package/harness/bundles/general/codex/protocols/state-layout-protocol.md +17 -11
- package/harness/bundles/general/codex/scripts/harness_archive.py +769 -191
- package/harness/bundles/general/codex/scripts/harness_events_sync.py +90 -12
- package/harness/bundles/general/codex/scripts/harness_gate.py +17 -0
- package/harness/bundles/general/codex/scripts/harness_profile.py +0 -1
- package/harness/bundles/general/codex/scripts/harness_state.py +3 -5
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- package/harness/bundles/general/cursor/README.md +4 -4
- package/harness/bundles/general/cursor/harness-archive/SKILL.md +11 -3
- package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +6 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +42 -230
- package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +38 -98
- package/harness/bundles/general/cursor/harness-plan/SKILL.md +9 -4
- package/harness/bundles/general/cursor/harness-plan/checklist.md +2 -2
- package/harness/bundles/general/cursor/harness-review/SKILL.md +7 -2
- package/harness/bundles/general/cursor/harness-run/SKILL.md +8 -3
- package/harness/bundles/general/cursor/harness-submit/SKILL.md +7 -2
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +13 -8
- package/harness/bundles/general/cursor/harness-sync/reference.md +18 -11
- package/harness/bundles/general/cursor/harness-test/SKILL.md +7 -2
- package/harness/bundles/general/cursor/protocols/archive-report-protocol.md +5 -7
- package/harness/bundles/general/cursor/protocols/state-layout-protocol.md +17 -11
- package/harness/bundles/general/cursor/scripts/harness_archive.py +769 -191
- package/harness/bundles/general/cursor/scripts/harness_events_sync.py +90 -12
- package/harness/bundles/general/cursor/scripts/harness_gate.py +17 -0
- package/harness/bundles/general/cursor/scripts/harness_profile.py +0 -1
- package/harness/bundles/general/cursor/scripts/harness_state.py +3 -5
- package/harness/bundles/java/claude-code/.harness-build.json +1 -1
- package/harness/bundles/java/claude-code/README.md +4 -4
- package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +7 -2
- package/harness/bundles/java/claude-code/harness-archive/SKILL.md +11 -3
- package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +6 -1
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +45 -244
- package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +41 -112
- package/harness/bundles/java/claude-code/harness-package/SKILL.md +7 -2
- package/harness/bundles/java/claude-code/harness-plan/SKILL.md +9 -4
- package/harness/bundles/java/claude-code/harness-plan/checklist.md +2 -2
- package/harness/bundles/java/claude-code/harness-review/SKILL.md +7 -2
- package/harness/bundles/java/claude-code/harness-run/SKILL.md +8 -3
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +7 -2
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +12 -7
- package/harness/bundles/java/claude-code/harness-sync/reference.md +18 -11
- package/harness/bundles/java/claude-code/harness-test/SKILL.md +7 -2
- package/harness/bundles/java/claude-code/protocols/archive-report-protocol.md +5 -7
- package/harness/bundles/java/claude-code/protocols/state-layout-protocol.md +17 -11
- package/harness/bundles/java/claude-code/scripts/harness_archive.py +769 -191
- package/harness/bundles/java/claude-code/scripts/harness_events_sync.py +90 -12
- package/harness/bundles/java/claude-code/scripts/harness_gate.py +17 -0
- package/harness/bundles/java/claude-code/scripts/harness_profile.py +0 -1
- package/harness/bundles/java/claude-code/scripts/harness_state.py +3 -5
- package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/java/codebuddy/README.md +4 -4
- package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +7 -2
- package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +11 -3
- package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +6 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +42 -230
- package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +38 -98
- package/harness/bundles/java/codebuddy/harness-package/SKILL.md +7 -2
- package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +9 -4
- package/harness/bundles/java/codebuddy/harness-plan/checklist.md +2 -2
- package/harness/bundles/java/codebuddy/harness-review/SKILL.md +7 -2
- package/harness/bundles/java/codebuddy/harness-run/SKILL.md +8 -3
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +7 -2
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +13 -8
- package/harness/bundles/java/codebuddy/harness-sync/reference.md +18 -11
- package/harness/bundles/java/codebuddy/harness-test/SKILL.md +7 -2
- package/harness/bundles/java/codebuddy/protocols/archive-report-protocol.md +5 -7
- package/harness/bundles/java/codebuddy/protocols/state-layout-protocol.md +17 -11
- package/harness/bundles/java/codebuddy/scripts/harness_archive.py +769 -191
- package/harness/bundles/java/codebuddy/scripts/harness_events_sync.py +90 -12
- package/harness/bundles/java/codebuddy/scripts/harness_gate.py +17 -0
- package/harness/bundles/java/codebuddy/scripts/harness_profile.py +0 -1
- package/harness/bundles/java/codebuddy/scripts/harness_state.py +3 -5
- package/harness/bundles/java/codex/.harness-build.json +1 -1
- package/harness/bundles/java/codex/README.md +4 -4
- package/harness/bundles/java/codex/harness-apidoc/SKILL.md +7 -2
- package/harness/bundles/java/codex/harness-archive/SKILL.md +11 -3
- package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +6 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +42 -230
- package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +38 -98
- package/harness/bundles/java/codex/harness-package/SKILL.md +7 -2
- package/harness/bundles/java/codex/harness-plan/SKILL.md +9 -4
- package/harness/bundles/java/codex/harness-plan/checklist.md +2 -2
- package/harness/bundles/java/codex/harness-review/SKILL.md +7 -2
- package/harness/bundles/java/codex/harness-run/SKILL.md +8 -3
- package/harness/bundles/java/codex/harness-submit/SKILL.md +7 -2
- package/harness/bundles/java/codex/harness-sync/SKILL.md +13 -8
- package/harness/bundles/java/codex/harness-sync/reference.md +18 -11
- package/harness/bundles/java/codex/harness-test/SKILL.md +7 -2
- package/harness/bundles/java/codex/protocols/archive-report-protocol.md +5 -7
- package/harness/bundles/java/codex/protocols/state-layout-protocol.md +17 -11
- package/harness/bundles/java/codex/scripts/harness_archive.py +769 -191
- package/harness/bundles/java/codex/scripts/harness_events_sync.py +90 -12
- package/harness/bundles/java/codex/scripts/harness_gate.py +17 -0
- package/harness/bundles/java/codex/scripts/harness_profile.py +0 -1
- package/harness/bundles/java/codex/scripts/harness_state.py +3 -5
- package/harness/bundles/java/cursor/.harness-build.json +1 -1
- package/harness/bundles/java/cursor/README.md +4 -4
- package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +7 -2
- package/harness/bundles/java/cursor/harness-archive/SKILL.md +11 -3
- package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +6 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +42 -230
- package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +38 -98
- package/harness/bundles/java/cursor/harness-package/SKILL.md +7 -2
- package/harness/bundles/java/cursor/harness-plan/SKILL.md +9 -4
- package/harness/bundles/java/cursor/harness-plan/checklist.md +2 -2
- package/harness/bundles/java/cursor/harness-review/SKILL.md +7 -2
- package/harness/bundles/java/cursor/harness-run/SKILL.md +8 -3
- package/harness/bundles/java/cursor/harness-submit/SKILL.md +7 -2
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +13 -8
- package/harness/bundles/java/cursor/harness-sync/reference.md +18 -11
- package/harness/bundles/java/cursor/harness-test/SKILL.md +7 -2
- package/harness/bundles/java/cursor/protocols/archive-report-protocol.md +5 -7
- package/harness/bundles/java/cursor/protocols/state-layout-protocol.md +17 -11
- package/harness/bundles/java/cursor/scripts/harness_archive.py +769 -191
- package/harness/bundles/java/cursor/scripts/harness_events_sync.py +90 -12
- package/harness/bundles/java/cursor/scripts/harness_gate.py +17 -0
- package/harness/bundles/java/cursor/scripts/harness_profile.py +0 -1
- package/harness/bundles/java/cursor/scripts/harness_state.py +3 -5
- package/harness/manifests/general/claude-code.json +23 -47
- package/harness/manifests/general/codebuddy.json +23 -47
- package/harness/manifests/general/codex.json +23 -47
- package/harness/manifests/general/cursor.json +23 -47
- package/harness/manifests/java/claude-code.json +25 -49
- package/harness/manifests/java/codebuddy.json +25 -49
- package/harness/manifests/java/codex.json +25 -49
- package/harness/manifests/java/cursor.json +25 -49
- package/hunter-workflow-family.json +4 -4
- package/package.json +1 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/design.md +0 -842
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/mcp-config.example.json +0 -10
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/reference.md +0 -413
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/design.md +0 -842
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/mcp-config.example.json +0 -10
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/reference.md +0 -413
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
- package/harness/bundles/general/codex/harness-knowledge-ingest/design.md +0 -842
- package/harness/bundles/general/codex/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
- package/harness/bundles/general/codex/harness-knowledge-ingest/mcp-config.example.json +0 -10
- package/harness/bundles/general/codex/harness-knowledge-ingest/reference.md +0 -413
- package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
- package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
- package/harness/bundles/general/cursor/harness-knowledge-ingest/design.md +0 -842
- package/harness/bundles/general/cursor/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
- package/harness/bundles/general/cursor/harness-knowledge-ingest/mcp-config.example.json +0 -10
- package/harness/bundles/general/cursor/harness-knowledge-ingest/reference.md +0 -413
- package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
- package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/design.md +0 -842
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/mcp-config.example.json +0 -10
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/reference.md +0 -413
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/design.md +0 -842
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/mcp-config.example.json +0 -10
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/reference.md +0 -413
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
- package/harness/bundles/java/codex/harness-knowledge-ingest/design.md +0 -842
- package/harness/bundles/java/codex/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
- package/harness/bundles/java/codex/harness-knowledge-ingest/mcp-config.example.json +0 -10
- package/harness/bundles/java/codex/harness-knowledge-ingest/reference.md +0 -413
- package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
- package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
- package/harness/bundles/java/cursor/harness-knowledge-ingest/design.md +0 -842
- package/harness/bundles/java/cursor/harness-knowledge-ingest/evaluations/harness_knowledge_evaluation.xml +0 -42
- package/harness/bundles/java/cursor/harness-knowledge-ingest/mcp-config.example.json +0 -10
- package/harness/bundles/java/cursor/harness-knowledge-ingest/reference.md +0 -413
- package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +0 -7263
- package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +0 -275
|
@@ -119,12 +119,19 @@ def post_json(endpoint: dict[str, str], path: str, body: dict[str, Any]) -> dict
|
|
|
119
119
|
return json.loads(response.read().decode("utf-8"))
|
|
120
120
|
|
|
121
121
|
|
|
122
|
-
def sync_change(
|
|
122
|
+
def sync_change(
|
|
123
|
+
project: Path,
|
|
124
|
+
change_dir: Path,
|
|
125
|
+
*,
|
|
126
|
+
heartbeat_only: bool = False,
|
|
127
|
+
run_id: str | None = None,
|
|
128
|
+
change_key: str | None = None,
|
|
129
|
+
) -> dict[str, Any]:
|
|
123
130
|
endpoint = load_endpoint(project)
|
|
124
131
|
if endpoint is None:
|
|
125
132
|
return {"ok": True, "skipped": True, "reason": "remote credentials not configured"}
|
|
126
|
-
|
|
127
|
-
rid = run_id_for(change_dir)
|
|
133
|
+
resolved_key = change_key or change_dir.name
|
|
134
|
+
rid = run_id or run_id_for(change_dir)
|
|
128
135
|
project_id = endpoint["project_id"]
|
|
129
136
|
|
|
130
137
|
# Always heartbeat so the console can separate connection vs run status.
|
|
@@ -138,20 +145,26 @@ def sync_change(project: Path, change_dir: Path, *, heartbeat_only: bool = False
|
|
|
138
145
|
{
|
|
139
146
|
"protocol_version": "hunter-progress-sync/v1",
|
|
140
147
|
"run_id": rid,
|
|
141
|
-
"change_key":
|
|
148
|
+
"change_key": resolved_key,
|
|
142
149
|
"client_time": client_time,
|
|
143
|
-
"title":
|
|
150
|
+
"title": resolved_key,
|
|
144
151
|
},
|
|
145
152
|
)
|
|
146
153
|
except (urllib.error.URLError, TimeoutError, OSError, json.JSONDecodeError) as exc:
|
|
147
154
|
return {"ok": False, "error": f"heartbeat failed: {exc}", "run_id": rid}
|
|
148
155
|
|
|
149
156
|
if heartbeat_only:
|
|
150
|
-
return {"ok": True, "heartbeat": True, "run_id": rid}
|
|
157
|
+
return {"ok": True, "heartbeat": True, "run_id": rid, "change_key": resolved_key}
|
|
151
158
|
|
|
152
159
|
events_file = change_dir / "events.ndjson"
|
|
153
160
|
if not events_file.is_file():
|
|
154
|
-
return {
|
|
161
|
+
return {
|
|
162
|
+
"ok": True,
|
|
163
|
+
"run_id": rid,
|
|
164
|
+
"change_key": resolved_key,
|
|
165
|
+
"uploaded": 0,
|
|
166
|
+
"reason": "no events.ndjson",
|
|
167
|
+
}
|
|
155
168
|
|
|
156
169
|
lines = events_file.read_text(encoding="utf-8").splitlines()
|
|
157
170
|
acked = load_cursor(change_dir)
|
|
@@ -167,7 +180,7 @@ def sync_change(project: Path, change_dir: Path, *, heartbeat_only: bool = False
|
|
|
167
180
|
continue
|
|
168
181
|
if not isinstance(event, dict):
|
|
169
182
|
continue
|
|
170
|
-
event_id = str(event.get("id") or f"{
|
|
183
|
+
event_id = str(event.get("id") or f"{resolved_key}:{acked + offset}")
|
|
171
184
|
payload = sanitize(event)
|
|
172
185
|
batch.append(
|
|
173
186
|
{
|
|
@@ -181,7 +194,13 @@ def sync_change(project: Path, change_dir: Path, *, heartbeat_only: bool = False
|
|
|
181
194
|
)
|
|
182
195
|
if not batch:
|
|
183
196
|
save_cursor(change_dir, len(lines))
|
|
184
|
-
return {
|
|
197
|
+
return {
|
|
198
|
+
"ok": True,
|
|
199
|
+
"run_id": rid,
|
|
200
|
+
"change_key": resolved_key,
|
|
201
|
+
"uploaded": 0,
|
|
202
|
+
"acked_lines": len(lines),
|
|
203
|
+
}
|
|
185
204
|
|
|
186
205
|
# Drop None phase keys for strict schema.
|
|
187
206
|
for item in batch:
|
|
@@ -195,8 +214,8 @@ def sync_change(project: Path, change_dir: Path, *, heartbeat_only: bool = False
|
|
|
195
214
|
{
|
|
196
215
|
"protocol_version": "hunter-progress-sync/v1",
|
|
197
216
|
"run_id": rid,
|
|
198
|
-
"change_key":
|
|
199
|
-
"title":
|
|
217
|
+
"change_key": resolved_key,
|
|
218
|
+
"title": resolved_key,
|
|
200
219
|
"events": batch,
|
|
201
220
|
},
|
|
202
221
|
)
|
|
@@ -222,6 +241,7 @@ def sync_change(project: Path, change_dir: Path, *, heartbeat_only: bool = False
|
|
|
222
241
|
return {
|
|
223
242
|
"ok": accepted == len(batch),
|
|
224
243
|
"run_id": rid,
|
|
244
|
+
"change_key": resolved_key,
|
|
225
245
|
"uploaded": accepted,
|
|
226
246
|
"batch_size": len(batch),
|
|
227
247
|
"acked_lines": acked_lines,
|
|
@@ -229,10 +249,62 @@ def sync_change(project: Path, change_dir: Path, *, heartbeat_only: bool = False
|
|
|
229
249
|
}
|
|
230
250
|
|
|
231
251
|
|
|
252
|
+
def auto_events_sync(
|
|
253
|
+
project_root: Path,
|
|
254
|
+
change_dir: Path,
|
|
255
|
+
*,
|
|
256
|
+
heartbeat_only: bool = False,
|
|
257
|
+
run_id: str | None = None,
|
|
258
|
+
change_key: str | None = None,
|
|
259
|
+
) -> dict[str, Any]:
|
|
260
|
+
"""Best-effort platform events sync (same style as auto_push_archive_core).
|
|
261
|
+
|
|
262
|
+
Failures become warnings so the caller never rolls back the main workflow.
|
|
263
|
+
"""
|
|
264
|
+
project_root = project_root.resolve()
|
|
265
|
+
change_dir = change_dir.resolve()
|
|
266
|
+
if load_endpoint(project_root) is None:
|
|
267
|
+
return {"skipped": True, "reason": "no remote credentials"}
|
|
268
|
+
try:
|
|
269
|
+
result = sync_change(
|
|
270
|
+
project_root,
|
|
271
|
+
change_dir,
|
|
272
|
+
heartbeat_only=heartbeat_only,
|
|
273
|
+
run_id=run_id,
|
|
274
|
+
change_key=change_key,
|
|
275
|
+
)
|
|
276
|
+
except Exception as exc: # noqa: BLE001 — best-effort never blocks caller
|
|
277
|
+
return {
|
|
278
|
+
"skipped": False,
|
|
279
|
+
"ok": False,
|
|
280
|
+
"warning": f"events-sync deferred: {exc}",
|
|
281
|
+
}
|
|
282
|
+
if result.get("skipped"):
|
|
283
|
+
return {"skipped": True, "reason": result.get("reason") or "skipped"}
|
|
284
|
+
if result.get("ok"):
|
|
285
|
+
return {"skipped": False, "ok": True, **{
|
|
286
|
+
key: result[key]
|
|
287
|
+
for key in ("run_id", "change_key", "uploaded", "acked_lines", "heartbeat")
|
|
288
|
+
if key in result
|
|
289
|
+
}}
|
|
290
|
+
return {
|
|
291
|
+
"skipped": False,
|
|
292
|
+
"ok": False,
|
|
293
|
+
"warning": str(result.get("error") or "events-sync failed"),
|
|
294
|
+
**{
|
|
295
|
+
key: result[key]
|
|
296
|
+
for key in ("run_id", "change_key")
|
|
297
|
+
if key in result
|
|
298
|
+
},
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
|
|
232
302
|
def main(argv: list[str] | None = None) -> int:
|
|
233
303
|
parser = argparse.ArgumentParser(description="Sync events.ndjson to platform Run monitoring")
|
|
234
304
|
parser.add_argument("--project", default=".", help="Project root")
|
|
235
305
|
parser.add_argument("--change-dir", help="Specific change directory")
|
|
306
|
+
parser.add_argument("--run-id", help="Override stable run_id (archive finalize continuity)")
|
|
307
|
+
parser.add_argument("--change-key", help="Override change_key sent to the platform")
|
|
236
308
|
parser.add_argument("--heartbeat-only", action="store_true")
|
|
237
309
|
parser.add_argument("--json", action="store_true")
|
|
238
310
|
args = parser.parse_args(argv)
|
|
@@ -243,7 +315,13 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
243
315
|
root = project / ".harness" / "changes"
|
|
244
316
|
changes = sorted(path for path in root.glob("*") if path.is_dir()) if root.is_dir() else []
|
|
245
317
|
results = [
|
|
246
|
-
sync_change(
|
|
318
|
+
sync_change(
|
|
319
|
+
project,
|
|
320
|
+
change_dir,
|
|
321
|
+
heartbeat_only=args.heartbeat_only,
|
|
322
|
+
run_id=args.run_id,
|
|
323
|
+
change_key=args.change_key,
|
|
324
|
+
)
|
|
247
325
|
for change_dir in changes
|
|
248
326
|
]
|
|
249
327
|
ok = all(item.get("ok") for item in results) if results else True
|
|
@@ -31,6 +31,7 @@ if str(SCRIPTS_DIR) not in sys.path:
|
|
|
31
31
|
|
|
32
32
|
import harness_change as hc # noqa: E402
|
|
33
33
|
import harness_events as he # noqa: E402
|
|
34
|
+
import harness_events_sync as hes # noqa: E402
|
|
34
35
|
import harness_ledger as hl # noqa: E402
|
|
35
36
|
import harness_paths as hp # noqa: E402
|
|
36
37
|
import harness_plan_finalize as hpf # noqa: E402
|
|
@@ -2213,6 +2214,22 @@ def cmd_begin(args: argparse.Namespace) -> int:
|
|
|
2213
2214
|
"gateSeverityMode": severity_mode,
|
|
2214
2215
|
"gateWarnings": gate_warnings,
|
|
2215
2216
|
}
|
|
2217
|
+
# C3: best-effort start platform run monitoring (register + running via heartbeat/events).
|
|
2218
|
+
try:
|
|
2219
|
+
monitor = hes.auto_events_sync(project, change_dir)
|
|
2220
|
+
payload["platformMonitor"] = monitor
|
|
2221
|
+
if monitor.get("warning"):
|
|
2222
|
+
warnings_msg = str(monitor["warning"])
|
|
2223
|
+
gate_warnings.append({
|
|
2224
|
+
"code": "PLATFORM_EVENTS_SYNC_WARN",
|
|
2225
|
+
"message": warnings_msg,
|
|
2226
|
+
})
|
|
2227
|
+
payload["gateWarnings"] = gate_warnings
|
|
2228
|
+
except Exception as exc: # noqa: BLE001 — never block phase begin
|
|
2229
|
+
payload["platformMonitor"] = {
|
|
2230
|
+
"ok": False,
|
|
2231
|
+
"warning": f"events-sync hook failed: {exc}",
|
|
2232
|
+
}
|
|
2216
2233
|
emit(payload, as_json=as_json)
|
|
2217
2234
|
return 0
|
|
2218
2235
|
|
|
@@ -852,7 +852,6 @@ def _node_commands(project: Path) -> dict[str, Any]:
|
|
|
852
852
|
inputs.extend(
|
|
853
853
|
[
|
|
854
854
|
"harness/scripts/*.py",
|
|
855
|
-
"harness/harness-knowledge-ingest/scripts/*.py",
|
|
856
855
|
"harness/harness-test/scripts/*.mjs",
|
|
857
856
|
"harness/harness-test/scripts/tests/*.mjs",
|
|
858
857
|
"scripts/*.mjs",
|
|
@@ -218,11 +218,9 @@ def discover_segment_files(
|
|
|
218
218
|
project / "harness.json",
|
|
219
219
|
]
|
|
220
220
|
codebase_map = list((project / ".harness/codebase/map").glob("**/*"))
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
project / ".harness/knowledge/config.json",
|
|
225
|
-
]
|
|
221
|
+
# Knowledge is remote-only. Keep the segment for schema compatibility, but
|
|
222
|
+
# do not discover or fingerprint local indexes/fallback state.
|
|
223
|
+
knowledge: list[Path] = []
|
|
226
224
|
change_inputs: list[Path] = []
|
|
227
225
|
for folder in ("spec", "plans", "meta"):
|
|
228
226
|
change_inputs.extend((change_dir / folder).glob("**/*"))
|
|
@@ -56,8 +56,8 @@
|
|
|
56
56
|
| harness-review | `[Read, Write, Edit, Glob, Grep, Agent, Bash(powershell.exe:*)]` | 同上 |
|
|
57
57
|
| harness-sync | `[Read, Glob, Grep, Edit, Write, Bash(powershell.exe:*)]` | 同上 |
|
|
58
58
|
| harness-codebase-map | `[Read, Glob, Grep, Write, Edit, Agent, Bash(powershell.exe:*)]` | 同上 |
|
|
59
|
-
| harness-knowledge-query | `[Bash(powershell.exe:*), Read,
|
|
60
|
-
| harness-knowledge-ingest | `[Bash(powershell.exe:*), Read,
|
|
59
|
+
| harness-knowledge-query | `[Bash(powershell.exe:*), Read, Glob, Grep]` | 同上 |
|
|
60
|
+
| harness-knowledge-ingest | `[Bash(powershell.exe:*), Read, Glob, Grep]` | 同上 |
|
|
61
61
|
|
|
62
62
|
> **blocking user confirmation 不预批准**:各 skill 需要向用户确认时通过普通权限提示调用 `blocking user confirmation`(adapter 映射到 `AskUserQuestion`/`request_user_input`/普通对话),不在 `allowed-tools` 中预批准(遵循 skill-optimizer 规则)。`harness-codebase-map` 额外预批准 `Agent` 用于派发并行 mapper。
|
|
63
63
|
|
|
@@ -227,8 +227,8 @@ harness-skills/
|
|
|
227
227
|
| harness-review | `/harness-review` | 6维度参考性审查(不阻塞后续流程) | `test` | 手动 | `.harness/changes/<cn>/reports/review/` |
|
|
228
228
|
| harness-submit | `/harness-submit` 或 `/harness-merge`(别名) | commit+push(主目录)/ worktree:本地 commit→--no-ff 合并→push 主分支 | `review` | 手动 | ledger `mergeFinalHash` + 控制台报告 |
|
|
229
229
|
| harness-archive | `/harness-archive` | 归档产出到 archive/YYYY-MM-DD-<cn>,释放工作区 | `submit` | 手动 | `.harness/archive/YYYY-MM-DD-<cn>/` |
|
|
230
|
-
| harness-knowledge-query | `/harness-knowledge-query` |
|
|
231
|
-
| harness-knowledge-ingest | `/harness-knowledge-ingest` |
|
|
230
|
+
| harness-knowledge-query | `/harness-knowledge-query` | 只查询平台语义知识;无本地索引或离线回退 | 独立 | ✅ | CLI JSON(不落本地知识文件) |
|
|
231
|
+
| harness-knowledge-ingest | `/harness-knowledge-ingest` | 确认归档 ZIP 已由平台保存、解包并 ingest | `archive` | ✅ | 服务端 package/knowledge 收据 |
|
|
232
232
|
|
|
233
233
|
> 生命周期 skill(plan → run → test → review → submit → archive)为**手动触发**:单阶段结束后停止,不自动接续下一阶段(已设 `disable-model-invocation`)。sync / codebase-map / knowledge 等辅助 skill 仍可按需被调用。`harness-run`、`harness-submit`、`harness-archive` 涉及 git 写操作、文件移动或归档,调用前必须确保前置条件已满足。
|
|
234
234
|
> `<cn>` = change-name,由 harness-plan 阶段7确定。其他 skill 自动扫描未归档变更定位。
|
|
@@ -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=58d36d8a7da29845; overlay=none; agent=codex; do not edit -->
|
|
7
7
|
# harness-archive — 变更归档
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -58,7 +58,7 @@ description: 归档所有变更产出(计划/测试报告/审查/SQL/API文档
|
|
|
58
58
|
6. **implementation-detail** — 自适应执行参考;legacy 缺失 🟡WARN,不阻断
|
|
59
59
|
7. **test-scenarios** — 测试真相源:`plans/<change>-test-scenarios.md`
|
|
60
60
|
8. **禁止读取 `docs/superpowers/` 作为正式输入** — 旧草稿仅人工线索
|
|
61
|
-
9. **每个 skill 边界只刷新一次状态快照** — 先运行 `python <skills-root>/scripts/harness_state.py capture --project . --change-dir ".harness/changes/<change-name>" --base <baseCommit> --json`;`changedSegments=[]` 时复用已有 profile/rules/map/
|
|
61
|
+
9. **每个 skill 边界只刷新一次状态快照** — 先运行 `python <skills-root>/scripts/harness_state.py capture --project . --change-dir ".harness/changes/<change-name>" --base <baseCommit> --json`;`changedSegments=[]` 时复用已有 profile/rules/map/change/code 指纹,不再重复跑全量 `harness-sync` 或代码库扫描。`knowledge` 段仅为兼容空段,知识始终按需远端查询;快照不能替代源码读取和验证门禁。
|
|
62
62
|
|
|
63
63
|
状态目录分层:新路径优先,旧路径兼容 → [[../protocols/state-layout-protocol.md|state-layout-protocol]]
|
|
64
64
|
> 片段:read-protocol
|
|
@@ -100,7 +100,10 @@ description: 归档所有变更产出(计划/测试报告/审查/SQL/API文档
|
|
|
100
100
|
|
|
101
101
|
1. 运行 `python <skills-root>/scripts/harness_archive.py status --change-dir ".harness/changes/<change-name>" --intent release-candidate --json` 前置检查。无 CI 项目若已有完整全量 ledger,先运行 `certify-local`;若用户明确只封存事实,则 status/finalize 均使用 `--intent record-only`。
|
|
102
102
|
2. `meta/archive-meta.md` **由 `harness_archive.py finalize` 自动生成**(与 summary-data `finalStatus` 同源);**禁止 agent 手写**该文件,手写视为数据丢失。维护者结论写入 events(decision/issue)即可,finalize 会汇总到 summary / archive-meta。
|
|
103
|
-
3. 运行 `python <skills-root>/scripts/harness_archive.py finalize --change-dir ".harness/changes/<change-name>" --archive-root ".harness/archive" --intent <release-candidate|record-only> --json`;读 JSON(cleanup、事件、移动、collect、render、validate、manifest 比对、archive-meta)。finalize 内部负责且仅负责一次 `phase.start` / `phase.end
|
|
103
|
+
3. 运行 `python <skills-root>/scripts/harness_archive.py finalize --change-dir ".harness/changes/<change-name>" --archive-root ".harness/archive" --intent <release-candidate|record-only> --json`;读 JSON(cleanup、事件、移动、collect、render、validate、manifest 比对、archive-meta、ZIP package、上传与服务端 knowledge status)。finalize 内部负责且仅负责一次 `phase.start` / `phase.end`,调用者不得重复追加。**本地不再执行知识维护,也不写 maintenance-outbox**;服务端在归档 ZIP 持久保存并解包后 ingest。**finalize 失败或 validate 报错时不删除原目录**。
|
|
104
|
+
- **归档包上传**:始终先生成一个确定性 ZIP;有远程凭据时再调用 `npx hunter-harness archive upload`。ZIP 仅包含 `summary-data.json`、`spec/**/*.md`、`plans/**/*.md`、`archive-meta.md`、`change-context.json` 和稳定 manifest;明确排除 logs、review/test 报告、HTML、缓存、备份、凭据和临时文件。
|
|
105
|
+
- **失败可恢复**:无论远端凭据是否齐全,都先生成 ZIP 与 `<change-key>.upload.json`;上传或服务端 ingest 失败不破坏本地归档。待上传 ZIP 与逐 change 回执保留在 `.harness/state/local/archive-packages/`,可枚举独立重试。只有 CLI 核验 package hash 且服务端同时返回 `archive_status=durable`、`knowledge_status=ready` 后,才清理对应 ZIP 与回执;`indexing` 记为 pending,不记为失败。
|
|
106
|
+
- **监控终态(C3)**:auto-upload 之后自动 `events-sync`,用归档前 change 路径派生的 `run_id` + 原 `change_key` 上报;失败只记 warning。
|
|
104
107
|
|
|
105
108
|
- **Read `reference.md`** — finalize 输出字段、archive-meta 格式、CONDITIONAL_OK 规则
|
|
106
109
|
- **Read `templates/summary-data-template.json`** — summary-data 数据结构
|
|
@@ -117,6 +120,11 @@ description: 归档所有变更产出(计划/测试报告/审查/SQL/API文档
|
|
|
117
120
|
- 命令结果不得靠猜测;普通 Bash 被拒 → 立即改用等价 PowerShell 重试一次
|
|
118
121
|
- 仅 PowerShell 成功且有明确证据(构建/git/测试输出、文件存在、exit 0)时可标 ✅OK;否则 ❌FAIL 或 🟡WARN
|
|
119
122
|
- 禁止把 hook 拒绝、静态验证、无输出、用户跳过说成成功 → 详见 [[../protocols/powershell-protocol.md|powershell-protocol]]、[[../protocols/evidence-based-reporting-protocol.md|evidence-based-reporting-protocol]]
|
|
123
|
+
|
|
124
|
+
## 生成内容语言约定
|
|
125
|
+
|
|
126
|
+
- sync/ingest 等生成的文档、规则、知识条目、架构说明一律**优先使用中文**撰写(标识符、命令、代码、API 字段名保持原文)
|
|
127
|
+
- 面向平台展示的标题/摘要/正文默认中文;仅当用户明确要求或目标系统强制时才用英文
|
|
120
128
|
> 片段:p0-trust
|
|
121
129
|
|
|
122
130
|
## 关键规则(硬门禁速查)
|
|
@@ -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=58d36d8a7da29845; overlay=none; agent=codex; do not edit -->
|
|
7
7
|
# harness-codebase-map — 代码库地图
|
|
8
8
|
|
|
9
9
|
## Purpose
|
|
@@ -56,6 +56,11 @@ description: 分析现有代码库并生成 .harness/codebase/map/
|
|
|
56
56
|
- 命令结果不得靠猜测;普通 Bash 被拒 → 立即改用等价 PowerShell 重试一次
|
|
57
57
|
- 仅 PowerShell 成功且有明确证据(构建/git/测试输出、文件存在、exit 0)时可标 ✅OK;否则 ❌FAIL 或 🟡WARN
|
|
58
58
|
- 禁止把 hook 拒绝、静态验证、无输出、用户跳过说成成功 → 详见 [[../protocols/powershell-protocol.md|powershell-protocol]]、[[../protocols/evidence-based-reporting-protocol.md|evidence-based-reporting-protocol]]
|
|
59
|
+
|
|
60
|
+
## 生成内容语言约定
|
|
61
|
+
|
|
62
|
+
- sync/ingest 等生成的文档、规则、知识条目、架构说明一律**优先使用中文**撰写(标识符、命令、代码、API 字段名保持原文)
|
|
63
|
+
- 面向平台展示的标题/摘要/正文默认中文;仅当用户明确要求或目标系统强制时才用英文
|
|
59
64
|
> 片段:p0-trust · map 额外:文件存在/行数/hash 为证据
|
|
60
65
|
|
|
61
66
|
## 关键规则
|
|
@@ -1,263 +1,75 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: harness-knowledge-ingest
|
|
3
|
-
description:
|
|
4
|
-
knowledge、rebuild knowledge index、promote knowledge、确认知识条目、检查知识库是否过期。
|
|
3
|
+
description: 确认归档 ZIP 已上传并由 Hunter Platform 在服务端解包、校验和入库。客户端不再构建或维护本地知识索引。
|
|
5
4
|
---
|
|
6
|
-
<!-- generated by harness_deploy.py; core=
|
|
5
|
+
<!-- generated by harness_deploy.py; core=58d36d8a7da29845; overlay=none; agent=codex; do not edit -->
|
|
7
6
|
# harness-knowledge-ingest
|
|
8
7
|
|
|
9
|
-
|
|
8
|
+
知识 ingest 完全由 Hunter Platform 负责。归档完成时,客户端生成一个确定性 ZIP;
|
|
9
|
+
服务端收到后保存原包、安全解包、发布核心文件,并根据其中的 Markdown 与摘要重建
|
|
10
|
+
项目语义索引。
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
客户端不得生成 `.harness/knowledge`、SQLite 索引、候选条目、视图、报告或本地裁决。
|
|
13
|
+
本地知识处理脚本已从分发包移除;历史版本数据只由升级兼容逻辑识别,不再执行。
|
|
12
14
|
|
|
13
|
-
##
|
|
15
|
+
## 归档包边界
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
- sync knowledge
|
|
17
|
-
- rebuild knowledge index
|
|
18
|
-
- promote knowledge
|
|
19
|
-
- 确认知识条目
|
|
20
|
-
- 从归档生成知识索引
|
|
21
|
-
- 刷新项目知识库
|
|
22
|
-
- 检查知识库是否过期
|
|
17
|
+
允许上传的核心内容只有:
|
|
23
18
|
|
|
24
|
-
|
|
19
|
+
- `reports/final/summary-data.json`
|
|
20
|
+
- `spec/**/*.md`
|
|
21
|
+
- `plans/**/*.md`
|
|
22
|
+
- `archive-meta.md`
|
|
23
|
+
- `change-context.json`
|
|
24
|
+
- 包内 `archive-manifest.json`(由 CLI 生成)
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
- `.harness/archive/**/reports/final/summary-data.json`
|
|
28
|
-
- `.harness/knowledge/index.json`
|
|
29
|
-
- `.harness/codebase/map-summary.md`(如存在)
|
|
30
|
-
- design.md
|
|
26
|
+
日志、测试报告、审查报告、HTML、缓存、备份、凭据和临时文件不得进入归档包。
|
|
31
27
|
|
|
32
|
-
##
|
|
28
|
+
## Normal Workflow
|
|
33
29
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
1. **整理知识库内容**:把归档里的 `businessGoal`、`changedFiles`、`maintenanceNotes`、`knownRisks`、`manualActions`、`verification`、`reviewSummary` 抽成知识条目。
|
|
37
|
-
2. **维护知识生命周期**:检查索引是否过期,保留 active 条目;高置信 candidate 由 `autoPromote` 自动提升;其余 candidate/conflicted 由 **Agent judge** 闭环裁决,不再默认输出人工待办清单。
|
|
38
|
-
|
|
39
|
-
## Outputs
|
|
40
|
-
|
|
41
|
-
```text
|
|
42
|
-
.harness/knowledge/index.json
|
|
43
|
-
.harness/knowledge/index.sqlite
|
|
44
|
-
.harness/knowledge/entries/candidate/*.json
|
|
45
|
-
.harness/knowledge/entries/active/*.json
|
|
46
|
-
.harness/knowledge/entries/stale/*.json
|
|
47
|
-
.harness/knowledge/entries/superseded/*.json
|
|
48
|
-
.harness/knowledge/entries/conflicted/*.json
|
|
49
|
-
.harness/knowledge/cache/archive-entries/*.json
|
|
50
|
-
.harness/knowledge/reports/ingest-report-*.md
|
|
51
|
-
.harness/knowledge/reports/verification-report-*.md
|
|
52
|
-
.harness/knowledge/reports/audit-report-*.md
|
|
53
|
-
.harness/knowledge/reports/judge-export-<content-sha256>.json
|
|
54
|
-
.harness/knowledge/reports/judgements-<content-sha256>.json
|
|
55
|
-
.harness/knowledge/reports/latest.json
|
|
56
|
-
.harness/knowledge/views/knowledge-dashboard.md
|
|
57
|
-
.harness/knowledge/views/by-file.md
|
|
58
|
-
.harness/knowledge/views/stale-items.md
|
|
59
|
-
.harness/knowledge/views/superseded-items.md
|
|
60
|
-
.harness/knowledge/views/conflicted-items.md
|
|
61
|
-
.harness/knowledge/views/active-review.md
|
|
62
|
-
.harness/knowledge/views/knowledge.base
|
|
63
|
-
.harness/knowledge/context-packs/*.md
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## Commands
|
|
67
|
-
|
|
68
|
-
`<skill-dir>` 指本 skill 目录。所有 python 脚本命令通过 `powershell.exe -Command "..."` 执行。完整命令示例与 config.json 配置见 `reference.md`「Commands 详细」。
|
|
69
|
-
|
|
70
|
-
| 命令 | 用途 |
|
|
71
|
-
|---|---|
|
|
72
|
-
| 无参数 / `auto` | 一键防腐:首建 config、sync --update、**默认**写回 validator 建议、verify、audit;随后由 **Agent** 执行 judge 闭环 |
|
|
73
|
-
| `status` | 严格只读地返回 freshness 与 health |
|
|
74
|
-
| `repair all` | 修复可证明的 legacy gate、归一化重复、冲突与报告保留;不确定项返回 `needsConfirmation` |
|
|
75
|
-
| `ingest` | 重建/刷新知识索引,抽取 candidate;`--no-incremental` 强制全量重抽取 |
|
|
76
|
-
| `sync --check` | 只读检查 index 与 archive/HEAD 一致性;`--update` 自动刷新 |
|
|
77
|
-
| `promote` | candidate→active(显式 promote 或 autoPromote / judge 触发) |
|
|
78
|
-
| `demote` | active→stale/candidate(显式 demote 或自动降级策略触发) |
|
|
79
|
-
| `audit` | 生成 Candidate/Stale/Superseded/Conflict/Active Review 报告 |
|
|
80
|
-
| `verify` | 执行 entry validators,刷新 lifecycle.validation,生成 verification-report |
|
|
81
|
-
| `suggest-validators` | 生成 file_exists/file_contains validator 建议;`--apply` 写回 entry |
|
|
82
|
-
| `admin <旧命令>` | 旧管理命令兼容入口 |
|
|
83
|
-
| `mcp` | FastMCP stdio 入口,暴露 9 个工具(见 reference.md) |
|
|
84
|
-
|
|
85
|
-
config.json 配置项(autoPromote / confidence / activeLifecycle / knowledgeValidation)详见 `reference.md`「Commands 详细」。
|
|
86
|
-
|
|
87
|
-
## Workflow
|
|
88
|
-
|
|
89
|
-
### Phase 0:确认项目根目录
|
|
90
|
-
|
|
91
|
-
项目根目录必须包含 `.harness/`。如果 `.harness/archive/` 不存在或没有 `summary-data.json`,报告当前项目暂无可索引归档,不要伪造知识。
|
|
92
|
-
|
|
93
|
-
### Phase 1:重建本地知识索引
|
|
94
|
-
|
|
95
|
-
运行:
|
|
96
|
-
|
|
97
|
-
```powershell
|
|
98
|
-
powershell.exe -Command "python '<skill-dir>\scripts\harness_knowledge.py' ingest --project '<project-root>'"
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
生成:
|
|
102
|
-
|
|
103
|
-
- `index.json`:人类可读 manifest。
|
|
104
|
-
- `index.sqlite`:SQLite FTS5 检索索引。
|
|
105
|
-
- `entries/candidate/`:自动抽取、待确认知识。
|
|
106
|
-
- `entries/stale/`:来源 commit 缺失、无法比较,或来源 commit 后相关文件变化的知识。
|
|
107
|
-
- `entries/active/`:人工确认后可长期引用的知识。
|
|
108
|
-
- `views/`:Obsidian 友好的浏览视图。
|
|
109
|
-
- `reports/`:本次 ingest 报告。
|
|
110
|
-
|
|
111
|
-
### Phase 2:一键 auto(推荐入口)
|
|
112
|
-
|
|
113
|
-
```powershell
|
|
114
|
-
powershell.exe -Command "python '<skill-dir>\scripts\harness_knowledge.py' auto --project '<project-root>'"
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
不传子命令时等价于 `auto`。`auto` 输出必须分别报告:
|
|
118
|
-
|
|
119
|
-
- `freshness`:archive、HEAD、manifest、entry、SQLite 是否一致。
|
|
120
|
-
- `health`:各 lifecycle、publication、validation 与待裁决工作量。
|
|
121
|
-
|
|
122
|
-
`auto` 默认会写回确定性 validator 建议(`--no-apply-suggestions` 可关闭)。JSON 返回含 `lifecycle` 摘要(validatorsApplied、autoPromote、pendingAgentJudge 等)。
|
|
123
|
-
|
|
124
|
-
### Phase 3:Agent judge 闭环(auto 之后必须执行)
|
|
125
|
-
|
|
126
|
-
当 `lifecycle.pendingAgentJudge > 0`、存在 `pending-judge` outbox,或 `judge export` 的
|
|
127
|
-
`counts.requiredDecisionCount > 0` 时:
|
|
128
|
-
|
|
129
|
-
1. `judge export`(或读 maintain 产出的 pending judgements)
|
|
130
|
-
2. Agent 读取 export JSON,按 `reference.md`「Agent judge 启发式」批量写 `reports/judge-decisions-<ts>.json`
|
|
131
|
-
3. `judge apply --apply <decisions.json>`(`knowledge.manualReview=true` 时需用户显式 `--force`)
|
|
132
|
-
4. 向用户输出 **已处理报告**(promoted/dropped/superseded/kept/skipped 计数 + 报告路径)
|
|
133
|
-
|
|
134
|
-
**禁止**默认输出「请人工确认 N 条 candidate」类五步待办清单。拿不准的 candidate 保持 `candidate` 状态留待下轮,记入 `skippedCandidates` 即可。
|
|
135
|
-
|
|
136
|
-
`pendingAgentJudge`/`requiredDecisionCount` 是完整待裁决总量;`previewCount` 才受
|
|
137
|
-
`config.judge.maxCandidatesPerRun`(默认 100)限制。已被 publication gate 阻断的条目
|
|
138
|
-
只进入 `quarantinedCount`,不得混入 judge export。`defer` 必须保存证据指纹;来源、
|
|
139
|
-
validator、冲突关系或 publication 证据变化后即使未到 `reviewAfter` 也重新进入裁决。
|
|
140
|
-
|
|
141
|
-
### Phase 4:同步检查(可选)
|
|
30
|
+
1. `harness-archive` 的 finalize 生成确定性 ZIP,并调用:
|
|
142
31
|
|
|
143
32
|
```powershell
|
|
144
|
-
powershell.exe -Command "
|
|
33
|
+
powershell.exe -Command "npx hunter-harness archive upload --file '<archive.zip>' --change-key '<change-key>' --yes --non-interactive --json"
|
|
145
34
|
```
|
|
146
35
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
仅在用户点名单条、或 `manualReview=true` 需人工确认时使用 `promote` / `demote`。日常归档后不要逐条人工复核。
|
|
152
|
-
|
|
153
|
-
**发布门禁**:knowledge publication 与 archive release status 独立。promote / judge apply /
|
|
154
|
-
autoPromote 校验 authoritative pointer/hash 与 `reportPipeline.sourceConsistency`;即使归档
|
|
155
|
-
最终状态为 WARN,只要知识来源一致也可发布,但保留 release advisory。旧归档只有在
|
|
156
|
-
summary/hash/source commit 可独立证明时才自动生成 attestation;否则保持 quarantined 并
|
|
157
|
-
返回 `needsConfirmation`(详见 `reference.md`「发布门禁」)。
|
|
158
|
-
|
|
159
|
-
### Phase 6:解释同步结果
|
|
160
|
-
|
|
161
|
-
回复用户或交给后续 skill 前,应说明:
|
|
162
|
-
|
|
163
|
-
- 索引是否最新。
|
|
164
|
-
- 如需刷新,具体原因是 archive 增删、checksum 变化、sqlite 缺失,还是 HEAD 改变。
|
|
165
|
-
- 本次是否自动刷新。
|
|
166
|
-
- 当前 `active` / `candidate` / `stale` 的数量。
|
|
167
|
-
- 分别报告 `freshness` 与 `health`,不要用一个 `status` 覆盖
|
|
168
|
-
lifecycle/review/publication/validation 四个正交维度。
|
|
169
|
-
|
|
170
|
-
## Knowledge extraction rules
|
|
171
|
-
|
|
172
|
-
- 优先读取归档显式 `knowledgeCandidates[]`;维护流水线、测试计数等
|
|
173
|
-
`category=process-observation` 不进入长期知识。
|
|
174
|
-
- Duplicate content 使用 Unicode、空白、标点与大小写归一化指纹,并在全量重建时迁移。
|
|
175
|
-
- 冲突必须同时有相同实体、共享来源范围和双方证据;仅关键词相反不得判为冲突。
|
|
176
|
-
- Keep project-local entries excluded from any global index unless explicitly selected.
|
|
177
|
-
- Validate lifecycle relationships.
|
|
178
|
-
- Default generated entries are `candidate`; only config-gated `autoPromote` may promote high-confidence long-lived entries to `active`.
|
|
179
|
-
- Preserve provenance: every entry must include source archive, summary path, source commit, and source files when available.
|
|
180
|
-
- Do not edit `.harness/archive/**` during ingest.
|
|
181
|
-
- Do not copy secrets into `.harness/knowledge`.
|
|
182
|
-
|
|
183
|
-
## Lifecycle rules
|
|
184
|
-
|
|
185
|
-
- `candidate`:自动抽取;高置信 + 白名单类型可由 autoPromote 提升;其余由 Agent judge 裁决或保持 candidate。
|
|
186
|
-
- `active`:autoPromote、judge promote,或显式 promote 后可用。
|
|
187
|
-
- `stale`:来源 commit 缺失、来源 commit 后相关文件变化,或当前代码无法证明旧结论仍有效。
|
|
188
|
-
- `superseded`:被后续归档/决策取代。
|
|
189
|
-
- `conflicted`:与另一条 active/candidate 知识冲突。
|
|
36
|
+
2. 检查响应中的包哈希、服务端保存状态和 `knowledge_status`。
|
|
37
|
+
3. 只有服务端确认原 ZIP 已持久保存且知识状态为 ready,才删除本地待上传 ZIP。
|
|
38
|
+
4. 上传或 ingest 失败时保留 ZIP 与失败收据;修复连接后重试同一个 ZIP,不重新拼散文件。
|
|
190
39
|
|
|
191
|
-
##
|
|
40
|
+
## Ownership Rules
|
|
192
41
|
|
|
193
|
-
-
|
|
194
|
-
-
|
|
195
|
-
-
|
|
196
|
-
-
|
|
197
|
-
- store_secrets
|
|
198
|
-
- treat_stale_knowledge_as_current_fact
|
|
42
|
+
- 客户端:选择核心文件、生成稳定 manifest/ZIP、校验包哈希、上传与保留失败重试材料。
|
|
43
|
+
- 服务端:敏感信息扫描、ZIP 安全校验、原包持久化、解包、制品发布、知识 ingest、状态查询和下载恢复。
|
|
44
|
+
- 远端不可用:知识不可用;不得启动本地替代索引。
|
|
45
|
+
- 面向人的知识、提案、规则和说明默认使用中文。
|
|
199
46
|
|
|
200
|
-
##
|
|
47
|
+
## Forbidden Actions
|
|
201
48
|
|
|
202
|
-
-
|
|
203
|
-
-
|
|
204
|
-
-
|
|
205
|
-
-
|
|
206
|
-
-
|
|
207
|
-
-
|
|
208
|
-
- agent_judge_knowledge_lifecycle
|
|
209
|
-
- write_knowledge_index
|
|
210
|
-
- write_obsidian_views
|
|
49
|
+
- build_or_refresh_local_knowledge
|
|
50
|
+
- write_dot_harness_knowledge
|
|
51
|
+
- upload_logs_reviews_tests_or_temp_files
|
|
52
|
+
- call_legacy_python_ingest
|
|
53
|
+
- treat_upload_acceptance_without_durable_status_as_success
|
|
54
|
+
- delete_pending_zip_after_failed_upload
|
|
211
55
|
|
|
212
56
|
## Verification
|
|
213
57
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
powershell.exe -Command "python 'harness\scripts\harness_test_runner.py' unittest --profile safe --tests-dir '<skill-dir>\tests' --timeout-seconds 300 --verbosity 1"
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
完成脚本修改后必须至少运行该测试。若在真实项目中验证,还应运行:
|
|
221
|
-
|
|
222
|
-
```powershell
|
|
223
|
-
powershell.exe -Command "python '<skill-dir>\scripts\harness_knowledge.py' auto --project '<real-project-root>'"
|
|
224
|
-
powershell.exe -Command "python '<skill-dir>\scripts\harness_knowledge.py' ingest --project '<real-project-root>'"
|
|
225
|
-
powershell.exe -Command "python '<skill-dir>\scripts\harness_knowledge.py' suggest-validators --project '<real-project-root>' --limit 20"
|
|
226
|
-
powershell.exe -Command "python '<skill-dir>\scripts\harness_knowledge.py' verify --project '<real-project-root>'"
|
|
227
|
-
powershell.exe -Command "python '<skill-dir>\scripts\harness_knowledge.py' sync --project '<real-project-root>'"
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
并确认 `index.json`、`index.sqlite`、`views/knowledge-dashboard.md`、`reports/verification-report-*.md` 存在,且 sync 输出 `upToDate=true`。
|
|
58
|
+
确认归档命令的 JSON 结果同时包含:服务端 package 哈希、保存状态和知识状态。
|
|
59
|
+
若失败,确认 `.harness/state/local/archive-packages/` 中仍保留可重试 ZIP;若成功,确认
|
|
60
|
+
ZIP 已按收据策略清理,且平台下载接口可以恢复原包。
|
|
231
61
|
|
|
232
62
|
## P0 执行可信度规则
|
|
233
63
|
|
|
234
64
|
- 命令结果不得靠猜测;普通 Bash 被拒 → 立即改用等价 PowerShell 重试一次
|
|
235
65
|
- 仅 PowerShell 成功且有明确证据(构建/git/测试输出、文件存在、exit 0)时可标 ✅OK;否则 ❌FAIL 或 🟡WARN
|
|
236
66
|
- 禁止把 hook 拒绝、静态验证、无输出、用户跳过说成成功 → 详见 [[../protocols/powershell-protocol.md|powershell-protocol]]、[[../protocols/evidence-based-reporting-protocol.md|evidence-based-reporting-protocol]]
|
|
237
|
-
> 片段:p0-trust · ingest/sync 须绑定 `upToDate`/产物路径证据
|
|
238
|
-
|
|
239
|
-
## Output Format
|
|
240
|
-
|
|
241
|
-
执行完成后展示:
|
|
242
|
-
|
|
243
|
-
- 本次命令(ingest/sync/promote)与目标项目根。
|
|
244
|
-
- `upToDate` 及 `reasons`(sync)或新增/覆盖条目数(ingest/promote)。
|
|
245
|
-
- 当前 `active` / `candidate` / `stale` 数量统计。
|
|
246
|
-
- 产物路径(`index.json`、`index.sqlite`、`views/`、`reports/`)。
|
|
247
|
-
- `lifecycle` 摘要:`validatorsApplied`、`candidateAutoPromoted`、兼容整数
|
|
248
|
-
`pendingAgentJudge`,以及
|
|
249
|
-
`pendingAgentJudgeSummary.requiredDecisionCount/previewCount/quarantinedCount` 等。
|
|
250
|
-
- validator 摘要:`eligible/selected/applied/remaining/unavailable`,不得只报告本轮抽样数。
|
|
251
|
-
- **已处理报告**(auto + judge 后):promoted/dropped/superseded/kept/deferred/skipped 计数与 `reports/judge-decisions-*.json`、`judgements-*.json` 路径;人工判断还会追加到 `judgements/decisions.json`,后续 ingest 不得抹除。`defer` 必须带 `reviewAfter`,到期前不重复进入待判断清单。
|
|
252
|
-
- 仅当 `upToDate=false` 时建议 `sync --update`;查询历史 → `/harness-knowledge-query`。**禁止**默认列出「请人工确认 N 条 candidate」待办。
|
|
253
|
-
|
|
254
|
-
## 渐进披露
|
|
255
|
-
|
|
256
|
-
- **Read `reference.md`** 仅在执行命令或查阅 config.json 配置时 — 含 Commands 详细示例、config.json 配置与兼容说明。
|
|
257
67
|
|
|
258
|
-
##
|
|
68
|
+
## 生成内容语言约定
|
|
259
69
|
|
|
260
|
-
|
|
70
|
+
- sync/ingest 等生成的文档、规则、知识条目、架构说明一律**优先使用中文**撰写(标识符、命令、代码、API 字段名保持原文)
|
|
71
|
+
- 面向平台展示的标题/摘要/正文默认中文;仅当用户明确要求或目标系统强制时才用英文
|
|
72
|
+
> 片段:p0-trust · 只有服务端持久化与 ingest 收据可证明知识已入库
|
|
261
73
|
|
|
262
74
|
## 执行日志
|
|
263
75
|
|
|
@@ -272,4 +84,4 @@ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/cha
|
|
|
272
84
|
> **Task 4 §6.1 写入契约**:普通 `append` = 加锁 -> 追加一行 -> fsync -> 解锁,**不 load 历史、不渲染**(O(1),跨进程锁 `events.ndjson.lock`,UUID 用完整 `uuid4().hex` 无需去重扫描)。仅 `--type phase.end` append 在追加成功后渲染一次 `execution-log.md`;显式 `harness_events.py render` 随时从完整 events 重建;`harness_archive.py finalize` 在 collect 前强制 render 一次。高频 command append 期间 log 可能滞后,phase 边界保持最新。
|
|
273
85
|
|
|
274
86
|
每个阶段的 `phase.start` 与对应 `phase.end` 必须复用同一 `--run-id` / `--attempt`;阶段结束必须写 `--status OK|WARN|FAIL|BLOCKED`。重试同一阶段时生成新的 run-id 并增加 `--attempt <n>`,不得覆盖或伪装成一次执行。跨工具继续执行时写 `--executor-tool <codex|claude-code|codebuddy|cursor>`,并在接棒事件写 `--handoff-from-tool` / `--handoff-reason`;也可由 `HUNTER_HARNESS_TOOL/AGENT/MODEL/RUN_ID` 环境变量统一注入。
|
|
275
|
-
> 片段:logging · phase=`knowledge-ingest` ·
|
|
87
|
+
> 片段:logging · phase=`knowledge-ingest` · 记录 package hash、服务端状态与失败重试路径
|