create-devoplus-one-app 0.0.0-stage → 0.1.0-next.158

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 (122) hide show
  1. package/README.md +62 -2
  2. package/dist/cli.mjs +17 -0
  3. package/package.json +35 -3
  4. package/templates/0001_init.sql.tpl +10 -0
  5. package/templates/AGENTS.md.tpl +286 -0
  6. package/templates/AGENT_GUIDE.md.tpl +36 -0
  7. package/templates/README.md.tpl +58 -0
  8. package/templates/_shared/AGENTS.writes.md.tpl +38 -0
  9. package/templates/_shared/README.tail.md.tpl +20 -0
  10. package/templates/_shared/files/src/app.test.ts.tpl +36 -0
  11. package/templates/_shared/files/src/index.ts.tpl +8 -0
  12. package/templates/_shared/files/src/lib/client.ts.tpl +213 -0
  13. package/templates/_shared/files/src/lib/files.ts.tpl +37 -0
  14. package/templates/_shared/files/src/lib/http.ts.tpl +101 -0
  15. package/templates/_shared/files/src/lib/mail.ts.tpl +26 -0
  16. package/templates/_shared/files/src/lib/model.ts.tpl +31 -0
  17. package/templates/_shared/files/src/lib/page.ts.tpl +71 -0
  18. package/templates/_shared/files/src/lib/record.ts.tpl +246 -0
  19. package/templates/_shared/files/src/lib/server.ts.tpl +132 -0
  20. package/templates/_shared/files/src/shell.test.ts.tpl +56 -0
  21. package/templates/agent.ts.tpl +23 -0
  22. package/templates/bakim-takvimi/AGENTS.template.md.tpl +40 -0
  23. package/templates/bakim-takvimi/README.md.tpl +45 -0
  24. package/templates/bakim-takvimi/files/AGENT_GUIDE.md.tpl +52 -0
  25. package/templates/bakim-takvimi/files/one.data.json +45 -0
  26. package/templates/bakim-takvimi/files/src/agent.ts.tpl +22 -0
  27. package/templates/bakim-takvimi/files/src/app.ts.tpl +259 -0
  28. package/templates/bakim-takvimi/files/src/jobs.ts.tpl +170 -0
  29. package/templates/bakim-takvimi/files/src/names.ts.tpl +5 -0
  30. package/templates/bakim-takvimi/files/src/queries.ts.tpl +71 -0
  31. package/templates/bakim-takvimi/files/src/schedule.test.ts.tpl +58 -0
  32. package/templates/bakim-takvimi/files/src/schedule.ts.tpl +106 -0
  33. package/templates/bakim-takvimi/files/src/shell.ts.tpl +299 -0
  34. package/templates/bakim-takvimi/manifest.json.tpl +64 -0
  35. package/templates/egitim-sertifika/AGENTS.template.md.tpl +41 -0
  36. package/templates/egitim-sertifika/README.md.tpl +46 -0
  37. package/templates/egitim-sertifika/files/AGENT_GUIDE.md.tpl +53 -0
  38. package/templates/egitim-sertifika/files/one.data.json +43 -0
  39. package/templates/egitim-sertifika/files/src/agent.ts.tpl +22 -0
  40. package/templates/egitim-sertifika/files/src/app.ts.tpl +312 -0
  41. package/templates/egitim-sertifika/files/src/certificate.test.ts.tpl +83 -0
  42. package/templates/egitim-sertifika/files/src/certificate.ts.tpl +163 -0
  43. package/templates/egitim-sertifika/files/src/jobs.ts.tpl +219 -0
  44. package/templates/egitim-sertifika/files/src/names.ts.tpl +5 -0
  45. package/templates/egitim-sertifika/files/src/queries.ts.tpl +115 -0
  46. package/templates/egitim-sertifika/files/src/shell.ts.tpl +345 -0
  47. package/templates/egitim-sertifika/manifest.json.tpl +57 -0
  48. package/templates/envanter/AGENTS.template.md.tpl +28 -0
  49. package/templates/envanter/README.md.tpl +40 -0
  50. package/templates/envanter/files/AGENT_GUIDE.md.tpl +47 -0
  51. package/templates/envanter/files/one.data.json +62 -0
  52. package/templates/envanter/files/src/agent.ts.tpl +20 -0
  53. package/templates/envanter/files/src/app.ts.tpl +204 -0
  54. package/templates/envanter/files/src/jobs.ts.tpl +30 -0
  55. package/templates/envanter/files/src/queries.ts.tpl +53 -0
  56. package/templates/envanter/files/src/shell.ts.tpl +265 -0
  57. package/templates/envanter/files/src/stock.test.ts.tpl +31 -0
  58. package/templates/envanter/files/src/stock.ts.tpl +33 -0
  59. package/templates/envanter/manifest.json.tpl +56 -0
  60. package/templates/hedef-takibi/AGENTS.template.md.tpl +37 -0
  61. package/templates/hedef-takibi/README.md.tpl +52 -0
  62. package/templates/hedef-takibi/files/AGENT_GUIDE.md.tpl +48 -0
  63. package/templates/hedef-takibi/files/one.data.json +76 -0
  64. package/templates/hedef-takibi/files/src/agent.ts.tpl +26 -0
  65. package/templates/hedef-takibi/files/src/app.ts.tpl +740 -0
  66. package/templates/hedef-takibi/files/src/progress.test.ts.tpl +53 -0
  67. package/templates/hedef-takibi/files/src/progress.ts.tpl +81 -0
  68. package/templates/hedef-takibi/files/src/queries.ts.tpl +83 -0
  69. package/templates/hedef-takibi/files/src/shell.ts.tpl +455 -0
  70. package/templates/hedef-takibi/manifest.json.tpl +38 -0
  71. package/templates/index.ts.tpl +262 -0
  72. package/templates/markdown.d.ts.tpl +6 -0
  73. package/templates/musteri-ziyaret/AGENTS.template.md.tpl +47 -0
  74. package/templates/musteri-ziyaret/README.md.tpl +48 -0
  75. package/templates/musteri-ziyaret/files/AGENT_GUIDE.md.tpl +44 -0
  76. package/templates/musteri-ziyaret/files/one.data.json +53 -0
  77. package/templates/musteri-ziyaret/files/src/agent.ts.tpl +21 -0
  78. package/templates/musteri-ziyaret/files/src/app.ts.tpl +340 -0
  79. package/templates/musteri-ziyaret/files/src/customers.ts.tpl +85 -0
  80. package/templates/musteri-ziyaret/files/src/queries.ts.tpl +67 -0
  81. package/templates/musteri-ziyaret/files/src/shell.ts.tpl +272 -0
  82. package/templates/musteri-ziyaret/files/src/visit.test.ts.tpl +65 -0
  83. package/templates/musteri-ziyaret/files/src/visit.ts.tpl +98 -0
  84. package/templates/musteri-ziyaret/manifest.json.tpl +37 -0
  85. package/templates/saha-denetimi/AGENTS.template.md.tpl +32 -0
  86. package/templates/saha-denetimi/README.md.tpl +44 -0
  87. package/templates/saha-denetimi/files/AGENT_GUIDE.md.tpl +55 -0
  88. package/templates/saha-denetimi/files/one.data.json +87 -0
  89. package/templates/saha-denetimi/files/src/agent.ts.tpl +41 -0
  90. package/templates/saha-denetimi/files/src/app.ts.tpl +444 -0
  91. package/templates/saha-denetimi/files/src/queries.ts.tpl +143 -0
  92. package/templates/saha-denetimi/files/src/score.test.ts.tpl +48 -0
  93. package/templates/saha-denetimi/files/src/score.ts.tpl +102 -0
  94. package/templates/saha-denetimi/files/src/shell.ts.tpl +585 -0
  95. package/templates/saha-denetimi/manifest.json.tpl +49 -0
  96. package/templates/shell.test.ts.tpl +30 -0
  97. package/templates/shell.ts.tpl +201 -0
  98. package/templates/uygunsuzluk-dof/AGENTS.template.md.tpl +40 -0
  99. package/templates/uygunsuzluk-dof/README.md.tpl +46 -0
  100. package/templates/uygunsuzluk-dof/files/AGENT_GUIDE.md.tpl +56 -0
  101. package/templates/uygunsuzluk-dof/files/one.data.json +99 -0
  102. package/templates/uygunsuzluk-dof/files/src/agent.ts.tpl +45 -0
  103. package/templates/uygunsuzluk-dof/files/src/app.ts.tpl +431 -0
  104. package/templates/uygunsuzluk-dof/files/src/capa.test.ts.tpl +53 -0
  105. package/templates/uygunsuzluk-dof/files/src/capa.ts.tpl +114 -0
  106. package/templates/uygunsuzluk-dof/files/src/jobs.ts.tpl +127 -0
  107. package/templates/uygunsuzluk-dof/files/src/queries.ts.tpl +102 -0
  108. package/templates/uygunsuzluk-dof/files/src/shell.ts.tpl +441 -0
  109. package/templates/uygunsuzluk-dof/manifest.json.tpl +56 -0
  110. package/templates/ziyaretci-kaydi/AGENTS.template.md.tpl +35 -0
  111. package/templates/ziyaretci-kaydi/README.md.tpl +46 -0
  112. package/templates/ziyaretci-kaydi/files/AGENT_GUIDE.md.tpl +39 -0
  113. package/templates/ziyaretci-kaydi/files/one.data.json +42 -0
  114. package/templates/ziyaretci-kaydi/files/src/agent.ts.tpl +13 -0
  115. package/templates/ziyaretci-kaydi/files/src/app.ts.tpl +293 -0
  116. package/templates/ziyaretci-kaydi/files/src/jobs.ts.tpl +49 -0
  117. package/templates/ziyaretci-kaydi/files/src/notice.ts.tpl +48 -0
  118. package/templates/ziyaretci-kaydi/files/src/queries.ts.tpl +45 -0
  119. package/templates/ziyaretci-kaydi/files/src/shell.ts.tpl +252 -0
  120. package/templates/ziyaretci-kaydi/files/src/visitor.test.ts.tpl +34 -0
  121. package/templates/ziyaretci-kaydi/files/src/visitor.ts.tpl +57 -0
  122. package/templates/ziyaretci-kaydi/manifest.json.tpl +38 -0
@@ -0,0 +1,56 @@
1
+ {
2
+ "scopes": ["orgschema.read", "mail.execute"],
3
+ "services": { "database": true, "files": false, "cache": false },
4
+ "menuIcon": "pi pi-box",
5
+ "navigation": [
6
+ { "path": "/", "label": { "tr": "Stok", "en": "Stock" } },
7
+ { "path": "/movements", "label": { "tr": "Hareketler", "en": "Movements" } },
8
+ { "path": "/items", "label": { "tr": "Kalemler", "en": "Items" } }
9
+ ],
10
+ "permissions": [
11
+ { "code": "{{permissionPrefix}}Manage", "name": { "tr": "Stok kalemlerini ve hareketlerini yönet", "en": "Manage stock items and movements" } }
12
+ ],
13
+ "agent": {
14
+ "summary": {
15
+ "tr": "Envanter uygulaması: stok kalemleri, eldeki miktarlar, konumları ve en az miktarın altına düşen kalemler.",
16
+ "en": "Inventory app: stock items, quantities on hand, their locations and items below the minimum quantity."
17
+ },
18
+ "tools": [
19
+ {
20
+ "name": "search-items",
21
+ "title": { "tr": "Stok kalemi ara", "en": "Search stock items" },
22
+ "description": {
23
+ "tr": "Stok kodunda, adında ya da konumunda aranan ifade geçen kalemleri eldeki miktar, birim ve azalmış mı bilgisiyle döndürür. Salt okunur.",
24
+ "en": "Returns items whose SKU, name or location contains the query, with quantity on hand, unit and whether it is low. Read-only."
25
+ },
26
+ "readOnly": true,
27
+ "permission": "{{permissionCode}}",
28
+ "input": {
29
+ "type": "object",
30
+ "properties": {
31
+ "query": { "type": "string", "minLength": 1, "maxLength": 80, "description": "Aranan ifade (stok kodu, ad ya da konum)" },
32
+ "limit": { "type": "integer", "minimum": 1, "maximum": 50, "description": "En çok kaç kalem (varsayılan 10)" }
33
+ },
34
+ "required": ["query"]
35
+ }
36
+ },
37
+ {
38
+ "name": "list-low-stock",
39
+ "title": { "tr": "Azalan stoku listele", "en": "List low stock" },
40
+ "description": {
41
+ "tr": "Eldeki miktarı en az miktarın altına düşmüş kalemleri ve son günlük stok kontrolünün sonucunu döndürür. Salt okunur.",
42
+ "en": "Returns items whose quantity on hand is below the minimum quantity and the result of the latest daily stock check. Read-only."
43
+ },
44
+ "readOnly": true,
45
+ "permission": "{{permissionCode}}",
46
+ "input": { "type": "object", "properties": {} }
47
+ }
48
+ ]
49
+ },
50
+ "jobs": {
51
+ "schedules": [
52
+ { "name": "daily-stock-check", "cron": "0 7 * * *", "timeZone": "Europe/Istanbul", "description": "En az miktarın altındaki kalemleri günün kontrol kaydına yazar" }
53
+ ],
54
+ "queues": []
55
+ }
56
+ }
@@ -0,0 +1,37 @@
1
+ ## Bu uygulamanın şablonu: hedef ve aksiyon takibi (`hedef-takibi`)
2
+
3
+ Uygulama `create-devoplus-one-app --template hedef-takibi` ile üretildi. Kullanıcının ihtiyacını bu şablona göre DEĞİŞTİRİN;
4
+ baştan yazmayın. Dosya haritası:
5
+
6
+ | Dosya | Ne |
7
+ |---|---|
8
+ | `one.data.json` | Veri modeli: `periods` (dönem) + `goals` (hedef) + `key_results` (ölçülebilir sonuç) + `check_ins` (değer geçmişi) + `actions` (aksiyon). Değişince `pnpm data:generate` |
9
+ | `src/app.ts` | Uçlar: dönem (kapatma/yeniden açma), hedef, ölçülebilir sonuç, değer güncellemesi, aksiyon, ekip ve dönem panosu, Excel |
10
+ | `src/progress.ts` | Saf kurallar: ilerleme (sınırlama, başlangıç = hedef durumu), ortalama, ağırlıklı ortalama, değer doğrulama, doğrudan bağlılar + `progress.test.ts` |
11
+ | `src/queries.ts` | Dönem ve dönem özeti sorguları (pano ve yapay zekâ aracı ortak) |
12
+ | `src/shell.ts` | Sayfa: Hedeflerim, Ekip panosu, Dönem panosu (grafik), Dönemler + hedef ayrıntısı |
13
+ | `src/agent.ts` · `AGENT_GUIDE.md` | Devoplus yapay zekâsının aracı (`period-summary`) ve rehberi |
14
+ | `src/lib/*` | Şablonların ortak parçaları — gerekmedikçe değiştirmeyin |
15
+
16
+ Değişmezler (bozmayın):
17
+
18
+ - **İlerleme YALNIZ sunucuda hesaplanır.** Hiçbir uç `progress` ya da `current_value` alanını istemciden ALMAZ (400).
19
+ Kural `progress.ts`'tedir; hedefin ilerlemesi veritabanında aynı kuralla (`GOAL_PROGRESS_SQL`: ortalama, bir ondalık)
20
+ yeniden hesaplanır — kuralı değiştirirseniz ikisini birlikte değiştirin.
21
+ - **Değer güncellemesi TEK toplu yazımdır** (`env.DB.batch([geçmiş, değer, hedef ilerlemesi])`): geçmiş satırı yalnız
22
+ değer hâlâ okunan değerse ve dönem açıksa eklenir, değer yalnız o satır eklendiyse değişir. İki ayrı yazıma ya da
23
+ "önce oku, sonra yaz"a çevirmeyin — geçmişi olmayan değer ya da birbirini ezen iki güncelleme doğardı.
24
+ - **Görünürlük sunucuda organizasyon şemasından türetilir** (`viewer` → `getMyOrgContext` + `getOrgUsersWithManagers`):
25
+ kişi kendi hedefini, yönetici doğrudan bağlılarının hedefini, `{{permissionPrefix}}Manage` hepsini görür. Görülemeyen
26
+ hedef **404**'tür (403 değil: var olduğu sızmaz). Hedeflerim listesinde sorumlu süzgeci sunucuda zorlanır. Kayıt
27
+ uçlarını (`goals`, `/internal/*`) görünürlük denetimi olmadan yönlendirmeyin.
28
+ - **Kişi kimlikleri:** sorumlu `owner_org_id` organizasyon şeması kimliğidir (`ctx.user.sub` DEĞİL).
29
+ - **Kapanan dönem salt okunurdur (409).** Dönem durumu yalnız `close` / `reopen` uçlarıyla değişir; dönem uçları `status`
30
+ alanını istemciden almaz. Hedefi olan dönem silinmez.
31
+ - **Dönemin açık olması yazımla AYNI ifadededir** — hedefin silinmemiş ve sorumlusunun yazana görünür olmasıyla birlikte
32
+ (`goalWritable`). Hedef, ölçülebilir sonuç ve aksiyon ekleme, düzenleme ve silme hazır kayıt ucuna iletilmez;
33
+ `lib/record.ts` ile doğrulanıp koşullu SQL ile yazılır (`… WHERE … AND <hedef yazılabilir>`). Hedefe kopyalanan dönem
34
+ kodu eklemede dönemin o anki koduyla karşılaştırılır; dönem tarihlerinin kuralı yazımdan sonraki satıra uygulanır. Dönem silme de
35
+ "dönemde hedef yok" koşulunu kendi ifadesinde ister. "Önce oku, sonra kayıt ucuna ilet"e çevirmeyin: arada kapanan ya da
36
+ silinen dönemde hedef yazılır, silinmiş döneme bağlı hedef panolardan kaybolurdu.
37
+ - Hedef açan, değer güncelleyen ya da dönem kapatan bir yapay zekâ aracı eklemeyin; araçlar salt okunurdur.
@@ -0,0 +1,52 @@
1
+ # {{nameTr}}
2
+
3
+ Ekiplerin dönemlik hedeflerini, her hedefin ölçülebilir sonuçlarını ve aksiyonlarını izleyen bir hedef takip
4
+ uygulaması. Devoplus Portal'ın içinde, Portal menüsünden açılır. Bu uygulama Devoplus One'ın **hedef ve aksiyon takibi**
5
+ şablonundan üretildi; ihtiyacınıza göre değiştirilecek bir başlangıç noktasıdır. Bir onay akışı değildir: hedefler
6
+ kimseye onaya gönderilmez.
7
+
8
+ ## Ne yapar
9
+
10
+ 1. **Dönemler:** hedef yöneticisi dönemleri tanımlar (ör. "2026-Ç4", başlangıç ve bitiş tarihiyle). Dönem kapatılınca
11
+ o dönemin hedefleri, ölçülebilir sonuçları ve aksiyonları artık değiştirilemez; yalnız görüntülenir.
12
+ 2. **Hedeflerim:** her çalışan kendisine hedef açabilir; yönetici doğrudan kendisine bağlı çalışanlara hedef verebilir.
13
+ Hedefin ekibi, sorumlunun Devoplus'taki departmanından kendiliğinden gelir. Liste Excel'e ya da CSV'ye aktarılabilir.
14
+ 3. **Ölçülebilir sonuçlar:** her hedefe "aylık yeni müşteri sayısı: 20'den 50'ye" gibi ölçütler eklenir. Güncel değer
15
+ girildikçe ilerleme hesaplanır ve kimin, ne zaman, hangi değeri hangi değere çevirdiği geçmişte kalır.
16
+ 4. **Aksiyonlar:** hedefe ulaşmak için yapılacak işler sorumlusu ve termini ile yazılır, tamamlanınca işaretlenir.
17
+ 5. **Ekip panosu:** yönetici, Devoplus organizasyon şemasında doğrudan kendisine bağlı çalışanların hedeflerini görür.
18
+ 6. **Dönem panosu:** dönemin ekip başına ilerlemesi grafikle gösterilir; dönemin hedef listesi Excel'e aktarılabilir.
19
+ 7. **Devoplus asistanı:** "Bu çeyrekte hedeflerin neresindeyiz?" gibi sorular Devoplus'un yapay zekâ asistanına
20
+ sorulduğunda cevap bu uygulamadan gelir (hedef yöneticileri için).
21
+
22
+ ## İlerleme nasıl hesaplanır
23
+
24
+ - Ölçülebilir sonuç: (güncel değer − başlangıç) ÷ (hedef − başlangıç). Hedef aşılırsa %100, başlangıcın gerisine
25
+ düşülürse %0 yazılır. Azalması istenen değerlerde (ör. şikâyeti 40'tan 10'a indirmek) aynı kural çalışır.
26
+ - Başlangıç ile hedef aynıysa (ör. "hata sayısını 0'da tut"): güncel değer hedefe eşitse %100, değilse %0.
27
+ - Hedef: ölçülebilir sonuçlarının ortalaması. Ekip ve dönem: hedeflerin ağırlığa göre ortalaması.
28
+ - İlerleme elle girilmez; uygulama hesaplar.
29
+
30
+ ## Kimler ne görür
31
+
32
+ | Kim | Ne yapabilir |
33
+ |---|---|
34
+ | Uygulamayı kullanma izni olan herkes ({{permissionCode}}) | Kendi hedeflerini açar, değer günceller, aksiyon yazar |
35
+ | Yönetici (organizasyon şemasında doğrudan bağlısı olan) | Ayrıca doğrudan bağlılarının hedeflerini görür ve düzenler |
36
+ | Hedef yöneticisi ({{permissionPrefix}}Manage) | Dönem tanımlar ve kapatır, bütün hedefleri görür ve düzenler |
37
+
38
+ İzinleri portal yöneticisi **Yetki Yönetimi** ekranından verir. Yöneticilik ayrı bir izin değildir; Devoplus'taki
39
+ organizasyon şemasından okunur.
40
+
41
+ ## Neleri değiştirebilirsiniz
42
+
43
+ Yapay zekâ aracınıza iş diliyle söylemeniz yeterlidir:
44
+
45
+ - "Yöneticiler alt kademelerin hedeflerini de görsün" — ekip yalnız doğrudan bağlılardan oluşuyor.
46
+ - "Hedefe öncelik (yüksek, orta, düşük) eklensin" — yeni alan.
47
+ - "Ölçülebilir sonuçların da ağırlığı olsun" — hesap kuralı değişir.
48
+ - "Geciken aksiyonlar ekranın üstünde görünsün" — yeni özet.
49
+
50
+ Bilinmesi gerekenler: ekip ve yönetici bilgisi Devoplus organizasyon şemasından okunur; bir çalışanın yöneticisi orada
51
+ tanımlı değilse yöneticisi onun hedeflerini göremez. Bir çalışanın departmanı sonradan değişirse eski hedefleri eski
52
+ ekipte kalır.
@@ -0,0 +1,48 @@
1
+ # {{nameTr}} — Devoplus yapay zekâsı için rehber
2
+
3
+ Bu dosyayı **Devoplus yapay zekâsı** okur (uygulama adresinde `/.well-known/one-agent.md`). Bir aracı eklerken,
4
+ değiştirirken ya da kaldırırken bu dosyayı AYNI değişiklikte güncelleyin; yayın kapısı dört başlığı ve her aracın adını
5
+ arar.
6
+
7
+ ## Uygulama ne yapar
8
+
9
+ {{nameTr}}, ekiplerin dönemlik hedeflerini (ör. "2026-Ç4"), her hedefin ölçülebilir sonuçlarını ve aksiyonlarını izleyen
10
+ bir hedef takip uygulamasıdır. Her ölçülebilir sonucun bir başlangıç, hedef ve güncel değeri vardır; ilerleme bu
11
+ değerlerden **uygulamanın sunucusunda** hesaplanır. Hedefin ilerlemesi ölçülebilir sonuçlarının ortalaması, ekibin ve
12
+ dönemin ilerlemesi hedeflerin ağırlıklı ortalamasıdır. Kişi kendi hedeflerini, yönetici doğrudan kendisine bağlı
13
+ çalışanların hedeflerini, hedef yöneticisi bütün hedefleri görür. Kapanan dönemin hedefleri değiştirilemez. Kullanıcı
14
+ "bu çeyrekte hedeflerin neresindeyiz", "hangi ekip geride", "en geride kalan hedefler hangileri" gibi şeyler sorduğunda
15
+ bu uygulamaya başvurun. Hedef açmak ya da değer güncellemek için araç yoktur.
16
+
17
+ ## Veri
18
+
19
+ - **Dönem** (`periods`): kod (tekil, ör. `2026-Ç4`), ad, başlangıç ve bitiş tarihi, durum (`open` açık · `closed`
20
+ kapandı).
21
+ - **Hedef** (`goals`): başlık, açıklama, sorumlu kişinin adı, ekip (sorumlunun organizasyon şemasındaki departmanı),
22
+ ağırlık (1-100), ilerleme (yüzde, 0-100).
23
+ - **Ölçülebilir sonuç** (`key_results`): ölçüt, birim, başlangıç, hedef ve güncel değer, ilerleme (yüzde). Hedef
24
+ aşılırsa %100, başlangıcın gerisine düşülürse %0 sayılır; başlangıç ile hedef aynıysa güncel değer hedefe eşitken
25
+ %100'dür.
26
+ - **Değer güncellemesi** (`check_ins`): kim, ne zaman, önceki değer, yeni değer, not.
27
+ - **Aksiyon** (`actions`): açıklama, sorumlu, termin, tamamlandı mı.
28
+
29
+ ## Araçlar
30
+
31
+ ### `period-summary` — dönem hedef özeti (salt okunur)
32
+
33
+ - **Ne zaman:** kullanıcı bir dönemin genel durumunu, ekiplerin ilerlemesini ya da geride kalan hedefleri sorduğunda.
34
+ Yalnız hedef yöneticisi iznine sahip kullanıcıya açıktır; izni olmayan kullanıcıya kendi hedefleri için uygulamanın
35
+ Hedeflerim sekmesini önerin.
36
+ - **Girdi:** `period` — dönem kodu (ör. `2026-Ç4`); verilmezse başlangıcı en yeni olan dönem.
37
+ - **Çıktı:** `{ "period": { "code", "name", "status", "start", "end" }, "overall": 62.5, "goalCount": 14,
38
+ "teams": [{ "team", "goals", "progress" }], "lowest": [{ "title", "owner", "team", "progress" }] }` — ilerlemeler
39
+ yüzdedir (bir ondalık); `lowest` en geride kalan en çok beş hedeftir. Dönem yoksa `period` `null`.
40
+ - **Dikkat:** sayıları kendiniz yeniden hesaplamayın; sunucunun verdiği değeri aktarın. Kapanmış dönemin
41
+ (`status: "closed"`) sayıları artık değişmez.
42
+
43
+ ## Örnek istekler
44
+
45
+ - "Bu çeyrekte hedeflerin neresindeyiz?" → `period-summary` → `overall` ve `teams`
46
+ - "2026-Ç3'te hangi ekip en geride kaldı?" → `period-summary` (`period: "2026-Ç3"`) → `teams` içinde en düşük `progress`
47
+ - "En geride kalan hedefler hangileri?" → `period-summary` → `lowest`
48
+ - "Satış hedefimin değerini 120 yap." → araç yok; kullanıcıyı uygulamanın Hedeflerim sekmesine yönlendirin.
@@ -0,0 +1,76 @@
1
+ {
2
+ "version": 1,
3
+ "entities": {
4
+ "periods": {
5
+ "title": { "tr": "Dönemler", "en": "Periods" },
6
+ "fields": {
7
+ "code": { "type": "text", "title": { "tr": "Dönem kodu", "en": "Period code" }, "required": true, "unique": true, "maxLength": 20 },
8
+ "name": { "type": "text", "title": { "tr": "Dönem adı", "en": "Period name" }, "required": true, "maxLength": 120 },
9
+ "start_date": { "type": "date", "title": { "tr": "Başlangıç", "en": "Start" }, "required": true },
10
+ "end_date": { "type": "date", "title": { "tr": "Bitiş", "en": "End" }, "required": true },
11
+ "status": {
12
+ "type": "choice",
13
+ "title": { "tr": "Durum", "en": "Status" },
14
+ "required": true,
15
+ "default": "open",
16
+ "index": true,
17
+ "choices": [
18
+ { "value": "open", "title": { "tr": "Açık", "en": "Open" } },
19
+ { "value": "closed", "title": { "tr": "Kapandı", "en": "Closed" } }
20
+ ]
21
+ },
22
+ "closed_at": { "type": "datetime", "title": { "tr": "Kapanış", "en": "Closed at" } }
23
+ }
24
+ },
25
+ "goals": {
26
+ "title": { "tr": "Hedefler", "en": "Goals" },
27
+ "fields": {
28
+ "period_id": { "type": "text", "title": { "tr": "Dönem", "en": "Period" }, "required": true, "maxLength": 36, "index": true },
29
+ "period_code": { "type": "text", "title": { "tr": "Dönem kodu", "en": "Period code" }, "maxLength": 20 },
30
+ "title": { "type": "text", "title": { "tr": "Hedef", "en": "Goal" }, "required": true, "maxLength": 160 },
31
+ "description": { "type": "longText", "title": { "tr": "Açıklama", "en": "Description" }, "maxLength": 2000 },
32
+ "owner_org_id": { "type": "text", "title": { "tr": "Sorumlu (kimlik)", "en": "Owner (id)" }, "required": true, "maxLength": 24, "index": true },
33
+ "owner_name": { "type": "text", "title": { "tr": "Sorumlu", "en": "Owner" }, "maxLength": 120 },
34
+ "team_id": { "type": "text", "title": { "tr": "Ekip (kimlik)", "en": "Team (id)" }, "maxLength": 24, "index": true },
35
+ "team_name": { "type": "text", "title": { "tr": "Ekip", "en": "Team" }, "maxLength": 120 },
36
+ "weight": { "type": "number", "title": { "tr": "Ağırlık", "en": "Weight" }, "required": true, "default": 1, "min": 1, "max": 100 },
37
+ "progress": { "type": "number", "title": { "tr": "İlerleme (%)", "en": "Progress (%)" }, "required": true, "default": 0, "min": 0, "max": 100 }
38
+ }
39
+ },
40
+ "key_results": {
41
+ "title": { "tr": "Ölçülebilir sonuçlar", "en": "Key results" },
42
+ "fields": {
43
+ "goal_id": { "type": "text", "title": { "tr": "Hedef", "en": "Goal" }, "required": true, "maxLength": 36, "index": true },
44
+ "name": { "type": "text", "title": { "tr": "Ölçüt", "en": "Metric" }, "required": true, "maxLength": 160 },
45
+ "unit": { "type": "text", "title": { "tr": "Birim", "en": "Unit" }, "maxLength": 20 },
46
+ "start_value": { "type": "number", "title": { "tr": "Başlangıç değeri", "en": "Start value" }, "required": true, "default": 0 },
47
+ "target_value": { "type": "number", "title": { "tr": "Hedef değer", "en": "Target value" }, "required": true },
48
+ "current_value": { "type": "number", "title": { "tr": "Güncel değer", "en": "Current value" }, "required": true, "default": 0 },
49
+ "progress": { "type": "number", "title": { "tr": "İlerleme (%)", "en": "Progress (%)" }, "required": true, "default": 0, "min": 0, "max": 100 }
50
+ }
51
+ },
52
+ "check_ins": {
53
+ "title": { "tr": "Değer güncellemeleri", "en": "Check-ins" },
54
+ "fields": {
55
+ "key_result_id": { "type": "text", "title": { "tr": "Ölçülebilir sonuç", "en": "Key result" }, "required": true, "maxLength": 36, "index": true },
56
+ "goal_id": { "type": "text", "title": { "tr": "Hedef", "en": "Goal" }, "required": true, "maxLength": 36, "index": true },
57
+ "old_value": { "type": "number", "title": { "tr": "Önceki değer", "en": "Previous value" }, "required": true },
58
+ "new_value": { "type": "number", "title": { "tr": "Yeni değer", "en": "New value" }, "required": true },
59
+ "note": { "type": "text", "title": { "tr": "Not", "en": "Note" }, "maxLength": 200 },
60
+ "actor_name": { "type": "text", "title": { "tr": "Güncelleyen", "en": "Updated by" }, "maxLength": 120 }
61
+ }
62
+ },
63
+ "actions": {
64
+ "title": { "tr": "Aksiyonlar", "en": "Actions" },
65
+ "fields": {
66
+ "goal_id": { "type": "text", "title": { "tr": "Hedef", "en": "Goal" }, "required": true, "maxLength": 36, "index": true },
67
+ "description": { "type": "text", "title": { "tr": "Aksiyon", "en": "Action" }, "required": true, "maxLength": 200 },
68
+ "owner_org_id": { "type": "text", "title": { "tr": "Sorumlu (kimlik)", "en": "Owner (id)" }, "maxLength": 24 },
69
+ "owner_name": { "type": "text", "title": { "tr": "Sorumlu", "en": "Owner" }, "maxLength": 120 },
70
+ "due_date": { "type": "date", "title": { "tr": "Termin", "en": "Due date" } },
71
+ "done": { "type": "boolean", "title": { "tr": "Tamamlandı", "en": "Done" }, "required": true, "default": false },
72
+ "done_at": { "type": "datetime", "title": { "tr": "Tamamlanma", "en": "Done at" } }
73
+ }
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,26 @@
1
+ // Devoplus yapay zekâsının bu uygulamada çağırabileceği araçların İŞLEYİCİLERİ. Adı, açıklaması, girdi şeması,
2
+ // salt-okunurluğu ve izni `one.manifest.json` → `agent.tools`'tadır; rehber `AGENT_GUIDE.md`'dir. Yeni araç = üçü birlikte.
3
+ // Araç yalnız uygulamanın KENDİ veritabanını okur ve yalnız hedef yöneticisi iznine ({{permissionPrefix}}Manage) açıktır:
4
+ // özet bütün ekipleri kapsar, yönetici-çalışan ilişkisi burada çözülmez. Hedef açan, değer güncelleyen ya da dönem
5
+ // kapatan araç bilinçli olarak YOKTUR.
6
+ import { defineAgentTools } from '@devoplus/one-sdk'
7
+ import type { Env } from './app.ts'
8
+ import { findPeriod, lowestGoals, periodSummary } from './queries.ts'
9
+
10
+ export const agentTools = defineAgentTools<Env>({
11
+ 'period-summary': {
12
+ handler: async ({ input, env }) => {
13
+ const code = typeof input.period === 'string' && input.period.trim() !== '' ? input.period.trim() : null
14
+ const period = await findPeriod(env, { code })
15
+ if (!period) return { period: null, overall: 0, goalCount: 0, teams: [], lowest: [] }
16
+ const summary = await periodSummary(env, period.id, null)
17
+ return {
18
+ period: { code: period.code, name: period.name, status: period.status, start: period.start_date, end: period.end_date },
19
+ overall: summary.overall,
20
+ goalCount: summary.goalCount,
21
+ teams: summary.teams.map((t) => ({ team: t.team_name, goals: t.goals, progress: t.progress })),
22
+ lowest: await lowestGoals(env, period.id, null, 5),
23
+ }
24
+ },
25
+ },
26
+ })