codeforge-dev 1.10.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.devcontainer/.env +7 -1
- package/.devcontainer/.gitignore +1 -0
- package/.devcontainer/CHANGELOG.md +138 -0
- package/.devcontainer/CLAUDE.md +87 -8
- package/.devcontainer/README.md +55 -18
- package/.devcontainer/config/defaults/main-system-prompt.md +132 -152
- package/.devcontainer/config/defaults/rules/session-search.md +66 -0
- package/.devcontainer/config/defaults/rules/spec-workflow.md +39 -12
- package/.devcontainer/config/defaults/settings.json +2 -1
- package/.devcontainer/config/defaults/writing-system-prompt.md +185 -0
- package/.devcontainer/config/file-manifest.json +12 -0
- package/.devcontainer/connect-external-terminal.ps1 +1 -1
- package/.devcontainer/devcontainer.json +40 -10
- package/.devcontainer/docs/configuration-reference.md +3 -0
- package/.devcontainer/docs/plugins.md +9 -2
- package/.devcontainer/docs/troubleshooting.md +2 -2
- package/.devcontainer/features/README.md +8 -9
- package/.devcontainer/features/agent-browser/devcontainer-feature.json +21 -21
- package/.devcontainer/features/agent-browser/install.sh +0 -7
- package/.devcontainer/features/ast-grep/devcontainer-feature.json +22 -22
- package/.devcontainer/features/biome/devcontainer-feature.json +12 -14
- package/.devcontainer/features/ccms/README.md +50 -0
- package/.devcontainer/features/ccms/devcontainer-feature.json +21 -0
- package/.devcontainer/features/ccms/install.sh +122 -0
- package/.devcontainer/features/ccstatusline/install.sh +24 -2
- package/.devcontainer/features/lsp-servers/devcontainer-feature.json +43 -43
- package/.devcontainer/features/mcp-qdrant/poststart-hook.sh +2 -1
- package/.devcontainer/features/ruff/devcontainer-feature.json +17 -19
- package/.devcontainer/features/tmux/install.sh +2 -2
- package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +8 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/README.md +81 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/README.md +92 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/README.md +250 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +1 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/claude-guide.md +2 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/debug-logs.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/dependency-analyst.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +4 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +2 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/git-archaeologist.md +2 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/researcher.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/security-auditor.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +8 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +10 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/skill-suggester.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/git-state-injector.py +15 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/inject-cwd.py +37 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/skill-suggester.py +24 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/spec-reminder.py +3 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-build/SKILL.md +353 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-build/references/review-checklist.md +175 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-check/SKILL.md +15 -14
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/SKILL.md +12 -11
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/backlog-template.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/milestones-template.md +32 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/SKILL.md +17 -18
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/references/template.md +12 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-review/SKILL.md +229 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-update/SKILL.md +6 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/SKILL.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/codeforge-lsp/.claude-plugin/plugin.json +38 -5
- package/.devcontainer/plugins/devs-marketplace/plugins/codeforge-lsp/README.md +41 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/README.md +72 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/block-dangerous.py +73 -47
- package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/README.md +42 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/README.md +86 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/hooks/hooks.json +25 -15
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected-bash.py +122 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +3 -3
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/README.md +96 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/README.md +94 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/hooks/hooks.json +17 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/__pycache__/guard-workspace-scope.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/guard-workspace-scope.py +132 -0
- package/.devcontainer/scripts/check-setup.sh +1 -1
- package/.devcontainer/scripts/setup-aliases.sh +68 -75
- package/.devcontainer/scripts/setup-projects.sh +23 -16
- package/.devcontainer/scripts/setup.sh +48 -5
- package/README.md +17 -8
- package/package.json +1 -2
- package/.devcontainer/features/mcp-reasoner/README.md +0 -177
- package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +0 -25
- package/.devcontainer/features/mcp-reasoner/install.sh +0 -184
- package/.devcontainer/features/mcp-reasoner/poststart-hook.sh +0 -67
- package/.devcontainer/features/splitrail/README.md +0 -140
- package/.devcontainer/features/splitrail/devcontainer-feature.json +0 -39
- package/.devcontainer/features/splitrail/install.sh +0 -136
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/roadmap-template.md +0 -33
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# === SETUP ===
|
|
5
|
+
cleanup() {
|
|
6
|
+
:
|
|
7
|
+
}
|
|
8
|
+
trap cleanup EXIT
|
|
9
|
+
|
|
10
|
+
# === IMPORT OPTIONS ===
|
|
11
|
+
CCMS_VERSION="${VERSION:-latest}"
|
|
12
|
+
USERNAME="${USERNAME:-automatic}"
|
|
13
|
+
|
|
14
|
+
# Skip installation if version is "none"
|
|
15
|
+
if [ "${CCMS_VERSION}" = "none" ]; then
|
|
16
|
+
echo "[ccms] Skipping installation (version=none)"
|
|
17
|
+
exit 0
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
echo "[ccms] Starting ccms installation..."
|
|
21
|
+
|
|
22
|
+
# === VALIDATE DEPENDENCIES ===
|
|
23
|
+
# Source cargo env if available (Rust feature installs via rustup)
|
|
24
|
+
if [ -f /usr/local/cargo/env ]; then
|
|
25
|
+
source /usr/local/cargo/env
|
|
26
|
+
elif [ -f "${HOME}/.cargo/env" ]; then
|
|
27
|
+
source "${HOME}/.cargo/env"
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
if ! command -v cargo &>/dev/null; then
|
|
31
|
+
echo "[ccms] ERROR: cargo is not available"
|
|
32
|
+
echo " Ensure the Rust devcontainer feature is installed first:"
|
|
33
|
+
echo " \"ghcr.io/devcontainers/features/rust:1\": {}"
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
echo "[ccms] Using cargo: $(cargo --version)"
|
|
38
|
+
|
|
39
|
+
# === DETECT USER ===
|
|
40
|
+
if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then
|
|
41
|
+
USERNAME=""
|
|
42
|
+
for CURRENT_USER in vscode node codespace; do
|
|
43
|
+
if id -u "${CURRENT_USER}" >/dev/null 2>&1; then
|
|
44
|
+
USERNAME=${CURRENT_USER}
|
|
45
|
+
break
|
|
46
|
+
fi
|
|
47
|
+
done
|
|
48
|
+
[ -z "${USERNAME}" ] && USERNAME=root
|
|
49
|
+
elif [ "${USERNAME}" = "none" ] || ! id -u "${USERNAME}" >/dev/null 2>&1; then
|
|
50
|
+
USERNAME=root
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
echo "[ccms] Installing for user: ${USERNAME}"
|
|
54
|
+
|
|
55
|
+
# === BUILD CACHE ===
|
|
56
|
+
CACHE_DIR="/workspaces/.devcontainer/.build-cache/bin"
|
|
57
|
+
|
|
58
|
+
# === INSTALL ===
|
|
59
|
+
REPO_URL="https://github.com/mkusaka/ccms"
|
|
60
|
+
|
|
61
|
+
if [ -x "${CACHE_DIR}/ccms" ]; then
|
|
62
|
+
echo "[ccms] Using cached binary from ${CACHE_DIR}/ccms"
|
|
63
|
+
cp "${CACHE_DIR}/ccms" /usr/local/bin/ccms
|
|
64
|
+
chmod +x /usr/local/bin/ccms
|
|
65
|
+
else
|
|
66
|
+
if [ "${CCMS_VERSION}" = "latest" ]; then
|
|
67
|
+
echo "[ccms] Building from main branch..."
|
|
68
|
+
cargo install --git "${REPO_URL}" --rev f90d259a4476 2>&1 | tail -5
|
|
69
|
+
else
|
|
70
|
+
echo "[ccms] Building from ref: ${CCMS_VERSION}..."
|
|
71
|
+
cargo install --git "${REPO_URL}" --rev "${CCMS_VERSION}" 2>&1 | tail -5
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# === ENSURE BINARY IS ON PATH ===
|
|
75
|
+
# cargo install puts binaries in $CARGO_HOME/bin or ~/.cargo/bin
|
|
76
|
+
# Symlink to /usr/local/bin so it's available to all users
|
|
77
|
+
CARGO_BIN="${CARGO_HOME:-$HOME/.cargo}/bin/ccms"
|
|
78
|
+
if [ -f "${CARGO_BIN}" ] && [ ! -f /usr/local/bin/ccms ]; then
|
|
79
|
+
ln -s "${CARGO_BIN}" /usr/local/bin/ccms
|
|
80
|
+
echo "[ccms] Symlinked ${CARGO_BIN} → /usr/local/bin/ccms"
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# Cache the binary for future rebuilds
|
|
84
|
+
mkdir -p "${CACHE_DIR}"
|
|
85
|
+
CARGO_BIN="${CARGO_HOME:-$HOME/.cargo}/bin/ccms"
|
|
86
|
+
if [ -f "${CARGO_BIN}" ]; then
|
|
87
|
+
cp "${CARGO_BIN}" "${CACHE_DIR}/ccms"
|
|
88
|
+
echo "[ccms] Cached binary to ${CACHE_DIR}/ccms"
|
|
89
|
+
fi
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# === VERIFICATION ===
|
|
93
|
+
echo "[ccms] Verifying installation..."
|
|
94
|
+
if command -v ccms &>/dev/null; then
|
|
95
|
+
INSTALLED_VERSION=$(ccms --version 2>/dev/null || echo "unknown")
|
|
96
|
+
echo "[ccms] ✓ ccms installed: ${INSTALLED_VERSION}"
|
|
97
|
+
else
|
|
98
|
+
echo "[ccms] WARNING: ccms not found on PATH after installation"
|
|
99
|
+
echo " Binary location: ${CARGO_BIN}"
|
|
100
|
+
echo " You may need to add cargo bin to PATH"
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
# === SUMMARY ===
|
|
104
|
+
echo ""
|
|
105
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
106
|
+
echo " ccms Installation Complete"
|
|
107
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
108
|
+
echo ""
|
|
109
|
+
echo "Configuration:"
|
|
110
|
+
echo " • User: ${USERNAME}"
|
|
111
|
+
echo " • Version: ${CCMS_VERSION}"
|
|
112
|
+
echo " • Binary: $(which ccms 2>/dev/null || echo "${CARGO_BIN}")"
|
|
113
|
+
echo ""
|
|
114
|
+
echo "Usage:"
|
|
115
|
+
echo " ccms \"query\" # Search all sessions"
|
|
116
|
+
echo " ccms --project \$(pwd) \"query\" # Search current project"
|
|
117
|
+
echo " ccms -r user \"query\" # Filter by role"
|
|
118
|
+
echo " ccms -f json \"query\" -n 10 # JSON output, limited"
|
|
119
|
+
echo " ccms --since \"1 day ago\" \"q\" # Time-scoped search"
|
|
120
|
+
echo " ccms # Interactive TUI mode"
|
|
121
|
+
echo ""
|
|
122
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
@@ -100,6 +100,9 @@ CONFIG_JSON=$(jq -n '{
|
|
|
100
100
|
[
|
|
101
101
|
{id: "cc-resume-session", type: "custom-command", commandPath: "/usr/local/bin/ccstatusline-session-resume", timeout: 500, preserveColors: false, maxWidth: 50, color: "cyan", backgroundColor: "bgBrightBlack"}
|
|
102
102
|
],
|
|
103
|
+
[
|
|
104
|
+
{id: "cc-cwd", type: "custom-command", commandPath: "/usr/local/bin/ccstatusline-cwd", timeout: 500, preserveColors: false, maxWidth: 40, color: "brightWhite", backgroundColor: "bgBrightBlack"}
|
|
105
|
+
],
|
|
103
106
|
[
|
|
104
107
|
{id: "ccburn-compact", type: "custom-command", commandPath: "/usr/local/bin/ccburn-statusline", timeout: 8000, preserveColors: true, maxWidth: 80, color: "green", backgroundColor: "bgBlack"}
|
|
105
108
|
]
|
|
@@ -181,6 +184,24 @@ SESSION_EOF
|
|
|
181
184
|
chmod +x /usr/local/bin/ccstatusline-session-resume
|
|
182
185
|
echo "[ccstatusline] ✓ Session resume helper installed at /usr/local/bin/ccstatusline-session-resume"
|
|
183
186
|
|
|
187
|
+
# Create CWD helper script for custom-command widget
|
|
188
|
+
# Reads Claude Code JSON from stdin, outputs the last path segment of cwd
|
|
189
|
+
echo "[ccstatusline] Creating CWD helper..."
|
|
190
|
+
cat > /usr/local/bin/ccstatusline-cwd <<'CWD_EOF'
|
|
191
|
+
#!/bin/bash
|
|
192
|
+
# Reads Claude Code JSON from stdin, outputs basename of cwd
|
|
193
|
+
# Used by ccstatusline custom-command widget
|
|
194
|
+
CWD=$(jq -r '.cwd // empty' 2>/dev/null)
|
|
195
|
+
if [ -n "$CWD" ]; then
|
|
196
|
+
basename "$CWD"
|
|
197
|
+
else
|
|
198
|
+
echo "..."
|
|
199
|
+
fi
|
|
200
|
+
CWD_EOF
|
|
201
|
+
|
|
202
|
+
chmod +x /usr/local/bin/ccstatusline-cwd
|
|
203
|
+
echo "[ccstatusline] ✓ CWD helper installed at /usr/local/bin/ccstatusline-cwd"
|
|
204
|
+
|
|
184
205
|
# Create wrapper script to protect configuration
|
|
185
206
|
echo "[ccstatusline] Creating wrapper script..."
|
|
186
207
|
cat > /usr/local/bin/ccstatusline-wrapper <<'WRAPPER_EOF'
|
|
@@ -302,7 +323,7 @@ echo ""
|
|
|
302
323
|
echo "Configuration:"
|
|
303
324
|
echo " • Config file: ${CONFIG_FILE}"
|
|
304
325
|
echo " • User: ${USERNAME}"
|
|
305
|
-
echo " • Theme: Powerline (
|
|
326
|
+
echo " • Theme: Powerline (8 lines, 17 widgets, ANSI colors)"
|
|
306
327
|
echo " • Protected by: /usr/local/bin/ccstatusline-wrapper"
|
|
307
328
|
echo ""
|
|
308
329
|
echo "Display:"
|
|
@@ -312,7 +333,8 @@ echo " Line 3: Git Branch | Git Changes | Git Worktree"
|
|
|
312
333
|
echo " Line 4: Session Clock | Session Cost | Block Timer"
|
|
313
334
|
echo " Line 5: Tokens Total | Version"
|
|
314
335
|
echo " Line 6: Session ID"
|
|
315
|
-
echo " Line 7:
|
|
336
|
+
echo " Line 7: Working Directory"
|
|
337
|
+
echo " Line 8: Burn Rate (ccburn compact)"
|
|
316
338
|
echo ""
|
|
317
339
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
318
340
|
echo " Next Steps"
|
|
@@ -1,45 +1,45 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
2
|
+
"id": "lsp-servers",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"name": "LSP Servers for Claude Code",
|
|
5
|
+
"description": "Installs language server binaries for Python (pyright), TypeScript (typescript-language-server), and Go (gopls)",
|
|
6
|
+
"maintainer": "AnExiledDev",
|
|
7
|
+
"documentationURL": "https://code.claude.com/docs/en/discover-plugins#code-intelligence",
|
|
8
|
+
"options": {
|
|
9
|
+
"version": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "Set to 'none' to skip installation of all LSP servers",
|
|
12
|
+
"default": "latest"
|
|
13
|
+
},
|
|
14
|
+
"pyrightVersion": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "Pyright npm package version (e.g., 'latest', '1.1.350')",
|
|
17
|
+
"default": "1.1.408"
|
|
18
|
+
},
|
|
19
|
+
"typescriptLspVersion": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "typescript-language-server npm package version (e.g., 'latest', '4.3.0')",
|
|
22
|
+
"default": "5.1.3"
|
|
23
|
+
},
|
|
24
|
+
"typescriptVersion": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"description": "TypeScript npm package version (e.g., 'latest', '5.3.0')",
|
|
27
|
+
"default": "5.9.3"
|
|
28
|
+
},
|
|
29
|
+
"goplsVersion": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"description": "gopls version (e.g., 'latest', 'v0.16.0')",
|
|
32
|
+
"default": "latest"
|
|
33
|
+
},
|
|
34
|
+
"username": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"description": "Container user to install for",
|
|
37
|
+
"default": "automatic"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"installsAfter": [
|
|
41
|
+
"ghcr.io/devcontainers/features/common-utils:2",
|
|
42
|
+
"ghcr.io/devcontainers/features/node:1",
|
|
43
|
+
"ghcr.io/devcontainers/features/go:1"
|
|
44
|
+
]
|
|
45
45
|
}
|
|
@@ -35,7 +35,8 @@ if [ -n "${MODEL_URL}" ] && [ ! -d "${FASTEMBED_CACHE}/${MODEL_DIR}" ]; then
|
|
|
35
35
|
tar -xzf "${TEMP_TAR}" -C "${FASTEMBED_CACHE}/" 2>/dev/null || true
|
|
36
36
|
find "${FASTEMBED_CACHE}" -name "._*" -delete 2>/dev/null || true
|
|
37
37
|
rm -f "${TEMP_TAR}"
|
|
38
|
-
|
|
38
|
+
chown -R "vscode:vscode" "${FASTEMBED_CACHE}" 2>/dev/null || true
|
|
39
|
+
chmod -R 755 "${FASTEMBED_CACHE}" 2>/dev/null || true
|
|
39
40
|
echo "[mcp-qdrant] ✓ Embedding model downloaded to ${FASTEMBED_CACHE}/${MODEL_DIR}"
|
|
40
41
|
else
|
|
41
42
|
echo "[mcp-qdrant] WARNING: Failed to download embedding model"
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"ghcr.io/devcontainers-extra/features/uv"
|
|
20
|
-
]
|
|
2
|
+
"id": "ruff",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"name": "Ruff",
|
|
5
|
+
"description": "Fast Python linter and formatter (replaces Black + Flake8)",
|
|
6
|
+
"options": {
|
|
7
|
+
"version": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "0.15.1",
|
|
10
|
+
"description": "Ruff version to install"
|
|
11
|
+
},
|
|
12
|
+
"username": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"default": "automatic",
|
|
15
|
+
"description": "Container user to install for"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"installsAfter": ["ghcr.io/devcontainers-extra/features/uv"]
|
|
21
19
|
}
|
|
@@ -11,9 +11,9 @@ fi
|
|
|
11
11
|
|
|
12
12
|
echo "Installing tmux for Claude Code Agent Teams..."
|
|
13
13
|
|
|
14
|
-
# Install tmux via apt
|
|
14
|
+
# Install tmux and inotify-tools via apt
|
|
15
15
|
apt-get update
|
|
16
|
-
apt-get install -y tmux
|
|
16
|
+
apt-get install -y tmux inotify-tools
|
|
17
17
|
|
|
18
18
|
# Install Catppuccin theme (shallow clone for fast builds)
|
|
19
19
|
CATPPUCCIN_DIR="/usr/share/tmux/plugins/catppuccin"
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
},
|
|
91
91
|
{
|
|
92
92
|
"name": "code-directive",
|
|
93
|
-
"description": "17 custom agents,
|
|
93
|
+
"description": "17 custom agents, 28 coding skills, agent redirection, syntax validation, and skill auto-suggestion",
|
|
94
94
|
"version": "1.0.0",
|
|
95
95
|
"source": "./plugins/code-directive",
|
|
96
96
|
"category": "development"
|
|
@@ -101,6 +101,13 @@
|
|
|
101
101
|
"version": "1.0.0",
|
|
102
102
|
"source": "./plugins/auto-code-quality",
|
|
103
103
|
"category": "development"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"name": "workspace-scope-guard",
|
|
107
|
+
"description": "Enforces working directory scope — blocks writes and warns on reads outside the project",
|
|
108
|
+
"version": "1.0.0",
|
|
109
|
+
"source": "./plugins/workspace-scope-guard",
|
|
110
|
+
"category": "safety"
|
|
104
111
|
}
|
|
105
112
|
]
|
|
106
113
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# auto-formatter
|
|
2
|
+
|
|
3
|
+
Claude Code plugin that batch-formats edited files when Claude finishes responding. Reads file paths collected by the `code-directive` plugin's `collect-edited-files.py` hook and formats each file based on its extension.
|
|
4
|
+
|
|
5
|
+
## What It Does
|
|
6
|
+
|
|
7
|
+
When Claude stops responding, the plugin reads the session's list of edited files and formats each one using the appropriate tool:
|
|
8
|
+
|
|
9
|
+
| Language / File Type | Formatter | Fallback |
|
|
10
|
+
|----------------------|-----------|----------|
|
|
11
|
+
| Python (`.py`, `.pyi`) | [ruff format](https://docs.astral.sh/ruff/) | [black](https://github.com/psf/black) |
|
|
12
|
+
| Go (`.go`) | gofmt (bundled with Go) | — |
|
|
13
|
+
| JS/TS/CSS/JSON/GraphQL/HTML (`.js`, `.jsx`, `.ts`, `.tsx`, `.css`, `.json`, `.jsonc`, `.graphql`, `.gql`, `.html`, `.vue`, `.svelte`, `.astro`) | [biome](https://biomejs.dev/) check --write | — |
|
|
14
|
+
| Shell (`.sh`, `.bash`, `.zsh`, `.mksh`, `.bats`) | [shfmt](https://github.com/mvdan/sh) | — |
|
|
15
|
+
| Markdown/YAML/TOML (`.md`, `.markdown`, `.yaml`, `.yml`, `.toml`) | [dprint](https://dprint.dev/) | — |
|
|
16
|
+
| Dockerfile | dprint | — |
|
|
17
|
+
| Rust (`.rs`) | rustfmt (bundled with Rust) | — |
|
|
18
|
+
|
|
19
|
+
All formatting is non-blocking. Missing tools are silently skipped. The plugin always exits 0 — it will never interrupt Claude.
|
|
20
|
+
|
|
21
|
+
## How It Works
|
|
22
|
+
|
|
23
|
+
### Hook Lifecycle
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
code-directive's collect-edited-files.py (PostToolUse on Edit/Write)
|
|
27
|
+
│
|
|
28
|
+
└─→ Appends edited file path to /tmp/claude-edited-files-{session_id}
|
|
29
|
+
│
|
|
30
|
+
│ ... Claude keeps working ...
|
|
31
|
+
│
|
|
32
|
+
Claude stops responding (Stop event)
|
|
33
|
+
│
|
|
34
|
+
└─→ format-on-stop.py reads the temp file, deduplicates paths,
|
|
35
|
+
formats each file by extension, then cleans up the temp file
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Dependency on code-directive
|
|
39
|
+
|
|
40
|
+
This plugin does **not** collect file paths itself. It relies on the `code-directive` plugin's `collect-edited-files.py` PostToolUse hook to write edited file paths to `/tmp/claude-edited-files-{session_id}`. Both plugins must be enabled for formatting to work.
|
|
41
|
+
|
|
42
|
+
### Biome Discovery
|
|
43
|
+
|
|
44
|
+
Biome is resolved in this order:
|
|
45
|
+
1. **Project-local**: walks up from the edited file looking for `node_modules/.bin/biome`
|
|
46
|
+
2. **Global**: checks PATH via `which biome`
|
|
47
|
+
|
|
48
|
+
### dprint Configuration
|
|
49
|
+
|
|
50
|
+
The dprint formatter looks for a config file at `/usr/local/share/dprint/dprint.json`. If this file doesn't exist, dprint formatting is skipped.
|
|
51
|
+
|
|
52
|
+
### Timeouts
|
|
53
|
+
|
|
54
|
+
| Scope | Timeout |
|
|
55
|
+
|-------|---------|
|
|
56
|
+
| Entire Stop hook | 15s |
|
|
57
|
+
| Individual tool invocation | 10-12s |
|
|
58
|
+
|
|
59
|
+
## Conflict Warning
|
|
60
|
+
|
|
61
|
+
Do **not** enable this plugin alongside `auto-code-quality`. That plugin bundles its own formatter with the same functionality. Enabling both won't corrupt data (different temp file prefixes: `claude-edited-files-*` vs `claude-cq-*`), but files would be formatted twice.
|
|
62
|
+
|
|
63
|
+
## Plugin Structure
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
auto-formatter/
|
|
67
|
+
├── .claude-plugin/
|
|
68
|
+
│ └── plugin.json # Plugin metadata
|
|
69
|
+
├── hooks/
|
|
70
|
+
│ └── hooks.json # Stop hook registration
|
|
71
|
+
├── scripts/
|
|
72
|
+
│ └── format-on-stop.py # Batch formatter (Stop)
|
|
73
|
+
└── README.md # This file
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Requirements
|
|
77
|
+
|
|
78
|
+
- Python 3.11+
|
|
79
|
+
- Claude Code with plugin hook support
|
|
80
|
+
- `code-directive` plugin enabled (provides the file path collector)
|
|
81
|
+
- Install the formatting tools for the languages you work with — everything is optional
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# auto-linter
|
|
2
|
+
|
|
3
|
+
Claude Code plugin that batch-lints edited files when Claude finishes responding. Reads file paths collected by the `code-directive` plugin's `collect-edited-files.py` hook and lints each file using the appropriate tool. Lint results are returned as advisory context — never blocking.
|
|
4
|
+
|
|
5
|
+
## What It Does
|
|
6
|
+
|
|
7
|
+
When Claude stops responding, the plugin reads the session's list of edited files, lints each one, and injects any warnings as `additionalContext` so Claude sees them on its next response.
|
|
8
|
+
|
|
9
|
+
| Language / File Type | Linter(s) |
|
|
10
|
+
|----------------------|-----------|
|
|
11
|
+
| Python (`.py`, `.pyi`) | [pyright](https://github.com/microsoft/pyright) (type checking) + [ruff check](https://docs.astral.sh/ruff/) (style/correctness) |
|
|
12
|
+
| JS/TS/CSS/GraphQL (`.js`, `.jsx`, `.ts`, `.tsx`, `.css`, `.graphql`, `.gql`) | [biome lint](https://biomejs.dev/) |
|
|
13
|
+
| Shell (`.sh`, `.bash`, `.zsh`, `.mksh`, `.bats`) | [shellcheck](https://github.com/koalaman/shellcheck) |
|
|
14
|
+
| Go (`.go`) | go vet (bundled with Go) |
|
|
15
|
+
| Dockerfile | [hadolint](https://github.com/hadolint/hadolint) |
|
|
16
|
+
| Rust (`.rs`) | [clippy](https://doc.rust-lang.org/clippy/) (via cargo) |
|
|
17
|
+
|
|
18
|
+
All linting is non-blocking. Missing tools are silently skipped. The plugin always exits 0 and returns warnings as `additionalContext` — it will never interrupt Claude.
|
|
19
|
+
|
|
20
|
+
## How It Works
|
|
21
|
+
|
|
22
|
+
### Hook Lifecycle
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
code-directive's collect-edited-files.py (PostToolUse on Edit/Write)
|
|
26
|
+
│
|
|
27
|
+
└─→ Appends edited file path to /tmp/claude-lint-files-{session_id}
|
|
28
|
+
│
|
|
29
|
+
│ ... Claude keeps working ...
|
|
30
|
+
│
|
|
31
|
+
Claude stops responding (Stop event)
|
|
32
|
+
│
|
|
33
|
+
└─→ lint-file.py reads the temp file, deduplicates paths,
|
|
34
|
+
lints each file by extension, groups results by linter,
|
|
35
|
+
injects warnings as additionalContext, then cleans up
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Dependency on code-directive
|
|
39
|
+
|
|
40
|
+
This plugin relies on the `code-directive` plugin's `collect-edited-files.py` PostToolUse hook to write edited file paths to `/tmp/claude-lint-files-{session_id}`. Both plugins must be enabled for linting to work.
|
|
41
|
+
|
|
42
|
+
### Output Format
|
|
43
|
+
|
|
44
|
+
Lint results are grouped by linter and returned as `additionalContext`. Each file shows up to 5 issues with severity, line number, and message:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
[Auto-linter] Pyright results:
|
|
48
|
+
example.py: 2 issue(s)
|
|
49
|
+
✗ Line 15: Cannot assign type "str" to declared type "int"
|
|
50
|
+
! Line 42: Variable "x" is not defined
|
|
51
|
+
|
|
52
|
+
[Auto-linter] Ruff results:
|
|
53
|
+
example.py: 1 issue(s)
|
|
54
|
+
! Line 8: [F401] `os` imported but unused
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Biome Discovery
|
|
58
|
+
|
|
59
|
+
Biome is resolved in this order:
|
|
60
|
+
1. **Project-local**: walks up from the edited file looking for `node_modules/.bin/biome`
|
|
61
|
+
2. **Global**: checks PATH via `which biome`
|
|
62
|
+
|
|
63
|
+
### Timeouts
|
|
64
|
+
|
|
65
|
+
| Scope | Timeout |
|
|
66
|
+
|-------|---------|
|
|
67
|
+
| Entire Stop hook | 60s |
|
|
68
|
+
| Individual tool invocation | 10s |
|
|
69
|
+
|
|
70
|
+
## Conflict Warning
|
|
71
|
+
|
|
72
|
+
Do **not** enable this plugin alongside `auto-code-quality`. That plugin bundles its own linter with the same functionality. Enabling both won't corrupt data (different temp file prefixes: `claude-lint-files-*` vs `claude-cq-*`), but files would be linted twice.
|
|
73
|
+
|
|
74
|
+
## Plugin Structure
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
auto-linter/
|
|
78
|
+
├── .claude-plugin/
|
|
79
|
+
│ └── plugin.json # Plugin metadata
|
|
80
|
+
├── hooks/
|
|
81
|
+
│ └── hooks.json # Stop hook registration
|
|
82
|
+
├── scripts/
|
|
83
|
+
│ └── lint-file.py # Batch linter (Stop)
|
|
84
|
+
└── README.md # This file
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Requirements
|
|
88
|
+
|
|
89
|
+
- Python 3.11+
|
|
90
|
+
- Claude Code with plugin hook support
|
|
91
|
+
- `code-directive` plugin enabled (provides the file path collector)
|
|
92
|
+
- Install the linting tools for the languages you work with — everything is optional
|