ruckup 0.1.0

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.
Files changed (65) hide show
  1. package/dist/cli.d.ts +6 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +323 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/dep-diff.d.ts +9 -0
  6. package/dist/dep-diff.d.ts.map +1 -0
  7. package/dist/dep-diff.js +50 -0
  8. package/dist/dep-diff.js.map +1 -0
  9. package/dist/doctor.d.ts +12 -0
  10. package/dist/doctor.d.ts.map +1 -0
  11. package/dist/doctor.js +102 -0
  12. package/dist/doctor.js.map +1 -0
  13. package/dist/engine.d.ts +14 -0
  14. package/dist/engine.d.ts.map +1 -0
  15. package/dist/engine.js +128 -0
  16. package/dist/engine.js.map +1 -0
  17. package/dist/filter.d.ts +13 -0
  18. package/dist/filter.d.ts.map +1 -0
  19. package/dist/filter.js +68 -0
  20. package/dist/filter.js.map +1 -0
  21. package/dist/format.d.ts +11 -0
  22. package/dist/format.d.ts.map +1 -0
  23. package/dist/format.js +255 -0
  24. package/dist/format.js.map +1 -0
  25. package/dist/index.d.ts +17 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +16 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/inline-diff.d.ts +9 -0
  30. package/dist/inline-diff.d.ts.map +1 -0
  31. package/dist/inline-diff.js +88 -0
  32. package/dist/inline-diff.js.map +1 -0
  33. package/dist/interactive.d.ts +13 -0
  34. package/dist/interactive.d.ts.map +1 -0
  35. package/dist/interactive.js +231 -0
  36. package/dist/interactive.js.map +1 -0
  37. package/dist/open.d.ts +15 -0
  38. package/dist/open.d.ts.map +1 -0
  39. package/dist/open.js +52 -0
  40. package/dist/open.js.map +1 -0
  41. package/dist/package.d.ts +32 -0
  42. package/dist/package.d.ts.map +1 -0
  43. package/dist/package.js +143 -0
  44. package/dist/package.js.map +1 -0
  45. package/dist/registry.d.ts +26 -0
  46. package/dist/registry.d.ts.map +1 -0
  47. package/dist/registry.js +164 -0
  48. package/dist/registry.js.map +1 -0
  49. package/dist/release-info.d.ts +40 -0
  50. package/dist/release-info.d.ts.map +1 -0
  51. package/dist/release-info.js +165 -0
  52. package/dist/release-info.js.map +1 -0
  53. package/dist/security.d.ts +10 -0
  54. package/dist/security.d.ts.map +1 -0
  55. package/dist/security.js +72 -0
  56. package/dist/security.js.map +1 -0
  57. package/dist/types.d.ts +168 -0
  58. package/dist/types.d.ts.map +1 -0
  59. package/dist/types.js +50 -0
  60. package/dist/types.js.map +1 -0
  61. package/dist/version.d.ts +23 -0
  62. package/dist/version.d.ts.map +1 -0
  63. package/dist/version.js +229 -0
  64. package/dist/version.js.map +1 -0
  65. package/package.json +66 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ruckup CLI — npm-check-updates with security inspection.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG"}
package/dist/cli.js ADDED
@@ -0,0 +1,323 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ruckup CLI — npm-check-updates with security inspection.
4
+ */
5
+ import { Command } from 'commander';
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ import { cosmiconfig } from 'cosmiconfig';
9
+ import { readFileSync } from 'node:fs';
10
+ import { createRequire } from 'node:module';
11
+ import { DEFAULT_OPTIONS } from './types.js';
12
+ import { checkUpgrades, applyUpgrades } from './engine.js';
13
+ import { formatOutput } from './format.js';
14
+ import { renderAllInlineDiffs } from './inline-diff.js';
15
+ import { runInteractiveSelect } from './interactive.js';
16
+ import { openUrlsForUpgrades } from './open.js';
17
+ import { runDoctorMode } from './doctor.js';
18
+ import { writeUpgrades } from './package.js';
19
+ const require = createRequire(import.meta.url);
20
+ const { version: pkgVersion } = require('../package.json');
21
+ function createProgram() {
22
+ const program = new Command();
23
+ program
24
+ .name('ruckup')
25
+ .description('Check for outdated, incorrect, and unused dependencies — with security inspection.')
26
+ .version(pkgVersion, '-v, --version')
27
+ // Core options (ncu-compatible)
28
+ .option('-u, --upgrade', 'Overwrite package file with upgraded versions', false)
29
+ .option('-i, --interactive', 'Choose which packages to upgrade interactively', false)
30
+ .option('-g, --global', 'Check global packages instead of in the current project', false)
31
+ .option('-f, --filter <matches...>', 'Include only package names matching the given string, glob, or regex')
32
+ .option('-x, --reject <matches...>', 'Exclude packages matching the given string, glob, or regex')
33
+ .option('-t, --target <value>', 'Upgrade target: latest, newest, greatest, minor, patch, semver, or @tag', 'latest')
34
+ .option('--packageFile <path>', 'Package file to check', './package.json')
35
+ .option('-p, --packageManager <name>', 'npm, yarn, pnpm, bun', 'npm')
36
+ .option('-r, --registry <url>', 'Custom npm registry URL', 'https://registry.npmjs.org')
37
+ .option('--registryType <type>', 'npm or json', 'npm')
38
+ .option('--dep <deps>', 'Dependency types to check (prod,dev,optional,peer,packageManager)', 'prod,dev,optional')
39
+ .option('--pre', 'Include prerelease versions', false)
40
+ // Output options
41
+ .option('-s, --silent', "Don't output anything", false)
42
+ .option('-l, --loglevel <level>', 'Log level: silent, error, minimal, warn, info, verbose, silly', 'warn')
43
+ .option('--format <formats...>', 'Output formatting: group, dep, time, lines, repo, homepage, ownerChanged, installedVersion, diff')
44
+ .option('--color', 'Force color output', true)
45
+ .option('-j, --jsonAll', 'Output new package file instead of human-readable message', false)
46
+ .option('--jsonUpgraded', 'Output upgraded dependencies in json', false)
47
+ .option('--jsonDeps', 'Output dependency sections in json', false)
48
+ // Network
49
+ .option('--concurrency <number>', 'Max simultaneous requests to registry', '8')
50
+ .option('--retry <number>', 'Number of retries for failed requests', '3')
51
+ .option('--timeout <ms>', 'Global timeout in milliseconds', '30000')
52
+ // Cache
53
+ .option('--cache', 'Enable caching of registry data', false)
54
+ .option('--cacheFile <path>', 'Cache file path', '~/.ncu-cache.json')
55
+ .option('--cacheExpiration <minutes>', 'Cache expiration in minutes', '10')
56
+ .option('--cacheClear', 'Clear the cache', false)
57
+ // Filtering
58
+ .option('--filterVersion <matches...>', 'Filter on package version using string, glob, or regex')
59
+ .option('--rejectVersion <matches...>', 'Exclude packages matching a version range')
60
+ .option('--enginesNode', 'Include only packages that satisfy engines.node', false)
61
+ .option('-m, --minimal', "Do not upgrade newer versions that are already satisfied by the version range", false)
62
+ .option('--peer', 'Check peer dependencies of installed packages and filter updates to compatible versions', false)
63
+ .option('--deprecated', 'Include deprecated packages', true)
64
+ .option('--removeRange', 'Remove version ranges from the final package version', false)
65
+ .option('--cooldown <period>', 'Minimum package age (e.g., 7d, 12h, 30m)')
66
+ // Workspace
67
+ .option('--workspace <names...>', 'Run in specific workspace(s)')
68
+ .option('-w, --workspaces', 'Run on all workspaces', false)
69
+ .option('--root', 'Include root package with --workspaces', true)
70
+ .option('--deep', 'Recursively find all package.json files', false)
71
+ .option('--cwd <path>', 'Working directory')
72
+ .option('--prefix <path>', 'Current npm working directory')
73
+ // Doctor
74
+ .option('-d, --doctor', 'Iteratively installs upgrades and runs tests to identify breaking upgrades', false)
75
+ .option('--doctorInstall <command>', 'Custom install command for doctor mode')
76
+ .option('--doctorTest <command>', 'Custom test command for doctor mode')
77
+ // Config
78
+ .option('--configFileName <name>', 'Config file name (.ncurc.{json,yml,js,cjs})')
79
+ .option('--configFilePath <path>', 'Path to config file directory')
80
+ .option('--mergeConfig', 'Merge nested configs with root config for --deep', false)
81
+ // I/O
82
+ .option('--stdin', 'Read package.json from stdin', false)
83
+ .option('--packageData <json>', 'Package file data (or use --stdin)')
84
+ .option('--verbose', 'Log additional information for debugging', false)
85
+ .option('-e, --errorLevel <number>', 'Set error level (1=default, 2=exit 0 only if no upgrades)', '1')
86
+ // ruckup additions
87
+ .option('--security', 'Check for security advisories against to-be-upgraded packages', false)
88
+ .option('--inspect-deps', 'Show dependency diff between current and target versions', false)
89
+ .option('--diff', 'Show inline diff/changelog in terminal for each upgrade', false)
90
+ .option('--open-release', 'Open release notes in browser for upgraded packages', false)
91
+ .option('--open-diff', 'Open SCM compare view in browser for upgraded packages', false)
92
+ .option('--open-repo', 'Open repository in browser for upgraded packages', false)
93
+ .option('--github-token <token>', 'GitHub personal access token for API requests');
94
+ return program;
95
+ }
96
+ /** Load .ncurc config and merge with CLI options */
97
+ async function loadConfig(cliOpts) {
98
+ const configFileName = cliOpts.configFileName ?? '.ncurc';
99
+ const configFilePath = cliOpts.configFilePath ?? undefined;
100
+ let fileConfig = {};
101
+ try {
102
+ const explorer = cosmiconfig('ncu', {
103
+ searchPlaces: [
104
+ `${configFileName}.json`,
105
+ `${configFileName}.yml`,
106
+ `${configFileName}.yaml`,
107
+ `${configFileName}.js`,
108
+ `${configFileName}.cjs`,
109
+ ],
110
+ searchStrategy: 'global',
111
+ });
112
+ const result = configFilePath
113
+ ? await explorer.search(configFilePath)
114
+ : await explorer.search();
115
+ if (result && !result.isEmpty) {
116
+ fileConfig = result.config;
117
+ }
118
+ }
119
+ catch {
120
+ // Config file not found or invalid — that's fine
121
+ }
122
+ // Merge: CLI > config file > defaults
123
+ const merged = { ...DEFAULT_OPTIONS };
124
+ // Apply config file values
125
+ for (const [key, value] of Object.entries(fileConfig)) {
126
+ if (value !== undefined) {
127
+ merged[key] = value;
128
+ }
129
+ }
130
+ // Apply CLI values (commander uses camelCase)
131
+ const cliMapping = {
132
+ inspectDeps: 'inspectDeps',
133
+ openRelease: 'openRelease',
134
+ openDiff: 'openDiff',
135
+ openRepo: 'openRepo',
136
+ githubToken: 'githubToken',
137
+ cacheFile: 'cacheFile',
138
+ cacheExpiration: 'cacheExpiration',
139
+ cacheClear: 'cacheClear',
140
+ filterVersion: 'filterVersion',
141
+ rejectVersion: 'rejectVersion',
142
+ enginesNode: 'enginesNode',
143
+ removeRange: 'removeRange',
144
+ packageFile: 'packageFile',
145
+ packageManager: 'packageManager',
146
+ packageData: 'packageData',
147
+ registryType: 'registryType',
148
+ errorLevel: 'errorLevel',
149
+ configFileName: 'configFileName',
150
+ configFilePath: 'configFilePath',
151
+ mergeConfig: 'mergeConfig',
152
+ doctorInstall: 'doctorInstall',
153
+ doctorTest: 'doctorTest',
154
+ };
155
+ for (const [key, value] of Object.entries(cliOpts)) {
156
+ if (value !== undefined) {
157
+ const mappedKey = cliMapping[key] ?? key;
158
+ merged[mappedKey] = value;
159
+ }
160
+ }
161
+ // Parse numeric options
162
+ merged.concurrency = Number(merged.concurrency) || DEFAULT_OPTIONS.concurrency;
163
+ merged.retry = Number(merged.retry) || DEFAULT_OPTIONS.retry;
164
+ merged.timeout = Number(merged.timeout) || DEFAULT_OPTIONS.timeout;
165
+ merged.cacheExpiration = Number(merged.cacheExpiration) || DEFAULT_OPTIONS.cacheExpiration;
166
+ merged.errorLevel = Number(merged.errorLevel) || DEFAULT_OPTIONS.errorLevel;
167
+ // Resolve format as array
168
+ if (typeof merged.format === 'string') {
169
+ merged.format = merged.format.split(',').map((s) => s.trim());
170
+ }
171
+ if (!Array.isArray(merged.format)) {
172
+ merged.format = [];
173
+ }
174
+ // Set cwd
175
+ if (!merged.cwd) {
176
+ merged.cwd = process.cwd();
177
+ }
178
+ // Verbose alias
179
+ if (merged.verbose) {
180
+ merged.loglevel = 'verbose';
181
+ }
182
+ // Silent alias
183
+ if (merged.silent) {
184
+ merged.loglevel = 'silent';
185
+ }
186
+ // Interactive implies security + inspectDeps enrichment
187
+ if (merged.interactive) {
188
+ merged.security = true;
189
+ merged.inspectDeps = true;
190
+ }
191
+ return merged;
192
+ }
193
+ /** Main CLI entry point */
194
+ async function main() {
195
+ const program = createProgram();
196
+ program.parse();
197
+ const cliOpts = program.opts();
198
+ // Handle stdin
199
+ if (cliOpts.stdin) {
200
+ cliOpts.packageData = readFileSync('/dev/stdin', 'utf-8');
201
+ }
202
+ const options = await loadConfig(cliOpts);
203
+ // Run
204
+ const spinner = options.loglevel !== 'silent' && !options.interactive
205
+ ? ora('Checking for updates...').start()
206
+ : null;
207
+ try {
208
+ const results = await checkUpgrades(options);
209
+ spinner?.stop();
210
+ // Aggregate all upgrades
211
+ const allUpgrades = results.flatMap((r) => r.upgrades);
212
+ if (allUpgrades.length === 0 && !options.silent) {
213
+ const isJson = options.jsonAll || options.jsonUpgraded || options.jsonDeps;
214
+ if (isJson) {
215
+ console.log('{}');
216
+ }
217
+ else {
218
+ console.log(chalk.green('All dependencies match the latest package versions :)'));
219
+ }
220
+ process.exit(options.errorLevel >= 2 ? 0 : 0);
221
+ return;
222
+ }
223
+ // Interactive mode
224
+ if (options.interactive) {
225
+ const { selected, cancelled } = await runInteractiveSelect(allUpgrades);
226
+ if (cancelled) {
227
+ console.log(chalk.dim('Cancelled.'));
228
+ process.exit(0);
229
+ return;
230
+ }
231
+ if (selected.length === 0) {
232
+ console.log(chalk.dim('No packages selected.'));
233
+ process.exit(0);
234
+ return;
235
+ }
236
+ // Apply selected upgrades
237
+ if (options.upgrade) {
238
+ for (const result of results) {
239
+ const selectedForFile = selected.filter((s) => result.upgrades.some((u) => u.name === s.name));
240
+ if (selectedForFile.length > 0) {
241
+ await writeUpgrades(result.packageFile, selectedForFile);
242
+ }
243
+ }
244
+ console.log(chalk.green(`\nUpgraded ${selected.length} package(s) in package.json`));
245
+ console.log(chalk.dim(`Run ${options.packageManager} install to install new versions.`));
246
+ }
247
+ else {
248
+ // Show what would be upgraded
249
+ console.log(formatOutput(selected, options));
250
+ console.log(chalk.dim('\nRun with -u to upgrade package.json'));
251
+ }
252
+ process.exit(0);
253
+ return;
254
+ }
255
+ // Inline diff mode
256
+ if (options.diff) {
257
+ console.log(renderAllInlineDiffs(allUpgrades));
258
+ if (!options.upgrade) {
259
+ console.log(chalk.dim('\nRun with -u to upgrade package.json'));
260
+ }
261
+ }
262
+ else {
263
+ // Standard output
264
+ console.log(formatOutput(allUpgrades, options));
265
+ }
266
+ // Open URLs
267
+ if (options.openRelease) {
268
+ await openUrlsForUpgrades(allUpgrades, 'release');
269
+ }
270
+ if (options.openDiff) {
271
+ await openUrlsForUpgrades(allUpgrades, 'diff');
272
+ }
273
+ if (options.openRepo) {
274
+ await openUrlsForUpgrades(allUpgrades, 'repo');
275
+ }
276
+ // Doctor mode
277
+ if (options.doctor) {
278
+ if (!options.upgrade) {
279
+ console.error(chalk.red('Doctor mode requires --upgrade (-u) flag'));
280
+ process.exit(1);
281
+ return;
282
+ }
283
+ const doctorResult = await runDoctorMode(allUpgrades, options);
284
+ // Apply only succeeded upgrades
285
+ for (const result of results) {
286
+ const succeededForFile = doctorResult.succeeded.filter((s) => result.upgrades.some((u) => u.name === s.name));
287
+ if (succeededForFile.length > 0) {
288
+ await writeUpgrades(result.packageFile, succeededForFile);
289
+ }
290
+ }
291
+ process.exit(doctorResult.failed.length > 0 ? 1 : 0);
292
+ return;
293
+ }
294
+ // Apply upgrades (non-doctor mode)
295
+ if (options.upgrade) {
296
+ await applyUpgrades(results);
297
+ if (!options.silent && !options.jsonAll && !options.jsonUpgraded && !options.jsonDeps) {
298
+ console.log(chalk.dim(`\nRun ${options.packageManager} install to install new versions.`));
299
+ }
300
+ }
301
+ else if (!options.silent &&
302
+ !options.jsonAll &&
303
+ !options.jsonUpgraded &&
304
+ !options.jsonDeps &&
305
+ !options.diff) {
306
+ console.log(chalk.dim('\nRun ruckup -u to upgrade package.json'));
307
+ }
308
+ // Exit code based on error level
309
+ if (options.errorLevel >= 2 && allUpgrades.length > 0) {
310
+ process.exit(1);
311
+ }
312
+ }
313
+ catch (err) {
314
+ spinner?.stop();
315
+ console.error(chalk.red(`Error: ${err.message}`));
316
+ if (options.verbose) {
317
+ console.error(err.stack);
318
+ }
319
+ process.exit(1);
320
+ }
321
+ }
322
+ main();
323
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Dependency diff analyzer — compares dependencies between package versions.
3
+ */
4
+ import type { DepDiff, NpmPackageMetadata, UpgradeResult } from './types.js';
5
+ /** Compare dependencies between two versions of a package */
6
+ export declare function computeDepDiff(metadata: NpmPackageMetadata, fromVersion: string, toVersion: string): DepDiff;
7
+ /** Enrich upgrade results with dependency diff data */
8
+ export declare function enrichWithDepDiffs(upgrades: UpgradeResult[], metadataMap: Map<string, NpmPackageMetadata>): void;
9
+ //# sourceMappingURL=dep-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dep-diff.d.ts","sourceRoot":"","sources":["../src/dep-diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7E,6DAA6D;AAC7D,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAmCT;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,EAAE,EACzB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAC3C,IAAI,CAiBN"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Dependency diff analyzer — compares dependencies between package versions.
3
+ */
4
+ /** Compare dependencies between two versions of a package */
5
+ export function computeDepDiff(metadata, fromVersion, toVersion) {
6
+ const fromMeta = metadata.versions[fromVersion];
7
+ const toMeta = metadata.versions[toVersion];
8
+ const fromDeps = fromMeta?.dependencies ?? {};
9
+ const toDeps = toMeta?.dependencies ?? {};
10
+ const added = {};
11
+ const removed = {};
12
+ const changed = {};
13
+ // Find added and changed
14
+ for (const [name, toVer] of Object.entries(toDeps)) {
15
+ if (!(name in fromDeps)) {
16
+ added[name] = toVer;
17
+ }
18
+ else if (fromDeps[name] !== toVer) {
19
+ changed[name] = { from: fromDeps[name], to: toVer };
20
+ }
21
+ }
22
+ // Find removed
23
+ for (const [name, fromVer] of Object.entries(fromDeps)) {
24
+ if (!(name in toDeps)) {
25
+ removed[name] = fromVer;
26
+ }
27
+ }
28
+ return {
29
+ added,
30
+ removed,
31
+ changed,
32
+ totalAdded: Object.keys(added).length,
33
+ totalRemoved: Object.keys(removed).length,
34
+ totalChanged: Object.keys(changed).length,
35
+ };
36
+ }
37
+ /** Enrich upgrade results with dependency diff data */
38
+ export function enrichWithDepDiffs(upgrades, metadataMap) {
39
+ for (const upgrade of upgrades) {
40
+ const metadata = metadataMap.get(upgrade.name);
41
+ if (!metadata)
42
+ continue;
43
+ // Only compute if both versions exist in metadata
44
+ if (metadata.versions[upgrade.currentVersion] &&
45
+ metadata.versions[upgrade.targetVersion]) {
46
+ upgrade.depDiff = computeDepDiff(metadata, upgrade.currentVersion, upgrade.targetVersion);
47
+ }
48
+ }
49
+ }
50
+ //# sourceMappingURL=dep-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dep-diff.js","sourceRoot":"","sources":["../src/dep-diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAC5B,QAA4B,EAC5B,WAAmB,EACnB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,QAAQ,EAAE,YAAY,IAAI,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC;IAE1C,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAiD,EAAE,CAAC;IAEjE,yBAAyB;IACzB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;IAED,eAAe;IACf,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK;QACL,OAAO;QACP,OAAO;QACP,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;QACrC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM;QACzC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM;KAC1C,CAAC;AACJ,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,kBAAkB,CAChC,QAAyB,EACzB,WAA4C;IAE5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,kDAAkD;QAClD,IACE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC;YACzC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EACxC,CAAC;YACD,OAAO,CAAC,OAAO,GAAG,cAAc,CAC9B,QAAQ,EACR,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,aAAa,CACtB,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Doctor mode — iteratively upgrade packages and run tests.
3
+ */
4
+ import type { UpgradeResult, RuckupOptions } from './types.js';
5
+ interface DoctorResult {
6
+ succeeded: UpgradeResult[];
7
+ failed: UpgradeResult[];
8
+ }
9
+ /** Run doctor mode: upgrade packages one by one, testing after each */
10
+ export declare function runDoctorMode(upgrades: UpgradeResult[], options: RuckupOptions): Promise<DoctorResult>;
11
+ export {};
12
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAK/D,UAAU,YAAY;IACpB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAwBD,uEAAuE;AACvE,wBAAsB,aAAa,CACjC,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CA0EvB"}
package/dist/doctor.js ADDED
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Doctor mode — iteratively upgrade packages and run tests.
3
+ */
4
+ import { execFile } from 'node:child_process';
5
+ import { promisify } from 'node:util';
6
+ import chalk from 'chalk';
7
+ import { readPackageFile, writeUpgrades } from './package.js';
8
+ const execFileP = promisify(execFile);
9
+ /** Run a shell command and return success/failure */
10
+ async function runCommand(command, cwd) {
11
+ try {
12
+ const [cmd, ...args] = command.split(/\s+/);
13
+ const { stdout, stderr } = await execFileP(cmd, args, {
14
+ cwd,
15
+ timeout: 5 * 60 * 1000, // 5 minutes
16
+ shell: true,
17
+ });
18
+ return { success: true, output: stdout + stderr };
19
+ }
20
+ catch (err) {
21
+ const error = err;
22
+ return {
23
+ success: false,
24
+ output: (error.stdout ?? '') + (error.stderr ?? '') + (error.message ?? ''),
25
+ };
26
+ }
27
+ }
28
+ /** Run doctor mode: upgrade packages one by one, testing after each */
29
+ export async function runDoctorMode(upgrades, options) {
30
+ const installCmd = options.doctorInstall ?? `${options.packageManager} install`;
31
+ const testCmd = options.doctorTest ?? `${options.packageManager} test`;
32
+ const cwd = options.cwd;
33
+ const succeeded = [];
34
+ const failed = [];
35
+ // Read original package.json for rollback
36
+ const originalPkg = await readPackageFile(`${cwd}/${options.packageFile}`);
37
+ const originalRaw = originalPkg.raw;
38
+ console.log(chalk.bold('\n🩺 Doctor mode: testing upgrades one by one...\n'));
39
+ for (let i = 0; i < upgrades.length; i++) {
40
+ const upgrade = upgrades[i];
41
+ const progress = `[${i + 1}/${upgrades.length}]`;
42
+ process.stdout.write(`${progress} Testing ${chalk.bold(upgrade.name)} ${upgrade.current} → ${upgrade.target}... `);
43
+ // Apply this single upgrade
44
+ const pkg = await readPackageFile(`${cwd}/${options.packageFile}`);
45
+ await writeUpgrades(pkg, [upgrade]);
46
+ // Install
47
+ const installResult = await runCommand(installCmd, cwd);
48
+ if (!installResult.success) {
49
+ console.log(chalk.red('āœ— install failed'));
50
+ if (options.verbose) {
51
+ console.log(chalk.dim(installResult.output));
52
+ }
53
+ // Rollback
54
+ await rollback(originalPkg.filePath, originalRaw, succeeded, cwd, options);
55
+ failed.push(upgrade);
56
+ continue;
57
+ }
58
+ // Test
59
+ const testResult = await runCommand(testCmd, cwd);
60
+ if (!testResult.success) {
61
+ console.log(chalk.red('āœ— tests failed'));
62
+ if (options.verbose) {
63
+ console.log(chalk.dim(testResult.output));
64
+ }
65
+ // Rollback this upgrade
66
+ await rollback(originalPkg.filePath, originalRaw, succeeded, cwd, options);
67
+ failed.push(upgrade);
68
+ continue;
69
+ }
70
+ console.log(chalk.green('āœ“'));
71
+ succeeded.push(upgrade);
72
+ }
73
+ // Final summary
74
+ console.log(chalk.bold('\n🩺 Doctor Results:'));
75
+ if (succeeded.length > 0) {
76
+ console.log(chalk.green(` āœ“ ${succeeded.length} upgrades passed`));
77
+ for (const u of succeeded) {
78
+ console.log(chalk.green(` ${u.name} ${u.current} → ${u.target}`));
79
+ }
80
+ }
81
+ if (failed.length > 0) {
82
+ console.log(chalk.red(` āœ— ${failed.length} upgrades failed`));
83
+ for (const u of failed) {
84
+ console.log(chalk.red(` ${u.name} ${u.current} → ${u.target}`));
85
+ }
86
+ }
87
+ return { succeeded, failed };
88
+ }
89
+ /** Rollback to original + already succeeded upgrades */
90
+ async function rollback(filePath, originalRaw, succeeded, cwd, options) {
91
+ const { writeFile } = await import('node:fs/promises');
92
+ await writeFile(filePath, originalRaw, 'utf-8');
93
+ // Re-apply only succeeded upgrades
94
+ if (succeeded.length > 0) {
95
+ const pkg = await readPackageFile(filePath);
96
+ await writeUpgrades(pkg, succeeded);
97
+ }
98
+ // Re-install
99
+ const installCmd = options.doctorInstall ?? `${options.packageManager} install`;
100
+ await runCommand(installCmd, cwd);
101
+ }
102
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ruckup core engine — wires registry, version resolver, filters, security, and diff together.
3
+ */
4
+ import type { UpgradeResult, RuckupOptions } from './types.js';
5
+ import { type PackageFile } from './package.js';
6
+ export interface RunResult {
7
+ upgrades: UpgradeResult[];
8
+ packageFile: PackageFile;
9
+ }
10
+ /** Run the core upgrade check for a single package.json */
11
+ export declare function checkUpgrades(options: RuckupOptions): Promise<RunResult[]>;
12
+ /** Apply upgrades to package.json files */
13
+ export declare function applyUpgrades(results: RunResult[]): Promise<void>;
14
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAiBtB,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,2DAA2D;AAC3D,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,SAAS,EAAE,CAAC,CAmCtB;AAgGD,2CAA2C;AAC3C,wBAAsB,aAAa,CACjC,OAAO,EAAE,SAAS,EAAE,GACnB,OAAO,CAAC,IAAI,CAAC,CAMf"}