on main help sign in
feat(permissions): add `--yolo` flag for auto-accepting all permissions

- Add --yolo/-y flag to enable dangerous mode that automatically accepts all permission requests - Pass yolo flag from command line through config to permission service This feature allows users to bypass all permission prompts when they trust the operations being performed, useful for automation or when running in controlled environments. ๐Ÿ’˜ Generated with Crush Co-Authored-By: Crush <noreply@crush.charm.land> Co-authored-by: Andrey Nering <andreynering@users.noreply.github.com>

commit2d332fc6c1642e9337ff70681b68e7f5c21ef770 authorhems <mail@hems.io> dateMon 14 Jul 2025, 21:58 (1 year ago) parent04048e2
4 files changed+22โˆ’9
cmd/root.go+6 internal/app/app.go+2โˆ’1 internal/config/config.go+7โˆ’7 internal/permission/permission.go+7โˆ’1
cmd/root.go+6
@@ -45,6 +45,9 @@ to assist developers in writing, debugging, and understanding code directly from
4545
4646 # Run a single non-interactive prompt with JSON output format
4747 crush -p "Explain the use of context in Go" -f json
48+
49+ # Run in dangerous mode (auto-accept all permissions)
50+ crush -y
4851 `,
4952 RunE: func(cmd *cobra.Command, args []string) error {
5053 // Load the config
@@ -52,6 +55,7 @@ to assist developers in writing, debugging, and understanding code directly from
5255 cwd, _ := cmd.Flags().GetString("cwd")
5356 prompt, _ := cmd.Flags().GetString("prompt")
5457 quiet, _ := cmd.Flags().GetBool("quiet")
58+ yolo, _ := cmd.Flags().GetBool("yolo")
5559
5660 if cwd != "" {
5761 err := os.Chdir(cwd)
@@ -71,6 +75,7 @@ to assist developers in writing, debugging, and understanding code directly from
7175 if err != nil {
7276 return err
7377 }
78+ cfg.Options.SkipPermissionsRequests = yolo
7479
7580 ctx := cmd.Context()
7681
@@ -152,6 +157,7 @@ func init() {
152157 rootCmd.Flags().BoolP("help", "h", false, "Help")
153158 rootCmd.Flags().BoolP("debug", "d", false, "Debug")
154159 rootCmd.Flags().StringP("prompt", "p", "", "Prompt to run in non-interactive mode")
160+ rootCmd.Flags().BoolP("yolo", "y", false, "Automatically accept all permissions (dangerous mode)")
155161
156162 // Add quiet flag to hide spinner in non-interactive mode
157163 rootCmd.Flags().BoolP("quiet", "q", false, "Hide spinner in non-interactive mode")
internal/app/app.go+2โˆ’1
@@ -58,12 +58,13 @@ func New(ctx context.Context, conn *sql.DB, cfg *config.Config) (*App, error) {
5858 sessions := session.NewService(q)
5959 messages := message.NewService(q)
6060 files := history.NewService(q, conn)
61+ skipPermissionsRequests := cfg.Options != nil && cfg.Options.SkipPermissionsRequests
6162
6263 app := &App{
6364 Sessions: sessions,
6465 Messages: messages,
6566 History: files,
66โˆ’ Permissions: permission.NewPermissionService(cfg.WorkingDir()),
67+ Permissions: permission.NewPermissionService(cfg.WorkingDir(), skipPermissionsRequests),
6768 LSPClients: make(map[string]*lsp.Client),
6869
6970 globalCtx: ctx,
internal/config/config.go+7โˆ’7
@@ -114,13 +114,13 @@ type TUIOptions struct {
114114}
115115
116116type Options struct {
117โˆ’ ContextPaths []string `json:"context_paths,omitempty"`
118โˆ’ TUI *TUIOptions `json:"tui,omitempty"`
119โˆ’ Debug bool `json:"debug,omitempty"`
120โˆ’ DebugLSP bool `json:"debug_lsp,omitempty"`
121โˆ’ DisableAutoSummarize bool `json:"disable_auto_summarize,omitempty"`
122โˆ’ // Relative to the cwd
123โˆ’ DataDirectory string `json:"data_directory,omitempty"`
117+ ContextPaths []string `json:"context_paths,omitempty"`
118+ TUI *TUIOptions `json:"tui,omitempty"`
119+ Debug bool `json:"debug,omitempty"`
120+ DebugLSP bool `json:"debug_lsp,omitempty"`
121+ DisableAutoSummarize bool `json:"disable_auto_summarize,omitempty"`
122+ DataDirectory string `json:"data_directory,omitempty"` // Relative to the cwd
123+ SkipPermissionsRequests bool `json:"-"` // Automatically accept all permissions (YOLO mode)
124124}
125125
126126type MCPs map[string]MCPConfig
internal/permission/permission.go+7โˆ’1
@@ -49,6 +49,7 @@ type permissionService struct {
4949 pendingRequests sync.Map
5050 autoApproveSessions []string
5151 autoApproveSessionsMu sync.RWMutex
52+ skip bool
5253}
5354
5455func (s *permissionService) GrantPersistent(permission PermissionRequest) {
@@ -77,6 +78,10 @@ func (s *permissionService) Deny(permission PermissionRequest) {
7778}
7879
7980func (s *permissionService) Request(opts CreatePermissionRequest) bool {
81+ if s.skip {
82+ return true
83+ }
84+
8085 s.autoApproveSessionsMu.RLock()
8186 autoApprove := slices.Contains(s.autoApproveSessions, opts.SessionID)
8287 s.autoApproveSessionsMu.RUnlock()
@@ -125,10 +130,11 @@ func (s *permissionService) AutoApproveSession(sessionID string) {
125130 s.autoApproveSessionsMu.Unlock()
126131}
127132
128โˆ’func NewPermissionService(workingDir string) Service {
133+func NewPermissionService(workingDir string, skip bool) Service {
129134 return &permissionService{
130135 Broker: pubsub.NewBroker[PermissionRequest](),
131136 workingDir: workingDir,
132137 sessionPermissions: make([]PermissionRequest, 0),
138+ skip: skip,
133139 }
134140}