llm-tool-cli 0.2.0__py3-none-any.whl

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 (111) hide show
  1. llm_tool_cli/__init__.py +0 -0
  2. llm_tool_cli/cli/__init__.py +1 -0
  3. llm_tool_cli/cli/application.py +31 -0
  4. llm_tool_cli/cli/commands/__init__.py +0 -0
  5. llm_tool_cli/cli/commands/initialization.py +36 -0
  6. llm_tool_cli/cli/commands/skills.py +25 -0
  7. llm_tool_cli/cli/commands/tests/__init__.py +0 -0
  8. llm_tool_cli/cli/commands/tests/test_initialization.py +130 -0
  9. llm_tool_cli/cli/commands/tests/test_skills.py +154 -0
  10. llm_tool_cli/cli/commands/tests/test_version.py +98 -0
  11. llm_tool_cli/cli/commands/version.py +17 -0
  12. llm_tool_cli/cli/context.py +39 -0
  13. llm_tool_cli/cli/entities.py +3 -0
  14. llm_tool_cli/cli/errors.py +15 -0
  15. llm_tool_cli/cli/handling.py +41 -0
  16. llm_tool_cli/cli/options.py +48 -0
  17. llm_tool_cli/cli/tests/__init__.py +0 -0
  18. llm_tool_cli/cli/tests/test_application.py +167 -0
  19. llm_tool_cli/cli/tests/test_context.py +179 -0
  20. llm_tool_cli/cli/tests/test_handling.py +230 -0
  21. llm_tool_cli/cli/tests/test_options.py +125 -0
  22. llm_tool_cli/config/__init__.py +33 -0
  23. llm_tool_cli/config/errors.py +92 -0
  24. llm_tool_cli/config/fields.py +39 -0
  25. llm_tool_cli/config/files.py +175 -0
  26. llm_tool_cli/config/project.py +87 -0
  27. llm_tool_cli/config/runtime.py +14 -0
  28. llm_tool_cli/config/tests/__init__.py +0 -0
  29. llm_tool_cli/config/tests/fixtures.py +34 -0
  30. llm_tool_cli/config/tests/test_fields.py +124 -0
  31. llm_tool_cli/config/tests/test_files.py +826 -0
  32. llm_tool_cli/config/tests/test_project.py +257 -0
  33. llm_tool_cli/core/__init__.py +1 -0
  34. llm_tool_cli/core/context.py +50 -0
  35. llm_tool_cli/core/entities.py +35 -0
  36. llm_tool_cli/core/errors.py +97 -0
  37. llm_tool_cli/core/result.py +118 -0
  38. llm_tool_cli/core/settings.py +37 -0
  39. llm_tool_cli/core/tests/__init__.py +0 -0
  40. llm_tool_cli/core/tests/fixtures.py +13 -0
  41. llm_tool_cli/core/tests/test_context.py +152 -0
  42. llm_tool_cli/core/tests/test_entities.py +65 -0
  43. llm_tool_cli/core/tests/test_errors.py +211 -0
  44. llm_tool_cli/core/tests/test_result.py +256 -0
  45. llm_tool_cli/core/tests/test_settings.py +64 -0
  46. llm_tool_cli/output/__init__.py +3 -0
  47. llm_tool_cli/output/emitter.py +108 -0
  48. llm_tool_cli/output/errors.py +21 -0
  49. llm_tool_cli/output/journal.py +66 -0
  50. llm_tool_cli/output/tests/__init__.py +0 -0
  51. llm_tool_cli/output/tests/helpers.py +29 -0
  52. llm_tool_cli/output/tests/test_emitter.py +406 -0
  53. llm_tool_cli/output/tests/test_journal.py +141 -0
  54. llm_tool_cli/paths/__init__.py +51 -0
  55. llm_tool_cli/paths/enumeration.py +72 -0
  56. llm_tool_cli/paths/errors.py +42 -0
  57. llm_tool_cli/paths/filesystem.py +164 -0
  58. llm_tool_cli/paths/globs.py +124 -0
  59. llm_tool_cli/paths/normalization.py +58 -0
  60. llm_tool_cli/paths/tests/__init__.py +0 -0
  61. llm_tool_cli/paths/tests/test_enumeration.py +229 -0
  62. llm_tool_cli/paths/tests/test_filesystem.py +778 -0
  63. llm_tool_cli/paths/tests/test_globs.py +137 -0
  64. llm_tool_cli/paths/tests/test_normalization.py +163 -0
  65. llm_tool_cli/protocol/__init__.py +4 -0
  66. llm_tool_cli/protocol/cell_shortcuts.py +39 -0
  67. llm_tool_cli/protocol/entities.py +7 -0
  68. llm_tool_cli/protocol/errors.py +21 -0
  69. llm_tool_cli/protocol/journal.py +21 -0
  70. llm_tool_cli/protocol/logic_cells/__init__.py +4 -0
  71. llm_tool_cli/protocol/logic_cells/base.py +41 -0
  72. llm_tool_cli/protocol/logic_cells/content.py +26 -0
  73. llm_tool_cli/protocol/logic_cells/environment_error.py +36 -0
  74. llm_tool_cli/protocol/logic_cells/journal.py +44 -0
  75. llm_tool_cli/protocol/logic_cells/tests/__init__.py +0 -0
  76. llm_tool_cli/protocol/logic_cells/tests/test_base.py +47 -0
  77. llm_tool_cli/protocol/logic_cells/tests/test_content.py +59 -0
  78. llm_tool_cli/protocol/logic_cells/tests/test_environment_error.py +130 -0
  79. llm_tool_cli/protocol/logic_cells/tests/test_journal.py +47 -0
  80. llm_tool_cli/protocol/logic_cells/tests/test_uniform.py +60 -0
  81. llm_tool_cli/protocol/logic_cells/tests/test_warning.py +34 -0
  82. llm_tool_cli/protocol/logic_cells/uniform.py +21 -0
  83. llm_tool_cli/protocol/logic_cells/warning.py +22 -0
  84. llm_tool_cli/protocol/output_cells/__init__.py +11 -0
  85. llm_tool_cli/protocol/output_cells/automation.py +14 -0
  86. llm_tool_cli/protocol/output_cells/base.py +65 -0
  87. llm_tool_cli/protocol/output_cells/human.py +24 -0
  88. llm_tool_cli/protocol/output_cells/journal.py +23 -0
  89. llm_tool_cli/protocol/output_cells/llm.py +25 -0
  90. llm_tool_cli/protocol/output_cells/tests/__init__.py +0 -0
  91. llm_tool_cli/protocol/output_cells/tests/make.py +15 -0
  92. llm_tool_cli/protocol/output_cells/tests/test_automation.py +58 -0
  93. llm_tool_cli/protocol/output_cells/tests/test_base.py +86 -0
  94. llm_tool_cli/protocol/output_cells/tests/test_human.py +112 -0
  95. llm_tool_cli/protocol/output_cells/tests/test_llm.py +65 -0
  96. llm_tool_cli/protocol/serialization.py +7 -0
  97. llm_tool_cli/protocol/tests/__init__.py +0 -0
  98. llm_tool_cli/protocol/tests/helpers.py +25 -0
  99. llm_tool_cli/protocol/tests/test_cell_shortcuts.py +126 -0
  100. llm_tool_cli/protocol/tests/test_journal.py +44 -0
  101. llm_tool_cli/protocol/tests/test_serialization.py +33 -0
  102. llm_tool_cli/py.typed +0 -0
  103. llm_tool_cli/skills/__init__.py +6 -0
  104. llm_tool_cli/skills/errors.py +12 -0
  105. llm_tool_cli/skills/fixtures.py +14 -0
  106. llm_tool_cli/skills/tests/__init__.py +0 -0
  107. llm_tool_cli/skills/tests/test_fixtures.py +58 -0
  108. llm_tool_cli-0.2.0.dist-info/METADATA +275 -0
  109. llm_tool_cli-0.2.0.dist-info/RECORD +111 -0
  110. llm_tool_cli-0.2.0.dist-info/WHEEL +4 -0
  111. llm_tool_cli-0.2.0.dist-info/licenses/LICENSE +28 -0
@@ -0,0 +1,275 @@
1
+ Metadata-Version: 2.5
2
+ Name: llm-tool-cli
3
+ Version: 0.2.0
4
+ Summary: Shared foundations for LLM-oriented Python command-line tools.
5
+ Project-URL: Homepage, https://github.com/Tiendil/llm-tool-cli
6
+ Project-URL: Repository, https://github.com/Tiendil/llm-tool-cli
7
+ Project-URL: Issues, https://github.com/Tiendil/llm-tool-cli/issues
8
+ Project-URL: Changelog, https://github.com/Tiendil/llm-tool-cli/blob/main/CHANGELOG.md
9
+ Author-email: Aliaksei Yaletski <a.eletsky@gmail.com>
10
+ License-Expression: BSD-3-Clause
11
+ License-File: LICENSE
12
+ Keywords: ai-agents,cli,developer-tools,llm
13
+ Classifier: Development Status :: 1 - Planning
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3 :: Only
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
+ Requires-Python: <4.0,>=3.12
20
+ Requires-Dist: pydantic<3,>=2.12
21
+ Requires-Dist: tomli<3,>=2.4.1
22
+ Requires-Dist: typer~=0.25.1
23
+ Description-Content-Type: text/markdown
24
+
25
+ # llm-tool-cli
26
+
27
+ Reusable Python foundations for CLI tools used by humans, LLM agents, and automation.
28
+ Import it as `llm_tool_cli` to build your own tool; the library has no standalone CLI entry point.
29
+
30
+ At its current stage, this is a personal project of [Tiendil](https://tiendil.org), developed as the shared foundation for:
31
+
32
+ - [Donna](https://github.com/Tiendil/donna), which runs deterministic workflows for agents.
33
+ - [Depmesh](https://github.com/Tiendil/depmesh), which discovers dependencies between project artifacts.
34
+
35
+ ## Goals
36
+
37
+ 1. Provide the ability to quickly construct tools targeted at specific tasks for AI agents.
38
+ 2. Experiment with approaches to improve the usability of CLI tools for agents.
39
+ 3. Unify the behavior of Tiendil’s tools.
40
+
41
+ ## Capabilities
42
+
43
+ - **CLI application foundations** — Give commands a consistent structure and execution lifecycle.
44
+ - **Unified output** — Present application results to people, LLM agents, and automation through a shared output model.
45
+ - **Configuration management** — Reuse project configuration handling while keeping application settings under your control.
46
+ - **Project filesystem operations** — Use a common interpretation of project paths and file selection.
47
+ - **Journaling and diagnostics** — Report progress and problems through a common output system.
48
+ - **Scoped application resources** — Make resources available throughout the parts of an invocation that need them.
49
+
50
+ The library also provides reusable subcommands for applications to register:
51
+
52
+ - `init` — Create project configuration from the application's template.
53
+ - `version` — Print the installed version of the application's distribution.
54
+ - `skill [DOCUMENT]` — Print packaged usage or other skill documentation supplied by the application.
55
+
56
+ ## Output protocols
57
+
58
+ A protocol determines how a tool presents its results and diagnostics:
59
+
60
+ - `human` — Plain text blocks for people using a terminal.
61
+ - `llm` — Text with explicit cell boundaries and metadata for AI agents.
62
+ - `automation` — JSON Lines records for programs consuming output.
63
+
64
+ Select the protocol with the global `-p` option before the subcommand.
65
+ All three protocols use stdout by default.
66
+
67
+ ## Data flow
68
+
69
+ **Domain code** performs the tool's actual work, such as finding dependencies, independently of CLI parsing and output formatting.
70
+ The **output emitter** is the shared output service that manages buffering, rendering, and writing.
71
+
72
+ 1. A person, agent, or program invokes a command through the tool's CLI.
73
+ 2. The CLI parses options and arguments and selects the command to run.
74
+ 3. The command context chooses the effective protocol and makes an emitter available for the invocation.
75
+ 4. The command calls domain code, which performs the requested work and constructs **logical cells**: typed data describing the results to present.
76
+ 5. The command or domain code submits these cells to the emitter, which buffers ordinary results.
77
+ 6. When delivery is due, each logical cell projects to zero or more **output cells** containing presentation data for the selected protocol.
78
+ 7. Output cells format the prepared data.
79
+ 8. The emitter writes the formatted output to its configured stream.
80
+
81
+ Submission and delivery happen at different times:
82
+
83
+ - Ordinary results wait for successful command completion or an explicit `flush()`; projection and formatting happen at delivery.
84
+ - Warnings are collected in submission order and delivered after results, or after reported errors when execution fails.
85
+ - Progress journal cells are processed when submitted and emitted immediately on success, so they can appear before results submitted earlier.
86
+ Use journal messages to keep agents informed about progress during long operations, while final results are still pending.
87
+
88
+ The [output contract](specs/behavior/protocol.md) describes the complete flow and delivery rules.
89
+
90
+ ## Error handling
91
+
92
+ The library distinguishes **internal errors** from **environment errors**.
93
+
94
+ Internal errors indicate programming defects or violated assumptions in the tool itself.
95
+ They are raised as exceptions, with `InternalError` as the shared base for library-defined internal failures.
96
+ Unexpected exceptions propagate through command handling without flushing pending results.
97
+
98
+ Environment errors describe expected failures in an operation's documented contract, such as invalid project configuration or an unreadable input file.
99
+ They are structured `EnvironmentError` values: a code identifies the failure kind, a message explains it, and context supplies details such as affected paths.
100
+ Environment errors can also include suggested corrections in a `ways_to_fix` list.
101
+ The rendered diagnostic includes these suggestions, so an agent can select and apply a fix automatically, then retry the command.
102
+
103
+ Operations return these values through `Result[T]`: `Ok(value)` for success or `Err(errors)` for a list of environment errors.
104
+
105
+ At the CLI boundary, `command_context` handles unsuccessful `.unwrap()` calls by reporting those environment errors as diagnostic logical cells in the selected protocol.
106
+ It discards pending ordinary results, delivers collected warnings after the diagnostics, and exits with the highest status declared by the errors.
107
+
108
+ Warnings describe non-fatal problems and do not cause command failure.
109
+ See the [error architecture](specs/architecture/errors.md) and [command error-handling contract](specs/behavior/cli.md#command-error-handling) for details.
110
+
111
+ ## Scoped resources
112
+
113
+ `ContextValue[T]` makes a typed resource available to code running within a chosen execution scope.
114
+ Each resource has its own independent binding.
115
+ Code reads the active value through `.get()`, such as `runtime_config.get()` or `output.get()`; domain code can access these bindings without depending on the CLI layer.
116
+ Values can still be passed explicitly as function arguments.
117
+
118
+ Shared configuration distinguishes three lifetimes:
119
+
120
+ - **Application identity — `StaticConfig`.** Initialized before CLI parsing, it contains the tool label and optional default configuration filename.
121
+ - **Command invocation — `RuntimeConfig`.** Contains the effective output protocol.
122
+ The shared command context establishes it together with an independently bound output emitter.
123
+ - **Selected project — `ProjectConfig`.** Contains the selected configuration path and the project directory derived from its parent.
124
+ Shared project preparation establishes this binding after successful configuration validation.
125
+ Commands that do not use a project need no project binding.
126
+
127
+ The application's loaded settings remain separate from `ProjectConfig`, following the application's schema and defaults.
128
+
129
+ Applications can define bindings for their own resources, such as caches or execution state, and choose the scope each resource needs.
130
+ For example, an operation can make its execution state available only while that operation runs.
131
+ Resources are prepared only where needed; these scopes do not have to follow a fixed hierarchy.
132
+
133
+ Use a binding's `scope(value)` context manager to temporarily supply or override its value; leaving the scope restores the previous binding.
134
+ Accessing an unset binding raises an internal error indicating missing setup.
135
+ Binding an object does not construct, copy, or close it; the code managing that resource owns its setup and cleanup.
136
+
137
+ See the [context architecture](specs/architecture/modules_layout.md#core-and-context) and [project scopes](specs/behavior/config.md#project-scopes) for details.
138
+
139
+ ## Reusable configuration elements
140
+
141
+ Tools compose their own configuration schemas from shared fields and configuration blocks alongside application-specific settings.
142
+ Each shared element is independently reusable:
143
+
144
+ - **Configuration version — `ConfigVersion`.** Validates integer versions and provides clear diagnostics for invalid or unsupported values.
145
+ Each tool chooses its supported versions and defaults.
146
+ - **Session directory — `SessionDir`.** Validates a project-relative path, rejecting absolute paths and parent-directory references.
147
+ The tool owns its default location and session storage.
148
+ - **Journal configuration — `JournalConfig`.** Configures an optional command for forwarding journal records externally.
149
+ External forwarding is disabled by default.
150
+
151
+ For example, a tool can combine these elements with its own greeting setting:
152
+
153
+ ```python
154
+ from pathlib import Path
155
+ from typing import Literal
156
+
157
+ import pydantic
158
+
159
+ from llm_tool_cli.config.fields import ConfigVersion, SessionDir
160
+ from llm_tool_cli.core.entities import BaseEntity
161
+ from llm_tool_cli.output.journal import JournalConfig
162
+ from llm_tool_cli.paths import RelativeProjectPath
163
+
164
+
165
+ class Config(BaseEntity):
166
+ version: ConfigVersion[Literal[1]] = 1
167
+ session_dir: SessionDir = RelativeProjectPath(Path(".session"))
168
+ journal: JournalConfig = pydantic.Field(default_factory=JournalConfig)
169
+ greeting: str = "Hello"
170
+ ```
171
+
172
+ The version constraint and defaults above belong to this example tool.
173
+ See the [configuration contract](specs/behavior/config.md) for shared loading and validation behavior.
174
+
175
+ ## Quick start
176
+
177
+ This example creates a greeting in domain code and submits it from a CLI command.
178
+
179
+ With the library available in your Python environment, save this as `example.py`:
180
+
181
+ ```python
182
+ import typer
183
+
184
+ from llm_tool_cli.cli.application import create_app
185
+ from llm_tool_cli.cli.context import command_context
186
+ from llm_tool_cli.core.settings import ToolLabel, initialize
187
+ from llm_tool_cli.output import output
188
+ from llm_tool_cli.protocol.logic_cells import ContentCell
189
+
190
+ initialize(label=ToolLabel("DEMO"))
191
+ app = create_app(help="A greeting tool built with llm-tool-cli.")
192
+
193
+
194
+ def greeting(name: str) -> ContentCell:
195
+ return ContentCell(
196
+ kind="greeting",
197
+ media_type="text/plain",
198
+ content=f"Hello, {name}!",
199
+ meta={"type": "greeting", "name": name},
200
+ )
201
+
202
+
203
+ @app.command()
204
+ def greet(context: typer.Context, name: str) -> None:
205
+ with command_context(context):
206
+ output.get().emit([greeting(name)]).unwrap()
207
+
208
+
209
+ if __name__ == "__main__":
210
+ app()
211
+ ```
212
+
213
+ The command context selects the protocol, establishes the active emitter, and delivers buffered results on successful completion.
214
+ No project configuration or journal setup is needed for this example.
215
+
216
+ Run the greeting command with each of the three protocols:
217
+
218
+ ### Human
219
+
220
+ ```bash
221
+ python example.py -p human greet Ada
222
+ ```
223
+
224
+ ```text
225
+ name: Ada
226
+
227
+ Hello, Ada!
228
+
229
+ ```
230
+
231
+ ### LLM
232
+
233
+ ```bash
234
+ python example.py -p llm greet Ada
235
+ ```
236
+
237
+ ```text
238
+ --DEMO-CELL <id> BEGIN--
239
+ kind=greeting
240
+ media_type=text/plain
241
+ name=Ada
242
+ type=greeting
243
+
244
+ Hello, Ada!
245
+ --DEMO-CELL <id> END--
246
+ ```
247
+
248
+ ### Automation
249
+
250
+ ```bash
251
+ python example.py -p automation greet Ada
252
+ ```
253
+
254
+ ```jsonl
255
+ {"content":"Hello, Ada!","id":"<id>","name":"Ada","type":"greeting"}
256
+ ```
257
+
258
+ `<id>` represents a generated cell identifier.
259
+
260
+ ## Integration
261
+
262
+ Use these extension points to adapt the library to your tool:
263
+
264
+ - **Custom logical cells** — Extend `LogicCell` to give protocols different presentations, or use `ContentCell` when they can share a payload.
265
+ [Depmesh](https://github.com/Tiendil/depmesh) uses custom logical cells to present grouped dependency lists as text and individual dependency records for automation.
266
+ - **Custom output cells** — Reuse the standard formatters or specialize them, such as by subclassing `HumanOutputCell` and selecting it from a logical cell's human projection.
267
+ Formatting stays separate from stream handling.
268
+ - **Application-owned configuration** — Supply your own schema and defaults, then use shared project scopes to locate and validate configuration and expose the active project.
269
+ See the [configuration contract](specs/behavior/config.md).
270
+ - **Scoped resources** — Add bindings for application-owned resources using the [scoping mechanism](#scoped-resources).
271
+ - **Journal delivery** — Use `output.get().journal("Starting work").unwrap()` to report explicit progress.
272
+ A journal-cell factory can add application context, and a journal processor can deliver records externally; the default processor performs no external delivery.
273
+ [Donna](https://github.com/Tiendil/donna) supplies a factory that adds workflow execution context to journal cells.
274
+
275
+ See the [specification index](specs/intro.md) for the complete contracts, including [CLI support](specs/behavior/cli.md) and [project paths](specs/behavior/paths.md).
@@ -0,0 +1,111 @@
1
+ llm_tool_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ llm_tool_cli/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ llm_tool_cli/cli/__init__.py,sha256=clyE_18AFet7KfbLtaVYSz6Jlzo4rldVTtfG7h1Nh4c,48
4
+ llm_tool_cli/cli/application.py,sha256=gTKOg9UL84ixP4qYTuY0sKMQlaE9q_qgG0YIoRe9rkA,1346
5
+ llm_tool_cli/cli/context.py,sha256=LV58TNSGxu0spbI-ssPoTvjY7eeYQKIH7cxTK69cye4,1446
6
+ llm_tool_cli/cli/entities.py,sha256=v_yBDF1eNdGAkhz7KY8S1H2c4odySskfogwCUNeusE4,72
7
+ llm_tool_cli/cli/errors.py,sha256=pSjgY5mM6rvD3MKQuU4mYJxBFXsLb6OTw5Zvb3NG_M8,434
8
+ llm_tool_cli/cli/handling.py,sha256=uoyLMuyyzseW2WY4ulKQUURb3JmLhVOMjiSKR4Qmi5g,1617
9
+ llm_tool_cli/cli/options.py,sha256=NBwugeZweSXLdocO4P9lcgpR6IyGjYHfFEUcEAXOd1M,1340
10
+ llm_tool_cli/cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ llm_tool_cli/cli/commands/initialization.py,sha256=WXrcqNry34luWfisW-WPyK8npBQV0rbQ7Fi8e2Xhi1g,1173
12
+ llm_tool_cli/cli/commands/skills.py,sha256=m77owpOjO0_OiKiagtbjAF5csOeYQKHSHBOhx3KIDSo,1028
13
+ llm_tool_cli/cli/commands/version.py,sha256=YBHpmTQQBiDINCZSvVtGYsAL3z2ihVVKiKe0nBTWSMk,627
14
+ llm_tool_cli/cli/commands/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ llm_tool_cli/cli/commands/tests/test_initialization.py,sha256=9J5EQZSHHpK5wq7AzpDP-81k-iFJm6f4w5pA_h14ABI,5373
16
+ llm_tool_cli/cli/commands/tests/test_skills.py,sha256=K75hRkPR9UNyahrRZ1JNmnkviXypPFnVybZ1Mr9Gr_E,6273
17
+ llm_tool_cli/cli/commands/tests/test_version.py,sha256=j2ctjFAEPOmzTdO1tNiMWtuyP_4GxR1aGunZsygaM64,3990
18
+ llm_tool_cli/cli/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ llm_tool_cli/cli/tests/test_application.py,sha256=EuuQfJxMy9JAIU2MHBPMN_U_FJEcJGJBv9iaJe93rtU,6875
20
+ llm_tool_cli/cli/tests/test_context.py,sha256=9FIN8dvRzc6LZjJHrdsbEWyiDaazsGZFNHtgiw40ORo,8794
21
+ llm_tool_cli/cli/tests/test_handling.py,sha256=hLQDhpJBRWzjz6ncoAtDBsIm7w12xhrY2RQZXUzIMKg,10727
22
+ llm_tool_cli/cli/tests/test_options.py,sha256=kaEN7gHq1vFY6X6kuC3yBfZl4RGK9fDjKM5eShOfEfI,4607
23
+ llm_tool_cli/config/__init__.py,sha256=EXP3bOTz2EcFT_BsD_a7CHqIWHUdIAuuoKH9l-fJMCw,899
24
+ llm_tool_cli/config/errors.py,sha256=ooyYXgepsDEZwiidmNz2OdpnCPa_EmBhxfx_VLI7a1w,2640
25
+ llm_tool_cli/config/fields.py,sha256=1f3iJPKI0cNWh_jMNCab9SWLP5HR6Lmr1-aKfUeTE0w,1539
26
+ llm_tool_cli/config/files.py,sha256=a-pmMjTA49OXARerYNnOqxlZ7dqxVyWFRZ1Kin_O00U,8055
27
+ llm_tool_cli/config/project.py,sha256=1enUPr6NQ09NQOawcPpQ7Uv_qHgQ3Bm2mtzbqhJ7Zf0,3008
28
+ llm_tool_cli/config/runtime.py,sha256=DrWjwS4Xg1QqkLWg3bFONP-1bLdUfwCkCiEAlkVbLTg,422
29
+ llm_tool_cli/config/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ llm_tool_cli/config/tests/fixtures.py,sha256=tVGS3BFG6tiJ5TcTrATMYZN9jaBZYR2QpBJureuawWU,1197
31
+ llm_tool_cli/config/tests/test_fields.py,sha256=eToR_4fuWQC2wnB86xvqsq6ed0nYgcrrTVddQ-Ln9eM,5274
32
+ llm_tool_cli/config/tests/test_files.py,sha256=lXqxK2Joqfm92L9usj2foLQYKRPfE6KnqbEACIghI3s,34550
33
+ llm_tool_cli/config/tests/test_project.py,sha256=JsyDUYhbe3W4tr_KVOxrbVEfc-JRuLh3CI4mMtszIt0,12519
34
+ llm_tool_cli/core/__init__.py,sha256=xeOq6djYpQJWLp53e4s2F1CYAVyj8imsLGc124xhmNA,80
35
+ llm_tool_cli/core/context.py,sha256=VulMtsOSszDiZp6sVvAFdV10JWDObs6eMOQWJ88u06I,1688
36
+ llm_tool_cli/core/entities.py,sha256=RyGfqQWeH-DnvpB_fH880JTGSnMlqHi27eNLQg9aCeM,920
37
+ llm_tool_cli/core/errors.py,sha256=R6zXHTowdj7LdGdtoyUju1uTf_kgCG_4lqbC0wqLSlY,3196
38
+ llm_tool_cli/core/result.py,sha256=GmpDFkj8UdRZ57reWMxhwy3_SJJte46MN-K5DpCIDy0,3811
39
+ llm_tool_cli/core/settings.py,sha256=RFJoUpSXeIYeHRF893EaVRUrhT28ZhM1y_gagdrT5T0,1261
40
+ llm_tool_cli/core/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ llm_tool_cli/core/tests/fixtures.py,sha256=oXSkK4-cH5h2_QueWfauzsbqGK7P5JTfwVIzSIPY-eQ,581
42
+ llm_tool_cli/core/tests/test_context.py,sha256=gy4rnaYDcFai3ITvnqF9TB_pym7leUW6uCIpXSCE3Qc,5088
43
+ llm_tool_cli/core/tests/test_entities.py,sha256=sc9xEPgLdvRFy1WrfkzYcMWVBLyncDr_tstQ8J_afBA,2449
44
+ llm_tool_cli/core/tests/test_errors.py,sha256=HeBPD7HJtwQj228kyQxjF9Rgy11tWg5L_nPfHh0jVks,7664
45
+ llm_tool_cli/core/tests/test_result.py,sha256=4lc_VrfrsMuGAR42eAYj0nv-gbecujbWDlLMOCQLlVM,8643
46
+ llm_tool_cli/core/tests/test_settings.py,sha256=7cVd7J11dqzziYpyhhWE44XJGd54S6q9cP9VcmlSj8M,2673
47
+ llm_tool_cli/output/__init__.py,sha256=v4plDMkK2as-SnVNxgmOS7P1entOnf19oqnB7FGZaFg,187
48
+ llm_tool_cli/output/emitter.py,sha256=lPGSHei3jNzGqD_x0irjESRsscjI46twiXbbgJN0O0w,4240
49
+ llm_tool_cli/output/errors.py,sha256=MFha7BHVwiPHeuA-gEOnPyiWq32bCsNKaNyltdYd0Fc,691
50
+ llm_tool_cli/output/journal.py,sha256=B9yxDnCN-jJM535wmRcx1_Ay4wED7bpqgQ4gNAJDrVo,2272
51
+ llm_tool_cli/output/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ llm_tool_cli/output/tests/helpers.py,sha256=u5QmEorqfRjbl9o0ssXD6vfeLjankRJKwAXX9szNI-A,1105
53
+ llm_tool_cli/output/tests/test_emitter.py,sha256=JThybAUWwZ96yKFjTjk-yTjPMi7X-LCGSa1NPiU85Cw,19613
54
+ llm_tool_cli/output/tests/test_journal.py,sha256=0od5DLBAWebFF3cXeaLeVASboBZtaHce7vUiP2d7Ggw,5850
55
+ llm_tool_cli/paths/__init__.py,sha256=SiiJkCw9jLe7m563Bf2GBvKZChm2aYdX_rmlQmAV9kI,1432
56
+ llm_tool_cli/paths/enumeration.py,sha256=KyAkO8_WTcw1v-TuF7mRJLYey3JrNVBHJRzfC1bqpwo,2722
57
+ llm_tool_cli/paths/errors.py,sha256=SrEPjhlBg6_hLWDmjgug_Fx_Q-sxupSIFW77Mh5KBro,1159
58
+ llm_tool_cli/paths/filesystem.py,sha256=TPR0GCrxafrmgKnXccRWLjrXeQEhsW2E1jfLWmt7kUw,7231
59
+ llm_tool_cli/paths/globs.py,sha256=b961zePZcDdxgSYCVujKk3o2kN7lf3GPxxVCM1A2BBw,5345
60
+ llm_tool_cli/paths/normalization.py,sha256=93IEApCg_hcNCGMOCU1_101eDssyyoZ-474GdtBUBzw,2092
61
+ llm_tool_cli/paths/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
+ llm_tool_cli/paths/tests/test_enumeration.py,sha256=FMbuCM3mLXAz32QiHyWH70VnBfj02zavysku7jCG_tU,9641
63
+ llm_tool_cli/paths/tests/test_filesystem.py,sha256=nVnHvWZh4FyFw2H0OHLqKbSmDd2nTcdKm5N-P4s_Lp8,34079
64
+ llm_tool_cli/paths/tests/test_globs.py,sha256=MnmBF0nB6c2ulkdyFnELtOzmpMjeMDDDM5FnHTNHPSw,6538
65
+ llm_tool_cli/paths/tests/test_normalization.py,sha256=ZMJEDz4ZNdwESRGVTNCrMkXvFhGDNxnzfyySqFKX7rM,4845
66
+ llm_tool_cli/protocol/__init__.py,sha256=dzGvTTjG3bjzUhA10-68i7McT7iVlQGj_vLKH9pyem8,145
67
+ llm_tool_cli/protocol/cell_shortcuts.py,sha256=q44rzM04Os-aR2GlzvhImbsfPVsFhiJzNHryHlHdAws,1414
68
+ llm_tool_cli/protocol/entities.py,sha256=2C0QhqnbKNB6A2Q5mYzIkQzIpG8_ulVZaoxUu5ZhHBI,110
69
+ llm_tool_cli/protocol/errors.py,sha256=iEz5mOjPWBOL-mDLZk04IqB_x4xhonai8n8nVkigu50,676
70
+ llm_tool_cli/protocol/journal.py,sha256=K0FAdW8gOJjeKH1m442MyM699GlUINFZZjz_ay4w08o,770
71
+ llm_tool_cli/protocol/serialization.py,sha256=oEYyJwy54NSc30VBH4d0G4_AqlQsQwZ8HycnOW5jb-c,278
72
+ llm_tool_cli/protocol/logic_cells/__init__.py,sha256=kJbwEvrpck_ZtQjabHvD4z3umivRp9Oq5Qo1qQvpih4,202
73
+ llm_tool_cli/protocol/logic_cells/base.py,sha256=-3WhAcS7Vi9zoCtnNtdS8EKGjlDvUvdWUuHKQ6FMxI4,1484
74
+ llm_tool_cli/protocol/logic_cells/content.py,sha256=d8BXTyrhgKP-uc3HmTaEbzRKSHI6ACi4X765CE2UTsk,977
75
+ llm_tool_cli/protocol/logic_cells/environment_error.py,sha256=bFo_PEdof_XTig74HmmckzlA-WK-pAvgU7FSEGt3YtY,1564
76
+ llm_tool_cli/protocol/logic_cells/journal.py,sha256=UjKf_HMA9E1O6zBjbjshKnbX9wM0kavnpaQdKwCZ5fk,1815
77
+ llm_tool_cli/protocol/logic_cells/uniform.py,sha256=tmaOLgd8M4GzJ6s24V8sqQ5NamlyF3PaSPA449k8tRg,760
78
+ llm_tool_cli/protocol/logic_cells/warning.py,sha256=G_5m3WN7J5IkRadS8wIQp2A8Kdnc5GoaqHZaeAAJT80,851
79
+ llm_tool_cli/protocol/logic_cells/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ llm_tool_cli/protocol/logic_cells/tests/test_base.py,sha256=840KWEzlhdRLQ9JtfWRSybG5KfZvEeIowjkYw7p_01A,1671
81
+ llm_tool_cli/protocol/logic_cells/tests/test_content.py,sha256=vnn4rYmYWJciKi2vLCg3uo8LZUB6vp9hOOJy7EjLKvQ,2462
82
+ llm_tool_cli/protocol/logic_cells/tests/test_environment_error.py,sha256=_0EuVPgr_59zTkMTkYDg_2NIG6ooaaC0um4NxNma77I,4717
83
+ llm_tool_cli/protocol/logic_cells/tests/test_journal.py,sha256=5NheP6yD6zezmsL28RfW2DX5qEF5-ZP7cb5hFr1ABDQ,2106
84
+ llm_tool_cli/protocol/logic_cells/tests/test_uniform.py,sha256=-SJYb5aMPshpeeEZjBTZVCY-e7C-ifFwlf2vkccK89Y,2215
85
+ llm_tool_cli/protocol/logic_cells/tests/test_warning.py,sha256=eyqT4dPZKBPnPZGoqm3UVBYpo2-w99G9snpHcGBF7ew,1426
86
+ llm_tool_cli/protocol/output_cells/__init__.py,sha256=ZsOqXfn44zbICUkG5DE3BOlTYyMhGJ_tjHyP5BdDPDo,404
87
+ llm_tool_cli/protocol/output_cells/automation.py,sha256=lzy2qk7tNrj3dDPORhmVLAu1HhNecSP70mf-U4DZ2ac,513
88
+ llm_tool_cli/protocol/output_cells/base.py,sha256=PWDwCCDnt4GZQ6bUGz51Or43VN693PgTn5ncx_UuOtw,2059
89
+ llm_tool_cli/protocol/output_cells/human.py,sha256=mpv_DKfQ-fk-symtUth5EUHnSibb35dnEBlhBJjS6s8,1058
90
+ llm_tool_cli/protocol/output_cells/journal.py,sha256=2YQaGECmmQcOyr_1VZqOYXUvs3Jo369gXy41iVm1wlc,837
91
+ llm_tool_cli/protocol/output_cells/llm.py,sha256=5vzlL1z0QAMFMUiKS4NGQMIzWNubU0Qr_n51gyluby8,767
92
+ llm_tool_cli/protocol/output_cells/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
+ llm_tool_cli/protocol/output_cells/tests/make.py,sha256=fR2pF1mH_vLXdjvd6gl-qaPEaL8CST6cdeE0XJH3beY,500
94
+ llm_tool_cli/protocol/output_cells/tests/test_automation.py,sha256=myiDyKVCL4WScwMk8Mw9IKQPWlBPwTBdgRGYuw4ptsc,2243
95
+ llm_tool_cli/protocol/output_cells/tests/test_base.py,sha256=AvaIvepyc2_ITy_vB_IMdhOQ020s-w1n2yX7hbl3nvc,3495
96
+ llm_tool_cli/protocol/output_cells/tests/test_human.py,sha256=_G4vGU5Fh0UGUB_qS5-_8_lM0r7CKxvH04eV2lCXw-0,4755
97
+ llm_tool_cli/protocol/output_cells/tests/test_llm.py,sha256=kgNYAr6RxWxLwP5uFXBhgZkDwPjz8WfPaTDc3i02MuE,2370
98
+ llm_tool_cli/protocol/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
+ llm_tool_cli/protocol/tests/helpers.py,sha256=74E51acrE1i7y3Fn7jThPUZcmcHgjKUr7iuQzNOAVFs,930
100
+ llm_tool_cli/protocol/tests/test_cell_shortcuts.py,sha256=hF-p88bfP7HGuD9Esk7yfsmvfKfP-l26lVSgxoKMAvA,4768
101
+ llm_tool_cli/protocol/tests/test_journal.py,sha256=tqiXzv754oHtrXixMCzjmPDm1vbvsc21c_dWp2-riBM,1645
102
+ llm_tool_cli/protocol/tests/test_serialization.py,sha256=CFfja_sHBzK6I-i3qxGRYNaLchByV82z5PqeT1JgdiI,1057
103
+ llm_tool_cli/skills/__init__.py,sha256=bEjleYYt055lysfqKngug2WryChhiHyHWGaNkSkJLAI,232
104
+ llm_tool_cli/skills/errors.py,sha256=a6QWAoW_zpawlesmqA3RXFSXZO3mklHIKEdwf-fweII,377
105
+ llm_tool_cli/skills/fixtures.py,sha256=drmYWEAghLXlytmX3KSY99z4RvG4jIDun4CuEyD5qD8,581
106
+ llm_tool_cli/skills/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ llm_tool_cli/skills/tests/test_fixtures.py,sha256=tojwJT6yLunfysFWWvRdpK73Mjxq0ROC_IdiTfaSNYA,2285
108
+ llm_tool_cli-0.2.0.dist-info/METADATA,sha256=TuG9NxLbWhGv5MgtZxRxwunN8H5res0gDH_gZyCkLek,13379
109
+ llm_tool_cli-0.2.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
110
+ llm_tool_cli-0.2.0.dist-info/licenses/LICENSE,sha256=oH03BEHY5nU5ujhQSKNavrlrxhn5I7qoKaLNCzpZmW0,1504
111
+ llm_tool_cli-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.4
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Aliaksei Yaletski
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.