kortext 2.2.3 → 3.0.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.
Files changed (208) hide show
  1. package/AGENTS.md +0 -4
  2. package/CHANGELOG.md +81 -0
  3. package/LICENSE +21 -0
  4. package/README.md +145 -55
  5. package/USER-GUIDE.md +505 -0
  6. package/bin/kortext.js +23 -0
  7. package/bin/kortext.ts +377 -0
  8. package/dist/bin/kortext.js +346 -0
  9. package/dist/bin/kortext.js.map +1 -0
  10. package/dist/mcp/index.js +4 -0
  11. package/dist/mcp/index.js.map +1 -0
  12. package/dist/mcp/server.js +553 -0
  13. package/dist/mcp/server.js.map +1 -0
  14. package/dist/mcp/sse.js +38 -0
  15. package/dist/mcp/sse.js.map +1 -0
  16. package/dist/mcp/stdio.js +44 -0
  17. package/dist/mcp/stdio.js.map +1 -0
  18. package/dist/server/cli/cleanup.js +73 -0
  19. package/dist/server/cli/cleanup.js.map +1 -0
  20. package/dist/server/cli/commands.js +73 -0
  21. package/dist/server/cli/commands.js.map +1 -0
  22. package/dist/server/cli/doctor.js +118 -0
  23. package/dist/server/cli/doctor.js.map +1 -0
  24. package/dist/server/cli/executor-factory.js +39 -0
  25. package/dist/server/cli/executor-factory.js.map +1 -0
  26. package/dist/server/cli/init.js +121 -0
  27. package/dist/server/cli/init.js.map +1 -0
  28. package/dist/server/cli/logs.js +28 -0
  29. package/dist/server/cli/logs.js.map +1 -0
  30. package/dist/server/cli/serve.js +72 -0
  31. package/dist/server/cli/serve.js.map +1 -0
  32. package/dist/server/config/env.js +12 -0
  33. package/dist/server/config/env.js.map +1 -0
  34. package/dist/server/db/client.js +32 -0
  35. package/dist/server/db/client.js.map +1 -0
  36. package/dist/server/db/json.js +21 -0
  37. package/dist/server/db/json.js.map +1 -0
  38. package/dist/server/db/migrate.js +70 -0
  39. package/dist/server/db/migrate.js.map +1 -0
  40. package/dist/server/db/migrations/001_init.sql +243 -0
  41. package/dist/server/db/repositories/audit-log.js +58 -0
  42. package/dist/server/db/repositories/audit-log.js.map +1 -0
  43. package/dist/server/db/repositories/backlog.js +96 -0
  44. package/dist/server/db/repositories/backlog.js.map +1 -0
  45. package/dist/server/db/repositories/contexts.js +54 -0
  46. package/dist/server/db/repositories/contexts.js.map +1 -0
  47. package/dist/server/db/repositories/decisions.js +71 -0
  48. package/dist/server/db/repositories/decisions.js.map +1 -0
  49. package/dist/server/db/repositories/handovers.js +53 -0
  50. package/dist/server/db/repositories/handovers.js.map +1 -0
  51. package/dist/server/db/repositories/index.js +30 -0
  52. package/dist/server/db/repositories/index.js.map +1 -0
  53. package/dist/server/db/repositories/locks.js +59 -0
  54. package/dist/server/db/repositories/locks.js.map +1 -0
  55. package/dist/server/db/repositories/notifications.js +63 -0
  56. package/dist/server/db/repositories/notifications.js.map +1 -0
  57. package/dist/server/db/repositories/pending-questions.js +63 -0
  58. package/dist/server/db/repositories/pending-questions.js.map +1 -0
  59. package/dist/server/db/repositories/runs.js +138 -0
  60. package/dist/server/db/repositories/runs.js.map +1 -0
  61. package/dist/server/db/repositories/runtime-artifacts.js +39 -0
  62. package/dist/server/db/repositories/runtime-artifacts.js.map +1 -0
  63. package/dist/server/db/repositories/secrets.js +65 -0
  64. package/dist/server/db/repositories/secrets.js.map +1 -0
  65. package/dist/server/db/repositories/sessions.js +48 -0
  66. package/dist/server/db/repositories/sessions.js.map +1 -0
  67. package/dist/server/db/schemas.js +308 -0
  68. package/dist/server/db/schemas.js.map +1 -0
  69. package/dist/server/engine/consistency.js +25 -0
  70. package/dist/server/engine/consistency.js.map +1 -0
  71. package/dist/server/engine/dag.js +86 -0
  72. package/dist/server/engine/dag.js.map +1 -0
  73. package/dist/server/engine/executor.js +2 -0
  74. package/dist/server/engine/executor.js.map +1 -0
  75. package/dist/server/engine/executors/claude-cli-executor.js +83 -0
  76. package/dist/server/engine/executors/claude-cli-executor.js.map +1 -0
  77. package/dist/server/engine/executors/cli-spawn.js +127 -0
  78. package/dist/server/engine/executors/cli-spawn.js.map +1 -0
  79. package/dist/server/engine/executors/codex-cli-executor.js +69 -0
  80. package/dist/server/engine/executors/codex-cli-executor.js.map +1 -0
  81. package/dist/server/engine/executors/gemini-cli-executor.js +69 -0
  82. package/dist/server/engine/executors/gemini-cli-executor.js.map +1 -0
  83. package/dist/server/engine/executors/mock-executor.js +52 -0
  84. package/dist/server/engine/executors/mock-executor.js.map +1 -0
  85. package/dist/server/engine/executors/persona-routed-executor.js +17 -0
  86. package/dist/server/engine/executors/persona-routed-executor.js.map +1 -0
  87. package/dist/server/engine/gate-enforcer.js +75 -0
  88. package/dist/server/engine/gate-enforcer.js.map +1 -0
  89. package/dist/server/engine/git-commit.js +42 -0
  90. package/dist/server/engine/git-commit.js.map +1 -0
  91. package/dist/server/engine/handover.js +120 -0
  92. package/dist/server/engine/handover.js.map +1 -0
  93. package/dist/server/engine/item-lifecycle.js +74 -0
  94. package/dist/server/engine/item-lifecycle.js.map +1 -0
  95. package/dist/server/engine/persona-registry.js +108 -0
  96. package/dist/server/engine/persona-registry.js.map +1 -0
  97. package/dist/server/engine/worker-pool.js +324 -0
  98. package/dist/server/engine/worker-pool.js.map +1 -0
  99. package/dist/server/engine/workflow-loader.js +55 -0
  100. package/dist/server/engine/workflow-loader.js.map +1 -0
  101. package/dist/server/engine/workflow-parser.js +158 -0
  102. package/dist/server/engine/workflow-parser.js.map +1 -0
  103. package/dist/server/engine/worktree.js +176 -0
  104. package/dist/server/engine/worktree.js.map +1 -0
  105. package/dist/server/index.js +99 -0
  106. package/dist/server/index.js.map +1 -0
  107. package/dist/server/notifications/dispatcher.js +60 -0
  108. package/dist/server/notifications/dispatcher.js.map +1 -0
  109. package/dist/server/notifications/slack.js +37 -0
  110. package/dist/server/notifications/slack.js.map +1 -0
  111. package/dist/server/notifications/telegram.js +33 -0
  112. package/dist/server/notifications/telegram.js.map +1 -0
  113. package/dist/server/orchestrator/approval-queue.js +83 -0
  114. package/dist/server/orchestrator/approval-queue.js.map +1 -0
  115. package/dist/server/orchestrator/blueprint-watcher.js +94 -0
  116. package/dist/server/orchestrator/blueprint-watcher.js.map +1 -0
  117. package/dist/server/orchestrator/orchestrator.js +283 -0
  118. package/dist/server/orchestrator/orchestrator.js.map +1 -0
  119. package/dist/server/orchestrator/pipeline-chainer.js +96 -0
  120. package/dist/server/orchestrator/pipeline-chainer.js.map +1 -0
  121. package/dist/server/orchestrator/resume.js +36 -0
  122. package/dist/server/orchestrator/resume.js.map +1 -0
  123. package/dist/server/routes/approvals.js +52 -0
  124. package/dist/server/routes/approvals.js.map +1 -0
  125. package/dist/server/routes/backlog.js +44 -0
  126. package/dist/server/routes/backlog.js.map +1 -0
  127. package/dist/server/routes/db-info.js +21 -0
  128. package/dist/server/routes/db-info.js.map +1 -0
  129. package/dist/server/routes/docs.js +70 -0
  130. package/dist/server/routes/docs.js.map +1 -0
  131. package/dist/server/routes/doctor.js +19 -0
  132. package/dist/server/routes/doctor.js.map +1 -0
  133. package/dist/server/routes/handovers.js +25 -0
  134. package/dist/server/routes/handovers.js.map +1 -0
  135. package/dist/server/routes/health.js +11 -0
  136. package/dist/server/routes/health.js.map +1 -0
  137. package/dist/server/routes/personas.js +96 -0
  138. package/dist/server/routes/personas.js.map +1 -0
  139. package/dist/server/routes/runs.js +41 -0
  140. package/dist/server/routes/runs.js.map +1 -0
  141. package/dist/server/routes/workflows.js +38 -0
  142. package/dist/server/routes/workflows.js.map +1 -0
  143. package/dist/server/safety/harmful-output-filter.js +40 -0
  144. package/dist/server/safety/harmful-output-filter.js.map +1 -0
  145. package/dist/server/safety/secret-scanner.js +169 -0
  146. package/dist/server/safety/secret-scanner.js.map +1 -0
  147. package/dist/server/services/markdown-sync.js +101 -0
  148. package/dist/server/services/markdown-sync.js.map +1 -0
  149. package/dist/web/assets/index-B80d5ZPZ.js +75 -0
  150. package/dist/web/assets/index-B80d5ZPZ.js.map +1 -0
  151. package/dist/web/assets/index-Bge5Gzqv.css +1 -0
  152. package/dist/web/index.html +13 -0
  153. package/docs/architecture.md +413 -0
  154. package/package.json +83 -11
  155. package/scripts/copy-migrations.mjs +29 -0
  156. package/workspace/.locks/workspace_handover.md.lock +3 -0
  157. package/hooks/audit-logger.sh +0 -25
  158. package/hooks/auto-locker.sh +0 -74
  159. package/hooks/auto-unlocker.sh +0 -17
  160. package/hooks/backlog-sync-guard.sh +0 -12
  161. package/hooks/branch-guard.sh +0 -32
  162. package/hooks/commit-msg-guard.sh +0 -43
  163. package/hooks/git-pre-commit.sh +0 -76
  164. package/hooks/git-pre-push.sh +0 -17
  165. package/hooks/handover-guard.sh +0 -33
  166. package/hooks/kortext-init.sh +0 -194
  167. package/hooks/kortext-lib.sh +0 -151
  168. package/hooks/lint-guard.sh +0 -50
  169. package/hooks/secret-scanner.sh +0 -89
  170. package/hooks/size-guard.sh +0 -48
  171. package/hooks/snapshot-guard.sh +0 -39
  172. package/hooks/write-guard.sh +0 -77
  173. package/scripts/kortext-backlog-add.py +0 -123
  174. package/scripts/kortext-backlog-health.py +0 -112
  175. package/scripts/kortext-backlog-sync.py +0 -117
  176. package/scripts/kortext-bulk-plan.py +0 -63
  177. package/scripts/kortext-cli.py +0 -376
  178. package/scripts/kortext-consistency-check.py +0 -74
  179. package/scripts/kortext-context-check.py +0 -146
  180. package/scripts/kortext-handover.py +0 -107
  181. package/scripts/kortext-item-check.py +0 -61
  182. package/scripts/kortext-item-start.py +0 -70
  183. package/scripts/kortext-item-transition.py +0 -78
  184. package/scripts/kortext-lock.py +0 -174
  185. package/scripts/kortext-session-start.py +0 -127
  186. package/scripts/lock_kortext.sh +0 -34
  187. package/settings/.claude-settings.template.json +0 -48
  188. package/settings/CHANGELOG.md +0 -176
  189. package/settings/INTEGRATION-MAP.md +0 -276
  190. package/settings/README.md +0 -255
  191. package/settings/USER-GUIDE.md +0 -502
  192. package/settings/VERSION +0 -1
  193. package/settings/config.md +0 -8
  194. package/settings/runtime-adapters.md +0 -104
  195. package/skills/backend-developer/.gitkeep +0 -0
  196. package/skills/compliance-expert/.gitkeep +0 -0
  197. package/skills/copywriter/.gitkeep +0 -0
  198. package/skills/db-admin/.gitkeep +0 -0
  199. package/skills/delivery-manager/.gitkeep +0 -0
  200. package/skills/designer/.gitkeep +0 -0
  201. package/skills/devops-engineer/.gitkeep +0 -0
  202. package/skills/engineering-manager/.gitkeep +0 -0
  203. package/skills/frontend-developer/.gitkeep +0 -0
  204. package/skills/growth-expert/.gitkeep +0 -0
  205. package/skills/operation-manager/.gitkeep +0 -0
  206. package/skills/product-manager/.gitkeep +0 -0
  207. package/skills/qa-engineer/.gitkeep +0 -0
  208. package/skills/security-engineer/.gitkeep +0 -0
@@ -1,74 +0,0 @@
1
- #!/bin/bash
2
- # KORTEXT MANAGED HOOK — generated/edited by kortext framework
3
- # [KORTEXT] Otomatik Dosya Kilidi (Pre-Edit)
4
-
5
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- # shellcheck source=kortext-lib.sh
7
- source "$SCRIPT_DIR/kortext-lib.sh"
8
-
9
- kortext_load_config
10
- # Dakika cinsinden lock timeout (shell fallback için). Default 5 dakika.
11
- KORTEXT_LOCK_TIMEOUT_MIN="${KORTEXT_LOCK_TIMEOUT_MIN:-5}"
12
- KORTEXT_HOOK_MODE="${KORTEXT_HOOK_MODE:-permissive}"
13
-
14
- FILE_PATH="${KORTEXT_FILE_PATH:-${CLAUDE_FILE_PATH:-${GEMINI_FILE_PATH:-${OPENAI_FILE_PATH:-}}}}"
15
- AGENT_NAME="${KORTEXT_AGENT:-unknown-agent}"
16
-
17
- if [ -z "$FILE_PATH" ]; then
18
- if [ "$KORTEXT_HOOK_MODE" = "strict" ]; then
19
- echo "⚠️ [KORTEXT] KORTEXT_FILE_PATH tanımsız. strict modda çıkılıyor."
20
- exit 1
21
- fi
22
- exit 0
23
- fi
24
-
25
- # Sadece ortak hafıza dosyaları için kilit çalıştır
26
- if [[ "$FILE_PATH" == *"context.md" ]] || [[ "$FILE_PATH" == *"backlog/"* ]] || [[ "$FILE_PATH" == *"handover.md" ]]; then
27
-
28
- # --- Python lock (kortext-lock.py) ile entegrasyon ---
29
- LOCK_PY="$KORTEXT_DIR/scripts/kortext-lock.py"
30
- if command -v python3 &>/dev/null && [ -f "$LOCK_PY" ]; then
31
- python3 "$LOCK_PY" acquire --file "$FILE_PATH" --agent "$AGENT_NAME" 2>/dev/null || {
32
- # Python lock başarısız → shell lock'a düş
33
- echo "⚠️ [KORTEXT] kortext-lock.py acquire başarısız. Shell kilit mekanizmasına geçiliyor."
34
- }
35
- else
36
- # --- Shell-only fallback lock (flock tabanlı, race-free) ---
37
- # flock(1) ile atomik bir guard alıp lock dosyasını oluştururuz.
38
- # Böylece iki ajan eş zamanlı stale-kontrolü + create yaparken yarışmaz.
39
- LOCK_DIR="$(dirname "$FILE_PATH")"
40
- file_name="$(basename "$FILE_PATH")"
41
- LOCK_FILE="$LOCK_DIR/${file_name}.lock"
42
- GUARD_FILE="$LOCK_FILE.guard"
43
-
44
- # Guard dosyasını fd 200'e bağla.
45
- exec 200>"$GUARD_FILE"
46
-
47
- if flock -n -x 200; then
48
- # Atomik kontrol: kilit dosyası var mı?
49
- if [ -f "$LOCK_FILE" ]; then
50
- # Stale kontrolü: dakika cinsinden timeout aşıldıysa sil.
51
- if find "$LOCK_FILE" -mmin +"$KORTEXT_LOCK_TIMEOUT_MIN" -print -quit 2>/dev/null | grep -q .; then
52
- rm -f "$LOCK_FILE"
53
- else
54
- # Aktif kilit var, çakışma uyarısı.
55
- flock -u 200
56
- echo "---" >&2
57
- echo "🔒 [KORTEXT] KILIT ÇAKIŞMASI" >&2
58
- echo "$LOCK_FILE aktif olarak başka bir ajan tarafından kullanılıyor." >&2
59
- echo "Timeout: ${KORTEXT_LOCK_TIMEOUT_MIN} dakika sonra stale sayılır." >&2
60
- echo "+operation-manager'a eskalasyon yap." >&2
61
- echo "---" >&2
62
- exit 1
63
- fi
64
- fi
65
- # Kilit içeriğine ajan ve zaman damgası yaz (epoch saniye).
66
- echo "${KORTEXT_AGENT_NAME:-$AGENT_NAME}:$(date +%s)" > "$LOCK_FILE"
67
- flock -u 200
68
- else
69
- echo "🔒 [KORTEXT] Guard kilit alınamadı: $GUARD_FILE" >&2
70
- exit 1
71
- fi
72
- fi
73
- fi
74
-
@@ -1,17 +0,0 @@
1
- #!/bin/bash
2
- # KORTEXT MANAGED HOOK — generated/edited by kortext framework
3
- # [KORTEXT] Otomatik Dosya Kilidi Kaldırma (Post-Edit)
4
-
5
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- # shellcheck source=kortext-lib.sh
7
- source "$SCRIPT_DIR/kortext-lib.sh"
8
-
9
- FILE_PATH="${KORTEXT_FILE_PATH:-${CLAUDE_FILE_PATH:-${GEMINI_FILE_PATH:-${OPENAI_FILE_PATH:-}}}}"
10
-
11
- if [ -z "$FILE_PATH" ]; then exit 0; fi
12
-
13
- LOCK_FILE="${FILE_PATH}.lock"
14
-
15
- if [ -f "$LOCK_FILE" ]; then
16
- rm "$LOCK_FILE"
17
- fi
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env bash
2
- # KORTEXT MANAGED HOOK — generated/edited by kortext framework
3
- # [KORTEXT] Backlog dashboard/item drift guard.
4
-
5
- set -euo pipefail
6
-
7
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
- # shellcheck source=kortext-lib.sh
9
- source "$SCRIPT_DIR/kortext-lib.sh"
10
-
11
- cd "$KORTEXT_DIR"
12
- python3 scripts/kortext-backlog-sync.py
@@ -1,32 +0,0 @@
1
- #!/bin/bash
2
- # KORTEXT MANAGED HOOK — generated/edited by kortext framework
3
- # [KORTEXT] Branch Yönetimi ve Koruma
4
-
5
- CURRENT_BRANCH=$(git branch --show-current 2>/dev/null)
6
-
7
- # Eğer git olmayan bir yerdeyse çık
8
- if [ -z "$CURRENT_BRANCH" ]; then exit 0; fi
9
-
10
- # Behavior kuralı: "Asla doğrudan main ve development üzerinde çalışmayın."
11
- if [[ "$CURRENT_BRANCH" == "main" ]] || [[ "$CURRENT_BRANCH" == "development" ]] || [[ "$CURRENT_BRANCH" == "master" ]]; then
12
- echo "---"
13
- echo "🚫 KORTEXT BRANCH KORUMASI"
14
- echo "Hata: Şu an '$CURRENT_BRANCH' ana dalındasınız."
15
- echo "Kortext kuralları gereği doğrudan bu dal üzerinde geliştirme yapamazsınız."
16
- echo ""
17
- echo "Lütfen yeni bir dal oluşturun:"
18
- echo "git checkout -b feature/[task-id]"
19
- echo "---"
20
- exit 1
21
- fi
22
-
23
- # İsimlendirme standardı uyarısı (branching.md satır 17-23)
24
- if [[ ! "$CURRENT_BRANCH" =~ ^(feature/|hotfix/|bugfix/|release/|chore/) ]]; then
25
- echo ""
26
- echo "⚠️ [KORTEXT UYARI]"
27
- echo "Mevcut branch isimlendirmesi standart dışı ($CURRENT_BRANCH)."
28
- echo "feature/[task-id] veya hotfix/[hata-adi] formatını kullanmanız önerilir."
29
- echo ""
30
- fi
31
-
32
- exit 0
@@ -1,43 +0,0 @@
1
- #!/bin/bash
2
- # KORTEXT MANAGED HOOK — generated/edited by kortext framework
3
- # [KORTEXT] Commit Mesajı Standart Kontrolü
4
-
5
- # Git commit sırasında mesaj dosyası parametre olarak gelir
6
- MSG_FILE="$1"
7
- COMMIT_MSG=$(cat "$MSG_FILE" 2>/dev/null)
8
-
9
- # Eğer direkt dosya yoksa ortam değişkenine bak (bazı araçlar için)
10
- if [ -z "$COMMIT_MSG" ]; then
11
- COMMIT_MSG="${KORTEXT_COMMIT_MSG:-${CLAUDE_COMMIT_MESSAGE:-${GEMINI_COMMIT_MESSAGE:-${OPENAI_COMMIT_MESSAGE:-}}}}"
12
- fi
13
-
14
- if [ -z "$COMMIT_MSG" ]; then exit 0; fi
15
-
16
- # Conventional Commits formatı (feat, fix, docs, refactor, test, chore, style, perf)
17
- # Örn: feat: add authentication
18
- PATTERN="^(feat|fix|docs|refactor|test|chore|style|perf)(\(.+\))?!?: .+"
19
-
20
- if [[ ! "$COMMIT_MSG" =~ $PATTERN ]]; then
21
- echo "---"
22
- echo "❌ KORTEXT COMMIT STANDARTLARI İHLALİ"
23
- echo "Hata: Commit mesajı 'Conventional Commits' formatında değil."
24
- echo "Kurallara uygun örnekler:"
25
- echo " - feat: add logging system"
26
- echo " - fix: resolve api timeout"
27
- echo " - docs: update technical specifications"
28
- echo ""
29
- echo "Geçerli Mesajınız: $COMMIT_MSG"
30
- echo "---"
31
- exit 1
32
- fi
33
-
34
- # İngilizce zorunluluğu kontrolü (Türkçe karakter araması)
35
- if echo "$COMMIT_MSG" | grep -q "[çğışıöüÇĞİŞIÖÜ]"; then
36
- echo ""
37
- echo "⚠️ [KORTEXT UYARI]"
38
- echo "Commit mesajında Türkçe karakterler tespit edildi."
39
- echo "Kortext Behavior kuralları gereği commit mesajları İngilizce olmalıdır."
40
- echo ""
41
- fi
42
-
43
- exit 0
@@ -1,76 +0,0 @@
1
- #!/usr/bin/env bash
2
- # KORTEXT MANAGED HOOK — generated/edited by kortext framework
3
- # [KORTEXT] Git pre-commit adapter.
4
-
5
- set -euo pipefail
6
-
7
- SCRIPT_PATH="${BASH_SOURCE[0]}"
8
- while [ -L "$SCRIPT_PATH" ]; do
9
- LINK_DIR="$(cd "$(dirname "$SCRIPT_PATH")" && pwd)"
10
- LINK_TARGET="$(readlink "$SCRIPT_PATH")"
11
- case "$LINK_TARGET" in
12
- /*) SCRIPT_PATH="$LINK_TARGET" ;;
13
- *) SCRIPT_PATH="$LINK_DIR/$LINK_TARGET" ;;
14
- esac
15
- done
16
- SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_PATH")" && pwd)"
17
- # shellcheck source=kortext-lib.sh
18
- source "$SCRIPT_DIR/kortext-lib.sh"
19
- kortext_load_config
20
-
21
- cd "$KORTEXT_ROOT"
22
-
23
- if ! git rev-parse --git-dir >/dev/null 2>&1; then
24
- exit 0
25
- fi
26
-
27
- STATUS=0
28
- TMP_DIR="$(mktemp -d)"
29
-
30
- cleanup() {
31
- rm -rf "$TMP_DIR"
32
- }
33
- trap cleanup EXIT
34
-
35
- while IFS= read -r -d '' FILE_PATH; do
36
- [ -n "$FILE_PATH" ] || continue
37
- [ -f "$FILE_PATH" ] || continue
38
-
39
- STAGED_COPY="$TMP_DIR/$(basename "$FILE_PATH")"
40
- if git show ":$FILE_PATH" > "$STAGED_COPY" 2>/dev/null; then
41
- if ! "$SCRIPT_DIR/secret-scanner.sh" --stdin "$FILE_PATH" < "$STAGED_COPY"; then
42
- STATUS=1
43
- fi
44
- fi
45
-
46
- if ! KORTEXT_FILE_PATH="$FILE_PATH" "$SCRIPT_DIR/lint-guard.sh"; then
47
- STATUS=1
48
- fi
49
-
50
- if ! KORTEXT_FILE_PATH="$FILE_PATH" "$SCRIPT_DIR/size-guard.sh"; then
51
- STATUS=1
52
- fi
53
-
54
- # Kritik dosyalar için anlık yedek al (snapshot-guard).
55
- # Bu dosyalar ajanlar arası bilgi devrinin omurgası; commit öncesi son
56
- # iyi-bilinen halini workspace/backups/ altına kopyalarız.
57
- case "$FILE_PATH" in
58
- workspace/memory/handover.md|\
59
- workspace/memory/decisions.md|\
60
- workspace/memory/learned.md|\
61
- workspace/memory/context/*|\
62
- workspace/references/*)
63
- KORTEXT_FILE_PATH="$FILE_PATH" "$SCRIPT_DIR/snapshot-guard.sh" || true
64
- ;;
65
- esac
66
- done < <(kortext_staged_files)
67
-
68
- if ! "$SCRIPT_DIR/backlog-sync-guard.sh"; then
69
- STATUS=1
70
- fi
71
-
72
- if ! "$SCRIPT_DIR/handover-guard.sh"; then
73
- STATUS=1
74
- fi
75
-
76
- exit "$STATUS"
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env bash
2
- # KORTEXT MANAGED HOOK — generated/edited by kortext framework
3
- # [KORTEXT] Git pre-push adapter.
4
-
5
- set -euo pipefail
6
-
7
- SCRIPT_PATH="${BASH_SOURCE[0]}"
8
- while [ -L "$SCRIPT_PATH" ]; do
9
- LINK_DIR="$(cd "$(dirname "$SCRIPT_PATH")" && pwd)"
10
- LINK_TARGET="$(readlink "$SCRIPT_PATH")"
11
- case "$LINK_TARGET" in
12
- /*) SCRIPT_PATH="$LINK_TARGET" ;;
13
- *) SCRIPT_PATH="$LINK_DIR/$LINK_TARGET" ;;
14
- esac
15
- done
16
- SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_PATH")" && pwd)"
17
- "$SCRIPT_DIR/branch-guard.sh"
@@ -1,33 +0,0 @@
1
- #!/usr/bin/env bash
2
- # KORTEXT MANAGED HOOK — generated/edited by kortext framework
3
- # [KORTEXT] Done item requires handover guard.
4
-
5
- set -euo pipefail
6
-
7
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
- # shellcheck source=kortext-lib.sh
9
- source "$SCRIPT_DIR/kortext-lib.sh"
10
-
11
- BACKLOG_DIR="$KORTEXT_WORKSPACE_DIR/memory/backlog"
12
- HANDOVER_FILE="$KORTEXT_WORKSPACE_DIR/memory/handover.md"
13
-
14
- [ -d "$BACKLOG_DIR" ] || exit 0
15
- [ -f "$HANDOVER_FILE" ] || exit 0
16
-
17
- STATUS=0
18
- while IFS= read -r -d '' file_path; do
19
- [ -f "$file_path" ] || continue
20
- if grep -q '^> \*\*Status:\*\* Done' "$file_path"; then
21
- item_id="$(basename "$file_path" | cut -d- -f1)"
22
- if ! grep -q "^## Handover: $item_id" "$HANDOVER_FILE"; then
23
- echo "---"
24
- echo "❌ KORTEXT HANDOVER EKSİK"
25
- echo "Done durumundaki item için handover kaydı bulunamadı: $item_id"
26
- echo "Önce scripts/kortext-handover.py ile devir kaydı oluştur."
27
- echo "---"
28
- STATUS=1
29
- fi
30
- fi
31
- done < <(find "$BACKLOG_DIR" -maxdepth 1 -type f \( -name 'T[0-9]*-*.md' -o -name 'B[0-9]*-*.md' -o -name 'D[0-9]*-*.md' \) -print0)
32
-
33
- exit "$STATUS"
@@ -1,194 +0,0 @@
1
- #!/bin/bash
2
- # KORTEXT MANAGED HOOK — generated/edited by kortext framework
3
- # [KORTEXT] Oturum Başlatma ve Güvenlik Hook'u
4
-
5
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- # shellcheck source=kortext-lib.sh
7
- source "$SCRIPT_DIR/kortext-lib.sh"
8
-
9
- install_hook() {
10
- local hook_name="$1"
11
- local target_name="$2"
12
- local hook_path=".git/hooks/$hook_name"
13
- # Absolute path kullan; .git/hooks içinden çözünmesi gerekiyor.
14
- local target_path
15
- target_path="$(cd "$KORTEXT_DIR/hooks" && pwd)/$target_name"
16
-
17
- if [ -e "$hook_path" ] && [ ! -L "$hook_path" ]; then
18
- # KORTEXT MANAGED HOOK marker'ı hook dosyasının ilk 10 satırında ara.
19
- # Marker bulunamazsa kortext yönetimindeki hook olmadığı için ezme.
20
- if ! head -n 10 "$hook_path" 2>/dev/null | grep -q "KORTEXT MANAGED HOOK"; then
21
- echo "Kortext Git Hook atlandı: $hook_path zaten mevcut (marker yok)."
22
- return 0
23
- fi
24
- fi
25
-
26
- ln -sf "$target_path" "$hook_path"
27
- chmod +x "$KORTEXT_DIR/hooks/$target_name"
28
- }
29
-
30
- install_git_hooks() {
31
- if [ ! -d ".git" ]; then
32
- return 0
33
- fi
34
-
35
- mkdir -p .git/hooks
36
- install_hook "pre-commit" "git-pre-commit.sh"
37
- install_hook "commit-msg" "commit-msg-guard.sh"
38
- install_hook "pre-push" "git-pre-push.sh"
39
- }
40
-
41
- # Runtime tespiti: KORTEXT_RUNTIME env var öncelik;
42
- # yoksa proje köküne göre otomatik karar (claude_code | gemini_cli | codex).
43
- detect_runtime() {
44
- if [ -n "${KORTEXT_RUNTIME:-}" ]; then
45
- echo "$KORTEXT_RUNTIME"
46
- return 0
47
- fi
48
- if [ -d ".claude" ] || [ -n "${CLAUDE_PROJECT_ROOT:-}" ]; then
49
- echo "claude_code"
50
- return 0
51
- fi
52
- if [ -d ".gemini" ] || [ -n "${GEMINI_PROJECT_ROOT:-}" ]; then
53
- echo "gemini_cli"
54
- return 0
55
- fi
56
- echo "codex"
57
- }
58
-
59
- # Runtime adapter kurulumu: tespit edilen runtime'a göre uygun template'i
60
- # proje köküne kopyalar ve `${KORTEXT_ROOT}` placeholder'ını gerçek path
61
- # ile değiştirir. settings/runtime-adapters.md tek-kaynak dokümandır.
62
- install_runtime_adapter() {
63
- local runtime
64
- runtime="${1:-$(detect_runtime)}"
65
- local kortext_root
66
- kortext_root="$(cd "$KORTEXT_DIR" && pwd)"
67
-
68
- case "$runtime" in
69
- claude_code)
70
- local template="$KORTEXT_DIR/settings/.claude-settings.template.json"
71
- local target=".claude/settings.json"
72
- if [ ! -f "$template" ]; then
73
- echo "⚠️ Claude Code template bulunamadı: $template"
74
- return 1
75
- fi
76
- mkdir -p .claude
77
- if [ -e "$target" ] && ! grep -q "KORTEXT_ROOT" "$target" 2>/dev/null; then
78
- echo "ℹ️ Claude settings zaten mevcut (kortext yönetiminde değil), atlandı: $target"
79
- return 0
80
- fi
81
- sed "s|\${KORTEXT_ROOT}|$kortext_root|g" "$template" > "$target"
82
- echo "✅ Claude Code adapter kuruldu: $target"
83
- ;;
84
- gemini_cli)
85
- echo "ℹ️ Gemini CLI adapter henüz template'lenmedi (settings/runtime-adapters.md Bölüm 4)."
86
- echo " AGENTS.md tabanlı baseline kullanılacak."
87
- ;;
88
- codex|generic|*)
89
- echo "ℹ️ Codex / Generic runtime: AGENTS.md zaten baseline olarak çalışır."
90
- ;;
91
- esac
92
- }
93
-
94
- if [ "${1:-}" = "--install-hooks" ]; then
95
- install_git_hooks
96
- exit 0
97
- fi
98
-
99
- if [ "${1:-}" = "--install-runtime" ]; then
100
- install_runtime_adapter "${2:-}"
101
- exit 0
102
- fi
103
-
104
- # Versiyon oku
105
- KORTEXT_VERSION=$(cat "$KORTEXT_DIR/settings/VERSION" 2>/dev/null | head -n 1 | tr -d '\n' || echo "?.?.?")
106
-
107
- # 1. Framework'ü Kilitle (Zorunlu Adım)
108
- if [ -f "$KORTEXT_DIR/scripts/lock_kortext.sh" ]; then
109
- chmod +x "$KORTEXT_DIR/scripts/lock_kortext.sh"
110
- bash "$KORTEXT_DIR/scripts/lock_kortext.sh" > /dev/null 2>&1
111
- fi
112
-
113
- # 1.5 Git Hook Entegrasyonunu Kur
114
- install_git_hooks
115
-
116
- # 1.6 Runtime Adapter Kurulumu (Claude Code / Gemini CLI / Codex)
117
- install_runtime_adapter
118
-
119
- # 1.7 SESSION_BRIEF — Oturum Başlangıç Özeti
120
- # Aktif context, son handover ve stale itemları özetler.
121
- SESSION_START_PY="$KORTEXT_DIR/scripts/kortext-session-start.py"
122
- if command -v python3 &>/dev/null && [ -f "$SESSION_START_PY" ]; then
123
- python3 "$SESSION_START_PY" 2>/dev/null || true
124
- fi
125
-
126
-
127
- # 2. Durum Tespiti Hazırlığı
128
- BLUEPRINT="$KORTEXT_WORKSPACE_DIR/references/blueprint.md"
129
- STACK="$KORTEXT_WORKSPACE_DIR/references/tech-stack.md"
130
- BACKLOG_DIR="$KORTEXT_WORKSPACE_DIR/memory/backlog/"
131
-
132
- # Proje adını çekmeye çalış
133
- PROJE_ADI="Henüz tanımlanmamış"
134
- if [ -f "$BLUEPRINT" ]; then
135
- PROJE_ADI=$(grep -m 1 "^#" "$BLUEPRINT" 2>/dev/null | sed 's/# //' || echo "Henüz tanımlanmamış")
136
- fi
137
-
138
- # Mantık: Dosyaların içeriğine göre durum belirleme
139
- DURUM="Yeni Proje"
140
- SIRADAKI="!start analysis"
141
-
142
- # Blueprint dolu ve onaylanmış mı?
143
- if [ -s "$BLUEPRINT" ] && grep -q "status:.*approved" "$BLUEPRINT" 2>/dev/null; then
144
- DURUM="Blueprint Hazır"
145
- SIRADAKI="!start analysis"
146
- fi
147
-
148
- # Tech Stack dolu ve onaylanmış mı?
149
- if [ -s "$STACK" ] && grep -q "status:.*approved" "$STACK" 2>/dev/null; then
150
- DURUM="Analiz Tamamlandı"
151
- SIRADAKI="!start planning"
152
- fi
153
-
154
- # Mevcut codebase var mı? (Kortext sonradan eklenmiş bir projeye mi?)
155
- HAS_CODEBASE=false
156
- if [ -f "package.json" ] || [ -f "requirements.txt" ] || [ -f "pubspec.yaml" ] || \
157
- [ -f "go.mod" ] || [ -f "Cargo.toml" ] || [ -d "src" ] || [ -d "app" ] || [ -d "lib" ]; then
158
- HAS_CODEBASE=true
159
- fi
160
-
161
- # Mevcut codebase varken blueprint yoksa → !onboard öner
162
- if [ "$HAS_CODEBASE" = true ] && [ "$DURUM" = "Yeni Proje" ]; then
163
- DURUM="Mevcut Proje Tespit Edildi"
164
- SIRADAKI="!start onboard"
165
- fi
166
-
167
- # Backlog klasöründe herhangi bir Markdown dosyası var mı?
168
- if [ -d "$BACKLOG_DIR" ] && find "$BACKLOG_DIR" -name "*.md" 2>/dev/null | grep -q "."; then
169
- DURUM="Geliştirme Hazır"
170
- SIRADAKI="!start development"
171
- fi
172
-
173
- # 3. Raporu Yazdır
174
- echo "---"
175
- echo "🏁 KORTEXT YÜKLENDİ (v$KORTEXT_VERSION)"
176
- echo "+prime, Kortext protokolleri ve koruma kalkanları aktifleşti."
177
- echo ""
178
- echo "📋 Proje: $PROJE_ADI"
179
- echo "📍 Durum: $DURUM"
180
- echo "⏭️ Sıradaki Adım: $SIRADAKI"
181
- echo ""
182
-
183
- # Duruma göre kısa ipucu
184
- case $DURUM in
185
- "Yeni Proje") echo "💡 Not: blueprint.md üzerinden proje vizyonunu belirleyebilirsin." ;;
186
- "Mevcut Proje Tespit Edildi") echo "💡 Not: Mevcut codebase bulundu. Kortext'i mevcut projeye entegre etmek için !onboard komutunu kullan." ;;
187
- "Blueprint Hazır") echo "💡 Not: Analiz fazına geçmek için hazırım (blueprint dolu)." ;;
188
- "Analiz Tamamlandı") echo "💡 Not: Teknik mimari hazır, planlama başlatılabilir." ;;
189
- "Geliştirme Hazır") echo "💡 Not: Backlog dolu, hangi görevle başlıyoruz?" ;;
190
- esac
191
-
192
- echo ""
193
- echo "Süreci yönetmek üzere komutunu bekliyorum."
194
- echo "---"
@@ -1,151 +0,0 @@
1
- #!/usr/bin/env bash
2
- # KORTEXT MANAGED HOOK — generated/edited by kortext framework
3
- # Shared path and config helpers for Kortext hooks.
4
-
5
- kortext_find_root() {
6
- local dir="${1:-$PWD}"
7
-
8
- while [ "$dir" != "/" ]; do
9
- if [ -d "$dir/.kortext/hooks" ]; then
10
- printf '%s\n' "$dir"
11
- return 0
12
- fi
13
- dir="$(dirname "$dir")"
14
- done
15
-
16
- return 1
17
- }
18
-
19
- KORTEXT_ROOT="${KORTEXT_ROOT:-$(kortext_find_root "$PWD" 2>/dev/null || pwd)}"
20
-
21
- # .kortext zorunlu — çift modlu sistem kaldırıldı
22
- KORTEXT_REL="${KORTEXT_REL:-.kortext}"
23
- KORTEXT_DIR="${KORTEXT_DIR:-$KORTEXT_ROOT/$KORTEXT_REL}"
24
-
25
- # Hata kontrolü: .kortext/ bulunmazsa açık hata ver
26
- if [ ! -d "$KORTEXT_DIR/hooks" ]; then
27
- echo "❌ HATA: .kortext/ dizini bulunamadı: $KORTEXT_DIR" >&2
28
- return 1
29
- fi
30
-
31
- # KORTEXT_WORKSPACE_DIR: npm global kurulumda framework ve proje dizini ayrılır.
32
- # Önce çalışma dizininde local workspace/ ara; yoksa framework'ün kendi workspace/'ini kullan.
33
- if [ -z "${KORTEXT_WORKSPACE_DIR:-}" ]; then
34
- if [ -d "$PWD/workspace" ]; then
35
- KORTEXT_WORKSPACE_DIR="$PWD/workspace"
36
- else
37
- KORTEXT_WORKSPACE_DIR="$KORTEXT_DIR/workspace"
38
- fi
39
- fi
40
- export KORTEXT_WORKSPACE_DIR
41
-
42
- kortext_abs_path() {
43
- local path="$1"
44
- case "$path" in
45
- /*) printf '%s\n' "$path" ;;
46
- *) printf '%s\n' "$KORTEXT_ROOT/$path" ;;
47
- esac
48
- }
49
-
50
- kortext_load_config() {
51
- local config_file line key value
52
- local candidates=(
53
- "$KORTEXT_DIR/settings/config"
54
- "$KORTEXT_DIR/settings/config.md"
55
- "$KORTEXT_DIR/config"
56
- "$KORTEXT_ROOT/.kortext/config"
57
- )
58
-
59
- for config_file in "${candidates[@]}"; do
60
- [ -f "$config_file" ] || continue
61
- while IFS= read -r line; do
62
- line="${line%%#*}"
63
- [[ "$line" =~ ^[[:space:]]*([A-Z_][A-Z0-9_]*)[[:space:]]*=[[:space:]]*(.*)[[:space:]]*$ ]] || continue
64
- key="${BASH_REMATCH[1]}"
65
- value="${BASH_REMATCH[2]}"
66
- value="${value%\"}"
67
- value="${value#\"}"
68
- value="${value%\'}"
69
- value="${value#\'}"
70
- if [ -z "${!key+x}" ]; then
71
- export "$key=$value"
72
- fi
73
- done < "$config_file"
74
- return 0
75
- done
76
-
77
- return 0
78
- }
79
-
80
- kortext_is_workspace_path() {
81
- local abs
82
- abs="$(kortext_abs_path "$1")"
83
-
84
- case "$abs" in
85
- "$KORTEXT_WORKSPACE_DIR"/*|"$KORTEXT_ROOT/.kortext/workspace"/*)
86
- return 0
87
- ;;
88
- *)
89
- return 1
90
- ;;
91
- esac
92
- }
93
-
94
- kortext_is_env_path() {
95
- local base
96
- base="$(basename "$1")"
97
- case "$base" in
98
- .env|.env.*)
99
- return 0
100
- ;;
101
- *)
102
- return 1
103
- ;;
104
- esac
105
- }
106
-
107
- kortext_json_field() {
108
- # JSON içinden bir alan çek. jq yoksa python3 fallback'ine düşer.
109
- # query formatı: '.tool_input.file_path' gibi nokta yollu erişim.
110
- local input="$1"
111
- local query="$2"
112
-
113
- if command -v jq >/dev/null 2>&1; then
114
- printf '%s' "$input" | jq -r "$query // empty" 2>/dev/null || true
115
- return 0
116
- fi
117
-
118
- if command -v python3 >/dev/null 2>&1; then
119
- # Python fallback — '.a.b.c' yolunu dict erişimine çevirir.
120
- printf '%s' "$input" | KORTEXT_JSON_QUERY="$query" python3 -c '
121
- import json, os, sys
122
- try:
123
- data = json.load(sys.stdin)
124
- query = os.environ.get("KORTEXT_JSON_QUERY", "").lstrip(".")
125
- if not query:
126
- print("")
127
- sys.exit(0)
128
- parts = query.split(".")
129
- for p in parts:
130
- if isinstance(data, dict):
131
- data = data.get(p, "")
132
- else:
133
- data = ""
134
- break
135
- if data is None:
136
- data = ""
137
- print(data)
138
- except Exception:
139
- pass
140
- ' 2>/dev/null || true
141
- return 0
142
- fi
143
-
144
- # Hiçbir araç yoksa boş döndür.
145
- echo ""
146
- return 1
147
- }
148
-
149
- kortext_staged_files() {
150
- git diff --cached --name-only --diff-filter=ACMR -z
151
- }