स्व-निहित रनटाइम
Apothem का इंजन किसी भी चेकआउट से कैसे चलता है — वेंडर की गई निर्भरताएँ, PYTHONPATH=src आह्वान मॉडल, और प्लगइन-ट्री बूटस्ट्रैप।
स्व-निहित रनटाइम
Apothem का इंजन एक स्व-निहित रनटाइम है: यह बिना किसी रजिस्ट्री के, किसी भी
चेकआउट या रखे गए स्रोत ट्री से सीधे चलता है, क्योंकि इसकी तृतीय-पक्ष निर्भरताएँ
इसके साथ चलती हैं। दो हिस्से इसे संभव बनाते हैं — एक वेंडर किया गया निर्भरता ट्री
और एक python -m आह्वान मॉडल, जिसे किसी इंस्टॉल की गई कंसोल स्क्रिप्ट की
आवश्यकता नहीं होती।
वेंडर किया गया निर्भरता ट्री
सत्यापन और सीरियलाइज़ेशन स्टैक src/apothem/_vendor/ के अंतर्गत शुद्ध-Python
स्रोत के रूप में वेंडर किया गया है, और प्रत्येक पैकेज के साथ उसकी अपस्ट्रीम
लाइसेंस फ़ाइल रहती है:
yaml(शुद्ध-Python पार्सर/एमिटर; वैकल्पिक libyaml C एक्सटेंशन साथ नहीं रखा जाता)jsonschema, अपनी निर्भरता श्रृंखलाattrs(और उसकेattrउपनाम),referencing, औरjsonschema_specificationsके साथrpds— एक शुद्ध-Python शिम जोjsonschemaऔरreferencingद्वारा उपयोग की जाने वालीHashTrieMap,HashTrieSet, औरListसतह को अंतर्निर्मित प्रकारों के सहारे फिर से लागू करता है, ताकि स्टैक शून्य संकलित एक्सटेंशनों के साथ चलेtyping_extensions
वेंडर की गई प्रतियाँ किसी भी सिस्टम-इंस्टॉल संस्करण पर वरीयता पाती हैं: प्लगइन
बूटस्ट्रैप, npm शिम, इंस्टॉलर, और स्वयं python -m apothem एंट्री पॉइंट, ये सभी
वेंडर डायरेक्टरी को sys.path पर site-packages से आगे रखते हैं। चयन नीति — क्या
वेंडर किया जाता है, क्या नहीं, और वेंडर किए गए पैकेज कैसे ताज़ा किए जाते हैं —
निर्भरता वेंडरिंग रणनीति में प्रलेखित है।
दो निर्भरताएँ ट्री के बाहर रहती हैं: click और rich, वे टर्मिनल-मुखी
लाइब्रेरी जिन्हें CLI इम्पोर्ट करता है। उन्हें उस इंटरप्रेटर के अंतर्गत
इम्पोर्ट-योग्य होना चाहिए जो इंजन चलाता है; इंस्टॉलर दोनों की जाँच करते हैं, जो भी
लुप्त हो उसका नाम बताते हैं, और उसे आपके लिए इंस्टॉल करने का प्रस्ताव देते हैं —
आपकी पुष्टि के साथ, या --yes / APOTHEM_AUTO_INSTALL_DEPS=1 के साथ स्वचालित रूप
से। हर अन्य चैनल पर एंट्री पॉइंट CLI इम्पोर्ट करने से पहले मानक लाइब्रेरी से दोनों
की जाँच करता है, और किसी एक के लुप्त होने पर वह एक त्रुटि के साथ रुक जाता है जो
चल रहे इंटरप्रेटर के लिए सटीक pip कमांड बताती है (--json के अंतर्गत
runtime.dependency_missing कोड वाला एक JSON लिफ़ाफ़ा)।
python -m आह्वान मॉडल
Apothem जानबूझकर pyproject.toml में कोई कंसोल स्क्रिप्ट घोषित नहीं करता — कंसोल
स्क्रिप्ट केवल तभी मौजूद होती हैं जब कोई पैकेज मैनेजर उन्हें PATH पर रखता है, और
स्व-निहित रनटाइम कभी किसी पैकेज मैनेजर को मानकर नहीं चलता। इसके बजाय इंजन की दो
आह्वान सतहें हैं:
| सतह | आह्वान | संदर्भ |
|---|---|---|
| इंजन CLI | python -m apothem <command> | PYTHONPATH पर src/ वाला एक स्रोत ट्री (चेकआउट, npx कैश, प्लगइन ट्री) |
| हुक रनटाइम | <resolved CPython> "<harness-root>/.apothem/support/hooks/dispatch.py" <event> | Claude Code का मूर्तीकरण: हार्नेस रूट के साझा .apothem/support/ ट्री के अंतर्गत प्रति, निरपेक्ष पथ द्वारा |
python -m apothemsrc/apothem/__main__.pyचलाता है, जोsrc/apothem/_vendorकोsys.pathपर रखता है, जाँचता है किclickऔरrichइम्पोर्ट-योग्य हैं, फिरapothem.cli:main— Click कमांड समूह — को कॉल करता है।- मटेरियलाइज़ की गई
settings.json/hooks.jsonमें हुक प्रविष्टियाँ डिस्पैचर (और, Claude Code के लिए,<harness-root>/.apothem/support/conformity/gate.pyपर अनुरूपता गेट) को निरपेक्ष स्क्रिप्ट पथ द्वारा आह्वान करती हैं। दोनों स्वतंत्र stdlib स्क्रिप्ट हैं जो अपनाsys.pathस्वयं बूटस्ट्रैप करती हैं, और गेट के स्कीमा फ़िक्स्चर उसके बगल में<harness-root>/.apothem/support/schemas/पर रहते हैं, ताकि हुक होस्ट पर किसी इम्पोर्ट-योग्यapothemपैकेज के बिना चलें। टेम्पलेट एक${HARNESS_ROOT}टोकन रखते हैं जिसेapothem installफ़ॉरवर्ड-स्लैश रूप में वास्तविक हार्नेस-रूट पथ में रेंडर करता है। - किसी स्रोत चेकआउट से, मॉड्यूल रूप
python -m apothem.hooks.dispatchऔरpython -m apothem.conformity.gateविकास के लिए वही कोड चलाते हैं।
चेकआउट की src/ डायरेक्टरी को PYTHONPATH के आगे जोड़ने से पैकेज डायरेक्टरी
इम्पोर्ट-योग्य बन जाती है:
PYTHONPATH="$HOME/.apothem/src" python -m apothem <command>जब apothem लॉन्चर PATH पर नहीं होता, तब install.sh समापन पर यही रूप प्रिंट करता है, जिसमें वेंडर्ड डायरेक्टरी src/ से पहले होती है और python के स्थान पर वह CPython होता है जिसे उसने रिज़ॉल्व किया। install.ps1 PowerShell रूप में वही दो सेटिंग्स प्रिंट करता है: एक $env:PYTHONPATH असाइनमेंट, जो वेंडर्ड और src/ डायरेक्टरियों को ; से जोड़ता है, फिर & '<CPython>' -m apothem <command>।
प्लगइन-ट्री बूटस्ट्रैप
Claude Code प्लगइन PYTHONPATH पर निर्भर रहने के बजाय इंजन को
<plugin_root>/lib/apothem के अंतर्गत बंडल करता है। बूटस्ट्रैप मॉड्यूल
apothem.lib.plugin_bootstrap bootstrap_syspath उजागर करता है, जो
<plugin_root>/lib और वेंडर डायरेक्टरी को आइडेम्पोटेंट रूप से sys.path के आगे
जोड़ता है, ताकि import apothem और हर वेंडर की गई निर्भरता प्लगइन ट्री से हल हो।
विकृत ट्री (lib/ लुप्त) किसी पुरानी सिस्टम प्रति को चुपचाप इम्पोर्ट करने के बजाय
PluginBootstrapError उठाता है।
इंस्टॉलर डिस्क पर क्या रखता है
स्क्रिप्ट इंस्टॉलर स्रोत ट्री का एक git क्लोन ~/.apothem पर रखते हैं
(APOTHEM_HOME से बदलें) और इंजन को उसी से चलाते हैं — वैकल्पिक click / rich
पूर्वापेक्षा प्रस्ताव के अलावा site-packages में कोई Python पैकेज इंस्टॉल नहीं
किया जाता। क्लोन पूरी रिपॉज़िटरी है, जिसमें वह परीक्षण सूट और दस्तावेज़ साइट भी
शामिल हैं जिन्हें रनटाइम कभी इम्पोर्ट नहीं करता, और इसके दो सोचे-समझे कारण हैं:
इंजन अपने समूह मटेरियलाइज़ करता है — नियम, स्किल, कमांड, और टेम्पलेट —
सीधे ट्री से प्रत्येक हार्नेस में, इसलिए ट्री केवल एक रनटाइम नहीं बल्कि सत्य का
जीवंत स्रोत है; और .git डायरेक्टरी अपनी जगह बनी रहती है ताकि apothem update
फिर से डाउनलोड करने के बजाय मौजूदा क्लोन में रिलीज़ टैग चेकआउट करे।
यह स्रोत-से-चलने वाला लेआउट वही पैटर्न है जिसका उपयोग nvm, pyenv, और
oh-my-zsh जैसे टूल करते हैं — कुछ मेगाबाइट स्रोत और इतिहास, जिसे अनइंस्टॉलर से एक
ही चरण में हटाया जा सकता है (पलटने के लिए कोई सिस्टम स्थिति नहीं है)। एक पतला
फ़ुटप्रिंट — एक शैलो या स्पार्स चेकआउट जो tests/ और site/ को छोड़ दे — संभव है,
लेकिन वह यथास्थान, हस्ताक्षर-सत्यापित, git-आधारित अपडेट पथ को गँवा देगा; वर्तमान
लेआउट न्यूनतम डिस्क की तुलना में एक सरल, सत्यापन-योग्य अपडेट को प्राथमिकता देता है।
रनटाइम Python को कैसे खोजता है
वन-शॉट इंस्टॉलर और npx शिम अलग-अलग नाम जाँचते हैं और एक ही नियम लागू करते हैं।
इंस्टॉलर python3, python, और संस्करण-युक्त नामों (python3.14 से python3.10
तक) को जाँचते हैं। npx शिम, यदि APOTHEM_PYTHON सेट हो, तो पहले उसे जाँचता है, फिर
python3, python, और py -3 को; उसके पास संस्करण-युक्त नाम नहीं हैं। दोनों
Microsoft Store लॉन्चर शिम को अस्वीकार करते हैं और संस्करण 3.10 या नवीनतर रिपोर्ट
करने वाले पहले उम्मीदवार को स्वीकार करते हैं। किसी स्रोत ट्री से चलाए जाने पर,
इंस्टॉलर बंडल किए गए hooks/lib/find-python लोकेटर का पुनः उपयोग करते हैं, जो वही
न्यूनतम सीमा लागू करता है।
अनुशंसित अगला कदम
चेकआउट की src/ डायरेक्टरी को PYTHONPATH पर रखकर python -m apothem --help
चलाएँ, ताकि पुष्टि हो सके कि स्व-निहित CLI पथ आपके होस्ट पर हल होता है।