Manual/Everyday work
moh asks before it acts
This is moh's defining feature. Every step that could change something — writing a file, running a command, clicking in a web page — passes a gate, and you hold the keys.
The permission prompt
When no rule has decided an action yet, moh stops and asks:
| Key | Effect |
|---|---|
| y yes | Allow this one action. |
| a always | Allow it, and the same kind of action, for the rest of this conversation. The prompt shows the exact rule it will create. |
| e edit | Change the action before it runs — a safer command, a different file. |
| n no | Refuse. moh is told, and looks for another way or asks you. |
| esc | Close the prompt; counts as no. |
Standing rules
Answering the same question every time gets old. A rule decides in advance, in a simple pattern language that is the same everywhere:
| Pattern | Covers |
|---|---|
bash | Every shell command. |
bash:git status | Only commands that start with git status. |
write:src/** | Creating or overwriting files anywhere under src/. |
edit:docs/** | Editing files under docs/. |
A rule either allows or denies. You can create one on
the fly with a, pass one to a single run (--allow "bash:git status",
--deny "write:secrets/**"), or write it in the project's
moh.json file so it applies to everyone working on the project. When several
apply, the most specific wins.
# moh.json — let moh check git freely, never let it touch secrets/
{
"permissions": {
"overrides": {
"bashAllow": [["git", "status"], ["git", "diff"]],
"bashDeny": [["git", "push"]],
"pathDeny": ["secrets/**"]
}
}
}
The three caution levels
Press shift+tab to rotate between them. The current level is always named at the bottom of the screen, and the choice lasts only for this conversation — a new one starts from your settings again.
| Level | What it does | Use it for |
|---|---|---|
| ◌ Normal | Asks for every action no rule allows. Stays inside the project folder. | Learning, real work, anything you care about. |
| ◐ Auto-accept | Stops asking for moh's routine actions. Still asks for anything outside the project and for questions raised by extensions. | Long tasks you are watching. |
| ⚠ YOLO | No questions at all, and no fence around the project folder. | Throwaway experiments only. |
Rule of thumb
Stay in Normal while you are learning. The prompts are not friction — they are the product. Reading what moh is about to do is how you learn what it does.
The limits nothing can lift
- Writes outside the project folder are asked every single time. They can never become a rule, not even by accident.
- Extensions can only make moh more careful. One can refuse an action or raise a question; it can never grant something you did not allow. Its questions offer yes/no only.
- Commands you type yourself with
!go through the same gate (see running your own commands). - When nobody can answer — in scripts and CI — an action that would need a question is refused instead of waiting forever (see automation).
Web pages and the browser
Reading a web page is allowed, but moh refuses addresses on your private network (your router, local services) unless you opt in, so a page cannot trick it into poking around your home network. In the browser, looking is free; clicking, typing, uploading and downloading ask first, and "always for this site" stays limited to that site and this conversation.
Written for moh 0.61. Inside moh, ctrl+h opens the built-in manual for your exact version.
