Project Files
PLAN.md
Stworzenie pluginu do ekosystemu LM Studio, który umożliwia modelom LLM tworzenie, odczyt, zarządzanie i modyfikację danych w plikach .csv oraz strukturach bazodanowych. Plugin działa jako Tools Provider — udostępnia modelowi zestaw narzędzi do operacji na danych.
Przykład użycia: Model może stworzyć bazę "Postacie z serialu", gdzie każda postać ma osobną tabelę (plik .csv) — np. walter-white.csv, jesse-pinkman.csv, saul-goodman.csv — i zarządzać ich danymi (dodawanie atrybutów, edycja, filtrowanie).
DataPlugin/ ├── plugin.json # Manifest LM Studio pluginu ├── package.json # Zależności (csv-parse, csv-stringify, itp.) ├── tsconfig.json ├── src/ │ ├── index.ts # Entry point — exports activate() │ ├── tools/ # Tool definitions dla LM Studio │ │ ├── index.ts # Re-export wszystkich narzedzi │ │ ├── database.tool.ts # Narzedzia zarzadzania bazami (create, list, delete) │ │ ├── table.tool.ts # Narzedzia zarzadzania tabelami (create, list, delete, schema) │ │ ├── crud.tool.ts # Narzedzia CRUD (insert, select, update, delete records) │ │ └── query.tool.ts # Narzedzia zaawansowane (filter, sort, search, aggregate) │ ├── engine/ # Silnik danych │ │ ├── index.ts │ │ ├── csv-engine.ts # Operacje CSV (parse, stringify, append, edit) │ │ ├── schema.ts # Zarzadzanie schema (definicje kolumn, typy) │ │ └── index-manager.ts # Indeksowanie / szybki lookup po kluczach │ ├── config.ts # Konfiguracja pluginu (sciezka do data-root) │ └── types.ts # Typy TypeScript ├── shared/ # Wspolny pakiet (jesli wyodrebniony) │ ├── package.json │ ├── tsconfig.json │ └── src/ │ └── index.ts # Utility współdzielone └── tests/ ├── csv-engine.test.ts └── tools.test.ts
| Komponent | Rola |
|---|---|
| Tools Provider | Główny — udostępnia modelowi narzędzia do zarządzania danymi |
| Custom Configuration | Panel ustawień: ścieżka katalogu roboczego, delimiter CSV, encoding |
plugin.json)| Tool | Opis | Parametry |
|---|---|---|
create_database | Tworzy nowy katalog bazy danych | name: string |
list_databases | Listuje wszystkie bazy | — |
delete_database | Usuwa bazÄ™ i wszystkie jej pliki | name: string |
get_database_info | Metadane bazy (liczba tabel, rozmiar) | name: string |
| Tool | Opis | Parametry |
|---|---|---|
create_table | Tworzy nowÄ… tabelÄ™ (plik .csv) ze schemÄ… | database: string, table: string, columns: ColumnDef[] |
list_tables | Listuje tabele w bazie | database: string |
delete_table | Usuwa tabelÄ™ | database: string, table: string |
get_table_schema | Zwraca definicjÄ™ kolumn tabeli | database: string, table: string |
| Tool | Opis | Parametry |
|---|---|---|
insert_row | Dodaje wiersz danych | database, table, data: Record<string, any> |
insert_rows | Dodaje wiele wierszy (batch) | database, table, rows: Record<string, any>[] |
select_rows | Pobiera wiersze (z opcjonalnym filtrem) | database, table, filter?, limit?, offset? |
update_row | Aktualizuje wiersz po ID | database, table, id, data: Partial<Record<string, any>> |
delete_row | Usuwa wiersz po ID | database, table, id |
get_row | Pobiera pojedynczy wiersz | database, table, id |
| Tool | Opis | Parametry |
|---|---|---|
query_table | Zaawansowane zapytanie (filter, sort, search) | database, table, filters[], sort?, search?, limit?, offset? |
aggregate_table | Agregacje (count, sum, avg, min, max) | database, table, column, operation |
csv-parse z wykrywaniem nagłówkówcsv-stringify z proper quoting/escapingKażda tabela ma plik <nazwa>.schema.json:
.meta.json na poziomie bazy przechowuje indeks tabel i statystykisrc/engine/)src/tools/)database.tool.ts — createDatabase, listDatabases, deleteDatabasetable.tool.ts — createTable, listTables, deleteTable, getTableSchemacrud.tool.ts — insertRow, selectRows, updateRow, deleteRowconfig.ts — zarządzanie ścieżką data-root, delimiterem CSVplugin.jsonlsp_diagnostics cleanlms devUser prompt: "Stwórz bazę 'breaking-bad' i dodaj tabelę dla Waltera White'a z kolumnami: imię, wiek, zawód, pierwszy odcinek"
| Pakiet | Wersja | Zastosowanie |
|---|---|---|
@lmstudio/sdk | ^1.x | SDK LM Studio dla pluginów |
csv-parse | ^5.x | Parsowanie plików CSV |
csv-stringify | ^6.x | Generowanie plików CSV |
uuid | ^10.x | Generowanie ID dla wierszy |
.git (odłączyć od oryginalnego repozytorium)package.json root — nazwa na data-plugin, usunąć niepotrzebne workspace'ycsv-parse, csv-stringify, uuid, @lmstudio/sdk@types/node, @types/uuidplugin.jsonapps/example-extension i packages/sharedsrc/csv-engine.ts — funkcje: parseCSV, stringifyCSV, appendToCSV, readCSV, writeCSVschema.ts — funkcje: loadSchema, saveSchema, validateRowAgainstSchemaindex-manager.ts — funkcje: getIndex, updateIndex, getDatabases, getTablesquery.tool.ts — queryTable, aggregateTableactivate(){
"name": "data-plugin",
"version": "0.1.0",
"description": "Create, read, and manage CSV databases — multiple databases, multiple tables",
"entry": "./dist/index.js",
"type": "plugin",
"capabilities": {
"tools": true,
"configuration": true
},
"runner": "node",
"permissions": {
"filesystem": "readwrite"
}
}
<data-root>/
├── databases/
│ ├── postacie-z-serialu/
│ │ ├── .meta.json # Metadane bazy
│ │ ├── walter-white.csv # Tabela: Walter White
│ │ ├── walter-white.schema.json # Definicja kolumn
│ │ ├── jesse-pinkman.csv
│ │ └── jesse-pinkman.schema.json
│ └── inventory/
│ ├── .meta.json
│ ├── products.csv
│ └── products.schema.json
└── data-plugin.config.json # Globalna konfiguracja
{
"columns": [
{ "name": "id", "type": "string", "primaryKey": true },
{ "name": "name", "type": "string", "required": true },
{ "name": "age", "type": "number" },
{ "name": "occupation", "type": "string" },
{ "name": "firstEpisode", "type": "string" },
{ "name": "isAlive", "type": "boolean" }
],
"createdAt": "2026-06-11T12:00:00Z",
"description": "Main character data table"
}
1. LLM wywołuje create_database("breaking-bad")
→ Silnik tworzy katalog databases/breaking-bad/ + .meta.json
2. LLM wywołuje create_table("breaking-bad", "walter-white", [
{ name: "id", type: "string", primaryKey: true },
{ name: "name", type: "string" },
{ name: "age", type: "number" },
{ name: "occupation", type: "string" },
{ name: "firstEpisode", type: "string" }
])
→ Silnik tworzy walter-white.csv (nagłówki) + walter-white.schema.json
3. LLM wywołuje insert_row("breaking-bad", "walter-white", {
id: "ww-001",
name: "Walter White",
age: 50,
occupation: "Chemistry teacher",
firstEpisode: "S01E01"
})
→ Silnik dopisuje wiersz do CSV
4. LLM wywołuje select_rows("breaking-bad", "walter-white", { filter: { age: 50 } })
→ Silnik parsuje CSV, filtruje i zwraca wynik