spinup-ts 0.1.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/README.md +82 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +17 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +264 -0
- package/dist/prompts.js.map +1 -0
- package/dist/scaffold.d.ts +5 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +128 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/transforms/devcontainer.d.ts +3 -0
- package/dist/transforms/devcontainer.d.ts.map +1 -0
- package/dist/transforms/devcontainer.js +8 -0
- package/dist/transforms/devcontainer.js.map +1 -0
- package/dist/transforms/docker.d.ts +3 -0
- package/dist/transforms/docker.d.ts.map +1 -0
- package/dist/transforms/docker.js +11 -0
- package/dist/transforms/docker.js.map +1 -0
- package/dist/transforms/docs.d.ts +3 -0
- package/dist/transforms/docs.d.ts.map +1 -0
- package/dist/transforms/docs.js +22 -0
- package/dist/transforms/docs.js.map +1 -0
- package/dist/transforms/documentation.d.ts +3 -0
- package/dist/transforms/documentation.d.ts.map +1 -0
- package/dist/transforms/documentation.js +37 -0
- package/dist/transforms/documentation.js.map +1 -0
- package/dist/transforms/github-actions.d.ts +3 -0
- package/dist/transforms/github-actions.d.ts.map +1 -0
- package/dist/transforms/github-actions.js +48 -0
- package/dist/transforms/github-actions.js.map +1 -0
- package/dist/transforms/index.d.ts +3 -0
- package/dist/transforms/index.d.ts.map +1 -0
- package/dist/transforms/index.js +24 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/transforms/license.d.ts +3 -0
- package/dist/transforms/license.d.ts.map +1 -0
- package/dist/transforms/license.js +19 -0
- package/dist/transforms/license.js.map +1 -0
- package/dist/transforms/npm-publish.d.ts +3 -0
- package/dist/transforms/npm-publish.d.ts.map +1 -0
- package/dist/transforms/npm-publish.js +15 -0
- package/dist/transforms/npm-publish.js.map +1 -0
- package/dist/transforms/package-manager.d.ts +3 -0
- package/dist/transforms/package-manager.d.ts.map +1 -0
- package/dist/transforms/package-manager.js +31 -0
- package/dist/transforms/package-manager.js.map +1 -0
- package/dist/types.d.ts +116 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +52 -0
- package/dist/types.js.map +1 -0
- package/dist/update.d.ts +2 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +207 -0
- package/dist/update.js.map +1 -0
- package/package.json +94 -0
- package/template/.commitlintrc.json +3 -0
- package/template/.devcontainer/.zshrc +159 -0
- package/template/.devcontainer/DISCOVER-DEPS.md +109 -0
- package/template/.devcontainer/README.md +223 -0
- package/template/.devcontainer/SETUP.md +191 -0
- package/template/.devcontainer/TOOLS.md +215 -0
- package/template/.devcontainer/devcontainer.json +106 -0
- package/template/.devcontainer/scripts/init-project.sh +167 -0
- package/template/.editorconfig +12 -0
- package/template/.github/.release-please-manifest.json +3 -0
- package/template/.github/ISSUE_TEMPLATE/bug_report.md +21 -0
- package/template/.github/ISSUE_TEMPLATE/feature_request.md +14 -0
- package/template/.github/PULL_REQUEST_TEMPLATE.md +13 -0
- package/template/.github/actions/setup-node-env/action.yml +20 -0
- package/template/.github/dependabot.yml +17 -0
- package/template/.github/labeler.yml +17 -0
- package/template/.github/release-please-config.json +7 -0
- package/template/.github/workflows/ci.yml +95 -0
- package/template/.github/workflows/codeql.yml +31 -0
- package/template/.github/workflows/labeler.yml +18 -0
- package/template/.github/workflows/release-please.yml +72 -0
- package/template/.github/workflows/stale.yml +32 -0
- package/template/.husky/commit-msg +1 -0
- package/template/.husky/pre-commit +1 -0
- package/template/.nvmrc +1 -0
- package/template/.vscode/extensions.json +11 -0
- package/template/.vscode/settings.json +12 -0
- package/template/AGENTS.md +1 -0
- package/template/CHANGELOG.md +11 -0
- package/template/CLAUDE.md +0 -0
- package/template/CONTRIBUTING.md +22 -0
- package/template/Dockerfile +21 -0
- package/template/LICENSE.Apache-2.0 +17 -0
- package/template/LICENSE.BSD-3-Clause +28 -0
- package/template/LICENSE.GPL-3.0 +17 -0
- package/template/LICENSE.ISC +15 -0
- package/template/LICENSE.MIT +21 -0
- package/template/README.md +62 -0
- package/template/biome.json +49 -0
- package/template/docker-compose.yml +7 -0
- package/template/docs/architecture/api-layer.md +44 -0
- package/template/docs/architecture/constitution.md +24 -0
- package/template/docs/architecture/data-model.md +24 -0
- package/template/docs/architecture/index.md +15 -0
- package/template/docs/architecture/project.md +24 -0
- package/template/docs/architecture/quality-checks.md +28 -0
- package/template/docs/architecture/testing-plan.md +35 -0
- package/template/docs/architecture/ui.md +37 -0
- package/template/docs/changelog.md +9 -0
- package/template/docs/contributing.md +46 -0
- package/template/docs/developer-guide/architecture.md +22 -0
- package/template/docs/developer-guide/contributing.md +30 -0
- package/template/docs/developer-guide/data-model.md +25 -0
- package/template/docs/developer-guide/index.md +12 -0
- package/template/docs/developer-guide/testing.md +40 -0
- package/template/docs/examples.md +37 -0
- package/template/docs/getting-started.md +42 -0
- package/template/docs/installation.md +45 -0
- package/template/docs/intro.md +60 -0
- package/template/docs/post-mortems/.gitkeep +0 -0
- package/template/docs/reference/cli.md +32 -0
- package/template/docs/reference/configuration.md +33 -0
- package/template/docs/reference/hooks.md +27 -0
- package/template/docs/research/competitor-analysis.md +21 -0
- package/template/docs/research/real-world-demand.md +21 -0
- package/template/docs/user-guide/configuration.md +32 -0
- package/template/docs/user-guide/features.md +21 -0
- package/template/docs/user-guide/how-it-works.md +29 -0
- package/template/docs/user-guide/index.md +11 -0
- package/template/docusaurus.config.ts +93 -0
- package/template/eslint.config.mjs +66 -0
- package/template/justfile +51 -0
- package/template/package.json +88 -0
- package/template/pnpm-workspace.yaml +8 -0
- package/template/sidebars.ts +72 -0
- package/template/src/index.ts +3 -0
- package/template/static/img/logo.svg +4 -0
- package/template/tests/index.test.ts +8 -0
- package/template/tsconfig.json +23 -0
- package/template/vitest.config.ts +19 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# Claude Code Devcontainer
|
|
2
|
+
|
|
3
|
+
A Claude Code–optimised development environment for any project. Mirrors the local macOS
|
|
4
|
+
toolchain inside a Linux container so agents can run with `--dangerously-skip-permissions`
|
|
5
|
+
with a contained blast radius.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Quick start
|
|
10
|
+
|
|
11
|
+
### Using this repo as your devcontainer
|
|
12
|
+
|
|
13
|
+
1. Open the `devcontainer/` repo in VS Code
|
|
14
|
+
2. When prompted, choose **"Reopen in Container"** (or run `Dev Containers: Reopen in Container`)
|
|
15
|
+
3. The image builds once; subsequent opens are fast
|
|
16
|
+
|
|
17
|
+
### Adding this devcontainer to another project
|
|
18
|
+
|
|
19
|
+
Run from your host terminal:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# add the alias once (to ~/.zshrc or ~/.aliases.zsh)
|
|
23
|
+
alias devcontainer-init='~/github/joeblackwaslike/devcontainer/.devcontainer/scripts/init-project.sh'
|
|
24
|
+
|
|
25
|
+
# then, in any project root:
|
|
26
|
+
cd ~/github/myproject
|
|
27
|
+
devcontainer-init
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Scripts reference
|
|
33
|
+
|
|
34
|
+
### `scripts/setup.sh` — post-create one-time setup
|
|
35
|
+
|
|
36
|
+
**When it runs:** automatically via `postCreateCommand` the first time the container is built.
|
|
37
|
+
Does not re-run on subsequent attaches.
|
|
38
|
+
|
|
39
|
+
**What it does:**
|
|
40
|
+
|
|
41
|
+
| Step | Detail |
|
|
42
|
+
| --- | --- |
|
|
43
|
+
| Skills symlink | Recreates `~/.claude/skills → ~/.agents/skills` inside the container so Claude Code can find all installed skills from the host mount |
|
|
44
|
+
| mkcert CA | Installs the local CA generated by `mkcert` so self-signed TLS certs are trusted in this container |
|
|
45
|
+
|
|
46
|
+
**Manual re-run** (if setup failed or mounts changed):
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
bash .devcontainer/scripts/setup.sh
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
#### Extending setup.sh
|
|
53
|
+
|
|
54
|
+
Add any one-time initialisation that should run exactly once per image build.
|
|
55
|
+
For steps that should repeat on every attach, use `custom-setup.sh` instead (see below).
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### `scripts/discover-deps.sh` — per-attach dependency installation
|
|
60
|
+
|
|
61
|
+
**When it runs:** automatically via `postAttachCommand` every time you attach VS Code to the
|
|
62
|
+
running container. It is fast when nothing has changed (package managers skip work when
|
|
63
|
+
lock files haven't changed).
|
|
64
|
+
|
|
65
|
+
**What it detects** (first match per language wins):
|
|
66
|
+
|
|
67
|
+
| Signal file | Action |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| `pnpm-lock.yaml` | `pnpm install` |
|
|
70
|
+
| `bun.lockb` | `bun install` |
|
|
71
|
+
| `yarn.lock` | `yarn install` |
|
|
72
|
+
| `package-lock.json` | `npm ci` |
|
|
73
|
+
| `package.json` (no lock) | `npm install` |
|
|
74
|
+
| `pyproject.toml` | `uv sync` |
|
|
75
|
+
| `requirements.txt` | `uv pip install -r requirements.txt` |
|
|
76
|
+
| `Cargo.toml` | `cargo fetch` |
|
|
77
|
+
| `go.mod` | `go mod download` |
|
|
78
|
+
| `Gemfile` | `bundle install` |
|
|
79
|
+
| `.devcontainer/custom-setup.sh` | `bash .devcontainer/custom-setup.sh` |
|
|
80
|
+
|
|
81
|
+
**Manual re-run:**
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
bash .devcontainer/scripts/discover-deps.sh
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Skip discovery** (useful in CI or when you want full control):
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
DISCOVER_DEPS_SKIP=1 bash .devcontainer/scripts/discover-deps.sh
|
|
91
|
+
# or set it permanently in devcontainer.json remoteEnv:
|
|
92
|
+
# "DISCOVER_DEPS_SKIP": "1"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Per-project customisation** — create `.devcontainer/custom-setup.sh` in the project repo.
|
|
96
|
+
It runs last, after all auto-detection. The `init-project.sh` CLI generates a stub for you.
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
#!/usr/bin/env bash
|
|
100
|
+
# .devcontainer/custom-setup.sh — project-specific hook
|
|
101
|
+
|
|
102
|
+
# Install a project-specific CLI tool
|
|
103
|
+
npm install -g @myorg/dev-tools
|
|
104
|
+
|
|
105
|
+
# Seed the local database on first attach
|
|
106
|
+
psql -U postgres -c "CREATE DATABASE myapp;" 2>/dev/null || true
|
|
107
|
+
psql -U postgres myapp < db/seed.sql 2>/dev/null || true
|
|
108
|
+
|
|
109
|
+
# Add a project env var to the shell
|
|
110
|
+
echo 'export APP_ENV=devcontainer' >> ~/.zshrc
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
See [DISCOVER-DEPS.md](DISCOVER-DEPS.md) for full documentation.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
### `scripts/init-project.sh` — bootstrap devcontainer into a project
|
|
118
|
+
|
|
119
|
+
**Purpose:** copies this `.devcontainer/` directory into any project so it gets the full
|
|
120
|
+
Claude Code environment without duplicating the config.
|
|
121
|
+
|
|
122
|
+
**Install the alias** (add to `~/.zshrc` or `~/.aliases.zsh` on your host machine):
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
alias devcontainer-init='~/github/joeblackwaslike/devcontainer/.devcontainer/scripts/init-project.sh'
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Usage:**
|
|
129
|
+
|
|
130
|
+
```text
|
|
131
|
+
devcontainer-init [target-dir] [options]
|
|
132
|
+
|
|
133
|
+
Arguments:
|
|
134
|
+
target-dir Project to initialise (default: current directory)
|
|
135
|
+
|
|
136
|
+
Options:
|
|
137
|
+
--name NAME Override the devcontainer name (default: project dir name)
|
|
138
|
+
--force Overwrite an existing .devcontainer/ without prompting
|
|
139
|
+
--dry-run Show what would happen without writing any files
|
|
140
|
+
--help Show help
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Examples:**
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# Initialise the current directory
|
|
147
|
+
cd ~/github/myproject && devcontainer-init
|
|
148
|
+
|
|
149
|
+
# Initialise a specific directory
|
|
150
|
+
devcontainer-init ~/github/anotherproject
|
|
151
|
+
|
|
152
|
+
# Preview what would happen (no writes)
|
|
153
|
+
devcontainer-init --dry-run
|
|
154
|
+
|
|
155
|
+
# Replace an existing config
|
|
156
|
+
devcontainer-init --force
|
|
157
|
+
|
|
158
|
+
# Set a custom container name
|
|
159
|
+
devcontainer-init --name "myproject-dev"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**What it does step by step:**
|
|
163
|
+
|
|
164
|
+
1. Validates the target is a git repository root
|
|
165
|
+
2. Copies `.devcontainer/` from this repo into the target project
|
|
166
|
+
3. Sets the `"name"` field in `devcontainer.json` to match the project name
|
|
167
|
+
4. Creates a `.devcontainer/custom-setup.sh` stub with inline usage examples
|
|
168
|
+
5. Optionally adds `.devcontainer/` to `.gitignore` (prompts you — the config is maintained
|
|
169
|
+
centrally here so projects usually don't need to commit it)
|
|
170
|
+
6. Prints next-step instructions
|
|
171
|
+
|
|
172
|
+
**After running:**
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
cd ~/github/myproject
|
|
176
|
+
code . # open in VS Code
|
|
177
|
+
# Then: "Dev Containers: Reopen in Container"
|
|
178
|
+
# Edit .devcontainer/custom-setup.sh for project-specific setup
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## How the environment is mirrored from your Mac
|
|
184
|
+
|
|
185
|
+
All mounts are read-only unless Claude Code needs to write state to the path.
|
|
186
|
+
|
|
187
|
+
| Mount | Mode | Purpose |
|
|
188
|
+
| --- | --- | --- |
|
|
189
|
+
| `~/.claude` | read-write | Claude Code: sessions, memory, settings, plugins |
|
|
190
|
+
| `~/.claude.json` | read-write | Claude Code account config |
|
|
191
|
+
| `~/.agents` | read-only | Shared skills and agent definitions |
|
|
192
|
+
| `~/.ssh` | read-only | SSH keys (git push, remote access) |
|
|
193
|
+
| `~/.gitconfig` | read-only | Git identity and config |
|
|
194
|
+
| `~/.config/gh` | read-only | GitHub CLI auth tokens |
|
|
195
|
+
| `~/github/joeblackwaslike` | read-only | Local repos — resolves MCP server paths from settings.json |
|
|
196
|
+
| `~/.gemini` | read-write | Gemini CLI: settings, history, skills, session state |
|
|
197
|
+
| `~/.codex` | read-write | Codex CLI: config, auth, memories, skills, plugins, logs |
|
|
198
|
+
| `~/.openclaw` | read-write | openclaw: credentials, settings, workspace, logs |
|
|
199
|
+
| `~/.config/opencode` | read-write | opencode settings |
|
|
200
|
+
| `~/.local/share/opencode` | read-write | opencode runtime data |
|
|
201
|
+
| `~/.orbstack/run/docker.sock` | read-write | Docker socket (OrbStack) |
|
|
202
|
+
|
|
203
|
+
### MCP server path compatibility
|
|
204
|
+
|
|
205
|
+
`settings.json` on the host contains MCP server paths like
|
|
206
|
+
`/Users/joe/github/joeblackwaslike/mcp-exec/dist/src/server.js`.
|
|
207
|
+
The Dockerfile adds a symlink `ln -sf /home/vscode /Users/joe` so these
|
|
208
|
+
paths resolve correctly inside the container once `~/github/joeblackwaslike`
|
|
209
|
+
is mounted.
|
|
210
|
+
|
|
211
|
+
### API keys
|
|
212
|
+
|
|
213
|
+
All keys are passed through `remoteEnv` in `devcontainer.json` from your
|
|
214
|
+
local environment. Nothing is baked into the image. Make sure the keys are
|
|
215
|
+
exported in your shell before opening the container.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Reference
|
|
220
|
+
|
|
221
|
+
- [TOOLS.md](TOOLS.md) — complete catalog of every installed tool, version strategy, and install method
|
|
222
|
+
- [DISCOVER-DEPS.md](DISCOVER-DEPS.md) — deep dive on dependency auto-detection and per-project customisation
|
|
223
|
+
- [SETUP.md](SETUP.md) — one-time host setup: API keys, 1Password service account token, aliases, directory checks
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Host Setup Guide
|
|
2
|
+
|
|
3
|
+
One-time setup steps for your macOS host before opening the devcontainer for the first time.
|
|
4
|
+
These steps only need to be done once per machine.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. Export required API keys
|
|
9
|
+
|
|
10
|
+
The container receives all secrets via `remoteEnv` — nothing is baked into the image.
|
|
11
|
+
Add these exports to your `~/.zshrc` or `~/.aliases.zsh` and source the file (or open a new shell):
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Anthropic / Claude
|
|
15
|
+
export ANTHROPIC_API_KEY="sk-ant-..."
|
|
16
|
+
export ANTHROPIC_MODEL="claude-opus-4-5"
|
|
17
|
+
export ANTHROPIC_SMALL_FAST_MODEL="claude-haiku-4-5-20251001"
|
|
18
|
+
|
|
19
|
+
# OpenAI / Codex
|
|
20
|
+
export OPENAI_API_KEY="sk-..."
|
|
21
|
+
export OPENAI_ORG_ID="org-..."
|
|
22
|
+
|
|
23
|
+
# 1Password CLI (see section 2)
|
|
24
|
+
export OP_SERVICE_ACCOUNT_TOKEN="ops1_..."
|
|
25
|
+
|
|
26
|
+
# MCP server keys
|
|
27
|
+
export CONTEXT7_API_KEY="..."
|
|
28
|
+
export EXA_API_KEY="..."
|
|
29
|
+
export TAVILY_API_KEY="..."
|
|
30
|
+
export FIRECRAWL_API_KEY="..."
|
|
31
|
+
export PERPLEXITY_API_KEY="..."
|
|
32
|
+
export BRAVE_API_KEY="..."
|
|
33
|
+
export REF_API_KEY="..."
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The container will silently pass through any variable that isn't set — tools that depend on
|
|
37
|
+
missing keys will fail at runtime, not at container build time.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 2. 1Password CLI setup
|
|
42
|
+
|
|
43
|
+
The container uses the **1Password Service Account** authentication method. This is the right
|
|
44
|
+
approach when the host has no 1Password desktop app socket to mount (OrbStack containers
|
|
45
|
+
can't access the macOS GUI app socket).
|
|
46
|
+
|
|
47
|
+
### Create a service account token
|
|
48
|
+
|
|
49
|
+
1. Open [1Password.com](https://1password.com) → your account → **Developer Tools** → **Service Accounts**
|
|
50
|
+
2. Click **New Service Account**
|
|
51
|
+
3. Give it a name (e.g., `devcontainer`)
|
|
52
|
+
4. Grant access to the vaults the container needs (e.g., `cloudflare`, `porkbun`, `dev`)
|
|
53
|
+
5. Click **Generate Token** — copy it immediately (shown only once)
|
|
54
|
+
|
|
55
|
+
Docs: https://developer.1password.com/docs/service-accounts/
|
|
56
|
+
|
|
57
|
+
### Export the token
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# In ~/.zshrc or ~/.aliases.zsh (already listed in section 1):
|
|
61
|
+
export OP_SERVICE_ACCOUNT_TOKEN="ops1_..."
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Verify inside the container
|
|
65
|
+
|
|
66
|
+
After opening the container:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
op whoami
|
|
70
|
+
# Should print: account URL, user ID, and service account name
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Usage in MCP server commands
|
|
74
|
+
|
|
75
|
+
The `op` CLI is used with `op run` to inject secrets into MCP server processes:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Example: inject secrets into a Cloudflare MCP server
|
|
79
|
+
op run --env-file=.env.op -- node dist/server.js
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
MCP server configurations that need 1Password secrets reference `op://vault/item/field`
|
|
83
|
+
directly in their environment files.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 3. Install the `devcontainer-init` alias
|
|
88
|
+
|
|
89
|
+
Add this alias to your macOS `~/.zshrc` (not the container's) so you can bootstrap the
|
|
90
|
+
devcontainer into any project from anywhere:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
alias devcontainer-init='~/github/joeblackwaslike/devcontainer/.devcontainer/scripts/init-project.sh'
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Then run `source ~/.zshrc` or open a new terminal.
|
|
97
|
+
|
|
98
|
+
Usage:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Bootstrap the devcontainer into a project
|
|
102
|
+
cd ~/github/myproject && devcontainer-init
|
|
103
|
+
|
|
104
|
+
# Or target a directory directly
|
|
105
|
+
devcontainer-init ~/github/anotherproject
|
|
106
|
+
|
|
107
|
+
# Preview without writing
|
|
108
|
+
devcontainer-init --dry-run
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
See [init-project.sh](scripts/init-project.sh) and [README.md](README.md) for full documentation.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 4. Verify required host directories exist
|
|
116
|
+
|
|
117
|
+
The devcontainer mounts several directories from your home folder. Most are created by their
|
|
118
|
+
respective tools, but double-check before first use:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
ls ~/.claude # Claude Code config — must exist
|
|
122
|
+
ls ~/.claude.json # Claude Code account — created on first claude login
|
|
123
|
+
ls ~/.agents # Skills + agent definitions
|
|
124
|
+
ls ~/.ssh # SSH keys
|
|
125
|
+
ls ~/.gitconfig # Git identity (can be a file, not a dir)
|
|
126
|
+
ls ~/.config/gh # GitHub CLI auth
|
|
127
|
+
ls ~/.gemini # Gemini CLI — created on first gemini run
|
|
128
|
+
ls ~/.codex # Codex CLI — created on first codex run
|
|
129
|
+
ls ~/.openclaw # openclaw — created on first run
|
|
130
|
+
ls ~/.config/opencode
|
|
131
|
+
ls ~/.local/share/opencode
|
|
132
|
+
ls ~/.orbstack/run/docker.sock # OrbStack Docker socket
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Directories that don't exist will cause the container to fail to start. Create missing ones:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
mkdir -p ~/.agents ~/.gemini ~/.codex ~/.openclaw ~/.config/opencode ~/.local/share/opencode
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 5. Open the container
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
cd ~/github/joeblackwaslike/devcontainer
|
|
147
|
+
code .
|
|
148
|
+
# VS Code: "Dev Containers: Reopen in Container"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
The first build takes several minutes. Subsequent opens are fast (image is cached).
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 6. Publish the pre-built image (optional, one-time)
|
|
156
|
+
|
|
157
|
+
Building the image once and pushing it to GHCR means no project ever has to build it locally.
|
|
158
|
+
The `devcontainer-init` script automatically configures new projects to pull the pre-built image.
|
|
159
|
+
|
|
160
|
+
### Authenticate to GHCR
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
# Generate a token at https://github.com/settings/tokens
|
|
164
|
+
# Scopes required: write:packages, read:packages, delete:packages
|
|
165
|
+
echo $GITHUB_TOKEN | docker login ghcr.io -u joeblackwaslike --password-stdin
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Build and push
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
cd ~/github/joeblackwaslike/devcontainer
|
|
172
|
+
make push
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
This builds a multi-arch image (`linux/amd64` + `linux/arm64`) and pushes it to
|
|
176
|
+
`ghcr.io/joeblackwaslike/devcontainer:latest`.
|
|
177
|
+
|
|
178
|
+
### Make the package public (one-time)
|
|
179
|
+
|
|
180
|
+
After the first push, go to
|
|
181
|
+
`https://github.com/users/joeblackwaslike/packages/container/devcontainer/settings`
|
|
182
|
+
and set visibility to **Public** so projects can pull it without authentication.
|
|
183
|
+
|
|
184
|
+
### Re-publish after Dockerfile changes
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
make push
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Projects pull `latest` on the next container rebuild — no changes needed in their
|
|
191
|
+
`devcontainer.json`.
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Installed Tools Catalog
|
|
2
|
+
|
|
3
|
+
Comprehensive reference for everything installed in this devcontainer image.
|
|
4
|
+
Each section lists the install method, version strategy, and purpose.
|
|
5
|
+
Update this file whenever you add, remove, or upgrade a tool.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## System packages (apt / Aptfile)
|
|
10
|
+
|
|
11
|
+
Installed at image build time via `seatgeek/bash-aptfile` running against `Aptfile`.
|
|
12
|
+
|
|
13
|
+
| Package | Purpose |
|
|
14
|
+
|---|---|
|
|
15
|
+
| autoconf, automake, cmake, ninja-build, make | Build tooling |
|
|
16
|
+
| build-essential, gcc, llvm | C/C++ compiler toolchain |
|
|
17
|
+
| libssl-dev, libffi-dev, libreadline-dev, libsqlite3-dev, + ~30 more libs | Dev headers for language runtimes |
|
|
18
|
+
| bat | `cat` with syntax highlighting |
|
|
19
|
+
| curl, wget, httpie | HTTP clients |
|
|
20
|
+
| fzf | Fuzzy finder |
|
|
21
|
+
| git, git-lfs | Version control |
|
|
22
|
+
| gnupg, gpg | Cryptography |
|
|
23
|
+
| graphviz, imagemagick, tesseract-ocr, ghostscript | Graphics / OCR |
|
|
24
|
+
| jq, yq | JSON/YAML processors (system fallback; asdf versions take precedence) |
|
|
25
|
+
| neovim, vim, tmux | Terminal editors / multiplexer |
|
|
26
|
+
| pgcli, pgloader | PostgreSQL clients |
|
|
27
|
+
| pipx | Python CLI tool installer (system fallback; asdf version used at runtime) |
|
|
28
|
+
| redis-server | In-container Redis |
|
|
29
|
+
| ripgrep | Fast grep |
|
|
30
|
+
| shellcheck, shfmt | Shell script linting / formatting |
|
|
31
|
+
| sqlite3, libsqlite3-dev | SQLite |
|
|
32
|
+
| procps, tree, lsof, rsync, unzip | General utilities |
|
|
33
|
+
| zsh, locales | Shell + locale |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## PostgreSQL 18 (PGDG apt repo)
|
|
38
|
+
|
|
39
|
+
Added via the [official PGDG apt repository](https://www.postgresql.org/download/linux/ubuntu/).
|
|
40
|
+
|
|
41
|
+
| Package | Version | Notes |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| postgresql-18 | latest 18.x | Server |
|
|
44
|
+
| postgresql-client-18 | latest 18.x | `psql` client |
|
|
45
|
+
| libpq-dev | latest 18.x | C headers for psql bindings |
|
|
46
|
+
|
|
47
|
+
To upgrade: update the PGDG source list in the Dockerfile and rebuild.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 1Password CLI
|
|
52
|
+
|
|
53
|
+
Installed via the [official 1Password apt repo](https://developer.1password.com/docs/cli/get-started/).
|
|
54
|
+
|
|
55
|
+
| Tool | Command | Purpose |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| 1Password CLI | `op` | `op run` wraps MCP server commands with secrets from 1Password vaults (cloudflare, porkbun MCP servers) |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Language runtimes (asdf)
|
|
62
|
+
|
|
63
|
+
All managed by [asdf](https://asdf-vm.com/) v0.18.1. `ASDF_DATA_DIR=/home/vscode/.asdf`.
|
|
64
|
+
Version specs use `latest:N` to pin major while tracking minor/patch updates.
|
|
65
|
+
|
|
66
|
+
| Plugin | Version spec | Command(s) | Notes |
|
|
67
|
+
|---|---|---|---|
|
|
68
|
+
| python | `latest:3` | `python3`, `pip3` | Primary Python runtime |
|
|
69
|
+
| nodejs | `lts` | `node`, `npm` | LTS line |
|
|
70
|
+
| ruby | `latest:4` | `ruby`, `gem` | Ruby 4.x |
|
|
71
|
+
| golang | `latest:1` | `go` | Go 1.x |
|
|
72
|
+
| rust | `stable` | `cargo`, `rustc`, `rustup` | Stable toolchain |
|
|
73
|
+
| bun | `latest:1` | `bun`, `bunx` | JS runtime / bundler |
|
|
74
|
+
| pnpm | `latest:10` | `pnpm`, `pnpx` | pnpm 10.x |
|
|
75
|
+
| deno | `latest` | `deno` | Deno runtime |
|
|
76
|
+
| awscli | `latest:2` | `aws` | AWS CLI v2 |
|
|
77
|
+
| gcloud | `latest` | `gcloud`, `gsutil` | Google Cloud SDK |
|
|
78
|
+
| pipx | `latest:1` | `pipx` | Python CLI tool isolation |
|
|
79
|
+
| supabase-cli | `latest` | `supabase` | Supabase management CLI |
|
|
80
|
+
| yarn | `latest` | `yarn` | Yarn package manager |
|
|
81
|
+
| jq | `latest` | `jq` | JSON processor (asdf version shadows apt) |
|
|
82
|
+
| yq | `latest` | `yq` | YAML/JSON processor |
|
|
83
|
+
| just | `latest` | `just` | Command runner (Justfile) |
|
|
84
|
+
|
|
85
|
+
To add a new asdf plugin: `asdf plugin add <name> && asdf install <name> latest && asdf set -u <name> latest`
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Package managers
|
|
90
|
+
|
|
91
|
+
| Tool | Install method | Purpose |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| uv | `curl -LsSf https://astral.sh/uv/install.sh` → `/usr/local/bin` | Fast Python package/project manager |
|
|
94
|
+
| pipx | asdf (listed above) | Isolated Python CLI tool environments |
|
|
95
|
+
| pnpm | asdf (listed above) | Node package manager |
|
|
96
|
+
| yarn | asdf (listed above) | Node package manager |
|
|
97
|
+
| volta | `curl https://get.volta.sh` → `/usr/local/share/volta` | Supplemental JS toolchain for volta-pinned repos |
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## CLI tools — Rust / cargo
|
|
102
|
+
|
|
103
|
+
Installed with `CARGO_INSTALL_ROOT=/usr/local` → binaries land in `/usr/local/bin/`.
|
|
104
|
+
|
|
105
|
+
| Crate | Command | Purpose |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| diskus | `diskus` | Fast `du` replacement |
|
|
108
|
+
| du-dust | `dust` | Directory size visualiser |
|
|
109
|
+
| eza | `eza` | Modern `ls` replacement |
|
|
110
|
+
| hyperfine | `hyperfine` | CLI benchmarking tool |
|
|
111
|
+
| procs | `procs` | Modern `ps` replacement |
|
|
112
|
+
| sad | `sad` | CLI search-and-replace (stream ed) |
|
|
113
|
+
| git-delta | `delta` | Syntax-highlighted git diffs |
|
|
114
|
+
|
|
115
|
+
To add a cargo tool: add to the `cargo install` block in the Dockerfile and add a row here.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## CLI tools — Go
|
|
120
|
+
|
|
121
|
+
Installed with `GOPATH=/usr/local` → binaries land in `/usr/local/bin/`.
|
|
122
|
+
|
|
123
|
+
| Module | Command | Purpose |
|
|
124
|
+
|---|---|---|
|
|
125
|
+
| `github.com/steveyegge/beads/cmd/bd` | `bd` | Beads task manager (Claude Code plugin) |
|
|
126
|
+
| `golang.org/x/tools/cmd/stringer` | `stringer` | Go generate string methods for types |
|
|
127
|
+
| `github.com/gastownhall/gastown/cmd/gt` | `gt` | Multi-agent workspace manager |
|
|
128
|
+
| `github.com/walles/moor/v2/cmd/moor` | `moor` | Terminal pager (used as PAGER / MANPAGER) |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## CLI tools — npm globals
|
|
133
|
+
|
|
134
|
+
Installed with `npm install -g` into the asdf-managed Node installation.
|
|
135
|
+
After install, `asdf reshim nodejs` regenerates shims in `$ASDF_DATA_DIR/shims/`.
|
|
136
|
+
|
|
137
|
+
| Package | Command | Purpose |
|
|
138
|
+
|---|---|---|
|
|
139
|
+
| `@anthropic-ai/claude-code` | `claude` | Claude Code CLI |
|
|
140
|
+
| `@devcontainers/cli` | `devcontainer` | Dev Containers CLI |
|
|
141
|
+
| `@google/gemini-cli` | `gemini` | Google Gemini CLI |
|
|
142
|
+
| `tsx` | `tsx` | TypeScript execute (ts-node alternative) |
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## CLI tools — binary releases (GitHub)
|
|
147
|
+
|
|
148
|
+
Architecture-aware: ARM64 or amd64 selected at build time via `uname -m`.
|
|
149
|
+
|
|
150
|
+
| Tool | GitHub repo | Command | Purpose |
|
|
151
|
+
|---|---|---|---|
|
|
152
|
+
| dolt | `dolthub/dolt` | `dolt` | Git for data — versioned SQL database |
|
|
153
|
+
| glow | `charmbracelet/glow` | `glow` | Markdown renderer for the terminal |
|
|
154
|
+
| mkcert | `FiloSottile/mkcert` | `mkcert` | Local CA and TLS certificate generator |
|
|
155
|
+
| step | `smallstep/cli` | `step` | Smallstep certificate + PKI CLI |
|
|
156
|
+
|
|
157
|
+
All binaries installed to `/usr/local/bin/`.
|
|
158
|
+
To upgrade, bump the `latest` release logic in the Dockerfile or pin a tag.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Python tools (pipx)
|
|
163
|
+
|
|
164
|
+
Installed with `PIPX_HOME=/usr/local/pipx` and `PIPX_BIN_DIR=/usr/local/bin`.
|
|
165
|
+
Executables land directly in `/usr/local/bin/`.
|
|
166
|
+
|
|
167
|
+
| Package | Commands | Purpose |
|
|
168
|
+
|---|---|---|
|
|
169
|
+
| sqlfluff | `sqlfluff` | SQL linter and formatter |
|
|
170
|
+
| csvkit | `csvcut`, `csvjoin`, `csvstat`, `in2csv`, `sql2csv`, + more | CSV Swiss army knife |
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## oh-my-posh
|
|
175
|
+
|
|
176
|
+
Installed via `curl -s https://ohmyposh.dev/install.sh` to `/usr/local/bin/oh-my-posh`.
|
|
177
|
+
Theme configured in `.devcontainer/.mytheme.omp.yaml` (copied into the container image).
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## AI / agent tools summary
|
|
182
|
+
|
|
183
|
+
| Tool | Source | Notes |
|
|
184
|
+
|---|---|---|
|
|
185
|
+
| claude (Claude Code) | npm: `@anthropic-ai/claude-code` | Alias `claude='claude --dangerously-skip-permissions'` set in .zshrc |
|
|
186
|
+
| gemini-cli | npm: `@google/gemini-cli` | Google Gemini terminal agent |
|
|
187
|
+
| beads (`bd`) | Go: `github.com/steveyegge/beads` | Task management for Claude Code |
|
|
188
|
+
| gastown (`gt`) | Go: `github.com/gastownhall/gastown` | Multi-agent workspace orchestration; depends on dolt |
|
|
189
|
+
| opencode | **not yet installed** | Binary not on npm; TODO: add GitHub release download when stable |
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Devcontainer features
|
|
194
|
+
|
|
195
|
+
| Feature | Purpose |
|
|
196
|
+
|---|---|
|
|
197
|
+
| `ghcr.io/devcontainers/features/docker-in-docker:2` | Docker daemon inside the container (non-root enabled) |
|
|
198
|
+
| `ghcr.io/devcontainers/features/node:1` | Configures npm global prefix for non-root user |
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Changelog
|
|
203
|
+
|
|
204
|
+
| Date | Change |
|
|
205
|
+
|---|---|
|
|
206
|
+
| 2026-05-21 | Initial comprehensive install: PostgreSQL 18, 1Password CLI, deno, just, eza, diskus, du-dust, hyperfine, procs, sad, git-delta, beads, stringer, gastown, moor, oh-my-posh, uv, volta, dolt, glow, mkcert, step, sqlfluff, csvkit, @anthropic-ai/claude-code, @devcontainers/cli, @google/gemini-cli, tsx |
|
|
207
|
+
| 2026-05-21 | Bug fix: asdf `ASDF_DATA_DIR=/home/vscode/.asdf` so runtime user can access shims |
|
|
208
|
+
| 2026-05-21 | Bug fix: removed ghost Homebrew init from .zshrc |
|
|
209
|
+
| 2026-05-21 | Added macOS path alias `/Users/joe → /home/vscode` for settings.json MCP path compat |
|
|
210
|
+
| 2026-05-21 | Added mounts: ~/.agents, ~/.gitconfig, ~/.config/gh, ~/github/joeblackwaslike |
|
|
211
|
+
| 2026-05-21 | Added remoteEnv passthrough for all API keys |
|
|
212
|
+
| 2026-05-21 | Added discover-deps.sh auto-dependency install on attach |
|
|
213
|
+
| 2026-05-21 | Added init-project.sh CLI for bootstrapping new projects |
|
|
214
|
+
| 2026-05-21 | Added mounts: ~/.gemini (Gemini CLI), ~/.codex (Codex/openclaw), ~/.openclaw (openclaw workspace) |
|
|
215
|
+
| 2026-05-21 | Added OP_SERVICE_ACCOUNT_TOKEN to remoteEnv (1Password CLI — no socket on this host) |
|