mirror of
https://github.com/coder/registry.git
synced 2026-06-03 13:08:14 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 83a82345de | |||
| fae52150cc | |||
| ae6cf8c366 | |||
| 04669ec2fa | |||
| 55c9829a27 | |||
| 8da68871f0 |
@@ -22,15 +22,14 @@ jobs:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
- name: Authenticate with Google Cloud
|
||||
uses: google-github-actions/auth@71f986410dfbc7added4569d411d040a91dc6935
|
||||
uses: google-github-actions/auth@ba79af03959ebeac9769e648f473a284504d9193
|
||||
with:
|
||||
workload_identity_provider: projects/309789351055/locations/global/workloadIdentityPools/github-actions/providers/github
|
||||
service_account: registry-v2-github@coder-registry-1.iam.gserviceaccount.com
|
||||
- name: Set up Google Cloud SDK
|
||||
uses: google-github-actions/setup-gcloud@77e7a554d41e2ee56fc945c52dfd3f33d12def9a
|
||||
# For the time being, let's have the first couple merges to main in
|
||||
# modules deploy a new version to *dev*. Once we review and make sure
|
||||
# everything's working, we can deploy a new version to *main*. Maybe in
|
||||
# the future we could automate this based on the result of E2E tests.
|
||||
- name: Deploy to dev.registry.coder.com
|
||||
run: gcloud builds triggers run 29818181-126d-4f8a-a937-f228b27d3d34 --branch dev
|
||||
- name: Deploy to registry.coder.com
|
||||
run: |
|
||||
gcloud builds triggers run 106610ff-41fb-4bd0-90a2-7643583fb9c0 --branch main
|
||||
|
||||
@@ -0,0 +1,167 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type terraformLifecycleCondition struct {
|
||||
// Any terraform expression that evaluates to a boolean
|
||||
expression string
|
||||
errorMessage *string
|
||||
}
|
||||
|
||||
type terraformLifecycle struct {
|
||||
createBeforeDestroy bool
|
||||
preventDestroy bool
|
||||
ignoreChanges []string
|
||||
replaceTriggeredBy []string
|
||||
preCondition *terraformLifecycleCondition
|
||||
postCondition *terraformLifecycleCondition
|
||||
}
|
||||
|
||||
type terraformForEachKind string
|
||||
|
||||
const (
|
||||
terraformForEachKindMap terraformForEachKind = "map"
|
||||
terraformForEachKindSet terraformForEachKind = "set"
|
||||
)
|
||||
|
||||
type terraformForEach struct {
|
||||
kind terraformForEachKind
|
||||
// If the kind is "map", all values should be guaranteed to be a definite
|
||||
// string for each key. If it's "set", all values should be nil
|
||||
values map[string]*string
|
||||
}
|
||||
|
||||
type terraformVariableKind string
|
||||
|
||||
const (
|
||||
terraformVariableKindString terraformVariableKind = "string"
|
||||
terraformVariableKindNumber terraformVariableKind = "number"
|
||||
terraformVariableKindBool terraformVariableKind = "bool"
|
||||
terraformVariableKindList terraformVariableKind = "list"
|
||||
terraformVariableKindMap terraformVariableKind = "map"
|
||||
terraformVariableKindSet terraformVariableKind = "set"
|
||||
// This value kind is incredibly rare. It corresponds to any variable with
|
||||
// a null value but no defined type
|
||||
terraformVariableKindUnknown terraformVariableKind = "unknown"
|
||||
)
|
||||
|
||||
type terraformVariable struct {
|
||||
kind terraformVariableKind
|
||||
value any
|
||||
}
|
||||
|
||||
// coderTerraformModule represents the values that can be parsed from a
|
||||
// Terraform module that are relevant to a Coder deployment. Most of the fields
|
||||
// are derived from the main Terraform spec, but some additional Coder-specific
|
||||
// fields are appended, too, for convenience
|
||||
type coderTerraformModule struct {
|
||||
// Corresponds to the optional `lifecycle` metadata field available to all
|
||||
// resource types
|
||||
Lifecycle *terraformLifecycle `json:"lifecycle"`
|
||||
// Corresponds to the optional `for_each` metadata field available to all
|
||||
// resource types
|
||||
ForEach *terraformForEach `json:"for_each"`
|
||||
// Corresponds to the `source` field in a module block
|
||||
ModuleSource string `json:"module_source"`
|
||||
// Corresponds to the `version` field in Terraform module blocks. Note that
|
||||
// while the Terraform spec marks this field as optional, Coder requires
|
||||
// that one always be defined.
|
||||
Version string `json:"version"`
|
||||
// Corresponds to the optional `provider` field in a module block
|
||||
Provider *string `json:"provider"`
|
||||
// Corresponds to optional `depends_on` field for module blocks
|
||||
DependsOn []string `json:"depends_on"`
|
||||
// Corresponds to the `count` field for any Terraform resource type. It
|
||||
// defines the number of resource instances to create when using Terraform
|
||||
// Apply.
|
||||
InstanceCount int `json:"instance_count"`
|
||||
// Corresponds to `agent_id`` field in a module block. Terraform doesn't
|
||||
// have any built-in concept of an agent_id, but it's needed to make a
|
||||
// module work with a Coder deployment
|
||||
AgentID string `json:"agent_id"`
|
||||
// Captures all other arbitrary values defined for a Terraform module block.
|
||||
// Note that while Terraform itself has you define all other fields at the
|
||||
// same level as the well-known/official fields, they've been isolated into
|
||||
// a map for the Go struct definition to improve type-safety
|
||||
Values map[string]terraformVariable `json:"values"`
|
||||
// The raw Terraform snippet used to derive the coderTerraformModule struct
|
||||
SourceCode string `json:"source_code"`
|
||||
}
|
||||
|
||||
var _ json.Marshaler = &coderTerraformModule{}
|
||||
|
||||
func (ctmCopy coderTerraformModule) MarshalJSON() ([]byte, error) {
|
||||
if ctmCopy.Lifecycle != nil {
|
||||
lCopy := &terraformLifecycle{
|
||||
createBeforeDestroy: ctmCopy.Lifecycle.createBeforeDestroy,
|
||||
preventDestroy: ctmCopy.Lifecycle.preventDestroy,
|
||||
ignoreChanges: ctmCopy.Lifecycle.ignoreChanges,
|
||||
replaceTriggeredBy: ctmCopy.Lifecycle.replaceTriggeredBy,
|
||||
preCondition: ctmCopy.Lifecycle.preCondition,
|
||||
postCondition: ctmCopy.Lifecycle.postCondition,
|
||||
}
|
||||
// Make sure that both slices always get serialized as JSON null if
|
||||
// they're empty. Serializing as an empty JSON array has no extra
|
||||
// semantics
|
||||
if len(lCopy.ignoreChanges) == 0 {
|
||||
lCopy.ignoreChanges = nil
|
||||
}
|
||||
if len(lCopy.replaceTriggeredBy) == 0 {
|
||||
lCopy.replaceTriggeredBy = nil
|
||||
}
|
||||
ctmCopy.Lifecycle = lCopy
|
||||
}
|
||||
|
||||
if ctmCopy.ForEach != nil {
|
||||
feCopy := &terraformForEach{
|
||||
kind: ctmCopy.ForEach.kind,
|
||||
values: ctmCopy.ForEach.values,
|
||||
}
|
||||
// Make sure that the values map is NEVER serialized as JSON null
|
||||
if feCopy.values == nil {
|
||||
feCopy.values = make(map[string]*string)
|
||||
}
|
||||
ctmCopy.ForEach = feCopy
|
||||
}
|
||||
|
||||
if len(ctmCopy.DependsOn) == 0 {
|
||||
ctmCopy.DependsOn = nil
|
||||
}
|
||||
|
||||
if ctmCopy.Values == nil {
|
||||
ctmCopy.Values = make(map[string]terraformVariable)
|
||||
}
|
||||
for k, tfValue := range ctmCopy.Values {
|
||||
switch tfValue.kind {
|
||||
case terraformVariableKindString, terraformVariableKindBool, terraformVariableKindNumber, terraformVariableKindUnknown:
|
||||
continue
|
||||
case terraformVariableKindSet, terraformVariableKindList:
|
||||
recast, ok := tfValue.value.([]any)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("unable to process terraform variable %q of kind %q as set/list", k, tfValue.kind)
|
||||
}
|
||||
if recast == nil {
|
||||
ctmCopy.Values[k] = terraformVariable{
|
||||
kind: tfValue.kind,
|
||||
value: []any{},
|
||||
}
|
||||
}
|
||||
case terraformVariableKindMap:
|
||||
recast, ok := tfValue.value.(map[string]any)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("unable to process terraform variable %q of kind %q as map", k, tfValue.kind)
|
||||
}
|
||||
if recast == nil {
|
||||
ctmCopy.Values[k] = terraformVariable{
|
||||
kind: tfValue.kind,
|
||||
value: make(map[string]any),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return json.Marshal(ctmCopy)
|
||||
}
|
||||
@@ -4,7 +4,7 @@ description: Run Claude Code in your workspace
|
||||
icon: ../../../../.icons/claude.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [agent, claude-code]
|
||||
tags: [agent, claude-code, ai]
|
||||
---
|
||||
|
||||
# Claude Code
|
||||
|
||||
@@ -4,7 +4,7 @@ description: VS Code in the browser
|
||||
icon: ../../../../.icons/code.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [helper, ide, web]
|
||||
tags: [ide, web, code-server]
|
||||
---
|
||||
|
||||
# code-server
|
||||
|
||||
@@ -4,7 +4,7 @@ description: Add a one-click button to launch Cursor IDE
|
||||
icon: ../../../../.icons/cursor.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [ide, cursor, helper]
|
||||
tags: [ide, cursor, ai]
|
||||
---
|
||||
|
||||
# Cursor IDE
|
||||
|
||||
@@ -4,7 +4,7 @@ description: Allow developers to optionally bring their own dotfiles repository
|
||||
icon: ../../../../.icons/dotfiles.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [helper]
|
||||
tags: [helper, dotfiles]
|
||||
---
|
||||
|
||||
# Dotfiles
|
||||
|
||||
@@ -4,7 +4,7 @@ description: A file browser for your workspace
|
||||
icon: ../../../../.icons/filebrowser.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [helper, filebrowser]
|
||||
tags: [filebrowser, web]
|
||||
---
|
||||
|
||||
# File Browser
|
||||
|
||||
@@ -9,7 +9,7 @@ tags: [helper, git]
|
||||
|
||||
# git-commit-signing
|
||||
|
||||
> [!IMPORTANT]
|
||||
> [!IMPORTANT]
|
||||
> This module will only work with Git versions >=2.34, prior versions [do not support signing commits via SSH keys](https://lore.kernel.org/git/xmqq8rxpgwki.fsf@gitster.g/).
|
||||
|
||||
This module downloads your SSH key from Coder and uses it to sign commits with Git.
|
||||
|
||||
@@ -4,7 +4,7 @@ description: Run Goose in your workspace
|
||||
icon: ../../../../.icons/goose.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [agent, goose]
|
||||
tags: [agent, goose, ai]
|
||||
---
|
||||
|
||||
# Goose
|
||||
@@ -14,7 +14,7 @@ Run the [Goose](https://block.github.io/goose/) agent in your workspace to gener
|
||||
```tf
|
||||
module "goose" {
|
||||
source = "registry.coder.com/coder/goose/coder"
|
||||
version = "1.1.0"
|
||||
version = "1.1.1"
|
||||
agent_id = coder_agent.example.id
|
||||
folder = "/home/coder"
|
||||
install_goose = true
|
||||
@@ -90,7 +90,7 @@ resource "coder_agent" "main" {
|
||||
module "goose" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/goose/coder"
|
||||
version = "1.1.0"
|
||||
version = "1.1.1"
|
||||
agent_id = coder_agent.example.id
|
||||
folder = "/home/coder"
|
||||
install_goose = true
|
||||
@@ -148,7 +148,7 @@ Run Goose as a standalone app in your workspace. This will install Goose and run
|
||||
```tf
|
||||
module "goose" {
|
||||
source = "registry.coder.com/coder/goose/coder"
|
||||
version = "1.1.0"
|
||||
version = "1.1.1"
|
||||
agent_id = coder_agent.example.id
|
||||
folder = "/home/coder"
|
||||
install_goose = true
|
||||
|
||||
@@ -69,13 +69,13 @@ variable "experiment_auto_configure" {
|
||||
variable "experiment_goose_provider" {
|
||||
type = string
|
||||
description = "The provider to use for Goose (e.g., anthropic)."
|
||||
default = null
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "experiment_goose_model" {
|
||||
type = string
|
||||
description = "The model to use for Goose (e.g., claude-3-5-sonnet-latest)."
|
||||
default = null
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "experiment_pre_install_script" {
|
||||
|
||||
@@ -5,7 +5,7 @@ icon: ../../../../.icons/vault.svg
|
||||
maintainer_github: coder
|
||||
partner_github: hashicorp
|
||||
verified: true
|
||||
tags: [helper, integration, vault, hashicorp, hvs]
|
||||
tags: [integration, vault, hashicorp, hvs]
|
||||
---
|
||||
|
||||
# HCP Vault Secrets
|
||||
|
||||
@@ -4,7 +4,7 @@ description: Add a one-click button to launch JetBrains Gateway IDEs in the dash
|
||||
icon: ../../../../.icons/gateway.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [ide, jetbrains, helper, parameter]
|
||||
tags: [ide, jetbrains, parameter, gateway]
|
||||
---
|
||||
|
||||
# JetBrains Gateway
|
||||
|
||||
@@ -5,7 +5,7 @@ icon: ../../../../.icons/jfrog.svg
|
||||
maintainer_github: coder
|
||||
partner_github: jfrog
|
||||
verified: true
|
||||
tags: [integration, jfrog]
|
||||
tags: [integration, jfrog, helper]
|
||||
---
|
||||
|
||||
# JFrog
|
||||
|
||||
@@ -4,7 +4,7 @@ description: A module that adds Jupyter Notebook in your Coder template.
|
||||
icon: ../../../../.icons/jupyter.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [jupyter, helper, ide, web]
|
||||
tags: [jupyter, ide, web]
|
||||
---
|
||||
|
||||
# Jupyter Notebook
|
||||
|
||||
@@ -4,7 +4,7 @@ description: A module that adds JupyterLab in your Coder template.
|
||||
icon: ../../../../.icons/jupyter.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [jupyter, helper, ide, web]
|
||||
tags: [jupyter, ide, web]
|
||||
---
|
||||
|
||||
# JupyterLab
|
||||
|
||||
@@ -4,7 +4,7 @@ description: A modern open source VNC server
|
||||
icon: ../../../../.icons/kasmvnc.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [helper, vnc, desktop]
|
||||
tags: [vnc, desktop, kasmvnc]
|
||||
---
|
||||
|
||||
# KasmVNC
|
||||
|
||||
@@ -4,7 +4,7 @@ description: Allow developers to customize their workspace on start
|
||||
icon: ../../../../.icons/personalize.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [helper]
|
||||
tags: [helper, personalize]
|
||||
---
|
||||
|
||||
# Personalize
|
||||
|
||||
@@ -4,7 +4,7 @@ description: Send a Slack message when a command finishes inside a workspace!
|
||||
icon: ../../../../.icons/slack.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [helper]
|
||||
tags: [helper, slack]
|
||||
---
|
||||
|
||||
# Slack Me
|
||||
|
||||
@@ -5,7 +5,7 @@ icon: ../../../../.icons/vault.svg
|
||||
maintainer_github: coder
|
||||
partner_github: hashicorp
|
||||
verified: true
|
||||
tags: [helper, integration, vault, github]
|
||||
tags: [hashicorp, integration, vault, github]
|
||||
---
|
||||
|
||||
# Hashicorp Vault Integration (GitHub)
|
||||
|
||||
@@ -5,7 +5,7 @@ icon: ../../../../.icons/vault.svg
|
||||
maintainer_github: coder
|
||||
partner_github: hashicorp
|
||||
verified: true
|
||||
tags: [helper, integration, vault, jwt, oidc]
|
||||
tags: [hashicorp, integration, vault, jwt, oidc]
|
||||
---
|
||||
|
||||
# Hashicorp Vault Integration (JWT)
|
||||
@@ -109,7 +109,7 @@ resource "jwt_signed_token" "vault" {
|
||||
sub = "${data.coder_workspace.me.id}"
|
||||
aud = "https://vault.example.com"
|
||||
iat = provider::time::rfc3339_parse(plantimestamp()).unix
|
||||
# Uncomment to set an expiry on the JWT token(default 3600 seconds).
|
||||
# Uncomment to set an expiry on the JWT token(default 3600 seconds).
|
||||
# workspace will need to be restarted to generate a new token if it expires
|
||||
#exp = provider::time::rfc3339_parse(timeadd(timestamp(), 3600)).unix agent = coder_agent.main.id
|
||||
provisioner = data.coder_provisioner.main.id
|
||||
|
||||
@@ -5,7 +5,7 @@ icon: ../../../../.icons/vault.svg
|
||||
maintainer_github: coder
|
||||
partner_github: hashicorp
|
||||
verified: true
|
||||
tags: [helper, integration, vault, token]
|
||||
tags: [hashicorp, integration, vault, token]
|
||||
---
|
||||
|
||||
# Hashicorp Vault Integration (Token)
|
||||
|
||||
@@ -4,7 +4,7 @@ description: Add a one-click button to launch VS Code Desktop
|
||||
icon: ../../../../.icons/code.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [ide, vscode, helper]
|
||||
tags: [ide, vscode]
|
||||
---
|
||||
|
||||
# VS Code Desktop
|
||||
|
||||
@@ -4,7 +4,7 @@ description: VS Code Web - Visual Studio Code in the browser
|
||||
icon: ../../../../.icons/code.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [helper, ide, vscode, web]
|
||||
tags: [ide, vscode, web]
|
||||
---
|
||||
|
||||
# VS Code Web
|
||||
@@ -15,7 +15,7 @@ Automatically install [Visual Studio Code Server](https://code.visualstudio.com/
|
||||
module "vscode-web" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/vscode-web/coder"
|
||||
version = "1.0.30"
|
||||
version = "1.1.0"
|
||||
agent_id = coder_agent.example.id
|
||||
accept_license = true
|
||||
}
|
||||
@@ -31,7 +31,7 @@ module "vscode-web" {
|
||||
module "vscode-web" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/vscode-web/coder"
|
||||
version = "1.0.30"
|
||||
version = "1.1.0"
|
||||
agent_id = coder_agent.example.id
|
||||
install_prefix = "/home/coder/.vscode-web"
|
||||
folder = "/home/coder"
|
||||
@@ -45,7 +45,7 @@ module "vscode-web" {
|
||||
module "vscode-web" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/vscode-web/coder"
|
||||
version = "1.0.30"
|
||||
version = "1.1.0"
|
||||
agent_id = coder_agent.example.id
|
||||
extensions = ["github.copilot", "ms-python.python", "ms-toolsai.jupyter"]
|
||||
accept_license = true
|
||||
@@ -60,7 +60,7 @@ Configure VS Code's [settings.json](https://code.visualstudio.com/docs/getstarte
|
||||
module "vscode-web" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/vscode-web/coder"
|
||||
version = "1.0.30"
|
||||
version = "1.1.0"
|
||||
agent_id = coder_agent.example.id
|
||||
extensions = ["dracula-theme.theme-dracula"]
|
||||
settings = {
|
||||
@@ -78,7 +78,7 @@ By default, this module installs the latest. To pin a specific version, retrieve
|
||||
module "vscode-web" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/vscode-web/coder"
|
||||
version = "1.0.30"
|
||||
version = "1.1.0"
|
||||
agent_id = coder_agent.example.id
|
||||
commit_id = "e54c774e0add60467559eb0d1e229c6452cf8447"
|
||||
accept_license = true
|
||||
|
||||
@@ -136,6 +136,16 @@ variable "subdomain" {
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "platform" {
|
||||
type = string
|
||||
description = "The platform to use for the VS Code Web."
|
||||
default = ""
|
||||
validation {
|
||||
condition = var.platform == "" || var.platform == "linux" || var.platform == "darwin" || var.platform == "alpine" || var.platform == "win32"
|
||||
error_message = "Incorrect value. Please set either 'linux', 'darwin', or 'alpine' or 'win32'."
|
||||
}
|
||||
}
|
||||
|
||||
data "coder_workspace_owner" "me" {}
|
||||
data "coder_workspace" "me" {}
|
||||
|
||||
@@ -158,6 +168,7 @@ resource "coder_script" "vscode-web" {
|
||||
AUTO_INSTALL_EXTENSIONS : var.auto_install_extensions,
|
||||
SERVER_BASE_PATH : local.server_base_path,
|
||||
COMMIT_ID : var.commit_id,
|
||||
PLATFORM : var.platform,
|
||||
})
|
||||
run_on_start = true
|
||||
|
||||
|
||||
@@ -59,15 +59,26 @@ case "$ARCH" in
|
||||
;;
|
||||
esac
|
||||
|
||||
# Detect the platform
|
||||
if [ -n "${PLATFORM}" ]; then
|
||||
DETECTED_PLATFORM="${PLATFORM}"
|
||||
elif [ -f /etc/alpine-release ] || grep -qi 'ID=alpine' /etc/os-release 2>/dev/null || command -v apk > /dev/null 2>&1; then
|
||||
DETECTED_PLATFORM="alpine"
|
||||
elif [ "$(uname -s)" = "Darwin" ]; then
|
||||
DETECTED_PLATFORM="darwin"
|
||||
else
|
||||
DETECTED_PLATFORM="linux"
|
||||
fi
|
||||
|
||||
# Check if a specific VS Code Web commit ID was provided
|
||||
if [ -n "${COMMIT_ID}" ]; then
|
||||
HASH="${COMMIT_ID}"
|
||||
else
|
||||
HASH=$(curl -fsSL https://update.code.visualstudio.com/api/commits/stable/server-linux-$ARCH-web | cut -d '"' -f 2)
|
||||
HASH=$(curl -fsSL https://update.code.visualstudio.com/api/commits/stable/server-$DETECTED_PLATFORM-$ARCH-web | cut -d '"' -f 2)
|
||||
fi
|
||||
printf "$${BOLD}VS Code Web commit id version $HASH.\n"
|
||||
|
||||
output=$(curl -fsSL "https://vscode.download.prss.microsoft.com/dbazure/download/stable/$HASH/vscode-server-linux-$ARCH-web.tar.gz" | tar -xz -C "${INSTALL_PREFIX}" --strip-components 1)
|
||||
output=$(curl -fsSL "https://vscode.download.prss.microsoft.com/dbazure/download/stable/$HASH/vscode-server-$DETECTED_PLATFORM-$ARCH-web.tar.gz" | tar -xz -C "${INSTALL_PREFIX}" --strip-components 1)
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed to install Microsoft Visual Studio Code Server: $output"
|
||||
|
||||
@@ -4,7 +4,7 @@ description: Add a one-click button to launch Windsurf Editor
|
||||
icon: ../../../../.icons/windsurf.svg
|
||||
maintainer_github: coder
|
||||
verified: true
|
||||
tags: [ide, windsurf, helper, ai]
|
||||
tags: [ide, windsurf, ai]
|
||||
---
|
||||
|
||||
# Windsurf Editor
|
||||
|
||||
@@ -3,9 +3,8 @@ display_name: airflow
|
||||
description: A module that adds Apache Airflow in your Coder template
|
||||
icon: ../../../../.icons/airflow.svg
|
||||
maintainer_github: nataindata
|
||||
partner_github: coder
|
||||
verified: true
|
||||
tags: [airflow, idea, web, helper]
|
||||
tags: [airflow, ide, web]
|
||||
---
|
||||
|
||||
# airflow
|
||||
|
||||
@@ -4,7 +4,7 @@ description: Install Node.js via nvm
|
||||
icon: ../../../../.icons/node.svg
|
||||
maintainer_github: TheZoker
|
||||
verified: false
|
||||
tags: [helper]
|
||||
tags: [helper, nodejs]
|
||||
---
|
||||
|
||||
# nodejs
|
||||
|
||||
Reference in New Issue
Block a user