sift-cli 1.0.0__tar.gz → 1.0.1__tar.gz

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 (164) hide show
  1. {sift_cli-1.0.0 → sift_cli-1.0.1}/PKG-INFO +30 -6
  2. {sift_cli-1.0.0 → sift_cli-1.0.1}/README.md +29 -5
  3. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/00-PLAN.md +1 -0
  4. sift_cli-1.0.1/notlar/28-KURULUM.md +92 -0
  5. {sift_cli-1.0.0 → sift_cli-1.0.1}/pyproject.toml +1 -1
  6. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/__init__.py +1 -1
  7. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/server.py +5 -2
  8. sift_cli-1.0.1/tanitim/00-PLAN.md +146 -0
  9. sift_cli-1.0.1/tanitim/ARASTIRMA.md +139 -0
  10. sift_cli-1.0.1/tanitim/T1-SURUM-1-0-1.md +50 -0
  11. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/mutations.py +1 -1
  12. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_server.py +2 -1
  13. {sift_cli-1.0.0 → sift_cli-1.0.1}/.gitattributes +0 -0
  14. {sift_cli-1.0.0 → sift_cli-1.0.1}/.github/workflows/ci.yml +0 -0
  15. {sift_cli-1.0.0 → sift_cli-1.0.1}/.github/workflows/release.yml +0 -0
  16. {sift_cli-1.0.0 → sift_cli-1.0.1}/.gitignore +0 -0
  17. {sift_cli-1.0.0 → sift_cli-1.0.1}/LICENSE +0 -0
  18. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/01-YAKALAMA.md +0 -0
  19. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/02-MODEL-KOPRUSU.md +0 -0
  20. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/03-DAMITMA.md +0 -0
  21. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/04-GUVENLIK-AGI.md +0 -0
  22. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/05-DIL-BAGIMSIZLIGI.md +0 -0
  23. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/06-DOSYA-TASLAGI.md +0 -0
  24. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/07-MCP-SUNUCUSU.md +0 -0
  25. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/08-BUTCE-VE-OLCUM.md +0 -0
  26. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/09-ARKA-PLAN-KOMUTLARI.md +0 -0
  27. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/10-GIZLILIK.md +0 -0
  28. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/11-YAYIN.md +0 -0
  29. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/12-CAGIRANIN-SOZ-HAKKI.md +0 -0
  30. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/13-DOSYA-DAMITMA.md +0 -0
  31. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/14-ARAYAN-PEEK.md +0 -0
  32. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/15-COKLU-IS.md +0 -0
  33. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/16-HAFIZA.md +0 -0
  34. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/17-YOGUN-ARACLAR.md +0 -0
  35. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/18-KAPSAM.md +0 -0
  36. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/19-KALINTI-MUTASYON.md +0 -0
  37. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/20-KAYIT-BIRIMI.md +0 -0
  38. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/21-SAKLAMA.md +0 -0
  39. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/22-YANIT-ONBELLEGI.md +0 -0
  40. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/23-OLCUM-BIRIMI.md +0 -0
  41. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/24-ANAHTAR.md +0 -0
  42. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/25-TEKLIF.md +0 -0
  43. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/26-BEKLEMEK.md +0 -0
  44. {sift_cli-1.0.0 → sift_cli-1.0.1}/notlar/27-WINDOWS.md +0 -0
  45. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/answers.py +0 -0
  46. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/background.py +0 -0
  47. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/capture.py +0 -0
  48. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/cli.py +0 -0
  49. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/digest.py +0 -0
  50. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/distill.py +0 -0
  51. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/fallback.py +0 -0
  52. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/hook.py +0 -0
  53. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/lines.py +0 -0
  54. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/many.py +0 -0
  55. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/memory.py +0 -0
  56. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/model.py +0 -0
  57. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/outline.py +0 -0
  58. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/peek.py +0 -0
  59. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/privacy.py +0 -0
  60. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/records.py +0 -0
  61. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/store.py +0 -0
  62. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/tools.py +0 -0
  63. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/view.py +0 -0
  64. {sift_cli-1.0.0 → sift_cli-1.0.1}/src/sift/watch.py +0 -0
  65. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/budget.py +0 -0
  66. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/conftest.py +0 -0
  67. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/README.md +0 -0
  68. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/ansi-progress.json +0 -0
  69. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/ansi-progress.txt +0 -0
  70. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/cargo-de.json +0 -0
  71. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/cargo-de.txt +0 -0
  72. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/cmake-vi.json +0 -0
  73. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/cmake-vi.txt +0 -0
  74. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/cobol-mainframe.json +0 -0
  75. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/cobol-mainframe.txt +0 -0
  76. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/docker-ar.json +0 -0
  77. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/docker-ar.txt +0 -0
  78. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/dotnet-fr.json +0 -0
  79. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/dotnet-fr.txt +0 -0
  80. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/ffmpeg-fa.json +0 -0
  81. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/ffmpeg-fa.txt +0 -0
  82. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/gcc-ru.json +0 -0
  83. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/gcc-ru.txt +0 -0
  84. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/git-quiet.json +0 -0
  85. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/git-quiet.txt +0 -0
  86. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/gotest-zh.json +0 -0
  87. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/gotest-zh.txt +0 -0
  88. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/gradle-ko.json +0 -0
  89. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/gradle-ko.txt +0 -0
  90. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/journalctl-it.json +0 -0
  91. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/journalctl-it.txt +0 -0
  92. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/kubectl-hi.json +0 -0
  93. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/kubectl-hi.txt +0 -0
  94. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/latex-pl.json +0 -0
  95. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/latex-pl.txt +0 -0
  96. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/maven-tr.json +0 -0
  97. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/maven-tr.txt +0 -0
  98. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/mix-he.json +0 -0
  99. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/mix-he.txt +0 -0
  100. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/psql-es.json +0 -0
  101. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/psql-es.txt +0 -0
  102. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/pytest-en.json +0 -0
  103. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/pytest-en.txt +0 -0
  104. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/rspec-id.json +0 -0
  105. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/rspec-id.txt +0 -0
  106. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/terraform-pt.json +0 -0
  107. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/terraform-pt.txt +0 -0
  108. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/vite-ja.json +0 -0
  109. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/vite-ja.txt +0 -0
  110. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/zig-sw.json +0 -0
  111. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus/zig-sw.txt +0 -0
  112. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/clojure-rapor.json +0 -0
  113. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/clojure-rapor.txt +0 -0
  114. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/cpp-baslik.json +0 -0
  115. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/cpp-baslik.txt +0 -0
  116. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/elixir-onbellek.json +0 -0
  117. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/elixir-onbellek.txt +0 -0
  118. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/go-kuyruk.json +0 -0
  119. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/go-kuyruk.txt +0 -0
  120. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/haskell-ayristirici.json +0 -0
  121. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/haskell-ayristirici.txt +0 -0
  122. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/hcl-altyapi.json +0 -0
  123. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/hcl-altyapi.txt +0 -0
  124. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/java-depo.json +0 -0
  125. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/java-depo.txt +0 -0
  126. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/makefile-yapi.json +0 -0
  127. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/makefile-yapi.txt +0 -0
  128. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/python-akis.json +0 -0
  129. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/python-akis.txt +0 -0
  130. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/qqzz-uydurma.json +0 -0
  131. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/qqzz-uydurma.txt +0 -0
  132. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/ruby-fatura.json +0 -0
  133. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/ruby-fatura.txt +0 -0
  134. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/rust-matris.json +0 -0
  135. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/rust-matris.txt +0 -0
  136. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/shell-dagitim.json +0 -0
  137. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/shell-dagitim.txt +0 -0
  138. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/sql-sema.json +0 -0
  139. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus-kaynak/sql-sema.txt +0 -0
  140. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/korpus_reader.py +0 -0
  141. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/languages.py +0 -0
  142. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/outlines.py +0 -0
  143. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_answers.py +0 -0
  144. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_background.py +0 -0
  145. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_capture.py +0 -0
  146. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_cli.py +0 -0
  147. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_digest.py +0 -0
  148. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_distill.py +0 -0
  149. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_fallback.py +0 -0
  150. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_gc.py +0 -0
  151. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_hook.py +0 -0
  152. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_hook_setup.py +0 -0
  153. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_kaynak.py +0 -0
  154. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_korpus.py +0 -0
  155. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_lines.py +0 -0
  156. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_many.py +0 -0
  157. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_model.py +0 -0
  158. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_outline.py +0 -0
  159. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_package.py +0 -0
  160. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_privacy.py +0 -0
  161. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_records.py +0 -0
  162. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_setup.py +0 -0
  163. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/test_tokens.py +0 -0
  164. {sift_cli-1.0.0 → sift_cli-1.0.1}/test/wire.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sift-cli
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Runs your command, then gives the model only the lines that matter.
5
5
  Project-URL: Homepage, https://github.com/slymnysr/sift
6
6
  Author: slmnys
@@ -20,6 +20,8 @@ Description-Content-Type: text/markdown
20
20
 
21
21
  # sift
22
22
 
23
+ <!-- mcp-name: io.github.slymnysr/sift -->
24
+
23
25
  Runs your command, then gives the model only the lines that matter.
24
26
 
25
27
  A test suite prints 4,000 lines and eleven of them are the failure. A build
@@ -243,11 +245,17 @@ result is re-sent on every turn that follows it, so a build log kept out of a
243
245
  transcript goes on staying out of it.
244
246
 
245
247
  ```bash
246
- pip install "sift-cli[mcp]"
247
- export SIFT_API_KEY=nvapi-... # yours; see Installing
248
- claude mcp add sift -- sift-mcp
248
+ uv tool install "sift-cli[mcp]" # or pipx; see Installing
249
+ claude mcp add --scope user sift -- sift-mcp
249
250
  ```
250
251
 
252
+ The key is read from `~/.config/nvidia/api_key`, so it does not have to be in
253
+ the environment and does not have to be pasted anywhere. `--scope user` puts the
254
+ server in every project rather than the one you happen to be in.
255
+
256
+ Then **restart the client**. MCP servers are connected when a session starts, so
257
+ the session you ran that command in will not see this one.
258
+
251
259
  Without a key the server starts and every tool that would need a model declines
252
260
  with an explanation, so the agent falls back to its own shell rather than being
253
261
  handed a worse answer it cannot tell apart from a good one.
@@ -265,10 +273,26 @@ the lines or none could be reached.
265
273
  ## Installing
266
274
 
267
275
  ```bash
268
- pip install sift-cli # the command line, no dependencies at all
269
- pip install "sift-cli[mcp]" # and the MCP server
276
+ uv tool install sift-cli # the command line, no dependencies at all
277
+ uv tool install "sift-cli[mcp]" # and the MCP server
270
278
  ```
271
279
 
280
+ `pipx install` does the same thing. Either puts `sift` and `sift-mcp` on your
281
+ PATH in an environment of their own, which is what you want for a command-line
282
+ tool: nothing here belongs in the Python you build with.
283
+
284
+ Plain `pip install sift-cli` works inside a virtualenv you have already
285
+ activated. It does **not** work against the system Python on Debian, Ubuntu, or
286
+ WSL — those ship a `EXTERNALLY-MANAGED` marker and pip refuses, by design:
287
+
288
+ ```
289
+ error: externally-managed-environment
290
+ × This environment is externally managed
291
+ ```
292
+
293
+ That refusal is right and the answer is not `--break-system-packages`. Use `uv
294
+ tool` or `pipx`.
295
+
272
296
  The package is `sift-cli` and the commands are `sift` and `sift-mcp`. The names
273
297
  differ because `sift-mcp` on PyPI belongs to somebody else's project — an
274
298
  unrelated MCP server about authorising agent actions. Nothing here is theirs and
@@ -1,5 +1,7 @@
1
1
  # sift
2
2
 
3
+ <!-- mcp-name: io.github.slymnysr/sift -->
4
+
3
5
  Runs your command, then gives the model only the lines that matter.
4
6
 
5
7
  A test suite prints 4,000 lines and eleven of them are the failure. A build
@@ -223,11 +225,17 @@ result is re-sent on every turn that follows it, so a build log kept out of a
223
225
  transcript goes on staying out of it.
224
226
 
225
227
  ```bash
226
- pip install "sift-cli[mcp]"
227
- export SIFT_API_KEY=nvapi-... # yours; see Installing
228
- claude mcp add sift -- sift-mcp
228
+ uv tool install "sift-cli[mcp]" # or pipx; see Installing
229
+ claude mcp add --scope user sift -- sift-mcp
229
230
  ```
230
231
 
232
+ The key is read from `~/.config/nvidia/api_key`, so it does not have to be in
233
+ the environment and does not have to be pasted anywhere. `--scope user` puts the
234
+ server in every project rather than the one you happen to be in.
235
+
236
+ Then **restart the client**. MCP servers are connected when a session starts, so
237
+ the session you ran that command in will not see this one.
238
+
231
239
  Without a key the server starts and every tool that would need a model declines
232
240
  with an explanation, so the agent falls back to its own shell rather than being
233
241
  handed a worse answer it cannot tell apart from a good one.
@@ -245,10 +253,26 @@ the lines or none could be reached.
245
253
  ## Installing
246
254
 
247
255
  ```bash
248
- pip install sift-cli # the command line, no dependencies at all
249
- pip install "sift-cli[mcp]" # and the MCP server
256
+ uv tool install sift-cli # the command line, no dependencies at all
257
+ uv tool install "sift-cli[mcp]" # and the MCP server
250
258
  ```
251
259
 
260
+ `pipx install` does the same thing. Either puts `sift` and `sift-mcp` on your
261
+ PATH in an environment of their own, which is what you want for a command-line
262
+ tool: nothing here belongs in the Python you build with.
263
+
264
+ Plain `pip install sift-cli` works inside a virtualenv you have already
265
+ activated. It does **not** work against the system Python on Debian, Ubuntu, or
266
+ WSL — those ship a `EXTERNALLY-MANAGED` marker and pip refuses, by design:
267
+
268
+ ```
269
+ error: externally-managed-environment
270
+ × This environment is externally managed
271
+ ```
272
+
273
+ That refusal is right and the answer is not `--break-system-packages`. Use `uv
274
+ tool` or `pipx`.
275
+
252
276
  The package is `sift-cli` and the commands are `sift` and `sift-mcp`. The names
253
277
  differ because `sift-mcp` on PyPI belongs to somebody else's project — an
254
278
  unrelated MCP server about authorising agent actions. Nothing here is theirs and
@@ -76,6 +76,7 @@ sonraki faza geçilmez.
76
76
  | 25 | Teklif | en çok kazandıran parça kendini tanıtsın; başkasının ayar dosyasına güvenle yazsın | bitti — [25-TEKLIF.md](25-TEKLIF.md) |
77
77
  | 26 | Beklemek | cevap vermeyecek basamağı beklemeyi bırak; merdiveni ölçüme göre kur | bitti — [26-BEKLEMEK.md](26-BEKLEMEK.md) |
78
78
  | 27 | Windows | CI'ın gösterdiği iki gerçek hata: `alive()` süreç öldürüyordu, izolasyon `~`'ı bulamıyordu | bitti — [27-WINDOWS.md](27-WINDOWS.md) |
79
+ | 28 | Kurulum | yabancının izlediği yol sınandı; `pip install` Debian/WSL'de reddediliyor | bitti — [28-KURULUM.md](28-KURULUM.md) |
79
80
 
80
81
  ## Ek fazlar — neden sonradan çıktılar
81
82
 
@@ -0,0 +1,92 @@
1
+ # 28 — Kurulum: bir yabancının izlediği yol
2
+
3
+ **Nereden çıktı:** Kullanıcı "dışarıdan biriymişim gibi kur" dedi. Ben de
4
+ hafızamdaki bilgiyi kullanmadan, yalnız **yayınlanmış belgelere** bakarak
5
+ kurdum. Amaç bir rol yapmak değildi; sınanan şey şuydu: *yayınladığımız
6
+ belgeler, bir yabancının doğru kurması için yeterli mi?*
7
+
8
+ Cevap: neredeyse. Bir yerde takılıyordu.
9
+
10
+ ## Bulunan hata: `pip install` bu makinelerde çalışmıyor
11
+
12
+ README şunu diyordu:
13
+
14
+ ```bash
15
+ pip install "sift-cli[mcp]"
16
+ ```
17
+
18
+ Debian, Ubuntu ve WSL'de bu komut **başarısız olur**. O sistemler sistem
19
+ Python'una bir işaret koyar:
20
+
21
+ ```
22
+ /usr/lib/python3.12/EXTERNALLY-MANAGED
23
+ ```
24
+
25
+ ve `pip` PEP 668 gereği reddeder:
26
+
27
+ ```
28
+ error: externally-managed-environment
29
+ × This environment is externally managed
30
+ ```
31
+
32
+ Bu ret **doğrudur** — sistem paket yöneticisinin kurduğu Python'a pip ile
33
+ yazmak dağıtımı bozar. Yanlış olan, README'nin çalışmayan bir komut vermesiydi.
34
+
35
+ Ve cevap `--break-system-packages` değil. Bir komut satırı aracı zaten kendi
36
+ ortamında olmalı: `uv tool install` ya da `pipx install`. İkisi de `sift` ve
37
+ `sift-mcp`'yi PATH'e koyar, hiçbir şeye bulaşmadan.
38
+
39
+ README düzeltildi.
40
+
41
+ ## Kodda da aynı cümle var — ve bekliyor
42
+
43
+ `src/sift/server.py`, `mcp` eklentisi olmadan çalıştırılınca şunu basıyor:
44
+
45
+ ```
46
+ sift-mcp: the server half needs one more package.
47
+
48
+ pip install "sift-cli[mcp]"
49
+ ```
50
+
51
+ **Aynı hata, aynı sebep.** Bir Ubuntu kullanıcısı bu mesajı okuyup komutu
52
+ çalıştırırsa yine reddedilir — ve bu sefer aracın kendi ağzından yanlış bir
53
+ tavsiye almış olur, ki README'den daha kötüdür.
54
+
55
+ **Neden hemen düzeltilmedi:** README GitHub'da anında güncellenir; koddaki
56
+ mesaj **paketin içinde ships**, yani düzeltmek yeni bir PyPI sürümü gerektirir
57
+ (`1.0.1`, yeni tag, yeni yayın). Bu yüzden bekleyen iş olarak buraya yazıldı.
58
+
59
+ **Bir sonraki sürümde yapılacak:**
60
+
61
+ - `src/sift/server.py` → `NO_MCP` mesajındaki `pip install "sift-cli[mcp]"`
62
+ satırı `uv tool install "sift-cli[mcp]"` olacak, ve altına *"or `pipx`; plain
63
+ `pip` is refused by Debian/Ubuntu/WSL"* notu düşülecek
64
+ - `test/test_server.py` → `test_and_the_test_above_would_have_noticed` o dizgeyi
65
+ arıyor, birlikte güncellenecek
66
+ - `test/mutations.py` → aynı dizgeyi çapa olarak kullanan mutasyon var
67
+
68
+ Üçü aynı cümleye bağlı; biri değişirse üçü de değişmeli.
69
+
70
+ **Yapıldı — 9 Eylül 2026, sürüm 1.0.1** (`tanitim/T1-SURUM-1-0-1.md`).
71
+
72
+ ## Kurulumun geri kalanı çalıştı
73
+
74
+ | adım | sonuç |
75
+ |---|---|
76
+ | `uv tool install "sift-cli[mcp]"` | `sift` ve `sift-mcp` PATH'te |
77
+ | Anahtar (`~/.config/nvidia/api_key`) | Kendiliğinden bulundu |
78
+ | `claude mcp add --scope user sift -- sift-mcp` | `✔ Connected` |
79
+ | İstemci gibi konuşma | 7 araç listelendi, 120 satır → 6 satır |
80
+
81
+ ## İki not, ikisi de kullanıcı deneyimi hakkında
82
+
83
+ **PyPI sayfası okunamıyor.** Bir asistan `pypi.org/project/sift-cli/` adresini
84
+ çekmeye çalışınca JavaScript hatası alıyor. İkinci hamle README'nin ham hâli
85
+ oluyor ve o çalışıyor. Yani **README, PyPI açıklaması değil, gerçek giriş
86
+ kapısı** — orada eksik olan hiçbir yerde telafi edilmiyor.
87
+
88
+ **Döngüyü asistan kapatamıyor.** İki adım insan gerektiriyor: NVIDIA anahtarını
89
+ almak (tarayıcıda kayıt, OAuth akışı yok) ve istemciyi yeniden başlatmak (MCP
90
+ sunucuları yalnız oturum açılışında bağlanır). Kurulumun tamamı otomatikleşemez,
91
+ ve bu bir kusur değil — ama tanıtımda bunun yazılması gerekir, yoksa "iki
92
+ komutla kurulur" diyen her metin yanlış olur.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sift-cli"
7
- version = "1.0.0"
7
+ version = "1.0.1"
8
8
  description = "Runs your command, then gives the model only the lines that matter."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -15,4 +15,4 @@ reply that makes no sense -- each of these falls back to rules that need none of
15
15
  them. A tool that drops output to save context has cost more than it saved.
16
16
  """
17
17
 
18
- __version__ = "1.0.0"
18
+ __version__ = "1.0.1"
@@ -29,14 +29,17 @@ import time
29
29
  try:
30
30
  from mcp.server.mcpserver import MCPServer
31
31
  except ImportError as exc:
32
- # A sentence, not a stack. `pip install sift-cli` brings nothing with it on
32
+ # A sentence, not a stack. Installing `sift-cli` brings nothing with it on
33
33
  # purpose -- somebody who wants the command line should not be made to carry
34
34
  # a protocol library for it -- so arriving here is an ordinary thing to do
35
35
  # wrong, and the client that started this shows whatever comes out of it.
36
36
  raise SystemExit(
37
37
  "sift-mcp: the server half needs one more package.\n"
38
38
  "\n"
39
- ' pip install "sift-cli[mcp]"\n'
39
+ ' uv tool install "sift-cli[mcp]"\n'
40
+ "\n"
41
+ "(or pipx. Plain `pip` is refused by Debian, Ubuntu and WSL, which\n"
42
+ "protect the system Python -- and they are right to.)\n"
40
43
  "\n"
41
44
  "The command line (`sift`) is already installed and works without it."
42
45
  ) from exc
@@ -0,0 +1,146 @@
1
+ # İŞ 1 — Popülerlik planı
2
+
3
+ ## Sorun, olduğu gibi
4
+
5
+ `sift-cli` 8 Eylül 2026'da yayınlandı. Bugün itibarıyla:
6
+
7
+ | kanal | durum |
8
+ |---|---|
9
+ | Modelin eğitim verisi | Paket bir günlük. **Hiçbir model bilmiyor, bilemez** |
10
+ | GitHub | **0 yıldız, 0 topic** |
11
+ | PyPI | Yayında, ama adıyla aranmadıkça bulunmaz |
12
+ | Resmî MCP kayıt defteri | **Kayıtlı değil** |
13
+ | Dizinler (mcp.so, Glama, PulseMCP, Smithery) | Hiçbirinde yok |
14
+ | awesome-mcp-servers | Yok |
15
+
16
+ **Keşfedilebilirlik sıfır.** Bu bir kod sorunu değil; kod çalışıyor, 639 test
17
+ yeşil, üç platformda CI geçiyor. Sorun dağıtım.
18
+
19
+ ## Ölçüt
20
+
21
+ Bu işin başarısı yıldız sayısıyla değil, **bir yabancının sift'e ulaşabileceği
22
+ yolların sayısıyla** ölçülür. Bugün sıfır. Hedef: bir asistanın "bağlam israfı"
23
+ sorununu duyduğunda sift'i **bulabileceği** en az beş bağımsız yol.
24
+
25
+ Yıldız ve indirme sayısı sonuç, hedef değil. Onları takip edeceğiz ama
26
+ kovalamayacağız.
27
+
28
+ ## Fazlar
29
+
30
+ Her faz kendi başına bitmiş sayılır ve doğrulanabilir bir çıktısı vardır.
31
+
32
+ | # | Faz | Ne biter | Durum |
33
+ |---|-----|----------|---|
34
+ | T1 | Sürüm 1.0.1 | Kayıt defterinin şart koştuğu `mcp-name` işareti + bekleyen kod düzeltmesi, PyPI'da | bekliyor |
35
+ | T2 | Resmî kayıt defteri | `server.json`, `registry.modelcontextprotocol.io`'da yayında | bekliyor |
36
+ | T3 | GitHub keşfedilebilirliği | topics, açıklama, sürüm notu | bekliyor |
37
+ | T4 | Dizinler | mcp.so, PulseMCP, Glama, Smithery | bekliyor |
38
+ | T5 | awesome-mcp-servers | PR açık | bekliyor |
39
+ | T6 | README konumlandırma | Problem, insanların aradığı kelimelerle anılıyor | bekliyor |
40
+ | T7 | Sürekli araştırma | `ARASTIRMA.md` güncel, yeni kanallar izleniyor | sürekli |
41
+
42
+ ---
43
+
44
+ ## T1 — Sürüm 1.0.1
45
+
46
+ **Neden ilk:** Resmî kayıt defteri PyPI sahipliğini **paketin README'sinden**
47
+ doğruluyor. Aranan dize:
48
+
49
+ ```
50
+ mcp-name: io.github.slymnysr/sift
51
+ ```
52
+
53
+ HTML yorumu içinde olabilir, ama **yayınlanmış pakette bulunmak zorunda.**
54
+ 1.0.0'da yok. Yani T2 T1'siz yapılamaz.
55
+
56
+ Aynı sürümde bekleyen bir düzeltme daha var (`notlar/28-KURULUM.md`):
57
+ `server.py`'deki eksik-eklenti mesajı hâlâ `pip install "sift-cli[mcp]"` diyor
58
+ ve o komut Debian/Ubuntu/WSL'de reddediliyor.
59
+
60
+ **Yapılacaklar**
61
+ - README'ye `mcp-name` işareti
62
+ - `server.py` → `NO_MCP` mesajı `uv tool install`'a
63
+ - `test_server.py` ve `mutations.py` aynı dizgeye bağlı, birlikte güncellenecek
64
+ - `pyproject.toml` sürüm 1.0.1
65
+ - Tag `v1.0.1`, CI yeşil, PyPI'da
66
+
67
+ **Bitti sayılır:** PyPI'daki 1.0.1 açıklamasında `mcp-name` dizesi görünüyor.
68
+
69
+ ## T2 — Resmî MCP kayıt defteri
70
+
71
+ **Neden en önemlisi:** İstemciler oradan okuyor. Bir modelin sift'i "bilmesinin"
72
+ gerçekçi tek yolu bu — eğitim verisine giremeyecek kadar yeni, ama kayıt defteri
73
+ canlı sorgulanıyor.
74
+
75
+ **Yapılacaklar**
76
+ - `server.json`: ad `io.github.slymnysr/sift`, PyPI paketi `sift-cli`, taşıma
77
+ `stdio`, `runtimeHint` olarak `uvx`
78
+ - `mcp-publisher` ile giriş: **`github-oidc`** tercih edilir — GitHub Action
79
+ içinden, interaktif tarayıcı akışı olmadan. Alternatif: `login github`
80
+ - Yayınla, `registry.modelcontextprotocol.io` üzerinden doğrula
81
+
82
+ **Bitti sayılır:** Kayıt defteri API'si `io.github.slymnysr/sift`'i döndürüyor.
83
+
84
+ ## T3 — GitHub keşfedilebilirliği
85
+
86
+ Beş dakikalık iş, aramada büyük fark.
87
+
88
+ - **Topics**: `mcp`, `mcp-server`, `claude`, `claude-code`, `llm`,
89
+ `context-management`, `cli`, `python`, `token-optimization`
90
+ - Depo açıklaması ve website alanı (PyPI bağlantısı)
91
+ - `v1.0.1` için GitHub Release notu — tag var ama release sayfası yok
92
+
93
+ **Bitti sayılır:** `gh repo view` topics'i döndürüyor, Releases sayfası dolu.
94
+
95
+ ## T4 — Dizinler
96
+
97
+ Dördü de üçüncü taraf, hepsi ayrı gönderim:
98
+
99
+ | dizin | yol | not |
100
+ |---|---|---|
101
+ | mcp.so | Submit düğmesi ya da GitHub issue | ~20.000 sunucu, en büyük toplayıcı |
102
+ | PulseMCP | Gezinti çubuğunda Submit | Haftalık ziyaretçi sayısı gösteriyor |
103
+ | Glama | Form, elle inceleniyor | ~37.000 sunucu izliyor, metakayıt |
104
+ | Smithery | CLI/hosted | MCP'nin Docker Hub'ı sayılıyor |
105
+
106
+ Bunların çoğu ekosistemi **tarıyor** ve sahiplik talep etmene izin veriyor —
107
+ yani T2 bittiğinde bazıları kendiliğinden görünebilir. Yine de elle göndermek
108
+ bekleme süresini kısaltır.
109
+
110
+ **Bitti sayılır:** Dördünde de gönderim yapıldı, kabul edilenler kayıtlı.
111
+
112
+ ## T5 — awesome-mcp-servers
113
+
114
+ `punkpeye/awesome-mcp-servers` — PR ile eklenir. Şart: README, açık açıklama,
115
+ çalışan kurulum talimatı. Üçü de var.
116
+
117
+ **Bitti sayılır:** PR açık ve bağlantısı kayıtlı.
118
+
119
+ ## T6 — README konumlandırma
120
+
121
+ Şu an README "Runs your command, then gives the model only the lines that
122
+ matter." diye başlıyor — doğru ama **kimsenin aramadığı** bir cümle.
123
+
124
+ İnsanların aradığı: *MCP token waste*, *tool output floods context*, *reduce
125
+ Claude context usage*, *agent context window full*, *MCP token optimization*.
126
+
127
+ Bu kelimeler README'de geçmiyor. Geçmeli — ama **abartmadan ve ölçümle**:
128
+ elimizde 404 satır → 7 satır, %97,6 daha az token, 0 uydurma satır gibi
129
+ gerçek sayılar var. Pazarlama dili değil, ölçüm dili.
130
+
131
+ **Bitti sayılır:** README'nin ilk ekranı problemi arama terimleriyle adlandırıyor
132
+ ve ölçülmüş bir sayı gösteriyor.
133
+
134
+ ## T7 — Sürekli araştırma
135
+
136
+ `ARASTIRMA.md` bu işin hafızası. Her yeni kanal, her ret, her ölçüm oraya
137
+ yazılır. Amaç: altı ay sonra "bunu denemiş miydik" sorusunun cevabı olsun.
138
+
139
+ ---
140
+
141
+ ## Bu planın kuralı
142
+
143
+ **Hiçbir fazda abartı yok.** sift'in ölçülmüş sayıları var; onları söylemek
144
+ yeterli. Olmayan bir şeyi iddia etmek — "en iyi", "devrim niteliğinde", uydurma
145
+ kıyaslar — hem yanlış hem de bu projenin bütün duruşuna aykırı: araç, kaybedecek
146
+ bir şeyi olmadığı için güvenilir. Tanıtımı da öyle olmalı.
@@ -0,0 +1,139 @@
1
+ # Araştırma özeti — MCP ekosisteminde keşfedilebilirlik
2
+
3
+ Bu dosya İŞ 1'in hafızası. Her yeni bulgu, her ret, her ölçüm buraya yazılır.
4
+ Amacı altı ay sonra "bunu denemiş miydik" sorusunu cevaplamak.
5
+
6
+ **Son güncelleme:** 9 Eylül 2026
7
+
8
+ ---
9
+
10
+ ## 1. Resmî MCP kayıt defteri
11
+
12
+ **Adres:** `registry.modelcontextprotocol.io` — Eylül 2025'te önizlemede
13
+ başladı, hâlâ önizleme (kırılgan değişiklik ve veri sıfırlaması olabilir).
14
+
15
+ **Neden en önemli kanal:** İstemciler buradan okuyor ve **canlı sorgulanıyor.**
16
+ Bir modelin eğitim verisine giremeyecek kadar yeni bir paketin bulunabilmesinin
17
+ tek gerçekçi yolu bu.
18
+
19
+ ### Yayınlama mekaniği
20
+
21
+ `mcp-publisher` adlı CLI ile. Komutlar: `init`, `login`, `publish`, `status`,
22
+ `validate`, `logout`.
23
+
24
+ **Kimlik doğrulama sağlayıcıları:**
25
+
26
+ | sağlayıcı | ne için |
27
+ |---|---|
28
+ | `github` | Etkileşimli OAuth (tarayıcı) |
29
+ | **`github-oidc`** | **CI/CD — GitHub Actions içinden, tarayıcısız** |
30
+ | `dns` / `http` | Alan adı doğrulama (kendi alan adın varsa) |
31
+ | `none` | Yalnız yerel test |
32
+
33
+ `github-oidc` bizim için doğru olan: yayın CI'dan yapılabilir, elle adım kalmaz.
34
+
35
+ ### İsim alanı
36
+
37
+ `io.github.<kullanıcı>/<ad>` — GitHub hesabıyla kanıtlanıyor. Bizimki:
38
+ **`io.github.slymnysr/sift`**
39
+
40
+ Alan adı isim alanı (`com.example/...`) DNS TXT kaydı ya da HTTPS uç noktası
41
+ istiyor; bizim alan adımız yok, GitHub isim alanı yeterli.
42
+
43
+ ### PyPI sahiplik doğrulaması — kritik
44
+
45
+ Kayıt defteri, PyPI paketinin **README'sinde** (PyPI'da açıklama olarak
46
+ görünen metin) şu dizeyi arıyor:
47
+
48
+ ```
49
+ mcp-name: io.github.slymnysr/sift
50
+ ```
51
+
52
+ HTML yorumu içinde gizlenebilir:
53
+
54
+ ```markdown
55
+ <!-- mcp-name: io.github.slymnysr/sift -->
56
+ ```
57
+
58
+ **Sonucu:** README paketin içinde yayınlandığı için, bu işaret olmadan
59
+ yayınlanmış bir sürüm doğrulanamaz. **1.0.0'da yok → yeni sürüm şart.**
60
+
61
+ > Not: crates.io HTML yorumlarını siliyor, orada görünür metin gerekiyor.
62
+ > PyPI ve NuGet yorumu koruyor. Bizde sorun yok.
63
+
64
+ ### Diğer kısıtlar
65
+
66
+ - Yalnız güvenilen kayıtlar: PyPI için **yalnız `pypi.org`**
67
+ - `_meta` içinde yalnız `io.modelcontextprotocol.registry/publisher-provided`
68
+ anahtarı korunuyor, 4 KB sınırı
69
+ - Şema: `https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json`
70
+
71
+ ---
72
+
73
+ ## 2. Üçüncü taraf dizinler
74
+
75
+ Dördü de ayrı gönderim ister; çoğu ekosistemi **tarıyor** ve sonradan sahiplik
76
+ talep etmene izin veriyor.
77
+
78
+ | dizin | ölçek | gönderim |
79
+ |---|---|---|
80
+ | **Glama** (`glama.ai/mcp`) | ~37.000 sunucu (2026 ortası) | Form, elle inceleme. Metakayıt — Anthropic, GitHub, PulseMCP, Microsoft besliyor |
81
+ | **mcp.so** | ~20.000 sunucu | Sitedeki Submit ya da GitHub issue |
82
+ | **Smithery** (`smithery.ai`) | 7.000+ | "MCP'nin Docker Hub'ı"; yerel CLI kurulumu ya da barındırılan uzak sunucu |
83
+ | **PulseMCP** | — | Gezinti çubuğunda Submit. **Haftalık ziyaretçi sayısı gösteriyor** — tek yerde bulunan bir veri |
84
+
85
+ PulseMCP'nin ziyaretçi sayacı bizim için ayrıca değerli: tanıtımın işe yarayıp
86
+ yaramadığını ölçebileceğimiz nadir bir dış gösterge.
87
+
88
+ ---
89
+
90
+ ## 3. awesome-mcp-servers
91
+
92
+ `punkpeye/awesome-mcp-servers` — GitHub'da PR ile eklenir.
93
+
94
+ **Şartlar:** README, açık bir açıklama, çalışan kurulum talimatı. Üçü de bizde
95
+ var (kurulum talimatı 28. fazda düzeltildi).
96
+
97
+ ---
98
+
99
+ ## 4. Henüz araştırılmamış / açık sorular
100
+
101
+ - **Reddit `r/ClaudeAI`, `r/mcp`** — norm ne, kendi projesini paylaşmak hoş
102
+ karşılanıyor mu, hangi biçimde
103
+ - **Hacker News** — "Show HN" eşiği; erken paylaşım bir kez yakılan bir kart
104
+ - **dev.to / Medium yazısı** — ölçüm tablosu iyi bir yazı konusu olabilir:
105
+ "aynı işi sift'li ve sift'siz ölçtük"
106
+ - **MCP istemcileri** — Claude Code dışında hangi istemciler kayıt defterinden
107
+ okuyor (Cursor, Windsurf, Zed, Cline?) ve ayrı gönderim istiyorlar mı
108
+ - **GitHub Release** sayfasının keşfedilebilirliğe etkisi
109
+ - **PyPI sayfasının okunamaması** — `pypi.org/project/sift-cli/` JavaScript
110
+ hatası veriyor, bir asistan çekmeye çalışınca boş dönüyor. README ham hâli
111
+ çalışıyor. Bu, PyPI açıklamasının bir asistan için işe yaramadığı anlamına
112
+ gelebilir — doğrulanmalı
113
+
114
+ ---
115
+
116
+ ## 5. Ölçüm — bugünün taban çizgisi
117
+
118
+ | gösterge | 9 Eylül 2026 |
119
+ |---|---|
120
+ | GitHub yıldız | 0 |
121
+ | GitHub topics | 0 |
122
+ | PyPI sürüm | 1.0.0 |
123
+ | PyPI indirme | (ölçülmedi) |
124
+ | Kayıt defteri | kayıtlı değil |
125
+ | Dizin | 0/4 |
126
+
127
+ Sonraki ölçümler buraya eklenecek.
128
+
129
+ ---
130
+
131
+ ## Kaynaklar
132
+
133
+ - [Introducing the MCP Registry — MCP Blog](https://blog.modelcontextprotocol.io/posts/2025-09-08-mcp-registry-preview/)
134
+ - [modelcontextprotocol/registry (GitHub)](https://github.com/modelcontextprotocol/registry)
135
+ - [MCP Registry — Package Types](https://modelcontextprotocol.io/registry/package-types)
136
+ - [Official Registry server.json Requirements](https://github.com/modelcontextprotocol/registry/blob/main/docs/reference/server-json/official-registry-requirements.md)
137
+ - [How to list your MCP server — Tallyfy](https://tallyfy.com/how-to-list-mcp-server-registry-smithery-glama-pulsemcp/)
138
+ - [Best MCP Registries in 2026 — TrueFoundry](https://www.truefoundry.com/blog/best-mcp-registries)
139
+ - [MCP Server Directories — DYNO Mapper](https://dynomapper.com/blog/ai/mcp-server-directories/)
@@ -0,0 +1,50 @@
1
+ # T1 — Sürüm 1.0.1
2
+
3
+ **Tarih:** 9 Eylül 2026
4
+ **Durum:** bitti
5
+
6
+ ## Neden bir sürüm daha
7
+
8
+ İki ayrı iş aynı yayına bindi.
9
+
10
+ **Birincisi kayıt defteri.** `registry.modelcontextprotocol.io`, PyPI
11
+ sahipliğini paketin **açıklamasından** doğruluyor: yayınlanmış sürümün
12
+ `long_description`'ında `mcp-name: io.github.slymnysr/sift` dizesi geçmek
13
+ zorunda. 1.0.0'da geçmiyordu. README GitHub'da anında değişir ama PyPI'daki
14
+ açıklama sürümün içinde donmuştur — yani T2 yeni bir sürüm olmadan yapılamazdı.
15
+
16
+ **İkincisi 28. fazdan kalan borç.** `sift-mcp`, `mcp` eklentisi olmadan
17
+ çalıştırıldığında kullanıcıya `pip install "sift-cli[mcp]"` diyordu. O komut
18
+ Debian, Ubuntu ve WSL'de PEP 668 gereği reddediliyor. README düzeltilmişti;
19
+ mesaj paketin içinde ships ettiği için kodda bekliyordu.
20
+
21
+ ## Yapılan
22
+
23
+ | dosya | değişiklik |
24
+ |---|---|
25
+ | `README.md` | Başlığın altına `<!-- mcp-name: io.github.slymnysr/sift -->` |
26
+ | `src/sift/server.py` | `pip install` → `uv tool install`, altına `pip`in neden reddedildiği |
27
+ | `test/test_server.py` | Aynı dizgeyi arayan iddia; ayrıca "çalışmayan komut verilmemeli" kontrolü |
28
+ | `test/mutations.py` | Aynı dizgeyi çapa olarak kullanan mutasyon |
29
+ | `pyproject.toml`, `src/sift/__init__.py` | 1.0.0 → 1.0.1 |
30
+
31
+ Beşi de aynı cümleye bağlıydı; `test_package.py` zaten sürümün iki yerde
32
+ uyuşmasını istiyor, o yüzden `__init__.py`'yi unutmak testte anında yakalandı.
33
+
34
+ ## İşaret gerçekten pakete girdi mi
35
+
36
+ Yorum satırı olduğu için gözle görünmüyor; bu yüzden yayından önce paketin
37
+ kendisinden okundu:
38
+
39
+ ```
40
+ sdist PKG-INFO Description-Content-Type: text/markdown
41
+ sdist isaret var mi: True version: 1.0.1
42
+ wheel isaret var mi: True version: 1.0.1
43
+ ```
44
+
45
+ PyPI açıklaması bu `Description` alanından üretiliyor. crates.io HTML yorumlarını
46
+ siliyor, PyPI korumuyor — bizde sorun yok.
47
+
48
+ ## Bitti sayılır
49
+
50
+ Plandaki ölçüt: *PyPI'daki 1.0.1 açıklamasında `mcp-name` dizesi görünüyor.*
@@ -813,7 +813,7 @@ MUTATIONS = [
813
813
  Mutation(
814
814
  "server.py",
815
815
  "a missing extra is answered with the command that fixes it",
816
- ' \' pip install "sift-cli[mcp]"\\n\'',
816
+ ' \' uv tool install "sift-cli[mcp]"\\n\'',
817
817
  ' "\\n"',
818
818
  ),
819
819
  Mutation(
@@ -262,7 +262,8 @@ def test_and_the_test_above_would_have_noticed():
262
262
  finished = _without_mcp("import sift.server\n")
263
263
 
264
264
  assert finished.returncode != 0
265
- assert 'pip install "sift-cli[mcp]"' in finished.stderr
265
+ assert 'uv tool install "sift-cli[mcp]"' in finished.stderr
266
+ assert "Plain `pip` is refused" in finished.stderr, "calismayan komut verilmemeli"
266
267
  assert "Traceback" not in finished.stderr
267
268
  assert "`sift`) is already installed" in finished.stderr
268
269
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes