@@ -141,6 +141,35 @@ const handoffUrls = (markdown: string): readonly URL[] =>
141141 ( [ value ] ) => new URL ( value ) ,
142142 ) ;
143143
144+ const productionSupportUrl = "https://askgina.ai/support" ;
145+
146+ const openAiSkillInterfaces = {
147+ "review-gina-account" : {
148+ display_name : "Review Gina Account" ,
149+ short_description : "Review Ask Gina portfolio balances, linked wallets, and automations." ,
150+ } ,
151+ "research-spot-tokens" : {
152+ display_name : "Research Spot Tokens" ,
153+ short_description : "Research live token prices, historical charts, and swap history." ,
154+ } ,
155+ "research-prediction-markets" : {
156+ display_name : "Research Prediction Markets" ,
157+ short_description : "Research live Polymarket events, outcome books, and market positions." ,
158+ } ,
159+ "research-hyperliquid" : {
160+ display_name : "Research Hyperliquid" ,
161+ short_description : "Research live Hyperliquid markets, account activity, and positions." ,
162+ } ,
163+ } as const satisfies Readonly <
164+ Record <
165+ ( typeof ASK_GINA_SKILL_DEFINITIONS ) [ number ] [ "name" ] ,
166+ Readonly < {
167+ display_name : string ;
168+ short_description : string ;
169+ } >
170+ >
171+ > ;
172+
144173const targetManifestPath : Readonly < Record < TargetName , string > > = {
145174 openai : ".codex-plugin/plugin.json" ,
146175 cursor : ".cursor-plugin/plugin.json" ,
@@ -226,7 +255,8 @@ const validateManifest = (target: TargetName, manifest: unknown): boolean => {
226255 nested ( manifest , "skills" ) === "./skills/" &&
227256 nested ( manifest , "mcpServers" ) === "./.mcp.json" &&
228257 nested ( manifest , "interface" , "composerIcon" ) === "./assets/icon.svg" &&
229- nested ( manifest , "interface" , "logo" ) === "./assets/icon.svg"
258+ nested ( manifest , "interface" , "logo" ) === "./assets/icon.svg" &&
259+ nested ( manifest , "interface" , "supportURL" ) === productionSupportUrl
230260 ) ;
231261 }
232262
@@ -536,9 +566,13 @@ export const checkGeneratedTargetConformance: {
536566 fs . readFileString ( canonicalMetadataPath ) ,
537567 )
538568 : "" ;
569+ const expectedInterface = openAiSkillInterfaces [ skill . name ] ;
539570 const metadataMatches =
540571 metadataExists &&
541572 metadata === canonicalMetadata &&
573+ metadata . startsWith (
574+ `interface:\n display_name: "${ expectedInterface . display_name } "\n short_description: "${ expectedInterface . short_description } "\ndependencies:\n` ,
575+ ) &&
542576 metadata . includes ( 'type: "mcp"' ) &&
543577 metadata . includes ( 'value: "ask-gina"' ) &&
544578 metadata . includes ( 'transport: "streamable_http"' ) &&
0 commit comments