UNPKG

loopme

Version:

A powerful markdown-based workspace and knowledge management system with Git integration

386 lines (282 loc) 9.55 kB
# LoopMe A powerful markdown-based workspace and knowledge management system with Git integration. ## ✨ Features - 📝 **Markdown-First**: Organize your documents using markdown files with frontmatter metadata - 🗂️ **Smart Workspaces**: Automatically organize files into workspaces based on frontmatter - 🔄 **Git Integration**: Full version control support with commit history and diff viewing - 🎨 **Rich Editor**: Built-in Milkdown editor with live preview - 🚀 **Fast Search**: Powerful file search using ripgrep - 🔧 **RESTful API**: Comprehensive V1 API for all operations - 💾 **Local Storage**: Settings stored locally for better performance ## 📦 Installation ```bash npm install -g loopme ``` ## 🚀 Quick Start ### Start the server ```bash loopme start # or simply loopme ``` The server will start on port 7788 by default. Open your browser and navigate to: - Frontend: http://localhost:7788 - API Documentation: http://localhost:7788/api-docs ### Command Line Options ```bash loopme --help # Show help loopme --version # Show version loopme start # Start the server (default) ``` ### Environment Variables ```bash PORT=8080 loopme # Use custom port (default: 7788) STORAGE_DIR=/path/to/files loopme # Set storage directory ``` ## 📚 Usage ### Creating Files 1. Navigate to the Explore page 2. Click "New Item" in any workspace 3. Files are automatically created with timestamps as filenames ### Managing Workspaces Workspaces are automatically created based on the `workspace` field in markdown frontmatter: ```markdown --- workspace: my-project title: My Document --- # Content here ``` ### Transferring Files Files can be transferred between workspaces using the transfer button: 1. Click the transfer icon next to any file 2. Select target workspace or create a new one 3. File's frontmatter is automatically updated ### Archiving Files Archive files by removing them from workspaces: 1. Click the archive button on any file 2. The file's workspace frontmatter is removed 3. File remains in the filesystem but not shown in workspaces ## 🛠️ API LoopMe provides a comprehensive RESTful API: ### V1 Endpoints - `GET /api/v1/workspaces` - List all workspaces - `GET /api/v1/files/markdown` - Get markdown files - `PUT /api/v1/files/markdown` - Save markdown files - `PUT /api/v1/files/markdown/frontmatter` - Update frontmatter - `DELETE /api/v1/files/markdown/frontmatter` - Delete frontmatter fields ### Example ```javascript // Get all workspaces fetch('http://localhost:7788/api/v1/workspaces') .then(res => res.json()) .then(data => console.log(data)); ``` ## 🏗️ Development ### Prerequisites - Node.js >= 18 - npm >= 9 ### Local Development ```bash # Clone the repository git clone https://github.com/develop-loop/loopme2.ai.git cd loopme2.ai # Install dependencies npm install # Start development servers npm run dev ``` This starts: - Frontend dev server on http://localhost:3000 - Backend dev server on http://localhost:7788 ### Building ```bash npm run build:dist ``` ### Testing ```bash npm test ``` ## 🏗️ Architecture ### Frontend (client/) - **Framework:** Next.js 15 with TypeScript - **Styling:** Tailwind CSS 4 - **Features:** App Router, Turbopack, ESLint ### Backend (server/) - **Framework:** NestJS with TypeScript - **Features:** REST API, CORS enabled, modular architecture - **Port:** 3001 ### Shared (shared/) - **Types:** Common interfaces and types - **DTOs:** Data Transfer Objects with validation - **Constants:** API endpoints, HTTP status codes, etc. ## Key Features - 🎯 **Type Safety:** End-to-end TypeScript with shared types - 🚀 **Fast Development:** Hot reloading for both frontend and backend - 📦 **Monorepo:** Efficient dependency management with npm workspaces - 🔄 **Code Sharing:** Common types and utilities across applications - 🎨 **Modern Stack:** Latest versions of Next.js and NestJS - 🌐 **No CORS Issues:** Frontend proxies API requests to backend ## API Endpoints Backend serves all endpoints under `/api` prefix: ### General - `GET /api` - Welcome message - `GET /api/health` - Health check ### Users - `GET /api/users` - Get all users - `POST /api/users` - Create user - `GET /api/users/:id` - Get user by ID - `PUT /api/users/:id` - Update user - `DELETE /api/users/:id` - Delete user ### Files - `GET /api/files?file_paths=["file.txt"]` - Get files content (always returns list format) - `GET /api/files?file_paths=["a.txt","b.txt"]` - Get multiple files content - `GET /api/files?file_paths=["file.txt"]&metadata_only=true` - Get file metadata only - `PUT /api/files?file_path=path` - Create or update file - `DELETE /api/files?file_path=path` - Delete file **File paths examples:** - Single file: `?file_paths=["test.txt"]` → Returns `{ files: [...], total_count: 1, success_count: 1, error_count: 0 }` - Multiple files: `?file_paths=["file1.txt","folder/file2.txt"]` → Returns list format with all files - With encoding: `?file_paths=["file.txt"]&encoding=base64` - Metadata only: `?file_paths=["file.txt"]&metadata_only=true` **Response format:** ```json { "success": true, "data": { "files": [{ "file_name": "test.txt", "content": "...", ... }], "total_count": 1, "success_count": 1, "error_count": 0, "errors": [] } } ``` **Note:** - Backend serves at: `http://localhost:3001/api/*` - Frontend proxies `/api/*` to `http://localhost:3001/api/*` ## API Documentation Interactive Swagger documentation is available when running the server: ### Development Environment ``` http://localhost:3001/api/docs ``` ### Production/CLI Environment ``` http://localhost:7788/api/docs ``` The Swagger UI provides: - Complete API endpoint documentation - Request/response schemas - Interactive testing interface - Authentication support (if configured) ## 📝 Configuration Settings are stored in browser localStorage: - **Draft Path**: Default location for new files (default: `./drafts`) Access settings at: http://localhost:7788/settings/explore ## 🤝 Contributing Contributions are welcome! Please feel free to submit a Pull Request. 1. Fork the repository 2. Create your feature branch (`git checkout -b feature/AmazingFeature`) 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) 4. Push to the branch (`git push origin feature/AmazingFeature`) 5. Open a Pull Request ## 📄 License This project is licensed under the MIT License. ## 🐛 Issues Found a bug or have a suggestion? Please open an issue at [GitHub Issues](https://github.com/develop-loop/loopme2.ai/issues). ## 🙏 Acknowledgments - Built with [Next.js](https://nextjs.org/) - Backend powered by [NestJS](https://nestjs.com/) - Editor powered by [Milkdown](https://milkdown.dev/) - Search powered by [ripgrep](https://github.com/BurntSushi/ripgrep) --- Made with ❤️ by LoopMe Contributors ## Development vs Production ### Development Mode - Frontend: Next.js dev server on port 3000 - Backend: NestJS dev server on port 3001 - Frontend proxies `/api/*` to backend ```bash npm run dev ``` ### Production Mode - Single NestJS server serves everything on port 7788 - Static frontend files are served by NestJS - API endpoints available at `/api/*` ```bash npm run build:dist ./cli/index.js ``` ## Publishing to NPM 1. **Build the package:** ```bash npm run build:dist ``` 2. **Check the build:** ```bash ./scripts/publish.sh ``` 3. **Publish to npm:** ```bash npm publish ``` ## Environment Variables ### Development Create `.env.local` files as needed: #### Client (.env.local) ```env NEXT_PUBLIC_API_URL=http://localhost:3001 ``` #### Server (.env) ```env PORT=3001 CLIENT_URL=http://localhost:3000 ``` ### Production (CLI) ```env PORT=7788 # Server port (default: 7788) NODE_ENV=production # Automatically set by CLI ``` ## Shared Types & API Client The project includes shared TypeScript types and a ready-to-use API client for type-safe frontend-backend communication. ### Usage in Frontend ```typescript import { FilesApiClient, GetFilesResponse } from '@shared/index'; // Create API client const filesApi = new FilesApiClient('/api'); // Type-safe API calls const response: GetFilesResponse = await filesApi.getFile('test.txt'); const multipleFiles = await filesApi.getFiles({ file_paths: ['file1.txt', 'file2.txt'], encoding: 'text' }); // Save file with full type safety await filesApi.saveFile({ file_path: 'new-file.txt', content: 'Hello World', commit_message: 'Create new file' }); ``` ### Shared Types Include - **Request/Response Types**: `GetFilesRequest`, `SaveFileRequest`, etc. - **Data Models**: `FileInfo`, `MultipleFilesResponse`, etc. - **API Client**: `FilesApiClient` with all methods - **Common Types**: `ApiResponse`, `User`, etc. ### Benefits - ✅ **Type Safety**: IntelliSense and compile-time checks - ✅ **Consistency**: Same types across frontend and backend - ✅ **DX**: Better developer experience with autocomplete - ✅ **Maintainability**: Single source of truth for API contracts ## File Storage ### Development Environment - **Required**: Must set `STORAGE_DIR` environment variable - **Example**: `STORAGE_DIR=/path/to/files npm run dev` - **Error**: Server will fail to start without `STORAGE_DIR` in development ### Production/CLI Environment - **Default**: Current working directory where CLI is executed - **Example**: ```bash # Files stored in current directory loopme3 ```