इसके साथ संबद्ध Testlify

Appforest Timetracker - VS Code एक्सटेंशन

Appforest Timesheets का एक VS Code साथी एक्सटेंशन: यह एडिटर गतिविधि को ट्रैक करता है और Git ब्रांच के संदर्भ से Timesheets by Appforest में समय लॉग करता है।

हमारे Jira प्लगइन, Timesheets by Appforest, ने Testlify में समय ट्रैकिंग को केंद्रीकृत कर दिया, लेकिन डेवलपर्स को फिर भी रुककर टूल बदलना पड़ता था ताकि वे अपने घंटे हाथ से लॉग कर सकें। Appforest Timetracker उसी खाई को पाटता है। यह एक VS Code एक्सटेंशन है जो एडिटर में ही कोडिंग गतिविधि को ट्रैक करता है और समय लॉग करने को एक झटपट क्रिया में बदल देता है, ताकि इंजीनियर IDE छोड़े बिना Timesheets में लॉग कर सकें। मैंने इसे शुरू से आखिर तक संभाला, कॉन्सेप्ट से लेकर Visual Studio Marketplace के लिए पैकेजिंग तक।

मैंने क्या बनाया

  • एक्सटेंशन का कोर: आधिकारिक VS Code Extension API पर बना। डॉक्यूमेंट-चेंज, सेव, और सिलेक्शन लिसनर एक एक्टिविटी टाइमस्टैंप रीसेट करते हैं, जिसे विंडो फोकस स्टेट के 1-सेकंड पोल के मुकाबले जांचा जाता है, ताकि डेवलपर को बिना टोके सक्रिय बनाम निष्क्रिय समय को चुपचाप ट्रैक किया जा सके।
  • Git-समझदार समय लॉगिंग: एक्सटेंशन मौजूदा Git ब्रांच को पढ़ता है और उसमें से Jira टिकट ID अपने आप निकाल लेता है, यह सुनिश्चित करते हुए कि लॉग किया गया समय बिना मैनुअल टिकट खोज या दोबारा टाइप किए सही इश्यू से जुड़ा हो।
  • पूरा जीवनचक्र: VS Code के SecretStorage API के ज़रिए सुरक्षित टोकन स्टोरेज, पैकेजिंग, और Visual Studio Marketplace पर मैनुअल पब्लिश, यह सब संभाला।

यह क्यों मायने रखता था

Git ब्रांच के संदर्भ से टिकट मिलान को स्वचालित करने से टाइमशीट लॉगिंग के मैनुअल चरण खत्म हुए, रिपोर्टिंग गलतियां घटीं, और लीडरशिप को स्प्रिंट प्लानिंग व क्लाइंट बिलिंग के लिए साफ डेटा मिला।

अकेला, छोटा, असली

मैं इसका इकलौता योगदानकर्ता हूं, अप्रैल 2025 से 32 कमिट। यह एक छोटा, व्यक्तिगत पैमाने का अंदरूनी टूल है जो एक खास रोज़मर्रा की झुंझलाहट दूर करने के लिए बनाया गया, कोई बड़ा प्रोडक्ट नहीं।

लॉग किया गया समय असल में जाता कहां है

एक्सटेंशन सीधे Jira के REST API को कॉल नहीं करता। यह Timesheets by Appforest के अपने बैकएंड को पोस्ट करता है, वही रिमोट सर्विस जिसे Forge ऐप अपने मैनिफेस्ट में घोषित करता है, जो फिर Jira-फेसिंग हिस्सा खुद संभालता है। दोनों प्रोजेक्ट एक-दूसरे से बात करने के लिए बनाए गए थे, Jira से अलग-अलग नहीं, यही वजह है कि Forge ऐप के रिज़ॉल्वर फ़ंक्शन खासतौर पर VS Code से आए सुझावों को लॉग होने के बाद हटाने के लिए भी शामिल हैं।

एक्टिविटी और टिकट डिटेक्शन असल में कैसे काम करते हैं

Git ब्रांच डिटेक्शन किसी git लाइब्रेरी को शामिल करने के बजाय सीधे git rev-parse --abbrev-ref HEAD शेल आउट करता है, एक ही वैल्यू पढ़ने के लिए किसी डिपेंडेंसी का पूरा API सरफेस उठाने के बजाय यह एक वाजिब फैसला है। कुछ भी सिंक होने से पहले ब्रांच नाम को /^[A-Z]+-\d+$/ के मुकाबले वैलिडेट किया जाता है, ताकि जो फीचर ब्रांच किसी टिकट से मेल नहीं खाती (जैसे ABC-123) उसे चुपचाप छोड़ दिया जाए, न कि गलत इश्यू पर लॉग किया जाए या एरर दिया जाए। एक्टिविटी ट्रैकिंग प्रति-फाइल-स्विच जितनी बारीक नहीं है; यह डॉक्यूमेंट-चेंज और सेव लिसनर के साथ विंडो फोकस स्टेट का 1-सेकंड पोल है, जिसमें 10-सेकंड का आइडल थ्रेशोल्ड और सेशन को रुका हुआ मानने से पहले 60-सेकंड की छूट अवधि है। प्रोग्रेस हर सेकंड VS Code के globalState में सेव होता है और रीस्टार्ट पर बहाल होता है, एक सेल्फ-हीलिंग जांच के साथ: अगर रीस्टोर पर आखिरी-सिंक हुई गिनती ट्रैक की गई गिनती से किसी तरह आगे निकल जाए, यह किसी सिंक के बीच में रुकने का संकेत है, तो उसे और भटकने देने के बजाय वापस लाइन में पकड़ लिया जाता है।

ऑथेंटिकेशन सेटिंग्स-आधारित नहीं बल्कि कमांड-चालित है: समर्पित कमांड (authenticateToken, deleteToken, updateToken, syncNow, resetTime) इनपुट प्रॉम्प्ट के ज़रिए टोकन के पूरे जीवनचक्र को संभालते हैं, यही वजह है कि शुरू से ही कोई सेटिंग्स UI नहीं है, यह एक जान-बूझकर लिया गया फैसला है, कोई छूटी हुई सुविधा नहीं।

डेटा मॉडल और स्केल

यहां किसी चीज़ को एक अकेले डेवलपर के अपने एडिटर सेशन से आगे स्केल करने की ज़रूरत नहीं है: एक स्टेटस-बार डिस्प्ले (टिकट टाइम और दैनिक कुल), एक आइडल/एक्टिव स्टेट मशीन, आधी रात को एक डेली रीसेट जॉब। इस पैमाने पर किसी भारी डेटा मॉडल की कोई ज़रूरत नहीं है, और एक बनाना उस समस्या को हल करना होगा जो इस टूल के पास है ही नहीं।

Build vs. Buy

simple-git या isomorphic-git जैसी लाइब्रेरी के बजाय git बाइनरी को शेल आउट करना: एक वैल्यू (मौजूदा ब्रांच) पढ़ने के लिए पूरे Git ऑपरेशन के लिए बनी डिपेंडेंसी जायज़ नहीं ठहरती। कस्टम एन्क्रिप्टेड-फाइल टोकन स्टोर के बजाय VS Code का अपना SecretStorage API: प्लेटफॉर्म ठीक इसी मामले के लिए सुरक्षित क्रेडेंशियल स्टोरेज पहले से हल कर चुका है।

Stack

VS Code Extension API, TypeScript, Git एक्सेस के लिए Node का बिल्ट-इन child_process, टोकन स्टोरेज के लिए VS Code का SecretStorage API, Visual Studio Marketplace पर पब्लिश।