gastownhall/beads · error

writing %s: %w

Error message

writing %s: %w

What it means

After marshaling succeeds, SaveProxiedServerClientInfo writes the JSON to the sidecar file (mode 0600) via os.WriteFile. This error wraps any filesystem write failure, prefixed with the sidecar filename. It is the standard I/O failure path for persisting proxied-server client info.

Source

Thrown at internal/configfile/proxied_server_client_info.go:52

	}
	var info ProxiedServerClientInfo
	if err := json.Unmarshal(data, &info); err != nil {
		return nil, fmt.Errorf("parsing %s: %w", ProxiedServerClientInfoFileName, err)
	}
	return &info, nil
}

func SaveProxiedServerClientInfo(beadsDir string, info *ProxiedServerClientInfo) error {
	if info == nil {
		info = &ProxiedServerClientInfo{}
	}
	data, err := json.MarshalIndent(info, "", "  ")
	if err != nil {
		return fmt.Errorf("marshaling %s: %w", ProxiedServerClientInfoFileName, err)
	}
	path := ProxiedServerClientInfoPath(beadsDir)
	if err := os.WriteFile(path, data, 0o600); err != nil {
		return fmt.Errorf("writing %s: %w", ProxiedServerClientInfoFileName, err)
	}
	return nil
}

func resolveSidecarPath(beadsDir, p string) string {
	if p == "" {
		return ""
	}
	if filepath.IsAbs(p) {
		return p
	}
	return filepath.Join(beadsDir, p)
}

func (i *ProxiedServerClientInfo) ResolvedRootPath(beadsDir string) string {
	if i == nil {
		return ""
	}

View on GitHub (pinned to 71377f2769)

Solutions

  1. Read the wrapped %w error — typically 'permission denied' or 'no such file or directory'.
  2. Ensure the beads directory exists (bd normally creates it; mkdir -p the path if needed).
  3. Fix filesystem permissions (chown/chmod the .beads dir, mode 0700) or free disk space.
  4. Verify BEADS_DIR / beadsDir points to a writable location.

Example fix

// before
err := configfile.SaveProxiedServerClientInfo(beadsDir, info)
// after
if err := os.MkdirAll(beadsDir, 0o700); err != nil {
    return err
}
err := configfile.SaveProxiedServerClientInfo(beadsDir, info)
Defensive patterns

Strategy: validation

Validate before calling

if st, err := os.Stat(beadsDir); err != nil || !st.IsDir() {
    return fmt.Errorf("beads dir %s not usable: %w", beadsDir, err)
}

Prevention

When it happens

Trigger: os.WriteFile fails on ProxiedServerClientInfoPath(beadsDir): the .beads directory does not exist, the file/dir is read-only, disk is full, or permission is denied for the current user.

Common situations: Running bd as a different user than the one who owns ~/.beads; read-only filesystem or container; disk quota exceeded; beadsDir pointing at a deleted or never-created directory.

Related errors


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/455d0c920c6ef457. Report an issue: GitHub.