@lannguyensi/harness 0.6.0 → 0.8.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 +255 -0
- package/README.md +189 -148
- package/dist/cli/apply/apply.d.ts +13 -0
- package/dist/cli/apply/apply.js +59 -3
- package/dist/cli/apply/apply.js.map +1 -1
- package/dist/cli/apply/generate-codex-config.d.ts +6 -0
- package/dist/cli/apply/generate-codex-config.js +149 -0
- package/dist/cli/apply/generate-codex-config.js.map +1 -0
- package/dist/cli/apply/generate-settings.d.ts +15 -1
- package/dist/cli/apply/generate-settings.js +16 -1
- package/dist/cli/apply/generate-settings.js.map +1 -1
- package/dist/cli/apply/index.d.ts +2 -1
- package/dist/cli/apply/index.js +2 -1
- package/dist/cli/apply/index.js.map +1 -1
- package/dist/cli/approve/understanding.d.ts +39 -0
- package/dist/cli/approve/understanding.js +122 -0
- package/dist/cli/approve/understanding.js.map +1 -0
- package/dist/cli/describe.d.ts +1 -1
- package/dist/cli/describe.js +2 -0
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/doctor/codex.d.ts +34 -0
- package/dist/cli/doctor/codex.js +331 -0
- package/dist/cli/doctor/codex.js.map +1 -0
- package/dist/cli/doctor/format.js +29 -1
- package/dist/cli/doctor/format.js.map +1 -1
- package/dist/cli/doctor/index.d.ts +13 -1
- package/dist/cli/doctor/index.js +49 -1
- package/dist/cli/doctor/index.js.map +1 -1
- package/dist/cli/doctor/types.d.ts +35 -1
- package/dist/cli/doctor/types.js +12 -1
- package/dist/cli/doctor/types.js.map +1 -1
- package/dist/cli/explain.d.ts +10 -1
- package/dist/cli/explain.js +44 -18
- package/dist/cli/explain.js.map +1 -1
- package/dist/cli/index.js +315 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/list.d.ts +1 -1
- package/dist/cli/list.js +17 -0
- package/dist/cli/list.js.map +1 -1
- package/dist/cli/pack/add.d.ts +13 -0
- package/dist/cli/pack/add.js +71 -0
- package/dist/cli/pack/add.js.map +1 -0
- package/dist/cli/pack/hook-codex-pre-tool-use.d.ts +30 -0
- package/dist/cli/pack/hook-codex-pre-tool-use.js +149 -0
- package/dist/cli/pack/hook-codex-pre-tool-use.js.map +1 -0
- package/dist/cli/pack/hook-codex-stop.d.ts +31 -0
- package/dist/cli/pack/hook-codex-stop.js +332 -0
- package/dist/cli/pack/hook-codex-stop.js.map +1 -0
- package/dist/cli/pack/hook-codex-user-prompt-submit.d.ts +18 -0
- package/dist/cli/pack/hook-codex-user-prompt-submit.js +92 -0
- package/dist/cli/pack/hook-codex-user-prompt-submit.js.map +1 -0
- package/dist/cli/pack/hook-pre-tool-use.d.ts +32 -0
- package/dist/cli/pack/hook-pre-tool-use.js +181 -0
- package/dist/cli/pack/hook-pre-tool-use.js.map +1 -0
- package/dist/cli/pack/index.d.ts +4 -0
- package/dist/cli/pack/index.js +5 -0
- package/dist/cli/pack/index.js.map +1 -0
- package/dist/cli/pack/list.d.ts +10 -0
- package/dist/cli/pack/list.js +43 -0
- package/dist/cli/pack/list.js.map +1 -0
- package/dist/cli/pack/mutate.d.ts +14 -0
- package/dist/cli/pack/mutate.js +76 -0
- package/dist/cli/pack/mutate.js.map +1 -0
- package/dist/cli/pack/remove.d.ts +15 -0
- package/dist/cli/pack/remove.js +153 -0
- package/dist/cli/pack/remove.js.map +1 -0
- package/dist/cli/session-export/index.d.ts +46 -0
- package/dist/cli/session-export/index.js +169 -0
- package/dist/cli/session-export/index.js.map +1 -0
- package/dist/cli/session-export/redact.d.ts +22 -0
- package/dist/cli/session-export/redact.js +47 -0
- package/dist/cli/session-export/redact.js.map +1 -0
- package/dist/cli/session-export/transcript.d.ts +24 -0
- package/dist/cli/session-export/transcript.js +162 -0
- package/dist/cli/session-export/transcript.js.map +1 -0
- package/dist/cli/validate/checks.js +32 -0
- package/dist/cli/validate/checks.js.map +1 -1
- package/dist/policies/ledger-client.js +2 -1
- package/dist/policies/ledger-client.js.map +1 -1
- package/dist/policy-packs/builtin/permission-profiles.d.ts +11 -0
- package/dist/policy-packs/builtin/permission-profiles.js +74 -0
- package/dist/policy-packs/builtin/permission-profiles.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.d.ts +56 -0
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js +186 -0
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution.d.ts +15 -0
- package/dist/policy-packs/builtin/understanding-before-execution.js +254 -0
- package/dist/policy-packs/builtin/understanding-before-execution.js.map +1 -0
- package/dist/policy-packs/expand.d.ts +4 -0
- package/dist/policy-packs/expand.js +90 -0
- package/dist/policy-packs/expand.js.map +1 -0
- package/dist/policy-packs/index.d.ts +5 -0
- package/dist/policy-packs/index.js +5 -0
- package/dist/policy-packs/index.js.map +1 -0
- package/dist/policy-packs/permission-translator.d.ts +9 -0
- package/dist/policy-packs/permission-translator.js +76 -0
- package/dist/policy-packs/permission-translator.js.map +1 -0
- package/dist/policy-packs/registry.d.ts +11 -0
- package/dist/policy-packs/registry.js +20 -0
- package/dist/policy-packs/registry.js.map +1 -0
- package/dist/policy-packs/runtime.d.ts +8 -0
- package/dist/policy-packs/runtime.js +30 -0
- package/dist/policy-packs/runtime.js.map +1 -0
- package/dist/policy-packs/source.d.ts +6 -0
- package/dist/policy-packs/source.js +10 -0
- package/dist/policy-packs/source.js.map +1 -0
- package/dist/policy-packs/types.d.ts +41 -0
- package/dist/policy-packs/types.js +11 -0
- package/dist/policy-packs/types.js.map +1 -0
- package/dist/probes/mcp.js +2 -1
- package/dist/probes/mcp.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/ledger-add.d.ts +16 -0
- package/dist/runtime/ledger-add.js +139 -0
- package/dist/runtime/ledger-add.js.map +1 -0
- package/dist/runtime/ledger-record.js +2 -1
- package/dist/runtime/ledger-record.js.map +1 -1
- package/dist/schema/audit.d.ts +71 -0
- package/dist/schema/audit.js +32 -0
- package/dist/schema/audit.js.map +1 -0
- package/dist/schema/index.d.ts +1893 -10
- package/dist/schema/index.js +27 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/permission-profiles.d.ts +2161 -0
- package/dist/schema/permission-profiles.js +60 -0
- package/dist/schema/permission-profiles.js.map +1 -0
- package/dist/schema/policy-packs.d.ts +52 -0
- package/dist/schema/policy-packs.js +35 -0
- package/dist/schema/policy-packs.js.map +1 -0
- package/dist/schema/tools.d.ts +8 -8
- package/dist/schema/workflows.d.ts +519 -0
- package/dist/schema/workflows.js +81 -0
- package/dist/schema/workflows.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// Phase 6 #4 — `harness approve understanding [--session <id>]` CLI verb.
|
|
2
|
+
//
|
|
3
|
+
// Round-trips both approval sources for the
|
|
4
|
+
// `understanding-before-execution` pack:
|
|
5
|
+
//
|
|
6
|
+
// 1. Writes the evidence-ledger tag `understanding-approved:${SESSION_ID}`
|
|
7
|
+
// via `grounding-mcp`'s `ledger_add` (best-effort: degraded ledger
|
|
8
|
+
// surfaces as a warning, not a hard failure).
|
|
9
|
+
// 2. Flips `approvalStatus: "approved"` on the latest persisted JSON
|
|
10
|
+
// report under `.understanding-gate/reports/`. Atomic rewrite.
|
|
11
|
+
//
|
|
12
|
+
// Rationale for writing both: harnessed sessions consult the ledger as
|
|
13
|
+
// canonical, but a solo `@lannguyensi/understanding-gate` user without
|
|
14
|
+
// `grounding-mcp` wired only sees the persisted JSON. Round-tripping
|
|
15
|
+
// both means switching between the two stacks doesn't lose history.
|
|
16
|
+
import * as fs from "node:fs";
|
|
17
|
+
import * as os from "node:os";
|
|
18
|
+
import * as path from "node:path";
|
|
19
|
+
import { atomicWriteFile } from "../../io/atomic-write.js";
|
|
20
|
+
import { approvedLedgerTagFor, defaultReportsDir, findLatestReportForSession, listPersistedReports, } from "../../policy-packs/builtin/understanding-before-execution-runtime.js";
|
|
21
|
+
import { addLedgerFact } from "../../runtime/ledger-add.js";
|
|
22
|
+
import { EX_FAIL, HarnessExitError } from "../exit-codes.js";
|
|
23
|
+
import { loadManifest } from "../loader.js";
|
|
24
|
+
const DEFAULT_APPROVED_BY = "harness-approve-cli";
|
|
25
|
+
function findGroundingMcp(manifest) {
|
|
26
|
+
return manifest.tools.mcp.find((m) => m.name === "grounding-mcp") ?? null;
|
|
27
|
+
}
|
|
28
|
+
function expandHomePath(p) {
|
|
29
|
+
if (p === "~")
|
|
30
|
+
return process.env.HOME ?? os.homedir();
|
|
31
|
+
if (p.startsWith("~/"))
|
|
32
|
+
return path.join(process.env.HOME ?? os.homedir(), p.slice(2));
|
|
33
|
+
return p;
|
|
34
|
+
}
|
|
35
|
+
async function writeLedgerTag(manifest, sessionId, content, opts) {
|
|
36
|
+
if (opts.ledgerAdd)
|
|
37
|
+
return opts.ledgerAdd(sessionId, content);
|
|
38
|
+
const server = findGroundingMcp(manifest);
|
|
39
|
+
if (!server) {
|
|
40
|
+
return { ok: false, reason: "grounding-mcp not declared in manifest" };
|
|
41
|
+
}
|
|
42
|
+
const command = Array.isArray(server.command)
|
|
43
|
+
? server.command.map(expandHomePath)
|
|
44
|
+
: server.command.trim().split(/\s+/).map(expandHomePath);
|
|
45
|
+
return addLedgerFact({
|
|
46
|
+
mcpCommand: command,
|
|
47
|
+
...(server.env && { mcpEnv: server.env }),
|
|
48
|
+
timeoutMs: server.health?.timeout_ms ?? 5_000,
|
|
49
|
+
sessionId,
|
|
50
|
+
content,
|
|
51
|
+
source: "harness-approve-understanding",
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function rewriteReportApproved(filePath, approvedAt, approvedBy) {
|
|
55
|
+
const raw = fs.readFileSync(filePath, "utf8");
|
|
56
|
+
const parsed = JSON.parse(raw);
|
|
57
|
+
const previousStatus = typeof parsed["approvalStatus"] === "string" ? parsed["approvalStatus"] : null;
|
|
58
|
+
parsed["approvalStatus"] = "approved";
|
|
59
|
+
parsed["approvedAt"] = approvedAt;
|
|
60
|
+
parsed["approvedBy"] = approvedBy;
|
|
61
|
+
atomicWriteFile(filePath, `${JSON.stringify(parsed, null, 2)}\n`);
|
|
62
|
+
return { previousStatus };
|
|
63
|
+
}
|
|
64
|
+
export async function approveUnderstanding(opts = {}) {
|
|
65
|
+
const sessionId = opts.session ?? process.env.CLAUDE_SESSION_ID ?? "";
|
|
66
|
+
if (sessionId === "") {
|
|
67
|
+
throw new HarnessExitError("no session id available. Pass --session <id> or set $CLAUDE_SESSION_ID.", EX_FAIL);
|
|
68
|
+
}
|
|
69
|
+
// Manifest is required for the ledger write path; if it can't load,
|
|
70
|
+
// we still try to flip the persisted report so a solo user benefits.
|
|
71
|
+
let manifest = null;
|
|
72
|
+
try {
|
|
73
|
+
manifest = opts.manifest ?? loadManifest(opts).manifest;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
/* swallow; ledger write becomes a degraded-ok */
|
|
77
|
+
}
|
|
78
|
+
const tag = approvedLedgerTagFor(sessionId);
|
|
79
|
+
const ledgerResult = manifest
|
|
80
|
+
? await writeLedgerTag(manifest, sessionId, tag, opts)
|
|
81
|
+
: { ok: false, reason: "manifest unreadable; skipped ledger write" };
|
|
82
|
+
// Persisted report: flip the latest matching one.
|
|
83
|
+
const reportsDir = opts.reportsDir ?? defaultReportsDir();
|
|
84
|
+
const reports = listPersistedReports(reportsDir);
|
|
85
|
+
const latest = findLatestReportForSession(reports, sessionId);
|
|
86
|
+
let persistedReport;
|
|
87
|
+
if (!latest) {
|
|
88
|
+
persistedReport = {
|
|
89
|
+
ok: false,
|
|
90
|
+
reason: reports.length === 0
|
|
91
|
+
? `no reports found at ${reportsDir}`
|
|
92
|
+
: `no report matched session_id=${sessionId} (${reports.length} report(s) for other sessions)`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const approvedAt = (opts.now ?? new Date()).toISOString();
|
|
97
|
+
const approvedBy = opts.approvedBy ?? DEFAULT_APPROVED_BY;
|
|
98
|
+
try {
|
|
99
|
+
const { previousStatus } = rewriteReportApproved(latest.filePath, approvedAt, approvedBy);
|
|
100
|
+
persistedReport = {
|
|
101
|
+
ok: true,
|
|
102
|
+
filePath: latest.filePath,
|
|
103
|
+
previousStatus,
|
|
104
|
+
approvedAt,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
persistedReport = {
|
|
109
|
+
ok: false,
|
|
110
|
+
reason: `failed to rewrite ${latest.filePath}: ${err.message}`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
sessionId,
|
|
116
|
+
ledger: ledgerResult.ok
|
|
117
|
+
? { ok: true, tag }
|
|
118
|
+
: { ok: false, tag, reason: ledgerResult.reason },
|
|
119
|
+
persistedReport,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=understanding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"understanding.js","sourceRoot":"","sources":["../../../src/cli/approve/understanding.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/describe.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Manifest } from "../schema/index.js";
|
|
2
2
|
import { type LoaderOptions } from "./loader.js";
|
|
3
|
-
export type Pillar = "grounding" | "tools" | "memory" | "hooks" | "policies";
|
|
3
|
+
export type Pillar = "grounding" | "tools" | "memory" | "hooks" | "policies" | "workflows" | "review_templates";
|
|
4
4
|
export declare function isPillar(value: string): value is Pillar;
|
|
5
5
|
export interface DescribeOptions extends LoaderOptions {
|
|
6
6
|
pillar?: Pillar;
|
package/dist/cli/describe.js
CHANGED
package/dist/cli/describe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/cli/describe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAElD,OAAO,EAAE,YAAY,EAAsB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/cli/describe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAElD,OAAO,EAAE,YAAY,EAAsB,MAAM,aAAa,CAAC;AAW/D,MAAM,OAAO,GAAsB;IACjC,WAAW;IACX,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;IACV,WAAW;IACX,kBAAkB;CACnB,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAQ,OAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAYD,SAAS,aAAa,CAAC,QAAkB,EAAE,MAAc;IACvD,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAwB,EAAE;IACjD,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAA4B,IAAI,CAAC,MAAM;QACrD,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;QACtC,CAAC,CAAE,QAA+C,CAAC;IAErD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI;QACtB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IAEhD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Manifest } from "../../schema/index.js";
|
|
2
|
+
export type CodexCheckStatus = "ok" | "warn" | "error";
|
|
3
|
+
export interface CodexCheckEntry {
|
|
4
|
+
name: string;
|
|
5
|
+
status: CodexCheckStatus;
|
|
6
|
+
message: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CodexTargetReport {
|
|
9
|
+
target: "codex";
|
|
10
|
+
checks: CodexCheckEntry[];
|
|
11
|
+
}
|
|
12
|
+
export interface RunCodexCheckOptions {
|
|
13
|
+
/** Manifest directory; the codex config is at <dir>/harness.generated/codex/config.toml. */
|
|
14
|
+
manifestDir: string;
|
|
15
|
+
/** Working directory used to resolve the persisted-report path. Defaults to cwd. */
|
|
16
|
+
cwd?: string;
|
|
17
|
+
/** Override for $PATH lookup (test injection). */
|
|
18
|
+
pathEnv?: string;
|
|
19
|
+
/** Override for path existence + executable check (test injection). */
|
|
20
|
+
isExecutable?: (p: string) => boolean;
|
|
21
|
+
/** Override for the `harness` binary location (test injection). */
|
|
22
|
+
harnessBinary?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Override for the `harness --version` probe. Returns null when the
|
|
25
|
+
* probe could not run (binary missing, spawn error, non-zero exit).
|
|
26
|
+
* Returns the trimmed stdout otherwise. Test injection only.
|
|
27
|
+
*/
|
|
28
|
+
versionProbe?: (binary: string) => string | null;
|
|
29
|
+
}
|
|
30
|
+
export declare function runCodexTargetChecks(manifest: Manifest, opts: RunCodexCheckOptions): CodexTargetReport;
|
|
31
|
+
export declare function countCodexDiagnostics(report: CodexTargetReport): {
|
|
32
|
+
errorCount: number;
|
|
33
|
+
warningCount: number;
|
|
34
|
+
};
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
// Phase 6 #6 follow-up — `harness doctor --target codex` checks.
|
|
2
|
+
//
|
|
3
|
+
// Validates the wiring shipped in Phase 6 #6: the harness CLI itself is
|
|
4
|
+
// reachable (so the `harness pack hook codex-*` subcommands resolve),
|
|
5
|
+
// the harness-generated `harness.generated/codex/config.toml` exists,
|
|
6
|
+
// every contributed `[[hooks.*]]` stanza references a command that
|
|
7
|
+
// resolves on PATH, and the persisted-report directory is writable.
|
|
8
|
+
//
|
|
9
|
+
// The checks here intentionally do NOT exercise the actual Codex CLI
|
|
10
|
+
// binary — that is a Codex-runtime concern, out of harness's scope.
|
|
11
|
+
// What this module guarantees is "the harness side of the integration
|
|
12
|
+
// is wired correctly"; whether Codex itself reads the emitted TOML is
|
|
13
|
+
// up to the operator's `~/.codex/config.toml` setup.
|
|
14
|
+
import { spawnSync } from "node:child_process";
|
|
15
|
+
import * as fs from "node:fs";
|
|
16
|
+
import * as path from "node:path";
|
|
17
|
+
import { expandPolicyPacks } from "../../policy-packs/index.js";
|
|
18
|
+
import { VERSION as HARNESS_VERSION } from "../../version.js";
|
|
19
|
+
const HARNESS_COMMAND_PREFIX = "harness ";
|
|
20
|
+
const CODEX_CONFIG_RELPATH = path.join("harness.generated", "codex", "config.toml");
|
|
21
|
+
const REPORTS_RELPATH = path.join(".understanding-gate", "reports");
|
|
22
|
+
function defaultIsExecutable(p) {
|
|
23
|
+
try {
|
|
24
|
+
fs.accessSync(p, fs.constants.X_OK);
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function findOnPath(binary, pathEnv, isExecutable) {
|
|
32
|
+
if (path.isAbsolute(binary)) {
|
|
33
|
+
return fs.existsSync(binary) && isExecutable(binary) ? binary : null;
|
|
34
|
+
}
|
|
35
|
+
for (const seg of pathEnv.split(path.delimiter)) {
|
|
36
|
+
if (!seg)
|
|
37
|
+
continue;
|
|
38
|
+
const candidate = path.join(seg, binary);
|
|
39
|
+
if (fs.existsSync(candidate) && isExecutable(candidate)) {
|
|
40
|
+
return candidate;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
function resolveHookCommand(command, pathEnv, isExecutable) {
|
|
46
|
+
const firstToken = command.trim().split(/\s+/)[0] ?? "";
|
|
47
|
+
if (firstToken === "")
|
|
48
|
+
return { resolved: null, firstToken };
|
|
49
|
+
return {
|
|
50
|
+
resolved: findOnPath(firstToken, pathEnv, isExecutable),
|
|
51
|
+
firstToken,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function resolveHarnessBinary(opts, override) {
|
|
55
|
+
if (override !== undefined) {
|
|
56
|
+
if (override === "" || !fs.existsSync(override) || !opts.isExecutable(override)) {
|
|
57
|
+
return {
|
|
58
|
+
entry: {
|
|
59
|
+
name: "harness binary",
|
|
60
|
+
status: "error",
|
|
61
|
+
message: `harness binary override does not resolve: ${override}`,
|
|
62
|
+
},
|
|
63
|
+
resolved: null,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
entry: {
|
|
68
|
+
name: "harness binary",
|
|
69
|
+
status: "ok",
|
|
70
|
+
message: `resolved (override): ${override}`,
|
|
71
|
+
},
|
|
72
|
+
resolved: override,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const resolved = findOnPath("harness", opts.pathEnv, opts.isExecutable);
|
|
76
|
+
if (!resolved) {
|
|
77
|
+
return {
|
|
78
|
+
entry: {
|
|
79
|
+
name: "harness binary",
|
|
80
|
+
status: "error",
|
|
81
|
+
message: "`harness` not found on PATH; the codex-* subcommands cannot be invoked. Install harness globally or expose its bin via PATH.",
|
|
82
|
+
},
|
|
83
|
+
resolved: null,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
entry: {
|
|
88
|
+
name: "harness binary",
|
|
89
|
+
status: "ok",
|
|
90
|
+
message: `resolved: ${resolved}`,
|
|
91
|
+
},
|
|
92
|
+
resolved,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// Phase 6 #6 ships in 0.7.0 (the version this module is shipped from).
|
|
96
|
+
// A stale `harness` on PATH from before Phase 6 #6 would resolve as a
|
|
97
|
+
// binary but reject the codex-* subcommands at runtime. The
|
|
98
|
+
// version-gate catches that.
|
|
99
|
+
const MIN_VERSION_WITH_CODEX_SUBCOMMANDS = "0.7.0";
|
|
100
|
+
function defaultVersionProbe(binary) {
|
|
101
|
+
try {
|
|
102
|
+
const result = spawnSync(binary, ["--version"], {
|
|
103
|
+
encoding: "utf8",
|
|
104
|
+
timeout: 5_000,
|
|
105
|
+
});
|
|
106
|
+
if (result.status !== 0 || result.error)
|
|
107
|
+
return null;
|
|
108
|
+
return (result.stdout ?? "").trim();
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function compareSemver(a, b) {
|
|
115
|
+
const aa = a.split(".").map((n) => Number.parseInt(n, 10));
|
|
116
|
+
const bb = b.split(".").map((n) => Number.parseInt(n, 10));
|
|
117
|
+
const len = Math.max(aa.length, bb.length);
|
|
118
|
+
for (let i = 0; i < len; i++) {
|
|
119
|
+
const ai = aa[i] ?? 0;
|
|
120
|
+
const bi = bb[i] ?? 0;
|
|
121
|
+
if (Number.isNaN(ai) || Number.isNaN(bi))
|
|
122
|
+
return 0;
|
|
123
|
+
if (ai > bi)
|
|
124
|
+
return 1;
|
|
125
|
+
if (ai < bi)
|
|
126
|
+
return -1;
|
|
127
|
+
}
|
|
128
|
+
return 0;
|
|
129
|
+
}
|
|
130
|
+
function checkSubcommandsAvailable(harnessBinaryPath, versionProbe) {
|
|
131
|
+
// When the binary is missing the operator already gets a clear error
|
|
132
|
+
// from `checkHarnessBinary`; emitting a second cascade-error here
|
|
133
|
+
// would double-count in `errorCount` for one root cause. Skip
|
|
134
|
+
// entirely.
|
|
135
|
+
if (!harnessBinaryPath) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
const stdout = versionProbe(harnessBinaryPath);
|
|
139
|
+
if (stdout === null) {
|
|
140
|
+
return {
|
|
141
|
+
name: "codex-* subcommands",
|
|
142
|
+
status: "warn",
|
|
143
|
+
message: `\`${harnessBinaryPath} --version\` did not respond cleanly; cannot confirm the codex-* subcommands are wired (need >= ${MIN_VERSION_WITH_CODEX_SUBCOMMANDS})`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const m = stdout.match(/(\d+(?:\.\d+){0,3})/);
|
|
147
|
+
if (!m || !m[1]) {
|
|
148
|
+
return {
|
|
149
|
+
name: "codex-* subcommands",
|
|
150
|
+
status: "warn",
|
|
151
|
+
message: `could not parse a version from "${stdout}"; cannot confirm the codex-* subcommands are wired`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const actual = m[1];
|
|
155
|
+
if (compareSemver(actual, MIN_VERSION_WITH_CODEX_SUBCOMMANDS) < 0) {
|
|
156
|
+
return {
|
|
157
|
+
name: "codex-* subcommands",
|
|
158
|
+
status: "error",
|
|
159
|
+
message: `harness on PATH is v${actual}; codex-* subcommands require >= ${MIN_VERSION_WITH_CODEX_SUBCOMMANDS}. Update the harness install.`,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// Sanity-check against the version this module is shipped from: if
|
|
163
|
+
// the harness on PATH is markedly newer or older than the in-process
|
|
164
|
+
// version, the operator probably has more than one harness install.
|
|
165
|
+
// Not an error; just informative.
|
|
166
|
+
const note = actual !== HARNESS_VERSION
|
|
167
|
+
? ` (in-process v${HARNESS_VERSION}; mismatch is harmless if intentional)`
|
|
168
|
+
: "";
|
|
169
|
+
return {
|
|
170
|
+
name: "codex-* subcommands",
|
|
171
|
+
status: "ok",
|
|
172
|
+
message: `harness on PATH v${actual} >= ${MIN_VERSION_WITH_CODEX_SUBCOMMANDS}${note}`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
function checkConfigToml(manifestDir) {
|
|
176
|
+
const target = path.join(manifestDir, CODEX_CONFIG_RELPATH);
|
|
177
|
+
if (!fs.existsSync(target)) {
|
|
178
|
+
return {
|
|
179
|
+
name: "codex config artefact",
|
|
180
|
+
status: "error",
|
|
181
|
+
message: `${target} not found; run \`harness apply --runtime codex\` first`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
let content;
|
|
185
|
+
try {
|
|
186
|
+
content = fs.readFileSync(target, "utf8");
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
return {
|
|
190
|
+
name: "codex config artefact",
|
|
191
|
+
status: "error",
|
|
192
|
+
message: `cannot read ${target}: ${err.message}`,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
if (!content.includes("Generated by harness apply --runtime codex")) {
|
|
196
|
+
return {
|
|
197
|
+
name: "codex config artefact",
|
|
198
|
+
status: "warn",
|
|
199
|
+
message: `${target} exists but does not carry the harness-managed banner; was it hand-edited?`,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
name: "codex config artefact",
|
|
204
|
+
status: "ok",
|
|
205
|
+
message: `present: ${target}`,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function codexHooksFromManifest(manifest) {
|
|
209
|
+
const expansion = expandPolicyPacks(manifest, "codex");
|
|
210
|
+
// The manifest's own hooks[] AND the codex-pack expansion both ship
|
|
211
|
+
// into the generated TOML, so we check both.
|
|
212
|
+
const all = [...manifest.hooks, ...expansion.hooks];
|
|
213
|
+
return all;
|
|
214
|
+
}
|
|
215
|
+
function checkHookCommands(manifest, pathEnv, isExecutable) {
|
|
216
|
+
const hooks = codexHooksFromManifest(manifest);
|
|
217
|
+
if (hooks.length === 0) {
|
|
218
|
+
return [
|
|
219
|
+
{
|
|
220
|
+
name: "codex hook commands",
|
|
221
|
+
status: "warn",
|
|
222
|
+
message: "no hooks contributed; codex config will be empty",
|
|
223
|
+
},
|
|
224
|
+
];
|
|
225
|
+
}
|
|
226
|
+
const out = [];
|
|
227
|
+
for (const h of hooks) {
|
|
228
|
+
const { resolved, firstToken } = resolveHookCommand(h.command, pathEnv, isExecutable);
|
|
229
|
+
if (firstToken === "") {
|
|
230
|
+
out.push({
|
|
231
|
+
name: `hook ${h.name}`,
|
|
232
|
+
status: "error",
|
|
233
|
+
message: "empty command after parsing",
|
|
234
|
+
});
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
// Bare `harness` subcommands resolve as long as the harness binary
|
|
238
|
+
// does (already checked above); skip the per-hook PATH lookup for
|
|
239
|
+
// them so the error tally doesn't double-count a missing harness.
|
|
240
|
+
// Bare `harness <subcommand>` form: any operator-authored hook that
|
|
241
|
+
// calls into the harness binary lands here, not just pack-contributed
|
|
242
|
+
// ones. The harness-binary check above is the upstream gate; the
|
|
243
|
+
// version-gate (`checkSubcommandsAvailable`) catches stale installs
|
|
244
|
+
// that would reject the subcommand at runtime.
|
|
245
|
+
if (h.command.startsWith(HARNESS_COMMAND_PREFIX)) {
|
|
246
|
+
out.push({
|
|
247
|
+
name: `hook ${h.name}`,
|
|
248
|
+
status: "ok",
|
|
249
|
+
message: `subcommand of harness: ${h.command}`,
|
|
250
|
+
});
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
if (!resolved) {
|
|
254
|
+
out.push({
|
|
255
|
+
name: `hook ${h.name}`,
|
|
256
|
+
status: "error",
|
|
257
|
+
message: `command first token "${firstToken}" not found on PATH (${h.command})`,
|
|
258
|
+
});
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
out.push({
|
|
262
|
+
name: `hook ${h.name}`,
|
|
263
|
+
status: "ok",
|
|
264
|
+
message: `resolved: ${resolved}`,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
return out;
|
|
268
|
+
}
|
|
269
|
+
function checkReportsDir(cwd) {
|
|
270
|
+
const dir = path.join(cwd, REPORTS_RELPATH);
|
|
271
|
+
// We do NOT require the directory to exist (a fresh project has no
|
|
272
|
+
// reports yet). What we do require is that we can either create it
|
|
273
|
+
// or write into it. Best-effort probe: if the parent is writable,
|
|
274
|
+
// we are fine.
|
|
275
|
+
const parent = path.dirname(dir);
|
|
276
|
+
let target;
|
|
277
|
+
if (fs.existsSync(dir)) {
|
|
278
|
+
target = dir;
|
|
279
|
+
}
|
|
280
|
+
else if (fs.existsSync(parent)) {
|
|
281
|
+
target = parent;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
target = cwd;
|
|
285
|
+
}
|
|
286
|
+
try {
|
|
287
|
+
fs.accessSync(target, fs.constants.W_OK);
|
|
288
|
+
return {
|
|
289
|
+
name: "persisted-report directory",
|
|
290
|
+
status: "ok",
|
|
291
|
+
message: fs.existsSync(dir)
|
|
292
|
+
? `${dir} writable`
|
|
293
|
+
: `${dir} not present; ${target} is writable (the directory is created on first report)`,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
return {
|
|
298
|
+
name: "persisted-report directory",
|
|
299
|
+
status: "warn",
|
|
300
|
+
message: `cannot write to ${target}; the Stop-equivalent (when shipped) will fail to capture reports`,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
export function runCodexTargetChecks(manifest, opts) {
|
|
305
|
+
const pathEnv = opts.pathEnv ?? process.env["PATH"] ?? "";
|
|
306
|
+
const isExecutable = opts.isExecutable ?? defaultIsExecutable;
|
|
307
|
+
const versionProbe = opts.versionProbe ?? defaultVersionProbe;
|
|
308
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
309
|
+
const checks = [];
|
|
310
|
+
const harnessResult = resolveHarnessBinary({ pathEnv, isExecutable }, opts.harnessBinary);
|
|
311
|
+
checks.push(harnessResult.entry);
|
|
312
|
+
const subcmdEntry = checkSubcommandsAvailable(harnessResult.resolved, versionProbe);
|
|
313
|
+
if (subcmdEntry !== null)
|
|
314
|
+
checks.push(subcmdEntry);
|
|
315
|
+
checks.push(checkConfigToml(opts.manifestDir));
|
|
316
|
+
checks.push(...checkHookCommands(manifest, pathEnv, isExecutable));
|
|
317
|
+
checks.push(checkReportsDir(cwd));
|
|
318
|
+
return { target: "codex", checks };
|
|
319
|
+
}
|
|
320
|
+
export function countCodexDiagnostics(report) {
|
|
321
|
+
let errorCount = 0;
|
|
322
|
+
let warningCount = 0;
|
|
323
|
+
for (const c of report.checks) {
|
|
324
|
+
if (c.status === "error")
|
|
325
|
+
errorCount += 1;
|
|
326
|
+
else if (c.status === "warn")
|
|
327
|
+
warningCount += 1;
|
|
328
|
+
}
|
|
329
|
+
return { errorCount, warningCount };
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli/doctor/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { VERSION } from "../../version.js";
|
|
2
2
|
function mcpLine(r, shallow) {
|
|
3
3
|
switch (r.outcome.kind) {
|
|
4
4
|
case "healthy":
|
|
@@ -118,6 +118,32 @@ function formatPoliciesSection(report) {
|
|
|
118
118
|
out.push(` (no policies declared)`);
|
|
119
119
|
return out;
|
|
120
120
|
}
|
|
121
|
+
function formatWorkflowsSection(report) {
|
|
122
|
+
const w = report.workflows;
|
|
123
|
+
if (w.declared === 0 && w.templates === 0)
|
|
124
|
+
return [];
|
|
125
|
+
const out = ["", "Workflows"];
|
|
126
|
+
out.push(` ${w.declared} declared, ${w.templates} review template${w.templates === 1 ? "" : "s"}`);
|
|
127
|
+
for (const e of w.entries) {
|
|
128
|
+
const review = e.reviewSpawn
|
|
129
|
+
? `review: ${e.reviewSpawn}${e.reviewTemplate ? ` (${e.reviewTemplate})` : ""}`
|
|
130
|
+
: "no review_subagent step";
|
|
131
|
+
const merge = e.mergeGate ? `, merge.gate: ${e.mergeGate}` : "";
|
|
132
|
+
const labels = e.taskLabels.length > 0 ? `, labels: ${e.taskLabels.join(",")}` : "";
|
|
133
|
+
out.push(` ✓ ${e.name} ${e.steps} steps, ${review}${merge}${labels}`);
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
function formatCodexTargetSection(report) {
|
|
138
|
+
if (!report.codexTarget)
|
|
139
|
+
return [];
|
|
140
|
+
const out = ["", "Target: codex"];
|
|
141
|
+
for (const c of report.codexTarget.checks) {
|
|
142
|
+
const marker = c.status === "ok" ? "✓" : c.status === "warn" ? "⚠" : "✗";
|
|
143
|
+
out.push(` ${marker} ${c.name} ${c.message}`);
|
|
144
|
+
}
|
|
145
|
+
return out;
|
|
146
|
+
}
|
|
121
147
|
function formatSummary(report) {
|
|
122
148
|
const out = ["", "Summary"];
|
|
123
149
|
const errLabel = report.errorCount === 1 ? "error" : "errors";
|
|
@@ -133,6 +159,8 @@ export function format(report) {
|
|
|
133
159
|
lines.push(...formatMemorySection(report));
|
|
134
160
|
lines.push(...formatHooksSection(report));
|
|
135
161
|
lines.push(...formatPoliciesSection(report));
|
|
162
|
+
lines.push(...formatWorkflowsSection(report));
|
|
163
|
+
lines.push(...formatCodexTargetSection(report));
|
|
136
164
|
lines.push(...formatSummary(report));
|
|
137
165
|
lines.push("");
|
|
138
166
|
return lines.join("\n");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli/doctor/format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli/doctor/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type McpProbe } from "../../probes/mcp.js";
|
|
2
2
|
import { type LoaderOptions } from "../loader.js";
|
|
3
|
-
import type
|
|
3
|
+
import { type RunCodexCheckOptions } from "./codex.js";
|
|
4
|
+
import { isDoctorTarget, KNOWN_DOCTOR_TARGETS, type DoctorReport, type DoctorTarget } from "./types.js";
|
|
4
5
|
export interface DoctorOptions extends LoaderOptions {
|
|
5
6
|
shallow?: boolean;
|
|
6
7
|
mcpProbe?: McpProbe;
|
|
@@ -8,7 +9,18 @@ export interface DoctorOptions extends LoaderOptions {
|
|
|
8
9
|
versionProbe?: (cmd: string[]) => string | null;
|
|
9
10
|
now?: Date;
|
|
10
11
|
homeOverride?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Phase 6 #6 follow-up: when set to `codex`, run the harness-side
|
|
14
|
+
* codex adapter health checks in addition to the default suite.
|
|
15
|
+
* Future runtimes plug in here without restructuring the surface.
|
|
16
|
+
* Restricted to targets that have a wired adapter-health module
|
|
17
|
+
* (today: `codex`); see `KNOWN_DOCTOR_TARGETS`.
|
|
18
|
+
*/
|
|
19
|
+
target?: DoctorTarget;
|
|
20
|
+
/** Test-injection knobs forwarded to the codex target evaluator. */
|
|
21
|
+
codexCheckOptions?: Partial<RunCodexCheckOptions>;
|
|
11
22
|
}
|
|
23
|
+
export { isDoctorTarget, KNOWN_DOCTOR_TARGETS };
|
|
12
24
|
export declare function doctor(opts?: DoctorOptions): Promise<DoctorReport>;
|
|
13
25
|
export { format } from "./format.js";
|
|
14
26
|
export type * from "./types.js";
|