{"id":16611474,"url":"https://github.com/cursorless-dev/command-server","last_synced_at":"2025-06-11T07:09:45.901Z","repository":{"id":40364917,"uuid":"343181275","full_name":"cursorless-dev/command-server","owner":"cursorless-dev","description":"Secure VSCode communication channel designed for voice coding","archived":false,"fork":false,"pushed_at":"2025-01-25T18:25:05.000Z","size":113,"stargazers_count":20,"open_issues_count":6,"forks_count":10,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-06-10T02:39:36.570Z","etag":null,"topics":["voice","vscode","vscode-extension"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cursorless-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["pokey","AndreasArvidsson"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":"pokey","issuehunt":null,"otechie":null,"custom":null}},"created_at":"2021-02-28T18:26:00.000Z","updated_at":"2025-05-01T19:31:01.000Z","dependencies_parsed_at":"2025-01-25T19:20:55.962Z","dependency_job_id":"0d99f57d-3232-45ac-b2c2-56a8b3ed904b","html_url":"https://github.com/cursorless-dev/command-server","commit_stats":null,"previous_names":["cursorless-dev/command-server"],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cursorless-dev%2Fcommand-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cursorless-dev%2Fcommand-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cursorless-dev%2Fcommand-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cursorless-dev%2Fcommand-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cursorless-dev","download_url":"https://codeload.github.com/cursorless-dev/command-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cursorless-dev%2Fcommand-server/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259219712,"owners_count":22823577,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["voice","vscode","vscode-extension"],"created_at":"2024-10-12T01:37:51.480Z","updated_at":"2025-06-11T07:09:45.871Z","avatar_url":"https://github.com/cursorless-dev.png","language":"TypeScript","funding_links":["https://github.com/sponsors/pokey","https://github.com/sponsors/AndreasArvidsson","https://liberapay.com/pokey"],"categories":[],"sub_categories":[],"readme":"# command-server README\n\nAdds support for running arbitrary commands via file-based RPC. Designed for\nuse with voice-control systems such as [Talon](https://talonvoice.com/).\n\n## Features\n\nOn startup, creates a directory in the default tmp directory, called\n`vscode-command-server-${userName}`, where `${userName}` is the username. Then\nwaits for the `command-server.runCommand` command to be issued, which will\ntrigger the command server to read the `request.json` file in the communication\ndirectory, execute the command requested there, and write the response to\n`response.json`. Note that we write the JSON response on a single line, with a\ntrailing newline, so that the client can repeatedly try to read the file until\nit finds a final newline to indicate that the write is complete.\n\nNote that the command server will refuse to execute a command if the request file is older than 3 seconds.\n\nRequests look as follows:\n\n```json\n{\n  \"commandId\": \"some-command-id\",\n  \"args\": [\"some-argument\"]\n}\n```\n\nSee `Request` and `Response` [types](src/types.ts) for supported request / response parameters.\n\nUpon receiving the above, this extension would run the command\n`some-command-id` with argument `\"some-argument\"`.\n\nIf you'd like the server to wait for the command to finish before responding,\npass `waitForFinish=true`.\n\nIf you'd like the server to wait for the command to finish and then respond\nwith the command return value encoded as JSON, pass `expectResponse=true`.\n\n### Python example\n\nHave a look at\n[talon-vscode-command-client](https://github.com/pokey/talon-vscode-command-client).\n\n## Commands\n\nContributes the following commands:\n\n- `command-server.runCommand`: Reads from the requests.json file and executes the given command.\n\n## Keyboard shortcuts\n\n| Key                                                                | Command     |\n| ------------------------------------------------------------------ | ----------- |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e/\u003ckbd\u003eCmd\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eF17\u003c/kbd\u003e | Run command |\n\n## Configuration\n\nContributes the following settings:\n\n### `command-server.allowList`\n\nAllows user to specify the allowed commands using glob syntax, eg:\n\n```json\n{\n  \"command-server.allowList\": [\"workbench.*\"]\n}\n```\n\nDefaults to `[\"*\"]` (allows everything).\n\n### `command-server.denyList`\n\nAllows user to specify the denied commands using glob syntax, eg:\n\n```json\n{\n  \"command-server.denyList\": [\"workbench.*\"]\n}\n```\n\nDefaults to `[]` (doesn't deny anything).\n\n## Troubleshooting\n\n## Known issues\n\n- The server won't respond until the extension is loaded. This may be obvious,\n  but just be aware that if you have other extensions that take a while to\n  load, the server might not respond for a little while after you load an\n  editor window until everything is fully loaded.\n- There is a very unlikely race condition. If the front VSCode is hung\n  when you issue a command, and then you switch to another VSCode, and issue a\n  command, then if the first instance wakes up at the exact right moment it\n  could execute the command. There is code in the command server that tries to\n  prevent a background window from inadvertently executing a command, but\n  VSCode seems to be a bit inconsistent with determining which window has\n  focus. When this focused window detection fails, it will end up [preventing\n  correct commands from running](https://github.com/knausj85/knausj_talon/issues/466). Thus, this protection has been disabled by\n  default, as the scenario it protects against has never been observed in practice. If you do have issues with background windows trying to execute\n  commands, please file an issue, and we can look into another way to prevent\n  this from occurring.\n\n## Change Log\n\nSee [CHANGELOG.md](CHANGELOG.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcursorless-dev%2Fcommand-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcursorless-dev%2Fcommand-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcursorless-dev%2Fcommand-server/lists"}