@akredit/acik-mcp 0.1.0 → 0.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 (29) hide show
  1. package/README.md +94 -8
  2. package/dist/apps/acik-mcp/src/araclar.d.ts +2 -28
  3. package/dist/apps/acik-mcp/src/araclar.js +27 -114
  4. package/dist/apps/acik-mcp/src/bologna.d.ts +209 -0
  5. package/dist/apps/acik-mcp/src/bologna.js +1321 -0
  6. package/dist/apps/acik-mcp/src/genel-ayristir.d.ts +83 -0
  7. package/dist/apps/acik-mcp/src/genel-ayristir.js +411 -0
  8. package/dist/apps/acik-mcp/src/http.js +4 -2
  9. package/dist/apps/acik-mcp/src/index.d.ts +6 -0
  10. package/dist/apps/acik-mcp/src/index.js +6 -0
  11. package/dist/apps/acik-mcp/src/kaynak-dogrula.d.ts +47 -0
  12. package/dist/apps/acik-mcp/src/kaynak-dogrula.js +319 -0
  13. package/dist/apps/acik-mcp/src/kaynak.d.ts +72 -0
  14. package/dist/apps/acik-mcp/src/kaynak.js +155 -0
  15. package/dist/apps/acik-mcp/src/kisisel-veri.d.ts +14 -2
  16. package/dist/apps/acik-mcp/src/kisisel-veri.js +63 -15
  17. package/dist/apps/acik-mcp/src/not-tablosu.d.ts +33 -0
  18. package/dist/apps/acik-mcp/src/not-tablosu.js +243 -0
  19. package/dist/apps/acik-mcp/src/promptlar.d.ts +25 -0
  20. package/dist/apps/acik-mcp/src/promptlar.js +253 -0
  21. package/dist/apps/acik-mcp/src/sunucu.d.ts +12 -4
  22. package/dist/apps/acik-mcp/src/sunucu.js +103 -24
  23. package/dist/apps/acik-mcp/src/temel.d.ts +54 -0
  24. package/dist/apps/acik-mcp/src/temel.js +10 -0
  25. package/dist/apps/acik-mcp/src/yardim.d.ts +56 -0
  26. package/dist/apps/acik-mcp/src/yardim.js +371 -0
  27. package/dist/packages/baglayicilar/src/bologna-proliz/ayristir.d.ts +29 -0
  28. package/dist/packages/baglayicilar/src/bologna-proliz/ayristir.js +200 -0
  29. package/package.json +4 -2
package/README.md CHANGED
@@ -1,24 +1,110 @@
1
1
  # @akredit/acik-mcp
2
2
 
3
- Yükseköğretimde kalite güvencesi ve akreditasyon işleri için herkese açık MCP sunucusu. Kendi yapay zekâ aracınıza (Claude, Claude Code, Cursor, VS Code) bağlanır ve ona yedi araç verir:
3
+ Yükseköğretimde kalite güvencesi ve akreditasyon işleri için herkese açık, ücretsiz MCP sunucusu. Kendi yapay zekâ aracınıza (Claude, ChatGPT, Claude Code, Cursor, VS Code) bağlanır; hazır başlangıçlar (istemler) ve on sekiz araç verir.
4
+
5
+ İlke: süreci sıfır kullanıcı müdahalesiyle, hızlıca ama denetimli ve teyitli tamamlamak. Akredit özgür yazılımdır; halüsinasyona yer yoktur.
6
+
7
+ ## İlk 2 dakika
8
+
9
+ 1. Asistanınıza `https://akredit.org/mcp` adresini ekleyin (aşağıda "Bağlantı") ya da yerelde `npx -y @akredit/acik-mcp` çalıştırın.
10
+ 2. Yeni sohbette `akredit` yazın ya da hazır başlangıçlardan `akredit` komutunu seçin. Claude'da "+" altında Akredit, Cursor ve Claude Code'da eğik çizgi (/) ile görünür. Görünmüyorsa "Akredit ile başlayalım" yazın.
11
+ 3. Odağınızı seçin. Her menünün son satırı "4) Hepsini akıllıca doldur"dur: asistan her alanı kendisi doldurur, denetler, geçmeyeni düzeltir ve sonunda tek özet gösterir. Değiştirmek istediğiniz alanın numarasını yazarsınız; sonradan da kolayca güncellersiniz.
12
+
13
+ ## Hiç bilmeyenler için
14
+
15
+ Yapay zekâyı ilk kez kullanıyorsanız bu adımları sırayla izleyin. Her adım tek iştir. Menü adları sürüme göre biraz farklı olabilir.
16
+
17
+ 1. Claude'a Akredit'i ekleyin. claude.ai'de sol alttaki adınıza tıklayın, Settings (Ayarlar), sonra Connectors (Bağlayıcılar). Add custom connector düğmesine basın. Ad: Akredit. Adres: `https://akredit.org/mcp`. Add deyin. Listede Akredit görünür.
18
+ 2. Yeni sohbet açın ve `akredit` yazın. Ekranda hangi aracı kullanmak istediğinizi soran bir menü görürsünüz. Bologna için 1 yazın.
19
+ 3. OBS'nize kendiniz girin. Asistan OBS adresinizi sorar ve tarayıcı aracı varsa sayfayı kenarda açar. Kullanıcı adınızı ve parolanızı yalnız OBS'nin kendi giriş ekranına, kendiniz yazın. Asistana, sohbete ya da Akredit'e asla yazmayın. Doğrulama kodu ve "Ben robot değilim" kutusu da sizindir. Girince asistana yalnız "girdim" yazın.
20
+ 4. Kenardaki tarayıcı. Claude in Chrome eklentisi, Claude masaüstü uygulamasının tarayıcı paneli ya da ChatGPT'nin ajan modu sayfayı okuyabilir. Asistan ders listenizi numaralı gösterir, siz dersin numarasını yazarsınız.
21
+ 5. Seçin. Asistan eksik alanları listeler. 4 yazarsanız hepsini akıllıca doldurur ve tek özet gösterir; isterseniz alan alan seçenek de görebilirsiniz. Kaynakları size sormaz: ders içeriğine uygun eserleri kendi web aramasıyla bulur, Akredit'in kaynak doğrulayıcısından geçirir ve bağlantısıyla gösterir. Doğrulanamayan kaynak önerilmez.
22
+ 6. OBS'ye yazma. Üç yol var: 1) asistan formu doldurur, Kaydet'e siz basarsınız 2) asistan doldurur ve sizin açık izninizle kaydeder (her sekmeden önce özet gösterip "evet" ister ya da bir kez "hepsini kaydet" izni alır) 3) alan alan kopyalarsınız. Tarayıcı aracı yoksa 3. yol kullanılır. Parolanız yine yalnız sizdedir.
23
+ 7. Engel olursa. Tarayıcı aracı yoksa, site açılmıyorsa, CAPTCHA ya da oturum düşmesi olursa asistana ne olduğunu yazın; adım adım çözüm verir. Hiçbiri olmazsa yedek yol hep var: OBS'de ders sayfasında Ctrl+A, Ctrl+C, sohbete Ctrl+V.
24
+
25
+ ## Hazır başlangıçlar (istemler)
26
+
27
+ | İstem | Ne yapar |
28
+ |---|---|
29
+ | `akredit` | Araç menüsü: önce hangi aracı kullanacağınızı sorar (Bologna paketi, öğrenme çıktısı, ÇK/PÇ hesabı, ölçüt rehberi, dil denetimi ya da başka bir araç). |
30
+ | `bologna_doldur` | OBS'nize kendiniz girersiniz; asistan Bologna sayfanızı okur, eksikleri akıllıca tamamlayıp denetler, tek özet gösterir; formu doldurur ya da kopya metni verir. Kaydet'e siz basarsınız ya da açık izninizle asistan basar. |
31
+ | `cikti_yaz` | Ders öğrenme çıktılarını ölçülebilir fiillerle tek adımda yazar ya da iyileştirir, denetler, özet gösterir. |
32
+ | `ck_pc_hesabi` | Excel not tablonuzu yapıştırırsınız; öğrencilere takma ad verilir, ÇK ve PÇ sağlanma düzeyi hesaplanır. |
33
+ | `olcut_rehberi` | YÖKAK, MÜDEK, FEDEK, EPDAD ya da SABAK ölçütünü resmî metniyle bulur, kanıt listesi çıkarır. |
34
+ | `dil_denetimi` | Rapor metnini denetler, bulguları düzeltip yeniden denetler, tek özet gösterir. |
35
+
36
+ ## Araçlar
4
37
 
5
38
  | Araç | Ne yapar |
6
39
  |---|---|
7
- | `olcut_ara` | YÖKAK ya da program akreditasyonu (MÜDEK, FEDEK, SABAK, EPDAD) ölçütlerinde, EPDAD göstergelerinde ve programa özgü konularda arar. |
8
- | `olcut_getir` | Bir ölçütün resmî metnini, üst ve alt ölçütlerini, varsa göstergelerini ve programa özgü konularını kaynak sayfasıyla getirir. |
40
+ | `olcut_ara` | YÖKAK ya da program akreditasyonu (MÜDEK, FEDEK, SABAK, EPDAD) ölçütlerinde arar. |
41
+ | `olcut_getir` | Bir ölçütün resmî metnini kaynak sayfasıyla getirir. |
9
42
  | `olgunluk_duzeyleri` | Alt ölçütün olgunluk düzeylerini ve örnek kanıtlarını getirir. |
10
- | `oz_degerlendirme_iskeleti` | Öz değerlendirme raporu iskeletini çıkarır; her bölüm EKSİK işaretli ve gereken kanıt türleriyle gelir. |
11
- | `bologna_denetle` | Bologna ders bilgisini eksik ve tutarsız alanlar için denetler. |
43
+ | `oz_degerlendirme_iskeleti` | Öz değerlendirme raporu iskeletini çıkarır; her bölüm EKSİK işaretli gelir. |
44
+ | `bologna_ayristir` | Yapıştırılan ya da tarayıcıyla okunan Bologna sayfasını çözer. Önce Proliz, olmazsa her OBS için genel ayrıştırıcı (HTML ya da düz metin, Türkçe ya da İngilizce). Bulunan ve bulunamayan alanları ve güven düzeyini söyler. Adres çekmez. |
45
+ | `bologna_denetle` | Bologna ders paketini denetler; boş, zayıf ve tamam alanları numaralı verir. |
46
+ | `bologna_alan_rehberi` | Bir alanın doldurma kurallarını, sınırlarını, kalıplarını ve Bloom fiillerini verir. |
47
+ | `bologna_taslak_denetle` | Asistanın yazdığı 1-3 seçeneği kurallarla denetler: geçer ya da eksik nedenleri. Toplamları kendisi hesaplar. |
48
+ | `is_yuku_oner` | AKTS ve T+U+L'den toplamı hedefe tam eşit üç iş yükü dağılımı önerir. |
49
+ | `bologna_durum` | Seçilen alanların bütününe bakar: kaç alan kaldı, tamamlandı mı. |
50
+ | `bologna_kopya_metni` | Seçilen alanları OBS'ye alan alan kopyalanacak düz metin olarak verir. |
51
+ | `kaynak_bicimle` | Kitap ya da makale bilgisini APA 7'ye benzer künyeye çevirir; eksik bilgiyi [EKSİK] yazar, uydurmaz. |
52
+ | `kaynak_dogrula` | DOI, ISBN ya da başlık ile yazarı açık kataloglarda (Crossref, Open Library, Google Books) arar. Bulursa doğrulanmış künye ve bağlantı, bulamazsa "doğrulanamadı" döner; doğrulanamayan kaynak önerilmez. |
53
+ | `not_tablosu_ayristir` | Excel ya da CSV not tablosunu ÇK/PÇ hesabına hazırlar; ad ve numara sütunlarını atıp öğrencilere takma ad verir, başlıklardan soru ve çıktı eşlemesini sezer. |
12
54
  | `ck_pc_hesapla` | Ders öğrenme çıktısı ve program çıktısı sağlanma düzeyini hesaplar. |
13
55
  | `rapor_dil_denetle` | Rapor metninde kanıtsız üstünlük, belirsiz özne gibi dil sorunlarını işaretler. |
56
+ | `kurulum_yardimi` | Bağlayıcı ekleme ve OBS'ye tarayıcıyla giriş için istemciye göre adım adım rehber. |
57
+ | `engel_coz` | Tarayıcı aracı yok, site açılmıyor, CAPTCHA, çerçeve, oturum düşmesi gibi engeller için numaralı çözüm adımları. |
58
+
59
+ Sunucu model çağırmaz ve metin üretmez. Bologna seçeneklerini sizin asistanınız yazar; Akredit kural ve kalıp verir, yazılanı denetler, sayıları hesaplar. Kurallar Akredit'in iç kurallarıdır, resmî ölçüt değildir; kurumunuzun yönergesi önceliklidir.
60
+
61
+ ## Örnek konuşma (kurgu ders)
62
+
63
+ ```
64
+ Hoca: akredit
65
+ Asistan: Bugün neye odaklanalım? 1) Bologna paketi 2) Öğrenme çıktısı 3) ÇK/PÇ 4) Ölçüt rehberi 5) Dil denetimi
66
+ Hoca: 1
67
+ Asistan: Önce bir kural: kullanıcı adınızı ve parolanızı yalnız OBS'nin kendi ekranına, kendiniz yazın.
68
+ Bana asla yazmayın. OBS adresiniz nedir?
69
+ Hoca: obs.kurgu.edu.tr
70
+ Asistan: OBS giriş ekranını kenarda açtım. Bilgilerinizi oraya yazın, bitince bana yalnız "girdim" yazın.
71
+ Hoca: girdim
72
+ Asistan: Dersleriniz: 1) KRG204 Kurgu Ölçme Yöntemleri 2) KRG305 Kurgu Veri Çözümlemesi. Hangisi?
73
+ Hoca: 1
74
+ Asistan: Sayfayı okudum. 9 alan eksik ya da zayıf:
75
+ 1) Amaç (boş) 2) İçerik (8 kelime) 3) Çıktılar (2 var, 8-12 olmalı) 4) Haftalar (3 var) ...
76
+ 1) Alan alan seçenek göstereyim 2) Yalnız boşlar 3) Kendim seçeyim 4) Hepsini akıllıca doldur (önerilen)
77
+ Hoca: 4
78
+ Asistan: Şu alanları şöyle doldurdum, hepsi denetimden geçti:
79
+ 1) Amaç: "Bu ders, kurgu ölçme kavramlarını ..." (66 kelime)
80
+ 2) İçerik: ... 3) Çıktılar: 8 çıktı ... 9) Kaynaklar: 2 eser, ikisi de katalogda doğrulandı:
81
+ Deneme, C. (2019). Kurgu istatistiği. Kurgu Akademi. https://books.google.com/books?id=...
82
+ Değiştirmek istediğiniz alanın numarasını yazın; yoksa devam diyebilirsiniz.
83
+ Bunları daha sonra da kolayca güncelleyebilirsiniz.
84
+ Hoca: devam
85
+ Asistan: OBS'ye nasıl yazalım? 1) Formu ben doldurayım, Kaydet'e siz basın
86
+ 2) Formu ben doldurup kaydedeyim (her sekmeden önce evet isterim) 3) Alan alan kopyalayın
87
+ 4) Hepsini akıllıca doldur ve kaydet (önerilen)
88
+ Hoca: 4
89
+ Asistan: Bütün sekmeleri doldurup kaydetmem için izin veriyor musunuz? hepsini kaydet / hayır
90
+ Hoca: hepsini kaydet
91
+ Asistan: Üç sekmeyi doldurdum ve kaydettim. Dersi Verenler satırına dokunmadım.
92
+ Asistan: Sayfayı yeniden okudum ve denetledim: Tamamlandı.
93
+ ```
14
94
 
15
- ## Salt okuma
95
+ ## Salt okuma ve güvenlik
16
96
 
17
97
  - Bütün araçlar salt okumadır ve aynı girdiye aynı sonucu verir.
18
98
  - Hesap ve anahtar gerekmez. Kurum verisine erişmez, hiçbir yere yazmaz, yapay zekâ modeli çağırmaz.
99
+ - Giriş bilgisi hiç girmez: parola, doğrulama kodu ya da oturum çerezi görülürse çağrı reddedilir, değer yanıta yazılmaz. İstemler asistana hocadan giriş bilgisi istemeyi yasaklar. CAPTCHA'yı hoca çözer. OBS'de Kaydet'e hoca basar ya da hocanın açık izniyle asistan basar; onaya gönderimi hoca yapar.
19
100
  - Ölçüt metinleri resmî belgeden alınmıştır. Her yanıt kaynağını (belge adresi, sayfa, SHA-256) taşır. Belgeden alınamayan metin DOĞRULANMADI olarak döner.
20
101
  - Sayılar yalnız hesaptan gelir; araçlar metin uydurmaz.
21
- - Araçlara öğrenci adı, numarası ya da başka kişisel veri göndermeyin. Bağladığınız yapay zekâ hizmeti girdiyi kendi koşullarıyla işler.
102
+ - Bologna sayfasındaki Dersi Verenler, Dersin Yardımcıları ve Koordinatör satırları hocanın kendi sayfasında yayımlanmış görev bilgisidir: olduğu gibi okunur, korunur ve OBS'ye geri yazılırken değiştirilmez. Bologna araçlarında yalnız giriş bilgisi reddedilir.
103
+ - Öğrenci verisi takma adla işlenir: `not_tablosu_ayristir` ad, soyad ve numara sütunlarını hesaplamadan önce bellekte atar ve o1, o2 takma adı verir; not tablosu ve ÇK/PÇ araçlarında kalan ad ya da numara reddedilir. Öbür araçlarda T.C. kimlik numarası, öğrenci numarası ve IBAN reddedilir.
104
+ - Sunucu istek içeriğini günlüğe yazmaz.
105
+ - Kaynakçadaki yazar adları yayımlanmış künyedir; kaynak alanlarında serbesttir. Kaynak uydurulmaz: asistan web aramasıyla aday bulur, her adayı `kaynak_dogrula` ile katalogda doğrular ve yalnız doğrulananı bağlantısıyla önerir.
106
+ - Sunucu kullanıcıdan adres almaz. Bologna sayfasını siz yapıştırırsınız ya da asistanınız kendi tarayıcı veya web aracıyla okur.
107
+ - Dış istek: `kaynak_dogrula` yalnız api.crossref.org, openlibrary.org ve www.googleapis.com (Books) adreslerine sorar; sunucuyu kendiniz barındırıyorsanız bu üç adrese HTTPS çıkışı açık olmalıdır. Bağladığınız yapay zekâ hizmeti girdiyi kendi koşullarıyla işler.
22
108
 
23
109
  ## Bağlantı
24
110
 
@@ -42,7 +128,7 @@ Uzak sunucu:
42
128
  claude mcp add --transport http akredit https://akredit.org/mcp
43
129
  ```
44
130
 
45
- Yerel sunucu (Node.js 22.18 ya da üstü):
131
+ Yerel sunucu (npm paketi `@akredit/acik-mcp`, Node.js 22.18 ya da üstü):
46
132
 
47
133
  ```bash
48
134
  claude mcp add akredit -- npx -y @akredit/acik-mcp
@@ -1,31 +1,5 @@
1
- import { z } from "zod";
2
- export declare const DEPO = "https://github.com/tialkan/akredit";
3
- /** Her yanıtta yer alan not. */
4
- export declare const AKREDIT_NOTU = "Akredit ba\u011F\u0131ms\u0131z, a\u00E7\u0131k kaynak bir ara\u00E7t\u0131r; Y\u00D6KAK ile ba\u011F\u0131 yoktur. Sonu\u00E7lar resm\u00EE de\u011Ferlendirme yerine ge\u00E7mez; beyan ve karar kurumdad\u0131r.";
5
- export interface Kaynak {
6
- ad: string;
7
- adres: string;
8
- sayfa?: number | null;
9
- sha256?: string | null;
10
- erisimTarihi?: string;
11
- }
12
- export interface AracSonucu {
13
- sonuc: unknown;
14
- kaynak: Kaynak[];
15
- }
16
- export interface AracBaglami {
17
- simdi: () => Date;
18
- }
19
- export interface AcikArac<S extends z.ZodObject = z.ZodObject> {
20
- ad: string;
21
- baslik: string;
22
- aciklama: string;
23
- girdi: S;
24
- calistir: (girdi: z.infer<S>, b: AracBaglami) => AracSonucu;
25
- }
26
- /** Araç girdisi hatası: kullanıcıya gösterilecek Türkçe ileti. */
27
- export declare class AracHatasi extends Error {
28
- }
1
+ import { type AcikArac } from "./temel.ts";
2
+ export * from "./temel.ts";
29
3
  /** Düzey tanımı belgeden ayrılamayan gösterge için dönen değer; tanım uydurulmaz. */
30
4
  export declare const OKUNAMADI = "Belgeden okunamad\u0131";
31
5
  export declare const ACIK_ARACLAR: readonly AcikArac[];
@@ -2,17 +2,17 @@
2
2
  // durum yok. Ölçüt metni yalnız resmî belgeden çıkarılmış çerçeve verisinden gelir (ilke 6); belgeden
3
3
  // alınamayan metin DOĞRULANMADI olarak döner. Sayılar yalnız @akredit/olcme hesabından gelir (ilke 2).
4
4
  // Öz değerlendirme iskeleti metin yazmaz: her bölüm EKSİK işaretiyle ve gereken kanıt türleriyle döner (ilke 1).
5
- import { bolognaDenetle, dilDenetle, } from "../../../packages/cekirdek/src/index.js";
5
+ import { dilDenetle } from "../../../packages/cekirdek/src/index.js";
6
6
  import { belgeAdi, DOGRULANMADI, EPDAD_DERECELENDIRME_ANAHTARI, olcutEkleri, ozguBagi, ozguBolumListesi, PROGRAM_BELGELERI, PROGRAM_CERCEVELERI, tumOlcutler, YOKAK_KIDR_3_2_1, YOKAK_KURUMSAL_3_3, } from "../../../packages/cerceveler/src/index.js";
7
7
  import { dersiOlc, HESAP_SURUMU } from "../../../packages/olcme/src/index.js";
8
8
  import { z } from "zod";
9
- export const DEPO = "https://github.com/tialkan/akredit";
10
- /** Her yanıtta yer alan not. */
11
- export const AKREDIT_NOTU = "Akredit bağımsız, açık kaynak bir araçtır; YÖKAK ile bağı yoktur. Sonuçlar resmî değerlendirme yerine geçmez; beyan ve karar kurumdadır.";
12
- const arac = (a) => a;
13
- /** Araç girdisi hatası: kullanıcıya gösterilecek Türkçe ileti. */
14
- export class AracHatasi extends Error {
15
- }
9
+ import { BOLOGNA_ARACLARI, bolognaDenetleAraci } from "./bologna.js";
10
+ import { kaynakBicimleAraci } from "./kaynak.js";
11
+ import { kaynakDogrulaAraci } from "./kaynak-dogrula.js";
12
+ import { notTablosuAyristirAraci } from "./not-tablosu.js";
13
+ import { AracHatasi, arac, DEPO, KOD_KAYNAGI } from "./temel.js";
14
+ import { engelCozAraci, kurulumYardimiAraci } from "./yardim.js";
15
+ export * from "./temel.js";
16
16
  // ---------------------------------------------------------------- Çerçeve yardımcıları
17
17
  const BELGE_ADI = {
18
18
  [YOKAK_KURUMSAL_3_3.kaynak?.dosya ?? ""]: "YÖKAK Değerlendirme Programları Kılavuzu 3.3, Ek-1 Dereceli Değerlendirme Anahtarı",
@@ -77,7 +77,6 @@ function belgeKaynagi(c, dosya, sayfa) {
77
77
  };
78
78
  }
79
79
  const olcutKaynagi = (c, o) => belgeKaynagi(c, o.kaynakDosya, o.kaynakSayfa);
80
- const KOD_KAYNAGI = (yol, ad) => ({ ad, adres: `${DEPO}/tree/main/${yol}` });
81
80
  function olcutBul(c, kod) {
82
81
  const k = kod.trim().toLocaleUpperCase("tr").replace(/\.$/u, "");
83
82
  const o = tumOlcutler(c.olcutler).find((x) => x.kod === k);
@@ -91,7 +90,8 @@ const metinGoster = (o) => (o.metinDurumu === "dogrulanmadi" ? DOGRULANMADI : o.
91
90
  const olcutAra = arac({
92
91
  ad: "olcut_ara",
93
92
  baslik: "Ölçüt ara (YÖKAK ve program akreditasyonu)",
94
- aciklama: "YÖKAK 3.3 ya da bir program akreditasyonu çerçevesinin (MÜDEK, FEDEK, SABAK, EPDAD) ölçüt ağacında kod, başlık ya da metinde geçen ifadeye göre arar. Program çerçevelerinde EPDAD göstergeleri ile MÜDEK EK-1 ve FEDEK programa özgü konular da aranır. Metinler resmî belgeden çıkarılmıştır; belgeden alınamayan metin DOĞRULANMADI olarak döner.",
93
+ aciklama: "YÖKAK ya da program akreditasyonu (MÜDEK, FEDEK, SABAK, EPDAD) ölçütlerinde sözcük ya da kodla arar. Metinler resmî belgeden alınır; alınamayan metin DOĞRULANMADI döner.",
94
+ sonrakiAdim: "Hocaya en uygun 2-3 sonucu numaralı gösterin; seçtiği ölçütün tam metni için olcut_getir'i çağırın.",
95
95
  girdi: z.object({
96
96
  sorgu: z.string().trim().min(1).max(200).describe("Aranacak ifade ya da kod, ör. 'paydaş katılımı' ya da 'B.3'"),
97
97
  cerceve: cerceveGirdisi,
@@ -171,7 +171,8 @@ const olcutAra = arac({
171
171
  const olcutGetir = arac({
172
172
  ad: "olcut_getir",
173
173
  baslik: "Ölçütü getir (YÖKAK ve program akreditasyonu)",
174
- aciklama: "Bir ölçütün resmî metnini, kaynak belgesini, sayfasını ve belgenin SHA-256 özetini döndürür. Alt ölçütlerin listesi ve üst ölçüt de gelir. EPDAD alt standartlarında göstergeler ve dörtlü düzey tanımları gelir (belgeden ayrılamayan tanım 'Belgeden okunamadı' döner). MÜDEK 5.1 ve FEDEK 10.1'de disipline ya da programa özgü bölümlerin listesi gelir; bölüm kodu verilirse o bölümün konuları da gelir. Belgeden alınamayan metin DOĞRULANMADI olarak döner; tahminle doldurulmaz.",
174
+ aciklama: "Bir ölçütün resmî metnini kaynak belge, sayfa ve dosya özetiyle getirir; üst ve alt ölçütler, EPDAD göstergeleri, MÜDEK ve FEDEK programa özgü bölümleri de gelir. Metin tahminle doldurulmaz.",
175
+ sonrakiAdim: "Alt ölçütse olgunluk_duzeyleri ile düzeyleri ve örnek kanıtları gösterin. Hocaya sorun: 1) örnek kanıtlar 2) başka ölçüt 3) öz değerlendirme iskeleti.",
175
176
  girdi: z.object({
176
177
  kod: z
177
178
  .string()
@@ -235,7 +236,8 @@ const olcutGetir = arac({
235
236
  const olgunlukDuzeyleri = arac({
236
237
  ad: "olgunluk_duzeyleri",
237
238
  baslik: "Alt ölçüt olgunluk düzeyleri ve örnek kanıtlar",
238
- aciklama: "Bir alt ölçütün (ör. 'B.1.2') dereceli değerlendirme anahtarındaki 1-5 olgunluk düzeyi metinlerini ve belgedeki örnek kanıtları döndürür. Düzeyi siz ya da kurumunuz belirler; bu araç düzey önermez.",
239
+ aciklama: "Bir YÖKAK alt ölçütünün (ör. B.1.2) 1-5 olgunluk düzeyi metinlerini ve örnek kanıtlarını getirir. Düzey önermez; düzeye kurum kanıtla karar verir.",
240
+ sonrakiAdim: "Örnek kanıtları hocanın elindekilerle eşleştirin: her kanıt için 1) var 2) yok 3) emin değilim diye sorun. Yok olanlar EKSİK kalır.",
239
241
  girdi: z.object({ kod: z.string().trim().min(1).max(20).describe("Alt ölçüt kodu, ör. 'B.1.2'") }),
240
242
  calistir: ({ kod }) => {
241
243
  const CERCEVE = YOKAK_KURUMSAL_3_3;
@@ -265,7 +267,8 @@ const olgunlukDuzeyleri = arac({
265
267
  const ozDegerlendirmeIskeleti = arac({
266
268
  ad: "oz_degerlendirme_iskeleti",
267
269
  baslik: "Öz değerlendirme raporu iskeleti",
268
- aciklama: "KİDR 3.2.1 şablonuna göre rapor bölümlerini, her bölümün ölçüt ve alt ölçütlerini ve gereken örnek kanıtları döndürür. Metin yazmaz: her alt ölçüt EKSİK işaretiyle gelir, kanıt bağlandıkça doldurulur.",
270
+ aciklama: "Öz değerlendirme raporunun (KİDR 3.2.1) bölümlerini, alt ölçütlerini ve gereken örnek kanıtları verir. Metin yazmaz; her bölüm EKSİK gelir.",
271
+ sonrakiAdim: "Hocanın yazdığı bölüm metnini rapor_dil_denetle ile denetleyin. Kanıtı olmayan cümle EKSİK kalır.",
269
272
  girdi: z.object({
270
273
  bolum: z
271
274
  .enum(["A", "B", "C", "D"])
@@ -308,112 +311,15 @@ const ozDegerlendirmeIskeleti = arac({
308
311
  };
309
312
  },
310
313
  });
311
- // ---------------------------------------------------------------- Bologna denetimi
312
- const sayiYaDaBos = z.number().nullable().default(null);
313
- const BolognaDersGirdisi = z.object({
314
- kod: z.string().trim().min(1).max(30),
315
- ad: z.string().max(200).optional(),
316
- zorunlu: z.boolean().default(true),
317
- yariyil: z.number().int().min(1).max(16).nullable().default(null),
318
- tul: z.string().max(20).optional().describe("Teori+Uygulama+Laboratuvar, ör. '2+1+0'"),
319
- kredi: sayiYaDaBos,
320
- akts: sayiYaDaBos,
321
- guncelleme: z.string().max(20).optional().describe("Son güncelleme tarihi, GG.AA.YYYY"),
322
- ciktilar: z
323
- .array(z.object({ kod: z.string().max(20), metin: z.string().max(1000) }))
324
- .max(40)
325
- .default([]),
326
- degerlendirme: z
327
- .array(z.object({ ad: z.string().max(200), sayi: sayiYaDaBos, katki: sayiYaDaBos }))
328
- .max(40)
329
- .default([]),
330
- isyuku: z
331
- .array(z.object({ ad: z.string().max(200), sayi: sayiYaDaBos, sure: sayiYaDaBos, toplam: sayiYaDaBos }))
332
- .max(40)
333
- .default([]),
334
- dersYapisi: z
335
- .array(z.object({ alan: z.string().max(200), yuzde: sayiYaDaBos }))
336
- .max(20)
337
- .default([]),
338
- haftalar: z.number().int().min(0).max(30).default(0).describe("Haftalık konu satırı sayısı"),
339
- katki: z
340
- .record(z.string().max(20), z.record(z.string().max(20), z.string().max(5)))
341
- .default({})
342
- .describe("Ders çıktısı ya da 'Tüm' satırı → program çıktısı kodu → katkı değeri ('1'-'5', '' ya da '-')"),
343
- });
344
- const bolognaDenetleAraci = arac({
345
- ad: "bologna_denetle",
346
- baslik: "Bologna ders bilgisini denetle",
347
- aciklama: "Yapıştırdığınız ders bilgi paketi verisini (AKTS, iş yükü, değerlendirme, öğrenme çıktıları, katkı tablosu) Akredit'in Bologna kurallarıyla denetler: AKTS-iş yükü uyumu, değerlendirme toplamı, eksik çıktı, güncellik, matris tutarlılığı. Kurallar resmî ölçüt değildir; tutarsızlığı işaretler, kararı komisyon verir.",
348
- girdi: z.object({
349
- ders: BolognaDersGirdisi,
350
- programCiktilari: z
351
- .array(z.object({ kod: z.string().max(20), metin: z.string().max(1000) }))
352
- .max(40)
353
- .optional()
354
- .describe("Program çıktıları; verilirse program düzeyindeki kurallar da çalışır"),
355
- matrisSatiri: z
356
- .record(z.string().max(20), z.string().max(5))
357
- .optional()
358
- .describe("Program matrisinde bu dersin satırı: program çıktısı kodu → değer"),
359
- aktsSaat: z
360
- .tuple([z.number().min(1), z.number().max(60)])
361
- .optional()
362
- .describe("AKTS başına saat aralığı; varsayılan [25, 30]"),
363
- }),
364
- calistir: ({ ders, programCiktilari, matrisSatiri, aktsSaat }, b) => {
365
- const sayfa = {
366
- ...ders,
367
- ad: ders.ad ?? ders.kod,
368
- bilgiler: {},
369
- };
370
- const pkodlar = Object.keys(matrisSatiri ?? {});
371
- const veri = {
372
- adres: "kullanici-girdisi",
373
- okundu: b.simdi().toISOString(),
374
- programCiktilari: programCiktilari ?? [],
375
- matris: {
376
- pkodlar,
377
- dersler: matrisSatiri
378
- ? [
379
- {
380
- kod: ders.kod,
381
- ad: ders.ad ?? ders.kod,
382
- zorunlu: ders.zorunlu,
383
- grup: null,
384
- yariyil: ders.yariyil,
385
- grupBasligi: false,
386
- degerler: matrisSatiri,
387
- },
388
- ]
389
- : [],
390
- },
391
- tyycIsaret: null,
392
- dersler: [{ ...sayfa, zorunlu: ders.zorunlu, bos: false, kaynak: "kullanici-girdisi" }],
393
- };
394
- let bulgular = bolognaDenetle(veri, { simdi: b.simdi().getTime(), ...(aktsSaat ? { aktsSaat } : {}) });
395
- // Program düzeyi kuralları yalnız program çıktıları verildiyse anlamlıdır.
396
- if (!programCiktilari)
397
- bulgular = bulgular.filter((x) => x.konu !== "-");
398
- return {
399
- sonuc: {
400
- ders: ders.kod,
401
- hataSayisi: bulgular.filter((x) => x.duzey === "hata").length,
402
- uyariSayisi: bulgular.filter((x) => x.duzey === "uyari").length,
403
- bulgular,
404
- not: "Kurallar Akredit'in iç kurallarıdır, resmî ölçüt değildir. Düzeltme kararını ders sorumlusu ve komisyon verir.",
405
- },
406
- kaynak: [KOD_KAYNAGI("packages/cekirdek/src/bologna/denetim.ts", "Akredit Bologna denetim kuralları")],
407
- };
408
- },
409
- });
410
314
  // ---------------------------------------------------------------- ÇK/PÇ sağlanma hesabı
411
315
  const kimlik = z.string().trim().min(1).max(30);
412
316
  const ANONIM = /^(?![0-9]{7,}$)[\p{L}\p{N}_.-]{1,24}$/u;
413
317
  const ckPcHesapla = arac({
414
318
  ad: "ck_pc_hesapla",
319
+ kisiselVeriKapsami: "tam",
415
320
  baslik: "ÇK ve PÇ sağlanma düzeyi hesabı",
416
- aciklama: "Anonim puan tablosundan ders öğrenme çıktısı (ÇK) başarısını ve program çıktısı (PÇ) sağlanma düzeyini hesaplar (@akredit/olcme). Öğrenci kimliği yerine 'o1', 'o2' gibi takma ad kullanın; numara ve ad kabul edilmez. Öğrenci bazında sonuç dönmez, yalnız toplu değerler döner.",
321
+ aciklama: "Takma adlı puan tablosundan ders öğrenme çıktısı (ÇK) başarısını ve program çıktısı (PÇ) sağlanma düzeyini hesaplar. Öğrenci adı ve numarası kabul edilmez; yalnız toplu sonuç döner.",
322
+ sonrakiAdim: "Sonucu tablo olarak gösterin, sayıları yalnız bu yanıttan alın. Eşiğin altında kalan çıktılar için hocaya sorun: 1) iyileştirme notu yaz 2) başka eşikle yeniden hesapla 3) bitir.",
417
323
  girdi: z.object({
418
324
  dersKodu: kimlik,
419
325
  donem: z.string().trim().min(1).max(40).describe("ör. '2025-2026 Güz'"),
@@ -511,7 +417,8 @@ const ckPcHesapla = arac({
511
417
  const raporDilDenetle = arac({
512
418
  ad: "rapor_dil_denetle",
513
419
  baslik: "Rapor dil denetimi",
514
- aciklama: "Öz değerlendirme ya da faaliyet raporu metnini dil kurallarıyla denetler: kanıtsız üstünlük ifadesi, ölçüsüz nicelik, yazıyla sayı, öznesiz eylem, dönem ve tarih tutarlılığı. Metni değiştirmez, yalnız işaretler. Paragrafları boş satırla ayırın.",
420
+ aciklama: "Rapor metnindeki dil sorunlarını işaretler: kanıtsız üstünlük, ölçüsüz nicelik, öznesiz eylem, dönem ve tarih tutarsızlığı. Metni değiştirmez.",
421
+ sonrakiAdim: "Her bulgu için 2-3 numaralı düzeltme seçeneği sunun (uydurma sayı ya da kanıt eklemeden); hoca seçince düzeltilmiş metni yeniden denetleyin.",
515
422
  girdi: z.object({
516
423
  metin: z.string().min(1).max(60_000),
517
424
  donem: z
@@ -543,6 +450,12 @@ export const ACIK_ARACLAR = [
543
450
  olgunlukDuzeyleri,
544
451
  ozDegerlendirmeIskeleti,
545
452
  bolognaDenetleAraci,
453
+ ...BOLOGNA_ARACLARI,
454
+ kaynakBicimleAraci,
455
+ kaynakDogrulaAraci,
456
+ notTablosuAyristirAraci,
546
457
  ckPcHesapla,
547
458
  raporDilDenetle,
459
+ kurulumYardimiAraci,
460
+ engelCozAraci,
548
461
  ];
@@ -0,0 +1,209 @@
1
+ import { type Bulgu } from "../../../packages/cekirdek/src/index.js";
2
+ import { z } from "zod";
3
+ import { type AcikArac } from "./temel.ts";
4
+ export declare const ALAN_KODLARI: readonly ["amac", "icerik", "yontem", "notlar", "onKosul", "ciktilar", "degerlendirme", "isyuku", "dersYapisi", "haftalar", "katki", "ska", "kaynaklar", "yetkililer"];
5
+ export type AlanKodu = (typeof ALAN_KODLARI)[number];
6
+ interface AlanBilgisi {
7
+ ad: string;
8
+ /** OBS düzenleme ekranındaki sekme (Proliz). */
9
+ sekme: string;
10
+ kurallar: string[];
11
+ sinir?: Record<string, number | string>;
12
+ kaliplar: string[];
13
+ yasaklar: string[];
14
+ /** MCP bu alanı taşıyabilir mi (kişisel veri sınırı). */
15
+ mcpTasir: boolean;
16
+ }
17
+ /** Akredit'in Bologna doldurma kuralları (packages/cekirdek/src/bologna/taslak.ts, apps/cli/skills/bologna-doldur). */
18
+ export declare const ALANLAR: Record<AlanKodu, AlanBilgisi>;
19
+ /** Bloom'un yenilenmiş sınıflaması düzeylerine göre örnek fiiller. Akredit örneğidir, resmî liste değildir. */
20
+ export declare const BLOOM_FIILLERI: {
21
+ duzey: string;
22
+ fiiller: string[];
23
+ }[];
24
+ /** Bir taslak bulgusunun hangi alana ait olduğu. "genel" birden çok alana değen bulgudur. */
25
+ export declare function bulguAlani(b: Bulgu): AlanKodu | "temel" | "genel";
26
+ declare const TaslakAlanlari: z.ZodObject<{
27
+ amac: z.ZodOptional<z.ZodObject<{
28
+ tr: z.ZodString;
29
+ en: z.ZodOptional<z.ZodString>;
30
+ }, z.core.$strip>>;
31
+ icerik: z.ZodOptional<z.ZodObject<{
32
+ tr: z.ZodString;
33
+ en: z.ZodOptional<z.ZodString>;
34
+ }, z.core.$strip>>;
35
+ yontem: z.ZodOptional<z.ZodObject<{
36
+ tr: z.ZodString;
37
+ en: z.ZodOptional<z.ZodString>;
38
+ }, z.core.$strip>>;
39
+ notlar: z.ZodOptional<z.ZodObject<{
40
+ tr: z.ZodString;
41
+ en: z.ZodOptional<z.ZodString>;
42
+ }, z.core.$strip>>;
43
+ onKosul: z.ZodOptional<z.ZodString>;
44
+ ciktilar: z.ZodOptional<z.ZodArray<z.ZodObject<{
45
+ kod: z.ZodString;
46
+ tr: z.ZodString;
47
+ en: z.ZodOptional<z.ZodString>;
48
+ tur: z.ZodEnum<{
49
+ Bilgi: "Bilgi";
50
+ Beceri: "Beceri";
51
+ Yetkinlik: "Yetkinlik";
52
+ }>;
53
+ }, z.core.$strip>>>;
54
+ degerlendirme: z.ZodOptional<z.ZodArray<z.ZodObject<{
55
+ ad: z.ZodString;
56
+ sayi: z.ZodNumber;
57
+ katki: z.ZodNumber;
58
+ }, z.core.$strip>>>;
59
+ isyuku: z.ZodOptional<z.ZodArray<z.ZodObject<{
60
+ ad: z.ZodString;
61
+ sayi: z.ZodNumber;
62
+ sure: z.ZodNumber;
63
+ }, z.core.$strip>>>;
64
+ dersYapisi: z.ZodOptional<z.ZodArray<z.ZodObject<{
65
+ alan: z.ZodString;
66
+ yuzde: z.ZodNumber;
67
+ }, z.core.$strip>>>;
68
+ haftalar: z.ZodOptional<z.ZodArray<z.ZodObject<{
69
+ hafta: z.ZodNumber;
70
+ konu: z.ZodObject<{
71
+ tr: z.ZodString;
72
+ en: z.ZodOptional<z.ZodString>;
73
+ }, z.core.$strip>;
74
+ onHazirlik: z.ZodString;
75
+ dokuman: z.ZodString;
76
+ }, z.core.$strip>>>;
77
+ katki: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodNull, z.ZodLiteral<"">]>>>>;
78
+ ska: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
79
+ kaynaklar: z.ZodOptional<z.ZodArray<z.ZodString>>;
80
+ kaynakSayisi: z.ZodOptional<z.ZodNumber>;
81
+ }, z.core.$strip>;
82
+ type TaslakAlanlariT = z.infer<typeof TaslakAlanlari>;
83
+ export interface Yetkili {
84
+ /** Sayfadaki etiket, ör. "Dersi Verenler". */
85
+ rol: string;
86
+ /** Sayfadaki değer, olduğu gibi. */
87
+ deger: string;
88
+ }
89
+ declare const DersTemeli: z.ZodObject<{
90
+ kod: z.ZodOptional<z.ZodString>;
91
+ ad: z.ZodOptional<z.ZodString>;
92
+ akts: z.ZodOptional<z.ZodNumber>;
93
+ tul: z.ZodOptional<z.ZodString>;
94
+ bolen: z.ZodDefault<z.ZodNumber>;
95
+ yetkililer: z.ZodOptional<z.ZodArray<z.ZodObject<{
96
+ rol: z.ZodString;
97
+ deger: z.ZodString;
98
+ }, z.core.$strip>>>;
99
+ }, z.core.$strip>;
100
+ type DersTemeliT = z.infer<typeof DersTemeli>;
101
+ /** Taslak alanlarını cekirdek kurallarıyla denetler; yalnız verilen alanların bulgularını alan alan döndürür. */
102
+ export declare function alanBulgulari(ders: DersTemeliT, alanlar: TaslakAlanlariT, s: {
103
+ ingilizce: boolean;
104
+ programCiktilari?: string[] | undefined;
105
+ }): Map<AlanKodu | "genel", Bulgu[]>;
106
+ /** Bütün sayılar burada hesaplanır; asistan toplam yazmaz (ilke 2). */
107
+ export declare function bolognaHesabi(ders: DersTemeliT, alanlar: TaslakAlanlariT): {
108
+ isyuku: {
109
+ satirlar: {
110
+ ad: string;
111
+ sayi: number;
112
+ sure: number;
113
+ toplam: number;
114
+ }[];
115
+ toplam: number;
116
+ hedef: number | null;
117
+ fark: number | null;
118
+ aktsBasinaSaat: number | null;
119
+ dersSuresiHaftalikBeklenen: number | null;
120
+ dersSuresiHaftalikVerilen: number | null;
121
+ aciklama: string;
122
+ } | null;
123
+ degerlendirmeToplami: number | null;
124
+ dersYapisiToplami: number | null;
125
+ ciktiSayisi: number | null;
126
+ haftaSayisi: number | null;
127
+ };
128
+ export declare const bolognaDenetleAraci: AcikArac<z.ZodObject<{
129
+ ders: z.ZodObject<{
130
+ kod: z.ZodString;
131
+ ad: z.ZodOptional<z.ZodString>;
132
+ zorunlu: z.ZodDefault<z.ZodBoolean>;
133
+ yariyil: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
134
+ tul: z.ZodOptional<z.ZodString>;
135
+ kredi: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
136
+ akts: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
137
+ guncelleme: z.ZodOptional<z.ZodString>;
138
+ amac: z.ZodOptional<z.ZodString>;
139
+ icerik: z.ZodOptional<z.ZodString>;
140
+ yontem: z.ZodOptional<z.ZodString>;
141
+ notlar: z.ZodOptional<z.ZodString>;
142
+ kaynakSayisi: z.ZodOptional<z.ZodNumber>;
143
+ kaynaklar: z.ZodOptional<z.ZodArray<z.ZodString>>;
144
+ yetkililer: z.ZodOptional<z.ZodArray<z.ZodObject<{
145
+ rol: z.ZodString;
146
+ deger: z.ZodString;
147
+ }, z.core.$strip>>>;
148
+ ciktilar: z.ZodDefault<z.ZodArray<z.ZodObject<{
149
+ kod: z.ZodString;
150
+ metin: z.ZodString;
151
+ }, z.core.$strip>>>;
152
+ degerlendirme: z.ZodDefault<z.ZodArray<z.ZodObject<{
153
+ ad: z.ZodString;
154
+ sayi: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
155
+ katki: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
156
+ }, z.core.$strip>>>;
157
+ isyuku: z.ZodDefault<z.ZodArray<z.ZodObject<{
158
+ ad: z.ZodString;
159
+ sayi: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
160
+ sure: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
161
+ toplam: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
162
+ }, z.core.$strip>>>;
163
+ dersYapisi: z.ZodDefault<z.ZodArray<z.ZodObject<{
164
+ alan: z.ZodString;
165
+ yuzde: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
166
+ }, z.core.$strip>>>;
167
+ haftalar: z.ZodDefault<z.ZodNumber>;
168
+ katki: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>>>;
169
+ }, z.core.$strip>;
170
+ programCiktilari: z.ZodOptional<z.ZodArray<z.ZodObject<{
171
+ kod: z.ZodString;
172
+ metin: z.ZodString;
173
+ }, z.core.$strip>>>;
174
+ matrisSatiri: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
175
+ aktsSaat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
176
+ }, z.core.$strip>>;
177
+ /** Proliz sayfası mı: üst bilgi tablosu ("Yarıyıl, Kodu") ya da program çıktıları tablosu. */
178
+ export declare function prolizMi(html: string): boolean;
179
+ /**
180
+ * Yapıştırılan HTML'den görev satırlarını (Dersi Verenler, Yardımcılar, Koordinatör) yetkililer listesine, kaynak
181
+ * satırlarını künye listesine ayırır. Değerler olduğu gibi korunur; hiçbir şey atılmaz.
182
+ */
183
+ export declare function bolognaSatirAyikla(html: string): {
184
+ html: string;
185
+ yetkililer: Yetkili[];
186
+ kaynaklar: string[];
187
+ };
188
+ /** bologna_ayristir ön ayıklaması: yalnız giriş bilgisi (oturum kimliği, parola kutusu, çerez) atılır. */
189
+ export declare function ayristirOnAyikla(g: unknown): {
190
+ girdi: unknown;
191
+ atilan: string[];
192
+ ileti?: string;
193
+ };
194
+ /** Hedefe tam eşit iş yükü dağılımları (deterministik). Son tek satır artığı alır, böylece toplam tam tutar. */
195
+ export declare function isYukuDagilimlari(akts: number, tul: string, hafta?: number, bolen?: number): {
196
+ secenek: number;
197
+ ad: string;
198
+ aciklama: string;
199
+ isyuku: {
200
+ ad: string;
201
+ sayi: number;
202
+ sure: number;
203
+ }[];
204
+ toplam: number;
205
+ hedef: number;
206
+ tamEsit: boolean;
207
+ }[];
208
+ export declare const BOLOGNA_ARACLARI: readonly AcikArac[];
209
+ export {};