{"id":27629609,"url":"https://github.com/markjaquith/cmdy","last_synced_at":"2026-03-06T19:02:02.613Z","repository":{"id":51886379,"uuid":"519405947","full_name":"markjaquith/cmdy","owner":"markjaquith","description":"Your friendly command manager","archived":false,"fork":false,"pushed_at":"2026-03-01T05:21:00.000Z","size":269,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-01T08:22:32.292Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","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/markjaquith.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2022-07-30T03:14:01.000Z","updated_at":"2026-03-01T05:20:57.000Z","dependencies_parsed_at":"2025-10-28T08:20:17.733Z","dependency_job_id":"0b5565cc-1372-4728-b805-8c8cc8c367c0","html_url":"https://github.com/markjaquith/cmdy","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/markjaquith/cmdy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markjaquith%2Fcmdy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markjaquith%2Fcmdy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markjaquith%2Fcmdy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markjaquith%2Fcmdy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/markjaquith","download_url":"https://codeload.github.com/markjaquith/cmdy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markjaquith%2Fcmdy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30192367,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T18:54:55.862Z","status":"ssl_error","status_checked_at":"2026-03-06T18:53:04.013Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":"2025-04-23T15:27:07.302Z","updated_at":"2026-03-06T19:02:02.607Z","avatar_url":"https://github.com/markjaquith.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cmdy\n\nA simple CLI tool to manage, select, and execute predefined shell command snippets.\n\n## Features\n\n- Define command snippets in TOML files and organize them in directories\n- Interactive fuzzy search using [fzf] (with ANSI colors, reversed layout, rounded border, 50% height by default)\n- Filter snippets by tags\n- Run snippets directly from the selection menu\n- `edit` subcommand: open a snippet's source file in your `$EDITOR`\n- `clip` subcommand: copy a snippet's command to the system clipboard\n\n## Install\n\nRequires Rust and [cargo].\n\n```sh\ncargo install cmdy\n```\n\n## Quickstart\n\n1. Create a snippets directory (default location is `$XDG_CONFIG_HOME/cmdy/commands` or `~/.config/cmdy/commands`).\n2. Add one or more `.toml` files with snippet definitions (see _Defining Snippets_ below).\n3. Run:\n   ```sh\n   cmdy\n   ```\n4. Type to filter, select a snippet, and press Enter to execute it.\n\n### Subcommands\n\n- `cmdy edit` — Launch your `$EDITOR` on the selected snippet's TOML file.\n- `cmdy clip` — Copy the selected snippet's `command` string to your clipboard.\n\n### Flags\n\n- `--dir \u003cDIRECTORY\u003e` — Specify a custom snippets directory (overrides default).\n- `-t, --tag \u003cTAG\u003e` — Show only snippets tagged with `\u003cTAG\u003e` (can be repeated).\n- `-q, --query \u003cQUERY\u003e` — Pre-populate the initial filter query for the interactive selector. This works with `fzf` and `gum` (PRs welcome for other filtering tools).\n- `--dry-run` — Show the command that would be executed without actually running it. Useful for verifying commands before execution.\n\n## Configuration\n\nGlobal settings are loaded from `cmdy.toml` in your config directory (`$XDG_CONFIG_HOME/cmdy/cmdy.toml` or `~/.config/cmdy/cmdy.toml`).\n\nExample `cmdy.toml`:\n\n```toml\n# Command used for interactive filtering\nfilter_command = \"fzf --ansi --layout=reverse --border=rounded --height=50%\"\n\n# Additional snippet directories to scan\ndirectories = [\"/path/to/other/snippets\"]\n```\n\n## Defining Snippets\n\nCreate one or more `.toml` files in your snippets directory, using the `[[commands]]` table:\n\n```toml\n[[commands]]\ndescription = \"List all files with details\"\ncommand = \"ls -lAh --color=auto\"\ntags = [\"files\", \"list\"]\n\n[[commands]]\ndescription = \"Show current date and time\"\ncommand = \"date '+%Y-%m-%d %H:%M:%S'\"\n```\n\nFiles without valid `[[commands]]` tables are skipped, and duplicate `description` names across files will error.\n\n## Development\n\nClone the repo and build:\n\n```sh\ngit clone https://github.com/markjaquith/cmdy.git\ncd cmdy\ncargo build\ncargo test\n```\n\nEnsure you have [fzf] installed in your `PATH` for interactive selection.\n\n### Development Commands\n\n```sh\n# Run tests\ncargo test\n\n# Run linting\ncargo clippy\n\n# Format code\ncargo fmt\n\n# Run with debug output\nRUST_LOG=debug cargo run\n\n# Build release version\ncargo build --release\n\n# Check for security vulnerabilities\ncargo audit\n```\n\n### Project Structure\n\n```\ncmdy/\n├── src/              # Source code\n│   ├── main.rs      # Entry point and CLI parsing\n│   ├── config.rs    # Configuration management\n│   ├── types.rs     # Data structures\n│   ├── loader.rs    # TOML file loading\n│   ├── ui.rs        # User interface and selection\n│   └── executor.rs  # Command execution\n├── tests/           # Integration tests\n├── examples/        # Example command files\n├── .github/         # CI/CD workflows\n└── Cargo.toml       # Project manifest\n```\n\n## Release Process\n\n```sh\n# patch, or minor, or major\ncargo release patch --no-publish --execute\ngit push --follow-tags\n```\n\nIf a release fails CI on GitHub, delete the tag and retry:\n\n```sh\ngit tag -d v0.1.X\ngit push origin :v0.1.X\n# Fix the issue, then re-release\n```\n\n## License\n\nDistributed under the MIT License. See [LICENSE] for details.\n\n[fzf]: https://github.com/junegunn/fzf\n[cargo]: https://doc.rust-lang.org/cargo/\n[LICENSE]: LICENSE\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkjaquith%2Fcmdy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarkjaquith%2Fcmdy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkjaquith%2Fcmdy/lists"}