Thanks for your interest in contributing to lssh.
This document explains how to work on the repository, how to validate changes, and what kinds of updates should also include documentation or compatibility checks.
- Read the main README.md for the project overview.
- Check the command-specific README under
cmd/*/README.mdwhen changing user-facing behavior. - If you touch providers, also read the docs under provider/.
lssh is a Go project with multiple commands and provider binaries.
- Use the Go version declared in go.mod.
misetasks are provided for common workflows.maketargets are also available for broader validation.
Typical setup:
mise run go_modIf you prefer working directly with Go commands, make sure go mod tidy and go mod vendor are kept in sync through the existing project workflow.
High-level structure:
cmd/*- CLI entrypoints for each command
internal/app/*- command-level application logic
internal/*- shared implementation used across commands
provider/*- external provider executables and provider design docs
docs/*- user documentation
completion/*- shell completion files
Main commands in the suite:
lsshlscplsftplssynclsdifflsshfslsmonlsshelllsmuxlspipe
When changing shared code, please consider effects on the whole suite, not just one command.
Please run tests that are close to your change first.
Examples:
go test ./internal/app/lssh/...
go test ./internal/lsshfs ./internal/app/lsshfs
go test ./provider/secret/provider-secret-onepasswordmise tasks are available for grouped workflows:
mise run core_test
mise run transfer_test
mise run provider_testFor broader validation:
make test
make buildIf you do not run a test or build step, mention that clearly in your PR description.
Please keep changes focused and easy to review.
- Keep the scope as local as possible.
- Do not mix unrelated refactors into a behavioral change.
- Preserve existing CLI flags, config formats, and user-facing behavior unless a change is intentional.
- Prefer simple Go implementations over over-engineered abstractions.
- Introduce interfaces only when they are actually needed.
- Return actionable errors rather than swallowing them.
- Add short comments only when they genuinely clarify a non-obvious part of the code.
This project targets Linux, macOS, and Windows, but some features are OS-specific.
- Call out OS-specific behavior in code when needed.
- Do not let Linux/macOS-specific behavior leak into unrelated commands.
- Be especially careful around
lsshfs, terminal handling, PTY behavior, and mux/session features. - If a feature is intentionally unsupported on a platform, document that clearly.
Providers are treated as separately buildable executables.
- Keep provider-specific helper code under the provider's own directory when possible.
- Do not place provider-only helper libraries in generic shared directories unless they are truly reused across provider types.
- Prefer API or SDK based implementations for cloud providers.
- Avoid local shell command execution inside providers unless there is no practical alternative and the behavior is intentional.
- Keep provider capabilities accurate. User config may limit capabilities, but should not invent unsupported ones.
Useful paths:
- provider/README.md
- provider/connector/README.md
- provider/inventory/README.md
- provider/secret/README.md
- Do not edit
vendor/by hand. - If a problem appears to come from vendored code, first check whether updating the dependency version is the right fix.
- Keep module and vendor state aligned through the project's existing workflow.
- Add new dependencies only when clearly necessary.
If you change any user-facing behavior, also update the related documentation.
This usually means checking:
- README.md
docs/*.mdcmd/*/README.md- provider README files when provider behavior changes
Examples of changes that require docs updates:
- new CLI flags
- changed config keys or defaults
- install flow changes
- new platform limitations
- provider capability or protocol changes
A good pull request should make review easy.
Please include:
- what changed
- why it changed
- what tests you ran
- what you did not validate
- any OS-specific notes or limitations
If the change is intentionally breaking or changes existing behavior, explain the migration or compatibility impact clearly.
Bug reports are much easier to act on when they include concrete details.
Please include as much of the following as possible:
- OS and version
- command you ran
- expected behavior
- actual behavior
- relevant config snippet
- provider setup details if applicable
- logs or error output
- reproduction steps
Some parts of the project have stronger compatibility expectations than others.
- Shared SSH/config behavior should remain stable unless there is a strong reason to change it.
- Provider protocols should evolve carefully and stay documented.
- Mux, transfer, and auth-related changes should be reviewed for side effects on parallel workflows, forwarding, and secret handling.
If you are unsure whether a change should be treated as a bug fix, a feature, or a larger architectural change, open an issue or draft PR first and describe the intended direction before making a large change.