Refactor high-complexity React components in Dify frontend. Use when `pnpm analyze-component...
npx skills add millord237/10X-Notion-Skills --skill "10x-member"
Install specific skill from multi-skill repository
# Description
Individual member operations including personal task views, daily check-ins, progress tracking, and self-service features. Use for viewing your tasks, creating check-ins, tracking your progress, and managing your work. Available to all authenticated users.
# SKILL.md
name: 10x-member
description: Individual member operations including personal task views, daily check-ins, progress tracking, and self-service features. Use for viewing your tasks, creating check-ins, tracking your progress, and managing your work. Available to all authenticated users.
allowed-tools: Read, Write, Bash
user-invocable: true
argument-hint: "[command] [args]"
10X Notion Team Skills - Member Operations
Manage your personal tasks, check-ins, and track your progress.
Quick Commands
| Command | Description |
|---|---|
my-tasks |
View your assigned tasks |
my-raci |
View your RACI responsibilities |
check-in |
Create daily check-in |
progress |
View your progress dashboard |
complete |
Mark task as complete |
block |
Mark task as blocked |
profile |
View/update your profile |
My Tasks
View All My Tasks
/10x-member my-tasks
/10x-member my-tasks --status "In Progress"
/10x-member my-tasks --priority "High"
/10x-member my-tasks --due-today
Implementation:
const currentUser = await getCurrentUser();
const statusFilter = $ARGUMENTS.match(/--status\s+"([^"]+)"/)?.[1];
const priorityFilter = $ARGUMENTS.match(/--priority\s+"([^"]+)"/)?.[1];
const dueToday = $ARGUMENTS.includes("--due-today");
const filters = [
{ property: "Assigned To", relation: { contains: currentUser.id }}
];
if (statusFilter) {
filters.push({ property: "Status", select: { equals: statusFilter }});
} else {
// Exclude completed by default
filters.push({ property: "Status", select: { does_not_equal: "Done" }});
}
if (priorityFilter) {
filters.push({ property: "Priority", select: { equals: priorityFilter }});
}
if (dueToday) {
const today = new Date().toISOString().split('T')[0];
filters.push({ property: "Date", date: { equals: today }});
}
const tasks = await notion.databases.query({
database_id: tasksDbId,
filter: filters.length > 1 ? { and: filters } : filters[0],
sorts: [
{ property: "Priority", direction: "ascending" },
{ property: "Date", direction: "ascending" }
]
});
// Group by status
const grouped = {
"Critical": [],
"High": [],
"Medium": [],
"Low": []
};
for (const task of tasks.results) {
const priority = task.properties.Priority?.select?.name || "Medium";
const status = task.properties.Status?.select?.name || "To Do";
const dueDate = task.properties.Date?.date?.start;
const raciRole = task.properties["RACI Role"]?.select?.name;
grouped[priority].push({
name: task.properties["Task Name"].title[0].plain_text,
status,
dueDate,
raciRole: raciRole ? raciRole.charAt(0) : null,
id: task.id
});
}
const userName = currentUser.properties.Name.title[0].plain_text;
const skillId = currentUser.properties["Skill ID"]?.rich_text?.[0]?.plain_text;
return `
π My Tasks - ${userName} (${skillId})
π΄ CRITICAL
${grouped["Critical"].map(t =>
` β’ [${t.status}] ${t.name} ${t.dueDate ? `(Due: ${t.dueDate})` : ""} ${t.raciRole ? `[${t.raciRole}]` : ""}`
).join('\n') || " None"}
π HIGH
${grouped["High"].map(t =>
` β’ [${t.status}] ${t.name} ${t.dueDate ? `(Due: ${t.dueDate})` : ""} ${t.raciRole ? `[${t.raciRole}]` : ""}`
).join('\n') || " None"}
π‘ MEDIUM
${grouped["Medium"].map(t =>
` β’ [${t.status}] ${t.name} ${t.dueDate ? `(Due: ${t.dueDate})` : ""} ${t.raciRole ? `[${t.raciRole}]` : ""}`
).join('\n') || " None"}
π’ LOW
${grouped["Low"].map(t =>
` β’ [${t.status}] ${t.name} ${t.dueDate ? `(Due: ${t.dueDate})` : ""} ${t.raciRole ? `[${t.raciRole}]` : ""}`
).join('\n') || " None"}
Total: ${tasks.results.length} active tasks
`;
View Today's Schedule
/10x-member today
Implementation:
const currentUser = await getCurrentUser();
const today = new Date().toISOString().split('T')[0];
// Get today's tasks
const tasks = await notion.databases.query({
database_id: tasksDbId,
filter: {
and: [
{ property: "Assigned To", relation: { contains: currentUser.id }},
{ property: "Date", date: { equals: today }}
]
},
sorts: [{ property: "Time Block", direction: "ascending" }]
});
// Get today's meetings/events from check-ins
const checkIn = await notion.databases.query({
database_id: dailyCheckInsDbId,
filter: { property: "Date", date: { equals: today }},
page_size: 1
});
// Get RACI items due today
const raciToday = await notion.databases.query({
database_id: raciAssignmentsDbId,
filter: {
and: [
{ property: "User", relation: { contains: currentUser.id }},
{ property: "Due Date", date: { equals: today }},
{ property: "Status", select: { equals: "Active" }}
]
}
});
// Group tasks by time block
const timeBlocks = {
"Morning": [],
"Midday": [],
"Afternoon": [],
"Evening": [],
"Anytime": []
};
for (const task of tasks.results) {
const timeBlock = task.properties["Time Block"]?.select?.name || "Anytime";
timeBlocks[timeBlock].push({
name: task.properties["Task Name"].title[0].plain_text,
status: task.properties.Status?.select?.name,
priority: task.properties.Priority?.select?.name
});
}
return `
π
Today's Schedule - ${new Date().toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric' })}
π
MORNING
${timeBlocks["Morning"].map(t => ` β’ [${t.priority}] ${t.name}`).join('\n') || " No tasks scheduled"}
βοΈ MIDDAY
${timeBlocks["Midday"].map(t => ` β’ [${t.priority}] ${t.name}`).join('\n') || " No tasks scheduled"}
π€οΈ AFTERNOON
${timeBlocks["Afternoon"].map(t => ` β’ [${t.priority}] ${t.name}`).join('\n') || " No tasks scheduled"}
π EVENING
${timeBlocks["Evening"].map(t => ` β’ [${t.priority}] ${t.name}`).join('\n') || " No tasks scheduled"}
β° ANYTIME
${timeBlocks["Anytime"].map(t => ` β’ [${t.priority}] ${t.name}`).join('\n') || " No tasks scheduled"}
${raciToday.results.length > 0 ? `
π RACI Due Today:
${raciToday.results.map(r =>
` β’ [${r.properties["RACI Type"].select.name.charAt(0)}] ${r.properties.Name.title[0].plain_text}`
).join('\n')}` : ""}
Total: ${tasks.results.length} tasks today
`;
My RACI Responsibilities
View RACI Assignments
/10x-member my-raci
/10x-member my-raci --type R
Implementation:
const currentUser = await getCurrentUser();
const typeFilter = $ARGUMENTS.match(/--type\s+(\w)/)?.[1];
const raciMap = {
"R": "R - Responsible",
"A": "A - Accountable",
"C": "C - Consulted",
"I": "I - Informed"
};
const filters = [
{ property: "User", relation: { contains: currentUser.id }},
{ property: "Status", select: { equals: "Active" }}
];
if (typeFilter && raciMap[typeFilter.toUpperCase()]) {
filters.push({ property: "RACI Type", select: { equals: raciMap[typeFilter.toUpperCase()] }});
}
const assignments = await notion.databases.query({
database_id: raciAssignmentsDbId,
filter: { and: filters },
sorts: [
{ property: "RACI Type", direction: "ascending" },
{ property: "Due Date", direction: "ascending" }
]
});
// Group by RACI type
const grouped = {
"R - Responsible": [],
"A - Accountable": [],
"C - Consulted": [],
"I - Informed": []
};
for (const assignment of assignments.results) {
const raciType = assignment.properties["RACI Type"].select.name;
const isOverdue = assignment.properties["Due Date"]?.date?.start &&
new Date(assignment.properties["Due Date"].date.start) < new Date();
grouped[raciType].push({
name: assignment.properties.Name.title[0].plain_text,
dueDate: assignment.properties["Due Date"]?.date?.start,
priority: assignment.properties.Priority?.select?.name,
acknowledged: assignment.properties.Acknowledged?.checkbox,
isOverdue
});
}
return `
π My RACI Responsibilities
π΄ RESPONSIBLE (I do the work) - ${grouped["R - Responsible"].length}
${grouped["R - Responsible"].map(a =>
` ${a.isOverdue ? "β οΈ" : "β’"} ${a.name} ${a.dueDate ? `(Due: ${a.dueDate})` : ""} ${!a.acknowledged ? "[Pending Ack]" : ""}`
).join('\n') || " None"}
π ACCOUNTABLE (I approve) - ${grouped["A - Accountable"].length}
${grouped["A - Accountable"].map(a =>
` ${a.isOverdue ? "β οΈ" : "β’"} ${a.name} ${a.dueDate ? `(Due: ${a.dueDate})` : ""}`
).join('\n') || " None"}
π‘ CONSULTED (I provide input) - ${grouped["C - Consulted"].length}
${grouped["C - Consulted"].map(a =>
` β’ ${a.name} ${!a.acknowledged ? "[Needs Input]" : "[Input Provided]"}`
).join('\n') || " None"}
π’ INFORMED (I stay updated) - ${grouped["I - Informed"].length}
${grouped["I - Informed"].map(a =>
` β’ ${a.name}`
).join('\n') || " None"}
Total: ${assignments.results.length} active assignments
`;
Daily Check-In
Create Morning Check-In
/10x-member check-in
Implementation:
const currentUser = await getCurrentUser();
const today = new Date().toISOString().split('T')[0];
// Check if already exists
const existing = await notion.databases.query({
database_id: dailyCheckInsDbId,
filter: {
and: [
{ property: "Date", date: { equals: today }},
{ property: "Related Goals", relation: { contains: currentUser.id }}
]
}
});
if (existing.results.length > 0) {
return "You already have a check-in for today! View it in your Daily Check-ins.";
}
// Get incomplete tasks from yesterday
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const yesterdayStr = yesterday.toISOString().split('T')[0];
const incompleteTasks = await notion.databases.query({
database_id: tasksDbId,
filter: {
and: [
{ property: "Assigned To", relation: { contains: currentUser.id }},
{ property: "Date", date: { equals: yesterdayStr }},
{ property: "Status", select: { does_not_equal: "Done" }}
]
}
});
// Get today's tasks
const todayTasks = await notion.databases.query({
database_id: tasksDbId,
filter: {
and: [
{ property: "Assigned To", relation: { contains: currentUser.id }},
{ property: "Date", date: { equals: today }}
]
},
sorts: [{ property: "Time Block", direction: "ascending" }]
});
// Get active goals
const goals = await notion.databases.query({
database_id: goalsDbId,
filter: {
and: [
{ property: "Owner", relation: { contains: currentUser.id }},
{ property: "Status", select: { equals: "In Progress" }}
]
},
page_size: 5
});
// Get pending RACI items
const raciItems = await notion.databases.query({
database_id: raciAssignmentsDbId,
filter: {
and: [
{ property: "User", relation: { contains: currentUser.id }},
{ property: "Status", select: { equals: "Active" }},
{ property: "Acknowledged", checkbox: { equals: false }}
]
}
});
const userName = currentUser.properties.Name.title[0].plain_text;
// Create check-in page
const checkIn = await notion.pages.create({
parent: { database_id: dailyCheckInsDbId },
properties: {
"Date": { date: { start: today }},
"Related Goals": goals.results.length > 0 ? { relation: goals.results.map(g => ({ id: g.id })) } : undefined
},
children: [
{
type: "heading_1",
heading_1: {
rich_text: [{ text: { content: `π
Daily Check-In - ${userName}` }}],
color: "blue_background"
}
},
{
type: "callout",
callout: {
rich_text: [{ text: { content: new Date().toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' }) }}],
icon: { emoji: "π
" }
}
},
...(incompleteTasks.results.length > 0 ? [
{
type: "heading_2",
heading_2: {
rich_text: [{ text: { content: "β οΈ Carried Over from Yesterday" }}],
color: "yellow_background"
}
},
...incompleteTasks.results.map(task => ({
type: "to_do",
to_do: {
rich_text: [{ text: { content: task.properties["Task Name"].title[0].plain_text }}],
checked: false
}
}))
] : []),
{
type: "heading_2",
heading_2: { rich_text: [{ text: { content: "π Today's Tasks" }}] }
},
...todayTasks.results.map(task => ({
type: "to_do",
to_do: {
rich_text: [{
text: {
content: `[${task.properties["Time Block"]?.select?.name || "Anytime"}] ${task.properties["Task Name"].title[0].plain_text}`
}
}],
checked: false
}
})),
...(raciItems.results.length > 0 ? [
{
type: "heading_2",
heading_2: {
rich_text: [{ text: { content: "π RACI Items Needing Attention" }}],
color: "orange_background"
}
},
...raciItems.results.map(raci => ({
type: "bulleted_list_item",
bulleted_list_item: {
rich_text: [{
text: {
content: `[${raci.properties["RACI Type"].select.name.charAt(0)}] ${raci.properties.Name.title[0].plain_text}`
}
}]
}
}))
] : []),
{ type: "divider", divider: {} },
{
type: "heading_2",
heading_2: { rich_text: [{ text: { content: "π― Top 3 Priorities Today" }}] }
},
{ type: "numbered_list_item", numbered_list_item: { rich_text: [] }},
{ type: "numbered_list_item", numbered_list_item: { rich_text: [] }},
{ type: "numbered_list_item", numbered_list_item: { rich_text: [] }},
{ type: "divider", divider: {} },
{
type: "heading_2",
heading_2: {
rich_text: [{ text: { content: "π End of Day Reflection" }}],
color: "purple_background"
}
},
{
type: "paragraph",
paragraph: {
rich_text: [{ text: { content: "Complete this section at the end of your day:" }}]
}
},
{
type: "heading_3",
heading_3: { rich_text: [{ text: { content: "What went well today?" }}] }
},
{ type: "paragraph", paragraph: { rich_text: [] }},
{
type: "heading_3",
heading_3: { rich_text: [{ text: { content: "What could be improved?" }}] }
},
{ type: "paragraph", paragraph: { rich_text: [] }},
{
type: "heading_3",
heading_3: { rich_text: [{ text: { content: "What will I focus on tomorrow?" }}] }
},
{ type: "paragraph", paragraph: { rich_text: [] }}
]
});
return `
β
Daily Check-In Created!
Date: ${today}
Carried Over: ${incompleteTasks.results.length} tasks
Today's Tasks: ${todayTasks.results.length} tasks
RACI Items: ${raciItems.results.length} pending
Remember to:
1. Fill in your top 3 priorities
2. Complete the reflection at end of day
3. Acknowledge any pending RACI items
View: Your Daily Check-ins database
`;
Task Management
Complete a Task
/10x-member complete "API Design"
Implementation:
const taskName = $ARGUMENTS.match(/complete\s+"([^"]+)"/)?.[1] ||
$ARGUMENTS.replace(/^complete\s+/, "").trim();
const currentUser = await getCurrentUser();
// Find task
const task = await notion.databases.query({
database_id: tasksDbId,
filter: {
and: [
{ property: "Task Name", title: { contains: taskName }},
{ property: "Assigned To", relation: { contains: currentUser.id }}
]
}
});
if (!task.results.length) {
return `Task "${taskName}" not found in your assignments`;
}
const taskData = task.results[0];
const requiresApproval = taskData.properties["Requires Approval"]?.checkbox;
if (requiresApproval) {
// Check for Accountable person
const raciAccountable = await notion.databases.query({
database_id: raciAssignmentsDbId,
filter: {
and: [
{ property: "Task", relation: { contains: taskData.id }},
{ property: "RACI Type", select: { equals: "A - Accountable" }}
]
}
});
if (raciAccountable.results.length) {
await notion.pages.update({
page_id: taskData.id,
properties: {
"Status": { select: { name: "In Progress" }}
}
});
return `
Task "${taskName}" requires approval.
Status changed to: In Progress (Pending Approval)
Accountable person has been notified for review.
Use /10x-delegate approve "${taskName}" once approved.
`;
}
}
// Complete the task
await notion.pages.update({
page_id: taskData.id,
properties: {
"Status": { select: { name: "Done" }},
"Actual Duration": taskData.properties["Estimated Duration"]?.number ?
{ number: taskData.properties["Estimated Duration"].number } : undefined
}
});
// Update RACI assignment if exists
const raciAssignment = await notion.databases.query({
database_id: raciAssignmentsDbId,
filter: {
and: [
{ property: "Task", relation: { contains: taskData.id }},
{ property: "User", relation: { contains: currentUser.id }}
]
}
});
if (raciAssignment.results.length) {
await notion.pages.update({
page_id: raciAssignment.results[0].id,
properties: {
"Status": { select: { name: "Completed" }},
"Completion Date": { date: { start: new Date().toISOString().split('T')[0] }}
}
});
}
// Log audit event
await logAuditEvent("Complete", "Task", taskData.id, taskName, { status: "In Progress" }, { status: "Done" });
return `
β
Task Completed!
Task: ${taskName}
Completed: ${new Date().toLocaleString()}
Great work! Your task list has been updated.
`;
Block a Task
/10x-member block "Database Migration" --reason "Waiting for credentials"
Update Task Progress
/10x-member update "API Design" --status "In Progress"
/10x-member update "API Design" --progress 50
Progress Dashboard
View My Progress
/10x-member progress
/10x-member progress --week
/10x-member progress --month
Implementation:
const currentUser = await getCurrentUser();
const period = $ARGUMENTS.includes("--month") ? 30 : $ARGUMENTS.includes("--week") ? 7 : 7;
const since = new Date();
since.setDate(since.getDate() - period);
const sinceStr = since.toISOString().split('T')[0];
// Get completed tasks
const completedTasks = await notion.databases.query({
database_id: tasksDbId,
filter: {
and: [
{ property: "Assigned To", relation: { contains: currentUser.id }},
{ property: "Status", select: { equals: "Done" }},
{ property: "Date", date: { on_or_after: sinceStr }}
]
}
});
// Get all tasks in period
const allTasks = await notion.databases.query({
database_id: tasksDbId,
filter: {
and: [
{ property: "Assigned To", relation: { contains: currentUser.id }},
{ property: "Date", date: { on_or_after: sinceStr }}
]
}
});
// Get goals progress
const goals = await notion.databases.query({
database_id: goalsDbId,
filter: {
and: [
{ property: "Owner", relation: { contains: currentUser.id }},
{ property: "Status", select: { does_not_equal: "Completed" }},
{ property: "Status", select: { does_not_equal: "Abandoned" }}
]
}
});
// Calculate metrics
const completionRate = allTasks.results.length > 0 ?
Math.round((completedTasks.results.length / allTasks.results.length) * 100) : 0;
const avgGoalProgress = goals.results.length > 0 ?
Math.round(goals.results.reduce((sum, g) => sum + (g.properties.Progress?.number || 0), 0) / goals.results.length) : 0;
// On-time vs late
let onTime = 0, late = 0;
for (const task of completedTasks.results) {
const dueDate = task.properties.Date?.date?.start;
const completedDate = task.last_edited_time.split('T')[0];
if (dueDate && completedDate > dueDate) {
late++;
} else {
onTime++;
}
}
const userName = currentUser.properties.Name.title[0].plain_text;
const skillId = currentUser.properties["Skill ID"]?.rich_text?.[0]?.plain_text;
return `
π Progress Dashboard - ${userName} (${skillId})
Period: Last ${period} days
π TASK COMPLETION
Completed: ${completedTasks.results.length}/${allTasks.results.length} tasks (${completionRate}%)
${"β°".repeat(Math.floor(completionRate/10))}${"β±".repeat(10-Math.floor(completionRate/10))}
On-time: ${onTime} | Late: ${late}
${late === 0 ? "π Perfect timing!" : late <= 2 ? "π Good job!" : "β οΈ Consider time management"}
π― GOALS PROGRESS
Active Goals: ${goals.results.length}
Average Progress: ${avgGoalProgress}%
${"β°".repeat(Math.floor(avgGoalProgress/10))}${"β±".repeat(10-Math.floor(avgGoalProgress/10))}
${goals.results.slice(0, 5).map(g =>
` β’ ${g.properties.Name.title[0].plain_text}: ${g.properties.Progress?.number || 0}%`
).join('\n')}
π PRODUCTIVITY SCORE: ${Math.round((completionRate * 0.6) + (avgGoalProgress * 0.4))}/100
`;
Profile Management
View My Profile
/10x-member profile
Update Profile
/10x-member profile --update --timezone "UTC+5:30" --skills "JavaScript, Python"
Acknowledge RACI Assignment
/10x-member acknowledge "Project Alpha - Design Review"
Implementation:
const assignmentName = $ARGUMENTS.match(/acknowledge\s+"([^"]+)"/)?.[1];
const currentUser = await getCurrentUser();
const assignment = await notion.databases.query({
database_id: raciAssignmentsDbId,
filter: {
and: [
{ property: "Name", title: { contains: assignmentName }},
{ property: "User", relation: { contains: currentUser.id }}
]
}
});
if (!assignment.results.length) {
return `Assignment "${assignmentName}" not found`;
}
await notion.pages.update({
page_id: assignment.results[0].id,
properties: {
"Acknowledged": { checkbox: true },
"Acknowledged Date": { date: { start: new Date().toISOString().split('T')[0] }}
}
});
return `
β
Assignment Acknowledged!
Assignment: ${assignmentName}
RACI Role: ${assignment.results[0].properties["RACI Type"].select.name}
Acknowledged: ${new Date().toLocaleString()}
`;
Troubleshooting
"Task not found in your assignments"
β Check the exact task name
β Verify you're assigned to the task
"You need to complete your daily check-in"
β Run /10x-member check-in to create today's check-in
"Profile update failed"
β Some fields may require Admin permissions to update
β Contact your Admin for assistance
Version
Skill Version: 2.0.0
Required Role: Member (all commands)
Compatible with: Notion MCP Server 1.0+
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.