mirror of
https://github.com/coder/registry.git
synced 2026-06-02 20:48:14 +00:00
feat: update vscode-based desktop IDE modules to use vscode-desktop-core (#279)
This commit is contained in:
@@ -16,7 +16,7 @@ Uses the [Coder Remote VS Code Extension](https://github.com/coder/vscode-coder)
|
|||||||
module "cursor" {
|
module "cursor" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/cursor/coder"
|
source = "registry.coder.com/coder/cursor/coder"
|
||||||
version = "1.3.3"
|
version = "1.4.0"
|
||||||
agent_id = coder_agent.main.id
|
agent_id = coder_agent.main.id
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -29,7 +29,7 @@ module "cursor" {
|
|||||||
module "cursor" {
|
module "cursor" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/cursor/coder"
|
source = "registry.coder.com/coder/cursor/coder"
|
||||||
version = "1.3.3"
|
version = "1.4.0"
|
||||||
agent_id = coder_agent.main.id
|
agent_id = coder_agent.main.id
|
||||||
folder = "/home/coder/project"
|
folder = "/home/coder/project"
|
||||||
}
|
}
|
||||||
@@ -45,7 +45,7 @@ The following example configures Cursor to use the GitHub MCP server with authen
|
|||||||
module "cursor" {
|
module "cursor" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/cursor/coder"
|
source = "registry.coder.com/coder/cursor/coder"
|
||||||
version = "1.3.3"
|
version = "1.4.0"
|
||||||
agent_id = coder_agent.main.id
|
agent_id = coder_agent.main.id
|
||||||
folder = "/home/coder/project"
|
folder = "/home/coder/project"
|
||||||
mcp = jsonencode({
|
mcp = jsonencode({
|
||||||
@@ -58,6 +58,7 @@ module "cursor" {
|
|||||||
"type" : "http"
|
"type" : "http"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,10 @@ describe("cursor", async () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
const coder_app = state.resources.find(
|
||||||
(res) => res.type === "coder_app" && res.name === "cursor",
|
(res) =>
|
||||||
|
res.type === "coder_app" &&
|
||||||
|
res.module === "module.vscode-desktop-core" &&
|
||||||
|
res.name === "vscode-desktop",
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(coder_app).not.toBeNull();
|
expect(coder_app).not.toBeNull();
|
||||||
@@ -76,21 +79,6 @@ describe("cursor", async () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("expect order to be set", async () => {
|
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
|
||||||
agent_id: "foo",
|
|
||||||
order: "22",
|
|
||||||
});
|
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
|
||||||
(res) => res.type === "coder_app" && res.name === "cursor",
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(coder_app).not.toBeNull();
|
|
||||||
expect(coder_app?.instances.length).toBe(1);
|
|
||||||
expect(coder_app?.instances[0].attributes.order).toBe(22);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("writes ~/.cursor/mcp.json when mcp provided", async () => {
|
it("writes ~/.cursor/mcp.json when mcp provided", async () => {
|
||||||
const id = await runContainer("alpine");
|
const id = await runContainer("alpine");
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -64,26 +64,21 @@ locals {
|
|||||||
mcp_b64 = var.mcp != "" ? base64encode(var.mcp) : ""
|
mcp_b64 = var.mcp != "" ? base64encode(var.mcp) : ""
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "coder_app" "cursor" {
|
module "vscode-desktop-core" {
|
||||||
agent_id = var.agent_id
|
source = "registry.coder.com/coder/vscode-desktop-core/coder"
|
||||||
external = true
|
version = "1.0.0"
|
||||||
icon = "/icon/cursor.svg"
|
|
||||||
slug = var.slug
|
agent_id = var.agent_id
|
||||||
display_name = var.display_name
|
|
||||||
order = var.order
|
coder_app_icon = "/icon/cursor.svg"
|
||||||
group = var.group
|
coder_app_slug = var.slug
|
||||||
url = join("", [
|
coder_app_display_name = var.display_name
|
||||||
"cursor://coder.coder-remote/open",
|
coder_app_order = var.order
|
||||||
"?owner=",
|
coder_app_group = var.group
|
||||||
data.coder_workspace_owner.me.name,
|
|
||||||
"&workspace=",
|
folder = var.folder
|
||||||
data.coder_workspace.me.name,
|
open_recent = var.open_recent
|
||||||
var.folder != "" ? join("", ["&folder=", var.folder]) : "",
|
protocol = "cursor"
|
||||||
var.open_recent ? "&openRecent" : "",
|
|
||||||
"&url=",
|
|
||||||
data.coder_workspace.me.access_url,
|
|
||||||
"&token=$SESSION_TOKEN",
|
|
||||||
])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "coder_script" "cursor_mcp" {
|
resource "coder_script" "cursor_mcp" {
|
||||||
@@ -103,6 +98,6 @@ resource "coder_script" "cursor_mcp" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
output "cursor_url" {
|
output "cursor_url" {
|
||||||
value = coder_app.cursor.url
|
value = module.vscode-desktop-core.ide_uri
|
||||||
description = "Cursor IDE Desktop URL."
|
description = "Cursor IDE Desktop URL."
|
||||||
}
|
}
|
||||||
@@ -18,7 +18,7 @@ Uses the [Coder Remote VS Code Extension](https://github.com/coder/vscode-coder)
|
|||||||
module "kiro" {
|
module "kiro" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/kiro/coder"
|
source = "registry.coder.com/coder/kiro/coder"
|
||||||
version = "1.1.1"
|
version = "1.2.0"
|
||||||
agent_id = coder_agent.main.id
|
agent_id = coder_agent.main.id
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -31,7 +31,7 @@ module "kiro" {
|
|||||||
module "kiro" {
|
module "kiro" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/kiro/coder"
|
source = "registry.coder.com/coder/kiro/coder"
|
||||||
version = "1.1.1"
|
version = "1.2.0"
|
||||||
agent_id = coder_agent.main.id
|
agent_id = coder_agent.main.id
|
||||||
folder = "/home/coder/project"
|
folder = "/home/coder/project"
|
||||||
}
|
}
|
||||||
@@ -47,7 +47,7 @@ The following example configures Kiro to use the GitHub MCP server with authenti
|
|||||||
module "kiro" {
|
module "kiro" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/kiro/coder"
|
source = "registry.coder.com/coder/kiro/coder"
|
||||||
version = "1.1.1"
|
version = "1.2.0"
|
||||||
agent_id = coder_agent.main.id
|
agent_id = coder_agent.main.id
|
||||||
folder = "/home/coder/project"
|
folder = "/home/coder/project"
|
||||||
mcp = jsonencode({
|
mcp = jsonencode({
|
||||||
@@ -60,6 +60,7 @@ module "kiro" {
|
|||||||
"type" : "http"
|
"type" : "http"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,6 @@ run "default_output" {
|
|||||||
condition = output.kiro_url == "kiro://coder.coder-remote/open?owner=default&workspace=default&url=https://mydeployment.coder.com&token=$SESSION_TOKEN"
|
condition = output.kiro_url == "kiro://coder.coder-remote/open?owner=default&workspace=default&url=https://mydeployment.coder.com&token=$SESSION_TOKEN"
|
||||||
error_message = "Default kiro_url must match expected value"
|
error_message = "Default kiro_url must match expected value"
|
||||||
}
|
}
|
||||||
|
|
||||||
assert {
|
|
||||||
condition = coder_app.kiro.order == null
|
|
||||||
error_message = "coder_app order must be null by default"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
run "adds_folder" {
|
run "adds_folder" {
|
||||||
@@ -53,54 +48,6 @@ run "folder_and_open_recent" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
run "custom_slug_display_name" {
|
|
||||||
command = plan
|
|
||||||
|
|
||||||
variables {
|
|
||||||
agent_id = "foo"
|
|
||||||
slug = "kiro-ai"
|
|
||||||
display_name = "Kiro AI IDE"
|
|
||||||
}
|
|
||||||
|
|
||||||
assert {
|
|
||||||
condition = coder_app.kiro.slug == "kiro-ai"
|
|
||||||
error_message = "coder_app slug must be set to kiro-ai"
|
|
||||||
}
|
|
||||||
|
|
||||||
assert {
|
|
||||||
condition = coder_app.kiro.display_name == "Kiro AI IDE"
|
|
||||||
error_message = "coder_app display_name must be set to Kiro AI IDE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
run "sets_order" {
|
|
||||||
command = plan
|
|
||||||
|
|
||||||
variables {
|
|
||||||
agent_id = "foo"
|
|
||||||
order = 5
|
|
||||||
}
|
|
||||||
|
|
||||||
assert {
|
|
||||||
condition = coder_app.kiro.order == 5
|
|
||||||
error_message = "coder_app order must be set to 5"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
run "sets_group" {
|
|
||||||
command = plan
|
|
||||||
|
|
||||||
variables {
|
|
||||||
agent_id = "foo"
|
|
||||||
group = "AI IDEs"
|
|
||||||
}
|
|
||||||
|
|
||||||
assert {
|
|
||||||
condition = coder_app.kiro.group == "AI IDEs"
|
|
||||||
error_message = "coder_app group must be set to AI IDEs"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
run "writes_mcp_json" {
|
run "writes_mcp_json" {
|
||||||
command = plan
|
command = plan
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,10 @@ describe("kiro", async () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
const coder_app = state.resources.find(
|
||||||
(res) => res.type === "coder_app" && res.name === "kiro",
|
(res) =>
|
||||||
|
res.type === "coder_app" &&
|
||||||
|
res.module === "module.vscode-desktop-core" &&
|
||||||
|
res.name === "vscode-desktop",
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(coder_app).not.toBeNull();
|
expect(coder_app).not.toBeNull();
|
||||||
@@ -55,47 +58,6 @@ describe("kiro", async () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("custom slug and display_name", async () => {
|
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
|
||||||
agent_id: "foo",
|
|
||||||
slug: "kiro-ai",
|
|
||||||
display_name: "Kiro AI IDE",
|
|
||||||
});
|
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
|
||||||
(res) => res.type === "coder_app" && res.name === "kiro",
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(coder_app?.instances[0].attributes.slug).toBe("kiro-ai");
|
|
||||||
expect(coder_app?.instances[0].attributes.display_name).toBe("Kiro AI IDE");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("sets order", async () => {
|
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
|
||||||
agent_id: "foo",
|
|
||||||
order: "5",
|
|
||||||
});
|
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
|
||||||
(res) => res.type === "coder_app" && res.name === "kiro",
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(coder_app?.instances[0].attributes.order).toBe(5);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("sets group", async () => {
|
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
|
||||||
agent_id: "foo",
|
|
||||||
group: "AI IDEs",
|
|
||||||
});
|
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
|
||||||
(res) => res.type === "coder_app" && res.name === "kiro",
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(coder_app?.instances[0].attributes.group).toBe("AI IDEs");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("writes ~/.kiro/settings/mcp.json when mcp provided", async () => {
|
it("writes ~/.kiro/settings/mcp.json when mcp provided", async () => {
|
||||||
const id = await runContainer("alpine");
|
const id = await runContainer("alpine");
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -38,18 +38,6 @@ variable "group" {
|
|||||||
default = null
|
default = null
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "slug" {
|
|
||||||
type = string
|
|
||||||
description = "The slug of the app."
|
|
||||||
default = "kiro"
|
|
||||||
}
|
|
||||||
|
|
||||||
variable "display_name" {
|
|
||||||
type = string
|
|
||||||
description = "The display name of the app."
|
|
||||||
default = "Kiro IDE"
|
|
||||||
}
|
|
||||||
|
|
||||||
variable "mcp" {
|
variable "mcp" {
|
||||||
type = string
|
type = string
|
||||||
description = "JSON-encoded string to configure MCP servers for Kiro. When set, writes ~/.kiro/settings/mcp.json."
|
description = "JSON-encoded string to configure MCP servers for Kiro. When set, writes ~/.kiro/settings/mcp.json."
|
||||||
@@ -63,26 +51,21 @@ locals {
|
|||||||
mcp_b64 = var.mcp != "" ? base64encode(var.mcp) : ""
|
mcp_b64 = var.mcp != "" ? base64encode(var.mcp) : ""
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "coder_app" "kiro" {
|
module "vscode-desktop-core" {
|
||||||
agent_id = var.agent_id
|
source = "registry.coder.com/coder/vscode-desktop-core/coder"
|
||||||
external = true
|
version = "1.0.0"
|
||||||
icon = "/icon/kiro.svg"
|
|
||||||
slug = var.slug
|
agent_id = var.agent_id
|
||||||
display_name = var.display_name
|
|
||||||
order = var.order
|
coder_app_icon = "/icon/kiro.svg"
|
||||||
group = var.group
|
coder_app_slug = "kiro-ai"
|
||||||
url = join("", [
|
coder_app_display_name = "Kiro AI IDE"
|
||||||
"kiro://coder.coder-remote/open",
|
coder_app_order = var.order
|
||||||
"?owner=",
|
coder_app_group = var.group
|
||||||
data.coder_workspace_owner.me.name,
|
|
||||||
"&workspace=",
|
folder = var.folder
|
||||||
data.coder_workspace.me.name,
|
open_recent = var.open_recent
|
||||||
var.folder != "" ? join("", ["&folder=", var.folder]) : "",
|
protocol = "kiro"
|
||||||
var.open_recent ? "&openRecent" : "",
|
|
||||||
"&url=",
|
|
||||||
data.coder_workspace.me.access_url,
|
|
||||||
"&token=$SESSION_TOKEN",
|
|
||||||
])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "coder_script" "kiro_mcp" {
|
resource "coder_script" "kiro_mcp" {
|
||||||
@@ -102,6 +85,6 @@ resource "coder_script" "kiro_mcp" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
output "kiro_url" {
|
output "kiro_url" {
|
||||||
value = coder_app.kiro.url
|
value = module.vscode-desktop-core.ide_uri
|
||||||
description = "Kiro IDE URL."
|
description = "Kiro IDE URL."
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
display_name: VSCode Desktop Core
|
display_name: Coder VSCode Desktop Core
|
||||||
description: Building block for modules that need to link to an external VSCode-based IDE
|
description: Building block for modules that need to link to an external VSCode-based IDE
|
||||||
icon: ../../../../.icons/coder.svg
|
icon: ../../../../.icons/coder.svg
|
||||||
verified: true
|
verified: true
|
||||||
@@ -11,20 +11,20 @@ tags: [internal, library]
|
|||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> We do not recommend using this module directly. Instead, please consider using one of our [Desktop IDE modules](https://registry.coder.com/modules?search=tag%3Aide).
|
> We do not recommend using this module directly. Instead, please consider using one of our [Desktop IDE modules](https://registry.coder.com/modules?search=tag%3Aide).
|
||||||
|
|
||||||
The VSCode Desktop Core module is a building block for modules that need to expose access to VSCode-based IDEs. It is intended primarily to be used as a library to create modules for VSCode-based IDEs.
|
The VSCode Desktop Core module is a building block for modules that need to expose access to VSCode-based IDEs. It is intended primarily for internal use by Coder to create modules for VSCode-based IDEs.
|
||||||
|
|
||||||
```tf
|
```tf
|
||||||
module "vscode-desktop-core" {
|
module "vscode-desktop-core" {
|
||||||
source = "registry.coder.com/coder/vscode-desktop-core/coder"
|
source = "registry.coder.com/coder/vscode-desktop-core/coder"
|
||||||
version = "1.0.0"
|
version = "1.0.1"
|
||||||
|
|
||||||
agent_id = var.agent_id
|
agent_id = var.agent_id
|
||||||
|
|
||||||
coder_app_icon = "/icon/code.svg"
|
web_app_icon = "/icon/code.svg"
|
||||||
coder_app_slug = "vscode"
|
web_app_slug = "vscode"
|
||||||
coder_app_display_name = "VS Code Desktop"
|
web_app_display_name = "VS Code Desktop"
|
||||||
coder_app_order = var.order
|
web_app_order = var.order
|
||||||
coder_app_group = var.group
|
web_app_group = var.group
|
||||||
|
|
||||||
folder = var.folder
|
folder = var.folder
|
||||||
open_recent = var.open_recent
|
open_recent = var.open_recent
|
||||||
|
|||||||
@@ -10,9 +10,11 @@ const appName = "vscode-desktop";
|
|||||||
|
|
||||||
const defaultVariables = {
|
const defaultVariables = {
|
||||||
agent_id: "foo",
|
agent_id: "foo",
|
||||||
coder_app_icon: "/icon/code.svg",
|
|
||||||
coder_app_slug: "vscode",
|
web_app_icon: "/icon/code.svg",
|
||||||
coder_app_display_name: "VS Code Desktop",
|
web_app_slug: "vscode",
|
||||||
|
web_app_display_name: "VS Code Desktop",
|
||||||
|
|
||||||
protocol: "vscode",
|
protocol: "vscode",
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -21,80 +23,115 @@ describe("vscode-desktop-core", async () => {
|
|||||||
|
|
||||||
testRequiredVariables(import.meta.dir, defaultVariables);
|
testRequiredVariables(import.meta.dir, defaultVariables);
|
||||||
|
|
||||||
it("default output", async () => {
|
describe("coder_app", () => {
|
||||||
const state = await runTerraformApply(import.meta.dir, defaultVariables);
|
describe("IDE URI attributes", () => {
|
||||||
expect(state.outputs.ide_uri.value).toBe(
|
it("default output", async () => {
|
||||||
`${defaultVariables.protocol}://coder.coder-remote/open?owner=default&workspace=default&url=https://mydeployment.coder.com&token=$SESSION_TOKEN`,
|
const state = await runTerraformApply(
|
||||||
);
|
import.meta.dir,
|
||||||
|
defaultVariables,
|
||||||
|
);
|
||||||
|
expect(state.outputs.ide_uri.value).toBe(
|
||||||
|
`${defaultVariables.protocol}://coder.coder-remote/open?owner=default&workspace=default&url=https://mydeployment.coder.com&token=$SESSION_TOKEN`,
|
||||||
|
);
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
const coder_app = state.resources.find(
|
||||||
(res) => res.type === "coder_app" && res.name === appName,
|
(res) => res.type === "coder_app" && res.name === appName,
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(coder_app).not.toBeNull();
|
expect(coder_app).not.toBeNull();
|
||||||
expect(coder_app?.instances.length).toBe(1);
|
expect(coder_app?.instances.length).toBe(1);
|
||||||
expect(coder_app?.instances[0].attributes.order).toBeNull();
|
expect(coder_app?.instances[0].attributes.order).toBeNull();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("adds folder", async () => {
|
it("adds folder", async () => {
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
const state = await runTerraformApply(import.meta.dir, {
|
||||||
folder: "/foo/bar",
|
folder: "/foo/bar",
|
||||||
|
|
||||||
...defaultVariables,
|
...defaultVariables,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(state.outputs.ide_uri.value).toBe(
|
||||||
|
`${defaultVariables.protocol}://coder.coder-remote/open?owner=default&workspace=default&folder=/foo/bar&url=https://mydeployment.coder.com&token=$SESSION_TOKEN`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("adds folder and open_recent", async () => {
|
||||||
|
const state = await runTerraformApply(import.meta.dir, {
|
||||||
|
folder: "/foo/bar",
|
||||||
|
open_recent: "true",
|
||||||
|
|
||||||
|
...defaultVariables,
|
||||||
|
});
|
||||||
|
expect(state.outputs.ide_uri.value).toBe(
|
||||||
|
`${defaultVariables.protocol}://coder.coder-remote/open?owner=default&workspace=default&folder=/foo/bar&openRecent&url=https://mydeployment.coder.com&token=$SESSION_TOKEN`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("adds folder but not open_recent", async () => {
|
||||||
|
const state = await runTerraformApply(import.meta.dir, {
|
||||||
|
folder: "/foo/bar",
|
||||||
|
openRecent: "false",
|
||||||
|
|
||||||
|
...defaultVariables,
|
||||||
|
});
|
||||||
|
expect(state.outputs.ide_uri.value).toBe(
|
||||||
|
`${defaultVariables.protocol}://coder.coder-remote/open?owner=default&workspace=default&folder=/foo/bar&url=https://mydeployment.coder.com&token=$SESSION_TOKEN`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("adds open_recent", async () => {
|
||||||
|
const state = await runTerraformApply(import.meta.dir, {
|
||||||
|
open_recent: "true",
|
||||||
|
|
||||||
|
...defaultVariables,
|
||||||
|
});
|
||||||
|
expect(state.outputs.ide_uri.value).toBe(
|
||||||
|
`${defaultVariables.protocol}://coder.coder-remote/open?owner=default&workspace=default&openRecent&url=https://mydeployment.coder.com&token=$SESSION_TOKEN`,
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(state.outputs.ide_uri.value).toBe(
|
it("sets custom slug and display_name", async () => {
|
||||||
`${defaultVariables.protocol}://coder.coder-remote/open?owner=default&workspace=default&folder=/foo/bar&url=https://mydeployment.coder.com&token=$SESSION_TOKEN`,
|
const state = await runTerraformApply(import.meta.dir, defaultVariables);
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("adds folder and open_recent", async () => {
|
const coder_app = state.resources.find(
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
(res) => res.type === "coder_app" && res.name === appName,
|
||||||
folder: "/foo/bar",
|
);
|
||||||
open_recent: "true",
|
|
||||||
|
|
||||||
...defaultVariables,
|
expect(coder_app?.instances[0].attributes.slug).toBe(
|
||||||
});
|
defaultVariables.web_app_slug,
|
||||||
expect(state.outputs.ide_uri.value).toBe(
|
);
|
||||||
`${defaultVariables.protocol}://coder.coder-remote/open?owner=default&workspace=default&folder=/foo/bar&openRecent&url=https://mydeployment.coder.com&token=$SESSION_TOKEN`,
|
expect(coder_app?.instances[0].attributes.display_name).toBe(
|
||||||
);
|
defaultVariables.web_app_display_name,
|
||||||
});
|
);
|
||||||
|
|
||||||
it("adds folder but not open_recent", async () => {
|
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
|
||||||
folder: "/foo/bar",
|
|
||||||
openRecent: "false",
|
|
||||||
|
|
||||||
...defaultVariables,
|
|
||||||
});
|
|
||||||
expect(state.outputs.ide_uri.value).toBe(
|
|
||||||
`${defaultVariables.protocol}://coder.coder-remote/open?owner=default&workspace=default&folder=/foo/bar&url=https://mydeployment.coder.com&token=$SESSION_TOKEN`,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("adds open_recent", async () => {
|
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
|
||||||
open_recent: "true",
|
|
||||||
|
|
||||||
...defaultVariables,
|
|
||||||
});
|
|
||||||
expect(state.outputs.ide_uri.value).toBe(
|
|
||||||
`${defaultVariables.protocol}://coder.coder-remote/open?owner=default&workspace=default&openRecent&url=https://mydeployment.coder.com&token=$SESSION_TOKEN`,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("expect order to be set", async () => {
|
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
|
||||||
coder_app_order: "22",
|
|
||||||
...defaultVariables,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
it("sets order", async () => {
|
||||||
(res) => res.type === "coder_app" && res.name === appName,
|
const state = await runTerraformApply(import.meta.dir, {
|
||||||
);
|
web_app_order: "5",
|
||||||
|
|
||||||
expect(coder_app).not.toBeNull();
|
...defaultVariables,
|
||||||
expect(coder_app?.instances.length).toBe(1);
|
});
|
||||||
expect(coder_app?.instances[0].attributes.order).toBe(22);
|
|
||||||
|
const coder_app = state.resources.find(
|
||||||
|
(res) => res.type === "coder_app" && res.name === appName,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(coder_app?.instances[0].attributes.order).toBe(5);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("sets group", async () => {
|
||||||
|
const state = await runTerraformApply(import.meta.dir, {
|
||||||
|
web_app_group: "web-app-group",
|
||||||
|
|
||||||
|
...defaultVariables,
|
||||||
|
});
|
||||||
|
|
||||||
|
const coder_app = state.resources.find(
|
||||||
|
(res) => res.type === "coder_app" && res.name === appName,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(coder_app?.instances[0].attributes.group).toBe("web-app-group");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -28,31 +28,31 @@ variable "open_recent" {
|
|||||||
|
|
||||||
variable "protocol" {
|
variable "protocol" {
|
||||||
type = string
|
type = string
|
||||||
description = "The URI protocol for the IDE."
|
description = "The URI protocol the IDE."
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "coder_app_icon" {
|
variable "web_app_icon" {
|
||||||
type = string
|
type = string
|
||||||
description = "The icon of the coder_app."
|
description = "The icon of the coder_app."
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "coder_app_slug" {
|
variable "web_app_slug" {
|
||||||
type = string
|
type = string
|
||||||
description = "The slug of the coder_app."
|
description = "The slug of the coder_app."
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "coder_app_display_name" {
|
variable "web_app_display_name" {
|
||||||
type = string
|
type = string
|
||||||
description = "The display name of the coder_app."
|
description = "The display name of the coder_app."
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "coder_app_order" {
|
variable "web_app_order" {
|
||||||
type = number
|
type = number
|
||||||
description = "The order of the coder_app."
|
description = "The order of the coder_app."
|
||||||
default = null
|
default = null
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "coder_app_group" {
|
variable "web_app_group" {
|
||||||
type = string
|
type = string
|
||||||
description = "The group of the coder_app."
|
description = "The group of the coder_app."
|
||||||
default = null
|
default = null
|
||||||
@@ -65,25 +65,38 @@ resource "coder_app" "vscode-desktop" {
|
|||||||
agent_id = var.agent_id
|
agent_id = var.agent_id
|
||||||
external = true
|
external = true
|
||||||
|
|
||||||
icon = var.coder_app_icon
|
icon = var.web_app_icon
|
||||||
slug = var.coder_app_slug
|
slug = var.web_app_slug
|
||||||
display_name = var.coder_app_display_name
|
display_name = var.web_app_display_name
|
||||||
|
|
||||||
order = var.coder_app_order
|
order = var.web_app_order
|
||||||
group = var.coder_app_group
|
group = var.web_app_group
|
||||||
|
|
||||||
# While the call to "join" is not strictly necessary, it makes the URL more readable.
|
|
||||||
url = join("", [
|
url = join("", [
|
||||||
"${var.protocol}://coder.coder-remote/open",
|
var.protocol,
|
||||||
|
"://coder.coder-remote/open",
|
||||||
|
"?owner=",
|
||||||
|
data.coder_workspace_owner.me.name,
|
||||||
|
"&workspace=",
|
||||||
|
data.coder_workspace.me.name,
|
||||||
|
var.folder != "" ? join("", ["&folder=", var.folder]) : "",
|
||||||
|
var.open_recent ? "&openRecent" : "",
|
||||||
|
"&url=",
|
||||||
|
data.coder_workspace.me.access_url,
|
||||||
|
"&token=$SESSION_TOKEN",
|
||||||
|
])
|
||||||
|
|
||||||
|
/*
|
||||||
|
url = join("", [
|
||||||
|
"vscode://coder.coder-remote/open",
|
||||||
"?owner=${data.coder_workspace_owner.me.name}",
|
"?owner=${data.coder_workspace_owner.me.name}",
|
||||||
"&workspace=${data.coder_workspace.me.name}",
|
"&workspace=${data.coder_workspace.me.name}",
|
||||||
var.folder != "" ? join("", ["&folder=", var.folder]) : "",
|
var.folder != "" ? join("", ["&folder=", var.folder]) : "",
|
||||||
var.open_recent ? "&openRecent" : "",
|
var.open_recent ? "&openRecent" : "",
|
||||||
"&url=${data.coder_workspace.me.access_url}",
|
"&url=${data.coder_workspace.me.access_url}",
|
||||||
# NOTE: There is a protocol whitelist for the token replacement, so this will only work with the protocols hardcoded in the front-end.
|
|
||||||
# (https://github.com/coder/coder/blob/6ba4b5bbc95e2e528d7f5b1e31fffa200ae1a6db/site/src/modules/apps/apps.ts#L18)
|
|
||||||
"&token=$SESSION_TOKEN",
|
"&token=$SESSION_TOKEN",
|
||||||
])
|
])
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
output "ide_uri" {
|
output "ide_uri" {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ Uses the [Coder Remote VS Code Extension](https://github.com/coder/vscode-coder)
|
|||||||
module "vscode" {
|
module "vscode" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/vscode-desktop/coder"
|
source = "registry.coder.com/coder/vscode-desktop/coder"
|
||||||
version = "1.1.2"
|
version = "1.2.0"
|
||||||
agent_id = coder_agent.main.id
|
agent_id = coder_agent.main.id
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -29,7 +29,7 @@ module "vscode" {
|
|||||||
module "vscode" {
|
module "vscode" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/vscode-desktop/coder"
|
source = "registry.coder.com/coder/vscode-desktop/coder"
|
||||||
version = "1.1.2"
|
version = "1.2.0"
|
||||||
agent_id = coder_agent.main.id
|
agent_id = coder_agent.main.id
|
||||||
folder = "/home/coder/project"
|
folder = "/home/coder/project"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,10 @@ describe("vscode-desktop", async () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
const coder_app = state.resources.find(
|
||||||
(res) => res.type === "coder_app" && res.name === "vscode",
|
(res) =>
|
||||||
|
res.type === "coder_app" &&
|
||||||
|
res.module === "module.vscode-desktop-core" &&
|
||||||
|
res.name === "vscode-desktop",
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(coder_app).not.toBeNull();
|
expect(coder_app).not.toBeNull();
|
||||||
@@ -71,19 +74,4 @@ describe("vscode-desktop", async () => {
|
|||||||
"vscode://coder.coder-remote/open?owner=default&workspace=default&openRecent&url=https://mydeployment.coder.com&token=$SESSION_TOKEN",
|
"vscode://coder.coder-remote/open?owner=default&workspace=default&openRecent&url=https://mydeployment.coder.com&token=$SESSION_TOKEN",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("expect order to be set", async () => {
|
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
|
||||||
agent_id: "foo",
|
|
||||||
order: "22",
|
|
||||||
});
|
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
|
||||||
(res) => res.type === "coder_app" && res.name === "vscode",
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(coder_app).not.toBeNull();
|
|
||||||
expect(coder_app?.instances.length).toBe(1);
|
|
||||||
expect(coder_app?.instances[0].attributes.order).toBe(22);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -38,33 +38,24 @@ variable "group" {
|
|||||||
default = null
|
default = null
|
||||||
}
|
}
|
||||||
|
|
||||||
data "coder_workspace" "me" {}
|
module "vscode-desktop-core" {
|
||||||
data "coder_workspace_owner" "me" {}
|
source = "registry.coder.com/coder/vscode-desktop-core/coder"
|
||||||
|
version = "1.0.0"
|
||||||
|
|
||||||
resource "coder_app" "vscode" {
|
agent_id = var.agent_id
|
||||||
agent_id = var.agent_id
|
|
||||||
external = true
|
|
||||||
icon = "/icon/code.svg"
|
|
||||||
slug = "vscode"
|
|
||||||
display_name = "VS Code Desktop"
|
|
||||||
order = var.order
|
|
||||||
group = var.group
|
|
||||||
|
|
||||||
url = join("", [
|
coder_app_icon = "/icon/code.svg"
|
||||||
"vscode://coder.coder-remote/open",
|
coder_app_slug = "vscode"
|
||||||
"?owner=",
|
coder_app_display_name = "VS Code Desktop"
|
||||||
data.coder_workspace_owner.me.name,
|
coder_app_order = var.order
|
||||||
"&workspace=",
|
coder_app_group = var.group
|
||||||
data.coder_workspace.me.name,
|
|
||||||
var.folder != "" ? join("", ["&folder=", var.folder]) : "",
|
folder = var.folder
|
||||||
var.open_recent ? "&openRecent" : "",
|
open_recent = var.open_recent
|
||||||
"&url=",
|
protocol = "vscode"
|
||||||
data.coder_workspace.me.access_url,
|
|
||||||
"&token=$SESSION_TOKEN",
|
|
||||||
])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
output "vscode_url" {
|
output "vscode_url" {
|
||||||
value = coder_app.vscode.url
|
value = module.vscode-desktop-core.ide_uri
|
||||||
description = "VS Code Desktop URL."
|
description = "VS Code Desktop URL."
|
||||||
}
|
}
|
||||||
@@ -16,7 +16,7 @@ Uses the [Coder Remote VS Code Extension](https://github.com/coder/vscode-coder)
|
|||||||
module "windsurf" {
|
module "windsurf" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/windsurf/coder"
|
source = "registry.coder.com/coder/windsurf/coder"
|
||||||
version = "1.2.1"
|
version = "1.3.0"
|
||||||
agent_id = coder_agent.main.id
|
agent_id = coder_agent.main.id
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -29,7 +29,7 @@ module "windsurf" {
|
|||||||
module "windsurf" {
|
module "windsurf" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/windsurf/coder"
|
source = "registry.coder.com/coder/windsurf/coder"
|
||||||
version = "1.2.1"
|
version = "1.3.0"
|
||||||
agent_id = coder_agent.main.id
|
agent_id = coder_agent.main.id
|
||||||
folder = "/home/coder/project"
|
folder = "/home/coder/project"
|
||||||
}
|
}
|
||||||
@@ -45,7 +45,7 @@ The following example configures Windsurf to use the GitHub MCP server with auth
|
|||||||
module "windsurf" {
|
module "windsurf" {
|
||||||
count = data.coder_workspace.me.start_count
|
count = data.coder_workspace.me.start_count
|
||||||
source = "registry.coder.com/coder/windsurf/coder"
|
source = "registry.coder.com/coder/windsurf/coder"
|
||||||
version = "1.2.1"
|
version = "1.3.0"
|
||||||
agent_id = coder_agent.main.id
|
agent_id = coder_agent.main.id
|
||||||
folder = "/home/coder/project"
|
folder = "/home/coder/project"
|
||||||
mcp = jsonencode({
|
mcp = jsonencode({
|
||||||
@@ -58,6 +58,7 @@ module "windsurf" {
|
|||||||
"type" : "http"
|
"type" : "http"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,10 @@ describe("windsurf", async () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
const coder_app = state.resources.find(
|
||||||
(res) => res.type === "coder_app" && res.name === "windsurf",
|
(res) =>
|
||||||
|
res.type === "coder_app" &&
|
||||||
|
res.module === "module.vscode-desktop-core" &&
|
||||||
|
res.name === "vscode-desktop",
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(coder_app).not.toBeNull();
|
expect(coder_app).not.toBeNull();
|
||||||
@@ -76,21 +79,6 @@ describe("windsurf", async () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("expect order to be set", async () => {
|
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
|
||||||
agent_id: "foo",
|
|
||||||
order: 22,
|
|
||||||
});
|
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
|
||||||
(res) => res.type === "coder_app" && res.name === "windsurf",
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(coder_app).not.toBeNull();
|
|
||||||
expect(coder_app?.instances.length).toBe(1);
|
|
||||||
expect(coder_app?.instances[0].attributes.order).toBe(22);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("writes ~/.codeium/windsurf/mcp_config.json when mcp provided", async () => {
|
it("writes ~/.codeium/windsurf/mcp_config.json when mcp provided", async () => {
|
||||||
const id = await runContainer("alpine");
|
const id = await runContainer("alpine");
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ variable "agent_id" {
|
|||||||
|
|
||||||
variable "folder" {
|
variable "folder" {
|
||||||
type = string
|
type = string
|
||||||
description = "The folder to open in Cursor IDE."
|
description = "The folder to open in Windsurf Editor."
|
||||||
default = ""
|
default = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,26 +63,21 @@ locals {
|
|||||||
mcp_b64 = var.mcp != "" ? base64encode(var.mcp) : ""
|
mcp_b64 = var.mcp != "" ? base64encode(var.mcp) : ""
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "coder_app" "windsurf" {
|
module "vscode-desktop-core" {
|
||||||
agent_id = var.agent_id
|
source = "registry.coder.com/coder/vscode-desktop-core/coder"
|
||||||
external = true
|
version = "1.0.0"
|
||||||
icon = "/icon/windsurf.svg"
|
|
||||||
slug = var.slug
|
agent_id = var.agent_id
|
||||||
display_name = var.display_name
|
|
||||||
order = var.order
|
coder_app_icon = "/icon/windsurf.svg"
|
||||||
group = var.group
|
coder_app_slug = "windsurf"
|
||||||
url = join("", [
|
coder_app_display_name = "Windsurf Editor"
|
||||||
"windsurf://coder.coder-remote/open",
|
coder_app_order = var.order
|
||||||
"?owner=",
|
coder_app_group = var.group
|
||||||
data.coder_workspace_owner.me.name,
|
|
||||||
"&workspace=",
|
folder = var.folder
|
||||||
data.coder_workspace.me.name,
|
open_recent = var.open_recent
|
||||||
var.folder != "" ? join("", ["&folder=", var.folder]) : "",
|
protocol = "windsurf"
|
||||||
var.open_recent ? "&openRecent" : "",
|
|
||||||
"&url=",
|
|
||||||
data.coder_workspace.me.access_url,
|
|
||||||
"&token=$SESSION_TOKEN",
|
|
||||||
])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "coder_script" "windsurf_mcp" {
|
resource "coder_script" "windsurf_mcp" {
|
||||||
@@ -102,6 +97,6 @@ resource "coder_script" "windsurf_mcp" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
output "windsurf_url" {
|
output "windsurf_url" {
|
||||||
value = coder_app.windsurf.url
|
value = module.vscode-desktop-core.ide_uri
|
||||||
description = "Windsurf Editor URL."
|
description = "Windsurf Editor URL."
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,10 @@ describe("positron-desktop", async () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
const coder_app = state.resources.find(
|
||||||
(res) => res.type === "coder_app" && res.name === "positron",
|
(res) =>
|
||||||
|
res.type === "coder_app" &&
|
||||||
|
res.module === "module.vscode-desktop-core" &&
|
||||||
|
res.name === "vscode-desktop",
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(coder_app).not.toBeNull();
|
expect(coder_app).not.toBeNull();
|
||||||
@@ -70,19 +73,4 @@ describe("positron-desktop", async () => {
|
|||||||
"positron://coder.coder-remote/open?owner=default&workspace=default&openRecent&url=https://mydeployment.coder.com&token=$SESSION_TOKEN",
|
"positron://coder.coder-remote/open?owner=default&workspace=default&openRecent&url=https://mydeployment.coder.com&token=$SESSION_TOKEN",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("expect order to be set", async () => {
|
|
||||||
const state = await runTerraformApply(import.meta.dir, {
|
|
||||||
agent_id: "foo",
|
|
||||||
order: "22",
|
|
||||||
});
|
|
||||||
|
|
||||||
const coder_app = state.resources.find(
|
|
||||||
(res) => res.type === "coder_app" && res.name === "positron",
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(coder_app).not.toBeNull();
|
|
||||||
expect(coder_app?.instances.length).toBe(1);
|
|
||||||
expect(coder_app?.instances[0].attributes.order).toBe(22);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -9,10 +9,6 @@ terraform {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
locals {
|
|
||||||
icon_url = "/icon/positron.svg"
|
|
||||||
}
|
|
||||||
|
|
||||||
variable "agent_id" {
|
variable "agent_id" {
|
||||||
type = string
|
type = string
|
||||||
description = "The ID of a Coder agent."
|
description = "The ID of a Coder agent."
|
||||||
@@ -42,33 +38,39 @@ variable "group" {
|
|||||||
default = null
|
default = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variable "slug" {
|
||||||
|
type = string
|
||||||
|
description = "The slug of the app."
|
||||||
|
default = "cursor"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "display_name" {
|
||||||
|
type = string
|
||||||
|
description = "The display name of the app."
|
||||||
|
default = "Cursor Desktop"
|
||||||
|
}
|
||||||
|
|
||||||
data "coder_workspace" "me" {}
|
data "coder_workspace" "me" {}
|
||||||
data "coder_workspace_owner" "me" {}
|
data "coder_workspace_owner" "me" {}
|
||||||
|
|
||||||
resource "coder_app" "positron" {
|
module "vscode-desktop-core" {
|
||||||
agent_id = var.agent_id
|
source = "registry.coder.com/coder/vscode-desktop-core/coder"
|
||||||
external = true
|
version = "1.0.0"
|
||||||
icon = local.icon_url
|
|
||||||
slug = "positron"
|
|
||||||
display_name = "Positron Desktop"
|
|
||||||
order = var.order
|
|
||||||
group = var.group
|
|
||||||
|
|
||||||
url = join("", [
|
agent_id = var.agent_id
|
||||||
"positron://coder.coder-remote/open",
|
|
||||||
"?owner=",
|
coder_app_icon = "/icon/positron.svg"
|
||||||
data.coder_workspace_owner.me.name,
|
coder_app_slug = var.slug
|
||||||
"&workspace=",
|
coder_app_display_name = var.display_name
|
||||||
data.coder_workspace.me.name,
|
coder_app_order = var.order
|
||||||
var.folder != "" ? join("", ["&folder=", var.folder]) : "",
|
coder_app_group = var.group
|
||||||
var.open_recent ? "&openRecent" : "",
|
|
||||||
"&url=",
|
folder = var.folder
|
||||||
data.coder_workspace.me.access_url,
|
open_recent = var.open_recent
|
||||||
"&token=$SESSION_TOKEN",
|
protocol = "positron"
|
||||||
])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
output "positron_url" {
|
output "positron_url" {
|
||||||
value = coder_app.positron.url
|
value = module.vscode-desktop-core.ide_uri
|
||||||
description = "Positron Desktop URL."
|
description = "Positron Desktop URL."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,6 +112,8 @@ type JsonValue =
|
|||||||
| { [key: string]: JsonValue };
|
| { [key: string]: JsonValue };
|
||||||
|
|
||||||
type TerraformStateResource = {
|
type TerraformStateResource = {
|
||||||
|
module: string;
|
||||||
|
mode: string;
|
||||||
type: string;
|
type: string;
|
||||||
name: string;
|
name: string;
|
||||||
provider: string;
|
provider: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user