Manage your Opensource projects!
mo keeps your GitHub repos organized under a single root directory.
vp i -g @liangmi/mo- macOS or Linux
git- GitHub CLI
ghauthenticated (gh auth status)
Run once to initialize config and shell integration:
mo setupTip
If you are an agent user, we provide two skills:
global-projectsorganizes repositories and resolves their local paths.contribute-to-open-sourceprepares forks withmo forkand follows the upstream contribution workflow.
Install either skill with:
skills add liangmiQwQ/mo --skill global-projects -g
skills add liangmiQwQ/mo --skill contribute-to-open-source -gBoth skills detect whether mo or moi is installed and use the matching command.
| Command | Alias | Description |
|---|---|---|
mo setup |
Initialize config and shell integration | |
mo clone <repo> |
mo c |
Clone <owner>/<repo> or a GitHub repo URL |
mo composition <main> <subs> <repo> |
Run clone/fork, then cd/edit/open |
|
mo fork [repo] |
mo f |
Fork <owner>/<repo>, a GitHub URL, or cwd |
mo list |
mo ls |
List all managed repos |
mo cd [target] |
Jump to root, owner, repo, or GitHub URL | |
mo edit [target] |
mo e |
Open a directory in your editor |
mo open [target] |
mo o |
Open a root, owner, or repo on GitHub |
mo cd, mo edit, and mo open share the same target resolution and open an interactive selector when called without arguments. When a target is provided, it can be ., a search query, <owner>/<repo>, or a GitHub repository URL for an existing local repo. . means the managed project containing the current directory, even from a nested directory. mo fork . forks that current project in place, like mo fork with no argument. Commands that require a remote repository, including mo clone and mo composition, do not accept .. mo open opens the resolved GitHub destination in the system default browser.
Repository arguments do not need to be clean. Pull request and file links, SSH remotes, URLs without https://, and copied text containing a GitHub URL or <owner>/<repo> all resolve to the repository. For mo cd, mo edit, and mo open, free text is only read after the local search finds nothing.
Tip
If you are using mo with VS Code based editors, you can add this line to your editor config to prevent mo edit popping up a new separated window.
"window.openFoldersInNewWindow": "off"Setting code -r as your editor in mo setup have the same effect as well.
The config file should be generated by running mo setup. Modifying ~/.config/morc.json manually is not recommended.
Please follow the config_schema.json if you are developing mo.
~/.config/morc.json:
{
"$schema": "https://raw.githubusercontent.com/liangmiQwQ/mo/main/config_schema.json",
"root": "~/code",
"shells": ["zsh"],
"editor": "code",
"alias": {
"clone": ["k"],
"cd": ["i"],
"edit": ["e"]
},
"compositionAlias": true
}If another tool already uses the mo command, we provide moi as an cli alias:
vp i -g @liangmi/moi@liangmi/moi has the same behavior, but exposes moi, moi-inner, and moi-get-root commands.
We are so excited that you are willing to help improving mo! Please see ROADMAP.md for what's planned.
Vite+ provides powerful developing tools for the cli development, including linting, formatting and bundling.
Vue TUI provides an excellent Tui framework based on Vue.js. It helps build the selector part inside mo cd, mo edit and mo open commands.
MIT © Liang Mi
