@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.
- package/bundled-components/features/atlassian/component.yml +25 -2
- package/bundled-components/features/atlassian/install.sh +34 -8
- package/bundled-components/languages/dotnet/component.yml +5 -0
- package/bundled-components/languages/go/component.yml +1 -0
- package/bundled-components/languages/java/component.yml +1 -0
- package/bundled-components/languages/python/component.yml +3 -0
- package/bundled-components/languages/rust/component.yml +1 -0
- package/bundled-components/services/keycloak/component.yml +46 -0
- package/dist/bin.js +608 -88
- package/dist/bin.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
id: atlassian
|
|
2
2
|
category: feature
|
|
3
3
|
displayName: Atlassian
|
|
4
|
-
description: 'Rovo Dev (`acli rovodev`)
|
|
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.
|
|
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
|
|
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
|
-
#
|
|
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]
|
|
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,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]
|
|
@@ -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.'
|