@hasna/accounts 0.1.7 → 0.1.8
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 +1 -1
- package/dist/cli.js +118 -18
- package/dist/lib/agents.d.ts +33 -3
- package/dist/lib/agents.d.ts.map +1 -1
- package/dist/mcp.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -115,7 +115,7 @@ Implementation details: [docs/IMPLEMENT.md](docs/IMPLEMENT.md).
|
|
|
115
115
|
| `accounts hook install` | Install `claude()` wrapper — see [docs/hook.md](docs/hook.md). |
|
|
116
116
|
| `accounts hook uninstall` | Remove hook script. |
|
|
117
117
|
| `accounts hook path` | Print hook script path. |
|
|
118
|
-
| `accounts agents` | List Claude agent sessions across **all** profiles (`claude agents` only shows the current account). `--background`, `--profile <name>`, `--json`. |
|
|
118
|
+
| `accounts agents` | List Claude agent sessions across **all** profiles, the default `~/.claude` dir, and untracked processes (`claude agents` only shows the current account). `--background`, `--profile <name>`, `--json`. |
|
|
119
119
|
| `accounts detect <name>` | Re-detect email from config dir. |
|
|
120
120
|
| `accounts doctor` | Check registry and dirs (exits 1 on errors). |
|
|
121
121
|
|
package/dist/cli.js
CHANGED
|
@@ -36797,7 +36797,7 @@ var require_dist_cjs22 = __commonJS((exports) => {
|
|
|
36797
36797
|
|
|
36798
36798
|
// src/cli.ts
|
|
36799
36799
|
import { spawnSync as spawnSync2 } from "node:child_process";
|
|
36800
|
-
import { existsSync as
|
|
36800
|
+
import { existsSync as existsSync11, readFileSync as readFileSync7 } from "node:fs";
|
|
36801
36801
|
import { homedir as homedir5 } from "node:os";
|
|
36802
36802
|
import { dirname as dirname5, join as join11 } from "node:path";
|
|
36803
36803
|
import { fileURLToPath } from "node:url";
|
|
@@ -42319,6 +42319,7 @@ function applyProfileUnlocked(name, toolId) {
|
|
|
42319
42319
|
|
|
42320
42320
|
// src/lib/agents.ts
|
|
42321
42321
|
import { spawnSync } from "node:child_process";
|
|
42322
|
+
import { existsSync as existsSync7, readFileSync as readFileSync4 } from "node:fs";
|
|
42322
42323
|
import { platform as platform2 } from "node:os";
|
|
42323
42324
|
function extractJsonArray(raw) {
|
|
42324
42325
|
const text = raw.replace(/\r/g, "");
|
|
@@ -42378,11 +42379,79 @@ function runClaudeAgentsJson(profile, timeoutMs = 20000) {
|
|
|
42378
42379
|
}
|
|
42379
42380
|
return { ok: true, raw: res.stdout ?? "" };
|
|
42380
42381
|
}
|
|
42382
|
+
function isToolSessionCommand(command, bin) {
|
|
42383
|
+
const argv = command.trim().split(/\s+/);
|
|
42384
|
+
if (argv.length === 0)
|
|
42385
|
+
return false;
|
|
42386
|
+
const base = (p) => p.split("/").pop() ?? p;
|
|
42387
|
+
let head = argv[0] ?? "";
|
|
42388
|
+
let rest = argv.slice(1);
|
|
42389
|
+
if ((base(head) === "node" || base(head) === "bun") && rest[0]) {
|
|
42390
|
+
head = rest[0];
|
|
42391
|
+
rest = rest.slice(1);
|
|
42392
|
+
}
|
|
42393
|
+
const isVersionedBuild = head.includes(`/${bin}/versions/`);
|
|
42394
|
+
if (base(head) !== bin && !isVersionedBuild)
|
|
42395
|
+
return false;
|
|
42396
|
+
if (rest[0] === "agents")
|
|
42397
|
+
return false;
|
|
42398
|
+
const joined = rest.join(" ");
|
|
42399
|
+
if (/--bg-pty-host|--bg-spare/.test(joined))
|
|
42400
|
+
return false;
|
|
42401
|
+
if (rest[0] === "daemon")
|
|
42402
|
+
return false;
|
|
42403
|
+
return true;
|
|
42404
|
+
}
|
|
42405
|
+
function scanToolProcesses(toolId = "claude") {
|
|
42406
|
+
const tool = getTool(toolId);
|
|
42407
|
+
const bin = tool.bin ?? toolId;
|
|
42408
|
+
const res = spawnSync("ps", ["-axo", "pid=,ppid=,args="], {
|
|
42409
|
+
encoding: "utf8",
|
|
42410
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
42411
|
+
});
|
|
42412
|
+
if (res.status !== 0 || !res.stdout)
|
|
42413
|
+
return [];
|
|
42414
|
+
const out = [];
|
|
42415
|
+
for (const line of res.stdout.split(`
|
|
42416
|
+
`)) {
|
|
42417
|
+
const m = line.match(/^\s*(\d+)\s+(\d+)\s+(.+)$/);
|
|
42418
|
+
if (!m)
|
|
42419
|
+
continue;
|
|
42420
|
+
const pid = Number(m[1]);
|
|
42421
|
+
const ppid = Number(m[2]);
|
|
42422
|
+
const command = m[3].trim();
|
|
42423
|
+
if (pid === process.pid)
|
|
42424
|
+
continue;
|
|
42425
|
+
if (!isToolSessionCommand(command, bin))
|
|
42426
|
+
continue;
|
|
42427
|
+
const configDir = readProcessEnvVar(pid, tool.envVar);
|
|
42428
|
+
out.push({ pid, ppid, command, ...configDir ? { configDir } : {} });
|
|
42429
|
+
}
|
|
42430
|
+
return out;
|
|
42431
|
+
}
|
|
42432
|
+
function readProcessEnvVar(pid, envVar) {
|
|
42433
|
+
try {
|
|
42434
|
+
const environ = readFileSync4(`/proc/${pid}/environ`, "utf8");
|
|
42435
|
+
for (const kv of environ.split("\x00")) {
|
|
42436
|
+
if (kv.startsWith(`${envVar}=`))
|
|
42437
|
+
return kv.slice(envVar.length + 1) || undefined;
|
|
42438
|
+
}
|
|
42439
|
+
} catch {}
|
|
42440
|
+
return;
|
|
42441
|
+
}
|
|
42381
42442
|
function listAgentsAcrossProfiles(opts = {}) {
|
|
42382
42443
|
const toolId = opts.tool ?? "claude";
|
|
42383
42444
|
const runner = opts.runner ?? runClaudeAgentsJson;
|
|
42384
|
-
const
|
|
42385
|
-
|
|
42445
|
+
const tool = getTool(toolId);
|
|
42446
|
+
const registered = listProfiles(toolId);
|
|
42447
|
+
const entries = [...registered];
|
|
42448
|
+
const defaultDir = opts.defaultDir ?? tool.defaultDir;
|
|
42449
|
+
if (defaultDir && !registered.some((p) => p.dir === defaultDir) && existsSync7(defaultDir)) {
|
|
42450
|
+
entries.unshift({ name: "(default)", tool: toolId, dir: defaultDir });
|
|
42451
|
+
}
|
|
42452
|
+
const wanted = entries.filter((p) => !opts.profile || p.name === opts.profile || opts.profile === "default" && p.name === "(default)");
|
|
42453
|
+
const reported = new Set;
|
|
42454
|
+
const results = wanted.map((profile) => {
|
|
42386
42455
|
const base = {
|
|
42387
42456
|
profile: profile.name,
|
|
42388
42457
|
tool: profile.tool,
|
|
@@ -42396,25 +42465,50 @@ function listAgentsAcrossProfiles(opts = {}) {
|
|
|
42396
42465
|
const parsed = extractJsonArray(result.raw);
|
|
42397
42466
|
if (!parsed)
|
|
42398
42467
|
return { ...base, error: "could not parse agents output" };
|
|
42468
|
+
for (const a of parsed) {
|
|
42469
|
+
if (typeof a.pid === "number")
|
|
42470
|
+
reported.add(a.pid);
|
|
42471
|
+
}
|
|
42399
42472
|
const agents = parsed.filter((a) => !opts.backgroundOnly || a.kind === "background");
|
|
42400
42473
|
return { ...base, agents };
|
|
42401
42474
|
});
|
|
42475
|
+
if (!opts.profile) {
|
|
42476
|
+
const scanner = opts.processScanner ?? scanToolProcesses;
|
|
42477
|
+
const scanned = scanner();
|
|
42478
|
+
if (scanned.length > 0) {
|
|
42479
|
+
const untracked = scanned.filter((p) => !reported.has(p.pid) && !reported.has(p.ppid) && !scanned.some((q) => q.ppid === p.pid && reported.has(q.pid)));
|
|
42480
|
+
if (untracked.length > 0) {
|
|
42481
|
+
results.push({
|
|
42482
|
+
profile: "(untracked)",
|
|
42483
|
+
tool: toolId,
|
|
42484
|
+
dir: "",
|
|
42485
|
+
agents: untracked.map((p) => ({
|
|
42486
|
+
kind: "process",
|
|
42487
|
+
pid: p.pid,
|
|
42488
|
+
command: p.command,
|
|
42489
|
+
...p.configDir ? { configDir: p.configDir } : {}
|
|
42490
|
+
}))
|
|
42491
|
+
});
|
|
42492
|
+
}
|
|
42493
|
+
}
|
|
42494
|
+
}
|
|
42495
|
+
return results;
|
|
42402
42496
|
}
|
|
42403
42497
|
|
|
42404
42498
|
// src/lib/import-profile.ts
|
|
42405
|
-
import { cpSync, existsSync as
|
|
42499
|
+
import { cpSync, existsSync as existsSync8 } from "node:fs";
|
|
42406
42500
|
import { join as join8 } from "node:path";
|
|
42407
42501
|
function importProfile(opts) {
|
|
42408
42502
|
const toolId = opts.tool ?? DEFAULT_TOOL;
|
|
42409
42503
|
const tool = getTool(toolId);
|
|
42410
42504
|
const name = opts.name ?? "main";
|
|
42411
42505
|
const sourceDir = opts.dir ? expandPath(opts.dir) : tool.defaultDir;
|
|
42412
|
-
if (!
|
|
42506
|
+
if (!existsSync8(sourceDir)) {
|
|
42413
42507
|
throw new AccountsError(`config dir does not exist: ${sourceDir}`);
|
|
42414
42508
|
}
|
|
42415
42509
|
if (opts.copy) {
|
|
42416
42510
|
const targetDir = join8(profilesDir(), toolId, name);
|
|
42417
|
-
if (
|
|
42511
|
+
if (existsSync8(targetDir)) {
|
|
42418
42512
|
throw new AccountsError(`managed copy target already exists: ${targetDir}`);
|
|
42419
42513
|
}
|
|
42420
42514
|
cpSync(sourceDir, targetDir, { recursive: true });
|
|
@@ -42498,7 +42592,7 @@ async function pickProfile(opts = {}) {
|
|
|
42498
42592
|
}
|
|
42499
42593
|
|
|
42500
42594
|
// src/lib/hook.ts
|
|
42501
|
-
import { existsSync as
|
|
42595
|
+
import { existsSync as existsSync9, mkdirSync as mkdirSync6, readFileSync as readFileSync5, unlinkSync as unlinkSync3, writeFileSync as writeFileSync4 } from "node:fs";
|
|
42502
42596
|
import { join as join9 } from "node:path";
|
|
42503
42597
|
var HOOK_FILE = "claude-hook.sh";
|
|
42504
42598
|
var MARKER = "# accounts-claude-hook";
|
|
@@ -42538,15 +42632,15 @@ claude() {
|
|
|
42538
42632
|
function installHook() {
|
|
42539
42633
|
const path = hookPath();
|
|
42540
42634
|
mkdirSync6(accountsHome(), { recursive: true });
|
|
42541
|
-
const created = !
|
|
42635
|
+
const created = !existsSync9(path);
|
|
42542
42636
|
writeFileSync4(path, hookScript(), { mode: 493 });
|
|
42543
42637
|
return { path, created };
|
|
42544
42638
|
}
|
|
42545
42639
|
function uninstallHook() {
|
|
42546
42640
|
const path = hookPath();
|
|
42547
|
-
if (!
|
|
42641
|
+
if (!existsSync9(path))
|
|
42548
42642
|
return false;
|
|
42549
|
-
const content =
|
|
42643
|
+
const content = readFileSync5(path, "utf8");
|
|
42550
42644
|
if (!content.includes(MARKER))
|
|
42551
42645
|
return false;
|
|
42552
42646
|
unlinkSync3(path);
|
|
@@ -42638,7 +42732,7 @@ function switchProfile(name, opts = {}) {
|
|
|
42638
42732
|
// src/lib/supervisor.ts
|
|
42639
42733
|
import { spawn } from "node:child_process";
|
|
42640
42734
|
import { createHash } from "node:crypto";
|
|
42641
|
-
import { existsSync as
|
|
42735
|
+
import { existsSync as existsSync10, mkdirSync as mkdirSync7, readFileSync as readFileSync6, readdirSync, rmSync as rmSync2, writeFileSync as writeFileSync5 } from "node:fs";
|
|
42642
42736
|
import { createConnection, createServer } from "node:net";
|
|
42643
42737
|
import { basename, join as join10 } from "node:path";
|
|
42644
42738
|
var STATE_SUFFIX = ".json";
|
|
@@ -42667,17 +42761,17 @@ function parseState(raw) {
|
|
|
42667
42761
|
}
|
|
42668
42762
|
function readSupervisorState(toolId) {
|
|
42669
42763
|
const path = supervisorStatePath(toolId);
|
|
42670
|
-
if (!
|
|
42764
|
+
if (!existsSync10(path))
|
|
42671
42765
|
return;
|
|
42672
42766
|
try {
|
|
42673
|
-
return parseState(
|
|
42767
|
+
return parseState(readFileSync6(path, "utf8"));
|
|
42674
42768
|
} catch {
|
|
42675
42769
|
return;
|
|
42676
42770
|
}
|
|
42677
42771
|
}
|
|
42678
42772
|
function listSupervisorStates() {
|
|
42679
42773
|
const dir = supervisorDir();
|
|
42680
|
-
if (!
|
|
42774
|
+
if (!existsSync10(dir))
|
|
42681
42775
|
return [];
|
|
42682
42776
|
return readdirSync(dir).filter((name) => name.endsWith(STATE_SUFFIX)).map((name) => basename(name, STATE_SUFFIX)).map((toolId) => readSupervisorState(toolId)).filter((state) => state !== undefined);
|
|
42683
42777
|
}
|
|
@@ -43084,7 +43178,7 @@ program2.command("show").argument("<name>", "profile name").description("show fu
|
|
|
43084
43178
|
console.log(` tool: ${p.tool} (${getTool(p.tool).label})`);
|
|
43085
43179
|
console.log(` active: ${active ? source_default.green("yes") : source_default.dim("no")}`);
|
|
43086
43180
|
console.log(` applied: ${isApplied ? source_default.magenta("yes") : source_default.dim("no")}`);
|
|
43087
|
-
console.log(` config dir: ${p.dir}${
|
|
43181
|
+
console.log(` config dir: ${p.dir}${existsSync11(p.dir) ? "" : source_default.red(" [missing]")}`);
|
|
43088
43182
|
console.log(` email: ${p.email ?? source_default.dim("(none)")}`);
|
|
43089
43183
|
console.log(` created: ${p.createdAt}`);
|
|
43090
43184
|
if (p.lastUsedAt)
|
|
@@ -43366,6 +43460,12 @@ program2.command("agents").description("list Claude Code agent sessions (interac
|
|
|
43366
43460
|
continue;
|
|
43367
43461
|
}
|
|
43368
43462
|
for (const a of r.agents) {
|
|
43463
|
+
if (a.kind === "process") {
|
|
43464
|
+
const cfg = typeof a.configDir === "string" ? source_default.dim(` cfg=${a.configDir}`) : "";
|
|
43465
|
+
const cmd = typeof a.command === "string" ? source_default.dim(` ${a.command.slice(0, 100)}`) : "";
|
|
43466
|
+
console.log(` ${source_default.yellow("process ")} pid ${a.pid}${cfg}${cmd}`);
|
|
43467
|
+
continue;
|
|
43468
|
+
}
|
|
43369
43469
|
const kind = a.kind === "background" ? source_default.magenta("background ") : source_default.dim("interactive");
|
|
43370
43470
|
const state = String(a.state ?? a.status ?? "");
|
|
43371
43471
|
const stateFmt = state === "working" || state === "busy" ? source_default.green(state) : source_default.dim(state);
|
|
@@ -43462,7 +43562,7 @@ program2.command("doctor").description("check the store and profile dirs for pro
|
|
|
43462
43562
|
const profiles = listProfiles();
|
|
43463
43563
|
let problems = 0;
|
|
43464
43564
|
for (const p of profiles) {
|
|
43465
|
-
const missing = !
|
|
43565
|
+
const missing = !existsSync11(p.dir);
|
|
43466
43566
|
const noEmail = !p.email;
|
|
43467
43567
|
if (missing) {
|
|
43468
43568
|
console.log(source_default.red(` ✗ ${p.name}: config dir missing (${p.dir})`));
|
|
@@ -43511,8 +43611,8 @@ function getVersion() {
|
|
|
43511
43611
|
try {
|
|
43512
43612
|
const here = dirname5(fileURLToPath(import.meta.url));
|
|
43513
43613
|
for (const candidate of [join11(here, "..", "package.json"), join11(here, "package.json")]) {
|
|
43514
|
-
if (
|
|
43515
|
-
const pkg = JSON.parse(
|
|
43614
|
+
if (existsSync11(candidate)) {
|
|
43615
|
+
const pkg = JSON.parse(readFileSync7(candidate, "utf8"));
|
|
43516
43616
|
if (pkg.version)
|
|
43517
43617
|
return pkg.version;
|
|
43518
43618
|
}
|
package/dist/lib/agents.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { Profile } from "../types.js";
|
|
2
2
|
export type AgentEntry = Record<string, unknown>;
|
|
3
|
+
/** Minimal profile shape needed to query agents (allows synthetic entries). */
|
|
4
|
+
export type ProfileLike = Pick<Profile, "name" | "tool" | "dir"> & {
|
|
5
|
+
email?: string;
|
|
6
|
+
};
|
|
3
7
|
export interface ProfileAgents {
|
|
4
8
|
profile: string;
|
|
5
9
|
tool: string;
|
|
@@ -13,7 +17,14 @@ export interface AgentsRunnerResult {
|
|
|
13
17
|
raw: string;
|
|
14
18
|
error?: string;
|
|
15
19
|
}
|
|
16
|
-
export type AgentsRunner = (profile:
|
|
20
|
+
export type AgentsRunner = (profile: ProfileLike) => AgentsRunnerResult;
|
|
21
|
+
export interface ProcessInfo {
|
|
22
|
+
pid: number;
|
|
23
|
+
ppid: number;
|
|
24
|
+
command: string;
|
|
25
|
+
configDir?: string;
|
|
26
|
+
}
|
|
27
|
+
export type ProcessScanner = () => ProcessInfo[];
|
|
17
28
|
/**
|
|
18
29
|
* Extract the first top-level JSON array from output that may be wrapped in
|
|
19
30
|
* pty/ANSI noise (`claude agents --json` only works on a TTY, so we run it
|
|
@@ -25,13 +36,32 @@ export declare function extractJsonArray(raw: string): unknown[] | undefined;
|
|
|
25
36
|
* Claude Code switches to print-mode argument parsing when stdout is not a
|
|
26
37
|
* TTY and never reaches the `agents` subcommand, so a plain pipe won't work.
|
|
27
38
|
*/
|
|
28
|
-
export declare function runClaudeAgentsJson(profile:
|
|
39
|
+
export declare function runClaudeAgentsJson(profile: ProfileLike, timeoutMs?: number): AgentsRunnerResult;
|
|
40
|
+
/**
|
|
41
|
+
* True when a `ps` command line looks like a real agent session process for
|
|
42
|
+
* the tool — not a daemon, pty host, pre-warmed spare, shell snapshot, our
|
|
43
|
+
* own `agents` listing invocation, or an `accounts` wrapper.
|
|
44
|
+
*/
|
|
45
|
+
export declare function isToolSessionCommand(command: string, bin: string): boolean;
|
|
46
|
+
/** Scan running processes for agent sessions of a tool (pid, ppid, command, config dir). */
|
|
47
|
+
export declare function scanToolProcesses(toolId?: string): ProcessInfo[];
|
|
29
48
|
export interface ListAgentsOptions {
|
|
30
49
|
tool?: string;
|
|
31
50
|
profile?: string;
|
|
32
51
|
backgroundOnly?: boolean;
|
|
33
52
|
runner?: AgentsRunner;
|
|
53
|
+
/** Override the tool's default config dir (used by tests). */
|
|
54
|
+
defaultDir?: string;
|
|
55
|
+
processScanner?: ProcessScanner;
|
|
34
56
|
}
|
|
35
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* List agent sessions for every profile of a tool (default: claude).
|
|
59
|
+
*
|
|
60
|
+
* Besides registered profiles this also queries the tool's DEFAULT config
|
|
61
|
+
* dir (e.g. ~/.claude) as a synthetic "(default)" entry — headless sessions
|
|
62
|
+
* started without the accounts CLI live there — and cross-checks the daemon
|
|
63
|
+
* listings against a process scan, reporting session processes no daemon
|
|
64
|
+
* knows about under "(untracked)".
|
|
65
|
+
*/
|
|
36
66
|
export declare function listAgentsAcrossProfiles(opts?: ListAgentsOptions): ProfileAgents[];
|
|
37
67
|
//# sourceMappingURL=agents.d.ts.map
|
package/dist/lib/agents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,+EAA+E;AAC/E,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,kBAAkB,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,WAAW,EAAE,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,SAAS,CA+BnE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,SAAS,GAAG,kBAAkB,CAqBhG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAqB1E;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,MAAM,SAAW,GAAG,WAAW,EAAE,CAsBlE;AAeD,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,GAAE,iBAAsB,GAAG,aAAa,EAAE,CAyEtF"}
|
package/dist/mcp.js
CHANGED
|
@@ -17464,7 +17464,7 @@ function ok(data) {
|
|
|
17464
17464
|
function fail(message) {
|
|
17465
17465
|
return { content: [{ type: "text", text: JSON.stringify({ error: message }) }], isError: true };
|
|
17466
17466
|
}
|
|
17467
|
-
var server = new Server({ name: "accounts", version: "0.1.
|
|
17467
|
+
var server = new Server({ name: "accounts", version: "0.1.8" }, { capabilities: { tools: {} } });
|
|
17468
17468
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
17469
17469
|
tools: [
|
|
17470
17470
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hasna/accounts",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Manage and switch between multiple Claude Code (and other AI coding tool) profiles/accounts locally — isolated config dirs, per-account email, one-command switching.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|