@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 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 existsSync10, readFileSync as readFileSync6 } from "node:fs";
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 profiles = listProfiles(toolId).filter((p) => !opts.profile || p.name === opts.profile);
42385
- return profiles.map((profile) => {
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 existsSync7 } from "node:fs";
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 (!existsSync7(sourceDir)) {
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 (existsSync7(targetDir)) {
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 existsSync8, mkdirSync as mkdirSync6, readFileSync as readFileSync4, unlinkSync as unlinkSync3, writeFileSync as writeFileSync4 } from "node:fs";
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 = !existsSync8(path);
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 (!existsSync8(path))
42641
+ if (!existsSync9(path))
42548
42642
  return false;
42549
- const content = readFileSync4(path, "utf8");
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 existsSync9, mkdirSync as mkdirSync7, readFileSync as readFileSync5, readdirSync, rmSync as rmSync2, writeFileSync as writeFileSync5 } from "node:fs";
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 (!existsSync9(path))
42764
+ if (!existsSync10(path))
42671
42765
  return;
42672
42766
  try {
42673
- return parseState(readFileSync5(path, "utf8"));
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 (!existsSync9(dir))
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}${existsSync10(p.dir) ? "" : source_default.red(" [missing]")}`);
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 = !existsSync10(p.dir);
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 (existsSync10(candidate)) {
43515
- const pkg = JSON.parse(readFileSync6(candidate, "utf8"));
43614
+ if (existsSync11(candidate)) {
43615
+ const pkg = JSON.parse(readFileSync7(candidate, "utf8"));
43516
43616
  if (pkg.version)
43517
43617
  return pkg.version;
43518
43618
  }
@@ -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: Profile) => AgentsRunnerResult;
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: Profile, timeoutMs?: number): AgentsRunnerResult;
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
- /** List agent sessions for every profile of a tool (default: claude). */
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
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,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,OAAO,KAAK,kBAAkB,CAAC;AAEpE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,SAAS,CA+BnE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,SAAS,GAAG,kBAAkB,CAqB5F;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;CACvB;AAED,yEAAyE;AACzE,wBAAgB,wBAAwB,CAAC,IAAI,GAAE,iBAAsB,GAAG,aAAa,EAAE,CAwBtF"}
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.7" }, { capabilities: { tools: {} } });
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.7",
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",