-
Notifications
You must be signed in to change notification settings - Fork 7
feat: implement contributing guide #5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
tryajitiono-ab
merged 10 commits into
AccelByte:main
from
tryajitiono-ab:test-implement-with-agent
Feb 10, 2026
Merged
Changes from all commits
Commits
Show all changes
10 commits
Select commit
Hold shift + click to select a range
d35caa6
feat: init AI contribution
tryajitiono-ab b8ed4d9
chore: update README.md
tryajitiono-ab a0d6ba9
feat: implement contributing guide
tryajitiono-ab 2fd884c
fix icon
tryajitiono-ab e27c3f9
refactor a bit
tryajitiono-ab c80067c
test commit to trigger action
tryajitiono-ab efb7823
Merge branch 'main' into test-implement-with-agent
tryajitiono-ab c276bd0
run build in validate command
tryajitiono-ab a054a6f
chore: unnecessary css since we already hide it from props
tryajitiono-ab 0f15557
fix: address feedback
tryajitiono-ab File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,41 @@ | ||
| --- | ||
| name: contribute | ||
| description: Implement design from a screenshot or a definition. Use model Claude Sonnet 4.5 for this task. | ||
| --- | ||
|
|
||
| # Contribute | ||
|
|
||
| ## Overview | ||
|
|
||
| Implements a design from a screenshot or a definition in a Extend Apps Directory structure. | ||
|
|
||
| ## When to Use | ||
|
|
||
| Use this skill when: | ||
|
|
||
| - You want to contribute to Extend Apps Directory. | ||
| - You are not familiar on how to contribute to Extend Apps Directory. | ||
|
|
||
| ## Implementation Principles | ||
|
|
||
| 1. Always follow semantic HTML. | ||
| 2. DO NOT SKEW FROM THE DESIGN. Use exactly the same style _per element_. There may be flaws in the design, but it is what it is. | ||
| 3. DO NOT CREATE ADDITIONAL FILES that are otherwise not required. Focus on the given task at hand. | ||
| 4. If the prompt specifies a file (or files) that already exists, do not recreate them. | ||
| 5. When running a code snippet (command line), use the following as terminal preference: | ||
| 1. Windows: Powershell 7. | ||
| 2. \*nix: Zsh. | ||
| 6. Implement responsive design with mobile-first approach using CSS media queries. | ||
| 7. For texts in the design, COPY THEM WORD FOR WORD. Do not deviate the text content from the design. Ensure that this not only covers a "free text", but also texts inside cards and text inside buttons. Ensure that there are no missing elements. | ||
|
|
||
| ## Instructions | ||
|
|
||
| Make sure to keep the implementation principles above in mind when doing these steps. | ||
|
|
||
| ### Step 0: Verify requirements | ||
|
|
||
| Ensure that you can establish connection to Figma MCP Server according [to the guide](https://developers.figma.com/docs/figma-mcp-server/remote-server-installation/#claude-code). If there is no MCP server named "figma", terminate the action. | ||
|
|
||
| ### Step 1: Implement the features | ||
|
|
||
| Use the resources obtained from Figma MCP server to implement each of the sections. Ensure high quality of the implementation and it's pixel-perfect to what's provided in the design. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| --- | ||
| name: create-plan | ||
| description: "Create a detailed design plan from a raw plan." | ||
| --- | ||
|
|
||
| # Plan | ||
|
|
||
| ## Overview | ||
|
|
||
| Reads a file from `.claude/raw-plans` and creates a detailed plan in `.claude/plans` with the same file base name. | ||
|
|
||
| ## When to Use | ||
|
|
||
| Use this skill when: | ||
|
|
||
| - You want to contribute to Extend Apps Directory. | ||
| - You are not familiar on how to contribute to Extend Apps Directory. | ||
| - You want to make sure that your AI-assisted development can be as accurate as possible (reducing back and forth). | ||
|
|
||
| ## Flow | ||
|
|
||
| Given a file name in the format of `.claude/raw-plans/{name}.md`, read that high-level plan and convert it into a detailed plan `.claude/plans/{name}.md`. Use all of the information in the raw plans and use it into the final plan. The final plan should contain these sections: | ||
|
|
||
| 1. Overview: an outline of the file. | ||
| 2. Module breakdown (non-technical): visual elements, assets required, questions. | ||
| 3. Module breakdown (technical): per-section high-level implementation detail. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,41 @@ | ||
| # Extend Apps Directory | ||
|
|
||
| ## Prerequisites | ||
|
|
||
| - Node.js LTS version, ideally v24 | ||
| - Yarn modern (_with_ Corepack) | ||
|
|
||
| Always start with `yarn` in the root project to install the dependencies before you run any scripts in `package.json`, if you haven't already. | ||
|
|
||
| ## Conventions | ||
|
|
||
| - Use React for the UI library. | ||
| - Use Bootstrap utility classes, such as `d-flex` or `m-4` to style components. | ||
| - Use Ant Design library for the UI components. | ||
| - Always generate formatted code with Prettier. | ||
| - When generating JavaScript syntaxes, use the syntaxes available from the `module` field from the currently used `tsconfig.json`. | ||
| - For styling, follow these order: | ||
| - If possible to be styled built-in with Ant Design, use it. | ||
| - If the Ant Design style can't be overridden with Bootstrap class, then create a `*.module.css` file CLOSE TO THE component that uses it (in the same folder as the component). Sometimes it needs `!important` to override Ant Design styles, only use it when it can't be overridden in a "normal way" (e.g. using higher CSS selector specificity). | ||
| - When running a code snippet (command line), use the following as terminal preference: | ||
| - Windows: Powershell 7. | ||
| - \*nix: Bash/Zsh. | ||
| - When it comes to naming variables: | ||
| - Make sure booleans always start with `is`, `has`, or `can`. For example: `isModalOpen`, `hasQueryParameter`, `canUpdate`. | ||
| - Make sure functions always start with a verb or if it returns boolean, use boolean-y name. For example: `showModal()`, `hasQueryParameter()`. | ||
|
|
||
| ### React-specific conventions | ||
|
|
||
| - When hiding modals, prefer using `open` prop as opposed to returning `null`. For example: | ||
|
|
||
| ```tsx | ||
| // Don't do this: | ||
| if (!isOpen) return null | ||
|
|
||
| // Instead: | ||
| <Modal open={isOpen} /> | ||
| ``` | ||
|
|
||
| ## Testing | ||
|
|
||
| Run `yarn prebuild && yarn typecheck` from the root project. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| @AGENTS.md |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,73 @@ | ||
| .modal { | ||
| max-width: 100%; | ||
| } | ||
|
|
||
| @media (min-width: 768px) { | ||
| .modal { | ||
| width: 640px !important; | ||
| } | ||
| } | ||
|
|
||
| .modalHeader { | ||
| gap: 12px; | ||
| padding: 20px 24px; | ||
| border-bottom: 1px solid #f0f0f0; | ||
| } | ||
|
|
||
| .modalTitle { | ||
| margin: 0px !important; | ||
| } | ||
|
|
||
| .modalContent { | ||
| padding: 24px; | ||
| } | ||
|
|
||
| .instructionsList { | ||
| margin: 0; | ||
| padding-left: 20px; | ||
| color: #000000a6; | ||
| } | ||
|
|
||
| .instructionsList li { | ||
| margin-bottom: 0; | ||
| line-height: 32px; | ||
| } | ||
|
|
||
| .instructionsList ol { | ||
| margin-top: 0; | ||
| margin-bottom: 0; | ||
| } | ||
|
|
||
| .instructionsList ol li { | ||
| line-height: 32px; | ||
| } | ||
|
|
||
| .instructionsList a { | ||
| text-decoration: underline; | ||
| } | ||
|
|
||
| @media (max-width: 480px) { | ||
| :global(.ant-modal), | ||
| :global(.ant-modal-content) { | ||
| height: 100%; | ||
| width: 100vw; | ||
| margin: 0px !important; | ||
| top: 0px; | ||
| } | ||
|
|
||
| :global(.ant-modal-content) { | ||
| border-radius: 0px !important; | ||
| } | ||
|
|
||
| :global(.ant-modal-body) { | ||
| height: 100%; | ||
| } | ||
|
|
||
| .modalTitle { | ||
| font-size: 20px !important; | ||
| } | ||
|
|
||
| .modalContent { | ||
| min-height: 100vh; | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,129 @@ | ||
| import { CloseOutlined, ExportOutlined, VideoCameraFilled } from '@ant-design/icons' | ||
| import { Alert, Button, Modal, Typography } from 'antd' | ||
| import { useEffect } from 'react' | ||
| import { useSearchParams } from 'react-router-dom' | ||
| import styles from './ContributingGuideModal.module.css' | ||
| import { CONTRIBUTING_GUIDELINE_MODAL_QUERY_PARAMETER } from '~/types/ui' | ||
|
|
||
| const { Title, Paragraph, Text } = Typography | ||
|
|
||
| // External link constants | ||
| const LINKS = { | ||
| PUBLIC_FOLDER: 'https://github.com/AccelByte/extend-apps-directory/tree/main/public', | ||
| JSON_DATA: 'https://github.com/AccelByte/extend-apps-directory/blob/main/app/data/extend-apps-directory.json', | ||
| REPOSITORY: 'https://github.com/AccelByte/extend-apps-directory', | ||
| VIDEO: 'https://www.youtube.com/watch?v=Y3YU5g6ri5I' | ||
| } as const | ||
|
|
||
| export function ContributingGuideModal() { | ||
| const [searchParams, setSearchParams] = useSearchParams() | ||
| const isModalOpen = searchParams.get(CONTRIBUTING_GUIDELINE_MODAL_QUERY_PARAMETER) === 'true' | ||
|
|
||
| useEffect(() => { | ||
| // Track modal view with Google Analytics | ||
| if (isModalOpen && window.gtag) { | ||
| window.gtag('event', 'view_contributing_guide', { | ||
| event_category: 'engagement', | ||
| event_label: 'Contributing Guide Modal Opened' | ||
| }) | ||
| } | ||
| }, [isModalOpen]) | ||
|
|
||
| const handleClose = () => { | ||
| searchParams.delete(CONTRIBUTING_GUIDELINE_MODAL_QUERY_PARAMETER) | ||
| setSearchParams(searchParams, { preventScrollReset: true }) | ||
| } | ||
|
|
||
| return ( | ||
| <Modal | ||
| open={isModalOpen} | ||
| className={styles.modal} | ||
| styles={{ content: { padding: 0 } }} | ||
| okButtonProps={{ hidden: true }} | ||
| cancelButtonProps={{ hidden: true }} | ||
| onCancel={handleClose} | ||
| closeIcon={null} | ||
| width={640} | ||
| > | ||
| <div className={`d-flex align-items-center justify-content-between ${styles.modalHeader}`}> | ||
| <Title level={4} className={styles.modalTitle}> | ||
| Submit your app | ||
| </Title> | ||
| <Button style={{ width: 32, height: 32 }} onClick={handleClose}> | ||
| <CloseOutlined aria-label="Close modal" /> | ||
| </Button> | ||
| </div> | ||
| <div className={styles.modalContent}> | ||
| <div className="d-flex flex-column" style={{ gap: 24 }}> | ||
| <div className="d-flex flex-column" style={{ gap: 8 }}> | ||
| <Paragraph style={{ color: '#000000A6', marginBottom: 0 }}> | ||
| Follow these steps to submit a Pull Request (PR) to our team for review and approval: | ||
| </Paragraph> | ||
| <ol className={styles.instructionsList}> | ||
| <li> | ||
| <Text strong>Go public:</Text> Ensure your repository (e.g., GitHub) is set to public. | ||
| </li> | ||
| <li> | ||
| <Text strong>Add app icon:</Text> Upload your icon{' '} | ||
| <a href={LINKS.PUBLIC_FOLDER} target="_blank" rel="noopener noreferrer"> | ||
| <Text strong style={{ color: '#0b6cff' }}> | ||
| here | ||
| </Text> | ||
| </a> | ||
| . Recommended: 512x512px. | ||
| </li> | ||
| <li> | ||
| <Text strong>Register app or suite:</Text> Add your app's details in <Text strong>extend-apps-directory.json</Text>{' '} | ||
| <a href={LINKS.JSON_DATA} target="_blank" rel="noopener noreferrer"> | ||
| <Text strong style={{ color: '#0b6cff' }}> | ||
| here | ||
| </Text> | ||
| </a> | ||
| . | ||
| <ol type="a" style={{ marginTop: 0 }}> | ||
| <li> | ||
| <Text strong>App:</Text> A single app hosted in one repository. | ||
| </li> | ||
| <li> | ||
| <Text strong>Suite:</Text> A collection of multiple related apps (e.g., Gacha Suite). | ||
| </li> | ||
| </ol> | ||
| </li> | ||
| <li> | ||
| <Text strong>Submit PR:</Text> Open a Pull Request to this{' '} | ||
| <a href={LINKS.REPOSITORY} target="_blank" rel="noopener noreferrer"> | ||
| <Text strong style={{ color: '#0b6cff' }}> | ||
| repository | ||
| </Text> | ||
| </a> | ||
| , which our team will review. | ||
| </li> | ||
| <li> | ||
| <Text strong>Go live:</Text> Once approved and merged, your app will automatically appear in the directory. | ||
| </li> | ||
| </ol> | ||
| </div> | ||
| <Alert | ||
| type="info" | ||
| icon={<VideoCameraFilled />} | ||
| message={ | ||
| <div className="d-flex align-items-center justify-content-between" style={{ gap: 8 }}> | ||
| <Text>Build your first Extend app in minutes using AI.</Text> | ||
| <Button | ||
| type="primary" | ||
| size="small" | ||
| href={LINKS.VIDEO} | ||
| target="_blank" | ||
| rel="noopener noreferrer" | ||
| > | ||
| Watch video <ExportOutlined aria-hidden /> | ||
| </Button> | ||
| </div> | ||
| } | ||
| showIcon | ||
| /> | ||
| </div> | ||
| </div> | ||
| </Modal> | ||
| ) | ||
| } |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
just curious, will this convention be applied to this repo only or we can apply it to our other repos? because i've seen a lot of modals in AP are like {isOpen && }
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm kinda hoping we can apply it to other repos because it seems awkward (from my perspective, anyway) if we already define
openprop but we don't want to defineopen={isOpen}.But I'd say it's case-by-case, if the component contains other components, I think
return nullis fine. But if it only contains the modal itself, I think we can just inline it with the prop.Also, Ant Design docs seem to prefer that way, too: https://ant.design/components/modal#modal-demo-basic