turnloop 0.1.8__tar.gz → 0.1.9__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 (160) hide show
  1. {turnloop-0.1.8 → turnloop-0.1.9}/PKG-INFO +12 -4
  2. {turnloop-0.1.8 → turnloop-0.1.9}/README.md +11 -3
  3. {turnloop-0.1.8 → turnloop-0.1.9}/pyproject.toml +9 -1
  4. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/__init__.py +1 -1
  5. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/agent/system_prompt.py +5 -0
  6. turnloop-0.1.8/.github/workflows/ci.yml +0 -36
  7. turnloop-0.1.8/.turnloop/.gitignore +0 -2
  8. turnloop-0.1.8/.turnloop/settings.local.json +0 -3
  9. {turnloop-0.1.8 → turnloop-0.1.9}/.gitignore +0 -0
  10. {turnloop-0.1.8 → turnloop-0.1.9}/tests/conftest.py +0 -0
  11. {turnloop-0.1.8 → turnloop-0.1.9}/tests/fixtures/anthropic_tool_call.sse +0 -0
  12. {turnloop-0.1.8 → turnloop-0.1.9}/tests/fixtures/glm_tool_call.sse +0 -0
  13. {turnloop-0.1.8 → turnloop-0.1.9}/tests/fixtures/mcp_echo_server.py +0 -0
  14. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_bash.py +0 -0
  15. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_compaction.py +0 -0
  16. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_config.py +0 -0
  17. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_config_screen.py +0 -0
  18. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_configio.py +0 -0
  19. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_experiments.py +0 -0
  20. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_hooks_mcp_commands.py +0 -0
  21. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_loop.py +0 -0
  22. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_permissions.py +0 -0
  23. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_providers.py +0 -0
  24. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_skills_install.py +0 -0
  25. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_system_prompt_layout.py +0 -0
  26. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_tools_files.py +0 -0
  27. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_tui.py +0 -0
  28. {turnloop-0.1.8 → turnloop-0.1.9}/tests/test_websearch.py +0 -0
  29. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/__main__.py +0 -0
  30. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/agent/__init__.py +0 -0
  31. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/agent/factory.py +0 -0
  32. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/agent/headless.py +0 -0
  33. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/agent/loop.py +0 -0
  34. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/agent/subagent.py +0 -0
  35. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/cli.py +0 -0
  36. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/commands/__init__.py +0 -0
  37. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/commands/dispatch.py +0 -0
  38. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/commands/loader.py +0 -0
  39. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/config.py +0 -0
  40. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/configio.py +0 -0
  41. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/context/__init__.py +0 -0
  42. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/context/budget.py +0 -0
  43. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/context/compaction.py +0 -0
  44. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/context/memory.py +0 -0
  45. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/core/__init__.py +0 -0
  46. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/core/events.py +0 -0
  47. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/core/ids.py +0 -0
  48. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/core/messages.py +0 -0
  49. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/core/tokens.py +0 -0
  50. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/diagnostics.py +0 -0
  51. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/errors.py +0 -0
  52. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/__init__.py +0 -0
  53. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/bakeoff.yaml +0 -0
  54. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/ceiling-check.yaml +0 -0
  55. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/context-glm.yaml +0 -0
  56. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/context.yaml +0 -0
  57. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/glm-selfhosted.yaml +0 -0
  58. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/groq-free.yaml +0 -0
  59. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/hard-calibration.yaml +0 -0
  60. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/hard-glm.yaml +0 -0
  61. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/loop.yaml +0 -0
  62. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/nvidia-smoke.yaml +0 -0
  63. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/reliability.yaml +0 -0
  64. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/rewrite-calibration.yaml +0 -0
  65. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/configs/smoke.yaml +0 -0
  66. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/graders.py +0 -0
  67. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/report.py +0 -0
  68. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/runner.py +0 -0
  69. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/default.yaml +0 -0
  70. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/bulky/module_1.py +0 -0
  71. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/bulky/module_2.py +0 -0
  72. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/bulky/module_3.py +0 -0
  73. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/bulky/module_4.py +0 -0
  74. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/bulky/module_5.py +0 -0
  75. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/bulky/module_6.py +0 -0
  76. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/bulky/module_7.py +0 -0
  77. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/bulky/module_8.py +0 -0
  78. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/circular_import/models.py +0 -0
  79. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/circular_import/services.py +0 -0
  80. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/circular_import/test_cancel.py +0 -0
  81. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/cli_flag/app.py +0 -0
  82. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/cross_file_contract/decode.py +0 -0
  83. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/cross_file_contract/encode.py +0 -0
  84. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/cross_file_contract/test_roundtrip.py +0 -0
  85. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/cross_file_contract/test_wire_format.py +0 -0
  86. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/empty/.keep +0 -0
  87. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/failing_test/calc.py +0 -0
  88. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/failing_test/test_calc.py +0 -0
  89. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/generate_bulky.py +0 -0
  90. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/grep_edit/ingest.py +0 -0
  91. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/grep_edit/load.py +0 -0
  92. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/grep_edit/transform.py +0 -0
  93. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/misleading_traceback/checkout.py +0 -0
  94. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/misleading_traceback/invoice.py +0 -0
  95. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/misleading_traceback/pricing.py +0 -0
  96. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/misleading_traceback/test_checkout.py +0 -0
  97. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/misleading_traceback/test_invoice.py +0 -0
  98. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/needle/inventory.py +0 -0
  99. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/needle/pricing.py +0 -0
  100. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/needle/shipping.py +0 -0
  101. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/regression_trap/test_validators.py +0 -0
  102. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/regression_trap/validators.py +0 -0
  103. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/rename/billing.py +0 -0
  104. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/rename/report.py +0 -0
  105. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/rename/test_billing.py +0 -0
  106. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/spec/parser.py +0 -0
  107. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/spec/test_parser.py +0 -0
  108. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/subtle_spec_edge/leaderboard.py +0 -0
  109. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/subtle_spec_edge/test_leaderboard.py +0 -0
  110. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/experiments/suite/fixtures/util/util.py +0 -0
  111. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/hooks/__init__.py +0 -0
  112. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/hooks/runner.py +0 -0
  113. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/mcp/__init__.py +0 -0
  114. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/mcp/adapter.py +0 -0
  115. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/mcp/client.py +0 -0
  116. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/permissions/__init__.py +0 -0
  117. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/permissions/engine.py +0 -0
  118. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/permissions/rules.py +0 -0
  119. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/providers/__init__.py +0 -0
  120. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/providers/anthropic.py +0 -0
  121. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/providers/base.py +0 -0
  122. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/providers/gemini.py +0 -0
  123. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/providers/mock.py +0 -0
  124. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/providers/openai_compat.py +0 -0
  125. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/providers/pricing.py +0 -0
  126. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/providers/registry.py +0 -0
  127. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/providers/sse.py +0 -0
  128. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/sessions/__init__.py +0 -0
  129. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/sessions/models.py +0 -0
  130. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/sessions/store.py +0 -0
  131. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/skills_install.py +0 -0
  132. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/__init__.py +0 -0
  133. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/ask.py +0 -0
  134. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/base.py +0 -0
  135. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/bash.py +0 -0
  136. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/builtin.py +0 -0
  137. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/edit.py +0 -0
  138. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/glob.py +0 -0
  139. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/grep.py +0 -0
  140. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/read.py +0 -0
  141. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/runner.py +0 -0
  142. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/shell.py +0 -0
  143. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/skill.py +0 -0
  144. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/task.py +0 -0
  145. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/textio.py +0 -0
  146. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/todo.py +0 -0
  147. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/webfetch.py +0 -0
  148. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/websearch.py +0 -0
  149. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tools/write.py +0 -0
  150. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tui/__init__.py +0 -0
  151. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tui/app.py +0 -0
  152. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tui/app.tcss +0 -0
  153. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tui/bridge.py +0 -0
  154. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tui/config_screen.py +0 -0
  155. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tui/mcp_screen.py +0 -0
  156. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tui/session_screen.py +0 -0
  157. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tui/widgets/__init__.py +0 -0
  158. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tui/widgets/permission.py +0 -0
  159. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tui/widgets/status.py +0 -0
  160. {turnloop-0.1.8 → turnloop-0.1.9}/turnloop/tui/widgets/transcript.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: turnloop
3
- Version: 0.1.8
3
+ Version: 0.1.9
4
4
  Summary: A local-first agentic coding harness: streaming tool loop, permission gating, context compaction, subagents, and any LLM provider.
5
5
  Project-URL: Homepage, https://github.com/Pranesh-2005/turnloop
6
6
  Author: Pranesh
@@ -117,7 +117,7 @@ point.
117
117
  Verify:
118
118
 
119
119
  ```bash
120
- tl --version # turnloop 0.1.8
120
+ tl --version # turnloop 0.1.9
121
121
  tl doctor # every provider, key presence, shell, context budget
122
122
  ```
123
123
 
@@ -1092,11 +1092,19 @@ in the system prompt and load their body on demand, which on a 65k window is the
1092
1092
  difference between having skills and not.
1093
1093
 
1094
1094
  The system prompt also documents this layout to the model itself, as `CONFIG_LAYOUT`
1095
- — 326 tokens, in the cacheable region, omitted from the `minimal` variant. Without it
1095
+ — 432 tokens, in the cacheable region, omitted from the `minimal` variant. Without it
1096
1096
  the model cannot configure the tool it is running inside: asked to add an MCP server
1097
1097
  it invented `.turnloop/turnloop.config.json`, and asked to install a skill it wrote to
1098
1098
  `examples/` — both real outputs from live runs. With it, both go to the right place
1099
- first try. It includes the literal YAML frontmatter a skill needs, since a skill with
1099
+ first try.
1100
+
1101
+ It also names `tl skills add` explicitly and tells the model *not* to run the install
1102
+ scripts skill repos publish for other agents. That paragraph was added after watching
1103
+ three separate sessions try `/plugin marketplace add` as a shell command, then
1104
+ `clawhub install`, then `git clone` plus `npm install` plus `npm test` — twenty-six
1105
+ messages ending in "the ponytail skill has been installed", when nothing had been put
1106
+ anywhere turnloop looks. The same request now costs 11,090 tokens and answers
1107
+ `tl skills add DietrichGebert/ponytail`. It includes the literal YAML frontmatter a skill needs, since a skill with
1100
1108
  markdown-bold frontmatter instead of YAML used to vanish with no diagnostic; `/skills`
1101
1109
  now also reports anything found on disk but rejected, with the reason and path — see
1102
1110
  [Bugs worth reading about](#bugs-worth-reading-about).
@@ -88,7 +88,7 @@ point.
88
88
  Verify:
89
89
 
90
90
  ```bash
91
- tl --version # turnloop 0.1.8
91
+ tl --version # turnloop 0.1.9
92
92
  tl doctor # every provider, key presence, shell, context budget
93
93
  ```
94
94
 
@@ -1063,11 +1063,19 @@ in the system prompt and load their body on demand, which on a 65k window is the
1063
1063
  difference between having skills and not.
1064
1064
 
1065
1065
  The system prompt also documents this layout to the model itself, as `CONFIG_LAYOUT`
1066
- — 326 tokens, in the cacheable region, omitted from the `minimal` variant. Without it
1066
+ — 432 tokens, in the cacheable region, omitted from the `minimal` variant. Without it
1067
1067
  the model cannot configure the tool it is running inside: asked to add an MCP server
1068
1068
  it invented `.turnloop/turnloop.config.json`, and asked to install a skill it wrote to
1069
1069
  `examples/` — both real outputs from live runs. With it, both go to the right place
1070
- first try. It includes the literal YAML frontmatter a skill needs, since a skill with
1070
+ first try.
1071
+
1072
+ It also names `tl skills add` explicitly and tells the model *not* to run the install
1073
+ scripts skill repos publish for other agents. That paragraph was added after watching
1074
+ three separate sessions try `/plugin marketplace add` as a shell command, then
1075
+ `clawhub install`, then `git clone` plus `npm install` plus `npm test` — twenty-six
1076
+ messages ending in "the ponytail skill has been installed", when nothing had been put
1077
+ anywhere turnloop looks. The same request now costs 11,090 tokens and answers
1078
+ `tl skills add DietrichGebert/ponytail`. It includes the literal YAML frontmatter a skill needs, since a skill with
1071
1079
  markdown-bold frontmatter instead of YAML used to vanish with no diagnostic; `/skills`
1072
1080
  now also reports anything found on disk but rejected, with the reason and path — see
1073
1081
  [Bugs worth reading about](#bugs-worth-reading-about).
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "turnloop"
7
- version = "0.1.8"
7
+ version = "0.1.9"
8
8
  description = "A local-first agentic coding harness: streaming tool loop, permission gating, context compaction, subagents, and any LLM provider."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -54,6 +54,14 @@ Homepage = "https://github.com/Pranesh-2005/turnloop"
54
54
  [tool.hatch.build.targets.wheel]
55
55
  packages = ["turnloop"]
56
56
 
57
+ # Without an explicit include, the sdist sweeps up whatever happens to be sitting
58
+ # in the working tree. A stray `git clone` left behind by a failed skill install
59
+ # put 157 of 317 entries — 4.2 MB of an unrelated repository — into the 0.1.8
60
+ # sdist before this was pinned down. An allowlist fails closed: new junk is not
61
+ # published, and a genuinely new top-level path has to be added here on purpose.
62
+ [tool.hatch.build.targets.sdist]
63
+ include = ["turnloop", "tests", "README.md", "pyproject.toml", "LICENSE"]
64
+
57
65
  [tool.ruff]
58
66
  line-length = 100
59
67
  target-version = "py311"
@@ -1,3 +1,3 @@
1
1
  """turnloop — a local-first agentic coding harness."""
2
2
 
3
- __version__ = "0.1.8"
3
+ __version__ = "0.1.9"
@@ -114,6 +114,11 @@ Frontmatter is YAML, not markdown, and needs `description` or it is dropped \
114
114
  name: my-skill
115
115
  description: one line the model uses to decide when to load this
116
116
  ---
117
+ Installing one is the user's job, not yours: `tl skills add <owner/repo>` \
118
+ fetches and validates a SKILL.md, and `tl skills import` adopts skills already \
119
+ on the machine. Skill repos publish install scripts for other agents \
120
+ (`/plugin ...`, `clawhub`, `npm install`) — none of those put anything where \
121
+ turnloop looks, so never run them. Point the user at `tl skills add` instead.
117
122
  """
118
123
 
119
124
  PLAN_MODE = """\
@@ -1,36 +0,0 @@
1
- name: ci
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
-
8
- jobs:
9
- test:
10
- strategy:
11
- fail-fast: false
12
- matrix:
13
- # Windows is not optional here: shell resolution and process-tree kill are
14
- # platform-specific and are exactly where this project's bugs live.
15
- os: [ubuntu-latest, windows-latest]
16
- python: ["3.11", "3.13"]
17
- runs-on: ${{ matrix.os }}
18
- steps:
19
- - uses: actions/checkout@v5
20
-
21
- - uses: actions/setup-python@v6
22
- with:
23
- python-version: ${{ matrix.python }}
24
-
25
- - run: pip install -e ".[dev]"
26
-
27
- - name: Tests
28
- # Network is blocked at the transport layer by conftest, so `not live` is
29
- # belt and braces rather than the only guard.
30
- run: pytest -m "not live"
31
-
32
- - name: Lint
33
- run: ruff check turnloop tests
34
-
35
- - name: Types
36
- run: mypy turnloop
@@ -1,2 +0,0 @@
1
- sessions/
2
- settings.local.json
@@ -1,3 +0,0 @@
1
- {
2
- "provider": "blaxel"
3
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes