@hunter-harness/workflow-harness 0.2.6 → 0.2.7
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/contracts/workflow-policy.json +169 -0
- package/harness/bundles/general/claude-code/harness-archive/SKILL.md +3 -1
- package/harness/bundles/general/claude-code/harness-codebase-map/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-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +3 -1
- package/harness/bundles/general/claude-code/harness-review/SKILL.md +3 -1
- package/harness/bundles/general/claude-code/harness-run/SKILL.md +9 -6
- package/harness/bundles/general/claude-code/harness-run/checklist.md +2 -2
- package/harness/bundles/general/claude-code/harness-run/reference.md +5 -2
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +7 -5
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-test/SKILL.md +8 -2
- package/harness/bundles/general/claude-code/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/claude-code/scripts/harness_archive.py +41 -16
- package/harness/bundles/general/claude-code/scripts/harness_change.py +854 -0
- package/harness/bundles/general/claude-code/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/claude-code/scripts/harness_service.py +34 -1
- package/harness/bundles/general/claude-code/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/claude-code/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +169 -0
- package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +3 -1
- package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +3 -1
- package/harness/bundles/general/codebuddy/harness-review/SKILL.md +3 -1
- package/harness/bundles/general/codebuddy/harness-run/SKILL.md +9 -6
- package/harness/bundles/general/codebuddy/harness-run/checklist.md +2 -2
- package/harness/bundles/general/codebuddy/harness-run/reference.md +5 -2
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +7 -5
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-test/SKILL.md +8 -2
- package/harness/bundles/general/codebuddy/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/codebuddy/scripts/harness_archive.py +41 -16
- package/harness/bundles/general/codebuddy/scripts/harness_change.py +854 -0
- package/harness/bundles/general/codebuddy/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/codebuddy/scripts/harness_service.py +34 -1
- package/harness/bundles/general/codebuddy/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/codebuddy/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- package/harness/bundles/general/codex/contracts/workflow-policy.json +169 -0
- package/harness/bundles/general/codex/harness-archive/SKILL.md +3 -1
- package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/general/codex/harness-plan/SKILL.md +3 -1
- package/harness/bundles/general/codex/harness-review/SKILL.md +3 -1
- package/harness/bundles/general/codex/harness-run/SKILL.md +9 -6
- package/harness/bundles/general/codex/harness-run/checklist.md +2 -2
- package/harness/bundles/general/codex/harness-run/reference.md +5 -2
- package/harness/bundles/general/codex/harness-submit/SKILL.md +7 -5
- package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-test/SKILL.md +8 -2
- package/harness/bundles/general/codex/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/codex/scripts/harness_archive.py +41 -16
- package/harness/bundles/general/codex/scripts/harness_change.py +854 -0
- package/harness/bundles/general/codex/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/codex/scripts/harness_service.py +34 -1
- package/harness/bundles/general/codex/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/codex/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- package/harness/bundles/general/cursor/contracts/workflow-policy.json +169 -0
- package/harness/bundles/general/cursor/harness-archive/SKILL.md +3 -1
- package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/general/cursor/harness-plan/SKILL.md +3 -1
- package/harness/bundles/general/cursor/harness-review/SKILL.md +3 -1
- package/harness/bundles/general/cursor/harness-run/SKILL.md +9 -6
- package/harness/bundles/general/cursor/harness-run/checklist.md +2 -2
- package/harness/bundles/general/cursor/harness-run/reference.md +5 -2
- package/harness/bundles/general/cursor/harness-submit/SKILL.md +7 -5
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-test/SKILL.md +8 -2
- package/harness/bundles/general/cursor/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/general/cursor/scripts/harness_archive.py +41 -16
- package/harness/bundles/general/cursor/scripts/harness_change.py +854 -0
- package/harness/bundles/general/cursor/scripts/harness_gate.py +1038 -0
- package/harness/bundles/general/cursor/scripts/harness_service.py +34 -1
- package/harness/bundles/general/cursor/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/general/cursor/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/claude-code/.harness-build.json +1 -1
- package/harness/bundles/java/claude-code/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +7 -1
- package/harness/bundles/java/claude-code/harness-archive/SKILL.md +3 -1
- package/harness/bundles/java/claude-code/harness-codebase-map/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-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/java/claude-code/harness-package/SKILL.md +6 -3
- package/harness/bundles/java/claude-code/harness-plan/SKILL.md +3 -1
- package/harness/bundles/java/claude-code/harness-review/SKILL.md +3 -1
- package/harness/bundles/java/claude-code/harness-run/SKILL.md +9 -6
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +7 -5
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-test/SKILL.md +8 -2
- package/harness/bundles/java/claude-code/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/claude-code/scripts/harness_archive.py +41 -16
- package/harness/bundles/java/claude-code/scripts/harness_change.py +854 -0
- package/harness/bundles/java/claude-code/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/claude-code/scripts/harness_service.py +34 -1
- package/harness/bundles/java/claude-code/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/claude-code/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +7 -1
- package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +3 -1
- package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/java/codebuddy/harness-package/SKILL.md +6 -3
- package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +3 -1
- package/harness/bundles/java/codebuddy/harness-review/SKILL.md +3 -1
- package/harness/bundles/java/codebuddy/harness-run/SKILL.md +9 -6
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +7 -5
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-test/SKILL.md +8 -2
- package/harness/bundles/java/codebuddy/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/codebuddy/scripts/harness_archive.py +41 -16
- package/harness/bundles/java/codebuddy/scripts/harness_change.py +854 -0
- package/harness/bundles/java/codebuddy/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/codebuddy/scripts/harness_service.py +34 -1
- package/harness/bundles/java/codebuddy/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/codebuddy/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/codex/.harness-build.json +1 -1
- package/harness/bundles/java/codex/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/codex/harness-apidoc/SKILL.md +7 -1
- package/harness/bundles/java/codex/harness-archive/SKILL.md +3 -1
- package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/java/codex/harness-package/SKILL.md +6 -3
- package/harness/bundles/java/codex/harness-plan/SKILL.md +3 -1
- package/harness/bundles/java/codex/harness-review/SKILL.md +3 -1
- package/harness/bundles/java/codex/harness-run/SKILL.md +9 -6
- package/harness/bundles/java/codex/harness-submit/SKILL.md +7 -5
- package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-test/SKILL.md +8 -2
- package/harness/bundles/java/codex/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/codex/scripts/harness_archive.py +41 -16
- package/harness/bundles/java/codex/scripts/harness_change.py +854 -0
- package/harness/bundles/java/codex/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/codex/scripts/harness_service.py +34 -1
- package/harness/bundles/java/codex/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/codex/scripts/harness_workflow_policy.py +160 -0
- package/harness/bundles/java/cursor/.harness-build.json +1 -1
- package/harness/bundles/java/cursor/contracts/workflow-policy.json +169 -0
- package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +7 -1
- package/harness/bundles/java/cursor/harness-archive/SKILL.md +3 -1
- package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +26 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge_mcp.py +2 -0
- package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +3 -1
- package/harness/bundles/java/cursor/harness-package/SKILL.md +6 -3
- package/harness/bundles/java/cursor/harness-plan/SKILL.md +3 -1
- package/harness/bundles/java/cursor/harness-review/SKILL.md +3 -1
- package/harness/bundles/java/cursor/harness-run/SKILL.md +9 -6
- package/harness/bundles/java/cursor/harness-submit/SKILL.md +7 -5
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-test/SKILL.md +8 -2
- package/harness/bundles/java/cursor/scripts/harness_apidoc.py +53 -0
- package/harness/bundles/java/cursor/scripts/harness_archive.py +41 -16
- package/harness/bundles/java/cursor/scripts/harness_change.py +854 -0
- package/harness/bundles/java/cursor/scripts/harness_gate.py +1038 -0
- package/harness/bundles/java/cursor/scripts/harness_service.py +34 -1
- package/harness/bundles/java/cursor/scripts/harness_test_guard.py +210 -14
- package/harness/bundles/java/cursor/scripts/harness_workflow_policy.py +160 -0
- package/harness/manifests/general/claude-code.json +39 -19
- package/harness/manifests/general/codebuddy.json +39 -19
- package/harness/manifests/general/codex.json +39 -19
- package/harness/manifests/general/cursor.json +39 -19
- package/harness/manifests/java/claude-code.json +39 -19
- package/harness/manifests/java/codebuddy.json +39 -19
- package/harness/manifests/java/codex.json +39 -19
- package/harness/manifests/java/cursor.json +39 -19
- package/hunter-workflow-family.json +2 -2
- package/package.json +1 -1
|
@@ -359,6 +359,28 @@ def find_review_reports(change_dir: Path) -> list[Path]:
|
|
|
359
359
|
return found
|
|
360
360
|
|
|
361
361
|
|
|
362
|
+
def review_phase_completed(events: list[dict[str, Any]]) -> bool:
|
|
363
|
+
"""True only when structured events record a review phase.end (UT-042)."""
|
|
364
|
+
for event in events:
|
|
365
|
+
if event.get("type") != "phase.end":
|
|
366
|
+
continue
|
|
367
|
+
if str(event.get("phase") or "").lower() == "review":
|
|
368
|
+
return True
|
|
369
|
+
return False
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
def review_evidence_present(
|
|
373
|
+
change_dir: Path,
|
|
374
|
+
events: list[dict[str, Any]] | None = None,
|
|
375
|
+
) -> bool:
|
|
376
|
+
"""Review ran only when report files or review phase.end events exist."""
|
|
377
|
+
if find_review_reports(change_dir):
|
|
378
|
+
return True
|
|
379
|
+
if events is None:
|
|
380
|
+
events = he.load_events(change_dir / "events.ndjson")
|
|
381
|
+
return review_phase_completed(events)
|
|
382
|
+
|
|
383
|
+
|
|
362
384
|
def git_run(project: Path, *args: str) -> tuple[int, str, str]:
|
|
363
385
|
try:
|
|
364
386
|
proc = subprocess.run(
|
|
@@ -531,10 +553,9 @@ def check_status(change_dir: Path) -> dict[str, Any]:
|
|
|
531
553
|
# --- test / review reports ---
|
|
532
554
|
test_reports = find_test_reports(change_dir)
|
|
533
555
|
review_reports = find_review_reports(change_dir)
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
)
|
|
556
|
+
events_path = change_dir / "events.ndjson"
|
|
557
|
+
events = he.load_events(events_path) if events_path.is_file() else []
|
|
558
|
+
review_ran = review_evidence_present(change_dir, events)
|
|
538
559
|
|
|
539
560
|
checks["test_reports"] = [str(p.relative_to(change_dir)) for p in test_reports]
|
|
540
561
|
checks["review_reports"] = [str(p.relative_to(change_dir)) for p in review_reports]
|
|
@@ -555,13 +576,13 @@ def check_status(change_dir: Path) -> dict[str, Any]:
|
|
|
555
576
|
|
|
556
577
|
if review_reports:
|
|
557
578
|
checks["review_report_status"] = "present"
|
|
558
|
-
elif
|
|
579
|
+
elif review_phase_completed(events):
|
|
559
580
|
checks["review_report_status"] = "ran-but-not-persisted"
|
|
560
581
|
warnings.append(
|
|
561
582
|
{
|
|
562
583
|
"code": "review-not-persisted",
|
|
563
584
|
"message": (
|
|
564
|
-
"
|
|
585
|
+
"review phase.end recorded but no review-report file; "
|
|
565
586
|
"prefer persisting report before archive"
|
|
566
587
|
),
|
|
567
588
|
}
|
|
@@ -972,10 +993,8 @@ def _stage_status_from_sources(
|
|
|
972
993
|
if unit.get("source") == "not-run" and unit.get("run", 0) == 0:
|
|
973
994
|
status["test"] = "NOT_RUN"
|
|
974
995
|
|
|
975
|
-
if not
|
|
976
|
-
|
|
977
|
-
if not re.search(r"harness-review|##\s*review", log_text, re.IGNORECASE):
|
|
978
|
-
status["review"] = "ADVISORY"
|
|
996
|
+
if not review_evidence_present(change_dir, events):
|
|
997
|
+
status["review"] = "ADVISORY"
|
|
979
998
|
|
|
980
999
|
return status
|
|
981
1000
|
|
|
@@ -1057,7 +1076,11 @@ def _changed_files_from_git(
|
|
|
1057
1076
|
return diff_stat, changed
|
|
1058
1077
|
|
|
1059
1078
|
|
|
1060
|
-
def _review_summary(
|
|
1079
|
+
def _review_summary(
|
|
1080
|
+
change_dir: Path,
|
|
1081
|
+
existing: dict[str, Any] | None,
|
|
1082
|
+
events: list[dict[str, Any]] | None = None,
|
|
1083
|
+
) -> dict[str, Any]:
|
|
1061
1084
|
base = {
|
|
1062
1085
|
"status": "ADVISORY",
|
|
1063
1086
|
"red": 0,
|
|
@@ -1072,10 +1095,8 @@ def _review_summary(change_dir: Path, existing: dict[str, Any] | None) -> dict[s
|
|
|
1072
1095
|
merged = dict(base)
|
|
1073
1096
|
merged.update(existing["reviewSummary"])
|
|
1074
1097
|
return merged
|
|
1075
|
-
if not
|
|
1076
|
-
|
|
1077
|
-
if not re.search(r"harness-review|##\s*review", log_text, re.IGNORECASE):
|
|
1078
|
-
base["status"] = "ADVISORY_NOT_RUN"
|
|
1098
|
+
if not review_evidence_present(change_dir, events):
|
|
1099
|
+
base["status"] = "ADVISORY_NOT_RUN"
|
|
1079
1100
|
return base
|
|
1080
1101
|
|
|
1081
1102
|
|
|
@@ -1363,7 +1384,11 @@ def collect_summary_data(
|
|
|
1363
1384
|
if not for_replay:
|
|
1364
1385
|
data["artifacts"] = _artifacts_from_events(events)
|
|
1365
1386
|
|
|
1366
|
-
data["reviewSummary"] = _review_summary(
|
|
1387
|
+
data["reviewSummary"] = _review_summary(
|
|
1388
|
+
change_dir,
|
|
1389
|
+
existing if for_replay else None,
|
|
1390
|
+
events,
|
|
1391
|
+
)
|
|
1367
1392
|
if not for_replay:
|
|
1368
1393
|
data["timeline"] = _timeline_from_events(event_summary, events)
|
|
1369
1394
|
else:
|