@hunter-harness/workflow-harness 0.2.17 → 0.2.19
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 +7 -1
- package/harness/bundles/general/claude-code/harness-archive/checklist.md +6 -0
- 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-query/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-plan/reference.md +5 -5
- package/harness/bundles/general/claude-code/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-review/checklist.md +1 -1
- package/harness/bundles/general/claude-code/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-run/checklist.md +1 -1
- package/harness/bundles/general/claude-code/harness-run/reference.md +1 -1
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +11 -2
- package/harness/bundles/general/claude-code/harness-submit/checklist.md +24 -8
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/protocols/report-pipeline-protocol.md +2 -0
- package/harness/bundles/general/claude-code/scripts/harness_archive.py +199 -30
- package/harness/bundles/general/claude-code/scripts/harness_events.py +5 -18
- package/harness/bundles/general/claude-code/scripts/harness_integration.py +153 -0
- package/harness/bundles/general/claude-code/scripts/harness_ledger.py +15 -2
- package/harness/bundles/general/claude-code/scripts/harness_paths.py +170 -1
- package/harness/bundles/general/claude-code/scripts/harness_profile.py +1 -0
- package/harness/bundles/general/claude-code/scripts/harness_runtime.py +4 -4
- package/harness/bundles/general/claude-code/scripts/harness_service.py +1 -0
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +7 -1
- package/harness/bundles/general/codebuddy/harness-archive/checklist.md +6 -0
- 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-query/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-plan/reference.md +5 -5
- package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-review/checklist.md +1 -1
- package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-run/checklist.md +1 -1
- package/harness/bundles/general/codebuddy/harness-run/reference.md +1 -1
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +11 -2
- package/harness/bundles/general/codebuddy/harness-submit/checklist.md +24 -8
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/protocols/report-pipeline-protocol.md +2 -0
- package/harness/bundles/general/codebuddy/scripts/harness_archive.py +199 -30
- package/harness/bundles/general/codebuddy/scripts/harness_events.py +5 -18
- package/harness/bundles/general/codebuddy/scripts/harness_integration.py +153 -0
- package/harness/bundles/general/codebuddy/scripts/harness_ledger.py +15 -2
- package/harness/bundles/general/codebuddy/scripts/harness_paths.py +170 -1
- package/harness/bundles/general/codebuddy/scripts/harness_profile.py +1 -0
- package/harness/bundles/general/codebuddy/scripts/harness_runtime.py +4 -4
- package/harness/bundles/general/codebuddy/scripts/harness_service.py +1 -0
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- package/harness/bundles/general/codex/harness-archive/SKILL.md +7 -1
- package/harness/bundles/general/codex/harness-archive/checklist.md +6 -0
- 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-query/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-plan/reference.md +5 -5
- package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-review/checklist.md +1 -1
- package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-run/checklist.md +1 -1
- package/harness/bundles/general/codex/harness-run/reference.md +1 -1
- package/harness/bundles/general/codex/harness-submit/SKILL.md +11 -2
- package/harness/bundles/general/codex/harness-submit/checklist.md +24 -8
- package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/codex/protocols/report-pipeline-protocol.md +2 -0
- package/harness/bundles/general/codex/scripts/harness_archive.py +199 -30
- package/harness/bundles/general/codex/scripts/harness_events.py +5 -18
- package/harness/bundles/general/codex/scripts/harness_integration.py +153 -0
- package/harness/bundles/general/codex/scripts/harness_ledger.py +15 -2
- package/harness/bundles/general/codex/scripts/harness_paths.py +170 -1
- package/harness/bundles/general/codex/scripts/harness_profile.py +1 -0
- package/harness/bundles/general/codex/scripts/harness_runtime.py +4 -4
- package/harness/bundles/general/codex/scripts/harness_service.py +1 -0
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- package/harness/bundles/general/cursor/harness-archive/SKILL.md +7 -1
- package/harness/bundles/general/cursor/harness-archive/checklist.md +6 -0
- 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-query/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-plan/reference.md +5 -5
- package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-review/checklist.md +1 -1
- package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-run/checklist.md +1 -1
- package/harness/bundles/general/cursor/harness-run/reference.md +1 -1
- package/harness/bundles/general/cursor/harness-submit/SKILL.md +11 -2
- package/harness/bundles/general/cursor/harness-submit/checklist.md +24 -8
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-test/SKILL.md +1 -1
- package/harness/bundles/general/cursor/protocols/report-pipeline-protocol.md +2 -0
- package/harness/bundles/general/cursor/scripts/harness_archive.py +199 -30
- package/harness/bundles/general/cursor/scripts/harness_events.py +5 -18
- package/harness/bundles/general/cursor/scripts/harness_integration.py +153 -0
- package/harness/bundles/general/cursor/scripts/harness_ledger.py +15 -2
- package/harness/bundles/general/cursor/scripts/harness_paths.py +170 -1
- package/harness/bundles/general/cursor/scripts/harness_profile.py +1 -0
- package/harness/bundles/general/cursor/scripts/harness_runtime.py +4 -4
- package/harness/bundles/general/cursor/scripts/harness_service.py +1 -0
- 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 +7 -1
- package/harness/bundles/java/claude-code/harness-archive/checklist.md +6 -0
- 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-query/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-package/checklist.md +1 -1
- package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-plan/reference.md +5 -5
- package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-review/checklist.md +1 -1
- package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-run/checklist.md +2 -2
- package/harness/bundles/java/claude-code/harness-run/reference.md +352 -352
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +11 -2
- package/harness/bundles/java/claude-code/harness-submit/checklist.md +24 -8
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/protocols/report-pipeline-protocol.md +2 -0
- package/harness/bundles/java/claude-code/scripts/harness_archive.py +199 -30
- package/harness/bundles/java/claude-code/scripts/harness_events.py +5 -18
- package/harness/bundles/java/claude-code/scripts/harness_integration.py +153 -0
- package/harness/bundles/java/claude-code/scripts/harness_ledger.py +15 -2
- package/harness/bundles/java/claude-code/scripts/harness_paths.py +170 -1
- package/harness/bundles/java/claude-code/scripts/harness_profile.py +1 -0
- package/harness/bundles/java/claude-code/scripts/harness_runtime.py +4 -4
- package/harness/bundles/java/claude-code/scripts/harness_service.py +1 -0
- 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 +7 -1
- package/harness/bundles/java/codebuddy/harness-archive/checklist.md +6 -0
- 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-query/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-package/checklist.md +1 -1
- package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-plan/reference.md +5 -5
- package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-review/checklist.md +1 -1
- package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-run/checklist.md +2 -2
- package/harness/bundles/java/codebuddy/harness-run/reference.md +352 -352
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +11 -2
- package/harness/bundles/java/codebuddy/harness-submit/checklist.md +24 -8
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/protocols/report-pipeline-protocol.md +2 -0
- package/harness/bundles/java/codebuddy/scripts/harness_archive.py +199 -30
- package/harness/bundles/java/codebuddy/scripts/harness_events.py +5 -18
- package/harness/bundles/java/codebuddy/scripts/harness_integration.py +153 -0
- package/harness/bundles/java/codebuddy/scripts/harness_ledger.py +15 -2
- package/harness/bundles/java/codebuddy/scripts/harness_paths.py +170 -1
- package/harness/bundles/java/codebuddy/scripts/harness_profile.py +1 -0
- package/harness/bundles/java/codebuddy/scripts/harness_runtime.py +4 -4
- package/harness/bundles/java/codebuddy/scripts/harness_service.py +1 -0
- 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 +7 -1
- package/harness/bundles/java/codex/harness-archive/checklist.md +6 -0
- 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-query/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-package/checklist.md +1 -1
- package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-plan/reference.md +5 -5
- package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-review/checklist.md +1 -1
- package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-run/checklist.md +2 -2
- package/harness/bundles/java/codex/harness-run/reference.md +352 -352
- package/harness/bundles/java/codex/harness-submit/SKILL.md +11 -2
- package/harness/bundles/java/codex/harness-submit/checklist.md +24 -8
- package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/codex/protocols/report-pipeline-protocol.md +2 -0
- package/harness/bundles/java/codex/scripts/harness_archive.py +199 -30
- package/harness/bundles/java/codex/scripts/harness_events.py +5 -18
- package/harness/bundles/java/codex/scripts/harness_integration.py +153 -0
- package/harness/bundles/java/codex/scripts/harness_ledger.py +15 -2
- package/harness/bundles/java/codex/scripts/harness_paths.py +170 -1
- package/harness/bundles/java/codex/scripts/harness_profile.py +1 -0
- package/harness/bundles/java/codex/scripts/harness_runtime.py +4 -4
- package/harness/bundles/java/codex/scripts/harness_service.py +1 -0
- 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 +7 -1
- package/harness/bundles/java/cursor/harness-archive/checklist.md +6 -0
- 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-query/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-package/checklist.md +1 -1
- package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-plan/reference.md +5 -5
- package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-review/checklist.md +1 -1
- package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-run/checklist.md +2 -2
- package/harness/bundles/java/cursor/harness-run/reference.md +352 -352
- package/harness/bundles/java/cursor/harness-submit/SKILL.md +11 -2
- package/harness/bundles/java/cursor/harness-submit/checklist.md +24 -8
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-test/SKILL.md +1 -1
- package/harness/bundles/java/cursor/protocols/report-pipeline-protocol.md +2 -0
- package/harness/bundles/java/cursor/scripts/harness_archive.py +199 -30
- package/harness/bundles/java/cursor/scripts/harness_events.py +5 -18
- package/harness/bundles/java/cursor/scripts/harness_integration.py +153 -0
- package/harness/bundles/java/cursor/scripts/harness_ledger.py +15 -2
- package/harness/bundles/java/cursor/scripts/harness_paths.py +170 -1
- package/harness/bundles/java/cursor/scripts/harness_profile.py +1 -0
- package/harness/bundles/java/cursor/scripts/harness_runtime.py +4 -4
- package/harness/bundles/java/cursor/scripts/harness_service.py +1 -0
- package/harness/manifests/general/claude-code.json +26 -26
- package/harness/manifests/general/codebuddy.json +26 -26
- package/harness/manifests/general/codex.json +26 -26
- package/harness/manifests/general/cursor.json +26 -26
- package/harness/manifests/java/claude-code.json +29 -29
- package/harness/manifests/java/codebuddy.json +29 -29
- package/harness/manifests/java/codex.json +29 -29
- package/harness/manifests/java/cursor.json +29 -29
- package/hunter-workflow-family.json +1 -1
- package/package.json +1 -1
|
@@ -109,6 +109,10 @@ class CleanupResidualError(IntegrationError):
|
|
|
109
109
|
)
|
|
110
110
|
|
|
111
111
|
|
|
112
|
+
class AbandonRefusedError(IntegrationError):
|
|
113
|
+
code = "ABANDON_REFUSED"
|
|
114
|
+
|
|
115
|
+
|
|
112
116
|
class JournalConflictError(IntegrationError):
|
|
113
117
|
code = "JOURNAL_CONFLICT"
|
|
114
118
|
|
|
@@ -740,6 +744,8 @@ class IntegrationTransaction:
|
|
|
740
744
|
str(intg_root),
|
|
741
745
|
self.temp_branch,
|
|
742
746
|
)
|
|
747
|
+
# H-5: LF-stable hashing in the integration worktree.
|
|
748
|
+
self.runner.run(intg_root, "config", "core.autocrlf", "false")
|
|
743
749
|
|
|
744
750
|
return self._run_step("prepare", action)
|
|
745
751
|
|
|
@@ -1195,6 +1201,148 @@ class IntegrationTransaction:
|
|
|
1195
1201
|
harness_change.integration_lock_release(self.project_root, run_id=self.run_id)
|
|
1196
1202
|
return journal
|
|
1197
1203
|
|
|
1204
|
+
# ------------------------------------------------------------ abandon
|
|
1205
|
+
|
|
1206
|
+
def _remote_contains_merge(self, journal: dict[str, Any]) -> bool:
|
|
1207
|
+
merge_commit = str(journal.get("mergeCommit") or "")
|
|
1208
|
+
if not merge_commit:
|
|
1209
|
+
return False
|
|
1210
|
+
remote_line = self.runner.text(
|
|
1211
|
+
self.project_root, "ls-remote", "origin", self.target_branch
|
|
1212
|
+
)
|
|
1213
|
+
observed_remote = (
|
|
1214
|
+
remote_line.split()[0] if remote_line and remote_line.split() else ""
|
|
1215
|
+
)
|
|
1216
|
+
return bool(observed_remote and observed_remote == merge_commit)
|
|
1217
|
+
|
|
1218
|
+
def _force_remove_integration_root(
|
|
1219
|
+
self, journal: dict[str, Any], intg_root: Path
|
|
1220
|
+
) -> dict[str, Any]:
|
|
1221
|
+
"""Best-effort remove of the integration worktree for abandon only."""
|
|
1222
|
+
allowed = Path(str(journal.get("allowedCleanupRoot") or "")).resolve()
|
|
1223
|
+
resolved = harness_paths.assert_path_within(intg_root, self.temp_root)
|
|
1224
|
+
if not allowed or resolved != allowed:
|
|
1225
|
+
raise CleanupRefusedError(
|
|
1226
|
+
f"refusing to abandon non-transaction path: {resolved}"
|
|
1227
|
+
)
|
|
1228
|
+
self.runner.run(
|
|
1229
|
+
self.project_root,
|
|
1230
|
+
"worktree",
|
|
1231
|
+
"remove",
|
|
1232
|
+
"--force",
|
|
1233
|
+
str(resolved),
|
|
1234
|
+
check=False,
|
|
1235
|
+
)
|
|
1236
|
+
residual: list[str] = []
|
|
1237
|
+
if resolved.exists():
|
|
1238
|
+
for name in HEAVY_WORKTREE_ROOTS:
|
|
1239
|
+
heavy = resolved / name
|
|
1240
|
+
if heavy.exists():
|
|
1241
|
+
harness_paths.assert_path_within(heavy, resolved)
|
|
1242
|
+
try:
|
|
1243
|
+
if heavy.is_dir() and not heavy.is_symlink():
|
|
1244
|
+
shutil.rmtree(heavy)
|
|
1245
|
+
else:
|
|
1246
|
+
heavy.unlink()
|
|
1247
|
+
except OSError:
|
|
1248
|
+
residual.append(name)
|
|
1249
|
+
if resolved.exists():
|
|
1250
|
+
try:
|
|
1251
|
+
shutil.rmtree(resolved)
|
|
1252
|
+
except OSError:
|
|
1253
|
+
residual.append(str(resolved))
|
|
1254
|
+
listed = self.runner.text(self.project_root, "worktree", "list", "--porcelain")
|
|
1255
|
+
still_registered = str(resolved) in {
|
|
1256
|
+
str(Path(line.removeprefix("worktree ")).resolve())
|
|
1257
|
+
for line in (listed or "").splitlines()
|
|
1258
|
+
if line.startswith("worktree ")
|
|
1259
|
+
}
|
|
1260
|
+
ok = not still_registered and not residual and not resolved.exists()
|
|
1261
|
+
return {
|
|
1262
|
+
"ok": ok,
|
|
1263
|
+
"code": "CLEANUP_COMPLETE" if ok else "CLEANUP_RESIDUAL",
|
|
1264
|
+
"target": str(resolved),
|
|
1265
|
+
"worktreeRegistered": still_registered,
|
|
1266
|
+
"diskPathPresent": resolved.exists(),
|
|
1267
|
+
"residualPaths": residual,
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
def abandon(self) -> dict[str, Any]:
|
|
1271
|
+
"""Official recovery for a failed integration transaction (H-6).
|
|
1272
|
+
|
|
1273
|
+
Allowed only when push is not DONE and the remote does not already
|
|
1274
|
+
contain ``mergeCommit``. Removes the integration worktree, temp branch,
|
|
1275
|
+
protection refs, and integration lock. Never deletes the feature
|
|
1276
|
+
worktree or feature branch.
|
|
1277
|
+
"""
|
|
1278
|
+
try:
|
|
1279
|
+
journal = self._load()
|
|
1280
|
+
except FileNotFoundError as exc:
|
|
1281
|
+
raise AbandonRefusedError(
|
|
1282
|
+
f"no journal for transaction {self.transaction_id}"
|
|
1283
|
+
) from exc
|
|
1284
|
+
|
|
1285
|
+
push_status = str(self._step(journal, "push").get("status") or "")
|
|
1286
|
+
push_intent = journal.get("pushIntent") or {}
|
|
1287
|
+
push_confirmed = (
|
|
1288
|
+
push_status == "DONE"
|
|
1289
|
+
or (
|
|
1290
|
+
isinstance(push_intent, dict)
|
|
1291
|
+
and push_intent.get("status") == "REMOTE_CONFIRMED"
|
|
1292
|
+
)
|
|
1293
|
+
or bool(journal.get("pushedHead"))
|
|
1294
|
+
or bool(journal.get("mergeFinalHash"))
|
|
1295
|
+
)
|
|
1296
|
+
remote_has_merge = self._remote_contains_merge(journal)
|
|
1297
|
+
if push_confirmed or remote_has_merge:
|
|
1298
|
+
raise AbandonRefusedError(
|
|
1299
|
+
"refuse abandon: push succeeded or remote already contains "
|
|
1300
|
+
"the merge commit; use cleanup instead"
|
|
1301
|
+
)
|
|
1302
|
+
|
|
1303
|
+
intg_root = Path(str(journal.get("integrationRoot") or ""))
|
|
1304
|
+
cleanup_result: dict[str, Any] = {
|
|
1305
|
+
"ok": True,
|
|
1306
|
+
"code": "ALREADY_ABSENT",
|
|
1307
|
+
"target": str(intg_root) if intg_root else "",
|
|
1308
|
+
"worktreeRegistered": False,
|
|
1309
|
+
"diskPathPresent": False,
|
|
1310
|
+
"residualPaths": [],
|
|
1311
|
+
}
|
|
1312
|
+
prepare_done = self._step(journal, "prepare").get("status") == "DONE"
|
|
1313
|
+
if prepare_done and str(journal.get("integrationRoot") or "").strip():
|
|
1314
|
+
try:
|
|
1315
|
+
cleanup_result = self.cleanup_target(intg_root)
|
|
1316
|
+
except CleanupRefusedError:
|
|
1317
|
+
cleanup_result = self._force_remove_integration_root(journal, intg_root)
|
|
1318
|
+
|
|
1319
|
+
self.runner.run(
|
|
1320
|
+
self.project_root, "branch", "-D", self.temp_branch, check=False
|
|
1321
|
+
)
|
|
1322
|
+
refs = journal.get("protectionRefs") or {}
|
|
1323
|
+
if isinstance(refs, dict):
|
|
1324
|
+
for ref in (refs.get("base"), refs.get("head")):
|
|
1325
|
+
if ref:
|
|
1326
|
+
self.runner.run(
|
|
1327
|
+
self.project_root, "update-ref", "-d", str(ref), check=False
|
|
1328
|
+
)
|
|
1329
|
+
|
|
1330
|
+
harness_change.integration_lock_release(self.project_root, run_id=self.run_id)
|
|
1331
|
+
|
|
1332
|
+
journal = self._load()
|
|
1333
|
+
journal["abandonedAt"] = now_iso()
|
|
1334
|
+
journal["abandonResult"] = cleanup_result
|
|
1335
|
+
self._save(journal)
|
|
1336
|
+
|
|
1337
|
+
return {
|
|
1338
|
+
"ok": True,
|
|
1339
|
+
"code": "ABANDON_COMPLETE",
|
|
1340
|
+
"transactionId": self.transaction_id,
|
|
1341
|
+
"cleanup": cleanup_result,
|
|
1342
|
+
"featureBranchRetained": True,
|
|
1343
|
+
"featureWorktreeRetained": True,
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1198
1346
|
# ------------------------------------------------------------ recover
|
|
1199
1347
|
|
|
1200
1348
|
def recover(
|
|
@@ -1282,6 +1430,10 @@ def cmd_cleanup(args: argparse.Namespace) -> int:
|
|
|
1282
1430
|
return _emit(_txn_from_args(args).cleanup())
|
|
1283
1431
|
|
|
1284
1432
|
|
|
1433
|
+
def cmd_abandon(args: argparse.Namespace) -> int:
|
|
1434
|
+
return _emit(_txn_from_args(args).abandon())
|
|
1435
|
+
|
|
1436
|
+
|
|
1285
1437
|
def cmd_recover(args: argparse.Namespace) -> int:
|
|
1286
1438
|
return _emit(_txn_from_args(args).recover())
|
|
1287
1439
|
|
|
@@ -1333,6 +1485,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
1333
1485
|
add("merge", cmd_merge)
|
|
1334
1486
|
add("push", cmd_push)
|
|
1335
1487
|
add("cleanup", cmd_cleanup)
|
|
1488
|
+
add("abandon", cmd_abandon)
|
|
1336
1489
|
add("recover", cmd_recover)
|
|
1337
1490
|
add("status", cmd_status)
|
|
1338
1491
|
|
|
@@ -131,8 +131,19 @@ def emit_compact_or_verbose(
|
|
|
131
131
|
emit_json(out, as_json=as_json)
|
|
132
132
|
|
|
133
133
|
|
|
134
|
-
def emit_error(
|
|
135
|
-
|
|
134
|
+
def emit_error(
|
|
135
|
+
message: str,
|
|
136
|
+
*,
|
|
137
|
+
as_json: bool,
|
|
138
|
+
code: int = 1,
|
|
139
|
+
error_code: str | None = None,
|
|
140
|
+
extra: dict[str, Any] | None = None,
|
|
141
|
+
) -> int:
|
|
142
|
+
payload: dict[str, Any] = {"ok": False, "error": message}
|
|
143
|
+
if error_code:
|
|
144
|
+
payload["code"] = error_code
|
|
145
|
+
if extra:
|
|
146
|
+
payload.update(extra)
|
|
136
147
|
if as_json:
|
|
137
148
|
sys.stderr.write(json.dumps(payload, ensure_ascii=False) + "\n")
|
|
138
149
|
else:
|
|
@@ -1520,6 +1531,8 @@ def cmd_record(args: argparse.Namespace) -> int:
|
|
|
1520
1531
|
return emit_error(
|
|
1521
1532
|
"ledger identity incomplete: " + ", ".join(missing),
|
|
1522
1533
|
as_json=as_json,
|
|
1534
|
+
error_code="LEDGER_IDENTITY_INVALID",
|
|
1535
|
+
extra={"missing": missing},
|
|
1523
1536
|
)
|
|
1524
1537
|
write_ledger(out_path, ledger)
|
|
1525
1538
|
except (OSError, ValueError, FileNotFoundError, json.JSONDecodeError) as exc:
|
|
@@ -20,7 +20,7 @@ import re
|
|
|
20
20
|
import subprocess
|
|
21
21
|
import sys
|
|
22
22
|
from pathlib import Path
|
|
23
|
-
from typing import Any
|
|
23
|
+
from typing import Any, Sequence
|
|
24
24
|
|
|
25
25
|
SCRIPTS_DIR = Path(__file__).resolve().parent
|
|
26
26
|
if str(SCRIPTS_DIR) not in sys.path:
|
|
@@ -289,6 +289,175 @@ def assert_path_within(
|
|
|
289
289
|
return resolved
|
|
290
290
|
|
|
291
291
|
|
|
292
|
+
class CleanupTopologyError(ValueError):
|
|
293
|
+
"""Raised when cleanup would delete or traverse into state/archive roots."""
|
|
294
|
+
|
|
295
|
+
code = "CLEANUP_TOPOLOGY_REFUSED"
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
# Skip descending into these when scanning for junction/symlink escapes.
|
|
299
|
+
# Matches integration HEAVY_WORKTREE_ROOTS plus .git (topology scan only).
|
|
300
|
+
CLEANUP_WALK_SKIP_DIRS = frozenset(
|
|
301
|
+
{
|
|
302
|
+
"node_modules",
|
|
303
|
+
".venv",
|
|
304
|
+
"venv",
|
|
305
|
+
"build",
|
|
306
|
+
"dist",
|
|
307
|
+
"target",
|
|
308
|
+
".cache",
|
|
309
|
+
"__pycache__",
|
|
310
|
+
".git",
|
|
311
|
+
}
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def assert_cleanup_safe(
|
|
316
|
+
cleanup_root: Path,
|
|
317
|
+
state_roots: Sequence[Path] | None = None,
|
|
318
|
+
archive_roots: Sequence[Path] | None = None,
|
|
319
|
+
) -> Path:
|
|
320
|
+
"""Refuse cleanup when state/archive roots resolve inside the cleanup tree.
|
|
321
|
+
|
|
322
|
+
Also refuses when a junction/symlink under ``cleanup_root`` resolves into a
|
|
323
|
+
protected state/archive root (Windows junction / symlink escape).
|
|
324
|
+
"""
|
|
325
|
+
cleanup = Path(cleanup_root).resolve()
|
|
326
|
+
protected: list[Path] = []
|
|
327
|
+
for raw in [*(state_roots or ()), *(archive_roots or ())]:
|
|
328
|
+
try:
|
|
329
|
+
protected.append(Path(raw).resolve())
|
|
330
|
+
except OSError as exc:
|
|
331
|
+
raise CleanupTopologyError(
|
|
332
|
+
f"CLEANUP_TOPOLOGY_REFUSED: cannot resolve protected path {raw}: {exc}"
|
|
333
|
+
) from exc
|
|
334
|
+
|
|
335
|
+
for prot in protected:
|
|
336
|
+
if prot == cleanup or prot.is_relative_to(cleanup):
|
|
337
|
+
raise CleanupTopologyError(
|
|
338
|
+
"CLEANUP_TOPOLOGY_REFUSED: protected path "
|
|
339
|
+
f"{prot} is inside cleanup root {cleanup}"
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
if cleanup.is_dir():
|
|
343
|
+
for dirpath, dirnames, filenames in os.walk(cleanup, followlinks=False):
|
|
344
|
+
# Inspect this level (including heavy names) for link escapes, then
|
|
345
|
+
# prune descent so we do not walk install/cache trees.
|
|
346
|
+
entries = [*dirnames, *filenames]
|
|
347
|
+
dirnames[:] = [d for d in dirnames if d not in CLEANUP_WALK_SKIP_DIRS]
|
|
348
|
+
for name in entries:
|
|
349
|
+
child = Path(dirpath) / name
|
|
350
|
+
try:
|
|
351
|
+
is_link = child.is_symlink()
|
|
352
|
+
except OSError:
|
|
353
|
+
continue
|
|
354
|
+
# Junctions often report as directories; resolve and compare.
|
|
355
|
+
try:
|
|
356
|
+
resolved_child = child.resolve()
|
|
357
|
+
except OSError:
|
|
358
|
+
continue
|
|
359
|
+
escaped = not (
|
|
360
|
+
resolved_child == cleanup or resolved_child.is_relative_to(cleanup)
|
|
361
|
+
)
|
|
362
|
+
if not (is_link or escaped):
|
|
363
|
+
continue
|
|
364
|
+
for prot in protected:
|
|
365
|
+
if (
|
|
366
|
+
resolved_child == prot
|
|
367
|
+
or resolved_child.is_relative_to(prot)
|
|
368
|
+
or prot.is_relative_to(resolved_child)
|
|
369
|
+
):
|
|
370
|
+
raise CleanupTopologyError(
|
|
371
|
+
"CLEANUP_TOPOLOGY_REFUSED: cleanup path "
|
|
372
|
+
f"{child} resolves to protected {resolved_child}"
|
|
373
|
+
)
|
|
374
|
+
return cleanup
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
_FORMAL_SNAPSHOT_DIRS = ("plans", "spec", "evidence", "reports", "meta")
|
|
378
|
+
_FORMAL_SNAPSHOT_FILES = ("events.ndjson",)
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
def snapshot_change_formal_layer(
|
|
382
|
+
project_root: Path,
|
|
383
|
+
change_id: str,
|
|
384
|
+
*,
|
|
385
|
+
change_dir: Path | None = None,
|
|
386
|
+
) -> dict[str, Any]:
|
|
387
|
+
"""Copy change formal layer into ``.harness/cache/change-snapshots/<change>/``.
|
|
388
|
+
|
|
389
|
+
Destination is always under the main project / common harness root — never
|
|
390
|
+
under a feature worktree path alone.
|
|
391
|
+
"""
|
|
392
|
+
import shutil
|
|
393
|
+
|
|
394
|
+
project = resolve_main_project_root(Path(project_root))
|
|
395
|
+
src = Path(change_dir).resolve() if change_dir is not None else (
|
|
396
|
+
project / ".harness" / "changes" / change_id
|
|
397
|
+
).resolve()
|
|
398
|
+
if not src.is_dir():
|
|
399
|
+
raise FileNotFoundError(f"change dir not found for snapshot: {src}")
|
|
400
|
+
|
|
401
|
+
dest = (project / ".harness" / "cache" / "change-snapshots" / change_id).resolve()
|
|
402
|
+
# Hard guard: never write the snapshot inside the source tree itself.
|
|
403
|
+
if dest == src or dest.is_relative_to(src):
|
|
404
|
+
raise ValueError(
|
|
405
|
+
f"snapshot destination must not be inside change dir: {dest}"
|
|
406
|
+
)
|
|
407
|
+
dest.mkdir(parents=True, exist_ok=True)
|
|
408
|
+
|
|
409
|
+
copied: list[str] = []
|
|
410
|
+
for name in _FORMAL_SNAPSHOT_DIRS:
|
|
411
|
+
source_dir = src / name
|
|
412
|
+
if not source_dir.is_dir():
|
|
413
|
+
continue
|
|
414
|
+
target_dir = dest / name
|
|
415
|
+
shutil.copytree(source_dir, target_dir, dirs_exist_ok=True)
|
|
416
|
+
copied.append(name + "/")
|
|
417
|
+
for name in _FORMAL_SNAPSHOT_FILES:
|
|
418
|
+
source_file = src / name
|
|
419
|
+
if not source_file.is_file():
|
|
420
|
+
continue
|
|
421
|
+
shutil.copy2(source_file, dest / name)
|
|
422
|
+
copied.append(name)
|
|
423
|
+
|
|
424
|
+
file_hashes: dict[str, str] = {}
|
|
425
|
+
for path in sorted(dest.rglob("*")):
|
|
426
|
+
if not path.is_file():
|
|
427
|
+
continue
|
|
428
|
+
rel = path.relative_to(dest).as_posix()
|
|
429
|
+
if rel == "manifest.json":
|
|
430
|
+
continue
|
|
431
|
+
digest = hashlib.sha256(path.read_bytes()).hexdigest()
|
|
432
|
+
file_hashes[rel] = "sha256:" + digest
|
|
433
|
+
|
|
434
|
+
manifest = {
|
|
435
|
+
"schemaVersion": 1,
|
|
436
|
+
"changeId": change_id,
|
|
437
|
+
"source": str(src),
|
|
438
|
+
"destination": str(dest),
|
|
439
|
+
"projectRoot": str(project),
|
|
440
|
+
"copied": copied,
|
|
441
|
+
"files": file_hashes,
|
|
442
|
+
"fileCount": len(file_hashes),
|
|
443
|
+
}
|
|
444
|
+
manifest_path = dest / "manifest.json"
|
|
445
|
+
manifest_path.write_text(
|
|
446
|
+
json.dumps(manifest, ensure_ascii=False, indent=2) + "\n",
|
|
447
|
+
encoding="utf-8",
|
|
448
|
+
newline="\n",
|
|
449
|
+
)
|
|
450
|
+
return {
|
|
451
|
+
"ok": True,
|
|
452
|
+
"code": "CHANGE_SNAPSHOT_WRITTEN",
|
|
453
|
+
"changeId": change_id,
|
|
454
|
+
"destination": str(dest),
|
|
455
|
+
"fileCount": len(file_hashes),
|
|
456
|
+
"copied": copied,
|
|
457
|
+
"manifestPath": str(manifest_path),
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
|
|
292
461
|
def cmd_resolve_layout(args: argparse.Namespace) -> int:
|
|
293
462
|
layout = resolve_change_layout(Path.cwd(), args.change)
|
|
294
463
|
sys.stdout.write(json.dumps(layout, ensure_ascii=False, indent=2) + "\n")
|
|
@@ -23,10 +23,10 @@ if hasattr(sys.stderr, "reconfigure"):
|
|
|
23
23
|
SCHEMA_VERSION = 1
|
|
24
24
|
_CHANGE_ID = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$")
|
|
25
25
|
_ADAPTERS = {
|
|
26
|
-
"claude-code": (".
|
|
27
|
-
"codex": (".
|
|
28
|
-
"cursor": (".
|
|
29
|
-
"codebuddy": (".
|
|
26
|
+
"claude-code": (".worktrees", "harness/"),
|
|
27
|
+
"codex": (".worktrees", "harness/"),
|
|
28
|
+
"cursor": (".worktrees", "harness/"),
|
|
29
|
+
"codebuddy": (".worktrees", "harness/"),
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
|
|
@@ -164,6 +164,7 @@ def get_service_start(profile: dict[str, Any]) -> dict[str, Any]:
|
|
|
164
164
|
# runtime resolve 把具体 overlay/profile 注入到 session,不写回持久 profile
|
|
165
165
|
# (spec §3.1 持久 profile 只保存模板;§3.4 修复输入端陈旧 profile)。
|
|
166
166
|
STALE_WORKTREE_MARKERS: tuple[str, ...] = (
|
|
167
|
+
".worktrees/",
|
|
167
168
|
".claude/worktrees/",
|
|
168
169
|
".cursor/worktrees/",
|
|
169
170
|
".codeium/worktrees/",
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"files": [
|
|
8
8
|
{
|
|
9
9
|
"path": ".harness-build.json",
|
|
10
|
-
"sha256": "
|
|
10
|
+
"sha256": "a7fd6e4e51c881e477be82f244cc3ab7ee32936d272b04bb0adc89b7b40d3e81"
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
"path": "agents/harness-evaluator.md",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
"path": "harness-archive/checklist.md",
|
|
38
|
-
"sha256": "
|
|
38
|
+
"sha256": "c996b57c4f90a9a5285e59c7391e0628e9627974f030b2629bb477c36ad77aa5"
|
|
39
39
|
},
|
|
40
40
|
{
|
|
41
41
|
"path": "harness-archive/reference.md",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
49
|
"path": "harness-archive/SKILL.md",
|
|
50
|
-
"sha256": "
|
|
50
|
+
"sha256": "de28ac18baac77b3ab0881ead2a5aa2caae5cfccd5405104ec5f7b47331cc8c0"
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
53
|
"path": "harness-archive/templates/render-summary.mjs",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
69
|
"path": "harness-codebase-map/SKILL.md",
|
|
70
|
-
"sha256": "
|
|
70
|
+
"sha256": "81fd2ec9fee4da20d650e6dc48ab4ab741f12245c281d853f7a00936c7eb9e0b"
|
|
71
71
|
},
|
|
72
72
|
{
|
|
73
73
|
"path": "harness-codebase-map/templates/ARCHITECTURE.md",
|
|
@@ -131,11 +131,11 @@
|
|
|
131
131
|
},
|
|
132
132
|
{
|
|
133
133
|
"path": "harness-knowledge-ingest/SKILL.md",
|
|
134
|
-
"sha256": "
|
|
134
|
+
"sha256": "ab3a09a404d69852376aaba528abbe44b831aca48f9763783af71fb0efcacf9b"
|
|
135
135
|
},
|
|
136
136
|
{
|
|
137
137
|
"path": "harness-knowledge-query/SKILL.md",
|
|
138
|
-
"sha256": "
|
|
138
|
+
"sha256": "7e9fb5f54f07bf2b2394e14be136fe771835c082e40fe7f61206fc11a22bae4e"
|
|
139
139
|
},
|
|
140
140
|
{
|
|
141
141
|
"path": "harness-plan/checklist.md",
|
|
@@ -147,15 +147,15 @@
|
|
|
147
147
|
},
|
|
148
148
|
{
|
|
149
149
|
"path": "harness-plan/reference.md",
|
|
150
|
-
"sha256": "
|
|
150
|
+
"sha256": "1d252ecff35031bdc32692f52ee8d736d9d8570d5d8ab351ebaf81e85ffc56ea"
|
|
151
151
|
},
|
|
152
152
|
{
|
|
153
153
|
"path": "harness-plan/SKILL.md",
|
|
154
|
-
"sha256": "
|
|
154
|
+
"sha256": "34df4f0e7e0fa656800b0546e3a724c86c95c96ebf990f145a93154a88dda70e"
|
|
155
155
|
},
|
|
156
156
|
{
|
|
157
157
|
"path": "harness-review/checklist.md",
|
|
158
|
-
"sha256": "
|
|
158
|
+
"sha256": "5827ab101fd8d83c7f4616cb538b2dad0d5174e8f70e79d0af54871fb4d8a80f"
|
|
159
159
|
},
|
|
160
160
|
{
|
|
161
161
|
"path": "harness-review/protocols.md",
|
|
@@ -167,11 +167,11 @@
|
|
|
167
167
|
},
|
|
168
168
|
{
|
|
169
169
|
"path": "harness-review/SKILL.md",
|
|
170
|
-
"sha256": "
|
|
170
|
+
"sha256": "ce103208e022e238bdd0b6e501c4faf9194b95ed2d736c52816b004eda4812b0"
|
|
171
171
|
},
|
|
172
172
|
{
|
|
173
173
|
"path": "harness-run/checklist.md",
|
|
174
|
-
"sha256": "
|
|
174
|
+
"sha256": "8f8be29c43b2a37885d0ef729ca4a1cb748869d65de0498b0e38f3e1cc7f317a"
|
|
175
175
|
},
|
|
176
176
|
{
|
|
177
177
|
"path": "harness-run/protocols.md",
|
|
@@ -179,15 +179,15 @@
|
|
|
179
179
|
},
|
|
180
180
|
{
|
|
181
181
|
"path": "harness-run/reference.md",
|
|
182
|
-
"sha256": "
|
|
182
|
+
"sha256": "00d13333bc9e398842155bc4f9e59792be3666b15b471e093c8f50fe8aa0abf6"
|
|
183
183
|
},
|
|
184
184
|
{
|
|
185
185
|
"path": "harness-run/SKILL.md",
|
|
186
|
-
"sha256": "
|
|
186
|
+
"sha256": "ee22d79c40fbf24d2ab7eba24448c7e89274bb2a81c7d6875fcc526cfd03e771"
|
|
187
187
|
},
|
|
188
188
|
{
|
|
189
189
|
"path": "harness-submit/checklist.md",
|
|
190
|
-
"sha256": "
|
|
190
|
+
"sha256": "54230792cd9716c663ba3e7f569846910f67d0f0955bf38bafb653062111357c"
|
|
191
191
|
},
|
|
192
192
|
{
|
|
193
193
|
"path": "harness-submit/reference.md",
|
|
@@ -195,7 +195,7 @@
|
|
|
195
195
|
},
|
|
196
196
|
{
|
|
197
197
|
"path": "harness-submit/SKILL.md",
|
|
198
|
-
"sha256": "
|
|
198
|
+
"sha256": "3d32ae7ee46dbad5fac6f1363f67e16c6fd9ec0cbdddff926a8ce37b95349c82"
|
|
199
199
|
},
|
|
200
200
|
{
|
|
201
201
|
"path": "harness-sync/reference.md",
|
|
@@ -203,7 +203,7 @@
|
|
|
203
203
|
},
|
|
204
204
|
{
|
|
205
205
|
"path": "harness-sync/SKILL.md",
|
|
206
|
-
"sha256": "
|
|
206
|
+
"sha256": "02f0b36925dc6e7da64a5674b15e2395c40c4eb91d17ae169c4d557882156dff"
|
|
207
207
|
},
|
|
208
208
|
{
|
|
209
209
|
"path": "harness-test/checklist.md",
|
|
@@ -227,7 +227,7 @@
|
|
|
227
227
|
},
|
|
228
228
|
{
|
|
229
229
|
"path": "harness-test/SKILL.md",
|
|
230
|
-
"sha256": "
|
|
230
|
+
"sha256": "f4a9e2b2d3724d3df2bc0a98784c8dd0cd56c99cd726ecba9669e3d10639694e"
|
|
231
231
|
},
|
|
232
232
|
{
|
|
233
233
|
"path": "protocols/archive-report-protocol.md",
|
|
@@ -247,7 +247,7 @@
|
|
|
247
247
|
},
|
|
248
248
|
{
|
|
249
249
|
"path": "protocols/report-pipeline-protocol.md",
|
|
250
|
-
"sha256": "
|
|
250
|
+
"sha256": "46ade8806083f2b83b41099976555291f01c44990977fc7eb968007dee5a653d"
|
|
251
251
|
},
|
|
252
252
|
{
|
|
253
253
|
"path": "protocols/sensitive-info-protocol.md",
|
|
@@ -271,7 +271,7 @@
|
|
|
271
271
|
},
|
|
272
272
|
{
|
|
273
273
|
"path": "scripts/harness_archive.py",
|
|
274
|
-
"sha256": "
|
|
274
|
+
"sha256": "739671addbac6096860342910dd046178db04d130b34df129667ddd3523449cb"
|
|
275
275
|
},
|
|
276
276
|
{
|
|
277
277
|
"path": "scripts/harness_change.py",
|
|
@@ -287,7 +287,7 @@
|
|
|
287
287
|
},
|
|
288
288
|
{
|
|
289
289
|
"path": "scripts/harness_events.py",
|
|
290
|
-
"sha256": "
|
|
290
|
+
"sha256": "dcc4c1e4c2967ec7a07c103890f45f2903fc2784adebe3d6c5ae8e92037efd4f"
|
|
291
291
|
},
|
|
292
292
|
{
|
|
293
293
|
"path": "scripts/harness_gate.py",
|
|
@@ -295,15 +295,15 @@
|
|
|
295
295
|
},
|
|
296
296
|
{
|
|
297
297
|
"path": "scripts/harness_integration.py",
|
|
298
|
-
"sha256": "
|
|
298
|
+
"sha256": "ab963ef60b554118858124a6a8ed3af09bdc0bf78a873251825aee225ad77ad4"
|
|
299
299
|
},
|
|
300
300
|
{
|
|
301
301
|
"path": "scripts/harness_ledger.py",
|
|
302
|
-
"sha256": "
|
|
302
|
+
"sha256": "6d6b5fd9626178d5c10d0fd878f5a31c137b8b292e6a65838f6f06e0991e7576"
|
|
303
303
|
},
|
|
304
304
|
{
|
|
305
305
|
"path": "scripts/harness_paths.py",
|
|
306
|
-
"sha256": "
|
|
306
|
+
"sha256": "4042a0ee0521a3ff26448d63415eaf63dd45161d71d8c54a2b72665a1263e02b"
|
|
307
307
|
},
|
|
308
308
|
{
|
|
309
309
|
"path": "scripts/harness_phase.py",
|
|
@@ -319,7 +319,7 @@
|
|
|
319
319
|
},
|
|
320
320
|
{
|
|
321
321
|
"path": "scripts/harness_profile.py",
|
|
322
|
-
"sha256": "
|
|
322
|
+
"sha256": "366575a5d201da2730f1c28acbbf4a4ef76dbdacb38d222a555671c93a06b8e0"
|
|
323
323
|
},
|
|
324
324
|
{
|
|
325
325
|
"path": "scripts/harness_review.py",
|
|
@@ -327,11 +327,11 @@
|
|
|
327
327
|
},
|
|
328
328
|
{
|
|
329
329
|
"path": "scripts/harness_runtime.py",
|
|
330
|
-
"sha256": "
|
|
330
|
+
"sha256": "0cc27b7622922fa1c998973979d4970c5c993efe42545fa64dd0e64993030fce"
|
|
331
331
|
},
|
|
332
332
|
{
|
|
333
333
|
"path": "scripts/harness_service.py",
|
|
334
|
-
"sha256": "
|
|
334
|
+
"sha256": "af0eb7c93d5f856c5ed5a977e3f9a12dc0ced5baca571f7023f6b04ece46baf6"
|
|
335
335
|
},
|
|
336
336
|
{
|
|
337
337
|
"path": "scripts/harness_state.py",
|