halfcycle 0.3.34 → 0.3.36
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/.claude-plugin/plugin.json +1 -1
- package/README.md +13 -0
- package/bin/bin.bundle.mjs +274 -43
- package/dist/banner-facts.d.ts +6 -2
- package/dist/banner-facts.d.ts.map +1 -1
- package/dist/bin.js +282 -298
- package/dist/bin.js.map +3 -3
- package/dist/build-record/render-v2.d.ts.map +1 -1
- package/dist/claude-version-probe.d.ts +44 -0
- package/dist/claude-version-probe.d.ts.map +1 -0
- package/dist/confirm-identity.d.ts +7 -0
- package/dist/confirm-identity.d.ts.map +1 -1
- package/dist/engagement-credential.d.ts +31 -23
- package/dist/engagement-credential.d.ts.map +1 -1
- package/dist/index.js +158 -233
- package/dist/index.js.map +1 -1
- package/dist/install-manifest.d.ts +32 -4
- package/dist/install-manifest.d.ts.map +1 -1
- package/dist/install.d.ts +52 -16
- package/dist/install.d.ts.map +1 -1
- package/dist/open-phase.d.ts +2 -1
- package/dist/open-phase.d.ts.map +1 -1
- package/dist/probe-mcp.d.ts +39 -7
- package/dist/probe-mcp.d.ts.map +1 -1
- package/dist/uninstall.d.ts +1 -1
- package/dist/uninstall.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-v2.d.ts","sourceRoot":"","sources":["../../src/build-record/render-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAyBvD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAapD;
|
|
1
|
+
{"version":3,"file":"render-v2.d.ts","sourceRoot":"","sources":["../../src/build-record/render-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAyBvD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAapD;AAyRD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA2DzE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ONE PLACE THAT KNOWS HOW TO ASK THE SHELL FOR CLAUDE CODE'S VERSION.
|
|
3
|
+
*
|
|
4
|
+
* `reportClaudeCodeVersion` (`bin.ts`) and `claudeCodeVersion` (`banner-facts.ts`) each used
|
|
5
|
+
* to call `execFileSync('claude', ['--version'], …)` directly. On Windows, an npm install of
|
|
6
|
+
* Claude Code puts a `claude.cmd` shim on PATH, never a `claude.exe` — and `execFileSync`
|
|
7
|
+
* without a shell never runs a `.cmd` file: Node resolves the executable itself, and only a
|
|
8
|
+
* shell applies the `.cmd` extension rule. So on Windows both probes silently found nothing,
|
|
9
|
+
* every time, regardless of whether Claude Code was installed.
|
|
10
|
+
*
|
|
11
|
+
* The fix routes through `cmd.exe`, the same way Node's own `shell: true` already does on
|
|
12
|
+
* Windows: `/d` skips AutoRun scripts, `/s` lets the quoted command string carry its own
|
|
13
|
+
* quoting, and `windowsVerbatimArguments: true` stops Node adding a second layer of quoting
|
|
14
|
+
* on top of the one already in the argument. Elsewhere (`win32` excluded) this is exactly the
|
|
15
|
+
* call it always was.
|
|
16
|
+
*
|
|
17
|
+
* `platform` and `exec` are both injectable so a test can drive the `win32` arm from a
|
|
18
|
+
* non-Windows CI runner and assert the literal command and arguments, rather than depending
|
|
19
|
+
* on the host actually being Windows with Claude Code installed.
|
|
20
|
+
*
|
|
21
|
+
* INV-001: Node builtins only.
|
|
22
|
+
*/
|
|
23
|
+
/** The slice of `execFileSync`'s call shape this probe needs. The real function already
|
|
24
|
+
* satisfies it, so production code passes no wrapper. */
|
|
25
|
+
export type ClaudeVersionExec = (file: string, args: readonly string[], options: {
|
|
26
|
+
readonly encoding: 'utf-8';
|
|
27
|
+
readonly timeout: number;
|
|
28
|
+
readonly stdio: readonly ['ignore', 'pipe', 'ignore'];
|
|
29
|
+
readonly windowsVerbatimArguments?: boolean;
|
|
30
|
+
}) => string;
|
|
31
|
+
export interface ClaudeVersionProbeDeps {
|
|
32
|
+
/** Defaults to `process.platform`. Inject to exercise the `win32` arm elsewhere. */
|
|
33
|
+
readonly platform?: NodeJS.Platform;
|
|
34
|
+
/** Defaults to the real `execFileSync`. Inject to assert the call without a shell. */
|
|
35
|
+
readonly exec?: ClaudeVersionExec;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Runs `claude --version` for the given platform and returns the parsed `x.y.z`, or
|
|
39
|
+
* `undefined` for anything that stops that from working: `claude` not on PATH, no answer
|
|
40
|
+
* inside `timeoutMs`, or an answer with no dotted version in it. Never throws — both
|
|
41
|
+
* callers' degradation (say nothing) depends on that.
|
|
42
|
+
*/
|
|
43
|
+
export declare function probeClaudeCodeVersion(timeoutMs: number, deps?: ClaudeVersionProbeDeps): string | undefined;
|
|
44
|
+
//# sourceMappingURL=claude-version-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-version-probe.d.ts","sourceRoot":"","sources":["../src/claude-version-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH;0DAC0D;AAC1D,MAAM,MAAM,iBAAiB,GAAG,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IACP,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtD,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CAC7C,KACE,MAAM,CAAC;AAEZ,MAAM,WAAW,sBAAsB;IACrC,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IACpC,sFAAsF;IACtF,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,sBAA2B,GAAG,MAAM,GAAG,SAAS,CAqB/G"}
|
|
@@ -286,6 +286,13 @@ export declare function readDecision(answer: string): IdentityDecision;
|
|
|
286
286
|
* with no measurement at all — so there is no default to fall back on silently; every
|
|
287
287
|
* caller states `isInteractiveRun()`'s answer, or a value it controls directly in a
|
|
288
288
|
* test.
|
|
289
|
+
*
|
|
290
|
+
* THE KEY TO PRESS IS NOT SPELLED HERE (`windows-client-seat`). The interactive arm
|
|
291
|
+
* composes `SWITCH_ACCOUNT_ANSWER` from `@halfcycle/events`, because delivery's
|
|
292
|
+
* not-this-account 401 sentence tells the same person the same thing and cannot
|
|
293
|
+
* import this module. The output is byte-identical to the spelled form it replaced;
|
|
294
|
+
* `test/credential-wire-contract.test.ts` pins both arms by hash and refuses a
|
|
295
|
+
* spelled copy of the fragment, or of a placeholder bearer, anywhere in this package.
|
|
289
296
|
*/
|
|
290
297
|
export declare function identitySwitchRemedy(home: string | undefined, interactive: boolean): string;
|
|
291
298
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm-identity.d.ts","sourceRoot":"","sources":["../src/confirm-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"confirm-identity.d.ts","sourceRoot":"","sources":["../src/confirm-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,19 +23,21 @@
|
|
|
23
23
|
* ---------------------------------------------------------------------------
|
|
24
24
|
* IT IS AN ENV FILE AND NOT JSON, AND THAT IS FORCED — not a preference.
|
|
25
25
|
*
|
|
26
|
-
*
|
|
26
|
+
* The generated hook scripts read this credential, and they are POSIX `sh`:
|
|
27
27
|
*
|
|
28
28
|
* - `.claude/hooks/guard-runner.sh` SOURCES it (`set -a; . "$f"; set +a`) so the
|
|
29
29
|
* runner, which reads only `process.env`, receives its three variables. That is
|
|
30
|
-
* the INV-001 seam: env loading lives in the hook wiring
|
|
31
|
-
* - `.
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* `
|
|
30
|
+
* the INV-001 seam for the hooks: env loading lives in the hook wiring.
|
|
31
|
+
* - `.claude/hooks/session-start-marker.sh` tests for it to word its coverage line.
|
|
32
|
+
*
|
|
33
|
+
* A shell cannot parse JSON — there is no `jq` in this environment — so the
|
|
34
|
+
* machine-level file is `KEY=value` lines, exactly as Studio's is, and the ONE field
|
|
35
|
+
* the shell must take out of the committed pin — the engagement id — is cut out of
|
|
36
|
+
* JSON with `sed`. See `engagementResolutionShell()` for that, and for why
|
|
37
|
+
* `tr -d '\n'` precedes it. (The third consumer, the editor's headers command, was a
|
|
38
|
+
* generated `.halfcycle/mcp-headers.sh` that grepped one line out of this file; since
|
|
39
|
+
* `windows-client-seat` it is the vendored runner's `mcp-headers` verb, which reads
|
|
40
|
+
* the file through core's `parseEnvText` and the pin as JSON.)
|
|
39
41
|
*
|
|
40
42
|
* ---------------------------------------------------------------------------
|
|
41
43
|
* THE SEVEN — NOW EIGHT (T-10) — KEYS ARE FOUR THINGS, AND THE COUNT DECIDES WHAT
|
|
@@ -99,14 +101,15 @@
|
|
|
99
101
|
export { ENGAGEMENT_ENV_HEADER, ENGAGEMENTS_DIR_NAME, ENGAGEMENT_ENV_FILENAME, HALFCYCLE_DIR_NAME, NOT_THIS_ACCOUNT_MARKER_FILENAME, parseEnvText, shq, unquote, } from '@halfcycle/core';
|
|
100
102
|
/**
|
|
101
103
|
* The field the committed pin (`.halfcycle/bundle.json`) carries the engagement id
|
|
102
|
-
* under.
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
104
|
+
* under. Its one home is `@halfcycle/core` (`PIN_ENGAGEMENT_ID_FIELD`), because the
|
|
105
|
+
* runner's connection-headers verb reads the same field and may not import this
|
|
106
|
+
* package. It is re-exported here so `readEngagementCredential`'s TS caller and the
|
|
107
|
+
* generated POSIX `sed` keep reading it from this module. A test installs, then runs
|
|
108
|
+
* the generated shell against the real written pin and compares its answer to
|
|
109
|
+
* `engagementEnvPath()`, so writer and readers are asserted to agree rather than
|
|
110
|
+
* left to match by eye.
|
|
108
111
|
*/
|
|
109
|
-
export
|
|
112
|
+
export { PIN_ENGAGEMENT_ID_FIELD } from '@halfcycle/core';
|
|
110
113
|
/**
|
|
111
114
|
* The refusal an engagement id that is not UUID-shaped meets before it becomes a
|
|
112
115
|
* path. A class of its own so a caller can tell "this id cannot name a folder"
|
|
@@ -364,15 +367,18 @@ export declare function writeEngagementEnv(engagementId: string, values: Record<
|
|
|
364
367
|
* match independent of the file's line breaks. (This repo has paid twice for a
|
|
365
368
|
* pattern that wrapped across lines reading as absent.)
|
|
366
369
|
*
|
|
367
|
-
* **Why
|
|
368
|
-
*
|
|
369
|
-
*
|
|
370
|
+
* **Why `sh` here, though the headers command is now `node`.** This block is
|
|
371
|
+
* embedded in the generated hook scripts, which are bash; parsing the pin inside
|
|
372
|
+
* them in shell keeps each hook one process until it `exec`s the runner. The old
|
|
373
|
+
* reason given here — that a desktop-launched session may have no version-manager
|
|
374
|
+
* `node` — no longer holds the line: the guard wrapper already ends `exec node`, and
|
|
375
|
+
* `windows-client-seat` made the editor's headers command a `node` program too.
|
|
370
376
|
*
|
|
371
377
|
* **IT SETS VARIABLES AND PRINTS NOTHING, and that is not a style choice.** The
|
|
372
378
|
* obvious form — print the path and let the caller take it with `$(…)` — puts the
|
|
373
379
|
* function in a SUBSHELL, so the `HALFCYCLE_ENV_PROBLEM` it sets on the failure
|
|
374
|
-
* path never reaches the caller. Measured: under `set -u` (which
|
|
375
|
-
*
|
|
380
|
+
* path never reaches the caller. Measured: under `set -u` (which the retired
|
|
381
|
+
* `mcp-headers.sh` ran with) the caller then dies on `HALFCYCLE_ENV_PROBLEM: unbound variable`
|
|
376
382
|
* instead of printing the reason it was carrying. So the function assigns
|
|
377
383
|
* `HALFCYCLE_ENV_FILE` / `HALFCYCLE_ENV_PROBLEM` / `HALFCYCLE_ENV_ENGAGEMENT` in
|
|
378
384
|
* the CURRENT shell and returns a status, and callers use `if halfcycle_env_file …`.
|
|
@@ -388,7 +394,9 @@ export declare function writeEngagementEnv(engagementId: string, values: Record<
|
|
|
388
394
|
* installer does not rewrite a pin whose id it refuses, so "run npx halfcycle to
|
|
389
395
|
* rewrite it" would be false. The guard wrapper and the session-start marker treat
|
|
390
396
|
* every failure alike (no credential sourced), which is the right answer for this
|
|
391
|
-
* one too
|
|
397
|
+
* one too. The retired `mcp-headers.sh` was the one caller that worded each case;
|
|
398
|
+
* the runner's `mcp-headers` verb now does, from its own pin read, with a `bad-id`
|
|
399
|
+
* arm of its own.
|
|
392
400
|
*
|
|
393
401
|
* **HALFCYCLE_ENV_NOT_THIS_ACCOUNT IS SET ON THE `no-credential` FAILURE PATH TOO
|
|
394
402
|
* (T-02b, `solo-project-ownership`) — that is the state it exists to distinguish.**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engagement-credential.d.ts","sourceRoot":"","sources":["../src/engagement-credential.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"engagement-credential.d.ts","sourceRoot":"","sources":["../src/engagement-credential.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmGG;AAoBH,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,gCAAgC,EAChC,YAAY,EACZ,GAAG,EACH,OAAO,GACR,MAAM,iBAAiB,CAAC;AAgBzB;;;;;;;;;GASG;AACH,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;;;GAIG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,YAAY,EAAE,MAAM;CAajC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAMnF;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,cAAc,8EAIjB,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,4BAA4B,mDAExC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,mBAAmB,mMAOtB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AAuCrD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EACjD,IAAI,GAAE,SAAS,MAAM,EAAwB,GAC5C,MAAM,CAER;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAM/B;AAED,8DAA8D;AAC9D,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EACjD,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,GAAE,SAAS,MAAM,EAAwB,GAC5C,eAAe,CAoBjB;AA4BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAsDlD"}
|