@akredit/acik-mcp 0.5.0 → 0.8.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 +41 -37
- package/dist/apps/acik-mcp/src/araclar.js +12 -7
- package/dist/apps/acik-mcp/src/bologna.d.ts +12 -0
- package/dist/apps/acik-mcp/src/bologna.js +498 -254
- package/dist/apps/acik-mcp/src/genel-ayristir.js +2 -2
- package/dist/apps/acik-mcp/src/http.js +2 -1
- package/dist/apps/acik-mcp/src/kaynak-dogrula.js +1 -1
- package/dist/apps/acik-mcp/src/kisisel-veri.d.ts +4 -3
- package/dist/apps/acik-mcp/src/kisisel-veri.js +5 -0
- package/dist/apps/acik-mcp/src/not-tablosu.d.ts +4 -1
- package/dist/apps/acik-mcp/src/not-tablosu.js +13 -7
- package/dist/apps/acik-mcp/src/promptlar.d.ts +28 -4
- package/dist/apps/acik-mcp/src/promptlar.js +145 -79
- package/dist/apps/acik-mcp/src/sunucu.d.ts +4 -1
- package/dist/apps/acik-mcp/src/sunucu.js +21 -9
- package/dist/apps/acik-mcp/src/temel.d.ts +8 -0
- package/dist/apps/acik-mcp/src/temel.js +32 -0
- package/dist/apps/acik-mcp/src/yardim.js +46 -12
- package/dist/packages/baglayicilar/src/bologna-proliz/ayristir.js +4 -2
- package/dist/packages/cekirdek/src/bologna/taslak.js +8 -2
- package/dist/packages/cekirdek/src/karar/katman.d.ts +2 -2
- package/dist/packages/cekirdek/src/karar/katman.js +2 -2
- package/dist/packages/cekirdek/src/turkce.d.ts +0 -2
- package/dist/packages/cekirdek/src/turkce.js +0 -4
- package/dist/packages/olcme/src/girdi.d.ts +3 -0
- package/dist/packages/olcme/src/girdi.js +55 -0
- package/dist/packages/olcme/src/index.d.ts +1 -0
- package/dist/packages/olcme/src/index.js +1 -0
- package/package.json +7 -1
|
@@ -2,8 +2,11 @@ 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
|
+
export declare const SUNUCU_SURUMU = "0.8.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 SORMADAN_DEVAM = "Bu ad\u0131mda hocaya soru sormay\u0131n ve onay beklemeyin; do\u011Frudan sonrakiAdim'\u0131 uygulay\u0131n.";
|
|
9
|
+
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; pe\u015Fin onay varsa sorma, EKS\u0130K b\u0131rak, sonda listele. 3) Say\u0131, kaynak ve de\u011Ferlendirme y\u00FCzdesi uydurma. 4) Parola ve do\u011Frulama kodu isteme; Onaya G\u00F6nder'e hoca basar.";
|
|
7
10
|
export interface AcikSunucuSecenekleri {
|
|
8
11
|
simdi?: () => Date;
|
|
9
12
|
araclar?: readonly AcikArac[];
|
|
@@ -1,25 +1,34 @@
|
|
|
1
|
-
// Açık MCP sunucusu: resmî TypeScript SDK'nın McpServer'ı üzerine kurulur. Her araç salt
|
|
2
|
-
// deterministiktir
|
|
1
|
+
// Açık MCP sunucusu: resmî TypeScript SDK'nın McpServer'ı üzerine kurulur. Her araç salt okumadır; kaynak_dogrula
|
|
2
|
+
// dışındakiler deterministiktir (o, sabit açık kataloglara sorar). Araç açıklamaları ve yanıtlar Türkçedir. Gelen veride kişisel veri deseni görülürse
|
|
3
3
|
// çağrı hesap yapılmadan reddedilir. Her yanıt kaynak listesi ve "YÖKAK ile bağı yoktur" notu taşır.
|
|
4
4
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
5
|
import { ACIK_ARACLAR, AKREDIT_NOTU, AracHatasi, DEPO, } from "./araclar.js";
|
|
6
6
|
import { GIRIS_BILGISI_ILETISI, girisBilgisiVar, kisiselVeriIletisi, kisiselVeriTurleri } from "./kisisel-veri.js";
|
|
7
|
-
import { ACIK_ISTEMLER, istemSemasi } from "./promptlar.js";
|
|
7
|
+
import { ACIK_ISTEMLER, AKILLI_DOLDURMA_KURALI, istemSemasi } from "./promptlar.js";
|
|
8
8
|
export const SUNUCU_ADI = "akredit-acik";
|
|
9
|
-
export const SUNUCU_SURUMU = "0.
|
|
9
|
+
export const SUNUCU_SURUMU = "0.8.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
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
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 4: Önce sen tara, sonra öner. Ders listesi açılınca 'hangi ders?' diye sorma; obs_ders_listesi'ni çağır, 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). Eksik yoksa 'eksik görünmüyor' de ve kaliteyi artıracak somut öneriler ver.",
|
|
16
|
+
"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; peşin onay varsa ikisi de yoktur (KURAL 7).",
|
|
17
|
+
"KURAL 6: Her araç yanıtında hocayaSimdiSor var. false ise hocaya soru yazmayın, onay beklemeyin, doğrudan sonrakiAdim'ı uygulayın; yalnız true olduğunda ya da zorunlu teyit/kayıt onayında durun.",
|
|
18
|
+
"KURAL 7: Peşin onay (tam otonom kip). Hoca 'hepsini yap ve kaydet', 'sen hallet', 'sormadan kaydet' gibi bir sözle baştan onay verdiyse o sözü Bologna araçlarına pesinOnay olarak olduğu gibi ver ve ara durak yapma: tara, doldur, OBS'ye yaz, Kaydet'e bas, geri oku, obs_karsilastir ile doğrula, sonda TEK rapor ver (yazılanlar, EKSİK kalanlar, geri okuma sonucu). Sayfada olmayan değerlendirme yüzdesi ve kaynağı sorma da uydurma da: EKSİK bırak. Yalnız OBS giriş ekranı, CAPTCHA, dur ve ikinci fark için dur. Onaya Gönder yine hocadadır; itirazı olan alanı hoca OBS'de düzeltir ya da sana numarasını yazar.",
|
|
19
|
+
"Amaç: hocanın en az müdahalesiyle işi hızlı ama denetimli ve teyitli bitirmek. " + AKILLI_DOLDURMA_KURALI,
|
|
20
|
+
"Yalnız hocanın bilebileceği ve resmî taahhüt olan bilgiler (değerlendirme yöntem ve yüzdeleri, kullanılan kaynaklar) sayfadan okunur; yoksa hocaya TEK mesajda, numaralı sorulur, uydurulmaz; yüzdeye varsayılan konmaz. Uygulama/lab sorulmaz, T+U+L'den okunur. Amaç ve içerik sayfada yoksa önden sorulmaz; 'öneri' olarak yazılıp son özette teyide sunulur. Ders adından üretilen her şey 'öneri' etiketiyle gösterilir. Araç sonucu 'biçim denetiminden geçti; içerik teyidi: hoca' diye sunulur.",
|
|
15
21
|
"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'
|
|
17
|
-
"Tarayıcı aracın varsa OBS sayfasını okuyup formu doldurabilirsin
|
|
22
|
+
"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 (peşin onay varsa KURAL 7 geçerlidir: bu durak yoktur, özet sondaki raporda verilir). 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.",
|
|
23
|
+
"Tarayıcı aracın varsa OBS sayfasını okuyup formu doldurabilirsin. Yoksa kopyalamaya geçmeden önce Chrome eklentisini (Claude in Chrome) kurdurmayı öner: engel_coz(tarayici_araci_yok) adımlarını tek tek göster; otonom akış ancak eklentiyle çalışır. Hoca kurmak istemezse ya da istemcide eklenti yoksa OBS'ye yazma alan alan kopyalamaya düşer. Engel çıkarsa engel_coz ve kurulum_yardimi adımlarını sırayla göster.",
|
|
18
24
|
"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
25
|
"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
26
|
"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
27
|
"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
28
|
].join(" ");
|
|
29
|
+
/** Her araç yanıtında yinelenen kısa kural: uzun sohbette son okunan metin de aynı şeyi söyler. */
|
|
30
|
+
export const SORMADAN_DEVAM = "Bu adımda hocaya soru sormayın ve onay beklemeyin; doğrudan sonrakiAdim'ı uygulayın.";
|
|
31
|
+
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; peşin onay varsa sorma, EKSİK bırak, sonda listele. 3) Sayı, kaynak ve değerlendirme yüzdesi uydurma. 4) Parola ve doğrulama kodu isteme; Onaya Gönder'e hoca basar.";
|
|
23
32
|
const metinSonuc = (veri, isError = false) => ({
|
|
24
33
|
content: [{ type: "text", text: JSON.stringify(veri, null, 2) }],
|
|
25
34
|
structuredContent: veri,
|
|
@@ -68,6 +77,9 @@ function basari(a, s, atilan, ileti) {
|
|
|
68
77
|
veri: {
|
|
69
78
|
sonuc: s.sonuc,
|
|
70
79
|
sonrakiAdim: s.sonrakiAdim ?? a.sonrakiAdim,
|
|
80
|
+
hocayaSimdiSor: s.hocayaSimdiSor ?? a.hocayaSimdiSor ?? false,
|
|
81
|
+
...((s.hocayaSimdiSor ?? a.hocayaSimdiSor) ? {} : { simdiYap: SORMADAN_DEVAM }),
|
|
82
|
+
asistanKurali: ASISTAN_KURALI,
|
|
71
83
|
...(atilan.length
|
|
72
84
|
? { atilan: ileti ?? `Şu kısımlar okunmadan atıldı, hiçbir yere yazılmadı: ${atilan.join(", ")}.` }
|
|
73
85
|
: {}),
|
|
@@ -15,6 +15,8 @@ export interface AracSonucu {
|
|
|
15
15
|
kaynak: Kaynak[];
|
|
16
16
|
/** Asistana bir sonraki adım önerisi; verilmezse aracın varsayılanı kullanılır. */
|
|
17
17
|
sonrakiAdim?: string;
|
|
18
|
+
/** Bu adımda hocaya bir şey sorulmalı mı; verilmezse aracın varsayılanı (o da yoksa false). */
|
|
19
|
+
hocayaSimdiSor?: boolean;
|
|
18
20
|
}
|
|
19
21
|
export interface AracBaglami {
|
|
20
22
|
simdi: () => Date;
|
|
@@ -28,6 +30,8 @@ export interface AcikArac<S extends z.ZodObject = z.ZodObject> {
|
|
|
28
30
|
girdi: S;
|
|
29
31
|
/** Yanıtta dönen varsayılan "sonraki adım" önerisi. */
|
|
30
32
|
sonrakiAdim: string;
|
|
33
|
+
/** Yanıttaki hocayaSimdiSor bayrağının varsayılanı: true yalnız hocanın karar verdiği duraklarda. */
|
|
34
|
+
hocayaSimdiSor?: boolean;
|
|
31
35
|
/** Kişisel veri reddinde iletiye eklenecek, bu araca özgü ipucu. */
|
|
32
36
|
kisiselVeriIpucu?: string;
|
|
33
37
|
/**
|
|
@@ -56,4 +60,8 @@ export declare const arac: <S extends z.ZodObject>(a: AcikArac<S>) => AcikArac<S
|
|
|
56
60
|
/** Araç girdisi hatası: kullanıcıya gösterilecek Türkçe ileti. */
|
|
57
61
|
export declare class AracHatasi extends Error {
|
|
58
62
|
}
|
|
63
|
+
export declare function pesinOnayVar(metin: string | undefined): boolean;
|
|
64
|
+
export declare const PESIN_ONAY_ACIKLAMASI = "Hocan\u0131n pe\u015Fin onay\u0131, kendi s\u00F6zleriyle oldu\u011Fu gibi (\u00F6r. 'hepsini yap ve kaydet'). Varsa ve kay\u0131t s\u00F6z\u00FC i\u00E7eriyorsa ara durak olmadan yaz\u0131l\u0131p kaydedilir; sonda tek rapor verilir. Olumsuz s\u00F6z ('kaydetme', 'kaydetmeden \u00F6nce sor') onay say\u0131lmaz. Onaya G\u00F6nder hocada kal\u0131r.";
|
|
59
65
|
export declare const KOD_KAYNAGI: (yol: string, ad: string) => Kaynak;
|
|
66
|
+
/** Tarama raporunun numaralı seçenekleri: tek kaynak. obs_ders_listesi'nin raporBicimi ve istem metni bunu kullanır. */
|
|
67
|
+
export declare const TARAMA_SECENEKLERI: readonly ["1) Eksikleri en çok olandan başlayarak hepsini kapatalım (önerilen)", "2) Yalnız en eksik dersi tamamlayalım", "3) Kalite önerilerini de uygulayalım", "4) Dersi ben seçeyim"];
|
|
@@ -7,4 +7,36 @@ export const arac = (a) => a;
|
|
|
7
7
|
/** Araç girdisi hatası: kullanıcıya gösterilecek Türkçe ileti. */
|
|
8
8
|
export class AracHatasi extends Error {
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Peşin onay (tam otonom kip): hoca başta bir kez "hepsini yap ve kaydet" der; asistan ara durak olmadan tarar, doldurur,
|
|
12
|
+
* OBS'ye kaydeder, geri okuyup doğrular ve sonda tek rapor verir. Onay hocanın kendi sözleriyle verilir ve kayda
|
|
13
|
+
* geçer (ilke 3); metinde kayıt/yetki sözü yoksa onay sayılmaz. Onaya Gönder yine hocadadır; bilinmeyen resmî bilgi
|
|
14
|
+
* uydurulmaz, EKSİK bırakılıp raporda listelenir (ilke 2).
|
|
15
|
+
*/
|
|
16
|
+
// Kurucu kararı (12.11.2026): onay için kayıt ya da yetki sözü zorunludur. "hepsini tara", "otonom", "sormadan"
|
|
17
|
+
// tek başına iş tarifidir, OBS'ye kayıt izni değildir.
|
|
18
|
+
const PESIN_ONAY = /kaydet|sen hallet|tam yetki|onayl[ıi]yorum/iu;
|
|
19
|
+
/**
|
|
20
|
+
* Olumsuz söz onay değildir: "kaydetme", "kaydetmeden önce sor", "sen halletme", "OBS'ye yazma", "onaylamıyorum",
|
|
21
|
+
* "istemiyorum", "hayır", "değil". Ad-fiil ("kaydetmek") olumsuz sayılmaz; "kaydetmeni" gibi belirsiz biçimler
|
|
22
|
+
* bilerek olumsuz sayılır: kuşkuda onay yoktur, hocaya bir kez sorulur (ilke 3).
|
|
23
|
+
*/
|
|
24
|
+
const PESIN_ONAY_OLUMSUZ = /kaydetme(?!k)|halletme(?!k)|(?<!\p{L})(yazma|yapma)(?!k)|onaylam[ıi]yorum|istem[ie]yorum|(?<!\p{L})istemem|verm[ie]yorum|(?<!\p{L})(hay[ıi]r|de[ğg]il)(?!\p{L})/iu;
|
|
25
|
+
export function pesinOnayVar(metin) {
|
|
26
|
+
if (!metin || metin.trim().length < 3)
|
|
27
|
+
return false;
|
|
28
|
+
// Büyük harfle yazılan Türkçe metin (DEĞİL, HAYIR) için ayrıca Türkçe küçük harfle de bakılır.
|
|
29
|
+
const kucuk = metin.toLocaleLowerCase("tr");
|
|
30
|
+
if (PESIN_ONAY_OLUMSUZ.test(metin) || PESIN_ONAY_OLUMSUZ.test(kucuk))
|
|
31
|
+
return false;
|
|
32
|
+
return PESIN_ONAY.test(metin) || PESIN_ONAY.test(kucuk);
|
|
33
|
+
}
|
|
34
|
+
export const PESIN_ONAY_ACIKLAMASI = "Hocanın peşin onayı, kendi sözleriyle olduğu gibi (ör. 'hepsini yap ve kaydet'). Varsa ve kayıt sözü içeriyorsa ara durak olmadan yazılıp kaydedilir; sonda tek rapor verilir. Olumsuz söz ('kaydetme', 'kaydetmeden önce sor') onay sayılmaz. Onaya Gönder hocada kalır.";
|
|
10
35
|
export const KOD_KAYNAGI = (yol, ad) => ({ ad, adres: `${DEPO}/tree/main/${yol}` });
|
|
36
|
+
/** Tarama raporunun numaralı seçenekleri: tek kaynak. obs_ders_listesi'nin raporBicimi ve istem metni bunu kullanır. */
|
|
37
|
+
export const TARAMA_SECENEKLERI = [
|
|
38
|
+
"1) Eksikleri en çok olandan başlayarak hepsini kapatalım (önerilen)",
|
|
39
|
+
"2) Yalnız en eksik dersi tamamlayalım",
|
|
40
|
+
"3) Kalite önerilerini de uygulayalım",
|
|
41
|
+
"4) Dersi ben seçeyim",
|
|
42
|
+
];
|
|
@@ -34,15 +34,26 @@ const ISTEMCI_ADI = {
|
|
|
34
34
|
claude_code: "Claude Code",
|
|
35
35
|
};
|
|
36
36
|
const BAGLAYICI = {
|
|
37
|
-
// Anthropic yardım belgesi "Get started with custom connectors using remote MCP" (erişim 2026-11-05).
|
|
37
|
+
// Anthropic yardım belgesi "Get started with custom connectors using remote MCP" (erişim 2026-11-05). Türkçe
|
|
38
|
+
// arayüz adları Claude masaüstünün Türkçe ekranından (apps/web/public/gorsel/kurulum, 12.11.2026); İngilizce
|
|
39
|
+
// arayüz için karşılığı parantezde.
|
|
38
40
|
claude_web: [
|
|
39
41
|
["claude.ai adresine girin ve oturum açın.", "Sol tarafta sohbet listesi, ortada yazı kutusu."],
|
|
40
|
-
["
|
|
41
|
-
["+ Add düğmesine, ardından Add custom connector seçeneğine basın.", "Ad ve adres soran pencere."],
|
|
42
|
-
[`Ad olarak Akredit, adres olarak ${MCP_ADRESI} yazın ve Continue deyin.`, "Kimlik doğrulama seçenekleri."],
|
|
43
|
-
["Authentication altında No sign in seçin ve Add deyin.", "Listede Akredit görünür."],
|
|
42
|
+
["Ayarlar'da Bağdaştırıcılar (Connectors) bölümünü açın.", "Bağdaştırıcılar listesi."],
|
|
44
43
|
[
|
|
45
|
-
"
|
|
44
|
+
"Sağ üstte + Ekle (Add), ardından Özel bağdaştırıcı ekle (Add custom connector) seçin.",
|
|
45
|
+
"Ad ve adres soran pencere.",
|
|
46
|
+
],
|
|
47
|
+
[
|
|
48
|
+
`Ad olarak Akredit, adres olarak ${MCP_ADRESI} yazın ve Devam et (Continue) deyin.`,
|
|
49
|
+
"Kimlik doğrulama seçenekleri.",
|
|
50
|
+
],
|
|
51
|
+
[
|
|
52
|
+
"Oturum açma olmadan (No sign in) seçeneğini bırakın ve Ekle (Add) deyin. 'Sunucu URL'sine sahip herkes kullanabilir' uyarısı normaldir.",
|
|
53
|
+
"Listede Akredit görünür.",
|
|
54
|
+
],
|
|
55
|
+
[
|
|
56
|
+
"Ücretsiz planda tek özel bağdaştırıcı eklenebilir. Team ve Enterprise planlarında bağdaştırıcıyı kuruluş sahibi ekler; siz Bağdaştırıcılar listesinde Akredit'i bulup Bağlan (Connect) dersiniz.",
|
|
46
57
|
undefined,
|
|
47
58
|
],
|
|
48
59
|
[
|
|
@@ -57,15 +68,18 @@ const BAGLAYICI = {
|
|
|
57
68
|
],
|
|
58
69
|
claude_masaustu: [
|
|
59
70
|
["Claude masaüstü uygulamasını açın ve oturum açın.", "claude.ai ile aynı görünüm."],
|
|
60
|
-
["Customize (Özelleştir), ardından Connectors (Bağlayıcılar) bölümünü açın.", "Bağlayıcı listesi."],
|
|
61
71
|
[
|
|
62
|
-
|
|
72
|
+
"Sol alttaki çark simgesinden Ayarlar'ı açın, soldan Bağdaştırıcılar'ı (Connectors) seçin.",
|
|
73
|
+
"Bağdaştırıcılar listesi.",
|
|
74
|
+
],
|
|
75
|
+
[
|
|
76
|
+
`+ Ekle, Özel bağdaştırıcı ekle (Add custom connector) ile ad Akredit, adres ${MCP_ADRESI} yazın; Devam et, sonra Oturum açma olmadan (No sign in) ile Ekle deyin.`,
|
|
63
77
|
"Listede Akredit görünür.",
|
|
64
78
|
],
|
|
65
79
|
["Yeni sohbette akredit yazın. Menü gelmezse Akredit araçlarıyla Bologna paketimi denetle yazın.", "Odak menüsü."],
|
|
66
80
|
],
|
|
67
81
|
claude_chrome: [
|
|
68
|
-
["Önce Claude'a Akredit
|
|
82
|
+
["Önce Claude'a Akredit bağdaştırıcısını ekleyin (Claude web adımları).", "Sohbette Akredit açık."],
|
|
69
83
|
[
|
|
70
84
|
"Chrome tarayıcısını açın. Chrome Web Mağazası'nda Claude eklentisini arayın (Claude in Chrome).",
|
|
71
85
|
"Eklentinin sayfası.",
|
|
@@ -156,8 +170,8 @@ const TARAYICI = {
|
|
|
156
170
|
"OBS ana sayfası.",
|
|
157
171
|
],
|
|
158
172
|
[
|
|
159
|
-
"Asistana 'girdim' yazın. Asistan ders listesini ve Bologna sayfasını
|
|
160
|
-
"
|
|
173
|
+
"Asistana 'girdim' yazın. Asistan ders listesini okur ve bütün derslerinizin Bologna sayfasını tarar.",
|
|
174
|
+
"Eksikler ve öneriler sohbette tek listede görünür.",
|
|
161
175
|
],
|
|
162
176
|
],
|
|
163
177
|
claude_chrome: [
|
|
@@ -171,7 +185,10 @@ const TARAYICI = {
|
|
|
171
185
|
"Asistan sayfayı okumak için izin isteyebilir; onaylayın.",
|
|
172
186
|
true,
|
|
173
187
|
],
|
|
174
|
-
[
|
|
188
|
+
[
|
|
189
|
+
"Asistan ders listesini okur ve bütün derslerinizi tarar; hangi dersle başlanacağını numarayla seçersiniz.",
|
|
190
|
+
"Eksiklerin ve önerilerin tek listesi.",
|
|
191
|
+
],
|
|
175
192
|
[
|
|
176
193
|
"Asistan formu doldurursa her alanı gözle denetleyin. Kaydet'e siz basarsınız; isterseniz açık izninizle asistan basar. Onaya Gönder düğmesine siz basarsınız.",
|
|
177
194
|
"OBS'nin kayıt iletisi.",
|
|
@@ -336,6 +353,8 @@ export const kurulumYardimiAraci = arac({
|
|
|
336
353
|
ad: "kurulum_yardimi",
|
|
337
354
|
baslik: "Kurulum yardımı",
|
|
338
355
|
aciklama: "Akredit bağlayıcısını eklemek ve OBS'ye tarayıcıyla girmek için istemciye göre adım adım rehber verir: Claude web ve masaüstü, Claude in Chrome, ChatGPT, Cursor, VS Code, Claude Code. Her adımda ekranda ne görüleceğini söyler.",
|
|
356
|
+
// Adımlar hocayla tek tek yürür; her adımda hocanın "oldu" demesi beklenir.
|
|
357
|
+
hocayaSimdiSor: true,
|
|
339
358
|
sonrakiAdim: "Adımları hocaya tek tek gösterin: bir adım verin, 'oldu' demesini bekleyin, sonra sıradakine geçin. 'değişebilir' işaretli menü adını 'sizde biraz farklı olabilir' diye söyleyin. Giriş kuralını hocaya bir kez açıkça söyleyin.",
|
|
340
359
|
girdi: z.object({
|
|
341
360
|
istemci: z.enum(ISTEMCILER).describe("Hocanın kullandığı asistan"),
|
|
@@ -355,6 +374,14 @@ export const kurulumYardimiAraci = arac({
|
|
|
355
374
|
kaynak: [KOD_KAYNAGI("apps/acik-mcp/src/yardim.ts", "Akredit kurulum rehberi")],
|
|
356
375
|
}),
|
|
357
376
|
});
|
|
377
|
+
/** Asistanın hocaya sormadan önce kendisinin deneyeceği toparlama; yalnız giriş, CAPTCHA ve kurulum hocadadır. */
|
|
378
|
+
const KENDI_TOPARLAMA = {
|
|
379
|
+
cerceve: "Hocaya 'yeni sekmede açın' demeden önce: sayfadaki iframe'in src adresini okuyup o adrese kendiniz gidin ve sayfayı yeniden okuyun. Giriş ekranına düşerseniz adımlara geçin.",
|
|
380
|
+
sayfa_okunamiyor: "Hocaya söylemeden önce: sayfadaki sekmeleri (Ders Bilgileri, Öğrenme Çıktıları, Ders Akışı, Katkı) sırayla açıp metinlerini birleştirin ve bologna_ayristir'ı yeniden çağırın. Hâlâ temel alanlar okunamıyorsa adımlara geçin.",
|
|
381
|
+
kaydet_basilamiyor: "Önce kendiniz: sayfayı aşağı kaydırıp sekmenin kendi Kaydet düğmesini arayın, açık uyarı penceresi varsa okuyun. Hata iletisi bir alanı gösteriyorsa onu düzeltin (onaylanan içerik değişmeden). Olmazsa adımlara geçin.",
|
|
382
|
+
oturum_dustu: "Taslağı kaybetmeyin: hemen bologna_kopya_metni ile yedek metni alın. Hocaya tek mesajda 'Oturum düştü; OBS sekmesinde yeniden girip girdim yazın, kaldığım yerden sürdürürüm' deyin ve aynı mesajda kopya metnini verin.",
|
|
383
|
+
site_acilmiyor: "Önce kendiniz: adresi http/https ve www'lü/www'süz deneyin, kurumun OBS sayfasını web aramasıyla bulun. Olmazsa adımlara geçin.",
|
|
384
|
+
};
|
|
358
385
|
export const engelCozAraci = arac({
|
|
359
386
|
ad: "engel_coz",
|
|
360
387
|
baslik: "Engel çöz",
|
|
@@ -370,12 +397,19 @@ export const engelCozAraci = arac({
|
|
|
370
397
|
return {
|
|
371
398
|
sonuc: {
|
|
372
399
|
engel: e.ad,
|
|
400
|
+
...(KENDI_TOPARLAMA[engel] ? { asistanOnceKendisiDener: KENDI_TOPARLAMA[engel] } : {}),
|
|
373
401
|
girisKurali: GIRIS_KURALI_HOCAYA,
|
|
374
402
|
adimlar: numarala([...ozel, ...e.adimlar]),
|
|
375
403
|
...(e.yedek ? { yedekYol: numarala(KOPYALA_YAPISTIR) } : {}),
|
|
376
404
|
obsyeYazmaYedegi: "Tarayıcı aracı yoksa asistan bologna_kopya_metni ile alan alan kopyalanacak metni verir; siz OBS'de ilgili kutuya yapıştırıp Kaydet'e basarsınız.",
|
|
377
405
|
},
|
|
378
406
|
kaynak: [KOD_KAYNAGI("apps/acik-mcp/src/yardim.ts", "Akredit engel çözme rehberi")],
|
|
407
|
+
...(KENDI_TOPARLAMA[engel] && engel !== "oturum_dustu"
|
|
408
|
+
? {
|
|
409
|
+
hocayaSimdiSor: false,
|
|
410
|
+
sonrakiAdim: "Önce asistanOnceKendisiDener'i hocaya sormadan uygulayın. Çözülmezse adımları hocaya tek tek gösterin. Parola, doğrulama kodu ya da çerez istemeyin.",
|
|
411
|
+
}
|
|
412
|
+
: { hocayaSimdiSor: true }),
|
|
379
413
|
};
|
|
380
414
|
},
|
|
381
415
|
});
|
|
@@ -3,14 +3,16 @@
|
|
|
3
3
|
const VARLIKLAR = { nbsp: " ", amp: "&", lt: "<", gt: ">", quot: '"', apos: "'" };
|
|
4
4
|
const ETIKET = /<(?:[^>"']|"[^"]*"|'[^']*')*>/g;
|
|
5
5
|
const BETIK = /<(script|style)\b(?:[^>"']|"[^"]*"|'[^']*')*>[\s\S]*?<\/\1>/gi;
|
|
6
|
+
/** Sayısal karakter başvurusu; geçersiz kod noktası (ör. `�`) hata atmaz, olduğu gibi kalır. */
|
|
7
|
+
const kodNoktasi = (n, ham) => Number.isInteger(n) && n >= 0 && n <= 0x10ffff ? String.fromCodePoint(n) : ham;
|
|
6
8
|
/** HTML parçasını düz metne çevirir. */
|
|
7
9
|
export function metin(html) {
|
|
8
10
|
return html
|
|
9
11
|
.replace(BETIK, "")
|
|
10
12
|
.replace(/<br\s*\/?>/gi, " ")
|
|
11
13
|
.replace(ETIKET, " ")
|
|
12
|
-
.replace(/&#(\d+);/g, (
|
|
13
|
-
.replace(/&#x([0-9a-f]+);/gi, (
|
|
14
|
+
.replace(/&#(\d+);/g, (m, n) => kodNoktasi(Number(n), m))
|
|
15
|
+
.replace(/&#x([0-9a-f]+);/gi, (m, n) => kodNoktasi(Number.parseInt(n, 16), m))
|
|
14
16
|
.replace(/&([a-z]+);/gi, (m, a) => VARLIKLAR[a.toLowerCase()] ?? m)
|
|
15
17
|
.replace(/\s+/g, " ")
|
|
16
18
|
.trim();
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// Bologna ders sayfası taslağı denetimi (
|
|
1
|
+
// Bologna ders sayfası taslağı denetimi (K2-K10, K12 ve diğer kurallar). K1 (ders adıyla tutarlılık, başka
|
|
2
|
+
// dersten kopya) ve K11 (başka dersin yöntem metniyle aynılık) tek taslaktan denetlenemez; burada yoktur.
|
|
2
3
|
// apps/cli/lib/bologna-taslak.mjs `taslakDenetle` işlevinin saf, tipli taşıması. Mesajlar aynen korunur:
|
|
3
4
|
// CLI'deki "K8: metin" dizesi burada { kural: "K8", aciklama: "metin" } olur.
|
|
4
5
|
//
|
|
@@ -22,6 +23,11 @@ const kelime = (s) => String(s ?? "")
|
|
|
22
23
|
const bos = (s) => /^\s*(-|\.|yok|)\s*$/i.test(String(s ?? ""));
|
|
23
24
|
// ASCII'ye düşürülmüş Türkçe kelimeler (talimat bölüm 6). CLI ile aynı ifade.
|
|
24
25
|
const ASCII_TURKCE = /\b(icin|haftalik|ogrenme|ogrenci|ciktilar[ıi]?|ciktisi|bilisim|kaynag[ıi]|devam[ıi]|uygulamali|notlar[ıi]n[ıi]|incelenmesi|gelistirme|yazilim|programlamanin|tasarim[ıi]?|olusturma|degerlendirme|sinav[ıi]?|calisma|donem|guvenlik|baglant[ıi])\b/i;
|
|
26
|
+
// "guncel" set: aynı kelime listesi, Türkçe harfleri de kelime harfi sayan sınırlarla. CLI ifadesindeki `\b`
|
|
27
|
+
// ASCII dışı harfi kelime sınırı sayar; bu yüzden doğru yazılmış "devamını", "notlarının" kelimelerinin içinde
|
|
28
|
+
// "devamı", "notlarını" eşleşir ve hoca yanlış yere hata alır. Burada "ı" ile yazılan doğru biçimler ve zaten
|
|
29
|
+
// doğru yazılmış olan "incelenmesi" aranmaz.
|
|
30
|
+
const ASCII_TURKCE_GUNCEL = /(?<![\p{L}\p{N}_])(icin|haftalik|ogrenme|ogrenci|ciktilar[ıi]?|ciktisi|bilisim|kaynag[ıi]|devami|uygulamali|notlarini|gelistirme|yazilim|programlamanin|tasarim[ıi]?|olusturma|degerlendirme|sinav[ıi]?|calisma|donem|guvenlik|baglant[ıi])(?![\p{L}\p{N}_])/giu;
|
|
25
31
|
// Ölçülemeyen çıktı kalıpları (K4). "gösterebilir", "açıklayabilir" geçerlidir.
|
|
26
32
|
const OLCULEMEZ = /(bilgi sahibi olur|hakkında bilgi|fikir sahibi olur|(^|\s)(öğrenir|kavrar|anlar|bilir))\.?\s*$/i;
|
|
27
33
|
const ZAYIF = /farkındalık/i;
|
|
@@ -213,7 +219,7 @@ export function taslakDenetle(t, secenek = {}) {
|
|
|
213
219
|
...cik.map((c) => c.tr),
|
|
214
220
|
...haftalar.flatMap((h) => [h.konu?.tr, h.onHazirlik, h.dokuman]),
|
|
215
221
|
].filter(Boolean);
|
|
216
|
-
const tumu = new RegExp(ASCII_TURKCE, "gi");
|
|
222
|
+
const tumu = guncel ? ASCII_TURKCE_GUNCEL : new RegExp(ASCII_TURKCE, "gi");
|
|
217
223
|
const ascii = [...new Set(trMetinler.flatMap((m) => [...String(m).matchAll(tumu)].map((x) => x[0])))];
|
|
218
224
|
if (ascii.length)
|
|
219
225
|
hata("Türkçe", `Türkçe karakteri düşürülmüş kelimeler: ${ascii.slice(0, 10).join(", ")}.`);
|
|
@@ -50,8 +50,8 @@ export declare function sureliOnayUygunMu(s: KatmanSonucu): boolean;
|
|
|
50
50
|
/** Toplu onay yalnız katman 2 dışındaki önerilerde olur. */
|
|
51
51
|
export declare function topluOnayaUygunMu(s: KatmanSonucu): boolean;
|
|
52
52
|
/**
|
|
53
|
-
* Katman 2 bir kararın kabul edilebilirliği: politika ya da süre dayanağı
|
|
54
|
-
* kişi
|
|
53
|
+
* Katman 2 bir kararın kabul edilebilirliği: politika ya da süre dayanağı ve toplu onay reddedilir.
|
|
54
|
+
* Her katmanda kararı veren kişi yazılmalıdır. Kartta geçen süre burada denetlenmez.
|
|
55
55
|
*/
|
|
56
56
|
export declare function zorunluKararDenetle(s: KatmanSonucu, karar: {
|
|
57
57
|
dayanak: "dogrudan" | "politika" | "sure";
|
|
@@ -59,8 +59,8 @@ export function topluOnayaUygunMu(s) {
|
|
|
59
59
|
return !s.devredilemez;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
|
-
* Katman 2 bir kararın kabul edilebilirliği: politika ya da süre dayanağı
|
|
63
|
-
* kişi
|
|
62
|
+
* Katman 2 bir kararın kabul edilebilirliği: politika ya da süre dayanağı ve toplu onay reddedilir.
|
|
63
|
+
* Her katmanda kararı veren kişi yazılmalıdır. Kartta geçen süre burada denetlenmez.
|
|
64
64
|
*/
|
|
65
65
|
export function zorunluKararDenetle(s, karar) {
|
|
66
66
|
const hatalar = [];
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
/** Türkçe kurallarıyla küçük harfe çevirir: "İ" → "i", "I" → "ı". */
|
|
2
2
|
export declare function kucukHarf(metin: string): string;
|
|
3
|
-
/** Türkçe kurallarıyla büyük harfe çevirir: "i" → "İ", "ı" → "I". */
|
|
4
|
-
export declare function buyukHarf(metin: string): string;
|
|
5
3
|
/**
|
|
6
4
|
* Karşılaştırma için normalleştirir: Unicode NFC, Türkçe küçük harf, tipografik tırnak ve tireler,
|
|
7
5
|
* yumuşak tire, satır sonunda bölünmüş kelimeler ve boşluklar. Anlamı değiştirmez, harf düşürmez.
|
|
@@ -9,10 +9,6 @@ const SATIR_SONU_BOLME = /(\p{Ll})-\s*\n\s*(\p{Ll})/gu;
|
|
|
9
9
|
export function kucukHarf(metin) {
|
|
10
10
|
return metin.toLocaleLowerCase("tr-TR");
|
|
11
11
|
}
|
|
12
|
-
/** Türkçe kurallarıyla büyük harfe çevirir: "i" → "İ", "ı" → "I". */
|
|
13
|
-
export function buyukHarf(metin) {
|
|
14
|
-
return metin.toLocaleUpperCase("tr-TR");
|
|
15
|
-
}
|
|
16
12
|
/**
|
|
17
13
|
* Karşılaştırma için normalleştirir: Unicode NFC, Türkçe küçük harf, tipografik tırnak ve tireler,
|
|
18
14
|
* yumuşak tire, satır sonunda bölünmüş kelimeler ve boşluklar. Anlamı değiştirmez, harf düşürmez.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Ölçme girdisinin tutarlılık denetimi (kurucu kararı 12.11.2026, review.md madde 2). dersiOlc bozuk girdiyi
|
|
2
|
+
// sessizce hesaplıyordu: tam puanı aşan puan %100'ün üstünde başarı, yinelenen satırda sonuncunun kazanması,
|
|
3
|
+
// bilinmeyen araç/soruya yazılan puanın atılıp öğrencinin 0 sayılması, aynı ÇK'nın PÇ'ye iki kez girmesi.
|
|
4
|
+
// Bu işlev hesaptan önce çağrılır; sorun varsa hesap yapılmaz, hocaya ne olduğunu ve ne yapılacağını söyler.
|
|
5
|
+
// Saf: IO yok. dersiOlc'nin kendisi değişmez (HESAP_SURUMU aynı kalır).
|
|
6
|
+
const EN_COK = 10;
|
|
7
|
+
/** Hesabı bozacak girdi sorunları; boş dizi ise girdi tutarlıdır. İletiler Türkçe ve kullanıcıya gösterilebilir. */
|
|
8
|
+
export function olcmeGirdiSorunlari(v) {
|
|
9
|
+
const sorunlar = [];
|
|
10
|
+
const ekle = (s) => sorunlar.push(s);
|
|
11
|
+
const ckSay = new Map();
|
|
12
|
+
for (const c of v.ciktilar)
|
|
13
|
+
ckSay.set(c.kod, (ckSay.get(c.kod) ?? 0) + 1);
|
|
14
|
+
for (const [kod, n] of ckSay)
|
|
15
|
+
if (n > 1)
|
|
16
|
+
ekle(`Ders çıktısı ${kod} ${n} kez yazılmış. Her çıktıyı bir kez yazın.`);
|
|
17
|
+
const araclar = new Map();
|
|
18
|
+
for (const a of v.araclar) {
|
|
19
|
+
if (araclar.has(a.id))
|
|
20
|
+
ekle(`Ölçme aracı ${a.id} birden çok kez yazılmış. Her aracı bir kez yazın.`);
|
|
21
|
+
const sorular = new Map();
|
|
22
|
+
for (const q of a.sorular) {
|
|
23
|
+
if (sorular.has(q.no))
|
|
24
|
+
ekle(`${a.id} içinde ${q.no}. soru birden çok kez yazılmış.`);
|
|
25
|
+
sorular.set(q.no, q.tamPuan);
|
|
26
|
+
for (const e of q.eslemeler)
|
|
27
|
+
if (!ckSay.has(e.ciktiKod))
|
|
28
|
+
ekle(`${a.id} ${q.no}. soru, listede olmayan ${e.ciktiKod} çıktısına eşlenmiş. Çıktıyı ekleyin ya da eşlemeyi düzeltin.`);
|
|
29
|
+
}
|
|
30
|
+
araclar.set(a.id, sorular);
|
|
31
|
+
}
|
|
32
|
+
const gorulen = new Set();
|
|
33
|
+
for (const p of v.puanlar) {
|
|
34
|
+
const sorular = araclar.get(p.aracId);
|
|
35
|
+
if (!sorular) {
|
|
36
|
+
ekle(`${p.ogrenci} için tanımsız ${p.aracId} aracına puan yazılmış. Aracı ekleyin ya da satırı silin.`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const tam = sorular.get(p.soruNo);
|
|
40
|
+
// Sorusuz araçta (toplam puan) soru numarası denetlenmez.
|
|
41
|
+
if (sorular.size > 0 && tam === undefined) {
|
|
42
|
+
ekle(`${p.ogrenci} için ${p.aracId} aracında olmayan ${p.soruNo}. soruya puan yazılmış.`);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const anahtar = `${p.ogrenci}\u0000${p.aracId}\u0000${p.soruNo}`;
|
|
46
|
+
if (gorulen.has(anahtar))
|
|
47
|
+
ekle(`${p.ogrenci} için ${p.aracId} ${p.soruNo}. soru puanı birden çok kez yazılmış.`);
|
|
48
|
+
gorulen.add(anahtar);
|
|
49
|
+
if (p.puan !== null && tam !== undefined && p.puan > tam)
|
|
50
|
+
ekle(`${p.ogrenci} için ${p.aracId} ${p.soruNo}. soru puanı (${p.puan}) tam puanı (${tam}) aşıyor.`);
|
|
51
|
+
}
|
|
52
|
+
return sorunlar.length > EN_COK
|
|
53
|
+
? [...sorunlar.slice(0, EN_COK), `ve ${sorunlar.length - EN_COK} sorun daha.`]
|
|
54
|
+
: sorunlar;
|
|
55
|
+
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Kapsam ve kabul ölçütleri: plan/ip/IP-06-olcme-motoru.md · Yöntem: docs/olcme-yontemi.md
|
|
3
3
|
export const PAKET = "./index.js";
|
|
4
4
|
export { dersiOlc, ORNEK_HARF_TABLOSU } from "./ders.js";
|
|
5
|
+
export { olcmeGirdiSorunlari } from "./girdi.js";
|
|
5
6
|
export * from "./istatistik.js";
|
|
6
7
|
export * from "./kok-neden.js";
|
|
7
8
|
export * from "./program.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akredit/acik-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.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.",
|
|
@@ -13,6 +13,12 @@
|
|
|
13
13
|
"akts"
|
|
14
14
|
],
|
|
15
15
|
"homepage": "https://akredit.org/mcp-kullan",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/tialkan/akredit.git",
|
|
19
|
+
"directory": "apps/acik-mcp"
|
|
20
|
+
},
|
|
21
|
+
"bugs": "https://github.com/tialkan/akredit/issues",
|
|
16
22
|
"engines": {
|
|
17
23
|
"node": ">=22.18"
|
|
18
24
|
},
|