@claude-flow/cli 3.0.0-alpha.81 → 3.0.0-alpha.83
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/src/commands/claims.d.ts.map +1 -1
- package/dist/src/commands/claims.js +92 -7
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/embeddings.d.ts.map +1 -1
- package/dist/src/commands/embeddings.js +99 -5
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +2 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/neural.d.ts.map +1 -1
- package/dist/src/commands/neural.js +68 -16
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.d.ts.map +1 -1
- package/dist/src/commands/performance.js +155 -9
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/security.d.ts.map +1 -1
- package/dist/src/commands/security.js +199 -31
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/update.d.ts +8 -0
- package/dist/src/commands/update.d.ts.map +1 -0
- package/dist/src/commands/update.js +276 -0
- package/dist/src/commands/update.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +28 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/transfer/storage/gcs.d.ts +82 -0
- package/dist/src/transfer/storage/gcs.d.ts.map +1 -0
- package/dist/src/transfer/storage/gcs.js +230 -0
- package/dist/src/transfer/storage/gcs.js.map +1 -0
- package/dist/src/transfer/storage/index.d.ts +6 -0
- package/dist/src/transfer/storage/index.d.ts.map +1 -0
- package/dist/src/transfer/storage/index.js +6 -0
- package/dist/src/transfer/storage/index.js.map +1 -0
- package/dist/src/transfer/store/discovery.d.ts +9 -9
- package/dist/src/transfer/store/discovery.d.ts.map +1 -1
- package/dist/src/transfer/store/discovery.js +197 -91
- package/dist/src/transfer/store/discovery.js.map +1 -1
- package/dist/src/transfer/store/download.d.ts +6 -6
- package/dist/src/transfer/store/download.d.ts.map +1 -1
- package/dist/src/transfer/store/download.js +104 -65
- package/dist/src/transfer/store/download.js.map +1 -1
- package/dist/src/transfer/store/publish.d.ts.map +1 -1
- package/dist/src/transfer/store/publish.js +57 -25
- package/dist/src/transfer/store/publish.js.map +1 -1
- package/dist/src/update/checker.d.ts +34 -0
- package/dist/src/update/checker.d.ts.map +1 -0
- package/dist/src/update/checker.js +190 -0
- package/dist/src/update/checker.js.map +1 -0
- package/dist/src/update/executor.d.ts +32 -0
- package/dist/src/update/executor.d.ts.map +1 -0
- package/dist/src/update/executor.js +181 -0
- package/dist/src/update/executor.js.map +1 -0
- package/dist/src/update/index.d.ts +33 -0
- package/dist/src/update/index.d.ts.map +1 -0
- package/dist/src/update/index.js +64 -0
- package/dist/src/update/index.js.map +1 -0
- package/dist/src/update/rate-limiter.d.ts +20 -0
- package/dist/src/update/rate-limiter.d.ts.map +1 -0
- package/dist/src/update/rate-limiter.js +96 -0
- package/dist/src/update/rate-limiter.js.map +1 -0
- package/dist/src/update/validator.d.ts +17 -0
- package/dist/src/update/validator.d.ts.map +1 -0
- package/dist/src/update/validator.js +123 -0
- package/dist/src/update/validator.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update checker for @claude-flow packages
|
|
3
|
+
* Queries npm registry and compares versions
|
|
4
|
+
*/
|
|
5
|
+
import * as semver from 'semver';
|
|
6
|
+
import { shouldCheckForUpdates, recordCheck, getCachedVersions } from './rate-limiter.js';
|
|
7
|
+
const DEFAULT_CONFIG = {
|
|
8
|
+
enabled: true,
|
|
9
|
+
checkIntervalHours: 24,
|
|
10
|
+
autoUpdate: {
|
|
11
|
+
patch: true,
|
|
12
|
+
minor: false,
|
|
13
|
+
major: false,
|
|
14
|
+
},
|
|
15
|
+
priority: {
|
|
16
|
+
'@claude-flow/security': 'critical',
|
|
17
|
+
'@claude-flow/cli': 'high',
|
|
18
|
+
'@claude-flow/embeddings': 'normal',
|
|
19
|
+
'@claude-flow/integration': 'normal',
|
|
20
|
+
'@claude-flow/testing': 'low',
|
|
21
|
+
},
|
|
22
|
+
exclude: [],
|
|
23
|
+
};
|
|
24
|
+
// Packages to check for updates
|
|
25
|
+
const CLAUDE_FLOW_PACKAGES = [
|
|
26
|
+
'@claude-flow/cli',
|
|
27
|
+
'@claude-flow/embeddings',
|
|
28
|
+
'@claude-flow/security',
|
|
29
|
+
'@claude-flow/integration',
|
|
30
|
+
'@claude-flow/testing',
|
|
31
|
+
];
|
|
32
|
+
async function fetchPackageInfo(packageName) {
|
|
33
|
+
try {
|
|
34
|
+
const response = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}`, {
|
|
35
|
+
headers: { Accept: 'application/json' },
|
|
36
|
+
signal: AbortSignal.timeout(5000),
|
|
37
|
+
});
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return (await response.json());
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function getUpdateType(current, latest) {
|
|
48
|
+
if (!semver.valid(current) || !semver.valid(latest)) {
|
|
49
|
+
return 'none';
|
|
50
|
+
}
|
|
51
|
+
if (semver.eq(current, latest)) {
|
|
52
|
+
return 'none';
|
|
53
|
+
}
|
|
54
|
+
if (semver.major(latest) > semver.major(current)) {
|
|
55
|
+
return 'major';
|
|
56
|
+
}
|
|
57
|
+
if (semver.minor(latest) > semver.minor(current)) {
|
|
58
|
+
return 'minor';
|
|
59
|
+
}
|
|
60
|
+
if (semver.patch(latest) > semver.patch(current)) {
|
|
61
|
+
return 'patch';
|
|
62
|
+
}
|
|
63
|
+
return 'none';
|
|
64
|
+
}
|
|
65
|
+
function shouldAutoUpdate(updateType, priority, config) {
|
|
66
|
+
if (updateType === 'none')
|
|
67
|
+
return false;
|
|
68
|
+
// Critical security packages always auto-update patches
|
|
69
|
+
if (priority === 'critical' && updateType === 'patch') {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
// Check config
|
|
73
|
+
if (updateType === 'major')
|
|
74
|
+
return config.autoUpdate.major;
|
|
75
|
+
if (updateType === 'minor')
|
|
76
|
+
return config.autoUpdate.minor;
|
|
77
|
+
if (updateType === 'patch')
|
|
78
|
+
return config.autoUpdate.patch;
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
export function getInstalledVersion(packageName) {
|
|
82
|
+
try {
|
|
83
|
+
// Try to find the package in node_modules
|
|
84
|
+
const possiblePaths = [
|
|
85
|
+
`${packageName}/package.json`,
|
|
86
|
+
`../../node_modules/${packageName}/package.json`,
|
|
87
|
+
`../../../node_modules/${packageName}/package.json`,
|
|
88
|
+
];
|
|
89
|
+
for (const modulePath of possiblePaths) {
|
|
90
|
+
try {
|
|
91
|
+
// Use dynamic import with require for package.json
|
|
92
|
+
const resolved = require.resolve(modulePath, { paths: [process.cwd()] });
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
94
|
+
const pkg = require(resolved);
|
|
95
|
+
return pkg.version;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export async function checkForUpdates(config = DEFAULT_CONFIG) {
|
|
108
|
+
// Check rate limit
|
|
109
|
+
const rateCheck = shouldCheckForUpdates(config.checkIntervalHours);
|
|
110
|
+
if (!rateCheck.allowed) {
|
|
111
|
+
// Return cached results if available
|
|
112
|
+
const cached = getCachedVersions();
|
|
113
|
+
if (Object.keys(cached).length > 0) {
|
|
114
|
+
return {
|
|
115
|
+
results: [],
|
|
116
|
+
skipped: true,
|
|
117
|
+
reason: rateCheck.reason,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return { results: [], skipped: true, reason: rateCheck.reason };
|
|
121
|
+
}
|
|
122
|
+
const results = [];
|
|
123
|
+
const versionCache = {};
|
|
124
|
+
// Check each package
|
|
125
|
+
const packagesToCheck = CLAUDE_FLOW_PACKAGES.filter((pkg) => !config.exclude.includes(pkg));
|
|
126
|
+
// Sort by priority (critical first)
|
|
127
|
+
const priorityOrder = { critical: 0, high: 1, normal: 2, low: 3 };
|
|
128
|
+
packagesToCheck.sort((a, b) => {
|
|
129
|
+
const pa = config.priority[a] || 'normal';
|
|
130
|
+
const pb = config.priority[b] || 'normal';
|
|
131
|
+
return priorityOrder[pa] - priorityOrder[pb];
|
|
132
|
+
});
|
|
133
|
+
await Promise.all(packagesToCheck.map(async (packageName) => {
|
|
134
|
+
const currentVersion = getInstalledVersion(packageName);
|
|
135
|
+
if (!currentVersion) {
|
|
136
|
+
// Package not installed, skip
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const info = await fetchPackageInfo(packageName);
|
|
140
|
+
if (!info) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const latestVersion = info['dist-tags']?.latest;
|
|
144
|
+
if (!latestVersion) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
versionCache[packageName] = latestVersion;
|
|
148
|
+
const updateType = getUpdateType(currentVersion, latestVersion);
|
|
149
|
+
const priority = config.priority[packageName] || 'normal';
|
|
150
|
+
results.push({
|
|
151
|
+
package: packageName,
|
|
152
|
+
currentVersion,
|
|
153
|
+
latestVersion,
|
|
154
|
+
updateType,
|
|
155
|
+
priority,
|
|
156
|
+
shouldAutoUpdate: shouldAutoUpdate(updateType, priority, config),
|
|
157
|
+
});
|
|
158
|
+
}));
|
|
159
|
+
// Record this check
|
|
160
|
+
recordCheck(versionCache);
|
|
161
|
+
// Filter to only updates available
|
|
162
|
+
const updates = results.filter((r) => r.updateType !== 'none');
|
|
163
|
+
return { results: updates, skipped: false };
|
|
164
|
+
}
|
|
165
|
+
export async function checkSinglePackage(packageName, config = DEFAULT_CONFIG) {
|
|
166
|
+
const currentVersion = getInstalledVersion(packageName);
|
|
167
|
+
if (!currentVersion) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
const info = await fetchPackageInfo(packageName);
|
|
171
|
+
if (!info) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const latestVersion = info['dist-tags']?.latest;
|
|
175
|
+
if (!latestVersion) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const updateType = getUpdateType(currentVersion, latestVersion);
|
|
179
|
+
const priority = config.priority[packageName] || 'normal';
|
|
180
|
+
return {
|
|
181
|
+
package: packageName,
|
|
182
|
+
currentVersion,
|
|
183
|
+
latestVersion,
|
|
184
|
+
updateType,
|
|
185
|
+
priority,
|
|
186
|
+
shouldAutoUpdate: shouldAutoUpdate(updateType, priority, config),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
export { DEFAULT_CONFIG };
|
|
190
|
+
//# sourceMappingURL=checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../../../src/update/checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update executor - performs actual package updates
|
|
3
|
+
* Includes rollback capability
|
|
4
|
+
*/
|
|
5
|
+
import { UpdateCheckResult } from './checker.js';
|
|
6
|
+
import { ValidationResult } from './validator.js';
|
|
7
|
+
export interface UpdateHistoryEntry {
|
|
8
|
+
timestamp: string;
|
|
9
|
+
package: string;
|
|
10
|
+
fromVersion: string;
|
|
11
|
+
toVersion: string;
|
|
12
|
+
success: boolean;
|
|
13
|
+
error?: string;
|
|
14
|
+
rollbackAvailable: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface UpdateExecutionResult {
|
|
17
|
+
success: boolean;
|
|
18
|
+
package: string;
|
|
19
|
+
version: string;
|
|
20
|
+
error?: string;
|
|
21
|
+
validation: ValidationResult;
|
|
22
|
+
}
|
|
23
|
+
export declare function loadHistory(): UpdateHistoryEntry[];
|
|
24
|
+
export declare function executeUpdate(update: UpdateCheckResult, installedPackages: Record<string, string>, dryRun?: boolean): Promise<UpdateExecutionResult>;
|
|
25
|
+
export declare function executeMultipleUpdates(updates: UpdateCheckResult[], installedPackages: Record<string, string>, dryRun?: boolean): Promise<UpdateExecutionResult[]>;
|
|
26
|
+
export declare function rollbackUpdate(packageName?: string): Promise<{
|
|
27
|
+
success: boolean;
|
|
28
|
+
message: string;
|
|
29
|
+
}>;
|
|
30
|
+
export declare function getUpdateHistory(limit?: number): UpdateHistoryEntry[];
|
|
31
|
+
export declare function clearHistory(): void;
|
|
32
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/update/executor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAkB,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,gBAAgB,CAAC;CAC9B;AAYD,wBAAgB,WAAW,IAAI,kBAAkB,EAAE,CAUlD;AAeD,wBAAsB,aAAa,CACjC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,MAAM,UAAQ,GACb,OAAO,CAAC,qBAAqB,CAAC,CA4EhC;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,iBAAiB,EAAE,EAC5B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACzC,MAAM,UAAQ,GACb,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAoBlC;AAED,wBAAsB,cAAc,CAClC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAsDhD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,SAAK,GAAG,kBAAkB,EAAE,CAGjE;AAED,wBAAgB,YAAY,IAAI,IAAI,CAInC"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update executor - performs actual package updates
|
|
3
|
+
* Includes rollback capability
|
|
4
|
+
*/
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
import { validateUpdate } from './validator.js';
|
|
10
|
+
const HISTORY_FILE = path.join(os.homedir(), '.claude-flow', 'update-history.json');
|
|
11
|
+
const MAX_HISTORY_ENTRIES = 100;
|
|
12
|
+
function ensureDir() {
|
|
13
|
+
const dir = path.dirname(HISTORY_FILE);
|
|
14
|
+
if (!fs.existsSync(dir)) {
|
|
15
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function loadHistory() {
|
|
19
|
+
try {
|
|
20
|
+
if (fs.existsSync(HISTORY_FILE)) {
|
|
21
|
+
const content = fs.readFileSync(HISTORY_FILE, 'utf-8');
|
|
22
|
+
return JSON.parse(content);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Corrupted file
|
|
27
|
+
}
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
function saveHistory(history) {
|
|
31
|
+
ensureDir();
|
|
32
|
+
// Keep only last N entries
|
|
33
|
+
const trimmed = history.slice(-MAX_HISTORY_ENTRIES);
|
|
34
|
+
fs.writeFileSync(HISTORY_FILE, JSON.stringify(trimmed, null, 2));
|
|
35
|
+
}
|
|
36
|
+
function recordUpdate(entry) {
|
|
37
|
+
const history = loadHistory();
|
|
38
|
+
history.push(entry);
|
|
39
|
+
saveHistory(history);
|
|
40
|
+
}
|
|
41
|
+
export async function executeUpdate(update, installedPackages, dryRun = false) {
|
|
42
|
+
// Validate first
|
|
43
|
+
const validation = validateUpdate(update.package, update.currentVersion, update.latestVersion, installedPackages);
|
|
44
|
+
if (!validation.valid) {
|
|
45
|
+
return {
|
|
46
|
+
success: false,
|
|
47
|
+
package: update.package,
|
|
48
|
+
version: update.latestVersion,
|
|
49
|
+
error: `Validation failed: ${validation.incompatibilities.join(', ')}`,
|
|
50
|
+
validation,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (dryRun) {
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
package: update.package,
|
|
57
|
+
version: update.latestVersion,
|
|
58
|
+
validation,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
// Execute npm install
|
|
63
|
+
const installCmd = `npm install ${update.package}@${update.latestVersion} --save-exact`;
|
|
64
|
+
execSync(installCmd, {
|
|
65
|
+
encoding: 'utf-8',
|
|
66
|
+
stdio: 'pipe',
|
|
67
|
+
timeout: 60000, // 1 minute timeout
|
|
68
|
+
});
|
|
69
|
+
// Record successful update
|
|
70
|
+
recordUpdate({
|
|
71
|
+
timestamp: new Date().toISOString(),
|
|
72
|
+
package: update.package,
|
|
73
|
+
fromVersion: update.currentVersion,
|
|
74
|
+
toVersion: update.latestVersion,
|
|
75
|
+
success: true,
|
|
76
|
+
rollbackAvailable: true,
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
success: true,
|
|
80
|
+
package: update.package,
|
|
81
|
+
version: update.latestVersion,
|
|
82
|
+
validation,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const err = error;
|
|
87
|
+
// Record failed update
|
|
88
|
+
recordUpdate({
|
|
89
|
+
timestamp: new Date().toISOString(),
|
|
90
|
+
package: update.package,
|
|
91
|
+
fromVersion: update.currentVersion,
|
|
92
|
+
toVersion: update.latestVersion,
|
|
93
|
+
success: false,
|
|
94
|
+
error: err.message,
|
|
95
|
+
rollbackAvailable: false,
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
package: update.package,
|
|
100
|
+
version: update.latestVersion,
|
|
101
|
+
error: err.message,
|
|
102
|
+
validation,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export async function executeMultipleUpdates(updates, installedPackages, dryRun = false) {
|
|
107
|
+
const results = [];
|
|
108
|
+
// Execute updates sequentially to avoid conflicts
|
|
109
|
+
for (const update of updates) {
|
|
110
|
+
const result = await executeUpdate(update, installedPackages, dryRun);
|
|
111
|
+
results.push(result);
|
|
112
|
+
// Update installed packages for next validation
|
|
113
|
+
if (result.success) {
|
|
114
|
+
installedPackages[update.package] = update.latestVersion;
|
|
115
|
+
}
|
|
116
|
+
// Stop on critical failures
|
|
117
|
+
if (!result.success && update.priority === 'critical') {
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return results;
|
|
122
|
+
}
|
|
123
|
+
export async function rollbackUpdate(packageName) {
|
|
124
|
+
const history = loadHistory();
|
|
125
|
+
if (history.length === 0) {
|
|
126
|
+
return { success: false, message: 'No update history available' };
|
|
127
|
+
}
|
|
128
|
+
// Find the last successful update for this package (or any if not specified)
|
|
129
|
+
const lastUpdate = packageName
|
|
130
|
+
? history
|
|
131
|
+
.reverse()
|
|
132
|
+
.find((h) => h.package === packageName && h.success && h.rollbackAvailable)
|
|
133
|
+
: history.reverse().find((h) => h.success && h.rollbackAvailable);
|
|
134
|
+
if (!lastUpdate) {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
message: packageName
|
|
138
|
+
? `No rollback available for ${packageName}`
|
|
139
|
+
: 'No rollback available',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
// Install the previous version
|
|
144
|
+
const installCmd = `npm install ${lastUpdate.package}@${lastUpdate.fromVersion} --save-exact`;
|
|
145
|
+
execSync(installCmd, {
|
|
146
|
+
encoding: 'utf-8',
|
|
147
|
+
stdio: 'pipe',
|
|
148
|
+
timeout: 60000,
|
|
149
|
+
});
|
|
150
|
+
// Record the rollback
|
|
151
|
+
recordUpdate({
|
|
152
|
+
timestamp: new Date().toISOString(),
|
|
153
|
+
package: lastUpdate.package,
|
|
154
|
+
fromVersion: lastUpdate.toVersion,
|
|
155
|
+
toVersion: lastUpdate.fromVersion,
|
|
156
|
+
success: true,
|
|
157
|
+
rollbackAvailable: false, // Can't rollback a rollback
|
|
158
|
+
});
|
|
159
|
+
return {
|
|
160
|
+
success: true,
|
|
161
|
+
message: `Rolled back ${lastUpdate.package} from ${lastUpdate.toVersion} to ${lastUpdate.fromVersion}`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
const err = error;
|
|
166
|
+
return {
|
|
167
|
+
success: false,
|
|
168
|
+
message: `Rollback failed: ${err.message}`,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export function getUpdateHistory(limit = 20) {
|
|
173
|
+
const history = loadHistory();
|
|
174
|
+
return history.slice(-limit).reverse();
|
|
175
|
+
}
|
|
176
|
+
export function clearHistory() {
|
|
177
|
+
if (fs.existsSync(HISTORY_FILE)) {
|
|
178
|
+
fs.unlinkSync(HISTORY_FILE);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/update/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-update system for @claude-flow packages
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Rate-limited update checks (24h default)
|
|
6
|
+
* - Automatic patch updates for security packages
|
|
7
|
+
* - Compatibility validation before updates
|
|
8
|
+
* - Rollback capability
|
|
9
|
+
* - Update history logging
|
|
10
|
+
*/
|
|
11
|
+
export { checkForUpdates, checkSinglePackage, getInstalledVersion, DEFAULT_CONFIG, } from './checker.js';
|
|
12
|
+
export type { UpdateCheckResult, UpdateConfig } from './checker.js';
|
|
13
|
+
export { shouldCheckForUpdates, recordCheck, getCachedVersions, clearCache, loadState, } from './rate-limiter.js';
|
|
14
|
+
export type { RateLimitState } from './rate-limiter.js';
|
|
15
|
+
export { validateUpdate, validateBulkUpdate } from './validator.js';
|
|
16
|
+
export type { ValidationResult } from './validator.js';
|
|
17
|
+
export { executeUpdate, executeMultipleUpdates, rollbackUpdate, getUpdateHistory, clearHistory, loadHistory, } from './executor.js';
|
|
18
|
+
export type { UpdateHistoryEntry, UpdateExecutionResult } from './executor.js';
|
|
19
|
+
import type { UpdateCheckResult } from './checker.js';
|
|
20
|
+
/**
|
|
21
|
+
* Run auto-update check on startup
|
|
22
|
+
* This is the main entry point for the auto-update system
|
|
23
|
+
*/
|
|
24
|
+
export declare function runStartupUpdateCheck(options: {
|
|
25
|
+
verbose?: boolean;
|
|
26
|
+
autoUpdate?: boolean;
|
|
27
|
+
}): Promise<{
|
|
28
|
+
checked: boolean;
|
|
29
|
+
updatesAvailable: UpdateCheckResult[];
|
|
30
|
+
updatesApplied: string[];
|
|
31
|
+
skippedReason?: string;
|
|
32
|
+
}>;
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/update/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,SAAS,GACV,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAItD;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IACtC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC,CAkDD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-update system for @claude-flow packages
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Rate-limited update checks (24h default)
|
|
6
|
+
* - Automatic patch updates for security packages
|
|
7
|
+
* - Compatibility validation before updates
|
|
8
|
+
* - Rollback capability
|
|
9
|
+
* - Update history logging
|
|
10
|
+
*/
|
|
11
|
+
export { checkForUpdates, checkSinglePackage, getInstalledVersion, DEFAULT_CONFIG, } from './checker.js';
|
|
12
|
+
export { shouldCheckForUpdates, recordCheck, getCachedVersions, clearCache, loadState, } from './rate-limiter.js';
|
|
13
|
+
export { validateUpdate, validateBulkUpdate } from './validator.js';
|
|
14
|
+
export { executeUpdate, executeMultipleUpdates, rollbackUpdate, getUpdateHistory, clearHistory, loadHistory, } from './executor.js';
|
|
15
|
+
// Re-export a convenience function for startup
|
|
16
|
+
import { checkForUpdates, DEFAULT_CONFIG } from './checker.js';
|
|
17
|
+
import { executeMultipleUpdates } from './executor.js';
|
|
18
|
+
import { getInstalledVersion } from './checker.js';
|
|
19
|
+
/**
|
|
20
|
+
* Run auto-update check on startup
|
|
21
|
+
* This is the main entry point for the auto-update system
|
|
22
|
+
*/
|
|
23
|
+
export async function runStartupUpdateCheck(options) {
|
|
24
|
+
const result = {
|
|
25
|
+
checked: false,
|
|
26
|
+
updatesAvailable: [],
|
|
27
|
+
updatesApplied: [],
|
|
28
|
+
skippedReason: undefined,
|
|
29
|
+
};
|
|
30
|
+
try {
|
|
31
|
+
const { results, skipped, reason } = await checkForUpdates(DEFAULT_CONFIG);
|
|
32
|
+
if (skipped) {
|
|
33
|
+
result.skippedReason = reason;
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
result.checked = true;
|
|
37
|
+
result.updatesAvailable = results;
|
|
38
|
+
// Auto-update if enabled
|
|
39
|
+
if (options.autoUpdate !== false) {
|
|
40
|
+
const autoUpdateable = results.filter((r) => r.shouldAutoUpdate);
|
|
41
|
+
if (autoUpdateable.length > 0) {
|
|
42
|
+
// Get current installed packages
|
|
43
|
+
const installedPackages = {};
|
|
44
|
+
for (const update of autoUpdateable) {
|
|
45
|
+
const version = getInstalledVersion(update.package);
|
|
46
|
+
if (version) {
|
|
47
|
+
installedPackages[update.package] = version;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Execute updates
|
|
51
|
+
const updateResults = await executeMultipleUpdates(autoUpdateable, installedPackages);
|
|
52
|
+
result.updatesApplied = updateResults
|
|
53
|
+
.filter((r) => r.success)
|
|
54
|
+
.map((r) => `${r.package}@${r.version}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Silently fail on startup - don't block CLI usage
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/update/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,GACf,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,SAAS,GACV,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpE,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,GACZ,MAAM,eAAe,CAAC;AAIvB,+CAA+C;AAC/C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAG3C;IAMC,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,KAAK;QACd,gBAAgB,EAAE,EAAyB;QAC3C,cAAc,EAAE,EAAc;QAC9B,aAAa,EAAE,SAA+B;KAC/C,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,CAAC;QAE3E,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC;QAElC,yBAAyB;QACzB,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YACjC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;YAEjE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,iCAAiC;gBACjC,MAAM,iBAAiB,GAA2B,EAAE,CAAC;gBACrD,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;oBACpC,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACpD,IAAI,OAAO,EAAE,CAAC;wBACZ,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;oBAC9C,CAAC;gBACH,CAAC;gBAED,kBAAkB;gBAClB,MAAM,aAAa,GAAG,MAAM,sBAAsB,CAChD,cAAc,EACd,iBAAiB,CAClB,CAAC;gBAEF,MAAM,CAAC,cAAc,GAAG,aAAa;qBAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;qBACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;QACnD,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate limiter for update checks
|
|
3
|
+
* Prevents excessive npm registry queries
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimitState {
|
|
6
|
+
lastCheck: string;
|
|
7
|
+
checksToday: number;
|
|
8
|
+
date: string;
|
|
9
|
+
packageVersions: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
export declare function loadState(): RateLimitState;
|
|
12
|
+
export declare function saveState(state: RateLimitState): void;
|
|
13
|
+
export declare function shouldCheckForUpdates(intervalHours?: number): {
|
|
14
|
+
allowed: boolean;
|
|
15
|
+
reason?: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function recordCheck(packageVersions: Record<string, string>): void;
|
|
18
|
+
export declare function getCachedVersions(): Record<string, string>;
|
|
19
|
+
export declare function clearCache(): void;
|
|
20
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/update/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAsBD,wBAAgB,SAAS,IAAI,cAAc,CAmB1C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAGrD;AAED,wBAAgB,qBAAqB,CACnC,aAAa,GAAE,MAA+B,GAC7C;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAuCvC;AAED,wBAAgB,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAMzE;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE1D;AAED,wBAAgB,UAAU,IAAI,IAAI,CAIjC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate limiter for update checks
|
|
3
|
+
* Prevents excessive npm registry queries
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as os from 'os';
|
|
8
|
+
const STATE_FILE = path.join(os.homedir(), '.claude-flow', 'update-state.json');
|
|
9
|
+
const DEFAULT_INTERVAL_HOURS = 24;
|
|
10
|
+
const MAX_CHECKS_PER_DAY = 10;
|
|
11
|
+
function ensureDir() {
|
|
12
|
+
const dir = path.dirname(STATE_FILE);
|
|
13
|
+
if (!fs.existsSync(dir)) {
|
|
14
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function getDefaultState() {
|
|
18
|
+
return {
|
|
19
|
+
lastCheck: '',
|
|
20
|
+
checksToday: 0,
|
|
21
|
+
date: new Date().toISOString().split('T')[0],
|
|
22
|
+
packageVersions: {},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function loadState() {
|
|
26
|
+
try {
|
|
27
|
+
if (fs.existsSync(STATE_FILE)) {
|
|
28
|
+
const content = fs.readFileSync(STATE_FILE, 'utf-8');
|
|
29
|
+
const state = JSON.parse(content);
|
|
30
|
+
// Reset counter if new day
|
|
31
|
+
const today = new Date().toISOString().split('T')[0];
|
|
32
|
+
if (state.date !== today) {
|
|
33
|
+
state.date = today;
|
|
34
|
+
state.checksToday = 0;
|
|
35
|
+
}
|
|
36
|
+
return state;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Corrupted file, reset
|
|
41
|
+
}
|
|
42
|
+
return getDefaultState();
|
|
43
|
+
}
|
|
44
|
+
export function saveState(state) {
|
|
45
|
+
ensureDir();
|
|
46
|
+
fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
|
|
47
|
+
}
|
|
48
|
+
export function shouldCheckForUpdates(intervalHours = DEFAULT_INTERVAL_HOURS) {
|
|
49
|
+
// Skip in CI environments
|
|
50
|
+
if (process.env.CI === 'true' || process.env.CONTINUOUS_INTEGRATION === 'true') {
|
|
51
|
+
return { allowed: false, reason: 'CI environment detected' };
|
|
52
|
+
}
|
|
53
|
+
// Skip if explicitly disabled
|
|
54
|
+
if (process.env.CLAUDE_FLOW_AUTO_UPDATE === 'false') {
|
|
55
|
+
return { allowed: false, reason: 'Auto-update disabled via environment' };
|
|
56
|
+
}
|
|
57
|
+
// Force update if requested
|
|
58
|
+
if (process.env.CLAUDE_FLOW_FORCE_UPDATE === 'true') {
|
|
59
|
+
return { allowed: true };
|
|
60
|
+
}
|
|
61
|
+
const state = loadState();
|
|
62
|
+
// Check daily limit
|
|
63
|
+
if (state.checksToday >= MAX_CHECKS_PER_DAY) {
|
|
64
|
+
return { allowed: false, reason: `Daily check limit (${MAX_CHECKS_PER_DAY}) reached` };
|
|
65
|
+
}
|
|
66
|
+
// Check time interval
|
|
67
|
+
if (state.lastCheck) {
|
|
68
|
+
const lastCheckTime = new Date(state.lastCheck).getTime();
|
|
69
|
+
const now = Date.now();
|
|
70
|
+
const hoursSinceLastCheck = (now - lastCheckTime) / (1000 * 60 * 60);
|
|
71
|
+
if (hoursSinceLastCheck < intervalHours) {
|
|
72
|
+
const nextCheck = Math.ceil(intervalHours - hoursSinceLastCheck);
|
|
73
|
+
return {
|
|
74
|
+
allowed: false,
|
|
75
|
+
reason: `Last check was ${Math.floor(hoursSinceLastCheck)}h ago (next check in ~${nextCheck}h)`
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return { allowed: true };
|
|
80
|
+
}
|
|
81
|
+
export function recordCheck(packageVersions) {
|
|
82
|
+
const state = loadState();
|
|
83
|
+
state.lastCheck = new Date().toISOString();
|
|
84
|
+
state.checksToday += 1;
|
|
85
|
+
state.packageVersions = { ...state.packageVersions, ...packageVersions };
|
|
86
|
+
saveState(state);
|
|
87
|
+
}
|
|
88
|
+
export function getCachedVersions() {
|
|
89
|
+
return loadState().packageVersions;
|
|
90
|
+
}
|
|
91
|
+
export function clearCache() {
|
|
92
|
+
if (fs.existsSync(STATE_FILE)) {
|
|
93
|
+
fs.unlinkSync(STATE_FILE);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/update/rate-limiter.ts"],"names":[],"mappings":"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"}
|