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.
Files changed (136) hide show
  1. package/.devcontainer/.env +4 -6
  2. package/.devcontainer/.env.example +29 -0
  3. package/.devcontainer/.gitignore +8 -0
  4. package/.devcontainer/.secrets.example +12 -0
  5. package/.devcontainer/CHANGELOG.md +130 -0
  6. package/.devcontainer/CLAUDE.md +56 -19
  7. package/.devcontainer/README.md +111 -56
  8. package/.devcontainer/config/{main-system-prompt.md → defaults/main-system-prompt.md} +72 -0
  9. package/.devcontainer/config/file-manifest.json +20 -0
  10. package/.devcontainer/devcontainer.json +20 -0
  11. package/.devcontainer/docs/configuration-reference.md +90 -0
  12. package/.devcontainer/docs/keybindings.md +100 -0
  13. package/.devcontainer/docs/optional-features.md +129 -0
  14. package/.devcontainer/docs/plugins.md +154 -0
  15. package/.devcontainer/docs/troubleshooting.md +128 -0
  16. package/.devcontainer/features/agent-browser/install.sh +6 -0
  17. package/.devcontainer/features/ast-grep/install.sh +6 -0
  18. package/.devcontainer/features/biome/README.md +27 -0
  19. package/.devcontainer/features/biome/install.sh +6 -0
  20. package/.devcontainer/features/ccburn/install.sh +6 -0
  21. package/.devcontainer/features/ccstatusline/devcontainer-feature.json +5 -0
  22. package/.devcontainer/features/ccstatusline/install.sh +7 -0
  23. package/.devcontainer/features/ccusage/install.sh +6 -0
  24. package/.devcontainer/features/claude-monitor/install.sh +6 -0
  25. package/.devcontainer/features/dprint/README.md +30 -0
  26. package/.devcontainer/features/dprint/devcontainer-feature.json +18 -0
  27. package/.devcontainer/features/dprint/install.sh +131 -0
  28. package/.devcontainer/features/hadolint/README.md +35 -0
  29. package/.devcontainer/features/hadolint/devcontainer-feature.json +13 -0
  30. package/.devcontainer/features/hadolint/install.sh +86 -0
  31. package/.devcontainer/features/lsp-servers/devcontainer-feature.json +5 -0
  32. package/.devcontainer/features/lsp-servers/install.sh +7 -0
  33. package/.devcontainer/features/mcp-qdrant/devcontainer-feature.json +5 -0
  34. package/.devcontainer/features/mcp-qdrant/install.sh +13 -6
  35. package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +5 -0
  36. package/.devcontainer/features/mcp-reasoner/install.sh +8 -1
  37. package/.devcontainer/features/notify-hook/devcontainer-feature.json +5 -0
  38. package/.devcontainer/features/notify-hook/install.sh +7 -0
  39. package/.devcontainer/features/ruff/README.md +26 -0
  40. package/.devcontainer/features/ruff/devcontainer-feature.json +21 -0
  41. package/.devcontainer/features/ruff/install.sh +74 -0
  42. package/.devcontainer/features/shellcheck/README.md +38 -0
  43. package/.devcontainer/features/shellcheck/devcontainer-feature.json +13 -0
  44. package/.devcontainer/features/shellcheck/install.sh +24 -0
  45. package/.devcontainer/features/shfmt/README.md +37 -0
  46. package/.devcontainer/features/shfmt/devcontainer-feature.json +13 -0
  47. package/.devcontainer/features/shfmt/install.sh +85 -0
  48. package/.devcontainer/features/splitrail/devcontainer-feature.json +5 -0
  49. package/.devcontainer/features/splitrail/install.sh +7 -0
  50. package/.devcontainer/features/tmux/install.sh +8 -0
  51. package/.devcontainer/features/tree-sitter/install.sh +6 -0
  52. package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +3 -10
  53. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/.claude-plugin/plugin.json +1 -1
  54. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/__pycache__/format-on-stop.cpython-314.pyc +0 -0
  55. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/format-on-stop.py +114 -9
  56. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/.claude-plugin/plugin.json +1 -1
  57. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/hooks/hooks.json +4 -5
  58. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/__pycache__/lint-file.cpython-314.pyc +0 -0
  59. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/lint-file.py +478 -76
  60. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/.claude-plugin/plugin.json +1 -1
  61. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/AGENT-REDIRECTION.md +226 -0
  62. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +17 -0
  63. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/bash-exec.md +4 -4
  64. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/claude-guide.md +14 -23
  65. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/debug-logs.md +2 -0
  66. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/dependency-analyst.md +2 -0
  67. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +13 -0
  68. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +2 -0
  69. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +10 -1
  70. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/migrator.md +6 -0
  71. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/refactorer.md +4 -0
  72. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +36 -23
  73. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/statusline-config.md +3 -3
  74. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/test-writer.md +3 -0
  75. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +39 -0
  76. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/advisory-test-runner.cpython-314.pyc +0 -0
  77. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/collect-edited-files.cpython-314.pyc +0 -0
  78. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/commit-reminder.cpython-314.pyc +0 -0
  79. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/git-state-injector.cpython-314.pyc +0 -0
  80. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/redirect-builtin-agents.cpython-314.pyc +0 -0
  81. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/ticket-linker.cpython-314.pyc +0 -0
  82. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/todo-harvester.cpython-314.pyc +0 -0
  83. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/advisory-test-runner.py +174 -0
  84. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/collect-edited-files.py +8 -6
  85. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/commit-reminder.py +90 -0
  86. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/git-state-injector.py +114 -0
  87. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/skill-suggester.py +61 -0
  88. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/ticket-linker.py +137 -0
  89. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/todo-harvester.py +130 -0
  90. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/SKILL.md +224 -0
  91. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/error-handling.md +166 -0
  92. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/rest-conventions.md +215 -0
  93. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/SKILL.md +211 -0
  94. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/references/language-patterns.md +327 -0
  95. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/SKILL.md +134 -0
  96. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/ecosystem-commands.md +264 -0
  97. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/license-compliance.md +80 -0
  98. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/SKILL.md +153 -0
  99. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/api-doc-templates.md +221 -0
  100. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/docstring-formats.md +296 -0
  101. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/SKILL.md +150 -0
  102. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/javascript-migrations.md +179 -0
  103. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/python-migrations.md +141 -0
  104. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/SKILL.md +32 -0
  105. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/__pycache__/block-dangerous.cpython-314.pyc +0 -0
  106. package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/hooks/hooks.json +1 -1
  107. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/__pycache__/guard-protected.cpython-314.pyc +0 -0
  108. package/.devcontainer/scripts/check-setup.sh +72 -0
  109. package/.devcontainer/scripts/setup-aliases.sh +43 -3
  110. package/.devcontainer/scripts/setup-auth.sh +74 -0
  111. package/.devcontainer/scripts/setup-config.sh +112 -22
  112. package/.devcontainer/scripts/setup-update-claude.sh +8 -0
  113. package/.devcontainer/scripts/setup.sh +46 -13
  114. package/README.md +23 -190
  115. package/package.json +1 -1
  116. package/setup.js +245 -71
  117. package/.devcontainer/features/claude-code/README.md +0 -498
  118. package/.devcontainer/features/claude-code/config/settings.json +0 -72
  119. package/.devcontainer/features/claude-code/config/system-prompt.md +0 -118
  120. package/.devcontainer/features/claude-code/config/world-building-sp.md +0 -1432
  121. package/.devcontainer/features/claude-code/devcontainer-feature.json +0 -42
  122. package/.devcontainer/features/claude-code/install.sh +0 -466
  123. package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/.claude-plugin/plugin.json +0 -7
  124. package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/hooks/hooks.json +0 -17
  125. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/.claude-plugin/plugin.json +0 -6
  126. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/config/planning-instructions.md +0 -14
  127. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/functional-conjuring-map.md +0 -989
  128. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/hooks/hooks.json +0 -33
  129. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/__pycache__/post-enhance-task.cpython-314.pyc +0 -0
  130. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhance-planning.py +0 -71
  131. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-plan.sh +0 -68
  132. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-task.sh +0 -120
  133. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-plan.py +0 -133
  134. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-task.py +0 -253
  135. /package/.devcontainer/config/{keybindings.json → defaults/keybindings.json} +0 -0
  136. /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="/tmp/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
- # Make cache world-readable/writable since it's in /tmp
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: "/tmp/fastembed_cache",
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: "/tmp/fastembed_cache",
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 vscode:vscode "$SETTINGS_FILE" 2>/dev/null || true
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 vscode:vscode "$SETTINGS_FILE" 2>/dev/null || true
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": "Auto-formats files after editing (black for Python, gofmt for Go)",
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 after editing (pyright for Python)",
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": "Coding standards and skills for the CodeDirective project",
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"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auto-formatter",
3
- "description": "Batch-formats edited files at Stop (Black for Python, gofmt for Go, Biome for JS/TS/CSS)",
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
  }