@holmes-lab/holmes-kit 0.10.0 → 0.10.1

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 CHANGED
@@ -5,7 +5,23 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
  <!-- @implements A-SPEC-209 -->
8
- ## [0.10.0] - 2026-09-04
8
+ ## [0.10.1] - 2026-09-04
9
+
10
+ ### Fixed
11
+
12
+ - **Antigravity hooks: 0.10.0's `command`+`args` form regressed on the real launcher — reverted to an
13
+ unquoted single command string** (REQ-541). Field measurement on Windows/agy showed the hook
14
+ launcher **ignores `args`** and runs only the `command` string: 0.10.0's `command:"node"` +
15
+ `args:[path]` launched bare `node`, which evaluated the stdin JSON payload as code
16
+ (`SyntaxError: Unexpected token ':'`, exit 1) — every tool blocked. A second measurement had already
17
+ shown it keeps quotes **literal** (the pre-0.10.0 `node "<path>"` form died with MODULE_NOT_FOUND).
18
+ The only form the launcher runs is an unquoted single string, whitespace-split. `.agents/hooks.json`
19
+ now emits `command: "node <forward-slash path>"` (no quotes, no `args`); on win32 a path containing
20
+ a space is converted to its 8.3 short name, best-effort (lookup failure keeps the original path).
21
+ `doctor` continues to judge old (args) and new (string) wirings alike. **Re-run
22
+ `holmes-kit init --target <dir> --agent antigravity --force` after upgrading** — the fix changes
23
+ what init writes, not files already on disk. *Windows/agy real runtime and the 8.3 branch remain
24
+ unverified in this environment; validated by emitted shape + a naive-split execution simulation.*
9
25
 
10
26
  Governance UX tools for multi-agent round-trips and observability, a cross-harness approval fix, and
11
27
  an Antigravity portability fix. All additive and backward-compatible; existing behaviour is unchanged
package/dist/.build-id CHANGED
@@ -1 +1 @@
1
- 0d70dec-mtn1jk14
1
+ b8567d9-mtn379s6
@@ -49,6 +49,19 @@ export interface AgentFile {
49
49
  path: string;
50
50
  content: string;
51
51
  }
52
+ /**
53
+ * Antigravity 훅 배선.
54
+ *
55
+ * 매처는 `*` 다. 좁히면 그 밖의 도구가 게이트를 지나가고, Antigravity 의 도구 목록은 우리가
56
+ * 통제하지 않는다 — 이름을 열거하는 순간 다음에 추가되는 도구가 무료 통행권을 얻는다.
57
+ * (Claude 배선이 `guardrail` 모드에서 좁은 매처를 쓰는 것과 다른 선택인데, 그쪽은 그 좁힘이
58
+ * 무엇을 뜻하는지 문서화된 모드 선택이고 여기는 기본 배선이기 때문이다.)
59
+ */
60
+ /** `node <forward-slash path>` — unquoted, single string; the only form agy's launcher runs. */
61
+ export declare function antigravityHookCommand(scriptPath: string): string;
62
+ /** win32-only, best-effort: a spaced path becomes its 8.3 short name (no spaces); anything else — or
63
+ * any lookup failure — returns the input unchanged. */
64
+ export declare function shortPathIfSpaced(p: string): string;
52
65
  /**
53
66
  * 이 하네스에 써야 할 파일들. **쓰지는 않는다** — 무엇을 쓸지만 말한다.
54
67
  *
@@ -34,11 +34,14 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.CODEX_MARKETPLACE = exports.CODEX_PLUGIN_DIR = exports.HARNESS_ENFORCES = exports.AGENTS = void 0;
37
+ exports.antigravityHookCommand = antigravityHookCommand;
38
+ exports.shortPathIfSpaced = shortPathIfSpaced;
37
39
  exports.agentFiles = agentFiles;
38
40
  exports.agentLinks = agentLinks;
39
41
  // @implements A-SPEC-442
40
42
  // @implements A-SPEC-193
41
43
  const path = __importStar(require("node:path"));
44
+ const node_child_process_1 = require("node:child_process");
42
45
  const mcp_launcher_1 = require("./mcp-launcher");
43
46
  /**
44
47
  * 하네스별 배선물.
@@ -107,19 +110,37 @@ const mcpConfig = (packageRoot, specsDir, launcher) => {
107
110
  * (Claude 배선이 `guardrail` 모드에서 좁은 매처를 쓰는 것과 다른 선택인데, 그쪽은 그 좁힘이
108
111
  * 무엇을 뜻하는지 문서화된 모드 선택이고 여기는 기본 배선이기 때문이다.)
109
112
  */
110
- // @implements A-SPEC-539.1
111
- // agy's hook launcher tokenizes the `command` string on whitespace and does NOT honor quotes, so an
112
- // earlier quoted `node "<path>"` (A-SPEC-193 §2b-2) still broke on a path with spaces: measured on a
113
- // Windows machine whose Node lives at `C:\Program Files\nodejs`, reported from agy 2026-09-04 — the
114
- // launcher split `node "C:\Program Files\...` at the space, node took `"C:\Program` for a module
115
- // (MODULE_NOT_FOUND), and the gate loaded not at all (silently off). Passing the script path as an
116
- // `args` ELEMENT the same array form mcp_config already uses sidesteps tokenization entirely, on
117
- // every platform. This supersedes the quoted-string form for the antigravity wiring; quoting only
118
- // ever helped launchers that honor quotes, which agy's does not.
113
+ // @implements A-SPEC-541.1
114
+ // Two field measurements (both 2026-09-04, Windows/agy) pinned the launcher's real contract, each by
115
+ // killing one prior form:
116
+ // · `node "C:\...js"` (quoted, A-SPEC-193 §2b-2) the quotes stayed LITERAL and node got
117
+ // `"C:\...` as a module path MODULE_NOT_FOUND. The launcher does not honor quotes.
118
+ // · `command:'node', args:[path]` (A-SPEC-539.1 / 0.10.0) the launcher IGNORED `args` and ran
119
+ // bare `node`, which took the stdin JSON payload as code `SyntaxError: Unexpected token ':'`
120
+ // (exit 1), every tool blocked. The launcher executes only the single `command` string.
121
+ // So the only form it can run is an UNQUOTED single command string, whitespace-split which means
122
+ // the path itself must carry no space. Forward slashes (node accepts them on Windows) avoid JSON
123
+ // backslash escaping; a spaced path is converted to its 8.3 short name on win32, best-effort.
124
+ /** `node <forward-slash path>` — unquoted, single string; the only form agy's launcher runs. */
125
+ function antigravityHookCommand(scriptPath) {
126
+ return `node ${scriptPath.replace(/\\/g, '/')}`;
127
+ }
128
+ /** win32-only, best-effort: a spaced path becomes its 8.3 short name (no spaces); anything else — or
129
+ * any lookup failure — returns the input unchanged. */
130
+ function shortPathIfSpaced(p) {
131
+ if (process.platform !== 'win32' || !p.includes(' '))
132
+ return p;
133
+ try {
134
+ const out = (0, node_child_process_1.execFileSync)('cmd', ['/d', '/c', `for %I in ("${p}") do @echo %~sI`], { encoding: 'utf8' }).trim();
135
+ return out !== '' && !out.includes(' ') ? out : p;
136
+ }
137
+ catch {
138
+ return p;
139
+ }
140
+ }
119
141
  const antigravityHookEntry = (packageRoot, script) => ({
120
142
  type: 'command',
121
- command: 'node',
122
- args: [path.join(packageRoot, 'bin', script)],
143
+ command: antigravityHookCommand(shortPathIfSpaced(path.join(packageRoot, 'bin', script))),
123
144
  timeout: 30,
124
145
  });
125
146
  /**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "//": "@implements A-SPEC-209",
3
3
  "name": "@holmes-lab/holmes-kit",
4
- "version": "0.10.0",
4
+ "version": "0.10.1",
5
5
  "description": "Holmes-Kit — deterministic Agentic Software Engineering (ASE) harness with causal traceability (spec chain + D-CPG + RTM + phase guardrail)",
6
6
  "main": "dist/holmes/mcp/server.js",
7
7
  "types": "dist/holmes/mcp/server.d.ts",