claude-code-infinite 1.0.25 → 1.0.27
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/README.md +72 -20
- package/dist/auto-update-runner.d.ts +13 -0
- package/dist/auto-update-runner.d.ts.map +1 -1
- package/dist/auto-update-runner.js +51 -7
- package/dist/auto-update-runner.js.map +1 -1
- package/dist/auto-update-setup.d.ts +19 -3
- package/dist/auto-update-setup.d.ts.map +1 -1
- package/dist/auto-update-setup.js +42 -16
- package/dist/auto-update-setup.js.map +1 -1
- package/dist/auto-update.d.ts +59 -6
- package/dist/auto-update.d.ts.map +1 -1
- package/dist/auto-update.js +207 -40
- package/dist/auto-update.js.map +1 -1
- package/dist/claude-auth.d.ts +55 -0
- package/dist/claude-auth.d.ts.map +1 -0
- package/dist/claude-auth.js +193 -0
- package/dist/claude-auth.js.map +1 -0
- package/dist/claude-env.d.ts +11 -4
- package/dist/claude-env.d.ts.map +1 -1
- package/dist/claude-env.js +11 -4
- package/dist/claude-env.js.map +1 -1
- package/dist/claude-locate.d.ts +80 -0
- package/dist/claude-locate.d.ts.map +1 -0
- package/dist/claude-locate.js +303 -0
- package/dist/claude-locate.js.map +1 -0
- package/dist/claude-plan-warning.d.ts +55 -0
- package/dist/claude-plan-warning.d.ts.map +1 -0
- package/dist/claude-plan-warning.js +95 -0
- package/dist/claude-plan-warning.js.map +1 -0
- package/dist/cli-lifecycle.d.ts +5 -0
- package/dist/cli-lifecycle.d.ts.map +1 -1
- package/dist/cli-lifecycle.js +13 -0
- package/dist/cli-lifecycle.js.map +1 -1
- package/dist/cli-main.js +124 -18
- package/dist/cli-main.js.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/diagnostics-schema.d.ts +11 -1
- package/dist/diagnostics-schema.d.ts.map +1 -1
- package/dist/diagnostics-schema.js +38 -2
- package/dist/diagnostics-schema.js.map +1 -1
- package/dist/diagnostics.d.ts +10 -1
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +26 -1
- package/dist/diagnostics.js.map +1 -1
- package/dist/memtree-mcp.d.ts.map +1 -1
- package/dist/memtree-mcp.js +8 -5
- package/dist/memtree-mcp.js.map +1 -1
- package/dist/notices.d.ts.map +1 -1
- package/dist/notices.js +3 -2
- package/dist/notices.js.map +1 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +7 -0
- package/dist/proxy.js.map +1 -1
- package/dist/reqlog.d.ts +7 -0
- package/dist/reqlog.d.ts.map +1 -1
- package/dist/reqlog.js.map +1 -1
- package/dist/resume-repair.d.ts +2 -0
- package/dist/resume-repair.d.ts.map +1 -1
- package/dist/resume-repair.js +7 -5
- package/dist/resume-repair.js.map +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js.map +1 -1
- package/dist/update-lock.js +3 -1
- package/dist/update-lock.js.map +1 -1
- package/dist/update-wait.d.ts +25 -0
- package/dist/update-wait.d.ts.map +1 -0
- package/dist/update-wait.js +63 -0
- package/dist/update-wait.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How Claude Code is signed in, as a type only (and, for a Claude.ai login,
|
|
3
|
+
* the plan tier's name), for diagnostics and for one notice: `subscription` (a Claude.ai login, Pro/Max), `api_key`
|
|
4
|
+
* (ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN, an apiKeyHelper or a Console key),
|
|
5
|
+
* `bedrock`, `vertex`, `foundry`, or `unknown`.
|
|
6
|
+
*
|
|
7
|
+
* No secret or account identifier is ever kept or sent. At startup the answer
|
|
8
|
+
* comes from env variable names being set, settings keys being present and
|
|
9
|
+
* `~/.claude.json` naming an `oauthAccount` (whose contents are not read out).
|
|
10
|
+
* Once Claude Code sends a request through the proxy, its auth header's shape
|
|
11
|
+
* decides it: an OAuth token (`sk-ant-oat…`) is a subscription, an
|
|
12
|
+
* `x-api-key` or `sk-ant-api…` bearer is an API key. Only that classification
|
|
13
|
+
* leaves this module.
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from "node:fs";
|
|
16
|
+
import * as os from "node:os";
|
|
17
|
+
import * as path from "node:path";
|
|
18
|
+
import { noPlanWarningText } from "./claude-plan-warning.js";
|
|
19
|
+
export const CLAUDE_AUTH_TYPES = [
|
|
20
|
+
"subscription", "api_key", "bedrock", "vertex", "foundry", "unknown",
|
|
21
|
+
];
|
|
22
|
+
/** A Claude.ai plan tier, by name only. */
|
|
23
|
+
export const CLAUDE_PLANS = [
|
|
24
|
+
"free", "pro", "max", "max_5x", "max_20x", "team", "enterprise", "unknown",
|
|
25
|
+
];
|
|
26
|
+
/** Anthropic's 400 for an API key whose organization has no credit left. */
|
|
27
|
+
export const CREDIT_BALANCE_TOO_LOW = "credit_balance_too_low";
|
|
28
|
+
/** The sign-in type from env and Claude Code's config, before any request. */
|
|
29
|
+
export function claudeAuthFromConfig(opts = {}) {
|
|
30
|
+
const env = opts.env ?? process.env;
|
|
31
|
+
const read = opts.readFile ?? readTextOrNull;
|
|
32
|
+
if (envFlag(env.CLAUDE_CODE_USE_BEDROCK))
|
|
33
|
+
return "bedrock";
|
|
34
|
+
if (envFlag(env.CLAUDE_CODE_USE_VERTEX))
|
|
35
|
+
return "vertex";
|
|
36
|
+
if (envFlag(env.CLAUDE_CODE_USE_FOUNDRY))
|
|
37
|
+
return "foundry";
|
|
38
|
+
if (nonEmpty(env.ANTHROPIC_API_KEY) || nonEmpty(env.ANTHROPIC_AUTH_TOKEN))
|
|
39
|
+
return "api_key";
|
|
40
|
+
const home = opts.homedir ?? os.homedir();
|
|
41
|
+
const configDir = nonEmpty(env.CLAUDE_CONFIG_DIR) ? env.CLAUDE_CONFIG_DIR : path.join(home, ".claude");
|
|
42
|
+
if (settingsFiles(configDir, opts.cwd ?? process.cwd()).some((f) => hasApiKeyHelper(read(f)))) {
|
|
43
|
+
return "api_key";
|
|
44
|
+
}
|
|
45
|
+
// `claude setup-token`'s long-lived subscription token; below the keys, as in Claude Code.
|
|
46
|
+
if (nonEmpty(env.CLAUDE_CODE_OAUTH_TOKEN))
|
|
47
|
+
return "subscription";
|
|
48
|
+
const globalConfig = nonEmpty(env.CLAUDE_CONFIG_DIR)
|
|
49
|
+
? path.join(env.CLAUDE_CONFIG_DIR, ".claude.json")
|
|
50
|
+
: path.join(home, ".claude.json");
|
|
51
|
+
return authFromGlobalConfig(read(globalConfig));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Whether a claude.ai login is on file, by key names only: `oauthAccount` in
|
|
55
|
+
* `~/.claude.json` without a Console key, or `claudeAiOauth` in
|
|
56
|
+
* `.credentials.json` (Linux and Windows), or a `claude setup-token` token in
|
|
57
|
+
* the environment. Unlike claudeAuthFromConfig it ignores env API keys, which
|
|
58
|
+
* Claude Code asks about before using.
|
|
59
|
+
*/
|
|
60
|
+
export function claudeSubscriptionLogin(opts = {}) {
|
|
61
|
+
const env = opts.env ?? process.env;
|
|
62
|
+
const read = opts.readFile ?? readTextOrNull;
|
|
63
|
+
const home = opts.homedir ?? os.homedir();
|
|
64
|
+
if (nonEmpty(env.CLAUDE_CODE_OAUTH_TOKEN))
|
|
65
|
+
return true;
|
|
66
|
+
const dir = nonEmpty(env.CLAUDE_CONFIG_DIR) ? env.CLAUDE_CONFIG_DIR : null;
|
|
67
|
+
const global = read(dir ? path.join(dir, ".claude.json") : path.join(home, ".claude.json"));
|
|
68
|
+
if (authFromGlobalConfig(global) === "subscription")
|
|
69
|
+
return true;
|
|
70
|
+
const credentials = read(path.join(dir ?? path.join(home, ".claude"), ".credentials.json"));
|
|
71
|
+
return credentials !== null && /"claudeAiOauth"\s*:\s*\{/.test(credentials);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The Claude.ai plan tier Claude Code recorded locally: `organizationType` and
|
|
75
|
+
* `organizationRateLimitTier` in `~/.claude.json`, else `subscriptionType` in
|
|
76
|
+
* `.credentials.json` (Linux and Windows). Only those values are matched, and
|
|
77
|
+
* only a known tier name comes out; "unknown" otherwise.
|
|
78
|
+
*/
|
|
79
|
+
export function claudePlanFromConfig(opts = {}) {
|
|
80
|
+
const env = opts.env ?? process.env;
|
|
81
|
+
const read = opts.readFile ?? readTextOrNull;
|
|
82
|
+
const home = opts.homedir ?? os.homedir();
|
|
83
|
+
const dir = nonEmpty(env.CLAUDE_CONFIG_DIR) ? env.CLAUDE_CONFIG_DIR : null;
|
|
84
|
+
const global = read(dir ? path.join(dir, ".claude.json") : path.join(home, ".claude.json"));
|
|
85
|
+
const fromGlobal = planFrom(stringField(global, "organizationType"), stringField(global, "organizationRateLimitTier"));
|
|
86
|
+
if (fromGlobal !== "unknown")
|
|
87
|
+
return fromGlobal;
|
|
88
|
+
const credentials = read(path.join(dir ?? path.join(home, ".claude"), ".credentials.json"));
|
|
89
|
+
return planFrom(stringField(credentials, "subscriptionType"), undefined);
|
|
90
|
+
}
|
|
91
|
+
/** The sign-in type a request's auth headers show, or undefined when they show none. */
|
|
92
|
+
export function claudeAuthFromHeaders(headers) {
|
|
93
|
+
if (nonEmpty(first(headers["x-api-key"])))
|
|
94
|
+
return "api_key";
|
|
95
|
+
const auth = first(headers["authorization"]);
|
|
96
|
+
if (!auth)
|
|
97
|
+
return undefined;
|
|
98
|
+
const token = /^Bearer\s+(\S+)/i.exec(auth.trim())?.[1] ?? "";
|
|
99
|
+
if (token.startsWith("sk-ant-oat"))
|
|
100
|
+
return "subscription";
|
|
101
|
+
if (token.startsWith("sk-ant-api"))
|
|
102
|
+
return "api_key";
|
|
103
|
+
return "unknown";
|
|
104
|
+
}
|
|
105
|
+
/** A known Anthropic error in a JSON error body, by code; undefined otherwise. */
|
|
106
|
+
export function upstreamErrorCode(body) {
|
|
107
|
+
const text = typeof body === "string" ? body : body.subarray(0, 16 * 1024).toString("utf8");
|
|
108
|
+
let message;
|
|
109
|
+
try {
|
|
110
|
+
message = JSON.parse(text)?.error?.message;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
return typeof message === "string" && /credit balance is too low/i.test(message)
|
|
116
|
+
? CREDIT_BALANCE_TOO_LOW
|
|
117
|
+
: undefined;
|
|
118
|
+
}
|
|
119
|
+
/** Printed once when Anthropic refused an API key for having no credit: the no-plan advice. */
|
|
120
|
+
export function creditNoticeText(color) {
|
|
121
|
+
return noPlanWarningText(color);
|
|
122
|
+
}
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Config files
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
function settingsFiles(configDir, cwd) {
|
|
127
|
+
return [
|
|
128
|
+
path.join(configDir, "settings.json"),
|
|
129
|
+
path.join(cwd, ".claude", "settings.json"),
|
|
130
|
+
path.join(cwd, ".claude", "settings.local.json"),
|
|
131
|
+
];
|
|
132
|
+
}
|
|
133
|
+
function hasApiKeyHelper(text) {
|
|
134
|
+
if (text === null)
|
|
135
|
+
return false;
|
|
136
|
+
try {
|
|
137
|
+
const helper = JSON.parse(text)?.apiKeyHelper;
|
|
138
|
+
return typeof helper === "string" && helper.trim() !== "";
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Key names only: the file holds account details (and, for a Console login on
|
|
146
|
+
* some systems, the key), none of which is parsed out or kept.
|
|
147
|
+
*/
|
|
148
|
+
function authFromGlobalConfig(text) {
|
|
149
|
+
if (text === null)
|
|
150
|
+
return "unknown";
|
|
151
|
+
// A Console (API billing) login stores a key and may also record oauthAccount.
|
|
152
|
+
if (/"primaryApiKey"\s*:\s*"[^"]/.test(text))
|
|
153
|
+
return "api_key";
|
|
154
|
+
if (/"oauthAccount"\s*:\s*\{/.test(text))
|
|
155
|
+
return "subscription";
|
|
156
|
+
return "unknown";
|
|
157
|
+
}
|
|
158
|
+
/** "claude_max" + "default_claude_max_20x" → "max_20x"; "pro" → "pro". */
|
|
159
|
+
export function planFrom(type, rateTier) {
|
|
160
|
+
const t = (type ?? "").toLowerCase();
|
|
161
|
+
const tier = (rateTier ?? "").toLowerCase();
|
|
162
|
+
if (/max/.test(t))
|
|
163
|
+
return /20x/.test(tier) ? "max_20x" : /5x/.test(tier) ? "max_5x" : "max";
|
|
164
|
+
for (const plan of ["pro", "team", "enterprise", "free"]) {
|
|
165
|
+
if (new RegExp(`(^|_)${plan}($|_)`).test(t))
|
|
166
|
+
return plan;
|
|
167
|
+
}
|
|
168
|
+
return "unknown";
|
|
169
|
+
}
|
|
170
|
+
/** One short `"key": "value"` string (letters, digits, `_`), without parsing the rest. */
|
|
171
|
+
function stringField(text, key) {
|
|
172
|
+
if (text === null)
|
|
173
|
+
return undefined;
|
|
174
|
+
return new RegExp(`"${key}"\\s*:\\s*"([A-Za-z0-9_]{1,40})"`).exec(text)?.[1];
|
|
175
|
+
}
|
|
176
|
+
function readTextOrNull(file) {
|
|
177
|
+
try {
|
|
178
|
+
return fs.readFileSync(file, "utf8");
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function first(value) {
|
|
185
|
+
return Array.isArray(value) ? value[0] : value;
|
|
186
|
+
}
|
|
187
|
+
function nonEmpty(value) {
|
|
188
|
+
return typeof value === "string" && value.trim() !== "";
|
|
189
|
+
}
|
|
190
|
+
function envFlag(value) {
|
|
191
|
+
return value !== undefined && /^(1|true|yes|on)$/i.test(value.trim());
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=claude-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-auth.js","sourceRoot":"","sources":["../src/claude-auth.ts"],"names":[],"mappings":"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"}
|
package/dist/claude-env.d.ts
CHANGED
|
@@ -2,8 +2,15 @@
|
|
|
2
2
|
* Environment for the Claude Code child process.
|
|
3
3
|
*
|
|
4
4
|
* MemTree replaces Claude Code's built-in automatic compaction, so ccc disables
|
|
5
|
-
*
|
|
6
|
-
* Claude Code controls it with a separate setting.
|
|
5
|
+
* automatic compaction (threshold and idle) by default. Manual `/compact`
|
|
6
|
+
* remains available because Claude Code controls it with a separate setting.
|
|
7
|
+
*
|
|
8
|
+
* DISABLE_AUTO_COMPACT also turns off idle compaction (2.1.286+: "Compacted
|
|
9
|
+
* while idle, before the prompt cache expired"), the remote-only sleep
|
|
10
|
+
* compactor and cold compaction: all check the same auto-compact switch first
|
|
11
|
+
* (idle and sleep skip with `compaction_off`; 2.1.303, read from the binary;
|
|
12
|
+
* the settings reference documents it under `idleCompaction`). No separate
|
|
13
|
+
* `idleCompaction` setting is needed, so ccc never passes --settings for it.
|
|
7
14
|
*
|
|
8
15
|
* Claude Code normally treats a custom ANTHROPIC_BASE_URL as a third-party
|
|
9
16
|
* gateway. That suppresses native model capabilities it cannot verify through
|
|
@@ -28,8 +35,8 @@
|
|
|
28
35
|
* its own bounded retry/400. A value the user already exported is kept.
|
|
29
36
|
*
|
|
30
37
|
* `CCC_AUTO_COMPACT=1` is an escape hatch: remove ccc's override and let the
|
|
31
|
-
* user's native Claude Code
|
|
32
|
-
* (Claude Code's own limits then apply unchanged).
|
|
38
|
+
* user's native Claude Code settings decide whether auto-compaction and idle
|
|
39
|
+
* compaction are enabled (Claude Code's own limits then apply unchanged).
|
|
33
40
|
*/
|
|
34
41
|
/** Claude Code's local refusal limit under ccc: effectively never reached. */
|
|
35
42
|
export declare const UNREACHABLE_BLOCKING_LIMIT = "1000000000";
|
package/dist/claude-env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-env.d.ts","sourceRoot":"","sources":["../src/claude-env.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude-env.d.ts","sourceRoot":"","sources":["../src/claude-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,8EAA8E;AAC9E,eAAO,MAAM,0BAA0B,eAAe,CAAC;AAEvD,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,CAAC,UAAU,EAC5B,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAAC,UAAU,CAuBnB;AAOD;;;;GAIG;AACH,wBAAgB,oCAAoC,CAClD,SAAS,EAAE,MAAM,CAAC,UAAU,GAC3B,OAAO,CAET"}
|
package/dist/claude-env.js
CHANGED
|
@@ -2,8 +2,15 @@
|
|
|
2
2
|
* Environment for the Claude Code child process.
|
|
3
3
|
*
|
|
4
4
|
* MemTree replaces Claude Code's built-in automatic compaction, so ccc disables
|
|
5
|
-
*
|
|
6
|
-
* Claude Code controls it with a separate setting.
|
|
5
|
+
* automatic compaction (threshold and idle) by default. Manual `/compact`
|
|
6
|
+
* remains available because Claude Code controls it with a separate setting.
|
|
7
|
+
*
|
|
8
|
+
* DISABLE_AUTO_COMPACT also turns off idle compaction (2.1.286+: "Compacted
|
|
9
|
+
* while idle, before the prompt cache expired"), the remote-only sleep
|
|
10
|
+
* compactor and cold compaction: all check the same auto-compact switch first
|
|
11
|
+
* (idle and sleep skip with `compaction_off`; 2.1.303, read from the binary;
|
|
12
|
+
* the settings reference documents it under `idleCompaction`). No separate
|
|
13
|
+
* `idleCompaction` setting is needed, so ccc never passes --settings for it.
|
|
7
14
|
*
|
|
8
15
|
* Claude Code normally treats a custom ANTHROPIC_BASE_URL as a third-party
|
|
9
16
|
* gateway. That suppresses native model capabilities it cannot verify through
|
|
@@ -28,8 +35,8 @@
|
|
|
28
35
|
* its own bounded retry/400. A value the user already exported is kept.
|
|
29
36
|
*
|
|
30
37
|
* `CCC_AUTO_COMPACT=1` is an escape hatch: remove ccc's override and let the
|
|
31
|
-
* user's native Claude Code
|
|
32
|
-
* (Claude Code's own limits then apply unchanged).
|
|
38
|
+
* user's native Claude Code settings decide whether auto-compaction and idle
|
|
39
|
+
* compaction are enabled (Claude Code's own limits then apply unchanged).
|
|
33
40
|
*/
|
|
34
41
|
/** Claude Code's local refusal limit under ccc: effectively never reached. */
|
|
35
42
|
export const UNREACHABLE_BLOCKING_LIMIT = "1000000000";
|
package/dist/claude-env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-env.js","sourceRoot":"","sources":["../src/claude-env.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude-env.js","sourceRoot":"","sources":["../src/claude-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAC;AAEvD,MAAM,UAAU,cAAc,CAC5B,SAA4B,EAC5B,gBAAwB;IAExB,MAAM,QAAQ,GAAsB;QAClC,GAAG,SAAS;QACZ,kBAAkB,EAAE,gBAAgB;QACpC,wCAAwC,EAAE,GAAG;QAC7C,kCAAkC,EAAE,YAAY;KACjD,CAAC;IAEF,gEAAgE;IAChE,OAAO,QAAQ,CAAC,gBAAgB,CAAC;IAEjC,IAAI,SAAS,CAAC,gBAAgB,KAAK,GAAG,EAAE,CAAC;QACvC,oEAAoE;QACpE,iCAAiC;QACjC,OAAO,QAAQ,CAAC,oBAAoB,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,oBAAoB,GAAG,GAAG,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,mCAAmC,EAAE,CAAC;YAClD,QAAQ,CAAC,mCAAmC,GAAG,0BAA0B,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACzE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oCAAoC,CAClD,SAA4B;IAE5B,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding Claude Code to launch, however it was installed.
|
|
3
|
+
*
|
|
4
|
+
* ccc launches `claude` through cross-spawn, which finds it on PATH (with
|
|
5
|
+
* PATHEXT on Windows, so npm's `claude.cmd` shim and the native `claude.exe`
|
|
6
|
+
* both run). What it cannot do is find a Claude Code that is installed but not
|
|
7
|
+
* on this terminal's PATH. On Windows that is the common case: the native
|
|
8
|
+
* installer puts `claude.exe` in `%USERPROFILE%\.local\bin` and may only ask
|
|
9
|
+
* the user to add it to PATH, winget links it under
|
|
10
|
+
* `%LOCALAPPDATA%\Microsoft\WinGet\Links`, and any installer that does update
|
|
11
|
+
* the user's PATH (in the registry) leaves terminals already open without it.
|
|
12
|
+
* So after PATH this looks in the user's and machine's registry PATH, then in
|
|
13
|
+
* each installer's own location. On macOS and Linux it checks the native
|
|
14
|
+
* installer's `~/.local/bin`, the legacy `~/.claude/local` and Homebrew.
|
|
15
|
+
*
|
|
16
|
+
* Only paths are probed; nothing is run except `reg query` on Windows, and
|
|
17
|
+
* only when PATH has no `claude`.
|
|
18
|
+
*/
|
|
19
|
+
/** Where Claude Code was found, for diagnostics (an enum, never a path). */
|
|
20
|
+
export declare const CLAUDE_SOURCES: readonly ["path", "registry-path", "native", "npm", "winget", "homebrew", "legacy-local"];
|
|
21
|
+
export type ClaudeSource = (typeof CLAUDE_SOURCES)[number];
|
|
22
|
+
/** `claude_found` in diagnostics: a source, or `desktop_only` (only the desktop app is installed). */
|
|
23
|
+
export declare const CLAUDE_FOUND: readonly ["path", "registry-path", "native", "npm", "winget", "homebrew", "legacy-local", "desktop_only"];
|
|
24
|
+
export interface ClaudeLocation {
|
|
25
|
+
/** What to spawn: `claude` when it is on PATH, else its absolute path. */
|
|
26
|
+
command: string;
|
|
27
|
+
source: ClaudeSource;
|
|
28
|
+
/** Not on PATH: its directory, to put on the child's PATH. */
|
|
29
|
+
dir?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface LocateClaudeOptions {
|
|
32
|
+
platform?: NodeJS.Platform;
|
|
33
|
+
env?: NodeJS.ProcessEnv;
|
|
34
|
+
homedir?: string;
|
|
35
|
+
/** True when `file` exists and can be run. */
|
|
36
|
+
isExecutable?: (file: string) => boolean;
|
|
37
|
+
/** Windows: the user's and the machine's PATH from the registry. */
|
|
38
|
+
registryPath?: () => string[];
|
|
39
|
+
/** Directory entries (winget's package folders); [] when unreadable. */
|
|
40
|
+
listDir?: (dir: string) => string[];
|
|
41
|
+
}
|
|
42
|
+
export interface DesktopAppOptions {
|
|
43
|
+
platform?: NodeJS.Platform;
|
|
44
|
+
env?: NodeJS.ProcessEnv;
|
|
45
|
+
homedir?: string;
|
|
46
|
+
/** True when the path exists (file or folder). */
|
|
47
|
+
exists?: (file: string) => boolean;
|
|
48
|
+
}
|
|
49
|
+
/** Claude Code to launch, or null when it is not installed anywhere known. */
|
|
50
|
+
export declare function locateClaude(opts?: LocateClaudeOptions): ClaudeLocation | null;
|
|
51
|
+
/** The child's environment with `location.dir` first on PATH, when it was not on PATH. */
|
|
52
|
+
export declare function withClaudeOnPath(env: NodeJS.ProcessEnv, location: ClaudeLocation, platform?: NodeJS.Platform): NodeJS.ProcessEnv;
|
|
53
|
+
/**
|
|
54
|
+
* Whether the Claude desktop app is installed (Windows, macOS). It runs Claude
|
|
55
|
+
* Code inside the app (its own copy, in the app's data folder, kept at the
|
|
56
|
+
* app's version), but puts no `claude` on the terminal's PATH, so ccc cannot
|
|
57
|
+
* use it. Only its own folders count, never `~/.claude`, which the CLI shares.
|
|
58
|
+
*/
|
|
59
|
+
export declare function claudeDesktopInstalled(opts?: DesktopAppOptions): boolean;
|
|
60
|
+
/** Said instead of claudeMissingText when only the desktop app is installed. */
|
|
61
|
+
export declare function claudeDesktopOnlyText(platform?: NodeJS.Platform): string;
|
|
62
|
+
/**
|
|
63
|
+
* Said once, instead of launching, when Claude Code is not installed: the
|
|
64
|
+
* official install command for this OS and the sign-in step.
|
|
65
|
+
*/
|
|
66
|
+
export declare function claudeMissingText(platform?: NodeJS.Platform): string;
|
|
67
|
+
/**
|
|
68
|
+
* One line, not blocking, when ccc starts somewhere that is not a project:
|
|
69
|
+
* C:\Windows\System32 (where an admin terminal opens) or the home folder.
|
|
70
|
+
*/
|
|
71
|
+
export declare function cwdHintText(cwd: string, opts?: {
|
|
72
|
+
platform?: NodeJS.Platform;
|
|
73
|
+
env?: NodeJS.ProcessEnv;
|
|
74
|
+
homedir?: string;
|
|
75
|
+
}): string | null;
|
|
76
|
+
/** `%USERPROFILE%\.local\bin` → its value; unknown names stay as written. */
|
|
77
|
+
export declare function expandWindowsVars(value: string, env: NodeJS.ProcessEnv): string;
|
|
78
|
+
/** The Path values in `reg query` output (REG_SZ or REG_EXPAND_SZ). */
|
|
79
|
+
export declare function parseRegQueryPath(output: string): string | null;
|
|
80
|
+
//# sourceMappingURL=claude-locate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-locate.d.ts","sourceRoot":"","sources":["../src/claude-locate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH,4EAA4E;AAC5E,eAAO,MAAM,cAAc,2FAEjB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3D,sGAAsG;AACtG,eAAO,MAAM,YAAY,2GAA+C,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAC9B,wEAAwE;IACxE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACpC;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,IAAI,GAAE,mBAAwB,GAAG,cAAc,GAAG,IAAI,CAclF;AAED,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,QAAQ,EAAE,cAAc,EACxB,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAAC,UAAU,CAMnB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAM5E;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,CAM1F;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,CAStF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACnF,MAAM,GAAG,IAAI,CAoBf;AA+JD,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAE/E;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D"}
|