@akredit/acik-mcp 0.4.0 → 0.6.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/README.md CHANGED
@@ -62,7 +62,7 @@ Sunucu model çağırmaz ve metin üretmez. Bologna seçeneklerini sizin asistan
62
62
 
63
63
  ```
64
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
65
+ Asistan: Neye odaklanalım? 1) Bologna paketi 2) Öğrenme çıktısı 3) ÇK/PÇ 4) Ölçüt rehberi 5) Dil denetimi
66
66
  Hoca: 1
67
67
  Asistan: Önce bir kural: kullanıcı adınızı ve parolanızı yalnız OBS'nin kendi ekranına, kendiniz yazın.
68
68
  Bana asla yazmayın. OBS adresiniz nedir?
@@ -96,13 +96,13 @@ Asistan: Sayfayı yeniden okudum ve denetledim: Tamamlandı.
96
96
 
97
97
  - Bütün araçlar salt okumadır ve aynı girdiye aynı sonucu verir.
98
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.
99
+ - Giriş bilgisi istenmez: parola, doğrulama kodu ya da oturum çerezi görülürse çağrı reddedilir, değer kaydedilmez ve 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.
100
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.
101
101
  - Sayılar yalnız hesaptan gelir; araçlar metin uydurmaz.
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.
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 giriş bilgisi, T.C. kimlik numarası, öğrenci numarası ve IBAN reddedilir; yayımlanmış öğretim elemanı adları serbesttir.
103
+ - Öğrenci verisi sohbete yapıştırılmaz: tablo sohbete yapıştırıldığı anda yapay zekâ sağlayıcısına gitmiştir. `not_tablosu_ayristir` ad, soyad ya da numara sütunu ya da 9-11 haneli numara görürse tabloyu işlemez; hocadan bu sütunları Excel'de silmesini ya da verinin tarayıcıdan çıkmadığı https://akredit.org/deneyin hesaplayıcısını kullanmasını ister. Öbür araçlarda T.C. kimlik numarası, öğrenci numarası ve IBAN reddedilir.
104
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.
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 arar ve yalnız katalogda bulunanı bağlantısıyla öneri olarak gösterir; uygunluğa hoca karar verir. Katalogda olmayan eser yalnız hoca beyanıyla yazılır. Bologna araçları düz metin ya da imzasız kaynağı doğrulanmamış sayar ve OBS yazma paketine almaz.
106
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
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.
108
108
 
@@ -10,6 +10,7 @@ import { BOLOGNA_ARACLARI, bolognaDenetleAraci } from "./bologna.js";
10
10
  import { kaynakBicimleAraci } from "./kaynak.js";
11
11
  import { kaynakDogrulaAraci } from "./kaynak-dogrula.js";
12
12
  import { notTablosuAyristirAraci } from "./not-tablosu.js";
13
+ import { akreditBaslaAraci } from "./promptlar.js";
13
14
  import { AracHatasi, arac, DEPO, KOD_KAYNAGI } from "./temel.js";
14
15
  import { engelCozAraci, kurulumYardimiAraci } from "./yardim.js";
15
16
  export * from "./temel.js";
@@ -91,7 +92,7 @@ const olcutAra = arac({
91
92
  ad: "olcut_ara",
92
93
  baslik: "Ölçüt ara (YÖKAK ve program akreditasyonu)",
93
94
  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
+ sonrakiAdim: "Hocaya hangi ölçütü getireceğinizi sormayın: en uygun 1-2 sonuç için hemen olcut_getir'i (YÖKAK alt ölçütüyse olgunluk_duzeyleri'ni de) çağırıp yanıtı tek seferde hazırlayın. Diğer adayları sonda tek satırda anın.",
95
96
  girdi: z.object({
96
97
  sorgu: z.string().trim().min(1).max(200).describe("Aranacak ifade ya da kod, ör. 'paydaş katılımı' ya da 'B.3'"),
97
98
  cerceve: cerceveGirdisi,
@@ -172,7 +173,7 @@ const olcutGetir = arac({
172
173
  ad: "olcut_getir",
173
174
  baslik: "Ölçütü getir (YÖKAK ve program akreditasyonu)",
174
175
  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.",
176
+ sonrakiAdim: "Alt ölçütse sormadan olgunluk_duzeyleri'ni çağırın. Resmî metni, düzeyleri ve kanıt kontrol listesini tek mesajda gösterin; sonda kısa bir satırla başka ölçüt ya da öz değerlendirme iskeleti önerin.",
176
177
  girdi: z.object({
177
178
  kod: z
178
179
  .string()
@@ -237,7 +238,7 @@ const olgunlukDuzeyleri = arac({
237
238
  ad: "olgunluk_duzeyleri",
238
239
  baslik: "Alt ölçüt olgunluk düzeyleri ve örnek kanıtlar",
239
240
  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.",
241
+ sonrakiAdim: "Kanıtları hocaya tek tek sormayın. Resmî metni, 1-5 düzeylerini ve '[ ] kanıt (durum: hocaya sorulacak)' biçiminde kopyalanabilir kontrol listesini tek mesajda gösterin. Kurumda olup olmadığını tahmin etmeyin.",
241
242
  girdi: z.object({ kod: z.string().trim().min(1).max(20).describe("Alt ölçüt kodu, ör. 'B.1.2'") }),
242
243
  calistir: ({ kod }) => {
243
244
  const CERCEVE = YOKAK_KURUMSAL_3_3;
@@ -319,7 +320,7 @@ const ckPcHesapla = arac({
319
320
  kisiselVeriKapsami: "tam",
320
321
  baslik: "ÇK ve PÇ sağlanma düzeyi hesabı",
321
322
  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.",
323
+ 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 aynı mesajda kısa iyileştirme notu taslağı verin (sayı uydurmadan); ayrıca soru sormayın.",
323
324
  girdi: z.object({
324
325
  dersKodu: kimlik,
325
326
  donem: z.string().trim().min(1).max(40).describe("ör. '2025-2026 Güz'"),
@@ -418,7 +419,7 @@ const raporDilDenetle = arac({
418
419
  ad: "rapor_dil_denetle",
419
420
  baslik: "Rapor dil denetimi",
420
421
  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.",
422
+ sonrakiAdim: "Bulguları hocaya tek tek sormayın. Hepsini kendiniz düzeltin (kanıt ya da sayı gereken yere uydurmadan [EKSİK: ...] yazın), düzeltilmiş metni yeniden rapor_dil_denetle ile denetleyin ve tek mesajda numaralı eski → yeni tablosunu ve düzeltilmiş tam metni verin.",
422
423
  girdi: z.object({
423
424
  metin: z.string().min(1).max(60_000),
424
425
  donem: z
@@ -445,6 +446,7 @@ const raporDilDenetle = arac({
445
446
  },
446
447
  });
447
448
  export const ACIK_ARACLAR = [
449
+ akreditBaslaAraci,
448
450
  olcutAra,
449
451
  olcutGetir,
450
452
  olgunlukDuzeyleri,
@@ -23,6 +23,19 @@ export declare const BLOOM_FIILLERI: {
23
23
  }[];
24
24
  /** Bir taslak bulgusunun hangi alana ait olduğu. "genel" birden çok alana değen bulgudur. */
25
25
  export declare function bulguAlani(b: Bulgu): AlanKodu | "temel" | "genel";
26
+ declare const KaynakOgesi: z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
27
+ kunye: z.ZodString;
28
+ dogrulama: z.ZodUnion<readonly [z.ZodLiteral<"hoca_beyani">, z.ZodObject<{
29
+ durum: z.ZodString;
30
+ baglanti: z.ZodString;
31
+ imza: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strip>]>;
33
+ }, z.core.$strip>]>;
34
+ export type KaynakOgesiT = z.infer<typeof KaynakOgesi>;
35
+ export type KaynakDurumu = "katalogda_bulundu" | "hoca_beyani" | "dogrulanmamis";
36
+ /** Kaynağın doğrulama durumu. Düz metin ya da imzası bu sürece ait olmayan kayıt doğrulanmamıştır. */
37
+ export declare function kaynakDurumu(k: KaynakOgesiT): KaynakDurumu;
38
+ export declare const kunyeMetni: (k: KaynakOgesiT) => string;
26
39
  declare const TaslakAlanlari: z.ZodObject<{
27
40
  amac: z.ZodOptional<z.ZodObject<{
28
41
  tr: z.ZodString;
@@ -76,7 +89,19 @@ declare const TaslakAlanlari: z.ZodObject<{
76
89
  }, z.core.$strip>>>;
77
90
  katki: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodNull, z.ZodLiteral<"">]>>>>;
78
91
  ska: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
79
- kaynaklar: z.ZodOptional<z.ZodArray<z.ZodString>>;
92
+ degerlendirmeDayanagi: z.ZodOptional<z.ZodEnum<{
93
+ sayfa: "sayfa";
94
+ oneri: "oneri";
95
+ hoca: "hoca";
96
+ }>>;
97
+ kaynaklar: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
98
+ kunye: z.ZodString;
99
+ dogrulama: z.ZodUnion<readonly [z.ZodLiteral<"hoca_beyani">, z.ZodObject<{
100
+ durum: z.ZodString;
101
+ baglanti: z.ZodString;
102
+ imza: z.ZodOptional<z.ZodString>;
103
+ }, z.core.$strip>]>;
104
+ }, z.core.$strip>]>>>;
80
105
  kaynakSayisi: z.ZodOptional<z.ZodNumber>;
81
106
  }, z.core.$strip>;
82
107
  type TaslakAlanlariT = z.infer<typeof TaslakAlanlari>;
@@ -91,7 +116,8 @@ declare const DersTemeli: z.ZodObject<{
91
116
  ad: z.ZodOptional<z.ZodString>;
92
117
  akts: z.ZodOptional<z.ZodNumber>;
93
118
  tul: z.ZodOptional<z.ZodString>;
94
- bolen: z.ZodDefault<z.ZodNumber>;
119
+ bolen: z.ZodOptional<z.ZodNumber>;
120
+ donem: z.ZodOptional<z.ZodString>;
95
121
  yetkililer: z.ZodOptional<z.ZodArray<z.ZodObject<{
96
122
  rol: z.ZodString;
97
123
  deger: z.ZodString;
@@ -114,6 +140,8 @@ export declare function bolognaHesabi(ders: DersTemeliT, alanlar: TaslakAlanlari
114
140
  }[];
115
141
  toplam: number;
116
142
  hedef: number | null;
143
+ hedefAraligi: [number, number] | null;
144
+ aralikta: boolean | null;
117
145
  fark: number | null;
118
146
  aktsBasinaSaat: number | null;
119
147
  dersSuresiHaftalikBeklenen: number | null;
@@ -173,6 +201,7 @@ export declare const bolognaDenetleAraci: AcikArac<z.ZodObject<{
173
201
  }, z.core.$strip>>>;
174
202
  matrisSatiri: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
175
203
  aktsSaat: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
204
+ kurumBoleni: z.ZodOptional<z.ZodNumber>;
176
205
  }, z.core.$strip>>;
177
206
  /** Proliz sayfası mı: üst bilgi tablosu ("Yarıyıl, Kodu") ya da program çıktıları tablosu. */
178
207
  export declare function prolizMi(html: string): boolean;
@@ -191,19 +220,72 @@ export declare function ayristirOnAyikla(g: unknown): {
191
220
  atilan: string[];
192
221
  ileti?: string;
193
222
  };
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): {
223
+ export interface DegerlendirmeKalemi {
224
+ ad: string;
225
+ sayi?: number | null | undefined;
226
+ katki?: number | null | undefined;
227
+ }
228
+ interface Etkinlik {
229
+ ad: string;
230
+ sayi: number;
231
+ agirlik: number;
232
+ kaynak: string;
233
+ }
234
+ /** Değerlendirme kalemlerini iş yükü etkinliklerine çevirir. Eşleşmeyen kalem satır üretmez. */
235
+ export declare function etkinliklereCevir(deg: readonly DegerlendirmeKalemi[]): Etkinlik[];
236
+ export interface IsYukuSatiri {
237
+ ad: string;
238
+ sayi: number;
239
+ sure: number;
240
+ /** Değerin nereden geldiği: "sayfa (T+U+L)", "Değerlendirme kalemi: ..." ya da "Akredit önerisi". */
241
+ kaynak: string;
242
+ /** Hesabın varsayımı; hoca teyit eder. */
243
+ varsayim: string;
244
+ }
245
+ /**
246
+ * İş yükü dağılım önerileri (deterministik). Satırlar yalnız ders süresi, haftalık çalışma ve verilen değerlendirme
247
+ * kalemlerinden kurulur. Kurum değeri (bolen) verildiyse toplam tam AKTS × bolen olmaya çalışılır; verilmediyse
248
+ * AKTS × 30 hedeflenir ve AKTS başına 25-30 saat aralığı kabul edilir.
249
+ */
250
+ export declare function isYukuDagilimlari(akts: number, tul: string, hafta?: number, bolen?: number, degerlendirme?: readonly DegerlendirmeKalemi[]): {
196
251
  secenek: number;
197
252
  ad: string;
198
253
  aciklama: string;
199
- isyuku: {
200
- ad: string;
201
- sayi: number;
202
- sure: number;
203
- }[];
254
+ etiket: string;
255
+ isyuku: IsYukuSatiri[];
204
256
  toplam: number;
205
257
  hedef: number;
258
+ kabulAraligi: [number, number];
206
259
  tamEsit: boolean;
260
+ aralikta: boolean;
207
261
  }[];
262
+ /**
263
+ * OBS'ye yazılan alanları geri okunan sayfa metniyle karşılaştırır. Ders kodu ya da dönem farklıysa durur:
264
+ * yanlış derse yazılmış olabilir.
265
+ */
266
+ export declare function obsKarsilastir(g: {
267
+ dersKodu: string;
268
+ donem?: string | undefined;
269
+ beklenen: {
270
+ alan: string;
271
+ deger: string;
272
+ }[];
273
+ geriOkunan: {
274
+ metin: string;
275
+ dersKodu?: string | undefined;
276
+ donem?: string | undefined;
277
+ };
278
+ }): {
279
+ dur: boolean;
280
+ nedenler: string[];
281
+ eslesen: number;
282
+ farkli: number;
283
+ alanlar: {
284
+ alan: string;
285
+ durum: "bos" | "farkli" | "eslesti";
286
+ eksikParcalar: string[];
287
+ eksikParcaSayisi: number;
288
+ }[];
289
+ };
208
290
  export declare const BOLOGNA_ARACLARI: readonly AcikArac[];
209
291
  export {};