systa-mcp 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.md +23 -2
  2. package/SKILL.md +190 -55
  3. package/package.json +1 -1
  4. package/server.js +12 -0
package/README.md CHANGED
@@ -101,14 +101,14 @@ claude mcp add systa \
101
101
 
102
102
  ## Araçlar (tools)
103
103
 
104
- Toplam **64 araç** vardır; `tools/list` yanıtı anahtarın kapsamına göre filtrelenir
104
+ Toplam **79 araç** vardır; `tools/list` yanıtı anahtarın kapsamına göre filtrelenir
105
105
  (bkz. "Scope-aware araç listesi"). Aşağıdakiler en sık kullanılan çekirdek araçlardır —
106
106
  tam katalog `list_capabilities` ile keşfedilir.
107
107
 
108
108
  | Araç | Açıklama |
109
109
  | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
110
110
  | `list_requests` | Talepleri listele (limit/offset/search/statusId) — `request.read` |
111
- | `get_request` | Tek bir talebi id ile getir — `request.read` |
111
+ | `get_request` | Tek bir talebi talep numarasıyla getir — `request.tabs.general.view` |
112
112
  | `list_projects` | Projeleri listele — `project.read` |
113
113
  | `create_request` | Talep oluştur (title/description/companyId/statusId/assignedTo) — `request.create` |
114
114
  | `add_request_comment` | Talebe yorum ekle (düz metin otomatik TipTap'e sarılır) — `request.comment.create` + `request.tabs.comments.view` |
@@ -123,6 +123,27 @@ tam katalog `list_capabilities` ile keşfedilir.
123
123
  (örn. `POST /requests`, `POST /requests/42/comments`). Anahtarın scope'u dışındaki
124
124
  çağrılar `403` döner.
125
125
 
126
+ ### Alt form hazırlama
127
+
128
+ Alt form (`sub-forms`), ana talep formu (`form`) ile aynı modül değildir. Ajan önce
129
+ `list_capabilities({module:"sub-forms"})`, ardından kullanacağı uçlar için
130
+ `describe_endpoint` çağırmalıdır. Önerilen taslak akışı:
131
+
132
+ 1. `POST /sub-forms` ile `isPublic:false` bir form kabuğu oluşturun. `parentFormId`
133
+ backend tarafından şirketin aktif talep formundan çözülür; istemci göndermemelidir.
134
+ 2. Bölüm, alan ve kuralları ayrı ayrı yazmak yerine
135
+ `PUT /sub-forms/:id/save` ile tek transaction'da kaydedin. Yeni öğelerde `tempId`,
136
+ alan-bölüm ilişkisinde `sectionTempId` kullanılır; yanıt gerçek id haritalarını verir.
137
+ 3. Kullanım biçimini yalnız `embed` veya `request_attach` binding'iyle tanımlayın.
138
+ 4. `GET /sub-forms/:id/preview` HTML değil `{form, sections, fields, preview:true}`
139
+ JSON payload'ı döndürür. Query/rule/title/correlation test uçları kalıcı ayar yazmaz.
140
+ 5. Taslak özetini kullanıcıya göstermeden ve açık onay almadan publish/public erişim,
141
+ allowed origin, webhook, periodic veya correlation özelliklerini etkinleştirmeyin.
142
+
143
+ Tam alan türleri, atomik save gövdesi, binding kararları ve hata kurtarma akışı paketle
144
+ birlikte kurulan `SKILL.md` içindedir. Sürüm yükselttikten sonra skill'i yenilemek için
145
+ `npx -y systa-mcp@latest --install-skill` komutunu yeniden çalıştırın.
146
+
126
147
  ### Dosya ekleri (download_request_file / upload_file_to)
127
148
 
128
149
  `systa_api_call` JSON-only olduğundan binary taşıyamaz — dosya ekleri için bu iki
package/SKILL.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- version: 1.3.0
2
+ version: 1.4.0
3
3
  name: systa
4
4
  description: |
5
5
  Drive SysTa (Talep Takip Sistemi / SysTa) — a
@@ -15,12 +15,14 @@ description: |
15
15
  "bana/şuna ata", "yorum ekle", "durumu değiştir /
16
16
  tamamla / kapat", "üzerimdeki işler", "proje aç",
17
17
  "kanban kartı ekle", "onaya sun", "onayla/reddet",
18
- "izin talebi", "rapor al / dışa aktar", "sürüm
19
- oluştur". Use when (EN): "create a SysTa request",
18
+ "izin talebi", "alt form hazırla / oluştur", "rapor
19
+ al / dışa aktar", "sürüm oluştur". Use when (EN):
20
+ "create a SysTa request",
20
21
  "log a ticket", "assign / reassign", "add a comment",
21
22
  "move/close the ticket", "show my open work", "create
22
23
  project", "add task card", "request approval",
23
- "approve/reject", "export report", "create release".
24
+ "approve/reject", "design/create a sub-form", "export
25
+ report", "create release".
24
26
  Multi-tenant (vendor schema) aware; resolves names →
25
27
  ids; honors dynamic required fields. NOT for: editing
26
28
  SysTa source code, running psql/DB migrations directly,
@@ -87,6 +89,7 @@ Short shared vocabulary. Use these words with the user; never expose raw REST pa
87
89
  | SLA | SLA | Süre taahhütleri (ilk yanıt, çözüm). Instance bir talebe bağlanır; pause/resume edilebilir. |
88
90
  | Onay | Approval | Toplu onaya gönderme + onayla/reddet; plan onayı ve talep onayı ayrı akışlar. |
89
91
  | Sürüm | Release | Yazılım sürüm yönetimi: liste → item → onay → Go/No-Go → deployment workflow. |
92
+ | Alt form | Sub-form | Talep formuna gömülen veya talep akışına bağlanan, bölüm/alan/kural/binding içeren ek veri toplama şeması. Ana istek formu (`form`) ile aynı şey değildir. |
90
93
  | Vendor şema | Vendor schema | Multi-tenant izolasyon; her vendor ayrı schema (`vendor_xxx`). Public referans alınmaz. |
91
94
 
92
95
  ### Anahtar kelime → modül eşlemesi (keyword index)
@@ -96,56 +99,58 @@ yanıtındaki `glossary` alias'larının ayna kopyasıdır (MCP yokken de geçer
96
99
  ASCII'dir — eşleştirmede aksanı yok say. Modülü bulduktan sonra `describe_module(modül)`
97
100
  veya `describe_endpoint` ile gövdeyi netleştir.
98
101
 
99
- | Doğal dil (alias) | Modül | Birincil giriş |
100
- | ------------------------------------------------------------ | --------------- | ----------------------------------------------------------------------------------------------- |
101
- | talep, talepler, is, destek talebi | request | list_requests / create_request |
102
- | geciken, overdue, gecikmis, sla ihlali, deadline gecmis | request/sla | list_requests(overdue:true / slaBreached:true) |
103
- | toplu guncelle, hepsini, birden cok talep | request | bulk_update_requests |
104
- | kullanici bul, isim cozumle, kime, hangi ahmet | user | resolve_user_by_name / list_users |
105
- | sirket bul, kategori bul, ekip bul, id cozumle, lookup | multiple | list_lookup(kind:'company'/'category'/'team'/...) |
106
- | projeyi klonla, projeyi cogalt, duplicate project | project | duplicate_project |
107
- | snapshot fark, baseline karsilastir, plan diff | plan | compare_plan_baseline |
108
- | yorumlar, ekler, degisiklik gecmisi, denetim | request | list_request_comments / list_request_files / list_request_history |
109
- | yorum yaz, tablo, referans, #125, ##1809, kod blogu, baslik | request | add_request_comment — govde TipTap JSON; tablo/liste commentTextJson ile, referanslar DUZ METIN |
110
- | gorev, task, kart, card | kanban | manage_request_card / move_request_card |
111
- | pano, board, kanban / kolon, column, asama, liste | kanban | get_request_board / create_request_board |
112
- | durum gecisi onizle, izinli gecisler, hangi duruma gecebilir | request | list_allowed_transitions |
113
- | plan modu, sprint kapsami, plan mode setup | plan | create_plan_mode |
114
- | durum, oncelik, atanan, planla, denetim, gecmis | request | get_request / list_requests |
115
- | tahmini efor, planlanan sure (estimatedEffort) | request | update_request (TAHMIN alani, defter DEGIL) |
116
- | efor gir, efor yaz, calistigim sure, efor defteri, mesai | effort | log_effort / list_effort_targets / list_effort_entries |
117
- | eksik efor girisim var mi, efor uyumu | effort | get_effort_compliance |
118
- | proje, klonla | project | list_projects / create_project |
119
- | onaya sunma, snapshot, sprint, sprinti kapat, optimize et | plan | submit_plan_for_approval / create_plan_baseline |
120
- | onay, onayla, reddet | approvals | list_pending_approvals / respond_to_approval |
121
- | onay tipleri, kime onaya gonderelim | approvals | list_approval_types |
122
- | red nedeni, neden reddedildi, gecerli red sebepleri | approvals | list_rejection_reasons |
123
- | bu talep neden dondu, neden yazamiyorum, kilitli alan | approvals | get_request_freeze |
124
- | sla, sure taahhudu | sla | (sla endpoints) |
125
- | release, surum, go/no-go, deployment | release | create_release_list / add_release_item (listeyi ID ile hedefle) |
126
- | surum numarasi, versionLabel, ayni gun iki liste | release | create_release_list -> id + versionLabel (tarih DEGIL) |
127
- | musaitlik, izin (leave), vekil | user/automation | systa_api_call /user-availability, /user-leaves |
128
- | vendor, sirket, musteri | company | systa_api_call GET /companies |
129
- | organizasyon birimi, departman, bolum, birim | department | GET /api/departments |
130
- | takim, ekip, team | team | GET /api/teams |
131
- | yetki paketi, izin (permission) | security | (bundle/permission endpoints) |
132
- | alt form, sub-form | forms | systa_api_call GET /forms/:id |
133
- | rapor, raporlama, disa aktar, export, excel, csv | report | systa_api_call /reports/preview,/reports/export |
134
- | ozel sorgu, sorgu, query builder, ad-hoc, veri cek | query-builder | querybuilder_describe_fields / \_execute_query |
135
- | hesap tablosu, gridpad, tablo, excel, spreadsheet, hucre | spreadsheet | GET /api/spreadsheets |
136
- | dosya, ek, attachment, yukle, upload, indir, download | file | upload_file_to / download_request_file |
137
- | bildirim, notification, uyari, okundu, push | notification | GET /api/notifications |
138
- | yetenek, beceri, skill, otomatik etiketleme | skill | GET /api/skills |
139
- | duyuru, announcement, bildiri, ilan | announcement | GET /api/announcements |
140
- | urun guncellemesi, surum notu, yenilikler, changelog | product-update | GET /api/product-updates |
141
- | not, kisisel not, hatirlatma | note | GET /api/dashboard/notes |
142
- | yer imi, favori, bookmark, kisayol | bookmark | GET /api/dashboard/bookmarks |
143
- | degerlendirme, puanlama, memnuniyet, geri bildirim | ratings | POST /api/ratings |
144
- | anket, oylama, karar alalim, ekibe soralim, secenek sun | decisions | systa_api_call POST /requests/:n/decisions |
145
- | github, repo, pull request, commit, issue aktar | github | systa_api_call /github/me/{connection,repos,import,push} |
146
- | gosterge paneli, dashboard, widget, ozet, grafik, panel | dashboard | GET /api/dashboard/init |
147
-
148
- > Bu tablo, katalogdaki ~25 modülün kullanıcı-yüzeyli olanlarından bir alt küme kapsar. Listede olmayan
102
+ | Doğal dil (alias) | Modül | Birincil giriş |
103
+ | ------------------------------------------------------------ | ----------------- | ----------------------------------------------------------------------------------------------- |
104
+ | talep, talepler, is, destek talebi | request | list_requests / create_request |
105
+ | geciken, overdue, gecikmis, sla ihlali, deadline gecmis | request/sla | list_requests(overdue:true / slaBreached:true) |
106
+ | toplu guncelle, hepsini, birden cok talep | request | bulk_update_requests |
107
+ | kullanici bul, isim cozumle, kime, hangi ahmet | user | resolve_user_by_name / list_users |
108
+ | sirket bul, kategori bul, ekip bul, id cozumle, lookup | multiple | list_lookup(kind:'company'/'category'/'team'/...) |
109
+ | projeyi klonla, projeyi cogalt, duplicate project | project | duplicate_project |
110
+ | snapshot fark, baseline karsilastir, plan diff | plan | compare_plan_baseline |
111
+ | yorumlar, ekler, degisiklik gecmisi, denetim | request | list_request_comments / list_request_files / list_request_history |
112
+ | yorum yaz, tablo, referans, #125, ##1809, kod blogu, baslik | request | add_request_comment — govde TipTap JSON; tablo/liste commentTextJson ile, referanslar DUZ METIN |
113
+ | gorev, task, kart, card | kanban | manage_request_card / move_request_card |
114
+ | pano, board, kanban / kolon, column, asama, liste | kanban | get_request_board / create_request_board |
115
+ | durum gecisi onizle, izinli gecisler, hangi duruma gecebilir | request | list_allowed_transitions |
116
+ | plan modu, sprint kapsami, plan mode setup | plan | create_plan_mode |
117
+ | durum, oncelik, atanan, planla, denetim, gecmis | request | get_request / list_requests |
118
+ | tahmini efor, planlanan sure (estimatedEffort) | request | update_request (TAHMIN alani, defter DEGIL) |
119
+ | efor gir, efor yaz, calistigim sure, efor defteri, mesai | effort | log_effort / list_effort_targets / list_effort_entries |
120
+ | eksik efor girisim var mi, efor uyumu | effort | get_effort_compliance |
121
+ | proje, klonla | project | list_projects / create_project |
122
+ | onaya sunma, snapshot, sprint, sprinti kapat, optimize et | plan | submit_plan_for_approval / create_plan_baseline |
123
+ | onay, onayla, reddet | approvals | list_pending_approvals / respond_to_approval |
124
+ | onay tipleri, kime onaya gonderelim | approvals | list_approval_types |
125
+ | red nedeni, neden reddedildi, gecerli red sebepleri | approvals | list_rejection_reasons |
126
+ | bu talep neden dondu, neden yazamiyorum, kilitli alan | approvals | get_request_freeze |
127
+ | sla, sure taahhudu | sla | (sla endpoints) |
128
+ | release, surum, go/no-go, deployment | release | create_release_list / add_release_item (listeyi ID ile hedefle) |
129
+ | surum numarasi, versionLabel, ayni gun iki liste | release | create_release_list -> id + versionLabel (tarih DEGIL) |
130
+ | musaitlik, uygunluk | user-availability | systa_api_call GET /user-availability |
131
+ | izin (leave), izin hakkı, takım izin takvimi | leave-management | systa_api_call /leave-management, /user-leaves |
132
+ | vekil, delegate, proxy | automation-rules | systa_api_call /automation-rules |
133
+ | vendor, sirket, musteri | company | systa_api_call GET /companies |
134
+ | organizasyon birimi, departman, bolum, birim | company | GET /api/departments |
135
+ | takim, ekip, team | team | GET /api/teams |
136
+ | yetki paketi, izin (permission) | security | (bundle/permission endpoints) |
137
+ | alt form, sub-form, subform, ek form, mini form | sub-forms | systa_api_call GET /sub-forms/:id |
138
+ | rapor, raporlama, disa aktar, export, excel, csv | report | systa_api_call /reports/preview,/reports/export |
139
+ | ozel sorgu, sorgu, query builder, ad-hoc, veri cek | query-builder | querybuilder_describe_fields / \_execute_query |
140
+ | hesap tablosu, gridpad, tablo, excel, gridPad, hucre | gridpad | GET /api/gridpads |
141
+ | dosya, ek, attachment, yukle, upload, indir, download | file | upload_file_to / download_request_file |
142
+ | bildirim, notification, uyari, okundu, push | notification | GET /api/notifications |
143
+ | yetenek, beceri, skill, otomatik etiketleme | skills | GET /api/skills |
144
+ | duyuru, announcement, bildiri, ilan | announcements | GET /api/announcements |
145
+ | urun guncellemesi, surum notu, yenilikler, changelog | product-updates | GET /api/product-updates |
146
+ | not, kisisel not, hatirlatma | dashboard | GET /api/dashboard/notes |
147
+ | yer imi, favori, bookmark, kisayol | dashboard | GET /api/dashboard/bookmarks |
148
+ | degerlendirme, puanlama, memnuniyet, geri bildirim | ratings | POST /api/ratings |
149
+ | anket, oylama, karar alalim, ekibe soralim, secenek sun | decisions | systa_api_call POST /requests/:n/decisions |
150
+ | github, repo, pull request, commit, issue aktar | github | systa_api_call /github/me/{connection,repos,import,push} |
151
+ | gosterge paneli, dashboard, widget, ozet, grafik, panel | dashboard | GET /api/dashboard/init |
152
+
153
+ > Bu tablo, dinamik katalogdaki kullanıcı-yüzeyli modüllerin bir alt kümesini kapsar. Listede olmayan
149
154
  > bir kelime için `list_capabilities` çağır — anahtarının erişebildiği güncel modül/alias
150
155
  > kümesini döndürür (kapsam-filtreli; yetkisiz modül görünmez).
151
156
 
@@ -155,7 +160,7 @@ veya `describe_endpoint` ile gövdeyi netleştir.
155
160
  2. **No jargon.** Don't narrate "calling describe_endpoint", "POST /api/requests", "resolving statusId". Speak in the product's user verbs.
156
161
  3. **Detect language and reply in it.** If the user writes Turkish, answer in Turkish; if English, English. Field keys and enum values passed to the API stay as the API expects (`statusKey`, `priority=high`) — only the conversation is localized.
157
162
  4. **Smart defaults + ask one thing at a time.** Apply opinionated defaults from the intent summary (`channel='API'`, `priority='normal'`, assignee=self for "bana", `strategy='any_one'`/`'all_required'` per module). Ask **one** genuinely-missing thing, never a batch ("ver bana başlık, şirket, durum, öncelik, kategori" YASAK). Never invent a `title`, a password, a webhook URL, or a secret — ask for those.
158
- 5. **Resolve dynamic required fields up front.** Before a create/mutation, resolve the entity's required fields _for this vendor_ (e.g. `statusId` via `GET /api/statuses`, `companyId` from `who-am-i`, approver name → `userId` via user lookup). Don't submit a half-filled body and let it 400 — pre-resolve, then submit. Forms with dynamic schemas: pull the schema first (via `systa_api_call`, e.g. `GET /forms/:id`) so required fields are known.
163
+ 5. **Resolve dynamic required fields up front.** Before a create/mutation, resolve the entity's required fields _for this vendor_ (e.g. `statusId` via `GET /api/statuses`, `companyId` from `who-am-i`, approver name → `userId` via user lookup). Don't submit a half-filled body and let it 400 — pre-resolve, then submit. For a main request form use the `form` module; for an alt form use `describe_endpoint('/api/sub-forms/:id','GET')` and then read `GET /api/sub-forms/:id`. Never substitute `/forms/:id` for an alt form.
159
164
  6. **Safety tiers gate confirmation.** `read_only` → just do it. `mutating`/`idempotent` → do it, then report. **`destructive`** (revoke access, delete, hard removal) and live side-effecting actions (publish, send invite, advance release workflow, test webhook) → show a one-line "şunu yapacağım" and get an explicit OK first. Publishing (announcement/release notes/product update) is **never** auto-published — show a summary, get approval.
160
165
  7. **Don't over-ask scope.** `companyId`/`userId`/`vendorSchema` come from `who-am-i`; don't ask the user for them when a single sane value exists.
161
166
 
@@ -326,6 +331,136 @@ Gövdede geçen şu düz metin tokenları otomatik olarak **tıklanabilir rozete
326
331
 
327
332
  - No dedicated tool — drive via `systa_api_call`. `userId`=self (sormadan), `leaveType='annual'`, `isHalfDay=false`, dates normalized to `YYYY-MM-DD` ("yarın/cuma" → tarih), `returnToWorkDate` = next working day after end. "izinlerim" → `systa_api_call` `GET /user-leaves/me`. Needs the `user.leave.self` scope.
328
333
 
334
+ ### Alt form hazırla / oluştur (design a sub-form) — `systa_api_call` + `sub-forms`
335
+
336
+ Alt form, ana talep formu değildir. `form` modülü ana talep şemasını; `sub-forms`
337
+ modülü ise bağımsız/gömülü ek veri toplama şemasını yönetir. Alt form; form meta
338
+ bilgisi, bölümler, alanlar, kurallar ve nerede çalışacağını belirleyen binding'lerden
339
+ oluşur. Dedicated create aracı yoktur; keşif ve tüm çağrılar `systa_api_call` ile yapılır.
340
+
341
+ #### 1. İhtiyacı kısa bir forma çevir
342
+
343
+ Kullanıcıdan doğal dilde şu kararları çıkar; yalnız gerçekten eksik olan **tek** kararı sor:
344
+
345
+ - Amaç ve görünen ad. `formKey`, `sectionKey`, `fieldKey` değerlerini ajan üretir:
346
+ küçük harf + rakam + alt çizgi, en az 2 karakter (`musteri_geri_bildirim` gibi).
347
+ - Kullanım biçimi: doğrudan/gömülü veri toplayıp talep açma → formMode
348
+ 'create_request' + bindingType 'embed'; mevcut talep içinde görev/ek iş formu →
349
+ formMode 'create_task' + bindingType 'request_attach'; ikisi de gerekiyorsa formMode
350
+ 'both'. Binding türü yalnız 'embed' veya 'request_attach' olabilir.
351
+ - Bölümler ve alanlar. Alan türleri:
352
+ `text`, `textarea`, `number`, `currency`, `email`, `phone`, `date`, `datetime`,
353
+ `select`, `multiselect`, `checkbox`, `radio`, `file`, `hidden`, `custom_regex`,
354
+ `image`, `signature`, `location`, `rating`, `switch`, `richtext`.
355
+ Veri türü `string|number|boolean|date|file|json`; seçenekli alanlarda `optionsConfig`,
356
+ zorunlu alanlarda `isRequired:true`, iki kolon düzeninde `colSpan:1|2` kullan.
357
+ - Otomasyon, dış erişim veya yayın isteği açıkça söylenmediyse kural, webhook,
358
+ periyodik çalışma, public erişim, captcha secret ya da allowed origin ekleme.
359
+ Güvenli taslak varsayılanı `isPublic:false` ve yayında-değil durumudur.
360
+
361
+ Etiket/başlık gibi çevrilebilir alanları katalog şemasının istediği i18n nesnesiyle
362
+ gönder (örn. `{tr:'E-posta',en:'Email'}`). Kullanıcının verdiği mevcut id'leri başka
363
+ vendor'da yeniden kullanma; company/team/user/status/category/board/formRule adlarını
364
+ önce bu vendor içinde çöz.
365
+
366
+ #### 2. Uçları ve güncel şemayı keşfet
367
+
368
+ 1. `list_capabilities({module:'sub-forms'})` çağır. Ayrıca binding ve gönderi işi
369
+ varsa `describe_module('sub-form-bindings')` / `describe_module('sub-form-submissions')`
370
+ kullan. Modül görünmüyorsa kapsam dışıdır; endpoint uydurma.
371
+ 2. En az şu uçları `describe_endpoint(path,method)` ile oku:
372
+ `POST /api/sub-forms`, `PUT /api/sub-forms/:id/save`, `GET /api/sub-forms/:id/preview`
373
+ ve seçilen binding gerekiyorsa `POST /api/sub-forms/:id/bindings`.
374
+ 3. Mevcut bir form değişiyorsa önce `GET /api/sub-forms/:id` oku; kullanıcı açıkça
375
+ kaldır demedikçe mevcut section/field/rule kimliklerini koru.
376
+
377
+ #### 3. Önce taslak şemayı oluştur, sonra atomik kaydet
378
+
379
+ 1. `POST /api/sub-forms` ile yalnız temel formu oluştur: `formName`, üretilmiş
380
+ `formKey`, amaçtan seçilen `formMode`, `isPublic:false`. Kullanım biçimi belliyse
381
+ `initialBindingType` da gönderilebilir; 'request_attach' binding'de `formRuleId`
382
+ henüz yoksa binding pasif oluşur ve daha sonra tamamlanır. `parentFormId` gönderme:
383
+ backend bunu şirketin aktif ana talep formundan server-authoritative çözer ve
384
+ create/update/save sırasında istemci değerini yok sayar.
385
+ 2. Dönen alt form `id`'sini al. Bölüm/alan/kuralı tek tek yazmak yerine
386
+ `PUT /api/sub-forms/:id/save` kullan; bu işlem tek transaction'da kaydeder ve
387
+ form sürümünü artırır. Gövde:
388
+
389
+ ```json
390
+ {
391
+ "form": { "formName": "Müşteri Geri Bildirimi", "formMode": "create_request" },
392
+ "sections": [
393
+ {
394
+ "tempId": "sec_contact",
395
+ "sectionKey": "iletisim",
396
+ "title": { "tr": "İletişim" },
397
+ "displayOrder": 0
398
+ }
399
+ ],
400
+ "fields": [
401
+ {
402
+ "tempId": "fld_email",
403
+ "sectionTempId": "sec_contact",
404
+ "fieldKey": "email",
405
+ "fieldType": "email",
406
+ "dataType": "string",
407
+ "label": { "tr": "E-posta" },
408
+ "isRequired": true,
409
+ "displayOrder": 0,
410
+ "colSpan": 2
411
+ }
412
+ ],
413
+ "rules": [],
414
+ "deletedSectionIds": [],
415
+ "deletedFieldIds": [],
416
+ "deletedRuleIds": []
417
+ }
418
+ ```
419
+
420
+ Yeni bileşenlerde `tempId`, alan-bölüm ilişkisinde `sectionTempId` kullan. Yanıttaki
421
+ `sectionIdMap`, `fieldIdMap`, `ruleIdMap` gerçek id'leri verir. Mevcut bileşende
422
+ `id` gönder. `deleted*Ids` listelerine yalnız kullanıcının açıkça kaldırdığı mevcut
423
+ id'leri koy; listede olmayan öğeleri “eksik geldi” diye silme.
424
+
425
+ 3. İlk create'te binding kurulmadıysa `POST /api/sub-forms/:id/bindings` çağır.
426
+ 'embed' site/portal içinde doğrudan çalışır. 'request_attach' mevcut talep akışına
427
+ `formRuleId` ile bağlanır; rule çözülene kadar pasif kalabilir. Rastgele talep/proje
428
+ id'sini binding diye gönderme.
429
+
430
+ #### 4. Doğrula; kullanıcı onayı olmadan yayınlama
431
+
432
+ - `GET /api/sub-forms/:id` ile kaydedilmiş tanımı, ardından
433
+ `GET /api/sub-forms/:id/preview` ile `{form,sections,fields,preview:true}` önizleme
434
+ payload'ını oku. Bu uç HTML/render edilmiş ekran döndürmez; görünümü istemci çizer.
435
+ - Dinamik query alanında `POST /api/sub-forms/:id/fields/:fieldId/test-query` çağrısı
436
+ yapılandırmayı kaydetmez ama tanımlı prefix-set/regex veya sandboxed read-only SQL'i
437
+ gerçekten çalıştırır. Yerleşik doğrulama ve lookup setlerini önce
438
+ `GET /api/sub-forms/query/prefix-sets` ile keşfet. Kurallar için
439
+ `POST /api/sub-forms/:id/rules/test` side-effect üretmeyen dry-run'dır.
440
+ - Kullanıcıya ad, kullanım biçimi, bölüm/alan listesi, zorunlu alanlar, binding ve
441
+ varsa kuralları tek özetle göster. `PATCH /api/sub-forms/:id/publish` yalnız açık
442
+ “yayınla/devreye al” onayından sonra çağrılır. Taslak hazırlama isteği yayınlama
443
+ izni değildir. Yayından kaldırma da canlı akışı durdurur; önceden onay al.
444
+
445
+ #### 5. İleri özellikleri yalnız ihtiyaç varsa ekle
446
+
447
+ - Public/embed: allowed origins tam origin biçimindedir (`https://ornek.com`, trailing
448
+ slash yok). Kullanıcı domaini ve public erişimi açıkça istemeden ekleme/açma.
449
+ - Başlık şablonu: kaydetmeden önce `POST /api/sub-forms/:id/title-preview` ile canlı
450
+ gönderim işlemcisine eşdeğer önizleme al.
451
+ - Korelasyon: önce `GET/POST /api/sub-forms/correlation-groups`; bir alt form yalnız
452
+ tek gruba üye olabilir. Etkin ayarda `groupId`, en az bir `matchField` ve kimlik rolü
453
+ (`customer_id|phone|email`) gerekir. `POST /api/sub-forms/:id/correlation/preview`
454
+ geçmiş gönderiler üstünde dry-run yapar; sonucu görmeden korelasyonu etkinleştirme.
455
+ - Webhook dış sisteme yan etki üretir. Hedef URL/olay kullanıcıya ait karardır; secret
456
+ isteme veya sohbette gösterme. Oluşturma, test ve secret rotasyonu öncesi onay al.
457
+
458
+ Hata kurtarma: `VALIDATION_FAILED` gelirse aynı ucu yeniden `describe_endpoint` ile
459
+ oku, yalnız hatalı alanı düzeltip bir kez dene. `403` için başka binding/modül yoluyla
460
+ yetki aşmaya çalışma. `409` formKey çakışmasında kullanıcı adını değiştirme; aynı
461
+ anlamı koruyan yeni bir key öner. Silme uçları soft-delete olsa bile güvenilir bir
462
+ restore ucu garanti edilmez; kaldırma öncesi kullanıcı onayı al.
463
+
329
464
  ### Rapor al / dışa aktar (report) — `systa_api_call` (no named tool)
330
465
 
331
466
  - No dedicated tool — drive via `systa_api_call`. Önce önizle (`POST /reports/preview`, read-only), sonra dışa aktar (`POST /reports/export`, `format='xlsx'` unless "csv"). `reportType` is the required pivot (request/sla/user/organization/project/lifecycle/subform) — infer from intent. Resolve columns via `GET /reports/columns` if the user only named a type. "bu ay/geçen ay" → dynamic date filter. (For ad-hoc/free queries prefer the `querybuilder_*` tools.)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "systa-mcp",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "MCP stdio server for SysTa (Talep Takip Sistemi) — lets AI agents (Claude, Codex) use the SysTa REST API via a scoped API key. Zero npm dependencies (native Node).",
5
5
  "type": "commonjs",
6
6
  "main": "server.js",
package/server.js CHANGED
@@ -77,6 +77,17 @@ const INSTRUCTIONS = [
77
77
  ' binary tasiyamaz; diger her endpoint icin `systa_api_call` (method+path) kullan — path ve',
78
78
  ' govdeyi describe_endpoint ciktisindan kur (path icin /api on-eki opsiyonel, otomatik normalize edilir).',
79
79
  '',
80
+ 'ALT FORM (sub-form) HAZIRLAMA: Ana talep formu `form`, ek/mini form ise `sub-forms`',
81
+ 'moduludur; `/forms/:id` alt-form detayi DEGILDIR. Once `list_capabilities({module:"sub-forms"})`,',
82
+ 'sonra POST `/sub-forms` + PUT `/sub-forms/:id/save` semalarini `describe_endpoint` ile oku.',
83
+ 'Taslagi POST `/sub-forms` ile isPublic=false olustur; section/field/rule degisikliklerini',
84
+ 'tempId + sectionTempId kullanarak TEK transaction olan PUT `/sub-forms/:id/save` ile kaydet.',
85
+ 'Binding yalniz `embed` veya `request_attach` olur. parentFormId server-authoritative oldugu',
86
+ 'icin gonderme. GET `/sub-forms/:id/preview` render edilmis HTML degil, form/section/field',
87
+ 'onizleme payloadidir. Query/rule/title/correlation preview uclari kalici config yazmaz.',
88
+ 'Kullaniciya taslak ozeti gostermeden ve acik onay almadan publish, public/origin, webhook,',
89
+ 'periodic veya korelasyon ozelligini etkinlestirme; silme/yayindan kaldirma icin de onay al.',
90
+ '',
80
91
  'YORUM YAZMA (comment) — ONEMLI, ZENGIN METIN SOZLESMESI:',
81
92
  ' Yorum govdesi DUZ METIN DEGIL, TipTap JSON dokumanidir: {type:"doc", content:[...]}.',
82
93
  ' `add_request_comment` duz metni tek paragrafa sarar — TABLO, BASLIK, LISTE, KOD BLOGU',
@@ -4447,6 +4458,7 @@ if (require.main === module) {
4447
4458
  }
4448
4459
 
4449
4460
  module.exports = {
4461
+ INSTRUCTIONS,
4450
4462
  TOOLS,
4451
4463
  TOOL_MAP,
4452
4464
  TOOL_REQUIRED_PERMISSION,