@gxp-dev/tools 2.0.5

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 (145) hide show
  1. package/.github/workflows/npm-publish.yml +48 -0
  2. package/CLAUDE.md +400 -0
  3. package/README.md +247 -0
  4. package/REFACTOR_PLAN.md +194 -0
  5. package/bin/gx-devtools.js +87 -0
  6. package/bin/lib/cli.js +251 -0
  7. package/bin/lib/commands/assets.js +337 -0
  8. package/bin/lib/commands/build.js +259 -0
  9. package/bin/lib/commands/datastore.js +433 -0
  10. package/bin/lib/commands/dev.js +328 -0
  11. package/bin/lib/commands/extensions.js +298 -0
  12. package/bin/lib/commands/index.js +35 -0
  13. package/bin/lib/commands/init.js +307 -0
  14. package/bin/lib/commands/publish.js +189 -0
  15. package/bin/lib/commands/socket.js +158 -0
  16. package/bin/lib/commands/ssl.js +47 -0
  17. package/bin/lib/constants.js +120 -0
  18. package/bin/lib/tui/App.tsx +600 -0
  19. package/bin/lib/tui/components/CommandInput.tsx +278 -0
  20. package/bin/lib/tui/components/GeminiPanel.tsx +161 -0
  21. package/bin/lib/tui/components/Header.tsx +27 -0
  22. package/bin/lib/tui/components/LogPanel.tsx +122 -0
  23. package/bin/lib/tui/components/TabBar.tsx +56 -0
  24. package/bin/lib/tui/components/WelcomeScreen.tsx +80 -0
  25. package/bin/lib/tui/index.tsx +63 -0
  26. package/bin/lib/tui/services/ExtensionService.ts +122 -0
  27. package/bin/lib/tui/services/GeminiService.ts +395 -0
  28. package/bin/lib/tui/services/ServiceManager.ts +336 -0
  29. package/bin/lib/tui/services/SocketService.ts +204 -0
  30. package/bin/lib/tui/services/ViteService.ts +107 -0
  31. package/bin/lib/tui/services/index.ts +13 -0
  32. package/bin/lib/utils/files.js +180 -0
  33. package/bin/lib/utils/index.js +17 -0
  34. package/bin/lib/utils/paths.js +138 -0
  35. package/bin/lib/utils/prompts.js +71 -0
  36. package/bin/lib/utils/ssl.js +233 -0
  37. package/browser-extensions/README.md +1 -0
  38. package/browser-extensions/chrome/background.js +857 -0
  39. package/browser-extensions/chrome/content.js +51 -0
  40. package/browser-extensions/chrome/devtools.html +9 -0
  41. package/browser-extensions/chrome/devtools.js +23 -0
  42. package/browser-extensions/chrome/icons/gx_off_128.png +0 -0
  43. package/browser-extensions/chrome/icons/gx_off_16.png +0 -0
  44. package/browser-extensions/chrome/icons/gx_off_32.png +0 -0
  45. package/browser-extensions/chrome/icons/gx_off_64.png +0 -0
  46. package/browser-extensions/chrome/icons/gx_on_128.png +0 -0
  47. package/browser-extensions/chrome/icons/gx_on_16.png +0 -0
  48. package/browser-extensions/chrome/icons/gx_on_32.png +0 -0
  49. package/browser-extensions/chrome/icons/gx_on_64.png +0 -0
  50. package/browser-extensions/chrome/inspector.js +1087 -0
  51. package/browser-extensions/chrome/manifest.json +70 -0
  52. package/browser-extensions/chrome/panel.html +638 -0
  53. package/browser-extensions/chrome/panel.js +862 -0
  54. package/browser-extensions/chrome/popup.html +399 -0
  55. package/browser-extensions/chrome/popup.js +515 -0
  56. package/browser-extensions/chrome/rules.json +1 -0
  57. package/browser-extensions/chrome/test-chrome.html +145 -0
  58. package/browser-extensions/chrome/test-mixed-content.html +190 -0
  59. package/browser-extensions/chrome/test-uri-pattern.html +199 -0
  60. package/browser-extensions/firefox/README.md +134 -0
  61. package/browser-extensions/firefox/background.js +804 -0
  62. package/browser-extensions/firefox/content.js +120 -0
  63. package/browser-extensions/firefox/debug-errors.html +229 -0
  64. package/browser-extensions/firefox/debug-https.html +113 -0
  65. package/browser-extensions/firefox/devtools.html +9 -0
  66. package/browser-extensions/firefox/devtools.js +24 -0
  67. package/browser-extensions/firefox/icons/gx_off_128.png +0 -0
  68. package/browser-extensions/firefox/icons/gx_off_16.png +0 -0
  69. package/browser-extensions/firefox/icons/gx_off_32.png +0 -0
  70. package/browser-extensions/firefox/icons/gx_off_64.png +0 -0
  71. package/browser-extensions/firefox/icons/gx_on_128.png +0 -0
  72. package/browser-extensions/firefox/icons/gx_on_16.png +0 -0
  73. package/browser-extensions/firefox/icons/gx_on_32.png +0 -0
  74. package/browser-extensions/firefox/icons/gx_on_64.png +0 -0
  75. package/browser-extensions/firefox/inspector.js +1087 -0
  76. package/browser-extensions/firefox/manifest.json +67 -0
  77. package/browser-extensions/firefox/panel.html +638 -0
  78. package/browser-extensions/firefox/panel.js +862 -0
  79. package/browser-extensions/firefox/popup.html +525 -0
  80. package/browser-extensions/firefox/popup.js +536 -0
  81. package/browser-extensions/firefox/test-gramercy.html +126 -0
  82. package/browser-extensions/firefox/test-imports.html +58 -0
  83. package/browser-extensions/firefox/test-masking.html +147 -0
  84. package/browser-extensions/firefox/test-uri-pattern.html +199 -0
  85. package/docs/DOCUSAURUS_IMPORT.md +378 -0
  86. package/docs/_category_.json +8 -0
  87. package/docs/app-manifest.md +272 -0
  88. package/docs/building-for-platform.md +315 -0
  89. package/docs/dev-tools.md +291 -0
  90. package/docs/getting-started.md +180 -0
  91. package/docs/gxp-store.md +305 -0
  92. package/docs/index.md +44 -0
  93. package/package.json +77 -0
  94. package/runtime/PortalContainer.vue +326 -0
  95. package/runtime/dev-tools/DevToolsModal.vue +217 -0
  96. package/runtime/dev-tools/LayoutSwitcher.vue +221 -0
  97. package/runtime/dev-tools/MockDataEditor.vue +621 -0
  98. package/runtime/dev-tools/SocketSimulator.vue +562 -0
  99. package/runtime/dev-tools/StoreInspector.vue +644 -0
  100. package/runtime/dev-tools/index.js +6 -0
  101. package/runtime/gxpStringsPlugin.js +428 -0
  102. package/runtime/index.html +22 -0
  103. package/runtime/main.js +32 -0
  104. package/runtime/mock-api/auth-middleware.js +97 -0
  105. package/runtime/mock-api/image-generator.js +221 -0
  106. package/runtime/mock-api/index.js +197 -0
  107. package/runtime/mock-api/response-generator.js +394 -0
  108. package/runtime/mock-api/route-generator.js +323 -0
  109. package/runtime/mock-api/socket-triggers.js +371 -0
  110. package/runtime/mock-api/spec-loader.js +300 -0
  111. package/runtime/server.js +180 -0
  112. package/runtime/stores/gxpPortalConfigStore.js +554 -0
  113. package/runtime/stores/index.js +6 -0
  114. package/runtime/vite-inspector-plugin.js +749 -0
  115. package/runtime/vite-source-tracker-plugin.js +232 -0
  116. package/runtime/vite.config.js +402 -0
  117. package/scripts/launch-chrome.js +90 -0
  118. package/scripts/pack-chrome.js +91 -0
  119. package/socket-events/AiSessionMessageCreated.json +18 -0
  120. package/socket-events/SocialStreamPostCreated.json +24 -0
  121. package/socket-events/SocialStreamPostVariantCompleted.json +23 -0
  122. package/template/README.md +332 -0
  123. package/template/app-manifest.json +32 -0
  124. package/template/dev-assets/images/avatar-placeholder.png +0 -0
  125. package/template/dev-assets/images/background-placeholder.jpg +0 -0
  126. package/template/dev-assets/images/banner-placeholder.jpg +0 -0
  127. package/template/dev-assets/images/icon-placeholder.png +0 -0
  128. package/template/dev-assets/images/logo-placeholder.png +0 -0
  129. package/template/dev-assets/images/product-placeholder.jpg +0 -0
  130. package/template/dev-assets/images/thumbnail-placeholder.jpg +0 -0
  131. package/template/env.example +51 -0
  132. package/template/gitignore +53 -0
  133. package/template/index.html +22 -0
  134. package/template/main.js +28 -0
  135. package/template/src/DemoPage.vue +459 -0
  136. package/template/src/Plugin.vue +38 -0
  137. package/template/src/stores/index.js +9 -0
  138. package/template/src/stores/test-data.json +173 -0
  139. package/template/theme-layouts/AdditionalStyling.css +0 -0
  140. package/template/theme-layouts/PrivateLayout.vue +39 -0
  141. package/template/theme-layouts/PublicLayout.vue +39 -0
  142. package/template/theme-layouts/SystemLayout.vue +39 -0
  143. package/template/vite.config.js +333 -0
  144. package/tsconfig.tui.json +21 -0
  145. package/vite.config.js +164 -0
@@ -0,0 +1,180 @@
1
+ ---
2
+ sidebar_position: 2
3
+ title: Getting Started
4
+ description: Install the GxP Toolkit and create your first plugin project
5
+ ---
6
+
7
+ # Getting Started
8
+
9
+ This guide walks you through installing the GxP Toolkit and creating your first plugin project.
10
+
11
+ ## Prerequisites
12
+
13
+ Before you begin, ensure you have:
14
+
15
+ - **Node.js 18+** - [Download Node.js](https://nodejs.org/)
16
+ - **npm 8+** - Comes with Node.js
17
+ - **Code editor** - VS Code recommended
18
+
19
+ ## Installation
20
+
21
+ ### Option 1: Global Installation (Recommended)
22
+
23
+ Install the toolkit globally to use the `gxdev` command anywhere:
24
+
25
+ ```bash
26
+ npm install -g @gramercytech/gx-devtools
27
+ ```
28
+
29
+ ### Option 2: Project-Level Installation
30
+
31
+ Or install as a dev dependency in an existing project:
32
+
33
+ ```bash
34
+ npm install --save-dev @gramercytech/gx-devtools
35
+ ```
36
+
37
+ ## Create a New Plugin
38
+
39
+ ### 1. Initialize Your Project
40
+
41
+ Create a new plugin project using the CLI:
42
+
43
+ ```bash
44
+ # Create a new directory and initialize
45
+ mkdir my-plugin
46
+ cd my-plugin
47
+ gxdev init my-plugin
48
+ ```
49
+
50
+ This creates a complete project structure with:
51
+
52
+ - `src/Plugin.vue` - Your main plugin component
53
+ - `app-manifest.json` - Plugin configuration
54
+ - `theme-layouts/` - Layout components for different contexts
55
+ - `dev-assets/` - Development placeholder assets
56
+
57
+ ### 2. Install Dependencies
58
+
59
+ ```bash
60
+ npm install
61
+ ```
62
+
63
+ ### 3. Start Development Server
64
+
65
+ Start the development server with hot reload:
66
+
67
+ ```bash
68
+ # With HTTPS (recommended)
69
+ npm run dev
70
+
71
+ # Without HTTPS (simpler setup)
72
+ npm run dev-http
73
+ ```
74
+
75
+ Your plugin is now running at `https://localhost:3060` (or `http://localhost:3060`).
76
+
77
+ ## Project Structure
78
+
79
+ After initialization, your project looks like this:
80
+
81
+ ```
82
+ my-plugin/
83
+ ├── src/
84
+ │ ├── Plugin.vue # Main plugin entry point
85
+ │ ├── DemoPage.vue # Example component
86
+ │ └── stores/
87
+ │ └── index.js # Store setup
88
+ ├── theme-layouts/
89
+ │ ├── PublicLayout.vue # Public-facing layout
90
+ │ ├── PrivateLayout.vue # Authenticated layout
91
+ │ └── SystemLayout.vue # System/admin layout
92
+ ├── dev-assets/
93
+ │ └── images/ # Development placeholder images
94
+ ├── app-manifest.json # Plugin configuration
95
+ ├── vite.config.js # Vite configuration
96
+ ├── main.js # Development entry point
97
+ ├── index.html # Development HTML template
98
+ └── .env # Environment variables
99
+ ```
100
+
101
+ ## Your First Edit
102
+
103
+ Open `src/Plugin.vue` and make a change:
104
+
105
+ ```vue
106
+ <template>
107
+ <div class="my-plugin">
108
+ <h1 gxp-string="welcome_title">Welcome to My Plugin!</h1>
109
+ <p>Edit this file to get started.</p>
110
+ </div>
111
+ </template>
112
+
113
+ <script setup>
114
+ import { useGxpStore } from '@gx-runtime/stores/gxpPortalConfigStore';
115
+
116
+ const store = useGxpStore();
117
+ </script>
118
+ ```
119
+
120
+ The page automatically refreshes with your changes.
121
+
122
+ ## SSL Setup (Optional)
123
+
124
+ For HTTPS development (required for some platform features):
125
+
126
+ ```bash
127
+ npm run setup-ssl
128
+ ```
129
+
130
+ This uses [mkcert](https://github.com/FiloSottile/mkcert) to generate trusted local certificates.
131
+
132
+ ## Using the Interactive TUI
133
+
134
+ Run `gxdev` without arguments to launch the interactive Terminal UI:
135
+
136
+ ```bash
137
+ gxdev
138
+ ```
139
+
140
+ The TUI provides:
141
+
142
+ - **Service management** - Start/stop Vite, Socket.IO, extensions
143
+ - **Log viewing** - Real-time logs from all services
144
+ - **Slash commands** - Quick actions like `/dev`, `/socket`, `/ext chrome`
145
+
146
+ ### TUI Keyboard Shortcuts
147
+
148
+ | Shortcut | Action |
149
+ |----------|--------|
150
+ | `Ctrl+1/2/3...` | Switch service tabs |
151
+ | `Ctrl+L` | Clear current log |
152
+ | `Ctrl+C` | Exit application |
153
+ | `Up/Down` | Scroll log panel |
154
+
155
+ ## Next Steps
156
+
157
+ - [Configure your app manifest](./app-manifest) - Set up strings, settings, and assets
158
+ - [Learn the GxP Store](./gxp-store) - State management and platform integration
159
+ - [Use Dev Tools](./dev-tools) - Debug and inspect your plugin
160
+ - [Build for platform](./building-for-platform) - Prepare for production deployment
161
+
162
+ ## Common Commands Reference
163
+
164
+ ```bash
165
+ # Development
166
+ gxdev dev # Start with TUI + Vite
167
+ gxdev dev --no-https # Start without SSL
168
+ gxdev dev --with-socket # Include Socket.IO server
169
+ gxdev dev --chrome # Launch with Chrome extension
170
+ gxdev dev --firefox # Launch with Firefox extension
171
+
172
+ # Building
173
+ gxdev build # Build for production
174
+
175
+ # Utilities
176
+ gxdev datastore list # List store variables
177
+ gxdev datastore scan-strings # Find hardcoded strings
178
+ gxdev socket list # List socket events
179
+ gxdev assets generate # Generate placeholder images
180
+ ```
@@ -0,0 +1,305 @@
1
+ ---
2
+ sidebar_position: 4
3
+ title: GxP Store
4
+ description: State management with Pinia and platform integration
5
+ ---
6
+
7
+ # GxP Store
8
+
9
+ The GxP Store (`gxpPortalConfigStore`) is a Pinia store that provides reactive state management and platform integration for your plugin.
10
+
11
+ ## Importing the Store
12
+
13
+ ```javascript
14
+ import { useGxpStore } from '@gx-runtime/stores/gxpPortalConfigStore';
15
+
16
+ // In your component setup
17
+ const store = useGxpStore();
18
+ ```
19
+
20
+ ## Store Sections
21
+
22
+ The store contains several reactive sections populated from your `app-manifest.json` and the platform:
23
+
24
+ | Section | Description | Source |
25
+ |---------|-------------|--------|
26
+ | `pluginVars` | Plugin settings/configuration | `settings` in manifest |
27
+ | `stringsList` | Translatable strings | `strings.default` in manifest |
28
+ | `assetList` | Asset URLs | `assets` in manifest |
29
+ | `triggerState` | Dynamic runtime state | `triggerState` in manifest |
30
+ | `dependencyList` | External dependencies | Platform-injected |
31
+ | `permissionFlags` | Granted permissions | Platform-injected |
32
+ | `theme` | Platform theme colors | Platform-injected |
33
+ | `router` | Navigation methods | Platform-injected |
34
+
35
+ ## Getter Methods
36
+
37
+ Use these methods to safely access store values with fallbacks:
38
+
39
+ ### `getString(key, defaultValue)`
40
+
41
+ Get a string from `stringsList`:
42
+
43
+ ```javascript
44
+ const title = store.getString('welcome_title', 'Welcome');
45
+ const button = store.getString('btn_submit', 'Submit');
46
+ ```
47
+
48
+ ### `getSetting(key, defaultValue)`
49
+
50
+ Get a setting from `pluginVars`:
51
+
52
+ ```javascript
53
+ const color = store.getSetting('primary_color', '#000000');
54
+ const timeout = store.getSetting('idle_timeout', 30);
55
+ const enabled = store.getSetting('feature_enabled', false);
56
+ ```
57
+
58
+ ### `getAsset(key, defaultValue)`
59
+
60
+ Get an asset URL from `assetList`:
61
+
62
+ ```javascript
63
+ const logo = store.getAsset('logo', '/fallback-logo.png');
64
+ const hero = store.getAsset('hero_image', '/placeholder.jpg');
65
+ ```
66
+
67
+ ### `getState(key, defaultValue)`
68
+
69
+ Get a value from `triggerState`:
70
+
71
+ ```javascript
72
+ const step = store.getState('current_step', 1);
73
+ const isActive = store.getState('is_active', false);
74
+ ```
75
+
76
+ ### `hasPermission(permission)`
77
+
78
+ Check if a permission is granted:
79
+
80
+ ```javascript
81
+ if (store.hasPermission('camera')) {
82
+ // Camera access is available
83
+ }
84
+
85
+ if (store.hasPermission('bluetooth')) {
86
+ // Bluetooth access is available
87
+ }
88
+ ```
89
+
90
+ ## Update Methods
91
+
92
+ ### `updateString(key, value)`
93
+
94
+ Update a string value:
95
+
96
+ ```javascript
97
+ store.updateString('dynamic_message', 'Processing your request...');
98
+ ```
99
+
100
+ ### `updateSetting(key, value)`
101
+
102
+ Update a setting value:
103
+
104
+ ```javascript
105
+ store.updateSetting('current_mode', 'advanced');
106
+ ```
107
+
108
+ ### `updateAsset(key, url)`
109
+
110
+ Update an asset URL:
111
+
112
+ ```javascript
113
+ store.updateAsset('user_avatar', 'https://example.com/avatar.jpg');
114
+ ```
115
+
116
+ ### `updateState(key, value)`
117
+
118
+ Update trigger state:
119
+
120
+ ```javascript
121
+ store.updateState('current_step', 2);
122
+ store.updateState('is_loading', true);
123
+ store.updateState('selected_item', { id: 123, name: 'Item' });
124
+ ```
125
+
126
+ ### `addDevAsset(key, filename)`
127
+
128
+ Add a development asset with the dev server URL prefix:
129
+
130
+ ```javascript
131
+ // Automatically prefixes with dev server URL
132
+ store.addDevAsset('temp_image', 'screenshot.png');
133
+ // Result: https://localhost:3060/dev-assets/images/screenshot.png
134
+ ```
135
+
136
+ ## API Client
137
+
138
+ The store includes an Axios-based API client for making HTTP requests:
139
+
140
+ ### `apiGet(endpoint, params)`
141
+
142
+ ```javascript
143
+ const response = await store.apiGet('/events/123');
144
+ const events = await store.apiGet('/events', { status: 'active' });
145
+ ```
146
+
147
+ ### `apiPost(endpoint, data)`
148
+
149
+ ```javascript
150
+ const result = await store.apiPost('/checkin', {
151
+ attendee_id: 456,
152
+ timestamp: new Date().toISOString()
153
+ });
154
+ ```
155
+
156
+ ### `apiPut(endpoint, data)`
157
+
158
+ ```javascript
159
+ await store.apiPut('/attendees/456', {
160
+ checked_in: true
161
+ });
162
+ ```
163
+
164
+ ### `apiDelete(endpoint)`
165
+
166
+ ```javascript
167
+ await store.apiDelete('/sessions/789');
168
+ ```
169
+
170
+ ## Socket.IO Integration
171
+
172
+ The store provides methods for real-time communication via Socket.IO:
173
+
174
+ ### `emitSocket(channel, event, data)`
175
+
176
+ Send a socket event:
177
+
178
+ ```javascript
179
+ store.emitSocket('primary', 'checkin-complete', {
180
+ attendee_id: 123,
181
+ badge_printed: true
182
+ });
183
+ ```
184
+
185
+ ### `listenSocket(channel, event, callback)`
186
+
187
+ Listen for socket events:
188
+
189
+ ```javascript
190
+ store.listenSocket('primary', 'session-updated', (data) => {
191
+ console.log('Session updated:', data);
192
+ store.updateState('current_session', data);
193
+ });
194
+ ```
195
+
196
+ ### `useSocketListener(dependencyId, event, callback)`
197
+
198
+ Set up a socket listener for a specific dependency:
199
+
200
+ ```javascript
201
+ store.useSocketListener('badge-printer', 'print-complete', (result) => {
202
+ if (result.success) {
203
+ store.updateState('badge_printing', false);
204
+ }
205
+ });
206
+ ```
207
+
208
+ ## Reactive Usage in Templates
209
+
210
+ The store is fully reactive. Use it directly in your templates:
211
+
212
+ ```vue
213
+ <template>
214
+ <div :style="{ backgroundColor: store.getSetting('bg_color', '#fff') }">
215
+ <h1>{{ store.getString('title', 'Default Title') }}</h1>
216
+
217
+ <p v-if="store.triggerState.is_loading">Loading...</p>
218
+
219
+ <div v-for="item in store.triggerState.items" :key="item.id">
220
+ {{ item.name }}
221
+ </div>
222
+ </div>
223
+ </template>
224
+
225
+ <script setup>
226
+ import { useGxpStore } from '@gx-runtime/stores/gxpPortalConfigStore';
227
+
228
+ const store = useGxpStore();
229
+ </script>
230
+ ```
231
+
232
+ ## Watching Store Changes
233
+
234
+ Use Vue's `watch` to react to store changes:
235
+
236
+ ```javascript
237
+ import { watch } from 'vue';
238
+ import { useGxpStore } from '@gx-runtime/stores/gxpPortalConfigStore';
239
+
240
+ const store = useGxpStore();
241
+
242
+ // Watch a specific state value
243
+ watch(
244
+ () => store.triggerState.current_step,
245
+ (newStep, oldStep) => {
246
+ console.log(`Step changed from ${oldStep} to ${newStep}`);
247
+ }
248
+ );
249
+
250
+ // Watch multiple values
251
+ watch(
252
+ () => [store.triggerState.is_active, store.pluginVars.mode],
253
+ ([isActive, mode]) => {
254
+ if (isActive && mode === 'kiosk') {
255
+ startKioskMode();
256
+ }
257
+ }
258
+ );
259
+ ```
260
+
261
+ ## Computed Properties
262
+
263
+ Create computed properties based on store values:
264
+
265
+ ```javascript
266
+ import { computed } from 'vue';
267
+ import { useGxpStore } from '@gx-runtime/stores/gxpPortalConfigStore';
268
+
269
+ const store = useGxpStore();
270
+
271
+ const isReady = computed(() =>
272
+ !store.triggerState.is_loading &&
273
+ store.triggerState.data !== null
274
+ );
275
+
276
+ const formattedCount = computed(() =>
277
+ `${store.triggerState.checked_in_count} of ${store.pluginVars.total_expected}`
278
+ );
279
+ ```
280
+
281
+ ## Theme Integration
282
+
283
+ Access platform theme values:
284
+
285
+ ```javascript
286
+ const store = useGxpStore();
287
+
288
+ // Theme colors
289
+ const primaryColor = store.theme?.primary || '#1976D2';
290
+ const backgroundColor = store.theme?.background || '#ffffff';
291
+
292
+ // Use in styles
293
+ const buttonStyle = computed(() => ({
294
+ backgroundColor: store.theme?.primary,
295
+ color: store.theme?.onPrimary
296
+ }));
297
+ ```
298
+
299
+ ## Best Practices
300
+
301
+ 1. **Use getters with defaults** - Always provide fallback values
302
+ 2. **Keep state updates atomic** - Update one value at a time when possible
303
+ 3. **Use computed for derived state** - Don't duplicate logic
304
+ 4. **Clean up listeners** - Remove socket listeners when components unmount
305
+ 5. **Avoid deep nesting** - Keep `triggerState` relatively flat for reactivity
package/docs/index.md ADDED
@@ -0,0 +1,44 @@
1
+ ---
2
+ sidebar_position: 1
3
+ title: GxP Toolkit Overview
4
+ description: Introduction to the GxP Dev Toolkit for building platform plugins
5
+ slug: /gx-devtools
6
+ ---
7
+
8
+ # GxP Dev Toolkit
9
+
10
+ The GxP Dev Toolkit (`@gramercytech/gx-devtools`) is an npm package for creating platform plugins for the GxP kiosk platform.
11
+
12
+ ## What You Can Build
13
+
14
+ With the GxP Toolkit, you can create custom plugins that run on GxP kiosks, including:
15
+
16
+ - **Interactive displays** - Check-in kiosks, registration flows, badge printing
17
+ - **Information screens** - Schedules, maps, directories
18
+ - **Engagement features** - Surveys, gamification, social walls
19
+ - **Custom integrations** - Connect to external APIs and services
20
+
21
+ ## Key Features
22
+
23
+ | Feature | Description |
24
+ |---------|-------------|
25
+ | **CLI Tool** | `gxdev` command for scaffolding and development |
26
+ | **Interactive TUI** | Terminal UI for managing dev services |
27
+ | **Hot Reload** | Vite-based dev server with instant updates |
28
+ | **Socket.IO** | Real-time event simulation |
29
+ | **Browser Extensions** | Test plugins in production environments |
30
+ | **Vue 3 + Pinia** | Modern reactive framework with state management |
31
+
32
+ ## Quick Links
33
+
34
+ - [Getting Started](./getting-started) - Install and create your first plugin
35
+ - [App Manifest](./app-manifest) - Configure your plugin settings, strings, and assets
36
+ - [GxP Store](./gxp-store) - State management and platform integration
37
+ - [Dev Tools](./dev-tools) - In-browser debugging and inspection
38
+ - [Building for Platform](./building-for-platform) - Prepare your plugin for production
39
+
40
+ ## Requirements
41
+
42
+ - Node.js 18 or higher
43
+ - npm 8 or higher
44
+ - Modern browser (Chrome, Firefox, Safari, Edge)
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@gxp-dev/tools",
3
+ "version": "2.0.5",
4
+ "description": "Dev tools to create platform plugins",
5
+ "type": "commonjs",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "scripts": {
10
+ "test": "echo \"Error: no test specified\" && exit 1",
11
+ "dev": "concurrently 'vite dev' 'nodemon config/server.js'",
12
+ "dev-app": "vite dev",
13
+ "ext:firefox": "web-ext run --source-dir browser-extensions/firefox",
14
+ "ext:firefox-build": "web-ext build --source-dir browser-extensions/firefox --artifacts-dir dist/firefox",
15
+ "ext:chrome": "node scripts/launch-chrome.js",
16
+ "ext:chrome-pack": "node scripts/pack-chrome.js",
17
+ "ext:install": "npm run ext:firefox & npm run ext:chrome",
18
+ "ext:build": "npm run ext:firefox-build && npm run ext:chrome-pack",
19
+ "build:tui": "tsc -p tsconfig.tui.json && echo '{\"type\":\"module\"}' > dist/tui/package.json",
20
+ "dev:tui": "tsx watch bin/lib/tui/index.tsx"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+ssh://git@github.com/GramercyTech/gx-devtools.git"
25
+ },
26
+ "bin": {
27
+ "gxdev": "bin/gx-devtools.js"
28
+ },
29
+ "keywords": [
30
+ "tunnel",
31
+ "gtcp",
32
+ "eventfinity",
33
+ "gxp"
34
+ ],
35
+ "author": "Peek",
36
+ "license": "ISC",
37
+ "bugs": {
38
+ "url": "https://github.com/GramercyTech/gx-devtools/issues"
39
+ },
40
+ "homepage": "https://github.com/GramercyTech/gx-devtools#readme",
41
+ "dependencies": {
42
+ "@faker-js/faker": "^9.9.0",
43
+ "@fal-works/esbuild-plugin-global-externals": "^2.1.2",
44
+ "@gramercytech/gx-componentkit": "^1.0.8",
45
+ "@vitejs/plugin-vue": "^5.1.4",
46
+ "archiver": "^7.0.1",
47
+ "chrome-launcher": "^1.1.2",
48
+ "concurrently": "^9.0.1",
49
+ "cors": "^2.8.5",
50
+ "dotenv": "^16.4.5",
51
+ "express": "^4.21.0",
52
+ "ink": "^5.0.1",
53
+ "ink-text-input": "^6.0.0",
54
+ "json-schema-faker": "^0.5.9",
55
+ "mkcert": "^3.2.0",
56
+ "nodemon": "^3.1.7",
57
+ "open": "^10.0.0",
58
+ "pinia": "^3.0.4",
59
+ "react": "^18.2.0",
60
+ "rollup-plugin-external-globals": "^0.12.0",
61
+ "shelljs": "^0.8.5",
62
+ "socket.io": "^4.8.0",
63
+ "socket.io-client": "^4.8.0",
64
+ "vite": "^5.4.8",
65
+ "vue": "^3.5.8",
66
+ "web-ext": "^8.2.0",
67
+ "yargs": "^17.7.2"
68
+ },
69
+ "devDependencies": {
70
+ "@types/react": "^18.2.0",
71
+ "concurrently": "^9.0.1",
72
+ "mkcert": "^3.2.0",
73
+ "nodemon": "^3.1.7",
74
+ "tsx": "^4.0.0",
75
+ "typescript": "^5.0.0"
76
+ }
77
+ }