ہُکس¶
- Hooks ایک قابلِ توسیع، ایونٹ پر مبنی نظام فراہم کرتے ہیں جو ایجنٹ کمانڈز اور ایونٹس کے جواب میں خودکار کارروائیوں کے لیے استعمال ہوتا ہے۔ 4. Hooks ڈائریکٹریز سے خودکار طور پر دریافت ہوتے ہیں اور CLI کمانڈز کے ذریعے منظم کیے جا سکتے ہیں، بالکل اسی طرح جیسے OpenClaw میں skills کام کرتی ہیں۔
واقفیت حاصل کرنا¶
- Hooks چھوٹے اسکرپٹس ہوتے ہیں جو کسی واقعے کے ہونے پر چلتے ہیں۔ 6. ان کی دو اقسام ہیں:
- Hooks (یہ صفحہ): Gateway کے اندر چلتے ہیں جب ایجنٹ ایونٹس فائر ہوتے ہیں، جیسے
/new,/reset,/stop, یا لائف سائیکل ایونٹس۔ -
- Webhooks: بیرونی HTTP ویب ہوکس جو دوسرے سسٹمز کو OpenClaw میں کام شروع کرنے دیتے ہیں۔ 8. Webhook Hooks دیکھیں یا Gmail ہیلپر کمانڈز کے لیے
openclaw webhooksاستعمال کریں۔
- Webhooks: بیرونی HTTP ویب ہوکس جو دوسرے سسٹمز کو OpenClaw میں کام شروع کرنے دیتے ہیں۔ 8. Webhook Hooks دیکھیں یا Gmail ہیلپر کمانڈز کے لیے
ہُکس پلگ اِنز کے اندر بھی بنڈل کیے جا سکتے ہیں؛ دیکھیں Plugins۔
عام استعمالات:
- سیشن ری سیٹ کرنے پر میموری اسنیپ شاٹ محفوظ کرنا
- خرابیوں کے ازالے یا تعمیل کے لیے کمانڈز کا آڈٹ ٹریل رکھنا
- سیشن شروع یا ختم ہونے پر فالو اَپ خودکاری ٹرگر کرنا
- ایونٹس کے فائر ہونے پر ایجنٹ ورک اسپیس میں فائلیں لکھنا یا بیرونی APIs کال کرنا
- اگر آپ ایک چھوٹا TypeScript فنکشن لکھ سکتے ہیں، تو آپ ایک hook لکھ سکتے ہیں۔ 10. Hooks خودکار طور پر دریافت ہوتے ہیں، اور آپ انہیں CLI کے ذریعے فعال یا غیر فعال کرتے ہیں۔
جائزہ¶
ہُکس سسٹم آپ کو یہ سہولت دیتا ہے کہ آپ:
- جب
/newجاری کیا جائے تو سیشن سیاق کو میموری میں محفوظ کریں - آڈٹنگ کے لیے تمام کمانڈز لاگ کریں
- ایجنٹ لائف سائیکل ایونٹس پر حسبِ ضرورت خودکاری ٹرگر کریں
- کور کوڈ میں ترمیم کیے بغیر OpenClaw کے رویّے کو وسعت دیں
آغاز¶
بنڈل شدہ ہُکس¶
OpenClaw چار بنڈل شدہ ہُکس کے ساتھ آتا ہے جو خودکار طور پر دریافت ہو جاتے ہیں:
- 💾 session-memory: جب آپ
/newجاری کرتے ہیں تو سیشن سیاق کو آپ کے ایجنٹ ورک اسپیس میں (بطورِ طے شدہ~/.openclaw/workspace/memory/) محفوظ کرتا ہے - 📝 command-logger: تمام کمانڈ ایونٹس کو
~/.openclaw/logs/commands.logمیں لاگ کرتا ہے - 🚀 boot-md: گیٹ وے کے شروع ہونے پر
BOOT.mdچلاتا ہے (اندرونی ہُکس کے فعال ہونے کی ضرورت) - 😈 soul-evil: purge ونڈو کے دوران یا اتفاقی امکان سے injected
SOUL.mdمواد کوSOUL_EVIL.mdسے بدل دیتا ہے
دستیاب ہُکس کی فہرست:
openclaw hooks list
ہُک فعال کریں:
openclaw hooks enable session-memory
ہُک کی حالت چیک کریں:
openclaw hooks check
تفصیلی معلومات حاصل کریں:
openclaw hooks info session-memory
آن بورڈنگ¶
- آن بورڈنگ کے دوران (
openclaw onboard)، آپ سے تجویز کردہ hooks کو فعال کرنے کے لیے کہا جائے گا۔ 12. وزارڈ خودکار طور پر موزوں hooks دریافت کرتا ہے اور انتخاب کے لیے پیش کرتا ہے۔
ہُک کی دریافت¶
ہُکس تین ڈائریکٹریز سے خودکار طور پر دریافت ہوتے ہیں (ترجیح کی ترتیب میں):
- Workspace hooks:
<workspace>/hooks/(ہر ایجنٹ کے لیے، سب سے زیادہ ترجیح) - Managed hooks:
~/.openclaw/hooks/(یوزر کے ذریعے انسٹال شدہ، ورک اسپیسز میں مشترک) - Bundled hooks:
<openclaw>/dist/hooks/bundled/(OpenClaw کے ساتھ فراہم کردہ)
Managed ہُک ڈائریکٹریز یا تو ایک ہُک ہو سکتی ہیں یا ہُک پیک (پیکیج ڈائریکٹری)۔
ہر ہُک ایک ڈائریکٹری ہوتی ہے جس میں شامل ہوتا ہے:
my-hook/
├── HOOK.md # Metadata + documentation
└── handler.ts # Handler implementation
ہُک پیکس (npm/archives)¶
- Hook packs معیاری npm پیکجز ہوتے ہیں جو
package.jsonمیںopenclaw.hooksکے ذریعے ایک یا زیادہ hooks ایکسپورٹ کرتے ہیں۔ 14. انہیں انسٹال کریں بذریعہ:
openclaw hooks install <path-or-spec>
مثالی package.json:
{
"name": "@acme/my-hooks",
"version": "0.1.0",
"openclaw": {
"hooks": ["./hooks/my-hook", "./hooks/other-hook"]
}
}
- ہر اندراج ایک hook ڈائریکٹری کی طرف اشارہ کرتا ہے جس میں
HOOK.mdاورhandler.ts(یاindex.ts) شامل ہوتے ہیں۔ - Hook packs اپنے dependencies کے ساتھ آ سکتے ہیں؛ یہ
~/.openclaw/hooks/<id>کے تحت انسٹال ہوں گے۔
Hook Structure¶
HOOK.md Format¶
HOOK.md فائل میں YAML فرنٹ میٹر میں میٹا ڈیٹا اور اس کے بعد Markdown دستاویزات ہوتی ہیں:
---
name: my-hook
description: "Short description of what this hook does"
homepage: https://docs.openclaw.ai/hooks#my-hook
metadata:
{ "openclaw": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } }
---
# My Hook
Detailed documentation goes here...
## What It Does
- Listens for `/new` commands
- Performs some action
- Logs the result
## Requirements
- Node.js must be installed
## Configuration
No configuration needed.
Metadata Fields¶
metadata.openclaw آبجیکٹ درج ذیل کی حمایت کرتا ہے:
emoji: CLI کے لیے ڈسپلے ایموجی (مثلاً"💾")events: سننے کے لیے ایونٹس کی فہرست (مثلاً["command:new", "command:reset"])export: استعمال کے لیے نامزد ایکسپورٹ (بطورِ طے شدہ"default")homepage: دستاویزات کا URLrequires: اختیاری تقاضےbins: PATH میں درکار بائنریز (مثلاً["git", "node"])anyBins: ان میں سے کم از کم ایک بائنری موجود ہونی چاہیےenv: درکار ماحولیاتی متغیراتconfig: درکار کنفیگ راستے (مثلاً["workspace.dir"])os: درکار پلیٹ فارمز (مثلاً["darwin", "linux"])always: اہلیت کی جانچ کو بائی پاس کریں (boolean)install: انسٹالیشن کے طریقے (بنڈل ہُکس کے لیے:[{"id":"bundled","kind":"bundled"}])
Handler Implementation¶
handler.ts فائل ایک HookHandler فنکشن ایکسپورٹ کرتی ہے:
import type { HookHandler } from "../../src/hooks/hooks.js";
const myHandler: HookHandler = async (event) => {
// Only trigger on 'new' command
if (event.type !== "command" || event.action !== "new") {
return;
}
console.log(`[my-hook] New command triggered`);
console.log(` Session: ${event.sessionKey}`);
console.log(` Timestamp: ${event.timestamp.toISOString()}`);
// Your custom logic here
// Optionally send message to user
event.messages.push("✨ My hook executed!");
};
export default myHandler;
Event Context¶
ہر ایونٹ میں شامل ہوتا ہے:
{
type: 'command' | 'session' | 'agent' | 'gateway',
action: string, // e.g., 'new', 'reset', 'stop'
sessionKey: string, // Session identifier
timestamp: Date, // When the event occurred
messages: string[], // Push messages here to send to user
context: {
sessionEntry?: SessionEntry,
sessionId?: string,
sessionFile?: string,
commandSource?: string, // e.g., 'whatsapp', 'telegram'
senderId?: string,
workspaceDir?: string,
bootstrapFiles?: WorkspaceBootstrapFile[],
cfg?: OpenClawConfig
}
}
Event Types¶
Command Events¶
ایجنٹ کمانڈز کے جاری ہونے پر ٹرگر ہوتے ہیں:
command: تمام کمانڈ ایونٹس (عمومی لسٹنر)command:new: جب/newکمانڈ جاری ہوcommand:reset: جب/resetکمانڈ جاری ہوcommand:stop: جب/stopکمانڈ جاری ہو
Agent Events¶
agent:bootstrap: ورک اسپیس بوٹ اسٹرَیپ فائلز کے انجیکٹ ہونے سے پہلے (ہُکسcontext.bootstrapFilesکو تبدیل کر سکتے ہیں)
Gateway Events¶
گیٹ وے کے شروع ہونے پر ٹرگر ہوتے ہیں:
gateway:startup: چینلز کے شروع ہونے اور ہُکس کے لوڈ ہونے کے بعد
Tool Result Hooks (Plugin API)¶
یہ ہُکس ایونٹ اسٹریم لسٹنرز نہیں ہیں؛ یہ پلگ اِنز کو اجازت دیتے ہیں کہ OpenClaw کے محفوظ کرنے سے پہلے ٹول نتائج کو ہم وقتی طور پر ایڈجسٹ کریں۔
-
tool_result_persist: ٹول کے نتائج کو سیشن ٹرانسکرپٹ میں لکھنے سے پہلے تبدیل کریں۔ 18. لازمی طور پر synchronous ہونا چاہیے؛ اپڈیٹ شدہ ٹول رزلٹ payload واپس کریں یا جیسا ہے ویسا رکھنے کے لیےundefinedلوٹائیں۔ 19. Agent Loop دیکھیں۔
Future Events¶
منصوبہ بند ایونٹس:
session:start: جب نیا سیشن شروع ہوsession:end: جب سیشن ختم ہوagent:error: جب ایجنٹ کو کوئی خرابی پیش آئےmessage:sent: جب کوئی پیغام بھیجا جائےmessage:received: جب کوئی پیغام موصول ہو
Creating Custom Hooks¶
20. 1. 21. مقام منتخب کریں¶
- Workspace hooks (
<workspace>/hooks/): ہر ایجنٹ کے لیے، سب سے زیادہ ترجیح - Managed hooks (
~/.openclaw/hooks/): ورک اسپیسز میں مشترک
22. 2. 23. ڈائریکٹری اسٹرکچر بنائیں¶
mkdir -p ~/.openclaw/hooks/my-hook
cd ~/.openclaw/hooks/my-hook
24. 3. HOOK.md بنائیں¶
---
name: my-hook
description: "Does something useful"
metadata: { "openclaw": { "emoji": "🎯", "events": ["command:new"] } }
---
# My Custom Hook
This hook does something useful when you issue `/new`.
25. 4. 26. handler.ts بنائیں¶
import type { HookHandler } from "../../src/hooks/hooks.js";
const handler: HookHandler = async (event) => {
if (event.type !== "command" || event.action !== "new") {
return;
}
console.log("[my-hook] Running!");
// Your logic here
};
export default handler;
27. 5. 28. فعال کریں اور ٹیسٹ کریں¶
# Verify hook is discovered
openclaw hooks list
# Enable it
openclaw hooks enable my-hook
# Restart your gateway process (menu bar app restart on macOS, or restart your dev process)
# Trigger the event
# Send /new via your messaging channel
Configuration¶
New Config Format (Recommended)¶
{
"hooks": {
"internal": {
"enabled": true,
"entries": {
"session-memory": { "enabled": true },
"command-logger": { "enabled": false }
}
}
}
}
Per-Hook Configuration¶
ہُکس میں حسبِ ضرورت کنفیگریشن ہو سکتی ہے:
{
"hooks": {
"internal": {
"enabled": true,
"entries": {
"my-hook": {
"enabled": true,
"env": {
"MY_CUSTOM_VAR": "value"
}
}
}
}
}
}
Extra Directories¶
اضافی ڈائریکٹریز سے ہُکس لوڈ کریں:
{
"hooks": {
"internal": {
"enabled": true,
"load": {
"extraDirs": ["/path/to/more/hooks"]
}
}
}
}
Legacy Config Format (Still Supported)¶
پرانی کنفیگ فارمیٹ پچھلی مطابقت کے لیے اب بھی کام کرتی ہے:
{
"hooks": {
"internal": {
"enabled": true,
"handlers": [
{
"event": "command:new",
"module": "./hooks/handlers/my-handler.ts",
"export": "default"
}
]
}
}
}
Migration: Use the new discovery-based system for new hooks. 30. لیگیسی handlers کو ڈائریکٹری پر مبنی hooks کے بعد لوڈ کیا جاتا ہے۔
CLI Commands¶
List Hooks¶
# List all hooks
openclaw hooks list
# Show only eligible hooks
openclaw hooks list --eligible
# Verbose output (show missing requirements)
openclaw hooks list --verbose
# JSON output
openclaw hooks list --json
Hook Information¶
# Show detailed info about a hook
openclaw hooks info session-memory
# JSON output
openclaw hooks info session-memory --json
Check Eligibility¶
# Show eligibility summary
openclaw hooks check
# JSON output
openclaw hooks check --json
Enable/Disable¶
# Enable a hook
openclaw hooks enable session-memory
# Disable a hook
openclaw hooks disable command-logger
Bundled hook reference¶
session-memory¶
جب آپ /new جاری کرتے ہیں تو سیشن سیاق کو میموری میں محفوظ کرتا ہے۔
Events: command:new
Requirements: workspace.dir کنفیگر ہونا لازم ہے
Output: <workspace>/memory/YYYY-MM-DD-slug.md (بطورِ طے شدہ ~/.openclaw/workspace)
What it does:
- درست ٹرانسکرپٹ تلاش کرنے کے لیے پری ری سیٹ سیشن انٹری استعمال کرتا ہے
- گفتگو کی آخری 15 سطریں نکالتا ہے
- وضاحتی فائل نیم سلاگ بنانے کے لیے LLM استعمال کرتا ہے
- سیشن میٹا ڈیٹا کو تاریخ وار میموری فائل میں محفوظ کرتا ہے
Example output:
# Session: 2026-01-16 14:30:00 UTC
- **Session Key**: agent:main:main
- **Session ID**: abc123def456
- **Source**: telegram
Filename examples:
2026-01-16-vendor-pitch.md2026-01-16-api-design.md2026-01-16-1430.md(اگر سلاگ جنریشن ناکام ہو تو فال بیک ٹائم اسٹیمپ)
Enable:
openclaw hooks enable session-memory
command-logger¶
تمام کمانڈ ایونٹس کو ایک مرکزی آڈٹ فائل میں لاگ کرتا ہے۔
Events: command
Requirements: کوئی نہیں
Output: ~/.openclaw/logs/commands.log
What it does:
- ایونٹ کی تفصیلات محفوظ کرتا ہے (کمانڈ ایکشن، ٹائم اسٹیمپ، سیشن کی، بھیجنے والے کی ID، ماخذ)
- JSONL فارمیٹ میں لاگ فائل میں شامل کرتا ہے
- پس منظر میں خاموشی سے چلتا ہے
Example log entries:
{"timestamp":"2026-01-16T14:30:00.000Z","action":"new","sessionKey":"agent:main:main","senderId":"+1234567890","source":"telegram"}
{"timestamp":"2026-01-16T15:45:22.000Z","action":"stop","sessionKey":"agent:main:main","senderId":"user@example.com","source":"whatsapp"}
View logs:
# View recent commands
tail -n 20 ~/.openclaw/logs/commands.log
# Pretty-print with jq
cat ~/.openclaw/logs/commands.log | jq .
# Filter by action
grep '"action":"new"' ~/.openclaw/logs/commands.log | jq .
Enable:
openclaw hooks enable command-logger
soul-evil¶
purge ونڈو کے دوران یا اتفاقی امکان سے injected SOUL.md مواد کو SOUL_EVIL.md سے بدل دیتا ہے۔
Events: agent:bootstrap
Docs: SOUL Evil Hook
Output: کوئی فائل نہیں لکھی جاتی؛ تبدیلیاں صرف میموری میں ہوتی ہیں۔
Enable:
openclaw hooks enable soul-evil
Config:
{
"hooks": {
"internal": {
"enabled": true,
"entries": {
"soul-evil": {
"enabled": true,
"file": "SOUL_EVIL.md",
"chance": 0.1,
"purge": { "at": "21:00", "duration": "15m" }
}
}
}
}
}
boot-md¶
gateway کے شروع ہونے پر (چینلز کے شروع ہونے کے بعد) BOOT.md چلاتا ہے۔
31. اس کے چلنے کے لیے اندرونی hooks کو فعال ہونا ضروری ہے۔
Events: gateway:startup
Requirements: workspace.dir کنفیگر ہونا لازم ہے
What it does:
- آپ کے ورک اسپیس سے
BOOT.mdپڑھتا ہے - ہدایات کو ایجنٹ رنر کے ذریعے چلاتا ہے
- میسج ٹول کے ذریعے کسی بھی درکار آؤٹ باؤنڈ پیغامات بھیجتا ہے
Enable:
openclaw hooks enable boot-md
Best Practices¶
Keep Handlers Fast¶
- Hooks کمانڈ پروسیسنگ کے دوران چلتے ہیں۔ 33. انہیں ہلکا پھلکا رکھیں:
// ✓ Good - async work, returns immediately
const handler: HookHandler = async (event) => {
void processInBackground(event); // Fire and forget
};
// ✗ Bad - blocks command processing
const handler: HookHandler = async (event) => {
await slowDatabaseQuery(event);
await evenSlowerAPICall(event);
};
Handle Errors Gracefully¶
ہمیشہ خطرناک آپریشنز کو ریپ کریں:
const handler: HookHandler = async (event) => {
try {
await riskyOperation(event);
} catch (err) {
console.error("[my-handler] Failed:", err instanceof Error ? err.message : String(err));
// Don't throw - let other handlers run
}
};
Filter Events Early¶
اگر ایونٹ متعلقہ نہیں تو فوراً واپس آ جائیں:
const handler: HookHandler = async (event) => {
// Only handle 'new' commands
if (event.type !== "command" || event.action !== "new") {
return;
}
// Your logic here
};
Use Specific Event Keys¶
جہاں ممکن ہو میٹا ڈیٹا میں مخصوص ایونٹس درج کریں:
metadata: { "openclaw": { "events": ["command:new"] } } # Specific
اس کے بجائے:
metadata: { "openclaw": { "events": ["command"] } } # General - more overhead
Debugging¶
Enable Hook Logging¶
گیٹ وے اسٹارٹ اپ پر ہُک لوڈنگ لاگ کرتا ہے:
Registered hook: session-memory -> command:new
Registered hook: command-logger -> command
Registered hook: boot-md -> gateway:startup
Check Discovery¶
تمام دریافت شدہ ہُکس کی فہرست بنائیں:
openclaw hooks list --verbose
Check Registration¶
اپنے ہینڈلر میں، کال ہونے پر لاگ کریں:
const handler: HookHandler = async (event) => {
console.log("[my-handler] Triggered:", event.type, event.action);
// Your logic
};
Verify Eligibility¶
چیک کریں کہ ہُک اہل کیوں نہیں ہے:
openclaw hooks info my-hook
آؤٹ پٹ میں گمشدہ تقاضوں کو دیکھیں۔
Testing¶
Gateway Logs¶
ہُک کے نفاذ کو دیکھنے کے لیے گیٹ وے لاگز مانیٹر کریں:
# macOS
./scripts/clawlog.sh -f
# Other platforms
tail -f ~/.openclaw/gateway.log
Test Hooks Directly¶
اپنے ہینڈلرز کو تنہا حالت میں ٹیسٹ کریں:
import { test } from "vitest";
import { createHookEvent } from "./src/hooks/hooks.js";
import myHandler from "./hooks/my-hook/handler.js";
test("my handler works", async () => {
const event = createHookEvent("command", "new", "test-session", {
foo: "bar",
});
await myHandler(event);
// Assert side effects
});
Architecture¶
Core Components¶
src/hooks/types.ts: ٹائپ کی تعریفیںsrc/hooks/workspace.ts: ڈائریکٹری اسکیننگ اور لوڈنگsrc/hooks/frontmatter.ts: HOOK.md میٹا ڈیٹا پارسنگsrc/hooks/config.ts: اہلیت کی جانچsrc/hooks/hooks-status.ts: اسٹیٹس رپورٹنگsrc/hooks/loader.ts: ڈائنامک ماڈیول لوڈرsrc/cli/hooks-cli.ts: CLI کمانڈزsrc/gateway/server-startup.ts: گیٹ وے اسٹارٹ پر ہُکس لوڈ کرتا ہےsrc/auto-reply/reply/commands-core.ts: کمانڈ ایونٹس ٹرگر کرتا ہے
Discovery Flow¶
Gateway startup
↓
Scan directories (workspace → managed → bundled)
↓
Parse HOOK.md files
↓
Check eligibility (bins, env, config, os)
↓
Load handlers from eligible hooks
↓
Register handlers for events
Event Flow¶
User sends /new
↓
Command validation
↓
Create hook event
↓
Trigger hook (all registered handlers)
↓
Command processing continues
↓
Session reset
Troubleshooting¶
Hook Not Discovered¶
- ڈائریکٹری اسٹرکچر چیک کریں:
bash
ls -la ~/.openclaw/hooks/my-hook/
# Should show: HOOK.md, handler.ts
- HOOK.md فارمیٹ کی تصدیق کریں:
bash
cat ~/.openclaw/hooks/my-hook/HOOK.md
# Should have YAML frontmatter with name and metadata
- تمام دریافت شدہ ہُکس کی فہرست بنائیں:
bash
openclaw hooks list
Hook Not Eligible¶
تقاضے چیک کریں:
openclaw hooks info my-hook
گمشدہ چیزیں دیکھیں:
- بائنریز (PATH چیک کریں)
- ماحولیاتی متغیرات
- کنفیگ اقدار
- OS مطابقت
Hook Not Executing¶
- تصدیق کریں کہ ہُک فعال ہے:
bash
openclaw hooks list
# Should show ✓ next to enabled hooks
-
ہُکس کے دوبارہ لوڈ ہونے کے لیے گیٹ وے پروسیس ری اسٹارٹ کریں۔
-
غلطیوں کے لیے گیٹ وے لاگز چیک کریں:
bash
./scripts/clawlog.sh | grep hook
Handler Errors¶
TypeScript/امپورٹ غلطیوں کے لیے چیک کریں:
# Test import directly
node -e "import('./path/to/handler.ts').then(console.log)"
Migration Guide¶
From Legacy Config to Discovery¶
Before:
{
"hooks": {
"internal": {
"enabled": true,
"handlers": [
{
"event": "command:new",
"module": "./hooks/handlers/my-handler.ts"
}
]
}
}
}
After:
- ہُک ڈائریکٹری بنائیں:
bash
mkdir -p ~/.openclaw/hooks/my-hook
mv ./hooks/handlers/my-handler.ts ~/.openclaw/hooks/my-hook/handler.ts
- HOOK.md بنائیں:
```markdown
name: my-hook description: "My custom hook" metadata: { "openclaw": { "emoji": "🎯", "events": ["command:new"] } }
# My Hook
Does something useful. ```
- کنفیگ اپ ڈیٹ کریں:
json
{
"hooks": {
"internal": {
"enabled": true,
"entries": {
"my-hook": { "enabled": true }
}
}
}
}
- تصدیق کریں اور گیٹ وے پروسیس ری اسٹارٹ کریں:
bash
openclaw hooks list
# Should show: 🎯 my-hook ✓
Benefits of migration:
- خودکار دریافت
- CLI مینجمنٹ
- اہلیت کی جانچ
- بہتر دستاویزات
- یکساں اسٹرکچر