sshscript 4.0.1__tar.gz → 4.0.2__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 (111) hide show
  1. {sshscript-4.0.1 → sshscript-4.0.2}/API_GUIDE.md +15 -13
  2. {sshscript-4.0.1 → sshscript-4.0.2}/CHANGELOG.md +10 -0
  3. {sshscript-4.0.1/src/sshscript.egg-info → sshscript-4.0.2}/PKG-INFO +8 -6
  4. {sshscript-4.0.1 → sshscript-4.0.2}/README.md +7 -5
  5. {sshscript-4.0.1 → sshscript-4.0.2}/VERSIONING.md +4 -4
  6. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/_version.py +1 -1
  7. {sshscript-4.0.1 → sshscript-4.0.2/src/sshscript.egg-info}/PKG-INFO +8 -6
  8. {sshscript-4.0.1 → sshscript-4.0.2}/tools/sync_api_guide.py +1 -1
  9. {sshscript-4.0.1 → sshscript-4.0.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  10. {sshscript-4.0.1 → sshscript-4.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  11. {sshscript-4.0.1 → sshscript-4.0.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  12. {sshscript-4.0.1 → sshscript-4.0.2}/.github/dependabot.yml +0 -0
  13. {sshscript-4.0.1 → sshscript-4.0.2}/.github/pull_request_template.md +0 -0
  14. {sshscript-4.0.1 → sshscript-4.0.2}/.github/workflows/ci.yml +0 -0
  15. {sshscript-4.0.1 → sshscript-4.0.2}/.github/workflows/codeql.yml +0 -0
  16. {sshscript-4.0.1 → sshscript-4.0.2}/.github/workflows/release.yml +0 -0
  17. {sshscript-4.0.1 → sshscript-4.0.2}/.gitignore +0 -0
  18. {sshscript-4.0.1 → sshscript-4.0.2}/CODE_OF_CONDUCT.md +0 -0
  19. {sshscript-4.0.1 → sshscript-4.0.2}/CONTRIBUTING.md +0 -0
  20. {sshscript-4.0.1 → sshscript-4.0.2}/EXCEPTIONS.md +0 -0
  21. {sshscript-4.0.1 → sshscript-4.0.2}/LICENSE.txt +0 -0
  22. {sshscript-4.0.1 → sshscript-4.0.2}/MANIFEST.in +0 -0
  23. {sshscript-4.0.1 → sshscript-4.0.2}/RELEASING.md +0 -0
  24. {sshscript-4.0.1 → sshscript-4.0.2}/SECURITY.md +0 -0
  25. {sshscript-4.0.1 → sshscript-4.0.2}/SUPPORT.md +0 -0
  26. {sshscript-4.0.1 → sshscript-4.0.2}/pyproject.toml +0 -0
  27. {sshscript-4.0.1 → sshscript-4.0.2}/setup.cfg +0 -0
  28. {sshscript-4.0.1 → sshscript-4.0.2}/src/_sshscript_cli.py +0 -0
  29. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/__init__.py +0 -0
  30. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/__init__.pyi +0 -0
  31. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/_runtime.py +0 -0
  32. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/channelgeneric.py +0 -0
  33. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/channelssh.py +0 -0
  34. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/channelsubprocess.py +0 -0
  35. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/channelutils.py +0 -0
  36. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/commandjob.py +0 -0
  37. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/commandjob.pyi +0 -0
  38. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/commandresult.py +0 -0
  39. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/commandresult.pyi +0 -0
  40. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/consolejob.py +0 -0
  41. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/dollar.py +0 -0
  42. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/dollarchanger.py +0 -0
  43. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/dollarparser.py +0 -0
  44. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/errorutils.py +0 -0
  45. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/patching.py +0 -0
  46. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/py.typed +0 -0
  47. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/session.py +0 -0
  48. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/session.pyi +0 -0
  49. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/sessionsettings.py +0 -0
  50. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/sessionwrapper.py +0 -0
  51. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/sessionwrapper.pyi +0 -0
  52. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/spyimporter.py +0 -0
  53. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/sshconfig.py +0 -0
  54. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/sshscript.py +0 -0
  55. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/stdio.py +0 -0
  56. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/tokenparser.py +0 -0
  57. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/README.console-authentication.md +0 -0
  58. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/README.console-results.md +0 -0
  59. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/README.dollar-syntax-tests.md +0 -0
  60. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/README.module-tests.md +0 -0
  61. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/check_package_asserts.py +0 -0
  62. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/dollar_syntax.spy +0 -0
  63. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/dollar_syntax_fixture.spy +0 -0
  64. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/language_fixture.spy +0 -0
  65. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_channelgeneric_expect.py +0 -0
  66. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_check_file.py +0 -0
  67. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_command_api.py +0 -0
  68. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_command_job.py +0 -0
  69. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_console_authentication.py +0 -0
  70. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_console_job.py +0 -0
  71. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_console_results.py +0 -0
  72. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_dollar_command_escapes.py +0 -0
  73. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_file_transfer.py +0 -0
  74. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_logger_api.py +0 -0
  75. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_logger_integration.py +0 -0
  76. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_native_auth_runner.py +0 -0
  77. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_native_console_authentication.py +0 -0
  78. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_openssh_integration.py +0 -0
  79. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_production_contract.py +0 -0
  80. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_public_types.py +0 -0
  81. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_python_version.py +0 -0
  82. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_recommended_examples.py +0 -0
  83. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_release_inputs.py +0 -0
  84. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_session_close_reporting.py +0 -0
  85. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_session_proxy_cleanup.py +0 -0
  86. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_session_settings.py +0 -0
  87. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_spy_source_mapping.py +0 -0
  88. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_spy_thread_session.py +0 -0
  89. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_ssh_config.py +0 -0
  90. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_ssh_security.py +0 -0
  91. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_sshscript_dollar_syntax.py +0 -0
  92. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_sshscript_module.py +0 -0
  93. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_stdin_contract.py +0 -0
  94. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_stdio_dynamic_string.py +0 -0
  95. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_syntax_error.spy +0 -0
  96. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_update_check.py +0 -0
  97. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript/unittest/test_version_policy.py +0 -0
  98. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript.egg-info/SOURCES.txt +0 -0
  99. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript.egg-info/dependency_links.txt +0 -0
  100. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript.egg-info/entry_points.txt +0 -0
  101. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript.egg-info/requires.txt +0 -0
  102. {sshscript-4.0.1 → sshscript-4.0.2}/src/sshscript.egg-info/top_level.txt +0 -0
  103. {sshscript-4.0.1 → sshscript-4.0.2}/tools/check_baseline_examples.py +0 -0
  104. {sshscript-4.0.1 → sshscript-4.0.2}/tools/check_public_types.py +0 -0
  105. {sshscript-4.0.1 → sshscript-4.0.2}/tools/check_release.py +0 -0
  106. {sshscript-4.0.1 → sshscript-4.0.2}/tools/prepare_release.py +0 -0
  107. {sshscript-4.0.1 → sshscript-4.0.2}/tools/publish_release.py +0 -0
  108. {sshscript-4.0.1 → sshscript-4.0.2}/tools/run_checks.py +0 -0
  109. {sshscript-4.0.1 → sshscript-4.0.2}/tools/run_native_auth_ci.py +0 -0
  110. {sshscript-4.0.1 → sshscript-4.0.2}/tools/setup_openssh_ci.sh +0 -0
  111. {sshscript-4.0.1 → sshscript-4.0.2}/tools/version_policy.py +0 -0
@@ -1,8 +1,8 @@
1
1
  # Recommended SSHScript API
2
2
 
3
3
  This is the canonical entry point for new code and AI-generated examples.
4
- **Current contract: 4.0.1**, Python 3.11+. Sections marked **4.0** require
5
- SSHScript 4.0.1; installing `sshscript==3.1.5` does not provide them.
4
+ **Current contract: 4.0.2**, Python 3.11+. Sections marked **4.0** require
5
+ SSHScript 4.0.2; installing `sshscript==3.1.5` does not provide them.
6
6
  Examples labelled 3.1.5 remain verified compatibility examples for that baseline.
7
7
  Pin the exact artifact version and record it with execution diagnostics when
8
8
  handing off automation. See [version policy and migration](VERSIONING.md).
@@ -29,9 +29,11 @@ identifiers and handoff reports are future work, not a current API guarantee.
29
29
  | Long-running program | **4.0:** `start(timeout=None)`, `stop()`, `wait()` |
30
30
  | Session-wide failure/output policy | **4.0:** `set(...)`, `get(...)`, or matching properties |
31
31
 
32
- ## 3.1.5: one command, one retained result
32
+ ## One command, one retained result (4.0; compatible with 3.1.5)
33
33
 
34
- Install the baseline with `python -m pip install "sshscript==3.1.5"`.
34
+ Install the current release with `python -m pip install "sshscript==4.0.2"`.
35
+ For reproducing only the historical compatibility baseline, explicitly install
36
+ `sshscript==3.1.5`; the 4.0 sections require the current release.
35
37
  An argv list is one command, not a batch. Shell-looking argument text stays data.
36
38
 
37
39
  <!-- example: {"id":"argv", "profile":"3.1.5", "stdout":"a; b\n"} -->
@@ -67,7 +69,7 @@ with closing(Session()) as local:
67
69
  print(f"failed: {error.returncode}")
68
70
  ```
69
71
 
70
- ## 3.1.5: SSH and optional dollar syntax
72
+ ## SSH and optional dollar syntax (4.0; compatible with 3.1.5)
71
73
 
72
74
  Replace the example host with your configured host and verified known-host key.
73
75
  CI executes this block with a local SSH protocol fixture in place of the login;
@@ -99,7 +101,7 @@ print(result.stdout)
99
101
 
100
102
  ## 4.0: settings and managed jobs
101
103
 
102
- Use SSHScript 4.0.1 for the following examples. CLI `-v`, `--stderr`, and
104
+ Use SSHScript 4.0.2 for the following examples. CLI `-v`, `--stderr`, and
103
105
  `--debug` override root defaults only for that execution. Child Sessions copy
104
106
  their parent's settings. `set()` validates before changing anything; `get()`
105
107
  returns a copy. Explicit command options override Session policy.
@@ -118,7 +120,7 @@ the settings dictionary at creation; the policy object itself is shared, so
118
120
  custom policies with mutable state must account for reuse. Changing the setting
119
121
  does not reconfigure existing connections.
120
122
 
121
- <!-- example: {"id":"settings", "profile":"4.0.1", "stdout":"True\n1\n"} -->
123
+ <!-- example: {"id":"settings", "profile":"4.0.2", "stdout":"True\n1\n"} -->
122
124
  ```python
123
125
  from contextlib import closing
124
126
  import paramiko
@@ -140,7 +142,7 @@ semantics; do not combine it with `command_timeout`.
140
142
  For an indefinite command such as tcpdump, use `start(timeout=None)`. This safe
141
143
  local example uses a small Python process instead of capturing network traffic:
142
144
 
143
- <!-- example: {"id":"stop", "profile":"4.0.1", "stdout":"cancelled confirmed\n"} -->
145
+ <!-- example: {"id":"stop", "profile":"4.0.2", "stdout":"cancelled confirmed\n"} -->
144
146
  ```python
145
147
  from contextlib import closing
146
148
  import sys
@@ -179,7 +181,7 @@ legacy SSH behavior which appended a newline to strings: if a consumer
179
181
  needs a line, migrate `input=password` to `input=password + "\n"` explicitly.
180
182
  Published 3.1.5 still has the legacy SSH behavior.
181
183
 
182
- <!-- example: {"id":"exact-stdin", "profile":"4.0.1", "stdout":"'abc'\n'abc\\n'\n"} -->
184
+ <!-- example: {"id":"exact-stdin", "profile":"4.0.2", "stdout":"'abc'\n'abc\\n'\n"} -->
183
185
  ```python
184
186
  from contextlib import closing
185
187
  import sys
@@ -248,7 +250,7 @@ or unpack exactly `stdout, stderr, exitcode`. This changes the released 3.1.5
248
250
  console contract: old `stdout, stderr = shell(command)` must be migrated.
249
251
  Shell calls accept command strings; argv execution belongs to Session.
250
252
 
251
- <!-- example: {"id":"shell-result", "profile":"4.0.1", "stdout":"first 0\n"} -->
253
+ <!-- example: {"id":"shell-result", "profile":"4.0.2", "stdout":"first 0\n"} -->
252
254
  ```python
253
255
  from contextlib import closing
254
256
  from sshscript import Session
@@ -304,7 +306,7 @@ matching: `iter_stdout()` yields chunks, not packets or lines. Put `stop()` in
304
306
  `finally`, so condition matches, exceptions, and KeyboardInterrupt all trigger
305
307
  cleanup. This credential-free example uses a continuous Python process:
306
308
 
307
- <!-- example: {"id":"stream-condition", "profile":"4.0.1", "stdout":"cancelled confirmed\n"} -->
309
+ <!-- example: {"id":"stream-condition", "profile":"4.0.2", "stdout":"cancelled confirmed\n"} -->
308
310
  ```python
309
311
  from contextlib import closing
310
312
  import sys
@@ -369,7 +371,7 @@ the current Bash console's channel, cwd, environment and identity. It does not
369
371
  launch through the underlying Session. Ordinary `console(command)` / `$command`
370
372
  still waits and returns `CommandResult`; no migration is needed for finite commands.
371
373
 
372
- <!-- example: {"id":"console-stream", "profile":"4.0.1", "stdout":"cancelled confirmed\nconsole-alive\n"} -->
374
+ <!-- example: {"id":"console-stream", "profile":"4.0.2", "stdout":"cancelled confirmed\nconsole-alive\n"} -->
373
375
  ```python
374
376
  from contextlib import closing
375
377
  import shlex
@@ -509,7 +511,7 @@ remains available for other authentication prompt formats.
509
511
  These transcripts require a real local account and its authentication policy;
510
512
  they are manual examples, separate from the credential-free CI examples above.
511
513
  Read passwords with `getpass` rather than storing them in the script. The new
512
- behavior requires 4.0.1 and does not apply to the installed 3.1.5 release.
514
+ behavior requires 4.0.2 and does not apply to the installed 3.1.5 release.
513
515
 
514
516
  Open a root console through sudo and allow up to 15 seconds for entry:
515
517
 
@@ -3,6 +3,16 @@
3
3
  This project records user-visible changes here. Release artifacts and their
4
4
  provenance are available from the linked GitHub Release and PyPI pages.
5
5
 
6
+ ## 4.0.2 — 2026-10-09
7
+
8
+ - Align the README, current installation commands, website title, navigation,
9
+ footer, and version metadata with the current 4.0 release.
10
+ - Point general PyPI and GitHub Release links to current entry points; retain
11
+ explicitly labelled historical releases and existing documentation URLs.
12
+ - Check current website version labels and release links during documentation
13
+ validation, including rendered header/footer links and anchors.
14
+ - Preserve the 4.0.1 public execution contract; no runtime behavior changes.
15
+
6
16
  ## 4.0.1 — 2026-10-08
7
17
 
8
18
  - Settle the legacy command worker before propagating timeout/transport errors;
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sshscript
3
- Version: 4.0.1
3
+ Version: 4.0.2
4
4
  Summary: Python automation for local processes, SSH, and SSHScript .spy files
5
5
  Author-email: "Yeh, Hsin-Yuan" <iapyeh@gmail.com>
6
6
  License-Expression: MIT
@@ -47,7 +47,7 @@ output and status, distinguish failure from timeout, and make cleanup and
47
47
  unknown termination explicit. A successful command exit is evidence about
48
48
  that command; verify the deployment or other application outcome separately.
49
49
 
50
- **Current release:** [4.0.1](https://github.com/iapyeh/sshscript/releases/tag/v4.0.1)
50
+ **Current release:** [4.0.2](https://github.com/iapyeh/sshscript/releases/tag/v4.0.2)
51
51
  (Production/Stable) · **Python:** 3.11 or newer · **Tested:** Python
52
52
  3.11–3.14 on Linux and macOS
53
53
 
@@ -57,7 +57,8 @@ that command; verify the deployment or other application outcome separately.
57
57
  [Security](https://github.com/iapyeh/sshscript/security/policy) ·
58
58
  [Support](https://github.com/iapyeh/sshscript/blob/release/SUPPORT.md)
59
59
 
60
- **Version 4.0.1** introduces the incompatible 4.0 execution contract.
60
+ **Version 4.0.2** maintains the 4.0 execution contract introduced in 4.0.1.
61
+ This patch aligns the published documentation and installation links.
61
62
  Upgrade 3.1.5 automation using the migration guide and application regressions.
62
63
  See [version policy and migration](VERSIONING.md) before upgrading automation.
63
64
 
@@ -114,7 +115,7 @@ pin SSHScript and all transitive dependencies in your application's lock file.
114
115
  To install this release explicitly:
115
116
 
116
117
  ```sh
117
- python3 -m pip install "sshscript==3.1.5"
118
+ python3 -m pip install "sshscript==4.0.2"
118
119
  ```
119
120
 
120
121
  Use `python3 -m pip install --upgrade sshscript` to upgrade. The optional
@@ -123,7 +124,8 @@ it never installs an update by itself.
123
124
 
124
125
  ## 60-second local quickstart
125
126
 
126
- This example uses the published 3.1.5 command API.
127
+ This example runs on 4.0.2 and retains compatibility with the 3.1.5 command API.
128
+ The metadata below records that older compatibility baseline.
127
129
 
128
130
  <!-- example: {"id":"readme-quickstart", "profile":"3.1.5", "stdout":"sshscript is ready\nexit code: 0\n"} -->
129
131
  ```python
@@ -374,7 +376,7 @@ Unknown and changed host keys are rejected unless the caller explicitly
374
376
  supplies a different Paramiko policy. Do not use automatic key acceptance in a
375
377
  production workflow unless a separate trusted bootstrap process has already
376
378
  verified the key. See the
377
- [SSHScript v3 documentation](https://iapyeh.github.io/sshscript/v3a/) for
379
+ [SSHScript documentation](https://iapyeh.github.io/sshscript/v3a/) for
378
380
  nested connections, timeouts, file transfer, `sudo`, `su`, and interactive
379
381
  programs.
380
382
 
@@ -16,7 +16,7 @@ output and status, distinguish failure from timeout, and make cleanup and
16
16
  unknown termination explicit. A successful command exit is evidence about
17
17
  that command; verify the deployment or other application outcome separately.
18
18
 
19
- **Current release:** [4.0.1](https://github.com/iapyeh/sshscript/releases/tag/v4.0.1)
19
+ **Current release:** [4.0.2](https://github.com/iapyeh/sshscript/releases/tag/v4.0.2)
20
20
  (Production/Stable) · **Python:** 3.11 or newer · **Tested:** Python
21
21
  3.11–3.14 on Linux and macOS
22
22
 
@@ -26,7 +26,8 @@ that command; verify the deployment or other application outcome separately.
26
26
  [Security](https://github.com/iapyeh/sshscript/security/policy) ·
27
27
  [Support](https://github.com/iapyeh/sshscript/blob/release/SUPPORT.md)
28
28
 
29
- **Version 4.0.1** introduces the incompatible 4.0 execution contract.
29
+ **Version 4.0.2** maintains the 4.0 execution contract introduced in 4.0.1.
30
+ This patch aligns the published documentation and installation links.
30
31
  Upgrade 3.1.5 automation using the migration guide and application regressions.
31
32
  See [version policy and migration](VERSIONING.md) before upgrading automation.
32
33
 
@@ -83,7 +84,7 @@ pin SSHScript and all transitive dependencies in your application's lock file.
83
84
  To install this release explicitly:
84
85
 
85
86
  ```sh
86
- python3 -m pip install "sshscript==3.1.5"
87
+ python3 -m pip install "sshscript==4.0.2"
87
88
  ```
88
89
 
89
90
  Use `python3 -m pip install --upgrade sshscript` to upgrade. The optional
@@ -92,7 +93,8 @@ it never installs an update by itself.
92
93
 
93
94
  ## 60-second local quickstart
94
95
 
95
- This example uses the published 3.1.5 command API.
96
+ This example runs on 4.0.2 and retains compatibility with the 3.1.5 command API.
97
+ The metadata below records that older compatibility baseline.
96
98
 
97
99
  <!-- example: {"id":"readme-quickstart", "profile":"3.1.5", "stdout":"sshscript is ready\nexit code: 0\n"} -->
98
100
  ```python
@@ -343,7 +345,7 @@ Unknown and changed host keys are rejected unless the caller explicitly
343
345
  supplies a different Paramiko policy. Do not use automatic key acceptance in a
344
346
  production workflow unless a separate trusted bootstrap process has already
345
347
  verified the key. See the
346
- [SSHScript v3 documentation](https://iapyeh.github.io/sshscript/v3a/) for
348
+ [SSHScript documentation](https://iapyeh.github.io/sshscript/v3a/) for
347
349
  nested connections, timeouts, file transfer, `sudo`, `su`, and interactive
348
350
  programs.
349
351
 
@@ -9,11 +9,11 @@ claim that a command or deployment is safe or successful.
9
9
  | Version | Contract and status |
10
10
  | --- | --- |
11
11
  | 3.1.5 | Published baseline described in API_GUIDE.md; one-shot Session commands return CommandResult, but persistent console calls return two live buffers. |
12
- | 4.0.1 | Production contract: completed console results, settings, managed jobs and authenticated-console handshakes; incompatible with parts of 3.1.5. |
12
+ | 4.0.2 | Production contract: completed console results, settings, managed jobs and authenticated-console handshakes; incompatible with parts of 3.1.5. |
13
13
 
14
- Version 4.0.1 is the first published 4.0 contract, promoted from the development
15
- line after release validation. The patch component was incremented once for
16
- this publication. Native-system validation limits remain documented.
14
+ Version 4.0.1 introduced the published 4.0 contract after release validation.
15
+ Version 4.0.2 is a documentation and link maintenance patch with the same public
16
+ execution contract. Native-system validation limits remain documented.
17
17
  Use the normal Python Session API as the canonical entry point; optional .spy
18
18
  syntax follows the same versioned execution contract.
19
19
 
@@ -1,3 +1,3 @@
1
1
  """Single source of the SSHScript package version."""
2
2
 
3
- __version__ = "4.0.1"
3
+ __version__ = "4.0.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sshscript
3
- Version: 4.0.1
3
+ Version: 4.0.2
4
4
  Summary: Python automation for local processes, SSH, and SSHScript .spy files
5
5
  Author-email: "Yeh, Hsin-Yuan" <iapyeh@gmail.com>
6
6
  License-Expression: MIT
@@ -47,7 +47,7 @@ output and status, distinguish failure from timeout, and make cleanup and
47
47
  unknown termination explicit. A successful command exit is evidence about
48
48
  that command; verify the deployment or other application outcome separately.
49
49
 
50
- **Current release:** [4.0.1](https://github.com/iapyeh/sshscript/releases/tag/v4.0.1)
50
+ **Current release:** [4.0.2](https://github.com/iapyeh/sshscript/releases/tag/v4.0.2)
51
51
  (Production/Stable) · **Python:** 3.11 or newer · **Tested:** Python
52
52
  3.11–3.14 on Linux and macOS
53
53
 
@@ -57,7 +57,8 @@ that command; verify the deployment or other application outcome separately.
57
57
  [Security](https://github.com/iapyeh/sshscript/security/policy) ·
58
58
  [Support](https://github.com/iapyeh/sshscript/blob/release/SUPPORT.md)
59
59
 
60
- **Version 4.0.1** introduces the incompatible 4.0 execution contract.
60
+ **Version 4.0.2** maintains the 4.0 execution contract introduced in 4.0.1.
61
+ This patch aligns the published documentation and installation links.
61
62
  Upgrade 3.1.5 automation using the migration guide and application regressions.
62
63
  See [version policy and migration](VERSIONING.md) before upgrading automation.
63
64
 
@@ -114,7 +115,7 @@ pin SSHScript and all transitive dependencies in your application's lock file.
114
115
  To install this release explicitly:
115
116
 
116
117
  ```sh
117
- python3 -m pip install "sshscript==3.1.5"
118
+ python3 -m pip install "sshscript==4.0.2"
118
119
  ```
119
120
 
120
121
  Use `python3 -m pip install --upgrade sshscript` to upgrade. The optional
@@ -123,7 +124,8 @@ it never installs an update by itself.
123
124
 
124
125
  ## 60-second local quickstart
125
126
 
126
- This example uses the published 3.1.5 command API.
127
+ This example runs on 4.0.2 and retains compatibility with the 3.1.5 command API.
128
+ The metadata below records that older compatibility baseline.
127
129
 
128
130
  <!-- example: {"id":"readme-quickstart", "profile":"3.1.5", "stdout":"sshscript is ready\nexit code: 0\n"} -->
129
131
  ```python
@@ -374,7 +376,7 @@ Unknown and changed host keys are rejected unless the caller explicitly
374
376
  supplies a different Paramiko policy. Do not use automatic key acceptance in a
375
377
  production workflow unless a separate trusted bootstrap process has already
376
378
  verified the key. See the
377
- [SSHScript v3 documentation](https://iapyeh.github.io/sshscript/v3a/) for
379
+ [SSHScript documentation](https://iapyeh.github.io/sshscript/v3a/) for
378
380
  nested connections, timeouts, file transfer, `sudo`, `su`, and interactive
379
381
  programs.
380
382
 
@@ -8,7 +8,7 @@ from pathlib import Path
8
8
 
9
9
  HEADER = '''---
10
10
  title: "Recommended SSHScript API"
11
- parent: "SSHScript v3.1 Documentation"
11
+ parent: "SSHScript Documentation"
12
12
  nav_order: 0
13
13
  permalink: /v3a/recommended-api/
14
14
  ---
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