परिवर्तन लॉग
क्या नया है.
यह जहाज के रूप में, प्लेटफार्म के हर सुधार.
· kamo-marketing
Add Flowroute to INTEGRATED WITH banner
· kamo-internal
Show accurate provider connection status from isConnected field
Replaces the old logic that showed "Connected" for any provider with no sync error (including brand-new providers that were never tested). New three-state badge driven by isConnected (null/true/false): - null / never tested → grey "Not tested" (HelpOutlineIcon) - false → red "Not connected" (ErrorOutlineIcon) - true + sync error → amber "Sync error" (WarningAmberIcon) - true → green "Connected" (CheckCircleIcon) - RingCentral no OAuth → amber "Needs reauth" (unchanged)
· VOIPService
Persist connection test result to isConnected field
- test() endpoint saves isConnected=true/false to DB after every health check - update() resets isConnected to null when configJson changes (credentials may have changed, requiring a re-test before showing Connected) - toDto() exposes isConnected so the frontend can distinguish: never tested / connected / not connected
· kamo-shared-library
Add isConnected field to VoipProviderInstance
Nullable Boolean: null = never tested, true = last test passed, false = failed. Requires KamoInitializerService schema migration to add IS_CONNECTED column.
· kamo-marketing
लाइव मिलीसेकंड गिनती के साथ सक्रिय प्रस्ताव बैनर दिखाएं
घर पृष्ठ पर सक्रिय पदोन्नति सर्वर-साइड को Fetches और एक प्रदान करता है हीरोऑफ़रबैनर सबहेडलाइन और फ्री-फोवर कॉलआउट के बीच। बैनर छूट राशि, अवधि और लाइव उलटी गिनती दिखाता है ************* 50ms पर एक एनिमेटेड के साथ ढाल-ग्लो सीमा और shimmer स्वीप। जब कोई सक्रिय नहीं हो जाता है तो कुछ भी नहीं या गैर-expired पदोन्नति मौजूद है।.
· kamo-internal
तार उपलब्ध / अनुपलब्ध स्विच बैकएंड और ऑफलाइन उपस्थिति बग को ठीक करने के लिए
- NavTop में उपलब्ध / अनुपलब्ध करने के लिए Pause / सक्रिय चिप का नाम बदलें - माउंट पर प्रारंभिक उपलब्धता को प्राप्त करें और नए मी / उपलब्धता एपीआई के माध्यम से टॉगल जारी रखें - सदस्य इंटरफ़ेस और MemberItem prop - सदस्यसूची पास सदस्यइम के लिए उप-विभाग प्रतिक्रिया से उपलब्ध है - सदस्य वस्तु अनुपलब्ध के लिए नारंगी रंग के साथ ऑनलाइन / ऑफलाइन / अनन्य लेबल दिखाता है - फिक्स ऑफलाइन बग: दृश्यता परिवर्तन दिल की धड़कन और 120s आवधिक थोक फिर से आकर्षित
· SecurityService
इसके अलावा, isAvailable to the-department जवाब and me/availability endpoints
· InitializerService
बैकफिल is available = TRUE मौजूदा सदस्यों के लिए
· kamo-shared-library
सदस्य उपलब्धता टॉगल के लिए उपलब्ध फ़ील्ड जोड़ें
· kamo-internal
एक्सेस एंड डोमेन टैब और डोमेन मैनेजर घटक निकालें
· kamo-marketing
लाइव अपठित बैज + नए एजेंट संदेश पर उछाल
- लाइव सपोर्टपैनल को ऑफस्क्रीन पर रखा जाता है जबकि विजेट को कम से कम किया जाता है (केवल जब एक समर्थन सत्र मौजूद है) तो STOMP सदस्यता रहती है Alive and onUnreadMessage fire incoming agent संदेश के लिए भी जब आगंतुक चैट नहीं देख रहा है। - प्रत्येक गिनती परिवर्तन (कुंजी चाल) पर एक वसंत पैमाने के साथ बैज को अंकित करता है तत्व को फिर से माउंट करता है) साथ ही एक सतत टेलविंड पिंग रिंग है जबकि > 0। - जब भी गिनती चली जाती है, तो कम से कम टैब को झुकाएं और झुकाएं। और इसे एक चमक के साथ लाल रंग देता है ताकि यह पूरे पृष्ठ पर ध्यान आकर्षित करे। - संभालExpand पहले से ही खुले में गिनती को साफ़ करता है, इसलिए कोई बदलाव की जरूरत नहीं है वहाँ।.
· MediaService
ब्रॉडकास्ट लंबित गिनती + एजेंट पढ़ने और आगंतुक भेजने के लिए पढ़ें
- ************* अब तक प्रतिनिधि ********** जब पढ़ने वाले आगंतुक संदेशों और decrement के साथ सत्रों को प्रतिबिंबित करता है एजेंट कॉल MarkAsRead. - नया सार्वजनिक **************** सहायक। - ************* अब (a) फिर से ब्रॉडकास्ट एजेंट के लिए पिछली बार देखे गए अग्रिमों के बाद पेलोड को अपठरी नहीं किया गया और (b) कॉल करता है हेल्पर इसलिए नेवटॉप सपोर्ट बटन बिना किसी प्रतीक्षा के सिंक में रहता है अगले 60s मतदान। - **************** भी सहायक को इसलिए कहते हैं जब कोई आगंतुक भेजता है तो नेवटॉप टक्कर लाइव होती है। अब नेवटॉप गिनती प्रति-पंक्ति बिल्ला स्टेट से तुरंत मेल खाती है क्लिक करने के बाद और ब्राउज़र रिफ्रेश के बाद।.
· kamo-shared-library
Unread-based count + lookup-by-session सहायक
************* जोड़ें समर्थन बटन बैज वास्तव में जरूरत है कि समर्थन टिकट की गिनती कर सकते हैं केवल PRE TICKET/NEW के बजाय ध्यान देने योग्य आगंतुक संदेश स्थिति। गिनती सीधे डीबी से पढ़ी जाती है ताकि यह एक ताज़ा बच जाए। इसके अलावा ************* MarkAsRead के बाद एक सत्र GUID से ओरग मालिक को हल कर सकते हैं।.
· KlusterServices
मीडिया को सबडोमेन प्रमाणित प्रावधान सूची में जोड़ें
· kamo-internal
आवश्यक DNS aliases में मीडिया सबडोमेन जोड़ें
· kamo-internal
टिकट datagrid के लिए स्थान कॉलम जोड़ें
पढ़ना ************* SupportTicketDTO (अब टिकट इकाई पर स्नैपशॉट) निर्माण समय - कोई अतिरिक्त दौर यात्रा नहीं। Renders झंडा + शहर/क्षेत्र/देश एक टूलटिप में प्रदर्शित आईपी के साथ; एक ई-डैश पर वापस गिर जाता है जब कोई जियो डेटा नहीं होता है टिकट पर है। एजेंट केवल देखता है। टिकटहेडर पहले से ही उसी डीटीओ फ़ील्ड का उपभोग करता है, इसलिए पॉपअप टूल विंडो अब स्नैपशॉट भी दिखाती है - कोई जियोलाइट या आगंतुक-टेबल पढ़ा प्रस्तुत करना.
· kamo-shared-library
टिकट इकाई पर स्नैपशॉट आगंतुक भू
VISITOR IP ADDRESS, VISITOR COUNTRY CODE, VISITOR COUNTRY NAME, VISITOR CITY, VISITOR SUBDIVISION कॉलम। टिकट निर्माण पर कब्जा इसलिए सूची/विवरण समापन बिंदुओं को कभी भी एक जियोलाइट रेंज स्कैन नहीं करना पड़ता है या पढ़ने के समय एक अलग आगंतुक-टेबल लुकअप। KamoInitializerservice (hibernate.ddl-auto: अद्यतन) जोड़ देगा अगले रन पर कॉलम; मौजूदा पंक्तियां आगंतुक रिकॉर्ड के लिए वापस आती हैं todto.
· MediaService
SockJS के साथ जोड़ें / ws / public-chat-native सादे WebSocket समापन बिंदु
SockJS के बिना / ws / public-chat-native इतने पर एक दूसरा STOMP समापन बिंदु पंजीकृत करता है कि frontend आवश्यकता के बिना एक मूल WebSocket (brokerURL) के साथ कनेक्ट कर सकते हैं sockjs-client पुस्तकालय, जो एक अनलोड हैंडलर को पंजीकृत करता है जो उल्लंघन करता है साइट की अनुमति-नीति। मूल / ws/public-chat SockJS समापन बिंदु रखा गया है पिछड़े संगतता के लिए।.
· kamo-internal
Per-ticket unread Badge + 'केवल नए संदेश' फिल्टर
- टिकट सूची में एक चैट-बुलबुलबुले बिल्ला को सामने की ओर पढ़ने वाली गिनती के साथ दिखाया गया है। जब भी सत्र में एजेंट की तुलना में नया संदेश होता है तो टिकट # अंतिम देखा गया संदेश। - फिल्टर बार में एक 'न्यू संदेश केवल' फिल्टर स्विच जोड़ता है। - टिकटचैट अब **************** प्रारंभिक पर लोड और जब भी एक इनबाउंड संदेश आता है, तो बैज स्पष्ट हो जाता है क्योंकि एजेंट ने बातचीत को पढ़ा। कामो-शेयर्ड-library बदलाव पर निर्भर करता है जो व्यापक रूप से बदलता है findChatMembershipsByMemberId में शामिल करने के लिए SUPPORT TICKET सत्र, प्लस *******************
· MediaService
आगंतुक संदेश पर एजेंट को अपठरी गिनती
एक आगंतुक के बाद एक समर्थन संदेश भेजता है, नवीनतम पढ़ने वाले खातों को धक्का देता है ************* वास्तविक समय में बैज और नेवटॉप काउंटर अपडेट। प्रसारण में मिरर सदस्य से सदस्य चैट के लिए MediaController.sendMessage।.
· kamo-shared-library
Unreaded सदस्यता क्वेरी में SUPPORT TICKET सत्र शामिल
findChatMembershipsByMemberId अब दोनों CHAT के लिए सदस्यता देता है और SUPPORT TICKET सत्र प्रकार, इसलिए मौजूदा प्रति सदस्य अपठित-count बुनियादी ढांचा (getUnreadCountbyMember, /topic/chat/unread/{memberId}) प्रसारण, GET ******************* स्वचालित रूप से कवर भी समर्थन टिकट. Lets एजेंट प्रति-ticket नए संदेश संकेतक देखें टिकट सूची में और नेवटॉप में एक संयुक्त कुल पढ़ने वाला बैज।.
· KlusterServices
PJSIP जेलों और लगातार राज्य के साथ उत्पादन विफल2ban
- [asterisk] और [freepbx-web] जेलों के साथ असफल2ban-configmap.yaml जोड़ें, वृद्धिशील प्रतिबंध escalation (1h → 24h → 30d छत), लैन अनदेखी और एक कस्टम asterisk-security.conf फ़िल्टर लक्षित PJSIP सुरक्षाEvent रिकॉर्ड - माउंट असफल2ban-config ConfigMap और होस्टPath /var/lib/pbx/fail2ban (ban) राज्य दोनों k1m1 और k2m1 तैनाती में पॉड रिस्टार्ट में रहता है - दोनों नोड्स पर विफल होने से पहले स्टार्टअप.sh में वायर कॉन्फ़िगरेशन
· kamo-shared-library
Add resetHasAttachmentsForFolder query to ConversationRepository
Allows sync to reset stale has_attachments flags before re-indexing so corrected MIME detection can rebuild the field from actual attachment data.
· KlusterServices
Integrate Coqui TTS with norman voice (VCTK p267)
- Deploy coqui-tts server (VCTK VITS model, CPU-only) as ClusterIP service on port 5002 with model cache at /var/lib/coqui-tts on k1m1 - Inject coqui_tts.agi into /var/lib/asterisk/agi-bin on each boot: calls HTTP API, caches 8 kHz mono WAV under sounds/coqui-tts/, streams via AGI STREAM FILE — use AGI(coqui_tts.agi,text) in any dialplan context - Write say.conf on each boot to route all Asterisk built-in say functions (digits, numbers, dates, times) through Coqui TTS
· KlusterServices
Add LAN DNS pod for split-DNS on k1m1
Deploys a dnsmasq pod with hostNetwork on k1m1 that listens on 192.168.4.22:53. Overrides pbx.k1.kluster.kamocrm.com -> 192.168.4.22 so LAN phones reach the PBX directly without NAT hairpin. All other queries are forwarded to 8.8.8.8/8.8.4.4. Router DHCP must be pointed to 192.168.4.22 as the primary DNS server for LAN clients to pick this up.
· kamo-internal
मंच विन्यास टैब (सामान्य / वीओआईपी और एसएमएस / सिस्टम उपयोगकर्ता / उन्नत)
लपेटें ************* सेटिंग्स में चार टैब के साथ देखें: - सामान्य: केवल प्लेटफॉर्म अवलोकन - कुल orgs, सक्रिय फोन सर्वर उदाहरण गिनती, सक्रिय एसएमएस प्रदाता उदाहरण गिनती, अंतिम वैश्विक वीओआईपी सिंक टाइमस्टैम्प नया ******************* - वीओआईपी और एसएमएस: संपादित वीओआईपीSyncIntervalMinutes (1.1440) और वीओआईपीSyncEnabled, सतही आखिरीGlobalVoipSyncAt, प्लस एक "Run वैश्विक सिंक अब" बटन है कि कॉल सुरक्षा सेवा → वीओआईपीसर्विस / आंतरिक / वीओआईपी / सिंक-ग्लोबल। - सिस्टम उपयोगकर्ता: मौजूदा सिस्टम उपयोगकर्ता एक्सेस अनुदान यूआई, से उठाया एक टैब घटक (कोई व्यवहार परिवर्तन) में कॉन्फ़िगरेशनक्लिएंट क्रियाविधि। - उन्नत: समानांतर "Trigger वैश्विक वीओआईपी सिंक अब" ओप्स के लिए बटन, प्लस भविष्य के नियंत्रण के लिए एक स्पष्ट खाली राज्य संदेश। कॉन्फ़िगरेशनक्लिएंट अब एक पतली टैब ऑर्केस्ट्रेटर है। उपयोगPlatformAdminGuard ऑर्केस्ट्रेटर स्तर पर जगह में रहता है इसलिए सभी चार टैब फाटक होते हैं।.
· DaemonService
Global VOIP sync job (admin-tunable interval)
VoipGlobalSyncJob ticks every minute and, on each tick, reads the SystemConfiguration singleton to decide whether a global sync is due: - If voipSyncEnabled is false → skip. - If lastGlobalVoipSyncAt + voipSyncIntervalMinutes > now → skip. - Otherwise: POST /internal/voip/sync-global to VOIPService with the InternalAuthFilter header; update lastGlobalVoipSyncAt on success. This lets platform operators adjust the cadence at runtime from **************** → VOIP & SMS without restarting DaemonService or touching cron expressions. Registered in QuartzConfig alongside the existing jobs. k8s/configmap.yaml adds the tick cron (1-minute default) and kamo.services.voip.base-url + internal.auth.secret so the outbound HTTP call can authenticate.
· SecurityService
सिस्टम-config + प्लेटफॉर्म-ओवरव्यू समापन बिंदु
मंच-व्यापी विन्यास सतह, मौजूदा शीर्ष स्तर के मालिकों द्वारा फाटक गार्ड (मैच सिस्टमUserConfigController की आवश्यकताTopLevelOwner पैटर्न)। समापन बिंदु: GET/api/security/system-config — रिटर्न सिंगलटन पंक्ति - PUT/api/security/system-config — अद्यतन voipSyncIntervalMinutes / voipSyncEnabled। आंशिक अद्यतन समर्थित; सत्यापन लागू होता है अंतराल 1..1440 मिनट। GET/api/security/platform-overview — समग्र आँकड़े (total orgs), सक्रिय फोन/SMS उदाहरण गिनती, अंतिम सिंक टाइमस्टैम्प, वर्तमान अंतराल + सक्षम ध्वज). - POST **************** कॉल वीओआईपीसर्व / आंतरिक / वीओआईपी / सिंक-ग्लोबल इंटरनल एथफिल्टर (आंतरिक) के माध्यम से इसलिए प्लेटफ़ॉर्म ऑपरेटर वैश्विक वीओआईपी सिंक को आग लग सकता है नया प्लेटफॉर्म कॉन्फ़िगरेशन → वीओआईपी और एसएमएस टैब / एडवांस्ड टैब। विन्यास: - kamo.services.voip.base-url (VOIPService क्लस्टर-स्थानीय सेवा यूआरएल के लिए दोष)। - मौजूदा आंतरिक.auth.secret का उपयोग करता है।.
· VOIPService
प्रति-इंस्टेंस संसाधन नियंत्रक + org कुल + आंतरिक सिंक
Per-instance संसाधन CRUD (एक्सटेंशन / उपयोगकर्ता / डिवाइस / वॉयसमेल): - VoipExtensionsController पर **************** - VoipUsersController at /api/voip/instances/{id}/users - VoipDevicesController पर **************** - VoipVoicemailController पर **************** - प्रत्येक जीईटी प्रदाता से बल आकर्षित करने और कैश को रीफ्रेश करने के लिए रिफ्रेश = चाल स्वीकार करता है; अन्यथा स्नैपी यूआई के लिए स्थानीय कैश से कार्य करता है। - प्रत्येक लेखन पथ कॉल प्रदाता और upserts स्थानीय कैश तो एकत्रित अगले निर्धारित सिंक के लिए इंतजार किए बिना लगातार रहना। - वॉयसमेल GET /{vmId} /ऑडियो प्रदाता से कच्चे ऑडियो को स्ट्रीम करता है स्ट्रीमिंगResponseBody तो यूआई <audio src=...> यह सीधे कर सकते हैं। संगठन-एग्रीगेट (VoipOrgAggregateController at /api/voip/org): - / विस्तार, / उपयोगकर्ता, / devices, / Voicemail हर उदाहरण में वापसी पंक्तियों {instanceId, उदाहरणName} गोलियों के साथ। यूआई ने उन्हें समेकित में प्रस्तुत किया / सेटिंग / फीचर्स / फोन में टैब। - /हेल्थ रन चेकहेल्थ () प्रत्येक सक्रिय उदाहरण पर समानांतर प्रति इंस्टेंस में (InstanceSyncService की कैश्ड गिनती के माध्यम से), रिटर्न InstanceHealthDto[]. - POST/sync रन InstanceSyncservice हर सक्रिय उदाहरण के खिलाफ वर्तमान org। यूआई में किरायेदार स्तर के "Sync this org" बटन को पावर देता है। आंतरिक सिंक (VoipInternalSyncController): - POST/internal/voip/sync-global loops सभी सक्रिय उदाहरण मंच चौड़ा। डेमन सर्विस के निर्धारित क्वार्टज जॉब द्वारा कॉल किया गया। मौजूदा द्वारा संरक्षित आंतरिक वीओआईपी सेवा में फ़िल्टर करें। ग्रीन बनाता है।.
· VOIPService
मल्टी-इंस्टेंस प्रदाता रिफैक्टर + फुल फ्रीपीबीएक्स + फ्लोरूट एसएमएस
कोर मॉडल परिवर्तन: एक org → कई VoipProviderInstances (was: one per org). हर प्रदाता एपीआई कॉल अब उदाहरण-स्किप किया गया है। PhoneProvider interface: - एक्सटेंशन / उपयोगकर्ता / डिवाइस CRUD + वॉयसमेल ऑडियो / ट्रांसक्रिप्शन के लिए नए तरीके। - नई क्षमता झंडे (एक्सटेंशनमैनेजमेंट, उपयोगकर्ता प्रबंधन, उपकरण प्रबंधन, वॉयसमेल ट्रांसक्रिप्शन). डिफ़ॉल्ट फेंक **************** (HTTP 501) इसलिए स्टब प्रदाता नहीं टूटते। फ्रंटेंड चेक getCapability () प्रति प्रदाता को छिपाने / अक्षम करने के लिए। - बाह्य निर्भरता विफलताओं के लिए प्रदाताException (HTTP 502)। PhoneProvider Factory: - getInstance (UUID) / **************** विरासत की जगह GetProvider(long orgId); getPrimaryForOrg(long) विरासत कॉल साइटों के लिए रखा (कैलकंट्रोलर, क्षमताओं नियंत्रक, सिपकंट्रोलर, वेबहुक इनबाउंड)। - रिंगसेंट्रल ओथ टोकन अब (ऑर्गिड, प्रदाता, उदाहरण Id) द्वारा दायर किया गया था ताकि एक org एकाधिक स्वतंत्र रिंगसेंट्रल तैनाती को प्रमाणित कर सकते हैं। - FreePBX निर्माण config json → {baseUrl, ClientId, ClientSecret पढ़ा, SslErrors} को अनदेखा करें और एक समर्पित FreePBXGraphQLClient को तत्कालीन करें। रिंगसेंट्रल (RingCentralProvider): - कंस्ट्रक्टर लॉग संदर्भ के लिए उदाहरण आईडी लेता है। - नई विधियां: सूची विस्तार / निर्माण विस्तार / अद्यतन विस्तार / RemoveExtension; listUsers / createUser / अद्यतनUser / removeUser (RC मॉडल) दोनों प्रकार = उपयोगकर्ता एक्सटेंशन; सूचीडिवाइस / निर्माणडिवाइस / अद्यतनडिवाइस / Device; getVoicemailAudio (streams संलग्नक सामग्री) और Voicemail transcription. FreePBX (FreePBXProvider) — पूर्ण कार्यान्वयन प्लेसहोल्डर को प्रतिस्थापित करता है: - FreePBXTokenCache (~1h TTL) के माध्यम से क्लाइंट-credentials OAuth2 टोकन कैशिंग 401 पर ऑटो रिफ्रेश, प्रति इंस्टेंस). FreePBXGraphQLClient: वैकल्पिक के साथ GraphQL + REST परिवहन स्व-signed ऑन-प्रेम PBXes के लिए छोड़-SSL सत्यापन। - एक्सटेंशन, उपयोगकर्ता प्रबंधक उपयोगकर्ता, एंडपॉइंट मैनेजर डिवाइस, वॉयसमेल सूची/mark-read/delete + ऑडियो स्ट्रीम, CDR कॉल इतिहास, SIP क्रेडेंशियल एक्सटेंशन के Pjsip रहस्य से प्राप्त, स्वास्थ्य के माध्यम से asteriskInfo। - एसएमएस स्पष्ट रूप से असमर्थित (क्षमता एसएमएस = झूठी) - FreePBX संभाल नहीं करता है वाहक एसएमएस। Flowroute एसएमएस (FlowrouteTextProvider): - HTTP बेसिक (एक्सेसकी, गुप्त कुंजी) के साथ संदेश v2.1 एपीआई। - स्वास्थ्य जांच ने जीईटी / संख्या? सीमा = 1 मारा। - थोकTextProviderफैक्टरी के साथ पंजीकृत नए FLOWROUTE enum मान के माध्यम से। नियंत्रक: - VoipInstanceController (profederConfigController) - पूर्ण CRUD प्रति इंस्टेंस टेस्ट / सिंक के साथ / एपी / वीओआईपी / इंस्टेंसेस। जीईटी जवाब ('***'); विलय-अपडेट यूआई राउंड-ट्रिप को बिना किसी रीडैक्ट फ़ील्ड देता है क्लोबरिंग संग्रहीत क्रेडेंशियल। - BulkTextInstanceController (BoldTextConfigController) - दर्पण CRUD at /api/bulktext/instances with test/Test-send/ Send. - OAuthController ने उदाहरण के लिए लिखित OAuth: शुरू, कॉलबैक, स्थिति, सभी उदाहरण Id लेना डिस्कनेक्ट करें। - SmsController सदस्य से उदाहरण को हल करता है। उदाहरण Id → org प्राथमिक, संलग्न बातचीत करना। - कैलकंट्रोलर / क्षमताओंकंट्रोलर / सिपकंट्रोलर ऑर्ग के सामने वापस आते हैं विरासत एकल दूरी समापन बिंदुओं के लिए प्राथमिक सक्रिय उदाहरण। सेवाएं: - InstanceSyncService: पुल-थ्रू कैश सिंक - एक्सटेंशन / उपयोगकर्ता / devices / वॉयसमेल प्रदाता से स्थानीय टेबल तक कॉपी किया गया, लापता पंक्तियों को नरम चिह्नित किया गया UNKNOWN. प्रत्येक उप-चरण लपेटा जाता है इसलिए एक असमर्थित क्षमता विफल नहीं होती है संपूर्ण सिंक (जैसे FreePBX no-SMS + has-extensions)। - VoipMessageService: सभी वार्तालाप / संदेश पथ उदाहरण Id को प्रचारित करते हैं। टेस्ट: पूर्व मौजूदा VoipProviderConfig-विशिष्ट परीक्षण हटा दिया (कवर किया गया) नाम दिया गया प्रकार; पुनर्लेखन प्रति डिज़ाइन spec 10 के दायरे से बाहर है - कोई TDD नहीं इस रिफैक्टर में बुनियादी ढांचा जोड़ा जा रहा है। अद्यतन kamo साझा पुस्तकालय के साथ हरे रंग का निर्माण करता है।.

तुम्हारा ब्रह्मांड इंतजार कर रहा है.
मिनटों में मुफ्त शुरू करें. जब भी आप तैयार हों तो उत्पाद जोड़ें - कोई माइग्रेशन नहीं, कोई नया लॉगइन नहीं.
हमेशा के लिए मुफ्त - कोई क्रेडिट कार्ड की आवश्यकता नहीं