systa-mcp 1.2.0 → 1.3.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.
- package/SKILL.md +149 -49
- package/package.json +1 -1
- package/server.js +131 -16
package/SKILL.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
version: 1.
|
|
2
|
+
version: 1.3.0
|
|
3
3
|
name: systa
|
|
4
4
|
description: |
|
|
5
5
|
Drive SysTa (Talep Takip Sistemi / SysTa) — a
|
|
@@ -67,6 +67,8 @@ Before any SysTa action, confirm connectivity, auth and identity. Do this once p
|
|
|
67
67
|
|
|
68
68
|
If bootstrap fails, deliver a one-line reason ("anahtar süresi dolmuş", "key expired", "endpoint için yetki yok") and stop — never fabricate a result.
|
|
69
69
|
|
|
70
|
+
5. **Yorum yazacaksan ÖNCE sözleşmeyi oku.** Yorum gövdesi düz metin değil **TipTap JSON**'dur ve tablo/başlık/liste destekler; talep (`#125`) ve görev kartı (`##1809`) referansları özel işaret istemez. Yorum, durum notu veya talep açıklaması yazmadan önce → [Yorum ekle (comment)](#yorum-ekle-comment--add_request_comment--post-apirequestsrequestnumbercomments). Bu adım atlanırsa tablolar boş hücreyle, referanslar düz metin olarak çıkar.
|
|
71
|
+
|
|
70
72
|
## SysTa nedir / temel kavramlar (glossary)
|
|
71
73
|
|
|
72
74
|
Short shared vocabulary. Use these words with the user; never expose raw REST paths or internal jargon.
|
|
@@ -94,52 +96,54 @@ yanıtındaki `glossary` alias'larının ayna kopyasıdır (MCP yokken de geçer
|
|
|
94
96
|
ASCII'dir — eşleştirmede aksanı yok say. Modülü bulduktan sonra `describe_module(modül)`
|
|
95
97
|
veya `describe_endpoint` ile gövdeyi netleştir.
|
|
96
98
|
|
|
97
|
-
| Doğal dil (alias) | Modül | Birincil giriş
|
|
98
|
-
| ------------------------------------------------------------ | --------------- |
|
|
99
|
-
| talep, talepler, is, destek talebi | request | list_requests / create_request
|
|
100
|
-
| geciken, overdue, gecikmis, sla ihlali, deadline gecmis | request/sla | list_requests(overdue:true / slaBreached:true)
|
|
101
|
-
| toplu guncelle, hepsini, birden cok talep | request | bulk_update_requests
|
|
102
|
-
| kullanici bul, isim cozumle, kime, hangi ahmet | user | resolve_user_by_name / list_users
|
|
103
|
-
| sirket bul, kategori bul, ekip bul, id cozumle, lookup | multiple | list_lookup(kind:'company'/'category'/'team'/...)
|
|
104
|
-
| projeyi klonla, projeyi cogalt, duplicate project | project | duplicate_project
|
|
105
|
-
| snapshot fark, baseline karsilastir, plan diff | plan | compare_plan_baseline
|
|
106
|
-
| yorumlar, ekler, degisiklik gecmisi, denetim | request | list_request_comments / list_request_files / list_request_history
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
|
|
|
112
|
-
|
|
|
113
|
-
|
|
|
114
|
-
|
|
|
115
|
-
|
|
|
116
|
-
|
|
|
117
|
-
|
|
|
118
|
-
| onay
|
|
119
|
-
|
|
|
120
|
-
|
|
|
121
|
-
|
|
|
122
|
-
|
|
|
123
|
-
|
|
|
124
|
-
|
|
|
125
|
-
|
|
|
126
|
-
|
|
|
127
|
-
|
|
|
128
|
-
|
|
|
129
|
-
|
|
|
130
|
-
|
|
|
131
|
-
|
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
135
|
-
|
|
|
136
|
-
|
|
|
137
|
-
|
|
|
138
|
-
|
|
|
139
|
-
|
|
|
140
|
-
|
|
|
141
|
-
|
|
|
142
|
-
|
|
|
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 |
|
|
143
147
|
|
|
144
148
|
> Bu tablo, katalogdaki ~25 modülün kullanıcı-yüzeyli olanlarından bir alt küme kapsar. Listede olmayan
|
|
145
149
|
> bir kelime için `list_capabilities` çağır — anahtarının erişebildiği güncel modül/alias
|
|
@@ -193,7 +197,98 @@ Each maps a P0 user verb to a tool/endpoint, with the opinionated defaults from
|
|
|
193
197
|
|
|
194
198
|
### Yorum ekle (comment) — `add_request_comment` → `POST /api/requests/:requestNumber/comments`
|
|
195
199
|
|
|
196
|
-
|
|
200
|
+
> **Yorum gövdesi düz metin DEĞİL, TipTap JSON dokümanıdır.** Bu bölümü yorum yazmadan önce oku — tablo, başlık, liste ve talep/görev referansları buradan çıkar.
|
|
201
|
+
|
|
202
|
+
**İki çağrı biçimi** (en az biri zorunlu: `text` / `commentTextJson` / `fileIds`):
|
|
203
|
+
|
|
204
|
+
| Ne yazıyorsun | Argüman | Not |
|
|
205
|
+
| ---------------------------------- | ----------------- | ------------------------------------------------------------------------ |
|
|
206
|
+
| Sıradan yorum | `text` | Tool tek paragrafa sarar |
|
|
207
|
+
| Tablo / başlık / liste / kod bloğu | `commentTextJson` | TAM doküman; verilirse `text` yok sayılır |
|
|
208
|
+
| Dosya eki | `fileIds` | Önce `upload_file_to`; dosya hem yorumda hem Dosyalar sekmesinde görünür |
|
|
209
|
+
|
|
210
|
+
**Render edilen düğümler** (otorite: frontend `jsonToHtml`; listede olmayan düğüm sessizce yalnız içeriğiyle basılır):
|
|
211
|
+
`doc`, `paragraph`, `heading{level:1..3}`, `text`, `hardBreak`, `bulletList`, `orderedList`, `listItem`, `blockquote`, `codeBlock{language}`, `table`, `tableRow`, `tableHeader`, `tableCell`, `mention{id,label}`.
|
|
212
|
+
**Metin işaretleri (marks):** `bold`, `italic`, `underline`, `strike`, `code`, `link{href}`, `textStyle{color,fontSize,fontFamily}`, `highlight{color}`.
|
|
213
|
+
|
|
214
|
+
**Tablo iç içe sırası KATIDIR** — `table > tableRow > (tableHeader | tableCell) > paragraph > text`.
|
|
215
|
+
Hücreye doğrudan `text` koyarsan hücre **boş** görünür.
|
|
216
|
+
|
|
217
|
+
```json
|
|
218
|
+
{
|
|
219
|
+
"type": "doc",
|
|
220
|
+
"content": [
|
|
221
|
+
{
|
|
222
|
+
"type": "heading",
|
|
223
|
+
"attrs": { "level": 3 },
|
|
224
|
+
"content": [{ "type": "text", "text": "Bulgular" }]
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"type": "table",
|
|
228
|
+
"content": [
|
|
229
|
+
{
|
|
230
|
+
"type": "tableRow",
|
|
231
|
+
"content": [
|
|
232
|
+
{
|
|
233
|
+
"type": "tableHeader",
|
|
234
|
+
"content": [{ "type": "paragraph", "content": [{ "type": "text", "text": "Bulgu" }] }]
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"type": "tableHeader",
|
|
238
|
+
"content": [{ "type": "paragraph", "content": [{ "type": "text", "text": "Kart" }] }]
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"type": "tableRow",
|
|
244
|
+
"content": [
|
|
245
|
+
{
|
|
246
|
+
"type": "tableCell",
|
|
247
|
+
"content": [
|
|
248
|
+
{
|
|
249
|
+
"type": "paragraph",
|
|
250
|
+
"content": [{ "type": "text", "text": "Filo uyarısı çıkmıyor" }]
|
|
251
|
+
}
|
|
252
|
+
]
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"type": "tableCell",
|
|
256
|
+
"content": [
|
|
257
|
+
{ "type": "paragraph", "content": [{ "type": "text", "text": "##1809" }] }
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
]
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
"type": "paragraph",
|
|
266
|
+
"content": [
|
|
267
|
+
{ "type": "text", "text": "Ayrıntı " },
|
|
268
|
+
{ "type": "text", "marks": [{ "type": "bold" }], "text": "#125" },
|
|
269
|
+
{ "type": "text", "text": " talebinde." }
|
|
270
|
+
]
|
|
271
|
+
}
|
|
272
|
+
]
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
#### Talep ve görev kartı referansı — özel işaret GEREKMEZ
|
|
277
|
+
|
|
278
|
+
Gövdede geçen şu düz metin tokenları otomatik olarak **tıklanabilir rozete** çevrilir:
|
|
279
|
+
|
|
280
|
+
| Yazım | Neye gider | Tıklayınca |
|
|
281
|
+
| -------- | --------------------------- | ---------------------------------------------- |
|
|
282
|
+
| `#125` | **Talep** (request) | Talep önizlemesi açılır |
|
|
283
|
+
| `##1809` | **Görev kartı** (task card) | Kartın önizlemesi açılır, oradan karta gidilir |
|
|
284
|
+
|
|
285
|
+
- **Link mark'ı / `href` / öznitelik EKLEME** — renderer token'ı kendisi rozete çevirir. Elle `<a>` üretmek rozeti bozar.
|
|
286
|
+
- Sayı: `#` için **talep numarası**, `##` için kartın **global `card.id`**'si.
|
|
287
|
+
Panoda kartın üstünde görünen `#3` talep-içi **sıra numarasıdır**, referans DEĞİLDİR — `card.id`'yi `get_request_board` / `cards/list` çıktısından al.
|
|
288
|
+
- **Öneki karıştırmak kullanıcıyı yanlış kayda götürür**: aynı sayı hem talep hem kart olarak var olabilir. Kart kastediyorsan çift diyez şart.
|
|
289
|
+
- Rozetler her yorum görünümünde ve sürüm karar akışındaki yorumlarda da çalışır.
|
|
290
|
+
|
|
291
|
+
İstenmedikçe `@mention` ekleme.
|
|
197
292
|
|
|
198
293
|
### Durum değiştir / tamamla / kapat (change status) — `change_request_status` → `PUT /api/requests/:requestNumber`
|
|
199
294
|
|
|
@@ -238,6 +333,11 @@ Each maps a P0 user verb to a tool/endpoint, with the opinionated defaults from
|
|
|
238
333
|
### Sürüm oluştur (release) — `create_release_list` → `POST /api/releases/lists`
|
|
239
334
|
|
|
240
335
|
- `releaseType='standard'`, `requireAllStakeholderApprovals=false`, `companyId` from scope. Add items with `add_release_item`. Deployment workflow steps (`close-servers` → `start-db-migration` → `start-server-update` → `open-servers` → `complete`) are live ops — **never auto-advance blindly**; show which step you're on and confirm. Release notes: generate → review → publish (never auto-publish).
|
|
336
|
+
- **Bir listenin kimliği = `id` + CalVer sürümü (`versionLabel`, örn. `2026.09.1`) — TARİH DEĞİL.** Aynı şirket **aynı gün İKİ liste** yayınlayabilir, bu yüzden "23 Eylül'deki liste" tek bir listeyi göstermez: tarihle liste arama/eşleştirme güvenilir değildir ve yanlış listeye yazma riski taşır.
|
|
337
|
+
- `create_release_list` yanıtı `versionYear` / `versionMonth` / `versionSeq` / `versionFinalized` alanlarının yanında hazır `versionLabel` döner. **Kullanıcıya listeyi `versionLabel` ile adlandır, kendi tarafında `id`'yi sakla.** `versionFinalized=false` ise numara HENÜZ GEÇİCİDİR (liste onaylanırken değişebilir) — kesinmiş gibi sunma.
|
|
338
|
+
- Sonraki tüm çağrılar listeyi **sayısal `id` ile** hedefler: `add_release_item(listId)`, `get_release_workflow`, `advance_release_workflow(listId)`, `decide_release_stage(itemId)`. Hiçbirinde tarih liste seçmez. `add_release_item`'daki `plannedProdDate` de liste SEÇMEZ; yalnızca **talebin** `plannedProdDate` özel alanını ezer (boşsa listenin deployment tarihinden türetilir).
|
|
339
|
+
- Talep listeye **ID ile** bağlanır (`target_release_list_id`), tarihle değil. Kullanıcı "şu tarihteki sürüme ekle" derse önce o tarihteki listeleri getir, birden fazlaysa `versionLabel` ile **hangisi olduğunu sor** — tahmin etme.
|
|
340
|
+
- Sürüm webhook'larının gövdesi (`release.list.published`, `release.workflow.failed`, `release.item.added` …) `deploymentDate` yanında **her zaman bir `versionLabel` anahtarı** taşır; sürüm çözülemediyse `null` gelir. Dış sisteme sürümden bahsederken bu alanı kullan, `null` ise tarihe düş.
|
|
241
341
|
|
|
242
342
|
### GitHub: bağla / issue aktar / push (kişisel entegrasyon) — `github.self`
|
|
243
343
|
|
|
@@ -313,7 +413,7 @@ Gerçek AI kullanımında tespit edilen sürtünme noktaları; her biri canlı d
|
|
|
313
413
|
### Talep açma — `description` = ilk yorum (commentNo 1)
|
|
314
414
|
|
|
315
415
|
- Verdiğin `description` talebin **ilk yorumu** olarak materyalize edilir.
|
|
316
|
-
- **Tablo/zengin içerik** için: `systa_api_call POST /requests` ile `descriptionJson` alanına TipTap doc (tablo dahil) gönder — bu da comment #1 olur. **Ayrıca ayrı yorum EKLEME** (çift yorum olur). İçeriği yalnız ayrı yorumda istiyorsan `description` boş bırak.
|
|
416
|
+
- **Tablo/zengin içerik** için: `systa_api_call POST /requests` ile `descriptionJson` alanına TipTap doc (tablo dahil) gönder — bu da comment #1 olur. Düğüm/tablo sözleşmesi ve `#125` / `##1809` referansları yorumla **aynıdır** → [Yorum ekle](#yorum-ekle-comment--add_request_comment--post-apirequestsrequestnumbercomments). **Ayrıca ayrı yorum EKLEME** (çift yorum olur). İçeriği yalnız ayrı yorumda istiyorsan `description` boş bırak.
|
|
317
417
|
|
|
318
418
|
### Kanban
|
|
319
419
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "systa-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.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,40 @@ 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
|
+
'YORUM YAZMA (comment) — ONEMLI, ZENGIN METIN SOZLESMESI:',
|
|
81
|
+
' Yorum govdesi DUZ METIN DEGIL, TipTap JSON dokumanidir: {type:"doc", content:[...]}.',
|
|
82
|
+
' `add_request_comment` duz metni tek paragrafa sarar — TABLO, BASLIK, LISTE, KOD BLOGU',
|
|
83
|
+
' gibi zengin icerik icin ayni araca `commentTextJson` ile TAM dokumani ver (govde',
|
|
84
|
+
' verilirse `text` yok sayilir). Ek dosya icin `fileIds`; dosyalar hem yorumda hem',
|
|
85
|
+
' Dosyalar sekmesinde gorunur.',
|
|
86
|
+
'',
|
|
87
|
+
' RENDER EDILEN DUGUMLER (otorite: frontend jsonToHtml; listede olmayan dugum SESSIZCE',
|
|
88
|
+
' yalniz icerigi ile basilir): doc, paragraph, heading{level:1..3}, text, hardBreak,',
|
|
89
|
+
' bulletList, orderedList, listItem, blockquote, codeBlock{language}, table, tableRow,',
|
|
90
|
+
' tableHeader, tableCell, mention{id,label}. METIN ISARETLERI (marks): bold, italic,',
|
|
91
|
+
' underline, strike, code, link{href}, textStyle{color,fontSize,fontFamily}, highlight{color}.',
|
|
92
|
+
'',
|
|
93
|
+
' TABLO YAPISI (ic ice sira KATIDIR): table > tableRow > (tableHeader | tableCell) >',
|
|
94
|
+
' paragraph > text. Hucreye dogrudan `text` KOYMA — paragraph katmani atlanirsa hucre',
|
|
95
|
+
' bos gorunur. Ornek:',
|
|
96
|
+
' {"type":"table","content":[',
|
|
97
|
+
' {"type":"tableRow","content":[',
|
|
98
|
+
' {"type":"tableHeader","content":[{"type":"paragraph","content":[{"type":"text","text":"Bulgu"}]}]},',
|
|
99
|
+
' {"type":"tableHeader","content":[{"type":"paragraph","content":[{"type":"text","text":"Kart"}]}]}]},',
|
|
100
|
+
' {"type":"tableRow","content":[',
|
|
101
|
+
' {"type":"tableCell","content":[{"type":"paragraph","content":[{"type":"text","text":"Filo uyarisi cikmiyor"}]}]},',
|
|
102
|
+
' {"type":"tableCell","content":[{"type":"paragraph","content":[{"type":"text","text":"##1809"}]}]}]}]}',
|
|
103
|
+
'',
|
|
104
|
+
' TALEP / GOREV KARTI REFERANSI — hicbir ozel isaret GEREKMEZ, DUZ METIN yeter:',
|
|
105
|
+
' `#125` -> TALEP referansi (tiklayinca talep onizlemesi acilir)',
|
|
106
|
+
' `##1809` -> GOREV KARTI referansi (tiklayinca kartin onizlemesi acilir)',
|
|
107
|
+
' Sayi TALEP icin talep numarasi, KART icin kartin GLOBAL id`sidir (panodaki `#3` gibi',
|
|
108
|
+
' talep-ici sira numarasi DEGIL; kart id`sini get_request_board / cards listesinden',
|
|
109
|
+
' `card.id` olarak al). Yorum govdesinde gecen her `#<sayi>` / `##<sayi>` otomatik',
|
|
110
|
+
' tiklanabilir rozete cevrilir — link mark`i, href veya oznitelik EKLEME.',
|
|
111
|
+
' UYARI: ayni sayi hem talep hem kart olabilir; oneki karistirmak kullaniciyi YANLIS',
|
|
112
|
+
' kayda goturur. Kart kastediyorsan CIFT diyez sart.',
|
|
113
|
+
'',
|
|
80
114
|
'RAPOR / SAYIM / DAGILIM / TOPLAMA niyetinde: list_requests`i elle sayfalayip client-side TOPLAMA YAPMA.',
|
|
81
115
|
' Sunucu-tarafli rapor araclari VARDIR: querybuilder_ai_generate_query (dogal dil -> sorgu),',
|
|
82
116
|
' querybuilder_execute_query (server-side groupBy/sayim/filtre), querybuilder_describe_fields,',
|
|
@@ -1470,26 +1504,79 @@ const TOOLS = [
|
|
|
1470
1504
|
},
|
|
1471
1505
|
{
|
|
1472
1506
|
name: 'add_request_comment',
|
|
1473
|
-
description: `Add a
|
|
1507
|
+
description: `Add a comment to a SysTa request (talebe yorum ekle). Requires the API key to hold BOTH "request.comment.create" and "request.tabs.comments.view" scopes.
|
|
1508
|
+
|
|
1509
|
+
The comment body is a TipTap JSON document, NOT plain text. Two ways to call:
|
|
1510
|
+
* text -> a single paragraph; the tool wraps it for you. Use for ordinary comments.
|
|
1511
|
+
* commentTextJson -> a FULL TipTap doc ({type:"doc",content:[...]}). Use for TABLES, headings, lists, code blocks, @mentions. When given, "text" is ignored.
|
|
1512
|
+
Attach files with fileIds:[...] (they appear in the comment AND the Files tab).
|
|
1513
|
+
|
|
1514
|
+
TABLE nesting is strict: table > tableRow > (tableHeader|tableCell) > paragraph > text. Putting "text" directly in a cell renders an EMPTY cell.
|
|
1515
|
+
Renderable nodes: doc, paragraph, heading{level:1..3}, text, hardBreak, bulletList, orderedList, listItem, blockquote, codeBlock{language}, table, tableRow, tableHeader, tableCell, mention{id,label}. Marks: bold, italic, underline, strike, code, link{href}, textStyle{color,fontSize,fontFamily}, highlight{color}.
|
|
1516
|
+
|
|
1517
|
+
REFERENCES need NO markup — plain text is enough, anywhere in the body:
|
|
1518
|
+
"#125" -> request reference (click opens a request preview)
|
|
1519
|
+
"##1809" -> task card reference (click opens the card preview)
|
|
1520
|
+
The number is the request number for "#", and the card's GLOBAL id for "##" (NOT the per-request "#3" sequence shown on the board — read card.id from get_request_board). Do NOT add a link mark or href; the renderer turns the token into a chip. Mixing the prefixes sends the user to the WRONG record.${FROZEN_NOTE}`,
|
|
1474
1521
|
inputSchema: {
|
|
1475
1522
|
type: 'object',
|
|
1476
1523
|
additionalProperties: false,
|
|
1477
|
-
required: ['requestNumber'
|
|
1524
|
+
required: ['requestNumber'],
|
|
1478
1525
|
properties: {
|
|
1479
1526
|
requestNumber: { type: 'integer', description: 'Request id/number to comment on' },
|
|
1480
|
-
text: {
|
|
1527
|
+
text: {
|
|
1528
|
+
type: 'string',
|
|
1529
|
+
description:
|
|
1530
|
+
'Ordinary comment text -> wrapped into a single paragraph. References work as plain text here: "#125" (request), "##1809" (task card). Ignored when commentTextJson is given.',
|
|
1531
|
+
},
|
|
1532
|
+
commentTextJson: {
|
|
1533
|
+
type: 'object',
|
|
1534
|
+
description:
|
|
1535
|
+
'Full TipTap document for RICH content ({type:"doc",content:[...]}) — tables, headings, lists, code blocks, mentions. Table nesting: table > tableRow > (tableHeader|tableCell) > paragraph > text.',
|
|
1536
|
+
},
|
|
1537
|
+
fileIds: {
|
|
1538
|
+
type: 'array',
|
|
1539
|
+
items: { type: 'integer' },
|
|
1540
|
+
description:
|
|
1541
|
+
'Ids of already-uploaded files to attach (upload_file_to first). They appear in the comment and in the Files tab.',
|
|
1542
|
+
},
|
|
1481
1543
|
},
|
|
1482
1544
|
},
|
|
1483
1545
|
handler: (args) => {
|
|
1484
|
-
const
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1546
|
+
const body = {};
|
|
1547
|
+
|
|
1548
|
+
if (args.commentTextJson) {
|
|
1549
|
+
// Zengin govde verildiginde `text` YOK SAYILIR: ikisini birlestirmek
|
|
1550
|
+
// sessizce iki farkli icerik uretirdi. Sekil dogrulamasi burada yapilir
|
|
1551
|
+
// ki arka uctan donen genel 400 yerine ne bekledigimiz soylensin.
|
|
1552
|
+
const doc = args.commentTextJson;
|
|
1553
|
+
if (doc.type !== 'doc' || !Array.isArray(doc.content)) {
|
|
1554
|
+
throw new Error(
|
|
1555
|
+
'commentTextJson must be a TipTap document: {"type":"doc","content":[...]}',
|
|
1556
|
+
);
|
|
1557
|
+
}
|
|
1558
|
+
body.commentTextJson = doc;
|
|
1559
|
+
} else {
|
|
1560
|
+
const content = String(args.text || '');
|
|
1561
|
+
body.commentTextJson = content
|
|
1562
|
+
? {
|
|
1563
|
+
type: 'doc',
|
|
1564
|
+
content: [{ type: 'paragraph', content: [{ type: 'text', text: content }] }],
|
|
1565
|
+
}
|
|
1566
|
+
: { type: 'doc', content: [{ type: 'paragraph' }] };
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
if (Array.isArray(args.fileIds) && args.fileIds.length > 0) {
|
|
1570
|
+
body.fileIds = args.fileIds;
|
|
1571
|
+
}
|
|
1572
|
+
|
|
1573
|
+
// En az biri zorunlu (arka uc de dayatir); bos cagriyi burada yakala.
|
|
1574
|
+
if (!args.commentTextJson && !args.text && !body.fileIds) {
|
|
1575
|
+
throw new Error('Provide at least one of: text, commentTextJson, fileIds');
|
|
1576
|
+
}
|
|
1577
|
+
|
|
1491
1578
|
return systaFetch('POST', `/requests/${encodeURIComponent(args.requestNumber)}/comments`, {
|
|
1492
|
-
body
|
|
1579
|
+
body,
|
|
1493
1580
|
});
|
|
1494
1581
|
},
|
|
1495
1582
|
},
|
|
@@ -1513,7 +1600,7 @@ const TOOLS = [
|
|
|
1513
1600
|
},
|
|
1514
1601
|
{
|
|
1515
1602
|
name: 'change_request_status',
|
|
1516
|
-
description: `Move a SysTa request to a target status (durum degistir / tamamla / kapat / yeniden ac), optionally with a closing comment. BEFORE calling, use list_allowed_transitions(requestNumber) to see valid target statuses -- transition rules restrict which statuses are reachable from the current one. Give EITHER statusId OR statusKey (statusKey resolves via GET /statuses; a natural-language user phrase like "test asamasi" maps to statusKey~test). "tamamla/kapat" => a final status (isFinal=true); "yeniden ac" => a non-final one. A given comment is posted right after the transition (plain text, auto-wrapped to TipTap). A status change may trigger a workflow gate/approval -- if the API returns 400 TRANSITION_NOT_ALLOWED read the error.details, pick a valid target and retry; do NOT retry blindly.${FROZEN_NOTE}`,
|
|
1603
|
+
description: `Move a SysTa request to a target status (durum degistir / tamamla / kapat / yeniden ac), optionally with a closing comment. BEFORE calling, use list_allowed_transitions(requestNumber) to see valid target statuses -- transition rules restrict which statuses are reachable from the current one. Give EITHER statusId OR statusKey (statusKey resolves via GET /statuses; a natural-language user phrase like "test asamasi" maps to statusKey~test). "tamamla/kapat" => a final status (isFinal=true); "yeniden ac" => a non-final one. A given comment is posted right after the transition (plain text, auto-wrapped to TipTap; plain "#125" / "##1809" tokens become clickable request / task-card chips). For a RICH closing note (table, list) call add_request_comment with commentTextJson AFTER the transition instead. A status change may trigger a workflow gate/approval -- if the API returns 400 TRANSITION_NOT_ALLOWED read the error.details, pick a valid target and retry; do NOT retry blindly.${FROZEN_NOTE}`,
|
|
1517
1604
|
inputSchema: {
|
|
1518
1605
|
type: 'object',
|
|
1519
1606
|
additionalProperties: false,
|
|
@@ -2563,14 +2650,29 @@ const TOOLS = [
|
|
|
2563
2650
|
{
|
|
2564
2651
|
name: 'create_release_list',
|
|
2565
2652
|
description:
|
|
2566
|
-
|
|
2653
|
+
'Create a release list (surum listesi) for a company. A list is identified by its numeric ' +
|
|
2654
|
+
'id and its CalVer version label (versionLabel, e.g. "2026.09.1") -- NOT by its deployment ' +
|
|
2655
|
+
'date: the same company can publish TWO lists on the SAME day, so a date does NOT identify ' +
|
|
2656
|
+
'a list and searching/filtering lists by date is NOT reliable. deploymentDate only says ' +
|
|
2657
|
+
'WHEN the release ships. The response carries versionYear / versionMonth / versionSeq / ' +
|
|
2658
|
+
'versionFinalized plus the ready-made versionLabel: quote versionLabel when you name the ' +
|
|
2659
|
+
'list to the user, and keep the numeric id for every follow-up call (add_release_item, ' +
|
|
2660
|
+
'get_release_workflow, advance_release_workflow, decide_release_stage). ' +
|
|
2661
|
+
'versionFinalized=false means the sequence number is still PROVISIONAL and may change when ' +
|
|
2662
|
+
"the list is confirmed -- say so instead of promising a final number. releaseType 'standard' " +
|
|
2663
|
+
"(default) | 'emergency' (+emergencyJustification). companyId must be a resolved numeric id.",
|
|
2567
2664
|
inputSchema: {
|
|
2568
2665
|
type: 'object',
|
|
2569
2666
|
additionalProperties: false,
|
|
2570
2667
|
required: ['companyId', 'deploymentDate'],
|
|
2571
2668
|
properties: {
|
|
2572
2669
|
companyId: { type: 'integer' },
|
|
2573
|
-
deploymentDate: {
|
|
2670
|
+
deploymentDate: {
|
|
2671
|
+
type: 'string',
|
|
2672
|
+
description:
|
|
2673
|
+
'ISO date/datetime -- WHEN the release ships. Not an identifier: several lists may ' +
|
|
2674
|
+
'share one deployment date.',
|
|
2675
|
+
},
|
|
2574
2676
|
plannedStartTime: { type: 'string', description: 'HH:mm' },
|
|
2575
2677
|
requireAllStakeholderApprovals: { type: 'boolean' },
|
|
2576
2678
|
releaseType: { type: 'string', enum: ['standard', 'emergency'] },
|
|
@@ -2590,7 +2692,13 @@ const TOOLS = [
|
|
|
2590
2692
|
{
|
|
2591
2693
|
name: 'add_release_item',
|
|
2592
2694
|
description:
|
|
2593
|
-
|
|
2695
|
+
'Add a request to a release list as a release item (POST /releases/items). The target list ' +
|
|
2696
|
+
'is chosen ONLY by its numeric listId -- never by a date: two lists can share the same ' +
|
|
2697
|
+
'deployment date, so no date parameter here selects, matches or moves a list. Take the id ' +
|
|
2698
|
+
'from create_release_list or from the release list endpoints, and name the list to the user ' +
|
|
2699
|
+
'by its CalVer versionLabel (e.g. "2026.09.1"). ' +
|
|
2700
|
+
"Pass 'items' (array) for a batch, or a single listId+requestId. Resolve " +
|
|
2701
|
+
'developer/analyst/stakeholder ids by name.',
|
|
2594
2702
|
inputSchema: {
|
|
2595
2703
|
type: 'object',
|
|
2596
2704
|
additionalProperties: false,
|
|
@@ -2598,7 +2706,14 @@ const TOOLS = [
|
|
|
2598
2706
|
properties: {
|
|
2599
2707
|
listId: { type: 'integer' },
|
|
2600
2708
|
requestId: { type: 'integer' },
|
|
2601
|
-
plannedProdDate: {
|
|
2709
|
+
plannedProdDate: {
|
|
2710
|
+
type: 'string',
|
|
2711
|
+
description:
|
|
2712
|
+
'ISO date. Does NOT select, match or move a list -- the list is listId ONLY. It just ' +
|
|
2713
|
+
"overrides the REQUEST's plannedProdDate custom field, which otherwise defaults to " +
|
|
2714
|
+
"the linked list's deployment date. Omit it unless the request must carry a date " +
|
|
2715
|
+
'different from its list.',
|
|
2716
|
+
},
|
|
2602
2717
|
developerIds: { type: 'array', items: { type: 'integer' } },
|
|
2603
2718
|
analystIds: { type: 'array', items: { type: 'integer' } },
|
|
2604
2719
|
stakeholderIds: { type: 'array', items: { type: 'integer' } },
|