strands-shell 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 (116) hide show
  1. strands_shell-0.1.0/.cargo/config.toml +4 -0
  2. strands_shell-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +111 -0
  3. strands_shell-0.1.0/.github/ISSUE_TEMPLATE/config.yml +12 -0
  4. strands_shell-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +54 -0
  5. strands_shell-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +41 -0
  6. strands_shell-0.1.0/.github/actions/stamp-version/action.yml +62 -0
  7. strands_shell-0.1.0/.github/dependabot.yml +89 -0
  8. strands_shell-0.1.0/.github/workflows/ci.yml +148 -0
  9. strands_shell-0.1.0/.github/workflows/pr-title.yml +36 -0
  10. strands_shell-0.1.0/.github/workflows/release.yml +458 -0
  11. strands_shell-0.1.0/.gitignore +24 -0
  12. strands_shell-0.1.0/AGENTS.md +167 -0
  13. strands_shell-0.1.0/CODE_OF_CONDUCT.md +4 -0
  14. strands_shell-0.1.0/COMMANDS.md +133 -0
  15. strands_shell-0.1.0/CONTRIBUTING.md +217 -0
  16. strands_shell-0.1.0/Cargo.lock +2421 -0
  17. strands_shell-0.1.0/Cargo.toml +77 -0
  18. strands_shell-0.1.0/LICENSE +175 -0
  19. strands_shell-0.1.0/NOTICE +1 -0
  20. strands_shell-0.1.0/PKG-INFO +256 -0
  21. strands_shell-0.1.0/README.md +239 -0
  22. strands_shell-0.1.0/SECURITY.md +92 -0
  23. strands_shell-0.1.0/build.rs +87 -0
  24. strands_shell-0.1.0/index.d.ts +100 -0
  25. strands_shell-0.1.0/index.js +218 -0
  26. strands_shell-0.1.0/package.json +44 -0
  27. strands_shell-0.1.0/pyproject.toml +34 -0
  28. strands_shell-0.1.0/python/strands_shell/__init__.py +281 -0
  29. strands_shell-0.1.0/scripts/build-wasm.sh +78 -0
  30. strands_shell-0.1.0/src/builtins/alias.rs +59 -0
  31. strands_shell-0.1.0/src/builtins/cd.rs +51 -0
  32. strands_shell-0.1.0/src/builtins/colon.rs +21 -0
  33. strands_shell-0.1.0/src/builtins/echo.rs +81 -0
  34. strands_shell-0.1.0/src/builtins/export.rs +49 -0
  35. strands_shell-0.1.0/src/builtins/find.rs +551 -0
  36. strands_shell-0.1.0/src/builtins/getopts.rs +174 -0
  37. strands_shell-0.1.0/src/builtins/hash.rs +73 -0
  38. strands_shell-0.1.0/src/builtins/local.rs +22 -0
  39. strands_shell-0.1.0/src/builtins/lua.rs +1214 -0
  40. strands_shell-0.1.0/src/builtins/mod.rs +65 -0
  41. strands_shell-0.1.0/src/builtins/printf.rs +212 -0
  42. strands_shell-0.1.0/src/builtins/pwd.rs +36 -0
  43. strands_shell-0.1.0/src/builtins/read.rs +112 -0
  44. strands_shell-0.1.0/src/builtins/set.rs +57 -0
  45. strands_shell-0.1.0/src/builtins/shift.rs +24 -0
  46. strands_shell-0.1.0/src/builtins/test.rs +222 -0
  47. strands_shell-0.1.0/src/builtins/trap.rs +26 -0
  48. strands_shell-0.1.0/src/builtins/type_cmd.rs +56 -0
  49. strands_shell-0.1.0/src/builtins/umask.rs +27 -0
  50. strands_shell-0.1.0/src/builtins/unset.rs +31 -0
  51. strands_shell-0.1.0/src/builtins/wait.rs +26 -0
  52. strands_shell-0.1.0/src/builtins/xargs.rs +126 -0
  53. strands_shell-0.1.0/src/cli.rs +147 -0
  54. strands_shell-0.1.0/src/commands/basename.rs +36 -0
  55. strands_shell-0.1.0/src/commands/cat.rs +64 -0
  56. strands_shell-0.1.0/src/commands/chmod.rs +105 -0
  57. strands_shell-0.1.0/src/commands/cp.rs +83 -0
  58. strands_shell-0.1.0/src/commands/curl.rs +351 -0
  59. strands_shell-0.1.0/src/commands/cut.rs +110 -0
  60. strands_shell-0.1.0/src/commands/date.rs +131 -0
  61. strands_shell-0.1.0/src/commands/dirname.rs +30 -0
  62. strands_shell-0.1.0/src/commands/echo.rs +24 -0
  63. strands_shell-0.1.0/src/commands/env.rs +31 -0
  64. strands_shell-0.1.0/src/commands/false.rs +6 -0
  65. strands_shell-0.1.0/src/commands/grep.rs +412 -0
  66. strands_shell-0.1.0/src/commands/head.rs +43 -0
  67. strands_shell-0.1.0/src/commands/jq.rs +258 -0
  68. strands_shell-0.1.0/src/commands/ln.rs +37 -0
  69. strands_shell-0.1.0/src/commands/ls.rs +246 -0
  70. strands_shell-0.1.0/src/commands/mkdir.rs +52 -0
  71. strands_shell-0.1.0/src/commands/mktemp.rs +80 -0
  72. strands_shell-0.1.0/src/commands/mod.rs +118 -0
  73. strands_shell-0.1.0/src/commands/mv.rs +42 -0
  74. strands_shell-0.1.0/src/commands/pwd.rs +23 -0
  75. strands_shell-0.1.0/src/commands/readlink.rs +26 -0
  76. strands_shell-0.1.0/src/commands/rm.rs +79 -0
  77. strands_shell-0.1.0/src/commands/rmdir.rs +28 -0
  78. strands_shell-0.1.0/src/commands/sed.rs +694 -0
  79. strands_shell-0.1.0/src/commands/sleep.rs +44 -0
  80. strands_shell-0.1.0/src/commands/sort.rs +219 -0
  81. strands_shell-0.1.0/src/commands/tail.rs +80 -0
  82. strands_shell-0.1.0/src/commands/tee.rs +50 -0
  83. strands_shell-0.1.0/src/commands/touch.rs +39 -0
  84. strands_shell-0.1.0/src/commands/tr.rs +155 -0
  85. strands_shell-0.1.0/src/commands/true.rs +6 -0
  86. strands_shell-0.1.0/src/commands/uniq.rs +133 -0
  87. strands_shell-0.1.0/src/commands/wc.rs +127 -0
  88. strands_shell-0.1.0/src/exec.rs +2959 -0
  89. strands_shell-0.1.0/src/io.rs +183 -0
  90. strands_shell-0.1.0/src/js.rs +531 -0
  91. strands_shell-0.1.0/src/lib.rs +168 -0
  92. strands_shell-0.1.0/src/main.rs +4 -0
  93. strands_shell-0.1.0/src/mcp.rs +456 -0
  94. strands_shell-0.1.0/src/mcp_client.rs +207 -0
  95. strands_shell-0.1.0/src/os.rs +931 -0
  96. strands_shell-0.1.0/src/parser.rs +1957 -0
  97. strands_shell-0.1.0/src/prelude.rs +11 -0
  98. strands_shell-0.1.0/src/python.rs +441 -0
  99. strands_shell-0.1.0/src/shell.rs +1079 -0
  100. strands_shell-0.1.0/src/vfs.rs +887 -0
  101. strands_shell-0.1.0/src/vfs_config.rs +278 -0
  102. strands_shell-0.1.0/src/vfs_kernel.rs +1532 -0
  103. strands_shell-0.1.0/src/wasm_main.rs +144 -0
  104. strands_shell-0.1.0/strands-shell-macros/Cargo.toml +16 -0
  105. strands_shell-0.1.0/strands-shell-macros/src/lib.rs +51 -0
  106. strands_shell-0.1.0/tests/curl_integration.rs +657 -0
  107. strands_shell-0.1.0/tests/js/test_bindings.mjs +396 -0
  108. strands_shell-0.1.0/tests/js/test_builder.mjs +110 -0
  109. strands_shell-0.1.0/tests/lua_integration.rs +1373 -0
  110. strands_shell-0.1.0/tests/mcp_integration.rs +725 -0
  111. strands_shell-0.1.0/tests/python/test_bindings.py +268 -0
  112. strands_shell-0.1.0/tests/python/test_builder.py +107 -0
  113. strands_shell-0.1.0/tests/shell_integration.rs +7602 -0
  114. strands_shell-0.1.0/tests/ts/api.types.ts +70 -0
  115. strands_shell-0.1.0/tests/vfs_unit.rs +1135 -0
  116. strands_shell-0.1.0/tsconfig.json +14 -0
@@ -0,0 +1,4 @@
1
+ # `cargo xtask <task>` runs the repo automation crate in ./xtask.
2
+ # See `cargo xtask help` for available tasks.
3
+ [alias]
4
+ xtask = "run --package xtask --"
@@ -0,0 +1,111 @@
1
+ name: Bug Report
2
+ description: Report a bug in Strands Shell
3
+ title: "[BUG] "
4
+ labels: ["triage"]
5
+ assignees: []
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Thanks for taking the time to fill out this bug report for Strands Shell!
11
+ - type: checkboxes
12
+ id: "checks"
13
+ attributes:
14
+ label: "Checks"
15
+ options:
16
+ - label: "I have updated to the latest minor and patch version of Strands Shell"
17
+ required: true
18
+ - label: "I have checked the documentation and this is not expected behavior"
19
+ required: true
20
+ - label: "I have searched [./issues](./issues?q=) and there are no duplicates of my issue"
21
+ required: true
22
+ - type: dropdown
23
+ id: binding
24
+ attributes:
25
+ label: Binding
26
+ description: Which Strands Shell binding are you using?
27
+ options:
28
+ - Python
29
+ - Node.js
30
+ - Rust
31
+ - WASM
32
+ validations:
33
+ required: true
34
+ - type: input
35
+ id: shell-version
36
+ attributes:
37
+ label: Strands Shell Version
38
+ description: Which version of Strands Shell are you using?
39
+ placeholder: e.g., 0.1.0
40
+ validations:
41
+ required: true
42
+ - type: input
43
+ id: runtime-version
44
+ attributes:
45
+ label: Language Runtime Version
46
+ description: Which version of Python, Node.js, Rust, or your WASM runtime are you using?
47
+ placeholder: e.g., Python 3.12.4, Node.js 20.17.0, Rust 1.79.0, or wasmtime 23.0.0
48
+ validations:
49
+ required: true
50
+ - type: input
51
+ id: os
52
+ attributes:
53
+ label: Operating System
54
+ description: Which operating system and architecture are you using?
55
+ placeholder: e.g., macOS 14.5 (arm64) or Ubuntu 22.04 (x86_64)
56
+ validations:
57
+ required: true
58
+ - type: dropdown
59
+ id: installation-method
60
+ attributes:
61
+ label: Installation Method
62
+ description: How did you install Strands Shell?
63
+ options:
64
+ - pip (strands-shell)
65
+ - npm (@strands-agents/shell)
66
+ - cargo (strands-shell)
67
+ - built from source
68
+ - other
69
+ validations:
70
+ required: true
71
+ - type: textarea
72
+ id: steps-to-reproduce
73
+ attributes:
74
+ label: Steps to Reproduce
75
+ description: Detailed steps to reproduce the behavior
76
+ placeholder: |
77
+ 1. Code Snippet (Minimal reproducible example)
78
+ 2. Install Strands Shell using...
79
+ 3. Run the command...
80
+ 4. See error...
81
+ validations:
82
+ required: true
83
+ - type: textarea
84
+ id: expected-behavior
85
+ attributes:
86
+ label: Expected Behavior
87
+ description: A clear description of what you expected to happen
88
+ validations:
89
+ required: true
90
+ - type: textarea
91
+ id: actual-behavior
92
+ attributes:
93
+ label: Actual Behavior
94
+ description: What actually happened
95
+ validations:
96
+ required: true
97
+ - type: textarea
98
+ id: additional-context
99
+ attributes:
100
+ label: Additional Context
101
+ description: Any other relevant information, logs, screenshots, etc.
102
+ - type: textarea
103
+ id: possible-solution
104
+ attributes:
105
+ label: Possible Solution
106
+ description: Optional - If you have suggestions on how to fix the bug
107
+ - type: input
108
+ id: related-issues
109
+ attributes:
110
+ label: Related Issues
111
+ description: Optional - Link to related issues if applicable
@@ -0,0 +1,12 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Strands Agents Support
4
+ # Only one repo has Discussions enabled; point users there.
5
+ url: https://github.com/strands-agents/sdk-python/discussions
6
+ about: Please ask and answer questions here
7
+ - name: Strands Agents Community
8
+ url: https://discord.gg/strands
9
+ about: Chat with the Strands team and community on Discord
10
+ - name: Strands Agents Documentation
11
+ url: https://strandsagents.com
12
+ about: Visit our documentation for help
@@ -0,0 +1,54 @@
1
+ name: Feature Request
2
+ description: Suggest a new feature or enhancement for Strands Shell
3
+ title: "[FEATURE] "
4
+ labels: ["triage"]
5
+ assignees: []
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Thanks for suggesting a new feature for Strands Shell!
11
+ - type: dropdown
12
+ id: binding
13
+ attributes:
14
+ label: Binding
15
+ description: Which Strands Shell binding is this feature for?
16
+ options:
17
+ - Python
18
+ - Node.js
19
+ - Rust
20
+ - WASM
21
+ - Shell core / Not binding-specific
22
+ validations:
23
+ required: true
24
+ - type: textarea
25
+ id: problem-statement
26
+ attributes:
27
+ label: Problem Statement
28
+ description: Describe the problem you're trying to solve. What is currently difficult or impossible to do?
29
+ placeholder: I would like Strands Shell to...
30
+ validations:
31
+ required: true
32
+ - type: textarea
33
+ id: proposed-solution
34
+ attributes:
35
+ label: Proposed Solution
36
+ description: Optional - Describe your proposed solution in detail. How would this feature work?
37
+ - type: textarea
38
+ id: use-case
39
+ attributes:
40
+ label: Use Case
41
+ description: Provide specific use cases for the feature. How would people use it?
42
+ placeholder: This would help with...
43
+ validations:
44
+ required: true
45
+ - type: textarea
46
+ id: alternatives-solutions
47
+ attributes:
48
+ label: Alternatives Solutions
49
+ description: Optional - Have you considered alternative approaches? What are their pros and cons?
50
+ - type: textarea
51
+ id: additional-context
52
+ attributes:
53
+ label: Additional Context
54
+ description: Include any other context, screenshots, code examples, or references that might help understand the feature request.
@@ -0,0 +1,41 @@
1
+ ## Description
2
+ <!-- Provide a detailed description of the changes in this PR -->
3
+
4
+ ## Related Issues
5
+
6
+ <!-- Link to related issues using #issue-number format -->
7
+
8
+ ## Documentation PR
9
+
10
+ <!-- Link to any related documentation PR -->
11
+
12
+ ## Type of Change
13
+
14
+ <!-- Choose one of the following types of changes, delete the rest -->
15
+
16
+ Bug fix
17
+ New feature
18
+ Breaking change
19
+ Documentation update
20
+ Other (please describe):
21
+
22
+ ## Testing
23
+
24
+ How have you tested the change? Verify that the changes do not break functionality or introduce new warnings.
25
+
26
+ - [ ] I ran the relevant test suites for the bindings I touched (`cargo test --workspace --all-targets`, `pytest tests/python`, `npm test`)
27
+ - [ ] If I touched Rust, I ran `cargo fmt` and `cargo clippy`
28
+
29
+ ## Checklist
30
+ - [ ] I have read the CONTRIBUTING document
31
+ - [ ] I have reviewed and understand every line of code in this PR, including any generated by AI tools, and I can explain why it works
32
+ - [ ] My change is focused and reasonably small; I have split unrelated work into separate PRs
33
+ - [ ] I have added any necessary tests that prove my fix is effective or my feature works
34
+ - [ ] I have updated the documentation accordingly
35
+ - [ ] I have added an appropriate example to the documentation to outline the feature, or no new docs are needed
36
+ - [ ] My changes generate no new warnings
37
+ - [ ] Any dependent changes have been merged and published
38
+
39
+ ----
40
+
41
+ By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.
@@ -0,0 +1,62 @@
1
+ name: Stamp version
2
+ description: >-
3
+ Write the release version (derived from the git tag) into the package
4
+ manifests. The git tag is the single source of truth for the version; the
5
+ committed manifests carry a 0.0.0 placeholder and never hold a real version.
6
+ This action stamps the tag's version into Cargo.toml, pyproject.toml, and
7
+ package.json right after checkout, before the build tools (maturin / napi)
8
+ read them. Run it in every job that builds, packs, or publishes.
9
+
10
+ # ── Why stamp at all (vs. committing the version) ───────────────────────────
11
+ # Committing a concrete version in three manifests means three things to bump
12
+ # in lockstep on every release, and they silently drift. Deriving from the tag
13
+ # keeps one source of truth and makes "cut a vX.Y.Z tag" the entire release
14
+ # action. (See the `version` job in release.yml, which parses + validates the
15
+ # tag and passes it here.)
16
+ #
17
+ # ── Why a tiny perl edit and not a dedicated tool ───────────────────────────
18
+ # - Cargo has no built-in "version from git tag". The official option is
19
+ # `cargo set-version` from the `cargo-edit` crate, but that means a
20
+ # `cargo install cargo-edit` step (network + ~30-60s) in every build job just
21
+ # to rewrite one line. The crate is not published to crates.io (we release to
22
+ # PyPI + npm only), so Cargo.toml's version exists solely to feed maturin's
23
+ # wheel metadata — not worth an extra toolchain dependency.
24
+ # - The perl one-liner rewrites ONLY the first top-level `version = "..."` line
25
+ # (the [package] / [project] version). Dependency and path-dep versions
26
+ # (e.g. napi = { version = "3" }, the strands-shell-macros path dep) appear
27
+ # later and are left untouched. perl -i ships on both Linux and macOS GitHub
28
+ # runners, so it works across the whole build matrix.
29
+ # - package.json uses npm's own `npm version` command (the official mechanism,
30
+ # matching the strands-agents golden path), not a regex.
31
+
32
+ inputs:
33
+ version:
34
+ description: The version to stamp (no leading "v"), e.g. 0.2.0
35
+ required: true
36
+
37
+ runs:
38
+ using: composite
39
+ steps:
40
+ - name: Stamp version into manifests
41
+ shell: bash
42
+ env:
43
+ V: ${{ inputs.version }}
44
+ run: |
45
+ set -euo pipefail
46
+ # Rewrite the first `version = "..."` in each TOML (the package version).
47
+ perl -i -pe 'if (!$done && /^version\s*=\s*"/) { s/"[^"]*"/"$ENV{V}"/; $done=1 }' Cargo.toml
48
+ perl -i -pe 'if (!$done && /^version\s*=\s*"/) { s/"[^"]*"/"$ENV{V}"/; $done=1 }' pyproject.toml
49
+ echo "Stamped version $V:"
50
+ echo " Cargo.toml=$(grep -m1 '^version' Cargo.toml)"
51
+ echo " pyproject.toml=$(grep -m1 '^version' pyproject.toml)"
52
+ # package.json via npm's official version command. This is only needed by
53
+ # the Node jobs; the Python build jobs (python-wheels/sdist) set up Python
54
+ # but not Node — and python-wheels runs in a manylinux container with no
55
+ # npm — so guard on npm being available and skip otherwise.
56
+ if command -v npm >/dev/null 2>&1; then
57
+ # --allow-same-version so re-runs against an already-stamped tree pass.
58
+ npm version "$V" --no-git-tag-version --allow-same-version >/dev/null
59
+ echo " package.json=$(node -p "require('./package.json').version")"
60
+ else
61
+ echo " package.json=skipped (npm not available — Python-only job)"
62
+ fi
@@ -0,0 +1,89 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "cargo"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "daily"
7
+ open-pull-requests-limit: 100
8
+ labels:
9
+ - "dependencies"
10
+ - "rust"
11
+ commit-message:
12
+ prefix: "ci(rust)"
13
+ cooldown:
14
+ default-days: 5
15
+ semver-major-days: 30
16
+ semver-minor-days: 7
17
+ semver-patch-days: 3
18
+ groups:
19
+ development-dependencies:
20
+ dependency-type: "development"
21
+ applies-to: version-updates
22
+ production-minor:
23
+ dependency-type: "production"
24
+ applies-to: version-updates
25
+ update-types:
26
+ - "minor"
27
+ - "patch"
28
+ - package-ecosystem: "pip"
29
+ directory: "/"
30
+ schedule:
31
+ interval: "daily"
32
+ open-pull-requests-limit: 100
33
+ labels:
34
+ - "dependencies"
35
+ - "python"
36
+ commit-message:
37
+ prefix: "ci(python)"
38
+ cooldown:
39
+ default-days: 5
40
+ semver-major-days: 30
41
+ semver-minor-days: 7
42
+ semver-patch-days: 3
43
+ groups:
44
+ dev-dependencies:
45
+ patterns:
46
+ - "pytest"
47
+ - "maturin"
48
+ - package-ecosystem: "npm"
49
+ directory: "/"
50
+ schedule:
51
+ interval: "daily"
52
+ open-pull-requests-limit: 100
53
+ labels:
54
+ - "dependencies"
55
+ - "node"
56
+ commit-message:
57
+ prefix: "ci(node)"
58
+ cooldown:
59
+ default-days: 5
60
+ semver-major-days: 30
61
+ semver-minor-days: 7
62
+ semver-patch-days: 3
63
+ groups:
64
+ development-dependencies:
65
+ dependency-type: "development"
66
+ applies-to: version-updates
67
+ production-minor:
68
+ dependency-type: "production"
69
+ applies-to: version-updates
70
+ update-types:
71
+ - "minor"
72
+ - "patch"
73
+ - package-ecosystem: "github-actions"
74
+ directory: "/"
75
+ schedule:
76
+ interval: "daily"
77
+ open-pull-requests-limit: 100
78
+ commit-message:
79
+ prefix: ci
80
+ cooldown:
81
+ default-days: 5
82
+ semver-major-days: 30
83
+ semver-minor-days: 7
84
+ semver-patch-days: 3
85
+ groups:
86
+ actions:
87
+ patterns:
88
+ - "*"
89
+ applies-to: version-updates
@@ -0,0 +1,148 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ types: [opened, synchronize, reopened, ready_for_review]
7
+ workflow_dispatch:
8
+
9
+ concurrency:
10
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ rust:
15
+ name: Rust (${{ matrix.os }})
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ os: [ubuntu-latest, macos-latest]
20
+ runs-on: ${{ matrix.os }}
21
+ steps:
22
+ - uses: actions/checkout@v6
23
+
24
+ - name: Install Rust toolchain
25
+ uses: dtolnay/rust-toolchain@stable
26
+
27
+ - name: Cache cargo
28
+ uses: Swatinem/rust-cache@v2
29
+
30
+ - name: cargo test
31
+ run: cargo test --workspace --all-targets
32
+
33
+ - name: cargo doc
34
+ env:
35
+ RUSTDOCFLAGS: -D warnings
36
+ run: cargo doc --workspace --no-deps
37
+
38
+ # cargo fmt and cargo clippy are intentionally not gated here yet —
39
+ # see the cleanup follow-up. Add them back once the repo is clean.
40
+
41
+ python:
42
+ name: Python (${{ matrix.os }}, ${{ matrix.python }})
43
+ strategy:
44
+ fail-fast: false
45
+ matrix:
46
+ os: [ubuntu-latest, macos-latest]
47
+ python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
48
+ runs-on: ${{ matrix.os }}
49
+ steps:
50
+ - uses: actions/checkout@v6
51
+
52
+ - name: Install Rust toolchain
53
+ uses: dtolnay/rust-toolchain@stable
54
+
55
+ - name: Cache cargo
56
+ uses: Swatinem/rust-cache@v2
57
+ with:
58
+ key: py-${{ matrix.os }}-${{ matrix.python }}
59
+
60
+ - name: Set up Python
61
+ uses: actions/setup-python@v6
62
+ with:
63
+ python-version: ${{ matrix.python }}
64
+
65
+ - name: Create virtualenv
66
+ run: python -m venv .venv
67
+
68
+ - name: Install build deps
69
+ run: .venv/bin/pip install maturin pytest
70
+
71
+ - name: Build and install wheel
72
+ run: .venv/bin/maturin develop --release
73
+
74
+ - name: pytest
75
+ run: .venv/bin/pytest tests/python -v
76
+
77
+ audit:
78
+ name: Security audit
79
+ runs-on: ubuntu-latest
80
+ steps:
81
+ - uses: actions/checkout@v6
82
+
83
+ - name: Install Rust toolchain
84
+ uses: dtolnay/rust-toolchain@stable
85
+
86
+ - name: Cache cargo
87
+ uses: Swatinem/rust-cache@v2
88
+ with:
89
+ key: audit
90
+
91
+ - name: cargo install cargo-audit
92
+ run: cargo install --locked cargo-audit
93
+
94
+ - name: cargo audit
95
+ # Surfaces RustSec advisories in CI output. Not a hard gate yet —
96
+ # transitive deps via reqwest/rustls carry advisories we haven't
97
+ # triaged. Flip continue-on-error off once the dep tree is clean.
98
+ run: cargo audit
99
+ continue-on-error: true
100
+
101
+ - name: Set up Node.js
102
+ uses: actions/setup-node@v6
103
+ with:
104
+ node-version: "20"
105
+
106
+ - name: npm audit (production)
107
+ # package-lock.json is gitignored, so generate an ephemeral lockfile
108
+ # for the audit (npm audit requires one).
109
+ run: |
110
+ npm install --package-lock-only
111
+ npm audit --omit=dev
112
+
113
+ node:
114
+ name: Node.js (${{ matrix.os }}, Node ${{ matrix.node }})
115
+ strategy:
116
+ fail-fast: false
117
+ matrix:
118
+ os: [ubuntu-latest, macos-latest]
119
+ node: ["20", "22", "24"]
120
+ runs-on: ${{ matrix.os }}
121
+ steps:
122
+ - uses: actions/checkout@v6
123
+
124
+ - name: Install Rust toolchain
125
+ uses: dtolnay/rust-toolchain@stable
126
+
127
+ - name: Cache cargo
128
+ uses: Swatinem/rust-cache@v2
129
+ with:
130
+ key: node-${{ matrix.os }}-${{ matrix.node }}
131
+
132
+ - name: Set up Node.js
133
+ uses: actions/setup-node@v6
134
+ with:
135
+ node-version: ${{ matrix.node }}
136
+
137
+ - name: npm install
138
+ # package-lock.json is gitignored, so `npm ci` can't run; use install.
139
+ run: npm install
140
+
141
+ - name: napi build
142
+ run: npm run build:debug
143
+
144
+ - name: tsc typecheck (public .d.ts surface)
145
+ run: npm run typecheck
146
+
147
+ - name: npm test
148
+ run: npm test
@@ -0,0 +1,36 @@
1
+ name: PR Title Conventional Commits
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ types: [opened, edited, synchronize, reopened]
7
+
8
+ jobs:
9
+ validate-pr-title:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ pull-requests: read
13
+ steps:
14
+ - name: Check PR title follows conventional commits
15
+ uses: amannn/action-semantic-pull-request@v6
16
+ env:
17
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
18
+ with:
19
+ types: |
20
+ feat
21
+ fix
22
+ docs
23
+ refactor
24
+ perf
25
+ test
26
+ build
27
+ ci
28
+ chore
29
+ revert
30
+ requireScope: false
31
+ subjectPattern: ^[a-z].+$
32
+ subjectPatternError: |
33
+ The subject "{subject}" must start with a lowercase letter.
34
+ ignoreLabels: |
35
+ bot
36
+ dependencies