@gxp-dev/tools 2.0.75 → 2.0.77
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/gx-devtools.js +15 -2
- package/bin/lib/commands/init.js +15 -1
- package/bin/lib/lint/schemas/app-manifest.schema.json +4 -0
- package/bin/lib/lint/schemas/configuration.schema.json +5 -0
- package/bin/lib/tui/App.tsx +10 -2
- package/bin/lib/tui/components/WelcomeScreen.tsx +39 -1
- package/bin/lib/tui/index.tsx +13 -1
- package/bin/lib/utils/ai-scaffold.js +64 -5
- package/bin/lib/utils/index.js +2 -0
- package/bin/lib/utils/version-check.js +255 -0
- package/dist/tui/App.d.ts +8 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +2 -2
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/components/WelcomeScreen.d.ts +11 -1
- package/dist/tui/components/WelcomeScreen.d.ts.map +1 -1
- package/dist/tui/components/WelcomeScreen.js +3 -2
- package/dist/tui/components/WelcomeScreen.js.map +1 -1
- package/dist/tui/index.d.ts +7 -0
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +1 -1
- package/dist/tui/index.js.map +1 -1
- package/mcp/lib/config-ops.js +9 -1
- package/mcp/lib/config-tools.js +14 -2
- package/package.json +1 -1
- package/template/.claude/agents/gxp-developer.md +70 -0
- package/template/.claude/settings.json +2 -6
- package/template/AGENTS.md +74 -0
- package/template/GEMINI.md +17 -0
- package/template/gemini/settings.json +8 -0
- package/template/mcp.json +8 -0
package/bin/gx-devtools.js
CHANGED
|
@@ -15,13 +15,25 @@
|
|
|
15
15
|
const args = process.argv.slice(2)
|
|
16
16
|
const command = args[0]
|
|
17
17
|
|
|
18
|
+
// Kick off a best-effort npm version check on every gxdev invocation. The
|
|
19
|
+
// util throttles itself to at most one network hit per 24 hours and stays
|
|
20
|
+
// fully non-blocking — if it fails, the CLI is unaffected.
|
|
21
|
+
const {
|
|
22
|
+
maybeRunBackgroundCheck,
|
|
23
|
+
registerCliExitReminder,
|
|
24
|
+
getCachedUpdateInfo,
|
|
25
|
+
} = require("./lib/utils/version-check")
|
|
26
|
+
maybeRunBackgroundCheck()
|
|
27
|
+
|
|
18
28
|
// TUI activation: bare `ui` command OR any invocation with `--ui`.
|
|
19
29
|
const uiFlagPresent = args.includes("--ui")
|
|
20
30
|
const isBareUiCommand = command === "ui"
|
|
21
31
|
const wantsUi = uiFlagPresent || isBareUiCommand
|
|
22
32
|
|
|
23
33
|
if (!wantsUi) {
|
|
24
|
-
//
|
|
34
|
+
// Plain CLI path — have the utility print an update reminder on exit
|
|
35
|
+
// (stderr) if the cached info says we're behind.
|
|
36
|
+
registerCliExitReminder()
|
|
25
37
|
require("./lib/cli")
|
|
26
38
|
return
|
|
27
39
|
}
|
|
@@ -75,7 +87,8 @@ switch (isBareUiCommand ? null : command) {
|
|
|
75
87
|
;(async () => {
|
|
76
88
|
try {
|
|
77
89
|
const { startTUI } = await import(tuiPath)
|
|
78
|
-
|
|
90
|
+
const updateInfo = getCachedUpdateInfo()
|
|
91
|
+
startTUI({ autoStart, args: tuiArgs, updateInfo })
|
|
79
92
|
} catch (err) {
|
|
80
93
|
if (err && err.message === "NO_TTY") {
|
|
81
94
|
console.error("The GxP TUI requires an interactive terminal (TTY).")
|
package/bin/lib/commands/init.js
CHANGED
|
@@ -171,7 +171,21 @@ function copyBundleFiles(projectPath, paths, overwrite = false) {
|
|
|
171
171
|
{
|
|
172
172
|
src: ".claude/settings.json",
|
|
173
173
|
dest: ".claude/settings.json",
|
|
174
|
-
desc: "Claude Code
|
|
174
|
+
desc: "Claude Code project settings (auto-allow gxp-api MCP tools)",
|
|
175
|
+
},
|
|
176
|
+
// Canonical project-scoped MCP config files. The AI CLIs each look for
|
|
177
|
+
// their own file at the project root and auto-load the `gxp-api` server
|
|
178
|
+
// from there. The `gxp-api-server` binary is installed on PATH by
|
|
179
|
+
// @gxp-dev/tools, so no extra install step is required.
|
|
180
|
+
{
|
|
181
|
+
src: "mcp.json",
|
|
182
|
+
dest: ".mcp.json",
|
|
183
|
+
desc: ".mcp.json (Claude Code project-scoped MCP config)",
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
src: "gemini/settings.json",
|
|
187
|
+
dest: ".gemini/settings.json",
|
|
188
|
+
desc: ".gemini/settings.json (Gemini CLI project-scoped MCP config)",
|
|
175
189
|
},
|
|
176
190
|
]
|
|
177
191
|
|
|
@@ -29,6 +29,10 @@
|
|
|
29
29
|
"configurationFile": { "type": "string" },
|
|
30
30
|
"appInstructionsFile": { "type": "string" },
|
|
31
31
|
"defaultStylingFile": { "type": "string" },
|
|
32
|
+
"formTemplate": {
|
|
33
|
+
"type": "boolean",
|
|
34
|
+
"description": "Declares this plugin as a form/quiz/survey app. When true, the platform expects `configuration.json` to include a `formTemplate` root key — an array of cards defining the starter question set an admin can customize on install."
|
|
35
|
+
},
|
|
32
36
|
"appInstructions": { "type": "string" },
|
|
33
37
|
"defaultStyling": { "type": "string" },
|
|
34
38
|
"configuration": {
|
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
"description": "Top-level array of tab definitions. Each item is a card (usually card_list or fields_list) rendered under the plugin's configuration panel.",
|
|
12
12
|
"items": { "$ref": "card.schema.json" }
|
|
13
13
|
},
|
|
14
|
+
"formTemplate": {
|
|
15
|
+
"type": "array",
|
|
16
|
+
"description": "Starter form/quiz/survey question set for plugins that act as a form app. Each item is a card defining a form section (use `fields_list` for question groups or `card_list` to nest further). The admin can copy/customize these when they install the plugin. Only meaningful when `formTemplate` is true in app-manifest.json.",
|
|
17
|
+
"items": { "$ref": "card.schema.json" }
|
|
18
|
+
},
|
|
14
19
|
"title": { "type": ["string", "null"] },
|
|
15
20
|
"description": { "type": ["string", "null"] },
|
|
16
21
|
"version": { "type": ["string", "integer", "null"] }
|
package/bin/lib/tui/App.tsx
CHANGED
|
@@ -43,12 +43,20 @@ interface ExtractedConfig {
|
|
|
43
43
|
}>
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
export interface UpdateInfo {
|
|
47
|
+
currentVersion: string
|
|
48
|
+
latestVersion: string | null
|
|
49
|
+
updateAvailable: boolean
|
|
50
|
+
lastCheckedAt: number | null
|
|
51
|
+
}
|
|
52
|
+
|
|
46
53
|
export interface AppProps {
|
|
47
54
|
autoStart?: string[]
|
|
48
55
|
args?: Record<string, unknown>
|
|
56
|
+
updateInfo?: UpdateInfo | null
|
|
49
57
|
}
|
|
50
58
|
|
|
51
|
-
export default function App({ autoStart, args }: AppProps) {
|
|
59
|
+
export default function App({ autoStart, args, updateInfo }: AppProps) {
|
|
52
60
|
const { exit } = useApp()
|
|
53
61
|
const { stdout } = useStdout()
|
|
54
62
|
const [showAIPanel, setShowAIPanel] = useState(false)
|
|
@@ -808,7 +816,7 @@ Keyboard shortcuts:
|
|
|
808
816
|
{currentService ? (
|
|
809
817
|
<LogPanel logs={currentService.logs} maxHeight={logPanelHeight} />
|
|
810
818
|
) : (
|
|
811
|
-
<WelcomeScreen />
|
|
819
|
+
<WelcomeScreen updateInfo={updateInfo} />
|
|
812
820
|
)}
|
|
813
821
|
</Box>
|
|
814
822
|
|
|
@@ -21,7 +21,21 @@ const LOGO = `
|
|
|
21
21
|
╚═════╝ ╚═╝ ╚═╝╚═╝
|
|
22
22
|
`
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
interface UpdateInfo {
|
|
25
|
+
currentVersion: string
|
|
26
|
+
latestVersion: string | null
|
|
27
|
+
updateAvailable: boolean
|
|
28
|
+
lastCheckedAt: number | null
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface WelcomeScreenProps {
|
|
32
|
+
updateInfo?: UpdateInfo | null
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default function WelcomeScreen({ updateInfo }: WelcomeScreenProps = {}) {
|
|
36
|
+
const showUpdateBanner =
|
|
37
|
+
!!updateInfo && updateInfo.updateAvailable && !!updateInfo.latestVersion
|
|
38
|
+
|
|
25
39
|
return (
|
|
26
40
|
<Box
|
|
27
41
|
flexDirection="column"
|
|
@@ -39,6 +53,30 @@ export default function WelcomeScreen() {
|
|
|
39
53
|
<Text dimColor>v{pkg.version}</Text>
|
|
40
54
|
</Box>
|
|
41
55
|
|
|
56
|
+
{showUpdateBanner && updateInfo && (
|
|
57
|
+
<Box
|
|
58
|
+
marginTop={1}
|
|
59
|
+
paddingX={2}
|
|
60
|
+
borderStyle="round"
|
|
61
|
+
borderColor="yellow"
|
|
62
|
+
flexDirection="column"
|
|
63
|
+
alignItems="center"
|
|
64
|
+
>
|
|
65
|
+
<Text>
|
|
66
|
+
<Text color="yellow">📦 </Text>
|
|
67
|
+
<Text bold color="yellow">
|
|
68
|
+
Update available:
|
|
69
|
+
</Text>{" "}
|
|
70
|
+
<Text>{updateInfo.currentVersion}</Text>
|
|
71
|
+
<Text color="gray"> → </Text>
|
|
72
|
+
<Text color="cyan">{updateInfo.latestVersion}</Text>
|
|
73
|
+
</Text>
|
|
74
|
+
<Text color="gray">
|
|
75
|
+
Run <Text color="cyan">npm i -g @gxp-dev/tools</Text> to update
|
|
76
|
+
</Text>
|
|
77
|
+
</Box>
|
|
78
|
+
)}
|
|
79
|
+
|
|
42
80
|
<Box marginTop={1}>
|
|
43
81
|
<Text color="gray">
|
|
44
82
|
Interactive development environment for GxP plugins
|
package/bin/lib/tui/index.tsx
CHANGED
|
@@ -9,9 +9,17 @@ import { serviceManager } from "./services/index.js"
|
|
|
9
9
|
// Load .env from the current working directory (project directory)
|
|
10
10
|
dotenv.config({ path: path.join(process.cwd(), ".env") })
|
|
11
11
|
|
|
12
|
+
export interface UpdateInfo {
|
|
13
|
+
currentVersion: string
|
|
14
|
+
latestVersion: string | null
|
|
15
|
+
updateAvailable: boolean
|
|
16
|
+
lastCheckedAt: number | null
|
|
17
|
+
}
|
|
18
|
+
|
|
12
19
|
interface TUIOptions {
|
|
13
20
|
autoStart?: string[] // Commands to auto-start (e.g., ['dev', 'socket'])
|
|
14
21
|
args?: Record<string, unknown> // Command arguments
|
|
22
|
+
updateInfo?: UpdateInfo | null // Cached npm version-check result (for landing page banner)
|
|
15
23
|
}
|
|
16
24
|
|
|
17
25
|
export function startTUI(options: TUIOptions = {}) {
|
|
@@ -30,7 +38,11 @@ export function startTUI(options: TUIOptions = {}) {
|
|
|
30
38
|
}
|
|
31
39
|
|
|
32
40
|
const { waitUntilExit } = render(
|
|
33
|
-
<App
|
|
41
|
+
<App
|
|
42
|
+
autoStart={options.autoStart}
|
|
43
|
+
args={options.args}
|
|
44
|
+
updateInfo={options.updateInfo}
|
|
45
|
+
/>,
|
|
34
46
|
)
|
|
35
47
|
|
|
36
48
|
waitUntilExit().then(() => {
|
|
@@ -971,6 +971,14 @@ function buildInteractiveInitialPrompt(projectName, description, provider) {
|
|
|
971
971
|
? " You can also delegate to the `gxp-developer` subagent defined in `.claude/agents/gxp-developer.md`."
|
|
972
972
|
: ""
|
|
973
973
|
|
|
974
|
+
const mcpFixCommand =
|
|
975
|
+
{
|
|
976
|
+
claude: "claude mcp add gxp-api gxp-api-server",
|
|
977
|
+
codex: "codex mcp add gxp-api gxp-api-server",
|
|
978
|
+
gemini:
|
|
979
|
+
"add the `gxp-api` server to `~/.gemini/settings.json` under `mcpServers` with command `gxp-api-server`",
|
|
980
|
+
}[provider] || "see the provider's MCP docs"
|
|
981
|
+
|
|
974
982
|
return [
|
|
975
983
|
`I just ran \`gxdev init\` to scaffold a new GxP plugin called "${projectName}"${
|
|
976
984
|
description ? ` (${description})` : ""
|
|
@@ -978,8 +986,12 @@ function buildInteractiveInitialPrompt(projectName, description, provider) {
|
|
|
978
986
|
"",
|
|
979
987
|
`Start a new GxP plugin development session. First read \`${instructionFile}\` and \`app-instructions.md\` in this project — they describe the workflow, conventions, and the full set of tools available to you.${claudeAgentHint}`,
|
|
980
988
|
"",
|
|
989
|
+
"**Step 0 — smoke-test the `gxp-api` MCP server before asking me anything.** The server is defined in `.mcp.json` / `.gemini/settings.json` at the project root and provided by the `gxp-api-server` binary that ships with `@gxp-dev/tools` (already on your PATH — verify with `which gxp-api-server`). Call `api_list_tags` immediately:",
|
|
990
|
+
"- If it returns a list of tags → the MCP is live; load the tag list into memory so your first question to me can be grounded in the platform's actual resources (attendees, events, quizzes, posts, forms, etc.) rather than abstract categories.",
|
|
991
|
+
`- If \`api_list_tags\` (or any other \`api_*\` / \`config_*\` / \`docs_*\` tool) is not available, the MCP didn't register. Tell me so and suggest I run \`${mcpFixCommand}\`, then restart this session. Do not proceed without the MCP — every operationId, event, and dependency you plan with must come from it.`,
|
|
992
|
+
"",
|
|
981
993
|
"You have the `gxp-api` MCP server available with 29 tools across five families:",
|
|
982
|
-
"- **API spec discovery** — `search_api_endpoints`, `api_list_operation_ids`, `api_get_operation_parameters`, `api_find_endpoints_by_schema`, `api_generate_dependency`, `get_endpoint_details`.",
|
|
994
|
+
"- **API spec discovery** — `search_api_endpoints`, `api_list_operation_ids`, `api_get_operation_parameters`, `api_find_endpoints_by_schema`, `api_generate_dependency`, `get_endpoint_details`, `api_list_tags`.",
|
|
983
995
|
"- **WebSocket events** — `api_find_events_for_operation` (maps an operationId to the AsyncAPI events it triggers), `api_list_events`, `search_websocket_events`.",
|
|
984
996
|
"- **Config editing** — `config_add_card`, `config_add_field`, `config_list_field_types`, `config_get_field_schema`, `config_extract_strings`, `config_validate`, etc. Every mutation is linter-guarded against the schemas in `bin/lib/lint/schemas/`.",
|
|
985
997
|
"- **Docs search** — `docs_search`, `docs_get_page`, `docs_list_pages` (full-text search across docs.gxp.dev).",
|
|
@@ -997,6 +1009,7 @@ function buildInteractiveInitialPrompt(projectName, description, provider) {
|
|
|
997
1009
|
"- What real-world data it reads/writes — identify the concrete platform operationIds via the MCP, never invent them",
|
|
998
1010
|
"- Which real-time events matter (use `api_find_events_for_operation` for each planned operationId)",
|
|
999
1011
|
"- Every piece of admin-editable content: strings, assets, colors/thresholds/settings, feature toggles",
|
|
1012
|
+
'- Whether this is a **form app** (quiz, survey, questionnaire, signup flow). If yes, set `formTemplate: true` in `app-manifest.json` and populate `configuration.json`\'s `formTemplate` root array with starter question cards (`config_add_card` with `parent_path: "/formTemplate"` — auto-initializes). See the instructions file for the full pattern. Keep end-user questions in `formTemplate` and admin config in `additionalTabs` — do not mix the two.',
|
|
1000
1013
|
"",
|
|
1001
1014
|
"Then propose a plan — screens/components, data flow, admin configuration form, and the exact keys you'll add to `app-manifest.json` — and get my confirmation before implementing.",
|
|
1002
1015
|
"",
|
|
@@ -1004,6 +1017,44 @@ function buildInteractiveInitialPrompt(projectName, description, provider) {
|
|
|
1004
1017
|
].join("\n")
|
|
1005
1018
|
}
|
|
1006
1019
|
|
|
1020
|
+
/**
|
|
1021
|
+
* Best-effort registration of the `gxp-api` MCP server with the selected
|
|
1022
|
+
* provider's CLI at user scope. The project-scoped `.mcp.json` /
|
|
1023
|
+
* `.gemini/settings.json` files already cover the common case, but a
|
|
1024
|
+
* user-scope registration is more forgiving — it works when the agent is
|
|
1025
|
+
* launched from a subdirectory, and it sidesteps Claude's first-run approval
|
|
1026
|
+
* prompt because the user explicitly opted in by picking an agent.
|
|
1027
|
+
*
|
|
1028
|
+
* Silent on failure: if the CLI doesn't support `mcp add` or the server is
|
|
1029
|
+
* already registered, we just fall back to the project config files.
|
|
1030
|
+
*
|
|
1031
|
+
* @param {string} provider - claude | codex | gemini
|
|
1032
|
+
* @returns {void}
|
|
1033
|
+
*/
|
|
1034
|
+
function registerMcpWithProviderCli(provider) {
|
|
1035
|
+
const commands = {
|
|
1036
|
+
claude: ["mcp", "add", "gxp-api", "gxp-api-server"],
|
|
1037
|
+
codex: ["mcp", "add", "gxp-api", "gxp-api-server"],
|
|
1038
|
+
}
|
|
1039
|
+
const args = commands[provider]
|
|
1040
|
+
if (!args) {
|
|
1041
|
+
// Gemini doesn't ship a stable `mcp add` subcommand; rely on the
|
|
1042
|
+
// shipped `.gemini/settings.json` instead.
|
|
1043
|
+
return
|
|
1044
|
+
}
|
|
1045
|
+
try {
|
|
1046
|
+
const result = require("child_process").spawnSync(provider, args, {
|
|
1047
|
+
stdio: "ignore",
|
|
1048
|
+
timeout: 5000,
|
|
1049
|
+
})
|
|
1050
|
+
if (result.status === 0) {
|
|
1051
|
+
console.log(` ✓ Registered gxp-api with ${provider} (user scope).`)
|
|
1052
|
+
}
|
|
1053
|
+
} catch {
|
|
1054
|
+
// Best-effort — ignore failures.
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1007
1058
|
/**
|
|
1008
1059
|
* Launch the selected AI CLI in interactive mode with an initial prompt.
|
|
1009
1060
|
* The user talks to the agent directly in the terminal; the agent is
|
|
@@ -1052,21 +1103,29 @@ function launchInteractiveAISession(
|
|
|
1052
1103
|
return
|
|
1053
1104
|
}
|
|
1054
1105
|
|
|
1106
|
+
// Register the MCP server with the provider's CLI at user scope as a
|
|
1107
|
+
// belt-and-suspenders measure on top of the project-scoped config files
|
|
1108
|
+
// that init already shipped.
|
|
1109
|
+
registerMcpWithProviderCli(provider)
|
|
1110
|
+
|
|
1055
1111
|
console.log("")
|
|
1056
1112
|
console.log("─".repeat(50))
|
|
1057
1113
|
console.log(`🚀 Launching ${provider} in interactive mode...`)
|
|
1058
1114
|
console.log("─".repeat(50))
|
|
1059
1115
|
console.log("")
|
|
1060
1116
|
console.log(
|
|
1061
|
-
" The
|
|
1117
|
+
" The `gxp-api` MCP server is configured in .mcp.json / .gemini/settings.json",
|
|
1118
|
+
)
|
|
1119
|
+
console.log(
|
|
1120
|
+
" at the project root (binary: gxp-api-server, installed with @gxp-dev/tools).",
|
|
1062
1121
|
)
|
|
1063
1122
|
console.log(
|
|
1064
|
-
"
|
|
1123
|
+
" The agent will smoke-test it first, then greet you and ask what you want",
|
|
1065
1124
|
)
|
|
1066
1125
|
console.log(
|
|
1067
|
-
" keep asking until it has enough
|
|
1126
|
+
" to build. Answer its questions — it will keep asking until it has enough",
|
|
1068
1127
|
)
|
|
1069
|
-
console.log("
|
|
1128
|
+
console.log(" detail, then plan, confirm, and implement.")
|
|
1070
1129
|
console.log("")
|
|
1071
1130
|
|
|
1072
1131
|
// Do NOT pass shell: true here. The initial prompt contains backticks,
|
package/bin/lib/utils/index.js
CHANGED
|
@@ -10,6 +10,7 @@ const files = require("./files")
|
|
|
10
10
|
const prompts = require("./prompts")
|
|
11
11
|
const aiScaffold = require("./ai-scaffold")
|
|
12
12
|
const extractConfig = require("./extract-config")
|
|
13
|
+
const versionCheck = require("./version-check")
|
|
13
14
|
|
|
14
15
|
module.exports = {
|
|
15
16
|
...paths,
|
|
@@ -18,4 +19,5 @@ module.exports = {
|
|
|
18
19
|
...prompts,
|
|
19
20
|
...aiScaffold,
|
|
20
21
|
...extractConfig,
|
|
22
|
+
...versionCheck,
|
|
21
23
|
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version Check
|
|
3
|
+
*
|
|
4
|
+
* Compares the installed gxdev version against the latest on npm.
|
|
5
|
+
*
|
|
6
|
+
* Design:
|
|
7
|
+
* - The npm registry is hit **at most once per 24 hours** per user. The latest
|
|
8
|
+
* version is cached in `~/.gxp-dev/version-check.json`.
|
|
9
|
+
* - All cache reads and the "is an update available?" check are synchronous so
|
|
10
|
+
* they can run from a `process.on("exit")` handler or a React render.
|
|
11
|
+
* - The actual network fetch is fire-and-forget (`maybeRunBackgroundCheck`).
|
|
12
|
+
* It never throws, never blocks, and never delays CLI exit.
|
|
13
|
+
* - Users can disable the check entirely with `GXP_NO_VERSION_CHECK=1`.
|
|
14
|
+
*
|
|
15
|
+
* Consequence: the first ever `gxdev` invocation only populates the cache — the
|
|
16
|
+
* update banner shows on the *next* run. That's an intentional tradeoff so the
|
|
17
|
+
* first run is never blocked on a slow/unreachable registry.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const fs = require("fs")
|
|
21
|
+
const path = require("path")
|
|
22
|
+
const os = require("os")
|
|
23
|
+
const https = require("https")
|
|
24
|
+
|
|
25
|
+
const CACHE_DIR = path.join(os.homedir(), ".gxp-dev")
|
|
26
|
+
const CACHE_FILE = path.join(CACHE_DIR, "version-check.json")
|
|
27
|
+
const CHECK_TTL_MS = 24 * 60 * 60 * 1000 // 24 hours
|
|
28
|
+
const FETCH_TIMEOUT_MS = 3000
|
|
29
|
+
const PACKAGE_JSON_PATH = path.join(__dirname, "..", "..", "..", "package.json")
|
|
30
|
+
|
|
31
|
+
let cliReminderRegistered = false
|
|
32
|
+
|
|
33
|
+
function isDisabled() {
|
|
34
|
+
return process.env.GXP_NO_VERSION_CHECK === "1"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function getPackageInfo() {
|
|
38
|
+
try {
|
|
39
|
+
const pkg = require(PACKAGE_JSON_PATH)
|
|
40
|
+
if (!pkg || !pkg.name || !pkg.version) {
|
|
41
|
+
return null
|
|
42
|
+
}
|
|
43
|
+
return { name: pkg.name, currentVersion: pkg.version }
|
|
44
|
+
} catch {
|
|
45
|
+
return null
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function readCache() {
|
|
50
|
+
try {
|
|
51
|
+
const raw = fs.readFileSync(CACHE_FILE, "utf-8")
|
|
52
|
+
const parsed = JSON.parse(raw)
|
|
53
|
+
if (!parsed || typeof parsed !== "object") {
|
|
54
|
+
return null
|
|
55
|
+
}
|
|
56
|
+
return parsed
|
|
57
|
+
} catch {
|
|
58
|
+
return null
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function writeCache(data) {
|
|
63
|
+
try {
|
|
64
|
+
if (!fs.existsSync(CACHE_DIR)) {
|
|
65
|
+
fs.mkdirSync(CACHE_DIR, { recursive: true })
|
|
66
|
+
}
|
|
67
|
+
fs.writeFileSync(CACHE_FILE, JSON.stringify(data, null, 2))
|
|
68
|
+
} catch {
|
|
69
|
+
// Cache failures are non-fatal — the CLI should still work.
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function cacheIsFresh(cache) {
|
|
74
|
+
if (!cache || !cache.lastCheckedAt) {
|
|
75
|
+
return false
|
|
76
|
+
}
|
|
77
|
+
return Date.now() - cache.lastCheckedAt < CHECK_TTL_MS
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Compare two semver-like strings.
|
|
82
|
+
* Returns 1 if a > b, -1 if a < b, 0 if equal. Strips pre-release suffixes.
|
|
83
|
+
*/
|
|
84
|
+
function compareVersions(a, b) {
|
|
85
|
+
const parse = (v) =>
|
|
86
|
+
String(v)
|
|
87
|
+
.split("-")[0]
|
|
88
|
+
.split(".")
|
|
89
|
+
.map((n) => parseInt(n, 10) || 0)
|
|
90
|
+
const pa = parse(a)
|
|
91
|
+
const pb = parse(b)
|
|
92
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
93
|
+
const ai = pa[i] || 0
|
|
94
|
+
const bi = pb[i] || 0
|
|
95
|
+
if (ai > bi) {
|
|
96
|
+
return 1
|
|
97
|
+
}
|
|
98
|
+
if (ai < bi) {
|
|
99
|
+
return -1
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return 0
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function fetchLatestVersion(packageName) {
|
|
106
|
+
return new Promise((resolve, reject) => {
|
|
107
|
+
const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`
|
|
108
|
+
const req = https.get(
|
|
109
|
+
url,
|
|
110
|
+
{ timeout: FETCH_TIMEOUT_MS, headers: { Accept: "application/json" } },
|
|
111
|
+
(res) => {
|
|
112
|
+
if (res.statusCode !== 200) {
|
|
113
|
+
res.resume()
|
|
114
|
+
reject(new Error(`HTTP ${res.statusCode}`))
|
|
115
|
+
return
|
|
116
|
+
}
|
|
117
|
+
let data = ""
|
|
118
|
+
res.setEncoding("utf8")
|
|
119
|
+
res.on("data", (chunk) => {
|
|
120
|
+
data += chunk
|
|
121
|
+
})
|
|
122
|
+
res.on("end", () => {
|
|
123
|
+
try {
|
|
124
|
+
const body = JSON.parse(data)
|
|
125
|
+
if (body && typeof body.version === "string") {
|
|
126
|
+
resolve(body.version)
|
|
127
|
+
} else {
|
|
128
|
+
reject(new Error("Missing version in registry response"))
|
|
129
|
+
}
|
|
130
|
+
} catch (err) {
|
|
131
|
+
reject(err)
|
|
132
|
+
}
|
|
133
|
+
})
|
|
134
|
+
},
|
|
135
|
+
)
|
|
136
|
+
req.on("error", reject)
|
|
137
|
+
req.on("timeout", () => {
|
|
138
|
+
req.destroy(new Error("timeout"))
|
|
139
|
+
})
|
|
140
|
+
})
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Synchronously derive update status from the cache + installed package.json.
|
|
145
|
+
* Returns null if version info can't be determined.
|
|
146
|
+
*
|
|
147
|
+
* Shape: { currentVersion, latestVersion, updateAvailable, lastCheckedAt }
|
|
148
|
+
*/
|
|
149
|
+
function getCachedUpdateInfo() {
|
|
150
|
+
if (isDisabled()) {
|
|
151
|
+
return null
|
|
152
|
+
}
|
|
153
|
+
const pkg = getPackageInfo()
|
|
154
|
+
if (!pkg) {
|
|
155
|
+
return null
|
|
156
|
+
}
|
|
157
|
+
const cache = readCache()
|
|
158
|
+
if (!cache || !cache.latestVersion) {
|
|
159
|
+
return {
|
|
160
|
+
currentVersion: pkg.currentVersion,
|
|
161
|
+
latestVersion: null,
|
|
162
|
+
updateAvailable: false,
|
|
163
|
+
lastCheckedAt: cache && cache.lastCheckedAt ? cache.lastCheckedAt : null,
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const updateAvailable =
|
|
167
|
+
compareVersions(cache.latestVersion, pkg.currentVersion) > 0
|
|
168
|
+
return {
|
|
169
|
+
currentVersion: pkg.currentVersion,
|
|
170
|
+
latestVersion: cache.latestVersion,
|
|
171
|
+
updateAvailable,
|
|
172
|
+
lastCheckedAt: cache.lastCheckedAt,
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Kick off a non-blocking registry check if the cache is stale. Safe to call
|
|
178
|
+
* on every gxdev invocation — throttled by the 24h TTL and silent on any
|
|
179
|
+
* failure. The process holds the socket open briefly while the request runs,
|
|
180
|
+
* but `.unref()` means it won't keep the process alive on its own.
|
|
181
|
+
*/
|
|
182
|
+
function maybeRunBackgroundCheck() {
|
|
183
|
+
if (isDisabled()) {
|
|
184
|
+
return
|
|
185
|
+
}
|
|
186
|
+
const pkg = getPackageInfo()
|
|
187
|
+
if (!pkg) {
|
|
188
|
+
return
|
|
189
|
+
}
|
|
190
|
+
const cache = readCache()
|
|
191
|
+
if (cacheIsFresh(cache)) {
|
|
192
|
+
return
|
|
193
|
+
}
|
|
194
|
+
const fetchPromise = fetchLatestVersion(pkg.name)
|
|
195
|
+
fetchPromise
|
|
196
|
+
.then((latestVersion) => {
|
|
197
|
+
writeCache({
|
|
198
|
+
packageName: pkg.name,
|
|
199
|
+
latestVersion,
|
|
200
|
+
lastCheckedAt: Date.now(),
|
|
201
|
+
})
|
|
202
|
+
})
|
|
203
|
+
.catch(() => {
|
|
204
|
+
// Swallow errors — we'll retry next run.
|
|
205
|
+
})
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function formatCliReminder(info) {
|
|
209
|
+
if (!info || !info.updateAvailable || !info.latestVersion) {
|
|
210
|
+
return ""
|
|
211
|
+
}
|
|
212
|
+
const yellow = (s) => `\x1b[33m${s}\x1b[0m`
|
|
213
|
+
const cyan = (s) => `\x1b[36m${s}\x1b[0m`
|
|
214
|
+
const bold = (s) => `\x1b[1m${s}\x1b[0m`
|
|
215
|
+
return [
|
|
216
|
+
"",
|
|
217
|
+
yellow("────────────────────────────────────────────────────────"),
|
|
218
|
+
`${yellow("📦")} ${bold("gxdev update available:")} ${info.currentVersion} → ${cyan(info.latestVersion)}`,
|
|
219
|
+
` Update with ${cyan("npm i -g @gxp-dev/tools")}`,
|
|
220
|
+
yellow("────────────────────────────────────────────────────────"),
|
|
221
|
+
].join("\n")
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Install a process.on("exit") handler that prints a one-time reminder if the
|
|
226
|
+
* cached info says an update is available. Safe to call multiple times — only
|
|
227
|
+
* the first call registers. Meant for the plain-CLI path; the TUI renders its
|
|
228
|
+
* banner inline instead.
|
|
229
|
+
*/
|
|
230
|
+
function registerCliExitReminder() {
|
|
231
|
+
if (isDisabled() || cliReminderRegistered) {
|
|
232
|
+
return
|
|
233
|
+
}
|
|
234
|
+
cliReminderRegistered = true
|
|
235
|
+
process.on("exit", () => {
|
|
236
|
+
try {
|
|
237
|
+
const info = getCachedUpdateInfo()
|
|
238
|
+
if (info && info.updateAvailable) {
|
|
239
|
+
// Emit to stderr so it never pollutes stdout pipelines
|
|
240
|
+
// (e.g. `gxdev lint --json | jq ...`).
|
|
241
|
+
process.stderr.write(formatCliReminder(info) + "\n")
|
|
242
|
+
}
|
|
243
|
+
} catch {
|
|
244
|
+
// Never crash during exit.
|
|
245
|
+
}
|
|
246
|
+
})
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
module.exports = {
|
|
250
|
+
getCachedUpdateInfo,
|
|
251
|
+
maybeRunBackgroundCheck,
|
|
252
|
+
registerCliExitReminder,
|
|
253
|
+
formatCliReminder,
|
|
254
|
+
compareVersions,
|
|
255
|
+
}
|
package/dist/tui/App.d.ts
CHANGED
|
@@ -5,9 +5,16 @@ export interface Service {
|
|
|
5
5
|
status: ServiceStatus;
|
|
6
6
|
logs: string[];
|
|
7
7
|
}
|
|
8
|
+
export interface UpdateInfo {
|
|
9
|
+
currentVersion: string;
|
|
10
|
+
latestVersion: string | null;
|
|
11
|
+
updateAvailable: boolean;
|
|
12
|
+
lastCheckedAt: number | null;
|
|
13
|
+
}
|
|
8
14
|
export interface AppProps {
|
|
9
15
|
autoStart?: string[];
|
|
10
16
|
args?: Record<string, unknown>;
|
|
17
|
+
updateInfo?: UpdateInfo | null;
|
|
11
18
|
}
|
|
12
|
-
export default function App({ autoStart, args }: AppProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export default function App({ autoStart, args, updateInfo }: AppProps): import("react/jsx-runtime").JSX.Element;
|
|
13
20
|
//# sourceMappingURL=App.d.ts.map
|
package/dist/tui/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../bin/lib/tui/App.tsx"],"names":[],"mappings":"AAQA,OAAO,EAUN,aAAa,EAMb,MAAM,qBAAqB,CAAA;AAE5B,MAAM,WAAW,OAAO;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,aAAa,CAAA;IACrB,IAAI,EAAE,MAAM,EAAE,CAAA;CACd;AAcD,MAAM,WAAW,QAAQ;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../bin/lib/tui/App.tsx"],"names":[],"mappings":"AAQA,OAAO,EAUN,aAAa,EAMb,MAAM,qBAAqB,CAAA;AAE5B,MAAM,WAAW,OAAO;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,aAAa,CAAA;IACrB,IAAI,EAAE,MAAM,EAAE,CAAA;CACd;AAcD,MAAM,WAAW,UAAU;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,eAAe,EAAE,OAAO,CAAA;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,MAAM,WAAW,QAAQ;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CAC9B;AAED,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,2CA2wBpE"}
|
package/dist/tui/App.js
CHANGED
|
@@ -8,7 +8,7 @@ import LogPanel from "./components/LogPanel.js";
|
|
|
8
8
|
import CommandInput from "./components/CommandInput.js";
|
|
9
9
|
import AIPanel from "./components/AIPanel.js";
|
|
10
10
|
import { serviceManager, startVite, stopVite, startSocket, stopSocket, startExtension, stopExtension, listSocketEvents, sendSocketEvent, aiService, getAvailableProviders, getProviderStatus, } from "./services/index.js";
|
|
11
|
-
export default function App({ autoStart, args }) {
|
|
11
|
+
export default function App({ autoStart, args, updateInfo }) {
|
|
12
12
|
const { exit } = useApp();
|
|
13
13
|
const { stdout } = useStdout();
|
|
14
14
|
const [showAIPanel, setShowAIPanel] = useState(false);
|
|
@@ -617,7 +617,7 @@ Keyboard shortcuts:
|
|
|
617
617
|
const fixedRows = 10;
|
|
618
618
|
const availableForLog = terminalHeight - fixedRows - suggestionRows;
|
|
619
619
|
const logPanelHeight = Math.max(3, availableForLog); // Minimum 3 rows for log panel
|
|
620
|
-
return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, children: [_jsx(Header, { projectName: process.cwd().split("/").pop() || "gxdev" }), services.length > 0 && (_jsx(TabBar, { services: services, activeTab: activeTab, onTabChange: setActiveTab })), _jsx(Box, { height: logPanelHeight, flexDirection: "column", borderStyle: "single", borderColor: "gray", overflow: "hidden", children: currentService ? (_jsx(LogPanel, { logs: currentService.logs, maxHeight: logPanelHeight })) : (_jsx(WelcomeScreen, {})) }), _jsx(CommandInput, { onSubmit: handleCommand, activeService: currentService
|
|
620
|
+
return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, children: [_jsx(Header, { projectName: process.cwd().split("/").pop() || "gxdev" }), services.length > 0 && (_jsx(TabBar, { services: services, activeTab: activeTab, onTabChange: setActiveTab })), _jsx(Box, { height: logPanelHeight, flexDirection: "column", borderStyle: "single", borderColor: "gray", overflow: "hidden", children: currentService ? (_jsx(LogPanel, { logs: currentService.logs, maxHeight: logPanelHeight })) : (_jsx(WelcomeScreen, { updateInfo: updateInfo })) }), _jsx(CommandInput, { onSubmit: handleCommand, activeService: currentService
|
|
621
621
|
? {
|
|
622
622
|
id: currentService.id,
|
|
623
623
|
name: currentService.name,
|
package/dist/tui/App.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../bin/lib/tui/App.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC/D,OAAO,EAAE,GAAG,EAAQ,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAC5D,OAAO,aAAa,MAAM,+BAA+B,CAAA;AACzD,OAAO,MAAM,MAAM,wBAAwB,CAAA;AAC3C,OAAO,MAAM,MAAM,wBAAwB,CAAA;AAC3C,OAAO,QAAQ,MAAM,0BAA0B,CAAA;AAC/C,OAAO,YAAY,MAAM,8BAA8B,CAAA;AACvD,OAAO,OAAO,MAAM,yBAAyB,CAAA;AAC7C,OAAO,EACN,cAAc,EACd,SAAS,EACT,QAAQ,EACR,WAAW,EACX,UAAU,EACV,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EAGf,SAAS,EACT,qBAAqB,EACrB,iBAAiB,GAEjB,MAAM,qBAAqB,CAAA;AA0B5B,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAY;IACxD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAA;IACzB,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;IAC9B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC,CAAA;IACvD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC7C,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAEvD,sCAAsC;IACtC,MAAM,cAAc,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,CAAA;IAEzC,+EAA+E;IAC/E,MAAM,uBAAuB,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QAC7D,iBAAiB,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,oCAAoC;IACpC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,MAAM,eAAe,GAAG,cAAc,CAAC,cAAc,EAAE,CAAA;QACvD,WAAW,CACV,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;SACZ,CAAC,CAAC,CACH,CAAA;IACF,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,wCAAwC;IACxC,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,OAAe,EAAE,EAAE;YAC7C,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CACpB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACd,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CACtD,CACD,CAAA;QACF,CAAC,CAAA;QAED,MAAM,cAAc,GAAG,CAAC,EAAU,EAAE,MAAqB,EAAE,EAAE;YAC5D,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CACpB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACrD,CAAA;QACF,CAAC,CAAA;QAED,MAAM,aAAa,GAAG,CAAC,EAAU,EAAE,EAAE;YACpC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CACpB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACvD,CAAA;QACF,CAAC,CAAA;QAED,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAC/B,cAAc,CAAC,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA;QACjD,cAAc,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAA;QAE/C,OAAO,GAAG,EAAE;YACX,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YAChC,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA;YAClD,cAAc,CAAC,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,CAAA;QACjD,CAAC,CAAA;IACF,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,kBAAkB;IAClB,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,OAAO,GAAG,GAAG,EAAE;YACpB,cAAc,CAAC,YAAY,EAAE,CAAA;QAC9B,CAAC,CAAA;QAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC7B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAE9B,OAAO,GAAG,EAAE;YACX,OAAO,EAAE,CAAA;YACT,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC9B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAChC,CAAC,CAAA;IACF,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,4BAA4B;IAC5B,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACvB,iBAAiB;QACjB,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC/B,cAAc,CAAC,YAAY,EAAE,CAAA;YAC7B,IAAI,EAAE,CAAA;YACN,OAAM;QACP,CAAC;QAED,8BAA8B;QAC9B,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC/B,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzB,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAA;YACjD,CAAC;YACD,OAAM;QACP,CAAC;QAED,iCAAiC;QACjC,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC/B,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAChE,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAA;YACpC,CAAC;YACD,OAAM;QACP,CAAC;QAED,6EAA6E;QAC7E,IAAI,GAAG,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,YAAY,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;YACjE,OAAM;QACP,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,YAAY,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;YAC/C,OAAM;QACP,CAAC;QAED,8CAA8C;QAC9C,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACpC,IAAI,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAChC,YAAY,CAAC,QAAQ,CAAC,CAAA;YACvB,CAAC;YACD,OAAM;QACP,CAAC;IACF,CAAC,CAAC,CAAA;IAEF,6BAA6B;IAC7B,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,SAAS,EAAE,MAAM,EAAE,CAAC;YACvB,UAAU,CAAC,GAAG,EAAE;gBACf,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;oBACzB,aAAa,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;gBACzB,CAAC,CAAC,CAAA;YACH,CAAC,EAAE,GAAG,CAAC,CAAA;QACR,CAAC;IACF,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,EAAE;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;QAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAM;QAEpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAE9B,QAAQ,OAAO,EAAE,CAAC;YACjB,KAAK,MAAM;gBACV,YAAY,CAAC,WAAW,EAAE,CAAC,CAAA;gBAC3B,MAAK;YAEN,KAAK,KAAK;gBACT,cAAc,CAAC,OAAO,CAAC,CAAA;gBACvB,MAAK;YAEN,KAAK,QAAQ;gBACZ,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;oBAC3B,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBACnC,CAAC;qBAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;oBAClC,gBAAgB,EAAE,CAAA;gBACnB,CAAC;qBAAM,CAAC;oBACP,MAAM,cAAc,GACnB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAA;oBAC3D,iBAAiB,CAAC,cAAc,CAAC,CAAA;gBAClC,CAAC;gBACD,MAAK;YAEN,KAAK,MAAM;gBACV,oCAAoC;gBACpC,iBAAiB,CAAC,IAAI,CAAC,CAAA;gBACvB,MAAK;YAEN,KAAK,KAAK;gBACT,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAA;gBACtC,eAAe,CAAC,OAAO,CAAC,CAAA;gBACxB,MAAK;YAEN,KAAK,MAAM;gBACV,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBACvB,MAAK;YAEN,KAAK,SAAS;gBACb,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC1B,MAAK;YAEN,KAAK,OAAO;gBACX,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBACzB,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAA;gBACjD,CAAC;gBACD,MAAK;YAEN,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM;gBACV,cAAc,CAAC,YAAY,EAAE,CAAA;gBAC7B,IAAI,EAAE,CAAA;gBACN,MAAK;YAEN,KAAK,IAAI;gBACR,eAAe,CAAC,OAAO,CAAC,CAAA;gBACxB,MAAK;YAEN,KAAK,gBAAgB,CAAC;YACtB,KAAK,SAAS;gBACb,mBAAmB,CAAC,OAAO,CAAC,CAAA;gBAC5B,MAAK;YAEN,KAAK,gBAAgB;gBACpB,mBAAmB,CAAC,OAAO,CAAC,CAAA;gBAC5B,MAAK;YAEN;gBACC,YAAY,CACX,oBAAoB,OAAO,sCAAsC,CACjE,CAAA;QACH,CAAC;IACF,CAAC,CAAA;IAED,MAAM,cAAc,GAAG,CAAC,OAAiB,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;QACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAA;QAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAA;QAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;QAC3E,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;QAExE,qCAAqC;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAA;QAC1C,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAA;QAEzB,+DAA+D;QAC/D,MAAM,iBAAiB,GAAG,CAAC,QAAQ,CAAA;QAEnC,2BAA2B;QAC3B,IAAI,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,YAAY,CAAC,qCAAqC,CAAC,CAAA;YACnD,qBAAqB;YACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAA;YAC1D,IAAI,OAAO,IAAI,CAAC;gBAAE,YAAY,CAAC,OAAO,CAAC,CAAA;YACvC,OAAM;QACP,CAAC;QAED,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;QAEtB,uEAAuE;QACvE,IAAI,iBAAiB,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9D,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC1B,CAAC;QAED,4DAA4D;QAC5D,IAAI,WAAW,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7D,cAAc,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QACvD,CAAC;QACD,IAAI,UAAU,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3D,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QACtD,CAAC;QAED,sCAAsC;QACtC,MAAM,eAAe,GAAG,cAAc,CAAC,cAAc,EAAE,CAAA;QACvD,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAA;QACjE,WAAW,CACV,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;SACZ,CAAC,CAAC,CACH,CAAA;QACD,YAAY,CACX,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAChE,CAAA;IACF,CAAC,CAAA;IAED,MAAM,iBAAiB,GAAG,CAAC,WAAoB,KAAK,EAAE,EAAE;QACvD,IAAI,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,YAAY,CAAC,sCAAsC,CAAC,CAAA;YACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;YAC9D,IAAI,SAAS,IAAI,CAAC;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAA;YAC3C,OAAM;QACP,CAAC;QAED,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEzB,wCAAwC;QACxC,MAAM,eAAe,GAAG,cAAc,CAAC,cAAc,EAAE,CAAA;QACvD,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;QACrE,WAAW,CACV,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;SACZ,CAAC,CAAC,CACH,CAAA;QACD,YAAY,CACX,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CACpE,CAAA;IACF,CAAC,CAAA;IAED,MAAM,eAAe,GAAG,CAAC,OAAe,EAAE,EAAE;QAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAiB,CAAA;QACxD,IAAI,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC3D,YAAY,CAAC,oBAAoB,OAAO,8BAA8B,CAAC,CAAA;YACvE,OAAM;QACP,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,WAAW,EAAE,CAAA;QACtC,IAAI,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,YAAY,CAAC,GAAG,OAAO,gCAAgC,CAAC,CAAA;YACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;YAC5D,IAAI,MAAM,IAAI,CAAC;gBAAE,YAAY,CAAC,MAAM,CAAC,CAAA;YACrC,OAAM;QACP,CAAC;QAED,cAAc,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;QAExC,2CAA2C;QAC3C,MAAM,eAAe,GAAG,cAAc,CAAC,cAAc,EAAE,CAAA;QACvD,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;QACnE,WAAW,CACV,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;SACZ,CAAC,CAAC,CACH,CAAA;QACD,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IAC7E,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAAC,SAAkB,EAAE,EAAE;QAC1C,MAAM,QAAQ,GAAG,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAA;QACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,YAAY,CAAC,iDAAiD,CAAC,CAAA;YAC/D,OAAM;QACP,CAAC;QAED,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACzB,QAAQ,EAAE,CAAA;QACX,CAAC;aAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,UAAU,EAAE,CAAA;QACb,CAAC;aAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAgB,CAAA;YAC3D,aAAa,CAAC,OAAO,CAAC,CAAA;QACvB,CAAC;aAAM,CAAC;YACP,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9B,CAAC;QAED,YAAY,EAAE,CAAA;IACf,CAAC,CAAA;IAED,MAAM,cAAc,GAAG,CAAC,SAAkB,EAAE,EAAE;QAC7C,MAAM,QAAQ,GAAG,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAA;QACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,YAAY,CAAC,qDAAqD,CAAC,CAAA;YACnE,OAAM;QACP,CAAC;QAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC3B,YAAY,CAAC,oCAAoC,CAAC,CAAA;YAClD,OAAM;QACP,CAAC;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,YAAY,CAAC,mBAAmB,QAAQ,8BAA8B,CAAC,CAAA;QACxE,CAAC;QACD,YAAY,EAAE,CAAA;IACf,CAAC,CAAA;IAED,MAAM,eAAe,GAAG,KAAK,EAAE,OAAiB,EAAE,EAAE;QACnD,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QAE7B,QAAQ,UAAU,EAAE,CAAC;YACpB,KAAK,OAAO;gBACX,kCAAkC;gBAClC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAA2B,CAAA;gBACxD,IAAI,WAAW,EAAE,CAAC;oBACjB,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;oBACjD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACpB,YAAY,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;oBACpC,CAAC;yBAAM,CAAC;wBACP,YAAY,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;oBACpC,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,gDAAgD;oBAChD,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,EAAE,CAAA;oBAC3C,MAAM,SAAS,GAAG,qBAAqB,EAAE,CAAA;oBACzC,IAAI,OAAO,GAAG,wBAAwB,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,0BAA0B,CAAA;oBAC7G,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;wBAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS;4BACzB,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;4BACtB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,kBAAkB,CAAA;wBAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAA;wBACvD,OAAO,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,GAAG,MAAM,EAAE,CAAA;wBAC5C,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;4BAC9B,OAAO,IAAI,YAAY,CAAC,CAAC,MAAM,EAAE,CAAA;wBAClC,CAAC;oBACF,CAAC;oBACD,OAAO,IAAI,4CAA4C,CAAA;oBACvD,YAAY,CAAC,OAAO,CAAC,CAAA;gBACtB,CAAC;gBACD,MAAK;YAEN,KAAK,QAAQ;gBACZ,wCAAwC;gBACxC,MAAM,SAAS,GAAG,qBAAqB,EAAE,CAAA;gBACzC,MAAM,eAAe,GAAG,SAAS,CAAC,WAAW,EAAE,CAAA;gBAC/C,IAAI,SAAS,GAAG,uBAAuB,CAAA;gBACvC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;oBACpC,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAA;oBAC5D,SAAS,IAAI,OAAO,IAAI,IAAI,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,CAAA;oBAC5D,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;wBAC9B,SAAS,IAAI,UAAU,CAAC,CAAC,MAAM,EAAE,CAAA;oBAClC,CAAC;gBACF,CAAC;gBACD,YAAY,CAAC,SAAS,CAAC,CAAA;gBACvB,MAAK;YAEN,KAAK,KAAK;gBACT,uCAAuC;gBACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACf,YAAY,CAAC,gCAAgC,CAAC,CAAA;oBAC9C,OAAM;gBACP,CAAC;gBACD,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC9B,YAAY,CACX,qBAAqB,SAAS,CAAC,WAAW,EAAE,mEAAmE,CAC/G,CAAA;oBACD,OAAM;gBACP,CAAC;gBACD,MAAM,YAAY,GAAG,SAAS,CAAC,eAAe,EAAE,EAAE,IAAI,IAAI,IAAI,CAAA;gBAC9D,YAAY,CAAC,UAAU,YAAY,KAAK,QAAQ,EAAE,CAAC,CAAA;gBACnD,IAAI,CAAC;oBACJ,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;oBAC3C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;oBACtD,YAAY,CAAC,GAAG,YAAY,KAAK,QAAQ,EAAE,CAAC,CAAA;gBAC7C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,YAAY,CACX,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAChE,CAAA;gBACF,CAAC;gBACD,MAAK;YAEN,KAAK,OAAO;gBACX,SAAS,CAAC,iBAAiB,EAAE,CAAA;gBAC7B,YAAY,CAAC,+BAA+B,CAAC,CAAA;gBAC7C,MAAK;YAEN,KAAK,MAAM,CAAC;YACZ;gBACC,qBAAqB;gBACrB,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC9B,YAAY,CACX,qBAAqB,SAAS,CAAC,WAAW,EAAE,mEAAmE,CAC/G,CAAA;oBACD,OAAM;gBACP,CAAC;gBACD,cAAc,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;IACF,CAAC,CAAA;IAED,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,EAAE;QACxC,kEAAkE;QAClE,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YACpB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;YAC1D,IAAI,cAAc,EAAE,CAAC;gBACpB,yCAAyC;gBACzC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrB,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAC5D,CAAA;YACF,CAAC;iBAAM,CAAC;gBACP,6CAA6C;gBAC7C,MAAM,UAAU,GAAY;oBAC3B,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,SAAS;oBACjB,IAAI,EAAE,CAAC,OAAO,CAAC;iBACf,CAAA;gBACD,OAAO,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAA;YAC7B,CAAC;QACF,CAAC,CAAC,CAAA;QAEF,uBAAuB;QACvB,UAAU,CAAC,GAAG,EAAE;YACf,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;gBAC1D,IAAI,MAAM,IAAI,CAAC;oBAAE,YAAY,CAAC,MAAM,CAAC,CAAA;gBACrC,OAAO,OAAO,CAAA,CAAC,0BAA0B;YAC1C,CAAC,CAAC,CAAA;QACH,CAAC,EAAE,EAAE,CAAC,CAAA;IACP,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,KAAK,EAAE,SAAmB,EAAE,EAAE;QACtD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACvB,YAAY,CAAC,+CAA+C,CAAC,CAAA;YAC7D,OAAM;QACP,CAAC;QAED,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QAE/B,YAAY,CAAC,yBAAyB,SAAS,KAAK,CAAC,CAAA;QAErD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAC3D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,YAAY,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QACpC,CAAC;aAAM,CAAC;YACP,YAAY,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QACpC,CAAC;IACF,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC7B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;QACjC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,YAAY,CACX,6DAA6D,CAC7D,CAAA;YACD,OAAM;QACP,CAAC;QAED,IAAI,OAAO,GAAG,4BAA4B,CAAA;QAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,OAAO,IAAI,OAAO,KAAK,CAAC,IAAI,IAAI,CAAA;YAChC,OAAO,IAAI,cAAc,KAAK,CAAC,KAAK,IAAI,CAAA;YACxC,OAAO,IAAI,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAA;QAC3C,CAAC;QACD,OAAO,IAAI,mDAAmD,CAAA;QAC9D,YAAY,CAAC,OAAO,CAAC,CAAA;IACtB,CAAC,CAAA;IAED,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAiB,EAAE,EAAE;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACtE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAE3E,YAAY,CAAC,gDAAgD,CAAC,CAAA;QAE9D,IAAI,CAAC;YACJ,qCAAqC;YACrC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAA;YACjC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;YAC7B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;YAC/B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAA;YAEhD,oEAAoE;YACpE,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YAE1C,8DAA8D;YAC9D,4EAA4E;YAC5E,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;YACvD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAC1B,WAAW,EACX,KAAK,EACL,KAAK,EACL,OAAO,EACP,mBAAmB,CACnB,CAAA;YAED,qDAAqD;YACrD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjD,MAAM,kBAAkB,GAAG,UAAU,CAAC,SAAS,CAQ9C,CAAA;YAED,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;YAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAA;YAEhE,gCAAgC;YAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,YAAY,CAAC,kCAAkC,CAAC,CAAA;gBAChD,OAAM;YACP,CAAC;YAED,wBAAwB;YACxB,MAAM,eAAe,GAAG,kBAAkB,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAA;YAC1E,MAAM,OAAO,GAAG,kBAAkB,CAAC,eAAe,CAAC,eAAe,CAAC,CAAA;YACnE,YAAY,CAAC,OAAO,CAAC,CAAA;YAErB,oBAAoB;YACpB,MAAM,UAAU,GACf,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM;gBAC3C,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,MAAM;gBAC5C,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,MAAM;gBAC1C,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,MAAM;gBAChD,eAAe,CAAC,YAAY,CAAC,MAAM,CAAA;YAEpC,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACtB,YAAY,CAAC,6CAA6C,CAAC,CAAA;gBAC3D,OAAM;YACP,CAAC;YAED,IAAI,MAAM,EAAE,CAAC;gBACZ,YAAY,CAAC,iCAAiC,CAAC,CAAA;gBAC/C,YAAY,CAAC,yDAAyD,CAAC,CAAA;gBACvE,OAAM;YACP,CAAC;YAED,0BAA0B;YAC1B,IAAI,gBAAgB,GAA4B,EAAE,CAAA;YAClD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACJ,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAA;gBACtE,CAAC;gBAAC,MAAM,CAAC;oBACR,YAAY,CAAC,sDAAsD,CAAC,CAAA;oBACpE,gBAAgB,GAAG,kBAAkB,EAAE,CAAA;gBACxC,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,YAAY,CAAC,gCAAgC,CAAC,CAAA;gBAC9C,gBAAgB,GAAG,kBAAkB,EAAE,CAAA;YACxC,CAAC;YAED,kBAAkB;YAClB,MAAM,cAAc,GAAG,kBAAkB,CAAC,WAAW,CACpD,gBAAgB,EAChB,eAAe,EACf,EAAE,SAAS,EAAE,CACb,CAAA;YACD,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;YAC1E,YAAY,CAAC,2BAA2B,CAAC,CAAA;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,YAAY,CACX,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAChE,CAAA;QACF,CAAC;IACF,CAAC,CAAA;IAED,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAiB,EAAE,EAAE;QACvD,6EAA6E;QAC7E,gFAAgF;QAChF,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,OAAO,CAAC,CAAA;QAChE,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACnE,MAAM,GAAG,GAAG,uBAAuB,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;QAElE,YAAY,CAAC,EAAE,CAAC,CAAA;QAChB,YAAY,CACX,iEAAiE,CACjE,CAAA;QACD,YAAY,CAAC,0CAA0C,CAAC,CAAA;QACxD,YAAY,CAAC,EAAE,CAAC,CAAA;QAChB,YAAY,CAAC,aAAa,GAAG,SAAS,CAAC,CAAA;QACvC,YAAY,CAAC,EAAE,CAAC,CAAA;IACjB,CAAC,CAAA;IAED,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,CAAC;QACjC,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,kBAAkB;QAC/B,gBAAgB,EAAE,CAAC;QACnB,SAAS,EAAE,cAAc;QACzB,iBAAiB,EAAE,oBAAoB;QACvC,mBAAmB,EAAE,qBAAqB;QAC1C,kBAAkB,EAAE,qBAAqB;QACzC,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACxB,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,EAAE;QAChB,WAAW,EAAE,EAAE;KACf,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyD1B,CAAA;IAEA,gBAAgB;IAChB,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,CACN,KAAC,OAAO,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,YAAY,GAAI,CACtE,CAAA;IACF,CAAC;IAED,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;IAE1C,0DAA0D;IAC1D,iGAAiG;IACjG,MAAM,SAAS,GAAG,EAAE,CAAA;IACpB,MAAM,eAAe,GAAG,cAAc,GAAG,SAAS,GAAG,cAAc,CAAA;IACnE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA,CAAC,+BAA+B;IAEnF,OAAO,CACN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAE,cAAc,aACjD,KAAC,MAAM,IAAC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,GAAI,EAEjE,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CACvB,KAAC,MAAM,IACN,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,YAAY,GACxB,CACF,EAED,KAAC,GAAG,IACH,MAAM,EAAE,cAAc,EACtB,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAC,QAAQ,YAEhB,cAAc,CAAC,CAAC,CAAC,CACjB,KAAC,QAAQ,IAAC,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,GAAI,CAClE,CAAC,CAAC,CAAC,CACH,KAAC,aAAa,KAAG,CACjB,GACI,EAEN,KAAC,YAAY,IACZ,QAAQ,EAAE,aAAa,EACvB,aAAa,EACZ,cAAc;oBACb,CAAC,CAAC;wBACA,EAAE,EAAE,cAAc,CAAC,EAAE;wBACrB,IAAI,EAAE,cAAc,CAAC,IAAI;wBACzB,MAAM,EAAE,cAAc,CAAC,MAAM;qBAC7B;oBACF,CAAC,CAAC,IAAI,EAER,mBAAmB,EAAE,uBAAuB,GAC3C,IACG,CACN,CAAA;AACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../bin/lib/tui/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
interface UpdateInfo {
|
|
2
|
+
currentVersion: string;
|
|
3
|
+
latestVersion: string | null;
|
|
4
|
+
updateAvailable: boolean;
|
|
5
|
+
lastCheckedAt: number | null;
|
|
6
|
+
}
|
|
7
|
+
interface WelcomeScreenProps {
|
|
8
|
+
updateInfo?: UpdateInfo | null;
|
|
9
|
+
}
|
|
10
|
+
export default function WelcomeScreen({ updateInfo }?: WelcomeScreenProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
2
12
|
//# sourceMappingURL=WelcomeScreen.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WelcomeScreen.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/WelcomeScreen.tsx"],"names":[],"mappings":"AAuBA,MAAM,CAAC,OAAO,UAAU,aAAa,
|
|
1
|
+
{"version":3,"file":"WelcomeScreen.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/WelcomeScreen.tsx"],"names":[],"mappings":"AAuBA,UAAU,UAAU;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,eAAe,EAAE,OAAO,CAAA;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,UAAU,kBAAkB;IAC3B,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CAC9B;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,UAAU,EAAE,GAAE,kBAAuB,2CAsJ5E"}
|
|
@@ -17,7 +17,8 @@ const LOGO = `
|
|
|
17
17
|
╚██████╔╝██╔╝ ██╗██║
|
|
18
18
|
╚═════╝ ╚═╝ ╚═╝╚═╝
|
|
19
19
|
`;
|
|
20
|
-
export default function WelcomeScreen() {
|
|
21
|
-
|
|
20
|
+
export default function WelcomeScreen({ updateInfo } = {}) {
|
|
21
|
+
const showUpdateBanner = !!updateInfo && updateInfo.updateAvailable && !!updateInfo.latestVersion;
|
|
22
|
+
return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", flexGrow: 1, padding: 1, children: [_jsx(Text, { color: "blue", children: LOGO }), _jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { bold: true, color: "white", children: "GxP DevStudio" }), _jsxs(Text, { dimColor: true, children: ["v", pkg.version] })] }), showUpdateBanner && updateInfo && (_jsxs(Box, { marginTop: 1, paddingX: 2, borderStyle: "round", borderColor: "yellow", flexDirection: "column", alignItems: "center", children: [_jsxs(Text, { children: [_jsx(Text, { color: "yellow", children: "\uD83D\uDCE6 " }), _jsx(Text, { bold: true, color: "yellow", children: "Update available:" }), " ", _jsx(Text, { children: updateInfo.currentVersion }), _jsx(Text, { color: "gray", children: " \u2192 " }), _jsx(Text, { color: "cyan", children: updateInfo.latestVersion })] }), _jsxs(Text, { color: "gray", children: ["Run ", _jsx(Text, { color: "cyan", children: "npm i -g @gxp-dev/tools" }), " to update"] })] })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Interactive development environment for GxP plugins" }) }), _jsxs(Box, { marginTop: 2, flexDirection: "row", justifyContent: "center", children: [_jsxs(Box, { flexDirection: "column", marginRight: 4, children: [_jsx(Text, { color: "cyan", bold: true, children: "Quick Start" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/dev" }), " Start Vite + Socket.IO"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/dev --no-socket" }), " Start Vite only (no Socket)"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/dev --with-mock" }), " Start with Mock API"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/socket" }), " Start Socket.IO server"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/ext chrome" }), " Launch Chrome extension"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/help" }), " Show all commands"] })] })] }), _jsxs(Box, { flexDirection: "column", marginLeft: 4, children: [_jsx(Text, { color: "cyan", bold: true, children: "Keyboard Shortcuts" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Tab" }), " Cycle through tabs"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Left/Right" }), " Switch tabs"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Ctrl+K" }), " Stop current service"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Ctrl+L" }), " Clear current log"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Ctrl+C" }), " Exit application"] })] })] })] }), _jsxs(Box, { marginTop: 2, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "cyan", bold: true, children: "Socket Events" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsxs(Text, { color: "gray", children: ["Use ", _jsx(Text, { color: "yellow", children: "/socket list" }), " to see available events"] }), _jsxs(Text, { color: "gray", children: ["Use ", _jsx(Text, { color: "yellow", children: "/socket send EventName" }), " to simulate events"] })] })] }), _jsxs(Box, { marginTop: 2, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "cyan", bold: true, children: "Browser Extensions" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "gray", children: "Test your plugin on live GxP pages with the browser extension" }), _jsx(Text, { color: "gray", children: "Open DevTools and use the \"GxP Inspector\" panel to select components" })] })] }), _jsx(Box, { marginTop: 2, children: _jsx(Text, { dimColor: true, children: "Type a command below to get started..." }) })] }));
|
|
22
23
|
}
|
|
23
24
|
//# sourceMappingURL=WelcomeScreen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WelcomeScreen.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/WelcomeScreen.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEpC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,uDAAuD;AACvD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAA;AACjE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAE5B,MAAM,IAAI,GAAG;;;;;;;CAOZ,CAAA;
|
|
1
|
+
{"version":3,"file":"WelcomeScreen.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/WelcomeScreen.tsx"],"names":[],"mappings":"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"}
|
package/dist/tui/index.d.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
export interface UpdateInfo {
|
|
3
|
+
currentVersion: string;
|
|
4
|
+
latestVersion: string | null;
|
|
5
|
+
updateAvailable: boolean;
|
|
6
|
+
lastCheckedAt: number | null;
|
|
7
|
+
}
|
|
2
8
|
interface TUIOptions {
|
|
3
9
|
autoStart?: string[];
|
|
4
10
|
args?: Record<string, unknown>;
|
|
11
|
+
updateInfo?: UpdateInfo | null;
|
|
5
12
|
}
|
|
6
13
|
export declare function startTUI(options?: TUIOptions): void;
|
|
7
14
|
export default startTUI;
|
package/dist/tui/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../bin/lib/tui/index.tsx"],"names":[],"mappings":";AAWA,UAAU,UAAU;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,wBAAgB,QAAQ,CAAC,OAAO,GAAE,UAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../bin/lib/tui/index.tsx"],"names":[],"mappings":";AAWA,MAAM,WAAW,UAAU;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,eAAe,EAAE,OAAO,CAAA;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,UAAU,UAAU;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CAC9B;AAED,wBAAgB,QAAQ,CAAC,OAAO,GAAE,UAAe,QA4BhD;AAUD,eAAe,QAAQ,CAAA"}
|
package/dist/tui/index.js
CHANGED
|
@@ -20,7 +20,7 @@ export function startTUI(options = {}) {
|
|
|
20
20
|
if (!stdinIsTTY) {
|
|
21
21
|
throw new Error("NO_TTY");
|
|
22
22
|
}
|
|
23
|
-
const { waitUntilExit } = render(_jsx(App, { autoStart: options.autoStart, args: options.args }));
|
|
23
|
+
const { waitUntilExit } = render(_jsx(App, { autoStart: options.autoStart, args: options.args, updateInfo: options.updateInfo }));
|
|
24
24
|
waitUntilExit().then(() => {
|
|
25
25
|
// Ensure all services are stopped before exiting
|
|
26
26
|
serviceManager.forceStopAll();
|
package/dist/tui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../bin/lib/tui/index.tsx"],"names":[],"mappings":";;AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,GAAG,MAAM,UAAU,CAAA;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,mEAAmE;AACnE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../bin/lib/tui/index.tsx"],"names":[],"mappings":";;AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,GAAG,MAAM,UAAU,CAAA;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,mEAAmE;AACnE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;AAezD,MAAM,UAAU,QAAQ,CAAC,UAAsB,EAAE;IAChD,qEAAqE;IACrE,sBAAsB;IACtB,+BAA+B;IAC/B,qCAAqC;IACrC,4BAA4B;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;IAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAA;IAEvC,qEAAqE;IACrE,gEAAgE;IAChE,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC/B,KAAC,GAAG,IACH,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,UAAU,EAAE,OAAO,CAAC,UAAU,GAC7B,CACF,CAAA;IAED,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QACzB,iDAAiD;QACjD,cAAc,CAAC,YAAY,EAAE,CAAA;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC,CAAC,CAAA;AACH,CAAC;AAED,kCAAkC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,MAAM,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACtE,IAAI,MAAM,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAA;AACX,CAAC;AAED,eAAe,QAAQ,CAAA"}
|
package/mcp/lib/config-ops.js
CHANGED
|
@@ -163,7 +163,12 @@ function moveItem(doc, fromPointer, targetArrayPointer, position = "end") {
|
|
|
163
163
|
* cards with their JSON pointer, type, title, and a summary of children.
|
|
164
164
|
*
|
|
165
165
|
* Cards are discovered under:
|
|
166
|
-
* additionalTabs[] (root array of cards)
|
|
166
|
+
* additionalTabs[] (root array of cards — admin form)
|
|
167
|
+
* formTemplate[] (root array of cards — starter
|
|
168
|
+
* form/quiz/survey questions; only
|
|
169
|
+
* present on form apps where
|
|
170
|
+
* app-manifest.json has
|
|
171
|
+
* `formTemplate: true`)
|
|
167
172
|
* <card>.cards[] (card_list)
|
|
168
173
|
* <card>.tabsList[].cards[] (tabs_list)
|
|
169
174
|
*/
|
|
@@ -201,6 +206,9 @@ function listCards(doc) {
|
|
|
201
206
|
if (Array.isArray(doc?.additionalTabs)) {
|
|
202
207
|
doc.additionalTabs.forEach((c, i) => walk(c, `/additionalTabs/${i}`))
|
|
203
208
|
}
|
|
209
|
+
if (Array.isArray(doc?.formTemplate)) {
|
|
210
|
+
doc.formTemplate.forEach((c, i) => walk(c, `/formTemplate/${i}`))
|
|
211
|
+
}
|
|
204
212
|
return out
|
|
205
213
|
}
|
|
206
214
|
|
package/mcp/lib/config-tools.js
CHANGED
|
@@ -224,7 +224,7 @@ const CONFIG_TOOLS = [
|
|
|
224
224
|
{
|
|
225
225
|
name: "config_add_card",
|
|
226
226
|
description:
|
|
227
|
-
"Add a card under a parent container (additionalTabs, a card_list's cards[], or a tabs_list tab).",
|
|
227
|
+
"Add a card under a parent container (additionalTabs, formTemplate, a card_list's cards[], or a tabs_list tab). The `/additionalTabs` and `/formTemplate` root arrays are auto-initialized if missing, so the first add works without seeding.",
|
|
228
228
|
inputSchema: {
|
|
229
229
|
type: "object",
|
|
230
230
|
properties: {
|
|
@@ -232,7 +232,7 @@ const CONFIG_TOOLS = [
|
|
|
232
232
|
parent_path: {
|
|
233
233
|
type: "string",
|
|
234
234
|
description:
|
|
235
|
-
"JSON pointer to the parent array of cards
|
|
235
|
+
"JSON pointer to the parent array of cards. Top-level options: '/additionalTabs' (admin configuration form) or '/formTemplate' (starter form/quiz questions for form apps). Nested options: '/additionalTabs/0/cards', '/formTemplate/0/cards', etc.",
|
|
236
236
|
},
|
|
237
237
|
card: {
|
|
238
238
|
type: "object",
|
|
@@ -448,6 +448,18 @@ async function handleConfigToolCall(name, args = {}) {
|
|
|
448
448
|
case "config_add_card": {
|
|
449
449
|
const abs = resolveProjectPath(args.path)
|
|
450
450
|
const doc = readJson(abs)
|
|
451
|
+
|
|
452
|
+
// Auto-initialize known root-level card arrays if they're missing
|
|
453
|
+
// so the first `config_add_card` against /formTemplate (or
|
|
454
|
+
// /additionalTabs) works without a separate seeding step.
|
|
455
|
+
const KNOWN_ROOT_ARRAYS = ["/formTemplate", "/additionalTabs"]
|
|
456
|
+
if (KNOWN_ROOT_ARRAYS.includes(args.parent_path)) {
|
|
457
|
+
const rootKey = args.parent_path.slice(1)
|
|
458
|
+
if (!Array.isArray(doc[rootKey])) {
|
|
459
|
+
doc[rootKey] = []
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
451
463
|
const parent = getByPointer(doc, args.parent_path)
|
|
452
464
|
if (!Array.isArray(parent)) {
|
|
453
465
|
throw new Error(
|
package/package.json
CHANGED
|
@@ -28,6 +28,8 @@ Ask clarifying questions. Don't guess — a single clarification prevents a larg
|
|
|
28
28
|
|
|
29
29
|
The `gxp-api` MCP server is your source of truth for the platform. Never invent endpoints or event names.
|
|
30
30
|
|
|
31
|
+
**Before anything else, confirm the MCP is live** — call `api_list_tags`. The server is configured in `.mcp.json` at the project root and provided by the `gxp-api-server` binary that ships with `@gxp-dev/tools` (on PATH; verify with `which gxp-api-server`). If the `api_*` / `config_*` / `docs_*` tools aren't available, tell the user to run `claude mcp add gxp-api gxp-api-server` and restart the session. Do not proceed without it.
|
|
32
|
+
|
|
31
33
|
**API discovery:**
|
|
32
34
|
|
|
33
35
|
- `api_list_tags` — enumerate tags so you can browse.
|
|
@@ -520,6 +522,74 @@ Each field's `name` must exactly match the manifest key it controls — that's t
|
|
|
520
522
|
|
|
521
523
|
Every mutation is linter-guarded against `bin/lib/lint/schemas/`. If a write is refused, read the validation error and fix the input — do not reach for `force: true`.
|
|
522
524
|
|
|
525
|
+
## Form / Quiz / Survey Apps — `formTemplate`
|
|
526
|
+
|
|
527
|
+
Some plugins _are_ a form: a quiz, a survey, a signup flow. For those, ship a starter question set an admin can customize on install. Two keys, kept consistent:
|
|
528
|
+
|
|
529
|
+
1. **`app-manifest.json` → `"formTemplate": true`** — flags the plugin as a form app so the platform opts into form-specific UI (question editor, response viewer).
|
|
530
|
+
2. **`configuration.json` → `"formTemplate": [ ...cards ]`** — array of cards defining the starter form sections, same shape as `additionalTabs`. Typically `fields_list` cards whose `fieldsList` items are the end-user questions.
|
|
531
|
+
|
|
532
|
+
### Minimal example
|
|
533
|
+
|
|
534
|
+
```json
|
|
535
|
+
// app-manifest.json
|
|
536
|
+
{
|
|
537
|
+
"name": "welcome-quiz",
|
|
538
|
+
"version": "0.1.0",
|
|
539
|
+
"formTemplate": true,
|
|
540
|
+
"settings": {},
|
|
541
|
+
"strings": { "default": { "title": "Welcome Quiz" } },
|
|
542
|
+
"assets": {},
|
|
543
|
+
"dependencies": [],
|
|
544
|
+
"permissions": []
|
|
545
|
+
}
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
```json
|
|
549
|
+
// configuration.json
|
|
550
|
+
{
|
|
551
|
+
"additionalTabs": [
|
|
552
|
+
/* admin-facing plugin config (unchanged) */
|
|
553
|
+
],
|
|
554
|
+
"formTemplate": [
|
|
555
|
+
{
|
|
556
|
+
"type": "fields_list",
|
|
557
|
+
"title": "About You",
|
|
558
|
+
"fieldsList": [
|
|
559
|
+
{ "type": "text", "name": "full_name", "label": "Full name" },
|
|
560
|
+
{
|
|
561
|
+
"type": "radio",
|
|
562
|
+
"name": "experience",
|
|
563
|
+
"label": "Experience level",
|
|
564
|
+
"options": [
|
|
565
|
+
{ "label": "Beginner", "value": "beginner" },
|
|
566
|
+
{ "label": "Advanced", "value": "advanced" }
|
|
567
|
+
]
|
|
568
|
+
}
|
|
569
|
+
]
|
|
570
|
+
}
|
|
571
|
+
]
|
|
572
|
+
}
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
### Building with the MCP
|
|
576
|
+
|
|
577
|
+
Pointer-based adds work against `/formTemplate` the same way they do against `/additionalTabs`:
|
|
578
|
+
|
|
579
|
+
- `config_add_card` with `parent_path: "/formTemplate"` — the array auto-initializes on first add, no seed step.
|
|
580
|
+
- `config_add_card` with `parent_path: "/formTemplate/0/cards"` — nest under a `card_list` for grouped sections.
|
|
581
|
+
- `config_add_field` with `card_path: "/formTemplate/0"` — add a question to the first section.
|
|
582
|
+
- `config_list_cards` — returns cards from both `/additionalTabs` and `/formTemplate` with their JSON pointers.
|
|
583
|
+
|
|
584
|
+
Use any valid field type (`text`, `textarea`, `number`, `radio`, `checkbox`, `select`, `asyncSelect`, `selectAsset`, etc.). The `name` of each field becomes the response key the platform stores.
|
|
585
|
+
|
|
586
|
+
### Mental model
|
|
587
|
+
|
|
588
|
+
- `additionalTabs` → **admin** configuration (every plugin). Strings, assets, color pickers, dependency binding, feature toggles.
|
|
589
|
+
- `formTemplate` → **end-user** questions (only form apps). Only add here if `app-manifest.json` has `formTemplate: true`.
|
|
590
|
+
|
|
591
|
+
Don't mix. Quiz questions never belong in `additionalTabs`; admin config never belongs in `formTemplate`. Both roots validate against the same card/field schema, so `gxdev lint --all` catches malformed structures in either place.
|
|
592
|
+
|
|
523
593
|
## Component Template
|
|
524
594
|
|
|
525
595
|
When creating new components, use this pattern:
|
package/template/AGENTS.md
CHANGED
|
@@ -21,6 +21,8 @@ Ask clarifying questions instead of guessing. A 30-second question beats a 30-mi
|
|
|
21
21
|
|
|
22
22
|
Use the `gxp-api` MCP server to ground the implementation in the real platform — never invent endpoints or event names.
|
|
23
23
|
|
|
24
|
+
**Verify the MCP is live before planning anything** by calling `api_list_tags`. The server is defined in `.mcp.json` at the project root and provided by the `gxp-api-server` binary that ships with `@gxp-dev/tools` (on PATH — check with `which gxp-api-server`). If the `api_*` / `config_*` / `docs_*` tools aren't available, tell the user to run `claude mcp add gxp-api gxp-api-server` (or `codex mcp add …` / add it to `~/.gemini/settings.json`) and restart the session. Do not proceed without the MCP.
|
|
25
|
+
|
|
24
26
|
- **Find endpoints** — `api_list_tags`, `api_list_operation_ids` (optionally scoped by tag), `search_api_endpoints` (keyword).
|
|
25
27
|
- **Inspect a specific endpoint** — `api_get_operation_parameters`, `get_endpoint_details`.
|
|
26
28
|
- **Find endpoints by payload shape** — `api_find_endpoints_by_schema` (search by request/response field names).
|
|
@@ -319,6 +321,78 @@ Group related fields into `fields_list` cards (`config_add_card` then `config_ad
|
|
|
319
321
|
|
|
320
322
|
If a mutation is refused, read the validation error and fix the input — do not reach for `force: true`.
|
|
321
323
|
|
|
324
|
+
## Form / Quiz / Survey Apps — `formTemplate`
|
|
325
|
+
|
|
326
|
+
Some plugins _are_ a form — a quiz, a survey, a signup questionnaire, a check-in flow. For those, the configuration file ships a second root-level card array, `formTemplate`, that holds the starter questions an admin customizes on install.
|
|
327
|
+
|
|
328
|
+
**Two keys tie this together. You must set both consistently.**
|
|
329
|
+
|
|
330
|
+
1. **`app-manifest.json` → `"formTemplate": true`** — declares the plugin as a form app. Platforms use this to opt the install into form-specific UI (question editor, response viewer, etc.).
|
|
331
|
+
2. **`configuration.json` → `"formTemplate": [ ...cards ]`** — the starter question set, structured identically to `additionalTabs`: an array of cards, typically `fields_list` sections, each with a `fieldsList` of question fields.
|
|
332
|
+
|
|
333
|
+
### Minimal example
|
|
334
|
+
|
|
335
|
+
```json
|
|
336
|
+
// app-manifest.json
|
|
337
|
+
{
|
|
338
|
+
"name": "welcome-quiz",
|
|
339
|
+
"version": "0.1.0",
|
|
340
|
+
"formTemplate": true,
|
|
341
|
+
"settings": {},
|
|
342
|
+
"strings": { "default": { "title": "Welcome Quiz" } },
|
|
343
|
+
"assets": {},
|
|
344
|
+
"dependencies": [],
|
|
345
|
+
"permissions": []
|
|
346
|
+
}
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
```json
|
|
350
|
+
// configuration.json
|
|
351
|
+
{
|
|
352
|
+
"additionalTabs": [
|
|
353
|
+
/* admin-facing plugin config goes here as always */
|
|
354
|
+
],
|
|
355
|
+
"formTemplate": [
|
|
356
|
+
{
|
|
357
|
+
"type": "fields_list",
|
|
358
|
+
"title": "About You",
|
|
359
|
+
"fieldsList": [
|
|
360
|
+
{ "type": "text", "name": "full_name", "label": "Full name" },
|
|
361
|
+
{
|
|
362
|
+
"type": "radio",
|
|
363
|
+
"name": "experience",
|
|
364
|
+
"label": "Experience level",
|
|
365
|
+
"options": [
|
|
366
|
+
{ "label": "Beginner", "value": "beginner" },
|
|
367
|
+
{ "label": "Advanced", "value": "advanced" }
|
|
368
|
+
]
|
|
369
|
+
}
|
|
370
|
+
]
|
|
371
|
+
}
|
|
372
|
+
]
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### Building `formTemplate` with the MCP
|
|
377
|
+
|
|
378
|
+
Use the same `config_*` tools you'd use for `additionalTabs`, pointed at the `/formTemplate` root:
|
|
379
|
+
|
|
380
|
+
- `config_add_card` with `parent_path: "/formTemplate"` — the array is auto-initialized on first add, no seed step needed.
|
|
381
|
+
- `config_add_card` with `parent_path: "/formTemplate/0/cards"` — nest sub-cards if you need a `card_list` grouping.
|
|
382
|
+
- `config_add_field` with `card_path: "/formTemplate/0"` — add questions to a section.
|
|
383
|
+
- `config_list_cards` — lists cards from both `/additionalTabs` and `/formTemplate` with their JSON pointers.
|
|
384
|
+
|
|
385
|
+
Use the same field types as any other form (`text`, `textarea`, `number`, `radio`, `checkbox`, `select`, `asyncSelect`, `selectAsset`, etc.). Question names live under `fieldsList[].name` — these become the response keys the platform stores.
|
|
386
|
+
|
|
387
|
+
### When to use `formTemplate` vs `additionalTabs`
|
|
388
|
+
|
|
389
|
+
- `additionalTabs` — **admin** configuration form (every plugin has this). The person installing the plugin fills this in once.
|
|
390
|
+
- `formTemplate` — **end-user** form questions (only form apps). Admins may tweak these before publishing; end users (attendees, staff) answer them at runtime.
|
|
391
|
+
|
|
392
|
+
Don't confuse them. Strings, assets, dependencies, colors → `additionalTabs`. Quiz/survey questions that end users will answer → `formTemplate`.
|
|
393
|
+
|
|
394
|
+
Finish with `gxdev lint --all`. The linter validates both roots against the same card/field schema, so malformed questions fail in the same way malformed admin fields do.
|
|
395
|
+
|
|
322
396
|
## Component Kit
|
|
323
397
|
|
|
324
398
|
Import UI components from `@gramercytech/gx-componentkit`:
|
package/template/GEMINI.md
CHANGED
|
@@ -18,6 +18,8 @@ Before writing anything, clarify with the client:
|
|
|
18
18
|
|
|
19
19
|
Ground the implementation in real platform endpoints and events. Do not invent API paths or event names.
|
|
20
20
|
|
|
21
|
+
**Verify the MCP is live first** — call `api_list_tags`. The server is defined in `.gemini/settings.json` at the project root and provided by the `gxp-api-server` binary that ships with `@gxp-dev/tools` (on PATH). If the tools aren't available, tell the user to add `gxp-api` to `~/.gemini/settings.json` under `mcpServers` with command `gxp-api-server`, then restart the session.
|
|
22
|
+
|
|
21
23
|
- Endpoints — `api_list_tags`, `api_list_operation_ids`, `search_api_endpoints`, `api_get_operation_parameters`, `get_endpoint_details`.
|
|
22
24
|
- Find by payload shape — `api_find_endpoints_by_schema`.
|
|
23
25
|
- WebSocket events — `api_find_events_for_operation` (maps operationId → events via `x-triggered-by`), `api_list_events`, `search_websocket_events`, `get_asyncapi_spec`. Run for every planned operationId so you subscribe instead of polling.
|
|
@@ -229,6 +231,21 @@ Every admin-editable piece of content goes through a directive — that's the br
|
|
|
229
231
|
|
|
230
232
|
Tools: `config_list_card_types`, `config_list_field_types`, `config_get_field_schema`, `config_add_card`, `config_add_field`, `config_move_field`, `config_remove_field`, `config_validate`, `config_extract_strings`. Every mutation is linter-guarded against schemas in `bin/lib/lint/schemas/`.
|
|
231
233
|
|
|
234
|
+
## Form / Quiz / Survey Apps — `formTemplate`
|
|
235
|
+
|
|
236
|
+
If the plugin _is_ a form (quiz, survey, questionnaire), ship a starter question set the admin can customize on install. Two keys, both required, must be kept consistent:
|
|
237
|
+
|
|
238
|
+
1. `app-manifest.json` → `"formTemplate": true` — marks the plugin as a form app.
|
|
239
|
+
2. `configuration.json` → `"formTemplate": [ ...cards ]` — array of cards (same shape as `additionalTabs`), typically `fields_list` sections whose `fieldsList` items are the questions.
|
|
240
|
+
|
|
241
|
+
Build it with the same MCP tools, pointed at `/formTemplate`:
|
|
242
|
+
|
|
243
|
+
- `config_add_card` with `parent_path: "/formTemplate"` (the array is auto-initialized on first add).
|
|
244
|
+
- `config_add_field` with `card_path: "/formTemplate/0"` to add questions to a section.
|
|
245
|
+
- `config_list_cards` surfaces both `/additionalTabs` and `/formTemplate` cards.
|
|
246
|
+
|
|
247
|
+
Mental model: `additionalTabs` = **admin** config (every plugin). `formTemplate` = **end-user** questions (only form apps). Admin strings, assets, colors, dependency bindings → `additionalTabs`. Questions an attendee/user will answer → `formTemplate`.
|
|
248
|
+
|
|
232
249
|
## Component Kit
|
|
233
250
|
|
|
234
251
|
Use `@gramercytech/gx-componentkit` for UI:
|