@gogitcms/editor 0.30.0 → 0.32.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/app/src/App.tsx CHANGED
@@ -73,7 +73,7 @@ type Branch = {
73
73
  writableProjects?: string[];
74
74
  };
75
75
  type Workspace = { id: string; name: string; slug: string };
76
- type Project = { name: string; label: string; orphaned: boolean };
76
+ type Project = { id: string; name: string; label: string; orphaned: boolean };
77
77
  type Repository = { id: string; owner: string; name: string; branches: Branch[]; defaultBranch: string; projects?: Project[] };
78
78
 
79
79
  // Resolve which project to open, and whether the choice is the user's to make.
@@ -578,7 +578,11 @@ function RepoPicker({
578
578
  {loading ? <Text color="secondary">Loading repositories…</Text> : null}
579
579
  {error ? <Text color={t.color.diffDelFg}>Could not load repositories.</Text> : null}
580
580
  {!loading && repos.length === 0 ? (
581
- <Text color="secondary">No repositories connected to your workspaces yet.</Text>
581
+ <Text color="secondary">
582
+ No repositories to edit yet. Either none is connected to your workspaces, or every
583
+ project is private and you have not been added to one — ask a workspace owner or
584
+ admin to add you.
585
+ </Text>
582
586
  ) : null}
583
587
  {repos.map((r) => (
584
588
  <Button
@@ -597,10 +601,13 @@ function RepoPicker({
597
601
  }
598
602
 
599
603
  // Maps a GraphQL notification row to the design-system NotificationItem shape.
600
- type GqlNotification = { id: string; title: string; body?: string | null; level: string; read: boolean; createdAt: string; authorName?: string | null; authorEmail?: string | null };
604
+ type GqlNotification = { id: string; kind?: string | null; title: string; body?: string | null; level: string; read: boolean; createdAt: string; authorName?: string | null; authorEmail?: string | null; repository?: string | null; project?: string | null };
601
605
  const toNotificationItem = (n: GqlNotification): NotificationItem => ({
602
606
  id: n.id,
607
+ kind: n.kind ?? undefined,
603
608
  title: n.title,
609
+ // The bell is scoped to the repository or project being edited, so naming
610
+ // either on every row would be noise; the title already carries the branch.
604
611
  body: n.body ?? undefined,
605
612
  level: n.level === "error" ? "error" : "info",
606
613
  read: n.read,
@@ -690,6 +697,7 @@ function CmsView({
690
697
  branch,
691
698
  defaultBranchId,
692
699
  projectName,
700
+ projectId,
693
701
  projects,
694
702
  soleProjectName,
695
703
  projectLocked,
@@ -706,6 +714,10 @@ function CmsView({
706
714
  // projects have not loaded, and for local mode; every content query passes it
707
715
  // through, and the server applies the same defaulting rule when it is absent.
708
716
  projectName?: string;
717
+ // The id of that project, when it resolved to one the repository has. It
718
+ // scopes the notification bell: a project's own notifications plus the
719
+ // repository-wide ones. Undefined falls back to the whole repository.
720
+ projectId?: string;
709
721
  // The repository's non-orphaned projects, for the picker. One (or none) hides
710
722
  // the picker entirely — a repository without a manifest should look exactly as
711
723
  // it did before projects existed.
@@ -796,11 +808,11 @@ function CmsView({
796
808
  // Notifications for this repository context. Polls so the bell reflects new
797
809
  // import/export outcomes without a manual refresh.
798
810
  const { data: notifData, refetch: refetchNotifs } = useQuery(NOTIFICATIONS, {
799
- variables: { repositoryId: repo.id, limit: 50 },
811
+ variables: { repositoryId: repo.id, projectId: projectId ?? null, limit: 50 },
800
812
  pollInterval: 30000,
801
813
  });
802
814
  const [markAllRead] = useMutation(MARK_NOTIFICATIONS_READ, {
803
- variables: { repositoryId: repo.id },
815
+ variables: { repositoryId: repo.id, projectId: projectId ?? null },
804
816
  });
805
817
  const notifications: NotificationItem[] = (notifData?.notifications ?? []).map(toNotificationItem);
806
818
  const unreadNotifications: number = notifData?.unreadNotificationCount ?? 0;
@@ -2704,6 +2716,7 @@ function BrowserScreen({ onSignOut, workspaces }: { onSignOut: () => void; works
2704
2716
  // fully usable and only the notification bell reports it.
2705
2717
  importing={branchImport.importing}
2706
2718
  projectName={project.name}
2719
+ projectId={project.project?.id}
2707
2720
  projects={project.projects}
2708
2721
  soleProjectName={project.sole?.name}
2709
2722
  projectLocked={project.locked}
@@ -34,6 +34,7 @@ export const REPOSITORIES = gql`
34
34
  }
35
35
  defaultBranch
36
36
  projects {
37
+ id
37
38
  name
38
39
  label
39
40
  orphaned
@@ -459,10 +460,15 @@ export const ME = gql`
459
460
  }
460
461
  `;
461
462
 
463
+ // Scoped to the project being edited when there is one: that project's own
464
+ // notifications plus the repository-wide ones (imports, exports, branches,
465
+ // change requests) that concern every project on the branch. Without a project
466
+ // id it falls back to the whole repository.
462
467
  export const NOTIFICATIONS = gql`
463
- query Notifications($repositoryId: ID, $limit: Int) {
464
- notifications(repositoryId: $repositoryId, limit: $limit) {
468
+ query Notifications($repositoryId: ID, $projectId: ID, $limit: Int) {
469
+ notifications(repositoryId: $repositoryId, projectId: $projectId, limit: $limit) {
465
470
  id
471
+ kind
466
472
  title
467
473
  body
468
474
  level
@@ -470,8 +476,10 @@ export const NOTIFICATIONS = gql`
470
476
  createdAt
471
477
  authorName
472
478
  authorEmail
479
+ repository
480
+ project
473
481
  }
474
- unreadNotificationCount(repositoryId: $repositoryId)
482
+ unreadNotificationCount(repositoryId: $repositoryId, projectId: $projectId)
475
483
  }
476
484
  `;
477
485
 
@@ -510,8 +518,8 @@ export const BRANCH_IMPORT_PROGRESS = gql`
510
518
  `;
511
519
 
512
520
  export const MARK_NOTIFICATIONS_READ = gql`
513
- mutation MarkNotificationsRead($repositoryId: ID) {
514
- markNotificationsRead(all: true, repositoryId: $repositoryId)
521
+ mutation MarkNotificationsRead($repositoryId: ID, $projectId: ID) {
522
+ markNotificationsRead(all: true, repositoryId: $repositoryId, projectId: $projectId)
515
523
  }
516
524
  `;
517
525
 
@@ -4,10 +4,11 @@ import { useTheme, useThemeMode, ThemeScope } from "../ThemeProvider";
4
4
  import { lightTheme, darkTheme } from "../theme";
5
5
  import { Text } from "./Text";
6
6
  import { Icon } from "./Icon";
7
+ import type { IconName } from "../icons";
7
8
  import { Spinner } from "./Spinner";
8
9
 
9
10
  // One notification, shaped for display. Transport-agnostic: the frontend/mobile
10
- // apps map GraphQL rows and the desktop maps REST rows into this.
11
+ // apps map GraphQL rows and the desktop and dashboard map REST rows into this.
11
12
  export type NotificationItem = {
12
13
  id: string;
13
14
  title: string;
@@ -16,8 +17,39 @@ export type NotificationItem = {
16
17
  read: boolean;
17
18
  createdAt: string; // ISO 8601
18
19
  author?: string; // display name/email of who caused it, when known
20
+ // What produced it — picks the icon. Unknown kinds fall back to the bell.
21
+ kind?: NotificationKind | string;
22
+ // Where it happened, for a list that spans several repositories/projects.
23
+ // Omit whichever the list is already scoped to.
24
+ repository?: string;
25
+ project?: string;
19
26
  };
20
27
 
28
+ export type NotificationKind = "import" | "export" | "merge" | "change_request" | "member" | "branch" | "project";
29
+
30
+ // The icon for a notification kind. Exported so hosts that draw their own rows
31
+ // (a scope picker's section headers, say) agree with the list.
32
+ export function notificationKindIcon(kind?: string): IconName {
33
+ switch (kind) {
34
+ case "import":
35
+ return "download";
36
+ case "export":
37
+ return "upload";
38
+ case "merge":
39
+ return "gitMerge";
40
+ case "change_request":
41
+ return "gitPullRequest";
42
+ case "member":
43
+ return "user";
44
+ case "branch":
45
+ return "gitBranch";
46
+ case "project":
47
+ return "folder";
48
+ default:
49
+ return "bell";
50
+ }
51
+ }
52
+
21
53
  // relativeTime renders a compact age ("just now", "5m", "3h", "2d").
22
54
  function relativeTime(iso: string): string {
23
55
  const then = Date.parse(iso);
@@ -32,7 +64,65 @@ function relativeTime(iso: string): string {
32
64
  return `${days}d`;
33
65
  }
34
66
 
35
- // A single notification row: an unread dot + level-tinted title, body, and age.
67
+ // InlineCode renders a sentence whose backticked spans (`main`, `#12`'s
68
+ // branch) are set in the mono face, so a title like "Created `zyx` branch"
69
+ // reads as prose around a name rather than as punctuation. An unmatched
70
+ // backtick is left as typed.
71
+ export function InlineCode({
72
+ text,
73
+ variant = "sm",
74
+ weight,
75
+ color,
76
+ numberOfLines,
77
+ testID,
78
+ }: {
79
+ text: string;
80
+ variant?: "sm" | "body" | "monoSm" | "xs";
81
+ weight?: "regular" | "medium" | "semibold";
82
+ color?: string;
83
+ numberOfLines?: number;
84
+ testID?: string;
85
+ }) {
86
+ const t = useTheme();
87
+ const parts = text.split("`");
88
+ // An even number of parts means an odd number of backticks: not a pair, so
89
+ // render the text untouched.
90
+ if (parts.length % 2 === 0) {
91
+ return (
92
+ <Text variant={variant} weight={weight} color={color} numberOfLines={numberOfLines} testID={testID}>
93
+ {text}
94
+ </Text>
95
+ );
96
+ }
97
+ return (
98
+ <Text variant={variant} weight={weight} color={color} numberOfLines={numberOfLines} testID={testID}>
99
+ {parts.map((part, i) =>
100
+ i % 2 === 1 ? (
101
+ <Text
102
+ key={i}
103
+ variant={variant}
104
+ weight={weight}
105
+ color={color}
106
+ mono
107
+ style={{
108
+ backgroundColor: t.color.surfaceSunken,
109
+ borderRadius: t.radius.sm,
110
+ paddingHorizontal: 3,
111
+ }}
112
+ >
113
+ {part}
114
+ </Text>
115
+ ) : (
116
+ part
117
+ ),
118
+ )}
119
+ </Text>
120
+ );
121
+ }
122
+
123
+ // A single notification row: a kind icon, the title (unread rows in bold, error
124
+ // rows tinted), the body, and a context line — where it happened and who did
125
+ // it — with the age on the right.
36
126
  function NotificationRow({
37
127
  item,
38
128
  divided,
@@ -44,12 +134,16 @@ function NotificationRow({
44
134
  }) {
45
135
  const t = useTheme();
46
136
  const titleColor = item.level === "error" ? t.color.diffDelFg : t.color.textPrimary;
137
+ const context = [item.repository, item.project].filter(Boolean).join(" · ");
138
+ const meta = [context, item.author ? `by ${item.author}` : ""].filter(Boolean).join(" · ");
47
139
  return (
48
140
  <Pressable
49
141
  onPress={onPress}
142
+ disabled={!onPress}
143
+ testID={`notification-${item.id}`}
50
144
  style={({ pressed, hovered }: { pressed: boolean; hovered?: boolean }) => ({
51
145
  flexDirection: "row",
52
- gap: t.space(2.5),
146
+ gap: t.space(3),
53
147
  paddingHorizontal: t.space(4),
54
148
  paddingVertical: t.space(3),
55
149
  borderBottomWidth: divided ? 1 : 0,
@@ -57,33 +151,57 @@ function NotificationRow({
57
151
  backgroundColor: hovered || pressed ? t.color.surfaceHover : "transparent",
58
152
  })}
59
153
  >
60
- <View
61
- style={{
62
- width: 8,
63
- height: 8,
64
- marginTop: 5,
65
- borderRadius: t.radius.pill,
66
- backgroundColor: item.read ? "transparent" : t.color.diffDelFg,
67
- }}
68
- />
69
- <View style={{ flex: 1, gap: 2 }}>
70
- <View style={{ flexDirection: "row", alignItems: "center", gap: t.space(2) }}>
71
- <Text
72
- variant="sm"
73
- weight={item.read ? "medium" : "semibold"}
74
- color={titleColor}
75
- numberOfLines={2}
76
- style={{ flex: 1 }}
77
- >
78
- {item.title}
79
- </Text>
154
+ <View style={{ width: 28, height: 28, alignItems: "center", justifyContent: "center", position: "relative" }}>
155
+ <View
156
+ style={{
157
+ width: 28,
158
+ height: 28,
159
+ borderRadius: t.radius.pill,
160
+ alignItems: "center",
161
+ justifyContent: "center",
162
+ backgroundColor: item.level === "error" ? t.color.diffDelBg : t.color.surfaceSunken,
163
+ }}
164
+ >
165
+ <Icon
166
+ name={notificationKindIcon(item.kind)}
167
+ size={14}
168
+ color={item.level === "error" ? t.color.diffDelFg : t.color.textSecondary}
169
+ />
170
+ </View>
171
+ {/* Unread dot, riding on the icon's corner. */}
172
+ {item.read ? null : (
173
+ <View
174
+ testID="notification-unread"
175
+ style={{
176
+ position: "absolute",
177
+ top: -1,
178
+ right: -1,
179
+ width: 8,
180
+ height: 8,
181
+ borderRadius: t.radius.pill,
182
+ backgroundColor: t.color.diffDelFg,
183
+ borderWidth: 1,
184
+ borderColor: t.color.surfaceRaised,
185
+ }}
186
+ />
187
+ )}
188
+ </View>
189
+ <View style={{ flex: 1, gap: 2, minWidth: 0 }}>
190
+ <View style={{ flexDirection: "row", alignItems: "flex-start", gap: t.space(2) }}>
191
+ <View style={{ flex: 1, minWidth: 0 }}>
192
+ <InlineCode
193
+ text={item.title}
194
+ variant="sm"
195
+ weight={item.read ? "medium" : "semibold"}
196
+ color={titleColor}
197
+ numberOfLines={2}
198
+ />
199
+ </View>
80
200
  <Text variant="monoSm" color="tertiary">{relativeTime(item.createdAt)}</Text>
81
201
  </View>
82
- {item.body ? (
83
- <Text variant="monoSm" color="secondary" numberOfLines={2}>{item.body}</Text>
84
- ) : null}
85
- {item.author ? (
86
- <Text variant="monoSm" color="tertiary" numberOfLines={1}>{`by ${item.author}`}</Text>
202
+ {item.body ? <InlineCode text={item.body} variant="monoSm" color={t.color.textSecondary} numberOfLines={2} /> : null}
203
+ {meta ? (
204
+ <Text variant="monoSm" color="tertiary" numberOfLines={1}>{meta}</Text>
87
205
  ) : null}
88
206
  </View>
89
207
  </Pressable>
@@ -28,6 +28,7 @@ export const icons = {
28
28
  chevronDown: ["m6 9 6 6 6-6"],
29
29
  chevronUp: ["m18 15-6-6-6 6"],
30
30
  folder: ["M3 6a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"],
31
+ user: ["M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2", "M12 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8Z"],
31
32
  building: ["M3 21h18", "M6 21V7l7-4v18", "M18 21V11l-5-3"],
32
33
  menu: ["M3 6h18", "M3 12h18", "M3 18h18"],
33
34
  plus: ["M5 12h14", "M12 5v14"],
@@ -115,9 +115,10 @@ export { Spinner } from "./components/Spinner";
115
115
  export type { SpinnerProps } from "./components/Spinner";
116
116
 
117
117
  // Notifications
118
- export { NotificationBell, NotificationList } from "./components/Notifications";
118
+ export { NotificationBell, NotificationList, InlineCode, notificationKindIcon } from "./components/Notifications";
119
119
  export type {
120
120
  NotificationItem,
121
+ NotificationKind,
121
122
  NotificationBellProps,
122
123
  NotificationListProps,
123
124
  } from "./components/Notifications";
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@gogitcms/editor",
3
- "version": "0.30.0",
3
+ "version": "0.32.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@gogitcms/editor",
9
- "version": "0.30.0",
9
+ "version": "0.32.0",
10
10
  "dependencies": {
11
11
  "@apollo/client": "^3.11.8",
12
12
  "@handlewithcare/react-prosemirror": "^3.2.7",
@@ -47,11 +47,11 @@
47
47
  "node": ">=20"
48
48
  },
49
49
  "optionalDependencies": {
50
- "@gogitcms/gitcms-local-darwin-arm64": "0.30.0",
51
- "@gogitcms/gitcms-local-darwin-x64": "0.30.0",
52
- "@gogitcms/gitcms-local-linux-arm64": "0.30.0",
53
- "@gogitcms/gitcms-local-linux-x64": "0.30.0",
54
- "@gogitcms/gitcms-local-win32-x64": "0.30.0"
50
+ "@gogitcms/gitcms-local-darwin-arm64": "0.32.0",
51
+ "@gogitcms/gitcms-local-darwin-x64": "0.32.0",
52
+ "@gogitcms/gitcms-local-linux-arm64": "0.32.0",
53
+ "@gogitcms/gitcms-local-linux-x64": "0.32.0",
54
+ "@gogitcms/gitcms-local-win32-x64": "0.32.0"
55
55
  }
56
56
  },
57
57
  "node_modules/@apollo/client": {
@@ -751,9 +751,9 @@
751
751
  }
752
752
  },
753
753
  "node_modules/@gogitcms/gitcms-local-darwin-arm64": {
754
- "version": "0.30.0",
755
- "resolved": "https://registry.npmjs.org/@gogitcms/gitcms-local-darwin-arm64/-/gitcms-local-darwin-arm64-0.30.0.tgz",
756
- "integrity": "sha512-X1OFPGdHVDZ/TuWoQdcUyc8rSxQ44qWXLAXL1agz+h41EuxlIgR+C+1DqS6EvGCVY/HXZKIg2L3sqAM8HxKO5w==",
754
+ "version": "0.32.0",
755
+ "resolved": "https://registry.npmjs.org/@gogitcms/gitcms-local-darwin-arm64/-/gitcms-local-darwin-arm64-0.32.0.tgz",
756
+ "integrity": "sha512-N5lhceFg06DviLEfQzXtJWjHHQcYbx79TLd/YlsBwD9LWMjY1RyLN0/E3pxAmNkEgF3sFCqdloe7akmmYjiHcg==",
757
757
  "cpu": [
758
758
  "arm64"
759
759
  ],
@@ -764,9 +764,9 @@
764
764
  ]
765
765
  },
766
766
  "node_modules/@gogitcms/gitcms-local-darwin-x64": {
767
- "version": "0.30.0",
768
- "resolved": "https://registry.npmjs.org/@gogitcms/gitcms-local-darwin-x64/-/gitcms-local-darwin-x64-0.30.0.tgz",
769
- "integrity": "sha512-LVStgvvQFlWkJuiZYFxhuEtYBu2lMNG4TpOM3JcO2rqjhuT1QRtumvORnR+Jtz7LXvGgFFnQR7GEJD20OIj6OA==",
767
+ "version": "0.32.0",
768
+ "resolved": "https://registry.npmjs.org/@gogitcms/gitcms-local-darwin-x64/-/gitcms-local-darwin-x64-0.32.0.tgz",
769
+ "integrity": "sha512-Lz/RXG+ckXS0V7vk7u67ravCZHiMJ/rISkJ1sAaUz1H5eJkWRJaWGT4rbpynqtWcUG017HfS0ef9LYQ5xpg5Tw==",
770
770
  "cpu": [
771
771
  "x64"
772
772
  ],
@@ -777,9 +777,9 @@
777
777
  ]
778
778
  },
779
779
  "node_modules/@gogitcms/gitcms-local-linux-x64": {
780
- "version": "0.30.0",
781
- "resolved": "https://registry.npmjs.org/@gogitcms/gitcms-local-linux-x64/-/gitcms-local-linux-x64-0.30.0.tgz",
782
- "integrity": "sha512-FmyMNRPy+JI85YTY+kPD7l5sAtdhjLYSDk5o8iAswTj7EuBA+Prg2Nzfc2JLSCAd8KBS5Nu0ZImUzuSV96z8tQ==",
780
+ "version": "0.32.0",
781
+ "resolved": "https://registry.npmjs.org/@gogitcms/gitcms-local-linux-x64/-/gitcms-local-linux-x64-0.32.0.tgz",
782
+ "integrity": "sha512-l0ltWO4ILzgAlUIO3SaHpaBaJ97Mli6GKyJBHJBu/eZwaHKyC7fdN16pcmwfUD2ykaHTuzTgJoRXq6d0j85S4Q==",
783
783
  "cpu": [
784
784
  "x64"
785
785
  ],
@@ -790,9 +790,9 @@
790
790
  ]
791
791
  },
792
792
  "node_modules/@gogitcms/gitcms-local-win32-x64": {
793
- "version": "0.30.0",
794
- "resolved": "https://registry.npmjs.org/@gogitcms/gitcms-local-win32-x64/-/gitcms-local-win32-x64-0.30.0.tgz",
795
- "integrity": "sha512-5gfXP9N0XJslyZPmRYNBFF2XSHyQEh+aZ5HZMk92RlSGhVLzkZXYjNOfcDLsN7L2rnLsnTHwpm04W0sjMVe6XA==",
793
+ "version": "0.32.0",
794
+ "resolved": "https://registry.npmjs.org/@gogitcms/gitcms-local-win32-x64/-/gitcms-local-win32-x64-0.32.0.tgz",
795
+ "integrity": "sha512-DOQYf+D8uChcNWHPCvkQHsTmKvSSwIUoavwtJ8xzxbbQes4gXFbMSjdXDetjtgCQ4d6B63poOxj3of091+aK4g==",
796
796
  "cpu": [
797
797
  "x64"
798
798
  ],
@@ -4289,9 +4289,9 @@
4289
4289
  }
4290
4290
  },
4291
4291
  "node_modules/prosemirror-transform": {
4292
- "version": "1.12.0",
4293
- "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz",
4294
- "integrity": "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==",
4292
+ "version": "1.12.1",
4293
+ "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.1.tgz",
4294
+ "integrity": "sha512-t4F5615FycnCqsX7ShTUs8+jfnwcf46kuFRvSl/3qFx2QTZ4DjgowesLHQXcFP7G//TjesqZG3WtgL7vdyVJyA==",
4295
4295
  "license": "MIT",
4296
4296
  "dependencies": {
4297
4297
  "prosemirror-model": "^1.21.0"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gogitcms/editor",
3
- "version": "0.30.0",
3
+ "version": "0.32.0",
4
4
  "description": "Terminal UI for setting up and running the Go·Git CMS content editor",
5
5
  "type": "module",
6
6
  "bin": {
@@ -65,10 +65,10 @@
65
65
  "@gogitcms/frontend": "workspace:*"
66
66
  },
67
67
  "optionalDependencies": {
68
- "@gogitcms/gitcms-local-darwin-arm64": "0.30.0",
69
- "@gogitcms/gitcms-local-darwin-x64": "0.30.0",
70
- "@gogitcms/gitcms-local-linux-arm64": "0.30.0",
71
- "@gogitcms/gitcms-local-linux-x64": "0.30.0",
72
- "@gogitcms/gitcms-local-win32-x64": "0.30.0"
68
+ "@gogitcms/gitcms-local-darwin-arm64": "0.32.0",
69
+ "@gogitcms/gitcms-local-darwin-x64": "0.32.0",
70
+ "@gogitcms/gitcms-local-linux-arm64": "0.32.0",
71
+ "@gogitcms/gitcms-local-linux-x64": "0.32.0",
72
+ "@gogitcms/gitcms-local-win32-x64": "0.32.0"
73
73
  }
74
74
  }