@funnycode/myclaude 0.1.166 → 0.1.168

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/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.166",
8
- BUILD_TIME: "2026-07-31T04:45:19.156Z",
7
+ VERSION: "0.1.168",
8
+ BUILD_TIME: "2026-07-31T17:52:42.282Z",
9
9
  PACKAGE_URL: "@funnycode/myclaude",
10
10
  NATIVE_PACKAGE_URL: "@funnycode/myclaude",
11
11
  VERSION_CHANGELOG: '',
@@ -61328,30 +61328,6 @@ function updateSettingsForSource(source, settings) {
61328
61328
  }
61329
61329
  return { error: null };
61330
61330
  }
61331
- function deleteSettingsField(source, field) {
61332
- if (source === "policySettings" || source === "flagSettings") {
61333
- return { error: null };
61334
- }
61335
- const filePath = getSettingsFilePathForSource(source);
61336
- if (!filePath) {
61337
- return { error: null };
61338
- }
61339
- try {
61340
- getFsImplementation().mkdirSync(dirname13(filePath));
61341
- let existingSettings = getSettingsForSourceUncached(source);
61342
- if (!existingSettings) {
61343
- return { error: null };
61344
- }
61345
- delete existingSettings[field];
61346
- writeFileSyncAndFlush_DEPRECATED(filePath, jsonStringify(existingSettings));
61347
- resetSettingsCache();
61348
- return { error: null };
61349
- } catch (e) {
61350
- const error49 = new Error(`Failed to delete field ${field} from settings source ${source}: ${e}`);
61351
- logError2(error49);
61352
- return { error: error49 };
61353
- }
61354
- }
61355
61331
  function mergeArrays(targetArray, sourceArray) {
61356
61332
  return uniq([...targetArray, ...sourceArray]);
61357
61333
  }
@@ -119971,7 +119947,7 @@ var package_default;
119971
119947
  var init_package = __esm(() => {
119972
119948
  package_default = {
119973
119949
  name: "@funnycode/myclaude",
119974
- version: "0.1.166",
119950
+ version: "0.1.168",
119975
119951
  private: false,
119976
119952
  description: "An open-source AI coding assistant in your terminal - powered by Claude",
119977
119953
  license: "MIT",
@@ -275761,7 +275737,12 @@ var require_fast_uri = __commonJS((exports, module) => {
275761
275737
  }
275762
275738
  function resolve26(baseURI, relativeURI, options) {
275763
275739
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
275764
- const resolved = resolveComponent(parse9(baseURI, schemelessOptions), parse9(relativeURI, schemelessOptions), schemelessOptions, true);
275740
+ const { parsed: baseParsed, malformedAuthorityOrPort: baseMalformed } = parseWithStatus(baseURI, schemelessOptions);
275741
+ const { parsed: relativeParsed, malformedAuthorityOrPort: relativeMalformed } = parseWithStatus(relativeURI, schemelessOptions);
275742
+ if (baseMalformed || relativeMalformed) {
275743
+ throw new Error(baseParsed.error || relativeParsed.error || "URI is malformed.");
275744
+ }
275745
+ const resolved = resolveComponent(baseParsed, relativeParsed, schemelessOptions, true);
275765
275746
  schemelessOptions.skipEscape = true;
275766
275747
  return serialize2(resolved, schemelessOptions);
275767
275748
  }
@@ -275888,6 +275869,7 @@ var require_fast_uri = __commonJS((exports, module) => {
275888
275869
  }
275889
275870
  var URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;
275890
275871
  var AUTHORITY_PREFIX = /^(?:[^#/:?]+:)?\/\/([^/?#]*)/;
275872
+ var AUTHORITY_INTRODUCER_REGION = /^(?:[^#/:?]+:)?([/\\\t\n\r]*)/;
275891
275873
  function getParseError2(parsed, matches) {
275892
275874
  if (matches[2] !== undefined && parsed.path && parsed.path[0] !== "/") {
275893
275875
  return 'URI path must start with "/" when authority is present.';
@@ -275922,6 +275904,20 @@ var require_fast_uri = __commonJS((exports, module) => {
275922
275904
  parsed.error = "URI authority must not contain a literal backslash.";
275923
275905
  malformedAuthorityOrPort = true;
275924
275906
  }
275907
+ const introducerMatch = uri.match(AUTHORITY_INTRODUCER_REGION);
275908
+ if (introducerMatch !== null) {
275909
+ const region = introducerMatch[1];
275910
+ const normalizedRegion = region.replace(/[\t\n\r]/g, "");
275911
+ if (normalizedRegion.length >= 2) {
275912
+ if (normalizedRegion.slice(0, 2) !== "//") {
275913
+ parsed.error = parsed.error || "URI authority must not contain a literal backslash.";
275914
+ malformedAuthorityOrPort = true;
275915
+ } else if (region.length !== normalizedRegion.length) {
275916
+ parsed.error = parsed.error || "URI authority introducer must not contain whitespace.";
275917
+ malformedAuthorityOrPort = true;
275918
+ }
275919
+ }
275920
+ }
275925
275921
  const matches = uri.match(URI_PARSE);
275926
275922
  if (matches) {
275927
275923
  parsed.scheme = matches[1];
@@ -410155,20 +410151,32 @@ function isInputModeCharacter(input) {
410155
410151
  import { join as join105 } from "path";
410156
410152
  function getDirectoryFingerprint(dirPath) {
410157
410153
  const fs13 = getFsImplementation();
410158
- const entries = fs13.readdirStringSync(dirPath);
410154
+ let entries;
410155
+ try {
410156
+ entries = fs13.readdirSync(dirPath).map((dirent) => dirent.name);
410157
+ } catch {
410158
+ return "";
410159
+ }
410159
410160
  const sortedEntries = entries.sort();
410160
410161
  const fingerprintParts = [];
410161
410162
  for (const entry of sortedEntries) {
410162
410163
  const fullPath = join105(dirPath, entry);
410163
- const stat37 = fs13.statSync(fullPath);
410164
- if (stat37.isDirectory()) {
410165
- if (entry === "node_modules" || entry === ".git" || entry === "dist" || entry === "build" || entry === ".next" || entry === "out" || entry === "coverage") {
410164
+ try {
410165
+ const lstat7 = fs13.lstatSync(fullPath);
410166
+ if (lstat7.isSymbolicLink()) {
410166
410167
  continue;
410167
410168
  }
410168
- fingerprintParts.push(entry + "/");
410169
- fingerprintParts.push(getDirectoryFingerprint(fullPath));
410170
- } else {
410171
- fingerprintParts.push(entry);
410169
+ if (lstat7.isDirectory()) {
410170
+ if (entry === "node_modules" || entry === ".git" || entry === "dist" || entry === "build" || entry === ".next" || entry === "out" || entry === "coverage") {
410171
+ continue;
410172
+ }
410173
+ fingerprintParts.push(entry + "/");
410174
+ fingerprintParts.push(getDirectoryFingerprint(fullPath));
410175
+ } else {
410176
+ fingerprintParts.push(entry);
410177
+ }
410178
+ } catch {
410179
+ continue;
410172
410180
  }
410173
410181
  }
410174
410182
  return fingerprintParts.join(`
@@ -410178,6 +410186,7 @@ function clearCachedSteps() {
410178
410186
  cachedSteps = null;
410179
410187
  cachedClaudeMdMtime = -1;
410180
410188
  cachedDirFingerprint = "";
410189
+ cachedRootMtime = -1;
410181
410190
  cachedAt = null;
410182
410191
  }
410183
410192
  function isCacheValid() {
@@ -410194,12 +410203,17 @@ function isCacheValid() {
410194
410203
  return false;
410195
410204
  }
410196
410205
  try {
410197
- const currentFingerprint = getDirectoryFingerprint(cwd2);
410198
- if (currentFingerprint !== cachedDirFingerprint)
410206
+ const currentRootMtime = Math.floor(fs13.statSync(cwd2).mtimeMs);
410207
+ if (currentRootMtime !== cachedRootMtime) {
410199
410208
  return false;
410209
+ }
410200
410210
  } catch {
410201
410211
  return false;
410202
410212
  }
410213
+ const currentDirFingerprint = getDirectoryFingerprint(cwd2);
410214
+ if (currentDirFingerprint !== cachedDirFingerprint) {
410215
+ return false;
410216
+ }
410203
410217
  if (cachedAt !== null && Date.now() - cachedAt > CACHE_MAX_AGE_MS) {
410204
410218
  return false;
410205
410219
  }
@@ -410219,6 +410233,11 @@ function getSteps() {
410219
410233
  } catch {
410220
410234
  cachedClaudeMdMtime = -1;
410221
410235
  }
410236
+ try {
410237
+ cachedRootMtime = Math.floor(fs13.statSync(cwd2).mtimeMs);
410238
+ } catch {
410239
+ cachedRootMtime = -1;
410240
+ }
410222
410241
  try {
410223
410242
  cachedDirFingerprint = getDirectoryFingerprint(cwd2);
410224
410243
  } catch {
@@ -410270,7 +410289,7 @@ function incrementProjectOnboardingSeenCount() {
410270
410289
  projectOnboardingSeenCount: current.projectOnboardingSeenCount + 1
410271
410290
  }));
410272
410291
  }
410273
- var cachedSteps = null, cachedClaudeMdMtime = -1, cachedDirFingerprint = "", cachedAt = null, CACHE_MAX_AGE_MS = 300000;
410292
+ var cachedSteps = null, cachedClaudeMdMtime = -1, cachedDirFingerprint = "", cachedRootMtime = -1, cachedAt = null, CACHE_MAX_AGE_MS = 300000;
410274
410293
  var init_projectOnboardingState = __esm(() => {
410275
410294
  init_config();
410276
410295
  init_cwd2();
@@ -566543,110 +566562,71 @@ function migrateEnableAllProjectMcpServersToSettings() {
566543
566562
  saveGlobalConfig((c6) => ({ ...c6, hasCompletedMcpServerMigration: true }));
566544
566563
  return;
566545
566564
  }
566546
- const originalSettings = getSettingsForSource("localSettings") || {};
566547
- const originalProjectConfig = { ...projectConfig };
566548
- const originalSettingsHash = JSON.stringify(originalSettings);
566549
- const migratedFields = [];
566550
566565
  const updates = {};
566551
- try {
566552
- const existingSettings = originalSettings;
566553
- if (hasEnableAll) {
566554
- updates.enableAllProjectMcpServers = projectConfig.enableAllProjectMcpServers;
566555
- migratedFields.push("enableAllProjectMcpServers");
566556
- }
566557
- const existingEnabledServers = Array.isArray(existingSettings.enabledMcpjsonServers) ? [...existingSettings.enabledMcpjsonServers] : [];
566558
- const existingDisabledServers = Array.isArray(existingSettings.disabledMcpjsonServers) ? [...existingSettings.disabledMcpjsonServers] : [];
566559
- if (hasEnabledServers) {
566560
- if (Array.isArray(projectConfig.enabledMcpjsonServers) && projectConfig.enabledMcpjsonServers.length > 0) {
566561
- const seen = new Set(existingEnabledServers);
566562
- for (const server of projectConfig.enabledMcpjsonServers) {
566563
- if (!seen.has(server)) {
566564
- existingEnabledServers.push(server);
566565
- seen.add(server);
566566
- }
566566
+ const existingSettings = getSettingsForSource("localSettings") || {};
566567
+ if (hasEnableAll) {
566568
+ updates.enableAllProjectMcpServers = projectConfig.enableAllProjectMcpServers;
566569
+ }
566570
+ const existingEnabledServers = Array.isArray(existingSettings.enabledMcpjsonServers) ? [...existingSettings.enabledMcpjsonServers] : [];
566571
+ const existingDisabledServers = Array.isArray(existingSettings.disabledMcpjsonServers) ? [...existingSettings.disabledMcpjsonServers] : [];
566572
+ if (hasEnabledServers) {
566573
+ if (Array.isArray(projectConfig.enabledMcpjsonServers) && projectConfig.enabledMcpjsonServers.length > 0) {
566574
+ const seen = new Set(existingEnabledServers);
566575
+ for (const server of projectConfig.enabledMcpjsonServers) {
566576
+ if (!seen.has(server)) {
566577
+ existingEnabledServers.push(server);
566578
+ seen.add(server);
566567
566579
  }
566568
566580
  }
566569
- migratedFields.push("enabledMcpjsonServers");
566570
566581
  }
566571
- if (hasDisabledServers) {
566572
- if (Array.isArray(projectConfig.disabledMcpjsonServers) && projectConfig.disabledMcpjsonServers.length > 0) {
566573
- const seen = new Set(existingDisabledServers);
566574
- for (const server of projectConfig.disabledMcpjsonServers) {
566575
- if (!seen.has(server)) {
566576
- existingDisabledServers.push(server);
566577
- seen.add(server);
566578
- }
566582
+ }
566583
+ if (hasDisabledServers) {
566584
+ if (Array.isArray(projectConfig.disabledMcpjsonServers) && projectConfig.disabledMcpjsonServers.length > 0) {
566585
+ const seen = new Set(existingDisabledServers);
566586
+ for (const server of projectConfig.disabledMcpjsonServers) {
566587
+ if (!seen.has(server)) {
566588
+ existingDisabledServers.push(server);
566589
+ seen.add(server);
566579
566590
  }
566580
566591
  }
566581
- migratedFields.push("disabledMcpjsonServers");
566582
566592
  }
566583
- const overlappingServers = existingEnabledServers.filter((server) => existingDisabledServers.includes(server));
566584
- if (overlappingServers.length > 0) {
566585
- logEvent("tengu_migrate_mcp_server_overlap_in_both_lists", {
566586
- overlappingServers: overlappingServers.join(","),
566587
- resolvedBy: "removing_from_disabled_list"
566588
- });
566589
- updates.disabledMcpjsonServers = existingDisabledServers.filter((server) => !overlappingServers.includes(server));
566590
- } else {
566591
- updates.disabledMcpjsonServers = existingDisabledServers;
566592
- }
566593
- updates.enabledMcpjsonServers = existingEnabledServers;
566594
- saveCurrentProjectConfig((config5) => {
566595
- const updated = { ...config5 };
566596
- for (const field of migratedFields) {
566597
- delete updated[field];
566598
- }
566599
- return updated;
566593
+ }
566594
+ const overlappingServers = existingEnabledServers.filter((server) => existingDisabledServers.includes(server));
566595
+ if (overlappingServers.length > 0) {
566596
+ logEvent("tengu_migrate_mcp_server_conflict_resolved", {
566597
+ overlappingServers: overlappingServers.join(","),
566598
+ conflictResolution: "removed_from_disabled"
566600
566599
  });
566601
- const currentSettings = getSettingsForSource("localSettings") || {};
566602
- const currentSettingsHash = JSON.stringify(currentSettings);
566603
- if (currentSettingsHash !== originalSettingsHash) {
566604
- logError2("MIGRATION WARNING: Settings file was modified concurrently during migration. " + "The migration will abort to prevent data loss. " + "Original settings hash: " + originalSettingsHash + ", Current settings hash: " + currentSettingsHash);
566605
- throw new Error("Migration aborted due to concurrent changes to settings file. " + "Please ensure no other processes are modifying the settings file and try again.");
566606
- }
566600
+ }
566601
+ const finalDisabledServers = existingDisabledServers.filter((server) => !existingEnabledServers.includes(server));
566602
+ if (hasEnabledServers) {
566603
+ updates.enabledMcpjsonServers = existingEnabledServers;
566604
+ }
566605
+ if (hasDisabledServers || existingSettings.disabledMcpjsonServers !== undefined) {
566606
+ updates.disabledMcpjsonServers = finalDisabledServers;
566607
+ }
566608
+ try {
566607
566609
  updateSettingsForSource("localSettings", updates);
566608
- saveGlobalConfig((c6) => ({ ...c6, hasCompletedMcpServerMigration: true }));
566609
- logEvent("tengu_migrate_enable_all_project_mcp_servers_to_settings", {
566610
- migration: "enableAllProjectMcpServersToSettings",
566611
- fieldsMigrated: migratedFields.join(",")
566612
- });
566613
566610
  } catch (error49) {
566614
- logError2("Failed to migrate MCP server settings, rolling back", error49);
566615
- let rollbackFailed = false;
566616
- try {
566617
- const currentSettings = getSettingsForSource("localSettings") || {};
566618
- const currentSettingsHash = JSON.stringify(currentSettings);
566619
- if (currentSettingsHash !== originalSettingsHash) {
566620
- logError2("MIGRATION WARNING: Settings file was modified concurrently. " + "The rollback will abort to prevent data loss. " + "Original settings hash: " + originalSettingsHash + ", Current settings hash: " + currentSettingsHash);
566621
- throw new Error("Rollback aborted due to concurrent changes to settings file. " + "Please ensure no other processes are modifying the settings file.");
566622
- }
566623
- const rollbackUpdates = {};
566624
- for (const field of migratedFields) {
566625
- if (field in originalSettings) {
566626
- rollbackUpdates[field] = originalSettings[field];
566627
- } else {
566628
- deleteSettingsField("localSettings", field);
566629
- }
566630
- }
566631
- updateSettingsForSource("localSettings", rollbackUpdates);
566632
- saveCurrentProjectConfig((config5) => {
566633
- const updated = { ...config5 };
566634
- for (const field of migratedFields) {
566635
- if (field in originalProjectConfig) {
566636
- updated[field] = originalProjectConfig[field];
566637
- }
566638
- }
566639
- return updated;
566640
- });
566641
- } catch (rollbackError) {
566642
- logError2("Rollback of settings failed", rollbackError);
566643
- rollbackFailed = true;
566644
- }
566645
- if (rollbackFailed) {
566646
- logError2("Migration failed and rollback was incomplete. " + "The settings file may be in an inconsistent state. " + "Please check the settings file manually.");
566647
- throw error49;
566648
- }
566611
+ logError2(new Error(`Failed to migrate MCP server settings to local config: ${error49}`));
566612
+ throw error49;
566649
566613
  }
566614
+ saveCurrentProjectConfig((config5) => {
566615
+ const updated = { ...config5 };
566616
+ delete updated.enableAllProjectMcpServers;
566617
+ delete updated.enabledMcpjsonServers;
566618
+ delete updated.disabledMcpjsonServers;
566619
+ return updated;
566620
+ });
566621
+ saveGlobalConfig((c6) => ({ ...c6, hasCompletedMcpServerMigration: true }));
566622
+ logEvent("tengu_migrate_enable_all_project_mcp_servers_to_settings", {
566623
+ migration: "enableAllProjectMcpServersToSettings",
566624
+ fieldsMigrated: [
566625
+ hasEnableAll && "enableAllProjectMcpServers",
566626
+ hasEnabledServers && "enabledMcpjsonServers",
566627
+ hasDisabledServers && "disabledMcpjsonServers"
566628
+ ].filter(Boolean).join(",")
566629
+ });
566650
566630
  }
566651
566631
  var init_migrateEnableAllProjectMcpServersToSettings = __esm(() => {
566652
566632
  init_analytics();
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.166",
8
- BUILD_TIME: "2026-07-31T04:45:19.156Z",
7
+ VERSION: "0.1.168",
8
+ BUILD_TIME: "2026-07-31T17:52:42.282Z",
9
9
  PACKAGE_URL: "@funnycode/myclaude",
10
10
  NATIVE_PACKAGE_URL: "@funnycode/myclaude",
11
11
  VERSION_CHANGELOG: '',
@@ -61328,30 +61328,6 @@ function updateSettingsForSource(source, settings) {
61328
61328
  }
61329
61329
  return { error: null };
61330
61330
  }
61331
- function deleteSettingsField(source, field) {
61332
- if (source === "policySettings" || source === "flagSettings") {
61333
- return { error: null };
61334
- }
61335
- const filePath = getSettingsFilePathForSource(source);
61336
- if (!filePath) {
61337
- return { error: null };
61338
- }
61339
- try {
61340
- getFsImplementation().mkdirSync(dirname13(filePath));
61341
- let existingSettings = getSettingsForSourceUncached(source);
61342
- if (!existingSettings) {
61343
- return { error: null };
61344
- }
61345
- delete existingSettings[field];
61346
- writeFileSyncAndFlush_DEPRECATED(filePath, jsonStringify(existingSettings));
61347
- resetSettingsCache();
61348
- return { error: null };
61349
- } catch (e) {
61350
- const error49 = new Error(`Failed to delete field ${field} from settings source ${source}: ${e}`);
61351
- logError2(error49);
61352
- return { error: error49 };
61353
- }
61354
- }
61355
61331
  function mergeArrays(targetArray, sourceArray) {
61356
61332
  return uniq([...targetArray, ...sourceArray]);
61357
61333
  }
@@ -119971,7 +119947,7 @@ var package_default;
119971
119947
  var init_package = __esm(() => {
119972
119948
  package_default = {
119973
119949
  name: "@funnycode/myclaude",
119974
- version: "0.1.166",
119950
+ version: "0.1.168",
119975
119951
  private: false,
119976
119952
  description: "An open-source AI coding assistant in your terminal - powered by Claude",
119977
119953
  license: "MIT",
@@ -275761,7 +275737,12 @@ var require_fast_uri = __commonJS((exports, module) => {
275761
275737
  }
275762
275738
  function resolve26(baseURI, relativeURI, options) {
275763
275739
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
275764
- const resolved = resolveComponent(parse9(baseURI, schemelessOptions), parse9(relativeURI, schemelessOptions), schemelessOptions, true);
275740
+ const { parsed: baseParsed, malformedAuthorityOrPort: baseMalformed } = parseWithStatus(baseURI, schemelessOptions);
275741
+ const { parsed: relativeParsed, malformedAuthorityOrPort: relativeMalformed } = parseWithStatus(relativeURI, schemelessOptions);
275742
+ if (baseMalformed || relativeMalformed) {
275743
+ throw new Error(baseParsed.error || relativeParsed.error || "URI is malformed.");
275744
+ }
275745
+ const resolved = resolveComponent(baseParsed, relativeParsed, schemelessOptions, true);
275765
275746
  schemelessOptions.skipEscape = true;
275766
275747
  return serialize2(resolved, schemelessOptions);
275767
275748
  }
@@ -275888,6 +275869,7 @@ var require_fast_uri = __commonJS((exports, module) => {
275888
275869
  }
275889
275870
  var URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;
275890
275871
  var AUTHORITY_PREFIX = /^(?:[^#/:?]+:)?\/\/([^/?#]*)/;
275872
+ var AUTHORITY_INTRODUCER_REGION = /^(?:[^#/:?]+:)?([/\\\t\n\r]*)/;
275891
275873
  function getParseError2(parsed, matches) {
275892
275874
  if (matches[2] !== undefined && parsed.path && parsed.path[0] !== "/") {
275893
275875
  return 'URI path must start with "/" when authority is present.';
@@ -275922,6 +275904,20 @@ var require_fast_uri = __commonJS((exports, module) => {
275922
275904
  parsed.error = "URI authority must not contain a literal backslash.";
275923
275905
  malformedAuthorityOrPort = true;
275924
275906
  }
275907
+ const introducerMatch = uri.match(AUTHORITY_INTRODUCER_REGION);
275908
+ if (introducerMatch !== null) {
275909
+ const region = introducerMatch[1];
275910
+ const normalizedRegion = region.replace(/[\t\n\r]/g, "");
275911
+ if (normalizedRegion.length >= 2) {
275912
+ if (normalizedRegion.slice(0, 2) !== "//") {
275913
+ parsed.error = parsed.error || "URI authority must not contain a literal backslash.";
275914
+ malformedAuthorityOrPort = true;
275915
+ } else if (region.length !== normalizedRegion.length) {
275916
+ parsed.error = parsed.error || "URI authority introducer must not contain whitespace.";
275917
+ malformedAuthorityOrPort = true;
275918
+ }
275919
+ }
275920
+ }
275925
275921
  const matches = uri.match(URI_PARSE);
275926
275922
  if (matches) {
275927
275923
  parsed.scheme = matches[1];
@@ -410155,20 +410151,32 @@ function isInputModeCharacter(input) {
410155
410151
  import { join as join105 } from "path";
410156
410152
  function getDirectoryFingerprint(dirPath) {
410157
410153
  const fs13 = getFsImplementation();
410158
- const entries = fs13.readdirStringSync(dirPath);
410154
+ let entries;
410155
+ try {
410156
+ entries = fs13.readdirSync(dirPath).map((dirent) => dirent.name);
410157
+ } catch {
410158
+ return "";
410159
+ }
410159
410160
  const sortedEntries = entries.sort();
410160
410161
  const fingerprintParts = [];
410161
410162
  for (const entry of sortedEntries) {
410162
410163
  const fullPath = join105(dirPath, entry);
410163
- const stat37 = fs13.statSync(fullPath);
410164
- if (stat37.isDirectory()) {
410165
- if (entry === "node_modules" || entry === ".git" || entry === "dist" || entry === "build" || entry === ".next" || entry === "out" || entry === "coverage") {
410164
+ try {
410165
+ const lstat7 = fs13.lstatSync(fullPath);
410166
+ if (lstat7.isSymbolicLink()) {
410166
410167
  continue;
410167
410168
  }
410168
- fingerprintParts.push(entry + "/");
410169
- fingerprintParts.push(getDirectoryFingerprint(fullPath));
410170
- } else {
410171
- fingerprintParts.push(entry);
410169
+ if (lstat7.isDirectory()) {
410170
+ if (entry === "node_modules" || entry === ".git" || entry === "dist" || entry === "build" || entry === ".next" || entry === "out" || entry === "coverage") {
410171
+ continue;
410172
+ }
410173
+ fingerprintParts.push(entry + "/");
410174
+ fingerprintParts.push(getDirectoryFingerprint(fullPath));
410175
+ } else {
410176
+ fingerprintParts.push(entry);
410177
+ }
410178
+ } catch {
410179
+ continue;
410172
410180
  }
410173
410181
  }
410174
410182
  return fingerprintParts.join(`
@@ -410178,6 +410186,7 @@ function clearCachedSteps() {
410178
410186
  cachedSteps = null;
410179
410187
  cachedClaudeMdMtime = -1;
410180
410188
  cachedDirFingerprint = "";
410189
+ cachedRootMtime = -1;
410181
410190
  cachedAt = null;
410182
410191
  }
410183
410192
  function isCacheValid() {
@@ -410194,12 +410203,17 @@ function isCacheValid() {
410194
410203
  return false;
410195
410204
  }
410196
410205
  try {
410197
- const currentFingerprint = getDirectoryFingerprint(cwd2);
410198
- if (currentFingerprint !== cachedDirFingerprint)
410206
+ const currentRootMtime = Math.floor(fs13.statSync(cwd2).mtimeMs);
410207
+ if (currentRootMtime !== cachedRootMtime) {
410199
410208
  return false;
410209
+ }
410200
410210
  } catch {
410201
410211
  return false;
410202
410212
  }
410213
+ const currentDirFingerprint = getDirectoryFingerprint(cwd2);
410214
+ if (currentDirFingerprint !== cachedDirFingerprint) {
410215
+ return false;
410216
+ }
410203
410217
  if (cachedAt !== null && Date.now() - cachedAt > CACHE_MAX_AGE_MS) {
410204
410218
  return false;
410205
410219
  }
@@ -410219,6 +410233,11 @@ function getSteps() {
410219
410233
  } catch {
410220
410234
  cachedClaudeMdMtime = -1;
410221
410235
  }
410236
+ try {
410237
+ cachedRootMtime = Math.floor(fs13.statSync(cwd2).mtimeMs);
410238
+ } catch {
410239
+ cachedRootMtime = -1;
410240
+ }
410222
410241
  try {
410223
410242
  cachedDirFingerprint = getDirectoryFingerprint(cwd2);
410224
410243
  } catch {
@@ -410270,7 +410289,7 @@ function incrementProjectOnboardingSeenCount() {
410270
410289
  projectOnboardingSeenCount: current.projectOnboardingSeenCount + 1
410271
410290
  }));
410272
410291
  }
410273
- var cachedSteps = null, cachedClaudeMdMtime = -1, cachedDirFingerprint = "", cachedAt = null, CACHE_MAX_AGE_MS = 300000;
410292
+ var cachedSteps = null, cachedClaudeMdMtime = -1, cachedDirFingerprint = "", cachedRootMtime = -1, cachedAt = null, CACHE_MAX_AGE_MS = 300000;
410274
410293
  var init_projectOnboardingState = __esm(() => {
410275
410294
  init_config();
410276
410295
  init_cwd2();
@@ -566543,110 +566562,71 @@ function migrateEnableAllProjectMcpServersToSettings() {
566543
566562
  saveGlobalConfig((c6) => ({ ...c6, hasCompletedMcpServerMigration: true }));
566544
566563
  return;
566545
566564
  }
566546
- const originalSettings = getSettingsForSource("localSettings") || {};
566547
- const originalProjectConfig = { ...projectConfig };
566548
- const originalSettingsHash = JSON.stringify(originalSettings);
566549
- const migratedFields = [];
566550
566565
  const updates = {};
566551
- try {
566552
- const existingSettings = originalSettings;
566553
- if (hasEnableAll) {
566554
- updates.enableAllProjectMcpServers = projectConfig.enableAllProjectMcpServers;
566555
- migratedFields.push("enableAllProjectMcpServers");
566556
- }
566557
- const existingEnabledServers = Array.isArray(existingSettings.enabledMcpjsonServers) ? [...existingSettings.enabledMcpjsonServers] : [];
566558
- const existingDisabledServers = Array.isArray(existingSettings.disabledMcpjsonServers) ? [...existingSettings.disabledMcpjsonServers] : [];
566559
- if (hasEnabledServers) {
566560
- if (Array.isArray(projectConfig.enabledMcpjsonServers) && projectConfig.enabledMcpjsonServers.length > 0) {
566561
- const seen = new Set(existingEnabledServers);
566562
- for (const server of projectConfig.enabledMcpjsonServers) {
566563
- if (!seen.has(server)) {
566564
- existingEnabledServers.push(server);
566565
- seen.add(server);
566566
- }
566566
+ const existingSettings = getSettingsForSource("localSettings") || {};
566567
+ if (hasEnableAll) {
566568
+ updates.enableAllProjectMcpServers = projectConfig.enableAllProjectMcpServers;
566569
+ }
566570
+ const existingEnabledServers = Array.isArray(existingSettings.enabledMcpjsonServers) ? [...existingSettings.enabledMcpjsonServers] : [];
566571
+ const existingDisabledServers = Array.isArray(existingSettings.disabledMcpjsonServers) ? [...existingSettings.disabledMcpjsonServers] : [];
566572
+ if (hasEnabledServers) {
566573
+ if (Array.isArray(projectConfig.enabledMcpjsonServers) && projectConfig.enabledMcpjsonServers.length > 0) {
566574
+ const seen = new Set(existingEnabledServers);
566575
+ for (const server of projectConfig.enabledMcpjsonServers) {
566576
+ if (!seen.has(server)) {
566577
+ existingEnabledServers.push(server);
566578
+ seen.add(server);
566567
566579
  }
566568
566580
  }
566569
- migratedFields.push("enabledMcpjsonServers");
566570
566581
  }
566571
- if (hasDisabledServers) {
566572
- if (Array.isArray(projectConfig.disabledMcpjsonServers) && projectConfig.disabledMcpjsonServers.length > 0) {
566573
- const seen = new Set(existingDisabledServers);
566574
- for (const server of projectConfig.disabledMcpjsonServers) {
566575
- if (!seen.has(server)) {
566576
- existingDisabledServers.push(server);
566577
- seen.add(server);
566578
- }
566582
+ }
566583
+ if (hasDisabledServers) {
566584
+ if (Array.isArray(projectConfig.disabledMcpjsonServers) && projectConfig.disabledMcpjsonServers.length > 0) {
566585
+ const seen = new Set(existingDisabledServers);
566586
+ for (const server of projectConfig.disabledMcpjsonServers) {
566587
+ if (!seen.has(server)) {
566588
+ existingDisabledServers.push(server);
566589
+ seen.add(server);
566579
566590
  }
566580
566591
  }
566581
- migratedFields.push("disabledMcpjsonServers");
566582
566592
  }
566583
- const overlappingServers = existingEnabledServers.filter((server) => existingDisabledServers.includes(server));
566584
- if (overlappingServers.length > 0) {
566585
- logEvent("tengu_migrate_mcp_server_overlap_in_both_lists", {
566586
- overlappingServers: overlappingServers.join(","),
566587
- resolvedBy: "removing_from_disabled_list"
566588
- });
566589
- updates.disabledMcpjsonServers = existingDisabledServers.filter((server) => !overlappingServers.includes(server));
566590
- } else {
566591
- updates.disabledMcpjsonServers = existingDisabledServers;
566592
- }
566593
- updates.enabledMcpjsonServers = existingEnabledServers;
566594
- saveCurrentProjectConfig((config5) => {
566595
- const updated = { ...config5 };
566596
- for (const field of migratedFields) {
566597
- delete updated[field];
566598
- }
566599
- return updated;
566593
+ }
566594
+ const overlappingServers = existingEnabledServers.filter((server) => existingDisabledServers.includes(server));
566595
+ if (overlappingServers.length > 0) {
566596
+ logEvent("tengu_migrate_mcp_server_conflict_resolved", {
566597
+ overlappingServers: overlappingServers.join(","),
566598
+ conflictResolution: "removed_from_disabled"
566600
566599
  });
566601
- const currentSettings = getSettingsForSource("localSettings") || {};
566602
- const currentSettingsHash = JSON.stringify(currentSettings);
566603
- if (currentSettingsHash !== originalSettingsHash) {
566604
- logError2("MIGRATION WARNING: Settings file was modified concurrently during migration. " + "The migration will abort to prevent data loss. " + "Original settings hash: " + originalSettingsHash + ", Current settings hash: " + currentSettingsHash);
566605
- throw new Error("Migration aborted due to concurrent changes to settings file. " + "Please ensure no other processes are modifying the settings file and try again.");
566606
- }
566600
+ }
566601
+ const finalDisabledServers = existingDisabledServers.filter((server) => !existingEnabledServers.includes(server));
566602
+ if (hasEnabledServers) {
566603
+ updates.enabledMcpjsonServers = existingEnabledServers;
566604
+ }
566605
+ if (hasDisabledServers || existingSettings.disabledMcpjsonServers !== undefined) {
566606
+ updates.disabledMcpjsonServers = finalDisabledServers;
566607
+ }
566608
+ try {
566607
566609
  updateSettingsForSource("localSettings", updates);
566608
- saveGlobalConfig((c6) => ({ ...c6, hasCompletedMcpServerMigration: true }));
566609
- logEvent("tengu_migrate_enable_all_project_mcp_servers_to_settings", {
566610
- migration: "enableAllProjectMcpServersToSettings",
566611
- fieldsMigrated: migratedFields.join(",")
566612
- });
566613
566610
  } catch (error49) {
566614
- logError2("Failed to migrate MCP server settings, rolling back", error49);
566615
- let rollbackFailed = false;
566616
- try {
566617
- const currentSettings = getSettingsForSource("localSettings") || {};
566618
- const currentSettingsHash = JSON.stringify(currentSettings);
566619
- if (currentSettingsHash !== originalSettingsHash) {
566620
- logError2("MIGRATION WARNING: Settings file was modified concurrently. " + "The rollback will abort to prevent data loss. " + "Original settings hash: " + originalSettingsHash + ", Current settings hash: " + currentSettingsHash);
566621
- throw new Error("Rollback aborted due to concurrent changes to settings file. " + "Please ensure no other processes are modifying the settings file.");
566622
- }
566623
- const rollbackUpdates = {};
566624
- for (const field of migratedFields) {
566625
- if (field in originalSettings) {
566626
- rollbackUpdates[field] = originalSettings[field];
566627
- } else {
566628
- deleteSettingsField("localSettings", field);
566629
- }
566630
- }
566631
- updateSettingsForSource("localSettings", rollbackUpdates);
566632
- saveCurrentProjectConfig((config5) => {
566633
- const updated = { ...config5 };
566634
- for (const field of migratedFields) {
566635
- if (field in originalProjectConfig) {
566636
- updated[field] = originalProjectConfig[field];
566637
- }
566638
- }
566639
- return updated;
566640
- });
566641
- } catch (rollbackError) {
566642
- logError2("Rollback of settings failed", rollbackError);
566643
- rollbackFailed = true;
566644
- }
566645
- if (rollbackFailed) {
566646
- logError2("Migration failed and rollback was incomplete. " + "The settings file may be in an inconsistent state. " + "Please check the settings file manually.");
566647
- throw error49;
566648
- }
566611
+ logError2(new Error(`Failed to migrate MCP server settings to local config: ${error49}`));
566612
+ throw error49;
566649
566613
  }
566614
+ saveCurrentProjectConfig((config5) => {
566615
+ const updated = { ...config5 };
566616
+ delete updated.enableAllProjectMcpServers;
566617
+ delete updated.enabledMcpjsonServers;
566618
+ delete updated.disabledMcpjsonServers;
566619
+ return updated;
566620
+ });
566621
+ saveGlobalConfig((c6) => ({ ...c6, hasCompletedMcpServerMigration: true }));
566622
+ logEvent("tengu_migrate_enable_all_project_mcp_servers_to_settings", {
566623
+ migration: "enableAllProjectMcpServersToSettings",
566624
+ fieldsMigrated: [
566625
+ hasEnableAll && "enableAllProjectMcpServers",
566626
+ hasEnabledServers && "enabledMcpjsonServers",
566627
+ hasDisabledServers && "disabledMcpjsonServers"
566628
+ ].filter(Boolean).join(",")
566629
+ });
566650
566630
  }
566651
566631
  var init_migrateEnableAllProjectMcpServersToSettings = __esm(() => {
566652
566632
  init_analytics();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@funnycode/myclaude",
3
- "version": "0.1.166",
3
+ "version": "0.1.168",
4
4
  "private": false,
5
5
  "description": "An open-source AI coding assistant in your terminal - powered by Claude",
6
6
  "license": "MIT",