turnbell उस पल की जानकारी देता है जब कोई CLI कोडिंग एजेंट अपनी बारी खत्म करता है या इनपुट के इंतज़ार में अटक जाता है। एक लंबा Claude Code, Codex, या Gemini CLI रन शुरू करें, किसी और काम पर चले जाएं, और टर्मिनल की निगरानी करना बंद करें: turnbell जवाब को ज़ोर से पढ़ता है, एक डेस्कटॉप नोटिफिकेशन भेजता है, एक साउंड बजाता है, या एक वेबहुक पिंग करता है ठीक उसी पल जब एजेंट को आपकी ज़रूरत होती है: न एक मिनट पहले, न दस मिनट बाद।

मैंने क्या बनाया
- 8 फर्स्ट-क्लास एजेंट इंटीग्रेशन: Claude Code, Codex, Gemini CLI, Copilot CLI, Cursor, opencode, Antigravity, और Amp, हर एडाप्टर उस done/blocked/read-aloud सिग्नल से जुड़ा है जो उस एजेंट का अपना hook सिस्टम असल में एक्सपोज़ करता है, साथ ही किसी भी दूसरे कमांड के लिए एक यूनिवर्सल
turnbell runरैपर। - लेजर-ट्रैक्ड कॉन्फ़िग राइट: turnbell किसी एजेंट की सेटिंग्स फाइल में जो भी hook जोड़ता है वह एक एटॉमिक, अपेंड-ओनली लेजर में लाइन-लेवल डिफ़ के साथ रिकॉर्ड होता है, ताकि
turnbell uninstallठीक वही हटा सके जो turnbell ने लिखा था, और कुछ नहीं, बाद में की गई एडिट को बरकरार रखते हुए। - रीड-अलाउड "स्पीकेबल मोड": एक ऑप्ट-इन नज, जो एजेंट की अपनी मेमोरी फाइल (
CLAUDE.md,AGENTS.md,GEMINI.md) में लिखी जाती है और उससे कहती है कि जवाब बोलने-लायक रखे और कोड या घना डिटेल बोलने के बजाय एक टेम्प फाइल में भेज दे: रिवर्सिबल, और 24 घंटे बाद ऑटो-क्लीन्ड। - बैकग्राउंड-अवेयर done डिटेक्शन: Claude Code का
doneअलर्ट तब तक रुका रहता है जब तक सब-एजेंट, वर्कफ़्लो, या टीममेट्स इन-फ़्लाइट काम रिपोर्ट कर रहे हों, ताकि आपको बीच-डेलिगेशन में नहीं बल्कि बारी के असली अंत में एक ही बार पिंग मिले। - लोकल-फर्स्ट वेबहुक सिंक: एक ही सीरियलाइज़र ठीक छह मेटाडेटा फील्ड (timestamp, agent, event, project, summary) ntfy, Pushover, Slack, या एक रॉ एंडपॉइंट को भेजता है: कभी भी वर्किंग डायरेक्टरी, कोड, या एजेंट का असली जवाब नहीं।
यह क्यों मायने रखता था
हर लंबा एजेंट रन पहले या तो टर्मिनल की निगरानी करने या परमिशन प्रॉम्प्ट पर उसके अटकने का पल मिस करने का मतलब रखता था। turnbell यह गैप बिना किसी बैकग्राउंड डेमन, SDK, या टेलीमेट्री के भरता है: यह हर एजेंट के अपने hook वायर करता है, और जो भी वायर जोड़ता है वह ट्रेस और रिवर्स किया जा सकता है।
यह क्यों बना
लंबे Claude Code और Codex रन ज़ोर से फेल नहीं होते, वे चुपचाप एक परमिशन प्रॉम्प्ट पर अटक जाते हैं या तब खत्म होते हैं जब मैं तीन टैब दूर किसी असंबंधित काम में होता हूं। इसका फिक्स एक बड़ी टर्मिनल विंडो नहीं है, यह उस पल बताया जाना है जब बारी को असल में मेरी ज़रूरत हो। मैं इसका इकलौता कंट्रीब्यूटर हूं, सक्रिय रूप से मेंटेन किया जा रहा है, पहले अपने खुद के वर्कफ़्लो को हल करने के लिए बना और उसके बाद एक पब्लिक npm पैकेज के रूप में शिप किया गया। यह पहले hollr नाम से था; turnbell में रीनेम इतना जान-बूझकर किया गया कि पैकेज अब भी पुराने नाम पर मौजूद किसी के लिए एक कम्पैटिबिलिटी bin alias और एक ऑटोमैटिक कॉन्फ़िग माइग्रेशन शिप करता है।
पाबंदी: कोई SDK नहीं, कोई डेमन नहीं, कुछ भी इनवेसिव नहीं
turnbell में हर एजेंट इंटीग्रेशन एक ही नियम के आगे जवाबदेह है: यह एजेंट की अपनी hook कॉन्फ़िगरेशन को एडिट करके turnbell emit कॉल करता है, और कुछ नहीं। कोई बैकग्राउंड प्रोसेस नहीं, कोई SDK नहीं जिसे एजेंट को इम्पोर्ट करना पड़े, कोई पोलिंग नहीं। यही पाबंदी वजह भी है कि uninstall की कहानी को एक जानी-पहचानी सीमा के तौर पर दस्तावेज़ करने के बजाय ठीक से हल करना पड़ा।
"बेस्ट एफर्ट" Uninstall के बजाय लेजर-ट्रैक्ड राइट
turnbell init बनाने का सीधा तरीका है एजेंट जो भी कॉन्फ़िग फाइल इस्तेमाल करता है उसमें hook एंट्री अपेंड कर देना और इसे पूरा मान लेना। उसके ऊपर turnbell uninstall बनाने का सीधा तरीका है turnbell के अपने मार्कर के लिए grep करना और उम्मीद करना कि फाइल में कुछ और टकराए नहीं। एक "बेस्ट एफर्ट" uninstall बिल्कुल ऐसा ही दिखता है, और यह तब काफी नहीं है जब एडिट की जा रही फाइल एक साझा कॉन्फ़िग हो जिस पर यूज़र की अपनी टूलिंग निर्भर करती है।
src/adapters/diffwire.ts एक अलग तरीका अपनाता है: हर राइट को एक JSON या टेक्स्ट फाइल के खिलाफ़ एक WireOp के रूप में एक्सप्रेस किया जाता है, एक एटॉमिक राइट (टेम्प फाइल + रीनेम, क्रैश पर कभी पार्शियल राइट नहीं) से लागू किया जाता है, और एक लेजर (listWiredKeys, appendLedgerEntry) में अपेंड किया जाता है जो ठीक-ठीक रिकॉर्ड करता है कि turnbell ने कौन-सी की या मार्कर छुए और पहले वैल्यू क्या थी। turnbell init कुछ भी लिखने से पहले हर बदलाव को एक जेनरेटेड लाइन डिफ़ के रूप में प्रीव्यू करता है। turnbell uninstall फाइल की मौजूदा स्थिति से इरादा दोबारा निकालने के बजाय लेजर को रीप्ले करता है, और यही वह चीज़ है जो "सिर्फ़ वही सर्जिकली हटाता है जो turnbell ने जोड़ा था, बाद में की गई एडिट बरकरार रहती हैं" को README में एक बेस्ट-एफर्ट दावे के बजाय एक असली गारंटी बनाती है।
Codex का ख़ास मामला
Codex अपने कॉन्फ़िग में सिर्फ़ एक टॉप-लेवल notify कमांड की इजाज़त देता है, hook की कोई लिस्ट नहीं। अगर किसी यूज़र के पास पहले से किसी और चीज़ के लिए एक notify कमांड वायर था, तो उसे भोलेपन से ओवरराइट करना चुपचाप उसका मौजूदा सेटअप तोड़ देता। एडाप्टर ओरिजिनल notify वैल्यू को रिप्लेस करने से पहले आर्काइव कर लेता है, और turnbell uninstall की को पूरी तरह डिलीट करने के बजाय उस आर्काइव से इसे रिस्टोर करता है। एक मामला जो रिकवर नहीं हो सकता वह यह है कि अगर सेटअप और uninstall के बीच खुद config.toml ही डिलीट हो जाए, तो रिस्टोर करने के लिए कुछ बचता नहीं, और इसे छुपाने के बजाय एक असली सीमा के तौर पर दस्तावेज़ किया गया है।
बीच-डेलिगेशन में पिंग न करना
Claude Code का अपना done hook हर टॉप-लेवल बारी पर फायर होता है, लेकिन एक बारी सब-एजेंट, वर्कफ़्लो, या टीममेट्स स्पॉन कर सकती है जो पैरेंट बारी के खत्म होने की रिपोर्ट करने के बाद भी काम करते रहते हैं। turnbell के एक शुरुआती वर्ज़न ने अलर्ट वहीं फायर कर दिया, जिसका मतलब था बैकग्राउंड काम अब भी चल रहे होने के दौरान टर्मिनल पर वापस खींचा जाना। फिक्स done अनाउंसमेंट को तब तक रोके रखता है जब तक Claude Code यह रिपोर्ट न कर दे कि अब कोई इन-फ़्लाइट डेलिगेटेड काम नहीं बचा, साथ ही लंबे समय तक चलने वाले shell/वॉचर और monitor टास्क को साफ़-साफ़ नज़रअंदाज़ करते हुए, क्योंकि इन्हें "इन-फ़्लाइट" मानना किसी भी ऐसे सेशन पर हर अलर्ट को चुप करा देता जिसमें बैकग्राउंड प्रोसेस चल रहा हो।
पेलोड सिर्फ़ मेटाडेटा है, डिज़ाइन से
turnbell लोकल-फर्स्ट है: वॉइस, नोटिफिकेशन, और साउंड कभी मशीन नहीं छोड़ते। एकमात्र चीज़ जो नेटवर्क पर जा सकती है वह एक वेबहुक है जिसे यूज़र खुद कॉन्फ़िगर करता है, और वह रास्ता एक अकेले सीरियलाइज़र से होकर गुज़रता है जो सिर्फ़ छह फील्ड भेजता है और कुछ नहीं: timestamp, agent, event, project का बेसनेम, और एक छोटी summary स्ट्रिंग। कोई दूसरा कोड पाथ नहीं है जो गलती से वर्किंग डायरेक्टरी या एजेंट का असली जवाब लीक कर सके, क्योंकि पूरे कोडबेस में सीरियलाइज़र ही अकेली चीज़ है जिसकी नेटवर्क तक पहुंच है। turnbell test --show-payload बिना भेजे ठीक वही पेलोड प्रिंट करता है, इसलिए यह दावा एक असर्शन के बजाय वेरिफ़ायबल है।
Stack
TypeScript, बंडल के लिए tsup, 80% कवरेज गेट के साथ Vitest, हर प्लेटफ़ॉर्म के लिए नेटिव OS प्रिमिटिव वॉइस/नोटिफिकेशन/साउंड के लिए (macOS स्टेबल, Linux और Windows बीटा में), और हर एजेंट के लिए अलग hook/कॉन्फ़िग फॉर्मैट (Claude Code, Codex, Gemini CLI, Copilot CLI, Cursor, opencode, Antigravity, Amp) बिना किसी साझा SDK के। MIT लाइसेंस्ड।