codeforge-dev 1.5.8 → 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 (176) hide show
  1. package/.devcontainer/.env +4 -5
  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 +186 -0
  6. package/.devcontainer/CLAUDE.md +108 -21
  7. package/.devcontainer/README.md +173 -57
  8. package/.devcontainer/config/defaults/keybindings.json +5 -0
  9. package/.devcontainer/config/{main-system-prompt.md → defaults/main-system-prompt.md} +135 -2
  10. package/.devcontainer/config/{settings.json → defaults/settings.json} +25 -6
  11. package/.devcontainer/config/file-manifest.json +20 -0
  12. package/.devcontainer/devcontainer.json +38 -2
  13. package/.devcontainer/docs/configuration-reference.md +90 -0
  14. package/.devcontainer/docs/keybindings.md +100 -0
  15. package/.devcontainer/docs/optional-features.md +129 -0
  16. package/.devcontainer/docs/plugins.md +154 -0
  17. package/.devcontainer/docs/troubleshooting.md +128 -0
  18. package/.devcontainer/features/README.md +21 -7
  19. package/.devcontainer/features/agent-browser/install.sh +6 -0
  20. package/.devcontainer/features/ast-grep/install.sh +6 -0
  21. package/.devcontainer/features/biome/README.md +27 -0
  22. package/.devcontainer/features/biome/install.sh +6 -0
  23. package/.devcontainer/features/ccburn/README.md +60 -0
  24. package/.devcontainer/features/ccburn/devcontainer-feature.json +38 -0
  25. package/.devcontainer/features/ccburn/install.sh +180 -0
  26. package/.devcontainer/features/ccstatusline/README.md +22 -21
  27. package/.devcontainer/features/ccstatusline/devcontainer-feature.json +6 -1
  28. package/.devcontainer/features/ccstatusline/install.sh +55 -16
  29. package/.devcontainer/features/ccusage/install.sh +6 -0
  30. package/.devcontainer/features/claude-monitor/install.sh +6 -0
  31. package/.devcontainer/features/dprint/README.md +30 -0
  32. package/.devcontainer/features/dprint/devcontainer-feature.json +18 -0
  33. package/.devcontainer/features/dprint/install.sh +131 -0
  34. package/.devcontainer/features/hadolint/README.md +35 -0
  35. package/.devcontainer/features/hadolint/devcontainer-feature.json +13 -0
  36. package/.devcontainer/features/hadolint/install.sh +86 -0
  37. package/.devcontainer/features/lsp-servers/devcontainer-feature.json +5 -0
  38. package/.devcontainer/features/lsp-servers/install.sh +7 -0
  39. package/.devcontainer/features/mcp-qdrant/devcontainer-feature.json +6 -1
  40. package/.devcontainer/features/mcp-qdrant/install.sh +13 -6
  41. package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +6 -1
  42. package/.devcontainer/features/mcp-reasoner/install.sh +8 -1
  43. package/.devcontainer/features/notify-hook/devcontainer-feature.json +5 -0
  44. package/.devcontainer/features/notify-hook/install.sh +7 -0
  45. package/.devcontainer/features/ruff/README.md +26 -0
  46. package/.devcontainer/features/ruff/devcontainer-feature.json +21 -0
  47. package/.devcontainer/features/ruff/install.sh +74 -0
  48. package/.devcontainer/features/shellcheck/README.md +38 -0
  49. package/.devcontainer/features/shellcheck/devcontainer-feature.json +13 -0
  50. package/.devcontainer/features/shellcheck/install.sh +24 -0
  51. package/.devcontainer/features/shfmt/README.md +37 -0
  52. package/.devcontainer/features/shfmt/devcontainer-feature.json +13 -0
  53. package/.devcontainer/features/shfmt/install.sh +85 -0
  54. package/.devcontainer/features/splitrail/devcontainer-feature.json +5 -0
  55. package/.devcontainer/features/splitrail/install.sh +7 -0
  56. package/.devcontainer/features/tmux/install.sh +8 -0
  57. package/.devcontainer/features/tree-sitter/install.sh +6 -0
  58. package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +3 -10
  59. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/.claude-plugin/plugin.json +1 -1
  60. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/__pycache__/format-on-stop.cpython-314.pyc +0 -0
  61. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/format-on-stop.py +133 -13
  62. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/.claude-plugin/plugin.json +1 -1
  63. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/hooks/hooks.json +4 -5
  64. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/__pycache__/lint-file.cpython-314.pyc +0 -0
  65. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/lint-file.py +477 -78
  66. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/.claude-plugin/plugin.json +1 -1
  67. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/AGENT-REDIRECTION.md +226 -0
  68. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/REVIEW-RUBRIC.md +440 -0
  69. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +207 -0
  70. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/bash-exec.md +173 -0
  71. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/claude-guide.md +146 -0
  72. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/debug-logs.md +2 -0
  73. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/dependency-analyst.md +250 -0
  74. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +246 -0
  75. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +237 -0
  76. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +134 -0
  77. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/git-archaeologist.md +242 -0
  78. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/migrator.md +201 -0
  79. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/perf-profiler.md +265 -0
  80. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/refactorer.md +213 -0
  81. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/researcher.md +195 -0
  82. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/security-auditor.md +289 -0
  83. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +297 -0
  84. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/statusline-config.md +188 -0
  85. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/test-writer.md +248 -0
  86. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +51 -0
  87. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/advisory-test-runner.cpython-314.pyc +0 -0
  88. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/collect-edited-files.cpython-314.pyc +0 -0
  89. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/commit-reminder.cpython-314.pyc +0 -0
  90. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/git-state-injector.cpython-314.pyc +0 -0
  91. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/guard-readonly-bash.cpython-314.pyc +0 -0
  92. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/redirect-builtin-agents.cpython-314.pyc +0 -0
  93. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/skill-suggester.cpython-314.pyc +0 -0
  94. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/syntax-validator.cpython-314.pyc +0 -0
  95. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/ticket-linker.cpython-314.pyc +0 -0
  96. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/todo-harvester.cpython-314.pyc +0 -0
  97. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-no-regression.cpython-314.pyc +0 -0
  98. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-tests-pass.cpython-314.pyc +0 -0
  99. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/advisory-test-runner.py +174 -0
  100. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/collect-edited-files.py +8 -6
  101. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/commit-reminder.py +90 -0
  102. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/git-state-injector.py +114 -0
  103. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/guard-readonly-bash.py +611 -0
  104. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/redirect-builtin-agents.py +83 -0
  105. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/skill-suggester.py +146 -2
  106. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/syntax-validator.py +9 -4
  107. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/ticket-linker.py +137 -0
  108. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/todo-harvester.py +130 -0
  109. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/verify-no-regression.py +221 -0
  110. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/verify-tests-pass.py +176 -0
  111. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/SKILL.md +224 -0
  112. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/error-handling.md +166 -0
  113. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/rest-conventions.md +215 -0
  114. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/SKILL.md +211 -0
  115. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/references/language-patterns.md +327 -0
  116. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/claude-agent-sdk/SKILL.md +599 -0
  117. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/claude-agent-sdk/references/sdk-typescript-reference.md +954 -0
  118. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/SKILL.md +134 -0
  119. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/ecosystem-commands.md +264 -0
  120. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/license-compliance.md +80 -0
  121. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/SKILL.md +153 -0
  122. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/api-doc-templates.md +221 -0
  123. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/docstring-formats.md +296 -0
  124. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/git-forensics/SKILL.md +276 -0
  125. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/git-forensics/references/advanced-commands.md +332 -0
  126. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/git-forensics/references/investigation-playbooks.md +319 -0
  127. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/SKILL.md +150 -0
  128. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/javascript-migrations.md +179 -0
  129. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/python-migrations.md +141 -0
  130. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/performance-profiling/SKILL.md +341 -0
  131. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/performance-profiling/references/interpreting-results.md +235 -0
  132. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/performance-profiling/references/tool-commands.md +395 -0
  133. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/refactoring-patterns/SKILL.md +344 -0
  134. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/refactoring-patterns/references/safe-transformations.md +247 -0
  135. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/refactoring-patterns/references/smell-catalog.md +332 -0
  136. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/security-checklist/SKILL.md +277 -0
  137. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/security-checklist/references/owasp-patterns.md +269 -0
  138. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/security-checklist/references/secrets-patterns.md +253 -0
  139. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/SKILL.md +320 -0
  140. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/references/criteria-patterns.md +245 -0
  141. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/references/ears-templates.md +239 -0
  142. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/__pycache__/block-dangerous.cpython-314.pyc +0 -0
  143. package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/hooks/hooks.json +1 -1
  144. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/__pycache__/guard-protected.cpython-314.pyc +0 -0
  145. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +40 -39
  146. package/.devcontainer/scripts/check-setup.sh +72 -0
  147. package/.devcontainer/scripts/setup-aliases.sh +51 -6
  148. package/.devcontainer/scripts/setup-auth.sh +74 -0
  149. package/.devcontainer/scripts/setup-config.sh +112 -20
  150. package/.devcontainer/scripts/setup-plugins.sh +38 -46
  151. package/.devcontainer/scripts/setup-projects.sh +175 -0
  152. package/.devcontainer/scripts/setup-symlink-claude.sh +36 -0
  153. package/.devcontainer/scripts/setup-update-claude.sh +19 -8
  154. package/.devcontainer/scripts/setup.sh +49 -14
  155. package/README.md +23 -190
  156. package/package.json +1 -1
  157. package/setup.js +245 -71
  158. package/.devcontainer/features/claude-code/README.md +0 -498
  159. package/.devcontainer/features/claude-code/config/settings.json +0 -36
  160. package/.devcontainer/features/claude-code/config/system-prompt.md +0 -118
  161. package/.devcontainer/features/claude-code/config/world-building-sp.md +0 -1432
  162. package/.devcontainer/features/claude-code/devcontainer-feature.json +0 -42
  163. package/.devcontainer/features/claude-code/install.sh +0 -466
  164. package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/.claude-plugin/plugin.json +0 -7
  165. package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/hooks/hooks.json +0 -17
  166. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/.claude-plugin/plugin.json +0 -6
  167. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/config/planning-instructions.md +0 -14
  168. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/functional-conjuring-map.md +0 -989
  169. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/hooks/hooks.json +0 -33
  170. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/__pycache__/post-enhance-task.cpython-314.pyc +0 -0
  171. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhance-planning.py +0 -71
  172. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-plan.sh +0 -68
  173. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-task.sh +0 -120
  174. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-plan.py +0 -133
  175. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-task.py +0 -253
  176. package/.devcontainer/scripts/setup-irie-claude.sh +0 -32
@@ -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
  }
@@ -5,9 +5,17 @@ Unified batch formatter — runs as a Stop hook.
5
5
  Reads file paths collected by collect-edited-files.py during the
6
6
  conversation turn, deduplicates them, and formats each based on
7
7
  extension:
8
- .py / .pyi → Black
9
- .go → gofmt
10
- .js/.jsx/.ts/.tsx/.mjs/.cjs/.mts/.cts/.css → Biome (safe mode)
8
+ .py / .pyi Ruff format (fallback: Black)
9
+ .go → gofmt
10
+ .js/.jsx/.ts/.tsx/.mjs/.cjs/.mts/.cts → Biome check --write
11
+ .css/.json/.jsonc/.graphql/.gql → Biome check --write
12
+ .html/.vue/.svelte/.astro → Biome check --write
13
+ .sh/.bash/.zsh/.mksh/.bats → shfmt -w
14
+ .md/.markdown → dprint fmt
15
+ .yaml/.yml → dprint fmt
16
+ .toml → dprint fmt
17
+ Dockerfile / .dockerfile → dprint fmt
18
+ .rs → rustfmt
11
19
 
12
20
  Always cleans up the temp file. Always exits 0.
13
21
  """
@@ -18,7 +26,8 @@ import subprocess
18
26
  import sys
19
27
  from pathlib import Path
20
28
 
21
- # Formatter dispatch by extension
29
+ # ── Extension sets ──────────────────────────────────────────────────
30
+
22
31
  PYTHON_EXTS = {".py", ".pyi"}
23
32
  GO_EXTS = {".go"}
24
33
  BIOME_EXTS = {
@@ -31,10 +40,39 @@ BIOME_EXTS = {
31
40
  ".mts",
32
41
  ".cts",
33
42
  ".css",
43
+ ".json",
44
+ ".jsonc",
45
+ ".graphql",
46
+ ".gql",
47
+ ".html",
48
+ ".vue",
49
+ ".svelte",
50
+ ".astro",
34
51
  }
52
+ SHELL_EXTS = {".sh", ".bash", ".zsh", ".mksh", ".bats"}
53
+ DPRINT_EXTS = {".md", ".markdown", ".yaml", ".yml", ".toml"}
54
+ RUST_EXTS = {".rs"}
55
+
56
+ # ── Fallback paths ──────────────────────────────────────────────────
35
57
 
36
- BLACK_PATH = "/usr/local/py-utils/bin/black"
37
- GOFMT_PATH = "/usr/local/go/bin/gofmt"
58
+ BLACK_PATH_FALLBACK = "/usr/local/py-utils/bin/black"
59
+ GOFMT_PATH_FALLBACK = "/usr/local/go/bin/gofmt"
60
+ DPRINT_CONFIG = "/usr/local/share/dprint/dprint.json"
61
+
62
+ # ── Tool resolution ─────────────────────────────────────────────────
63
+
64
+
65
+ def _resolve_tool(name: str, fallback: str = "") -> str | None:
66
+ """Find tool via PATH first, fall back to hardcoded path."""
67
+ try:
68
+ result = subprocess.run(["which", name], capture_output=True, text=True)
69
+ if result.returncode == 0:
70
+ return result.stdout.strip()
71
+ except Exception:
72
+ pass
73
+ if fallback and os.path.exists(fallback):
74
+ return fallback
75
+ return None
38
76
 
39
77
 
40
78
  def find_tool_upward(file_path: str, tool_name: str) -> str | None:
@@ -74,13 +112,30 @@ def find_biome(file_path: str) -> str | None:
74
112
  return find_global_tool("biome")
75
113
 
76
114
 
115
+ # ── Formatters ──────────────────────────────────────────────────────
116
+
117
+
77
118
  def format_python(file_path: str) -> None:
78
- """Format with Black (quiet mode)."""
79
- if not os.path.exists(BLACK_PATH):
119
+ """Format with Ruff (preferred) or Black (fallback)."""
120
+ ruff = _resolve_tool("ruff")
121
+ if ruff:
122
+ try:
123
+ subprocess.run(
124
+ [ruff, "format", "--quiet", file_path],
125
+ capture_output=True,
126
+ timeout=10,
127
+ )
128
+ return
129
+ except (subprocess.TimeoutExpired, OSError):
130
+ pass
131
+
132
+ # Fallback to Black
133
+ black = _resolve_tool("black", BLACK_PATH_FALLBACK)
134
+ if not black:
80
135
  return
81
136
  try:
82
137
  subprocess.run(
83
- [BLACK_PATH, "--quiet", file_path],
138
+ [black, "--quiet", file_path],
84
139
  capture_output=True,
85
140
  timeout=10,
86
141
  )
@@ -90,11 +145,12 @@ def format_python(file_path: str) -> None:
90
145
 
91
146
  def format_go(file_path: str) -> None:
92
147
  """Format with gofmt."""
93
- if not os.path.exists(GOFMT_PATH):
148
+ gofmt = _resolve_tool("gofmt", GOFMT_PATH_FALLBACK)
149
+ if not gofmt:
94
150
  return
95
151
  try:
96
152
  subprocess.run(
97
- [GOFMT_PATH, "-w", file_path],
153
+ [gofmt, "-w", file_path],
98
154
  capture_output=True,
99
155
  timeout=10,
100
156
  )
@@ -117,15 +173,79 @@ def format_biome(file_path: str) -> None:
117
173
  pass
118
174
 
119
175
 
176
+ def format_shell(file_path: str) -> None:
177
+ """Format with shfmt."""
178
+ shfmt = _resolve_tool("shfmt")
179
+ if not shfmt:
180
+ return
181
+ try:
182
+ subprocess.run(
183
+ [shfmt, "-w", file_path],
184
+ capture_output=True,
185
+ timeout=10,
186
+ )
187
+ except (subprocess.TimeoutExpired, OSError):
188
+ pass
189
+
190
+
191
+ def format_dprint(file_path: str) -> None:
192
+ """Format with dprint using the global config."""
193
+ dprint = _resolve_tool("dprint")
194
+ if not dprint:
195
+ return
196
+ if not os.path.isfile(DPRINT_CONFIG):
197
+ return
198
+ try:
199
+ subprocess.run(
200
+ [dprint, "fmt", "--config", DPRINT_CONFIG, file_path],
201
+ capture_output=True,
202
+ timeout=10,
203
+ )
204
+ except (subprocess.TimeoutExpired, OSError):
205
+ pass
206
+
207
+
208
+ def format_rust(file_path: str) -> None:
209
+ """Format with rustfmt (conditional — only if installed)."""
210
+ rustfmt = _resolve_tool("rustfmt")
211
+ if not rustfmt:
212
+ return
213
+ try:
214
+ subprocess.run(
215
+ [rustfmt, file_path],
216
+ capture_output=True,
217
+ timeout=10,
218
+ )
219
+ except (subprocess.TimeoutExpired, OSError):
220
+ pass
221
+
222
+
223
+ # ── Dispatch ────────────────────────────────────────────────────────
224
+
225
+
120
226
  def format_file(file_path: str) -> None:
121
- """Dispatch to the correct formatter based on extension."""
122
- ext = Path(file_path).suffix.lower()
227
+ """Dispatch to the correct formatter based on extension / filename."""
228
+ path = Path(file_path)
229
+ ext = path.suffix.lower()
230
+ name = path.name
231
+
123
232
  if ext in PYTHON_EXTS:
124
233
  format_python(file_path)
125
234
  elif ext in GO_EXTS:
126
235
  format_go(file_path)
127
236
  elif ext in BIOME_EXTS:
128
237
  format_biome(file_path)
238
+ elif ext in SHELL_EXTS:
239
+ format_shell(file_path)
240
+ elif ext in DPRINT_EXTS:
241
+ format_dprint(file_path)
242
+ elif ext in RUST_EXTS:
243
+ format_rust(file_path)
244
+ elif name == "Dockerfile" or ext == ".dockerfile":
245
+ format_dprint(file_path)
246
+
247
+
248
+ # ── Main ────────────────────────────────────────────────────────────
129
249
 
130
250
 
131
251
  def main():
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auto-linter",
3
- "description": "Auto-lints files after editing (pyright for Python)",
3
+ "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)",
4
4
  "author": {
5
5
  "name": "AnExiledDev"
6
6
  }
@@ -1,15 +1,14 @@
1
1
  {
2
- "description": "Auto-lint files after editing",
2
+ "description": "Batch-lint collected files when Claude stops responding",
3
3
  "hooks": {
4
- "PostToolUse": [
4
+ "Stop": [
5
5
  {
6
- "matcher": "Edit|Write",
6
+ "matcher": "",
7
7
  "hooks": [
8
8
  {
9
9
  "type": "command",
10
10
  "command": "python3 ${CLAUDE_PLUGIN_ROOT}/scripts/lint-file.py",
11
- "timeout": 15,
12
- "async": true
11
+ "timeout": 60
13
12
  }
14
13
  ]
15
14
  }