{"id":31715320,"url":"https://github.com/rm3l/daily-scrum-picker","last_synced_at":"2025-10-09T01:56:08.165Z","repository":{"id":306222618,"uuid":"1025205902","full_name":"rm3l/daily-scrum-picker","owner":"rm3l","description":"Interactive Daily Scrum Picker CLI tool","archived":false,"fork":false,"pushed_at":"2025-10-05T07:26:26.000Z","size":95,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-05T09:12:44.314Z","etag":null,"topics":["agile","daily-scrum","scrum-master","scrum-meetings"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rm3l.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-23T22:42:54.000Z","updated_at":"2025-10-05T07:26:26.000Z","dependencies_parsed_at":"2025-07-24T12:23:40.409Z","dependency_job_id":"b4e14dab-2d7c-4c4d-9cec-bd59d9894c65","html_url":"https://github.com/rm3l/daily-scrum-picker","commit_stats":null,"previous_names":["rm3l/daily-scrum-picker"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/rm3l/daily-scrum-picker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdaily-scrum-picker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdaily-scrum-picker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdaily-scrum-picker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdaily-scrum-picker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rm3l","download_url":"https://codeload.github.com/rm3l/daily-scrum-picker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdaily-scrum-picker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000696,"owners_count":26082894,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agile","daily-scrum","scrum-master","scrum-meetings"],"created_at":"2025-10-09T01:56:06.448Z","updated_at":"2025-10-09T01:56:08.155Z","avatar_url":"https://github.com/rm3l.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Daily Scrum Picker\n\n[![Tests](https://github.com/rm3l/daily-scrum-picker/actions/workflows/test.yaml/badge.svg)](https://github.com/rm3l/daily-scrum-picker/actions/workflows/test.yaml)\n\u003c!--[![codecov](https://codecov.io/gh/rm3l/daily-scrum-picker/branch/main/graph/badge.svg)](https://codecov.io/gh/rm3l/daily-scrum-picker)--\u003e\n[![Build and publish container image](https://github.com/rm3l/daily-scrum-picker/actions/workflows/build-and-publish-container-image.yaml/badge.svg)](https://github.com/rm3l/daily-scrum-picker/actions/workflows/build-and-publish-container-image.yaml)\n\nA simple Go utility to fairly select the next person to speak during daily scrum/stand-up meetings.\n\n**NOTE**: Assisted by AI as a quick experiment to get something up and running in a few minutes.\n\n## Overview\n\nThis tool ensures fair rotation of team members during daily stand-ups by automatically tracking who has spoken and resetting when everyone has had a turn.\n\n**Features:**\n\n1. **Fair Rotation**: Tracks who hasn't spoken yet automatically\n2. **Random Shuffling**: When everyone has had a turn, shuffles the team list for the next cycle\n3. **Persistent Tracking**: Remembers selections between runs so you can use it daily\n4. **Automatic Reset**: When the list is empty, automatically starts a new randomized cycle\n\n## Installation\n\n### Prerequisites\n\n- Go 1.23+ (tested with Go 1.23 and 1.24)\n\n### Setup\n\n```bash\ngit clone https://github.com/rm3l/daily-scrum-picker.git \u0026\u0026 cd daily-scrum-picker\n```\n\n## Usage\n\n### Local Development\n\n1. Create a local `team.txt` file containing the names of your team members. See [Team members](#team-members) for more details.\n\n2. Simply run with Go:\n\n```bash\ngo run pick_next.go\n```\n\nAlternatively, you can build and run the executable:\n\n```bash\ngo build -o daily-scrum-picker pick_next.go\n./daily-scrum-picker\n```\n\nYou can also specify a custom team file using the `--team-file` (or `-t`) flag:\n\n```bash\ngo run pick_next.go --team-file=/path/to/my-team.txt\ngo run pick_next.go -t /path/to/my-team.txt\n./daily-scrum-picker --team-file=teams/backend.txt\n./daily-scrum-picker -t teams/backend.txt\n```\n\nOr read team members from stdin using `-`:\n\n```bash\necho -e \"Alice\\nBob\\nCharlie\" | ./daily-scrum-picker -t -\ncat team-members.txt | go run pick_next.go --team-file=-\n```\n\n### Container Usage\n\nThis tool is also available as a container image on ghcr.io. This allows you to use the tool without cloning the repository or installing Go.\n\nIt runs in interactive mode with **single-keypress commands** - no need to press Enter:\n\n```bash\n# Mount your custom team file\npodman run -it --rm \\\n  -v ./my-team.txt:/app/team.txt \\\n  ghcr.io/rm3l/daily-scrum-picker:main\n\n# Or use a different file path with environment variable\npodman run -it --rm \\\n  -v ./teams:/app/teams \\\n  -e TEAM_FILE=teams/backend.txt \\\n  ghcr.io/rm3l/daily-scrum-picker:main\n```\n\n### Interactive Mode\n\n**Available commands (single keypress):**\n\n- **`p`** - Pick the next person for daily scrum\n- **`r`** - Reset and start over with all team members  \n- **`s`** - Show current status and remaining team members\n- **`h`** - Show help message\n- **`q`** - Exit the program\n\n**Notes:** \n\n- Use the `-it` flags to enable interactive mode with proper terminal support\n- Commands respond immediately without pressing Enter\n- Fallback to Enter-required mode if raw terminal access is unavailable\n\n### Output Examples\n\n**Interactive session:**\n\n```txt\n=== Daily Scrum Picker ===\nTeam file: team.txt (6 members)\n\nCommands:\n  p - Pick next person\n  r - Reset and start over\n  s - Show current status\n  h - Show this help\n  q - Quit\n\nPress any key (no Enter needed):\n\u003e p\n🎯 Next is... Alice\n(5 people remaining in this round)\n\n\u003e p\n🎯 Next is... Charlie\n(4 people remaining in this round)\n\n\u003e s\n📊 Status:\n  Total team members: 6\n  Remaining this round: 4\n  Still to pick: Bob, Diana, Frank, Grace\n\n\u003e q\nGoodbye!\n```\n\n## Configuration\n\n### Team Members\n\nTeam members are configured via a team file or stdin. By default, the tool looks for `team.txt` in the same directory where it is run, but you can specify a different source using either:\n\n1. The `--team-file` (or `-t`) command-line flag (file path or `-` for stdin)\n2. The `TEAM_FILE` environment variable\n\nCreate or edit the team file with one team member name per line:\n\n```txt\n# Daily Scrum Team Members\n# Add one team member name per line\n# Lines starting with # are ignored\n\nAlice\nBob\nCharlie\nDiana\n```\n\n#### Configuration Options\n\nThe tool supports multiple ways to specify the team source (in order of precedence):\n\n| Method | Description | Priority |\n|--------|-------------|----------|\n| `--team-file` / `-t` flag | Path to team members file or `-` for stdin | **Highest** (overrides environment variable) |\n| `TEAM_FILE` environment variable | Path to team members file | Medium |\n| Default | Uses `team.txt` in current directory | Lowest |\n\n**Examples:**\n\n```bash\n# Using command-line flag (long form)\ngo run pick_next.go --team-file=\"/path/to/my-team.txt\"\n./daily-scrum-picker --team-file=\"teams/backend.txt\"\n\n# Using command-line flag (short form)\ngo run pick_next.go -t \"/path/to/my-team.txt\"\n./daily-scrum-picker -t \"teams/backend.txt\"\n\n# Reading from stdin\necho -e \"Alice\\nBob\\nCharlie\\nDiana\" | ./daily-scrum-picker -t -\ncat my-team.txt | go run pick_next.go --team-file=-\n\n# Using environment variable\nexport TEAM_FILE=\"/path/to/my-team.txt\"\ngo run pick_next.go\n\n# Environment variable for single run\nTEAM_FILE=\"/path/to/teams/backend-team.txt\" go run pick_next.go\n\n# Command-line flag takes precedence over environment variable\nTEAM_FILE=\"/path/to/env-team.txt\" go run pick_next.go -t \"/path/to/flag-team.txt\"\n# Will use /path/to/flag-team.txt (flag overrides environment variable)\n\n# Stdin takes precedence over environment variable\nTEAM_FILE=\"/path/to/env-team.txt\" echo -e \"User1\\nUser2\" | ./daily-scrum-picker -t -\n# Will read from stdin (flag overrides environment variable)\n\n# Container usage with environment variable\npodman run -it --rm \\\n  -v ./teams:/app/teams \\\n  -e TEAM_FILE=teams/backend.txt \\\n  ghcr.io/rm3l/daily-scrum-picker:main\n\n# Container usage with custom team file mounted\npodman run -it --rm \\\n  -v ./my-team.txt:/app/team.txt \\\n  ghcr.io/rm3l/daily-scrum-picker:main -t /app/team.txt\n\n# Dynamic team selection from command output\ngit log --format=\"%an\" --since=\"1 month ago\" | sort -u | ./daily-scrum-picker -t -\n# Uses recent Git contributors as team members\n\n# Integration with other tools\ncurl -s https://api.github.com/repos/owner/repo/contributors | jq -r '.[].login' | head -10 | ./daily-scrum-picker -t -\n# Uses GitHub contributors as team members\n```\n\n## Development\n\n### Running Tests\n\n```bash\n# Run all tests\ngo test -v\n\n# Run tests with coverage\ngo test -v -race -coverprofile=coverage.out\ngo tool cover -func=coverage.out\n\n# Run benchmarks\ngo test -bench=. -benchmem\n\n# Run linting (requires golangci-lint)\ngolangci-lint run\n```\n\n### CI/CD\n\nThe project includes comprehensive GitHub Actions workflows:\n\n- **Tests** (`test.yaml`): Runs on every push and PR\n  - Tests on Go 1.23 and 1.24\n  - Includes race detection, benchmarks, and coverage reporting\n  - Uploads coverage reports to Codecov\n  - Runs linting with golangci-lint\n  \n- **Build** (`build-and-publish-container-image.yaml`): Builds and publishes container images\n  - Runs tests before building to ensure quality\n  - Publishes to GitHub Container Registry\n  - Signs images with cosign\n\n## License\n\n    The MIT License (MIT)\n\n    Copyright (c) 2025 Armel Soro\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frm3l%2Fdaily-scrum-picker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frm3l%2Fdaily-scrum-picker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frm3l%2Fdaily-scrum-picker/lists"}