Thanks for taking the time to contribute! This project aims to be small, simple, and easy to audit — please keep changes in that spirit.
Requirements: mise (installs the pinned toolchain).
mise install # node, pnpm, shellcheck, shfmt, ripgrep, jq, semgrep
mise run setup # JS deps; also installs the husky pre-commit hookmise run on its own lists every task.
Everything is driven by mise tasks, which delegate to the canonical
package.json scripts:
| Task | What it does |
|---|---|
mise run |
list all tasks (default) |
mise run setup |
install JS deps and git hooks |
mise run check |
shellcheck + shfmt check + bats tests (all packages) |
mise run test |
run the bats test suite |
mise run lint |
run shellcheck |
mise run fmt |
format shell sources with shfmt |
mise run fmt-check |
verify formatting |
mise run gate |
run the security-gate scanner over the whole repo |
mise run publish-dry-run apps/<package> |
preview one package's npm tarball |
mise run publish apps/<package> |
publish one package to npm and tag it |
mise run doctor |
diagnose the dev environment (mise doctor) |
The pre-commit hook runs mise run check (via pnpm check) on every commit.
- Shell code must pass
shellcheckand beshfmt-formatted — enforced by CI and the pre-commit hook. Runmise run fmtbefore committing. - The scanner is intentionally conservative. New detection patterns belong in
apps/am-i-hacked/bin/scanner.shwith a corresponding test. - Tests live in
apps/am-i-hacked/test/scanner.bats. Add a test that proves the new pattern trips on a malicious sample and does not trip on a clean file. - Never commit a live malware sample. Write an inert sample in the test itself that carries only the indicator the pattern looks for.
- Update the package README if user-visible behavior changes.
- Keep PRs focused; one logical change per PR.
- Branch from
mainand open the PR againstmain. - Make sure
mise run checkandmise run gatepass locally before pushing. - CI runs the same checks plus a gitleaks secret scan and dependency review.
Each package is released on its own from a maintainer's machine; there is no publish CI job. See docs/RELEASING.md.
Small, well-tested changes are much more likely to be reviewed quickly than large rewrites — when in doubt, start a discussion in an issue first.
Do not open an issue for security problems. See SECURITY.md.