Skip to content
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
node_modules

# Output
.output
.vercel
.netlify
.wrangler
/.svelte-kit
/build

# OS
.DS_Store
Thumbs.db

# Env
.env
.env.*
!.env.example
!.env.test

# Vite
vite.config.js.timestamp-*
vite.config.ts.timestamp-*

# Rules

*.mdc
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
engine-strict=true
9 changes: 9 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Package Managers
package-lock.json
pnpm-lock.yaml
yarn.lock
bun.lock
bun.lockb

# Miscellaneous
/static/
17 changes: 17 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"useTabs": true,
"singleQuote": true,
"trailingComma": "none",
"printWidth": 100,
"plugins": [
"prettier-plugin-svelte"
],
"overrides": [
{
"files": "*.svelte",
"options": {
"parser": "svelte"
}
}
]
}
21 changes: 0 additions & 21 deletions LICENSE

This file was deleted.

225 changes: 225 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,225 @@
# Appwrite Cursor Rules Generator

A web application for generating comprehensive Cursor rules (`.mdc` files) for Appwrite development across multiple SDKs and frameworks. This tool helps developers create customized development rules that include best practices, code examples, and guidance for building applications with Appwrite.

## Features

- **Multi-SDK Support**: Generate rules for JavaScript/TypeScript, Python, PHP, Go, Flutter/Dart, Apple, Android, Swift, Kotlin, Ruby, .NET, and React Native
- **Framework-Specific Rules**: Get tailored rules for popular frameworks like Next.js, React, Vue, Svelte, Angular, Astro, Nuxt, Qwik, Solid, and more
- **Feature Selection**: Choose which Appwrite features to include:
- Authentication & Teams
- Database Operations
- Storage Operations
- Functions
- Messaging
- Sites
- Realtime Subscriptions
- MCP (Model Context Protocol) recommendations
- **Export Options**: Copy to clipboard or download as `.mdc` file
- **Best Practices**: Generated rules include comprehensive best practices, multi-tenancy patterns, and security guidelines

## Supported SDKs and Frameworks

| SDK | Frameworks |
|-----|------------|
| JavaScript/TypeScript | Next.js, React, Vue, Svelte, Angular, Astro, Nuxt, Qwik, Solid, TanStack, Node.js, Vanilla |
| React Native | React Native, Vanilla |
| Python | Flask, Django, FastAPI, Server |
| Flutter/Dart | Flutter, Server |
| Apple | Vanilla |
| Android | Vanilla |
| Swift | Server, Vanilla |
| Kotlin | Server, Vanilla |
| PHP | Laravel, Symfony, Server |
| Go | Gin, Fiber, Server |
| Ruby | Rails, Server |
| .NET | ASP.NET, Server, Vanilla |

## Getting Started

### Prerequisites

- Node.js 18+
- pnpm

### Installation

1. Clone the repository:
```bash
git clone <repository-url>
cd appwrite-cursor-rules
```

2. Install dependencies:
```bash
pnpm install
```

3. Start the development server:
```bash
pnpm dev
```

4. Open your browser and navigate to `http://localhost:5173` (or the port shown in the terminal)

## Usage

1. **Select SDK**: Choose your preferred Appwrite SDK from the dropdown
2. **Select Framework**: Pick the framework you're using (options depend on the selected SDK)
3. **Choose Features**: Check the boxes for the Appwrite features you want to include in your rules
4. **Generate Rules**: Click the "Generate Rules" button
5. **Export**: Copy the rules to your clipboard or download as a `.mdc` file

The generated rules file can be used in Cursor IDE to provide AI-assisted development guidance specific to your Appwrite setup.

## API Endpoints

The application exposes REST API endpoints for programmatic access to rule generation.

### Get Available SDKs and Frameworks

**GET** `/api/sdks`

Returns a list of all available SDKs, their frameworks, and available features.

**Response:**
```json
{
"sdks": [
{
"id": "javascript",
"name": "JavaScript/TypeScript",
"frameworks": ["nextjs", "react", "vue", ...],
"importSyntax": "import",
"exportSyntax": "export",
"asyncSyntax": "async/await"
},
...
],
"availableFeatures": ["auth", "database", "storage", "functions", "messaging", "sites", "realtime"]
}
```
Comment on lines +85 to +101
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Align /api/sdks response example with actual API (availableFeatures includes "all").

src/routes/api/sdks/+server.js returns availableFeatures including the special "all" value, but the README example omits it. This can confuse API consumers about the supported features values.

Consider updating the example to include "all":

-  "availableFeatures": ["auth", "database", "storage", "functions", "messaging", "sites", "realtime"]
+  "availableFeatures": ["auth", "database", "storage", "functions", "messaging", "sites", "realtime", "all"]
🤖 Prompt for AI Agents
In README.md around lines 85 to 101, the example JSON for the /api/sdks response
omits the special "all" value returned by the real API; update the example
response to include "all" in the availableFeatures array (e.g.,
["auth","database","storage","functions","messaging","sites","realtime","all"])
so the docs match src/routes/api/sdks/+server.js.


### Generate Rules

**GET** `/api/rules`

Generate rules using query parameters.

**Query Parameters:**
- `sdk` (required): SDK identifier (e.g., `javascript`, `python`, `go`)
- `framework` (required): Framework identifier (e.g., `nextjs`, `react`, `flask`)
- `features` (optional): Comma-separated list of features (default: `auth`)
- Available: `auth`, `database`, `storage`, `functions`, `messaging`, `sites`, `realtime`
- Special: `all` - includes all available features
- `mcp` (optional): Include MCP recommendations (`true` or `false`, default: `false`)
- `format` (optional): Response format (`text` or `json`, default: `text`)

**Example:**
```bash
# Get rules as markdown text
curl "http://localhost:5173/api/rules?sdk=javascript&framework=nextjs&features=auth,database&format=text"

# Get all features
curl "http://localhost:5173/api/rules?sdk=javascript&framework=nextjs&features=all"

# Get rules as JSON
curl "http://localhost:5173/api/rules?sdk=python&framework=flask&features=auth,storage&format=json"
```

**Response (format=text):**
- Content-Type: `text/markdown; charset=utf-8`
- Returns the generated rules as markdown text
- Includes `Content-Disposition` header for file download

**Response (format=json):**
```json
{
"sdk": "javascript",
"framework": "nextjs",
"features": ["auth", "database"],
"includeMCP": false,
"rules": "---\ndescription: You are an expert developer...\n---\n\n# Appwrite Development Rules\n..."
}
```

**Error Responses:**
- `400 Bad Request`: Invalid SDK or framework
- `500 Internal Server Error`: Server error during rule generation

**Example Usage:**

```javascript
// Fetch rules using fetch API
const response = await fetch('/api/rules?sdk=javascript&framework=nextjs&features=auth,database');
const rules = await response.text();

// Get all features as JSON
const response = await fetch('/api/rules?sdk=javascript&framework=nextjs&features=all&format=json');
const data = await response.json();
console.log(data.rules);
```

## Development

### Available Scripts

- `pnpm dev` - Start development server
- `pnpm build` - Build for production
- `pnpm preview` - Preview production build
- `pnpm check` - Run Svelte type checking
- `pnpm lint` - Run ESLint and Prettier
- `pnpm format` - Format code with Prettier
- `pnpm generate:nextjs` - Generate Next.js rules file (example script)

### Project Structure

```
appwrite-cursor-rules/
├── src/
│ ├── lib/
│ │ ├── languages/ # SDK and framework-specific code examples
│ │ │ ├── js/ # JavaScript/TypeScript frameworks
│ │ │ ├── python/ # Python frameworks
│ │ │ ├── common/ # Shared rules (products, MCP, etc.)
│ │ │ └── ... # Other SDKs
│ │ ├── rules-generator.js # Main rules generation logic
│ │ └── utils/ # Utility functions
│ └── routes/
│ ├── api/
│ │ ├── rules/
│ │ │ └── +server.js # API endpoint for generating rules
│ │ └── sdks/
│ │ └── +server.js # API endpoint for listing SDKs
│ ├── +page.svelte # Main application page
│ └── +layout.svelte # Layout component
├── scripts/
│ ├── generate-nextjs-rules.js # Example script for generating rules
│ └── lib-loader.js # Module loader for scripts
└── static/ # Static assets
```

### Adding New SDKs or Frameworks

1. Create a new file in `src/lib/languages/[sdk-name]/index.js` (or add to existing SDK directory)
2. Export framework-specific initialization code
3. Add the SDK configuration to `SDK_OPTIONS` in `src/lib/rules-generator.js`
4. Export the SDK module in `src/lib/languages/index.js`

### Adding New Features

1. Create a new section generator function in `src/lib/rules-generator.js` (e.g., `generateNewFeatureSection`)
2. Add the feature to the features array in `src/routes/+page.svelte`
3. Include the feature in the `generateRules` function's Promise.all array

## Generated Rules Format

The generated rules follow the Cursor `.mdc` format and include:

- **Frontmatter**: Metadata about the rules (description, alwaysApply flag)
- **SDK Initialization**: Framework-specific code examples for setting up Appwrite
- **Feature Sections**: Best practices and guidance for selected features
- **Multi-Tenancy Guide**: Comprehensive guide on using teams and permissions
- **Product Links**: Links to official Appwrite documentation


40 changes: 40 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { fileURLToPath } from 'node:url';
import { includeIgnoreFile } from '@eslint/compat';
import js from '@eslint/js';
import svelte from 'eslint-plugin-svelte';
import { defineConfig } from 'eslint/config';
import globals from 'globals';
import ts from 'typescript-eslint';
import svelteConfig from './svelte.config.js';

const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url));

export default defineConfig(
includeIgnoreFile(gitignorePath),
js.configs.recommended,
...ts.configs.recommended,
...svelte.configs.recommended,
{
languageOptions: {
globals: { ...globals.browser, ...globals.node }
},
rules: { // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects.
// see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors
"no-undef": 'off' }
},
{
files: [
'**/*.svelte',
'**/*.svelte.ts',
'**/*.svelte.js'
],
languageOptions: {
parserOptions: {
projectService: true,
extraFileExtensions: ['.svelte'],
parser: ts.parser,
svelteConfig
}
}
}
);
38 changes: 38 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"name": "appwrite-cursor-rules",
"private": true,
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"prepare": "svelte-kit sync || echo ''",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"format": "prettier --write .",
"lint": "prettier --check . && eslint .",
"generate:nextjs": "node --loader ./scripts/lib-loader.js scripts/generate-nextjs-rules.js"
},
"devDependencies": {
"@eslint/compat": "^1.4.0",
"@eslint/js": "^9.39.1",
"@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/kit": "^2.48.5",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
"@types/node": "^22",
"eslint": "^9.39.1",
"eslint-plugin-svelte": "^3.13.0",
"globals": "^16.5.0",
"prettier": "^3.6.2",
"prettier-plugin-svelte": "^3.4.0",
"svelte": "^5.43.8",
"svelte-check": "^4.3.4",
"typescript": "^5.9.3",
"typescript-eslint": "^8.47.0",
"vite": "^7.2.2"
},
"dependencies": {
"@appwrite.io/pink": "^1.0.0"
}
}
Loading