@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.
- package/bin/lib/cli.js +42 -0
- package/bin/lib/commands/extract-config.js +186 -0
- package/bin/lib/commands/index.js +2 -0
- package/bin/lib/commands/init.js +448 -180
- package/bin/lib/tui/App.tsx +107 -0
- package/bin/lib/utils/ai-scaffold.js +806 -0
- package/bin/lib/utils/extract-config.js +468 -0
- package/bin/lib/utils/files.js +43 -2
- package/bin/lib/utils/index.js +4 -0
- package/bin/lib/utils/prompts.js +352 -0
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +84 -0
- package/dist/tui/App.js.map +1 -1
- package/mcp/gxp-api-server.js +524 -0
- package/package.json +4 -2
- package/runtime/stores/gxpPortalConfigStore.js +9 -0
- package/template/.claude/agents/gxp-developer.md +335 -0
- package/template/.claude/settings.json +9 -0
- package/template/AGENTS.md +125 -0
- package/template/GEMINI.md +80 -0
- package/template/app-manifest.json +1 -0
package/bin/lib/tui/App.tsx
CHANGED
|
@@ -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
|