@gxp-dev/tools 2.0.10 → 2.0.12

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.
@@ -30,6 +30,14 @@ export interface Service {
30
30
  logs: string[];
31
31
  }
32
32
 
33
+ interface ExtractedConfig {
34
+ strings: Record<string, string>;
35
+ settings: Record<string, unknown>;
36
+ assets: Record<string, string>;
37
+ triggerState: Record<string, unknown>;
38
+ dependencies: Array<{ identifier: string; path: string; events?: Record<string, string> }>;
39
+ }
40
+
33
41
  export interface AppProps {
34
42
  autoStart?: string[];
35
43
  args?: Record<string, unknown>;
@@ -232,6 +240,11 @@ export default function App({ autoStart, args }: AppProps) {
232
240
  handleGeminiCommand(cmdArgs);
233
241
  break;
234
242
 
243
+ case 'extract-config':
244
+ case 'extract':
245
+ handleExtractConfig(cmdArgs);
246
+ break;
247
+
235
248
  default:
236
249
  addSystemLog(`Unknown command: ${command}. Type /help for available commands.`);
237
250
  }
@@ -510,6 +523,97 @@ export default function App({ autoStart, args }: AppProps) {
510
523
  addSystemLog(message);
511
524
  };
512
525
 
526
+ const handleExtractConfig = async (cmdArgs: string[]) => {
527
+ const dryRun = cmdArgs.includes('--dry-run') || cmdArgs.includes('-d');
528
+ const overwrite = cmdArgs.includes('--overwrite') || cmdArgs.includes('-o');
529
+
530
+ addSystemLog('Scanning source files for GxP configuration...');
531
+
532
+ try {
533
+ // Use require for CommonJS modules
534
+ const path = require('path');
535
+ const fs = require('fs');
536
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
537
+ const extractConfigUtils = require('../utils/extract-config.js') as {
538
+ extractConfigFromSource: (srcDir: string) => ExtractedConfig;
539
+ mergeConfig: (existing: Record<string, unknown>, extracted: ExtractedConfig, options: { overwrite: boolean }) => Record<string, unknown>;
540
+ generateSummary: (config: ExtractedConfig) => string;
541
+ };
542
+
543
+ const projectPath = process.cwd();
544
+ const srcDir = path.join(projectPath, 'src');
545
+ const manifestPath = path.join(projectPath, 'app-manifest.json');
546
+
547
+ // Check if src directory exists
548
+ if (!fs.existsSync(srcDir)) {
549
+ addSystemLog('Source directory not found: src/');
550
+ return;
551
+ }
552
+
553
+ // Extract configuration
554
+ const extractedConfig = extractConfigUtils.extractConfigFromSource(srcDir);
555
+ const summary = extractConfigUtils.generateSummary(extractedConfig);
556
+ addSystemLog(summary);
557
+
558
+ // Count total items
559
+ const totalItems =
560
+ Object.keys(extractedConfig.strings).length +
561
+ Object.keys(extractedConfig.settings).length +
562
+ Object.keys(extractedConfig.assets).length +
563
+ Object.keys(extractedConfig.triggerState).length +
564
+ extractedConfig.dependencies.length;
565
+
566
+ if (totalItems === 0) {
567
+ addSystemLog('No GxP configuration found in source files.');
568
+ return;
569
+ }
570
+
571
+ if (dryRun) {
572
+ addSystemLog('Dry run mode - no changes made.');
573
+ addSystemLog('Run /extract-config without --dry-run to apply changes.');
574
+ return;
575
+ }
576
+
577
+ // Load or create manifest
578
+ let existingManifest: Record<string, unknown> = {};
579
+ if (fs.existsSync(manifestPath)) {
580
+ try {
581
+ existingManifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
582
+ } catch {
583
+ addSystemLog('Could not parse existing manifest, creating new one.');
584
+ existingManifest = getDefaultManifest();
585
+ }
586
+ } else {
587
+ addSystemLog('Creating new app-manifest.json');
588
+ existingManifest = getDefaultManifest();
589
+ }
590
+
591
+ // Merge and write
592
+ const mergedManifest = extractConfigUtils.mergeConfig(existingManifest, extractedConfig, { overwrite });
593
+ fs.writeFileSync(manifestPath, JSON.stringify(mergedManifest, null, '\t'));
594
+ addSystemLog('Updated app-manifest.json');
595
+ } catch (err) {
596
+ addSystemLog(`Error: ${err instanceof Error ? err.message : 'Unknown error'}`);
597
+ }
598
+ };
599
+
600
+ const getDefaultManifest = () => ({
601
+ name: 'GxToolkit',
602
+ version: '1.0.0',
603
+ description: 'GxToolkit Plugin',
604
+ manifest_version: 3,
605
+ asset_dir: '/src/assets/',
606
+ configurationFile: 'configuration.json',
607
+ appInstructionsFile: 'app-instructions.md',
608
+ defaultStylingFile: 'default-styling.css',
609
+ settings: {},
610
+ strings: { default: {} },
611
+ assets: {},
612
+ triggerState: {},
613
+ dependencies: [],
614
+ permissions: [],
615
+ });
616
+
513
617
  const getHelpText = () => `
514
618
  Available commands:
515
619
  /dev Start Vite (+ Socket if SOCKET_IO_ENABLED=true)
@@ -526,6 +630,9 @@ Available commands:
526
630
  /mock Start Socket.IO + Mock API (shorthand)
527
631
  /ext chrome Launch Chrome extension
528
632
  /ext firefox Launch Firefox extension
633
+ /extract-config Extract GxP config from source to manifest
634
+ /extract-config -d Dry run (show what would be extracted)
635
+ /extract-config -o Overwrite existing values in manifest
529
636
  /stop [service] Stop a running service
530
637
  /restart [service] Restart a service
531
638
  /clear Clear current log panel