wavetermdev/waveterm · error

error writing pwsh-integration wavepwsh.ps1

Error message

error writing pwsh-integration wavepwsh.ps1: %v

What it means

InitRcFiles wraps a failure from utilfn.WriteTemplateToFile when writing wavepwsh.ps1 into the pwsh-integrations directory. This is the last rc file in the sequence; failure means the PowerShell integration script could not be materialized, usually due to filesystem permissions or locks.

Solutions

  1. Close open PowerShell sessions and exclude the wave data dir from AV/sync tools, then retry.
  2. Fix ACLs/permissions on the pwsh-integrations directory so the user can write.
  3. Delete wavepwsh.ps1 (or the whole pwsh-integrations dir) and rerun initialization.
  4. Check the wrapped %v text for the specific underlying error.

Example fix

// before: Windows Defender controlled folder access blocks write
// after: add wave data dir to allowed apps list, or
PS> icacls "$env:USERPROFILE\.waveterm\pwsh-integrations" /grant "$env:USERNAME:(OI)(CI)F"
Defensive patterns

Strategy: validation

Validate before calling

// PowerShell/Windows: confirm ACL allows write before init
fi, err := os.Stat(pwshDir)
if err != nil || !fi.IsDir() { os.MkdirAll(pwshDir, 0755) }
probe := filepath.Join(pwshDir, ".probe")
if err := os.WriteFile(probe, nil, 0644); err != nil {
	return fmt.Errorf("pwsh-integrations not writable (check ACL/AV locks): %w", err)
}
os.Remove(probe)

Try / catch

if err := shellutil.InitRcFiles(home, binDir); err != nil {
	var pe *os.PathError
	if errors.As(err, &pe) && runtime.GOOS == "windows" {
		log.Printf("pwsh write blocked on %s: %v; retry after closing PowerShell/AV", pe.Path, pe.Err)
	}
	return err
}

Prevention

When it happens

Trigger: InitRcFiles / InstallRcFiles failing to open/replace <pwshDir>/wavepwsh.ps1: ACL denial on Windows, file locked by an open PowerShell session or AV scanner, missing dir, or template render error.

Common situations: Windows: OneDrive/Dropbox-synced wave dir locking files; controlled-folder-access blocking writes; POSIX: ro-mounted home; PowerShell sessions holding the .ps1 open.

Understand the failure class

Background: "Permission denied" / "Failed to write" file errors: why a library can't write its files to disk (EACCES, EPERM, ENOSPC) and how to fix them — this error's family across 43 libraries.

Related errors


AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01). Data as JSON: /api/errors/c3ef1292500405b9. Report an issue: GitHub.

Appendix: source

Thrown at pkg/util/shellutil/shellutil.go:423

	err = utilfn.WriteTemplateToFile(filepath.Join(zshDir, ".zshenv"), ZshStartup_Zshenv, params)
	if err != nil {
		return fmt.Errorf("error writing zsh-integration .zshenv: %v", err)
	}
	err = utilfn.WriteTemplateToFile(filepath.Join(bashDir, ".bashrc"), BashStartup_Bashrc, params)
	if err != nil {
		return fmt.Errorf("error writing bash-integration .bashrc: %v", err)
	}
	err = os.WriteFile(filepath.Join(bashDir, "bash_preexec.sh"), []byte(BashStartup_Preexec), 0644)
	if err != nil {
		return fmt.Errorf("error writing bash-integration bash_preexec.sh: %v", err)
	}
	err = utilfn.WriteTemplateToFile(filepath.Join(fishDir, "wave.fish"), FishStartup_Wavefish, params)
	if err != nil {
		return fmt.Errorf("error writing fish-integration wave.fish: %v", err)
	}
	err = utilfn.WriteTemplateToFile(filepath.Join(pwshDir, "wavepwsh.ps1"), PwshStartup_wavepwsh, params)
	if err != nil {
		return fmt.Errorf("error writing pwsh-integration wavepwsh.ps1: %v", err)
	}

	return nil
}

func initCustomShellStartupFilesInternal() error {
	log.Printf("initializing wsh and shell startup files\n")
	waveDataHome := wavebase.GetWaveDataDir()
	binDir := filepath.Join(waveDataHome, WaveHomeBinDir)
	err := InitRcFiles(waveDataHome, binDir)
	if err != nil {
		return err
	}

	err = wavebase.CacheEnsureDir(binDir, WaveHomeBinDir, 0755, WaveHomeBinDir)
	if err != nil {
		return err
	}

View on GitHub (pinned to a4447c1563)