no-more-configs 1.3.0 → 1.3.2
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 +655 -22
- package/package.json +26 -5
package/README.md
CHANGED
|
@@ -1,44 +1,677 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# NO MORE CONFIGS
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**A clone-and-go VS Code devcontainer built for Claude Code. Codex CLI included as an optional second agent.**
|
|
6
|
+
|
|
7
|
+
**Install. Open. Code.**
|
|
8
|
+
|
|
9
|
+
**Free, transparent, and fully customizable. No subscription walls, no black-box abstractions — just a devcontainer you own and control. For developers who'd rather read the source than trust the vendor.**
|
|
10
|
+
|
|
11
|
+
[](https://github.com/agomusio/no-more-configs)
|
|
12
|
+
[](LICENSE)
|
|
13
|
+
[](https://github.com/agomusio/no-more-configs/releases/latest)
|
|
14
|
+
[](https://www.npmjs.com/package/no-more-configs)
|
|
15
|
+
|
|
16
|
+
<br>
|
|
17
|
+
|
|
18
|
+
<pre>npx no-more-configs@latest</pre>
|
|
19
|
+
|
|
20
|
+
**Works on Windows (WSL2 + Docker Desktop) and Linux (Docker Engine).**
|
|
21
|
+
|
|
22
|
+
<br>
|
|
23
|
+
|
|
24
|
+
_"I spent weekends configuring Claude, Docker, and everything else — now you don't have to."_
|
|
25
|
+
|
|
26
|
+
<br>
|
|
27
|
+
|
|
28
|
+
[What You Get](#what-you-get) · [Quick Start](#quick-start) · [How It Works](#how-it-works) · [Plugin System](#plugin-system) · [Agent Config](#agent-config)
|
|
29
|
+
<br>
|
|
30
|
+
[Architecture](#architecture) · [Firewall](#firewall) · [MCP Servers](#mcp-servers) · [GSD Framework](#gsd-framework) · [Langfuse Tracing](#langfuse-tracing)
|
|
31
|
+
<br>
|
|
32
|
+
[Shell Shortcuts](#shell-shortcuts) · [Project Structure](#project-structure) · [Customization](#customization) · [Troubleshooting](#troubleshooting) · [Known Issues](#known-issues)
|
|
33
|
+
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div align="center">
|
|
37
|
+
<pre>
|
|
38
|
+
| You Container |
|
|
39
|
+
| │ ├── Claude Code CLI + Codex CLI |
|
|
40
|
+
| ├── config.json ──────────► ├── Firewall domains |
|
|
41
|
+
| │ (settings) ├── VS Code settings |
|
|
42
|
+
| │ ├── MCP server config |
|
|
43
|
+
| ├── secrets.json ─────────► ├── Claude + Codex auth tokens |
|
|
44
|
+
| │ (credentials) ├── Git identity |
|
|
45
|
+
| │ ├── Plugin env vars (hydrated) |
|
|
46
|
+
| ├── agent-config/plugins/ ► └── Hooks, commands, agents, skills, MCP |
|
|
47
|
+
| │ (self-registering) |
|
|
48
|
+
| └── Open in Container ────► Done. |
|
|
49
|
+
</pre>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## What You Get
|
|
55
|
+
|
|
56
|
+
| Feature | Description | Status |
|
|
57
|
+
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | -------------- |
|
|
58
|
+
| **Claude Code** | Anthropic's agentic coding CLI — Opus 4.6, high effort, permissions bypassed. **Only requires a Claude Pro/Max subscription.** | Out of the box |
|
|
59
|
+
| **Codex CLI** | OpenAI's agentic coding CLI — GPT-5.3-Codex, full-auto mode. Optional, requires separate ChatGPT Plus/Pro subscription. | Out of the box |
|
|
60
|
+
| **Plugin system** | Drop a directory with a `plugin.json` to register hooks, env vars, commands, agents, MCP servers | Out of the box |
|
|
61
|
+
| **GSD framework** | 30+ slash commands and 11 specialized agents for structured development | Out of the box |
|
|
62
|
+
| **BMAD Method** | AI-driven agile development framework — 21+ specialized agents, 50+ guided workflows (PRD, architecture, epics, QA) | Out of the box |
|
|
63
|
+
| **PostgreSQL client** | `psql` CLI for connecting to Postgres databases | Out of the box |
|
|
64
|
+
| **iptables firewall** | Default-deny network with domain whitelist (47 core domains), disable via `config.json` | Out of the box |
|
|
65
|
+
| **Oh-My-Zsh** | Powerlevel10k, fzf, git-delta, GitHub CLI | Out of the box |
|
|
66
|
+
| **Langfuse observability** | Self-hosted tracing — every conversation traced to a local dashboard | Opt-in |
|
|
67
|
+
| **MCP gateway** | Model Context Protocol tool access via Docker MCP Gateway | Opt-in |
|
|
68
|
+
| **Codex MCP server** | Let Claude delegate to Codex mid-session | Opt-in |
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Quick Start
|
|
73
|
+
|
|
74
|
+
### Prerequisites
|
|
75
|
+
|
|
76
|
+
- [Node.js](https://nodejs.org/) >= 18 (for npx)
|
|
77
|
+
- [VS Code](https://code.visualstudio.com/) with the [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension
|
|
78
|
+
|
|
79
|
+
**Windows:**
|
|
80
|
+
- [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install) enabled
|
|
81
|
+
- [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/) running (WSL2 backend)
|
|
82
|
+
|
|
83
|
+
**Linux:**
|
|
84
|
+
- [Docker Engine](https://docs.docker.com/engine/install/) with [buildx plugin](https://docs.docker.com/build/install-buildx/)
|
|
85
|
+
|
|
86
|
+
### 1. Install and Open
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npx no-more-configs@latest
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Or clone manually:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
git clone https://github.com/agomusio/no-more-configs.git
|
|
96
|
+
cd no-more-configs
|
|
97
|
+
code .
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
This clones the repo, prints next steps, and tries to open VS Code automatically. You can also specify a directory: `npx no-more-configs my-workspace`.
|
|
101
|
+
|
|
102
|
+
> **Alternative:** `git clone https://github.com/agomusio/no-more-configs.git && cd no-more-configs && code .`
|
|
103
|
+
|
|
104
|
+
VS Code will detect the devcontainer and prompt to reopen in container. Click **Reopen in Container** (or use `Ctrl+Shift+P` → `Dev Containers: Reopen in Container`).
|
|
105
|
+
|
|
106
|
+
First build takes a few minutes. Subsequent opens are fast.
|
|
107
|
+
|
|
108
|
+
### 2. Authenticate
|
|
109
|
+
|
|
110
|
+
Once the container is running, authenticate Claude Code:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
claude # Follow OAuth prompts (requires Claude Pro/Max subscription)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Optionally, authenticate Codex CLI if you have a ChatGPT Plus/Pro subscription:
|
|
6
117
|
|
|
7
118
|
```bash
|
|
8
|
-
|
|
119
|
+
codex # Follow OAuth prompts (optional — separate subscription)
|
|
9
120
|
```
|
|
10
121
|
|
|
11
|
-
|
|
122
|
+
Set your git identity:
|
|
12
123
|
|
|
13
|
-
|
|
124
|
+
```bash
|
|
125
|
+
git config --global user.name "Your Name"
|
|
126
|
+
git config --global user.email "you@example.com"
|
|
127
|
+
```
|
|
14
128
|
|
|
15
|
-
|
|
129
|
+
Then capture everything so it survives container rebuilds:
|
|
16
130
|
|
|
17
131
|
```bash
|
|
18
|
-
|
|
132
|
+
save-secrets
|
|
19
133
|
```
|
|
20
134
|
|
|
21
|
-
|
|
135
|
+
### 3. Clone Your Projects
|
|
22
136
|
|
|
23
|
-
|
|
137
|
+
Your repos live in `projects/` — clone them there and register them in `config.json` so VS Code's git scanner picks them up:
|
|
24
138
|
|
|
139
|
+
```bash
|
|
140
|
+
cd /workspace/projects
|
|
141
|
+
git clone https://github.com/you/your-repo.git
|
|
25
142
|
```
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
143
|
+
|
|
144
|
+
Then add the path to `config.json → vscode.git_scan_paths`:
|
|
145
|
+
|
|
146
|
+
```json
|
|
147
|
+
{ "vscode": { "git_scan_paths": ["projects/your-repo"] } }
|
|
29
148
|
```
|
|
30
149
|
|
|
31
|
-
|
|
150
|
+
Each project can have its own `CLAUDE.md` for project-specific agent instructions, and `.claude/plugins/` for project-scoped plugins that are auto-installed alongside the global ones.
|
|
32
151
|
|
|
33
|
-
|
|
34
|
-
- [Git](https://git-scm.com/)
|
|
35
|
-
- [VS Code](https://code.visualstudio.com/) with the [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension
|
|
36
|
-
- [Docker Desktop](https://www.docker.com/products/docker-desktop/) (Windows) or [Docker Engine](https://docs.docker.com/engine/install/) (Linux)
|
|
152
|
+
### 4. Start the Langfuse Stack (Optional)
|
|
37
153
|
|
|
38
|
-
|
|
154
|
+
If you want conversation tracing:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
langfuse-setup
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
This generates credentials (into `secrets.json`), starts the stack, and verifies health. View traces at `http://localhost:3052`.
|
|
161
|
+
|
|
162
|
+
### 5. Done
|
|
163
|
+
|
|
164
|
+
Start coding:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
claude # Claude Code (Opus 4.6, high effort, permissions bypassed)
|
|
168
|
+
clauder # Resume a recent Claude session
|
|
169
|
+
codex # Codex CLI (GPT-5.3-Codex, full-auto mode)
|
|
170
|
+
codexr # Resume a recent Codex session
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Your projects go in `projects/`. Clone repos there and they'll be auto-detected by VS Code's git scanner.
|
|
174
|
+
|
|
175
|
+
### 5. Updating
|
|
176
|
+
|
|
177
|
+
**From the host** (outside the container):
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
npx no-more-configs@latest
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**From inside the container:**
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
nmc-update
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Both pull the latest changes and tell you if a container rebuild is needed. The container shell also shows a notification banner when a new version is available.
|
|
190
|
+
|
|
191
|
+
## How It Works
|
|
192
|
+
|
|
193
|
+
### Two-File Configuration
|
|
194
|
+
|
|
195
|
+
Everything is driven by two files at the repo root:
|
|
196
|
+
|
|
197
|
+
**`config.json`** — non-secret settings (created by `save-config`):
|
|
198
|
+
|
|
199
|
+
```json
|
|
200
|
+
{
|
|
201
|
+
"firewall": { "extra_domains": ["your-api.example.com"] },
|
|
202
|
+
"codex": { "model": "gpt-5.3-codex", "skip_dirs": [] },
|
|
203
|
+
"langfuse": { "host": "http://host.docker.internal:3052" },
|
|
204
|
+
"vscode": { "git_scan_paths": ["projects/my-project"] },
|
|
205
|
+
"mcp_servers": {
|
|
206
|
+
"mcp-gateway": { "enabled": false },
|
|
207
|
+
"codex": { "enabled": false, "targets": ["claude"] }
|
|
208
|
+
},
|
|
209
|
+
"plugins": { "nmc-langfuse-tracing": { "enabled": false } }
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**`secrets.json`** (gitignored) — credentials and plugin secrets:
|
|
214
|
+
|
|
215
|
+
```json
|
|
216
|
+
{
|
|
217
|
+
"git": { "name": "Your Name", "email": "you@example.com" },
|
|
218
|
+
"claude": { "credentials": { "...auth tokens..." } },
|
|
219
|
+
"codex": { "auth": { "...oauth tokens..." } },
|
|
220
|
+
"gh": { "oauth_token": "...", "user": "...", "git_protocol": "https" },
|
|
221
|
+
"npm": { "auth_token": "npm_..." },
|
|
222
|
+
"infra": {
|
|
223
|
+
"postgres_password": "...", "encryption_key": "...", "nextauth_secret": "...",
|
|
224
|
+
"salt": "...", "clickhouse_password": "...", "minio_root_password": "...",
|
|
225
|
+
"redis_auth": "...", "langfuse_project_public_key": "...",
|
|
226
|
+
"langfuse_project_secret_key": "...", "langfuse_user_email": "...",
|
|
227
|
+
"langfuse_user_name": "...", "langfuse_user_password": "...",
|
|
228
|
+
"langfuse_org_name": "..."
|
|
229
|
+
},
|
|
230
|
+
"nmc-langfuse-tracing": { "LANGFUSE_HOST": "...", "LANGFUSE_PUBLIC_KEY": "...", "LANGFUSE_SECRET_KEY": "..." }
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
| Key | Source | Captured by |
|
|
235
|
+
| ---------------------- | ------------------------------------ | --------------------------------- |
|
|
236
|
+
| `git` | `git config --global` | `save-secrets` |
|
|
237
|
+
| `claude` | `~/.claude/.credentials.json` | `save-secrets` |
|
|
238
|
+
| `codex` | `~/.codex/auth.json` | `save-secrets` |
|
|
239
|
+
| `gh` | `~/.config/gh/hosts.yml` | `save-secrets` |
|
|
240
|
+
| `npm` | `~/.npmrc` | `save-secrets` |
|
|
241
|
+
| `infra` | `infra/.env` (Langfuse stack) | `langfuse-setup` → `save-secrets` |
|
|
242
|
+
| `nmc-langfuse-tracing` | Derived from `infra` + `config.json` | `save-secrets` |
|
|
243
|
+
|
|
244
|
+
Plugin secrets use namespaced keys (`secrets.json["plugin-name"]["TOKEN"]`). The `infra` section holds Langfuse stack infrastructure secrets. Run `langfuse-setup` to generate these automatically — `save-secrets` derives the plugin namespace from the infra keys.
|
|
245
|
+
|
|
246
|
+
On container creation, `install-agent-config.sh` reads both files, discovers plugins, hydrates `{{TOKEN}}` placeholders, and generates all runtime configuration. On container start, the firewall and MCP servers are initialized from the generated files.
|
|
247
|
+
|
|
248
|
+
> **Important:** All hooks, env vars, and functional settings must be in `settings.json`. Never use `settings.local.json` for hooks or env vars — Claude Code does not execute hooks defined there. The install script merges everything (template + plugins + GSD) into `~/.claude/settings.json`.
|
|
249
|
+
|
|
250
|
+
### Credential Persistence
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
authenticate Claude/Codex → set git identity → save-secrets → secrets.json → rebuild → auto-restored
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
`save-secrets` captures live Claude credentials, Codex credentials, git identity, infrastructure secrets, and derives plugin secret namespaces. The install script restores them on the next rebuild. Delete `secrets.json` to start fresh.
|
|
257
|
+
|
|
258
|
+
### Pre-configured Defaults
|
|
259
|
+
|
|
260
|
+
Both CLI agents are pre-configured for container use — no interactive prompts on subsequent starts:
|
|
261
|
+
|
|
262
|
+
| Setting | Claude Code | Codex CLI |
|
|
263
|
+
| --------------- | ------------------------------------------ | ---------------------------------------------- |
|
|
264
|
+
| **Permissions** | Bypassed (`bypassPermissions` in settings) | Bypassed (`approval_policy = "never"`) |
|
|
265
|
+
| **Model** | Opus 4.6 (high effort) | GPT-5.3-Codex (configurable via `config.json`) |
|
|
266
|
+
| **Credentials** | `~/.claude/.credentials.json` | `~/.codex/auth.json` (file-based, no keyring) |
|
|
267
|
+
| **MCP** | `~/.claude/.mcp.json` | `config.toml [mcp_servers.*]` |
|
|
268
|
+
| **Onboarding** | Skipped when credentials present | Workspace pre-trusted |
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Plugin System
|
|
273
|
+
|
|
274
|
+
Plugins are self-registering bundles discovered from `agent-config/plugins/*/plugin.json`. Each manifest can declare:
|
|
275
|
+
|
|
276
|
+
- **hooks** — registered in settings.json (multiple plugins accumulate on same events)
|
|
277
|
+
- **env** — injected with `{{TOKEN}}` placeholder hydration from `secrets.json[plugin-name][TOKEN]`
|
|
278
|
+
- **mcp_servers** — merged into `.mcp.json` with `_source` tagging for persistence
|
|
279
|
+
- **files** — skills, hooks, commands, agents copied to `~/.claude/` (skills and commands also mirrored to `~/.codex/`)
|
|
280
|
+
|
|
281
|
+
### Creating a Plugin
|
|
282
|
+
|
|
283
|
+
```
|
|
284
|
+
agent-config/plugins/my-plugin/
|
|
285
|
+
├── plugin.json # Manifest (required)
|
|
286
|
+
├── hooks/ # Hook scripts
|
|
287
|
+
├── commands/ # Slash commands (*.md)
|
|
288
|
+
├── agents/ # Agent definitions (*.md)
|
|
289
|
+
└── skills/ # Skills directories
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Minimal `plugin.json`:
|
|
293
|
+
|
|
294
|
+
```json
|
|
295
|
+
{
|
|
296
|
+
"name": "my-plugin",
|
|
297
|
+
"version": "1.0.0",
|
|
298
|
+
"description": "What this plugin does",
|
|
299
|
+
"hooks": {
|
|
300
|
+
"Stop": [
|
|
301
|
+
{
|
|
302
|
+
"type": "command",
|
|
303
|
+
"command": "python3 /home/node/.claude/hooks/my_hook.py"
|
|
304
|
+
}
|
|
305
|
+
]
|
|
306
|
+
},
|
|
307
|
+
"env": {
|
|
308
|
+
"MY_VAR": "value",
|
|
309
|
+
"MY_SECRET": "{{MY_SECRET}}"
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
Only declare fields you use — no empty arrays needed.
|
|
315
|
+
|
|
316
|
+
### Plugin Control
|
|
317
|
+
|
|
318
|
+
Most plugins are enabled by default. Some opt-in plugins (like `nmc-langfuse-tracing`) are disabled by default. Enable or disable any plugin via `config.json`:
|
|
319
|
+
|
|
320
|
+
```json
|
|
321
|
+
{ "plugins": { "my-plugin": { "enabled": false } } }
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Override env vars via `config.json`:
|
|
325
|
+
|
|
326
|
+
```json
|
|
327
|
+
{ "plugins": { "my-plugin": { "env": { "MY_VAR": "override-value" } } } }
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Validation
|
|
331
|
+
|
|
332
|
+
The install script validates plugins and provides clear feedback:
|
|
333
|
+
|
|
334
|
+
- Missing hook scripts → plugin skipped with warning
|
|
335
|
+
- File conflicts between plugins → first-wins with warning
|
|
336
|
+
- Invalid `plugin.json` → friendly error + raw parse details
|
|
337
|
+
- Unresolved `{{TOKEN}}` placeholders → warning (non-fatal)
|
|
338
|
+
- All warnings recapped after install summary
|
|
339
|
+
|
|
340
|
+
### Included Plugins
|
|
341
|
+
|
|
342
|
+
| Plugin | Description |
|
|
343
|
+
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
344
|
+
| `nmc` | NMC system status command (`/nmc`) |
|
|
345
|
+
| `nmc-langfuse-tracing` | Claude Code conversation tracing to Langfuse (Stop hook + env vars) |
|
|
346
|
+
| `plugin-dev` | Plugin development guidance ([source](https://github.com/anthropics/claude-code/tree/main/plugins/plugin-dev)) |
|
|
347
|
+
| `nmc-ralph-loop` | Ralph Wiggum technique for iterative, self-referential AI development loops (forked from [ralph-wiggum](https://github.com/anthropics/claude-code/tree/main/plugins/ralph-wiggum)) |
|
|
348
|
+
| `frontend-design` | Frontend design skills and patterns ([source](https://github.com/anthropics/claude-code/tree/main/plugins/frontend-design)) |
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## Agent Config
|
|
353
|
+
|
|
354
|
+
The `agent-config/` directory is the version-controlled source of truth:
|
|
355
|
+
|
|
356
|
+
- **`settings.json.template`** — Permissions-only template (hooks and env come from plugins)
|
|
357
|
+
- **`plugins/`** — Self-registering plugin bundles with `plugin.json` manifests
|
|
358
|
+
- **`skills/`** — Standalone skills copied to `~/.claude/skills/` and `~/.codex/skills/`
|
|
359
|
+
- **`commands/`** — Standalone slash commands copied to `~/.claude/commands/` and `~/.codex/prompts/`
|
|
360
|
+
- **`mcp-templates/`** — MCP server templates (mcp-gateway, codex) with placeholder hydration
|
|
361
|
+
|
|
362
|
+
Add your own skills by creating a directory under `agent-config/skills/` with a `SKILL.md` file. They'll be installed to both Claude and Codex automatically on rebuild. Commands are also mirrored — `~/.claude/commands/` for Claude and `~/.codex/prompts/` for Codex (with Claude-specific frontmatter stripped).
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## Architecture
|
|
367
|
+
|
|
368
|
+
```
|
|
369
|
+
Host (Docker Desktop)
|
|
370
|
+
├── VS Code → Dev Container (Debian 12 Bookworm / Node 20)
|
|
371
|
+
│ ├── Claude Code + Codex CLI + plugins + GSD + BMAD + psql
|
|
372
|
+
│ ├── iptables whitelist firewall
|
|
373
|
+
│ └── /var/run/docker.sock (from host)
|
|
374
|
+
│
|
|
375
|
+
└── Sidecar Stack (Docker-outside-of-Docker)
|
|
376
|
+
├── langfuse-web :3052
|
|
377
|
+
├── langfuse-worker :3030
|
|
378
|
+
├── docker-mcp-gateway :8811
|
|
379
|
+
├── postgres :5433
|
|
380
|
+
├── clickhouse :8124 (HTTP) / :9000 (native)
|
|
381
|
+
├── redis :6379
|
|
382
|
+
└── minio :9090 (API) / :9091 (console)
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
The dev container and sidecar services are sibling containers on the same Docker engine. They communicate via `host.docker.internal`.
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## Firewall
|
|
390
|
+
|
|
391
|
+
Default policy is **DROP**. Only whitelisted domains are reachable.
|
|
392
|
+
|
|
393
|
+
To disable the firewall entirely, set `firewall.enabled` to `false` in `config.json`:
|
|
394
|
+
|
|
395
|
+
```json
|
|
396
|
+
{ "firewall": { "enabled": false } }
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
Rebuild the container to apply. When disabled, all iptables rules are flushed and policies set to ACCEPT.
|
|
400
|
+
|
|
401
|
+
**Always included** (47 core domains): Anthropic API, GitHub, npm, PyPI, Debian repos, VS Code Marketplace, Azure Blob Storage (VS Code extensions), OpenAI (API + Auth + Platform + ChatGPT), Google AI API, Cloudflare, Amazon, Google Fonts, jsDelivr CDN, Vercel, and cloud Postgres providers (Supabase, Neon, Aiven dashboards — add your specific DB endpoint to `extra_domains`).
|
|
402
|
+
|
|
403
|
+
**Auto-generated**: Per-publisher VS Code extension CDN domains are derived from `devcontainer.json` so extensions install without firewall errors.
|
|
404
|
+
|
|
405
|
+
**User-configured**: Add domains to `config.json → firewall.extra_domains` — they're appended automatically on rebuild.
|
|
406
|
+
|
|
407
|
+
To temporarily allow a domain inside the container:
|
|
408
|
+
|
|
409
|
+
```bash
|
|
410
|
+
IP=$(dig +short example.com | tail -1)
|
|
411
|
+
sudo iptables -I OUTPUT -d "$IP" -j ACCEPT
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
To refresh DNS for all firewall domains without restarting:
|
|
415
|
+
|
|
416
|
+
```bash
|
|
417
|
+
sudo /usr/local/bin/refresh-firewall-dns.sh
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
## MCP Servers
|
|
423
|
+
|
|
424
|
+
MCP servers come from two sources:
|
|
425
|
+
|
|
426
|
+
1. **Templates** in `agent-config/mcp-templates/`, enabled in `config.json → mcp_servers`
|
|
427
|
+
2. **Plugins** declaring `mcp_servers` in their `plugin.json` manifest
|
|
428
|
+
|
|
429
|
+
| Server | Source | Description |
|
|
430
|
+
| ------------- | -------- | ---------------------------------------------------------------------------------------- |
|
|
431
|
+
| `mcp-gateway` | Template | Docker MCP Gateway at `127.0.0.1:8811` |
|
|
432
|
+
| `codex` | Template | Codex CLI as MCP server — gives Claude access to `codex`, `review`, `listSessions` tools |
|
|
433
|
+
|
|
434
|
+
Enable a template server:
|
|
435
|
+
|
|
436
|
+
```json
|
|
437
|
+
{
|
|
438
|
+
"mcp_servers": {
|
|
439
|
+
"mcp-gateway": { "enabled": false },
|
|
440
|
+
"codex": { "enabled": true, "targets": ["claude"] }
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### Server Targeting
|
|
446
|
+
|
|
447
|
+
By default, enabled MCP servers are configured for both Claude Code (`~/.claude/.mcp.json`) and Codex CLI (`config.toml [mcp_servers.*]`). To restrict a server to a specific agent, add `targets`:
|
|
448
|
+
|
|
449
|
+
```json
|
|
450
|
+
{ "mcp-gateway": { "enabled": true, "targets": ["codex"] } }
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
Valid targets: `"claude"`, `"codex"`. Default (when `targets` is omitted): both agents. The `codex` MCP server template should always target `["claude"]` since it would be circular for Codex to have itself as an MCP server.
|
|
454
|
+
|
|
455
|
+
Plugin MCP servers are registered automatically and persist across container restarts. The `mcp-setup` command regenerates base template servers on every container start for both agents while preserving plugin servers.
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
## GSD Framework
|
|
460
|
+
|
|
461
|
+
[Get Shit Done](https://github.com/glittercowboy/get-shit-done) is a project management framework for Claude Code that breaks work into atomic tasks sized for fresh context windows, while logging everything in `.planning/` via Markdown.
|
|
462
|
+
|
|
463
|
+
**Key commands:** `/gsd:new-project`, `/gsd:plan-phase`, `/gsd:execute-phase`, `/gsd:verify-work`, `/gsd:progress`
|
|
464
|
+
|
|
465
|
+
Run `/gsd:help` inside a Claude session for the full command list.
|
|
466
|
+
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
## BMAD Method
|
|
470
|
+
|
|
471
|
+
[BMAD Method](https://github.com/bmad-code-org/BMAD-METHOD) (Breakthrough Method of Agile AI-driven Development) is a CLI-installable framework that provides 21+ specialized AI agents with role-based personas (PM, Architect, Developer, QA, UX Designer, etc.) and 50+ guided workflows for PRD creation, architecture design, epic/story generation, implementation, and testing.
|
|
472
|
+
|
|
473
|
+
BMAD is installed per-project into `_bmad/` and registers slash commands in `.claude/commands/`. The CLI is available globally in the container.
|
|
474
|
+
|
|
475
|
+
**Key commands:** `bmad install`, `bmad status`, `bmad list:agents`, `bmad list:expansions`
|
|
476
|
+
|
|
477
|
+
Run `/bmad-help` inside a Claude session for the full command list.
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
## Langfuse Tracing
|
|
482
|
+
|
|
483
|
+
The `nmc-langfuse-tracing` plugin traces every Claude conversation to your local Langfuse instance. It registers a Stop hook that reads transcript files, groups messages into turns, and sends structured traces with generation and tool spans.
|
|
484
|
+
|
|
485
|
+
Disabled by default. To enable, set in `config.json → plugins`:
|
|
486
|
+
|
|
487
|
+
```json
|
|
488
|
+
{ "plugins": { "nmc-langfuse-tracing": { "enabled": true } } }
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
Then start the Langfuse stack and view traces at `http://localhost:3052`.
|
|
492
|
+
|
|
493
|
+
### Hook Logs
|
|
494
|
+
|
|
495
|
+
```bash
|
|
496
|
+
tail -50 ~/.claude/state/langfuse_hook.log
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
---
|
|
500
|
+
|
|
501
|
+
## Shell Shortcuts
|
|
502
|
+
|
|
503
|
+
| Command | Action |
|
|
504
|
+
| ---------------- | ----------------------------------------------------------------------- |
|
|
505
|
+
| `claude` | Claude Code — Opus 4.6, high effort, permissions bypassed |
|
|
506
|
+
| `clauder` | Alias for `claude --resume` |
|
|
507
|
+
| `codex` | Codex CLI — GPT-5.3-Codex, full-auto, no sandbox |
|
|
508
|
+
| `codexr` | Alias for `codex resume` |
|
|
509
|
+
| `bmad` | BMAD Method CLI — install modules, check status, list agents |
|
|
510
|
+
| `psql` | PostgreSQL client CLI |
|
|
511
|
+
| `save-secrets` | Capture live credentials, git identity, and keys to `secrets.json` |
|
|
512
|
+
| `langfuse-setup` | Generate secrets, start Langfuse stack, verify health |
|
|
513
|
+
| `nmc-update` | Pull latest NMC changes, detect if container rebuild is needed |
|
|
514
|
+
| `mcp-setup` | Regenerate MCP configs (Claude + Codex) and health-check gateway |
|
|
515
|
+
| `slc` | Show postCreate lifecycle log (`/tmp/devcontainer-logs/postCreate.log`) |
|
|
516
|
+
| `sls` | Show postStart lifecycle log (`/tmp/devcontainer-logs/postStart.log`) |
|
|
517
|
+
|
|
518
|
+
---
|
|
519
|
+
|
|
520
|
+
## Project Structure
|
|
521
|
+
|
|
522
|
+
```
|
|
523
|
+
/workspace/
|
|
524
|
+
├── .devcontainer/ # Container definition and lifecycle scripts
|
|
525
|
+
│ ├── Dockerfile
|
|
526
|
+
│ ├── devcontainer.json
|
|
527
|
+
│ ├── install-agent-config.sh # Master config generator (plugins, hooks, env, MCP)
|
|
528
|
+
│ ├── init-firewall.sh
|
|
529
|
+
│ └── ...
|
|
530
|
+
│
|
|
531
|
+
├── agent-config/ # Version-controlled agent config source
|
|
532
|
+
│ ├── settings.json.template # Permissions-only template
|
|
533
|
+
│ ├── plugins/ # Self-registering plugin bundles
|
|
534
|
+
│ │ ├── nmc-langfuse-tracing/ # Langfuse conversation tracing
|
|
535
|
+
│ │ ├── nmc/ # NMC system status
|
|
536
|
+
│ │ └── .../ # Your plugins here
|
|
537
|
+
│ ├── mcp-templates/ # MCP server templates (mcp-gateway, codex)
|
|
538
|
+
│ ├── skills/ # Standalone skills (Claude + Codex)
|
|
539
|
+
│ └── commands/ # Standalone slash commands
|
|
540
|
+
│
|
|
541
|
+
│
|
|
542
|
+
├── infra/ # Langfuse + MCP gateway stack
|
|
543
|
+
│ ├── docker-compose.yml
|
|
544
|
+
│ ├── data/ # Persistent bind mounts (gitignored)
|
|
545
|
+
│ └── mcp/mcp.json
|
|
546
|
+
│
|
|
547
|
+
└── projects/ # Your repos go here
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## Customization
|
|
553
|
+
|
|
554
|
+
### Adding Firewall Domains
|
|
555
|
+
|
|
556
|
+
Edit `config.json`:
|
|
557
|
+
|
|
558
|
+
```json
|
|
559
|
+
{ "firewall": { "extra_domains": ["api.example.com", "cdn.example.com"] } }
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
Rebuild the container to apply.
|
|
563
|
+
|
|
564
|
+
### Changing the Codex Model
|
|
565
|
+
|
|
566
|
+
Edit `config.json`:
|
|
567
|
+
|
|
568
|
+
```json
|
|
569
|
+
{ "codex": { "model": "o4-mini" } }
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
Rebuild the container. Default is `gpt-5.3-codex`.
|
|
573
|
+
|
|
574
|
+
### Disabling Codex for Specific Projects
|
|
575
|
+
|
|
576
|
+
Project `.claude/` content (skills and commands) is automatically mirrored to Codex's global directories on rebuild. To exclude specific projects:
|
|
577
|
+
|
|
578
|
+
```json
|
|
579
|
+
{ "codex": { "skip_dirs": ["my-claude-only-project"] } }
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
Values are project directory names under `projects/`. Excluded projects still get `.codex/` gitignored as a placeholder.
|
|
583
|
+
|
|
584
|
+
### Adding Skills
|
|
585
|
+
|
|
586
|
+
Create `agent-config/skills/my-skill/SKILL.md` with a YAML front matter block and skill content. It'll be copied to both `~/.claude/skills/` and `~/.codex/skills/` on rebuild.
|
|
587
|
+
|
|
588
|
+
### Adding Plugins
|
|
589
|
+
|
|
590
|
+
Create `agent-config/plugins/my-plugin/plugin.json` with a manifest declaring hooks, env vars, commands, agents, or MCP servers. See the [Plugin System](#plugin-system) section for details.
|
|
591
|
+
|
|
592
|
+
### Adding Git Repos
|
|
593
|
+
|
|
594
|
+
```bash
|
|
595
|
+
cd /workspace/projects && git clone <url>
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
Add the path to `config.json → vscode.git_scan_paths` for VS Code git integration.
|
|
599
|
+
|
|
600
|
+
### Adding MCP Servers
|
|
601
|
+
|
|
602
|
+
Via templates:
|
|
603
|
+
|
|
604
|
+
1. Create a template in `agent-config/mcp-templates/`
|
|
605
|
+
2. Enable it in `config.json → mcp_servers`
|
|
606
|
+
3. Rebuild
|
|
607
|
+
|
|
608
|
+
Via plugins:
|
|
609
|
+
|
|
610
|
+
1. Add `mcp_servers` to your plugin's `plugin.json`
|
|
611
|
+
2. Add secrets to `secrets.json` under the plugin name
|
|
612
|
+
3. Rebuild
|
|
613
|
+
|
|
614
|
+
---
|
|
615
|
+
|
|
616
|
+
## Troubleshooting
|
|
617
|
+
|
|
618
|
+
### Langfuse unreachable / port 3052 blocked
|
|
619
|
+
|
|
620
|
+
WSL2's networking can enter a broken state (Windows only). Fix:
|
|
621
|
+
|
|
622
|
+
```powershell
|
|
623
|
+
# PowerShell as Administrator
|
|
624
|
+
wsl --shutdown
|
|
625
|
+
Restart-Service hns
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
Reopen VS Code and the container.
|
|
629
|
+
|
|
630
|
+
### Traces not appearing
|
|
631
|
+
|
|
632
|
+
1. Inside a Claude session, check `echo $TRACE_TO_LANGFUSE` (should be `true` — this env var is set in Claude's `settings.json`, not in the shell)
|
|
633
|
+
2. Check `curl http://host.docker.internal:3052/api/public/health`
|
|
634
|
+
3. Check `tail -20 ~/.claude/state/langfuse_hook.log`
|
|
635
|
+
|
|
636
|
+
### Plugin warnings during install
|
|
637
|
+
|
|
638
|
+
Check the install output for the `--- Warnings Recap ---` section. Common issues:
|
|
639
|
+
|
|
640
|
+
- Missing hook script file → plugin skipped (check the file path in your plugin.json)
|
|
641
|
+
- Unresolved `{{TOKEN}}` → add the secret to `secrets.json` under your plugin name
|
|
642
|
+
- File conflict → two plugins provide the same file (first alphabetically wins)
|
|
643
|
+
|
|
644
|
+
### Docker socket permission denied
|
|
645
|
+
|
|
646
|
+
```bash
|
|
647
|
+
sudo chmod 666 /var/run/docker.sock
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
### Git "dubious ownership" errors
|
|
651
|
+
|
|
652
|
+
Handled automatically. If it recurs: `git config --global --add safe.directory '*'`
|
|
653
|
+
|
|
654
|
+
---
|
|
655
|
+
|
|
656
|
+
## Known Issues
|
|
657
|
+
|
|
658
|
+
| Issue | Cause | Status |
|
|
659
|
+
| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
|
|
660
|
+
| Claude Code Edit tool throws `ENOENT: no such file or directory` on files that exist (Windows only) | WSL2 bind mount (C:\ → 9P → container) causes stale file metadata; the Edit tool's freshness check sees a mismatched mtime and rejects the write | Intermittent, self-healing (re-read + retry succeeds). Likely resolved in a future Claude Code update. |
|
|
661
|
+
| Lifecycle terminal closes before you can read output | VS Code dismisses the postCreate/postStart terminal on completion | Use `slc` / `sls` aliases to view saved logs from `/tmp/devcontainer-logs/` |
|
|
662
|
+
|
|
663
|
+
---
|
|
664
|
+
|
|
665
|
+
<div align="center">
|
|
666
|
+
|
|
667
|
+
## Acknowledgments
|
|
668
|
+
|
|
669
|
+
Built on the shoulders of:
|
|
670
|
+
|
|
671
|
+
**[Claude Code](https://github.com/anthropics/claude-code)** (devcontainer, plugins, hooks framework) · **[claude-code-langfuse-template](https://github.com/doneyli/claude-code-langfuse-template)** · **[Get Shit Done](https://github.com/glittercowboy/get-shit-done)** · **[codex-mcp-server](https://github.com/tuannvm/codex-mcp-server)**
|
|
39
672
|
|
|
40
|
-
|
|
673
|
+
<br>
|
|
41
674
|
|
|
42
|
-
|
|
675
|
+
MIT License · Copyright (c) 2026 agomusio
|
|
43
676
|
|
|
44
|
-
|
|
677
|
+
</div>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "no-more-configs",
|
|
3
|
-
"version": "1.3.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.3.2",
|
|
4
|
+
"description": "Zero-config devcontainer for Claude Code & Codex CLI — firewall, plugins, Langfuse tracing, MCP servers, and 80+ slash commands out of the box. One command to install.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"no-more-configs": "index.js"
|
|
@@ -10,17 +10,38 @@
|
|
|
10
10
|
"index.js",
|
|
11
11
|
"README.md"
|
|
12
12
|
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"prepack": "cp ../README.md README.md"
|
|
15
|
+
},
|
|
13
16
|
"engines": {
|
|
14
17
|
"node": ">=18"
|
|
15
18
|
},
|
|
16
19
|
"keywords": [
|
|
17
20
|
"claude",
|
|
18
21
|
"claude-code",
|
|
22
|
+
"codex",
|
|
23
|
+
"codex-cli",
|
|
19
24
|
"devcontainer",
|
|
20
25
|
"vscode",
|
|
21
|
-
"
|
|
22
|
-
"ai",
|
|
23
|
-
"
|
|
26
|
+
"docker",
|
|
27
|
+
"ai-coding",
|
|
28
|
+
"ai-agent",
|
|
29
|
+
"mcp",
|
|
30
|
+
"model-context-protocol",
|
|
31
|
+
"langfuse",
|
|
32
|
+
"anthropic",
|
|
33
|
+
"openai",
|
|
34
|
+
"developer-tools",
|
|
35
|
+
"dev-environment",
|
|
36
|
+
"firewall",
|
|
37
|
+
"plugin-system",
|
|
38
|
+
"gsd",
|
|
39
|
+
"bmad",
|
|
40
|
+
"wsl2",
|
|
41
|
+
"linux",
|
|
42
|
+
"arch-linux",
|
|
43
|
+
"debian",
|
|
44
|
+
"containerized-development"
|
|
24
45
|
],
|
|
25
46
|
"repository": {
|
|
26
47
|
"type": "git",
|