codeforge-dev 1.14.1 → 2.0.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 (111) hide show
  1. package/{.devcontainer/config/defaults → .codeforge/config}/ccstatusline-settings.json +44 -6
  2. package/{.devcontainer/config/defaults → .codeforge/config}/main-system-prompt.md +14 -6
  3. package/.codeforge/config/orchestrator-system-prompt.md +333 -0
  4. package/{.devcontainer/config/defaults → .codeforge/config}/settings.json +3 -1
  5. package/{.devcontainer/config → .codeforge}/file-manifest.json +15 -9
  6. package/{.devcontainer → .codeforge/scripts}/connect-external-terminal.sh +3 -1
  7. package/.devcontainer/.env.example +5 -5
  8. package/.devcontainer/.secrets.example +3 -0
  9. package/.devcontainer/CHANGELOG.md +251 -3
  10. package/.devcontainer/CLAUDE.md +129 -22
  11. package/.devcontainer/README.md +34 -19
  12. package/.devcontainer/devcontainer.json +28 -10
  13. package/.devcontainer/features/agent-browser/install.sh +2 -0
  14. package/.devcontainer/features/ast-grep/install.sh +2 -0
  15. package/.devcontainer/features/biome/install.sh +2 -0
  16. package/.devcontainer/features/ccburn/devcontainer-feature.json +0 -5
  17. package/.devcontainer/features/ccburn/install.sh +2 -0
  18. package/.devcontainer/features/ccms/install.sh +2 -0
  19. package/.devcontainer/features/ccstatusline/README.md +7 -6
  20. package/.devcontainer/features/ccstatusline/install.sh +9 -4
  21. package/.devcontainer/features/ccusage/devcontainer-feature.json +0 -5
  22. package/.devcontainer/features/ccusage/install.sh +2 -0
  23. package/.devcontainer/features/chromaterm/chromaterm.yml +2 -2
  24. package/.devcontainer/features/chromaterm/install.sh +2 -0
  25. package/.devcontainer/features/claude-code-native/README.md +47 -0
  26. package/.devcontainer/features/claude-code-native/devcontainer-feature.json +29 -0
  27. package/.devcontainer/features/claude-code-native/install.sh +131 -0
  28. package/.devcontainer/features/claude-monitor/devcontainer-feature.json +0 -5
  29. package/.devcontainer/features/claude-monitor/install.sh +2 -0
  30. package/.devcontainer/features/claude-session-dashboard/README.md +2 -2
  31. package/.devcontainer/features/claude-session-dashboard/devcontainer-feature.json +1 -2
  32. package/.devcontainer/features/claude-session-dashboard/install.sh +2 -0
  33. package/.devcontainer/features/dprint/install.sh +2 -0
  34. package/.devcontainer/features/hadolint/install.sh +2 -0
  35. package/.devcontainer/features/kitty-terminfo/README.md +3 -1
  36. package/.devcontainer/features/kitty-terminfo/install.sh +2 -0
  37. package/.devcontainer/features/lsp-servers/install.sh +2 -0
  38. package/.devcontainer/features/mcp-qdrant/CHANGES.md +3 -3
  39. package/.devcontainer/features/mcp-qdrant/README.md +1 -0
  40. package/.devcontainer/features/mcp-qdrant/devcontainer-feature.json +1 -7
  41. package/.devcontainer/features/mcp-qdrant/install.sh +9 -2
  42. package/.devcontainer/features/mcp-qdrant/poststart-hook.sh +9 -2
  43. package/.devcontainer/features/notify-hook/devcontainer-feature.json +1 -1
  44. package/.devcontainer/features/notify-hook/install.sh +2 -0
  45. package/.devcontainer/features/ruff/install.sh +2 -0
  46. package/.devcontainer/features/shellcheck/install.sh +2 -0
  47. package/.devcontainer/features/shfmt/install.sh +2 -0
  48. package/.devcontainer/features/tmux/README.md +3 -3
  49. package/.devcontainer/features/tmux/install.sh +3 -1
  50. package/.devcontainer/features/tree-sitter/devcontainer-feature.json +0 -6
  51. package/.devcontainer/features/tree-sitter/install.sh +2 -0
  52. package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +27 -11
  53. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/README.md +23 -4
  54. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/agents/claude-guide.md +4 -4
  55. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/agents/documenter.md +254 -0
  56. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/agents/implementer.md +260 -0
  57. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/agents/investigator.md +255 -0
  58. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/agents/tester.md +304 -0
  59. package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/README.md +1 -1
  60. package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/scripts/advisory-test-runner.py +4 -2
  61. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/block-dangerous.py +2 -2
  62. package/.devcontainer/plugins/devs-marketplace/plugins/git-workflow/.claude-plugin/plugin.json +7 -0
  63. package/.devcontainer/plugins/devs-marketplace/plugins/git-workflow/README.md +125 -0
  64. package/.devcontainer/plugins/devs-marketplace/plugins/git-workflow/skills/pr-review/SKILL.md +325 -0
  65. package/.devcontainer/plugins/devs-marketplace/plugins/git-workflow/skills/ship/SKILL.md +314 -0
  66. package/.devcontainer/plugins/devs-marketplace/plugins/prompt-snippets/.claude-plugin/plugin.json +5 -0
  67. package/.devcontainer/plugins/devs-marketplace/plugins/prompt-snippets/README.md +52 -0
  68. package/.devcontainer/plugins/devs-marketplace/plugins/prompt-snippets/skills/ps/SKILL.md +37 -0
  69. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected-bash.py +1 -1
  70. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +1 -1
  71. package/.devcontainer/plugins/devs-marketplace/plugins/session-context/README.md +30 -14
  72. package/.devcontainer/plugins/devs-marketplace/plugins/session-context/hooks/hooks.json +13 -1
  73. package/.devcontainer/plugins/devs-marketplace/plugins/session-context/scripts/collect-session-edits.py +44 -0
  74. package/.devcontainer/plugins/devs-marketplace/plugins/session-context/scripts/commit-reminder.py +89 -10
  75. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/.claude-plugin/plugin.json +1 -1
  76. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/README.md +19 -11
  77. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/scripts/skill-suggester.py +476 -282
  78. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/skills/worktree/SKILL.md +227 -0
  79. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/skills/worktree/references/manual-worktree-commands.md +238 -0
  80. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/skills/worktree/references/parallel-workflow-patterns.md +228 -0
  81. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/scripts/ticket-linker.py +2 -2
  82. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/README.md +1 -1
  83. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/guard-workspace-scope.py +3 -2
  84. package/.devcontainer/scripts/check-setup.sh +5 -3
  85. package/.devcontainer/scripts/preflight.sh +113 -0
  86. package/.devcontainer/scripts/setup-aliases.sh +13 -8
  87. package/.devcontainer/scripts/setup-auth.sh +46 -0
  88. package/.devcontainer/scripts/setup-config.sh +29 -10
  89. package/.devcontainer/scripts/setup-migrate-claude.sh +80 -0
  90. package/.devcontainer/scripts/setup-migrate-codeforge.sh +60 -0
  91. package/.devcontainer/scripts/setup-plugins.sh +3 -1
  92. package/.devcontainer/scripts/setup-projects.sh +3 -1
  93. package/.devcontainer/scripts/setup-terminal.sh +3 -1
  94. package/.devcontainer/scripts/setup-update-claude.sh +22 -27
  95. package/.devcontainer/scripts/setup.sh +57 -5
  96. package/LICENSE.txt +14 -0
  97. package/README.md +79 -5
  98. package/package.json +2 -1
  99. package/setup.js +392 -21
  100. package/.devcontainer/docs/configuration-reference.md +0 -93
  101. package/.devcontainer/docs/keybindings.md +0 -100
  102. package/.devcontainer/docs/optional-features.md +0 -64
  103. package/.devcontainer/docs/plugins.md +0 -176
  104. package/.devcontainer/docs/troubleshooting.md +0 -128
  105. package/.devcontainer/scripts/setup-symlink-claude.sh +0 -36
  106. /package/{.devcontainer/config/defaults → .codeforge/config}/keybindings.json +0 -0
  107. /package/{.devcontainer/config/defaults → .codeforge/config}/rules/session-search.md +0 -0
  108. /package/{.devcontainer/config/defaults → .codeforge/config}/rules/spec-workflow.md +0 -0
  109. /package/{.devcontainer/config/defaults → .codeforge/config}/rules/workspace-scope.md +0 -0
  110. /package/{.devcontainer/config/defaults → .codeforge/config}/writing-system-prompt.md +0 -0
  111. /package/{.devcontainer → .codeforge/scripts}/connect-external-terminal.ps1 +0 -0
@@ -0,0 +1,131 @@
1
+ #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
4
+ set -euo pipefail
5
+
6
+ VERSION="${VERSION:-latest}"
7
+ USERNAME="${USERNAME:-automatic}"
8
+
9
+ # Skip installation if version is "none"
10
+ if [ "${VERSION}" = "none" ]; then
11
+ echo "[claude-code-native] Skipping installation (version=none)"
12
+ exit 0
13
+ fi
14
+
15
+ echo "[claude-code-native] Starting installation..."
16
+ echo "[claude-code-native] Version: ${VERSION}"
17
+
18
+ # === VALIDATE DEPENDENCIES ===
19
+ # The official installer (claude.ai/install.sh) requires curl internally
20
+ if ! command -v curl >/dev/null 2>&1; then
21
+ echo "[claude-code-native] ERROR: curl is required"
22
+ echo " Ensure common-utils feature is installed first"
23
+ exit 1
24
+ fi
25
+
26
+ # === DETECT USER ===
27
+ if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then
28
+ if [ -n "${_REMOTE_USER:-}" ]; then
29
+ USERNAME="${_REMOTE_USER}"
30
+ elif getent passwd vscode >/dev/null 2>&1; then
31
+ USERNAME="vscode"
32
+ elif getent passwd node >/dev/null 2>&1; then
33
+ USERNAME="node"
34
+ elif getent passwd codespace >/dev/null 2>&1; then
35
+ USERNAME="codespace"
36
+ else
37
+ USERNAME="root"
38
+ fi
39
+ fi
40
+
41
+ USER_HOME=$(getent passwd "${USERNAME}" | cut -d: -f6)
42
+ if [ -z "${USER_HOME}" ]; then
43
+ echo "[claude-code-native] ERROR: Could not determine home directory for ${USERNAME}"
44
+ exit 1
45
+ fi
46
+
47
+ echo "[claude-code-native] Installing for user: ${USERNAME} (home: ${USER_HOME})"
48
+
49
+ # === PREPARE DIRECTORIES ===
50
+ mkdir -p "${USER_HOME}/.local/bin"
51
+ mkdir -p "${USER_HOME}/.local/share/claude"
52
+ mkdir -p "${USER_HOME}/.local/state"
53
+ mkdir -p "${USER_HOME}/.claude"
54
+ chown -R "${USERNAME}:" "${USER_HOME}/.local" "${USER_HOME}/.claude"
55
+
56
+ # === DETERMINE TARGET ===
57
+ # The official installer accepts: stable, latest, or a specific semver
58
+ TARGET="${VERSION}"
59
+ if [ "${TARGET}" != "latest" ] && [ "${TARGET}" != "stable" ]; then
60
+ if ! echo "${TARGET}" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
61
+ echo "[claude-code-native] ERROR: Invalid version '${TARGET}'"
62
+ echo " Use 'latest', 'stable', or a semver (e.g., 2.1.52)"
63
+ exit 1
64
+ fi
65
+ fi
66
+
67
+ # === INSTALL ===
68
+ # The official Anthropic installer handles:
69
+ # - Platform detection (linux/darwin, x64/arm64, glibc/musl)
70
+ # - Manifest download and checksum verification
71
+ # - Binary download to ~/.local/bin/claude (symlink to ~/.local/share/claude/versions/*)
72
+ echo "[claude-code-native] Downloading official installer..."
73
+
74
+ if [ "${USERNAME}" = "root" ]; then
75
+ curl -fsSL https://claude.ai/install.sh | bash -s -- "${TARGET}"
76
+ else
77
+ su - "${USERNAME}" -c "curl -fsSL https://claude.ai/install.sh | bash -s -- \"${TARGET}\""
78
+ fi
79
+
80
+ # === VERIFICATION ===
81
+ CLAUDE_BIN="${USER_HOME}/.local/bin/claude"
82
+
83
+ if [ -x "${CLAUDE_BIN}" ]; then
84
+ INSTALLED_VERSION=$(su - "${USERNAME}" -c "${CLAUDE_BIN} --version 2>/dev/null" || echo "unknown")
85
+ echo "[claude-code-native] ✓ Claude Code installed: ${INSTALLED_VERSION}"
86
+ echo "[claude-code-native] Binary: ${CLAUDE_BIN}"
87
+ else
88
+ echo "[claude-code-native] ERROR: Installation failed — ${CLAUDE_BIN} not found or not executable"
89
+ echo "[claude-code-native] Expected binary at: ${CLAUDE_BIN}"
90
+ ls -la "${USER_HOME}/.local/bin/" 2>/dev/null || true
91
+ exit 1
92
+ fi
93
+
94
+ # === POST-START HOOK ===
95
+ # Ensures hasCompletedOnboarding is set when token auth is configured.
96
+ # Runs as the LAST post-start hook (99- prefix) to catch overwrites from
97
+ # Claude Code CLI/extension that may race with postStartCommand.
98
+ HOOK_DIR="/usr/local/devcontainer-poststart.d"
99
+ mkdir -p "$HOOK_DIR"
100
+ cat > "$HOOK_DIR/99-claude-onboarding.sh" << 'HOOK_EOF'
101
+ #!/bin/bash
102
+ # Ensure hasCompletedOnboarding: true in .claude.json when token auth exists.
103
+ # Runs after all setup scripts to catch any overwrites by Claude Code CLI/extension.
104
+ _USERNAME="${SUDO_USER:-${USER:-vscode}}"
105
+ _USER_HOME=$(getent passwd "$_USERNAME" 2>/dev/null | cut -d: -f6)
106
+ _USER_HOME="${_USER_HOME:-/home/$_USERNAME}"
107
+ CLAUDE_DIR="${CLAUDE_CONFIG_DIR:-${_USER_HOME}/.claude}"
108
+ CLAUDE_JSON="$CLAUDE_DIR/.claude.json"
109
+ CRED_FILE="$CLAUDE_DIR/.credentials.json"
110
+
111
+ # Only act when token auth is configured
112
+ [ -f "$CRED_FILE" ] || exit 0
113
+
114
+ if [ -f "$CLAUDE_JSON" ]; then
115
+ if ! grep -q '"hasCompletedOnboarding"' "$CLAUDE_JSON" 2>/dev/null; then
116
+ if command -v jq >/dev/null 2>&1; then
117
+ jq '. + {"hasCompletedOnboarding": true}' "$CLAUDE_JSON" > "${CLAUDE_JSON}.tmp" && \
118
+ mv "${CLAUDE_JSON}.tmp" "$CLAUDE_JSON"
119
+ else
120
+ sed -i '$ s/}$/,\n "hasCompletedOnboarding": true\n}/' "$CLAUDE_JSON"
121
+ fi
122
+ echo "[claude-onboarding] Injected hasCompletedOnboarding into .claude.json"
123
+ fi
124
+ else
125
+ printf '{\n "hasCompletedOnboarding": true\n}\n' > "$CLAUDE_JSON"
126
+ echo "[claude-onboarding] Created .claude.json with hasCompletedOnboarding"
127
+ fi
128
+ HOOK_EOF
129
+ chmod +x "$HOOK_DIR/99-claude-onboarding.sh"
130
+
131
+ echo "[claude-code-native] Installation complete"
@@ -18,11 +18,6 @@
18
18
  "uv",
19
19
  "pipx",
20
20
  "pip"
21
- ],
22
- "proposals": [
23
- "uv",
24
- "pipx",
25
- "pip"
26
21
  ]
27
22
  },
28
23
  "username": {
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  # ==============================
@@ -33,8 +33,8 @@ claude-dashboard -p 8080
33
33
  claude-dashboard --help
34
34
  ```
35
35
 
36
- The dashboard reads session data from `~/.claude/projects/` (symlinked to `/workspaces/.claude/projects/` in this devcontainer).
36
+ The dashboard reads session data from `~/.claude/projects/`.
37
37
 
38
38
  ## How persistence works
39
39
 
40
- Dashboard settings and cache are stored at `~/.claude-dashboard/`. Since the home directory is ephemeral in devcontainers, a poststart hook symlinks `~/.claude-dashboard` → `/workspaces/.claude-dashboard/`, which is bind-mounted and survives rebuilds.
40
+ Dashboard settings and cache are stored at `~/.claude-dashboard/`. A poststart hook symlinks `~/.claude-dashboard` → `/workspaces/.claude-dashboard/`, which is bind-mounted and survives rebuilds.
@@ -19,8 +19,7 @@
19
19
  "type": "string",
20
20
  "description": "Which shells to configure aliases in (bash, zsh, or both)",
21
21
  "default": "both",
22
- "enum": ["bash", "zsh", "both"],
23
- "proposals": ["bash", "zsh", "both"]
22
+ "enum": ["bash", "zsh", "both"]
24
23
  },
25
24
  "username": {
26
25
  "type": "string",
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  # ==============================
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  # ==============================
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  # ==============================
@@ -14,7 +14,9 @@ Downloads and compiles the official kitty terminfo entry from the [Kitty termina
14
14
 
15
15
  ## Usage
16
16
 
17
- No configuration needed. Once installed, containers automatically recognize `TERM=xterm-kitty` and provide full capability support.
17
+ The container defaults to `TERM=xterm-256color` with `COLORTERM=truecolor`, which provides full 256-color and 24-bit truecolor support for all terminals.
18
+
19
+ For Kitty users: the `devcontainer.json` `remoteEnv` uses `${localEnv:TERM:xterm-256color}`, which forwards your host `TERM` into VS Code sessions. If your host sets `TERM=xterm-kitty`, the installed terminfo ensures full Kitty-specific capability support (correct `bce` behavior, status line, etc.). For non-VS Code entry points (tmux, `docker exec`, SSH), `setup-aliases.sh` upgrades `TERM=xterm` to `xterm-256color` but preserves any other value. If no Kitty TERM is forwarded, `xterm-256color` provides equivalent color rendering.
18
20
 
19
21
  ```bash
20
22
  # Verify installation
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  # ==============================
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  # LSP Servers for Claude Code
3
5
  # Installs pyright, typescript-language-server, and gopls binaries
4
6
 
@@ -259,11 +259,11 @@ MCP_CONFIG_DIR="${USER_HOME}/.config/mcp"
259
259
 
260
260
  **Current Behavior:**
261
261
  - Feature creates: `~/.config/mcp/qdrant-config.json`
262
- - Helper script (`configure-qdrant-mcp`) can update: `/workspaces/.claude/settings.json`
262
+ - Helper script (`configure-qdrant-mcp`) can update: `~/.claude/settings.json`
263
263
  - User must manually run helper script
264
264
 
265
265
  **Not Implemented (by request):**
266
- - Automatic injection into `/workspaces/.claude/settings.json` during installation
266
+ - Automatic injection into `~/.claude/settings.json` during installation
267
267
  - This will be discussed separately
268
268
 
269
269
  ---
@@ -378,7 +378,7 @@ Based on comprehensive review, the following fixes were applied:
378
378
  2. ✅ Fixed credentials leak - Added cleanup trap, secure temp file handling
379
379
 
380
380
  ### High Priority Fixes
381
- 3. ✅ Removed unused config directory (~/.config/mcp) - Target is /workspaces/.claude/settings.json
381
+ 3. ✅ Removed unused config directory (~/.config/mcp) - Target is ~/.claude/settings.json
382
382
  4. ✅ Consolidated helper scripts - Removed duplicate manual helper, kept auto-config only
383
383
  5. ✅ Fixed redundant redirections - Changed `&>/dev/null 2>&1` to `&>/dev/null`
384
384
  6. ✅ Fixed hardcoded workspace paths - Now uses `${WORKSPACE_ROOT:-/workspaces}`
@@ -154,6 +154,7 @@ The feature will validate these are present and exit with an error if missing.
154
154
  - ✅ **Cloud or Local**: Supports both Qdrant Cloud and local instances
155
155
  - ✅ **Idempotent**: Safe to run multiple times
156
156
  - ✅ **Multi-user**: Automatically detects container user
157
+ - ✅ **Config-aware**: Respects `CLAUDE_CONFIG_DIR` environment variable (defaults to `~/.claude`)
157
158
  - ✅ **Native mcpServers**: Uses VS Code's native devcontainer mcpServers support (declarative configuration)
158
159
  - ✅ **Dynamic Configuration**: Environment variables loaded from `/workspaces/.qdrant-mcp.env` file
159
160
  - ✅ **Secure**: API keys protected with 600 permissions on env file
@@ -39,12 +39,6 @@
39
39
  "BAAI/bge-small-en-v1.5",
40
40
  "sentence-transformers/all-mpnet-base-v2",
41
41
  "BAAI/bge-base-en-v1.5"
42
- ],
43
- "proposals": [
44
- "all-MiniLM-L6-v2",
45
- "BAAI/bge-small-en-v1.5",
46
- "sentence-transformers/all-mpnet-base-v2",
47
- "BAAI/bge-base-en-v1.5"
48
42
  ]
49
43
  },
50
44
  "username": {
@@ -56,6 +50,6 @@
56
50
  "installsAfter": [
57
51
  "ghcr.io/devcontainers/features/python:1",
58
52
  "ghcr.io/devcontainers/features/common-utils:2",
59
- "ghcr.io/anthropics/devcontainer-features/claude-code:1"
53
+ "./features/claude-code-native"
60
54
  ]
61
55
  }
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  # Import options from devcontainer-feature.json
@@ -188,8 +190,13 @@ else
188
190
  QDRANT_LOCAL_PATH="${QDRANT_LOCAL_PATH:-/workspaces/.qdrant/storage}"
189
191
  fi
190
192
 
193
+ # Resolve target user's home (guards against $HOME=/root during feature install)
194
+ _USERNAME="${SUDO_USER:-${USER:-vscode}}"
195
+ _USER_HOME=$(getent passwd "$_USERNAME" 2>/dev/null | cut -d: -f6)
196
+ _USER_HOME="${_USER_HOME:-/home/$_USERNAME}"
197
+
191
198
  # Ensure settings.json exists
192
- SETTINGS_FILE="/workspaces/.claude/settings.json"
199
+ SETTINGS_FILE="${CLAUDE_CONFIG_DIR:-${_USER_HOME}/.claude}/settings.json"
193
200
  if [ ! -f "$SETTINGS_FILE" ]; then
194
201
  echo "[mcp-qdrant] ERROR: $SETTINGS_FILE not found"
195
202
  exit 1
@@ -257,7 +264,7 @@ fi
257
264
 
258
265
  # Set proper permissions
259
266
  chmod 644 "$SETTINGS_FILE"
260
- chown "$(id -un):$(id -gn)" "$SETTINGS_FILE" 2>/dev/null || true
267
+ chown "${_USERNAME}:${_USERNAME}" "$SETTINGS_FILE" 2>/dev/null || true
261
268
 
262
269
  echo "[mcp-qdrant] ✓ Configuration complete"
263
270
  HOOK_EOF
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  echo "[mcp-qdrant] Registering Qdrant MCP server with Claude Code..."
@@ -56,8 +58,13 @@ else
56
58
  QDRANT_LOCAL_PATH="${QDRANT_LOCAL_PATH:-/workspaces/.qdrant/storage}"
57
59
  fi
58
60
 
61
+ # Resolve target user's home (guards against $HOME=/root when hook runs as root)
62
+ _USERNAME="${SUDO_USER:-${USER:-vscode}}"
63
+ _USER_HOME=$(getent passwd "$_USERNAME" 2>/dev/null | cut -d: -f6)
64
+ _USER_HOME="${_USER_HOME:-/home/$_USERNAME}"
65
+
59
66
  # Ensure settings.json exists
60
- SETTINGS_FILE="/workspaces/.claude/settings.json"
67
+ SETTINGS_FILE="${CLAUDE_CONFIG_DIR:-${_USER_HOME}/.claude}/settings.json"
61
68
  if [ ! -f "$SETTINGS_FILE" ]; then
62
69
  echo "[mcp-qdrant] ERROR: $SETTINGS_FILE not found"
63
70
  exit 1
@@ -125,6 +132,6 @@ fi
125
132
 
126
133
  # Set proper permissions
127
134
  chmod 644 "$SETTINGS_FILE"
128
- chown vscode:vscode "$SETTINGS_FILE" 2>/dev/null || true
135
+ chown "${_USERNAME}:${_USERNAME}" "$SETTINGS_FILE" 2>/dev/null || true
129
136
 
130
137
  echo "[mcp-qdrant] ✓ Configuration complete"
@@ -23,6 +23,6 @@
23
23
  },
24
24
  "installsAfter": [
25
25
  "ghcr.io/devcontainers/features/common-utils:2",
26
- "ghcr.io/anthropics/devcontainer-features/claude-code:1"
26
+ "./features/claude-code-native"
27
27
  ]
28
28
  }
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  VERSION="${VERSION:-latest}"
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  # ==============================
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  # ==============================
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  # ==============================
@@ -23,17 +23,17 @@ The VS Code integrated terminal does **not** support tmux split panes. To use sp
23
23
 
24
24
  ### Option 1: Helper Scripts (Recommended)
25
25
 
26
- Use the provided helper scripts in the `.devcontainer/` folder:
26
+ Use the provided helper scripts in the `.codeforge/scripts/` folder:
27
27
 
28
28
  **Linux/macOS:**
29
29
  ```bash
30
- cd /path/to/your/project/.devcontainer
30
+ cd /path/to/your/project/.codeforge/scripts
31
31
  ./connect-external-terminal.sh
32
32
  ```
33
33
 
34
34
  **Windows (PowerShell):**
35
35
  ```powershell
36
- cd C:\path\to\your\project\.devcontainer
36
+ cd C:\path\to\your\project\.codeforge\scripts
37
37
  .\connect-external-terminal.ps1
38
38
  ```
39
39
 
@@ -1,5 +1,7 @@
1
1
  #!/bin/bash
2
- set -e
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
4
+ set -euo pipefail
3
5
 
4
6
  VERSION="${VERSION:-latest}"
5
7
 
@@ -19,12 +19,6 @@
19
19
  "python",
20
20
  "both",
21
21
  "none"
22
- ],
23
- "proposals": [
24
- "node",
25
- "python",
26
- "both",
27
- "none"
28
22
  ]
29
23
  },
30
24
  "installCli": {
@@ -1,4 +1,6 @@
1
1
  #!/bin/bash
2
+ # SPDX-License-Identifier: GPL-3.0-only
3
+ # Copyright (c) 2026 Marcus Krueger
2
4
  set -euo pipefail
3
5
 
4
6
  # === IMPORT OPTIONS ===
@@ -14,7 +14,7 @@
14
14
  "name": "codeforge-lsp",
15
15
  "description": "LSP servers for CodeForge (Python, TypeScript, Go)",
16
16
  "version": "1.0.0",
17
- "source": "codeforge-lsp",
17
+ "source": "./plugins/codeforge-lsp",
18
18
  "category": "development",
19
19
  "keywords": ["lsp", "python", "typescript", "go"]
20
20
  },
@@ -22,7 +22,7 @@
22
22
  "name": "ticket-workflow",
23
23
  "description": "EARS-based ticket workflow with GitHub integration",
24
24
  "version": "1.0.0",
25
- "source": "ticket-workflow",
25
+ "source": "./plugins/ticket-workflow",
26
26
  "category": "workflow",
27
27
  "keywords": ["tickets", "github", "workflow", "ears", "issues", "pr"]
28
28
  },
@@ -30,7 +30,7 @@
30
30
  "name": "notify-hook",
31
31
  "description": "Desktop notifications and audio chime when Claude finishes responding",
32
32
  "version": "1.0.0",
33
- "source": "notify-hook",
33
+ "source": "./plugins/notify-hook",
34
34
  "category": "productivity",
35
35
  "keywords": ["notifications", "desktop", "audio"]
36
36
  },
@@ -38,7 +38,7 @@
38
38
  "name": "dangerous-command-blocker",
39
39
  "description": "Blocks dangerous bash commands (rm -rf, sudo rm, chmod 777, force push)",
40
40
  "version": "1.0.0",
41
- "source": "dangerous-command-blocker",
41
+ "source": "./plugins/dangerous-command-blocker",
42
42
  "category": "safety",
43
43
  "keywords": ["safety", "bash", "blocker"]
44
44
  },
@@ -46,7 +46,7 @@
46
46
  "name": "protected-files-guard",
47
47
  "description": "Blocks modifications to .env, lock files, .git/, and credentials",
48
48
  "version": "1.0.0",
49
- "source": "protected-files-guard",
49
+ "source": "./plugins/protected-files-guard",
50
50
  "category": "safety",
51
51
  "keywords": ["safety", "secrets", "env", "lockfiles"]
52
52
  },
@@ -54,7 +54,7 @@
54
54
  "name": "agent-system",
55
55
  "description": "17 custom agents with built-in agent redirection, CWD injection, and read-only bash enforcement",
56
56
  "version": "1.0.0",
57
- "source": "agent-system",
57
+ "source": "./plugins/agent-system",
58
58
  "category": "development",
59
59
  "keywords": ["agents", "subagents", "redirection"]
60
60
  },
@@ -62,7 +62,7 @@
62
62
  "name": "skill-engine",
63
63
  "description": "21 coding knowledge packs with auto-suggestion for frameworks, tools, and patterns",
64
64
  "version": "1.0.0",
65
- "source": "skill-engine",
65
+ "source": "./plugins/skill-engine",
66
66
  "category": "development",
67
67
  "keywords": ["skills", "knowledge", "auto-suggestion"]
68
68
  },
@@ -70,7 +70,7 @@
70
70
  "name": "spec-workflow",
71
71
  "description": "Specification lifecycle management: creation, refinement, building, reviewing, updating, and auditing",
72
72
  "version": "1.0.0",
73
- "source": "spec-workflow",
73
+ "source": "./plugins/spec-workflow",
74
74
  "category": "workflow",
75
75
  "keywords": ["specifications", "lifecycle", "ears"]
76
76
  },
@@ -78,7 +78,7 @@
78
78
  "name": "session-context",
79
79
  "description": "Session lifecycle hooks: git state injection, TODO harvesting, and commit reminders",
80
80
  "version": "1.0.0",
81
- "source": "session-context",
81
+ "source": "./plugins/session-context",
82
82
  "category": "development",
83
83
  "keywords": ["session", "git", "todos", "commits"]
84
84
  },
@@ -86,7 +86,7 @@
86
86
  "name": "auto-code-quality",
87
87
  "description": "Self-contained code quality: auto-format + auto-lint edited files (Ruff/Black, Biome, gofmt, shfmt, dprint, rustfmt, Pyright, ShellCheck, go vet, hadolint, clippy)",
88
88
  "version": "1.0.0",
89
- "source": "auto-code-quality",
89
+ "source": "./plugins/auto-code-quality",
90
90
  "category": "development",
91
91
  "keywords": ["formatting", "linting", "syntax", "quality"]
92
92
  },
@@ -94,9 +94,25 @@
94
94
  "name": "workspace-scope-guard",
95
95
  "description": "Enforces working directory scope — blocks writes and warns on reads outside the project",
96
96
  "version": "1.0.0",
97
- "source": "workspace-scope-guard",
97
+ "source": "./plugins/workspace-scope-guard",
98
98
  "category": "safety",
99
99
  "keywords": ["safety", "scope", "workspace"]
100
+ },
101
+ {
102
+ "name": "prompt-snippets",
103
+ "description": "Quick behavioral mode switches via /ps command",
104
+ "version": "1.0.0",
105
+ "source": "./plugins/prompt-snippets",
106
+ "category": "productivity",
107
+ "keywords": ["snippets", "prompts", "modes", "shortcuts"]
108
+ },
109
+ {
110
+ "name": "git-workflow",
111
+ "description": "Standalone git workflow: ship (commit/push/PR) and PR review",
112
+ "version": "1.0.0",
113
+ "source": "./plugins/git-workflow",
114
+ "category": "workflow",
115
+ "keywords": ["git", "commit", "push", "pr", "review", "ship"]
100
116
  }
101
117
  ]
102
118
  }
@@ -1,12 +1,25 @@
1
1
  # agent-system
2
2
 
3
- Claude Code plugin that provides 17 custom specialist agents with automatic built-in agent redirection, working directory injection, read-only bash enforcement, and team quality gates.
3
+ Claude Code plugin that provides 21 custom agents (4 workhorse + 17 specialist) with automatic built-in agent redirection, working directory injection, read-only bash enforcement, and team quality gates.
4
4
 
5
5
  ## What It Does
6
6
 
7
7
  Replaces Claude Code's built-in agents with enhanced custom agents that carry domain-specific instructions, safety hooks, and tailored tool configurations. Also provides team orchestration quality gates.
8
8
 
9
- ### Custom Agents
9
+ ### Workhorse Agents
10
+
11
+ General-purpose agents designed for orchestrator mode (`cc-orc`). Each covers a broad domain, carrying detailed execution discipline, code standards, and a question-surfacing protocol. Most tasks need only 2-3 of these.
12
+
13
+ | Agent | Domain | Access | Model |
14
+ |-------|--------|--------|-------|
15
+ | investigator | Research, codebase search, git forensics, dependency audit, log analysis, performance profiling | Read-only | Sonnet |
16
+ | implementer | Code changes, bug fixes, refactoring, migrations | Full access (worktree) | Opus |
17
+ | tester | Test suite creation, coverage analysis, test verification | Full access (worktree) | Opus |
18
+ | documenter | Documentation, specs, spec lifecycle (create/refine/review/update) | Full access | Opus |
19
+
20
+ ### Specialist Agents
21
+
22
+ Domain-specific agents for targeted tasks. Used by both `cc` (monolithic) and `cc-orc` (orchestrator) modes.
10
23
 
11
24
  | Agent | Specialty | Access |
12
25
  |-------|-----------|--------|
@@ -52,7 +65,9 @@ Per-agent hooks (registered within agent definitions, not in hooks.json):
52
65
 
53
66
  | Agent | Hook | Script | Purpose |
54
67
  |-------|------|--------|---------|
68
+ | implementer | PostToolUse (Edit) | `verify-no-regression.py` | Runs tests after each edit to catch regressions |
55
69
  | refactorer | PostToolUse (Edit) | `verify-no-regression.py` | Runs tests after each edit to catch regressions |
70
+ | tester | Stop | `verify-tests-pass.py` | Verifies written tests actually pass |
56
71
  | test-writer | Stop | `verify-tests-pass.py` | Verifies written tests actually pass |
57
72
 
58
73
  ## How It Works
@@ -156,7 +171,11 @@ agent-system/
156
171
  +-- .claude-plugin/
157
172
  | +-- plugin.json # Plugin metadata
158
173
  +-- agents/
159
- | +-- architect.md # 17 agent definition files
174
+ | +-- investigator.md # 4 workhorse agents (orchestrator mode)
175
+ | +-- implementer.md
176
+ | +-- tester.md
177
+ | +-- documenter.md
178
+ | +-- architect.md # 17 specialist agents
160
179
  | +-- bash-exec.md
161
180
  | +-- claude-guide.md
162
181
  | +-- debug-logs.md
@@ -181,7 +200,7 @@ agent-system/
181
200
  | +-- redirect-builtin-agents.py # Built-in agent redirection
182
201
  | +-- task-completed-check.py # Test suite quality gate
183
202
  | +-- teammate-idle-check.py # Incomplete task checker
184
- | +-- verify-no-regression.py # Post-edit regression tests (refactorer)
203
+ | +-- verify-no-regression.py # Post-edit regression tests (implementer, refactorer)
185
204
  | +-- verify-tests-pass.py # Test verification (test-writer)
186
205
  +-- skills/
187
206
  | +-- debug/
@@ -72,9 +72,9 @@ Direct model interaction via the Claude API (formerly Anthropic API). Covers Mes
72
72
  .claude/main-system-prompt.md # Active system prompt
73
73
  CLAUDE.md # Project instructions
74
74
 
75
- # DevContainer configuration
76
- .devcontainer/config/defaults/settings.json # Default settings
77
- .devcontainer/config/defaults/main-system-prompt.md # Default system prompt
75
+ # User-customizable configuration
76
+ .codeforge/config/settings.json # Default settings
77
+ .codeforge/config/main-system-prompt.md # Default system prompt
78
78
 
79
79
  # Plugin directory
80
80
  .devcontainer/plugins/devs-marketplace/plugins/ # All plugins
@@ -142,7 +142,7 @@ If the question involves configuration or SDK usage, provide a complete, runnabl
142
142
 
143
143
  **Agent approach**:
144
144
  1. WebFetch the Claude Code documentation for environment variable reference
145
- 2. Read local `.devcontainer/config/defaults/settings.json` to show which are currently configured
145
+ 2. Read local `.codeforge/config/settings.json` to show which are currently configured
146
146
  3. Summarize the most important variables with their effects
147
147
 
148
148
  **Output includes**: Answer with a categorized list of environment variables (model selection, behavior, performance, experimental features), Documentation References to the official docs, Related Features noting the `settings.json` `env` field as an alternative to shell environment variables.