@funnycode/myclaude 0.1.35 → 0.1.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -9
- package/README.zh-CN.md +1 -9
- package/dist/myclaude.js +120 -85
- package/dist/myclaude.mjs +120 -85
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -225,15 +225,7 @@ Once enabled, CodeGraph's MCP server starts automatically and provides semantic
|
|
|
225
225
|
|
|
226
226
|
### ECC — Agent Operating System
|
|
227
227
|
|
|
228
|
-
[ECC](https://github.com/affaan-m/ECC) is a cross-harness agent ecosystem with 200+ skills, agents, hooks, and
|
|
229
|
-
|
|
230
|
-
```bash
|
|
231
|
-
# Browse available ECC plugins
|
|
232
|
-
/plugin
|
|
233
|
-
|
|
234
|
-
# Install a plugin from ECC marketplace
|
|
235
|
-
/plugin install <plugin-name>@ecc
|
|
236
|
-
```
|
|
228
|
+
[ECC](https://github.com/affaan-m/ECC) is a cross-harness agent ecosystem with 200+ skills, agents, hooks, rules, and MCP servers. **Built-in out of the box** — all ECC plugins are auto-installed on first startup, no manual setup needed. Skills, agents, and commands are immediately available via `/` commands.
|
|
237
229
|
|
|
238
230
|
---
|
|
239
231
|
|
package/README.zh-CN.md
CHANGED
|
@@ -246,15 +246,7 @@ codegraph init
|
|
|
246
246
|
|
|
247
247
|
### ECC — 跨平台代理操作系统
|
|
248
248
|
|
|
249
|
-
[ECC](https://github.com/affaan-m/ECC) 是一个跨 harness 的代理生态系统,包含 200+ 技能、代理、hooks
|
|
250
|
-
|
|
251
|
-
```bash
|
|
252
|
-
# 浏览可用的 ECC 插件
|
|
253
|
-
/plugin
|
|
254
|
-
|
|
255
|
-
# 从 ECC 市场安装插件
|
|
256
|
-
/plugin install <插件名>@ecc
|
|
257
|
-
```
|
|
249
|
+
[ECC](https://github.com/affaan-m/ECC) 是一个跨 harness 的代理生态系统,包含 200+ 技能、代理、hooks、规则和 MCP 服务器。**开箱即用** — 首次启动时自动安装所有 ECC 插件,无需手动配置。技能、代理和命令立即通过 `/` 命令可用。
|
|
258
250
|
|
|
259
251
|
---
|
|
260
252
|
|
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.
|
|
8
|
-
BUILD_TIME: "2026-06-23T13:
|
|
7
|
+
VERSION: "0.1.36",
|
|
8
|
+
BUILD_TIME: "2026-06-23T13:32:30.386Z",
|
|
9
9
|
PACKAGE_URL: "@funnycode/myclaude",
|
|
10
10
|
NATIVE_PACKAGE_URL: "@funnycode/myclaude",
|
|
11
11
|
VERSION_CHANGELOG: '',
|
|
@@ -554538,61 +554538,6 @@ var init_codegraphCheck = __esm(() => {
|
|
|
554538
554538
|
init_execFileNoThrow();
|
|
554539
554539
|
});
|
|
554540
554540
|
|
|
554541
|
-
// src/plugins/bundled/eccMarketplace.ts
|
|
554542
|
-
async function ensureEccMarketplaceRegistered() {
|
|
554543
|
-
try {
|
|
554544
|
-
const existing = await loadKnownMarketplacesConfig();
|
|
554545
|
-
if (existing["ecc"]) {
|
|
554546
|
-
logForDebugging("ECC marketplace already registered, skipping");
|
|
554547
|
-
return true;
|
|
554548
|
-
}
|
|
554549
|
-
const result = await addMarketplaceSource({
|
|
554550
|
-
source: "git",
|
|
554551
|
-
url: ECC_MARKETPLACE_URL
|
|
554552
|
-
});
|
|
554553
|
-
logForDebugging(`ECC marketplace registered as '${result.name}' (materialized: ${!result.alreadyMaterialized})`);
|
|
554554
|
-
return true;
|
|
554555
|
-
} catch (error49) {
|
|
554556
|
-
logForDebugging(`Failed to register ECC marketplace: ${error49}`, {
|
|
554557
|
-
level: "warn"
|
|
554558
|
-
});
|
|
554559
|
-
return false;
|
|
554560
|
-
}
|
|
554561
|
-
}
|
|
554562
|
-
var ECC_MARKETPLACE_URL = "https://github.com/affaan-m/ECC.git";
|
|
554563
|
-
var init_eccMarketplace = __esm(() => {
|
|
554564
|
-
init_debug();
|
|
554565
|
-
init_marketplaceManager();
|
|
554566
|
-
});
|
|
554567
|
-
|
|
554568
|
-
// src/plugins/bundled/index.ts
|
|
554569
|
-
function initBuiltinPlugins() {
|
|
554570
|
-
registerBuiltinPlugin({
|
|
554571
|
-
name: "codegraph",
|
|
554572
|
-
description: "Semantic code intelligence — surgical context, fewer tool calls",
|
|
554573
|
-
version: "1.0.0",
|
|
554574
|
-
defaultEnabled: false,
|
|
554575
|
-
isAvailable: () => {
|
|
554576
|
-
isCodeGraphInstalled().catch(() => {});
|
|
554577
|
-
return false;
|
|
554578
|
-
},
|
|
554579
|
-
mcpServers: {
|
|
554580
|
-
codegraph: {
|
|
554581
|
-
command: "codegraph",
|
|
554582
|
-
args: ["mcp"]
|
|
554583
|
-
}
|
|
554584
|
-
}
|
|
554585
|
-
});
|
|
554586
|
-
}
|
|
554587
|
-
async function initSeedMarketplaces() {
|
|
554588
|
-
await ensureEccMarketplaceRegistered();
|
|
554589
|
-
}
|
|
554590
|
-
var init_bundled = __esm(() => {
|
|
554591
|
-
init_builtinPlugins();
|
|
554592
|
-
init_codegraphCheck();
|
|
554593
|
-
init_eccMarketplace();
|
|
554594
|
-
});
|
|
554595
|
-
|
|
554596
554541
|
// src/services/plugins/pluginCliCommands.ts
|
|
554597
554542
|
function handlePluginCommandError(error49, command8, plugin2) {
|
|
554598
554543
|
logError2(error49);
|
|
@@ -554753,6 +554698,96 @@ var init_pluginCliCommands = __esm(() => {
|
|
|
554753
554698
|
init_pluginOperations();
|
|
554754
554699
|
});
|
|
554755
554700
|
|
|
554701
|
+
// src/plugins/bundled/eccMarketplace.ts
|
|
554702
|
+
import { join as join150 } from "path";
|
|
554703
|
+
import { readFile as readFile51 } from "fs/promises";
|
|
554704
|
+
async function ensureEccMarketplaceRegistered() {
|
|
554705
|
+
try {
|
|
554706
|
+
const result = await addMarketplaceSource({
|
|
554707
|
+
source: "git",
|
|
554708
|
+
url: ECC_MARKETPLACE_URL
|
|
554709
|
+
});
|
|
554710
|
+
const eccName = result.name;
|
|
554711
|
+
logForDebugging(`ECC marketplace registered as '${eccName}' (materialized: ${!result.alreadyMaterialized})`);
|
|
554712
|
+
await installEccPlugins(eccName);
|
|
554713
|
+
return true;
|
|
554714
|
+
} catch (error49) {
|
|
554715
|
+
logForDebugging(`Failed to register ECC marketplace: ${error49}`, {
|
|
554716
|
+
level: "warn"
|
|
554717
|
+
});
|
|
554718
|
+
return false;
|
|
554719
|
+
}
|
|
554720
|
+
}
|
|
554721
|
+
async function installEccPlugins(marketplaceName) {
|
|
554722
|
+
try {
|
|
554723
|
+
const cacheDir = getMarketplacesCacheDir();
|
|
554724
|
+
const marketplaceDir = join150(cacheDir, marketplaceName);
|
|
554725
|
+
const marketplaceJsonPath = join150(marketplaceDir, ".claude-plugin", "marketplace.json");
|
|
554726
|
+
let marketplaceData;
|
|
554727
|
+
try {
|
|
554728
|
+
const content = await readFile51(marketplaceJsonPath, "utf-8");
|
|
554729
|
+
marketplaceData = JSON.parse(content);
|
|
554730
|
+
} catch {
|
|
554731
|
+
logForDebugging("ECC marketplace.json not found yet, skipping auto-install");
|
|
554732
|
+
return;
|
|
554733
|
+
}
|
|
554734
|
+
const plugins = marketplaceData?.plugins ?? [];
|
|
554735
|
+
if (plugins.length === 0) {
|
|
554736
|
+
logForDebugging("No plugins found in ECC marketplace");
|
|
554737
|
+
return;
|
|
554738
|
+
}
|
|
554739
|
+
let installed = 0;
|
|
554740
|
+
for (const plugin2 of plugins) {
|
|
554741
|
+
try {
|
|
554742
|
+
const pluginId = `${plugin2.name}@${marketplaceName}`;
|
|
554743
|
+
await installPlugin(pluginId, "user");
|
|
554744
|
+
installed++;
|
|
554745
|
+
} catch (pluginError) {
|
|
554746
|
+
logForDebugging(`Failed to auto-install ECC plugin '${plugin2.name}': ${pluginError}`, { level: "warn" });
|
|
554747
|
+
}
|
|
554748
|
+
}
|
|
554749
|
+
logForDebugging(`Auto-installed ${installed}/${plugins.length} ECC plugins`);
|
|
554750
|
+
} catch (error49) {
|
|
554751
|
+
logForDebugging(`Failed to auto-install ECC plugins: ${error49}`, {
|
|
554752
|
+
level: "warn"
|
|
554753
|
+
});
|
|
554754
|
+
}
|
|
554755
|
+
}
|
|
554756
|
+
var ECC_MARKETPLACE_URL = "https://github.com/affaan-m/ECC.git";
|
|
554757
|
+
var init_eccMarketplace = __esm(() => {
|
|
554758
|
+
init_debug();
|
|
554759
|
+
init_marketplaceManager();
|
|
554760
|
+
init_pluginCliCommands();
|
|
554761
|
+
});
|
|
554762
|
+
|
|
554763
|
+
// src/plugins/bundled/index.ts
|
|
554764
|
+
function initBuiltinPlugins() {
|
|
554765
|
+
registerBuiltinPlugin({
|
|
554766
|
+
name: "codegraph",
|
|
554767
|
+
description: "Semantic code intelligence — surgical context, fewer tool calls",
|
|
554768
|
+
version: "1.0.0",
|
|
554769
|
+
defaultEnabled: false,
|
|
554770
|
+
isAvailable: () => {
|
|
554771
|
+
isCodeGraphInstalled().catch(() => {});
|
|
554772
|
+
return false;
|
|
554773
|
+
},
|
|
554774
|
+
mcpServers: {
|
|
554775
|
+
codegraph: {
|
|
554776
|
+
command: "codegraph",
|
|
554777
|
+
args: ["mcp"]
|
|
554778
|
+
}
|
|
554779
|
+
}
|
|
554780
|
+
});
|
|
554781
|
+
}
|
|
554782
|
+
async function initSeedMarketplaces() {
|
|
554783
|
+
await ensureEccMarketplaceRegistered();
|
|
554784
|
+
}
|
|
554785
|
+
var init_bundled = __esm(() => {
|
|
554786
|
+
init_builtinPlugins();
|
|
554787
|
+
init_codegraphCheck();
|
|
554788
|
+
init_eccMarketplace();
|
|
554789
|
+
});
|
|
554790
|
+
|
|
554756
554791
|
// src/skills/bundled/batch.ts
|
|
554757
554792
|
function buildPrompt(instruction) {
|
|
554758
554793
|
return `# Batch: Parallel Work Orchestration
|
|
@@ -557398,12 +557433,12 @@ var init_createDirectConnectSession = __esm(() => {
|
|
|
557398
557433
|
});
|
|
557399
557434
|
|
|
557400
557435
|
// src/utils/errorLogSink.ts
|
|
557401
|
-
import { dirname as dirname64, join as
|
|
557436
|
+
import { dirname as dirname64, join as join151 } from "path";
|
|
557402
557437
|
function getErrorsPath() {
|
|
557403
|
-
return
|
|
557438
|
+
return join151(CACHE_PATHS.errors(), DATE + ".jsonl");
|
|
557404
557439
|
}
|
|
557405
557440
|
function getMCPLogsPath(serverName) {
|
|
557406
|
-
return
|
|
557441
|
+
return join151(CACHE_PATHS.mcpLogs(serverName), DATE + ".jsonl");
|
|
557407
557442
|
}
|
|
557408
557443
|
function createJsonlWriter(options) {
|
|
557409
557444
|
const writer = createBufferedWriter(options);
|
|
@@ -557746,7 +557781,7 @@ var init_sessionMemory = __esm(() => {
|
|
|
557746
557781
|
// src/utils/iTermBackup.ts
|
|
557747
557782
|
import { copyFile as copyFile12, stat as stat49 } from "fs/promises";
|
|
557748
557783
|
import { homedir as homedir39 } from "os";
|
|
557749
|
-
import { join as
|
|
557784
|
+
import { join as join152 } from "path";
|
|
557750
557785
|
function markITerm2SetupComplete() {
|
|
557751
557786
|
saveGlobalConfig((current) => ({
|
|
557752
557787
|
...current,
|
|
@@ -557761,7 +557796,7 @@ function getIterm2RecoveryInfo() {
|
|
|
557761
557796
|
};
|
|
557762
557797
|
}
|
|
557763
557798
|
function getITerm2PlistPath() {
|
|
557764
|
-
return
|
|
557799
|
+
return join152(homedir39(), "Library", "Preferences", "com.googlecode.iterm2.plist");
|
|
557765
557800
|
}
|
|
557766
557801
|
async function checkAndRestoreITerm2Backup() {
|
|
557767
557802
|
const { inProgress, backupPath } = getIterm2RecoveryInfo();
|
|
@@ -561126,7 +561161,7 @@ var init_idleTimeout = __esm(() => {
|
|
|
561126
561161
|
// src/bridge/inboundAttachments.ts
|
|
561127
561162
|
import { randomUUID as randomUUID48 } from "crypto";
|
|
561128
561163
|
import { mkdir as mkdir42, writeFile as writeFile46 } from "fs/promises";
|
|
561129
|
-
import { basename as basename58, join as
|
|
561164
|
+
import { basename as basename58, join as join153 } from "path";
|
|
561130
561165
|
function debug3(msg) {
|
|
561131
561166
|
logForDebugging(`[bridge:inbound-attach] ${msg}`);
|
|
561132
561167
|
}
|
|
@@ -561142,7 +561177,7 @@ function sanitizeFileName(name) {
|
|
|
561142
561177
|
return base2 || "attachment";
|
|
561143
561178
|
}
|
|
561144
561179
|
function uploadsDir() {
|
|
561145
|
-
return
|
|
561180
|
+
return join153(getClaudeConfigHomeDir(), "uploads", getSessionId());
|
|
561146
561181
|
}
|
|
561147
561182
|
async function resolveOne(att) {
|
|
561148
561183
|
const token = getBridgeAccessToken();
|
|
@@ -561171,7 +561206,7 @@ async function resolveOne(att) {
|
|
|
561171
561206
|
const safeName = sanitizeFileName(att.file_name);
|
|
561172
561207
|
const prefix = (att.file_uuid.slice(0, 8) || randomUUID48().slice(0, 8)).replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
561173
561208
|
const dir = uploadsDir();
|
|
561174
|
-
const outPath =
|
|
561209
|
+
const outPath = join153(dir, `${prefix}-${safeName}`);
|
|
561175
561210
|
try {
|
|
561176
561211
|
await mkdir42(dir, { recursive: true });
|
|
561177
561212
|
await writeFile46(outPath, data);
|
|
@@ -561270,11 +561305,11 @@ var init_sessionUrl = __esm(() => {
|
|
|
561270
561305
|
});
|
|
561271
561306
|
|
|
561272
561307
|
// src/utils/plugins/zipCacheAdapters.ts
|
|
561273
|
-
import { readFile as
|
|
561274
|
-
import { join as
|
|
561308
|
+
import { readFile as readFile52 } from "fs/promises";
|
|
561309
|
+
import { join as join154 } from "path";
|
|
561275
561310
|
async function readZipCacheKnownMarketplaces() {
|
|
561276
561311
|
try {
|
|
561277
|
-
const content = await
|
|
561312
|
+
const content = await readFile52(getZipCacheKnownMarketplacesPath(), "utf-8");
|
|
561278
561313
|
const parsed = KnownMarketplacesFileSchema().safeParse(jsonParse(content));
|
|
561279
561314
|
if (!parsed.success) {
|
|
561280
561315
|
logForDebugging(`Invalid known_marketplaces.json in zip cache: ${parsed.error.message}`, { level: "error" });
|
|
@@ -561296,18 +561331,18 @@ async function saveMarketplaceJsonToZipCache(marketplaceName, installLocation) {
|
|
|
561296
561331
|
const content = await readMarketplaceJsonContent(installLocation);
|
|
561297
561332
|
if (content !== null) {
|
|
561298
561333
|
const relPath = getMarketplaceJsonRelativePath(marketplaceName);
|
|
561299
|
-
await atomicWriteToZipCache(
|
|
561334
|
+
await atomicWriteToZipCache(join154(zipCachePath, relPath), content);
|
|
561300
561335
|
}
|
|
561301
561336
|
}
|
|
561302
561337
|
async function readMarketplaceJsonContent(dir) {
|
|
561303
561338
|
const candidates = [
|
|
561304
|
-
|
|
561305
|
-
|
|
561339
|
+
join154(dir, ".claude-plugin", "marketplace.json"),
|
|
561340
|
+
join154(dir, "marketplace.json"),
|
|
561306
561341
|
dir
|
|
561307
561342
|
];
|
|
561308
561343
|
for (const candidate of candidates) {
|
|
561309
561344
|
try {
|
|
561310
|
-
return await
|
|
561345
|
+
return await readFile52(candidate, "utf-8");
|
|
561311
561346
|
} catch {}
|
|
561312
561347
|
}
|
|
561313
561348
|
return null;
|
|
@@ -561760,10 +561795,10 @@ __export(exports_bridgePointer, {
|
|
|
561760
561795
|
clearBridgePointer: () => clearBridgePointer,
|
|
561761
561796
|
BRIDGE_POINTER_TTL_MS: () => BRIDGE_POINTER_TTL_MS
|
|
561762
561797
|
});
|
|
561763
|
-
import { mkdir as mkdir43, readFile as
|
|
561764
|
-
import { dirname as dirname65, join as
|
|
561798
|
+
import { mkdir as mkdir43, readFile as readFile53, stat as stat50, unlink as unlink22, writeFile as writeFile47 } from "fs/promises";
|
|
561799
|
+
import { dirname as dirname65, join as join155 } from "path";
|
|
561765
561800
|
function getBridgePointerPath(dir) {
|
|
561766
|
-
return
|
|
561801
|
+
return join155(getProjectsDir(), sanitizePath2(dir), "bridge-pointer.json");
|
|
561767
561802
|
}
|
|
561768
561803
|
async function writeBridgePointer(dir, pointer) {
|
|
561769
561804
|
const path24 = getBridgePointerPath(dir);
|
|
@@ -561781,7 +561816,7 @@ async function readBridgePointer(dir) {
|
|
|
561781
561816
|
let mtimeMs;
|
|
561782
561817
|
try {
|
|
561783
561818
|
mtimeMs = (await stat50(path24)).mtimeMs;
|
|
561784
|
-
raw = await
|
|
561819
|
+
raw = await readFile53(path24, "utf8");
|
|
561785
561820
|
} catch {
|
|
561786
561821
|
return null;
|
|
561787
561822
|
}
|
|
@@ -563770,7 +563805,7 @@ __export(exports_print, {
|
|
|
563770
563805
|
createCanUseToolWithPermissionPrompt: () => createCanUseToolWithPermissionPrompt,
|
|
563771
563806
|
canBatchWith: () => canBatchWith
|
|
563772
563807
|
});
|
|
563773
|
-
import { readFile as
|
|
563808
|
+
import { readFile as readFile54, stat as stat51 } from "fs/promises";
|
|
563774
563809
|
import { dirname as dirname66 } from "path";
|
|
563775
563810
|
import { cwd as cwd2 } from "process";
|
|
563776
563811
|
import { randomUUID as randomUUID51 } from "crypto";
|
|
@@ -565120,7 +565155,7 @@ ${m2.text}
|
|
|
565120
565155
|
const normalizedPath = expandPath(message.request.path);
|
|
565121
565156
|
const diskMtime = Math.floor((await stat51(normalizedPath)).mtimeMs);
|
|
565122
565157
|
if (diskMtime <= message.request.mtime) {
|
|
565123
|
-
const raw = await
|
|
565158
|
+
const raw = await readFile54(normalizedPath, "utf-8");
|
|
565124
565159
|
const content = (raw.charCodeAt(0) === 65279 ? raw.slice(1) : raw).replaceAll(`\r
|
|
565125
565160
|
`, `
|
|
565126
565161
|
`);
|
|
@@ -567698,16 +567733,16 @@ __export(exports_claudeDesktop, {
|
|
|
567698
567733
|
readClaudeDesktopMcpServers: () => readClaudeDesktopMcpServers,
|
|
567699
567734
|
getClaudeDesktopConfigPath: () => getClaudeDesktopConfigPath
|
|
567700
567735
|
});
|
|
567701
|
-
import { readdir as readdir30, readFile as
|
|
567736
|
+
import { readdir as readdir30, readFile as readFile55, stat as stat52 } from "fs/promises";
|
|
567702
567737
|
import { homedir as homedir40 } from "os";
|
|
567703
|
-
import { join as
|
|
567738
|
+
import { join as join156 } from "path";
|
|
567704
567739
|
async function getClaudeDesktopConfigPath() {
|
|
567705
567740
|
const platform6 = getPlatform();
|
|
567706
567741
|
if (!SUPPORTED_PLATFORMS.includes(platform6)) {
|
|
567707
567742
|
throw new Error(`Unsupported platform: ${platform6} - Claude Desktop integration only works on macOS and WSL.`);
|
|
567708
567743
|
}
|
|
567709
567744
|
if (platform6 === "macos") {
|
|
567710
|
-
return
|
|
567745
|
+
return join156(homedir40(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
|
|
567711
567746
|
}
|
|
567712
567747
|
const windowsHome = process.env.USERPROFILE ? process.env.USERPROFILE.replace(/\\/g, "/") : null;
|
|
567713
567748
|
if (windowsHome) {
|
|
@@ -567726,7 +567761,7 @@ async function getClaudeDesktopConfigPath() {
|
|
|
567726
567761
|
if (user.name === "Public" || user.name === "Default" || user.name === "Default User" || user.name === "All Users") {
|
|
567727
567762
|
continue;
|
|
567728
567763
|
}
|
|
567729
|
-
const potentialConfigPath =
|
|
567764
|
+
const potentialConfigPath = join156(usersDir, user.name, "AppData", "Roaming", "Claude", "claude_desktop_config.json");
|
|
567730
567765
|
try {
|
|
567731
567766
|
await stat52(potentialConfigPath);
|
|
567732
567767
|
return potentialConfigPath;
|
|
@@ -567746,7 +567781,7 @@ async function readClaudeDesktopMcpServers() {
|
|
|
567746
567781
|
const configPath = await getClaudeDesktopConfigPath();
|
|
567747
567782
|
let configContent;
|
|
567748
567783
|
try {
|
|
567749
|
-
configContent = await
|
|
567784
|
+
configContent = await readFile55(configPath, { encoding: "utf8" });
|
|
567750
567785
|
} catch (e) {
|
|
567751
567786
|
const code = getErrnoCode(e);
|
|
567752
567787
|
if (code === "ENOENT") {
|
|
@@ -568635,12 +568670,12 @@ __export(exports_install, {
|
|
|
568635
568670
|
install: () => install
|
|
568636
568671
|
});
|
|
568637
568672
|
import { homedir as homedir41 } from "node:os";
|
|
568638
|
-
import { join as
|
|
568673
|
+
import { join as join157 } from "node:path";
|
|
568639
568674
|
function getInstallationPath2() {
|
|
568640
568675
|
const isWindows2 = env4.platform === "win32";
|
|
568641
568676
|
const homeDir = homedir41();
|
|
568642
568677
|
if (isWindows2) {
|
|
568643
|
-
const windowsPath =
|
|
568678
|
+
const windowsPath = join157(homeDir, ".local", "bin", "claude.exe");
|
|
568644
568679
|
return windowsPath.replace(/\//g, "\\");
|
|
568645
568680
|
}
|
|
568646
568681
|
return "~/.local/bin/claude";
|
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.
|
|
8
|
-
BUILD_TIME: "2026-06-23T13:
|
|
7
|
+
VERSION: "0.1.36",
|
|
8
|
+
BUILD_TIME: "2026-06-23T13:32:30.386Z",
|
|
9
9
|
PACKAGE_URL: "@funnycode/myclaude",
|
|
10
10
|
NATIVE_PACKAGE_URL: "@funnycode/myclaude",
|
|
11
11
|
VERSION_CHANGELOG: '',
|
|
@@ -554538,61 +554538,6 @@ var init_codegraphCheck = __esm(() => {
|
|
|
554538
554538
|
init_execFileNoThrow();
|
|
554539
554539
|
});
|
|
554540
554540
|
|
|
554541
|
-
// src/plugins/bundled/eccMarketplace.ts
|
|
554542
|
-
async function ensureEccMarketplaceRegistered() {
|
|
554543
|
-
try {
|
|
554544
|
-
const existing = await loadKnownMarketplacesConfig();
|
|
554545
|
-
if (existing["ecc"]) {
|
|
554546
|
-
logForDebugging("ECC marketplace already registered, skipping");
|
|
554547
|
-
return true;
|
|
554548
|
-
}
|
|
554549
|
-
const result = await addMarketplaceSource({
|
|
554550
|
-
source: "git",
|
|
554551
|
-
url: ECC_MARKETPLACE_URL
|
|
554552
|
-
});
|
|
554553
|
-
logForDebugging(`ECC marketplace registered as '${result.name}' (materialized: ${!result.alreadyMaterialized})`);
|
|
554554
|
-
return true;
|
|
554555
|
-
} catch (error49) {
|
|
554556
|
-
logForDebugging(`Failed to register ECC marketplace: ${error49}`, {
|
|
554557
|
-
level: "warn"
|
|
554558
|
-
});
|
|
554559
|
-
return false;
|
|
554560
|
-
}
|
|
554561
|
-
}
|
|
554562
|
-
var ECC_MARKETPLACE_URL = "https://github.com/affaan-m/ECC.git";
|
|
554563
|
-
var init_eccMarketplace = __esm(() => {
|
|
554564
|
-
init_debug();
|
|
554565
|
-
init_marketplaceManager();
|
|
554566
|
-
});
|
|
554567
|
-
|
|
554568
|
-
// src/plugins/bundled/index.ts
|
|
554569
|
-
function initBuiltinPlugins() {
|
|
554570
|
-
registerBuiltinPlugin({
|
|
554571
|
-
name: "codegraph",
|
|
554572
|
-
description: "Semantic code intelligence — surgical context, fewer tool calls",
|
|
554573
|
-
version: "1.0.0",
|
|
554574
|
-
defaultEnabled: false,
|
|
554575
|
-
isAvailable: () => {
|
|
554576
|
-
isCodeGraphInstalled().catch(() => {});
|
|
554577
|
-
return false;
|
|
554578
|
-
},
|
|
554579
|
-
mcpServers: {
|
|
554580
|
-
codegraph: {
|
|
554581
|
-
command: "codegraph",
|
|
554582
|
-
args: ["mcp"]
|
|
554583
|
-
}
|
|
554584
|
-
}
|
|
554585
|
-
});
|
|
554586
|
-
}
|
|
554587
|
-
async function initSeedMarketplaces() {
|
|
554588
|
-
await ensureEccMarketplaceRegistered();
|
|
554589
|
-
}
|
|
554590
|
-
var init_bundled = __esm(() => {
|
|
554591
|
-
init_builtinPlugins();
|
|
554592
|
-
init_codegraphCheck();
|
|
554593
|
-
init_eccMarketplace();
|
|
554594
|
-
});
|
|
554595
|
-
|
|
554596
554541
|
// src/services/plugins/pluginCliCommands.ts
|
|
554597
554542
|
function handlePluginCommandError(error49, command8, plugin2) {
|
|
554598
554543
|
logError2(error49);
|
|
@@ -554753,6 +554698,96 @@ var init_pluginCliCommands = __esm(() => {
|
|
|
554753
554698
|
init_pluginOperations();
|
|
554754
554699
|
});
|
|
554755
554700
|
|
|
554701
|
+
// src/plugins/bundled/eccMarketplace.ts
|
|
554702
|
+
import { join as join150 } from "path";
|
|
554703
|
+
import { readFile as readFile51 } from "fs/promises";
|
|
554704
|
+
async function ensureEccMarketplaceRegistered() {
|
|
554705
|
+
try {
|
|
554706
|
+
const result = await addMarketplaceSource({
|
|
554707
|
+
source: "git",
|
|
554708
|
+
url: ECC_MARKETPLACE_URL
|
|
554709
|
+
});
|
|
554710
|
+
const eccName = result.name;
|
|
554711
|
+
logForDebugging(`ECC marketplace registered as '${eccName}' (materialized: ${!result.alreadyMaterialized})`);
|
|
554712
|
+
await installEccPlugins(eccName);
|
|
554713
|
+
return true;
|
|
554714
|
+
} catch (error49) {
|
|
554715
|
+
logForDebugging(`Failed to register ECC marketplace: ${error49}`, {
|
|
554716
|
+
level: "warn"
|
|
554717
|
+
});
|
|
554718
|
+
return false;
|
|
554719
|
+
}
|
|
554720
|
+
}
|
|
554721
|
+
async function installEccPlugins(marketplaceName) {
|
|
554722
|
+
try {
|
|
554723
|
+
const cacheDir = getMarketplacesCacheDir();
|
|
554724
|
+
const marketplaceDir = join150(cacheDir, marketplaceName);
|
|
554725
|
+
const marketplaceJsonPath = join150(marketplaceDir, ".claude-plugin", "marketplace.json");
|
|
554726
|
+
let marketplaceData;
|
|
554727
|
+
try {
|
|
554728
|
+
const content = await readFile51(marketplaceJsonPath, "utf-8");
|
|
554729
|
+
marketplaceData = JSON.parse(content);
|
|
554730
|
+
} catch {
|
|
554731
|
+
logForDebugging("ECC marketplace.json not found yet, skipping auto-install");
|
|
554732
|
+
return;
|
|
554733
|
+
}
|
|
554734
|
+
const plugins = marketplaceData?.plugins ?? [];
|
|
554735
|
+
if (plugins.length === 0) {
|
|
554736
|
+
logForDebugging("No plugins found in ECC marketplace");
|
|
554737
|
+
return;
|
|
554738
|
+
}
|
|
554739
|
+
let installed = 0;
|
|
554740
|
+
for (const plugin2 of plugins) {
|
|
554741
|
+
try {
|
|
554742
|
+
const pluginId = `${plugin2.name}@${marketplaceName}`;
|
|
554743
|
+
await installPlugin(pluginId, "user");
|
|
554744
|
+
installed++;
|
|
554745
|
+
} catch (pluginError) {
|
|
554746
|
+
logForDebugging(`Failed to auto-install ECC plugin '${plugin2.name}': ${pluginError}`, { level: "warn" });
|
|
554747
|
+
}
|
|
554748
|
+
}
|
|
554749
|
+
logForDebugging(`Auto-installed ${installed}/${plugins.length} ECC plugins`);
|
|
554750
|
+
} catch (error49) {
|
|
554751
|
+
logForDebugging(`Failed to auto-install ECC plugins: ${error49}`, {
|
|
554752
|
+
level: "warn"
|
|
554753
|
+
});
|
|
554754
|
+
}
|
|
554755
|
+
}
|
|
554756
|
+
var ECC_MARKETPLACE_URL = "https://github.com/affaan-m/ECC.git";
|
|
554757
|
+
var init_eccMarketplace = __esm(() => {
|
|
554758
|
+
init_debug();
|
|
554759
|
+
init_marketplaceManager();
|
|
554760
|
+
init_pluginCliCommands();
|
|
554761
|
+
});
|
|
554762
|
+
|
|
554763
|
+
// src/plugins/bundled/index.ts
|
|
554764
|
+
function initBuiltinPlugins() {
|
|
554765
|
+
registerBuiltinPlugin({
|
|
554766
|
+
name: "codegraph",
|
|
554767
|
+
description: "Semantic code intelligence — surgical context, fewer tool calls",
|
|
554768
|
+
version: "1.0.0",
|
|
554769
|
+
defaultEnabled: false,
|
|
554770
|
+
isAvailable: () => {
|
|
554771
|
+
isCodeGraphInstalled().catch(() => {});
|
|
554772
|
+
return false;
|
|
554773
|
+
},
|
|
554774
|
+
mcpServers: {
|
|
554775
|
+
codegraph: {
|
|
554776
|
+
command: "codegraph",
|
|
554777
|
+
args: ["mcp"]
|
|
554778
|
+
}
|
|
554779
|
+
}
|
|
554780
|
+
});
|
|
554781
|
+
}
|
|
554782
|
+
async function initSeedMarketplaces() {
|
|
554783
|
+
await ensureEccMarketplaceRegistered();
|
|
554784
|
+
}
|
|
554785
|
+
var init_bundled = __esm(() => {
|
|
554786
|
+
init_builtinPlugins();
|
|
554787
|
+
init_codegraphCheck();
|
|
554788
|
+
init_eccMarketplace();
|
|
554789
|
+
});
|
|
554790
|
+
|
|
554756
554791
|
// src/skills/bundled/batch.ts
|
|
554757
554792
|
function buildPrompt(instruction) {
|
|
554758
554793
|
return `# Batch: Parallel Work Orchestration
|
|
@@ -557398,12 +557433,12 @@ var init_createDirectConnectSession = __esm(() => {
|
|
|
557398
557433
|
});
|
|
557399
557434
|
|
|
557400
557435
|
// src/utils/errorLogSink.ts
|
|
557401
|
-
import { dirname as dirname64, join as
|
|
557436
|
+
import { dirname as dirname64, join as join151 } from "path";
|
|
557402
557437
|
function getErrorsPath() {
|
|
557403
|
-
return
|
|
557438
|
+
return join151(CACHE_PATHS.errors(), DATE + ".jsonl");
|
|
557404
557439
|
}
|
|
557405
557440
|
function getMCPLogsPath(serverName) {
|
|
557406
|
-
return
|
|
557441
|
+
return join151(CACHE_PATHS.mcpLogs(serverName), DATE + ".jsonl");
|
|
557407
557442
|
}
|
|
557408
557443
|
function createJsonlWriter(options) {
|
|
557409
557444
|
const writer = createBufferedWriter(options);
|
|
@@ -557746,7 +557781,7 @@ var init_sessionMemory = __esm(() => {
|
|
|
557746
557781
|
// src/utils/iTermBackup.ts
|
|
557747
557782
|
import { copyFile as copyFile12, stat as stat49 } from "fs/promises";
|
|
557748
557783
|
import { homedir as homedir39 } from "os";
|
|
557749
|
-
import { join as
|
|
557784
|
+
import { join as join152 } from "path";
|
|
557750
557785
|
function markITerm2SetupComplete() {
|
|
557751
557786
|
saveGlobalConfig((current) => ({
|
|
557752
557787
|
...current,
|
|
@@ -557761,7 +557796,7 @@ function getIterm2RecoveryInfo() {
|
|
|
557761
557796
|
};
|
|
557762
557797
|
}
|
|
557763
557798
|
function getITerm2PlistPath() {
|
|
557764
|
-
return
|
|
557799
|
+
return join152(homedir39(), "Library", "Preferences", "com.googlecode.iterm2.plist");
|
|
557765
557800
|
}
|
|
557766
557801
|
async function checkAndRestoreITerm2Backup() {
|
|
557767
557802
|
const { inProgress, backupPath } = getIterm2RecoveryInfo();
|
|
@@ -561126,7 +561161,7 @@ var init_idleTimeout = __esm(() => {
|
|
|
561126
561161
|
// src/bridge/inboundAttachments.ts
|
|
561127
561162
|
import { randomUUID as randomUUID48 } from "crypto";
|
|
561128
561163
|
import { mkdir as mkdir42, writeFile as writeFile46 } from "fs/promises";
|
|
561129
|
-
import { basename as basename58, join as
|
|
561164
|
+
import { basename as basename58, join as join153 } from "path";
|
|
561130
561165
|
function debug3(msg) {
|
|
561131
561166
|
logForDebugging(`[bridge:inbound-attach] ${msg}`);
|
|
561132
561167
|
}
|
|
@@ -561142,7 +561177,7 @@ function sanitizeFileName(name) {
|
|
|
561142
561177
|
return base2 || "attachment";
|
|
561143
561178
|
}
|
|
561144
561179
|
function uploadsDir() {
|
|
561145
|
-
return
|
|
561180
|
+
return join153(getClaudeConfigHomeDir(), "uploads", getSessionId());
|
|
561146
561181
|
}
|
|
561147
561182
|
async function resolveOne(att) {
|
|
561148
561183
|
const token = getBridgeAccessToken();
|
|
@@ -561171,7 +561206,7 @@ async function resolveOne(att) {
|
|
|
561171
561206
|
const safeName = sanitizeFileName(att.file_name);
|
|
561172
561207
|
const prefix = (att.file_uuid.slice(0, 8) || randomUUID48().slice(0, 8)).replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
561173
561208
|
const dir = uploadsDir();
|
|
561174
|
-
const outPath =
|
|
561209
|
+
const outPath = join153(dir, `${prefix}-${safeName}`);
|
|
561175
561210
|
try {
|
|
561176
561211
|
await mkdir42(dir, { recursive: true });
|
|
561177
561212
|
await writeFile46(outPath, data);
|
|
@@ -561270,11 +561305,11 @@ var init_sessionUrl = __esm(() => {
|
|
|
561270
561305
|
});
|
|
561271
561306
|
|
|
561272
561307
|
// src/utils/plugins/zipCacheAdapters.ts
|
|
561273
|
-
import { readFile as
|
|
561274
|
-
import { join as
|
|
561308
|
+
import { readFile as readFile52 } from "fs/promises";
|
|
561309
|
+
import { join as join154 } from "path";
|
|
561275
561310
|
async function readZipCacheKnownMarketplaces() {
|
|
561276
561311
|
try {
|
|
561277
|
-
const content = await
|
|
561312
|
+
const content = await readFile52(getZipCacheKnownMarketplacesPath(), "utf-8");
|
|
561278
561313
|
const parsed = KnownMarketplacesFileSchema().safeParse(jsonParse(content));
|
|
561279
561314
|
if (!parsed.success) {
|
|
561280
561315
|
logForDebugging(`Invalid known_marketplaces.json in zip cache: ${parsed.error.message}`, { level: "error" });
|
|
@@ -561296,18 +561331,18 @@ async function saveMarketplaceJsonToZipCache(marketplaceName, installLocation) {
|
|
|
561296
561331
|
const content = await readMarketplaceJsonContent(installLocation);
|
|
561297
561332
|
if (content !== null) {
|
|
561298
561333
|
const relPath = getMarketplaceJsonRelativePath(marketplaceName);
|
|
561299
|
-
await atomicWriteToZipCache(
|
|
561334
|
+
await atomicWriteToZipCache(join154(zipCachePath, relPath), content);
|
|
561300
561335
|
}
|
|
561301
561336
|
}
|
|
561302
561337
|
async function readMarketplaceJsonContent(dir) {
|
|
561303
561338
|
const candidates = [
|
|
561304
|
-
|
|
561305
|
-
|
|
561339
|
+
join154(dir, ".claude-plugin", "marketplace.json"),
|
|
561340
|
+
join154(dir, "marketplace.json"),
|
|
561306
561341
|
dir
|
|
561307
561342
|
];
|
|
561308
561343
|
for (const candidate of candidates) {
|
|
561309
561344
|
try {
|
|
561310
|
-
return await
|
|
561345
|
+
return await readFile52(candidate, "utf-8");
|
|
561311
561346
|
} catch {}
|
|
561312
561347
|
}
|
|
561313
561348
|
return null;
|
|
@@ -561760,10 +561795,10 @@ __export(exports_bridgePointer, {
|
|
|
561760
561795
|
clearBridgePointer: () => clearBridgePointer,
|
|
561761
561796
|
BRIDGE_POINTER_TTL_MS: () => BRIDGE_POINTER_TTL_MS
|
|
561762
561797
|
});
|
|
561763
|
-
import { mkdir as mkdir43, readFile as
|
|
561764
|
-
import { dirname as dirname65, join as
|
|
561798
|
+
import { mkdir as mkdir43, readFile as readFile53, stat as stat50, unlink as unlink22, writeFile as writeFile47 } from "fs/promises";
|
|
561799
|
+
import { dirname as dirname65, join as join155 } from "path";
|
|
561765
561800
|
function getBridgePointerPath(dir) {
|
|
561766
|
-
return
|
|
561801
|
+
return join155(getProjectsDir(), sanitizePath2(dir), "bridge-pointer.json");
|
|
561767
561802
|
}
|
|
561768
561803
|
async function writeBridgePointer(dir, pointer) {
|
|
561769
561804
|
const path24 = getBridgePointerPath(dir);
|
|
@@ -561781,7 +561816,7 @@ async function readBridgePointer(dir) {
|
|
|
561781
561816
|
let mtimeMs;
|
|
561782
561817
|
try {
|
|
561783
561818
|
mtimeMs = (await stat50(path24)).mtimeMs;
|
|
561784
|
-
raw = await
|
|
561819
|
+
raw = await readFile53(path24, "utf8");
|
|
561785
561820
|
} catch {
|
|
561786
561821
|
return null;
|
|
561787
561822
|
}
|
|
@@ -563770,7 +563805,7 @@ __export(exports_print, {
|
|
|
563770
563805
|
createCanUseToolWithPermissionPrompt: () => createCanUseToolWithPermissionPrompt,
|
|
563771
563806
|
canBatchWith: () => canBatchWith
|
|
563772
563807
|
});
|
|
563773
|
-
import { readFile as
|
|
563808
|
+
import { readFile as readFile54, stat as stat51 } from "fs/promises";
|
|
563774
563809
|
import { dirname as dirname66 } from "path";
|
|
563775
563810
|
import { cwd as cwd2 } from "process";
|
|
563776
563811
|
import { randomUUID as randomUUID51 } from "crypto";
|
|
@@ -565120,7 +565155,7 @@ ${m2.text}
|
|
|
565120
565155
|
const normalizedPath = expandPath(message.request.path);
|
|
565121
565156
|
const diskMtime = Math.floor((await stat51(normalizedPath)).mtimeMs);
|
|
565122
565157
|
if (diskMtime <= message.request.mtime) {
|
|
565123
|
-
const raw = await
|
|
565158
|
+
const raw = await readFile54(normalizedPath, "utf-8");
|
|
565124
565159
|
const content = (raw.charCodeAt(0) === 65279 ? raw.slice(1) : raw).replaceAll(`\r
|
|
565125
565160
|
`, `
|
|
565126
565161
|
`);
|
|
@@ -567698,16 +567733,16 @@ __export(exports_claudeDesktop, {
|
|
|
567698
567733
|
readClaudeDesktopMcpServers: () => readClaudeDesktopMcpServers,
|
|
567699
567734
|
getClaudeDesktopConfigPath: () => getClaudeDesktopConfigPath
|
|
567700
567735
|
});
|
|
567701
|
-
import { readdir as readdir30, readFile as
|
|
567736
|
+
import { readdir as readdir30, readFile as readFile55, stat as stat52 } from "fs/promises";
|
|
567702
567737
|
import { homedir as homedir40 } from "os";
|
|
567703
|
-
import { join as
|
|
567738
|
+
import { join as join156 } from "path";
|
|
567704
567739
|
async function getClaudeDesktopConfigPath() {
|
|
567705
567740
|
const platform6 = getPlatform();
|
|
567706
567741
|
if (!SUPPORTED_PLATFORMS.includes(platform6)) {
|
|
567707
567742
|
throw new Error(`Unsupported platform: ${platform6} - Claude Desktop integration only works on macOS and WSL.`);
|
|
567708
567743
|
}
|
|
567709
567744
|
if (platform6 === "macos") {
|
|
567710
|
-
return
|
|
567745
|
+
return join156(homedir40(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
|
|
567711
567746
|
}
|
|
567712
567747
|
const windowsHome = process.env.USERPROFILE ? process.env.USERPROFILE.replace(/\\/g, "/") : null;
|
|
567713
567748
|
if (windowsHome) {
|
|
@@ -567726,7 +567761,7 @@ async function getClaudeDesktopConfigPath() {
|
|
|
567726
567761
|
if (user.name === "Public" || user.name === "Default" || user.name === "Default User" || user.name === "All Users") {
|
|
567727
567762
|
continue;
|
|
567728
567763
|
}
|
|
567729
|
-
const potentialConfigPath =
|
|
567764
|
+
const potentialConfigPath = join156(usersDir, user.name, "AppData", "Roaming", "Claude", "claude_desktop_config.json");
|
|
567730
567765
|
try {
|
|
567731
567766
|
await stat52(potentialConfigPath);
|
|
567732
567767
|
return potentialConfigPath;
|
|
@@ -567746,7 +567781,7 @@ async function readClaudeDesktopMcpServers() {
|
|
|
567746
567781
|
const configPath = await getClaudeDesktopConfigPath();
|
|
567747
567782
|
let configContent;
|
|
567748
567783
|
try {
|
|
567749
|
-
configContent = await
|
|
567784
|
+
configContent = await readFile55(configPath, { encoding: "utf8" });
|
|
567750
567785
|
} catch (e) {
|
|
567751
567786
|
const code = getErrnoCode(e);
|
|
567752
567787
|
if (code === "ENOENT") {
|
|
@@ -568635,12 +568670,12 @@ __export(exports_install, {
|
|
|
568635
568670
|
install: () => install
|
|
568636
568671
|
});
|
|
568637
568672
|
import { homedir as homedir41 } from "node:os";
|
|
568638
|
-
import { join as
|
|
568673
|
+
import { join as join157 } from "node:path";
|
|
568639
568674
|
function getInstallationPath2() {
|
|
568640
568675
|
const isWindows2 = env4.platform === "win32";
|
|
568641
568676
|
const homeDir = homedir41();
|
|
568642
568677
|
if (isWindows2) {
|
|
568643
|
-
const windowsPath =
|
|
568678
|
+
const windowsPath = join157(homeDir, ".local", "bin", "claude.exe");
|
|
568644
568679
|
return windowsPath.replace(/\//g, "\\");
|
|
568645
568680
|
}
|
|
568646
568681
|
return "~/.local/bin/claude";
|