@funnycode/myclaude 0.1.28 → 0.1.30

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
@@ -134,13 +134,9 @@ npx @funnycode/myclaude --help # Show help
134
134
  | `/terminal-setup` | Terminal setup |
135
135
  | `/memory` | Manage AI memory |
136
136
  | `/skills` | Manage skills |
137
- | `/sandbox` | Toggle sandbox mode |
138
- | `/session` | Session management |
139
137
  | `/tag` | Tag current session |
140
138
  | `/export` | Export session |
141
- | `/upgrade` | Check for updates |
142
139
  | `/feedback` | Submit feedback (opens GitHub Issues) |
143
- | `/thinkback` | Think-back review |
144
140
 
145
141
  ---
146
142
 
package/README.zh-CN.md CHANGED
@@ -134,13 +134,9 @@ npx @funnycode/myclaude --help # 查看帮助
134
134
  | `/terminal-setup` | 终端设置 |
135
135
  | `/memory` | 管理 AI 记忆 |
136
136
  | `/skills` | 管理技能 |
137
- | `/sandbox` | 切换沙盒模式 |
138
- | `/session` | 会话管理 |
139
137
  | `/tag` | 标记当前会话 |
140
138
  | `/export` | 导出会话 |
141
- | `/upgrade` | 检查更新 |
142
139
  | `/feedback` | 提交反馈(跳转 GitHub Issues) |
143
- | `/thinkback` | 回溯思考过程 |
144
140
 
145
141
  ---
146
142
 
package/dist/myclaude.js CHANGED
@@ -4,8 +4,8 @@
4
4
  // MACRO - build-time constants (injected by build.ts)
5
5
  // MACRO injected by build script
6
6
  globalThis.MACRO = {
7
- VERSION: "0.1.28",
8
- BUILD_TIME: "2026-06-22T13:35:14.526Z",
7
+ VERSION: "0.1.30",
8
+ BUILD_TIME: "2026-06-23T12:43:05.483Z",
9
9
  PACKAGE_URL: "@funnycode/myclaude",
10
10
  NATIVE_PACKAGE_URL: "@funnycode/myclaude",
11
11
  VERSION_CHANGELOG: '',
@@ -153664,6 +153664,9 @@ function getPluginErrorMessage(error49) {
153664
153664
  }
153665
153665
 
153666
153666
  // src/plugins/builtinPlugins.ts
153667
+ function registerBuiltinPlugin(definition) {
153668
+ BUILTIN_PLUGINS.set(definition.name, definition);
153669
+ }
153667
153670
  function isBuiltinPluginId(pluginId) {
153668
153671
  return pluginId.endsWith(`@${BUILTIN_MARKETPLACE_NAME}`);
153669
153672
  }
@@ -279974,7 +279977,7 @@ function parseMcpConfig(params) {
279974
279977
  ...filePath && { file: filePath },
279975
279978
  path: `mcpServers.${name}`,
279976
279979
  message: `Windows requires 'cmd /c' wrapper to execute npx`,
279977
- suggestion: `Change command to "cmd" with args ["/c", "npx", ...]. See: https://code.claude.com/docs/en/mcp#configure-mcp-servers`,
279980
+ suggestion: `Change command to "cmd" with args ["/c", "npx", ...]. See: https://github.com/thomaslwq/myclaude`,
279978
279981
  mcpErrorMetadata: {
279979
279982
  scope,
279980
279983
  serverName: name,
@@ -417711,8 +417714,8 @@ function McpParsingWarnings() {
417711
417714
  "For help configuring MCP servers, see:",
417712
417715
  " ",
417713
417716
  /* @__PURE__ */ jsx_dev_runtime189.jsxDEV(Link, {
417714
- url: "https://code.claude.com/docs/en/mcp",
417715
- children: "https://code.claude.com/docs/en/mcp"
417717
+ url: "https://github.com/thomaslwq/myclaude",
417718
+ children: "https://github.com/thomaslwq/myclaude"
417716
417719
  }, undefined, false, undefined, this)
417717
417720
  ]
417718
417721
  }, undefined, true, undefined, this)
@@ -422536,12 +422539,6 @@ __export(exports_keybindings, {
422536
422539
  import { mkdir as mkdir29, writeFile as writeFile32 } from "fs/promises";
422537
422540
  import { dirname as dirname52 } from "path";
422538
422541
  async function call23() {
422539
- if (!isKeybindingCustomizationEnabled()) {
422540
- return {
422541
- type: "text",
422542
- value: "Keybinding customization is not enabled. This feature is currently in preview."
422543
- };
422544
- }
422545
422542
  const keybindingsPath = getKeybindingsPath();
422546
422543
  let fileExists = false;
422547
422544
  await mkdir29(dirname52(keybindingsPath), { recursive: true });
@@ -422550,23 +422547,17 @@ async function call23() {
422550
422547
  encoding: "utf-8",
422551
422548
  flag: "wx"
422552
422549
  });
422553
- } catch (e) {
422554
- if (getErrnoCode(e) === "EEXIST") {
422550
+ } catch (err2) {
422551
+ if (getErrnoCode(err2) === "EEXIST") {
422555
422552
  fileExists = true;
422556
422553
  } else {
422557
- throw e;
422554
+ throw err2;
422558
422555
  }
422559
422556
  }
422560
- const result = await editFileInEditor(keybindingsPath);
422561
- if (result.error) {
422562
- return {
422563
- type: "text",
422564
- value: `${fileExists ? "Opened" : "Created"} ${keybindingsPath}. Could not open in editor: ${result.error}`
422565
- };
422566
- }
422557
+ const editAccepted = await editFileInEditor(keybindingsPath);
422567
422558
  return {
422568
422559
  type: "text",
422569
- value: fileExists ? `Opened ${keybindingsPath} in your editor.` : `Created ${keybindingsPath} with template. Opened in your editor.`
422560
+ value: editAccepted ? `Keybindings file saved to ${keybindingsPath}` : `No changes made. Your keybindings file is at ${keybindingsPath}`
422570
422561
  };
422571
422562
  }
422572
422563
  var init_keybindings = __esm(() => {
@@ -422579,11 +422570,9 @@ var init_keybindings = __esm(() => {
422579
422570
  // src/commands/keybindings/index.ts
422580
422571
  var keybindings, keybindings_default;
422581
422572
  var init_keybindings2 = __esm(() => {
422582
- init_loadUserBindings();
422583
422573
  keybindings = {
422584
422574
  name: "keybindings",
422585
422575
  description: "Open or create your keybindings configuration file",
422586
- isEnabled: () => isKeybindingCustomizationEnabled(),
422587
422576
  supportsNonInteractive: false,
422588
422577
  type: "local",
422589
422578
  load: () => Promise.resolve().then(() => (init_keybindings(), exports_keybindings))
@@ -426780,8 +426769,8 @@ function MCPListPanel(t0) {
426780
426769
  dimColor: true,
426781
426770
  children: [
426782
426771
  /* @__PURE__ */ jsx_dev_runtime219.jsxDEV(Link, {
426783
- url: "https://code.claude.com/docs/en/mcp",
426784
- children: "https://code.claude.com/docs/en/mcp"
426772
+ url: "https://github.com/thomaslwq/myclaude",
426773
+ children: "https://github.com/thomaslwq/myclaude"
426785
426774
  }, undefined, false, undefined, this),
426786
426775
  " ",
426787
426776
  "for help"
@@ -429919,7 +429908,7 @@ function MCPSettings(t0) {
429919
429908
  return;
429920
429909
  }
429921
429910
  if (servers.length === 0 && agentMcpServers.length === 0) {
429922
- onComplete("No MCP servers configured. Please run /doctor if this is unexpected. Otherwise, run `myclaude mcp --help` or visit https://code.claude.com/docs/en/mcp to learn more.");
429911
+ onComplete("No MCP servers configured. Please run /doctor if this is unexpected. Otherwise, run `myclaude mcp --help` or visit https://github.com/thomaslwq/myclaude to learn more.");
429923
429912
  }
429924
429913
  };
429925
429914
  t8 = [servers.length, filteredClients.length, agentMcpServers.length, onComplete];
@@ -479865,7 +479854,6 @@ var init_tag2 = __esm(() => {
479865
479854
  type: "local-jsx",
479866
479855
  name: "tag",
479867
479856
  description: "Toggle a searchable tag on the current session",
479868
- isEnabled: () => process.env.USER_TYPE === "ant",
479869
479857
  argumentHint: "<tag-name>",
479870
479858
  load: () => Promise.resolve().then(() => (init_tag(), exports_tag))
479871
479859
  };
@@ -549795,7 +549783,7 @@ function MCPServerDialogCopy() {
549795
549783
  "MCP servers may execute code or access system resources. All tool calls require approval. Learn more in the",
549796
549784
  " ",
549797
549785
  /* @__PURE__ */ jsx_dev_runtime467.jsxDEV(Link, {
549798
- url: "https://code.claude.com/docs/en/mcp",
549786
+ url: "https://github.com/thomaslwq/myclaude",
549799
549787
  children: "MCP documentation"
549800
549788
  }, undefined, false, undefined, this),
549801
549789
  "."
@@ -554530,8 +554518,97 @@ var init_dialogLaunchers = __esm(() => {
554530
554518
  jsx_dev_runtime486 = __toESM(require_jsx_dev_runtime(), 1);
554531
554519
  });
554532
554520
 
554521
+ // src/plugins/bundled/codegraphCheck.ts
554522
+ async function isCodeGraphInstalled() {
554523
+ if (cachedResult !== null)
554524
+ return cachedResult;
554525
+ try {
554526
+ const result = await execFileNoThrow("codegraph", ["--version"], {
554527
+ timeout: 3000,
554528
+ stdin: "ignore"
554529
+ });
554530
+ cachedResult = result.code === 0;
554531
+ } catch {
554532
+ cachedResult = false;
554533
+ }
554534
+ return cachedResult;
554535
+ }
554536
+ var cachedResult = null;
554537
+ var init_codegraphCheck = __esm(() => {
554538
+ init_execFileNoThrow();
554539
+ });
554540
+
554541
+ // src/plugins/bundled/eccMarketplace.ts
554542
+ import { join as join150 } from "path";
554543
+ function getKnownMarketplacesFile2() {
554544
+ const homeDir = process.env.CLAUDE_CODE_PLUGIN_CACHE_DIR || join150(process.env.HOME || process.env.USERPROFILE || "~", ".claude", "plugins");
554545
+ return join150(homeDir, "known_marketplaces.json");
554546
+ }
554547
+ async function ensureEccMarketplaceRegistered() {
554548
+ const fs12 = getFsImplementation();
554549
+ const configFile = getKnownMarketplacesFile2();
554550
+ try {
554551
+ let config5 = {};
554552
+ try {
554553
+ const content = await fs12.readFile(configFile, { encoding: "utf-8" });
554554
+ config5 = jsonParse(content);
554555
+ } catch {}
554556
+ if (config5["ecc"])
554557
+ return false;
554558
+ config5["ecc"] = {
554559
+ source: {
554560
+ source: "git",
554561
+ url: ECC_MARKETPLACE_URL
554562
+ },
554563
+ autoUpdate: false,
554564
+ lastUpdated: new Date().toISOString()
554565
+ };
554566
+ await fs12.writeFile(configFile, jsonStringify(config5, null, 2), {
554567
+ encoding: "utf-8"
554568
+ });
554569
+ logForDebugging("Registered ECC marketplace in known_marketplaces.json");
554570
+ return true;
554571
+ } catch (error49) {
554572
+ logForDebugging(`Failed to register ECC marketplace: ${error49}`, {
554573
+ level: "warn"
554574
+ });
554575
+ return false;
554576
+ }
554577
+ }
554578
+ var ECC_MARKETPLACE_URL = "https://github.com/affaan-m/ECC.git";
554579
+ var init_eccMarketplace = __esm(() => {
554580
+ init_fsOperations();
554581
+ init_debug();
554582
+ init_slowOperations();
554583
+ });
554584
+
554533
554585
  // src/plugins/bundled/index.ts
554534
- function initBuiltinPlugins() {}
554586
+ function initBuiltinPlugins() {
554587
+ registerBuiltinPlugin({
554588
+ name: "codegraph",
554589
+ description: "Semantic code intelligence — surgical context, fewer tool calls",
554590
+ version: "1.0.0",
554591
+ defaultEnabled: false,
554592
+ isAvailable: () => {
554593
+ isCodeGraphInstalled().catch(() => {});
554594
+ return false;
554595
+ },
554596
+ mcpServers: {
554597
+ codegraph: {
554598
+ command: "codegraph",
554599
+ args: ["mcp"]
554600
+ }
554601
+ }
554602
+ });
554603
+ }
554604
+ async function initSeedMarketplaces() {
554605
+ await ensureEccMarketplaceRegistered();
554606
+ }
554607
+ var init_bundled = __esm(() => {
554608
+ init_builtinPlugins();
554609
+ init_codegraphCheck();
554610
+ init_eccMarketplace();
554611
+ });
554535
554612
 
554536
554613
  // src/services/plugins/pluginCliCommands.ts
554537
554614
  function handlePluginCommandError(error49, command8, plugin2) {
@@ -556619,7 +556696,7 @@ function initBundledSkills() {
556619
556696
  }
556620
556697
  if (false) {}
556621
556698
  }
556622
- var init_bundled = __esm(() => {
556699
+ var init_bundled2 = __esm(() => {
556623
556700
  init_setup2();
556624
556701
  init_batch();
556625
556702
  init_claudeInChrome();
@@ -557338,12 +557415,12 @@ var init_createDirectConnectSession = __esm(() => {
557338
557415
  });
557339
557416
 
557340
557417
  // src/utils/errorLogSink.ts
557341
- import { dirname as dirname64, join as join150 } from "path";
557418
+ import { dirname as dirname64, join as join151 } from "path";
557342
557419
  function getErrorsPath() {
557343
- return join150(CACHE_PATHS.errors(), DATE + ".jsonl");
557420
+ return join151(CACHE_PATHS.errors(), DATE + ".jsonl");
557344
557421
  }
557345
557422
  function getMCPLogsPath(serverName) {
557346
- return join150(CACHE_PATHS.mcpLogs(serverName), DATE + ".jsonl");
557423
+ return join151(CACHE_PATHS.mcpLogs(serverName), DATE + ".jsonl");
557347
557424
  }
557348
557425
  function createJsonlWriter(options) {
557349
557426
  const writer = createBufferedWriter(options);
@@ -557686,7 +557763,7 @@ var init_sessionMemory = __esm(() => {
557686
557763
  // src/utils/iTermBackup.ts
557687
557764
  import { copyFile as copyFile12, stat as stat49 } from "fs/promises";
557688
557765
  import { homedir as homedir39 } from "os";
557689
- import { join as join151 } from "path";
557766
+ import { join as join152 } from "path";
557690
557767
  function markITerm2SetupComplete() {
557691
557768
  saveGlobalConfig((current) => ({
557692
557769
  ...current,
@@ -557701,7 +557778,7 @@ function getIterm2RecoveryInfo() {
557701
557778
  };
557702
557779
  }
557703
557780
  function getITerm2PlistPath() {
557704
- return join151(homedir39(), "Library", "Preferences", "com.googlecode.iterm2.plist");
557781
+ return join152(homedir39(), "Library", "Preferences", "com.googlecode.iterm2.plist");
557705
557782
  }
557706
557783
  async function checkAndRestoreITerm2Backup() {
557707
557784
  const { inProgress, backupPath } = getIterm2RecoveryInfo();
@@ -561066,7 +561143,7 @@ var init_idleTimeout = __esm(() => {
561066
561143
  // src/bridge/inboundAttachments.ts
561067
561144
  import { randomUUID as randomUUID48 } from "crypto";
561068
561145
  import { mkdir as mkdir42, writeFile as writeFile46 } from "fs/promises";
561069
- import { basename as basename58, join as join152 } from "path";
561146
+ import { basename as basename58, join as join153 } from "path";
561070
561147
  function debug3(msg) {
561071
561148
  logForDebugging(`[bridge:inbound-attach] ${msg}`);
561072
561149
  }
@@ -561082,7 +561159,7 @@ function sanitizeFileName(name) {
561082
561159
  return base2 || "attachment";
561083
561160
  }
561084
561161
  function uploadsDir() {
561085
- return join152(getClaudeConfigHomeDir(), "uploads", getSessionId());
561162
+ return join153(getClaudeConfigHomeDir(), "uploads", getSessionId());
561086
561163
  }
561087
561164
  async function resolveOne(att) {
561088
561165
  const token = getBridgeAccessToken();
@@ -561111,7 +561188,7 @@ async function resolveOne(att) {
561111
561188
  const safeName = sanitizeFileName(att.file_name);
561112
561189
  const prefix = (att.file_uuid.slice(0, 8) || randomUUID48().slice(0, 8)).replace(/[^a-zA-Z0-9_-]/g, "_");
561113
561190
  const dir = uploadsDir();
561114
- const outPath = join152(dir, `${prefix}-${safeName}`);
561191
+ const outPath = join153(dir, `${prefix}-${safeName}`);
561115
561192
  try {
561116
561193
  await mkdir42(dir, { recursive: true });
561117
561194
  await writeFile46(outPath, data);
@@ -561211,7 +561288,7 @@ var init_sessionUrl = __esm(() => {
561211
561288
 
561212
561289
  // src/utils/plugins/zipCacheAdapters.ts
561213
561290
  import { readFile as readFile51 } from "fs/promises";
561214
- import { join as join153 } from "path";
561291
+ import { join as join154 } from "path";
561215
561292
  async function readZipCacheKnownMarketplaces() {
561216
561293
  try {
561217
561294
  const content = await readFile51(getZipCacheKnownMarketplacesPath(), "utf-8");
@@ -561236,13 +561313,13 @@ async function saveMarketplaceJsonToZipCache(marketplaceName, installLocation) {
561236
561313
  const content = await readMarketplaceJsonContent(installLocation);
561237
561314
  if (content !== null) {
561238
561315
  const relPath = getMarketplaceJsonRelativePath(marketplaceName);
561239
- await atomicWriteToZipCache(join153(zipCachePath, relPath), content);
561316
+ await atomicWriteToZipCache(join154(zipCachePath, relPath), content);
561240
561317
  }
561241
561318
  }
561242
561319
  async function readMarketplaceJsonContent(dir) {
561243
561320
  const candidates = [
561244
- join153(dir, ".claude-plugin", "marketplace.json"),
561245
- join153(dir, "marketplace.json"),
561321
+ join154(dir, ".claude-plugin", "marketplace.json"),
561322
+ join154(dir, "marketplace.json"),
561246
561323
  dir
561247
561324
  ];
561248
561325
  for (const candidate of candidates) {
@@ -561701,9 +561778,9 @@ __export(exports_bridgePointer, {
561701
561778
  BRIDGE_POINTER_TTL_MS: () => BRIDGE_POINTER_TTL_MS
561702
561779
  });
561703
561780
  import { mkdir as mkdir43, readFile as readFile52, stat as stat50, unlink as unlink22, writeFile as writeFile47 } from "fs/promises";
561704
- import { dirname as dirname65, join as join154 } from "path";
561781
+ import { dirname as dirname65, join as join155 } from "path";
561705
561782
  function getBridgePointerPath(dir) {
561706
- return join154(getProjectsDir(), sanitizePath2(dir), "bridge-pointer.json");
561783
+ return join155(getProjectsDir(), sanitizePath2(dir), "bridge-pointer.json");
561707
561784
  }
561708
561785
  async function writeBridgePointer(dir, pointer) {
561709
561786
  const path24 = getBridgePointerPath(dir);
@@ -567640,14 +567717,14 @@ __export(exports_claudeDesktop, {
567640
567717
  });
567641
567718
  import { readdir as readdir30, readFile as readFile54, stat as stat52 } from "fs/promises";
567642
567719
  import { homedir as homedir40 } from "os";
567643
- import { join as join155 } from "path";
567720
+ import { join as join156 } from "path";
567644
567721
  async function getClaudeDesktopConfigPath() {
567645
567722
  const platform6 = getPlatform();
567646
567723
  if (!SUPPORTED_PLATFORMS.includes(platform6)) {
567647
567724
  throw new Error(`Unsupported platform: ${platform6} - Claude Desktop integration only works on macOS and WSL.`);
567648
567725
  }
567649
567726
  if (platform6 === "macos") {
567650
- return join155(homedir40(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
567727
+ return join156(homedir40(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
567651
567728
  }
567652
567729
  const windowsHome = process.env.USERPROFILE ? process.env.USERPROFILE.replace(/\\/g, "/") : null;
567653
567730
  if (windowsHome) {
@@ -567666,7 +567743,7 @@ async function getClaudeDesktopConfigPath() {
567666
567743
  if (user.name === "Public" || user.name === "Default" || user.name === "Default User" || user.name === "All Users") {
567667
567744
  continue;
567668
567745
  }
567669
- const potentialConfigPath = join155(usersDir, user.name, "AppData", "Roaming", "Claude", "claude_desktop_config.json");
567746
+ const potentialConfigPath = join156(usersDir, user.name, "AppData", "Roaming", "Claude", "claude_desktop_config.json");
567670
567747
  try {
567671
567748
  await stat52(potentialConfigPath);
567672
567749
  return potentialConfigPath;
@@ -568575,12 +568652,12 @@ __export(exports_install, {
568575
568652
  install: () => install
568576
568653
  });
568577
568654
  import { homedir as homedir41 } from "node:os";
568578
- import { join as join156 } from "node:path";
568655
+ import { join as join157 } from "node:path";
568579
568656
  function getInstallationPath2() {
568580
568657
  const isWindows2 = env4.platform === "win32";
568581
568658
  const homeDir = homedir41();
568582
568659
  if (isWindows2) {
568583
- const windowsPath = join156(homeDir, ".local", "bin", "claude.exe");
568660
+ const windowsPath = join157(homeDir, ".local", "bin", "claude.exe");
568584
568661
  return windowsPath.replace(/\//g, "\\");
568585
568662
  }
568586
568663
  return "~/.local/bin/claude";
@@ -570345,6 +570422,7 @@ ${hint}` : hint;
570345
570422
  if (process.env.CLAUDE_CODE_ENTRYPOINT !== "local-agent") {
570346
570423
  initBuiltinPlugins();
570347
570424
  initBundledSkills();
570425
+ initSeedMarketplaces().catch(() => {});
570348
570426
  }
570349
570427
  const setupPromise = setup2(preSetupCwd, permissionMode, allowDangerouslySkipPermissions, worktreeEnabled, worktreeName, tmuxEnabled, sessionId ? validateUuid2(sessionId) : undefined, worktreePRNumber, messagingSocketPath);
570350
570428
  const commandsPromise = worktreeEnabled ? null : getCommands(preSetupCwd);
@@ -571838,10 +571916,11 @@ var init_main3 = __esm(() => {
571838
571916
  init_dialogLaunchers();
571839
571917
  init_dec();
571840
571918
  init_interactiveHelpers();
571919
+ init_bundled();
571841
571920
  init_claudeAiLimits();
571842
571921
  init_client6();
571843
571922
  init_pluginCliCommands();
571844
- init_bundled();
571923
+ init_bundled2();
571845
571924
  init_loadAgentsDir();
571846
571925
  init_autoUpdater();
571847
571926
  init_setup2();
package/dist/myclaude.mjs CHANGED
@@ -4,8 +4,8 @@
4
4
  // MACRO - build-time constants (injected by build.ts)
5
5
  // MACRO injected by build script
6
6
  globalThis.MACRO = {
7
- VERSION: "0.1.28",
8
- BUILD_TIME: "2026-06-22T13:35:14.526Z",
7
+ VERSION: "0.1.30",
8
+ BUILD_TIME: "2026-06-23T12:43:05.483Z",
9
9
  PACKAGE_URL: "@funnycode/myclaude",
10
10
  NATIVE_PACKAGE_URL: "@funnycode/myclaude",
11
11
  VERSION_CHANGELOG: '',
@@ -153664,6 +153664,9 @@ function getPluginErrorMessage(error49) {
153664
153664
  }
153665
153665
 
153666
153666
  // src/plugins/builtinPlugins.ts
153667
+ function registerBuiltinPlugin(definition) {
153668
+ BUILTIN_PLUGINS.set(definition.name, definition);
153669
+ }
153667
153670
  function isBuiltinPluginId(pluginId) {
153668
153671
  return pluginId.endsWith(`@${BUILTIN_MARKETPLACE_NAME}`);
153669
153672
  }
@@ -279974,7 +279977,7 @@ function parseMcpConfig(params) {
279974
279977
  ...filePath && { file: filePath },
279975
279978
  path: `mcpServers.${name}`,
279976
279979
  message: `Windows requires 'cmd /c' wrapper to execute npx`,
279977
- suggestion: `Change command to "cmd" with args ["/c", "npx", ...]. See: https://code.claude.com/docs/en/mcp#configure-mcp-servers`,
279980
+ suggestion: `Change command to "cmd" with args ["/c", "npx", ...]. See: https://github.com/thomaslwq/myclaude`,
279978
279981
  mcpErrorMetadata: {
279979
279982
  scope,
279980
279983
  serverName: name,
@@ -417711,8 +417714,8 @@ function McpParsingWarnings() {
417711
417714
  "For help configuring MCP servers, see:",
417712
417715
  " ",
417713
417716
  /* @__PURE__ */ jsx_dev_runtime189.jsxDEV(Link, {
417714
- url: "https://code.claude.com/docs/en/mcp",
417715
- children: "https://code.claude.com/docs/en/mcp"
417717
+ url: "https://github.com/thomaslwq/myclaude",
417718
+ children: "https://github.com/thomaslwq/myclaude"
417716
417719
  }, undefined, false, undefined, this)
417717
417720
  ]
417718
417721
  }, undefined, true, undefined, this)
@@ -422536,12 +422539,6 @@ __export(exports_keybindings, {
422536
422539
  import { mkdir as mkdir29, writeFile as writeFile32 } from "fs/promises";
422537
422540
  import { dirname as dirname52 } from "path";
422538
422541
  async function call23() {
422539
- if (!isKeybindingCustomizationEnabled()) {
422540
- return {
422541
- type: "text",
422542
- value: "Keybinding customization is not enabled. This feature is currently in preview."
422543
- };
422544
- }
422545
422542
  const keybindingsPath = getKeybindingsPath();
422546
422543
  let fileExists = false;
422547
422544
  await mkdir29(dirname52(keybindingsPath), { recursive: true });
@@ -422550,23 +422547,17 @@ async function call23() {
422550
422547
  encoding: "utf-8",
422551
422548
  flag: "wx"
422552
422549
  });
422553
- } catch (e) {
422554
- if (getErrnoCode(e) === "EEXIST") {
422550
+ } catch (err2) {
422551
+ if (getErrnoCode(err2) === "EEXIST") {
422555
422552
  fileExists = true;
422556
422553
  } else {
422557
- throw e;
422554
+ throw err2;
422558
422555
  }
422559
422556
  }
422560
- const result = await editFileInEditor(keybindingsPath);
422561
- if (result.error) {
422562
- return {
422563
- type: "text",
422564
- value: `${fileExists ? "Opened" : "Created"} ${keybindingsPath}. Could not open in editor: ${result.error}`
422565
- };
422566
- }
422557
+ const editAccepted = await editFileInEditor(keybindingsPath);
422567
422558
  return {
422568
422559
  type: "text",
422569
- value: fileExists ? `Opened ${keybindingsPath} in your editor.` : `Created ${keybindingsPath} with template. Opened in your editor.`
422560
+ value: editAccepted ? `Keybindings file saved to ${keybindingsPath}` : `No changes made. Your keybindings file is at ${keybindingsPath}`
422570
422561
  };
422571
422562
  }
422572
422563
  var init_keybindings = __esm(() => {
@@ -422579,11 +422570,9 @@ var init_keybindings = __esm(() => {
422579
422570
  // src/commands/keybindings/index.ts
422580
422571
  var keybindings, keybindings_default;
422581
422572
  var init_keybindings2 = __esm(() => {
422582
- init_loadUserBindings();
422583
422573
  keybindings = {
422584
422574
  name: "keybindings",
422585
422575
  description: "Open or create your keybindings configuration file",
422586
- isEnabled: () => isKeybindingCustomizationEnabled(),
422587
422576
  supportsNonInteractive: false,
422588
422577
  type: "local",
422589
422578
  load: () => Promise.resolve().then(() => (init_keybindings(), exports_keybindings))
@@ -426780,8 +426769,8 @@ function MCPListPanel(t0) {
426780
426769
  dimColor: true,
426781
426770
  children: [
426782
426771
  /* @__PURE__ */ jsx_dev_runtime219.jsxDEV(Link, {
426783
- url: "https://code.claude.com/docs/en/mcp",
426784
- children: "https://code.claude.com/docs/en/mcp"
426772
+ url: "https://github.com/thomaslwq/myclaude",
426773
+ children: "https://github.com/thomaslwq/myclaude"
426785
426774
  }, undefined, false, undefined, this),
426786
426775
  " ",
426787
426776
  "for help"
@@ -429919,7 +429908,7 @@ function MCPSettings(t0) {
429919
429908
  return;
429920
429909
  }
429921
429910
  if (servers.length === 0 && agentMcpServers.length === 0) {
429922
- onComplete("No MCP servers configured. Please run /doctor if this is unexpected. Otherwise, run `myclaude mcp --help` or visit https://code.claude.com/docs/en/mcp to learn more.");
429911
+ onComplete("No MCP servers configured. Please run /doctor if this is unexpected. Otherwise, run `myclaude mcp --help` or visit https://github.com/thomaslwq/myclaude to learn more.");
429923
429912
  }
429924
429913
  };
429925
429914
  t8 = [servers.length, filteredClients.length, agentMcpServers.length, onComplete];
@@ -479865,7 +479854,6 @@ var init_tag2 = __esm(() => {
479865
479854
  type: "local-jsx",
479866
479855
  name: "tag",
479867
479856
  description: "Toggle a searchable tag on the current session",
479868
- isEnabled: () => process.env.USER_TYPE === "ant",
479869
479857
  argumentHint: "<tag-name>",
479870
479858
  load: () => Promise.resolve().then(() => (init_tag(), exports_tag))
479871
479859
  };
@@ -549795,7 +549783,7 @@ function MCPServerDialogCopy() {
549795
549783
  "MCP servers may execute code or access system resources. All tool calls require approval. Learn more in the",
549796
549784
  " ",
549797
549785
  /* @__PURE__ */ jsx_dev_runtime467.jsxDEV(Link, {
549798
- url: "https://code.claude.com/docs/en/mcp",
549786
+ url: "https://github.com/thomaslwq/myclaude",
549799
549787
  children: "MCP documentation"
549800
549788
  }, undefined, false, undefined, this),
549801
549789
  "."
@@ -554530,8 +554518,97 @@ var init_dialogLaunchers = __esm(() => {
554530
554518
  jsx_dev_runtime486 = __toESM(require_jsx_dev_runtime(), 1);
554531
554519
  });
554532
554520
 
554521
+ // src/plugins/bundled/codegraphCheck.ts
554522
+ async function isCodeGraphInstalled() {
554523
+ if (cachedResult !== null)
554524
+ return cachedResult;
554525
+ try {
554526
+ const result = await execFileNoThrow("codegraph", ["--version"], {
554527
+ timeout: 3000,
554528
+ stdin: "ignore"
554529
+ });
554530
+ cachedResult = result.code === 0;
554531
+ } catch {
554532
+ cachedResult = false;
554533
+ }
554534
+ return cachedResult;
554535
+ }
554536
+ var cachedResult = null;
554537
+ var init_codegraphCheck = __esm(() => {
554538
+ init_execFileNoThrow();
554539
+ });
554540
+
554541
+ // src/plugins/bundled/eccMarketplace.ts
554542
+ import { join as join150 } from "path";
554543
+ function getKnownMarketplacesFile2() {
554544
+ const homeDir = process.env.CLAUDE_CODE_PLUGIN_CACHE_DIR || join150(process.env.HOME || process.env.USERPROFILE || "~", ".claude", "plugins");
554545
+ return join150(homeDir, "known_marketplaces.json");
554546
+ }
554547
+ async function ensureEccMarketplaceRegistered() {
554548
+ const fs12 = getFsImplementation();
554549
+ const configFile = getKnownMarketplacesFile2();
554550
+ try {
554551
+ let config5 = {};
554552
+ try {
554553
+ const content = await fs12.readFile(configFile, { encoding: "utf-8" });
554554
+ config5 = jsonParse(content);
554555
+ } catch {}
554556
+ if (config5["ecc"])
554557
+ return false;
554558
+ config5["ecc"] = {
554559
+ source: {
554560
+ source: "git",
554561
+ url: ECC_MARKETPLACE_URL
554562
+ },
554563
+ autoUpdate: false,
554564
+ lastUpdated: new Date().toISOString()
554565
+ };
554566
+ await fs12.writeFile(configFile, jsonStringify(config5, null, 2), {
554567
+ encoding: "utf-8"
554568
+ });
554569
+ logForDebugging("Registered ECC marketplace in known_marketplaces.json");
554570
+ return true;
554571
+ } catch (error49) {
554572
+ logForDebugging(`Failed to register ECC marketplace: ${error49}`, {
554573
+ level: "warn"
554574
+ });
554575
+ return false;
554576
+ }
554577
+ }
554578
+ var ECC_MARKETPLACE_URL = "https://github.com/affaan-m/ECC.git";
554579
+ var init_eccMarketplace = __esm(() => {
554580
+ init_fsOperations();
554581
+ init_debug();
554582
+ init_slowOperations();
554583
+ });
554584
+
554533
554585
  // src/plugins/bundled/index.ts
554534
- function initBuiltinPlugins() {}
554586
+ function initBuiltinPlugins() {
554587
+ registerBuiltinPlugin({
554588
+ name: "codegraph",
554589
+ description: "Semantic code intelligence — surgical context, fewer tool calls",
554590
+ version: "1.0.0",
554591
+ defaultEnabled: false,
554592
+ isAvailable: () => {
554593
+ isCodeGraphInstalled().catch(() => {});
554594
+ return false;
554595
+ },
554596
+ mcpServers: {
554597
+ codegraph: {
554598
+ command: "codegraph",
554599
+ args: ["mcp"]
554600
+ }
554601
+ }
554602
+ });
554603
+ }
554604
+ async function initSeedMarketplaces() {
554605
+ await ensureEccMarketplaceRegistered();
554606
+ }
554607
+ var init_bundled = __esm(() => {
554608
+ init_builtinPlugins();
554609
+ init_codegraphCheck();
554610
+ init_eccMarketplace();
554611
+ });
554535
554612
 
554536
554613
  // src/services/plugins/pluginCliCommands.ts
554537
554614
  function handlePluginCommandError(error49, command8, plugin2) {
@@ -556619,7 +556696,7 @@ function initBundledSkills() {
556619
556696
  }
556620
556697
  if (false) {}
556621
556698
  }
556622
- var init_bundled = __esm(() => {
556699
+ var init_bundled2 = __esm(() => {
556623
556700
  init_setup2();
556624
556701
  init_batch();
556625
556702
  init_claudeInChrome();
@@ -557338,12 +557415,12 @@ var init_createDirectConnectSession = __esm(() => {
557338
557415
  });
557339
557416
 
557340
557417
  // src/utils/errorLogSink.ts
557341
- import { dirname as dirname64, join as join150 } from "path";
557418
+ import { dirname as dirname64, join as join151 } from "path";
557342
557419
  function getErrorsPath() {
557343
- return join150(CACHE_PATHS.errors(), DATE + ".jsonl");
557420
+ return join151(CACHE_PATHS.errors(), DATE + ".jsonl");
557344
557421
  }
557345
557422
  function getMCPLogsPath(serverName) {
557346
- return join150(CACHE_PATHS.mcpLogs(serverName), DATE + ".jsonl");
557423
+ return join151(CACHE_PATHS.mcpLogs(serverName), DATE + ".jsonl");
557347
557424
  }
557348
557425
  function createJsonlWriter(options) {
557349
557426
  const writer = createBufferedWriter(options);
@@ -557686,7 +557763,7 @@ var init_sessionMemory = __esm(() => {
557686
557763
  // src/utils/iTermBackup.ts
557687
557764
  import { copyFile as copyFile12, stat as stat49 } from "fs/promises";
557688
557765
  import { homedir as homedir39 } from "os";
557689
- import { join as join151 } from "path";
557766
+ import { join as join152 } from "path";
557690
557767
  function markITerm2SetupComplete() {
557691
557768
  saveGlobalConfig((current) => ({
557692
557769
  ...current,
@@ -557701,7 +557778,7 @@ function getIterm2RecoveryInfo() {
557701
557778
  };
557702
557779
  }
557703
557780
  function getITerm2PlistPath() {
557704
- return join151(homedir39(), "Library", "Preferences", "com.googlecode.iterm2.plist");
557781
+ return join152(homedir39(), "Library", "Preferences", "com.googlecode.iterm2.plist");
557705
557782
  }
557706
557783
  async function checkAndRestoreITerm2Backup() {
557707
557784
  const { inProgress, backupPath } = getIterm2RecoveryInfo();
@@ -561066,7 +561143,7 @@ var init_idleTimeout = __esm(() => {
561066
561143
  // src/bridge/inboundAttachments.ts
561067
561144
  import { randomUUID as randomUUID48 } from "crypto";
561068
561145
  import { mkdir as mkdir42, writeFile as writeFile46 } from "fs/promises";
561069
- import { basename as basename58, join as join152 } from "path";
561146
+ import { basename as basename58, join as join153 } from "path";
561070
561147
  function debug3(msg) {
561071
561148
  logForDebugging(`[bridge:inbound-attach] ${msg}`);
561072
561149
  }
@@ -561082,7 +561159,7 @@ function sanitizeFileName(name) {
561082
561159
  return base2 || "attachment";
561083
561160
  }
561084
561161
  function uploadsDir() {
561085
- return join152(getClaudeConfigHomeDir(), "uploads", getSessionId());
561162
+ return join153(getClaudeConfigHomeDir(), "uploads", getSessionId());
561086
561163
  }
561087
561164
  async function resolveOne(att) {
561088
561165
  const token = getBridgeAccessToken();
@@ -561111,7 +561188,7 @@ async function resolveOne(att) {
561111
561188
  const safeName = sanitizeFileName(att.file_name);
561112
561189
  const prefix = (att.file_uuid.slice(0, 8) || randomUUID48().slice(0, 8)).replace(/[^a-zA-Z0-9_-]/g, "_");
561113
561190
  const dir = uploadsDir();
561114
- const outPath = join152(dir, `${prefix}-${safeName}`);
561191
+ const outPath = join153(dir, `${prefix}-${safeName}`);
561115
561192
  try {
561116
561193
  await mkdir42(dir, { recursive: true });
561117
561194
  await writeFile46(outPath, data);
@@ -561211,7 +561288,7 @@ var init_sessionUrl = __esm(() => {
561211
561288
 
561212
561289
  // src/utils/plugins/zipCacheAdapters.ts
561213
561290
  import { readFile as readFile51 } from "fs/promises";
561214
- import { join as join153 } from "path";
561291
+ import { join as join154 } from "path";
561215
561292
  async function readZipCacheKnownMarketplaces() {
561216
561293
  try {
561217
561294
  const content = await readFile51(getZipCacheKnownMarketplacesPath(), "utf-8");
@@ -561236,13 +561313,13 @@ async function saveMarketplaceJsonToZipCache(marketplaceName, installLocation) {
561236
561313
  const content = await readMarketplaceJsonContent(installLocation);
561237
561314
  if (content !== null) {
561238
561315
  const relPath = getMarketplaceJsonRelativePath(marketplaceName);
561239
- await atomicWriteToZipCache(join153(zipCachePath, relPath), content);
561316
+ await atomicWriteToZipCache(join154(zipCachePath, relPath), content);
561240
561317
  }
561241
561318
  }
561242
561319
  async function readMarketplaceJsonContent(dir) {
561243
561320
  const candidates = [
561244
- join153(dir, ".claude-plugin", "marketplace.json"),
561245
- join153(dir, "marketplace.json"),
561321
+ join154(dir, ".claude-plugin", "marketplace.json"),
561322
+ join154(dir, "marketplace.json"),
561246
561323
  dir
561247
561324
  ];
561248
561325
  for (const candidate of candidates) {
@@ -561701,9 +561778,9 @@ __export(exports_bridgePointer, {
561701
561778
  BRIDGE_POINTER_TTL_MS: () => BRIDGE_POINTER_TTL_MS
561702
561779
  });
561703
561780
  import { mkdir as mkdir43, readFile as readFile52, stat as stat50, unlink as unlink22, writeFile as writeFile47 } from "fs/promises";
561704
- import { dirname as dirname65, join as join154 } from "path";
561781
+ import { dirname as dirname65, join as join155 } from "path";
561705
561782
  function getBridgePointerPath(dir) {
561706
- return join154(getProjectsDir(), sanitizePath2(dir), "bridge-pointer.json");
561783
+ return join155(getProjectsDir(), sanitizePath2(dir), "bridge-pointer.json");
561707
561784
  }
561708
561785
  async function writeBridgePointer(dir, pointer) {
561709
561786
  const path24 = getBridgePointerPath(dir);
@@ -567640,14 +567717,14 @@ __export(exports_claudeDesktop, {
567640
567717
  });
567641
567718
  import { readdir as readdir30, readFile as readFile54, stat as stat52 } from "fs/promises";
567642
567719
  import { homedir as homedir40 } from "os";
567643
- import { join as join155 } from "path";
567720
+ import { join as join156 } from "path";
567644
567721
  async function getClaudeDesktopConfigPath() {
567645
567722
  const platform6 = getPlatform();
567646
567723
  if (!SUPPORTED_PLATFORMS.includes(platform6)) {
567647
567724
  throw new Error(`Unsupported platform: ${platform6} - Claude Desktop integration only works on macOS and WSL.`);
567648
567725
  }
567649
567726
  if (platform6 === "macos") {
567650
- return join155(homedir40(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
567727
+ return join156(homedir40(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
567651
567728
  }
567652
567729
  const windowsHome = process.env.USERPROFILE ? process.env.USERPROFILE.replace(/\\/g, "/") : null;
567653
567730
  if (windowsHome) {
@@ -567666,7 +567743,7 @@ async function getClaudeDesktopConfigPath() {
567666
567743
  if (user.name === "Public" || user.name === "Default" || user.name === "Default User" || user.name === "All Users") {
567667
567744
  continue;
567668
567745
  }
567669
- const potentialConfigPath = join155(usersDir, user.name, "AppData", "Roaming", "Claude", "claude_desktop_config.json");
567746
+ const potentialConfigPath = join156(usersDir, user.name, "AppData", "Roaming", "Claude", "claude_desktop_config.json");
567670
567747
  try {
567671
567748
  await stat52(potentialConfigPath);
567672
567749
  return potentialConfigPath;
@@ -568575,12 +568652,12 @@ __export(exports_install, {
568575
568652
  install: () => install
568576
568653
  });
568577
568654
  import { homedir as homedir41 } from "node:os";
568578
- import { join as join156 } from "node:path";
568655
+ import { join as join157 } from "node:path";
568579
568656
  function getInstallationPath2() {
568580
568657
  const isWindows2 = env4.platform === "win32";
568581
568658
  const homeDir = homedir41();
568582
568659
  if (isWindows2) {
568583
- const windowsPath = join156(homeDir, ".local", "bin", "claude.exe");
568660
+ const windowsPath = join157(homeDir, ".local", "bin", "claude.exe");
568584
568661
  return windowsPath.replace(/\//g, "\\");
568585
568662
  }
568586
568663
  return "~/.local/bin/claude";
@@ -570345,6 +570422,7 @@ ${hint}` : hint;
570345
570422
  if (process.env.CLAUDE_CODE_ENTRYPOINT !== "local-agent") {
570346
570423
  initBuiltinPlugins();
570347
570424
  initBundledSkills();
570425
+ initSeedMarketplaces().catch(() => {});
570348
570426
  }
570349
570427
  const setupPromise = setup2(preSetupCwd, permissionMode, allowDangerouslySkipPermissions, worktreeEnabled, worktreeName, tmuxEnabled, sessionId ? validateUuid2(sessionId) : undefined, worktreePRNumber, messagingSocketPath);
570350
570428
  const commandsPromise = worktreeEnabled ? null : getCommands(preSetupCwd);
@@ -571838,10 +571916,11 @@ var init_main3 = __esm(() => {
571838
571916
  init_dialogLaunchers();
571839
571917
  init_dec();
571840
571918
  init_interactiveHelpers();
571919
+ init_bundled();
571841
571920
  init_claudeAiLimits();
571842
571921
  init_client6();
571843
571922
  init_pluginCliCommands();
571844
- init_bundled();
571923
+ init_bundled2();
571845
571924
  init_loadAgentsDir();
571846
571925
  init_autoUpdater();
571847
571926
  init_setup2();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@funnycode/myclaude",
3
- "version": "0.1.28",
3
+ "version": "0.1.30",
4
4
  "private": false,
5
5
  "description": "An open-source AI coding assistant in your terminal - powered by Claude",
6
6
  "license": "MIT",