shiva-code 0.5.3 → 0.5.4

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.
@@ -299,6 +299,38 @@ var ApiClient = class {
299
299
  });
300
300
  }
301
301
  // ============================================
302
+ // Packages Endpoints (Cloud-synced packages)
303
+ // ============================================
304
+ /**
305
+ * Get all packages from cloud
306
+ */
307
+ async getPackages() {
308
+ return this.request("/packages");
309
+ }
310
+ /**
311
+ * Sync a package to cloud
312
+ */
313
+ async syncPackage(data) {
314
+ return this.request("/packages", {
315
+ method: "POST",
316
+ body: JSON.stringify(data)
317
+ });
318
+ }
319
+ /**
320
+ * Get a specific package from cloud
321
+ */
322
+ async getPackage(name) {
323
+ return this.request(`/packages/${encodeURIComponent(name)}`);
324
+ }
325
+ /**
326
+ * Delete a package from cloud
327
+ */
328
+ async deleteCloudPackage(name) {
329
+ return this.request(`/packages/${encodeURIComponent(name)}`, {
330
+ method: "DELETE"
331
+ });
332
+ }
333
+ // ============================================
302
334
  // Two-Factor Authentication Endpoints (Phase 15)
303
335
  // ============================================
304
336
  /**
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  api
3
- } from "./chunk-EGRMFBG6.js";
3
+ } from "./chunk-XVFDKDRZ.js";
4
4
  import "./chunk-OP4HYQZZ.js";
5
5
  import "./chunk-3RG5ZIWI.js";
6
6
  export {
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  api
4
- } from "./chunk-EGRMFBG6.js";
4
+ } from "./chunk-XVFDKDRZ.js";
5
5
  import {
6
6
  CONFIG_PATH,
7
7
  clearAuth,
@@ -6774,6 +6774,185 @@ async function checkProjectExists(path15) {
6774
6774
  return false;
6775
6775
  }
6776
6776
  }
6777
+ sessionsCommand.command("push").description("Sessions in Cloud sichern").option("-p, --project <pfad>", "Nur Sessions eines Projekts").action(async (options) => {
6778
+ const { api: api2 } = await import("./client-2L7NWNCZ.js");
6779
+ const { isAuthenticated: isAuthenticated2 } = await import("./config-FGMZONWV.js");
6780
+ const { getProjectConfig: getProjectConfig2 } = await import("./config-D6M6LI6U.js");
6781
+ if (!isAuthenticated2()) {
6782
+ log.error("Nicht angemeldet");
6783
+ log.info("Anmelden mit: shiva login");
6784
+ return;
6785
+ }
6786
+ let projects = await getAllClaudeProjects();
6787
+ if (options.project) {
6788
+ const found = await findProject(options.project);
6789
+ if (found) {
6790
+ projects = [found];
6791
+ } else {
6792
+ log.error(`Projekt nicht gefunden: ${options.project}`);
6793
+ return;
6794
+ }
6795
+ }
6796
+ projects = projects.filter((p) => p.sessions.length > 0);
6797
+ if (projects.length === 0) {
6798
+ log.warn("Keine Sessions zum Synchronisieren gefunden");
6799
+ return;
6800
+ }
6801
+ const spinner = ora9("Synchronisiere Sessions...").start();
6802
+ let syncedCount = 0;
6803
+ let errorCount = 0;
6804
+ for (const project of projects) {
6805
+ const config = getProjectConfig2(project.absolutePath);
6806
+ if (!config.projectId) {
6807
+ continue;
6808
+ }
6809
+ for (const session of project.sessions) {
6810
+ try {
6811
+ await api2.syncSession({
6812
+ sessionId: session.sessionId,
6813
+ projectId: config.projectId,
6814
+ summary: session.firstPrompt,
6815
+ messageCount: session.messageCount,
6816
+ firstPrompt: session.firstPrompt,
6817
+ gitBranch: session.gitBranch
6818
+ });
6819
+ syncedCount++;
6820
+ } catch {
6821
+ errorCount++;
6822
+ }
6823
+ }
6824
+ }
6825
+ spinner.stop();
6826
+ if (syncedCount > 0) {
6827
+ log.success(`${syncedCount} Sessions in Cloud gesichert`);
6828
+ }
6829
+ if (errorCount > 0) {
6830
+ log.warn(`${errorCount} Sessions konnten nicht gesichert werden`);
6831
+ }
6832
+ if (syncedCount === 0 && errorCount === 0) {
6833
+ log.info("Keine Projekte mit Cloud verbunden");
6834
+ log.dim("Verbinden mit: shiva init && shiva sync");
6835
+ }
6836
+ });
6837
+ sessionsCommand.command("pull").description("Sessions aus Cloud laden").option("--json", "JSON Output").action(async (options) => {
6838
+ const { api: api2 } = await import("./client-2L7NWNCZ.js");
6839
+ const { isAuthenticated: isAuthenticated2 } = await import("./config-FGMZONWV.js");
6840
+ if (!isAuthenticated2()) {
6841
+ log.error("Nicht angemeldet");
6842
+ log.info("Anmelden mit: shiva login");
6843
+ return;
6844
+ }
6845
+ const spinner = ora9("Lade Sessions aus Cloud...").start();
6846
+ try {
6847
+ const cloudSessions = await api2.getSessions();
6848
+ spinner.stop();
6849
+ if (options.json) {
6850
+ console.log(JSON.stringify(cloudSessions, null, 2));
6851
+ return;
6852
+ }
6853
+ if (cloudSessions.length === 0) {
6854
+ log.info("Keine Sessions in Cloud gefunden");
6855
+ log.dim("Hochladen mit: shiva sessions push");
6856
+ return;
6857
+ }
6858
+ log.success(`${cloudSessions.length} Sessions in Cloud gefunden`);
6859
+ log.newline();
6860
+ const byProject = /* @__PURE__ */ new Map();
6861
+ for (const session of cloudSessions) {
6862
+ const existing = byProject.get(session.projectId) || [];
6863
+ existing.push(session);
6864
+ byProject.set(session.projectId, existing);
6865
+ }
6866
+ for (const [projectId, sessions] of byProject.entries()) {
6867
+ console.log(colors.bold(`Projekt ID: ${projectId}`));
6868
+ for (const session of sessions.slice(0, 5)) {
6869
+ const data = session.data;
6870
+ const branch = data.gitBranch || "main";
6871
+ const msgs = data.messageCount || 0;
6872
+ log.dim(` ${session.sessionId.substring(0, 8)}... ${branch.padEnd(15)} ${msgs} msgs`);
6873
+ }
6874
+ if (sessions.length > 5) {
6875
+ log.dim(` ... und ${sessions.length - 5} weitere`);
6876
+ }
6877
+ log.newline();
6878
+ }
6879
+ } catch (error) {
6880
+ spinner.stop();
6881
+ log.error(error instanceof Error ? error.message : "Fehler beim Laden");
6882
+ }
6883
+ });
6884
+ sessionsCommand.command("sync").description("Sessions mit Cloud synchronisieren").option("-p, --project <pfad>", "Nur Sessions eines Projekts").action(async (options) => {
6885
+ const { api: api2 } = await import("./client-2L7NWNCZ.js");
6886
+ const { isAuthenticated: isAuthenticated2 } = await import("./config-FGMZONWV.js");
6887
+ const { getProjectConfig: getProjectConfig2 } = await import("./config-D6M6LI6U.js");
6888
+ if (!isAuthenticated2()) {
6889
+ log.error("Nicht angemeldet");
6890
+ log.info("Anmelden mit: shiva login");
6891
+ return;
6892
+ }
6893
+ let projects = await getAllClaudeProjects();
6894
+ if (options.project) {
6895
+ const found = await findProject(options.project);
6896
+ if (found) {
6897
+ projects = [found];
6898
+ } else {
6899
+ log.error(`Projekt nicht gefunden: ${options.project}`);
6900
+ return;
6901
+ }
6902
+ }
6903
+ const spinner = ora9("Synchronisiere Sessions...").start();
6904
+ let pushedCount = 0;
6905
+ for (const project of projects.filter((p) => p.sessions.length > 0)) {
6906
+ const config = getProjectConfig2(project.absolutePath);
6907
+ if (!config.projectId) continue;
6908
+ for (const session of project.sessions) {
6909
+ try {
6910
+ await api2.syncSession({
6911
+ sessionId: session.sessionId,
6912
+ projectId: config.projectId,
6913
+ summary: session.firstPrompt,
6914
+ messageCount: session.messageCount,
6915
+ firstPrompt: session.firstPrompt,
6916
+ gitBranch: session.gitBranch
6917
+ });
6918
+ pushedCount++;
6919
+ } catch {
6920
+ }
6921
+ }
6922
+ }
6923
+ let cloudCount = 0;
6924
+ try {
6925
+ const cloudSessions = await api2.getSessions();
6926
+ cloudCount = cloudSessions.length;
6927
+ } catch {
6928
+ }
6929
+ spinner.stop();
6930
+ log.success("Sessions synchronisiert");
6931
+ log.newline();
6932
+ log.tree.item(`${pushedCount} Sessions \u2192 Cloud`);
6933
+ log.tree.item(`${cloudCount} Sessions in Cloud`);
6934
+ log.newline();
6935
+ log.dim("Sessions werden automatisch mit lokalen Claude Sessions verkn\xFCpft");
6936
+ });
6937
+ sessionsCommand.command("delete <sessionId>").description("Session aus Cloud l\xF6schen").action(async (sessionId) => {
6938
+ const { api: api2 } = await import("./client-2L7NWNCZ.js");
6939
+ const { isAuthenticated: isAuthenticated2 } = await import("./config-FGMZONWV.js");
6940
+ if (!isAuthenticated2()) {
6941
+ log.error("Nicht angemeldet");
6942
+ log.info("Anmelden mit: shiva login");
6943
+ return;
6944
+ }
6945
+ try {
6946
+ const result = await api2.deleteSession(sessionId);
6947
+ if (result.success) {
6948
+ log.success("Session aus Cloud gel\xF6scht");
6949
+ } else {
6950
+ log.error(result.message || "Fehler beim L\xF6schen");
6951
+ }
6952
+ } catch (error) {
6953
+ log.error(error instanceof Error ? error.message : "Fehler beim L\xF6schen");
6954
+ }
6955
+ });
6777
6956
 
6778
6957
  // src/commands/session/session.ts
6779
6958
  import { Command as Command14 } from "commander";
@@ -14203,7 +14382,7 @@ hookCommand.command("scan-command").description("Scanne Bash-Befehle auf Package
14203
14382
  }
14204
14383
  });
14205
14384
  hookCommand.command("push").description("Hooks in Cloud sichern").action(async () => {
14206
- const { api: api2 } = await import("./client-Z6ZMO5QE.js");
14385
+ const { api: api2 } = await import("./client-2L7NWNCZ.js");
14207
14386
  const { isAuthenticated: isAuthenticated2 } = await import("./config-FGMZONWV.js");
14208
14387
  if (!isAuthenticated2()) {
14209
14388
  log.error("Nicht angemeldet");
@@ -14223,7 +14402,7 @@ hookCommand.command("push").description("Hooks in Cloud sichern").action(async (
14223
14402
  }
14224
14403
  });
14225
14404
  hookCommand.command("pull").description("Hooks aus Cloud laden").option("-f, --force", "Lokale Hooks \xFCberschreiben").action(async (options) => {
14226
- const { api: api2 } = await import("./client-Z6ZMO5QE.js");
14405
+ const { api: api2 } = await import("./client-2L7NWNCZ.js");
14227
14406
  const { isAuthenticated: isAuthenticated2 } = await import("./config-FGMZONWV.js");
14228
14407
  if (!isAuthenticated2()) {
14229
14408
  log.error("Nicht angemeldet");
@@ -14255,7 +14434,7 @@ hookCommand.command("pull").description("Hooks aus Cloud laden").option("-f, --f
14255
14434
  }
14256
14435
  });
14257
14436
  hookCommand.command("sync").description("Hooks mit Cloud synchronisieren").action(async () => {
14258
- const { api: api2 } = await import("./client-Z6ZMO5QE.js");
14437
+ const { api: api2 } = await import("./client-2L7NWNCZ.js");
14259
14438
  const { isAuthenticated: isAuthenticated2 } = await import("./config-FGMZONWV.js");
14260
14439
  if (!isAuthenticated2()) {
14261
14440
  log.error("Nicht angemeldet");
@@ -14431,6 +14610,186 @@ packageCommand.command("start <name>").description("Alle Projekte eines Packages
14431
14610
  log.error(error instanceof Error ? error.message : "Unbekannter Fehler");
14432
14611
  }
14433
14612
  });
14613
+ packageCommand.command("push").description("Packages in Cloud sichern").option("-n, --name <name>", "Nur ein bestimmtes Package").action(async (options) => {
14614
+ const { api: api2 } = await import("./client-2L7NWNCZ.js");
14615
+ const { isAuthenticated: isAuthenticated2 } = await import("./config-FGMZONWV.js");
14616
+ if (!isAuthenticated2()) {
14617
+ log.error("Nicht angemeldet");
14618
+ log.info("Anmelden mit: shiva login");
14619
+ return;
14620
+ }
14621
+ let packages = getAllPackages();
14622
+ if (options.name) {
14623
+ const found = getPackage(options.name);
14624
+ if (found) {
14625
+ packages = [found];
14626
+ } else {
14627
+ log.error(`Package nicht gefunden: ${options.name}`);
14628
+ return;
14629
+ }
14630
+ }
14631
+ if (packages.length === 0) {
14632
+ log.warn("Keine Packages zum Synchronisieren gefunden");
14633
+ return;
14634
+ }
14635
+ const spinner = ora21("Synchronisiere Packages...").start();
14636
+ let syncedCount = 0;
14637
+ let errorCount = 0;
14638
+ for (const pkg of packages) {
14639
+ try {
14640
+ await api2.syncPackage({
14641
+ name: pkg.name,
14642
+ description: pkg.description,
14643
+ projects: pkg.projects,
14644
+ launchOrder: pkg.launchOrder
14645
+ });
14646
+ syncedCount++;
14647
+ } catch {
14648
+ errorCount++;
14649
+ }
14650
+ }
14651
+ spinner.stop();
14652
+ if (syncedCount > 0) {
14653
+ log.success(`${syncedCount} Packages in Cloud gesichert`);
14654
+ }
14655
+ if (errorCount > 0) {
14656
+ log.warn(`${errorCount} Packages konnten nicht gesichert werden`);
14657
+ }
14658
+ });
14659
+ packageCommand.command("pull").description("Packages aus Cloud laden").option("-f, --force", "Lokale Packages \xFCberschreiben").option("--json", "JSON Output").action(async (options) => {
14660
+ const { api: api2 } = await import("./client-2L7NWNCZ.js");
14661
+ const { isAuthenticated: isAuthenticated2 } = await import("./config-FGMZONWV.js");
14662
+ if (!isAuthenticated2()) {
14663
+ log.error("Nicht angemeldet");
14664
+ log.info("Anmelden mit: shiva login");
14665
+ return;
14666
+ }
14667
+ const spinner = ora21("Lade Packages aus Cloud...").start();
14668
+ try {
14669
+ const cloudPackages = await api2.getPackages();
14670
+ spinner.stop();
14671
+ if (options.json) {
14672
+ console.log(JSON.stringify(cloudPackages, null, 2));
14673
+ return;
14674
+ }
14675
+ if (cloudPackages.length === 0) {
14676
+ log.info("Keine Packages in Cloud gefunden");
14677
+ log.dim("Hochladen mit: shiva package push");
14678
+ return;
14679
+ }
14680
+ log.success(`${cloudPackages.length} Packages in Cloud gefunden`);
14681
+ log.newline();
14682
+ const localPackages = getAllPackages();
14683
+ let importedCount = 0;
14684
+ let skippedCount = 0;
14685
+ for (const cloudPkg of cloudPackages) {
14686
+ const localPkg = localPackages.find((p) => p.name.toLowerCase() === cloudPkg.name.toLowerCase());
14687
+ if (localPkg && !options.force) {
14688
+ log.dim(` \u23ED ${cloudPkg.name} (lokal vorhanden, --force zum \xDCberschreiben)`);
14689
+ skippedCount++;
14690
+ continue;
14691
+ }
14692
+ try {
14693
+ if (localPkg) {
14694
+ deletePackage(localPkg.name);
14695
+ }
14696
+ createPackage(cloudPkg.name, cloudPkg.description, cloudPkg.launchOrder);
14697
+ for (const projectPath of cloudPkg.projects) {
14698
+ try {
14699
+ addProjectToPackage(cloudPkg.name, projectPath);
14700
+ } catch {
14701
+ }
14702
+ }
14703
+ log.success(` \u2713 ${cloudPkg.name} importiert`);
14704
+ importedCount++;
14705
+ } catch (error) {
14706
+ log.warn(` \u2717 ${cloudPkg.name}: ${error instanceof Error ? error.message : "Fehler"}`);
14707
+ }
14708
+ }
14709
+ log.newline();
14710
+ if (importedCount > 0) {
14711
+ log.success(`${importedCount} Packages importiert`);
14712
+ }
14713
+ if (skippedCount > 0) {
14714
+ log.dim(`${skippedCount} \xFCbersprungen (bereits lokal vorhanden)`);
14715
+ }
14716
+ } catch (error) {
14717
+ spinner.stop();
14718
+ log.error(error instanceof Error ? error.message : "Fehler beim Laden");
14719
+ }
14720
+ });
14721
+ packageCommand.command("sync").description("Packages mit Cloud synchronisieren").action(async () => {
14722
+ const { api: api2 } = await import("./client-2L7NWNCZ.js");
14723
+ const { isAuthenticated: isAuthenticated2 } = await import("./config-FGMZONWV.js");
14724
+ if (!isAuthenticated2()) {
14725
+ log.error("Nicht angemeldet");
14726
+ log.info("Anmelden mit: shiva login");
14727
+ return;
14728
+ }
14729
+ const spinner = ora21("Synchronisiere Packages...").start();
14730
+ const localPackages = getAllPackages();
14731
+ let pushedCount = 0;
14732
+ for (const pkg of localPackages) {
14733
+ try {
14734
+ await api2.syncPackage({
14735
+ name: pkg.name,
14736
+ description: pkg.description,
14737
+ projects: pkg.projects,
14738
+ launchOrder: pkg.launchOrder
14739
+ });
14740
+ pushedCount++;
14741
+ } catch {
14742
+ }
14743
+ }
14744
+ let pulledCount = 0;
14745
+ try {
14746
+ const cloudPackages = await api2.getPackages();
14747
+ for (const cloudPkg of cloudPackages) {
14748
+ const localPkg = localPackages.find((p) => p.name.toLowerCase() === cloudPkg.name.toLowerCase());
14749
+ if (!localPkg) {
14750
+ try {
14751
+ createPackage(cloudPkg.name, cloudPkg.description, cloudPkg.launchOrder);
14752
+ for (const projectPath of cloudPkg.projects) {
14753
+ try {
14754
+ addProjectToPackage(cloudPkg.name, projectPath);
14755
+ } catch {
14756
+ }
14757
+ }
14758
+ pulledCount++;
14759
+ } catch {
14760
+ }
14761
+ }
14762
+ }
14763
+ } catch {
14764
+ }
14765
+ spinner.stop();
14766
+ log.success("Packages synchronisiert");
14767
+ log.newline();
14768
+ log.tree.item(`${pushedCount} lokale Packages \u2192 Cloud`);
14769
+ if (pulledCount > 0) {
14770
+ log.tree.item(`${pulledCount} neue Packages \u2190 Cloud`);
14771
+ }
14772
+ log.tree.item(`${localPackages.length + pulledCount} Packages total`);
14773
+ });
14774
+ packageCommand.command("cloud-delete <name>").description("Package aus Cloud l\xF6schen").action(async (name) => {
14775
+ const { api: api2 } = await import("./client-2L7NWNCZ.js");
14776
+ const { isAuthenticated: isAuthenticated2 } = await import("./config-FGMZONWV.js");
14777
+ if (!isAuthenticated2()) {
14778
+ log.error("Nicht angemeldet");
14779
+ log.info("Anmelden mit: shiva login");
14780
+ return;
14781
+ }
14782
+ try {
14783
+ const result = await api2.deleteCloudPackage(name);
14784
+ if (result.success) {
14785
+ log.success(`Package "${name}" aus Cloud gel\xF6scht`);
14786
+ } else {
14787
+ log.error(result.message || "Fehler beim L\xF6schen");
14788
+ }
14789
+ } catch (error) {
14790
+ log.error(error instanceof Error ? error.message : "Fehler beim L\xF6schen");
14791
+ }
14792
+ });
14434
14793
  function listPackages() {
14435
14794
  const packages = getAllPackages();
14436
14795
  const stats = getPackageStats();
@@ -14471,7 +14830,7 @@ function listPackages() {
14471
14830
 
14472
14831
  // src/index.ts
14473
14832
  var program = new Command36();
14474
- program.name("shiva").description("SHIVA Code - Control Station for Claude Code").version("0.5.3");
14833
+ program.name("shiva").description("SHIVA Code - Control Station for Claude Code").version("0.5.4");
14475
14834
  program.addCommand(loginCommand);
14476
14835
  program.addCommand(logoutCommand);
14477
14836
  program.addCommand(sessionsCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shiva-code",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "description": "Makes Claude Code Persistent - Cross-Project Memory CLI",
5
5
  "author": "SHIVA AI",
6
6
  "license": "MIT",