@lannguyensi/harness 0.23.1 → 0.24.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 +27 -0
- package/dist/cli/add/index.js +2 -2
- package/dist/cli/add/index.js.map +1 -1
- package/dist/cli/adopt/index.js +2 -2
- package/dist/cli/adopt/index.js.map +1 -1
- package/dist/cli/apply/apply.d.ts +19 -0
- package/dist/cli/apply/apply.js +65 -6
- package/dist/cli/apply/apply.js.map +1 -1
- package/dist/cli/apply/generate-codex-config.js +43 -36
- package/dist/cli/apply/generate-codex-config.js.map +1 -1
- package/dist/cli/apply/index.d.ts +2 -1
- package/dist/cli/apply/index.js +1 -0
- package/dist/cli/apply/index.js.map +1 -1
- package/dist/cli/apply/install-codex-config.d.ts +28 -0
- package/dist/cli/apply/install-codex-config.js +171 -0
- package/dist/cli/apply/install-codex-config.js.map +1 -0
- package/dist/cli/approve/understanding.d.ts +1 -1
- package/dist/cli/approve/understanding.js +55 -30
- package/dist/cli/approve/understanding.js.map +1 -1
- package/dist/cli/diff/since-apply.js +2 -2
- package/dist/cli/diff/since-apply.js.map +1 -1
- package/dist/cli/index.js +69 -36
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/composer.js +4 -4
- package/dist/cli/init/composer.js.map +1 -1
- package/dist/cli/init/index.js +2 -2
- package/dist/cli/init/index.js.map +1 -1
- package/dist/cli/init/interactive.js +15 -5
- package/dist/cli/init/interactive.js.map +1 -1
- package/dist/cli/init/profiles.d.ts +2 -2
- package/dist/cli/init/profiles.js +6 -6
- package/dist/cli/init/profiles.js.map +1 -1
- package/dist/cli/init/templates.d.ts +2 -2
- package/dist/cli/init/templates.js +16 -16
- package/dist/cli/loader.js +12 -8
- package/dist/cli/loader.js.map +1 -1
- package/dist/cli/main.js +4 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/migrate-home/index.d.ts +39 -0
- package/dist/cli/migrate-home/index.js +194 -0
- package/dist/cli/migrate-home/index.js.map +1 -0
- package/dist/cli/pack/add.js +2 -2
- package/dist/cli/pack/add.js.map +1 -1
- package/dist/cli/pack/hook-codex-pre-tool-use.js +16 -1
- package/dist/cli/pack/hook-codex-pre-tool-use.js.map +1 -1
- package/dist/cli/pack/remove.js +2 -2
- package/dist/cli/pack/remove.js.map +1 -1
- package/dist/cli/remove/index.js +2 -2
- package/dist/cli/remove/index.js.map +1 -1
- package/dist/policy-packs/builtin/understanding-before-execution.js +23 -13
- package/dist/policy-packs/builtin/understanding-before-execution.js.map +1 -1
- package/dist/runtime/home-dir.d.ts +39 -0
- package/dist/runtime/home-dir.js +105 -0
- package/dist/runtime/home-dir.js.map +1 -0
- package/dist/runtime/intercept.js +10 -6
- package/dist/runtime/intercept.js.map +1 -1
- package/dist/runtime/tool-name-aliases.d.ts +7 -0
- package/dist/runtime/tool-name-aliases.js +74 -0
- package/dist/runtime/tool-name-aliases.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Runtime-neutral harness home-dir resolver.
|
|
2
|
+
//
|
|
3
|
+
// The harness's operator-state root was historically hardcoded to
|
|
4
|
+
// `~/.claude/`. Phase 6 #6 added Codex as a first-class runtime
|
|
5
|
+
// (task e65decef); the `.claude/` naming became misleading for
|
|
6
|
+
// Codex-only operators who never installed Claude Code. v0.24.0
|
|
7
|
+
// introduces `~/.harness/` as the runtime-neutral root, with a
|
|
8
|
+
// legacy fallback to `~/.claude/` so existing v0.23.x installs
|
|
9
|
+
// continue to work.
|
|
10
|
+
//
|
|
11
|
+
// Resolution precedence:
|
|
12
|
+
// 1. Explicit `homeDir` parameter (test injection, `--home` flag).
|
|
13
|
+
// 2. `$HARNESS_HOME` env var (pin without flag).
|
|
14
|
+
// 3. `~/.harness/` if it exists on disk.
|
|
15
|
+
// 4. `~/.claude/` if the legacy `harness.generated/` directory or
|
|
16
|
+
// `harness.yaml` manifest exists there (legacy fallback with
|
|
17
|
+
// one-shot stderr deprecation warning per process).
|
|
18
|
+
// 5. `~/.harness/` as the create-on-first-use target.
|
|
19
|
+
//
|
|
20
|
+
// The legacy fallback warning fires at most ONCE per process. Multiple
|
|
21
|
+
// callers (manifest load, apply, doctor, …) resolve through the same
|
|
22
|
+
// helper; a per-call warning would be noise. The warning text names
|
|
23
|
+
// the `harness migrate-home` command so the operator has an explicit
|
|
24
|
+
// next step.
|
|
25
|
+
//
|
|
26
|
+
// Subdirectory names are unchanged from the v0.23.x layout: a fresh
|
|
27
|
+
// `~/.harness/` install contains the same `harness.yaml`,
|
|
28
|
+
// `harness.generated/`, `.understanding-gate/`, `harness.lock`
|
|
29
|
+
// children that the legacy `~/.claude/` install would have. This
|
|
30
|
+
// keeps the migration `mv`-only and avoids cascading file-rename
|
|
31
|
+
// churn across every test fixture.
|
|
32
|
+
import * as fs from "node:fs";
|
|
33
|
+
import * as os from "node:os";
|
|
34
|
+
import * as path from "node:path";
|
|
35
|
+
export const HARNESS_HOME_DIRNAME = ".harness";
|
|
36
|
+
export const LEGACY_HARNESS_HOME_DIRNAME = ".claude";
|
|
37
|
+
export const HARNESS_HOME_ENV = "HARNESS_HOME";
|
|
38
|
+
/**
|
|
39
|
+
* Per-process flag for the deprecation warning. Resolvers re-enter many
|
|
40
|
+
* times in a single command (loader, apply, doctor, hook commands).
|
|
41
|
+
* Without a singleton the warning would fan out to dozens of lines and
|
|
42
|
+
* obscure real output.
|
|
43
|
+
*/
|
|
44
|
+
let warnedLegacy = false;
|
|
45
|
+
export function resolveHomeDir(opts = {}) {
|
|
46
|
+
if (typeof opts.homeDir === "string" && opts.homeDir.length > 0) {
|
|
47
|
+
return { path: opts.homeDir, source: "explicit" };
|
|
48
|
+
}
|
|
49
|
+
const envValue = process.env[HARNESS_HOME_ENV];
|
|
50
|
+
if (typeof envValue === "string" && envValue.length > 0) {
|
|
51
|
+
return { path: envValue, source: "env" };
|
|
52
|
+
}
|
|
53
|
+
const userHome = opts.userHome ?? os.homedir();
|
|
54
|
+
const newPath = path.join(userHome, HARNESS_HOME_DIRNAME);
|
|
55
|
+
const legacyPath = path.join(userHome, LEGACY_HARNESS_HOME_DIRNAME);
|
|
56
|
+
if (existsDir(newPath)) {
|
|
57
|
+
return { path: newPath, source: "new" };
|
|
58
|
+
}
|
|
59
|
+
// Legacy fallback: only honor when the legacy dir carries actual
|
|
60
|
+
// harness state. A bare `~/.claude/` without `harness.yaml` or
|
|
61
|
+
// `harness.generated/` is somebody else's directory (Claude Code's
|
|
62
|
+
// runtime config) and we must not write into it.
|
|
63
|
+
if (legacyHasHarnessState(legacyPath)) {
|
|
64
|
+
if (!warnedLegacy) {
|
|
65
|
+
const stderr = opts.stderr ?? process.stderr;
|
|
66
|
+
stderr.write(`harness: state still under legacy ${legacyPath}/; run \`harness migrate-home\` to move it to ${newPath}/. The legacy fallback is removed in v0.25.0.\n`);
|
|
67
|
+
warnedLegacy = true;
|
|
68
|
+
}
|
|
69
|
+
return { path: legacyPath, source: "legacy" };
|
|
70
|
+
}
|
|
71
|
+
return { path: newPath, source: "default-new" };
|
|
72
|
+
}
|
|
73
|
+
function existsDir(p) {
|
|
74
|
+
try {
|
|
75
|
+
return fs.statSync(p).isDirectory();
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function legacyHasHarnessState(legacyPath) {
|
|
82
|
+
// The legacy dir is shared with Claude Code's `settings.json`. We
|
|
83
|
+
// claim "harness lives here" only when one of the harness-owned
|
|
84
|
+
// artefacts exists: the manifest (`harness.yaml`) or the generated
|
|
85
|
+
// dir (`harness.generated/`). Either is sufficient evidence.
|
|
86
|
+
try {
|
|
87
|
+
if (fs.existsSync(path.join(legacyPath, "harness.yaml")))
|
|
88
|
+
return true;
|
|
89
|
+
if (fs.existsSync(path.join(legacyPath, "harness.generated")))
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
/* fall through to false */
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Reset the per-process warning flag. Test-only — production code never
|
|
99
|
+
* needs to clear this. Exported so vitest's `beforeEach` can isolate
|
|
100
|
+
* test cases without leaking warning state between them.
|
|
101
|
+
*/
|
|
102
|
+
export function _resetLegacyWarningForTests() {
|
|
103
|
+
warnedLegacy = false;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=home-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home-dir.js","sourceRoot":"","sources":["../../src/runtime/home-dir.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,18 +10,21 @@ import { renderProducers } from "../policies/producers.js";
|
|
|
10
10
|
import { renderAgentFacing } from "./agent-facing.js";
|
|
11
11
|
import { POLICY_DECISION_TYPE } from "./ledger-record.js";
|
|
12
12
|
import { resolveSessionId } from "./session-id.js";
|
|
13
|
+
import { expandToolNameAliases, extractShellCommand, } from "./tool-name-aliases.js";
|
|
13
14
|
function policyMatchesEvent(policy, event) {
|
|
14
15
|
if (policy.trigger.event !== event.hook_event_name)
|
|
15
16
|
return false;
|
|
16
17
|
if (policy.trigger.match !== undefined) {
|
|
17
18
|
if (typeof event.tool_name !== "string")
|
|
18
19
|
return false;
|
|
19
|
-
|
|
20
|
+
const toolNames = expandToolNameAliases(event.tool_name);
|
|
21
|
+
if (!toolNames.some((toolName) => toolName.includes(policy.trigger.match))) {
|
|
20
22
|
return false;
|
|
23
|
+
}
|
|
21
24
|
}
|
|
22
25
|
if (policy.trigger.bash_match !== undefined) {
|
|
23
|
-
const
|
|
24
|
-
if (
|
|
26
|
+
const command = extractShellCommand(event);
|
|
27
|
+
if (command === null)
|
|
25
28
|
return false;
|
|
26
29
|
let re;
|
|
27
30
|
try {
|
|
@@ -30,14 +33,14 @@ function policyMatchesEvent(policy, event) {
|
|
|
30
33
|
catch {
|
|
31
34
|
return false;
|
|
32
35
|
}
|
|
33
|
-
if (!re.test(
|
|
36
|
+
if (!re.test(command))
|
|
34
37
|
return false;
|
|
35
38
|
}
|
|
36
39
|
return true;
|
|
37
40
|
}
|
|
38
41
|
function buildEventContext(event) {
|
|
39
42
|
return {
|
|
40
|
-
toolArgs: event.tool_input,
|
|
43
|
+
toolArgs: event.tool_input ?? event.raw_input ?? event.input,
|
|
41
44
|
event,
|
|
42
45
|
session: { id: event.session_id ?? "" },
|
|
43
46
|
git: {},
|
|
@@ -161,7 +164,8 @@ function filterEntriesByTag(entries, tag) {
|
|
|
161
164
|
// flushing their dev ledger doesn't keep paying the pollution
|
|
162
165
|
// tax. New rows are caught by the type check above.
|
|
163
166
|
!e.content.startsWith(`${POLICY_DECISION_TYPE}:`) &&
|
|
164
|
-
(e.content.includes(tag) ||
|
|
167
|
+
(e.content.includes(tag) ||
|
|
168
|
+
(e.source !== undefined && e.source.includes(tag))));
|
|
165
169
|
}
|
|
166
170
|
export async function intercept(options) {
|
|
167
171
|
const matching = options.manifest.policies.filter((p) => policyMatchesEvent(p, options.event));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercept.js","sourceRoot":"","sources":["../../src/runtime/intercept.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,wEAAwE;AACxE,2EAA2E;AAC3E,mBAAmB;AAEnB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,GAOnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"intercept.js","sourceRoot":"","sources":["../../src/runtime/intercept.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function expandToolNameAliases(toolName: string): string[];
|
|
2
|
+
export declare function expandCodexHookMatchPattern(match: string): string;
|
|
3
|
+
export declare function extractShellCommand(event: {
|
|
4
|
+
tool_input?: unknown;
|
|
5
|
+
raw_input?: unknown;
|
|
6
|
+
input?: unknown;
|
|
7
|
+
}): string | null;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
const SHELL_ALIASES = [
|
|
2
|
+
"Bash",
|
|
3
|
+
"shell",
|
|
4
|
+
"exec_command",
|
|
5
|
+
"functions.exec_command",
|
|
6
|
+
];
|
|
7
|
+
function addShellAliases(out, toolName) {
|
|
8
|
+
if (!SHELL_ALIASES.includes(toolName))
|
|
9
|
+
return;
|
|
10
|
+
for (const alias of SHELL_ALIASES)
|
|
11
|
+
out.add(alias);
|
|
12
|
+
}
|
|
13
|
+
function addMcpAliases(out, toolName) {
|
|
14
|
+
const variants = parseMcpToolName(toolName);
|
|
15
|
+
if (!variants)
|
|
16
|
+
return;
|
|
17
|
+
const serverVariants = new Set([
|
|
18
|
+
variants.server,
|
|
19
|
+
variants.server.replace(/-/g, "_"),
|
|
20
|
+
variants.server.replace(/_/g, "-"),
|
|
21
|
+
]);
|
|
22
|
+
for (const server of serverVariants) {
|
|
23
|
+
out.add(`mcp__${server}__${variants.tool}`);
|
|
24
|
+
out.add(`mcp__${server}__.${variants.tool}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function parseMcpToolName(toolName) {
|
|
28
|
+
const doubleUnderscoreDot = /^mcp__(.+)__\.(.+)$/.exec(toolName);
|
|
29
|
+
if (doubleUnderscoreDot?.[1] && doubleUnderscoreDot[2]) {
|
|
30
|
+
return { server: doubleUnderscoreDot[1], tool: doubleUnderscoreDot[2] };
|
|
31
|
+
}
|
|
32
|
+
const doubleUnderscore = /^mcp__(.+?)__(.+)$/.exec(toolName);
|
|
33
|
+
if (doubleUnderscore?.[1] && doubleUnderscore[2]) {
|
|
34
|
+
return { server: doubleUnderscore[1], tool: doubleUnderscore[2] };
|
|
35
|
+
}
|
|
36
|
+
const dot = /^mcp__(.+)\.(.+)$/.exec(toolName);
|
|
37
|
+
if (dot?.[1] && dot[2]) {
|
|
38
|
+
return { server: dot[1], tool: dot[2] };
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
export function expandToolNameAliases(toolName) {
|
|
43
|
+
const out = new Set([toolName]);
|
|
44
|
+
addShellAliases(out, toolName);
|
|
45
|
+
addMcpAliases(out, toolName);
|
|
46
|
+
return [...out];
|
|
47
|
+
}
|
|
48
|
+
function isSimpleToolPatternToken(token) {
|
|
49
|
+
return /^[A-Za-z0-9_.:-]+$/.test(token);
|
|
50
|
+
}
|
|
51
|
+
export function expandCodexHookMatchPattern(match) {
|
|
52
|
+
const tokens = match.split("|");
|
|
53
|
+
if (!tokens.every(isSimpleToolPatternToken))
|
|
54
|
+
return match;
|
|
55
|
+
const expanded = new Set();
|
|
56
|
+
for (const token of tokens) {
|
|
57
|
+
for (const alias of expandToolNameAliases(token))
|
|
58
|
+
expanded.add(alias);
|
|
59
|
+
}
|
|
60
|
+
return [...expanded].join("|");
|
|
61
|
+
}
|
|
62
|
+
export function extractShellCommand(event) {
|
|
63
|
+
for (const candidate of [event.tool_input, event.raw_input, event.input]) {
|
|
64
|
+
if (!candidate || typeof candidate !== "object")
|
|
65
|
+
continue;
|
|
66
|
+
const args = candidate;
|
|
67
|
+
if (typeof args.command === "string")
|
|
68
|
+
return args.command;
|
|
69
|
+
if (typeof args.cmd === "string")
|
|
70
|
+
return args.cmd;
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=tool-name-aliases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-name-aliases.js","sourceRoot":"","sources":["../../src/runtime/tool-name-aliases.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lannguyensi/harness",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.0",
|
|
4
4
|
"description": "Declarative control plane for agent harnesses — one YAML for grounding, tools, memory, and hooks.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/LanNguyenSi/harness",
|