Skip to content

Proposal: Expose LSP/Language Service capabilities (e.g., rename) via a tsc subcommandΒ #64102

Description

@trim21

πŸ” Search Terms

lsp rename refactor

βœ… Viability Checklist

⭐ Suggestion

As AI coding agents evolve, structured program manipulation becomes increasingly vital. While tsc currently excels at type-checking and emitting JavaScript, programmatic refactoring (such as symbol renaming) is only exposed through the Language Service API in Node.js or via standard LSP integration over IPC.

To better support CLI-driven agent workflows, we should consider exposing core Language Service features through dedicated tsc subcommands (e.g., tsc rename ).

Prior Art / Motivation:
Other language toolchains already offer similar CLI interfaces for headless program transformation. For instance, Go provides native subcommand/tooling support via gopls (e.g., gopls rename ...), allowing external CLI tools and AI agents to execute deterministic, workspace-wide symbol renames without needing to boot a full LSP client or write custom Node.js wrappers around typescript.createLanguageService.

Exposing this in tsc would provide:

A standardized, zero-dependency CLI interface for AI agents to perform refactoring safely.

Deterministic AST/type-aware renaming out of the box for automated workflows.

Reduced friction for CLI tool developers who currently have to mock or bridge LSP protocols.

πŸ“ƒ Motivating Example

 $ gopls rename --help
rename selected identifier

Usage:
  gopls [flags] rename [rename-flags] <position> <name>

Example:

        $ # 1-based location (:line:column or :#position) of the thing to change
        $ gopls rename helper/helper.go:8:6 Foo
        $ gopls rename helper/helper.go:#53 Foo

rename-flags:
  -d,-diff
        display diffs instead of edited file content
  -l,-list
        display names of edited files
  -preserve
        with -write, make copies of original files
  -w,-write
        write edited content to source files

πŸ’» Use Cases

  1. agent vibe coding

Metadata

Metadata

Assignees

No one assigned

    Labels

    SuggestionAn idea for TypeScript

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions