iomate-base 0.1.0a0__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.
- iomate_base-0.1.0a0/LICENSE +21 -0
- iomate_base-0.1.0a0/PKG-INFO +620 -0
- iomate_base-0.1.0a0/README.md +607 -0
- iomate_base-0.1.0a0/pyproject.toml +45 -0
- iomate_base-0.1.0a0/src/iomate_base/__init__.py +5 -0
- iomate_base-0.1.0a0/src/iomate_base/actions/__init__.py +11 -0
- iomate_base-0.1.0a0/src/iomate_base/actions/action.py +174 -0
- iomate_base-0.1.0a0/src/iomate_base/actions/action_group.py +91 -0
- iomate_base-0.1.0a0/src/iomate_base/actions/metadata.py +39 -0
- iomate_base-0.1.0a0/src/iomate_base/contracts/__init__.py +21 -0
- iomate_base-0.1.0a0/src/iomate_base/contracts/action_contract.py +175 -0
- iomate_base-0.1.0a0/src/iomate_base/contracts/compatibility.py +117 -0
- iomate_base-0.1.0a0/src/iomate_base/contracts/definition_validation.py +136 -0
- iomate_base-0.1.0a0/src/iomate_base/packages/__init__.py +15 -0
- iomate_base-0.1.0a0/src/iomate_base/packages/deployment.py +57 -0
- iomate_base-0.1.0a0/src/iomate_base/packages/manifest.py +51 -0
- iomate_base-0.1.0a0/src/iomate_base/packages/package.py +76 -0
- iomate_base-0.1.0a0/src/iomate_base/packages/registry.py +48 -0
- iomate_base-0.1.0a0/src/iomate_base/py.typed +0 -0
- iomate_base-0.1.0a0/src/iomate_base/registry/__init__.py +3 -0
- iomate_base-0.1.0a0/src/iomate_base/registry/action_registry.py +83 -0
- iomate_base-0.1.0a0/src/iomate_base/runtime/__init__.py +46 -0
- iomate_base-0.1.0a0/src/iomate_base/runtime/context.py +50 -0
- iomate_base-0.1.0a0/src/iomate_base/runtime/definition.py +209 -0
- iomate_base-0.1.0a0/src/iomate_base/runtime/execution.py +28 -0
- iomate_base-0.1.0a0/src/iomate_base/runtime/graph.py +580 -0
- iomate_base-0.1.0a0/src/iomate_base/runtime/problems.py +25 -0
- iomate_base-0.1.0a0/src/iomate_base/runtime/protocol.py +76 -0
- iomate_base-0.1.0a0/src/iomate_base/types/__init__.py +34 -0
- iomate_base-0.1.0a0/src/iomate_base/types/resolver.py +182 -0
- iomate_base-0.1.0a0/src/iomate_base/types/type_definition.py +135 -0
- iomate_base-0.1.0a0/src/iomate_base/types/type_registry.py +65 -0
- iomate_base-0.1.0a0/src/iomate_base/types/values.py +116 -0
- iomate_base-0.1.0a0/src/iomate_base/variables/__init__.py +13 -0
- iomate_base-0.1.0a0/src/iomate_base/variables/flags.py +40 -0
- iomate_base-0.1.0a0/src/iomate_base/variables/runtime_reference.py +49 -0
- iomate_base-0.1.0a0/src/iomate_base/variables/variable.py +92 -0
- iomate_base-0.1.0a0/src/iomate_base/version.py +111 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) [year] [fullname]
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,620 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: iomate-base
|
|
3
|
+
Version: 0.1.0a0
|
|
4
|
+
Summary: Core SDK and runtime contracts for the IOMate ecosystem
|
|
5
|
+
License-File: LICENSE
|
|
6
|
+
Author: IOMate
|
|
7
|
+
Requires-Python: >=3.12,<=3.14.4
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
|
|
14
|
+
<div align="center">
|
|
15
|
+
<h1><strong>IOMATE-BASE</strong></h1>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<p align="center">
|
|
19
|
+
<a href="https://github.com/iomateapp/iomate-base/actions?query=branch%staging">
|
|
20
|
+
<img src="https://github.com/iomateapp/iomate-base/actions/workflows/quality-and-tests.yaml/badge.svg?branch=staging" />
|
|
21
|
+
</a>
|
|
22
|
+
<a href="https://codecov.io/gh/iomateapp/iomate-base">
|
|
23
|
+
<img src="https://codecov.io/gh/iomateapp/iomate-base/branch/staging/graph/badge.svg" />
|
|
24
|
+
</a>
|
|
25
|
+
<img src="https://img.shields.io/pypi/dm/iomate-base" />
|
|
26
|
+
<img src="https://img.shields.io/github/license/iomateapp/iomate-base" />
|
|
27
|
+
<img src="https://img.shields.io/github/v/release/iomateapp/iomate-base" />
|
|
28
|
+
<img src="https://img.shields.io/github/stars/iomateapp/iomate-base?style=flat" />
|
|
29
|
+
</p>
|
|
30
|
+
|
|
31
|
+
Core SDK and framework for building IOMate Packages.
|
|
32
|
+
|
|
33
|
+
`iomate-base` provides the foundational abstractions, contracts, type system, and runtime definitions used throughout the IOMate Package ecosystem.
|
|
34
|
+
|
|
35
|
+
It is designed to be independent of specific IOMate Packages.
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
iomate-base
|
|
39
|
+
↑
|
|
40
|
+
│
|
|
41
|
+
IOMate Packages
|
|
42
|
+
│
|
|
43
|
+
└── Actions
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Features
|
|
47
|
+
|
|
48
|
+
`iomate-base` provides:
|
|
49
|
+
|
|
50
|
+
- Action definitions
|
|
51
|
+
- Action Groups
|
|
52
|
+
- Action Contracts
|
|
53
|
+
- Action registration and discovery
|
|
54
|
+
- Variables
|
|
55
|
+
- Variable flags
|
|
56
|
+
- Type definitions
|
|
57
|
+
- Python type resolution
|
|
58
|
+
- Runtime references
|
|
59
|
+
- Package metadata
|
|
60
|
+
- Package definitions
|
|
61
|
+
- Runtime execution contracts
|
|
62
|
+
- Version compatibility definitions
|
|
63
|
+
|
|
64
|
+
The core architecture is based on:
|
|
65
|
+
|
|
66
|
+
```text
|
|
67
|
+
Types
|
|
68
|
+
↓
|
|
69
|
+
Variables
|
|
70
|
+
↓
|
|
71
|
+
Actions
|
|
72
|
+
↓
|
|
73
|
+
Contracts
|
|
74
|
+
↓
|
|
75
|
+
Packages
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Requirements
|
|
81
|
+
|
|
82
|
+
- Python 3.12+
|
|
83
|
+
- Poetry
|
|
84
|
+
|
|
85
|
+
The supported Python version range is defined in `pyproject.toml`.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Installation
|
|
90
|
+
|
|
91
|
+
Install from PyPI:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
pip install iomate-base
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Or add it to a Poetry project:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
poetry add iomate-base
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Development Setup
|
|
106
|
+
|
|
107
|
+
Clone the repository and install the development dependencies:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
poetry install
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Activate the Poetry environment if required:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
poetry shell
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Or execute commands directly through Poetry:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
poetry run <command>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Project Structure
|
|
128
|
+
|
|
129
|
+
```text
|
|
130
|
+
iomate-base/
|
|
131
|
+
├── pyproject.toml
|
|
132
|
+
├── poetry.lock
|
|
133
|
+
│
|
|
134
|
+
├── src/
|
|
135
|
+
│ └── iomate_base/
|
|
136
|
+
│ ├── actions/
|
|
137
|
+
│ ├── contracts/
|
|
138
|
+
│ ├── packages/
|
|
139
|
+
│ ├── registry/
|
|
140
|
+
│ ├── runtime/
|
|
141
|
+
│ ├── types/
|
|
142
|
+
│ └── variables/
|
|
143
|
+
│
|
|
144
|
+
├── tests/
|
|
145
|
+
│ ├── actions/
|
|
146
|
+
│ ├── contracts/
|
|
147
|
+
│ ├── packages/
|
|
148
|
+
│ ├── registry/
|
|
149
|
+
│ ├── runtime/
|
|
150
|
+
│ ├── types/
|
|
151
|
+
│ └── variables/
|
|
152
|
+
│
|
|
153
|
+
└── README.md
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Core Concepts
|
|
159
|
+
|
|
160
|
+
### Actions
|
|
161
|
+
|
|
162
|
+
Actions are the primary executable abstraction in IOMate.
|
|
163
|
+
|
|
164
|
+
An Action defines:
|
|
165
|
+
|
|
166
|
+
- Stable key
|
|
167
|
+
- Version
|
|
168
|
+
- Name
|
|
169
|
+
- Description
|
|
170
|
+
- Inputs
|
|
171
|
+
- Outputs
|
|
172
|
+
- Metadata
|
|
173
|
+
- Handler
|
|
174
|
+
|
|
175
|
+
Examples:
|
|
176
|
+
|
|
177
|
+
```text
|
|
178
|
+
workflow.if
|
|
179
|
+
browser.open
|
|
180
|
+
browser.click
|
|
181
|
+
http.request
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
`iomate-base` defines the Action abstraction but does not implement Package-specific Actions.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
### Action Groups
|
|
189
|
+
|
|
190
|
+
Actions can be organized into Action Groups.
|
|
191
|
+
|
|
192
|
+
The hierarchy is:
|
|
193
|
+
|
|
194
|
+
```text
|
|
195
|
+
Package
|
|
196
|
+
↓
|
|
197
|
+
Action Group
|
|
198
|
+
↓
|
|
199
|
+
Action
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Example:
|
|
203
|
+
|
|
204
|
+
```text
|
|
205
|
+
iomate-workflow
|
|
206
|
+
├── Workflow
|
|
207
|
+
│ ├── workflow.if
|
|
208
|
+
│ ├── workflow.else_if
|
|
209
|
+
│ └── workflow.else
|
|
210
|
+
│
|
|
211
|
+
└── Error Handling
|
|
212
|
+
├── error_handling.try
|
|
213
|
+
├── error_handling.except
|
|
214
|
+
└── error_handling.finally
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
### Variables
|
|
220
|
+
|
|
221
|
+
Variables represent values flowing between Actions.
|
|
222
|
+
|
|
223
|
+
A Variable contains, conceptually:
|
|
224
|
+
|
|
225
|
+
```text
|
|
226
|
+
name
|
|
227
|
+
type
|
|
228
|
+
value
|
|
229
|
+
flags
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Variables are the interoperability layer between IOMate Packages.
|
|
233
|
+
|
|
234
|
+
For example:
|
|
235
|
+
|
|
236
|
+
```text
|
|
237
|
+
iomate-selenium
|
|
238
|
+
│
|
|
239
|
+
│ creates
|
|
240
|
+
▼
|
|
241
|
+
SeleniumDriver Variable
|
|
242
|
+
│
|
|
243
|
+
│ consumed by
|
|
244
|
+
▼
|
|
245
|
+
iomate-claude
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
This allows Packages to communicate without directly depending on each other.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
### Variable Flags
|
|
253
|
+
|
|
254
|
+
Variables can expose behavioral and runtime flags such as:
|
|
255
|
+
|
|
256
|
+
```text
|
|
257
|
+
required
|
|
258
|
+
nullable
|
|
259
|
+
mutable
|
|
260
|
+
readonly
|
|
261
|
+
runtime_reference
|
|
262
|
+
scope
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
These flags define how a Variable can be created, consumed, modified, and managed during execution.
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
### Type System
|
|
270
|
+
|
|
271
|
+
`iomate-base` provides a normalized type system based on Python type annotations.
|
|
272
|
+
|
|
273
|
+
Initial supported types include:
|
|
274
|
+
|
|
275
|
+
```text
|
|
276
|
+
str
|
|
277
|
+
int
|
|
278
|
+
float
|
|
279
|
+
bool
|
|
280
|
+
bytes
|
|
281
|
+
None
|
|
282
|
+
list
|
|
283
|
+
tuple
|
|
284
|
+
set
|
|
285
|
+
dict
|
|
286
|
+
Any
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Parameterized types are also supported:
|
|
290
|
+
|
|
291
|
+
```python
|
|
292
|
+
list[str]
|
|
293
|
+
list[int]
|
|
294
|
+
dict[str, int]
|
|
295
|
+
tuple[str, int]
|
|
296
|
+
set[str]
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
For example:
|
|
300
|
+
|
|
301
|
+
```python
|
|
302
|
+
def process(items: list[str]) -> int:
|
|
303
|
+
...
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
can be represented as:
|
|
307
|
+
|
|
308
|
+
```json
|
|
309
|
+
{
|
|
310
|
+
"type": "list",
|
|
311
|
+
"items": {
|
|
312
|
+
"type": "string"
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
### Any
|
|
320
|
+
|
|
321
|
+
`Any` represents an unrestricted input type.
|
|
322
|
+
|
|
323
|
+
For example:
|
|
324
|
+
|
|
325
|
+
```python
|
|
326
|
+
def analyze(value: Any, prompt: str) -> Any:
|
|
327
|
+
...
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
means that the Action does not impose an input type restriction.
|
|
331
|
+
|
|
332
|
+
It does not mean that the runtime Variable has no type.
|
|
333
|
+
|
|
334
|
+
A runtime Variable may still contain:
|
|
335
|
+
|
|
336
|
+
```text
|
|
337
|
+
type: SeleniumDriver
|
|
338
|
+
value: <runtime object>
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
while being accepted by an Action with an `Any` input.
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
### Runtime References
|
|
346
|
+
|
|
347
|
+
Some values represent objects that must remain inside the Robot process.
|
|
348
|
+
|
|
349
|
+
Examples include:
|
|
350
|
+
|
|
351
|
+
```text
|
|
352
|
+
SeleniumDriver
|
|
353
|
+
BrowserSession
|
|
354
|
+
DatabaseConnection
|
|
355
|
+
FileHandle
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
These values can be represented as runtime references.
|
|
359
|
+
|
|
360
|
+
A runtime reference should not automatically be serialized.
|
|
361
|
+
|
|
362
|
+
The actual object remains managed by the execution environment.
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## Action Contracts
|
|
367
|
+
|
|
368
|
+
An Action Contract defines the interface of an Action.
|
|
369
|
+
|
|
370
|
+
A contract includes:
|
|
371
|
+
|
|
372
|
+
```text
|
|
373
|
+
Action key
|
|
374
|
+
Contract version
|
|
375
|
+
Inputs
|
|
376
|
+
Outputs
|
|
377
|
+
Type constraints
|
|
378
|
+
Variable flags
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
Example:
|
|
382
|
+
|
|
383
|
+
```json
|
|
384
|
+
{
|
|
385
|
+
"key": "workflow.if",
|
|
386
|
+
"version": "2.0.0",
|
|
387
|
+
"inputs": [
|
|
388
|
+
{
|
|
389
|
+
"name": "condition",
|
|
390
|
+
"type": "boolean",
|
|
391
|
+
"required": true
|
|
392
|
+
}
|
|
393
|
+
],
|
|
394
|
+
"outputs": []
|
|
395
|
+
}
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
Action Contracts are independently versioned from Package versions.
|
|
399
|
+
|
|
400
|
+
This allows the runtime to determine whether an Action is compatible with an Automation.
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## Package Architecture
|
|
405
|
+
|
|
406
|
+
`iomate-base` is the foundation for IOMate Packages.
|
|
407
|
+
|
|
408
|
+
Examples of Packages include:
|
|
409
|
+
|
|
410
|
+
```text
|
|
411
|
+
iomate-workflow
|
|
412
|
+
iomate-selenium
|
|
413
|
+
iomate-browser
|
|
414
|
+
iomate-http
|
|
415
|
+
iomate-excel
|
|
416
|
+
iomate-database
|
|
417
|
+
iomate-claude
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
Packages depend on `iomate-base`.
|
|
421
|
+
|
|
422
|
+
`iomate-base` must remain independent of those Packages.
|
|
423
|
+
|
|
424
|
+
The dependency direction is:
|
|
425
|
+
|
|
426
|
+
```text
|
|
427
|
+
iomate-base
|
|
428
|
+
↑
|
|
429
|
+
│
|
|
430
|
+
IOMate Packages
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
Package-to-Package communication should happen through shared Variables and runtime references rather than direct Package dependencies.
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## Example Package
|
|
438
|
+
|
|
439
|
+
A Package built using `iomate-base` may expose:
|
|
440
|
+
|
|
441
|
+
```text
|
|
442
|
+
iomate-example
|
|
443
|
+
└── Example
|
|
444
|
+
├── example.create
|
|
445
|
+
└── example.process
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
Its dependency can be declared through Poetry:
|
|
449
|
+
|
|
450
|
+
```toml
|
|
451
|
+
[tool.poetry.dependencies]
|
|
452
|
+
python = ">=3.12,<3.13"
|
|
453
|
+
iomate-base = ">=0.1.0,<1.0.0"
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
The Package then uses the abstractions provided by `iomate-base` to define its Actions, Inputs, Outputs, Variables, and Contracts.
|
|
457
|
+
|
|
458
|
+
---
|
|
459
|
+
|
|
460
|
+
## Testing
|
|
461
|
+
|
|
462
|
+
Run the complete test suite:
|
|
463
|
+
|
|
464
|
+
```bash
|
|
465
|
+
poetry run pytest
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
Run tests with coverage:
|
|
469
|
+
|
|
470
|
+
```bash
|
|
471
|
+
poetry run pytest --cov=src/iomate_base --cov-report=term
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
The project requires a minimum coverage of:
|
|
475
|
+
|
|
476
|
+
```text
|
|
477
|
+
90%
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
## Code Quality
|
|
483
|
+
|
|
484
|
+
Run Ruff:
|
|
485
|
+
|
|
486
|
+
```bash
|
|
487
|
+
poetry run ruff check .
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
Check formatting:
|
|
491
|
+
|
|
492
|
+
```bash
|
|
493
|
+
poetry run ruff format --check .
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
Format the project:
|
|
497
|
+
|
|
498
|
+
```bash
|
|
499
|
+
poetry run ruff format .
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
Run MyPy:
|
|
503
|
+
|
|
504
|
+
```bash
|
|
505
|
+
poetry run mypy src
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
---
|
|
509
|
+
|
|
510
|
+
## Pre-commit
|
|
511
|
+
|
|
512
|
+
Install the project's pre-commit hooks:
|
|
513
|
+
|
|
514
|
+
```bash
|
|
515
|
+
poetry run pre-commit install
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
Run all hooks:
|
|
519
|
+
|
|
520
|
+
```bash
|
|
521
|
+
poetry run pre-commit run --all-files
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
---
|
|
525
|
+
|
|
526
|
+
## Documentation
|
|
527
|
+
|
|
528
|
+
Documentation should be updated when changes affect:
|
|
529
|
+
|
|
530
|
+
- Public APIs
|
|
531
|
+
- Actions
|
|
532
|
+
- Action Contracts
|
|
533
|
+
- Variables
|
|
534
|
+
- Types
|
|
535
|
+
- Runtime References
|
|
536
|
+
- Package interfaces
|
|
537
|
+
- Compatibility behavior
|
|
538
|
+
- Versioning
|
|
539
|
+
|
|
540
|
+
Public abstractions should include clear documentation and type annotations.
|
|
541
|
+
|
|
542
|
+
---
|
|
543
|
+
|
|
544
|
+
## Versioning
|
|
545
|
+
|
|
546
|
+
`iomate-base` follows Semantic Versioning:
|
|
547
|
+
|
|
548
|
+
```text
|
|
549
|
+
MAJOR.MINOR.PATCH
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
### MAJOR
|
|
553
|
+
|
|
554
|
+
Breaking changes to public APIs or contracts.
|
|
555
|
+
|
|
556
|
+
### MINOR
|
|
557
|
+
|
|
558
|
+
Backward-compatible functionality.
|
|
559
|
+
|
|
560
|
+
### PATCH
|
|
561
|
+
|
|
562
|
+
Backward-compatible fixes.
|
|
563
|
+
|
|
564
|
+
Because `iomate-base` is consumed by multiple Packages, backward compatibility is a critical requirement.
|
|
565
|
+
|
|
566
|
+
---
|
|
567
|
+
|
|
568
|
+
## Contributing
|
|
569
|
+
|
|
570
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for:
|
|
571
|
+
|
|
572
|
+
- Branching strategy
|
|
573
|
+
- Development workflow
|
|
574
|
+
- Pull Request requirements
|
|
575
|
+
- Testing requirements
|
|
576
|
+
- Commit conventions
|
|
577
|
+
- Release process
|
|
578
|
+
|
|
579
|
+
See [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for the project's community standards.
|
|
580
|
+
|
|
581
|
+
---
|
|
582
|
+
|
|
583
|
+
## License
|
|
584
|
+
|
|
585
|
+
See [LICENSE](LICENSE) for licensing information.
|
|
586
|
+
|
|
587
|
+
---
|
|
588
|
+
|
|
589
|
+
## Ecosystem
|
|
590
|
+
|
|
591
|
+
`iomate-base` is the foundation of the IOMate Package ecosystem.
|
|
592
|
+
|
|
593
|
+
```text
|
|
594
|
+
IOMate
|
|
595
|
+
│
|
|
596
|
+
┌─────────┴─────────┐
|
|
597
|
+
│ │
|
|
598
|
+
Control Plane Execution Plane
|
|
599
|
+
│ │
|
|
600
|
+
└─────────┬─────────┘
|
|
601
|
+
│
|
|
602
|
+
iomate-base
|
|
603
|
+
│
|
|
604
|
+
┌──────────────┼──────────────┐
|
|
605
|
+
│ │ │
|
|
606
|
+
workflow selenium claude
|
|
607
|
+
│ │ │
|
|
608
|
+
└──────────────┼──────────────┘
|
|
609
|
+
│
|
|
610
|
+
Actions
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
The core principles are:
|
|
614
|
+
|
|
615
|
+
```text
|
|
616
|
+
Packages → Capabilities
|
|
617
|
+
Variables → Interoperability
|
|
618
|
+
Contracts → Compatibility
|
|
619
|
+
iomate-base → Foundation
|
|
620
|
+
```
|