# Contributing

yutu is a mcp server & cli tool built using the [go-sdk](https://github.com/modelcontextprotocol/go-sdk) and [cobra](https://github.com/spf13/cobra). Feel free to contribute to the project under these conventions:

- Commit messages should follow the [gitmoji](https://gitmoji.dev) convention.
- Follow the existing naming and project structure.

Here are some commands which may useful.

```shell
# go standard toolchain

## upgrade all dependencies
❯ go get -u ./...

## run tests
### unit tests
❯ go test ./... -coverprofile=./coverage.out -coverpkg=./...
❯ go tool cover -html=coverage.out -o=coverage.html

## build the binary
### install goreleaser: https://goreleaser.com/install
❯ goreleaser build --clean --auto-snapshot

❯ tree dist
dist
├── artifacts.json
├── config.yaml
├── metadata.json
├── yutu_darwin_amd64_v1
│   └── yutu-darwin-amd64
├── yutu_darwin_arm64_v8.0
│   └── yutu-darwin-arm64
├── yutu_linux_amd64_v1
│   └── yutu-linux-amd64
├── yutu_linux_arm64_v8.0
│   └── yutu-linux-arm64
├── yutu_windows_amd64_v1
│   └── yutu-windows-amd64.exe
└── yutu_windows_arm64_v8.0
    └── yutu-windows-arm64.exe

7 directories, 9 files

## verify binary commands, detect shorthands conflicts, etc.
❯ ./scripts/command-test.sh dist/yutu_darwin_arm64_v8.0/yutu-darwin-arm64

## script to install yutu
❯ ./scripts/install.sh
```

```shell
# bazel toolchain

## upgrade all dependencies
❯ bazel run @rules_go//go -- get -u ./...

## run tests
### unit tests
❯ bazel test //...
❯ bazel coverage //...
❯ genhtml -o genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"

## build the binary
❯ bazel run //:gazelle  # (re)generate BUILD files
### update go.mod, go.sum, and use_repo in MODULE.bazel
❯ bazel run @rules_go//go -- mod tidy -v
❯ bazel mod tidy
❯ bazel build //:yutu   # build the binary for the current platform
❯ bazel build //...     # build all targets
❯ bazel build --platforms=@rules_go//go/toolchain:linux_amd64 //:yutu
❯ bazel cquery --output=files //:yutu-linux-amd64

❯ tree -L 1 bazel-bin/yutu_
bazel-bin/yutu_
├── yutu
├── yutu-0.params
├── yutu.repo_mapping
├── yutu.runfiles
└── yutu.runfiles_manifest

2 directories, 4 files

## verify binary commands, detect shorthands conflicts, etc.
❯ ./scripts/command-test.sh bazel-bin/yutu_/yutu

## script to install yutu
❯ ./scripts/install.sh
```

```shell
# add license headers to all source files
❯ go install github.com/google/addlicense@latest
❯ addlicense \
    -c "eat-pray-ai & OpenWaygate" \
    -f LICENSE \
    -s=only \
    -y $(date +%Y) \
    -ignore "**/*.yml" \
    -ignore "**/*.yaml" \
    -ignore "**/*.bazel" .
```
