codeforge-dev 1.7.0 → 1.8.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 +4 -6
- package/.devcontainer/.env.example +29 -0
- package/.devcontainer/.gitignore +8 -0
- package/.devcontainer/.secrets.example +12 -0
- package/.devcontainer/CHANGELOG.md +130 -0
- package/.devcontainer/CLAUDE.md +56 -19
- package/.devcontainer/README.md +111 -56
- package/.devcontainer/config/{main-system-prompt.md → defaults/main-system-prompt.md} +72 -0
- package/.devcontainer/config/file-manifest.json +20 -0
- package/.devcontainer/devcontainer.json +20 -0
- package/.devcontainer/docs/configuration-reference.md +90 -0
- package/.devcontainer/docs/keybindings.md +100 -0
- package/.devcontainer/docs/optional-features.md +129 -0
- package/.devcontainer/docs/plugins.md +154 -0
- package/.devcontainer/docs/troubleshooting.md +128 -0
- package/.devcontainer/features/agent-browser/install.sh +6 -0
- package/.devcontainer/features/ast-grep/install.sh +6 -0
- package/.devcontainer/features/biome/README.md +27 -0
- package/.devcontainer/features/biome/install.sh +6 -0
- package/.devcontainer/features/ccburn/install.sh +6 -0
- package/.devcontainer/features/ccstatusline/devcontainer-feature.json +5 -0
- package/.devcontainer/features/ccstatusline/install.sh +7 -0
- package/.devcontainer/features/ccusage/install.sh +6 -0
- package/.devcontainer/features/claude-monitor/install.sh +6 -0
- package/.devcontainer/features/dprint/README.md +30 -0
- package/.devcontainer/features/dprint/devcontainer-feature.json +18 -0
- package/.devcontainer/features/dprint/install.sh +131 -0
- package/.devcontainer/features/hadolint/README.md +35 -0
- package/.devcontainer/features/hadolint/devcontainer-feature.json +13 -0
- package/.devcontainer/features/hadolint/install.sh +86 -0
- package/.devcontainer/features/lsp-servers/devcontainer-feature.json +5 -0
- package/.devcontainer/features/lsp-servers/install.sh +7 -0
- package/.devcontainer/features/mcp-qdrant/devcontainer-feature.json +5 -0
- package/.devcontainer/features/mcp-qdrant/install.sh +13 -6
- package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +5 -0
- package/.devcontainer/features/mcp-reasoner/install.sh +8 -1
- package/.devcontainer/features/notify-hook/devcontainer-feature.json +5 -0
- package/.devcontainer/features/notify-hook/install.sh +7 -0
- package/.devcontainer/features/ruff/README.md +26 -0
- package/.devcontainer/features/ruff/devcontainer-feature.json +21 -0
- package/.devcontainer/features/ruff/install.sh +74 -0
- package/.devcontainer/features/shellcheck/README.md +38 -0
- package/.devcontainer/features/shellcheck/devcontainer-feature.json +13 -0
- package/.devcontainer/features/shellcheck/install.sh +24 -0
- package/.devcontainer/features/shfmt/README.md +37 -0
- package/.devcontainer/features/shfmt/devcontainer-feature.json +13 -0
- package/.devcontainer/features/shfmt/install.sh +85 -0
- package/.devcontainer/features/splitrail/devcontainer-feature.json +5 -0
- package/.devcontainer/features/splitrail/install.sh +7 -0
- package/.devcontainer/features/tmux/install.sh +8 -0
- package/.devcontainer/features/tree-sitter/install.sh +6 -0
- package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +3 -10
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/.claude-plugin/plugin.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/__pycache__/format-on-stop.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/format-on-stop.py +114 -9
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/.claude-plugin/plugin.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/hooks/hooks.json +4 -5
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/__pycache__/lint-file.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/lint-file.py +478 -76
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/.claude-plugin/plugin.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/AGENT-REDIRECTION.md +226 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +17 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/bash-exec.md +4 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/claude-guide.md +14 -23
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/debug-logs.md +2 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/dependency-analyst.md +2 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +13 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +2 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +10 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/migrator.md +6 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/refactorer.md +4 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +36 -23
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/statusline-config.md +3 -3
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/test-writer.md +3 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +39 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/advisory-test-runner.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/collect-edited-files.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/commit-reminder.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/git-state-injector.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/redirect-builtin-agents.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/ticket-linker.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/todo-harvester.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/advisory-test-runner.py +174 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/collect-edited-files.py +8 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/commit-reminder.py +90 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/git-state-injector.py +114 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/skill-suggester.py +61 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/ticket-linker.py +137 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/todo-harvester.py +130 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/SKILL.md +224 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/error-handling.md +166 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/rest-conventions.md +215 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/SKILL.md +211 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/references/language-patterns.md +327 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/SKILL.md +134 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/ecosystem-commands.md +264 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/license-compliance.md +80 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/SKILL.md +153 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/api-doc-templates.md +221 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/docstring-formats.md +296 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/SKILL.md +150 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/javascript-migrations.md +179 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/python-migrations.md +141 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/SKILL.md +32 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/__pycache__/block-dangerous.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/hooks/hooks.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/__pycache__/guard-protected.cpython-314.pyc +0 -0
- package/.devcontainer/scripts/check-setup.sh +72 -0
- package/.devcontainer/scripts/setup-aliases.sh +43 -3
- package/.devcontainer/scripts/setup-auth.sh +74 -0
- package/.devcontainer/scripts/setup-config.sh +112 -22
- package/.devcontainer/scripts/setup-update-claude.sh +8 -0
- package/.devcontainer/scripts/setup.sh +46 -13
- package/README.md +23 -190
- package/package.json +1 -1
- package/setup.js +245 -71
- package/.devcontainer/features/claude-code/README.md +0 -498
- package/.devcontainer/features/claude-code/config/settings.json +0 -72
- package/.devcontainer/features/claude-code/config/system-prompt.md +0 -118
- package/.devcontainer/features/claude-code/config/world-building-sp.md +0 -1432
- package/.devcontainer/features/claude-code/devcontainer-feature.json +0 -42
- package/.devcontainer/features/claude-code/install.sh +0 -466
- package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/.claude-plugin/plugin.json +0 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/hooks/hooks.json +0 -17
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/.claude-plugin/plugin.json +0 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/config/planning-instructions.md +0 -14
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/functional-conjuring-map.md +0 -989
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/hooks/hooks.json +0 -33
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/__pycache__/post-enhance-task.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhance-planning.py +0 -71
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-plan.sh +0 -68
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-task.sh +0 -120
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-plan.py +0 -133
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-task.py +0 -253
- /package/.devcontainer/config/{keybindings.json → defaults/keybindings.json} +0 -0
- /package/.devcontainer/config/{settings.json → defaults/settings.json} +0 -0
|
@@ -4,6 +4,14 @@ set -euo pipefail
|
|
|
4
4
|
# Import options from devcontainer-feature.json
|
|
5
5
|
# NOTE: DevContainer converts camelCase options to UPPERCASE without underscores
|
|
6
6
|
# Example: "qdrantUrl" becomes $QDRANTURL (not $QDRANT_URL)
|
|
7
|
+
VERSION="${VERSION:-latest}"
|
|
8
|
+
|
|
9
|
+
# Skip installation if version is "none"
|
|
10
|
+
if [ "${VERSION}" = "none" ]; then
|
|
11
|
+
echo "[mcp-qdrant] Skipping installation (version=none)"
|
|
12
|
+
exit 0
|
|
13
|
+
fi
|
|
14
|
+
|
|
7
15
|
QDRANT_URL="${QDRANTURL:-}"
|
|
8
16
|
QDRANT_API_KEY="${QDRANTAPIKEY:-}"
|
|
9
17
|
QDRANT_LOCAL_PATH="${QDRANTLOCALPATH:-/workspaces/.qdrant/storage}"
|
|
@@ -76,7 +84,7 @@ pip uninstall hf-xet -y 2>/dev/null || true
|
|
|
76
84
|
# Pre-download the embedding model from GCS (more reliable than HuggingFace Hub in containers)
|
|
77
85
|
# This is critical to avoid network timeouts from huggingface_hub
|
|
78
86
|
echo "[mcp-qdrant] Pre-downloading embedding model from GCS..."
|
|
79
|
-
FASTEMBED_CACHE="/
|
|
87
|
+
FASTEMBED_CACHE="/workspaces/.qdrant/fastembed_cache"
|
|
80
88
|
mkdir -p "${FASTEMBED_CACHE}"
|
|
81
89
|
|
|
82
90
|
# Map embedding model names to GCS URLs and legacy cache directory names
|
|
@@ -117,8 +125,7 @@ if [ -n "${MODEL_URL}" ]; then
|
|
|
117
125
|
# Remove macOS extended attribute files
|
|
118
126
|
find "${FASTEMBED_CACHE}" -name "._*" -delete 2>/dev/null || true
|
|
119
127
|
rm -f "${TEMP_TAR}"
|
|
120
|
-
|
|
121
|
-
chmod -R 777 "${FASTEMBED_CACHE}" 2>/dev/null || true
|
|
128
|
+
chmod -R 755 "${FASTEMBED_CACHE}" 2>/dev/null || true
|
|
122
129
|
echo "[mcp-qdrant] ✓ Embedding model pre-downloaded to ${FASTEMBED_CACHE}/${MODEL_DIR}"
|
|
123
130
|
else
|
|
124
131
|
echo "[mcp-qdrant] WARNING: Failed to download model from GCS"
|
|
@@ -208,7 +215,7 @@ if [ -n "$QDRANT_URL" ]; then
|
|
|
208
215
|
args: ["mcp-server-qdrant"],
|
|
209
216
|
env: {
|
|
210
217
|
HF_HUB_OFFLINE: "1",
|
|
211
|
-
FASTEMBED_CACHE_PATH: "/
|
|
218
|
+
FASTEMBED_CACHE_PATH: "/workspaces/.qdrant/fastembed_cache",
|
|
212
219
|
QDRANT_URL: $url,
|
|
213
220
|
QDRANT_API_KEY: $key,
|
|
214
221
|
COLLECTION_NAME: $collection
|
|
@@ -224,7 +231,7 @@ else
|
|
|
224
231
|
args: ["mcp-server-qdrant"],
|
|
225
232
|
env: {
|
|
226
233
|
HF_HUB_OFFLINE: "1",
|
|
227
|
-
FASTEMBED_CACHE_PATH: "/
|
|
234
|
+
FASTEMBED_CACHE_PATH: "/workspaces/.qdrant/fastembed_cache",
|
|
228
235
|
QDRANT_LOCAL_PATH: $path,
|
|
229
236
|
COLLECTION_NAME: $collection
|
|
230
237
|
}
|
|
@@ -250,7 +257,7 @@ fi
|
|
|
250
257
|
|
|
251
258
|
# Set proper permissions
|
|
252
259
|
chmod 644 "$SETTINGS_FILE"
|
|
253
|
-
chown
|
|
260
|
+
chown "$(id -un):$(id -gn)" "$SETTINGS_FILE" 2>/dev/null || true
|
|
254
261
|
|
|
255
262
|
echo "[mcp-qdrant] ✓ Configuration complete"
|
|
256
263
|
HOOK_EOF
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
"maintainer": "AnExiledDev",
|
|
7
7
|
"documentationURL": "https://github.com/Jacck/mcp-reasoner",
|
|
8
8
|
"options": {
|
|
9
|
+
"version": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "Version to install (or 'none' to skip installation)",
|
|
12
|
+
"default": "latest"
|
|
13
|
+
},
|
|
9
14
|
"username": {
|
|
10
15
|
"type": "string",
|
|
11
16
|
"description": "Container user to install for",
|
|
@@ -4,8 +4,15 @@ set -euo pipefail
|
|
|
4
4
|
# No cleanup needed - using CLI instead of temp files
|
|
5
5
|
|
|
6
6
|
# Import options
|
|
7
|
+
VERSION="${VERSION:-latest}"
|
|
7
8
|
USERNAME="${USERNAME:-automatic}"
|
|
8
9
|
|
|
10
|
+
# Skip installation if version is "none"
|
|
11
|
+
if [ "${VERSION}" = "none" ]; then
|
|
12
|
+
echo "[mcp-reasoner] Skipping installation (version=none)"
|
|
13
|
+
exit 0
|
|
14
|
+
fi
|
|
15
|
+
|
|
9
16
|
echo "[mcp-reasoner] Starting MCP Reasoner installation..."
|
|
10
17
|
|
|
11
18
|
# Source NVM (Node is installed via NVM by the node feature)
|
|
@@ -145,7 +152,7 @@ fi
|
|
|
145
152
|
|
|
146
153
|
# Set proper permissions
|
|
147
154
|
chmod 644 "$SETTINGS_FILE"
|
|
148
|
-
chown
|
|
155
|
+
chown "$(id -un):$(id -gn)" "$SETTINGS_FILE" 2>/dev/null || true
|
|
149
156
|
|
|
150
157
|
echo "[mcp-reasoner] ✓ Configuration complete"
|
|
151
158
|
HOOK_EOF
|
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
"description": "Desktop notifications and audio chime when Claude finishes responding",
|
|
6
6
|
"documentationURL": "https://github.com/AnExiledDev/CodeForge",
|
|
7
7
|
"options": {
|
|
8
|
+
"version": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "Version to install (or 'none' to skip installation)",
|
|
11
|
+
"default": "latest"
|
|
12
|
+
},
|
|
8
13
|
"enableBell": {
|
|
9
14
|
"type": "boolean",
|
|
10
15
|
"description": "Enable terminal bell (audio chime) on completion",
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
+
VERSION="${VERSION:-latest}"
|
|
4
5
|
ENABLEBELL="${ENABLEBELL:-true}"
|
|
5
6
|
ENABLEOSC="${ENABLEOSC:-true}"
|
|
6
7
|
|
|
8
|
+
# Skip installation if version is "none"
|
|
9
|
+
if [ "${VERSION}" = "none" ]; then
|
|
10
|
+
echo "[notify-hook] Skipping installation (version=none)"
|
|
11
|
+
exit 0
|
|
12
|
+
fi
|
|
13
|
+
|
|
7
14
|
echo "[notify-hook] Starting installation..."
|
|
8
15
|
echo "[notify-hook] Bell enabled: ${ENABLEBELL}"
|
|
9
16
|
echo "[notify-hook] OSC notifications enabled: ${ENABLEOSC}"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Ruff
|
|
2
|
+
|
|
3
|
+
Fast Python linter and formatter, replacing Black + Flake8.
|
|
4
|
+
|
|
5
|
+
## What It Does
|
|
6
|
+
|
|
7
|
+
Installs [Ruff](https://docs.astral.sh/ruff/) via `uv tool install`. Ruff is an extremely fast Python linter and formatter written in Rust, compatible with Flake8, isort, and Black rules.
|
|
8
|
+
|
|
9
|
+
## Options
|
|
10
|
+
|
|
11
|
+
| Option | Default | Description |
|
|
12
|
+
|--------|---------|-------------|
|
|
13
|
+
| `version` | `latest` | Ruff version to install. Set `"none"` to skip. |
|
|
14
|
+
| `username` | `automatic` | Container user to install for. |
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
ruff check . # lint
|
|
20
|
+
ruff check --fix . # lint and auto-fix
|
|
21
|
+
ruff format . # format (Black-compatible)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Configuration
|
|
25
|
+
|
|
26
|
+
Used by both `auto-formatter` (formatting) and `auto-linter` (linting) plugins for Python files. For project-specific config, add a `[tool.ruff]` section to `pyproject.toml` or create a `ruff.toml`. See [Ruff docs](https://docs.astral.sh/ruff/configuration/).
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
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": "latest",
|
|
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": [
|
|
19
|
+
"ghcr.io/devcontainers-extra/features/uv"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# ==============================
|
|
5
|
+
# Ruff DevContainer Feature
|
|
6
|
+
# Installs via uv tool install
|
|
7
|
+
# ==============================
|
|
8
|
+
|
|
9
|
+
RUFF_VERSION="${VERSION:-latest}"
|
|
10
|
+
USERNAME="${USERNAME:-automatic}"
|
|
11
|
+
|
|
12
|
+
# Skip installation if version is "none"
|
|
13
|
+
if [ "${RUFF_VERSION}" = "none" ]; then
|
|
14
|
+
echo "[ruff] Skipping installation (version=none)"
|
|
15
|
+
exit 0
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
echo "[ruff] Starting installation..."
|
|
19
|
+
|
|
20
|
+
# ---------- USER ----------
|
|
21
|
+
if [[ "${USERNAME}" == "auto" || "${USERNAME}" == "automatic" ]]; then
|
|
22
|
+
for u in vscode node codespace; do
|
|
23
|
+
if id -u "$u" >/dev/null 2>&1; then
|
|
24
|
+
USERNAME="$u"
|
|
25
|
+
break
|
|
26
|
+
fi
|
|
27
|
+
done
|
|
28
|
+
USERNAME="${USERNAME:-root}"
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
USER_HOME="$(eval echo "~${USERNAME}")"
|
|
32
|
+
|
|
33
|
+
echo "[ruff] Target user: ${USERNAME}"
|
|
34
|
+
echo "[ruff] Version: ${RUFF_VERSION}"
|
|
35
|
+
|
|
36
|
+
run_as_user() {
|
|
37
|
+
sudo -u "${USERNAME}" env \
|
|
38
|
+
HOME="${USER_HOME}" \
|
|
39
|
+
"$@"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# ---------- UV DISCOVERY ----------
|
|
43
|
+
find_uv() {
|
|
44
|
+
command -v uv 2>/dev/null && return 0
|
|
45
|
+
for p in /usr/local/bin/uv /usr/bin/uv /opt/uv/bin/uv; do
|
|
46
|
+
[[ -x "$p" ]] && echo "$p" && return 0
|
|
47
|
+
done
|
|
48
|
+
find /usr /opt -maxdepth 4 -type f -name uv -executable 2>/dev/null | head -n 1
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
# ---------- INSTALL ----------
|
|
52
|
+
UV_BIN="$(find_uv || true)"
|
|
53
|
+
if [[ -z "${UV_BIN}" ]]; then
|
|
54
|
+
echo "[ruff] ERROR: uv is not installed" >&2
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
echo "[ruff] Using uv at: ${UV_BIN}"
|
|
59
|
+
|
|
60
|
+
if [[ "${RUFF_VERSION}" == "latest" ]]; then
|
|
61
|
+
run_as_user "${UV_BIN}" tool install ruff
|
|
62
|
+
else
|
|
63
|
+
run_as_user "${UV_BIN}" tool install "ruff==${RUFF_VERSION}"
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# ---------- VERIFY ----------
|
|
67
|
+
BIN_DIR="${USER_HOME}/.local/bin"
|
|
68
|
+
if [[ -x "${BIN_DIR}/ruff" ]]; then
|
|
69
|
+
INSTALLED="$("${BIN_DIR}/ruff" --version 2>/dev/null || echo "unknown")"
|
|
70
|
+
echo "[ruff] Installed: ${INSTALLED}"
|
|
71
|
+
else
|
|
72
|
+
echo "[ruff] ERROR: ruff not found in ${BIN_DIR}" >&2
|
|
73
|
+
exit 1
|
|
74
|
+
fi
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# ShellCheck
|
|
2
|
+
|
|
3
|
+
Static analysis tool for shell scripts.
|
|
4
|
+
|
|
5
|
+
## What It Does
|
|
6
|
+
|
|
7
|
+
Installs [ShellCheck](https://www.shellcheck.net/) via apt. ShellCheck finds bugs and style issues in bash/sh/zsh scripts, catching common pitfalls like unquoted variables, incorrect test syntax, and POSIX compatibility issues.
|
|
8
|
+
|
|
9
|
+
## Options
|
|
10
|
+
|
|
11
|
+
| Option | Default | Description |
|
|
12
|
+
|--------|---------|-------------|
|
|
13
|
+
| `version` | `latest` | Version to install (or `"none"` to skip). |
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
shellcheck script.sh
|
|
19
|
+
shellcheck -x script.sh # follow source'd files
|
|
20
|
+
shellcheck -f json script.sh # JSON output
|
|
21
|
+
shellcheck -e SC2086 script.sh # exclude specific rule
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Configuration
|
|
25
|
+
|
|
26
|
+
Used by the `auto-linter` plugin to lint shell scripts. For per-file directives, add comments at the top of your script:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# shellcheck disable=SC2086
|
|
30
|
+
# shellcheck shell=bash
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
For project-wide config, create a `.shellcheckrc`:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
disable=SC2086,SC2034
|
|
37
|
+
shell=bash
|
|
38
|
+
```
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "shellcheck",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"name": "ShellCheck",
|
|
5
|
+
"description": "Static analysis tool for shell scripts",
|
|
6
|
+
"options": {
|
|
7
|
+
"version": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "Version to install (or 'none' to skip installation)",
|
|
10
|
+
"default": "latest"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# ==============================
|
|
5
|
+
# ShellCheck DevContainer Feature
|
|
6
|
+
# Installed via apt
|
|
7
|
+
# ==============================
|
|
8
|
+
|
|
9
|
+
VERSION="${VERSION:-latest}"
|
|
10
|
+
|
|
11
|
+
# Skip installation if version is "none"
|
|
12
|
+
if [ "${VERSION}" = "none" ]; then
|
|
13
|
+
echo "[shellcheck] Skipping installation (version=none)"
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
echo "[shellcheck] Starting installation..."
|
|
18
|
+
|
|
19
|
+
apt-get update -y
|
|
20
|
+
apt-get install -y --no-install-recommends shellcheck
|
|
21
|
+
apt-get clean -y
|
|
22
|
+
rm -rf /var/lib/apt/lists/*
|
|
23
|
+
|
|
24
|
+
echo "[shellcheck] Installed: $(shellcheck --version 2>/dev/null | head -2 || echo 'unknown')"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# shfmt
|
|
2
|
+
|
|
3
|
+
Shell script formatter supporting bash, mksh, and POSIX sh.
|
|
4
|
+
|
|
5
|
+
## What It Does
|
|
6
|
+
|
|
7
|
+
Installs [shfmt](https://github.com/mvdan/sh) as a static binary. shfmt formats shell scripts consistently, supporting bash, mksh, and POSIX sh dialects.
|
|
8
|
+
|
|
9
|
+
## Options
|
|
10
|
+
|
|
11
|
+
| Option | Default | Description |
|
|
12
|
+
|--------|---------|-------------|
|
|
13
|
+
| `version` | `v3.12.0` | shfmt version to install. Set `"latest"` for newest, `"none"` to skip. |
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
shfmt script.sh # print formatted output
|
|
19
|
+
shfmt -w script.sh # format in place
|
|
20
|
+
shfmt -d script.sh # show diff
|
|
21
|
+
shfmt -i 4 script.sh # use 4-space indent
|
|
22
|
+
shfmt -l . # list files that need formatting
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Configuration
|
|
26
|
+
|
|
27
|
+
Used by the `auto-formatter` plugin for shell script formatting. Default formatting uses shfmt's defaults (tabs for indentation). For project-specific config, create an `.editorconfig`:
|
|
28
|
+
|
|
29
|
+
```ini
|
|
30
|
+
[*.sh]
|
|
31
|
+
indent_style = space
|
|
32
|
+
indent_size = 4
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Checksum Verification
|
|
36
|
+
|
|
37
|
+
Downloads are verified against `sha256sums.txt` published with each GitHub release.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "shfmt",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"name": "shfmt",
|
|
5
|
+
"description": "Shell script formatter supporting bash, mksh, and POSIX sh",
|
|
6
|
+
"options": {
|
|
7
|
+
"version": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "v3.12.0",
|
|
10
|
+
"description": "shfmt version to install. Set 'latest' to always get newest."
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# ==============================
|
|
5
|
+
# shfmt DevContainer Feature
|
|
6
|
+
# Direct binary from GitHub releases
|
|
7
|
+
# ==============================
|
|
8
|
+
|
|
9
|
+
SHFMT_VERSION="${VERSION:-latest}"
|
|
10
|
+
|
|
11
|
+
# Skip installation if version is "none"
|
|
12
|
+
if [ "${SHFMT_VERSION}" = "none" ]; then
|
|
13
|
+
echo "[shfmt] Skipping installation (version=none)"
|
|
14
|
+
exit 0
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
echo "[shfmt] Starting installation..."
|
|
18
|
+
|
|
19
|
+
# ---------- HELPERS ----------
|
|
20
|
+
download_with_retry() {
|
|
21
|
+
local url="$1" dest="$2" retries="${3:-3}" delay="${4:-2}"
|
|
22
|
+
local attempt=1
|
|
23
|
+
while [ $attempt -le $retries ]; do
|
|
24
|
+
if curl -fsSL ${GITHUB_AUTH_HEADER:-} "$url" -o "$dest" 2>/dev/null; then
|
|
25
|
+
return 0
|
|
26
|
+
fi
|
|
27
|
+
echo "[shfmt] Download attempt $attempt/$retries failed, retrying in ${delay}s..."
|
|
28
|
+
sleep "$delay"
|
|
29
|
+
attempt=$((attempt + 1))
|
|
30
|
+
delay=$((delay * 2))
|
|
31
|
+
done
|
|
32
|
+
echo "[shfmt] ERROR: Download failed after $retries attempts: $url"
|
|
33
|
+
return 1
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# GitHub API auth header (avoids rate limiting)
|
|
37
|
+
GITHUB_AUTH_HEADER=""
|
|
38
|
+
if [ -n "${GH_TOKEN:-}" ] || [ -n "${GITHUB_TOKEN:-}" ]; then
|
|
39
|
+
GITHUB_AUTH_HEADER="-H Authorization: token ${GH_TOKEN:-$GITHUB_TOKEN}"
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
ARCH="$(dpkg --print-architecture)"
|
|
43
|
+
case "${ARCH}" in
|
|
44
|
+
amd64) GOARCH="amd64" ;;
|
|
45
|
+
arm64) GOARCH="arm64" ;;
|
|
46
|
+
*)
|
|
47
|
+
echo "[shfmt] ERROR: Unsupported architecture: ${ARCH}" >&2
|
|
48
|
+
exit 1
|
|
49
|
+
;;
|
|
50
|
+
esac
|
|
51
|
+
|
|
52
|
+
# Version pinned for reproducible builds. Set "latest" to always get newest.
|
|
53
|
+
if [[ "${SHFMT_VERSION}" == "latest" ]]; then
|
|
54
|
+
SHFMT_VERSION="$(curl -fsSL ${GITHUB_AUTH_HEADER:-} https://api.github.com/repos/mvdan/sh/releases/latest | grep -o '"tag_name": *"[^"]*"' | head -1 | cut -d'"' -f4)"
|
|
55
|
+
echo "[shfmt] Resolved latest version: ${SHFMT_VERSION}"
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
URL="https://github.com/mvdan/sh/releases/download/${SHFMT_VERSION}/shfmt_${SHFMT_VERSION}_linux_${GOARCH}"
|
|
59
|
+
echo "[shfmt] Downloading from: ${URL}"
|
|
60
|
+
|
|
61
|
+
TMP_DIR="$(mktemp -d)"
|
|
62
|
+
download_with_retry "${URL}" "${TMP_DIR}/shfmt"
|
|
63
|
+
|
|
64
|
+
# ---------- CHECKSUM VERIFICATION ----------
|
|
65
|
+
CHECKSUM_URL="https://github.com/mvdan/sh/releases/download/${SHFMT_VERSION}/sha256sums.txt"
|
|
66
|
+
if curl -fsSL "${CHECKSUM_URL}" -o "${TMP_DIR}/checksums.txt" 2>/dev/null; then
|
|
67
|
+
EXPECTED=$(grep "shfmt_${SHFMT_VERSION}_linux_${GOARCH}" "${TMP_DIR}/checksums.txt" | awk '{print $1}')
|
|
68
|
+
ACTUAL=$(sha256sum "${TMP_DIR}/shfmt" | cut -d' ' -f1)
|
|
69
|
+
if [ -n "$EXPECTED" ] && [ "$ACTUAL" != "$EXPECTED" ]; then
|
|
70
|
+
echo "[shfmt] ERROR: Checksum verification failed"
|
|
71
|
+
echo " Expected: $EXPECTED"
|
|
72
|
+
echo " Actual: $ACTUAL"
|
|
73
|
+
rm -rf "${TMP_DIR}"
|
|
74
|
+
exit 1
|
|
75
|
+
fi
|
|
76
|
+
echo "[shfmt] Checksum verified"
|
|
77
|
+
else
|
|
78
|
+
echo "[shfmt] WARNING: Could not fetch checksums, skipping verification"
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
cp "${TMP_DIR}/shfmt" /usr/local/bin/shfmt
|
|
82
|
+
chmod +x /usr/local/bin/shfmt
|
|
83
|
+
rm -rf "${TMP_DIR}"
|
|
84
|
+
|
|
85
|
+
echo "[shfmt] Installed: $(shfmt --version 2>/dev/null || echo 'unknown')"
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
"maintainer": "AnExiledDev",
|
|
7
7
|
"documentationURL": "https://github.com/Piebald-AI/splitrail",
|
|
8
8
|
"options": {
|
|
9
|
+
"version": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "Version to install (or 'none' to skip installation)",
|
|
12
|
+
"default": "latest"
|
|
13
|
+
},
|
|
9
14
|
"repoUrl": {
|
|
10
15
|
"type": "string",
|
|
11
16
|
"description": "Git repository URL for splitrail",
|
|
@@ -9,10 +9,17 @@ trap cleanup EXIT
|
|
|
9
9
|
|
|
10
10
|
# Import options
|
|
11
11
|
# NOTE: DevContainer converts camelCase to UPPERCASE without underscores
|
|
12
|
+
VERSION="${VERSION:-latest}"
|
|
12
13
|
REPO_URL="${REPOURL:-https://github.com/Piebald-AI/splitrail.git}"
|
|
13
14
|
BRANCH="${BRANCH:-main}"
|
|
14
15
|
USERNAME="${USERNAME:-automatic}"
|
|
15
16
|
|
|
17
|
+
# Skip installation if version is "none"
|
|
18
|
+
if [ "${VERSION}" = "none" ]; then
|
|
19
|
+
echo "[splitrail] Skipping installation (version=none)"
|
|
20
|
+
exit 0
|
|
21
|
+
fi
|
|
22
|
+
|
|
16
23
|
echo "[splitrail] Starting Splitrail installation..."
|
|
17
24
|
|
|
18
25
|
# Validate git is available
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
set -e
|
|
3
3
|
|
|
4
|
+
VERSION="${VERSION:-latest}"
|
|
5
|
+
|
|
6
|
+
# Skip installation if version is "none"
|
|
7
|
+
if [ "${VERSION}" = "none" ]; then
|
|
8
|
+
echo "[tmux] Skipping installation (version=none)"
|
|
9
|
+
exit 0
|
|
10
|
+
fi
|
|
11
|
+
|
|
4
12
|
echo "Installing tmux for Claude Code Agent Teams..."
|
|
5
13
|
|
|
6
14
|
# Install tmux via apt
|
|
@@ -9,6 +9,12 @@ INSTALL_CLI="${INSTALLCLI:-true}"
|
|
|
9
9
|
GRAMMARS="${GRAMMARS:-}"
|
|
10
10
|
USERNAME="${USERNAME:-automatic}"
|
|
11
11
|
|
|
12
|
+
# Skip installation if version is "none"
|
|
13
|
+
if [ "${VERSION}" = "none" ]; then
|
|
14
|
+
echo "[tree-sitter] Skipping installation (version=none)"
|
|
15
|
+
exit 0
|
|
16
|
+
fi
|
|
17
|
+
|
|
12
18
|
echo "[tree-sitter] Starting tree-sitter installation..."
|
|
13
19
|
echo "[tree-sitter] Options: version=${VERSION}, bindings=${BINDINGS}, cli=${INSTALL_CLI}"
|
|
14
20
|
|
|
@@ -60,13 +60,6 @@
|
|
|
60
60
|
"source": "./plugins/notify-hook",
|
|
61
61
|
"category": "productivity"
|
|
62
62
|
},
|
|
63
|
-
{
|
|
64
|
-
"name": "planning-reminder",
|
|
65
|
-
"description": "Encourages plan-before-implement workflow",
|
|
66
|
-
"version": "1.0.0",
|
|
67
|
-
"source": "./plugins/planning-reminder",
|
|
68
|
-
"category": "workflow"
|
|
69
|
-
},
|
|
70
63
|
{
|
|
71
64
|
"name": "dangerous-command-blocker",
|
|
72
65
|
"description": "Blocks dangerous bash commands (rm -rf, sudo rm, chmod 777, force push)",
|
|
@@ -83,21 +76,21 @@
|
|
|
83
76
|
},
|
|
84
77
|
{
|
|
85
78
|
"name": "auto-formatter",
|
|
86
|
-
"description": "
|
|
79
|
+
"description": "Batch-formats edited files at Stop (Ruff for Python, gofmt for Go, Biome for JS/TS/CSS/JSON/GraphQL/HTML, shfmt for Shell, dprint for Markdown/YAML/TOML/Dockerfile, rustfmt for Rust)",
|
|
87
80
|
"version": "1.0.0",
|
|
88
81
|
"source": "./plugins/auto-formatter",
|
|
89
82
|
"category": "development"
|
|
90
83
|
},
|
|
91
84
|
{
|
|
92
85
|
"name": "auto-linter",
|
|
93
|
-
"description": "Auto-lints files
|
|
86
|
+
"description": "Auto-lints edited files at Stop (Pyright + Ruff for Python, Biome for JS/TS/CSS/GraphQL, ShellCheck for Shell, go vet for Go, hadolint for Dockerfile, clippy for Rust)",
|
|
94
87
|
"version": "1.0.0",
|
|
95
88
|
"source": "./plugins/auto-linter",
|
|
96
89
|
"category": "development"
|
|
97
90
|
},
|
|
98
91
|
{
|
|
99
92
|
"name": "code-directive",
|
|
100
|
-
"description": "
|
|
93
|
+
"description": "17 custom agents, 16 coding skills, agent redirection, syntax validation, and skill auto-suggestion",
|
|
101
94
|
"version": "1.0.0",
|
|
102
95
|
"source": "./plugins/code-directive",
|
|
103
96
|
"category": "development"
|
package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/.claude-plugin/plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "auto-formatter",
|
|
3
|
-
"description": "Batch-formats edited files at Stop (
|
|
3
|
+
"description": "Batch-formats edited files at Stop (Ruff for Python, gofmt for Go, Biome for JS/TS/CSS/JSON/GraphQL/HTML, shfmt for Shell, dprint for Markdown/YAML/TOML/Dockerfile, rustfmt for Rust)",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "AnExiledDev"
|
|
6
6
|
}
|