stepyard 0.1.0__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 (158) hide show
  1. stepyard-0.1.0/.gitattributes +17 -0
  2. stepyard-0.1.0/.github/workflows/ci.yml +80 -0
  3. stepyard-0.1.0/.github/workflows/docs.yml +59 -0
  4. stepyard-0.1.0/.github/workflows/release.yml +109 -0
  5. stepyard-0.1.0/.gitignore +74 -0
  6. stepyard-0.1.0/CHANGELOG.md +5 -0
  7. stepyard-0.1.0/CONTRIBUTING.md +91 -0
  8. stepyard-0.1.0/LICENSE +21 -0
  9. stepyard-0.1.0/PKG-INFO +281 -0
  10. stepyard-0.1.0/README.md +244 -0
  11. stepyard-0.1.0/docs/assets/demo.gif +0 -0
  12. stepyard-0.1.0/docs/assets/logo.png +0 -0
  13. stepyard-0.1.0/docs/cli/reference.md +341 -0
  14. stepyard-0.1.0/docs/concepts/control_flow.md +311 -0
  15. stepyard-0.1.0/docs/concepts/errors.md +210 -0
  16. stepyard-0.1.0/docs/concepts/execution-model.md +106 -0
  17. stepyard-0.1.0/docs/concepts/expressions.md +228 -0
  18. stepyard-0.1.0/docs/concepts/flows.md +293 -0
  19. stepyard-0.1.0/docs/concepts/index.md +12 -0
  20. stepyard-0.1.0/docs/concepts/triggers.md +230 -0
  21. stepyard-0.1.0/docs/examples.md +53 -0
  22. stepyard-0.1.0/docs/getting-started/first-plugin.md +240 -0
  23. stepyard-0.1.0/docs/getting-started/index.md +24 -0
  24. stepyard-0.1.0/docs/getting-started/installation.md +84 -0
  25. stepyard-0.1.0/docs/getting-started/tutorial.md +293 -0
  26. stepyard-0.1.0/docs/how-to/approvals.md +164 -0
  27. stepyard-0.1.0/docs/how-to/dry-run.md +167 -0
  28. stepyard-0.1.0/docs/how-to/index.md +12 -0
  29. stepyard-0.1.0/docs/how-to/plugin-management.md +122 -0
  30. stepyard-0.1.0/docs/how-to/scheduling.md +152 -0
  31. stepyard-0.1.0/docs/how-to/secrets.md +164 -0
  32. stepyard-0.1.0/docs/how-to/writing-plugins.md +200 -0
  33. stepyard-0.1.0/docs/index.md +227 -0
  34. stepyard-0.1.0/docs/nodes/builtin.md +679 -0
  35. stepyard-0.1.0/docs/nodes/index.md +28 -0
  36. stepyard-0.1.0/docs/plugins/architecture.md +104 -0
  37. stepyard-0.1.0/docs/plugins/creating.md +212 -0
  38. stepyard-0.1.0/docs/plugins/examples.md +404 -0
  39. stepyard-0.1.0/docs/plugins/faq.md +140 -0
  40. stepyard-0.1.0/docs/plugins/index.md +15 -0
  41. stepyard-0.1.0/docs/plugins/sdk.md +253 -0
  42. stepyard-0.1.0/docs/plugins/testing.md +225 -0
  43. stepyard-0.1.0/docs/plugins/triggers_hooks.md +249 -0
  44. stepyard-0.1.0/examples/README.md +45 -0
  45. stepyard-0.1.0/examples/flows/01_hello.yaml +16 -0
  46. stepyard-0.1.0/examples/flows/02_branching.yaml +25 -0
  47. stepyard-0.1.0/examples/flows/03_loops.yaml +25 -0
  48. stepyard-0.1.0/examples/flows/04_http_healthcheck.yaml +30 -0
  49. stepyard-0.1.0/examples/flows/05_scheduled_backup.yaml +30 -0
  50. stepyard-0.1.0/examples/flows/06_approval_gate.yaml +19 -0
  51. stepyard-0.1.0/examples/flows/07_human_input.yaml +16 -0
  52. stepyard-0.1.0/examples/flows/08_ai_release_notes.yaml +34 -0
  53. stepyard-0.1.0/examples/flows/09_ai_code_review.yaml +39 -0
  54. stepyard-0.1.0/examples/flows/10_ai_log_triage.yaml +38 -0
  55. stepyard-0.1.0/examples/flows/11_event_driven_alert.yaml +23 -0
  56. stepyard-0.1.0/examples/plugin/stepyard-example-plugin/README.md +62 -0
  57. stepyard-0.1.0/examples/plugin/stepyard-example-plugin/pyproject.toml +24 -0
  58. stepyard-0.1.0/examples/plugin/stepyard-example-plugin/stepyard_example_plugin/__init__.py +3 -0
  59. stepyard-0.1.0/examples/plugin/stepyard-example-plugin/stepyard_example_plugin/hooks.py +53 -0
  60. stepyard-0.1.0/examples/plugin/stepyard-example-plugin/stepyard_example_plugin/nodes.py +52 -0
  61. stepyard-0.1.0/examples/plugin/stepyard-example-plugin/stepyard_example_plugin/triggers.py +61 -0
  62. stepyard-0.1.0/mkdocs.yml +123 -0
  63. stepyard-0.1.0/pyproject.toml +148 -0
  64. stepyard-0.1.0/src/stepyard/__init__.py +8 -0
  65. stepyard-0.1.0/src/stepyard/_version.py +24 -0
  66. stepyard-0.1.0/src/stepyard/api/__init__.py +1 -0
  67. stepyard-0.1.0/src/stepyard/api/service.py +540 -0
  68. stepyard-0.1.0/src/stepyard/cli/__init__.py +10 -0
  69. stepyard-0.1.0/src/stepyard/cli/__main__.py +4 -0
  70. stepyard-0.1.0/src/stepyard/cli/app.py +266 -0
  71. stepyard-0.1.0/src/stepyard/cli/commands/__init__.py +1 -0
  72. stepyard-0.1.0/src/stepyard/cli/commands/doctor.py +99 -0
  73. stepyard-0.1.0/src/stepyard/cli/commands/dx.py +155 -0
  74. stepyard-0.1.0/src/stepyard/cli/commands/inspect.py +296 -0
  75. stepyard-0.1.0/src/stepyard/cli/commands/interactive.py +135 -0
  76. stepyard-0.1.0/src/stepyard/cli/commands/logs.py +298 -0
  77. stepyard-0.1.0/src/stepyard/cli/commands/manage.py +211 -0
  78. stepyard-0.1.0/src/stepyard/cli/commands/plugin.py +212 -0
  79. stepyard-0.1.0/src/stepyard/cli/commands/run.py +281 -0
  80. stepyard-0.1.0/src/stepyard/cli/commands/tools.py +514 -0
  81. stepyard-0.1.0/src/stepyard/cli/completions.py +89 -0
  82. stepyard-0.1.0/src/stepyard/cli/renderers/__init__.py +1 -0
  83. stepyard-0.1.0/src/stepyard/cli/renderers/live_view.py +224 -0
  84. stepyard-0.1.0/src/stepyard/cli/repl.py +325 -0
  85. stepyard-0.1.0/src/stepyard/cli/run/__init__.py +1 -0
  86. stepyard-0.1.0/src/stepyard/cli/run/inputs.py +199 -0
  87. stepyard-0.1.0/src/stepyard/cli/run/panels.py +70 -0
  88. stepyard-0.1.0/src/stepyard/cli/run/session.py +546 -0
  89. stepyard-0.1.0/src/stepyard/cli/theme.py +68 -0
  90. stepyard-0.1.0/src/stepyard/cli/ui.py +304 -0
  91. stepyard-0.1.0/src/stepyard/config.py +50 -0
  92. stepyard-0.1.0/src/stepyard/core/__init__.py +18 -0
  93. stepyard-0.1.0/src/stepyard/core/errors.py +174 -0
  94. stepyard-0.1.0/src/stepyard/core/expressions.py +77 -0
  95. stepyard-0.1.0/src/stepyard/core/flow.py +189 -0
  96. stepyard-0.1.0/src/stepyard/core/models.py +91 -0
  97. stepyard-0.1.0/src/stepyard/core/node_executor.py +110 -0
  98. stepyard-0.1.0/src/stepyard/core/ports.py +97 -0
  99. stepyard-0.1.0/src/stepyard/core/service.py +28 -0
  100. stepyard-0.1.0/src/stepyard/engine/__init__.py +1 -0
  101. stepyard-0.1.0/src/stepyard/engine/evaluator.py +120 -0
  102. stepyard-0.1.0/src/stepyard/engine/executor.py +585 -0
  103. stepyard-0.1.0/src/stepyard/engine/navigation.py +73 -0
  104. stepyard-0.1.0/src/stepyard/engine/recorder.py +140 -0
  105. stepyard-0.1.0/src/stepyard/engine/runner.py +103 -0
  106. stepyard-0.1.0/src/stepyard/engine/strategies.py +162 -0
  107. stepyard-0.1.0/src/stepyard/executor/__init__.py +10 -0
  108. stepyard-0.1.0/src/stepyard/executor/process_manager.py +228 -0
  109. stepyard-0.1.0/src/stepyard/executor/worker.py +116 -0
  110. stepyard-0.1.0/src/stepyard/logging_/__init__.py +1 -0
  111. stepyard-0.1.0/src/stepyard/logging_/log_store.py +199 -0
  112. stepyard-0.1.0/src/stepyard/plugin.py +34 -0
  113. stepyard-0.1.0/src/stepyard/plugins/__init__.py +22 -0
  114. stepyard-0.1.0/src/stepyard/plugins/execution.py +94 -0
  115. stepyard-0.1.0/src/stepyard/plugins/host.py +474 -0
  116. stepyard-0.1.0/src/stepyard/plugins/invoker.py +120 -0
  117. stepyard-0.1.0/src/stepyard/plugins/manager.py +315 -0
  118. stepyard-0.1.0/src/stepyard/py.typed +0 -0
  119. stepyard-0.1.0/src/stepyard/scheduler/__init__.py +9 -0
  120. stepyard-0.1.0/src/stepyard/scheduler/__main__.py +90 -0
  121. stepyard-0.1.0/src/stepyard/scheduler/daemon.py +151 -0
  122. stepyard-0.1.0/src/stepyard/scheduler/triggers.py +45 -0
  123. stepyard-0.1.0/src/stepyard/sdk/__init__.py +27 -0
  124. stepyard-0.1.0/src/stepyard/sdk/_stamps.py +37 -0
  125. stepyard-0.1.0/src/stepyard/sdk/hooks.py +20 -0
  126. stepyard-0.1.0/src/stepyard/sdk/inputs.py +34 -0
  127. stepyard-0.1.0/src/stepyard/sdk/node.py +132 -0
  128. stepyard-0.1.0/src/stepyard/sdk/testing.py +134 -0
  129. stepyard-0.1.0/src/stepyard/sdk/trigger.py +32 -0
  130. stepyard-0.1.0/src/stepyard/storage/__init__.py +17 -0
  131. stepyard-0.1.0/src/stepyard/storage/database.py +121 -0
  132. stepyard-0.1.0/src/stepyard/storage/facade.py +295 -0
  133. stepyard-0.1.0/src/stepyard/storage/models.py +58 -0
  134. stepyard-0.1.0/src/stepyard_builtin/__init__.py +1 -0
  135. stepyard-0.1.0/src/stepyard_builtin/file.py +54 -0
  136. stepyard-0.1.0/src/stepyard_builtin/hooks.py +70 -0
  137. stepyard-0.1.0/src/stepyard_builtin/http.py +97 -0
  138. stepyard-0.1.0/src/stepyard_builtin/llm.py +489 -0
  139. stepyard-0.1.0/src/stepyard_builtin/shell.py +105 -0
  140. stepyard-0.1.0/src/stepyard_builtin/system.py +180 -0
  141. stepyard-0.1.0/src/stepyard_builtin/text.py +37 -0
  142. stepyard-0.1.0/src/stepyard_builtin/triggers.py +50 -0
  143. stepyard-0.1.0/tests/__init__.py +1 -0
  144. stepyard-0.1.0/tests/integration/__init__.py +1 -0
  145. stepyard-0.1.0/tests/integration/test_cli.py +78 -0
  146. stepyard-0.1.0/tests/unit/__init__.py +1 -0
  147. stepyard-0.1.0/tests/unit/test_builtins.py +365 -0
  148. stepyard-0.1.0/tests/unit/test_cli_integration.py +104 -0
  149. stepyard-0.1.0/tests/unit/test_env_block.py +549 -0
  150. stepyard-0.1.0/tests/unit/test_flow.py +105 -0
  151. stepyard-0.1.0/tests/unit/test_logs.py +115 -0
  152. stepyard-0.1.0/tests/unit/test_node.py +87 -0
  153. stepyard-0.1.0/tests/unit/test_plugin.py +242 -0
  154. stepyard-0.1.0/tests/unit/test_regression.py +151 -0
  155. stepyard-0.1.0/tests/unit/test_sdk_testing.py +81 -0
  156. stepyard-0.1.0/tests/unit/test_service.py +409 -0
  157. stepyard-0.1.0/tests/unit/test_storage.py +70 -0
  158. stepyard-0.1.0/uv.lock +1574 -0
@@ -0,0 +1,17 @@
1
+ # Default behavior, normalize line endings to LF on commit
2
+ * text=auto eol=lf
3
+
4
+ # Explicitly declare text files
5
+ *.py text eol=lf
6
+ *.md text eol=lf
7
+ *.yaml text eol=lf
8
+ *.yml text eol=lf
9
+ *.json text eol=lf
10
+ *.toml text eol=lf
11
+ *.txt text eol=lf
12
+
13
+ # Ignore binaries
14
+ *.pyc binary
15
+ *.so binary
16
+ *.egg binary
17
+ *.whl binary
@@ -0,0 +1,80 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ name: "Test Python ${{ matrix.python-version }}"
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
16
+
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+
20
+ - name: Set up Python ${{ matrix.python-version }}
21
+ uses: actions/setup-python@v5
22
+ with:
23
+ python-version: ${{ matrix.python-version }}
24
+
25
+ - name: Install uv
26
+ uses: astral-sh/setup-uv@v3
27
+
28
+ - name: Install dependencies
29
+ run: uv sync --dev
30
+
31
+ - name: Lint (ruff)
32
+ run: uv run ruff check src/ tests/
33
+
34
+ - name: Format check (ruff)
35
+ run: uv run ruff format --check src/ tests/
36
+
37
+ - name: Type-check (mypy)
38
+ run: uv run mypy src/stepyard src/stepyard_builtin
39
+
40
+ - name: Test (pytest + coverage)
41
+ run: uv run pytest --cov=src --cov-report=term-missing --cov-report=xml
42
+
43
+ - name: Upload coverage to Codecov
44
+ if: matrix.python-version == '3.11'
45
+ uses: codecov/codecov-action@v4
46
+ with:
47
+ files: coverage.xml
48
+ fail_ci_if_error: false
49
+ token: ${{ secrets.CODECOV_TOKEN }}
50
+
51
+ sdk-contract:
52
+ name: "SDK contract tests"
53
+ runs-on: ubuntu-latest
54
+ steps:
55
+ - uses: actions/checkout@v4
56
+
57
+ - name: Set up Python 3.11
58
+ uses: actions/setup-python@v5
59
+ with:
60
+ python-version: "3.11"
61
+
62
+ - name: Install uv
63
+ uses: astral-sh/setup-uv@v3
64
+
65
+ - name: Install dependencies
66
+ run: uv sync --dev
67
+
68
+ - name: SDK contract - node + trigger + hook load via PluginHost
69
+ run: |
70
+ uv run python - <<'EOF'
71
+ from stepyard.plugin import PluginHost, DiscoveryReport
72
+ report = PluginHost(".").discover()
73
+ assert isinstance(report, DiscoveryReport)
74
+ print("Nodes:", list(report.registry.nodes.keys())[:5])
75
+ print("Triggers:", list(report.registry.triggers.keys())[:5])
76
+ print("Errors:", report.errors)
77
+ assert report.registry.get_node("shell.run") is not None
78
+ assert report.registry.get_node("http.request") is not None
79
+ print("SDK contract OK")
80
+ EOF
@@ -0,0 +1,59 @@
1
+ name: Docs
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - "docs/**"
8
+ - "mkdocs.yml"
9
+ - ".github/workflows/docs.yml"
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: read
14
+ pages: write
15
+ id-token: write
16
+
17
+ concurrency:
18
+ group: pages
19
+ cancel-in-progress: false
20
+
21
+ jobs:
22
+ build:
23
+ name: Build docs
24
+ runs-on: ubuntu-latest
25
+
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+
29
+ - name: Set up Python
30
+ uses: actions/setup-python@v5
31
+ with:
32
+ python-version: "3.12"
33
+
34
+ - name: Install uv
35
+ uses: astral-sh/setup-uv@v3
36
+
37
+ - name: Install dependencies
38
+ run: uv sync --extra docs
39
+
40
+ - name: Build docs
41
+ run: uv run mkdocs build --strict
42
+
43
+ - name: Upload Pages artifact
44
+ uses: actions/upload-pages-artifact@v3
45
+ with:
46
+ path: site/
47
+
48
+ deploy:
49
+ name: Deploy to GitHub Pages
50
+ needs: build
51
+ runs-on: ubuntu-latest
52
+ environment:
53
+ name: github-pages
54
+ url: ${{ steps.deployment.outputs.page_url }}
55
+
56
+ steps:
57
+ - name: Deploy to GitHub Pages
58
+ id: deployment
59
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,109 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v[0-9]+.[0-9]+.[0-9]*"
7
+
8
+ permissions:
9
+ contents: write # required for creating GitHub Releases
10
+ id-token: write # required for PyPI OIDC trusted publishing
11
+
12
+ jobs:
13
+ # ── 1. Run the full test suite first ──────────────────────────────────────
14
+ test:
15
+ name: "Test Python ${{ matrix.python-version }}"
16
+ runs-on: ubuntu-latest
17
+ strategy:
18
+ fail-fast: true
19
+ matrix:
20
+ python-version: ["3.10", "3.12"]
21
+
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ with:
25
+ fetch-depth: 0 # hatch-vcs needs full history to read tags
26
+
27
+ - name: Set up Python ${{ matrix.python-version }}
28
+ uses: actions/setup-python@v5
29
+ with:
30
+ python-version: ${{ matrix.python-version }}
31
+
32
+ - name: Install uv
33
+ uses: astral-sh/setup-uv@v3
34
+
35
+ - name: Install dependencies
36
+ run: uv sync --dev
37
+
38
+ - name: Lint
39
+ run: uv run ruff check src/ tests/
40
+
41
+ - name: Test
42
+ run: uv run pytest --tb=short -q
43
+
44
+ # ── 2. Build wheel + sdist ────────────────────────────────────────────────
45
+ build:
46
+ name: Build distribution
47
+ needs: test
48
+ runs-on: ubuntu-latest
49
+
50
+ steps:
51
+ - uses: actions/checkout@v4
52
+ with:
53
+ fetch-depth: 0
54
+
55
+ - name: Set up Python
56
+ uses: actions/setup-python@v5
57
+ with:
58
+ python-version: "3.12"
59
+
60
+ - name: Install uv
61
+ uses: astral-sh/setup-uv@v3
62
+
63
+ - name: Build wheel and sdist
64
+ run: uv build
65
+
66
+ - name: Upload dist artifacts
67
+ uses: actions/upload-artifact@v4
68
+ with:
69
+ name: dist
70
+ path: dist/
71
+
72
+ # ── 3. Create GitHub Release ──────────────────────────────────────────────
73
+ github-release:
74
+ name: GitHub Release
75
+ needs: build
76
+ runs-on: ubuntu-latest
77
+
78
+ steps:
79
+ - name: Download dist artifacts
80
+ uses: actions/download-artifact@v4
81
+ with:
82
+ name: dist
83
+ path: dist/
84
+
85
+ - name: Create GitHub Release
86
+ uses: softprops/action-gh-release@v2
87
+ with:
88
+ files: dist/*
89
+ generate_release_notes: true # auto-generates changelog from commits
90
+ fail_on_unmatched_files: true
91
+
92
+ # ── 4. Publish to PyPI via Trusted Publishing ─────────────────────────────
93
+ # Requires a Trusted Publisher configured at https://pypi.org/manage/account/publishing/
94
+ # Owner: rorlikowski Repository: stepyard Workflow: release.yml Environment: pypi
95
+ pypi-publish:
96
+ name: Publish to PyPI
97
+ needs: build
98
+ runs-on: ubuntu-latest
99
+ environment: pypi
100
+
101
+ steps:
102
+ - name: Download dist artifacts
103
+ uses: actions/download-artifact@v4
104
+ with:
105
+ name: dist
106
+ path: dist/
107
+
108
+ - name: Publish to PyPI
109
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,74 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ src/stepyard/_version.py
11
+ .Python
12
+ build/
13
+ develop-eggs/
14
+ dist/
15
+ downloads/
16
+ eggs/
17
+ .eggs/
18
+ lib/
19
+ lib64/
20
+ parts/
21
+ sdist/
22
+ var/
23
+ wheels/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # Virtual environments
31
+ .env
32
+ .venv
33
+ env/
34
+ venv/
35
+ ENV/
36
+ env.bak/
37
+ venv.bak/
38
+
39
+ # Stepyard specifics
40
+ .stepyard/
41
+ .stepyard_history
42
+ runs/
43
+ logs/
44
+ .stepyard.pid
45
+ scheduler.pid
46
+ stepyard.lock
47
+
48
+ # Testing / coverage
49
+ .coverage
50
+ .coverage.*
51
+ .cache
52
+ nosetests.xml
53
+ coverage.xml
54
+ *.cover
55
+ *.py,cover
56
+ .hypothesis/
57
+ .pytest_cache/
58
+ cover/
59
+
60
+ # IDE / Editor
61
+ .idea/
62
+ .vscode/
63
+ *.swp
64
+ *.swo
65
+ .DS_Store
66
+
67
+ # Static analysis
68
+ .mypy_cache/
69
+ .ruff_cache/
70
+
71
+ # Generated build / docs output
72
+ site/
73
+ report.txt
74
+ .stepyard_history
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## [0.1.0] - 2026-06-14
4
+
5
+ Initial open-source release.
@@ -0,0 +1,91 @@
1
+ # Contributing to Stepyard
2
+
3
+ Thank you for your interest in contributing! This document explains how to set up the development environment, run the tests, and submit changes.
4
+
5
+ ---
6
+
7
+ ## Development setup
8
+
9
+ **Requirements:** Python 3.10+, [uv](https://github.com/astral-sh/uv) (recommended) or pip.
10
+
11
+ ```bash
12
+ git clone https://github.com/rorlikowski/stepyard
13
+ cd stepyard
14
+
15
+ # Install all dependencies (including dev and docs extras)
16
+ uv pip install -e ".[dev,docs]"
17
+
18
+ # Verify the install
19
+ uv run stepyard doctor
20
+ ```
21
+
22
+ ---
23
+
24
+ ## Running the tests
25
+
26
+ ```bash
27
+ # All unit tests
28
+ pytest
29
+
30
+ # With coverage report
31
+ pytest --cov=src/stepyard --cov=src/stepyard_builtin --cov-report=term-missing
32
+
33
+ # Single file
34
+ pytest tests/unit/test_flow.py -v
35
+ ```
36
+
37
+ ---
38
+
39
+ ## Linting and formatting
40
+
41
+ ```bash
42
+ # Lint
43
+ ruff check src/ tests/
44
+
45
+ # Type-check
46
+ mypy src/stepyard src/stepyard_builtin
47
+
48
+ # Format
49
+ ruff format src/ tests/
50
+ ```
51
+
52
+ All checks run automatically in CI on every pull request.
53
+
54
+ ---
55
+
56
+ ## Docs
57
+
58
+ ```bash
59
+ # Preview locally
60
+ uv run mkdocs serve
61
+
62
+ # Build static site
63
+ uv run mkdocs build
64
+ ```
65
+
66
+ ---
67
+
68
+ ## Submitting a pull request
69
+
70
+ 1. Fork the repository and create a branch from `main`.
71
+ 2. Make your changes, add tests, and ensure all checks pass.
72
+ 3. Open a pull request against `main` with a clear description of what you changed and why.
73
+ 4. A maintainer will review and merge it.
74
+
75
+ ---
76
+
77
+ ## Reporting bugs
78
+
79
+ Open an issue on GitHub with:
80
+ - The `stepyard --version` output
81
+ - The flow YAML (redact any secrets)
82
+ - The full error output or `stepyard logs <run-id>` output
83
+
84
+ ---
85
+
86
+ ## Coding conventions
87
+
88
+ - Python 3.10+, type-annotated, `ruff`-formatted.
89
+ - New nodes go in `src/stepyard_builtin/` and must be registered in `pyproject.toml`.
90
+ - New CLI commands use `click` and go under `src/stepyard/cli/commands/`.
91
+ - Write tests for every new feature under `tests/unit/` or `tests/integration/`.
stepyard-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ryszard Orlikowski
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.