@getmonoceros/workbench 1.21.3 → 1.22.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.
Files changed (36) hide show
  1. package/bundled-components/features/atlassian/component.yml +52 -0
  2. package/bundled-components/features/atlassian/install.sh +176 -0
  3. package/bundled-components/features/claude-code/component.yml +32 -0
  4. package/bundled-components/features/claude-code/install.sh +56 -0
  5. package/bundled-components/features/github-cli/component.yml +18 -0
  6. package/bundled-components/features/github-cli/install.sh +53 -0
  7. package/bundled-components/languages/dotnet/component.yml +8 -0
  8. package/bundled-components/languages/go/component.yml +8 -0
  9. package/bundled-components/languages/java/component.yml +17 -0
  10. package/bundled-components/languages/node/component.yml +9 -0
  11. package/bundled-components/languages/python/component.yml +8 -0
  12. package/bundled-components/languages/rust/component.yml +8 -0
  13. package/bundled-components/services/mysql/component.yml +40 -0
  14. package/bundled-components/services/postgres/component.yml +34 -0
  15. package/bundled-components/services/redis/component.yml +16 -0
  16. package/dist/bin.js +774 -364
  17. package/dist/bin.js.map +1 -1
  18. package/package.json +5 -4
  19. package/features/atlassian/devcontainer-feature.json +0 -67
  20. package/features/claude-code/devcontainer-feature.json +0 -49
  21. package/features/github-cli/devcontainer-feature.json +0 -32
  22. package/templates/components/README.md +0 -95
  23. package/templates/components/atlassian/rovodev.yml +0 -14
  24. package/templates/components/atlassian/twg.yml +0 -14
  25. package/templates/components/atlassian.yml +0 -15
  26. package/templates/components/claude.yml +0 -16
  27. package/templates/components/dotnet.yml +0 -8
  28. package/templates/components/github.yml +0 -10
  29. package/templates/components/go.yml +0 -8
  30. package/templates/components/java.yml +0 -9
  31. package/templates/components/mysql.yml +0 -8
  32. package/templates/components/node.yml +0 -9
  33. package/templates/components/postgres.yml +0 -10
  34. package/templates/components/python.yml +0 -9
  35. package/templates/components/redis.yml +0 -7
  36. package/templates/components/rust.yml +0 -8
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getmonoceros/workbench",
3
- "version": "1.21.3",
3
+ "version": "1.22.0",
4
4
  "description": "Monoceros workbench CLI — local, reproducible dev containers with first-class AI coding tooling.",
5
5
  "keywords": [
6
6
  "devcontainer",
@@ -27,7 +27,7 @@
27
27
  "files": [
28
28
  "dist",
29
29
  "templates",
30
- "features",
30
+ "bundled-components",
31
31
  "README.md"
32
32
  ],
33
33
  "engines": {
@@ -37,8 +37,9 @@
37
37
  "start": "tsx src/bin.ts",
38
38
  "typecheck": "tsc --build",
39
39
  "test": "vitest run",
40
- "manifests:sync": "node scripts/sync-feature-manifests.mjs",
41
- "prebuild": "pnpm manifests:sync",
40
+ "components:sync": "node scripts/sync-components.mjs",
41
+ "manifests:generate": "tsx scripts/generate-feature-manifests.ts",
42
+ "prebuild": "pnpm components:sync",
42
43
  "build": "tsup",
43
44
  "prepublishOnly": "pnpm typecheck && pnpm test && pnpm build"
44
45
  },
@@ -1,67 +0,0 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainerFeature.schema.json",
3
- "id": "atlassian",
4
- "name": "Atlassian",
5
- "version": "1.0.0",
6
- "description": "Rovo Dev (`acli rovodev`) and Teamwork Graph (`twg`) CLIs sharing one Atlassian account. Auth persists across rebuilds.",
7
- "documentationURL": "https://developer.atlassian.com/cloud/",
8
- "options": {
9
- "rovodev": {
10
- "type": "boolean",
11
- "default": true,
12
- "description": "Install acli (with the Rovo Dev agent)."
13
- },
14
- "twg": {
15
- "type": "boolean",
16
- "default": true,
17
- "description": "Install twg (Teamwork Graph CLI)."
18
- },
19
- "instance": {
20
- "type": "string",
21
- "default": "",
22
- "description": "Atlassian site host (`yoursite.atlassian.net`); required by twg."
23
- },
24
- "email": {
25
- "type": "string",
26
- "default": "",
27
- "description": "Atlassian account email; used with `apiToken` for non-interactive login."
28
- },
29
- "apiToken": {
30
- "type": "string",
31
- "default": "",
32
- "description": "Atlassian API token (id.atlassian.com → Security → API tokens)."
33
- },
34
- "bitbucketToken": {
35
- "type": "string",
36
- "default": "",
37
- "description": "Optional Bitbucket app password; only needed for twg's Bitbucket commands."
38
- }
39
- },
40
- "customizations": {
41
- "vscode": {
42
- "extensions": ["Atlassian.atlascode"]
43
- }
44
- },
45
- "x-monoceros": {
46
- "persistentHomePaths": [
47
- ".config/acli",
48
- ".rovodev",
49
- ".config/twg",
50
- ".agents"
51
- ],
52
- "optionHints": ["instance", "email", "apiToken", "bitbucketToken"],
53
- "usageNotes": [],
54
- "briefing": {
55
- "lines": [
56
- {
57
- "whenOption": "rovodev",
58
- "text": "Atlassian Rovo Dev — invoke via `acli rovodev`. Pre-authenticated against the Atlassian account configured in the feature options (shared with twg)."
59
- },
60
- {
61
- "whenOption": "twg",
62
- "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."
63
- }
64
- ]
65
- }
66
- }
67
- }
@@ -1,49 +0,0 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainerFeature.schema.json",
3
- "id": "claude-code",
4
- "name": "Claude Code",
5
- "version": "1.2.0",
6
- "description": "Anthropic's CLI coding assistant. OAuth/subscription login persists across container rebuilds.",
7
- "documentationURL": "https://docs.anthropic.com/en/docs/claude-code",
8
- "options": {
9
- "version": {
10
- "type": "string",
11
- "default": "latest",
12
- "description": "npm-style version spec (`latest`, `^0.4`, `0.4.2`)."
13
- },
14
- "apiKey": {
15
- "type": "string",
16
- "default": "",
17
- "description": "`sk-ant-…` for API auth; empty for OAuth login on first run."
18
- },
19
- "permissionMode": {
20
- "type": "string",
21
- "proposals": ["auto", "ask", "edits", "bypass"],
22
- "default": "auto",
23
- "description": "Default Claude permission mode in this container. `auto` = Auto Mode: no per-action prompts and no recurring warning (a background classifier vets actions) — the comfortable default for an isolated container. `ask` prompts as usual; `edits` auto-accepts file edits but prompts for other commands; `bypass` skips all prompts (its one-time warning is pre-accepted). Monoceros writes this to ~/.claude/settings.json on apply; override per-project or with a CLI flag."
24
- }
25
- },
26
- "customizations": {
27
- "vscode": {
28
- "extensions": ["anthropic.claude-code"]
29
- }
30
- },
31
- "x-monoceros": {
32
- "persistentHomePaths": [".claude"],
33
- "persistentHomeFiles": [
34
- {
35
- "path": ".claude.json",
36
- "initialContent": "{}\n"
37
- }
38
- ],
39
- "optionHints": ["apiKey"],
40
- "usageNotes": [],
41
- "briefing": {
42
- "lines": [
43
- {
44
- "text": "Anthropic Claude Code CLI (`claude`) — interactive coding assistant. Authenticated via OAuth/subscription unless `apiKey` was set, in which case it runs in API-key mode."
45
- }
46
- ]
47
- }
48
- }
49
- }
@@ -1,32 +0,0 @@
1
- {
2
- "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainerFeature.schema.json",
3
- "id": "github-cli",
4
- "name": "GitHub CLI",
5
- "version": "1.0.0",
6
- "description": "The official `gh` CLI. Login persists across container rebuilds.",
7
- "documentationURL": "https://cli.github.com/",
8
- "options": {
9
- "apiToken": {
10
- "type": "string",
11
- "default": "",
12
- "description": "GitHub PAT (scopes: repo, read:org, gist); empty for `gh auth login` on first run."
13
- }
14
- },
15
- "customizations": {
16
- "vscode": {
17
- "extensions": ["github.vscode-pull-request-github"]
18
- }
19
- },
20
- "x-monoceros": {
21
- "persistentHomePaths": [".config/gh"],
22
- "optionHints": ["apiToken"],
23
- "usageNotes": [],
24
- "briefing": {
25
- "lines": [
26
- {
27
- "text": "GitHub CLI (`gh`) — repo, PR, issue, gist operations against github.com. Pre-authenticated; `gh auth status` reflects the active account."
28
- }
29
- ]
30
- }
31
- }
32
- }
@@ -1,95 +0,0 @@
1
- # Monoceros Components Catalog
2
-
3
- Every file under this directory is a **component** — a small,
4
- composable yaml snippet that contributes to a `SolutionConfig`. The
5
- `monoceros init` command picks components by name (via the `--with-*`
6
- flags or by rendering them all as commented-out hints in the documented
7
- default) and merges them into the user's container-config yml.
8
-
9
- ## File layout
10
-
11
- - `<name>.yml` — a top-level component (e.g. `node.yml`, `postgres.yml`).
12
- - `<group>/<name>.yml` — a sub-component of a parent feature
13
- (e.g. `atlassian/twg.yml` is a sub-component of `atlassian/`).
14
-
15
- Component names map 1:1 to their `--with-*` identifier:
16
-
17
- - `--with-languages=node` → `node.yml`
18
- - `--with-features=atlassian/twg` → `atlassian/twg.yml`
19
-
20
- ## File schema
21
-
22
- ```yaml
23
- # Short label shown next to the active line (or "- node" entry) in
24
- # the generated yml.
25
- displayName: Node 22 + pnpm
26
-
27
- # Longer block, shown as a comment above the section in documented
28
- # mode (i.e. `monoceros init <name>` with no --with-* flags). English,
29
- # free prose, can mention what it adds, where credentials come from, etc.
30
- description: |
31
- Node 22 + pnpm are already in the base image; this component
32
- declares the runtime as active so the scaffold wires it up.
33
-
34
- # Which top-level yml section this component contributes to. Drives
35
- # how the documented-mode renderer groups components.
36
- category: language | service | feature
37
-
38
- # The actual yml fragment merged into the final SolutionConfig.
39
- # Must be a valid fragment for the declared category:
40
- # - language → contributes.languages must be a non-empty string array
41
- # - service → contributes.services must be a non-empty string array
42
- # - feature → contributes.features must hold one feature entry
43
- contributes:
44
- # …
45
- ```
46
-
47
- ## Conventions
48
-
49
- - **Comments and prose are English**, even though the broader user
50
- docs are German. The rendered yml is a tool output and English
51
- reads more cleanly for the typical dev-yml shape.
52
- - **Sub-components set their own flag to `true` AND every sibling flag
53
- to `false`.** Both `atlassian/twg.yml` and `atlassian/rovodev.yml`
54
- set both `rovodev` and `twg`, just with opposite truth values.
55
- The init merge applies OR semantics on booleans: when two
56
- components contribute the same boolean key, `true` wins. That
57
- way `--with-features=atlassian/twg` on its own opts out of the other
58
- tool, while `--with-features=atlassian/twg,atlassian/rovodev` merges to
59
- both `true`. Without the explicit `false`, the manifest defaults
60
- (`true` for both) would silently re-enable the unwanted tool.
61
- - **Auth/credential options live with the feature, not the
62
- component.** Each feature manifest under `images/features/`
63
- declares an `x-monoceros.optionHints` array that the init
64
- generator uses to render commented-out auth options beneath the
65
- active options block whenever the feature is included.
66
-
67
- ## Adding a new component
68
-
69
- 1. Decide on the name and (if it's a sub-component) the group folder.
70
- 2. Drop the yml file in. Use an existing component of the same
71
- category as a starting point.
72
- 3. If the component activates a Monoceros feature, make sure that
73
- feature's manifest under `images/features/<feature>/` carries
74
- the right `x-monoceros.optionHints` for auth.
75
- 4. Add a short note to this README's "Current components" table if
76
- you want it discoverable at a glance.
77
-
78
- ## Current components
79
-
80
- | Component | Category | Contributes |
81
- | ------------------- | -------- | ------------------------------------------------------- |
82
- | `node` | language | Node runtime (declared; package already in base image) |
83
- | `python` | language | Python via devcontainers/features/python |
84
- | `java` | language | JDK via devcontainers/features/java |
85
- | `go` | language | Go toolchain via devcontainers/features/go |
86
- | `rust` | language | Rust toolchain via devcontainers/features/rust |
87
- | `dotnet` | language | .NET SDK via devcontainers/features/dotnet:2 |
88
- | `postgres` | service | Compose service: Postgres |
89
- | `mysql` | service | Compose service: MySQL |
90
- | `redis` | service | Compose service: Redis |
91
- | `claude` | feature | `claude-code` feature (Claude Code CLI) |
92
- | `github` | feature | `github-cli` feature (`gh`) with auto-auth via apiToken |
93
- | `atlassian` | feature | atlassian feature: Rovo Dev + twg both on |
94
- | `atlassian/rovodev` | feature | atlassian feature with just `rovodev: true` |
95
- | `atlassian/twg` | feature | atlassian feature with just `twg: true` |
@@ -1,14 +0,0 @@
1
- displayName: Atlassian Rovo Dev only (via acli rovodev)
2
- description: |
3
- Sub-component of the atlassian feature. Activates only the
4
- `acli rovodev` AI agent and explicitly opts out of `twg`.
5
- Combine with `atlassian/twg` to get both tools — booleans
6
- OR-merge during component composition so `--with=atlassian/rovodev,atlassian/twg`
7
- yields both `true`.
8
- category: feature
9
- contributes:
10
- features:
11
- - ref: ghcr.io/getmonoceros/monoceros-features/atlassian:1
12
- options:
13
- rovodev: true
14
- twg: false
@@ -1,14 +0,0 @@
1
- displayName: Atlassian Teamwork Graph CLI only (twg)
2
- description: |
3
- Sub-component of the atlassian feature. Activates only the
4
- `twg` CLI and explicitly opts out of `rovodev`. Combine with
5
- `atlassian/rovodev` to get both tools — booleans OR-merge
6
- during component composition so
7
- `--with=atlassian/rovodev,atlassian/twg` yields both `true`.
8
- category: feature
9
- contributes:
10
- features:
11
- - ref: ghcr.io/getmonoceros/monoceros-features/atlassian:1
12
- options:
13
- rovodev: false
14
- twg: true
@@ -1,15 +0,0 @@
1
- displayName: Atlassian CLIs (Rovo Dev + Teamwork Graph), both on
2
- description: |
3
- Installs both Atlassian CLIs that share a single Atlassian
4
- account: Rovo Dev (the `acli rovodev` AI agent) and Teamwork
5
- Graph (`twg`). Use the sub-components `atlassian/rovodev` or
6
- `atlassian/twg` instead of this one if you only want one of
7
- the two tools. Both can be combined: `--with=atlassian/rovodev,atlassian/twg`
8
- yields the same result as `--with=atlassian`.
9
- category: feature
10
- contributes:
11
- features:
12
- - ref: ghcr.io/getmonoceros/monoceros-features/atlassian:1
13
- options:
14
- rovodev: true
15
- twg: true
@@ -1,16 +0,0 @@
1
- displayName: Anthropic Claude Code CLI
2
- description: |
3
- Installs the Claude Code CLI via npm and bind-mounts a per-
4
- container `.claude/` so login + skills + session history
5
- survive `monoceros apply`. Without an apiKey, the CLI uses
6
- Anthropic's subscription/OAuth flow on first run; with an
7
- apiKey, it switches to API-key mode via ANTHROPIC_API_KEY.
8
- category: feature
9
- contributes:
10
- features:
11
- - ref: ghcr.io/getmonoceros/monoceros-features/claude-code:1
12
- # Surfaced in the generated yml so it's discoverable/editable.
13
- # `auto`: no per-action prompts, no recurring warning. Others:
14
- # `ask`, `edits` (auto-accept edits only), `bypass` (skip all).
15
- options:
16
- permissionMode: auto
@@ -1,8 +0,0 @@
1
- displayName: .NET via devcontainers/features/dotnet:2
2
- description: |
3
- Adds the upstream `ghcr.io/devcontainers/features/dotnet:2`
4
- feature to the container, which installs the .NET SDK (and
5
- optionally specific runtimes via the feature's own options).
6
- category: language
7
- contributes:
8
- languages: [dotnet]
@@ -1,10 +0,0 @@
1
- displayName: GitHub CLI (gh)
2
- description: |
3
- Installs the official `gh` CLI from the upstream apt repo and
4
- wires GH_TOKEN via /etc/profile.d so a Personal Access Token
5
- set via this feature's `apiToken` option authenticates every
6
- login shell automatically.
7
- category: feature
8
- contributes:
9
- features:
10
- - ref: ghcr.io/getmonoceros/monoceros-features/github-cli:1
@@ -1,8 +0,0 @@
1
- displayName: Go via devcontainers/features/go
2
- description: |
3
- Adds the upstream `ghcr.io/devcontainers/features/go` feature to
4
- the container, which installs the Go toolchain plus common dev
5
- utilities (gopls, dlv, …).
6
- category: language
7
- contributes:
8
- languages: [go]
@@ -1,9 +0,0 @@
1
- displayName: Java via devcontainers/features/java
2
- description: |
3
- Adds the upstream `ghcr.io/devcontainers/features/java` feature to
4
- the container, which installs a JDK plus Maven/Gradle scaffolding.
5
- Pin a version through the feature's own options if you need
6
- something other than the default.
7
- category: language
8
- contributes:
9
- languages: [java]
@@ -1,8 +0,0 @@
1
- displayName: MySQL 8 compose service
2
- description: |
3
- Adds a `mysql` service to compose mode. Inside the container it
4
- is reachable as host `mysql`:
5
- mysql://monoceros:monoceros@mysql:3306/monoceros
6
- category: service
7
- contributes:
8
- services: [mysql]
@@ -1,9 +0,0 @@
1
- displayName: Node 22 + pnpm
2
- description: |
3
- Node 22 + pnpm + corepack are already in the base runtime image.
4
- This component just declares `node` as the active language so
5
- scaffold steps that key off the language list (post-create
6
- package detection, default extensions, …) see it.
7
- category: language
8
- contributes:
9
- languages: [node]
@@ -1,10 +0,0 @@
1
- displayName: PostgreSQL 16 compose service
2
- description: |
3
- Adds a `postgres` service to compose mode. Inside the container
4
- it is reachable as host `postgres`:
5
- postgresql://monoceros:monoceros@postgres:5432/monoceros
6
- Swap to an external Postgres by replacing this component with an
7
- `externalServices.postgres: postgresql://…` block in the yml.
8
- category: service
9
- contributes:
10
- services: [postgres]
@@ -1,9 +0,0 @@
1
- displayName: Python 3.x via devcontainers/features/python
2
- description: |
3
- Adds the upstream `ghcr.io/devcontainers/features/python` feature
4
- to the container, which installs a recent CPython plus pip and
5
- the usual scaffolding. Pin a version through the feature's own
6
- options if you need something other than the default.
7
- category: language
8
- contributes:
9
- languages: [python]
@@ -1,7 +0,0 @@
1
- displayName: Redis 7 compose service
2
- description: |
3
- Adds a `redis` service to compose mode. Inside the container it
4
- is reachable as host `redis` on the default port 6379.
5
- category: service
6
- contributes:
7
- services: [redis]
@@ -1,8 +0,0 @@
1
- displayName: Rust via devcontainers/features/rust
2
- description: |
3
- Adds the upstream `ghcr.io/devcontainers/features/rust` feature
4
- to the container, which installs rustup, the current stable
5
- toolchain, and cargo.
6
- category: language
7
- contributes:
8
- languages: [rust]