graphql-schema – skill Lập trình cho agent AI
Các mẫu truy vấn, mutation và sinh code GraphQL. Dùng khi tạo thao tác GraphQL, làm việc với Apollo Client hoặc sinh kiểu dữ liệu.
Cài skill graphql-schema bằng một lệnh
Chọn công cụ bạn đang dùng, copy lệnh và dán vào terminal. Skill sẽ nằm trong thư mục skills của công cụ đó và sẵn sàng dùng ở phiên làm việc tiếp theo.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/graphql-schema-2fa70.tgz | tar xz -C ~/.claude/skills
Gọi trong Claude Code: /graphql-schema – rồi mô tả công việc bạn muốn làm.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/graphql-schema-2fa70.tgz | tar xz -C ~/.codex/skills
Gọi trong Codex: $graphql-schema – rồi mô tả công việc bạn muốn làm.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/graphql-schema-2fa70.tgz | tar xz -C ~/.hermes/skills
Gọi trong Hermes Agent: /graphql-schema – rồi mô tả công việc bạn muốn làm.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/graphql-schema-2fa70.tgz | tar xz -C ~/.deepcode/skills
Gọi trong DeepSeek: /graphql-schema – rồi mô tả công việc bạn muốn làm.
Nội dung SKILL.md
Nội dung SKILL.md gốc bằng tiếng Anh.
GraphQL Schema Patterns
When to Use
Use this skill when you need graphQL queries, mutations, and code generation patterns. Use when creating GraphQL operations, working with Apollo Client, or generating types.
Project prerequisites
The .gql/generated-hook conventions and npm scripts are upstream project choices, not Apollo requirements. Confirm the real schema, codegen configuration and installed client version. Fragments reference unbundled UI/helpers; do not claim they compile as-is. In cache.modify, normalize newly returned entities using the installed Apollo cache API rather than appending raw objects blindly.
Core Rules
1. NEVER inline gql literals - Create .gql files
2. ALWAYS run codegen after creating/modifying .gql files
3. ALWAYS add onError handler to mutations
4. Use generated hooks - Never write raw Apollo hooks
File Structure
src/
├── components/
│ └── ItemList/
│ ├── ItemList.tsx
│ ├── GetItems.gql # Query definition
│ └── GetItems.generated.ts # Auto-generated (don't edit)
└── graphql/
└── mutations/
└── CreateItem.gql # Shared mutationsCreating a Query
Step 1: Create .gql file
# src/components/ItemList/GetItems.gql
query GetItems($limit: Int, $offset: Int) {
items(limit: $limit, offset: $offset) {
id
name
description
createdAt
}
}Step 2: Run codegen
npm run gql:typegenStep 3: Import and use generated hook
import { useGetItemsQuery } from './GetItems.generated';
const ItemList = () => {
const { data, loading, error, refetch } = useGetItemsQuery({
variables: { limit: 20, offset: 0 },
});
if (error) return <ErrorState error={error} onRetry={refetch} />;
if (loading && !data) return <LoadingSkeleton />;
if (!data?.items.length) return <EmptyState />;
return <List items={data.items} />;
};Creating a Mutation
Step 1: Create .gql file
# src/graphql/mutations/CreateItem.gql
mutation CreateItem($input: CreateItemInput!) {
createItem(input: $input) {
id
name
description
}
}Step 2: Run codegen
npm run gql:typegenStep 3: Use with REQUIRED error handling
import { useCreateItemMutation } from 'graphql/mutations/CreateItem.generated';
const CreateItemForm = () => {
const [createItem, { loading }] = useCreateItemMutation({
// Success handling
onCompleted: (data) => {
toast.success({ title: 'Item created' });
navigation.goBack();
},
// ERROR HANDLING IS REQUIRED
onError: (error) => {
console.error('createItem failed:', error);
toast.error({ title: 'Failed to create item' });
},
// Cache update
update: (cache, { data }) => {
if (data?.createItem) {
cache.modify({
fields: {
items: (existing = []) => [...existing, data.createItem],
},
});
}
},
});
return (
<Button
onPress={() => createItem({ variables: { input: formValues } })}
isDisabled={!isValid || loading}
isLoading={loading}
>
Create
</Button>
);
};Mutation UI Requirements
CRITICAL: Every mutation trigger must:
1. Be disabled during mutation - Prevent double-clicks
2. Show loading state - Visual feedback
3. Have onError handler - User knows it failed
4. Show success feedback - User knows it worked
// CORRECT - Complete mutation pattern
const [submit, { loading }] = useSubmitMutation({
onError: (error) => {
console.error('submit failed:', error);
toast.error({ title: 'Save failed' });
},
onCompleted: () => {
toast.success({ title: 'Saved' });
},
});
<Button
onPress={handleSubmit}
isDisabled={!isValid || loading}
isLoading={loading}
>
Submit
</Button>Query Options
Fetch Policies
| Policy | Use When |
|--------|----------|
| cache-first | Data rarely changes |
| cache-and-network | Want fast + fresh; select explicitly |
| network-only | Always need latest |
| no-cache | Never cache (rare) |
Common Options
useGetItemsQuery({
variables: { id: itemId },
// Fetch strategy
fetchPolicy: 'cache-and-network',
// Re-render on network status changes
notifyOnNetworkStatusChange: true,
// Skip if condition not met
skip: !itemId,
// Poll for updates
pollInterval: 30000,
});Optimistic Updates
For instant UI feedback:
const [toggleFavorite] = useToggleFavoriteMutation({
optimisticResponse: {
toggleFavorite: {
__typename: 'Item',
id: itemId,
isFavorite: !currentState,
},
},
onError: (error) => {
// Rollback happens automatically
console.error('toggleFavorite failed:', error);
toast.error({ title: 'Failed to update' });
},
});When NOT to Use Optimistic Updates
- Operations that can fail validation
- Operations with server-generated values
- Destructive operations (delete)
- Operations affecting other users
Fragments
For reusable field selections:
# src/graphql/fragments/ItemFields.gql
fragment ItemFields on Item {
id
name
description
createdAt
updatedAt
}Use in queries:
query GetItems {
items {
...ItemFields
}
}Anti-Patterns
// WRONG - Inline gql
const GET_ITEMS = gql`
query GetItems { items { id } }
`;
// CORRECT - Use .gql file + generated hook
import { useGetItemsQuery } from './GetItems.generated';
// WRONG - No error handler
const [mutate] = useMutation(MUTATION);
// CORRECT - Always handle errors
const [mutate] = useMutation(MUTATION, {
onError: (error) => {
console.error('mutation failed:', error);
toast.error({ title: 'Operation failed' });
},
});
// WRONG - Button not disabled during mutation
<Button onPress={submit}>Submit</Button>
// CORRECT - Disabled and loading
<Button onPress={submit} isDisabled={loading} isLoading={loading}>
Submit
</Button>Codegen Commands
# Generate types from .gql files
npm run gql:typegen
# Download schema + generate types
npm run sync-typesIntegration with Other Skills
- react-ui-patterns: Loading/error/empty states for queries
- testing-patterns: Mock generated hooks in tests
- formik-patterns: Mutation submission patterns
Limitations
- Use this skill only when the task clearly matches its upstream source and local project context.
- Verify commands, generated code, dependencies, credentials, and external service behavior before applying changes.
- Do not treat examples as a substitute for environment-specific tests, security review, or user approval for destructive or costly actions.
Skill liên quan
- grok-delegate – Chỉ giao tác vụ lập trình cho Grok Build CLI khi người dùng yêu cầu rõ ràng, trong khi…
- grpc-golang – Xây dựng dịch vụ gRPC sẵn sàng production trong Go với mTLS, streaming và observability…
- hasdata-cli – Truy cập qua dòng lệnh để tìm kiếm, thu thập dữ liệu web và lấy dữ liệu có cấu trúc.
- site-architecture – Khi người dùng muốn kiểm tra, thiết kế lại hoặc lên kế hoạch cấu trúc website, cấu trúc…
- skill-doctor – Dùng khi người dùng muốn chấm điểm thiết lập agent của mình dựa trên lịch sử hội thoại…
- hf-cli – Hướng dẫn upstream được tuyển chọn cho Hf Cli; dùng khi quy trình khớp với mục tiêu của…
- hig-components-controls – Chọn và đánh giá các điều khiển chọn và nhập liệu của Apple: toggle, segmented control…
- skill-tester – Xác thực, kiểm thử và chấm điểm chất lượng các skill trong hệ sinh thái claude-skills…