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.
- package/.devcontainer/.env +4 -5
- package/.devcontainer/.env.example +29 -0
- package/.devcontainer/.gitignore +8 -0
- package/.devcontainer/.secrets.example +12 -0
- package/.devcontainer/CHANGELOG.md +186 -0
- package/.devcontainer/CLAUDE.md +108 -21
- package/.devcontainer/README.md +173 -57
- package/.devcontainer/config/defaults/keybindings.json +5 -0
- package/.devcontainer/config/{main-system-prompt.md → defaults/main-system-prompt.md} +135 -2
- package/.devcontainer/config/{settings.json → defaults/settings.json} +25 -6
- package/.devcontainer/config/file-manifest.json +20 -0
- package/.devcontainer/devcontainer.json +38 -2
- 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/README.md +21 -7
- 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/README.md +60 -0
- package/.devcontainer/features/ccburn/devcontainer-feature.json +38 -0
- package/.devcontainer/features/ccburn/install.sh +180 -0
- package/.devcontainer/features/ccstatusline/README.md +22 -21
- package/.devcontainer/features/ccstatusline/devcontainer-feature.json +6 -1
- package/.devcontainer/features/ccstatusline/install.sh +55 -16
- 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 +6 -1
- package/.devcontainer/features/mcp-qdrant/install.sh +13 -6
- package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +6 -1
- 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 +133 -13
- 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 +477 -78
- 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/REVIEW-RUBRIC.md +440 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +207 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/bash-exec.md +173 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/claude-guide.md +146 -0
- 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 +250 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +246 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +237 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +134 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/git-archaeologist.md +242 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/migrator.md +201 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/perf-profiler.md +265 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/refactorer.md +213 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/researcher.md +195 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/security-auditor.md +289 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +297 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/statusline-config.md +188 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/test-writer.md +248 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +51 -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__/guard-readonly-bash.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__/skill-suggester.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/syntax-validator.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/__pycache__/verify-no-regression.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-tests-pass.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/guard-readonly-bash.py +611 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/redirect-builtin-agents.py +83 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/skill-suggester.py +146 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/syntax-validator.py +9 -4
- 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/scripts/verify-no-regression.py +221 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/verify-tests-pass.py +176 -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/claude-agent-sdk/SKILL.md +599 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/claude-agent-sdk/references/sdk-typescript-reference.md +954 -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/git-forensics/SKILL.md +276 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/git-forensics/references/advanced-commands.md +332 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/git-forensics/references/investigation-playbooks.md +319 -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/performance-profiling/SKILL.md +341 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/performance-profiling/references/interpreting-results.md +235 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/performance-profiling/references/tool-commands.md +395 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/refactoring-patterns/SKILL.md +344 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/refactoring-patterns/references/safe-transformations.md +247 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/refactoring-patterns/references/smell-catalog.md +332 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/security-checklist/SKILL.md +277 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/security-checklist/references/owasp-patterns.md +269 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/security-checklist/references/secrets-patterns.md +253 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/SKILL.md +320 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/references/criteria-patterns.md +245 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/references/ears-templates.md +239 -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/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +40 -39
- package/.devcontainer/scripts/check-setup.sh +72 -0
- package/.devcontainer/scripts/setup-aliases.sh +51 -6
- package/.devcontainer/scripts/setup-auth.sh +74 -0
- package/.devcontainer/scripts/setup-config.sh +112 -20
- package/.devcontainer/scripts/setup-plugins.sh +38 -46
- package/.devcontainer/scripts/setup-projects.sh +175 -0
- package/.devcontainer/scripts/setup-symlink-claude.sh +36 -0
- package/.devcontainer/scripts/setup-update-claude.sh +19 -8
- package/.devcontainer/scripts/setup.sh +49 -14
- 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 -36
- 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/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": "
|
|
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
|
}
|
|
Binary file
|
package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/format-on-stop.py
CHANGED
|
@@ -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
|
|
9
|
-
.go
|
|
10
|
-
.js/.jsx/.ts/.tsx/.mjs/.cjs/.mts/.cts
|
|
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
|
-
#
|
|
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
|
-
|
|
37
|
-
|
|
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 (
|
|
79
|
-
|
|
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
|
-
[
|
|
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
|
-
|
|
148
|
+
gofmt = _resolve_tool("gofmt", GOFMT_PATH_FALLBACK)
|
|
149
|
+
if not gofmt:
|
|
94
150
|
return
|
|
95
151
|
try:
|
|
96
152
|
subprocess.run(
|
|
97
|
-
[
|
|
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
|
-
|
|
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():
|
package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/.claude-plugin/plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "auto-linter",
|
|
3
|
-
"description": "Auto-lints files
|
|
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": "
|
|
2
|
+
"description": "Batch-lint collected files when Claude stops responding",
|
|
3
3
|
"hooks": {
|
|
4
|
-
"
|
|
4
|
+
"Stop": [
|
|
5
5
|
{
|
|
6
|
-
"matcher": "
|
|
6
|
+
"matcher": "",
|
|
7
7
|
"hooks": [
|
|
8
8
|
{
|
|
9
9
|
"type": "command",
|
|
10
10
|
"command": "python3 ${CLAUDE_PLUGIN_ROOT}/scripts/lint-file.py",
|
|
11
|
-
"timeout":
|
|
12
|
-
"async": true
|
|
11
|
+
"timeout": 60
|
|
13
12
|
}
|
|
14
13
|
]
|
|
15
14
|
}
|