looply-cli 0.5.1 → 0.5.3

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.
Files changed (127) hide show
  1. package/dist/.src-hash +1 -1
  2. package/dist/agent-contained.d.ts +2 -0
  3. package/dist/agent-contained.d.ts.map +1 -1
  4. package/dist/agent-contained.js +22 -5
  5. package/dist/agent-contained.js.map +1 -1
  6. package/dist/agent-exec.d.ts.map +1 -1
  7. package/dist/agent-exec.js +1 -0
  8. package/dist/agent-exec.js.map +1 -1
  9. package/dist/autonomy-tick.d.ts +46 -0
  10. package/dist/autonomy-tick.d.ts.map +1 -1
  11. package/dist/autonomy-tick.js +44 -2
  12. package/dist/autonomy-tick.js.map +1 -1
  13. package/dist/bin.d.ts.map +1 -1
  14. package/dist/bin.js +131 -93
  15. package/dist/bin.js.map +1 -1
  16. package/dist/brain-advice.js +2 -2
  17. package/dist/brain-advice.js.map +1 -1
  18. package/dist/command-runner.d.ts.map +1 -1
  19. package/dist/command-runner.js +1 -0
  20. package/dist/command-runner.js.map +1 -1
  21. package/dist/connect-node.d.ts.map +1 -1
  22. package/dist/connect-node.js +8 -4
  23. package/dist/connect-node.js.map +1 -1
  24. package/dist/connect.d.ts +8 -0
  25. package/dist/connect.d.ts.map +1 -1
  26. package/dist/connect.js +22 -0
  27. package/dist/connect.js.map +1 -1
  28. package/dist/contained-node.d.ts +51 -0
  29. package/dist/contained-node.d.ts.map +1 -0
  30. package/dist/contained-node.js +116 -0
  31. package/dist/contained-node.js.map +1 -0
  32. package/dist/daemon-cmd.d.ts.map +1 -1
  33. package/dist/daemon-cmd.js +54 -2
  34. package/dist/daemon-cmd.js.map +1 -1
  35. package/dist/daemon.d.ts +9 -0
  36. package/dist/daemon.d.ts.map +1 -1
  37. package/dist/daemon.js +11 -1
  38. package/dist/daemon.js.map +1 -1
  39. package/dist/exec-domains.d.ts +4 -0
  40. package/dist/exec-domains.d.ts.map +1 -1
  41. package/dist/exec-domains.js +7 -2
  42. package/dist/exec-domains.js.map +1 -1
  43. package/dist/gate-draft.d.ts +99 -0
  44. package/dist/gate-draft.d.ts.map +1 -0
  45. package/dist/gate-draft.js +544 -0
  46. package/dist/gate-draft.js.map +1 -0
  47. package/dist/git-driver.d.ts.map +1 -1
  48. package/dist/git-driver.js +1 -0
  49. package/dist/git-driver.js.map +1 -1
  50. package/dist/init-detect.d.ts +20 -10
  51. package/dist/init-detect.d.ts.map +1 -1
  52. package/dist/init-detect.js +27 -85
  53. package/dist/init-detect.js.map +1 -1
  54. package/dist/model-transport.d.ts.map +1 -1
  55. package/dist/model-transport.js +25 -8
  56. package/dist/model-transport.js.map +1 -1
  57. package/dist/notify-channel.d.ts.map +1 -1
  58. package/dist/notify-channel.js +1 -0
  59. package/dist/notify-channel.js.map +1 -1
  60. package/dist/provider-cmd.d.ts +56 -0
  61. package/dist/provider-cmd.d.ts.map +1 -0
  62. package/dist/provider-cmd.js +260 -0
  63. package/dist/provider-cmd.js.map +1 -0
  64. package/dist/provider-discovery.d.ts +75 -0
  65. package/dist/provider-discovery.d.ts.map +1 -0
  66. package/dist/provider-discovery.js +235 -0
  67. package/dist/provider-discovery.js.map +1 -0
  68. package/dist/provider-identity.d.ts +3 -3
  69. package/dist/provider-identity.d.ts.map +1 -1
  70. package/dist/provider-identity.js +4 -5
  71. package/dist/provider-identity.js.map +1 -1
  72. package/dist/provider-preflight.d.ts.map +1 -1
  73. package/dist/provider-preflight.js +1 -0
  74. package/dist/provider-preflight.js.map +1 -1
  75. package/dist/provider-ready.d.ts +66 -0
  76. package/dist/provider-ready.d.ts.map +1 -0
  77. package/dist/provider-ready.js +105 -0
  78. package/dist/provider-ready.js.map +1 -0
  79. package/dist/provider-state.d.ts.map +1 -1
  80. package/dist/provider-state.js +1 -0
  81. package/dist/provider-state.js.map +1 -1
  82. package/dist/refresh-gates.d.ts +47 -0
  83. package/dist/refresh-gates.d.ts.map +1 -0
  84. package/dist/refresh-gates.js +128 -0
  85. package/dist/refresh-gates.js.map +1 -0
  86. package/dist/repo-init.d.ts +5 -1
  87. package/dist/repo-init.d.ts.map +1 -1
  88. package/dist/repo-init.js +19 -3
  89. package/dist/repo-init.js.map +1 -1
  90. package/dist/run-cmd.js +4 -4
  91. package/dist/run-cmd.js.map +1 -1
  92. package/dist/run-launcher.d.ts +5 -0
  93. package/dist/run-launcher.d.ts.map +1 -1
  94. package/dist/run-launcher.js +38 -1
  95. package/dist/run-launcher.js.map +1 -1
  96. package/dist/serve-cmd.d.ts.map +1 -1
  97. package/dist/serve-cmd.js +14 -5
  98. package/dist/serve-cmd.js.map +1 -1
  99. package/dist/serve.d.ts +19 -7
  100. package/dist/serve.d.ts.map +1 -1
  101. package/dist/serve.js +28 -12
  102. package/dist/serve.js.map +1 -1
  103. package/dist/server-client.d.ts +12 -1
  104. package/dist/server-client.d.ts.map +1 -1
  105. package/dist/server-client.js +10 -2
  106. package/dist/server-client.js.map +1 -1
  107. package/dist/session-checkpoint-runtime.d.ts.map +1 -1
  108. package/dist/session-checkpoint-runtime.js +1 -0
  109. package/dist/session-checkpoint-runtime.js.map +1 -1
  110. package/dist/setup.d.ts +7 -1
  111. package/dist/setup.d.ts.map +1 -1
  112. package/dist/setup.js +13 -13
  113. package/dist/setup.js.map +1 -1
  114. package/dist/shared-grants.js +2 -2
  115. package/dist/shared-grants.js.map +1 -1
  116. package/dist/toolchain-mirror.js +1 -1
  117. package/dist/toolchain-mirror.js.map +1 -1
  118. package/dist/untrusted-exec.d.ts +23 -0
  119. package/dist/untrusted-exec.d.ts.map +1 -1
  120. package/dist/untrusted-exec.js +18 -1
  121. package/dist/untrusted-exec.js.map +1 -1
  122. package/dist/untrusted-gate.d.ts.map +1 -1
  123. package/dist/untrusted-gate.js +4 -0
  124. package/dist/untrusted-gate.js.map +1 -1
  125. package/package.json +2 -2
  126. package/win/appcontainer.ps1 +97 -4
  127. package/win/contained-node.cjs +530 -0
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.INSTALL_COMMAND = exports.PROVIDER_USAGE = void 0;
4
+ exports.readinessOf = readinessOf;
5
+ exports.loginCommandLine = loginCommandLine;
6
+ exports.ensureProviderReady = ensureProviderReady;
7
+ exports.providerCommand = providerCommand;
8
+ exports.nodeProviderDeps = nodeProviderDeps;
9
+ const node_child_process_1 = require("node:child_process");
10
+ const node_fs_1 = require("node:fs");
11
+ const node_os_1 = require("node:os");
12
+ const node_path_1 = require("node:path");
13
+ const exec_domains_1 = require("./exec-domains");
14
+ const model_transport_1 = require("./model-transport");
15
+ const provider_discovery_1 = require("./provider-discovery");
16
+ const provider_ready_1 = require("./provider-ready");
17
+ const provider_state_1 = require("./provider-state");
18
+ const setup_prompt_1 = require("./setup-prompt");
19
+ /**
20
+ * `looply provider` — IS CLAUDE CODE READY ON THIS MACHINE, AND IF NOT, FIX IT.
21
+ *
22
+ * looply provider [status] where Claude Code was found, and whether Looply's profile is logged in
23
+ * looply provider install [--yes] install Claude Code (`npm i -g @anthropic-ai/claude-code`)
24
+ * looply provider login sign Looply's own Claude Code profile in
25
+ *
26
+ * `looply connect` runs the same check up front (`ensureProviderReady`), so a
27
+ * machine is not left serving repositories it can never run anything in. This
28
+ * command exists so it can be fixed later without running `connect` again.
29
+ *
30
+ * ⚠️ LOOPLY'S PROFILE, NOT THE PERSON'S. The login lands in
31
+ * `~/.looply/provider-profile` (`CLAUDE_CONFIG_DIR`), the profile every run
32
+ * uses — logging into Claude Code in a terminal the ordinary way does NOT make
33
+ * Looply ready, which is exactly what tripped the first real user.
34
+ */
35
+ exports.PROVIDER_USAGE = [
36
+ 'looply provider [status] where Claude Code was found, and whether Looply is signed in to it',
37
+ 'looply provider install [--yes] install Claude Code (npm i -g @anthropic-ai/claude-code)',
38
+ 'looply provider login sign Looply’s own Claude Code profile in (opens your browser)',
39
+ ].join('\n');
40
+ exports.INSTALL_COMMAND = 'npm i -g @anthropic-ai/claude-code';
41
+ function readinessOf(deps) {
42
+ const discovery = deps.discover();
43
+ const auth = discovery.found === null ? null : deps.checkAuth(discovery.found.executable);
44
+ return (0, provider_ready_1.readinessFrom)(discovery, auth);
45
+ }
46
+ /** The exact command a person types to log Looply's profile in, in their own shell. */
47
+ function loginCommandLine(executable, profile, platform) {
48
+ return platform === 'win32'
49
+ ? `$env:CLAUDE_CONFIG_DIR="${profile}"; & "${executable}" auth login`
50
+ : `CLAUDE_CONFIG_DIR="${profile}" "${executable}" auth login`;
51
+ }
52
+ function describe(r, deps) {
53
+ if (r.executable !== null && r.source !== null) {
54
+ deps.out(`provider: Claude Code found at ${r.executable}`);
55
+ deps.out(` (from ${provider_discovery_1.SOURCE_WORDS[r.source]})`);
56
+ }
57
+ deps.out(` Looply's profile: ${deps.profile}`);
58
+ if (r.ready)
59
+ deps.out(`provider: READY — ${r.detail}.`);
60
+ else
61
+ deps.out(`provider: NOT READY (${r.reason}) — ${r.detail}.`);
62
+ }
63
+ /**
64
+ * Make the provider ready, as far as this terminal allows. Never throws; the
65
+ * readiness at the end is the answer.
66
+ *
67
+ * - Not installed: explain, then install — asking y/N on a terminal, without
68
+ * asking under `yes`, and otherwise printing the exact command.
69
+ * - Not logged in: run the login on a terminal; otherwise print the command.
70
+ */
71
+ async function ensureProviderReady(deps, opts) {
72
+ let r = readinessOf(deps);
73
+ if (r.ready) {
74
+ deps.out(`provider: Claude Code is ready (${r.executable}).`);
75
+ return r;
76
+ }
77
+ if (r.reason === 'not_installed') {
78
+ deps.out('provider: Claude Code is not installed where Looply can find it. Looply needs it to do any work —');
79
+ deps.out(' without it, work you start stays waiting on this machine.');
80
+ let go = opts.yes;
81
+ if (!go && deps.interactive && deps.ask) {
82
+ const answer = await deps.ask(`Install it now with \`${exports.INSTALL_COMMAND}\`? [y/N] `);
83
+ go = /^(y|yes)$/i.test(answer.trim());
84
+ }
85
+ if (!go) {
86
+ deps.out(` To install it later: ${exports.INSTALL_COMMAND} (or: looply provider install)`);
87
+ return r;
88
+ }
89
+ deps.out(`provider: installing — ${exports.INSTALL_COMMAND}`);
90
+ const code = await deps.install().catch((e) => {
91
+ deps.err(`provider: the install could not start — ${e.message}`);
92
+ return 1;
93
+ });
94
+ if (code !== 0) {
95
+ deps.err(`provider: the install did not finish (exit ${code}). Run it yourself: ${exports.INSTALL_COMMAND}`);
96
+ return readinessOf(deps);
97
+ }
98
+ r = readinessOf(deps);
99
+ if (r.reason === 'not_installed') {
100
+ deps.err('provider: installed, but Looply still cannot find Claude Code. `looply provider status` shows where it looked.');
101
+ return r;
102
+ }
103
+ if (r.ready) {
104
+ deps.out(`provider: Claude Code is ready (${r.executable}).`);
105
+ return r;
106
+ }
107
+ }
108
+ if (r.reason === 'not_logged_in' && r.executable !== null) {
109
+ deps.out("provider: Claude Code is installed, but Looply's own profile is not signed in to your Claude account.");
110
+ if (!deps.interactive) {
111
+ deps.out(' Sign it in from a terminal: looply provider login');
112
+ deps.out(` (which runs: ${loginCommandLine(r.executable, deps.profile, deps.platform)})`);
113
+ return r;
114
+ }
115
+ deps.out('provider: signing in — follow the steps Claude Code shows (it may open your browser).');
116
+ const code = await deps.login(r.executable).catch((e) => {
117
+ deps.err(`provider: the sign-in could not start — ${e.message}`);
118
+ return 1;
119
+ });
120
+ r = readinessOf(deps);
121
+ if (r.ready) {
122
+ deps.out(`provider: signed in — Claude Code is ready (${r.detail}).`);
123
+ return r;
124
+ }
125
+ deps.err(`provider: still not signed in${code === 0 ? '' : ` (exit ${code})`}. Try again with \`looply provider login\`, or run: ` +
126
+ loginCommandLine(r.executable ?? '', deps.profile, deps.platform));
127
+ return r;
128
+ }
129
+ if (!r.ready)
130
+ deps.out(`provider: NOT READY (${r.reason}) — ${r.detail}. ${(0, provider_ready_1.fixFor)(r.reason)}.`);
131
+ return r;
132
+ }
133
+ async function providerCommand(argv, deps) {
134
+ const [verb = 'status', ...rest] = argv;
135
+ const yes = rest.includes('--yes') || rest.includes('-y');
136
+ const unknown = rest.filter((a) => a !== '--yes' && a !== '-y');
137
+ if (unknown.length > 0) {
138
+ deps.err(`looply provider: ${JSON.stringify(unknown[0])} — no idea what that means\n\n${exports.PROVIDER_USAGE}`);
139
+ return 64;
140
+ }
141
+ switch (verb) {
142
+ case 'status': {
143
+ const discovery = deps.discover();
144
+ const auth = discovery.found === null ? null : deps.checkAuth(discovery.found.executable);
145
+ const r = (0, provider_ready_1.readinessFrom)(discovery, auth);
146
+ if (discovery.found === null) {
147
+ deps.out('provider: Claude Code was not found. Looked in:');
148
+ for (const s of discovery.searched)
149
+ deps.out(` ${s}`);
150
+ }
151
+ describe(r, deps);
152
+ if (!r.ready)
153
+ deps.out(` to fix: ${(0, provider_ready_1.fixFor)(r.reason)}`);
154
+ return r.ready ? 0 : 1;
155
+ }
156
+ case 'install': {
157
+ const before = readinessOf(deps);
158
+ if (before.reason !== 'not_installed') {
159
+ deps.out(`provider: Claude Code is already installed (${before.executable}).`);
160
+ if (!before.ready)
161
+ deps.out(` ${(0, provider_ready_1.fixFor)(before.reason)}.`);
162
+ return 0;
163
+ }
164
+ if (!yes && !deps.interactive) {
165
+ deps.err(`looply provider install: there is no terminal to confirm on. Re-run with --yes, or run: ${exports.INSTALL_COMMAND}`);
166
+ return 1;
167
+ }
168
+ const r = await ensureProviderReady(deps, { yes });
169
+ return r.reason === 'not_installed' ? 1 : 0;
170
+ }
171
+ case 'login': {
172
+ const r = readinessOf(deps);
173
+ if (r.reason === 'not_installed' || r.executable === null) {
174
+ deps.err('looply provider login: Claude Code is not installed yet — run `looply provider install` first.');
175
+ return 1;
176
+ }
177
+ if (!deps.interactive) {
178
+ deps.err('looply provider login: signing in needs a terminal. Run this in one:');
179
+ deps.err(` ${loginCommandLine(r.executable, deps.profile, deps.platform)}`);
180
+ return 1;
181
+ }
182
+ // Run even when already signed in: the person asked, perhaps for another account.
183
+ const code = await deps.login(r.executable);
184
+ const after = readinessOf(deps);
185
+ describe(after, deps);
186
+ return after.ready ? 0 : code === 0 ? 1 : code;
187
+ }
188
+ default:
189
+ deps.err(`looply provider: unknown action ${JSON.stringify(verb)}\n\n${exports.PROVIDER_USAGE}`);
190
+ return 64;
191
+ }
192
+ }
193
+ /* ───────────────────────────────────────────────────────── the real machine ── */
194
+ /**
195
+ * `npm-cli.js` of the node running Looply — run with this node, never `npm` by
196
+ * name: on Windows that is a `.cmd` needing a shell, looked up in the current
197
+ * directory first.
198
+ */
199
+ /* istanbul ignore next — real fs */
200
+ function npmCli() {
201
+ const p = process.platform === 'win32' ? node_path_1.win32 : node_path_1.posix;
202
+ let nodeDir;
203
+ try {
204
+ nodeDir = p.dirname((0, node_fs_1.realpathSync)(process.execPath));
205
+ }
206
+ catch {
207
+ nodeDir = p.dirname(process.execPath);
208
+ }
209
+ return ([
210
+ p.join(nodeDir, 'node_modules', 'npm', 'bin', 'npm-cli.js'),
211
+ p.join(p.dirname(nodeDir), 'lib', 'node_modules', 'npm', 'bin', 'npm-cli.js'),
212
+ ].find((c) => (0, node_fs_1.existsSync)(c)) ?? null);
213
+ }
214
+ /* istanbul ignore next — real tty */
215
+ async function askOnce(prompt) {
216
+ const asker = (0, setup_prompt_1.nodeAsker)();
217
+ try {
218
+ return await asker.question(prompt);
219
+ }
220
+ finally {
221
+ asker.close();
222
+ }
223
+ }
224
+ /* istanbul ignore next — real process */
225
+ function foreground(exe, args, env) {
226
+ return new Promise((resolve, reject) => {
227
+ // In the person's own terminal (inherited stdio), from their home rather
228
+ // than whatever project they stood in. `windowsHide` opens no extra window.
229
+ const child = (0, node_child_process_1.spawn)(exe, [...args], { stdio: 'inherit', env, cwd: (0, node_os_1.homedir)(), windowsHide: true });
230
+ child.on('error', reject);
231
+ child.on('exit', (code) => resolve(code ?? 1));
232
+ });
233
+ }
234
+ /* istanbul ignore next — real fs, tty and processes; the logic is above */
235
+ function nodeProviderDeps(opts = {}) {
236
+ const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
237
+ const profile = (0, provider_state_1.providerProfileDir)();
238
+ return {
239
+ platform: process.platform,
240
+ interactive,
241
+ ...(interactive ? { ask: opts.ask ?? askOnce } : {}),
242
+ profile,
243
+ discover: () => (0, provider_discovery_1.discoverProvider)(opts.configured),
244
+ checkAuth: (exe) => {
245
+ // The SAME environment and profile a run uses (as `doctor --provider` does).
246
+ const env = { ...(0, exec_domains_1.buildProviderEnv)((0, model_transport_1.providerSessionDir)((0, node_os_1.homedir)(), 'implementer')), CLAUDE_CONFIG_DIR: profile };
247
+ return (0, provider_state_1.checkProviderAuth)(exe, env);
248
+ },
249
+ install: async () => {
250
+ const cli = npmCli();
251
+ if (cli === null)
252
+ throw new Error(`npm was not found beside ${process.execPath}`);
253
+ return foreground(process.execPath, [cli, 'i', '-g', '@anthropic-ai/claude-code'], process.env);
254
+ },
255
+ login: (exe) => foreground(exe, ['auth', 'login'], { ...process.env, CLAUDE_CONFIG_DIR: profile }),
256
+ out: (line) => process.stdout.write(`${line}\n`),
257
+ err: (line) => process.stderr.write(`${line}\n`),
258
+ };
259
+ }
260
+ //# sourceMappingURL=provider-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-cmd.js","sourceRoot":"","sources":["../src/provider-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * WHERE CLAUDE CODE IS ON THIS MACHINE.
3
+ *
4
+ * Looply used to look in exactly one place — `<dir of realpath(node.exe)>/
5
+ * node_modules/@anthropic-ai/claude-code/bin/claude.exe` — and MEASURED ON A
6
+ * REAL MACHINE (2026-10-14/15) that missed it: nvm-managed node, a different
7
+ * npm prefix, and Anthropic's own native installer all put the provider
8
+ * somewhere else, and the person was told nothing.
9
+ *
10
+ * So the search is a list, in a fixed order, and the first hit wins:
11
+ *
12
+ * 1. `config` `agent.executable`, when a person named one
13
+ * 2. `npm_global` `npm root -g` (cached per process), plus `%APPDATA%\npm` on Windows
14
+ * 3. `beside_node` the npm prefix of the node that runs Looply (the old, only, lookup)
15
+ * 4. `native_installer` `~/.local/bin/claude(.exe)` and the legacy `~/.claude/local` install
16
+ * 5. `path` `claude` on PATH — `.cmd`/`.ps1` shims resolved to the real executable
17
+ *
18
+ * ⚠️ PATH IS SEARCHED BY HAND, NEVER BY `where`/`which`. `where` (and Windows'
19
+ * own lookup) tries the CURRENT DIRECTORY first, and a daemon's current
20
+ * directory is a project the model may write to — the same hole `gitBinary`
21
+ * and the absolute `taskkill.exe` close. Relative PATH entries are skipped for
22
+ * the same reason.
23
+ *
24
+ * Every package hit keeps its PACKAGE DIRECTORY: the contained agent is granted
25
+ * that directory and nothing beside it (see `agent-contained.ts`). A native
26
+ * installer's binary has no package; `packageDir` is then null and the caller
27
+ * grants the executable file alone.
28
+ */
29
+ export type ProviderSource = 'config' | 'npm_global' | 'beside_node' | 'native_installer' | 'path';
30
+ export interface ProviderLocation {
31
+ /** The executable a run spawns. */
32
+ readonly executable: string;
33
+ /** The npm package it lives in, or null for a self-contained (native) binary. */
34
+ readonly packageDir: string | null;
35
+ readonly source: ProviderSource;
36
+ }
37
+ export interface ProviderDiscovery {
38
+ readonly found: ProviderLocation | null;
39
+ /** Every place looked, in order — for `looply provider status` when nothing was found. */
40
+ readonly searched: readonly string[];
41
+ }
42
+ export interface DiscoveryDeps {
43
+ platform: NodeJS.Platform;
44
+ env: Record<string, string | undefined>;
45
+ home: string;
46
+ /** `process.execPath`. */
47
+ nodeExe: string;
48
+ isFile(path: string): boolean;
49
+ /** Throws when the path does not resolve. */
50
+ realpath(path: string): string;
51
+ /** A small text file's contents, or null. */
52
+ readText(path: string): string | null;
53
+ /** `npm root -g`, or null when npm could not answer. */
54
+ npmRoot(): string | null;
55
+ }
56
+ /** Human words for a source, for `provider status` and `doctor --provider`. */
57
+ export declare const SOURCE_WORDS: Readonly<Record<ProviderSource, string>>;
58
+ /**
59
+ * The package directory an executable lives in, when it is `…/@anthropic-ai/claude-code/bin/claude.exe`.
60
+ */
61
+ export declare function packageDirOf(executable: string, platform?: NodeJS.Platform): string | null;
62
+ export declare function discoverProvider(configured: string | undefined, deps?: DiscoveryDeps): ProviderDiscovery;
63
+ /**
64
+ * `npm root -g`, asked once per process.
65
+ *
66
+ * Run as `node npm-cli.js root -g` with this node — never `npm` by name, which
67
+ * on Windows is a `.cmd` that needs a shell and is looked up from the current
68
+ * directory first. Hidden, bounded, from the home directory. An npm that
69
+ * cannot be found or does not answer is null, and the other sources still run.
70
+ */
71
+ export declare function nodeNpmRoot(): string | null;
72
+ export declare function nodeDiscoveryDeps(): DiscoveryDeps;
73
+ /** The built-in provider's executable, wherever it is installed; null when none was found. */
74
+ export declare function claudeExecutable(configured?: string): string | null;
75
+ //# sourceMappingURL=provider-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-discovery.d.ts","sourceRoot":"","sources":["../src/provider-discovery.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,YAAY,GAAG,aAAa,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAEnG,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iFAAiF;IACjF,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACxC,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACtC,wDAAwD;IACxD,OAAO,IAAI,MAAM,GAAG,IAAI,CAAC;CAC1B;AAID,+EAA+E;AAC/E,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAMjE,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,GAAG,IAAI,CAM5G;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,GAAE,aAAmC,GAAG,iBAAiB,CAuE7H;AAyDD;;;;;;;GAOG;AAEH,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CA8B3C;AAGD,wBAAgB,iBAAiB,IAAI,aAAa,CAuBjD;AAED,8FAA8F;AAE9F,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEnE"}
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SOURCE_WORDS = void 0;
4
+ exports.packageDirOf = packageDirOf;
5
+ exports.discoverProvider = discoverProvider;
6
+ exports.nodeNpmRoot = nodeNpmRoot;
7
+ exports.nodeDiscoveryDeps = nodeDiscoveryDeps;
8
+ exports.claudeExecutable = claudeExecutable;
9
+ const node_child_process_1 = require("node:child_process");
10
+ const node_fs_1 = require("node:fs");
11
+ const node_os_1 = require("node:os");
12
+ const node_path_1 = require("node:path");
13
+ const PKG_SEGMENTS = ['@anthropic-ai', 'claude-code'];
14
+ /** Human words for a source, for `provider status` and `doctor --provider`. */
15
+ exports.SOURCE_WORDS = {
16
+ config: 'agent.executable in .looply/config.yaml',
17
+ npm_global: 'the global npm packages (npm root -g)',
18
+ beside_node: "beside the node that runs Looply",
19
+ native_installer: "Anthropic's native installer location",
20
+ path: 'the PATH',
21
+ };
22
+ /**
23
+ * The package directory an executable lives in, when it is `…/@anthropic-ai/claude-code/bin/claude.exe`.
24
+ */
25
+ function packageDirOf(executable, platform = process.platform) {
26
+ const p = platform === 'win32' ? node_path_1.win32 : node_path_1.posix;
27
+ const bin = p.dirname(executable);
28
+ const pkg = p.dirname(bin);
29
+ const norm = pkg.replace(/\\/g, '/').toLowerCase();
30
+ return p.basename(bin).toLowerCase() === 'bin' && norm.endsWith(`/${PKG_SEGMENTS.join('/')}`) ? pkg : null;
31
+ }
32
+ function discoverProvider(configured, deps = nodeDiscoveryDeps()) {
33
+ const p = deps.platform === 'win32' ? node_path_1.win32 : node_path_1.posix;
34
+ const searched = [];
35
+ const inPackage = (nodeModules) => p.join(nodeModules, ...PKG_SEGMENTS, 'bin', 'claude.exe');
36
+ const hit = (executable, source, packageDir) => ({
37
+ found: { executable, source, packageDir: packageDir === undefined ? packageDirOf(executable, deps.platform) : packageDir },
38
+ searched,
39
+ });
40
+ const probe = (candidate, source) => {
41
+ searched.push(candidate);
42
+ return deps.isFile(candidate) ? hit(candidate, source) : null;
43
+ };
44
+ // 1. A person's explicit choice is believed here and CHECKED by the caller
45
+ // (absolute, exists, outside the worktree), exactly as before.
46
+ if (configured !== undefined)
47
+ return hit(configured, 'config');
48
+ // 2. The global npm packages.
49
+ const roots = [];
50
+ const root = deps.npmRoot();
51
+ if (root !== null && p.isAbsolute(root))
52
+ roots.push(root);
53
+ if (deps.platform === 'win32' && deps.env['APPDATA'])
54
+ roots.push(node_path_1.win32.join(deps.env['APPDATA'], 'npm', 'node_modules'));
55
+ for (const r of unique(roots)) {
56
+ const found = probe(inPackage(r), 'npm_global');
57
+ if (found)
58
+ return found;
59
+ }
60
+ // 3. Beside the node that runs Looply (Windows layout, then the POSIX prefix layout).
61
+ let nodeDir;
62
+ try {
63
+ nodeDir = p.dirname(deps.realpath(deps.nodeExe));
64
+ }
65
+ catch {
66
+ nodeDir = p.dirname(deps.nodeExe);
67
+ }
68
+ const beside = deps.platform === 'win32'
69
+ ? [inPackage(p.join(nodeDir, 'node_modules'))]
70
+ : [inPackage(p.join(p.dirname(nodeDir), 'lib', 'node_modules')), inPackage(p.join(nodeDir, 'node_modules'))];
71
+ for (const c of beside) {
72
+ const found = probe(c, 'beside_node');
73
+ if (found)
74
+ return found;
75
+ }
76
+ // 4. Anthropic's native installer, and the older per-user "local" install.
77
+ const native = deps.platform === 'win32'
78
+ ? [p.join(deps.home, '.local', 'bin', 'claude.exe')]
79
+ : [p.join(deps.home, '.local', 'bin', 'claude')];
80
+ native.push(inPackage(p.join(deps.home, '.claude', 'local', 'node_modules')));
81
+ if (deps.platform !== 'win32')
82
+ native.push(p.join(deps.home, '.claude', 'local', 'claude'));
83
+ for (const c of native) {
84
+ const found = probe(c, 'native_installer');
85
+ if (found)
86
+ return found;
87
+ }
88
+ // 5. PATH, by hand.
89
+ const pathVar = deps.env['PATH'] ?? deps.env['Path'] ?? '';
90
+ const sep = deps.platform === 'win32' ? ';' : ':';
91
+ const names = deps.platform === 'win32' ? ['claude.exe', 'claude.cmd', 'claude.ps1'] : ['claude'];
92
+ for (const raw of pathVar.split(sep)) {
93
+ const dir = raw.trim().replace(/^"(.*)"$/, '$1');
94
+ if (dir === '' || !p.isAbsolute(dir))
95
+ continue;
96
+ for (const name of names) {
97
+ const candidate = p.join(dir, name);
98
+ searched.push(candidate);
99
+ if (!deps.isFile(candidate))
100
+ continue;
101
+ const resolved = resolvePathHit(candidate, deps);
102
+ if (resolved !== null)
103
+ return hit(resolved.executable, 'path', resolved.packageDir);
104
+ }
105
+ }
106
+ return { found: null, searched };
107
+ }
108
+ /**
109
+ * A `claude` found on PATH, turned into something that can be spawned without a shell.
110
+ *
111
+ * - A `.cmd`/`.ps1` npm shim names `…\node_modules\@anthropic-ai\claude-code\bin\claude.exe`
112
+ * relative to its own directory; that executable is what runs.
113
+ * - A POSIX symlink is followed, so a package's `bin/claude.exe` keeps its package.
114
+ * - Anything else that is a real file is the executable itself (a native binary).
115
+ */
116
+ function resolvePathHit(candidate, deps) {
117
+ const p = deps.platform === 'win32' ? node_path_1.win32 : node_path_1.posix;
118
+ const dir = p.dirname(candidate);
119
+ const lower = candidate.toLowerCase();
120
+ if (lower.endsWith('.cmd') || lower.endsWith('.ps1')) {
121
+ // The npm layout first: the shim's own directory holds the package.
122
+ const sibling = p.join(dir, 'node_modules', ...PKG_SEGMENTS, 'bin', 'claude.exe');
123
+ if (deps.isFile(sibling))
124
+ return { executable: sibling, packageDir: packageDirOf(sibling, deps.platform) };
125
+ // Otherwise read where the shim says it goes.
126
+ const text = deps.readText(candidate) ?? '';
127
+ const m = /(?:%~?dp0%?|\$basedir)[\\/]*((?:[^"'\s%$]*[\\/])?claude\.exe)/i.exec(text);
128
+ if (m) {
129
+ const target = p.join(dir, m[1]);
130
+ if (deps.isFile(target))
131
+ return { executable: target, packageDir: packageDirOf(target, deps.platform) };
132
+ }
133
+ return null;
134
+ }
135
+ let real = candidate;
136
+ try {
137
+ real = deps.realpath(candidate);
138
+ }
139
+ catch {
140
+ /* keep the name we found */
141
+ }
142
+ const pkg = packageDirOf(real, deps.platform);
143
+ // A package keeps its resolved place; a native binary keeps the stable name
144
+ // on PATH (an updater swaps what it points at).
145
+ return pkg !== null ? { executable: real, packageDir: pkg } : { executable: candidate, packageDir: null };
146
+ }
147
+ function unique(xs) {
148
+ const seen = new Set();
149
+ const out = [];
150
+ for (const x of xs) {
151
+ const k = x.toLowerCase();
152
+ if (!seen.has(k)) {
153
+ seen.add(k);
154
+ out.push(x);
155
+ }
156
+ }
157
+ return out;
158
+ }
159
+ let npmRootCache = null;
160
+ /**
161
+ * `npm root -g`, asked once per process.
162
+ *
163
+ * Run as `node npm-cli.js root -g` with this node — never `npm` by name, which
164
+ * on Windows is a `.cmd` that needs a shell and is looked up from the current
165
+ * directory first. Hidden, bounded, from the home directory. An npm that
166
+ * cannot be found or does not answer is null, and the other sources still run.
167
+ */
168
+ /* istanbul ignore next — real process */
169
+ function nodeNpmRoot() {
170
+ if (npmRootCache !== null)
171
+ return npmRootCache.value;
172
+ let value = null;
173
+ try {
174
+ const prefixEnv = process.env['npm_config_prefix'];
175
+ if (prefixEnv) {
176
+ value = process.platform === 'win32' ? node_path_1.win32.join(prefixEnv, 'node_modules') : node_path_1.posix.join(prefixEnv, 'lib', 'node_modules');
177
+ }
178
+ else {
179
+ const p = process.platform === 'win32' ? node_path_1.win32 : node_path_1.posix;
180
+ const nodeDir = p.dirname((0, node_fs_1.realpathSync)(process.execPath));
181
+ const cli = [
182
+ p.join(nodeDir, 'node_modules', 'npm', 'bin', 'npm-cli.js'),
183
+ p.join(p.dirname(nodeDir), 'lib', 'node_modules', 'npm', 'bin', 'npm-cli.js'),
184
+ ].find((c) => (0, node_fs_1.existsSync)(c));
185
+ if (cli !== undefined) {
186
+ const out = (0, node_child_process_1.execFileSync)(process.execPath, [cli, 'root', '-g'], {
187
+ cwd: (0, node_os_1.homedir)(),
188
+ encoding: 'utf8',
189
+ timeout: 15_000,
190
+ stdio: ['ignore', 'pipe', 'ignore'],
191
+ windowsHide: true,
192
+ }).trim();
193
+ value = out === '' ? null : out.split(/\r?\n/).pop().trim();
194
+ }
195
+ }
196
+ }
197
+ catch {
198
+ value = null;
199
+ }
200
+ npmRootCache = { value };
201
+ return value;
202
+ }
203
+ /* istanbul ignore next — real fs */
204
+ function nodeDiscoveryDeps() {
205
+ return {
206
+ platform: process.platform,
207
+ env: process.env,
208
+ home: (0, node_os_1.homedir)(),
209
+ nodeExe: process.execPath,
210
+ isFile: (path) => {
211
+ try {
212
+ return (0, node_fs_1.statSync)(path).isFile();
213
+ }
214
+ catch {
215
+ return false;
216
+ }
217
+ },
218
+ realpath: (path) => (0, node_fs_1.realpathSync)(path),
219
+ readText: (path) => {
220
+ try {
221
+ return (0, node_fs_1.readFileSync)(path, 'utf8').slice(0, 64 * 1024);
222
+ }
223
+ catch {
224
+ return null;
225
+ }
226
+ },
227
+ npmRoot: nodeNpmRoot,
228
+ };
229
+ }
230
+ /** The built-in provider's executable, wherever it is installed; null when none was found. */
231
+ /* istanbul ignore next — real fs */
232
+ function claudeExecutable(configured) {
233
+ return discoverProvider(configured).found?.executable ?? null;
234
+ }
235
+ //# sourceMappingURL=provider-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-discovery.js","sourceRoot":"","sources":["../src/provider-discovery.ts"],"names":[],"mappings":"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"}
@@ -97,8 +97,8 @@ export declare function providerChanged(previous: ProviderIdentity | null, curre
97
97
  /**
98
98
  * Who a record says was asked, read from the thing that will run (M3-1/M3-2):
99
99
  * the packaged provider's identity digest when the spec names the default
100
- * command, the configured command's otherwise. `packageDir` is the provider
101
- * package the caller located (`claudePackageDir()`), or null when it did not.
100
+ * command, the configured command's otherwise. `executable` is the provider
101
+ * executable the caller located (`claudeExecutable()`), or null when it did not.
102
102
  */
103
- export declare function providerRecordFor(spec: AgentSpec, packageDir: string | null): ProposalProvider;
103
+ export declare function providerRecordFor(spec: AgentSpec, executable: string | null): ProposalProvider;
104
104
  //# sourceMappingURL=provider-identity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-identity.d.ts","sourceRoot":"","sources":["../src/provider-identity.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,gEAAgE;AAChE,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAE1D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,SAAS,CAAC;IACtE,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB,CA4DvE;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,OAAO,EAAE,gBAAgB,GACxB,cAAc,CAuBhB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,gBAAgB,CAQ9F"}
1
+ {"version":3,"file":"provider-identity.d.ts","sourceRoot":"","sources":["../src/provider-identity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,gEAAgE;AAChE,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAE1D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,SAAS,CAAC;IACtE,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB,CA4DvE;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,OAAO,EAAE,gBAAgB,GACxB,cAAc,CAuBhB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,gBAAgB,CAQ9F"}