codeforge-dev 1.7.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.devcontainer/.env +4 -6
- package/.devcontainer/.env.example +29 -0
- package/.devcontainer/.gitignore +8 -0
- package/.devcontainer/.secrets.example +12 -0
- package/.devcontainer/CHANGELOG.md +181 -0
- package/.devcontainer/CLAUDE.md +57 -20
- package/.devcontainer/README.md +111 -56
- package/.devcontainer/config/{main-system-prompt.md → defaults/main-system-prompt.md} +72 -0
- package/.devcontainer/config/defaults/rules/spec-workflow.md +67 -0
- package/.devcontainer/config/defaults/rules/workspace-scope.md +7 -0
- package/.devcontainer/config/defaults/settings.json +67 -0
- package/.devcontainer/config/file-manifest.json +32 -0
- package/.devcontainer/devcontainer.json +20 -0
- package/.devcontainer/docs/configuration-reference.md +90 -0
- package/.devcontainer/docs/keybindings.md +100 -0
- package/.devcontainer/docs/optional-features.md +129 -0
- package/.devcontainer/docs/plugins.md +154 -0
- package/.devcontainer/docs/troubleshooting.md +128 -0
- package/.devcontainer/features/agent-browser/install.sh +6 -0
- package/.devcontainer/features/ast-grep/install.sh +6 -0
- package/.devcontainer/features/biome/README.md +27 -0
- package/.devcontainer/features/biome/install.sh +6 -0
- package/.devcontainer/features/ccburn/install.sh +6 -0
- package/.devcontainer/features/ccstatusline/devcontainer-feature.json +5 -0
- package/.devcontainer/features/ccstatusline/install.sh +7 -0
- package/.devcontainer/features/ccusage/install.sh +6 -0
- package/.devcontainer/features/claude-monitor/install.sh +6 -0
- package/.devcontainer/features/dprint/README.md +30 -0
- package/.devcontainer/features/dprint/devcontainer-feature.json +18 -0
- package/.devcontainer/features/dprint/install.sh +131 -0
- package/.devcontainer/features/hadolint/README.md +35 -0
- package/.devcontainer/features/hadolint/devcontainer-feature.json +13 -0
- package/.devcontainer/features/hadolint/install.sh +86 -0
- package/.devcontainer/features/lsp-servers/devcontainer-feature.json +5 -0
- package/.devcontainer/features/lsp-servers/install.sh +7 -0
- package/.devcontainer/features/mcp-qdrant/devcontainer-feature.json +5 -0
- package/.devcontainer/features/mcp-qdrant/install.sh +13 -6
- package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +5 -0
- package/.devcontainer/features/mcp-reasoner/install.sh +8 -1
- package/.devcontainer/features/notify-hook/devcontainer-feature.json +5 -0
- package/.devcontainer/features/notify-hook/install.sh +7 -0
- package/.devcontainer/features/ruff/README.md +26 -0
- package/.devcontainer/features/ruff/devcontainer-feature.json +21 -0
- package/.devcontainer/features/ruff/install.sh +74 -0
- package/.devcontainer/features/shellcheck/README.md +38 -0
- package/.devcontainer/features/shellcheck/devcontainer-feature.json +13 -0
- package/.devcontainer/features/shellcheck/install.sh +24 -0
- package/.devcontainer/features/shfmt/README.md +37 -0
- package/.devcontainer/features/shfmt/devcontainer-feature.json +13 -0
- package/.devcontainer/features/shfmt/install.sh +85 -0
- package/.devcontainer/features/splitrail/devcontainer-feature.json +5 -0
- package/.devcontainer/features/splitrail/install.sh +7 -0
- package/.devcontainer/features/tmux/install.sh +8 -0
- package/.devcontainer/features/tree-sitter/install.sh +6 -0
- package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +104 -104
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/README.md +158 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/hooks/hooks.json +39 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/scripts/collect-edited-files.py +47 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/scripts/format-on-stop.py +297 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/scripts/lint-file.py +536 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/scripts/syntax-validator.py +146 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/.claude-plugin/plugin.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/__pycache__/format-on-stop.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/format-on-stop.py +114 -9
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/.claude-plugin/plugin.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/hooks/hooks.json +4 -5
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/__pycache__/lint-file.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/lint-file.py +478 -76
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/.claude-plugin/plugin.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/AGENT-REDIRECTION.md +226 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +94 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/bash-exec.md +4 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/claude-guide.md +14 -23
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/debug-logs.md +20 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/dependency-analyst.md +20 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +99 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +20 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +152 -9
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/git-archaeologist.md +18 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/migrator.md +114 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/perf-profiler.md +24 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/refactorer.md +101 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/researcher.md +33 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/security-auditor.md +24 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +65 -24
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/statusline-config.md +3 -3
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/test-writer.md +99 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +100 -56
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/advisory-test-runner.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/collect-edited-files.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/commit-reminder.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/git-state-injector.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/redirect-builtin-agents.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/ticket-linker.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/todo-harvester.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/advisory-test-runner.py +174 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/collect-edited-files.py +8 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/commit-reminder.py +90 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/git-state-injector.py +114 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/skill-suggester.py +61 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/spec-reminder.py +121 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/ticket-linker.py +137 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/todo-harvester.py +130 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/SKILL.md +224 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/error-handling.md +166 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/rest-conventions.md +215 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/SKILL.md +211 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/references/language-patterns.md +327 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/SKILL.md +134 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/ecosystem-commands.md +264 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/license-compliance.md +80 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/SKILL.md +153 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/api-doc-templates.md +221 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/docstring-formats.md +296 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/SKILL.md +150 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/javascript-migrations.md +179 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/python-migrations.md +141 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-check/SKILL.md +86 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/SKILL.md +97 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/backlog-template.md +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/roadmap-template.md +13 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/SKILL.md +101 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/references/template.md +110 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-update/SKILL.md +124 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/SKILL.md +32 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/__pycache__/block-dangerous.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/hooks/hooks.json +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/__pycache__/guard-protected.cpython-314.pyc +0 -0
- package/.devcontainer/scripts/check-setup.sh +72 -0
- package/.devcontainer/scripts/setup-aliases.sh +43 -3
- package/.devcontainer/scripts/setup-auth.sh +74 -0
- package/.devcontainer/scripts/setup-config.sh +117 -24
- package/.devcontainer/scripts/setup-update-claude.sh +8 -0
- package/.devcontainer/scripts/setup.sh +46 -13
- package/README.md +23 -190
- package/package.json +42 -42
- package/setup.js +245 -71
- package/.devcontainer/config/settings.json +0 -70
- package/.devcontainer/features/claude-code/README.md +0 -498
- package/.devcontainer/features/claude-code/config/settings.json +0 -72
- package/.devcontainer/features/claude-code/config/system-prompt.md +0 -118
- package/.devcontainer/features/claude-code/config/world-building-sp.md +0 -1432
- package/.devcontainer/features/claude-code/devcontainer-feature.json +0 -42
- package/.devcontainer/features/claude-code/install.sh +0 -466
- package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/.claude-plugin/plugin.json +0 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/hooks/hooks.json +0 -17
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/.claude-plugin/plugin.json +0 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/config/planning-instructions.md +0 -14
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/functional-conjuring-map.md +0 -989
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/hooks/hooks.json +0 -33
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/__pycache__/post-enhance-task.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhance-planning.py +0 -71
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-plan.sh +0 -68
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-task.sh +0 -120
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-plan.py +0 -133
- package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-task.py +0 -253
- /package/.devcontainer/config/{keybindings.json → defaults/keybindings.json} +0 -0
|
@@ -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
|
|
|
@@ -1,106 +1,106 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
|
3
|
+
"name": "devs-marketplace",
|
|
4
|
+
"description": "CodeForge plugin marketplace for development tools",
|
|
5
|
+
"owner": {
|
|
6
|
+
"name": "AnExiledDev"
|
|
7
|
+
},
|
|
8
|
+
"plugins": [
|
|
9
|
+
{
|
|
10
|
+
"name": "codeforge-lsp",
|
|
11
|
+
"description": "LSP servers for CodeForge (Python, TypeScript, Go)",
|
|
12
|
+
"version": "1.0.0",
|
|
13
|
+
"source": "./plugins/codeforge-lsp",
|
|
14
|
+
"category": "development",
|
|
15
|
+
"lspServers": {
|
|
16
|
+
"pyright": {
|
|
17
|
+
"command": "pyright-langserver",
|
|
18
|
+
"args": ["--stdio"],
|
|
19
|
+
"extensionToLanguage": {
|
|
20
|
+
".py": "python",
|
|
21
|
+
".pyi": "python"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"typescript": {
|
|
25
|
+
"command": "typescript-language-server",
|
|
26
|
+
"args": ["--stdio"],
|
|
27
|
+
"extensionToLanguage": {
|
|
28
|
+
".ts": "typescript",
|
|
29
|
+
".tsx": "typescriptreact",
|
|
30
|
+
".js": "javascript",
|
|
31
|
+
".jsx": "javascriptreact",
|
|
32
|
+
".mts": "typescript",
|
|
33
|
+
".cts": "typescript",
|
|
34
|
+
".mjs": "javascript",
|
|
35
|
+
".cjs": "javascript"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"gopls": {
|
|
39
|
+
"command": "gopls",
|
|
40
|
+
"args": ["serve"],
|
|
41
|
+
"extensionToLanguage": {
|
|
42
|
+
".go": "go",
|
|
43
|
+
".mod": "go.mod",
|
|
44
|
+
".sum": "go.sum"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "ticket-workflow",
|
|
51
|
+
"description": "EARS-based ticket workflow with GitHub integration",
|
|
52
|
+
"version": "1.0.0",
|
|
53
|
+
"source": "./plugins/ticket-workflow",
|
|
54
|
+
"category": "workflow"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "notify-hook",
|
|
58
|
+
"description": "Desktop notifications and audio chime when Claude finishes responding",
|
|
59
|
+
"version": "1.0.0",
|
|
60
|
+
"source": "./plugins/notify-hook",
|
|
61
|
+
"category": "productivity"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"name": "dangerous-command-blocker",
|
|
65
|
+
"description": "Blocks dangerous bash commands (rm -rf, sudo rm, chmod 777, force push)",
|
|
66
|
+
"version": "1.0.0",
|
|
67
|
+
"source": "./plugins/dangerous-command-blocker",
|
|
68
|
+
"category": "safety"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "protected-files-guard",
|
|
72
|
+
"description": "Blocks modifications to .env, lock files, .git/, and credentials",
|
|
73
|
+
"version": "1.0.0",
|
|
74
|
+
"source": "./plugins/protected-files-guard",
|
|
75
|
+
"category": "safety"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"name": "auto-formatter",
|
|
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)",
|
|
80
|
+
"version": "1.0.0",
|
|
81
|
+
"source": "./plugins/auto-formatter",
|
|
82
|
+
"category": "development"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "auto-linter",
|
|
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)",
|
|
87
|
+
"version": "1.0.0",
|
|
88
|
+
"source": "./plugins/auto-linter",
|
|
89
|
+
"category": "development"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"name": "code-directive",
|
|
93
|
+
"description": "17 custom agents, 16 coding skills, agent redirection, syntax validation, and skill auto-suggestion",
|
|
94
|
+
"version": "1.0.0",
|
|
95
|
+
"source": "./plugins/code-directive",
|
|
96
|
+
"category": "development"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"name": "auto-code-quality",
|
|
100
|
+
"description": "Self-contained code quality: auto-format + auto-lint edited files (Ruff/Black, Biome, gofmt, shfmt, dprint, rustfmt, Pyright, ShellCheck, go vet, hadolint, clippy)",
|
|
101
|
+
"version": "1.0.0",
|
|
102
|
+
"source": "./plugins/auto-code-quality",
|
|
103
|
+
"category": "development"
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
106
|
}
|
package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/.claude-plugin/plugin.json
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "auto-code-quality",
|
|
3
|
+
"description": "Self-contained code quality plugin: collects edited files, batch-formats at Stop (Ruff/Black 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), batch-lints 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), and validates JSON/JSONC/YAML/TOML syntax on edit",
|
|
4
|
+
"author": {
|
|
5
|
+
"name": "AnExiledDev"
|
|
6
|
+
}
|
|
7
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# auto-code-quality
|
|
2
|
+
|
|
3
|
+
Self-contained Claude Code plugin that automatically formats and lints edited files. Drop it into any Claude Code plugin marketplace and enable it — no other plugins required.
|
|
4
|
+
|
|
5
|
+
## What It Does
|
|
6
|
+
|
|
7
|
+
Three-phase pipeline that runs transparently during your Claude Code session:
|
|
8
|
+
|
|
9
|
+
1. **Collect** (PostToolUse on Edit/Write) — Records which files Claude edits
|
|
10
|
+
2. **Format** (Stop hook) — Batch-formats all edited files when Claude finishes responding
|
|
11
|
+
3. **Lint** (Stop hook) — Batch-lints all edited files and surfaces warnings as context
|
|
12
|
+
|
|
13
|
+
Additionally validates JSON, JSONC, YAML, and TOML syntax immediately after each edit.
|
|
14
|
+
|
|
15
|
+
All phases are non-blocking. Missing tools are silently skipped. The plugin always exits cleanly — it will never interrupt Claude.
|
|
16
|
+
|
|
17
|
+
## Required Tools
|
|
18
|
+
|
|
19
|
+
Install the tools for the languages you work with. Everything is optional — the plugin gracefully skips any tool that isn't found.
|
|
20
|
+
|
|
21
|
+
| Language | Formatter | Linter(s) | Install |
|
|
22
|
+
|----------|-----------|-----------|---------|
|
|
23
|
+
| Python | [ruff](https://docs.astral.sh/ruff/) | [pyright](https://github.com/microsoft/pyright), ruff check | `pip install ruff` / `npm i -g pyright` |
|
|
24
|
+
| Python (fallback) | [black](https://github.com/psf/black) | — | `pip install black` |
|
|
25
|
+
| Go | gofmt (bundled with Go) | go vet (bundled with Go) | [Install Go](https://go.dev/dl/) |
|
|
26
|
+
| JS/TS/CSS/GraphQL/HTML | [biome](https://biomejs.dev/) | biome lint | `npm i -D @biomejs/biome` or `npm i -g @biomejs/biome` |
|
|
27
|
+
| Shell | [shfmt](https://github.com/mvdan/sh) | [shellcheck](https://github.com/koalaman/shellcheck) | `brew install shfmt shellcheck` |
|
|
28
|
+
| Markdown/YAML/TOML | [dprint](https://dprint.dev/) | — | `brew install dprint` |
|
|
29
|
+
| Dockerfile | dprint | [hadolint](https://github.com/hadolint/hadolint) | `brew install hadolint` |
|
|
30
|
+
| Rust | rustfmt (bundled with Rust) | clippy (bundled with Rust) | [Install Rust](https://rustup.rs/) |
|
|
31
|
+
| JSON/JSONC/YAML/TOML | — | syntax-validator (Python stdlib) | No extra install needed |
|
|
32
|
+
|
|
33
|
+
### dprint Configuration
|
|
34
|
+
|
|
35
|
+
The dprint formatter looks for a config file at `/usr/local/share/dprint/dprint.json`. If this file doesn't exist, dprint formatting is skipped. Create one with your preferred settings, or use a minimal config:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"markdown": {},
|
|
40
|
+
"toml": {},
|
|
41
|
+
"yaml": {}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Biome Discovery
|
|
46
|
+
|
|
47
|
+
Biome is resolved in this order:
|
|
48
|
+
1. Project-local: walks up from the edited file looking for `node_modules/.bin/biome`
|
|
49
|
+
2. Global: checks PATH via `which biome`
|
|
50
|
+
|
|
51
|
+
## Installation
|
|
52
|
+
|
|
53
|
+
### 1. Place the plugin
|
|
54
|
+
|
|
55
|
+
Copy the `auto-code-quality/` directory into your Claude Code plugin marketplace:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
your-marketplace/
|
|
59
|
+
├── .claude-plugin/
|
|
60
|
+
│ └── marketplace.json
|
|
61
|
+
└── plugins/
|
|
62
|
+
└── auto-code-quality/ ← this directory
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 2. Register in marketplace.json
|
|
66
|
+
|
|
67
|
+
Add this entry to your `marketplace.json` `plugins` array:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"name": "auto-code-quality",
|
|
72
|
+
"description": "Self-contained code quality: auto-format + auto-lint edited files",
|
|
73
|
+
"version": "1.0.0",
|
|
74
|
+
"source": "./plugins/auto-code-quality",
|
|
75
|
+
"category": "development"
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 3. Enable in settings.json
|
|
80
|
+
|
|
81
|
+
Add to your Claude Code `settings.json` under `enabledPlugins`:
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"enabledPlugins": {
|
|
86
|
+
"auto-code-quality@your-marketplace": true
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Replace `your-marketplace` with the name of your marketplace.
|
|
92
|
+
|
|
93
|
+
## How It Works
|
|
94
|
+
|
|
95
|
+
### Hook Lifecycle
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
You edit a file (Edit/Write tool)
|
|
99
|
+
│
|
|
100
|
+
├─→ collect-edited-files.py Appends path to temp files
|
|
101
|
+
└─→ syntax-validator.py Validates JSON/YAML/TOML syntax immediately
|
|
102
|
+
│
|
|
103
|
+
│ ... Claude keeps working ...
|
|
104
|
+
│
|
|
105
|
+
Claude stops responding (Stop event)
|
|
106
|
+
│
|
|
107
|
+
├─→ format-on-stop.py Reads temp file, formats each file by extension
|
|
108
|
+
└─→ lint-file.py Reads temp file, lints each file, injects warnings
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Temp File Convention
|
|
112
|
+
|
|
113
|
+
Edited file paths are stored in session-scoped temp files:
|
|
114
|
+
- `/tmp/claude-cq-edited-{session_id}` — consumed by the formatter
|
|
115
|
+
- `/tmp/claude-cq-lint-{session_id}` — consumed by the linter
|
|
116
|
+
|
|
117
|
+
Both are always cleaned up after processing (even on error).
|
|
118
|
+
|
|
119
|
+
### Timeouts
|
|
120
|
+
|
|
121
|
+
| Hook | Timeout |
|
|
122
|
+
|------|---------|
|
|
123
|
+
| File collection | 3s |
|
|
124
|
+
| Syntax validation | 5s |
|
|
125
|
+
| Batch formatting | 15s total |
|
|
126
|
+
| Batch linting | 60s total |
|
|
127
|
+
| Individual tool | 10-12s each |
|
|
128
|
+
|
|
129
|
+
## Conflict Warning
|
|
130
|
+
|
|
131
|
+
This plugin bundles functionality that may overlap with other plugins. If you're using any of the following, **disable them** before enabling this plugin to avoid duplicate processing:
|
|
132
|
+
|
|
133
|
+
- `auto-formatter` — formatting is included here
|
|
134
|
+
- `auto-linter` — linting is included here
|
|
135
|
+
- `code-directive` `collect-edited-files.py` hook — file collection is included here
|
|
136
|
+
|
|
137
|
+
The temp file prefixes are different (`claude-cq-*` vs `claude-edited-files-*` / `claude-lint-files-*`), so enabling both won't corrupt data — but files would be formatted and linted twice.
|
|
138
|
+
|
|
139
|
+
## Plugin Structure
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
auto-code-quality/
|
|
143
|
+
├── .claude-plugin/
|
|
144
|
+
│ └── plugin.json # Plugin metadata
|
|
145
|
+
├── hooks/
|
|
146
|
+
│ └── hooks.json # Hook registrations (PostToolUse + Stop)
|
|
147
|
+
├── scripts/
|
|
148
|
+
│ ├── collect-edited-files.py # File path collector (PostToolUse)
|
|
149
|
+
│ ├── syntax-validator.py # JSON/YAML/TOML validator (PostToolUse)
|
|
150
|
+
│ ├── format-on-stop.py # Batch formatter (Stop)
|
|
151
|
+
│ └── lint-file.py # Batch linter (Stop)
|
|
152
|
+
└── README.md # This file
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Requirements
|
|
156
|
+
|
|
157
|
+
- Python 3.11+ (for `tomllib` support in syntax validation; older Python skips TOML)
|
|
158
|
+
- Claude Code with plugin hook support
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Self-contained code quality: file collection on edit, syntax validation, batch formatting + linting at stop",
|
|
3
|
+
"hooks": {
|
|
4
|
+
"PostToolUse": [
|
|
5
|
+
{
|
|
6
|
+
"matcher": "Edit|Write",
|
|
7
|
+
"hooks": [
|
|
8
|
+
{
|
|
9
|
+
"type": "command",
|
|
10
|
+
"command": "python3 ${CLAUDE_PLUGIN_ROOT}/scripts/collect-edited-files.py",
|
|
11
|
+
"timeout": 3
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"type": "command",
|
|
15
|
+
"command": "python3 ${CLAUDE_PLUGIN_ROOT}/scripts/syntax-validator.py",
|
|
16
|
+
"timeout": 5
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"Stop": [
|
|
22
|
+
{
|
|
23
|
+
"matcher": "",
|
|
24
|
+
"hooks": [
|
|
25
|
+
{
|
|
26
|
+
"type": "command",
|
|
27
|
+
"command": "python3 ${CLAUDE_PLUGIN_ROOT}/scripts/format-on-stop.py",
|
|
28
|
+
"timeout": 15
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"type": "command",
|
|
32
|
+
"command": "python3 ${CLAUDE_PLUGIN_ROOT}/scripts/lint-file.py",
|
|
33
|
+
"timeout": 60
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Collect edited file paths for batch formatting and linting at Stop.
|
|
4
|
+
|
|
5
|
+
Lightweight PostToolUse hook that appends the edited file path
|
|
6
|
+
to session-scoped temp files. The format and lint Stop hooks
|
|
7
|
+
read these files to know which files need processing.
|
|
8
|
+
|
|
9
|
+
Non-blocking: always exits 0. Runs in <10ms.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
import sys
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def main():
|
|
18
|
+
try:
|
|
19
|
+
input_data = json.load(sys.stdin)
|
|
20
|
+
except (json.JSONDecodeError, ValueError):
|
|
21
|
+
sys.exit(0)
|
|
22
|
+
|
|
23
|
+
session_id = input_data.get("session_id", "")
|
|
24
|
+
tool_input = input_data.get("tool_input", {})
|
|
25
|
+
file_path = tool_input.get("file_path", "")
|
|
26
|
+
|
|
27
|
+
if not file_path or not session_id:
|
|
28
|
+
sys.exit(0)
|
|
29
|
+
|
|
30
|
+
if not os.path.isfile(file_path):
|
|
31
|
+
sys.exit(0)
|
|
32
|
+
|
|
33
|
+
# Write to both formatter and linter temp files (independent pipelines)
|
|
34
|
+
# Uses "claude-cq-" prefix to avoid collision with other plugins
|
|
35
|
+
for prefix in ("claude-cq-edited", "claude-cq-lint"):
|
|
36
|
+
tmp_path = f"/tmp/{prefix}-{session_id}"
|
|
37
|
+
try:
|
|
38
|
+
with open(tmp_path, "a") as f:
|
|
39
|
+
f.write(file_path + "\n")
|
|
40
|
+
except OSError:
|
|
41
|
+
pass # non-critical, don't block Claude
|
|
42
|
+
|
|
43
|
+
sys.exit(0)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
if __name__ == "__main__":
|
|
47
|
+
main()
|