@getmonoceros/workbench 1.29.2 → 1.31.0

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.
@@ -1,7 +1,7 @@
1
1
  id: atlassian
2
2
  category: feature
3
3
  displayName: Atlassian
4
- description: 'Rovo Dev (`acli rovodev`) and Teamwork Graph (`twg`) CLIs sharing one Atlassian account. Auth persists across rebuilds.'
4
+ description: 'Rovo Dev (`acli rovodev`), Teamwork Graph (`twg`) and Forge (`forge`) CLIs sharing one Atlassian account. Auth persists across rebuilds.'
5
5
  documentationURL: https://developer.atlassian.com/cloud/
6
6
  options:
7
7
  rovodev:
@@ -14,6 +14,11 @@ options:
14
14
  default: true
15
15
  description: 'Install twg (Teamwork Graph CLI).'
16
16
  surface: yml
17
+ forge:
18
+ type: boolean
19
+ default: true
20
+ description: 'Install the Forge CLI (`forge`) for building Atlassian apps.'
21
+ surface: yml
17
22
  instance:
18
23
  type: string
19
24
  default: ''
@@ -35,18 +40,36 @@ options:
35
40
  description: "Optional Bitbucket app password; only needed for twg's Bitbucket commands."
36
41
  surface: env
37
42
  feature:
38
- version: 1.1.0
43
+ version: 1.2.0
39
44
  persistentHomePaths: [.config/acli, .rovodev, .config/twg, .agents]
40
45
  vscodeExtensions: [Atlassian.atlascode]
46
+ # Forge is keychain-free in a container: instead of `forge login` (which
47
+ # needs libsecret), Atlassian's documented path is the FORGE_EMAIL /
48
+ # FORGE_API_TOKEN env vars, read at command time. We hand them to the
49
+ # workspace runtime env from the shared account options, gated on the
50
+ # `forge` toggle. Sibling of a service's connectionEnv (ADR 0021).
51
+ workspaceEnv:
52
+ - whenOption: forge
53
+ vars:
54
+ FORGE_EMAIL: '${email}'
55
+ FORGE_API_TOKEN: '${apiToken}'
41
56
  briefing:
42
57
  - whenOption: rovodev
43
58
  text: 'Atlassian Rovo Dev — invoke via `acli rovodev`. Pre-authenticated against the Atlassian account configured in the feature options (shared with twg).'
44
59
  - whenOption: twg
45
60
  text: 'Atlassian Teamwork Graph CLI (`twg`) — work-data access across Jira, Confluence, Bitbucket, JSM and Assets. Pre-authenticated. Sub-skills cover status rollups, engineering work, ops health and context discovery.'
61
+ - whenOption: forge
62
+ text: 'Atlassian Forge CLI (`forge`) for building and deploying Forge apps. Authenticated via FORGE_EMAIL / FORGE_API_TOKEN from the shared account (no `forge login` needed in the container).'
46
63
  presets:
47
64
  twg:
48
65
  rovodev: false
49
66
  twg: true
67
+ forge: false
50
68
  rovodev:
51
69
  rovodev: true
52
70
  twg: false
71
+ forge: false
72
+ forge:
73
+ rovodev: false
74
+ twg: false
75
+ forge: true
@@ -3,25 +3,31 @@
3
3
  #
4
4
  # Installs Atlassian CLIs that share a single Atlassian account:
5
5
  # - Rovo Dev (acli, default on) — the `acli rovodev` AI agent
6
- # - Teamwork Graph (twg, default off)
6
+ # - Teamwork Graph (twg, default on)
7
+ # - Forge (forge, default on) — the `@forge/cli` app-dev toolchain
7
8
  #
8
- # Each tool is toggled independently via the `rovodev` / `twg`
9
- # options. Credentials (instance / email / apiToken) are shared
10
- # across both tools when set; per-tool post-create hooks under
11
- # /usr/local/share/monoceros/post-create.d/ perform the
12
- # non-interactive login on first container start.
9
+ # Each tool is toggled independently via the `rovodev` / `twg` / `forge`
10
+ # options. Credentials (instance / email / apiToken) are shared across
11
+ # the tools when set; rovodev and twg get per-tool post-create hooks
12
+ # under /usr/local/share/monoceros/post-create.d/ that perform the
13
+ # non-interactive login on first container start. Forge has no login
14
+ # hook: it reads FORGE_EMAIL / FORGE_API_TOKEN from the workspace
15
+ # runtime env, which the workbench injects from the shared account
16
+ # options (feature.workspaceEnv) — the keychain-free path Atlassian
17
+ # recommends for containers.
13
18
 
14
19
  set -euo pipefail
15
20
 
16
21
  ROVODEV="${ROVODEV:-true}"
17
22
  TWG="${TWG:-true}"
23
+ FORGE="${FORGE:-true}"
18
24
  INSTANCE="${INSTANCE:-}"
19
25
  EMAIL="${EMAIL:-}"
20
26
  APITOKEN="${APITOKEN:-}"
21
27
  BITBUCKETTOKEN="${BITBUCKETTOKEN:-}"
22
28
 
23
- if [ "${ROVODEV}" != "true" ] && [ "${TWG}" != "true" ]; then
24
- echo "[atlassian] both rovodev and twg disabled — nothing to install" >&2
29
+ if [ "${ROVODEV}" != "true" ] && [ "${TWG}" != "true" ] && [ "${FORGE}" != "true" ]; then
30
+ echo "[atlassian] rovodev, twg and forge all disabled — nothing to install" >&2
25
31
  exit 0
26
32
  fi
27
33
 
@@ -185,4 +191,24 @@ EOF
185
191
  fi
186
192
  fi
187
193
 
194
+ # ─── Forge (@forge/cli) ───────────────────────────────────────────
195
+ if [ "${FORGE}" = "true" ]; then
196
+ # Forge is a Node CLI; the runtime ships Node, so a global npm install
197
+ # is enough. No post-create login hook: `forge login` stores creds in
198
+ # the OS keychain (libsecret on Linux), which we deliberately do not
199
+ # carry. Instead Forge reads FORGE_EMAIL / FORGE_API_TOKEN at command
200
+ # time; the workbench injects them into the workspace runtime env from
201
+ # this feature's `email` / `apiToken` options (feature.workspaceEnv),
202
+ # so the right account is in scope without a login step here.
203
+ echo "[atlassian/forge] installing @forge/cli globally via npm"
204
+ npm install -g @forge/cli
205
+ forge --version >/dev/null 2>&1 || {
206
+ echo "[atlassian/forge] ERROR: install completed but \`forge\` is not on PATH" >&2
207
+ exit 1
208
+ }
209
+ if [ -z "${EMAIL}" ] || [ -z "${APITOKEN}" ]; then
210
+ echo "[atlassian/forge] no email/apiToken set — set them in the container yml so FORGE_EMAIL/FORGE_API_TOKEN reach the shell"
211
+ fi
212
+ fi
213
+
188
214
  echo "[atlassian] done"
@@ -6,3 +6,8 @@ language:
6
6
  feature: ghcr.io/devcontainers/features/dotnet:2
7
7
  defaultVersion: latest
8
8
  versions: [latest, lts, 10.0, 9.0, 8.0, 7.0, 6.0]
9
+ # No single C# extension on both registries: ms-dotnettools.csharp is
10
+ # MS-Marketplace-only, muhammad-sammy.csharp is Open-VSX-only. Listing
11
+ # both lets VS Code and VSCodium each pick the one its registry has and
12
+ # silently skip the other. See ADR 0016.
13
+ vscodeExtensions: [ms-dotnettools.csharp, muhammad-sammy.csharp]
@@ -6,3 +6,4 @@ language:
6
6
  feature: ghcr.io/devcontainers/features/go:1
7
7
  defaultVersion: latest
8
8
  versions: [latest, 1.24, 1.23]
9
+ vscodeExtensions: [golang.go]
@@ -6,6 +6,7 @@ language:
6
6
  feature: ghcr.io/devcontainers/features/java:1
7
7
  defaultVersion: latest
8
8
  versions: [latest, 21, 17, 11, 8]
9
+ vscodeExtensions: [vscjava.vscode-java-pack]
9
10
  options:
10
11
  installMaven:
11
12
  type: boolean
@@ -6,3 +6,6 @@ language:
6
6
  feature: ghcr.io/devcontainers/features/python:1
7
7
  defaultVersion: latest
8
8
  versions: [latest, 3.12, 3.11, 3.10, 3.9, 3.8]
9
+ # Pylance is MS-Marketplace-only (not on Open VSX); VSCodium silently
10
+ # skips it and keeps ms-python.python. See ADR 0016.
11
+ vscodeExtensions: [ms-python.python, ms-python.vscode-pylance]
@@ -6,3 +6,4 @@ language:
6
6
  feature: ghcr.io/devcontainers/features/rust:1
7
7
  defaultVersion: latest
8
8
  versions: [latest, 1.87]
9
+ vscodeExtensions: [rust-lang.rust-analyzer]
@@ -0,0 +1,46 @@
1
+ id: keycloak
2
+ category: service
3
+ displayName: Keycloak
4
+ description: 'Keycloak identity & access management (OAuth2 / OpenID Connect / SAML) for local dev. Reachable in-container as host `keycloak`. Starts in dev mode and imports realm JSON from a repo you mount; see the usage notes.'
5
+ documentationURL: https://www.keycloak.org/
6
+ service:
7
+ image: quay.io/keycloak/keycloak:26.6
8
+ defaultPort: 8080
9
+ # Dev mode + realm import. The Keycloak image has no auto-start default,
10
+ # so a command is mandatory. `--import-realm` reads every *.json from
11
+ # /opt/keycloak/data/import at startup (a no-op if the dir is empty).
12
+ command: start-dev --import-realm
13
+ # Starts in a host-side second wave AFTER the repo clone (ADR 0025), so a
14
+ # mounted realm.json / theme from the project is present at boot. No
15
+ # dataMount: the dev H2 database is ephemeral and re-seeds from the
16
+ # mounted realm JSON on every apply. No healthcheck: the service is not
17
+ # in runServices (nothing gates on it) and the image ships no curl.
18
+ deferStart: true
19
+ # Rendered as a COMMENTED volumes: scaffold in the yml (the catalog
20
+ # can't know your repo path). Uncomment + edit to mount realm/theme.
21
+ exampleVolumes:
22
+ - projects/<app>/keycloak/realm.json:/opt/keycloak/data/import/<app>.json:ro
23
+ - projects/<app>/keycloak/theme:/opt/keycloak/themes/<app>
24
+ connectionEnv:
25
+ URL: http://${host}:${port}
26
+ HOST: ${host}
27
+ PORT: ${port}
28
+ USER: ${KC_BOOTSTRAP_ADMIN_USERNAME}
29
+ PASSWORD: ${KC_BOOTSTRAP_ADMIN_PASSWORD}
30
+ options:
31
+ KC_BOOTSTRAP_ADMIN_USERNAME:
32
+ type: string
33
+ default: admin
34
+ surface: env
35
+ KC_BOOTSTRAP_ADMIN_PASSWORD:
36
+ type: string
37
+ default: admin
38
+ surface: env
39
+ usageNotes:
40
+ - 'Realm import: keep your realm export(s) in the repo and bind-mount them into `/opt/keycloak/data/import`. Add an entry to the service `volumes:`, e.g. `projects/<app>/keycloak/realm.json:/opt/keycloak/data/import/<app>.json:ro`. With no mount, Keycloak starts with an empty realm.'
41
+ - 'Multiple realms from different projects: one file-mount per realm to a distinct target name (two directories cannot mount onto the same target). Keycloak imports every *.json in the import dir.'
42
+ - 'Custom theme: bind-mount it into `/opt/keycloak/themes/<name>`, e.g. `projects/<app>/keycloak/theme:/opt/keycloak/themes/<app>`, then set `loginTheme`/`accountTheme` to `<name>` in the realm. In dev mode themes are not cached, so edits show on reload.'
43
+ - 'Paths are relative to the container root (`projects/<app>/...`); Monoceros resolves the bind source for you. Do not turn off the deferred start while mounting a repo file - the file would not exist at boot.'
44
+ - 'Import is one-way: admin-UI changes live in the Keycloak database, not the file. To keep them, export the realm and overwrite the committed JSON.'
45
+ briefing:
46
+ - text: 'Keycloak (identity & access management) runs as service `keycloak`. Reach it at `$KEYCLOAK_URL` (admin user `$KEYCLOAK_USER` / `$KEYCLOAK_PASSWORD`). Realms come from JSON files the project mounts into `/opt/keycloak/data/import`; the database is ephemeral and re-seeds from them on each apply.'