- होम
- Documentation
- TUI
- थीमिंग संदर्भ
थीमिंग संदर्भ
यह दस्तावेज़ बताता है कि आज कोडिंग-एजेंट में थीमिंग कैसे काम करती है: स्कीमा, लोडिंग, रनटाइम व्यवहार, और विफलता के तरीके।
थीम सिस्टम क्या नियंत्रित करता है
Section titled “थीम सिस्टम क्या नियंत्रित करता है”थीम सिस्टम निम्नलिखित को संचालित करता है:
- TUI भर में उपयोग किए जाने वाले फ़ोरग्राउंड/बैकग्राउंड रंग टोकन
- मार्कडाउन स्टाइलिंग अडैप्टर (
getMarkdownTheme()) - सेलेक्टर/एडिटर/सेटिंग्स लिस्ट अडैप्टर (
getSelectListTheme(),getEditorTheme(),getSettingsListTheme()) - सिंबल प्रीसेट + सिंबल ओवरराइड (
unicode,nerd,ascii) - नेटिव हाइलाइटर द्वारा उपयोग किए जाने वाले सिंटैक्स हाइलाइटिंग रंग (
@f5-sales-demo/pi-natives) - स्टेटस लाइन सेगमेंट रंग
प्राथमिक इम्प्लीमेंटेशन: src/modes/theme/theme.ts।
थीम JSON आकार
Section titled “थीम JSON आकार”थीम फ़ाइलें JSON ऑब्जेक्ट हैं जिन्हें theme.ts (ThemeJsonSchema) में रनटाइम स्कीमा के विरुद्ध सत्यापित किया जाता है और src/modes/theme/theme-schema.json द्वारा मिरर किया जाता है।
शीर्ष-स्तरीय फ़ील्ड:
name(आवश्यक)colors(आवश्यक; सभी रंग टोकन आवश्यक)vars(वैकल्पिक; पुन: उपयोग योग्य रंग वेरिएबल)export(वैकल्पिक; HTML एक्सपोर्ट रंग)symbols(वैकल्पिक)preset(वैकल्पिक:unicode | nerd | ascii)overrides(वैकल्पिक:SymbolKeyके लिए key/value ओवरराइड)
रंग मान स्वीकार करते हैं:
- hex स्ट्रिंग (
"#RRGGBB") - 256-रंग इंडेक्स (
0..255) - वेरिएबल संदर्भ स्ट्रिंग (
varsके माध्यम से रिज़ॉल्व किया गया) - रिक्त स्ट्रिंग (
"") जिसका अर्थ है टर्मिनल डिफ़ॉल्ट (\x1b[39mfg,\x1b[49mbg)
आवश्यक रंग टोकन (वर्तमान)
Section titled “आवश्यक रंग टोकन (वर्तमान)”नीचे सभी टोकन colors में आवश्यक हैं।
मुख्य टेक्स्ट और बॉर्डर (11)
Section titled “मुख्य टेक्स्ट और बॉर्डर (11)”accent, border, borderAccent, borderMuted, success, error, warning, muted, dim, text, thinkingText
बैकग्राउंड ब्लॉक (7)
Section titled “बैकग्राउंड ब्लॉक (7)”selectedBg, userMessageBg, customMessageBg, toolPendingBg, toolSuccessBg, toolErrorBg, statusLineBg
मैसेज/टूल टेक्स्ट (5)
Section titled “मैसेज/टूल टेक्स्ट (5)”userMessageText, customMessageText, customMessageLabel, toolTitle, toolOutput
मार्कडाउन (10)
Section titled “मार्कडाउन (10)”mdHeading, mdLink, mdLinkUrl, mdCode, mdCodeBlock, mdCodeBlockBorder, mdQuote, mdQuoteBorder, mdHr, mdListBullet
टूल diff + सिंटैक्स हाइलाइटिंग (12)
Section titled “टूल diff + सिंटैक्स हाइलाइटिंग (12)”toolDiffAdded, toolDiffRemoved, toolDiffContext,
syntaxComment, syntaxKeyword, syntaxFunction, syntaxVariable, syntaxString, syntaxNumber, syntaxType, syntaxOperator, syntaxPunctuation
मोड/थिंकिंग बॉर्डर (8)
Section titled “मोड/थिंकिंग बॉर्डर (8)”thinkingOff, thinkingMinimal, thinkingLow, thinkingMedium, thinkingHigh, thinkingXhigh, bashMode, pythonMode
स्टेटस लाइन सेगमेंट रंग (14)
Section titled “स्टेटस लाइन सेगमेंट रंग (14)”statusLineSep, statusLineModel, statusLinePath, statusLineGitClean, statusLineGitDirty, statusLineContext, statusLineSpend, statusLineStaged, statusLineDirty, statusLineUntracked, statusLineOutput, statusLineCost, statusLineSubagents
वैकल्पिक टोकन
Section titled “वैकल्पिक टोकन”export अनुभाग (वैकल्पिक)
Section titled “export अनुभाग (वैकल्पिक)”HTML एक्सपोर्ट थीमिंग हेल्पर के लिए उपयोग किया जाता है:
export.pageBgexport.cardBgexport.infoBg
यदि छोड़ा गया, तो एक्सपोर्ट कोड रिज़ॉल्व किए गए थीम रंगों से डिफ़ॉल्ट प्राप्त करता है।
symbols अनुभाग (वैकल्पिक)
Section titled “symbols अनुभाग (वैकल्पिक)”symbols.presetएक थीम-स्तरीय डिफ़ॉल्ट सिंबल सेट सेट करता है।symbols.overridesव्यक्तिगतSymbolKeyमानों को ओवरराइड कर सकता है।
रनटाइम प्राथमिकता:
- सेटिंग्स
symbolPresetओवरराइड (यदि सेट है) - थीम JSON
symbols.preset - फ़ॉलबैक
"unicode"
अमान्य ओवरराइड keys को अनदेखा किया जाता है और लॉग किया जाता है (logger.debug)।
बिल्ट-इन बनाम कस्टम थीम स्रोत
Section titled “बिल्ट-इन बनाम कस्टम थीम स्रोत”थीम लुकअप क्रम (loadThemeJson):
- बिल्ट-इन एम्बेडेड थीम (
defaults/xcsh-dark.jsonऔरdefaults/xcsh-light.jsonजोdefaultThemesमें संकलित हैं) - कस्टम थीम फ़ाइल:
<customThemesDir>/<name>.json
कस्टम थीम डायरेक्टरी getCustomThemesDir() से आती है:
- डिफ़ॉल्ट:
~/.xcsh/agent/themes PI_CODING_AGENT_DIRद्वारा ओवरराइड किया गया ($PI_CODING_AGENT_DIR/themes)
getAvailableThemes() मर्ज किए गए बिल्ट-इन + कस्टम नाम लौटाता है, सॉर्ट किए गए, नाम टकराव पर बिल्ट-इन को प्राथमिकता मिलती है।
लोडिंग, सत्यापन, और रिज़ॉल्यूशन
Section titled “लोडिंग, सत्यापन, और रिज़ॉल्यूशन”कस्टम थीम फ़ाइलों के लिए:
- JSON पढ़ें
- JSON पार्स करें
ThemeJsonSchemaके विरुद्ध सत्यापित करेंvarsसंदर्भों को पुनरावर्ती रूप से रिज़ॉल्व करें- रिज़ॉल्व किए गए मानों को टर्मिनल क्षमता मोड द्वारा ANSI में परिवर्तित करें
सत्यापन व्यवहार:
- अनुपस्थित आवश्यक रंग टोकन: स्पष्ट समूहीकृत त्रुटि संदेश
- गलत टोकन प्रकार/मान: JSON पथ के साथ सत्यापन त्रुटियाँ
- अज्ञात थीम फ़ाइल:
Theme not found: <name>
Var संदर्भ व्यवहार:
- नेस्टेड संदर्भों का समर्थन करता है
- अनुपस्थित वेरिएबल संदर्भ पर त्रुटि फेंकता है
- गोलाकार संदर्भों पर त्रुटि फेंकता है
टर्मिनल रंग मोड व्यवहार
Section titled “टर्मिनल रंग मोड व्यवहार”रंग मोड डिटेक्शन (detectColorMode):
COLORTERM=truecolor|24bit=> truecolorWT_SESSION=> truecolorTERMमेंdumb,linux, या खाली => 256color- अन्यथा => truecolor
रूपांतरण व्यवहार:
- hex ->
Bun.color(..., "ansi-16m" | "ansi-256") - numeric ->
38;5/48;5ANSI ""-> डिफ़ॉल्ट fg/bg रीसेट
रनटाइम स्विचिंग व्यवहार
Section titled “रनटाइम स्विचिंग व्यवहार”प्रारंभिक थीम (initTheme)
Section titled “प्रारंभिक थीम (initTheme)”main.ts सेटिंग्स के साथ थीम इनिशियलाइज़ करता है:
symbolPresetcolorBlindModetheme.darktheme.light
ऑटो थीम स्लॉट चयन COLORFGBG बैकग्राउंड डिटेक्शन का उपयोग करता है:
COLORFGBGसे बैकग्राउंड इंडेक्स पार्स करें< 8=> डार्क स्लॉट (theme.dark)>= 8=> लाइट स्लॉट (theme.light)- पार्स विफलता => डार्क स्लॉट
सेटिंग्स स्कीमा से वर्तमान डिफ़ॉल्ट:
theme.dark = "xcsh-dark"theme.light = "xcsh-light"symbolPreset = "unicode"colorBlindMode = false
स्पष्ट स्विचिंग (setTheme)
Section titled “स्पष्ट स्विचिंग (setTheme)”- चयनित थीम लोड करता है
- ग्लोबल
themeसिंगलटन अपडेट करता है - वैकल्पिक रूप से वॉचर शुरू करता है
onThemeChangeकॉलबैक ट्रिगर करता है
विफलता पर:
- बिल्ट-इन
darkपर फ़ॉलबैक करता है { success: false, error }लौटाता है
प्रीव्यू स्विचिंग (previewTheme)
Section titled “प्रीव्यू स्विचिंग (previewTheme)”- ग्लोबल
themeपर अस्थायी प्रीव्यू थीम लागू करता है - अपने आप सहेजी गई सेटिंग्स नहीं बदलता
- फ़ॉलबैक प्रतिस्थापन के बिना success/error लौटाता है
सेटिंग्स UI इसे लाइव प्रीव्यू के लिए उपयोग करता है और रद्द करने पर पूर्व थीम पुनर्स्थापित करता है।
वॉचर और लाइव रीलोड
Section titled “वॉचर और लाइव रीलोड”जब वॉचर सक्षम हो (setTheme(..., true) / इंटरएक्टिव इनिट):
- केवल कस्टम फ़ाइल पथ
<customThemesDir>/<currentTheme>.jsonदेखता है - बिल्ट-इन प्रभावी रूप से नहीं देखे जाते
- फ़ाइल
change: रीलोड का प्रयास करता है (debounced) - फ़ाइल
rename/delete:darkपर फ़ॉलबैक करता है, वॉचर बंद करता है
ऑटो मोड एक SIGWINCH लिस्टनर भी इंस्टॉल करता है और टर्मिनल स्थिति बदलने पर डार्क/लाइट स्लॉट मैपिंग का पुनर्मूल्यांकन कर सकता है।
कलर-ब्लाइंड मोड व्यवहार
Section titled “कलर-ब्लाइंड मोड व्यवहार”colorBlindMode रनटाइम पर केवल एक टोकन बदलता है:
toolDiffAddedको HSV-समायोजित किया जाता है (हरा रंग नीले की ओर स्थानांतरित)- समायोजन केवल तब लागू होता है जब रिज़ॉल्व किया गया मान hex स्ट्रिंग हो
अन्य टोकन अपरिवर्तित रहते हैं।
थीम सेटिंग्स कहाँ सहेजी जाती हैं
Section titled “थीम सेटिंग्स कहाँ सहेजी जाती हैं”थीम-संबंधित सेटिंग्स Settings द्वारा ग्लोबल config YAML में सहेजी जाती हैं:
- पथ:
<agentDir>/config.yml - डिफ़ॉल्ट एजेंट डायरेक्टरी:
~/.xcsh/agent - प्रभावी डिफ़ॉल्ट फ़ाइल:
~/.xcsh/agent/config.yml
सहेजी गई keys:
theme.darktheme.lightsymbolPresetcolorBlindMode
लेगेसी माइग्रेशन मौजूद है: पुराने फ्लैट theme: "name" को luminance डिटेक्शन के आधार पर नेस्टेड theme.dark या theme.light में माइग्रेट किया जाता है।
कस्टम थीम बनाना (व्यावहारिक)
Section titled “कस्टम थीम बनाना (व्यावहारिक)”- कस्टम थीम डायरेक्टरी में फ़ाइल बनाएँ, जैसे
~/.xcsh/agent/themes/my-theme.json। name, वैकल्पिकvars, और सभी आवश्यकcolorsटोकन शामिल करें।- वैकल्पिक रूप से
symbolsऔरexportशामिल करें। - Settings में थीम चुनें (
Display -> Dark themeयाDisplay -> Light theme) इस पर निर्भर करते हुए कि आप कौन सा ऑटो स्लॉट चाहते हैं।
न्यूनतम स्केलेटन। colors में हर key आवश्यक है — रनटाइम वैलिडेटर
(additionalProperties: false) अनुपस्थित keys और अज्ञात keys दोनों को अस्वीकार करता है।
शिप किए गए संदर्भ इम्प्लीमेंटेशन के लिए देखें
packages/coding-agent/src/modes/theme/defaults/xcsh-dark.json
और xcsh-light.json।
स्टेटस लाइन में दो समानांतर रंग प्रणालियाँ हैं जो issue #242 में दस्तावेज़ीकृत हैं:
- Hex टेक्स्ट रंग (
statusLinePath,statusLineGitClean,statusLineGitDirty,statusLineStaged,statusLineDirty,statusLineUntracked) नॉन-पावरलाइन रेंडरिंग को संचालित करते हैं। - 256-रंग पैलेट इंडेक्स (
statusLine<Segment>Bg/statusLine<Segment>Fg) पावरलाइन सेगमेंट फिल को संचालित करते हैं। वे ऊपर की hex keys से स्वतंत्र हैं — दोनों सेट होने चाहिए।
{ "name": "my-theme", "vars": { "accent": "#7aa2f7", "muted": 244 }, "colors": { "accent": "accent", "chromeAccent": "accent", "spinnerAccent": "accent", "contentAccent": "muted", "border": "#4c566a", "borderAccent": "accent", "borderMuted": "muted", "success": "#9ece6a", "error": "#f7768e", "warning": "#e0af68", "muted": "muted", "dim": 240, "gutterSuccess": "#7dcfff", "gutterWarning": "#e0af68", "text": "", "thinkingText": "muted",
"selectedBg": "#2a2f45", "userMessageBg": "#1f2335", "userMessageText": "", "customMessageBg": "#24283b", "customMessageText": "", "customMessageLabel": "accent", "toolPendingBg": "#1f2335", "toolSuccessBg": "#1f2d2a", "toolErrorBg": "#2d1f2a", "toolTitle": "", "toolOutput": "muted",
"mdHeading": "accent", "mdLink": "accent", "mdLinkUrl": "muted", "mdCode": "#c0caf5", "mdCodeBlock": "#c0caf5", "mdCodeBlockBorder": "muted", "mdQuote": "muted", "mdQuoteBorder": "muted", "mdHr": "muted", "mdListBullet": "accent",
"toolDiffAdded": "#9ece6a", "toolDiffRemoved": "#f7768e", "toolDiffContext": "muted",
"syntaxComment": "#565f89", "syntaxKeyword": "#bb9af7", "syntaxFunction": "#7aa2f7", "syntaxVariable": "#c0caf5", "syntaxString": "#9ece6a", "syntaxNumber": "#ff9e64", "syntaxType": "#2ac3de", "syntaxOperator": "#89ddff", "syntaxPunctuation": "#9aa5ce", "syntaxControl": "#bb9af7",
"thinkingOff": 240, "thinkingMinimal": 244, "thinkingLow": "#7aa2f7", "thinkingMedium": "#2ac3de", "thinkingHigh": "#bb9af7", "thinkingXhigh": "#f7768e",
"bashMode": "#2ac3de", "pythonMode": "#bb9af7",
"statusLineBg": "#16161e", "statusLineSep": 240, "statusLineModel": "#bb9af7", "statusLinePath": "#7aa2f7", "statusLineGitClean": "#9ece6a", "statusLineGitDirty": "#e0af68", "statusLineContext": "#2ac3de", "statusLineSpend": "#7dcfff", "statusLineStaged": "#9ece6a", "statusLineDirty": "#e0af68", "statusLineUntracked": "#f7768e", "statusLineOutput": "#c0caf5", "statusLineCost": "#ff9e64", "statusLineSubagents": "#bb9af7",
"statusLineOsIconBg": 7, "statusLineOsIconFg": 232, "statusLinePathBg": 4, "statusLinePathFg": 254, "statusLineGitCleanBg": 2, "statusLineGitCleanFg": 0, "statusLineGitDirtyBg": 3, "statusLineGitDirtyFg": 0, "statusLineGitStagedBg": 64, "statusLineGitStagedFg": 0, "statusLineGitUntrackedBg": 39, "statusLineGitUntrackedFg": 0, "statusLineGitConflictBg": 1, "statusLineGitConflictFg": 7, "statusLinePlanModeBg": 236, "statusLinePlanModeFg": 117, "statusLineProfileXcshBg": "accent", "statusLineProfileXcshFg": 231 }}कस्टम थीम का परीक्षण
Section titled “कस्टम थीम का परीक्षण”इस वर्कफ़्लो का उपयोग करें:
- इंटरएक्टिव मोड शुरू करें (स्टार्टअप से वॉचर सक्षम)।
- सेटिंग्स खोलें और थीम मान प्रीव्यू करें (लाइव
previewTheme)। - कस्टम थीम फ़ाइलों के लिए, चलते समय JSON संपादित करें और सेव पर ऑटो-रीलोड की पुष्टि करें।
- महत्वपूर्ण सतहों का परीक्षण करें:
- मार्कडाउन रेंडरिंग
- टूल ब्लॉक (pending/success/error)
- diff रेंडरिंग (added/removed/context)
- स्टेटस लाइन पठनीयता
- थिंकिंग स्तर बॉर्डर परिवर्तन
- bash/python मोड बॉर्डर रंग
- यदि आपकी थीम glyph चौड़ाई/दिखावट पर निर्भर करती है तो दोनों सिंबल प्रीसेट सत्यापित करें।
वास्तविक बाधाएँ और सावधानियाँ
Section titled “वास्तविक बाधाएँ और सावधानियाँ”- कस्टम थीम के लिए सभी
colorsटोकन आवश्यक हैं। exportऔरsymbolsवैकल्पिक हैं।- थीम JSON में
$schemaसूचनात्मक है; रनटाइम सत्यापन कोड में संकलित TypeBox स्कीमा द्वारा लागू किया जाता है। setThemeविफलताdarkपर फ़ॉलबैक करती है;previewThemeविफलता वर्तमान थीम को प्रतिस्थापित नहीं करती।- फ़ाइल वॉचर रीलोड त्रुटियाँ वर्तमान लोड की गई थीम को तब तक बनाए रखती हैं जब तक कि सफल रीलोड या फ़ॉलबैक पथ ट्रिगर न हो जाए।