@akredit/acik-mcp 0.5.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.
@@ -92,7 +92,7 @@ const olcutAra = arac({
92
92
  ad: "olcut_ara",
93
93
  baslik: "Ölçüt ara (YÖKAK ve program akreditasyonu)",
94
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.",
95
- 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.",
96
96
  girdi: z.object({
97
97
  sorgu: z.string().trim().min(1).max(200).describe("Aranacak ifade ya da kod, ör. 'paydaş katılımı' ya da 'B.3'"),
98
98
  cerceve: cerceveGirdisi,
@@ -173,7 +173,7 @@ const olcutGetir = arac({
173
173
  ad: "olcut_getir",
174
174
  baslik: "Ölçütü getir (YÖKAK ve program akreditasyonu)",
175
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.",
176
- 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.",
177
177
  girdi: z.object({
178
178
  kod: z
179
179
  .string()
@@ -238,7 +238,7 @@ const olgunlukDuzeyleri = arac({
238
238
  ad: "olgunluk_duzeyleri",
239
239
  baslik: "Alt ölçüt olgunluk düzeyleri ve örnek kanıtlar",
240
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.",
241
- 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.",
242
242
  girdi: z.object({ kod: z.string().trim().min(1).max(20).describe("Alt ölçüt kodu, ör. 'B.1.2'") }),
243
243
  calistir: ({ kod }) => {
244
244
  const CERCEVE = YOKAK_KURUMSAL_3_3;
@@ -320,7 +320,7 @@ const ckPcHesapla = arac({
320
320
  kisiselVeriKapsami: "tam",
321
321
  baslik: "ÇK ve PÇ sağlanma düzeyi hesabı",
322
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.",
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 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.",
324
324
  girdi: z.object({
325
325
  dersKodu: kimlik,
326
326
  donem: z.string().trim().min(1).max(40).describe("ör. '2025-2026 Güz'"),
@@ -419,7 +419,7 @@ const raporDilDenetle = arac({
419
419
  ad: "rapor_dil_denetle",
420
420
  baslik: "Rapor dil denetimi",
421
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.",
422
- 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.",
423
423
  girdi: z.object({
424
424
  metin: z.string().min(1).max(60_000),
425
425
  donem: z
@@ -738,7 +738,7 @@ export const bolognaDenetleAraci = arac({
738
738
  ad: "bologna_denetle",
739
739
  baslik: "Bologna ders paketini denetle",
740
740
  aciklama: "Bir dersin Bologna bilgi paketini denetler: hangi alan boş, hangisi zayıf, neden. AKTS ve iş yükü uyumu, değerlendirme toplamı, öğrenme çıktıları, haftalar ve katkı tablosu. Kurallar Akredit'in iç kurallarıdır, karar komisyonundur.",
741
- sonrakiAdim: "Doldurulacak alanları hocaya numaralı gösterin ve sorun: 1) alan alan seçenek göstererek dolduralım 2) yalnız boş olanlar 3) numaraları kendim seçeyim 4) Hepsini akıllıca doldur (önerilen). 4'te her alanı kendiniz doldurup denetleyin, sonunda tek özet gösterin. Her alan için bologna_alan_rehberi'ni çağırın.",
741
+ sonrakiAdim: "Nasıl doldurulacağını hocaya sormayın; doğrudan akıllı doldurun. Sayfada değerlendirme yüzdeleri ya da kaynaklar yoksa yalnız bunları TEK mesajda sorun (yüzdeyi tahmin etmeyin). Gerisini sormadan bologna_alan_rehberi(alan='hepsi'), is_yuku_oner ve bologna_taslak_denetle ile doldurup denetleyin; sonunda bologna_kopya_metni özetini tek seferde gösterin.",
742
742
  kisiselVeriKapsami: BOLOGNA_KAPSAMI,
743
743
  kunyeAlanlari: BOLOGNA_KUNYE_ALANLARI,
744
744
  girdi: z.object({
@@ -837,7 +837,7 @@ const alanRehberi = arac({
837
837
  ad: "bologna_alan_rehberi",
838
838
  baslik: "Bologna alanı nasıl doldurulur",
839
839
  aciklama: "Bir Bologna alanının (amaç, içerik, çıktılar, iş yükü, haftalar...) doldurma kurallarını, sınırlarını, örnek kalıplarını ve Bloom fiillerini verir. AKTS ve T+U+L verilirse iş yükü hedefini hesaplar. Metin üretmez.",
840
- sonrakiAdim: "Bu kurallara uyan 2-3 kısa seçenek (A, B, C) yazın, bologna_taslak_denetle ile denetleyin, geçenleri hocaya gösterin. Hoca harfle seçer; 'hepsi A' toplu onaydır.",
840
+ sonrakiAdim: "Doldurulacak bütün alanların taslağını bu kurallarla tek seferde yazın ve bologna_taslak_denetle ile denetleyin. Ara adımda hocaya alan alan A/B/C sormayın; en iyi seçeneği kendiniz seçin.",
841
841
  girdi: z.object({
842
842
  alan: z.enum([...ALAN_KODLARI, "hepsi"]).describe("Alan kodu ya da 'hepsi'"),
843
843
  akts: z.number().min(0).max(60).optional(),
@@ -899,7 +899,7 @@ const taslakDenetleAraci = arac({
899
899
  ad: "bologna_taslak_denetle",
900
900
  baslik: "Bologna taslağını denetle",
901
901
  aciklama: "Asistanın yazdığı 1-3 seçeneği (A, B, C) Akredit kurallarıyla BİÇİM yönünden denetler (sayılar, uzunluklar, fiil, toplamlar, kaynak doğrulaması). İçeriğin doğruluğunu bilemez: içerik teyidi hocadadır. Her seçenek için biçim sonucu ve eksik nedenlerini döndürür; her kuralın türü (resmî, kurum, Akredit önerisi) ve dayanağı vardır. İş yükü toplamını ve yüzde toplamlarını kendisi hesaplar.",
902
- sonrakiAdim: "Biçim denetiminden geçen seçenekleri hocaya 'öneri' etiketiyle kısa gösterin (A, B, C; ilki önerilen) ve içeriği hocanın teyit edeceğini söyleyin. Geçmeyeni düzeltip yeniden denetleyin, hocaya göstermeyin. Seçim bitince bologna_kopya_metni ile OBS metnini verin.",
902
+ sonrakiAdim: "Geçmeyen alanı düzeltip yeniden denetleyin; hocaya göstermeyin. Hepsi geçince bologna_durum ve bologna_kopya_metni'ni çağırıp bütün alanları TEK özet tablosunda ('öneri' etiketiyle) gösterin; alan alan soru sormayın.",
903
903
  kisiselVeriKapsami: BOLOGNA_KAPSAMI,
904
904
  kunyeAlanlari: BOLOGNA_KUNYE_ALANLARI,
905
905
  girdi: z.object({
@@ -1052,7 +1052,7 @@ const ayristirAraci = arac({
1052
1052
  ad: "bologna_ayristir",
1053
1053
  baslik: "Bologna sayfasını ayrıştır",
1054
1054
  aciklama: "Yapıştırılan Bologna ders sayfasını ya da program çıktıları sayfasını çözer. Önce Proliz biçimini dener, olmazsa her OBS için genel ayrıştırıcı çalışır (HTML ya da düz metin, Türkçe ya da İngilizce etiketler). Bulunan ve bulunamayan alanları, güven düzeyini söyler. Adres çekmez.",
1055
- sonrakiAdim: "Çıkan ders verisini bologna_denetle'ye verin (girdi hazır: bolognaDenetleGirdisi). Sonraki çağrılarda ingilizce değerini aynen verin. Değerlendirme yöntem ve yüzdeleri, uygulama/lab, kaynaklar, amaç ve içerik sayfada yoksa bunları hocaya TEK mesajda, numaralı ve varsayılan seçenekli sorun; uydurmayın.",
1055
+ sonrakiAdim: "Çıkan ders verisini bologna_denetle'ye verin (girdi hazır: bolognaDenetleGirdisi). Sonraki çağrılarda ingilizce değerini aynen verin. Sayfada değerlendirme yüzdeleri ya da kaynaklar yoksa yalnız bunları hocaya TEK mesajda sorun; yüzdeyi tahmin etmeyin. Uygulama/lab T+U+L'den okunur (U+L > 0 ise var), sorulmaz. Amaç ve içerik sayfada yoksa önden sorulmaz; 'öneri' olarak yazılıp son özette teyide sunulur.",
1056
1056
  kisiselVeriKapsami: BOLOGNA_KAPSAMI,
1057
1057
  kunyeAlanlari: BOLOGNA_KUNYE_ALANLARI,
1058
1058
  onAyikla: ayristirOnAyikla,
@@ -1236,7 +1236,7 @@ const durumAraci = arac({
1236
1236
  kaynak: [KAYNAK_KURALLAR],
1237
1237
  ...(tamamlandi
1238
1238
  ? {
1239
- sonrakiAdim: "bologna_kopya_metni ile yazma paketini alın (sayfadaki önceki değerleri oncekiDegerler olarak verin). Hocaya alan alan önceki/yeni değer özetini gösterip sorun: 1) formu doldurayım, Kaydet'e siz basın 2) formu ben doldurup kaydedeyim (bir kez 'kaydet' demeniz yeter) 3) alan alan kopyalayın 4) bitir.",
1239
+ sonrakiAdim: "Hocaya ara özet gösterip 'devam' beklemeyin; hemen bologna_kopya_metni ile yazma paketini alın (sayfadaki önceki değerleri oncekiDegerler olarak verin). Tek mesajda önceki → yeni tablosunu gösterip sorun: 1) OBS'ye yaz ve kaydet (bu seçim 'kaydet' onayıdır) 2) formu doldur, Kaydet'e ben basayım 3) alan alan kopya metni ver. Değiştirmek istenen alan varsa numarası yazılır.",
1240
1240
  }
1241
1241
  : {}),
1242
1242
  };
@@ -1369,7 +1369,7 @@ const isYukuOnerAraci = arac({
1369
1369
  ad: "is_yuku_oner",
1370
1370
  baslik: "AKTS iş yükü önerisi",
1371
1371
  aciklama: "AKTS, T+U+L ve sayfadaki değerlendirme kalemlerinden iş yükü dağılımı ÖNERİR. Yalnız derste olan etkinliklere satır açar (ödev yoksa ödev satırı yok); her satırda kaynak ve varsayım yazar. Sayfadan okunan iş yükü verilirse ayrı gösterir, öneriyle karıştırmaz. Hesap deterministiktir; AKTS'yi değiştirmez.",
1372
- sonrakiAdim: "Önce sayfadan okunan iş yükü varsa onu gösterin. Sonra önerileri 'öneri' etiketiyle 1, 2, 3 diye kısa gösterin (1 önerilen), satırların kaynak ve varsayımını yazın. Değerlendirme kalemleri bilinmiyorsa önce hocaya sorun. Seçileni bologna_taslak_denetle ile denetleyin.",
1372
+ sonrakiAdim: "Sayfadaki iş yükü AKTS hedef aralığındaysa onu koruyun. Değilse ilk öneriyi ('öneri' etiketiyle) doğrudan taslağa alıp bologna_taslak_denetle ile denetleyin; hocaya ayrı mesajda iş yükü seçeneği sormayın, son özette varsayımıyla gösterin. Değerlendirme kalemleri bilinmiyorsa uydurmayın.",
1373
1373
  kisiselVeriKapsami: BOLOGNA_KAPSAMI,
1374
1374
  girdi: z.object({
1375
1375
  akts: z.number().min(1).max(60),
@@ -146,7 +146,7 @@ export const notTablosuAyristirAraci = arac({
146
146
  ad: "not_tablosu_ayristir",
147
147
  baslik: "Not tablosunu ayrıştır",
148
148
  aciklama: "Excel ya da CSV'den yapıştırılan not tablosunu ÇK/PÇ hesabına hazırlar. Tabloda yalnız not sütunları olmalı: ad, soyad ya da numara sütunu ya da 9-11 haneli numara görülürse tablo işlenmez. Öğrencilere o1, o2 takma adı verir. Başlıklardan sınav, soru, tam puan ve ders çıktısı eşlemesini sezer; eksikleri listeler.",
149
- sonrakiAdim: "Sezilen eşlemeyi hocaya tablo olarak gösterin ve eksikleri tek tek seçenekle sorun (ör. S3 hangi çıktıyı ölçüyor? 1) Ö2 2) Ö3). Eksik kalmayınca ckPcHesaplaTaslagi'ni ck_pc_hesapla'ya verin.",
149
+ sonrakiAdim: "Eksik yoksa hocaya soru sormadan ckPcHesaplaTaslagi'ni hemen ck_pc_hesapla'ya verin. Eksik varsa (tam puan, soru-çıktı eşlemesi, sınav ağırlığı) hepsini TEK mesajda, numaralı sorun; tahmin etmeyin, sütun sütun ayrı mesaj açmayın.",
150
150
  kisiselVeriIpucu: NOT_TABLOSU_KISISEL_ILETI,
151
151
  kisiselVeriKapsami: "tam",
152
152
  onDenetim: (g) => {
@@ -253,14 +253,14 @@ export const notTablosuAyristirAraci = arac({
253
253
  ciktilar: ciktilar.map((kod) => ({ kod })),
254
254
  araclar,
255
255
  puanlar,
256
- not: "dersKodu ve donem alanlarını hocadan alıp ekleyin. Eksik kalmayınca ck_pc_hesapla'ya verin.",
256
+ not: "dersKodu ve donem biliniyorsa ekleyin; bilinmiyorsa bunun için hocayı durdurmayın, çıktıda EKSİK yazın. Eksik kalmayınca ck_pc_hesapla'ya verin.",
257
257
  },
258
258
  sutunEslemeRehberi: SUTUN_ESLEME_REHBERI,
259
259
  },
260
260
  kaynak: [KOD_KAYNAGI("apps/acik-mcp/src/not-tablosu.ts", "Akredit not tablosu ayrıştırıcısı")],
261
261
  ...(eksikler.length
262
262
  ? {
263
- sonrakiAdim: "Eksikleri hocaya numaralı ve tek tek, seçenekle sorun; yanıtları tamPuanlar, eslemeler ve agirliklar olarak verip aracı yeniden çağırın. Tabloyu yeniden yapıştırtmayın, aynı tabloyu kullanın.",
263
+ sonrakiAdim: "Bütün eksikleri TEK mesajda, numaralı sorun (tahmin etmeyin); yanıtları tamPuanlar, eslemeler ve agirliklar olarak verip aracı yeniden çağırın. Tabloyu yeniden yapıştırtmayın, aynı tabloyu kullanın.",
264
264
  }
265
265
  : {}),
266
266
  };
@@ -43,6 +43,27 @@ export declare function baslangic(): {
43
43
  };
44
44
  ortakKurallar: string;
45
45
  };
46
- export declare const akreditBaslaAraci: import("./temel.ts").AcikArac<z.ZodObject<{}, z.core.$strip>>;
46
+ /** Kullanıcı niyetini zaten yazdıysa menü atlanır; yalnız o odağın akışı ve kurallar döner. */
47
+ export declare function odakBaslangici(no: string): {
48
+ hocayaGoster: string;
49
+ odak: {
50
+ no: "1" | "2" | "3" | "4" | "5";
51
+ ad: "Bologna ders paketini denetle ve boş alanları doldur" | "Ders öğrenme çıktısı yaz ya da iyileştir" | "ÇK ve PÇ sağlanma düzeyini hesapla" | "YÖKAK, MÜDEK, FEDEK, EPDAD ya da SABAK ölçüt ve kanıt rehberi" | "Öz değerlendirme metninin dil denetimi";
52
+ istem: "bologna_doldur" | "cikti_yaz" | "ck_pc_hesabi" | "olcut_rehberi" | "dil_denetimi";
53
+ } | null;
54
+ kisaKurallar: string[];
55
+ akis: string;
56
+ ortakKurallar: string;
57
+ };
58
+ export declare const akreditBaslaAraci: import("./temel.ts").AcikArac<z.ZodObject<{
59
+ odak: z.ZodDefault<z.ZodEnum<{
60
+ 1: "1";
61
+ 2: "2";
62
+ 3: "3";
63
+ 4: "4";
64
+ 5: "5";
65
+ menu: "menu";
66
+ }>>;
67
+ }, z.core.$strip>>;
47
68
  /** SDK için bağımsız değişken şeması: hepsi isteğe bağlı, kısa metin. */
48
69
  export declare const istemSemasi: (i: AcikIstem) => Record<string, z.ZodOptional<z.ZodString>>;
@@ -32,15 +32,13 @@ export const AKILLI_DOLDURMA_SECENEGI = "4) Hepsini akıllıca doldur (önerilen
32
32
  export const TEYIT_SORULARI = [
33
33
  "Teyit gerektiren bilgiler (asla tahmin etme):",
34
34
  "- Değerlendirme yöntemleri ve yüzdeleri (vize, final, ödev, proje...).",
35
- "- Dersin uygulama ya da laboratuvar içerip içermediği.",
36
35
  "- Derste gerçekten kullanılan kaynaklar ve ders notları.",
37
- "- Sayfada yoksa dersin amacı ve içeriği.",
38
- "Bunları önce sayfadan oku. Sayfada olmayanları hocaya TEK mesajda, birlikte, numaralı ve her birine varsayılan seçenekle sor. Örnek:",
39
- ' "Birkaç bilgiyi yalnız siz bilebilirsiniz. Numarayla yanıtlayın; boş bırakırsanız parantezdeki varsayılanı kullanırım.',
40
- " 1) Değerlendirme: a) Vize %40, Final %60 (varsayılan) b) Vize %30, Ödev %20, Final %50 c) başka: yazın",
41
- " 2) Uygulama ya da laboratuvar var mı? a) yok (varsayılan, T+U+L'ye göre) b) var",
42
- ' 3) Kullandığınız kitap ya da notlar: a) önereyim, siz seçin (varsayılan) b) şunları kullanıyorum: yazın"',
43
- "Hocanın seçtiği varsayılan da hoca teyidi sayılır (degerlendirmeDayanagi: 'hoca'). Yanıt gelmeden değerlendirme yüzdesi yazma paketine girmez.",
36
+ "Bunları önce sayfadan oku; sayfada doluysa SORMA. Uygulama/lab sorulmaz: T+U+L'den okunur (U+L > 0 ise var). Amaç ve içerik sayfada yoksa önden sorulmaz; 'öneri' olarak yazılıp son özette teyide sunulur.",
37
+ "Sayfada olmayan değerlendirme ve kaynakları hocaya TEK mesajda sor. Değerlendirme yüzdesine varsayılan uydurma; hoca yazar. Örnek:",
38
+ ' "İki bilgiyi yalnız siz bilebilirsiniz:',
39
+ " 1) Değerlendirme yöntemleri ve yüzdeleri: yazın (ör. Vize 40, Final 60)",
40
+ ' 2) Kaynaklar: a) katalogdan doğrulayıp önereyim (önerilen) b) şunları kullanıyorum: yazın"',
41
+ "Yanıt gelmeden değerlendirme yüzdesi yazma paketine girmez (degerlendirmeDayanagi: 'hoca').",
44
42
  ].join("\n");
45
43
  export const AKILLI_DOLDURMA = [
46
44
  "Hepsini akıllıca doldur (seçenek 4):",
@@ -51,7 +49,8 @@ export const AKILLI_DOLDURMA = [
51
49
  "- Uydurma yok: hocanın vermediği ve doğrulayamadığın bilgi (kişi, kitap, tarih, sayı, toplantı) EKSİK kalır. Kaynaklar yalnız kaynak_dogrula'dan 'dogrulandi' dönenlerdir.",
52
50
  "- Araç sonucunu 'geçer' diye sunma: 'biçim denetiminden geçti; içerik teyidi: hoca' de.",
53
51
  "- Bitince tek bir özet göster: numara, alan, ne yazdığın (ilk cümle ya da kısa özet), kaynağı (sayfa, hoca ya da öneri), biçim denetimi sonucu. Altına şunu yaz:",
54
- ' "Şu alanları şöyle doldurdum; öneri yazanlar benim önerimdir, içeriği siz teyit edersiniz. Değiştirmek istediğiniz alanın numarasını yazın; yoksa devam diyebilirsiniz."',
52
+ "- Ara özet gösterip 'devam' bekleme: OBS'ye yazılacaksa özet, yazma onayıyla aynı mesajdadır (OBS'ye yazma adımı). Özetin altına yaz:",
53
+ " \"Öneri yazanlar benim önerimdir, içeriği siz teyit edersiniz. 1) OBS'ye yaz ve kaydet 2) formu doldur, Kaydet'e ben basayım 3) kopya metni ver. Değiştirmek istediğiniz alan varsa numarasını yazın.\"",
55
54
  "",
56
55
  TEYIT_SORULARI,
57
56
  ].join("\n");
@@ -97,14 +96,18 @@ const obsGirisi = () => [
97
96
  "Adım 0. OBS'ye giriş (tarayıcı).",
98
97
  ` Hocaya önce şunu aynen söyle: "${GIRIS_KURALI_HOCAYA}"`,
99
98
  " Tarayıcı aracın varsa (Claude in Chrome, Claude masaüstü tarayıcı paneli, ChatGPT ajan modu gibi):",
100
- " a) Hocaya OBS ya da Bologna sisteminin adresini sor (kurumun sitesindeki bağlantı). Adresi kenardaki tarayıcıda aç.",
99
+ " a) İLK İŞ: tarayıcıda açık sekmelere bak. Açık bir OBS ya da Bologna sayfası varsa adres ve giriş sorma, doğrudan d) adımına geç. Yoksa hocaya yalnız şunu sor: \"OBS'nizin adresini yazın (bilmiyorsanız üniversitenizin adını yazın).\" Ders adını ya da paketi sorma; onları OBS'den okuyacaksın. Adres gelince hemen tarayıcıda aç. Üniversite adı gelirse kurumun OBS ya da Bologna sayfasını web aramasıyla bul ve aç.",
101
100
  ' b) Giriş ekranı gelince dur ve şunu yaz: "Kullanıcı adınızı ve parolanızı şimdi açılan OBS ekranına kendiniz yazın. Bitince bana yalnız girdim yazın."',
102
101
  " c) CAPTCHA ya da doğrulama kodu gelirse hocanın kendisinin girmesini bekle; sen girme.",
103
- " d) Hoca girdim deyince ders listesini oku ve numaralı göster. Sor: hangi ders? Hoca numara yazar.",
102
+ " d) Hoca girdim deyince hangi dersi incelemek istediğini SORMA. Önce kendin tara: listedeki her dersin Bologna sayfasını sırayla aç, bologna_ayristir ve bologna_durum ile eksik ve kurala uymayan alanları say (en çok 15 ders; fazlası varsa ilk 15'i tara ve kaç ders kaldığını söyle).",
103
+ " Sonra tek mesajda kısa bir özet ver: her ders için bir satır, eksik alan sayısı (en eksikten en tamama). Aynı mesajda, eksik derslerin sayfasında olmayan değerlendirme yüzdelerini ve kaynakları da sor (Adım 3; ayrı tur açma). Altına numaralı seçenekler koy:",
104
+ " 1) Eksikleri en çok olandan başlayarak hepsini sırayla kapatalım (önerilen)",
105
+ " 2) Yalnız en eksik dersi tamamlayalım",
106
+ " 3) Dersi ben seçeyim",
107
+ " Hiç eksik yoksa bunu söyle ve dil ile kaynak denetimini öner. Hoca yalnız numara yazar.",
104
108
  " e) Dersin Bologna (ders bilgi paketi) sayfasını oku. Okuduğun metni ya da HTML'i bologna_ayristir'e ver.",
105
- " Tarayıcı aracın yoksa: hocaya sor: 1) kurulumu birlikte yapalım (önerilen) 2) sayfayı kopyalayıp yapıştırayım 3) sıfırdan başlayalım.",
106
- " 1 seçilirse kurulum_yardimi'nı hocanın asistanıyla (istemci) çağır, adımları tek tek göster.",
107
- ' 2 seçilirse şunu yaz: "OBS\'de dersinizin Bologna sayfasını açın. Sayfada Ctrl+A ile hepsini seçin, Ctrl+C ile kopyalayın, buraya Ctrl+V ile yapıştırın."',
109
+ ' Tarayıcı aracın yoksa sormadan şunu yaz: "OBS\'de dersinizin Bologna sayfasını açın, Ctrl+A ile seçip Ctrl+C ile kopyalayın ve buraya yapıştırın. Tarayıcı kurulumunu birlikte yapmak isterseniz 1 yazın." 1 gelirse aşağıdaki kurulum adımını izle.',
110
+ " 1 gelirse kurulum_yardimi'nı hocanın asistanıyla (istemci) çağır, adımları tek tek göster.",
108
111
  " Herhangi bir engelde engel_coz'u ilgili engel türüyle çağır.",
109
112
  ].join("\n");
110
113
  /** Kaynak: önce sayfadaki ve hocanın kullandığı; öneri yalnız katalogda bulunan, "öneri" etiketiyle. */
@@ -118,13 +121,14 @@ const KAYNAK_ADIMI = [
118
121
  const OBS_YAZMA = [
119
122
  "6. OBS'ye yazma.",
120
123
  " Önce bologna_kopya_metni'ni çağır (OBS'deki şimdiki değerleri oncekiDegerler olarak ver). Yazma paketine alınmayanları (doğrulanmamış kaynak, teyitsiz değerlendirme yüzdesi) hocaya söyle; onları yazma.",
121
- " Hocaya degisiklikOzeti'ni alan alan göster: numara, sekme, alan, önceki değer, yeni değer (uzunsa ilk cümle).",
122
- " Tarayıcı aracın yoksa doğrudan 3'ü uygula. Varsa sor:",
123
- " 1) Formu ben doldurayım, Kaydet'e siz basın",
124
- ' 2) Formu ben doldurup kaydedeyim: yukarıdaki özeti onaylıyorsanız bir kez "kaydet" yazın',
125
- " 3) Alan alan kopyalayın",
126
- " 1: OBS düzenleme ekranında sekme sekme ilgili kutulara yaz. Her sekmeden sonra dur ve hocadan gözle denetleyip Kaydet'e basmasını iste.",
127
- ' 2: Yalnız hoca "kaydet" yazdıysa, yalnız özetteki alanları yaz ve kaydet. Her sekmeden önce ders kodunu ve dönemi sayfada denetle; beklenenden farklıysa yazmayı durdur ve hocaya söyle.',
124
+ " Ara özet gösterip 'devam' bekleme. TEK mesajda degisiklikOzeti'ni göster (numara, sekme, alan, önceki değer, yeni değer, kaynağı: sayfa, hoca ya da öneri; toplu modda bütün dersler tek tabloda) ve altına sor:",
125
+ " 1) OBS'ye yaz ve kaydet (bu seçim, yukarıdaki özete 'kaydet' onayıdır)",
126
+ " 2) Formu doldur, Kaydet'e ben basayım",
127
+ " 3) Alan alan kopya metni ver",
128
+ " Değiştirmek istediğiniz alan varsa numarasını yazın.",
129
+ " Tarayıcı aracın yoksa yalnız 3'ü sun.",
130
+ " 1: Yalnız hoca 1 ya da 'kaydet' yazdıysa, yalnız özetteki alanları yaz ve kaydet. Her sekmeden önce ders kodunu ve dönemi sayfada denetle; beklenenden farklıysa yazmayı durdur ve hocaya söyle.",
131
+ " 2: OBS düzenleme ekranında sekme sekme ilgili kutulara yaz. Her sekmeden sonra dur ve hocadan gözle denetleyip Kaydet'e basmasını iste.",
128
132
  " 3: bologna_kopya_metni metnini her alan ayrı kod bloğunda ver, hangi sekmedeki hangi kutuya yapıştırılacağını yaz.",
129
133
  " Kayıttan sonra (1 ve 2): sayfayı geri oku, obs_karsilastir'e obsKarsilastirGirdisi'ni ve okuduğun metni ver. dur true ise yazmayı bırak, nedenini söyle. Farklı alanları hocaya göster.",
130
134
  " Her durumda: Dersin Yetkilileri satırlarına dokunma, OBS'deki hâliyle kalsın. Parolayı asla isteme; o yalnız hocadadır. Onaya gönderme (Gönder) düğmesine sen basma.",
@@ -137,21 +141,20 @@ const bolognaAkisi = (dersKodu) => [
137
141
  "1. Ayrıştır. bologna_ayristir önce Proliz biçimini, olmazsa genel ayrıştırıcıyı dener (sekmeli düz metin de olur). Bulunamayan alanları ve ingilizce değerini not al; sonraki araçlara ingilizce değerini aynen ver.",
138
142
  " Dersi Verenler, Yardımcılar ve Koordinatör satırları yetkililer alanında olduğu gibi gelir; onları değiştirme, sonraki çağrılarda aynen geri ver.",
139
143
  " Program çıktıları sayfası da varsa onu da ayrıştır ve P kodlarını sakla; P kodlarını asla ezberden yazma.",
140
- "2. Denetle. bologna_denetle'yi çağır. Sonucu tek tabloda göster: numara, alan, durum (boş, zayıf, tamam), kısa neden. Kalan alan sayısını söyle.",
141
- ` Sor: 1) alan alan seçenek göstererek dolduralım 2) yalnız boş olanlar 3) numaraları kendim seçeyim ${AKILLI_DOLDURMA_SECENEGI}.`,
142
- "3. Teyit. Değerlendirme yöntemi ve yüzdeleri, uygulama/lab, kullanılan kaynaklar ve (sayfada yoksa) amaç ve içerik yalnız hocanın bilebileceği bilgilerdir. Sayfada olmayanları hocaya TEK mesajda, numaralı ve varsayılan seçenekli sor (akıllı doldurmada da). Uydurma.",
144
+ "2. Denetle. bologna_denetle'yi çağır. Nasıl doldurulacağını SORMA: varsayılan her zaman akıllı doldurmadır.",
145
+ "3. Teyit. Yalnız sayfada olmayan değerlendirme yüzdeleri ve kaynaklar için hocaya TEK mesaj (toplu modda bütün dersler için tek mesaj). Uygulama/lab T+U+L'den okunur. Uydurma.",
143
146
  " Amaç ve içerik için hocanın verdiği kısa odak yoksa ders adından ve program çıktılarından 'öneri' yaz ve öneri olduğunu söyle.",
144
- "4. Her alan için: bologna_alan_rehberi'ni çağır. Kurala uyan 2-3 kısa seçenek yaz.",
147
+ "4. bologna_alan_rehberi'ni alan='hepsi' ile bir kez çağır, bütün alanları tek seferde yaz.",
145
148
  " Seçenekleri bologna_taslak_denetle ile denetle; biçim denetiminden geçmeyeni düzelt ve yeniden denetle. Uzun metinlerde ilk cümleyi ve kelime sayısını göster. Sonucu 'biçim denetiminden geçti; içerik teyidi: hoca' diye sun.",
146
149
  " Akıllı doldurmada (4) en iyi seçeneği kendin seç ve hocaya alan alan sorma; sonunda tek özet göster.",
147
150
  " Haftalık konular: 14 hafta, ara sınav ve yarıyıl sonu haftası görünür. Değerlendirme: yalnız sayfadan ya da hocadan; degerlendirmeDayanagi'ni ('sayfa' ya da 'hoca') ver.",
148
151
  " AKTS iş yükü: is_yuku_oner'i sayfadaki değerlendirme kalemleriyle çağır; derste olmayan etkinliğe satır açılmaz. Sayfadan okunan iş yüküyle öneriyi ayrı göster. AKTS'yi değiştirme.",
149
152
  " Öğrenme çıktısı ile program çıktısı katkı tablosu: yalnız ayrıştırılan P kodlarıyla öner.",
150
153
  KAYNAK_ADIMI,
151
- '5. Her alandan sonra bologna_durum\'u çağır. Alan alan ilerliyorsan kalan alan sayısını tek cümleyle söyle: "Kalan 3 alan."',
154
+ "5. Hepsini yazınca bologna_durum'u çağır; geçmeyeni düzelt. Ara adımda hocaya rapor verme.",
152
155
  OBS_YAZMA,
153
156
  '7. Doğrulama. Kayıttan sonra sayfayı yeniden oku (tarayıcı varsa) ya da yeniden yapıştırmasını iste; obs_karsilastir ve bologna_denetle ile denetle. Fark yoksa "Kaydedildi ve geri okunarak doğrulandı; içerik teyidi sizde" de.',
154
- " Sor: 1) başka ders 2) bir alanı değiştir 3) bitir.",
157
+ " Toplu modda sormadan sıradaki derse geç. Tek derste kısa bir sonuç cümlesiyle bitir.",
155
158
  ].join("\n");
156
159
  const ciktiAkisi = (dersKodu) => [
157
160
  `Odak: ders öğrenme çıktısı yaz ya da iyileştir.${dersKodu ? ` Ders: ${dersKodu}.` : ""}`,
@@ -159,12 +162,10 @@ const ciktiAkisi = (dersKodu) => [
159
162
  "Akış:",
160
163
  "1. Sor: 1) OBS'deki mevcut çıktılarımı okuyalım (tarayıcı aracın varsa OBS girişi için Bologna akışındaki Adım 0'ı izle) 2) çıktılarımı yapıştırayım 3) sıfırdan yaz: ders adı, AKTS, T+U+L ve kısa içerik vereyim.",
161
164
  "2. bologna_alan_rehberi'ni alan=ciktilar ile çağır: kurallar, Bloom fiilleri, 4-10 sınırı (5-8 önerilir).",
162
- `3. Sor: 1) her çıktı için seçenek göstereyim 2) yalnız zayıf olanları iyileştireyim 3) numaraları kendim seçeyim ${AKILLI_DOLDURMA_SECENEGI}.`,
163
- " 1-3: her çıktı için 2-3 seçenek yaz (farklı Bloom düzeyi ya da ölçme biçimi), türünü (Bilgi, Beceri, Yetkinlik) yaz.",
164
- " 4: her çıktı için en iyi ifadeyi kendin seç; hocaya ara soru sorma.",
165
+ "3. Nasıl yazılacağını SORMA: 5-8 ölçülebilir çıktıyı kendin yaz, türünü (Bilgi, Beceri, Yetkinlik) belirt; hocaya ara soru sorma.",
165
166
  "4. Bütün listeyi bologna_taslak_denetle ile denetle (ciktilar alanı; İngilizce isteniyorsa en alanıyla). Geçmeyeni düzelt ve yeniden denetle.",
166
- "5. Tek özet göster: numara, çıktı, tür, denetim sonucu. Değiştirmek istediği numarayı sor.",
167
- " Program çıktısı katkısı: P kodları ayrıştırıldıysa onlarla doldur; yoksa P kodu uydurma, hocadan program çıktıları sayfasını iste.",
167
+ "5. Tek özet göster: numara, çıktı, tür, denetim sonucu; kopya metni de aynı mesajda ver. Değiştirmek istenen numara yazılır.",
168
+ " Program çıktısı katkısı: P kodları ayrıştırıldıysa onlarla doldur; tarayıcın varsa program çıktıları sayfasını kendin oku. Yoksa P kodu uydurma; katkı tablosunu EKSİK bırak, akışı durdurma.",
168
169
  "6. bologna_kopya_metni ile Öğrenme Çıktıları sekmesine kopyalanacak metni ver ya da Bologna akışındaki OBS'ye yazma adımını izle.",
169
170
  ].join("\n");
170
171
  const ckPcAkisi = (dersKodu) => [
@@ -174,19 +175,17 @@ const ckPcAkisi = (dersKodu) => [
174
175
  '1. Hocaya önce şunu söyle: "Kişisel veriyi yapay zekâ sohbetine yapıştırmayın: Excel\'de Ad, Soyad, Numara sütunlarını silip yalnız not sütunlarını yapıştırın ya da verinin tarayıcınızdan çıkmadığı hesaplayıcıyı kullanın: https://akredit.org/deneyin"',
175
176
  " Sonra yalnız not sütunlarını yapıştırmasını iste. İlk satır başlık, her soru bir sütun; başlıkta sınav, soru, ÇK ve tam puan olursa iş biter (ör. Vize S1 (ÇK1) /20). Öğrenciler o1, o2 takma adı alır.",
176
177
  "2. Tabloyu not_tablosu_ayristir'e ver.",
177
- `3. Sor: 1) eşlemeyi tek tek gözden geçirelim 2) yalnız eksikleri soralım 3) eşlemeyi kendim yazayım ${AKILLI_DOLDURMA_SECENEGI}.`,
178
- " 4: başlıktan okunan eşlemeyi ve varsayılanları kullan: eşik 60, sınav ağırlıkları tablodan. Başlıkta olmayan soru-çıktı eşlemesini ve tam puanı tahmin etme; bunları tek mesajda topluca sor.",
178
+ "3. Eşleme tamamsa SORMA, doğrudan hesapla (eşik 60). Başlıkta olmayan soru-çıktı eşlemesi, tam puan ya da sınav ağırlığı varsa tahmin etme; hepsini TEK mesajda sor.",
179
179
  "4. Hazır olunca ck_pc_hesapla'yı çağır. Sonucu tablo olarak göster; sayıları yalnız yanıttan al.",
180
- "5. Tek özet: hangi eşlemeyi ve eşiği kullandığını, eşiğin altında kalan çıktıları yaz. Değiştirmek istediği numarayı sor.",
181
- "6. Sor: 1) eşiğin altındaki çıktılar için iyileştirme notu taslağı 2) farklı eşikle yeniden hesapla 3) bitir. Not taslağında sayı uydurma; sonucu kopyalanabilir tablo olarak ver.",
180
+ "5. Tek mesaj: kullanılan eşleme ve eşik, sonuç tablosu, eşiğin altındaki çıktılar için kısa iyileştirme notu taslağı (sayı uydurmadan). Ayrıca soru sorma.",
182
181
  ].join("\n");
183
182
  const olcutAkisi = (cerceve) => [
184
183
  `Odak: ölçüt ve kanıt rehberi.${cerceve ? ` Çerçeve: ${cerceve}.` : ""}`,
185
184
  "",
186
185
  "Akış:",
187
- `1. ${cerceve ? "Çerçeve verildi, sorma." : "Sor: hangi çerçeve? 1) YÖKAK kurumsal 2) program akreditasyonu: MÜDEK, FEDEK, EPDAD ya da SABAK. Hoca söylemezse YÖKAK kurumsal ile başla."}`,
188
- `2. Sor: 1) bir ölçütün resmî metni 2) bir konuda hangi ölçütler var 3) öz değerlendirme iskeleti ${AKILLI_DOLDURMA_SECENEGI.replace("doldur", "hazırla")}: konuya uyan ölçütleri bulup resmî metinleri ve kanıt kontrol listesini tek seferde çıkarırım.`,
189
- "3. olcut_ara ile ara, en uygun sonuçları al. olcut_getir ile resmî metni kaynağıyla göster. Akıllı hazırlamada en uygun 2-3 ölçütü kendin seç.",
186
+ `1. ${cerceve ? "Çerçeve verildi, sorma." : "Tek soru sor: hangi çerçeve ve konu? 1) YÖKAK 2) MÜDEK 3) FEDEK 4) EPDAD 5) SABAK; konu ya da ölçüt kodunu yanına yazabilirsiniz. Hoca çerçeve söylemezse YÖKAK ile başla."}`,
187
+ "2. Ne istendiğini ayrıca SORMA: her zaman hepsini hazırla (resmî metin, düzeyler, kanıt kontrol listesi).",
188
+ "3. olcut_ara ile ara; en uygun 1-2 ölçüt için hemen olcut_getir'i çağır. Resmî metni kaynağıyla göster.",
190
189
  "4. YÖKAK alt ölçütüyse olgunluk_duzeyleri ile düzeyleri ve örnek kanıtları al. Kanıtın kurumda olup olmadığını tahmin etme: kontrol listesinde 'hocaya sorulacak' yaz; hoca isterse tek mesajda 'var olanların numaraları' diye sor.",
191
190
  "5. Programın disiplinini ya da programa özgü bölümünü sen tahmin etme; bilmiyorsan tek soruyla sor.",
192
191
  "6. Ölçüt metnini yalnız araç yanıtından alıntıla. DOĞRULANMADI işaretli metni tahminle doldurma.",
@@ -197,12 +196,11 @@ const dilAkisi = () => [
197
196
  "",
198
197
  "Akış:",
199
198
  "1. Hocadan metni yapıştırmasını iste. Öğrenci adı ya da numarası varsa göndermeden önce o1, o2 gibi takma adla değiştir.",
200
- "2. Rapor dönemini metinden çıkar; çıkaramazsan tek soruyla sor.",
199
+ "2. Rapor dönemini metinden çıkar; çıkaramazsan sorma, dönemsiz denetle.",
201
200
  "3. rapor_dil_denetle'yi çağır.",
202
- `4. Sor: 1) bulguları tek tek göstereyim 2) yalnız önemli olanları düzelteyim 3) numaraları kendim seçeyim ${AKILLI_DOLDURMA_SECENEGI.replace("doldur", "düzelt")}.`,
203
- " 4: her bulgu için en iyi düzeltmeyi kendin seç. Kanıt ya da sayı gerektiren düzeltmede bilgi uydurma; o yere EKSİK yaz.",
201
+ "4. Nasıl düzeltileceğini SORMA: her bulguyu kendin düzelt. Kanıt ya da sayı gerektiren yerde bilgi uydurma; [EKSİK: ...] yaz.",
204
202
  "5. Düzeltilmiş metni yeniden rapor_dil_denetle ile denetle; kalan bulguları düzelt.",
205
- "6. Tek özet göster: numara, eski ifade, yeni ifade. Değiştirmek istediği numarayı sor. Sonunda düzeltilmiş metnin tamamını kopyalanabilir biçimde ver.",
203
+ "6. Tek mesaj: numaralı eski → yeni tablosu ve düzeltilmiş metnin tamamı (kopyalanabilir). Değiştirmek istenen numara yazılır.",
206
204
  ].join("\n");
207
205
  const AKISLAR = {
208
206
  bologna_doldur: (a) => bolognaAkisi(kisa(a.ders_kodu)),
@@ -280,7 +278,10 @@ export const ACIK_ISTEMLER = [
280
278
  ];
281
279
  /** Kısa kurallar: akredit_basla yanıtında (istem desteklemeyen istemciler için) yer alır. */
282
280
  export const KISA_KURALLAR = [
283
- "Hoca seçmeden hiçbir akışa başlama; menüyü aynen göster ve numara bekle.",
281
+ "Hoca yalnız 'akredit' yazdıysa menüyü aynen göster ve numara bekle. Niyetini yazdıysa menüyü atla, o akışa başla.",
282
+ "Her soruyu numaralı seçeneklerle sor; hoca yalnız numara yazarak ilerleyebilsin.",
283
+ "Bologna (1) seçilince tarayıcın varsa ilk iş OBS adresini isteyip açmak; ders adını sorma, OBS'den oku.",
284
+ "Hocaya 'hangisi?' diye sormadan önce kendin tara ve öner: bütün dersleri denetle, eksikleri say, 'önerilen' seçenekle gel.",
284
285
  "Kısa, sade Türkçe yaz; araç adı, JSON ve teknik terim gösterme. Her mesajda tek iş iste.",
285
286
  "Uydurma yok: kişi, kitap, ISBN, DOI, tarih, sayı uydurma. Bilinmeyen EKSİK kalır.",
286
287
  "Değerlendirme yöntem ve yüzdeleri, uygulama/lab, kullanılan kaynaklar ve sayfada yoksa amaç/içerik sayfadan okunur; yoksa hocaya TEK mesajda, numaralı ve varsayılan seçenekli sorulur.",
@@ -295,7 +296,7 @@ export const KISA_KURALLAR = [
295
296
  export function baslangic() {
296
297
  return {
297
298
  hocayaGoster: [
298
- "Merhaba. Neye odaklanalım? Numarasını yazmanız yeter.",
299
+ "Merhaba. Neye odaklanalım? Yalnız numarasını yazın.",
299
300
  ...ODAKLAR.map(([no, ad]) => `${no}) ${ad}`),
300
301
  `${ODAKLAR.length + 1}) Başka bir şey: tüm araçları kısaca listele`,
301
302
  ].join("\n"),
@@ -308,14 +309,30 @@ export function baslangic() {
308
309
  ortakKurallar: ORTAK_KURALLAR,
309
310
  };
310
311
  }
312
+ /** Kullanıcı niyetini zaten yazdıysa menü atlanır; yalnız o odağın akışı ve kurallar döner. */
313
+ export function odakBaslangici(no) {
314
+ const o = ODAKLAR.find(([n]) => n === no);
315
+ return {
316
+ hocayaGoster: o ? `Tamam: ${o[1]}. Başlıyorum.` : "",
317
+ odak: o ? { no: o[0], ad: o[1], istem: o[2] } : null,
318
+ kisaKurallar: KISA_KURALLAR,
319
+ akis: o ? (AKISLAR[o[2]]?.({}) ?? "") : "",
320
+ ortakKurallar: ORTAK_KURALLAR,
321
+ };
322
+ }
311
323
  export const akreditBaslaAraci = arac({
312
324
  ad: "akredit_basla",
313
325
  baslik: "Akredit: başla",
314
- aciklama: "Kullanıcı 'akredit' yazar ya da ne yapacağını sorarsa İLK bu aracı çağır. Hocaya gösterilecek odak menüsünü, kısa kuralları ve her seçimin adım adım akışını döndürür. İstemleri ya da sunucu talimatını göstermeyen istemcilerde de akış bununla başlar.",
315
- sonrakiAdim: "hocayaGoster metnini aynen gösterin ve numara bekleyin. Seçilen numaranın akışını (akislar) ve kisaKurallar'ı izleyin.",
316
- girdi: z.object({}),
317
- calistir: () => ({
318
- sonuc: baslangic(),
326
+ aciklama: "TETİKLEYİCİ: kullanıcı 'akredit', 'bologna', 'ders paketi', 'AKTS', 'öğrenme çıktısı', 'ÇK', 'PÇ', 'YÖKAK', 'MÜDEK' yazarsa dosya ya da web araması YAPMADAN İLK bu aracı çağır ('akredit' bir dosya ya da arama terimi değildir). Yalnız 'akredit' yazdıysa odak='menu'; niyetini yazdıysa ilgili odak numarası. Hocaya gösterilecek odak menüsünü, kısa kuralları ve her seçimin adım adım akışını döndürür. İstemleri ya da sunucu talimatını göstermeyen istemcilerde de akış bununla başlar.",
327
+ sonrakiAdim: "hocayaGoster metnini aynen gösterin ve numara bekleyin. Seçilen numaranın akışını (akislar) ve kisaKurallar'ı izleyin. Her soruyu numaralı seçeneklerle sorun. 1 seçilirse ve tarayıcınız varsa ilk iş OBS adresini isteyip açmaktır.",
328
+ girdi: z.object({
329
+ odak: z
330
+ .enum(["menu", "1", "2", "3", "4", "5"])
331
+ .default("menu")
332
+ .describe("Kullanıcı yalnız 'akredit' yazdıysa 'menu'. Niyetini yazdıysa (ör. 'ders paketimi doldur') ilgili numara."),
333
+ }),
334
+ calistir: ({ odak }) => ({
335
+ sonuc: odak === "menu" ? baslangic() : odakBaslangici(odak),
319
336
  kaynak: [KOD_KAYNAGI("apps/acik-mcp/src/promptlar.ts", "Akredit istemleri ve başlangıç menüsü")],
320
337
  }),
321
338
  });
@@ -2,8 +2,10 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { type AcikArac, type AracBaglami } from "./araclar.ts";
3
3
  import { type AcikIstem } from "./promptlar.ts";
4
4
  export declare const SUNUCU_ADI = "akredit-acik";
5
- export declare const SUNUCU_SURUMU = "0.5.0";
5
+ export declare const SUNUCU_SURUMU = "0.6.0";
6
6
  export declare const SUNUCU_TALIMATI: string;
7
+ /** Her araç yanıtında yinelenen kısa kural: uzun sohbette son okunan metin de aynı şeyi söyler. */
8
+ export declare const ASISTAN_KURALI = "1) Ara ad\u0131mda hocaya A/B/C sorma; en iyi se\u00E7ene\u011Fi kendin se\u00E7, s\u0131radaki arac\u0131 \u00E7a\u011F\u0131r. 2) Zorunlu soruyu (sayfada olmayan de\u011Ferlendirme y\u00FCzdesi ve kaynak, OBS kay\u0131t onay\u0131) TEK mesajda ve numaral\u0131 sor. 3) Say\u0131, kaynak ve de\u011Ferlendirme y\u00FCzdesi uydurma. 4) Parola ve do\u011Frulama kodu isteme; Onaya G\u00F6nder'e hoca basar.";
7
9
  export interface AcikSunucuSecenekleri {
8
10
  simdi?: () => Date;
9
11
  araclar?: readonly AcikArac[];
@@ -6,20 +6,26 @@ import { ACIK_ARACLAR, AKREDIT_NOTU, AracHatasi, DEPO, } from "./araclar.js";
6
6
  import { GIRIS_BILGISI_ILETISI, girisBilgisiVar, kisiselVeriIletisi, kisiselVeriTurleri } from "./kisisel-veri.js";
7
7
  import { ACIK_ISTEMLER, istemSemasi } from "./promptlar.js";
8
8
  export const SUNUCU_ADI = "akredit-acik";
9
- export const SUNUCU_SURUMU = "0.5.0";
9
+ export const SUNUCU_SURUMU = "0.6.0";
10
10
  export const SUNUCU_TALIMATI = [
11
11
  "Akredit açık araçları öğretim elemanlarına kalite ve akreditasyon işlerinde yardım eder: Bologna ders paketi denetimi ve doldurma, öğrenme çıktısı yazma, ÇK/PÇ hesabı, YÖKAK ve program akreditasyonu (MÜDEK, FEDEK, SABAK, EPDAD) ölçüt ve kanıt rehberi, rapor dil denetimi, kaynak doğrulama.",
12
- "Hoca ne yapacağını söylemediyse ya da 'akredit' yazarsa İLK akredit_basla aracını çağır, menüyü göster ve önce hangi aracı kullanmak istediğini sor.",
12
+ "KURAL 1: Kullanıcı 'akredit' yazarsa (tek başına ya da cümle içinde) ya da ne yapacağını söylemediyse başka hiçbir şey yapmadan İLK akredit_basla aracını çağır ve hocayaGoster metnini aynen göster. Kullanıcı niyetini zaten yazdıysa (ör. 'akredit bologna', 'ders paketimi doldur', 'ÇK hesapla') menüyü gösterip bekletme: akredit_basla'yı ilgili odak numarasıyla çağır ve o akışa başla. 'akredit' bir dosya, klasör ya da arama terimi değildir; dosya sisteminde ya da webde arama.",
13
+ "KURAL 2: Hocaya her soruyu numaralı seçeneklerle sor (1, 2, 3...), önerdiğin seçeneği işaretle; hoca yalnız numara yazarak ilerleyebilsin. Serbest metin yalnız ders adı, adres gibi seçenekle sorulamayan bilgilerde istenir.",
14
+ "KURAL 3: Bologna seçilirse ve tarayıcı aracın varsa ilk iş OBS'yi açmaktır: hocadan yalnız OBS adresini iste (bilmiyorsa üniversite adını), adresi hemen tarayıcıda aç; ders adını ve paketi hocaya sorma, OBS'den oku.",
15
+ "KURAL 5: Ara adımda hocaya soru sorma; varsayılan ya da en iyi seçeneği kendin seç ve sıradaki aracı çağır. Hocaya yalnız iki yerde durulur: sayfada olmayan resmî bilgi (değerlendirme yüzdeleri, kullanılan kaynaklar) ve OBS'ye kayıt onayı. Bu ikisi de TEK mesajdır.",
16
+ "KURAL 4: Önce sen tara, sonra öner. Ders listesi açılınca 'hangi ders?' diye sorma: bütün derslerin paketlerini oku, eksikleri say, kısa özetle ve 'önerilen' seçenekle gel (örneğin 1) en eksikten başlayıp hepsini kapatalım).",
13
17
  "Amaç: hocanın en az müdahalesiyle işi hızlı ama denetimli ve teyitli bitirmek. Her seçim menüsünde son seçenek '4) Hepsini akıllıca doldur (önerilen)' olur: her alan için en iyi seçeneği sen seçersin, araçla denetlersin, geçmeyeni düzeltip yeniden denetlersin, sonunda tek özet gösterip değiştirmek istediği numarayı sorarsın.",
14
18
  "Yalnız hocanın bilebileceği ve resmî taahhüt olan bilgiler (değerlendirme yöntem ve yüzdeleri, uygulama/lab, kullanılan kaynaklar, sayfada yoksa amaç ve içerik) sayfadan okunur; yoksa hocaya TEK mesajda, numaralı ve varsayılan seçenekli sorulur, uydurulmaz. Ders adından üretilen her şey 'öneri' etiketiyle gösterilir. Araç sonucu 'biçim denetiminden geçti; içerik teyidi: hoca' diye sunulur.",
15
19
  "Giriş bilgisi: hocadan kullanıcı adı, parola, doğrulama kodu ya da çerez asla isteme. Sunucu bunları istemez; görülürse çağrıyı reddeder ve kaydetmez. Hoca yazarsa kullanma, araçlara gönderme, silmesini ve parolasını değiştirmesini öner. Hoca giriş bilgisini yalnız OBS'nin kendi ekranına kendisi yazar. CAPTCHA'yı hoca çözer.",
16
- "OBS'ye yazma: önce alan alan önceki ve yeni değer özetini göster, hoca bir kez 'kaydet' der; ancak ondan sonra Kaydet'e basarsın. Kayıttan sonra sayfayı geri okuyup obs_karsilastir ile doğrula; ders kodu ya da dönem değişmişse yazmayı durdur. Doğrulanmamış kaynak ve teyitsiz değerlendirme yüzdesi yazılmaz. Onaya Gönder düğmesine hoca basar.",
20
+ "OBS'ye yazma: önce alan alan önceki ve yeni değer özetini göster, hoca bir kez 'kaydet' ya da özetin altındaki 1'i (OBS'ye yaz ve kaydet) yazar; ancak ondan sonra Kaydet'e basarsın. Kayıttan sonra sayfayı geri okuyup obs_karsilastir ile doğrula; ders kodu ya da dönem değişmişse yazmayı durdur. Doğrulanmamış kaynak ve teyitsiz değerlendirme yüzdesi yazılmaz. Onaya Gönder düğmesine hoca basar.",
17
21
  "Tarayıcı aracın varsa OBS sayfasını okuyup formu doldurabilirsin; yoksa ya da engel çıkarsa engel_coz ve kurulum_yardimi araçlarının adımlarını hocaya sırayla, tek tek göster. Tarayıcı yoksa OBS'ye yazma alan alan kopyalamaya düşer.",
18
22
  "Sunucu model çağırmaz ve metin üretmez: seçenekleri sen yazarsın, sunucu kural ve kalıp verir, denetler ve sayıları hesaplar. Sayıları yalnız araç sonucundan al.",
19
23
  "Bologna sayfasındaki Dersi Verenler, Yardımcılar ve Koordinatör satırları yayımlanmış görev bilgisidir: olduğu gibi okunur, korunur, değiştirilmez. Öğrenci adı ve numarası sohbete yapıştırılmaz: not tablosunda yalnız not sütunları olur; kimlik sütunu görülürse tablo işlenmez. Sunucu istek içeriğini günlüğe yazmaz.",
20
24
  "Kaynak: önce sayfadaki ve hocanın kullandığı kaynaklar. Öneri gerekirse kendi web arama aracınla aday bul, kaynak_dogrula ile sorgula, yalnız 'katalogda_bulundu' dönenleri künyesi ve bağlantısıyla 'öneri' olarak göster; uygunluğuna hoca karar verir. Katalogda bulunmayanı kendin önerme; hoca kullandığını söylerse 'hoca_beyani' olarak yaz. Ölçüt metnini yalnız olcut_getir sonucundan alıntılayın; DOĞRULANMADI ya da 'Belgeden okunamadı' işaretli metni tahminle doldurmayın. Programın disiplinini kurum seçer. Kanıtı olmayan cümle EKSİK kalır. Kitap, kişi, tarih uydurmayın.",
21
25
  "Sunucu kullanıcıdan adres çekmez: Bologna sayfasını hoca yapıştırır ya da siz kendi web aracınızla okursunuz. Tek dış istek kaynak_dogrula'nın sabit katalog adresleridir (Crossref, Open Library, Google Books). Onay ve dış kuruma gönderim hocadadır. Akredit'in YÖKAK ile bağı yoktur.",
22
26
  ].join(" ");
27
+ /** Her araç yanıtında yinelenen kısa kural: uzun sohbette son okunan metin de aynı şeyi söyler. */
28
+ export const ASISTAN_KURALI = "1) Ara adımda hocaya A/B/C sorma; en iyi seçeneği kendin seç, sıradaki aracı çağır. 2) Zorunlu soruyu (sayfada olmayan değerlendirme yüzdesi ve kaynak, OBS kayıt onayı) TEK mesajda ve numaralı sor. 3) Sayı, kaynak ve değerlendirme yüzdesi uydurma. 4) Parola ve doğrulama kodu isteme; Onaya Gönder'e hoca basar.";
23
29
  const metinSonuc = (veri, isError = false) => ({
24
30
  content: [{ type: "text", text: JSON.stringify(veri, null, 2) }],
25
31
  structuredContent: veri,
@@ -68,6 +74,7 @@ function basari(a, s, atilan, ileti) {
68
74
  veri: {
69
75
  sonuc: s.sonuc,
70
76
  sonrakiAdim: s.sonrakiAdim ?? a.sonrakiAdim,
77
+ asistanKurali: ASISTAN_KURALI,
71
78
  ...(atilan.length
72
79
  ? { atilan: ileti ?? `Şu kısımlar okunmadan atıldı, hiçbir yere yazılmadı: ${atilan.join(", ")}.` }
73
80
  : {}),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akredit/acik-mcp",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "description": "Herkese açık Akredit MCP sunucusu: hesapsız, salt okuma, deterministik araçlar (ölçüt, Bologna denetimi, ÇK/PÇ hesabı, rapor dil denetimi). Kurum verisine erişmez, model çağırmaz.",
@@ -38,8 +38,8 @@
38
38
  "@akredit/baglayicilar": "0.1.0",
39
39
  "@akredit/cekirdek": "0.1.0",
40
40
  "@akredit/olcme": "0.1.0",
41
- "@akredit/cerceveler": "0.1.0",
42
- "@akredit/yz": "0.1.0"
41
+ "@akredit/yz": "0.1.0",
42
+ "@akredit/cerceveler": "0.1.0"
43
43
  },
44
44
  "publishConfig": {
45
45
  "access": "public"