@lannguyensi/harness 0.40.0 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +68 -0
- package/README.md +9 -0
- package/dist/cli/adopt/derive.d.ts +15 -0
- package/dist/cli/adopt/derive.js +34 -7
- package/dist/cli/adopt/derive.js.map +1 -1
- package/dist/cli/adopt/index.d.ts +30 -0
- package/dist/cli/adopt/index.js +23 -3
- package/dist/cli/adopt/index.js.map +1 -1
- package/dist/cli/apply/generate-settings.d.ts +14 -1
- package/dist/cli/apply/generate-settings.js +7 -3
- package/dist/cli/apply/generate-settings.js.map +1 -1
- package/dist/cli/approve/stdin-report.js +2 -0
- package/dist/cli/approve/stdin-report.js.map +1 -1
- package/dist/cli/approve/understanding.js +28 -0
- package/dist/cli/approve/understanding.js.map +1 -1
- package/dist/cli/doctor/claude-mcp.d.ts +50 -0
- package/dist/cli/doctor/claude-mcp.js +170 -0
- package/dist/cli/doctor/claude-mcp.js.map +1 -0
- package/dist/cli/doctor/codex.d.ts +8 -0
- package/dist/cli/doctor/codex.js +8 -1
- package/dist/cli/doctor/codex.js.map +1 -1
- package/dist/cli/doctor/format.js +60 -11
- package/dist/cli/doctor/format.js.map +1 -1
- package/dist/cli/doctor/index.d.ts +46 -0
- package/dist/cli/doctor/index.js +155 -29
- package/dist/cli/doctor/index.js.map +1 -1
- package/dist/cli/doctor/npm-bin-path.js +42 -0
- package/dist/cli/doctor/npm-bin-path.js.map +1 -1
- package/dist/cli/doctor/types.d.ts +37 -0
- package/dist/cli/doctor/types.js.map +1 -1
- package/dist/cli/dry-run.js +5 -0
- package/dist/cli/dry-run.js.map +1 -1
- package/dist/cli/explain.js +16 -3
- package/dist/cli/explain.js.map +1 -1
- package/dist/cli/index.js +328 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/agent-tasks-auth.js +32 -0
- package/dist/cli/init/agent-tasks-auth.js.map +1 -1
- package/dist/cli/init/composer.js +13 -40
- package/dist/cli/init/composer.js.map +1 -1
- package/dist/cli/init/dependencies.js +21 -0
- package/dist/cli/init/dependencies.js.map +1 -1
- package/dist/cli/init/detect.d.ts +20 -3
- package/dist/cli/init/detect.js +34 -36
- package/dist/cli/init/detect.js.map +1 -1
- package/dist/cli/init/index.d.ts +18 -0
- package/dist/cli/init/index.js +28 -2
- package/dist/cli/init/index.js.map +1 -1
- package/dist/cli/init/interactive.d.ts +41 -0
- package/dist/cli/init/interactive.js +421 -6
- package/dist/cli/init/interactive.js.map +1 -1
- package/dist/cli/init/profiles.d.ts +2 -2
- package/dist/cli/init/profiles.js +10 -1
- package/dist/cli/init/profiles.js.map +1 -1
- package/dist/cli/init/templates.d.ts +1 -1
- package/dist/cli/init/templates.js +217 -8
- package/dist/cli/init/templates.js.map +1 -1
- package/dist/cli/list.js +3 -1
- package/dist/cli/list.js.map +1 -1
- package/dist/cli/main.js +10 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/pack/hook-bootstrap.d.ts +24 -0
- package/dist/cli/pack/hook-bootstrap.js +47 -1
- package/dist/cli/pack/hook-bootstrap.js.map +1 -1
- package/dist/cli/pack/hook-branch-protection.js +9 -1
- package/dist/cli/pack/hook-branch-protection.js.map +1 -1
- package/dist/cli/pack/hook-codex-post-tool-use.d.ts +25 -0
- package/dist/cli/pack/hook-codex-post-tool-use.js +160 -0
- package/dist/cli/pack/hook-codex-post-tool-use.js.map +1 -0
- package/dist/cli/pack/hook-codex-pre-tool-use.d.ts +1 -0
- package/dist/cli/pack/hook-codex-pre-tool-use.js +43 -10
- package/dist/cli/pack/hook-codex-pre-tool-use.js.map +1 -1
- package/dist/cli/pack/hook-codex-stop.js +1 -8
- package/dist/cli/pack/hook-codex-stop.js.map +1 -1
- package/dist/cli/pack/hook-post-merge-gate-record.d.ts +30 -0
- package/dist/cli/pack/hook-post-merge-gate-record.js +153 -0
- package/dist/cli/pack/hook-post-merge-gate-record.js.map +1 -0
- package/dist/cli/pack/hook-post-merge-gate.d.ts +28 -0
- package/dist/cli/pack/hook-post-merge-gate.js +244 -0
- package/dist/cli/pack/hook-post-merge-gate.js.map +1 -0
- package/dist/cli/pack/hook-post-tool-use.js +16 -131
- package/dist/cli/pack/hook-post-tool-use.js.map +1 -1
- package/dist/cli/pack/hook-pre-tool-use.js +54 -2
- package/dist/cli/pack/hook-pre-tool-use.js.map +1 -1
- package/dist/cli/pack/hook-solution-acceptance-writeguard.js +148 -2
- package/dist/cli/pack/hook-solution-acceptance-writeguard.js.map +1 -1
- package/dist/cli/pack/hook-stay-in-scope.js +63 -20
- package/dist/cli/pack/hook-stay-in-scope.js.map +1 -1
- package/dist/cli/pack/hook-track-active-claim.js +33 -9
- package/dist/cli/pack/hook-track-active-claim.js.map +1 -1
- package/dist/cli/pack/index.d.ts +2 -1
- package/dist/cli/pack/index.js +2 -1
- package/dist/cli/pack/index.js.map +1 -1
- package/dist/cli/pack/mutate.d.ts +19 -0
- package/dist/cli/pack/mutate.js +38 -0
- package/dist/cli/pack/mutate.js.map +1 -1
- package/dist/cli/pack/reseed.d.ts +19 -0
- package/dist/cli/pack/reseed.js +118 -0
- package/dist/cli/pack/reseed.js.map +1 -0
- package/dist/cli/pack/understanding-report-schema-hint.js +1 -1
- package/dist/cli/pack/understanding-report-schema-hint.js.map +1 -1
- package/dist/cli/pause/index.js +12 -3
- package/dist/cli/pause/index.js.map +1 -1
- package/dist/cli/record/index.d.ts +64 -0
- package/dist/cli/record/index.js +211 -0
- package/dist/cli/record/index.js.map +1 -0
- package/dist/cli/session-start/index.d.ts +21 -0
- package/dist/cli/session-start/index.js +160 -25
- package/dist/cli/session-start/index.js.map +1 -1
- package/dist/cli/session-start/toolchain-parity.d.ts +149 -0
- package/dist/cli/session-start/toolchain-parity.js +618 -0
- package/dist/cli/session-start/toolchain-parity.js.map +1 -0
- package/dist/cli/uninstall/index.d.ts +73 -1
- package/dist/cli/uninstall/index.js +134 -2
- package/dist/cli/uninstall/index.js.map +1 -1
- package/dist/cli/validate/checks.js +8 -0
- package/dist/cli/validate/checks.js.map +1 -1
- package/dist/io/claude-mcp.d.ts +258 -0
- package/dist/io/claude-mcp.js +544 -0
- package/dist/io/claude-mcp.js.map +1 -0
- package/dist/policies/ledger-client.d.ts +34 -1
- package/dist/policies/ledger-client.js +21 -16
- package/dist/policies/ledger-client.js.map +1 -1
- package/dist/policy-packs/builtin/branch-protection-runtime.d.ts +4 -2
- package/dist/policy-packs/builtin/branch-protection-runtime.js +4 -2
- package/dist/policy-packs/builtin/branch-protection-runtime.js.map +1 -1
- package/dist/policy-packs/builtin/branch-protection.d.ts +10 -1
- package/dist/policy-packs/builtin/branch-protection.js +17 -0
- package/dist/policy-packs/builtin/branch-protection.js.map +1 -1
- package/dist/policy-packs/builtin/post-merge-gate-runtime.d.ts +195 -0
- package/dist/policy-packs/builtin/post-merge-gate-runtime.js +290 -0
- package/dist/policy-packs/builtin/post-merge-gate-runtime.js.map +1 -0
- package/dist/policy-packs/builtin/post-merge-gate.d.ts +56 -0
- package/dist/policy-packs/builtin/post-merge-gate.js +291 -0
- package/dist/policy-packs/builtin/post-merge-gate.js.map +1 -0
- package/dist/policy-packs/builtin/solution-acceptance-runtime.js +28 -13
- package/dist/policy-packs/builtin/solution-acceptance-runtime.js.map +1 -1
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.d.ts +197 -24
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js +342 -40
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js.map +1 -1
- package/dist/policy-packs/builtin/understanding-before-execution.d.ts +26 -1
- package/dist/policy-packs/builtin/understanding-before-execution.js +302 -17
- package/dist/policy-packs/builtin/understanding-before-execution.js.map +1 -1
- package/dist/policy-packs/registry.d.ts +23 -2
- package/dist/policy-packs/registry.js +31 -2
- package/dist/policy-packs/registry.js.map +1 -1
- package/dist/policy-packs/ux-compare.d.ts +14 -0
- package/dist/policy-packs/ux-compare.js +58 -0
- package/dist/policy-packs/ux-compare.js.map +1 -0
- package/dist/policy-packs/ux-drift-check.d.ts +27 -0
- package/dist/policy-packs/ux-drift-check.js +78 -0
- package/dist/policy-packs/ux-drift-check.js.map +1 -0
- package/dist/probes/mcp.d.ts +13 -0
- package/dist/probes/mcp.js +57 -0
- package/dist/probes/mcp.js.map +1 -1
- package/dist/runtime/approval-signing.d.ts +82 -0
- package/dist/runtime/approval-signing.js +275 -0
- package/dist/runtime/approval-signing.js.map +1 -0
- package/dist/runtime/git-context.d.ts +50 -0
- package/dist/runtime/git-context.js +108 -1
- package/dist/runtime/git-context.js.map +1 -1
- package/dist/runtime/hermetic-spawn-guard.d.ts +25 -0
- package/dist/runtime/hermetic-spawn-guard.js +136 -0
- package/dist/runtime/hermetic-spawn-guard.js.map +1 -0
- package/dist/runtime/intercept.js +62 -5
- package/dist/runtime/intercept.js.map +1 -1
- package/dist/runtime/ledger-writer.d.ts +27 -0
- package/dist/runtime/ledger-writer.js +46 -0
- package/dist/runtime/ledger-writer.js.map +1 -0
- package/dist/runtime/pause-sentinel.js +14 -3
- package/dist/runtime/pause-sentinel.js.map +1 -1
- package/dist/runtime/read-only-bash.js +118 -0
- package/dist/runtime/read-only-bash.js.map +1 -1
- package/dist/runtime/recovery-git-commit.d.ts +22 -0
- package/dist/runtime/recovery-git-commit.js +284 -0
- package/dist/runtime/recovery-git-commit.js.map +1 -0
- package/dist/runtime/tool-name-aliases.d.ts +1 -0
- package/dist/runtime/tool-name-aliases.js +7 -1
- package/dist/runtime/tool-name-aliases.js.map +1 -1
- package/dist/schema/index.d.ts +94 -42
- package/dist/schema/index.js +5 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/policies.d.ts +56 -44
- package/dist/schema/policies.js +79 -9
- package/dist/schema/policies.js.map +1 -1
- package/dist/schema/toolchain-parity.d.ts +18 -0
- package/dist/schema/toolchain-parity.js +35 -0
- package/dist/schema/toolchain-parity.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// `harness pack reseed <name>` — pull the shipped builtin template's
|
|
2
|
+
// `config.ux` (and `config.producers`) into an already-installed manifest
|
|
3
|
+
// (task 68b9ad9c).
|
|
4
|
+
//
|
|
5
|
+
// Motivation: `harness apply` only projects the manifest OUT to
|
|
6
|
+
// settings.json / MEMORY.md; nothing propagates a deny-message wording
|
|
7
|
+
// fix in the shipped init templates back INTO an operator's existing
|
|
8
|
+
// `policy_packs[].config.ux` — the fix reaches only NEW `harness init`
|
|
9
|
+
// manifests. This is the opt-in write side of that gap; the read-side
|
|
10
|
+
// warning lives in `src/policy-packs/ux-drift-check.ts` (consumed by
|
|
11
|
+
// `harness doctor`). Both read the same canonical default via
|
|
12
|
+
// `resolveBuiltinDefaultConfig` (src/policy-packs/registry.ts).
|
|
13
|
+
//
|
|
14
|
+
// Deliberately explicit-only, mirroring `add`/`remove`: this verb is
|
|
15
|
+
// NEVER invoked by `apply`, so an operator's deliberate ux customisation
|
|
16
|
+
// is never silently clobbered by an upgrade — the operator has to
|
|
17
|
+
// actually run this command for their manifest to change. `--dry-run`
|
|
18
|
+
// prints the diff without writing so the change can be reviewed first.
|
|
19
|
+
// A pack whose current `config.ux` / `config.producers` already matches
|
|
20
|
+
// the shipped template is a no-op (nothing to write).
|
|
21
|
+
import * as fs from "node:fs";
|
|
22
|
+
import * as path from "node:path";
|
|
23
|
+
import { parse as parseYaml } from "yaml";
|
|
24
|
+
import { atomicWriteFile } from "../../io/atomic-write.js";
|
|
25
|
+
import { resolveHomeDir } from "../../runtime/home-dir.js";
|
|
26
|
+
import { withFileLock } from "../../io/lock.js";
|
|
27
|
+
import { unifiedDiff } from "../../io/patch.js";
|
|
28
|
+
import { formatValidationErrors, validateBeforeWrite, } from "../../io/validate-before-write.js";
|
|
29
|
+
import { ManifestParseError, parseManifest } from "../../schema/index.js";
|
|
30
|
+
import { resolveBuiltinDefaultConfig } from "../../policy-packs/registry.js";
|
|
31
|
+
import { producersEqual, safeParseProducers, safeParseUx, uxEqual } from "../../policy-packs/ux-compare.js";
|
|
32
|
+
import { EX_FAIL, EX_NOINPUT, HarnessExitError } from "../exit-codes.js";
|
|
33
|
+
import { applyPackReseedUx } from "./mutate.js";
|
|
34
|
+
const DEFAULT_BASENAME = "harness.yaml";
|
|
35
|
+
const LOCK_BASENAME = ".harness.lock";
|
|
36
|
+
function resolveTargetPath(opts) {
|
|
37
|
+
if (opts.configPath)
|
|
38
|
+
return path.resolve(opts.configPath);
|
|
39
|
+
return path.join(resolveHomeDir({ ...(opts.homeDir !== undefined ? { homeDir: opts.homeDir } : {}) }).path, DEFAULT_BASENAME);
|
|
40
|
+
}
|
|
41
|
+
function formatNameList(names) {
|
|
42
|
+
if (names.length === 0)
|
|
43
|
+
return "(none declared)";
|
|
44
|
+
return names.map((n) => ` - ${n}`).join("\n");
|
|
45
|
+
}
|
|
46
|
+
export async function packReseed(name, opts = {}) {
|
|
47
|
+
const target = resolveTargetPath(opts);
|
|
48
|
+
if (!fs.existsSync(target)) {
|
|
49
|
+
throw new HarnessExitError(`harness manifest not found at ${target}; run \`harness init\` first`, EX_NOINPUT);
|
|
50
|
+
}
|
|
51
|
+
const original = fs.readFileSync(target, "utf8");
|
|
52
|
+
let manifest;
|
|
53
|
+
try {
|
|
54
|
+
manifest = parseManifest(parseYaml(original));
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
const detail = err instanceof ManifestParseError ? err.message : String(err);
|
|
58
|
+
throw new HarnessExitError(`manifest at ${target} fails schema validation; fix it with \`harness validate\` before reseeding:\n${detail}`, EX_FAIL);
|
|
59
|
+
}
|
|
60
|
+
const pack = manifest.policy_packs.find((p) => p.name === name);
|
|
61
|
+
if (!pack) {
|
|
62
|
+
throw new HarnessExitError(`policy_packs entry ${JSON.stringify(name)} not found. Available entries:\n${formatNameList(manifest.policy_packs.map((p) => p.name))}`, EX_FAIL);
|
|
63
|
+
}
|
|
64
|
+
const canonical = resolveBuiltinDefaultConfig(pack);
|
|
65
|
+
if (!canonical || (canonical.ux === undefined && canonical.producers === undefined)) {
|
|
66
|
+
throw new HarnessExitError(`no shipped default config.ux / config.producers is registered for pack ${JSON.stringify(name)}; nothing to reseed. See docs/policy-packs/ for which packs support reseed.`, EX_FAIL);
|
|
67
|
+
}
|
|
68
|
+
const fieldsChanged = [];
|
|
69
|
+
const fields = {};
|
|
70
|
+
if (canonical.ux !== undefined) {
|
|
71
|
+
const currentUx = pack.config["ux"];
|
|
72
|
+
const parsed = currentUx === undefined ? null : safeParseUx(currentUx);
|
|
73
|
+
const alreadyCanonical = parsed !== null && uxEqual(parsed, canonical.ux);
|
|
74
|
+
if (!alreadyCanonical) {
|
|
75
|
+
fields.ux = canonical.ux;
|
|
76
|
+
fieldsChanged.push("ux");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (canonical.producers !== undefined) {
|
|
80
|
+
const currentProducers = pack.config["producers"];
|
|
81
|
+
const parsed = currentProducers === undefined ? null : safeParseProducers(currentProducers);
|
|
82
|
+
const alreadyCanonical = parsed !== null && producersEqual(parsed, canonical.producers);
|
|
83
|
+
if (!alreadyCanonical) {
|
|
84
|
+
fields.producers = canonical.producers;
|
|
85
|
+
fieldsChanged.push("producers");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (fieldsChanged.length === 0) {
|
|
89
|
+
return { path: target, name, diff: "", applied: false, fieldsChanged: [] };
|
|
90
|
+
}
|
|
91
|
+
const proposed = applyPackReseedUx(original, name, fields);
|
|
92
|
+
const diff = unifiedDiff({
|
|
93
|
+
fileName: path.basename(target),
|
|
94
|
+
oldText: original,
|
|
95
|
+
newText: proposed,
|
|
96
|
+
oldHeader: "current",
|
|
97
|
+
newHeader: "proposed",
|
|
98
|
+
});
|
|
99
|
+
const schemaResult = validateBeforeWrite(parseYaml(proposed));
|
|
100
|
+
if (!schemaResult.ok) {
|
|
101
|
+
throw new HarnessExitError(`proposed manifest fails schema validation:\n${formatValidationErrors(schemaResult.errors)}`, EX_FAIL);
|
|
102
|
+
}
|
|
103
|
+
if (opts.dryRun) {
|
|
104
|
+
return { path: target, name, diff, applied: false, fieldsChanged };
|
|
105
|
+
}
|
|
106
|
+
const lockPath = path.join(path.dirname(target), LOCK_BASENAME);
|
|
107
|
+
await withFileLock(lockPath, () => {
|
|
108
|
+
const current = fs.readFileSync(target, "utf8");
|
|
109
|
+
const next = applyPackReseedUx(current, name, fields);
|
|
110
|
+
const recheck = validateBeforeWrite(parseYaml(next));
|
|
111
|
+
if (!recheck.ok) {
|
|
112
|
+
throw new HarnessExitError(`proposed manifest fails schema validation after lock acquisition:\n${formatValidationErrors(recheck.errors)}`, EX_FAIL);
|
|
113
|
+
}
|
|
114
|
+
atomicWriteFile(target, next);
|
|
115
|
+
});
|
|
116
|
+
return { path: target, name, diff, applied: true, fieldsChanged };
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=reseed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reseed.js","sourceRoot":"","sources":["../../../src/cli/pack/reseed.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,0EAA0E;AAC1E,mBAAmB;AACnB,EAAE;AACF,gEAAgE;AAChE,uEAAuE;AACvE,qEAAqE;AACrE,uEAAuE;AACvE,sEAAsE;AACtE,qEAAqE;AACrE,8DAA8D;AAC9D,gEAAgE;AAChE,EAAE;AACF,qEAAqE;AACrE,yEAAyE;AACzE,kEAAkE;AAClE,sEAAsE;AACtE,uEAAuE;AACvE,wEAAwE;AACxE,sDAAsD;AAEtD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC5G,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAyB,MAAM,aAAa,CAAC;AAuBvE,MAAM,gBAAgB,GAAG,cAAc,CAAC;AACxC,MAAM,aAAa,GAAG,eAAe,CAAC;AAEtC,SAAS,iBAAiB,CAAC,IAAuB;IAChD,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,IAAI,CACd,cAAc,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EACzF,gBAAgB,CACjB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAe;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACjD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,OAA0B,EAAE;IAE5B,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,gBAAgB,CACxB,iCAAiC,MAAM,8BAA8B,EACrE,UAAU,CACX,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7E,MAAM,IAAI,gBAAgB,CACxB,eAAe,MAAM,iFAAiF,MAAM,EAAE,EAC9G,OAAO,CACR,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAChE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mCAAmC,cAAc,CACzF,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACzC,EAAE,EACH,OAAO,CACR,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,gBAAgB,CACxB,0EAA0E,IAAI,CAAC,SAAS,CACtF,IAAI,CACL,6EAA6E,EAC9E,OAAO,CACR,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAsB,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,IAAI,SAAS,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACvE,MAAM,gBAAgB,GAAG,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;QAC5F,MAAM,gBAAgB,GAAG,MAAM,KAAK,IAAI,IAAI,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QACxF,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YACvC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IAC7E,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,WAAW,CAAC;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/B,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,QAAQ;QACjB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,UAAU;KACtB,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,mBAAmB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,gBAAgB,CACxB,+CAA+C,sBAAsB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAC5F,OAAO,CACR,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC;IAChE,MAAM,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE;QAChC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,gBAAgB,CACxB,sEAAsE,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAC9G,OAAO,CACR,CAAC;QACJ,CAAC;QACD,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -53,7 +53,7 @@ export function renderReportSchemaHint() {
|
|
|
53
53
|
// one pair implied exhaustiveness. The bullets below show the canonical
|
|
54
54
|
// names; the parser's alias-tolerance is a quiet bonus, not something
|
|
55
55
|
// the agent needs to choose between.
|
|
56
|
-
const intro = "Report format (parsed by `@lannguyensi/understanding-gate`): markdown with these ten sections, any heading level (#, ##, ###), names case-insensitive. Missing any section produces a parse-error under `.understanding-gate/parse-errors/` and the audit trail is empty even though the gate-approval marker still gets written.";
|
|
56
|
+
const intro = "Report format (parsed by `@lannguyensi/understanding-gate`): markdown with these ten sections, any heading level (#, ##, ###), names case-insensitive. Sections marked (list) need markdown list items ('- ' or '1.') in the body — a prose paragraph under a (list) heading is rejected the same as a missing section. Missing any section produces a parse-error under `.understanding-gate/parse-errors/` and the audit trail is empty even though the gate-approval marker still gets written.";
|
|
57
57
|
const bullets = UNDERSTANDING_REPORT_REQUIRED_SECTIONS.map((s) => ` - ${s}`).join("\n");
|
|
58
58
|
// Submission recipe (task 61fd36db): the Stop-hook producer fires only
|
|
59
59
|
// at END of turn — after `harness approve understanding` already ran —
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"understanding-report-schema-hint.js","sourceRoot":"","sources":["../../../src/cli/pack/understanding-report-schema-hint.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,wEAAwE;AACxE,EAAE;AACF,kEAAkE;AAClE,qEAAqE;AACrE,sEAAsE;AACtE,wEAAwE;AACxE,uEAAuE;AACvE,+CAA+C;AAC/C,EAAE;AACF,kEAAkE;AAClE,wDAAwD;AACxD,qEAAqE;AACrE,qEAAqE;AACrE,qEAAqE;AACrE,oEAAoE;AACpE,oEAAoE;AACpE,mEAAmE;AAEnE,MAAM,CAAC,MAAM,sCAAsC,GAAG;IACpD,mCAAmC;IACnC,8BAA8B;IAC9B,sBAAsB;IACtB,4BAA4B;IAC5B,oBAAoB;IACpB,uBAAuB;IACvB,qBAAqB;IACrB,cAAc;IACd,0BAA0B;IAC1B,qEAAqE;IACrE,yDAAyD;IACzD,kEAAkE;IAClE,kEAAkE;IAClE,qCAAqC;IACrC,kBAAkB;CACV,CAAC;AAEX;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB;IACpC,uEAAuE;IACvE,wEAAwE;IACxE,+DAA+D;IAC/D,yEAAyE;IACzE,oEAAoE;IACpE,wEAAwE;IACxE,sEAAsE;IACtE,qCAAqC;IACrC,MAAM,KAAK,GACT,
|
|
1
|
+
{"version":3,"file":"understanding-report-schema-hint.js","sourceRoot":"","sources":["../../../src/cli/pack/understanding-report-schema-hint.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,wEAAwE;AACxE,EAAE;AACF,kEAAkE;AAClE,qEAAqE;AACrE,sEAAsE;AACtE,wEAAwE;AACxE,uEAAuE;AACvE,+CAA+C;AAC/C,EAAE;AACF,kEAAkE;AAClE,wDAAwD;AACxD,qEAAqE;AACrE,qEAAqE;AACrE,qEAAqE;AACrE,oEAAoE;AACpE,oEAAoE;AACpE,mEAAmE;AAEnE,MAAM,CAAC,MAAM,sCAAsC,GAAG;IACpD,mCAAmC;IACnC,8BAA8B;IAC9B,sBAAsB;IACtB,4BAA4B;IAC5B,oBAAoB;IACpB,uBAAuB;IACvB,qBAAqB;IACrB,cAAc;IACd,0BAA0B;IAC1B,qEAAqE;IACrE,yDAAyD;IACzD,kEAAkE;IAClE,kEAAkE;IAClE,qCAAqC;IACrC,kBAAkB;CACV,CAAC;AAEX;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB;IACpC,uEAAuE;IACvE,wEAAwE;IACxE,+DAA+D;IAC/D,yEAAyE;IACzE,oEAAoE;IACpE,wEAAwE;IACxE,sEAAsE;IACtE,qCAAqC;IACrC,MAAM,KAAK,GACT,oeAAoe,CAAC;IACve,MAAM,OAAO,GAAG,sCAAsC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzF,uEAAuE;IACvE,uEAAuE;IACvE,mEAAmE;IACnE,oEAAoE;IACpE,sDAAsD;IACtD,MAAM,MAAM,GACV,yFAAyF;QACzF,sFAAsF;QACtF,4DAA4D;QAC5D,6BAA6B;QAC7B,uBAAuB;QACvB,wBAAwB,CAAC;IAC3B,OAAO,GAAG,KAAK,KAAK,OAAO,KAAK,MAAM,EAAE,CAAC;AAC3C,CAAC"}
|
package/dist/cli/pause/index.js
CHANGED
|
@@ -95,9 +95,14 @@ function refuseIfAgentShell(opts) {
|
|
|
95
95
|
throw new HarnessExitError([
|
|
96
96
|
`harness pause/resume refuses to run inside an agent shell (${hit.name} is set).`,
|
|
97
97
|
"",
|
|
98
|
-
"This is
|
|
99
|
-
"
|
|
100
|
-
"
|
|
98
|
+
"This is a speed bump, not a boundary: a Claude Code `! `-prefixed command",
|
|
99
|
+
"runs in a shell that INHERITS this same session's environment and stdin, so",
|
|
100
|
+
"it is indistinguishable from an agent-issued command and trips this exact",
|
|
101
|
+
"check. Do not prefix with `! `: that does not work. Run the verb from a",
|
|
102
|
+
"terminal OUTSIDE this agent session (a separate terminal window or tab, not",
|
|
103
|
+
"spawned by or nested inside this one). The real enforcement boundary is the",
|
|
104
|
+
"PreToolUse deny-policy layer (see docs/okf/pause-vs-gate-kill-switch.md),",
|
|
105
|
+
"not this CLI check.",
|
|
101
106
|
].join("\n"), EX_USAGE);
|
|
102
107
|
}
|
|
103
108
|
}
|
|
@@ -112,6 +117,10 @@ function refuseIfNonTTY(opts) {
|
|
|
112
117
|
"",
|
|
113
118
|
"If you really mean this (e.g. invoking from a one-off recovery script that",
|
|
114
119
|
"you reviewed yourself), pass --i-am-the-operator to acknowledge.",
|
|
120
|
+
"",
|
|
121
|
+
"WARNING: --i-am-the-operator only lifts the non-TTY check; it never lifts",
|
|
122
|
+
"the agent-shell check above. If an agent ever asks YOU to pass this flag on",
|
|
123
|
+
"its behalf, that request IS the attack this guard exists to stop: refuse it.",
|
|
115
124
|
].join("\n"), EX_USAGE);
|
|
116
125
|
}
|
|
117
126
|
function loadManifestBestEffort(opts) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/pause/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/pause/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type LedgerWriteFn } from "../../runtime/ledger-writer.js";
|
|
2
|
+
import { type ResolveReadSessionOptions } from "../../runtime/session-id.js";
|
|
3
|
+
import { type LoaderOptions } from "../loader.js";
|
|
4
|
+
/** Options shared by every `record` verb. */
|
|
5
|
+
export interface RecordCommonOptions extends LoaderOptions {
|
|
6
|
+
/** Working directory used for git-context resolution. Defaults to `process.cwd()`. */
|
|
7
|
+
cwd?: string;
|
|
8
|
+
/** Defaults to `process.stderr`. Warnings and error reasons land here. */
|
|
9
|
+
stderr?: NodeJS.WritableStream;
|
|
10
|
+
/** Explicit session id (overrides env + transcript discovery). */
|
|
11
|
+
session?: string;
|
|
12
|
+
/** Per-call ledger timeout in ms. */
|
|
13
|
+
ledgerTimeoutMs?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Inject the read-path session resolver (test seam). Production uses
|
|
16
|
+
* `resolveReadSessionId` from `runtime/session-id`, the same
|
|
17
|
+
* precedence chain `harness audit` / `harness explain --trace` use.
|
|
18
|
+
*/
|
|
19
|
+
resolveSession?: (explicit: string | undefined, opts: ResolveReadSessionOptions) => string;
|
|
20
|
+
/** Inject the ledger writer (test seam). */
|
|
21
|
+
writeLedger?: LedgerWriteFn;
|
|
22
|
+
}
|
|
23
|
+
/** Structured outcome of a `record` verb — testable without spawning a process. */
|
|
24
|
+
export interface RecordResult {
|
|
25
|
+
/** 0 on success; EX_USAGE (64) for a bad argument, EX_FAIL (1) for a runtime failure. */
|
|
26
|
+
exitCode: number;
|
|
27
|
+
/** Whether the ledger fact was actually written. */
|
|
28
|
+
wrote: boolean;
|
|
29
|
+
/** The exact content string written (or that would have been written); "" on early validation failure. */
|
|
30
|
+
content: string;
|
|
31
|
+
/** Resolved session id ("" only when validation failed before session resolution). */
|
|
32
|
+
sessionId: string;
|
|
33
|
+
/** Resolved branch tag ("" when the verb does not use one, or resolution failed). */
|
|
34
|
+
branch: string;
|
|
35
|
+
/** Human-readable explanation of a non-write outcome. */
|
|
36
|
+
reason?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface RecordReviewOptions extends RecordCommonOptions {
|
|
39
|
+
/** PR number (or identifier) — required, non-empty. */
|
|
40
|
+
pr: string;
|
|
41
|
+
/** Explicit base-branch override; see resolveBase() for the fallback chain. */
|
|
42
|
+
base?: string;
|
|
43
|
+
/** Explicit branch override (otherwise resolved via resolveGitContext(cwd)). */
|
|
44
|
+
branch?: string;
|
|
45
|
+
/** Free-form review summary — required, non-empty. */
|
|
46
|
+
summary: string;
|
|
47
|
+
}
|
|
48
|
+
export declare function runRecordReview(opts: RecordReviewOptions): Promise<RecordResult>;
|
|
49
|
+
export interface RecordReviewSubagentOptions extends RecordCommonOptions {
|
|
50
|
+
/** agent-tasks task id — required, non-empty. */
|
|
51
|
+
task: string;
|
|
52
|
+
/** Reviewer verdict — required, non-empty. */
|
|
53
|
+
verdict: string;
|
|
54
|
+
/** Explicit branch override (otherwise resolved via resolveGitContext(cwd)). */
|
|
55
|
+
branch?: string;
|
|
56
|
+
/** Optional free-form summary appended after the verdict. */
|
|
57
|
+
summary?: string;
|
|
58
|
+
}
|
|
59
|
+
export declare function runRecordReviewSubagent(opts: RecordReviewSubagentOptions): Promise<RecordResult>;
|
|
60
|
+
export interface RecordDogfoodOptions extends RecordCommonOptions {
|
|
61
|
+
/** End-to-end smoke summary — required, non-empty. */
|
|
62
|
+
summary: string;
|
|
63
|
+
}
|
|
64
|
+
export declare function runRecordDogfood(opts: RecordDogfoodOptions): Promise<RecordResult>;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// `harness record {review,review-subagent,dogfood}` — operator/agent-
|
|
2
|
+
// driven evidence-ledger producers for the review-before-merge,
|
|
3
|
+
// review-subagent-before-pr-create, and dogfood-before-release gate
|
|
4
|
+
// families (see src/cli/init/templates.ts for the exact policy
|
|
5
|
+
// definitions and tag shapes these verbs feed).
|
|
6
|
+
//
|
|
7
|
+
// Unlike `harness session-start preflight` (a SessionStart hook that
|
|
8
|
+
// MUST exit 0 on every path so it never breaks the session loop), the
|
|
9
|
+
// `record` verbs are INTERACTIVE: an agent or operator invokes them
|
|
10
|
+
// deliberately to attach a review verdict / dogfood summary to the
|
|
11
|
+
// ledger. A failure here (unreachable ledger, no git context, an empty
|
|
12
|
+
// summary) is a real error the caller needs to see and react to, so
|
|
13
|
+
// every verb exits non-zero with a clear stderr message on failure
|
|
14
|
+
// instead of degrading silently. Each verb still returns a structured
|
|
15
|
+
// `RecordResult` (not just a thrown error) so both paths are testable
|
|
16
|
+
// without spawning a process — same "degrade-with-reason" convention
|
|
17
|
+
// `runSessionStartPreflight` uses.
|
|
18
|
+
//
|
|
19
|
+
// Composition mirrors session-start/index.ts: build the ledger write
|
|
20
|
+
// via the manifest's declared `grounding-mcp` server (through the
|
|
21
|
+
// shared `resolveManifestLedgerWriter` — see runtime/ledger-writer.ts),
|
|
22
|
+
// resolve branch via `resolveGitContext` (the SAME function the
|
|
23
|
+
// preflight-before-* gates use) and session via `resolveReadSessionId`,
|
|
24
|
+
// with `--branch` / `--session` as explicit overrides. No new JSON-RPC
|
|
25
|
+
// or subprocess code: every ledger write goes through the existing
|
|
26
|
+
// `addLedgerFact` primitive.
|
|
27
|
+
import { findGitEntry, resolveCommonDir, resolveGitContext, resolveOriginHeadBase, } from "../../runtime/git-context.js";
|
|
28
|
+
import { resolveManifestLedgerWriter } from "../../runtime/ledger-writer.js";
|
|
29
|
+
import { resolveReadSessionId, } from "../../runtime/session-id.js";
|
|
30
|
+
import { EX_FAIL, EX_USAGE } from "../exit-codes.js";
|
|
31
|
+
import { loadManifest } from "../loader.js";
|
|
32
|
+
const LEDGER_SOURCE_REVIEW = "harness-record-review";
|
|
33
|
+
const LEDGER_SOURCE_REVIEW_SUBAGENT = "harness-record-review-subagent";
|
|
34
|
+
const LEDGER_SOURCE_DOGFOOD = "harness-record-dogfood";
|
|
35
|
+
function resolveSession(opts) {
|
|
36
|
+
const resolve = opts.resolveSession ?? resolveReadSessionId;
|
|
37
|
+
return resolve(opts.session, {});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Write one ledger fact via the manifest's declared `grounding-mcp`
|
|
41
|
+
* server (or the injected `opts.writeLedger` test seam). Mirrors the
|
|
42
|
+
* manifest-wiring block `runSessionStartPreflight` uses, factored
|
|
43
|
+
* through the shared `resolveManifestLedgerWriter` helper.
|
|
44
|
+
*/
|
|
45
|
+
async function writeLedgerFact(opts, sessionId, source, content) {
|
|
46
|
+
let writeLedger = opts.writeLedger;
|
|
47
|
+
if (!writeLedger) {
|
|
48
|
+
let manifest;
|
|
49
|
+
try {
|
|
50
|
+
manifest = loadManifest(opts).manifest;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
return { ok: false, reason: `manifest load failed: ${err.message}` };
|
|
54
|
+
}
|
|
55
|
+
const resolved = resolveManifestLedgerWriter(manifest, {
|
|
56
|
+
...(opts.ledgerTimeoutMs !== undefined ? { ledgerTimeoutMs: opts.ledgerTimeoutMs } : {}),
|
|
57
|
+
});
|
|
58
|
+
if (!resolved.ok) {
|
|
59
|
+
return { ok: false, reason: `${resolved.reason}; cannot record ${source} tag` };
|
|
60
|
+
}
|
|
61
|
+
writeLedger = resolved.write;
|
|
62
|
+
}
|
|
63
|
+
const result = await writeLedger({ sessionId, content, source });
|
|
64
|
+
if (!result.ok) {
|
|
65
|
+
return { ok: false, reason: `ledger write failed: ${result.reason ?? "unknown error"}` };
|
|
66
|
+
}
|
|
67
|
+
return { ok: true };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Shared setup every verb runs first: a `note()` sink prefixed with the
|
|
71
|
+
* verb's own name (so stderr lines are attributable when several verbs
|
|
72
|
+
* run in a script), the resolved cwd, and the resolved session id.
|
|
73
|
+
* Session id is resolved this early because `record dogfood`'s content
|
|
74
|
+
* embeds it directly (`dogfood:${sessionId}`).
|
|
75
|
+
*/
|
|
76
|
+
function initRecordVerb(opts, verbName) {
|
|
77
|
+
const stderr = opts.stderr ?? process.stderr;
|
|
78
|
+
const note = (msg) => {
|
|
79
|
+
stderr.write(`harness record ${verbName}: ${msg}\n`);
|
|
80
|
+
};
|
|
81
|
+
return { note, cwd: opts.cwd ?? process.cwd(), sessionId: resolveSession(opts) };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Trim `value` and refuse it if empty (a required flag / positional
|
|
85
|
+
* argument left blank). Returns the ready-to-`return`ed EX_USAGE
|
|
86
|
+
* `RecordResult` on failure so callers do not repeat that construction
|
|
87
|
+
* — shared by every "--pr / --task / --verdict / summary must not be
|
|
88
|
+
* empty" check across the three verbs.
|
|
89
|
+
*/
|
|
90
|
+
function requireNonEmpty(value, flagLabel, sessionId, note) {
|
|
91
|
+
const trimmed = (value ?? "").trim();
|
|
92
|
+
if (trimmed.length === 0) {
|
|
93
|
+
const reason = `${flagLabel} must not be empty`;
|
|
94
|
+
note(reason);
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
result: { exitCode: EX_USAGE, wrote: false, content: "", sessionId, branch: "", reason },
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return { ok: true, value: trimmed };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Resolve the branch tag `review` and `review-subagent` both require:
|
|
104
|
+
* explicit `--branch` wins, otherwise `resolveGitContext(cwd)` (the SAME
|
|
105
|
+
* function the preflight-before-* gates use). Returns the ready-to-
|
|
106
|
+
* `return`ed failure `RecordResult` on the shared "cannot resolve any
|
|
107
|
+
* branch" degrade path so callers do not repeat that construction.
|
|
108
|
+
*/
|
|
109
|
+
function resolveRequiredBranch(cwd, explicitBranch, sessionId, note) {
|
|
110
|
+
const gitContext = resolveGitContext(cwd);
|
|
111
|
+
const branch = (explicitBranch ?? "").trim() || gitContext.branch;
|
|
112
|
+
if (branch.length === 0) {
|
|
113
|
+
const reason = "no branch resolvable (cwd is not inside a git work tree, or HEAD is detached); pass --branch <name>";
|
|
114
|
+
note(reason);
|
|
115
|
+
return {
|
|
116
|
+
ok: false,
|
|
117
|
+
result: { exitCode: EX_FAIL, wrote: false, content: "", sessionId, branch: "", reason },
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return { ok: true, branch };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Shared tail every verb runs last: write the fact, translate a failure
|
|
124
|
+
* into the degrade-with-reason `RecordResult` shape, or report success.
|
|
125
|
+
*/
|
|
126
|
+
async function finishRecordWrite(opts, sessionId, branch, source, content, note) {
|
|
127
|
+
const written = await writeLedgerFact(opts, sessionId, source, content);
|
|
128
|
+
if (!written.ok) {
|
|
129
|
+
note(written.reason);
|
|
130
|
+
return { exitCode: EX_FAIL, wrote: false, content, sessionId, branch, reason: written.reason };
|
|
131
|
+
}
|
|
132
|
+
return { exitCode: 0, wrote: true, content, sessionId, branch };
|
|
133
|
+
}
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// Base-branch resolution for `record review` (--base flag > origin/HEAD
|
|
136
|
+
// filesystem fallback > omit with a loud stderr warning). No `gh`
|
|
137
|
+
// shell-out: everything is read straight off the `.git` directory,
|
|
138
|
+
// reusing runtime/git-context.ts's exported `findGitEntry` walk instead
|
|
139
|
+
// of re-implementing it. `resolveOriginHeadBase` / `resolveCommonDir`
|
|
140
|
+
// themselves now live in runtime/git-context.ts too (task post-merge-gate,
|
|
141
|
+
// T-001) so `policy-packs/builtin/post-merge-gate-runtime.ts` can share
|
|
142
|
+
// them without a policy-pack module reaching into `cli/`; imported here
|
|
143
|
+
// unchanged.
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
/**
|
|
146
|
+
* Resolve the base branch for `record review`: explicit `--base` wins,
|
|
147
|
+
* then the origin/HEAD filesystem fallback, then omission with a loud
|
|
148
|
+
* stderr warning (never a silent gap — the operator needs to know the
|
|
149
|
+
* `review:<base>` tag did not land).
|
|
150
|
+
*/
|
|
151
|
+
function resolveBase(cwd, explicitBase, note) {
|
|
152
|
+
const flag = (explicitBase ?? "").trim();
|
|
153
|
+
if (flag.length > 0)
|
|
154
|
+
return flag;
|
|
155
|
+
const gitDir = findGitEntry(cwd)?.gitDir;
|
|
156
|
+
if (gitDir) {
|
|
157
|
+
const base = resolveOriginHeadBase(resolveCommonDir(gitDir));
|
|
158
|
+
if (base)
|
|
159
|
+
return base;
|
|
160
|
+
}
|
|
161
|
+
note("no --base given and origin/HEAD could not be resolved (checked " +
|
|
162
|
+
"refs/remotes/origin/HEAD and packed-refs); omitting the review:<base> tag. " +
|
|
163
|
+
"Pass --base <branch> to record it explicitly.");
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
export async function runRecordReview(opts) {
|
|
167
|
+
const { note, cwd, sessionId } = initRecordVerb(opts, "review");
|
|
168
|
+
const summaryResult = requireNonEmpty(opts.summary, "summary", sessionId, note);
|
|
169
|
+
if (!summaryResult.ok)
|
|
170
|
+
return summaryResult.result;
|
|
171
|
+
const summary = summaryResult.value;
|
|
172
|
+
const prResult = requireNonEmpty(opts.pr, "--pr", sessionId, note);
|
|
173
|
+
if (!prResult.ok)
|
|
174
|
+
return prResult.result;
|
|
175
|
+
const pr = prResult.value;
|
|
176
|
+
const branchResult = resolveRequiredBranch(cwd, opts.branch, sessionId, note);
|
|
177
|
+
if (!branchResult.ok)
|
|
178
|
+
return branchResult.result;
|
|
179
|
+
const branch = branchResult.branch;
|
|
180
|
+
const base = resolveBase(cwd, opts.base, note);
|
|
181
|
+
const content = `review:${pr} review:${branch}${base ? ` review:${base}` : ""} — ${summary}`;
|
|
182
|
+
return finishRecordWrite(opts, sessionId, branch, LEDGER_SOURCE_REVIEW, content, note);
|
|
183
|
+
}
|
|
184
|
+
export async function runRecordReviewSubagent(opts) {
|
|
185
|
+
const { note, cwd, sessionId } = initRecordVerb(opts, "review-subagent");
|
|
186
|
+
const taskResult = requireNonEmpty(opts.task, "--task", sessionId, note);
|
|
187
|
+
if (!taskResult.ok)
|
|
188
|
+
return taskResult.result;
|
|
189
|
+
const task = taskResult.value;
|
|
190
|
+
const verdictResult = requireNonEmpty(opts.verdict, "--verdict", sessionId, note);
|
|
191
|
+
if (!verdictResult.ok)
|
|
192
|
+
return verdictResult.result;
|
|
193
|
+
const verdict = verdictResult.value;
|
|
194
|
+
const branchResult = resolveRequiredBranch(cwd, opts.branch, sessionId, note);
|
|
195
|
+
if (!branchResult.ok)
|
|
196
|
+
return branchResult.result;
|
|
197
|
+
const branch = branchResult.branch;
|
|
198
|
+
const summary = typeof opts.summary === "string" ? opts.summary.trim() : "";
|
|
199
|
+
const content = `review-subagent:${task} review-subagent:${branch} verdict:${verdict}${summary.length > 0 ? ` — ${summary}` : ""}`;
|
|
200
|
+
return finishRecordWrite(opts, sessionId, branch, LEDGER_SOURCE_REVIEW_SUBAGENT, content, note);
|
|
201
|
+
}
|
|
202
|
+
export async function runRecordDogfood(opts) {
|
|
203
|
+
const { note, sessionId } = initRecordVerb(opts, "dogfood");
|
|
204
|
+
const summaryResult = requireNonEmpty(opts.summary, "summary", sessionId, note);
|
|
205
|
+
if (!summaryResult.ok)
|
|
206
|
+
return summaryResult.result;
|
|
207
|
+
const summary = summaryResult.value;
|
|
208
|
+
const content = `dogfood:${sessionId} — ${summary}`;
|
|
209
|
+
return finishRecordWrite(opts, sessionId, "", LEDGER_SOURCE_DOGFOOD, content, note);
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/record/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export interface PreflightJson {
|
|
|
8
8
|
name?: string;
|
|
9
9
|
status?: string;
|
|
10
10
|
message?: string;
|
|
11
|
+
details?: string[];
|
|
11
12
|
}>;
|
|
12
13
|
}
|
|
13
14
|
export type RunPreflightResult = {
|
|
@@ -34,6 +35,13 @@ export interface SessionStartPreflightOptions extends LoaderOptions {
|
|
|
34
35
|
ledgerTimeoutMs?: number;
|
|
35
36
|
/** Inject the preflight runner (tests). */
|
|
36
37
|
runPreflight?: (cwd: string, timeoutMs: number) => Promise<RunPreflightResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Directory the not-ready diagnostic JSON is persisted to (task
|
|
40
|
+
* T-001). Test seam — production defaults to `~/.harness/logs`
|
|
41
|
+
* (`os.homedir()`-based). Always pass a tmp dir in tests so nothing
|
|
42
|
+
* ever touches the operator's real `~/.harness/logs/`.
|
|
43
|
+
*/
|
|
44
|
+
logDir?: string;
|
|
37
45
|
/** Inject the ledger writer (tests). */
|
|
38
46
|
writeLedger?: (args: {
|
|
39
47
|
sessionId: string;
|
|
@@ -86,4 +94,17 @@ export interface SessionStartPreflightResult {
|
|
|
86
94
|
/** Human-readable explanation of a non-write outcome, for diagnostics. */
|
|
87
95
|
reason?: string;
|
|
88
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Environment for the spawned `preflight` child: the parent env minus
|
|
99
|
+
* HARNESS_ALLOW_REAL_GENERATED_DIR. The launcher sets that flag so the
|
|
100
|
+
* real harness binary may fall back to the operator's home dir, but the
|
|
101
|
+
* preflight child runs the repo's own test suite (its `npm-test` check),
|
|
102
|
+
* and an inherited flag re-enables the implicit real-homedir fallback
|
|
103
|
+
* INSIDE those test processes. With non-empty operator state (e.g. a
|
|
104
|
+
* `harness pause` sentinel) that broke 110 tests and surfaced as a false
|
|
105
|
+
* `failing: npm-test`, keeping the preflight gate shut. Third incident
|
|
106
|
+
* of the operator-state-isolation class PR #199 pinned; the flag must
|
|
107
|
+
* stay scoped to the process the operator actually invoked.
|
|
108
|
+
*/
|
|
109
|
+
export declare function preflightChildEnv(parentEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
89
110
|
export declare function runSessionStartPreflight(opts?: SessionStartPreflightOptions): Promise<SessionStartPreflightResult>;
|