linkshell-cli 0.2.112 → 0.2.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -723,38 +723,181 @@ interface ProviderRuntimeCapabilities {
723
723
  const ALL_REASONING_EFFORTS = ["none", "minimal", "low", "medium", "high", "xhigh"] as const;
724
724
  const ALL_PERMISSION_MODES = ["read_only", "workspace_write", "full_access"] as const;
725
725
  const CODEX_COMMAND_NAMES = ["plan", "exit-plan", "compact", "clear", "status", "review", "subagents"] as const;
726
+ const CLAUDE_REMOTE_HIDDEN_COMMANDS = new Set([
727
+ "add-dir",
728
+ "agents",
729
+ "allowed-tools",
730
+ "android",
731
+ "app",
732
+ "bashes",
733
+ "branch",
734
+ "bug",
735
+ "checkpoint",
736
+ "chrome",
737
+ "color",
738
+ "config",
739
+ "continue",
740
+ "copy",
741
+ "cost",
742
+ "desktop",
743
+ "diff",
744
+ "doctor",
745
+ "exit",
746
+ "export",
747
+ "extra-usage",
748
+ "feedback",
749
+ "focus",
750
+ "fork",
751
+ "hooks",
752
+ "ide",
753
+ "init",
754
+ "install-github-app",
755
+ "install-slack-app",
756
+ "ios",
757
+ "keybindings",
758
+ "login",
759
+ "logout",
760
+ "mcp",
761
+ "memory",
762
+ "migrate-installer",
763
+ "mobile",
764
+ "model",
765
+ "passes",
766
+ "permissions",
767
+ "plugin",
768
+ "powerup",
769
+ "pr-comments",
770
+ "privacy-settings",
771
+ "quit",
772
+ "rc",
773
+ "release-notes",
774
+ "remote-control",
775
+ "remote-env",
776
+ "resume",
777
+ "rewind",
778
+ "settings",
779
+ "statusline",
780
+ "stickers",
781
+ "tasks",
782
+ "teleport",
783
+ "terminal-setup",
784
+ "theme",
785
+ "tp",
786
+ "tui",
787
+ "undo",
788
+ "upgrade",
789
+ "vim",
790
+ "voice",
791
+ "web-setup",
792
+ ]);
726
793
  const CLAUDE_BUILT_IN_COMMANDS: Array<{ name: string; description: string; argsMode?: AgentCommandDescriptor["argsMode"]; destructive?: boolean }> = [
727
- { name: "add-dir", description: "Add additional working directories" },
728
- { name: "agents", description: "Manage subagents" },
729
- { name: "bug", description: "Report a Claude Code bug" },
730
- { name: "clear", description: "Clear conversation context", argsMode: "none", destructive: true },
794
+ { name: "add-dir", description: "Add a working directory for file access", argsMode: "required" },
795
+ { name: "agents", description: "Manage agent configurations", argsMode: "none" },
796
+ { name: "autofix-pr", description: "Spawn a Claude Code web session to fix PR CI or review comments" },
797
+ { name: "batch", description: "Orchestrate large-scale changes across parallel agents", argsMode: "required" },
798
+ { name: "branch", description: "Create a branch of the current conversation" },
799
+ { name: "fork", description: "Alias for /branch" },
800
+ { name: "btw", description: "Ask a side question without adding to the conversation", argsMode: "required" },
801
+ { name: "chrome", description: "Configure Claude in Chrome settings", argsMode: "none" },
802
+ { name: "claude-api", description: "Load Claude API reference or migration guidance" },
803
+ { name: "clear", description: "Start a new conversation with empty context", argsMode: "none", destructive: true },
804
+ { name: "reset", description: "Alias for /clear", argsMode: "none", destructive: true },
805
+ { name: "new", description: "Alias for /clear", argsMode: "none", destructive: true },
806
+ { name: "color", description: "Set the prompt bar color" },
731
807
  { name: "compact", description: "Compact conversation history" },
732
808
  { name: "config", description: "Open configuration" },
733
- { name: "cost", description: "Show usage cost" },
734
- { name: "doctor", description: "Check Claude Code health" },
809
+ { name: "settings", description: "Alias for /config", argsMode: "none" },
810
+ { name: "context", description: "Visualize current context usage", argsMode: "none" },
811
+ { name: "copy", description: "Copy the last assistant response" },
812
+ { name: "cost", description: "Alias for /usage", argsMode: "none" },
813
+ { name: "debug", description: "Enable debug logging and troubleshoot the session" },
814
+ { name: "desktop", description: "Continue the current session in Claude Code Desktop", argsMode: "none" },
815
+ { name: "app", description: "Alias for /desktop", argsMode: "none" },
816
+ { name: "diff", description: "Open an interactive diff viewer", argsMode: "none" },
817
+ { name: "doctor", description: "Check Claude Code health", argsMode: "none" },
818
+ { name: "effort", description: "Set model effort level" },
735
819
  { name: "exit", description: "Exit Claude Code", argsMode: "none", destructive: true },
820
+ { name: "quit", description: "Alias for /exit", argsMode: "none", destructive: true },
736
821
  { name: "export", description: "Export conversation" },
737
- { name: "help", description: "Show help" },
738
- { name: "ide", description: "Manage IDE integration" },
739
- { name: "init", description: "Create or update CLAUDE.md" },
740
- { name: "login", description: "Sign in" },
741
- { name: "logout", description: "Sign out" },
742
- { name: "mcp", description: "Manage MCP servers" },
743
- { name: "memory", description: "Edit memory files" },
822
+ { name: "extra-usage", description: "Configure extra usage when rate limits are hit", argsMode: "none" },
823
+ { name: "fast", description: "Toggle fast mode" },
824
+ { name: "feedback", description: "Submit feedback about Claude Code" },
825
+ { name: "bug", description: "Alias for /feedback" },
826
+ { name: "fewer-permission-prompts", description: "Reduce common permission prompts", argsMode: "none" },
827
+ { name: "focus", description: "Toggle the focus view", argsMode: "none" },
828
+ { name: "heapdump", description: "Write a JavaScript heap snapshot for diagnostics", argsMode: "none" },
829
+ { name: "help", description: "Show help and available commands", argsMode: "none" },
830
+ { name: "hooks", description: "View hook configurations", argsMode: "none" },
831
+ { name: "ide", description: "Manage IDE integrations and show status", argsMode: "none" },
832
+ { name: "init", description: "Initialize project with a CLAUDE.md guide", argsMode: "none" },
833
+ { name: "insights", description: "Generate a report analyzing Claude Code sessions", argsMode: "none" },
834
+ { name: "install-github-app", description: "Set up the Claude GitHub Actions app", argsMode: "none" },
835
+ { name: "install-slack-app", description: "Install the Claude Slack app", argsMode: "none" },
836
+ { name: "keybindings", description: "Open or create keybindings configuration", argsMode: "none" },
837
+ { name: "login", description: "Sign in", argsMode: "none" },
838
+ { name: "logout", description: "Sign out", argsMode: "none" },
839
+ { name: "loop", description: "Run a prompt repeatedly while the session stays open" },
840
+ { name: "proactive", description: "Alias for /loop" },
841
+ { name: "mcp", description: "Manage MCP servers and OAuth authentication", argsMode: "none" },
842
+ { name: "memory", description: "Edit memory files and auto-memory settings", argsMode: "none" },
843
+ { name: "mobile", description: "Show QR code to download the Claude mobile app", argsMode: "none" },
844
+ { name: "ios", description: "Alias for /mobile", argsMode: "none" },
845
+ { name: "android", description: "Alias for /mobile", argsMode: "none" },
744
846
  { name: "model", description: "Switch model" },
745
- { name: "permissions", description: "Manage permissions" },
746
- { name: "pr-comments", description: "Fetch PR comments" },
747
- { name: "release-notes", description: "Show release notes" },
847
+ { name: "passes", description: "Share a free week of Claude Code", argsMode: "none" },
848
+ { name: "permissions", description: "Manage tool permission rules", argsMode: "none" },
849
+ { name: "allowed-tools", description: "Alias for /permissions", argsMode: "none" },
850
+ { name: "plan", description: "Enter Claude Code plan mode" },
851
+ { name: "plugin", description: "Manage Claude Code plugins", argsMode: "none" },
852
+ { name: "powerup", description: "Discover Claude Code features through lessons", argsMode: "none" },
853
+ { name: "pr-comments", description: "Fetch PR comments on older Claude Code versions" },
854
+ { name: "privacy-settings", description: "View and update privacy settings", argsMode: "none" },
855
+ { name: "recap", description: "Generate a one-line session summary", argsMode: "none" },
856
+ { name: "release-notes", description: "Show release notes", argsMode: "none" },
857
+ { name: "reload-plugins", description: "Reload active plugins", argsMode: "none" },
858
+ { name: "remote-control", description: "Make this session available for remote control", argsMode: "none" },
859
+ { name: "rc", description: "Alias for /remote-control", argsMode: "none" },
860
+ { name: "remote-env", description: "Configure the default remote environment", argsMode: "none" },
861
+ { name: "rename", description: "Rename the current session" },
748
862
  { name: "resume", description: "Resume a conversation" },
749
- { name: "review", description: "Review local changes" },
750
- { name: "security-review", description: "Run a security review" },
751
- { name: "status", description: "Show status" },
863
+ { name: "continue", description: "Alias for /resume" },
864
+ { name: "review", description: "Review a pull request locally" },
865
+ { name: "rewind", description: "Rewind the conversation or code to a previous point", argsMode: "none", destructive: true },
866
+ { name: "checkpoint", description: "Alias for /rewind", argsMode: "none", destructive: true },
867
+ { name: "undo", description: "Alias for /rewind", argsMode: "none", destructive: true },
868
+ { name: "sandbox", description: "Toggle sandbox mode", argsMode: "none" },
869
+ { name: "schedule", description: "Create, update, list, or run routines" },
870
+ { name: "routines", description: "Alias for /schedule" },
871
+ { name: "security-review", description: "Analyze pending changes for security issues", argsMode: "none" },
872
+ { name: "setup-bedrock", description: "Configure Amazon Bedrock authentication", argsMode: "none" },
873
+ { name: "setup-vertex", description: "Configure Google Vertex AI authentication", argsMode: "none" },
874
+ { name: "simplify", description: "Review and simplify recently changed files" },
875
+ { name: "skills", description: "List available skills", argsMode: "none" },
876
+ { name: "stats", description: "Alias for /usage", argsMode: "none" },
877
+ { name: "status", description: "Show status", argsMode: "none" },
752
878
  { name: "statusline", description: "Configure status line" },
753
- { name: "terminal-setup", description: "Configure terminal integration" },
754
- { name: "upgrade", description: "Upgrade Claude Code" },
755
- { name: "vim", description: "Toggle vim mode" },
879
+ { name: "stickers", description: "Order Claude Code stickers", argsMode: "none" },
880
+ { name: "tasks", description: "List and manage background tasks", argsMode: "none" },
881
+ { name: "bashes", description: "Alias for /tasks", argsMode: "none" },
882
+ { name: "team-onboarding", description: "Generate a team onboarding guide", argsMode: "none" },
883
+ { name: "teleport", description: "Pull a Claude Code web session into this terminal", argsMode: "none" },
884
+ { name: "tp", description: "Alias for /teleport", argsMode: "none" },
885
+ { name: "terminal-setup", description: "Configure terminal keybindings", argsMode: "none" },
886
+ { name: "theme", description: "Change color theme" },
887
+ { name: "tui", description: "Set the terminal UI renderer" },
888
+ { name: "ultraplan", description: "Draft a plan in an ultraplan web session", argsMode: "required" },
889
+ { name: "ultrareview", description: "Run a deep cloud-based code review" },
890
+ { name: "upgrade", description: "Open upgrade page", argsMode: "none" },
891
+ { name: "usage", description: "Show usage and rate-limit status", argsMode: "none" },
892
+ { name: "vim", description: "Toggle vim mode on older Claude Code versions", argsMode: "none" },
893
+ { name: "voice", description: "Toggle voice dictation" },
894
+ { name: "web-setup", description: "Connect your GitHub account to Claude Code on the web", argsMode: "none" },
756
895
  ];
757
896
 
897
+ function isClaudeRemoteFriendlyCommand(name: string): boolean {
898
+ return !CLAUDE_REMOTE_HIDDEN_COMMANDS.has(name.replace(/^\/+/, ""));
899
+ }
900
+
758
901
  function commandId(provider: AgentProvider, name: string, source: AgentCommandSource = "built_in"): string {
759
902
  return `${provider}:${source}:${name.replace(/^\/+/, "")}`;
760
903
  }
@@ -874,15 +1017,17 @@ function defaultProviderCommands(provider: AgentProvider, cwd: string, enabled:
874
1017
  }));
875
1018
  }
876
1019
  if (provider === "claude") {
877
- const builtIns = CLAUDE_BUILT_IN_COMMANDS.map((entry) => makeCommand({
878
- provider,
879
- name: entry.name,
880
- description: entry.description,
881
- argsMode: entry.argsMode,
882
- destructive: entry.destructive,
883
- disabledReason,
884
- executionKind: "prompt",
885
- }));
1020
+ const builtIns = CLAUDE_BUILT_IN_COMMANDS
1021
+ .filter((entry) => isClaudeRemoteFriendlyCommand(entry.name))
1022
+ .map((entry) => makeCommand({
1023
+ provider,
1024
+ name: entry.name,
1025
+ description: entry.description,
1026
+ argsMode: entry.argsMode,
1027
+ destructive: entry.destructive,
1028
+ disabledReason,
1029
+ executionKind: "prompt",
1030
+ }));
886
1031
  const custom = customClaudeCommands(cwd).map((command) => ({
887
1032
  ...command,
888
1033
  disabledReason: command.disabledReason ?? disabledReason,
@@ -908,7 +1053,12 @@ function mergeCommands(...groups: Array<AgentCommandDescriptor[] | undefined>):
908
1053
  for (const group of groups) {
909
1054
  for (const command of group ?? []) {
910
1055
  const key = `${command.provider ?? ""}:${command.name}`;
911
- map.set(key, { ...map.get(key), ...command });
1056
+ const existing = map.get(key);
1057
+ map.set(key, {
1058
+ ...existing,
1059
+ ...command,
1060
+ disabledReason: command.disabledReason ?? existing?.disabledReason,
1061
+ });
912
1062
  }
913
1063
  }
914
1064
  return [...map.values()].sort((a, b) => a.name.localeCompare(b.name));
@@ -926,6 +1076,7 @@ function runtimeCommands(provider: AgentProvider, value: unknown): AgentCommandD
926
1076
  return commandsValue
927
1077
  .map((entry) => {
928
1078
  if (typeof entry === "string") {
1079
+ if (provider === "claude" && !isClaudeRemoteFriendlyCommand(entry)) return undefined;
929
1080
  return makeCommand({
930
1081
  provider,
931
1082
  name: entry,
@@ -938,6 +1089,7 @@ function runtimeCommands(provider: AgentProvider, value: unknown): AgentCommandD
938
1089
  const record = asRecord(entry);
939
1090
  const name = firstString(record, ["name", "command", "id"]);
940
1091
  if (!name) return undefined;
1092
+ if (provider === "claude" && !isClaudeRemoteFriendlyCommand(name)) return undefined;
941
1093
  return makeCommand({
942
1094
  provider,
943
1095
  name,