অবদান
বাগ রিপোর্ট, আইডিয়া, অনুবাদ, ডকুমেন্টেশন এবং কোড — সবই স্বাগতম। এই পেজে ব্যাখ্যা করা হয়েছে কোথায় আলোচনা করতে হবে, পরিবর্তন কীভাবে পাঠাতে হবে, কোড কোন নিয়ম মেনে চলে, এবং নিরাপত্তা সমস্যা ও লাইসেন্সের ক্ষেত্রে কী নিয়ম প্রযোজ্য।
কোথায় আলোচনা করবেন
Antimatter-এর যেকোনো অংশ নিয়ে আলোচনা শুরু হয় কমিউনিটি রিপোজিটরি-তে:
- বাগ ও ফিচার রিকোয়েস্ট: একটি ইস্যু খুলুন এবং Bug report, Feature request বা Plugin or integration request নির্বাচন করুন। আগে বিদ্যমান ইস্যুগুলো সার্চ করুন; যদি আপনার ইস্যুটি আগে থেকেই থাকে, তবে থাম্বস-আপ দিন বা আপনার বিস্তারিত তথ্য যোগ করুন।
- প্রশ্ন ও আইডিয়া: Discussions-এ, Q&A বা Ideas ক্যাটাগরিতে।
- বড় কোনো পরিবর্তনের আগে, প্রথমে পদ্ধতি নিয়ে একমত হওয়ার জন্য একটি ইস্যু বা ডিসকাসশন খুলুন। এতে এমন একটি পুল রিকোয়েস্ট এড়ানো যায় যা যেমন আছে তেমনি মার্জ করা সম্ভব নয়।
good first issue এবং help wanted লেবেলযুক্ত ইস্যুগুলো দিয়ে শুরু করা ভালো। আপনি যদি কোনো ইস্যুতে কাজ করতে চান, তবে একটি কমেন্টে তা উল্লেখ করুন। নতুন ইস্যুগুলো প্রথমে status/triage লেবেল পায়, এরপর status/accepted, status/planned বা status/wontfix। ইস্যুগুলো বিষয়বস্তু নির্বিশেষে কমিউনিটি রিপোজিটরিতেই থাকে: কোড রিপোজিটরিগুলো ইস্যু গ্রহণ করে না। পরিকল্পিত কাজগুলোর তালিকা Antimatter roadmap-এ রয়েছে।
রিপোজিটরি ও ব্রাঞ্চ
কোডটি AntimatterChat অর্গানাইজেশনে রয়েছে; কোড কোথায় থাকে পেজে রিপোজিটরিগুলোর তালিকা দেওয়া আছে। প্রতিটি রিপোজিটরিতে:
mainহলো ডিফল্ট ব্রাঞ্চ এবং এতে Antimatter-এর কোড থাকে। এই ব্রাঞ্চ থেকে নতুন ব্রাঞ্চ তৈরি করুন এবং পুল রিকোয়েস্ট এই ব্রাঞ্চে পাঠান।- Mattermost থেকে ফর্ক করা রিপোজিটরিগুলোতে একটি
upstreamব্রাঞ্চও থাকে, যা Mattermost-এর কোডের একটি মিরর এবং তাদের পরিবর্তন এনে যুক্ত করার কাজে ব্যবহৃত হয়। এই ব্রাঞ্চের ওপর কাজের ভিত্তি তৈরি করবেন না।
প্রতিটি রিপোজিটরির README-তে কীভাবে বিল্ড ও টেস্ট করতে হয় তা ব্যাখ্যা করা আছে। সার্ভার ও ওয়েব ইন্টারফেসের জন্য দেখুন সোর্স থেকে বিল্ড করা; অ্যাপগুলোর জন্য বিল্ড, ইনস্টল ও ডিবাগ।
পুল রিকোয়েস্ট
- রিপোজিটরিটি ফর্ক করুন এবং
mainথেকে একটি ব্রাঞ্চ তৈরি করুন। - প্রতিটি পুল রিকোয়েস্টে একটি পরিবর্তন রাখুন। ছোট পুল রিকোয়েস্ট দ্রুত রিভিউ হয়।
- আপনার চারপাশের কোডের স্টাইল অনুসরণ করুন এবং যেখানে প্রাসঙ্গিক, সেখানে টেস্ট যোগ করুন বা আপডেট করুন।
- আপনি কী পরিবর্তন করেছেন এবং কেন করেছেন তা বর্ণনা করুন, এবং যে সমস্যাটি এটি সমাধান করে তার লিংক দিন:
Fixes AntimatterChat/community#123। - নিশ্চিত করুন যে চেকগুলো পাস হয়েছে। একজন মেইটেইনার পুল রিকোয়েস্টটি রিভিউ করবেন এবং পরিবর্তনের জন্য অনুরোধ করতে পারেন।
সার্ভার রিপোজিটরিতে পুল রিকোয়েস্ট টেমপ্লেটটি পূরণ করুন: একটি সারসংক্ষেপ, এবং রিলিজ নোট ব্লক, যা অবশ্যই থাকতে হবে। যদি পরিবর্তনটি কোনো API, কনফিগারেশন, ডাটাবেস স্কিমা বা দৃশ্যমান আচরণে না ছোঁয়, তবে সেখানে NONE লিখুন।
কন্ট্রিবিউটিং করে আপনি সম্মত হচ্ছেন যে আপনার কন্ট্রিবিউশন সেই রিপোজিটরির লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত হবে, যেখানে আপনি কন্ট্রিবিউট করছেন।
কমিট এবং কোড স্টাইল
কমিট
হিস্টরিতে কমিট মেসেজগুলো একটি ছোট বাক্য, যা কী পরিবর্তন হচ্ছে তা বলে, সেন্টেন্স কেসে এবং শেষে ফুল স্টপ ছাড়া। একটি অংশের পরিবর্তনগুলোর আগে সেই অংশের নাম থাকে, যেমন Fusion: a compact conversation header on phones বা Server: community attributes, and admin-only user attributes। প্রতিটি পরিবর্তনের জন্য একটি কমিট; যদি কারণগুলো স্বচ্ছ না হয়, তবে বডি-তে তা ব্যাখ্যা করুন।
সার্ভার (Go)
- পুশ করার আগে
server/-এmake check-styleচালান। - কখনোই সরাসরি
go mod tidyচালান না;make modules-tidyচালান। - রিকোয়েস্ট পাথে, রিকোয়েস্টের লগার দিয়ে লগ করুন। স্টোর লেয়ারে,
context.Context-এর পরিবর্তেrequest.CTXনিন। - নতুন API এন্ডপয়েন্টগুলো
server/channels/api4-এ যান, তাদের টাইপগুলোserver/public/model-এ এবং, আদর্শভাবে,model.Client4-এ এবং TypeScript ক্লায়েন্টে একটি মেথড।
ওয়েব ইন্টারফেস (TypeScript এবং React)
webapp/-এmake check-styleএবংmake check-typesচালান।- ক্লাসিক ইন্টারফেস
webapp/STYLE_GUIDE.mdঅনুসরণ করে: ফাংশনাল কম্পোনেন্ট, Redux-এর জন্য হুক, রঙের জন্য থিম ভেরিয়েবল, অ্যাক্সেসিবল মার্কআপ। - Fusion-এর কম্পোনেন্টগুলো
webapp/fusion/src/fusion-এ থাকে, তাদের স্টাইলwebapp/fusion/src/fusion/styles-এ। তারাam()হেল্পার দিয়ে ক্লাস নাম তৈরি করে এবং Fusion-এর ডিজাইন টোকেন ব্যবহার করে; আপনার পাশের ফাইলগুলোর মতো করুন। - অ্যাপগুলোর জন্য নতুন
window.*গ্লোবাল যোগ করবেন না। নতুন অ্যাপ-মুখী ইউটিলিটিগুলোwindow.WebappUtils-এর নিচে যান, যেমনwebapp/AGENTS.md-তে ব্যাখ্যা করা হয়েছে। - অ্যাপ রেজিস্ট্রি (
plugins/registry.ts)-তে করা পরিবর্তন সাধারণত উভয় ইন্টারফেসের কপিতেই যুক্ত হওয়া উচিত।
অনুবাদ
Antimatter এবং এর সাথে বান্ডেল করা অ্যাপসগুলো ৩৭টি ভাষায় অনুবাদ করা হয়েছে। কন্ট্রিবিউটররা ইংরেজি স্ট্রিং যোগ করেন; অন্য ভাষাগুলো ব্যাচে আপডেট করা হয়।
ওয়েব ইন্টারফেসে একটি স্ট্রিং যোগ করা
- এটি একটি আইডি এবং লিটারাল ইংরেজি টেক্সট সহ লিখুন:
formatMessage({id: 'fusion.channelMenu.settings', defaultMessage: 'Channel settings'})বা<FormattedMessage id='…' defaultMessage='…'/>। অ্যাপে যে ইংরেজি দেখানো হয় তাdefaultMessage-এর থেকে আসে। webapp/-এmake i18n-extractচালান (অথবাwebapp/fusionবাwebapp/channels-এnpm run i18n-extract)। এটি সেই প্যাকেজেরsrc/i18n/en.jsonআপডেট করে।en.json-এ নতুন এন্ট্রিরdescriptionপূরণ করুন: স্ট্রিংটি কোথায় দেখা যায় এবং কীভাবে ব্যবহার করা হয়। এটি হলো সেই কনটেক্সট, যার ভিত্তিতে অনুবাদকরা (মানুষ বা মেশিন) কাজ করেন।
যখন en.json কোডের সাথে আপডেটেড থাকে না, তখন npm run i18n-extract:check ব্যর্থ হয়।
সার্ভারে একটি স্ট্রিং যোগ করা
- কোডে একটি আইডি ব্যবহার করুন, যেমন
model.NewAppError(…, "app.community_attributes.invalid.app_error", …)বাi18n.T("…")। server/-এmake i18n-extractচালান। এটি আইডিটি সঠিক ক্রমেserver/i18n/en.json-এ যোগ করে।- নতুন এন্ট্রির ইংরেজি
translationএবংdescriptionলিখুন।
অন্যান্য ভাষা
প্রতিটি ভাষার নিজস্ব ফাইল en.json-এর পাশে থাকে (fr.json, pt-BR.json, zh-TW.json…)। ভুল অনুবাদ রিপোর্ট করতে, কমিউনিটি রিপোজিটরিতে একটি ইস্যু খুলুন যেখানে ভাষা, টেক্সট এবং যেখানে এটি দেখা যায় তা উল্লেখ করুন।
বান্ডেল করা অ্যাপসগুলো তাদের স্ট্রিংসমূহ webapp/i18n/-এ রাখে; অ্যাপস পেজে Translations দেখুন।
ডকুমেন্টেশন এবং এই ওয়েবসাইট
এই ওয়েবসাইট এবং এর ডকুমেন্টেশন antimatter.chat রিপোজিটরিতে রয়েছে। পেজগুলো src/pages/-এ HTML ফ্র্যাগমেন্ট; python3 src/build.py সাইটটি বিল্ড করে। সংশোধন এবং অনুপস্থিত ব্যাখ্যা ইস্যু বা পুল রিকোয়েস্ট হিসেবে স্বাগতম।
নিরাপত্তা সমস্যা
GitHub-এর প্রাইভেট ভাউলনারাবিলিটি রিপোর্টিং ব্যবহার করে এটি গোপনে রিপোর্ট করুন: প্রভাবিত রিপোজিটরির নিরাপত্তা ট্যাব খুলুন (যেমন সার্ভার) এবং Report a vulnerability নির্বাচন করুন। আপনি যদি না জানেন কোন রিপোজিটরি প্রভাবিত, তবে কমিউনিটি রিপোজিটরিতে এটি রিপোর্ট করুন। কম্পোনেন্ট এবং তার ভার্সন, আক্রমণকারী কী করতে পারে, এটি কীভাবে পুনরায় তৈরি করা যায় এবং এটি কোন কনফিগারেশনের উপর নির্ভর করে, এসব উল্লেখ করুন।
মেনটেইনাররা সেখানে উত্তর দেন, সমস্যাটি সমাধানের সময় আপনাকে আপডেটেড রাখেন এবং একটি ফিক্সড রিলিজ বের হলে একটি অ্যাডভাইজরি প্রকাশ করেন। সমস্যাটি প্রকাশ করার আগে তাদের যুক্তিসঙ্গত সময় দিন। ফিক্সসমূহ সর্বশেষ রিলিজে যুক্ত হয়। সম্পূর্ণ নীতিটি সিকিউরিটি পলিসি-তে রয়েছে।
লাইসেন্সসমূহ
- সার্ভার GNU Affero General Public License v3.0 (AGPL v3)-এর আওতায় রয়েছে। একই রিপোজিটরিতে, অ্যাডমিন টুলস এবং কনফিগারেশন ফাইল (
server/templates/,server/i18n/,server/public/এবংwebapp/) Apache License 2.0-এর আওতায় রয়েছে।LICENSE.txtএবংNOTICE.txtদেখুন। - অ্যাপস: Antimatter-এর নিজস্ব অ্যাপস, যেমন Polls, AGPL v3-এর আওতায় রয়েছে; Mattermost থেকে ফর্ক করা অ্যাপস তাদের মূল লাইসেন্স বজায় রাখে। প্রতিটি রিপোজিটরি তার
LICENSEফাইলে কোন লাইসেন্সটি প্রযোজ্য তা উল্লেখ করে। - ডেস্কটপ এবং মোবাইল অ্যাপস Apache License 2.0-এর আওতায় রয়েছে। Docker রিপোজিটরি Apache License 2.0-এর আওতায় রয়েছে, তবে এর
DockerfileAGPL v3-এর আওতায় রয়েছে।
AGPL-এর অর্থ হলো, আপনি যদি নেটওয়ার্কের মাধ্যমে অন্যদের জন্য একটি পরিবর্তিত Antimatter সার্ভার চালান, তবে আপনাকে আপনার পরিবর্তনগুলোর সোর্স কোড তাদের কাছে সরবরাহ করতে হবে। Antimatter Mattermost-এর উপর ভিত্তি করে তৈরি; এটি Mattermost, Inc.-এর সাথে যুক্ত নয় বা তাদের দ্বারা অনুমোদিত নয়।
সবারই কোড অব কন্ডাক্ট-এর মেনে চলতে হবে।