@akredit/acik-mcp 0.6.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +41 -37
  2. package/dist/apps/acik-mcp/src/araclar.js +7 -2
  3. package/dist/apps/acik-mcp/src/bologna.d.ts +12 -0
  4. package/dist/apps/acik-mcp/src/bologna.js +580 -249
  5. package/dist/apps/acik-mcp/src/genel-ayristir.js +2 -2
  6. package/dist/apps/acik-mcp/src/http.js +2 -1
  7. package/dist/apps/acik-mcp/src/kaynak-dogrula.js +1 -1
  8. package/dist/apps/acik-mcp/src/kisisel-veri.d.ts +4 -3
  9. package/dist/apps/acik-mcp/src/kisisel-veri.js +5 -0
  10. package/dist/apps/acik-mcp/src/not-tablosu.d.ts +4 -1
  11. package/dist/apps/acik-mcp/src/not-tablosu.js +10 -4
  12. package/dist/apps/acik-mcp/src/proliz-metin.d.ts +60 -0
  13. package/dist/apps/acik-mcp/src/proliz-metin.js +271 -0
  14. package/dist/apps/acik-mcp/src/promptlar.d.ts +6 -3
  15. package/dist/apps/acik-mcp/src/promptlar.js +97 -48
  16. package/dist/apps/acik-mcp/src/sunucu.d.ts +3 -2
  17. package/dist/apps/acik-mcp/src/sunucu.js +16 -11
  18. package/dist/apps/acik-mcp/src/temel.d.ts +8 -0
  19. package/dist/apps/acik-mcp/src/temel.js +32 -0
  20. package/dist/apps/acik-mcp/src/yardim.js +46 -12
  21. package/dist/packages/baglayicilar/src/bologna-proliz/ayristir.js +4 -2
  22. package/dist/packages/cekirdek/src/bologna/taslak.js +8 -2
  23. package/dist/packages/cekirdek/src/karar/katman.d.ts +2 -2
  24. package/dist/packages/cekirdek/src/karar/katman.js +2 -2
  25. package/dist/packages/cekirdek/src/turkce.d.ts +0 -2
  26. package/dist/packages/cekirdek/src/turkce.js +0 -4
  27. package/dist/packages/olcme/src/girdi.d.ts +3 -0
  28. package/dist/packages/olcme/src/girdi.js +55 -0
  29. package/dist/packages/olcme/src/index.d.ts +1 -0
  30. package/dist/packages/olcme/src/index.js +1 -0
  31. package/package.json +9 -3
@@ -1,4 +1,5 @@
1
- // Bologna ders sayfası taslağı denetimi (K1-K12 ve diğer kurallar).
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ğı reddedilir, kararı veren
54
- * kişi ve kartta geçen süre bulunmalıdır.
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ğı reddedilir, kararı veren
63
- * kişi ve kartta geçen süre bulunmalıdır.
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,3 @@
1
+ import type { DersOlcmeVerisi } from "../../cekirdek/src/index.js";
2
+ /** Hesabı bozacak girdi sorunları; boş dizi ise girdi tutarlıdır. İletiler Türkçe ve kullanıcıya gösterilebilir. */
3
+ export declare function olcmeGirdiSorunlari(v: DersOlcmeVerisi): string[];
@@ -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
+ }
@@ -1,5 +1,6 @@
1
1
  export declare const PAKET = "./index.js";
2
2
  export { dersiOlc, ORNEK_HARF_TABLOSU } from "./ders.ts";
3
+ export { olcmeGirdiSorunlari } from "./girdi.ts";
3
4
  export * from "./istatistik.ts";
4
5
  export * from "./kok-neden.ts";
5
6
  export * from "./program.ts";
@@ -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.6.0",
3
+ "version": "0.8.1",
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
  },
@@ -37,9 +43,9 @@
37
43
  "devDependencies": {
38
44
  "@akredit/baglayicilar": "0.1.0",
39
45
  "@akredit/cekirdek": "0.1.0",
46
+ "@akredit/cerceveler": "0.1.0",
40
47
  "@akredit/olcme": "0.1.0",
41
- "@akredit/yz": "0.1.0",
42
- "@akredit/cerceveler": "0.1.0"
48
+ "@akredit/yz": "0.1.0"
43
49
  },
44
50
  "publishConfig": {
45
51
  "access": "public"