snow-flow 8.37.27 → 8.38.1
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/.snow-code/agent/deployment-specialist.md +346 -0
- package/.snow-code/agent/orchestrator.md +286 -0
- package/.snow-code/agent/risk-assessor.md +454 -0
- package/.snow-code/agent/solution-architect.md +582 -0
- package/.snow-code/agent/validator.md +503 -0
- package/.snow-code/opencode.json +49 -0
- package/README.md +16 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +104 -266
- package/dist/cli.js.map +1 -1
- package/dist/utils/config-cache.js +6 -6
- package/dist/utils/config-cache.js.map +1 -1
- package/dist/utils/sync-mcp-configs.d.ts +7 -5
- package/dist/utils/sync-mcp-configs.d.ts.map +1 -1
- package/dist/utils/sync-mcp-configs.js +19 -74
- package/dist/utils/sync-mcp-configs.js.map +1 -1
- package/package.json +2 -3
- package/scripts/check-binary-updates.js +0 -169
- package/scripts/check-npm-version.js +0 -92
- package/scripts/classify-all-tools.ts +0 -446
- package/scripts/classify-edge-cases.ts +0 -275
- package/scripts/classify-operations-tools.sh +0 -96
- package/scripts/cleanup-mcp-servers.js +0 -115
- package/scripts/diagnose-mcp.js +0 -299
- package/scripts/generate-mcp-config.js +0 -45
- package/scripts/mcp-server-manager.sh +0 -320
- package/scripts/postinstall.js +0 -75
- package/scripts/reset-mcp-servers.js +0 -266
- package/scripts/safe-mcp-cleanup.js +0 -151
- package/scripts/setup-mcp.js +0 -106
- package/scripts/start-mcp-proper.js +0 -76
- package/scripts/start-snowcode.sh +0 -123
- package/scripts/start-sysprops-mcp.js +0 -43
- package/scripts/sync-snow-code-version.js +0 -74
- package/scripts/test-auth-flow.js +0 -172
- package/scripts/test-auth-location-fix.js +0 -84
- package/scripts/test-mcp-manual.js +0 -140
- package/scripts/test-todowrite-timeout.js +0 -108
- package/scripts/update-dependencies.js +0 -90
- package/scripts/update-mcp-config.js +0 -96
- package/scripts/update-snow-code.js +0 -146
- package/scripts/verify-snowcode-fork.sh +0 -141
- package/templates/snow-code-package.json +0 -3
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Sync MCP Configuration Files
|
|
4
|
-
* Ensures .
|
|
4
|
+
* Ensures .snow-code/config.json is in sync with .mcp.json
|
|
5
5
|
*
|
|
6
6
|
* This is critical for enterprise MCP server availability because:
|
|
7
7
|
* - snow-code auth login updates .mcp.json
|
|
8
|
-
* -
|
|
8
|
+
* - snow-code reads .snow-code/config.json or .mcp.json
|
|
9
9
|
* - Without sync, enterprise server won't be available in swarm command
|
|
10
|
+
*
|
|
11
|
+
* Note: .claude/ directory is no longer used - snow-code is the only supported client
|
|
10
12
|
*/
|
|
11
13
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -20,9 +22,9 @@ const path_1 = __importDefault(require("path"));
|
|
|
20
22
|
const logger_js_1 = require("./logger.js");
|
|
21
23
|
const logger = new logger_js_1.Logger('mcp-config-sync');
|
|
22
24
|
/**
|
|
23
|
-
* Sync .mcp.json to .
|
|
25
|
+
* Sync .mcp.json to .snow-code/config.json
|
|
24
26
|
*
|
|
25
|
-
* This ensures
|
|
27
|
+
* This ensures snow-code always sees the same MCP servers as configured in .mcp.json
|
|
26
28
|
* Particularly important for enterprise server configuration during auth flow
|
|
27
29
|
*
|
|
28
30
|
* @param projectRoot - Project root directory (defaults to current working directory)
|
|
@@ -30,7 +32,6 @@ const logger = new logger_js_1.Logger('mcp-config-sync');
|
|
|
30
32
|
async function syncMcpConfigs(projectRoot = process.cwd()) {
|
|
31
33
|
try {
|
|
32
34
|
const mcpJsonPath = path_1.default.join(projectRoot, '.mcp.json');
|
|
33
|
-
const claudeMcpConfigPath = path_1.default.join(projectRoot, '.claude', 'mcp-config.json');
|
|
34
35
|
// Check if .mcp.json exists
|
|
35
36
|
if (!(0, fs_1.existsSync)(mcpJsonPath)) {
|
|
36
37
|
logger.debug('.mcp.json does not exist, skipping sync');
|
|
@@ -39,70 +40,17 @@ async function syncMcpConfigs(projectRoot = process.cwd()) {
|
|
|
39
40
|
// Read .mcp.json
|
|
40
41
|
const mcpJsonContent = await promises_1.default.readFile(mcpJsonPath, 'utf-8');
|
|
41
42
|
const mcpConfig = JSON.parse(mcpJsonContent);
|
|
42
|
-
//
|
|
43
|
-
const claudeDir = path_1.default.dirname(claudeMcpConfigPath);
|
|
44
|
-
if (!(0, fs_1.existsSync)(claudeDir)) {
|
|
45
|
-
await promises_1.default.mkdir(claudeDir, { recursive: true });
|
|
46
|
-
logger.info(`Created .claude directory: ${claudeDir}`);
|
|
47
|
-
}
|
|
48
|
-
// Convert .mcp.json format to .claude/mcp-config.json format
|
|
49
|
-
// .mcp.json uses { mcp: { ... } } (snow-code format)
|
|
50
|
-
// .claude/mcp-config.json uses { mcpServers: { ... } } (Claude Code format)
|
|
51
|
-
const claudeConfig = {
|
|
52
|
-
mcpServers: {}
|
|
53
|
-
};
|
|
54
|
-
// Copy all servers from .mcp.json to claude config
|
|
55
|
-
// Support both old (mcpServers) and new (mcp) format for backwards compatibility
|
|
43
|
+
// Get servers from .mcp.json (support both formats)
|
|
56
44
|
const servers = mcpConfig.mcp || mcpConfig.mcpServers || {};
|
|
57
|
-
|
|
58
|
-
for (const [serverName, serverConfig] of Object.entries(servers)) {
|
|
59
|
-
const config = serverConfig;
|
|
60
|
-
// Convert to Claude Code format
|
|
61
|
-
// Claude Code expects: command, args, env (or environment)
|
|
62
|
-
// New format uses: type, command (array), environment
|
|
63
|
-
if (config.type === 'local') {
|
|
64
|
-
// New format: command is an array like ["node", "/path/to/server.js"]
|
|
65
|
-
const command = Array.isArray(config.command) ? config.command : [config.command];
|
|
66
|
-
claudeConfig.mcpServers[serverName] = {
|
|
67
|
-
command: command[0], // "node"
|
|
68
|
-
args: command.slice(1), // ["/path/to/server.js"]
|
|
69
|
-
env: config.environment || config.env || {},
|
|
70
|
-
...(config.enabled !== undefined && { enabled: config.enabled })
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
else if (config.type === 'remote') {
|
|
74
|
-
// Remote servers (SSE)
|
|
75
|
-
claudeConfig.mcpServers[serverName] = {
|
|
76
|
-
url: config.url,
|
|
77
|
-
env: config.environment || config.env || {},
|
|
78
|
-
...(config.enabled !== undefined && { enabled: config.enabled })
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
// Fallback - copy as-is but ensure env key exists
|
|
83
|
-
// Remove description and _comment fields
|
|
84
|
-
const { description, _comment, ...cleanConfig } = config;
|
|
85
|
-
claudeConfig.mcpServers[serverName] = {
|
|
86
|
-
...cleanConfig,
|
|
87
|
-
env: config.environment || config.env || {}
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// Write to .claude/mcp-config.json
|
|
93
|
-
await promises_1.default.writeFile(claudeMcpConfigPath, JSON.stringify(claudeConfig, null, 2), 'utf-8');
|
|
94
|
-
logger.info(`✅ Synced .mcp.json → .claude/mcp-config.json`);
|
|
95
|
-
// 🔥 ALSO sync to .snow-code/config.json and .snow-code/snow-code.json
|
|
96
|
-
// These are used by snow-code CLI for MCP server discovery
|
|
45
|
+
// Sync to .snow-code/config.json (snow-code reads this)
|
|
97
46
|
const snowCodeDir = path_1.default.join(projectRoot, '.snow-code');
|
|
98
47
|
const snowCodeConfigPath = path_1.default.join(snowCodeDir, 'config.json');
|
|
99
|
-
const snowCodeJsonPath = path_1.default.join(snowCodeDir, 'snow-code.json');
|
|
100
48
|
// Ensure .snow-code directory exists
|
|
101
49
|
if (!(0, fs_1.existsSync)(snowCodeDir)) {
|
|
102
50
|
await promises_1.default.mkdir(snowCodeDir, { recursive: true });
|
|
103
51
|
logger.info(`Created .snow-code directory: ${snowCodeDir}`);
|
|
104
52
|
}
|
|
105
|
-
// Create snow-code format config (uses 'mcp' key
|
|
53
|
+
// Create snow-code format config (uses 'mcp' key)
|
|
106
54
|
const snowCodeConfig = {
|
|
107
55
|
"$schema": "https://opencode.ai/config.json",
|
|
108
56
|
mcp: {}
|
|
@@ -111,14 +59,11 @@ async function syncMcpConfigs(projectRoot = process.cwd()) {
|
|
|
111
59
|
for (const [serverName, serverConfig] of Object.entries(servers)) {
|
|
112
60
|
snowCodeConfig.mcp[serverName] = serverConfig;
|
|
113
61
|
}
|
|
114
|
-
// Write to
|
|
62
|
+
// Write to .snow-code/config.json
|
|
115
63
|
await promises_1.default.writeFile(snowCodeConfigPath, JSON.stringify(snowCodeConfig, null, 2), 'utf-8');
|
|
116
|
-
await promises_1.default.writeFile(snowCodeJsonPath, JSON.stringify(snowCodeConfig, null, 2), 'utf-8');
|
|
117
64
|
logger.info(`✅ Synced .mcp.json → .snow-code/config.json`);
|
|
118
|
-
logger.info(`✅ Synced .mcp.json → .snow-code/snow-code.json`);
|
|
119
|
-
logger.debug(`Synced ${Object.keys(claudeConfig.mcpServers).length} MCP servers`);
|
|
120
65
|
// Log which servers are enabled
|
|
121
|
-
const enabledServers = Object.entries(
|
|
66
|
+
const enabledServers = Object.entries(servers)
|
|
122
67
|
.filter(([_, config]) => config.enabled !== false)
|
|
123
68
|
.map(([name]) => name);
|
|
124
69
|
if (enabledServers.length > 0) {
|
|
@@ -131,7 +76,7 @@ async function syncMcpConfigs(projectRoot = process.cwd()) {
|
|
|
131
76
|
}
|
|
132
77
|
}
|
|
133
78
|
/**
|
|
134
|
-
* Ensure .
|
|
79
|
+
* Ensure .snow-code/config.json exists and is synced with .mcp.json
|
|
135
80
|
* This is a convenience wrapper that creates the file if it doesn't exist
|
|
136
81
|
*
|
|
137
82
|
* @param projectRoot - Project root directory (defaults to current working directory)
|
|
@@ -142,14 +87,14 @@ async function ensureMcpConfigSync(projectRoot = process.cwd()) {
|
|
|
142
87
|
}
|
|
143
88
|
catch (error) {
|
|
144
89
|
// If sync fails, try to create a minimal config
|
|
145
|
-
const
|
|
146
|
-
if (!(0, fs_1.existsSync)(
|
|
147
|
-
logger.warn('Creating minimal .
|
|
148
|
-
const
|
|
149
|
-
if (!(0, fs_1.existsSync)(
|
|
150
|
-
await promises_1.default.mkdir(
|
|
90
|
+
const snowCodeConfigPath = path_1.default.join(projectRoot, '.snow-code', 'config.json');
|
|
91
|
+
if (!(0, fs_1.existsSync)(snowCodeConfigPath)) {
|
|
92
|
+
logger.warn('Creating minimal .snow-code/config.json');
|
|
93
|
+
const snowCodeDir = path_1.default.dirname(snowCodeConfigPath);
|
|
94
|
+
if (!(0, fs_1.existsSync)(snowCodeDir)) {
|
|
95
|
+
await promises_1.default.mkdir(snowCodeDir, { recursive: true });
|
|
151
96
|
}
|
|
152
|
-
await promises_1.default.writeFile(
|
|
97
|
+
await promises_1.default.writeFile(snowCodeConfigPath, JSON.stringify({ "$schema": "https://opencode.ai/config.json", mcp: {} }, null, 2), 'utf-8');
|
|
153
98
|
}
|
|
154
99
|
}
|
|
155
100
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-mcp-configs.js","sourceRoot":"","sources":["../../src/utils/sync-mcp-configs.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"sync-mcp-configs.js","sourceRoot":"","sources":["../../src/utils/sync-mcp-configs.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;AAiBH,wCAwDC;AAQD,kDAsBC;AArGD,2DAA6B;AAC7B,2BAAgC;AAChC,gDAAwB;AACxB,2CAAqC;AAErC,MAAM,MAAM,GAAG,IAAI,kBAAM,CAAC,iBAAiB,CAAC,CAAC;AAE7C;;;;;;;GAOG;AACI,KAAK,UAAU,cAAc,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IACtE,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAExD,4BAA4B;QAC5B,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,iBAAiB;QACjB,MAAM,cAAc,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAE7C,oDAAoD;QACpD,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC;QAE5D,wDAAwD;QACxD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACzD,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAEjE,qCAAqC;QACrC,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,MAAM,kBAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,iCAAiC,WAAW,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,kDAAkD;QAClD,MAAM,cAAc,GAAQ;YAC1B,SAAS,EAAE,iCAAiC;YAC5C,GAAG,EAAE,EAAE;SACR,CAAC;QAEF,mCAAmC;QACnC,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;QAChD,CAAC;QAED,kCAAkC;QAClC,MAAM,kBAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAEzF,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAE3D,gCAAgC;QAChC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aAC3C,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAgB,EAAE,EAAE,CAAE,MAAc,CAAC,OAAO,KAAK,KAAK,CAAC;aACzE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAEzB,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,oBAAoB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IAEH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,mBAAmB,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC3E,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,gDAAgD;QAChD,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;QAE/E,IAAI,CAAC,IAAA,eAAU,EAAC,kBAAkB,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YAEvD,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YACrD,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B,MAAM,kBAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,kBAAE,CAAC,SAAS,CAChB,kBAAkB,EAClB,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,iCAAiC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAClF,OAAO,CACR,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "snow-flow",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.38.1",
|
|
4
4
|
"description": "ServiceNow development with SnowCode - 75+ LLM providers (Claude, GPT, Gemini, Llama, Mistral, DeepSeek, Groq, Ollama) • 395 Optimized Tools • 2 MCP Servers • Multi-agent orchestration • Use ANY AI coding assistant (ML tools moved to Enterprise)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -11,11 +11,10 @@
|
|
|
11
11
|
"files": [
|
|
12
12
|
"dist/",
|
|
13
13
|
"bin/",
|
|
14
|
-
"scripts/",
|
|
15
|
-
"templates/",
|
|
16
14
|
"patches/",
|
|
17
15
|
".env.example",
|
|
18
16
|
".mcp.json.template",
|
|
17
|
+
".snow-code/",
|
|
19
18
|
"snow-code-config.example.json",
|
|
20
19
|
"themes/",
|
|
21
20
|
"README.md",
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Check for and install updated snow-code binary packages
|
|
5
|
-
* Runs at runtime to ensure users always have the latest binaries
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const { execSync } = require('child_process');
|
|
9
|
-
const fs = require('fs');
|
|
10
|
-
const path = require('path');
|
|
11
|
-
|
|
12
|
-
const BINARY_PACKAGES = [
|
|
13
|
-
'@groeimetai/snow-code-darwin-arm64',
|
|
14
|
-
'@groeimetai/snow-code-darwin-x64',
|
|
15
|
-
'@groeimetai/snow-code-linux-arm64',
|
|
16
|
-
'@groeimetai/snow-code-linux-x64',
|
|
17
|
-
'@groeimetai/snow-code-windows-x64'
|
|
18
|
-
];
|
|
19
|
-
|
|
20
|
-
async function getLatestVersionFromNPM(packageName) {
|
|
21
|
-
try {
|
|
22
|
-
const version = execSync(`npm view ${packageName} version 2>/dev/null`, {
|
|
23
|
-
encoding: 'utf8',
|
|
24
|
-
stdio: ['pipe', 'pipe', 'ignore'] // Suppress stderr
|
|
25
|
-
}).trim();
|
|
26
|
-
return version || null;
|
|
27
|
-
} catch (error) {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
async function getInstalledVersion(packageName) {
|
|
33
|
-
try {
|
|
34
|
-
const packageJsonPath = path.join(__dirname, '..', 'node_modules', packageName, 'package.json');
|
|
35
|
-
if (!fs.existsSync(packageJsonPath)) {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
39
|
-
return packageJson.version;
|
|
40
|
-
} catch (error) {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async function checkBinaryUpdates(options = {}) {
|
|
46
|
-
const { silent = false, autoUpdate = false } = options;
|
|
47
|
-
|
|
48
|
-
if (!silent) {
|
|
49
|
-
console.log('🔍 Checking for snow-code binary updates...\n');
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const updates = [];
|
|
53
|
-
const errors = [];
|
|
54
|
-
|
|
55
|
-
for (const packageName of BINARY_PACKAGES) {
|
|
56
|
-
try {
|
|
57
|
-
const [latest, installed] = await Promise.all([
|
|
58
|
-
getLatestVersionFromNPM(packageName),
|
|
59
|
-
getInstalledVersion(packageName)
|
|
60
|
-
]);
|
|
61
|
-
|
|
62
|
-
if (!latest) {
|
|
63
|
-
if (!silent) {
|
|
64
|
-
console.log(`⚠️ ${packageName}: Not available on npm`);
|
|
65
|
-
}
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (!installed) {
|
|
70
|
-
if (!silent) {
|
|
71
|
-
console.log(`📦 ${packageName}: Not installed (latest: ${latest})`);
|
|
72
|
-
}
|
|
73
|
-
updates.push({ package: packageName, from: null, to: latest });
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (installed !== latest) {
|
|
78
|
-
if (!silent) {
|
|
79
|
-
console.log(`🔄 ${packageName}: ${installed} → ${latest}`);
|
|
80
|
-
}
|
|
81
|
-
updates.push({ package: packageName, from: installed, to: latest });
|
|
82
|
-
} else {
|
|
83
|
-
if (!silent) {
|
|
84
|
-
console.log(`✅ ${packageName}: ${installed} (up to date)`);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
} catch (error) {
|
|
88
|
-
errors.push({ package: packageName, error: error.message });
|
|
89
|
-
if (!silent) {
|
|
90
|
-
console.log(`❌ ${packageName}: Error checking version`);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
console.log('');
|
|
96
|
-
|
|
97
|
-
if (updates.length === 0) {
|
|
98
|
-
if (!silent) {
|
|
99
|
-
console.log('✨ All binaries are up to date!\n');
|
|
100
|
-
}
|
|
101
|
-
return { updates: [], errors, updated: false };
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (!silent) {
|
|
105
|
-
console.log(`📥 Found ${updates.length} update(s) available\n`);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (autoUpdate) {
|
|
109
|
-
if (!silent) {
|
|
110
|
-
console.log('⚡ Auto-updating binaries...\n');
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
for (const { package: packageName, to } of updates) {
|
|
114
|
-
try {
|
|
115
|
-
if (!silent) {
|
|
116
|
-
console.log(` Installing ${packageName}@${to}...`);
|
|
117
|
-
}
|
|
118
|
-
execSync(`npm install --no-save --prefer-offline ${packageName}@${to}`, {
|
|
119
|
-
encoding: 'utf8',
|
|
120
|
-
stdio: silent ? 'ignore' : 'inherit'
|
|
121
|
-
});
|
|
122
|
-
} catch (error) {
|
|
123
|
-
errors.push({ package: packageName, error: error.message });
|
|
124
|
-
if (!silent) {
|
|
125
|
-
console.log(` ❌ Failed to install ${packageName}`);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if (!silent) {
|
|
131
|
-
console.log('\n✅ Binary updates completed!\n');
|
|
132
|
-
}
|
|
133
|
-
return { updates, errors, updated: true };
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// If not auto-updating, show instructions
|
|
137
|
-
if (!silent) {
|
|
138
|
-
console.log('To update binaries, run:\n');
|
|
139
|
-
console.log(' npm run update-binaries\n');
|
|
140
|
-
console.log('Or manually:');
|
|
141
|
-
for (const { package: packageName, to } of updates) {
|
|
142
|
-
console.log(` npm install ${packageName}@${to}`);
|
|
143
|
-
}
|
|
144
|
-
console.log('');
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return { updates, errors, updated: false };
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// CLI interface
|
|
151
|
-
if (require.main === module) {
|
|
152
|
-
const args = process.argv.slice(2);
|
|
153
|
-
const silent = args.includes('--silent') || args.includes('-s');
|
|
154
|
-
const autoUpdate = args.includes('--auto-update') || args.includes('-u');
|
|
155
|
-
|
|
156
|
-
checkBinaryUpdates({ silent, autoUpdate })
|
|
157
|
-
.then(result => {
|
|
158
|
-
if (result.errors.length > 0 && !silent) {
|
|
159
|
-
console.log(`⚠️ ${result.errors.length} error(s) occurred during check`);
|
|
160
|
-
}
|
|
161
|
-
process.exit(0);
|
|
162
|
-
})
|
|
163
|
-
.catch(error => {
|
|
164
|
-
console.error('❌ Failed to check binary updates:', error.message);
|
|
165
|
-
process.exit(1);
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
module.exports = { checkBinaryUpdates };
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Check if current package version already exists on npm
|
|
5
|
-
* If it does, automatically bump to next available version
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const { execSync } = require('child_process');
|
|
9
|
-
const fs = require('fs');
|
|
10
|
-
const path = require('path');
|
|
11
|
-
|
|
12
|
-
function getCurrentVersion() {
|
|
13
|
-
const packageJsonPath = path.join(__dirname, '..', 'package.json');
|
|
14
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
15
|
-
return packageJson.version;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function getPublishedVersions() {
|
|
19
|
-
try {
|
|
20
|
-
const versionsJson = execSync('npm view snow-flow versions --json', {
|
|
21
|
-
encoding: 'utf8',
|
|
22
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
23
|
-
});
|
|
24
|
-
return JSON.parse(versionsJson);
|
|
25
|
-
} catch (error) {
|
|
26
|
-
// Package might not exist yet
|
|
27
|
-
return [];
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function bumpVersion(type = 'patch') {
|
|
32
|
-
console.log(`🔄 Bumping ${type} version...`);
|
|
33
|
-
execSync(`npm version ${type} --no-git-tag-version`, {
|
|
34
|
-
stdio: 'inherit',
|
|
35
|
-
cwd: path.join(__dirname, '..')
|
|
36
|
-
});
|
|
37
|
-
return getCurrentVersion();
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function updateVersionFile(version) {
|
|
41
|
-
const versionFilePath = path.join(__dirname, '..', 'src', 'version.ts');
|
|
42
|
-
const versionContent = `// Auto-generated by npm version command
|
|
43
|
-
export const VERSION = '${version}';
|
|
44
|
-
`;
|
|
45
|
-
fs.writeFileSync(versionFilePath, versionContent, 'utf-8');
|
|
46
|
-
console.log(`✅ Updated version.ts to ${version}`);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async function main() {
|
|
50
|
-
const currentVersion = getCurrentVersion();
|
|
51
|
-
const publishedVersions = getPublishedVersions();
|
|
52
|
-
|
|
53
|
-
console.log(`📦 Current version: ${currentVersion}`);
|
|
54
|
-
console.log(`📚 Checking npm registry...`);
|
|
55
|
-
|
|
56
|
-
if (publishedVersions.includes(currentVersion)) {
|
|
57
|
-
console.log(`⚠️ Version ${currentVersion} already exists on npm!`);
|
|
58
|
-
console.log(`🔄 Auto-bumping to next patch version...`);
|
|
59
|
-
|
|
60
|
-
const newVersion = bumpVersion('patch');
|
|
61
|
-
updateVersionFile(newVersion);
|
|
62
|
-
|
|
63
|
-
console.log(`✅ Bumped to version ${newVersion}`);
|
|
64
|
-
console.log(`📝 Committing version bump...`);
|
|
65
|
-
|
|
66
|
-
try {
|
|
67
|
-
execSync('git add package.json src/version.ts', {
|
|
68
|
-
cwd: path.join(__dirname, '..')
|
|
69
|
-
});
|
|
70
|
-
execSync(`git commit -m "chore: Auto-bump version to ${newVersion} (${currentVersion} already published)"`, {
|
|
71
|
-
cwd: path.join(__dirname, '..'),
|
|
72
|
-
stdio: 'inherit'
|
|
73
|
-
});
|
|
74
|
-
console.log(`✅ Version bump committed`);
|
|
75
|
-
} catch (err) {
|
|
76
|
-
console.log(`⚠️ Git commit failed (might already be committed)`);
|
|
77
|
-
}
|
|
78
|
-
} else {
|
|
79
|
-
console.log(`✅ Version ${currentVersion} is available for publishing`);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
process.exit(0);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if (require.main === module) {
|
|
86
|
-
main().catch(error => {
|
|
87
|
-
console.error('❌ Error:', error.message);
|
|
88
|
-
process.exit(1);
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
module.exports = { getCurrentVersion, getPublishedVersions };
|