claudeup 4.7.0 → 4.10.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.
- package/package.json +1 -1
- package/src/__tests__/dual-write-prevention.test.ts +1 -1
- package/src/__tests__/gap-fill-versions.test.ts +382 -0
- package/src/prerunner/index.js +49 -17
- package/src/prerunner/index.ts +59 -18
- package/src/services/claude-cli.js +47 -3
- package/src/services/claude-cli.ts +53 -3
- package/src/services/claude-settings.js +98 -1
- package/src/services/claude-settings.ts +126 -1
- package/src/services/plugin-manager.js +13 -16
- package/src/services/plugin-manager.ts +17 -16
- package/src/ui/components/modals/LoadingModal.js +4 -1
- package/src/ui/components/modals/LoadingModal.tsx +15 -4
- package/src/ui/screens/PluginsScreen.js +11 -16
- package/src/ui/screens/PluginsScreen.tsx +29 -20
|
@@ -443,22 +443,19 @@ export function PluginsScreen() {
|
|
|
443
443
|
else {
|
|
444
444
|
action = "install";
|
|
445
445
|
}
|
|
446
|
-
const actionLabel = action === "update"
|
|
447
|
-
? `Updating ${scopeLabel}`
|
|
448
|
-
: action === "install"
|
|
449
|
-
? `Installing to ${scopeLabel}`
|
|
450
|
-
: `Uninstalling from ${scopeLabel}`;
|
|
451
|
-
modal.loading(`${actionLabel}...`);
|
|
452
446
|
try {
|
|
453
447
|
const scope = scopeValue;
|
|
454
448
|
if (action === "uninstall") {
|
|
449
|
+
modal.loading(`Uninstalling ${plugin.name} from ${scopeLabel}…\nclaude plugin uninstall ${plugin.id} --scope ${scope}`);
|
|
455
450
|
await cliUninstallPlugin(plugin.id, scope, state.projectPath);
|
|
456
451
|
}
|
|
457
452
|
else if (action === "update") {
|
|
453
|
+
modal.loading(`Updating ${plugin.name} in ${scopeLabel}…\nclaude plugin install ${plugin.id} --scope ${scope}`);
|
|
458
454
|
await cliUpdatePlugin(plugin.id, scope);
|
|
459
455
|
await saveVersionForScope(plugin.id, latestVersion, scope);
|
|
460
456
|
}
|
|
461
457
|
else {
|
|
458
|
+
modal.loading(`Installing ${plugin.name} to ${scopeLabel}…\nclaude plugin install ${plugin.id} --scope ${scope}`);
|
|
462
459
|
await cliInstallPlugin(plugin.id, scope);
|
|
463
460
|
await saveVersionForScope(plugin.id, latestVersion, scope);
|
|
464
461
|
modal.hideModal();
|
|
@@ -482,7 +479,7 @@ export function PluginsScreen() {
|
|
|
482
479
|
return;
|
|
483
480
|
const plugin = item.plugin;
|
|
484
481
|
const scope = pluginsState.scope === "global" ? "user" : "project";
|
|
485
|
-
modal.loading(`Updating ${plugin.name}
|
|
482
|
+
modal.loading(`Updating ${plugin.name}…\nclaude plugin install ${plugin.id} --scope ${scope}`);
|
|
486
483
|
try {
|
|
487
484
|
await cliUpdatePlugin(plugin.id, scope);
|
|
488
485
|
if (plugin.version) {
|
|
@@ -503,9 +500,10 @@ export function PluginsScreen() {
|
|
|
503
500
|
if (updatable.length === 0)
|
|
504
501
|
return;
|
|
505
502
|
const scope = pluginsState.scope === "global" ? "user" : "project";
|
|
506
|
-
modal.loading(`Updating ${updatable.length} plugin(s)...`);
|
|
507
503
|
try {
|
|
508
|
-
for (
|
|
504
|
+
for (let i = 0; i < updatable.length; i++) {
|
|
505
|
+
const plugin = updatable[i];
|
|
506
|
+
modal.loading(`Updating ${plugin.name} (${i + 1}/${updatable.length})…\nclaude plugin install ${plugin.id} --scope ${scope}`);
|
|
509
507
|
await cliUpdatePlugin(plugin.id, scope);
|
|
510
508
|
if (plugin.version) {
|
|
511
509
|
await saveVersionForScope(plugin.id, plugin.version, scope);
|
|
@@ -547,21 +545,18 @@ export function PluginsScreen() {
|
|
|
547
545
|
else {
|
|
548
546
|
action = "install";
|
|
549
547
|
}
|
|
550
|
-
const actionLabel = action === "update"
|
|
551
|
-
? `Updating ${scopeLabel}`
|
|
552
|
-
: action === "install"
|
|
553
|
-
? `Installing to ${scopeLabel}`
|
|
554
|
-
: `Uninstalling from ${scopeLabel}`;
|
|
555
|
-
modal.loading(`${actionLabel}...`);
|
|
556
548
|
try {
|
|
557
549
|
if (action === "uninstall") {
|
|
550
|
+
modal.loading(`Uninstalling ${plugin.name} from ${scopeLabel}…\nclaude plugin uninstall ${plugin.id} --scope ${scope}`);
|
|
558
551
|
await cliUninstallPlugin(plugin.id, scope, state.projectPath);
|
|
559
552
|
}
|
|
560
553
|
else if (action === "update") {
|
|
554
|
+
modal.loading(`Updating ${plugin.name} in ${scopeLabel}…\nclaude plugin install ${plugin.id} --scope ${scope}`);
|
|
561
555
|
await cliUpdatePlugin(plugin.id, scope);
|
|
562
556
|
await saveVersionForScope(plugin.id, latestVersion, scope);
|
|
563
557
|
}
|
|
564
558
|
else {
|
|
559
|
+
modal.loading(`Installing ${plugin.name} to ${scopeLabel}…\nclaude plugin install ${plugin.id} --scope ${scope}`);
|
|
565
560
|
await cliInstallPlugin(plugin.id, scope);
|
|
566
561
|
await saveVersionForScope(plugin.id, latestVersion, scope);
|
|
567
562
|
modal.hideModal();
|
|
@@ -583,12 +578,12 @@ export function PluginsScreen() {
|
|
|
583
578
|
if (!item || item.kind !== "plugin" || !item.plugin.isOrphaned)
|
|
584
579
|
return;
|
|
585
580
|
const plugin = item.plugin;
|
|
586
|
-
modal.loading(`Removing ${plugin.name}...`);
|
|
587
581
|
try {
|
|
588
582
|
// Remove from all scopes — try all to clean up stale references
|
|
589
583
|
const scopes = ["user", "project", "local"];
|
|
590
584
|
for (const scope of scopes) {
|
|
591
585
|
try {
|
|
586
|
+
modal.loading(`Removing ${plugin.name} from ${scope}…\nclaude plugin uninstall ${plugin.id} --scope ${scope}`);
|
|
592
587
|
await cliUninstallPlugin(plugin.id, scope, state.projectPath);
|
|
593
588
|
}
|
|
594
589
|
catch {
|
|
@@ -559,22 +559,23 @@ export function PluginsScreen() {
|
|
|
559
559
|
action = "install";
|
|
560
560
|
}
|
|
561
561
|
|
|
562
|
-
const actionLabel =
|
|
563
|
-
action === "update"
|
|
564
|
-
? `Updating ${scopeLabel}`
|
|
565
|
-
: action === "install"
|
|
566
|
-
? `Installing to ${scopeLabel}`
|
|
567
|
-
: `Uninstalling from ${scopeLabel}`;
|
|
568
|
-
modal.loading(`${actionLabel}...`);
|
|
569
|
-
|
|
570
562
|
try {
|
|
571
563
|
const scope = scopeValue as PluginScope;
|
|
572
564
|
if (action === "uninstall") {
|
|
565
|
+
modal.loading(
|
|
566
|
+
`Uninstalling ${plugin.name} from ${scopeLabel}…\nclaude plugin uninstall ${plugin.id} --scope ${scope}`,
|
|
567
|
+
);
|
|
573
568
|
await cliUninstallPlugin(plugin.id, scope, state.projectPath);
|
|
574
569
|
} else if (action === "update") {
|
|
570
|
+
modal.loading(
|
|
571
|
+
`Updating ${plugin.name} in ${scopeLabel}…\nclaude plugin install ${plugin.id} --scope ${scope}`,
|
|
572
|
+
);
|
|
575
573
|
await cliUpdatePlugin(plugin.id, scope);
|
|
576
574
|
await saveVersionForScope(plugin.id, latestVersion, scope);
|
|
577
575
|
} else {
|
|
576
|
+
modal.loading(
|
|
577
|
+
`Installing ${plugin.name} to ${scopeLabel}…\nclaude plugin install ${plugin.id} --scope ${scope}`,
|
|
578
|
+
);
|
|
578
579
|
await cliInstallPlugin(plugin.id, scope);
|
|
579
580
|
await saveVersionForScope(plugin.id, latestVersion, scope);
|
|
580
581
|
modal.hideModal();
|
|
@@ -599,7 +600,9 @@ export function PluginsScreen() {
|
|
|
599
600
|
const plugin = item.plugin;
|
|
600
601
|
const scope: PluginScope = pluginsState.scope === "global" ? "user" : "project";
|
|
601
602
|
|
|
602
|
-
modal.loading(
|
|
603
|
+
modal.loading(
|
|
604
|
+
`Updating ${plugin.name}…\nclaude plugin install ${plugin.id} --scope ${scope}`,
|
|
605
|
+
);
|
|
603
606
|
try {
|
|
604
607
|
await cliUpdatePlugin(plugin.id, scope);
|
|
605
608
|
if (plugin.version) {
|
|
@@ -620,10 +623,13 @@ export function PluginsScreen() {
|
|
|
620
623
|
if (updatable.length === 0) return;
|
|
621
624
|
|
|
622
625
|
const scope: PluginScope = pluginsState.scope === "global" ? "user" : "project";
|
|
623
|
-
modal.loading(`Updating ${updatable.length} plugin(s)...`);
|
|
624
626
|
|
|
625
627
|
try {
|
|
626
|
-
for (
|
|
628
|
+
for (let i = 0; i < updatable.length; i++) {
|
|
629
|
+
const plugin = updatable[i];
|
|
630
|
+
modal.loading(
|
|
631
|
+
`Updating ${plugin.name} (${i + 1}/${updatable.length})…\nclaude plugin install ${plugin.id} --scope ${scope}`,
|
|
632
|
+
);
|
|
627
633
|
await cliUpdatePlugin(plugin.id, scope);
|
|
628
634
|
if (plugin.version) {
|
|
629
635
|
await saveVersionForScope(plugin.id, plugin.version, scope);
|
|
@@ -670,21 +676,22 @@ export function PluginsScreen() {
|
|
|
670
676
|
action = "install";
|
|
671
677
|
}
|
|
672
678
|
|
|
673
|
-
const actionLabel =
|
|
674
|
-
action === "update"
|
|
675
|
-
? `Updating ${scopeLabel}`
|
|
676
|
-
: action === "install"
|
|
677
|
-
? `Installing to ${scopeLabel}`
|
|
678
|
-
: `Uninstalling from ${scopeLabel}`;
|
|
679
|
-
modal.loading(`${actionLabel}...`);
|
|
680
|
-
|
|
681
679
|
try {
|
|
682
680
|
if (action === "uninstall") {
|
|
681
|
+
modal.loading(
|
|
682
|
+
`Uninstalling ${plugin.name} from ${scopeLabel}…\nclaude plugin uninstall ${plugin.id} --scope ${scope}`,
|
|
683
|
+
);
|
|
683
684
|
await cliUninstallPlugin(plugin.id, scope, state.projectPath);
|
|
684
685
|
} else if (action === "update") {
|
|
686
|
+
modal.loading(
|
|
687
|
+
`Updating ${plugin.name} in ${scopeLabel}…\nclaude plugin install ${plugin.id} --scope ${scope}`,
|
|
688
|
+
);
|
|
685
689
|
await cliUpdatePlugin(plugin.id, scope);
|
|
686
690
|
await saveVersionForScope(plugin.id, latestVersion, scope);
|
|
687
691
|
} else {
|
|
692
|
+
modal.loading(
|
|
693
|
+
`Installing ${plugin.name} to ${scopeLabel}…\nclaude plugin install ${plugin.id} --scope ${scope}`,
|
|
694
|
+
);
|
|
688
695
|
await cliInstallPlugin(plugin.id, scope);
|
|
689
696
|
await saveVersionForScope(plugin.id, latestVersion, scope);
|
|
690
697
|
modal.hideModal();
|
|
@@ -706,12 +713,14 @@ export function PluginsScreen() {
|
|
|
706
713
|
if (!item || item.kind !== "plugin" || !item.plugin.isOrphaned) return;
|
|
707
714
|
|
|
708
715
|
const plugin = item.plugin;
|
|
709
|
-
modal.loading(`Removing ${plugin.name}...`);
|
|
710
716
|
try {
|
|
711
717
|
// Remove from all scopes — try all to clean up stale references
|
|
712
718
|
const scopes: PluginScope[] = ["user", "project", "local"];
|
|
713
719
|
for (const scope of scopes) {
|
|
714
720
|
try {
|
|
721
|
+
modal.loading(
|
|
722
|
+
`Removing ${plugin.name} from ${scope}…\nclaude plugin uninstall ${plugin.id} --scope ${scope}`,
|
|
723
|
+
);
|
|
715
724
|
await cliUninstallPlugin(plugin.id, scope, state.projectPath);
|
|
716
725
|
} catch {
|
|
717
726
|
// Ignore errors for scopes where it doesn't exist
|