इसे छोड़कर कंटेंट पर जाएं

स्लैश कमांड आंतरिक संरचना

यह दस्तावेज़ बताता है कि coding-agent में स्लैश कमांड किस प्रकार खोजे जाते हैं, डुप्लीकेट हटाए जाते हैं, इंटरएक्टिव मोड में प्रस्तुत किए जाते हैं, और प्रॉम्प्ट समय पर विस्तारित किए जाते हैं।

कार्यान्वयन फ़ाइलें

Section titled “कार्यान्वयन फ़ाइलें”

स्लैश कमांड एक क्षमता (id: "slash-commands") हैं जो कमांड नाम द्वारा कुंजीबद्ध हैं (key: cmd => cmd.name)।

क्षमता रजिस्ट्री सभी पंजीकृत प्रदाताओं को लोड करती है, प्रदाता प्राथमिकता के अनुसार अवरोही क्रम में क्रमबद्ध करती है, और पहले आने वाले को प्राथमिकता (first wins) के नियम के साथ कुंजी द्वारा डुप्लीकेट हटाती है।

प्रदाता प्राथमिकता

Section titled “प्रदाता प्राथमिकता”

वर्तमान स्लैश-कमांड प्रदाता और उनकी प्राथमिकताएँ:

  1. native (OMP) — प्राथमिकता 100
  2. claude — प्राथमिकता 80
  3. claude-plugins — प्राथमिकता 70
  4. codex — प्राथमिकता 70

टाई व्यवहार: समान-प्राथमिकता वाले प्रदाता पंजीकरण क्रम बनाए रखते हैं। वर्तमान इम्पोर्ट क्रम codex से पहले claude-plugins को पंजीकृत करता है, इसलिए नाम टकराव होने पर प्लगइन कमांड codex कमांड पर जीतते हैं।

नाम-टकराव व्यवहार

Section titled “नाम-टकराव व्यवहार”

slash-commands के लिए, टकराव सख्त रूप से क्षमता डिडुप द्वारा हल किए जाते हैं:

  • उच्चतम-प्राथमिकता वाला आइटम result.items में रखा जाता है
  • कम-प्राथमिकता वाले डुप्लीकेट केवल result.all में रहते हैं और _shadowed = true चिह्नित होते हैं

यह प्रदाताओं के पार और एक प्रदाता के भीतर भी लागू होता है यदि वह डुप्लीकेट नाम लौटाता है।

फ़ाइल स्कैनिंग व्यवहार

Section titled “फ़ाइल स्कैनिंग व्यवहार”

प्रदाता अधिकतर loadFilesFromDir(...) का उपयोग करते हैं, जो वर्तमान में:

  • गैर-पुनरावर्ती मिलान (*.md) पर डिफ़ॉल्ट होता है
  • gitignore: true, hidden: false के साथ नेटिव glob का उपयोग करता है
  • प्रत्येक मिलान की गई फ़ाइल को पढ़ता है और उसे SlashCommand में रूपांतरित करता है

इसलिए छुपी हुई फ़ाइलें/डायरेक्टरी लोड नहीं होती हैं, और अनदेखे पथ छोड़ दिए जाते हैं।

2) प्रदाता-विशिष्ट स्रोत पथ और स्थानीय प्राथमिकता

Section titled “2) प्रदाता-विशिष्ट स्रोत पथ और स्थानीय प्राथमिकता”

खोज मूल .xcsh डायरेक्टरी से आते हैं:

  • प्रोजेक्ट: <cwd>/.xcsh/commands/*.md
  • उपयोगकर्ता: ~/.xcsh/agent/commands/*.md

getConfigDirs() पहले प्रोजेक्ट लौटाता है, फिर उपयोगकर्ता, इसलिए नाम टकराव होने पर प्रोजेक्ट नेटिव कमांड उपयोगकर्ता नेटिव कमांड से जीतते हैं

लोड करता है:

  • उपयोगकर्ता: ~/.claude/commands/*.md
  • प्रोजेक्ट: <cwd>/.claude/commands/*.md

प्रदाता प्रोजेक्ट आइटम से पहले उपयोगकर्ता आइटम पुश करता है, इसलिए इस प्रदाता के भीतर समान-नाम टकराव पर उपयोगकर्ता Claude कमांड प्रोजेक्ट Claude कमांड से जीतते हैं

लोड करता है:

  • उपयोगकर्ता: ~/.codex/commands/*.md
  • प्रोजेक्ट: <cwd>/.codex/commands/*.md

दोनों पक्ष लोड किए जाते हैं फिर उपयोगकर्ता-प्रथम क्रम में समतल किए जाते हैं, इसलिए टकराव पर उपयोगकर्ता Codex कमांड प्रोजेक्ट Codex कमांड से जीतते हैं

Codex कमांड सामग्री फ्रंटमैटर स्ट्रिपिंग (parseFrontmatter) के साथ पार्स की जाती है, और कमांड नाम फ्रंटमैटर name द्वारा ओवरराइड किया जा सकता है; अन्यथा फ़ाइलनाम का उपयोग किया जाता है।

claude-plugins प्रदाता (claude-plugins.ts)

Section titled “claude-plugins प्रदाता (claude-plugins.ts)”

~/.claude/plugins/installed_plugins.json से प्लगइन कमांड मूल लोड करता है, फिर <pluginRoot>/commands/*.md स्कैन करता है।

क्रम उस JSON डेटा से रजिस्ट्री पुनरावृत्ति क्रम और प्रति-प्लगइन एंट्री क्रम का अनुसरण करता है। कोई अतिरिक्त सॉर्ट चरण नहीं है।

3) रनटाइम FileSlashCommand में मटेरियलाइज़ेशन

Section titled “3) रनटाइम FileSlashCommand में मटेरियलाइज़ेशन”

src/extensibility/slash-commands.ts में loadSlashCommands() क्षमता आइटम को प्रॉम्प्ट समय पर उपयोग किए जाने वाले FileSlashCommand ऑब्जेक्ट में परिवर्तित करता है।

प्रत्येक कमांड के लिए:

  1. फ्रंटमैटर/बॉडी पार्स करें (parseFrontmatter)
  2. विवरण स्रोत:
    • frontmatter.description यदि मौजूद हो
    • अन्यथा पहली गैर-रिक्त बॉडी लाइन (ट्रिम की गई, अधिकतम 60 वर्ण ... के साथ)
  3. पार्स की गई बॉडी को निष्पादन योग्य टेम्पलेट सामग्री के रूप में रखें
  4. via Claude Code Project जैसी प्रदर्शन स्रोत स्ट्रिंग की गणना करें

फ्रंटमैटर पार्स गंभीरता स्रोत-निर्भर है:

  • native स्तर -> पार्स त्रुटियाँ fatal हैं
  • user/project स्तर -> पार्स त्रुटियाँ warn हैं जिनमें फ़ॉलबैक पार्सिंग होती है

बंडल किए गए फ़ॉलबैक कमांड

Section titled “बंडल किए गए फ़ॉलबैक कमांड”

फाइलसिस्टम/प्रदाता कमांड के बाद, एम्बेडेड कमांड टेम्पलेट (EMBEDDED_COMMAND_TEMPLATES) जोड़े जाते हैं यदि उनके नाम पहले से मौजूद नहीं हैं।

वर्तमान एम्बेडेड सेट src/task/commands.ts से आता है और फ़ॉलबैक के रूप में उपयोग किया जाता है (source: "bundled")।

4) इंटरएक्टिव मोड: कमांड सूचियाँ कहाँ से आती हैं

Section titled “4) इंटरएक्टिव मोड: कमांड सूचियाँ कहाँ से आती हैं”

इंटरएक्टिव मोड ऑटोकम्पलीट और कमांड रूटिंग के लिए कई कमांड स्रोतों को संयोजित करता है।

निर्माण समय पर यह एक पेंडिंग कमांड सूची बनाता है:

  • बिल्ट-इन (BUILTIN_SLASH_COMMANDS, जिसमें चयनित कमांड के लिए तर्क पूर्णता और इनलाइन संकेत शामिल हैं)
  • एक्सटेंशन-पंजीकृत स्लैश कमांड (extensionRunner.getRegisteredCommands(...))
  • TypeScript कस्टम कमांड (session.customCommands), स्लैश कमांड लेबल में मैप किए गए
  • वैकल्पिक स्किल कमांड (/skill:<name>) जब skills.enableSkillCommands सक्षम हो

फिर init() फ़ाइल-आधारित कमांड लोड करने और एक CombinedAutocompleteProvider इंस्टॉल करने के लिए refreshSlashCommandState(...) को कॉल करता है जिसमें शामिल है:

  • ऊपर की पेंडिंग कमांड
  • खोजे गए फ़ाइल-आधारित कमांड

refreshSlashCommandState(...) session.setSlashCommands(...) भी अपडेट करता है ताकि प्रॉम्प्ट विस्तार उसी खोजे गए फ़ाइल कमांड सेट का उपयोग करे।

रिफ्रेश जीवनचक्र

Section titled “रिफ्रेश जीवनचक्र”

स्लैश कमांड स्थिति रिफ्रेश होती है:

  • इंटरएक्टिव इनिट के दौरान
  • /move द्वारा कार्यशील डायरेक्टरी बदलने के बाद (handleMoveCommand resetCapabilities() फिर refreshSlashCommandState(newCwd) कॉल करता है)

कमांड डायरेक्टरी के लिए कोई निरंतर फ़ाइल वॉचर नहीं है।

Extensions डैशबोर्ड slash-commands क्षमता भी लोड करता है और सक्रिय/छाया किए गए कमांड प्रविष्टियाँ प्रदर्शित करता है, जिसमें _shadowed डुप्लीकेट शामिल हैं।

5) प्रॉम्प्ट पाइपलाइन स्थान

Section titled “5) प्रॉम्प्ट पाइपलाइन स्थान”

AgentSession.prompt(...) स्लैश हैंडलिंग क्रम (जब expandPromptTemplates !== false):

  1. एक्सटेंशन कमांड (#tryExecuteExtensionCommand)
    यदि /name एक्सटेंशन-पंजीकृत कमांड से मेल खाता है, हैंडलर तुरंत निष्पादित होता है और प्रॉम्प्ट वापस आता है।
  2. TypeScript कस्टम कमांड (#tryExecuteCustomCommand)
    केवल सीमा: यदि मेल खाता है, यह निष्पादित होता है और वापस कर सकता है:
    • string -> प्रॉम्प्ट टेक्स्ट को उस स्ट्रिंग से बदलें
    • void/undefined -> हैंडल किए गए के रूप में माना जाता है; कोई LLM प्रॉम्प्ट नहीं
  3. फ़ाइल-आधारित स्लैश कमांड (expandSlashCommand)
    यदि टेक्स्ट अभी भी / से शुरू होता है, तो markdown कमांड विस्तार का प्रयास करें।
  4. प्रॉम्प्ट टेम्पलेट (expandPromptTemplate)
    स्लैश/कस्टम प्रसंस्करण के बाद लागू।
  5. डिलीवरी
    • idle: प्रॉम्प्ट तुरंत एजेंट को भेजा जाता है
    • streaming: प्रॉम्प्ट streamingBehavior के आधार पर steer/follow-up के रूप में क्यूड किया जाता है

इसीलिए स्लैश कमांड विस्तार प्रॉम्प्ट-टेम्पलेट विस्तार से पहले होता है, और इसीलिए कस्टम कमांड फ़ाइल-कमांड मिलान से पहले प्रमुख स्लैश को रूपांतरित कर सकते हैं।

6) फ़ाइल-आधारित स्लैश कमांड के लिए विस्तार सिमेंटिक्स

Section titled “6) फ़ाइल-आधारित स्लैश कमांड के लिए विस्तार सिमेंटिक्स”

expandSlashCommand(text, fileCommands) व्यवहार:

  • केवल तब चलता है जब टेक्स्ट / से शुरू होता है
  • / के बाद पहले टोकन से कमांड नाम पार्स करता है
  • parseCommandArgs के माध्यम से शेष टेक्स्ट से args पार्स करता है
  • लोड किए गए fileCommands में सटीक नाम मिलान खोजता है
  • यदि मेल खाया, लागू करता है:
    • स्थितिगत प्रतिस्थापन: $1, $2, …
    • समेकित प्रतिस्थापन: $ARGUMENTS और $@
    • फिर { args, ARGUMENTS, arguments } के साथ prompt.render के माध्यम से टेम्पलेट रेंडरिंग
  • यदि कोई मेल नहीं, मूल टेक्स्ट अपरिवर्तित लौटाता है

parseCommandArgs की सावधानियाँ

Section titled “parseCommandArgs की सावधानियाँ”

पार्सर एक सरल quote-aware विभाजन है:

  • स्पेस रखने के लिए 'single' और "double" quoting का समर्थन करता है
  • quote सीमांकक हटाता है
  • backslash escaping नियम लागू नहीं करता
  • अपूर्ण quote कोई त्रुटि नहीं है; पार्सर अंत तक उपभोग करता है

7) अज्ञात /... व्यवहार

Section titled “7) अज्ञात /... व्यवहार”

अज्ञात स्लैश इनपुट को मुख्य स्लैश लॉजिक द्वारा अस्वीकार नहीं किया जाता

यदि कमांड एक्सटेंशन/कस्टम/फ़ाइल परतों द्वारा हैंडल नहीं किया जाता, expandSlashCommand मूल टेक्स्ट लौटाता है, और लिटरल /... प्रॉम्प्ट सामान्य प्रॉम्प्ट-टेम्पलेट विस्तार और LLM डिलीवरी के माध्यम से आगे बढ़ता है।

इंटरएक्टिव मोड InputController में कई बिल्ट-इन को अलग से कठोरता से हैंडल करता है (उदाहरण के लिए /settings, /model, /mcp, /move, /exit)। ये session.prompt(...) से पहले उपभोग किए जाते हैं और इसलिए उस पथ में फ़ाइल-कमांड विस्तार तक कभी नहीं पहुँचते।

8) idle की तुलना में streaming-time अंतर

Section titled “8) idle की तुलना में streaming-time अंतर”
  • session.prompt("/x ...") कमांड पाइपलाइन चलाता है और या तो कमांड तुरंत निष्पादित करता है या विस्तारित टेक्स्ट सीधे भेजता है।

Streaming पथ (session.isStreaming === true)

Section titled “Streaming पथ (session.isStreaming === true)”
  • prompt(...) अभी भी पहले एक्सटेंशन/कस्टम/फ़ाइल/टेम्पलेट रूपांतरण चलाता है
  • फिर streamingBehavior की आवश्यकता होती है:
    • "steer" -> इंटरप्ट संदेश क्यू करें (agent.steer)
    • "followUp" -> पोस्ट-टर्न संदेश क्यू करें (agent.followUp)
  • यदि streamingBehavior छोड़ा गया है, प्रॉम्प्ट एक त्रुटि फेंकता है

महत्वपूर्ण कमांड-विशिष्ट streaming व्यवहार

Section titled “महत्वपूर्ण कमांड-विशिष्ट streaming व्यवहार”
  • एक्सटेंशन कमांड streaming के दौरान भी तुरंत निष्पादित होते हैं (टेक्स्ट के रूप में क्यूड नहीं)।
  • steer(...)/followUp(...) हेल्पर मेथड एक्सटेंशन कमांड को अस्वीकार करती हैं (#throwIfExtensionCommand) ताकि हैंडलर के लिए कमांड टेक्स्ट क्यूइंग से बचा जा सके जिन्हें synchronously चलना चाहिए।
  • Compaction queue रिप्ले isKnownSlashCommand(...) का उपयोग करता है यह तय करने के लिए कि क्यूड प्रविष्टियों को session.prompt(...) के माध्यम से रिप्ले किया जाना चाहिए (ज्ञात स्लैश कमांड के लिए) बनाम raw steer/follow-up मेथड।

9) त्रुटि प्रबंधन और विफलता सतह

Section titled “9) त्रुटि प्रबंधन और विफलता सतह”
  • प्रदाता लोड विफलताएँ अलग होती हैं; रजिस्ट्री चेतावनियाँ एकत्र करती है और अन्य प्रदाताओं के साथ जारी रहती है।
  • अमान्य स्लैश कमांड आइटम (गायब नाम/पथ/सामग्री या अमान्य स्तर) क्षमता सत्यापन द्वारा हटा दिए जाते हैं।
  • फ्रंटमैटर पार्स विफलताएँ:
    • native कमांड: fatal पार्स त्रुटि बुलबुले उठती है
    • non-native कमांड: चेतावनी + फ़ॉलबैक key/value पार्स
  • एक्सटेंशन/कस्टम कमांड हैंडलर अपवाद पकड़े जाते हैं और एक्सटेंशन त्रुटि चैनल के माध्यम से रिपोर्ट किए जाते हैं (या एक्सटेंशन रनर के बिना कस्टम कमांड के लिए logger फ़ॉलबैक), और हैंडल किए गए के रूप में माना जाता है (कोई अनपेक्षित फ़ॉलबैक निष्पादन नहीं)।