{"id":47901727,"url":"https://github.com/delef/goit-pm-squad-assistant","last_synced_at":"2026-04-04T04:08:31.019Z","repository":{"id":343792386,"uuid":"1179153549","full_name":"delef/goit-pm-squad-assistant","owner":"delef","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-11T20:30:39.000Z","size":18,"stargazers_count":1,"open_issues_count":7,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-12T00:38:03.599Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/delef.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"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":"2026-03-11T18:36:43.000Z","updated_at":"2026-03-11T19:49:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/delef/goit-pm-squad-assistant","commit_stats":null,"previous_names":["delef/goit-pm-squad-assistant"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/delef/goit-pm-squad-assistant","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delef%2Fgoit-pm-squad-assistant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delef%2Fgoit-pm-squad-assistant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delef%2Fgoit-pm-squad-assistant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delef%2Fgoit-pm-squad-assistant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/delef","download_url":"https://codeload.github.com/delef/goit-pm-squad-assistant/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delef%2Fgoit-pm-squad-assistant/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31387113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T01:22:39.193Z","status":"online","status_checked_at":"2026-04-04T02:00:07.569Z","response_time":60,"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":[],"created_at":"2026-04-04T04:08:25.641Z","updated_at":"2026-04-04T04:08:31.007Z","avatar_url":"https://github.com/delef.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Personal Assistant — CLI Bot\n\nA command-line assistant for managing contacts and notes, built with Python.\n\n## Team\n\n| Name | Role |\n|------|------|\n| Mykhailo | Scrum Master |\n| Ivan | Team Lead |\n| Shamil | Developer |\n| Alexander | Developer |\n\n## How to Run\n\n```bash\ngit clone https://github.com/delef/goit-pm-squad-assistant.git\ncd goit-pm-squad-assistant\npip install -r requirements.txt\npython main.py\n```\n\n\u003e **Note (Windows):** If you get `ModuleNotFoundError: No module named 'readline'`, install the Windows replacement: `pip install pyreadline3`\n\n## Features\n\n- **Contact management** — phones, emails, birthdays, addresses with validation\n- **Notes with tags** — create, edit, search, and organize notes by tags\n- **Tab completion** — press `Tab` to autocomplete command names\n- **Command suggestions** — typo detection with \"Did you mean?\" hints\n- **Persistent storage** — data is saved automatically to `~/assistant_data.pkl`\n- **Colored terminal UI** — formatted tables, colored output, welcome and help screens\n\n## Project Structure\n\n| File | Description |\n|------|-------------|\n| `main.py` | Entry point — command loop, input parsing, dispatches to handlers |\n| `models.py` | Data classes: `Field`, `Name`, `Phone`, `Email`, `Birthday`, `Address`, `Record`, `AddressBook`, `Note`, `NoteBook` |\n| `handlers_contacts.py` | Contact command handlers (add, change, delete, search, birthday, email, address) |\n| `handlers_notes.py` | Note command handlers (add, edit, delete, find, tags) |\n| `decorators.py` | `@input_error` decorator — catches and formats handler errors |\n| `storage.py` | `save_data()` / `load_data()` — persists AddressBook and NoteBook to a `.pkl` file |\n| `ui.py` | Colored terminal output, tables, tab-completion, command suggestions, welcome/help screens |\n\n## Available Commands\n\n### Contacts\n\n| Command | Description |\n|---------|-------------|\n| `add [name] [phone]` | Add a contact or add a phone to an existing contact |\n| `change [name] [old phone] [new phone]` | Change a phone number |\n| `phone [name]` | Show phone numbers for a contact |\n| `all` | Show all contacts |\n| `search [query]` | Search contacts by any field |\n| `delete [name]` | Delete a contact |\n| `add-birthday [name] [DD.MM.YYYY]` | Add birthday to a contact |\n| `show-birthday [name]` | Show birthday for a contact |\n| `birthdays [days]` | Show upcoming birthdays (default: 7 days) |\n| `add-email [name] [email]` | Add email to a contact |\n| `add-address [name] [address]` | Add address to a contact |\n\n### Notes\n\n| Command | Description |\n|---------|-------------|\n| `add-note [title] [body]` | Add a new note |\n| `show-notes` | Show all notes |\n| `edit-note [id] [body]` | Edit a note |\n| `delete-note [id]` | Delete a note |\n| `find-note [query]` | Search notes by title or body |\n| `add-tag [id] [tag]` | Add a tag to a note |\n| `find-by-tag [tag]` | Find notes by tag |\n| `sort-by-tag` | Show notes sorted by tags |\n\n### General\n\n| Command | Description |\n|---------|-------------|\n| `hello` | Greeting |\n| `help` | Show available commands |\n| `close` / `exit` | Save and exit |\n\n## Tests\n\nTests are located in the `tests/` directory and run with [pytest](https://docs.pytest.org/):\n\n```bash\npytest tests/ -v\n```\n\nTests run automatically on every pull request via GitHub Actions (Python 3.12).\n\n| Test file | Coverage |\n|-----------|----------|\n| `test_models.py` | Data classes: Field, Name, Phone, Birthday, Email, Address, Record, AddressBook, Note, NoteBook |\n| `test_handlers_contacts.py` | Contact command handlers |\n| `test_handlers_notes.py` | Note command handlers |\n| `test_storage.py` | Data persistence (save/load) |\n| `test_suggest_command.py` | Command suggestion and typo detection |\n\n## GitHub Workflow\n\n1. Each person works in their own **feature branch** (e.g., `feature/contacts`, `feature/notes`).\n2. When the work is ready, create a **Pull Request** to `main`.\n3. At least **1 teammate reviews** the PR before merging.\n4. Before creating a PR, run `git pull origin main` to get the latest changes.\n5. **Never commit directly to `main`** — always use Pull Requests.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelef%2Fgoit-pm-squad-assistant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdelef%2Fgoit-pm-squad-assistant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelef%2Fgoit-pm-squad-assistant/lists"}