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.
Files changed (138) hide show
  1. package/README.md +82 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +96 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/prompts.d.ts +17 -0
  7. package/dist/prompts.d.ts.map +1 -0
  8. package/dist/prompts.js +264 -0
  9. package/dist/prompts.js.map +1 -0
  10. package/dist/scaffold.d.ts +5 -0
  11. package/dist/scaffold.d.ts.map +1 -0
  12. package/dist/scaffold.js +128 -0
  13. package/dist/scaffold.js.map +1 -0
  14. package/dist/transforms/devcontainer.d.ts +3 -0
  15. package/dist/transforms/devcontainer.d.ts.map +1 -0
  16. package/dist/transforms/devcontainer.js +8 -0
  17. package/dist/transforms/devcontainer.js.map +1 -0
  18. package/dist/transforms/docker.d.ts +3 -0
  19. package/dist/transforms/docker.d.ts.map +1 -0
  20. package/dist/transforms/docker.js +11 -0
  21. package/dist/transforms/docker.js.map +1 -0
  22. package/dist/transforms/docs.d.ts +3 -0
  23. package/dist/transforms/docs.d.ts.map +1 -0
  24. package/dist/transforms/docs.js +22 -0
  25. package/dist/transforms/docs.js.map +1 -0
  26. package/dist/transforms/documentation.d.ts +3 -0
  27. package/dist/transforms/documentation.d.ts.map +1 -0
  28. package/dist/transforms/documentation.js +37 -0
  29. package/dist/transforms/documentation.js.map +1 -0
  30. package/dist/transforms/github-actions.d.ts +3 -0
  31. package/dist/transforms/github-actions.d.ts.map +1 -0
  32. package/dist/transforms/github-actions.js +48 -0
  33. package/dist/transforms/github-actions.js.map +1 -0
  34. package/dist/transforms/index.d.ts +3 -0
  35. package/dist/transforms/index.d.ts.map +1 -0
  36. package/dist/transforms/index.js +24 -0
  37. package/dist/transforms/index.js.map +1 -0
  38. package/dist/transforms/license.d.ts +3 -0
  39. package/dist/transforms/license.d.ts.map +1 -0
  40. package/dist/transforms/license.js +19 -0
  41. package/dist/transforms/license.js.map +1 -0
  42. package/dist/transforms/npm-publish.d.ts +3 -0
  43. package/dist/transforms/npm-publish.d.ts.map +1 -0
  44. package/dist/transforms/npm-publish.js +15 -0
  45. package/dist/transforms/npm-publish.js.map +1 -0
  46. package/dist/transforms/package-manager.d.ts +3 -0
  47. package/dist/transforms/package-manager.d.ts.map +1 -0
  48. package/dist/transforms/package-manager.js +31 -0
  49. package/dist/transforms/package-manager.js.map +1 -0
  50. package/dist/types.d.ts +116 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +52 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/update.d.ts +2 -0
  55. package/dist/update.d.ts.map +1 -0
  56. package/dist/update.js +207 -0
  57. package/dist/update.js.map +1 -0
  58. package/package.json +94 -0
  59. package/template/.commitlintrc.json +3 -0
  60. package/template/.devcontainer/.zshrc +159 -0
  61. package/template/.devcontainer/DISCOVER-DEPS.md +109 -0
  62. package/template/.devcontainer/README.md +223 -0
  63. package/template/.devcontainer/SETUP.md +191 -0
  64. package/template/.devcontainer/TOOLS.md +215 -0
  65. package/template/.devcontainer/devcontainer.json +106 -0
  66. package/template/.devcontainer/scripts/init-project.sh +167 -0
  67. package/template/.editorconfig +12 -0
  68. package/template/.github/.release-please-manifest.json +3 -0
  69. package/template/.github/ISSUE_TEMPLATE/bug_report.md +21 -0
  70. package/template/.github/ISSUE_TEMPLATE/feature_request.md +14 -0
  71. package/template/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  72. package/template/.github/actions/setup-node-env/action.yml +20 -0
  73. package/template/.github/dependabot.yml +17 -0
  74. package/template/.github/labeler.yml +17 -0
  75. package/template/.github/release-please-config.json +7 -0
  76. package/template/.github/workflows/ci.yml +95 -0
  77. package/template/.github/workflows/codeql.yml +31 -0
  78. package/template/.github/workflows/labeler.yml +18 -0
  79. package/template/.github/workflows/release-please.yml +72 -0
  80. package/template/.github/workflows/stale.yml +32 -0
  81. package/template/.husky/commit-msg +1 -0
  82. package/template/.husky/pre-commit +1 -0
  83. package/template/.nvmrc +1 -0
  84. package/template/.vscode/extensions.json +11 -0
  85. package/template/.vscode/settings.json +12 -0
  86. package/template/AGENTS.md +1 -0
  87. package/template/CHANGELOG.md +11 -0
  88. package/template/CLAUDE.md +0 -0
  89. package/template/CONTRIBUTING.md +22 -0
  90. package/template/Dockerfile +21 -0
  91. package/template/LICENSE.Apache-2.0 +17 -0
  92. package/template/LICENSE.BSD-3-Clause +28 -0
  93. package/template/LICENSE.GPL-3.0 +17 -0
  94. package/template/LICENSE.ISC +15 -0
  95. package/template/LICENSE.MIT +21 -0
  96. package/template/README.md +62 -0
  97. package/template/biome.json +49 -0
  98. package/template/docker-compose.yml +7 -0
  99. package/template/docs/architecture/api-layer.md +44 -0
  100. package/template/docs/architecture/constitution.md +24 -0
  101. package/template/docs/architecture/data-model.md +24 -0
  102. package/template/docs/architecture/index.md +15 -0
  103. package/template/docs/architecture/project.md +24 -0
  104. package/template/docs/architecture/quality-checks.md +28 -0
  105. package/template/docs/architecture/testing-plan.md +35 -0
  106. package/template/docs/architecture/ui.md +37 -0
  107. package/template/docs/changelog.md +9 -0
  108. package/template/docs/contributing.md +46 -0
  109. package/template/docs/developer-guide/architecture.md +22 -0
  110. package/template/docs/developer-guide/contributing.md +30 -0
  111. package/template/docs/developer-guide/data-model.md +25 -0
  112. package/template/docs/developer-guide/index.md +12 -0
  113. package/template/docs/developer-guide/testing.md +40 -0
  114. package/template/docs/examples.md +37 -0
  115. package/template/docs/getting-started.md +42 -0
  116. package/template/docs/installation.md +45 -0
  117. package/template/docs/intro.md +60 -0
  118. package/template/docs/post-mortems/.gitkeep +0 -0
  119. package/template/docs/reference/cli.md +32 -0
  120. package/template/docs/reference/configuration.md +33 -0
  121. package/template/docs/reference/hooks.md +27 -0
  122. package/template/docs/research/competitor-analysis.md +21 -0
  123. package/template/docs/research/real-world-demand.md +21 -0
  124. package/template/docs/user-guide/configuration.md +32 -0
  125. package/template/docs/user-guide/features.md +21 -0
  126. package/template/docs/user-guide/how-it-works.md +29 -0
  127. package/template/docs/user-guide/index.md +11 -0
  128. package/template/docusaurus.config.ts +93 -0
  129. package/template/eslint.config.mjs +66 -0
  130. package/template/justfile +51 -0
  131. package/template/package.json +88 -0
  132. package/template/pnpm-workspace.yaml +8 -0
  133. package/template/sidebars.ts +72 -0
  134. package/template/src/index.ts +3 -0
  135. package/template/static/img/logo.svg +4 -0
  136. package/template/tests/index.test.ts +8 -0
  137. package/template/tsconfig.json +23 -0
  138. 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) |