codeforge-dev 1.8.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/CHANGELOG.md +51 -0
- package/.devcontainer/CLAUDE.md +1 -1
- 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 +63 -66
- package/.devcontainer/config/file-manifest.json +30 -18
- package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +104 -97
- 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/code-directive/agents/architect.md +77 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/debug-logs.md +18 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/dependency-analyst.md +18 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +86 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +18 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +142 -8
- 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 +108 -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 +97 -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 +29 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/test-writer.md +96 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +100 -95
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/spec-reminder.py +121 -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/scripts/setup-config.sh +86 -83
- package/package.json +42 -42
|
@@ -4,117 +4,120 @@
|
|
|
4
4
|
CONFIG_DIR="${CONFIG_SOURCE_DIR:?CONFIG_SOURCE_DIR not set}"
|
|
5
5
|
MANIFEST="$CONFIG_DIR/file-manifest.json"
|
|
6
6
|
|
|
7
|
-
log()
|
|
7
|
+
log() { echo "[setup-config] $*"; }
|
|
8
8
|
warn() { echo "[setup-config] WARNING: $*"; }
|
|
9
|
-
err()
|
|
9
|
+
err() { echo "[setup-config] ERROR: $*" >&2; }
|
|
10
10
|
|
|
11
11
|
# Deprecation notice if legacy OVERWRITE_CONFIG is still set
|
|
12
12
|
if [ -n "${OVERWRITE_CONFIG+x}" ]; then
|
|
13
|
-
|
|
13
|
+
warn "OVERWRITE_CONFIG is deprecated. Use per-file 'overwrite' in config/file-manifest.json instead."
|
|
14
14
|
fi
|
|
15
15
|
|
|
16
16
|
# ── Legacy fallback ──────────────────────────────────────────────
|
|
17
17
|
legacy_copy() {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
18
|
+
local target_dir="${CLAUDE_CONFIG_DIR:?CLAUDE_CONFIG_DIR not set}"
|
|
19
|
+
warn "file-manifest.json not found, falling back to legacy copy"
|
|
20
|
+
mkdir -p "$target_dir"
|
|
21
|
+
for file in defaults/settings.json defaults/keybindings.json defaults/main-system-prompt.md; do
|
|
22
|
+
if [ -f "$CONFIG_DIR/$file" ]; then
|
|
23
|
+
local basename="${file##*/}"
|
|
24
|
+
cp "$CONFIG_DIR/$file" "$target_dir/$basename"
|
|
25
|
+
chown "$(id -un):$(id -gn)" "$target_dir/$basename" 2>/dev/null || true
|
|
26
|
+
log "Copied $basename (legacy)"
|
|
27
|
+
fi
|
|
28
|
+
done
|
|
29
|
+
log "Configuration complete (legacy)"
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
if [ ! -f "$MANIFEST" ]; then
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
legacy_copy
|
|
34
|
+
exit 0
|
|
35
35
|
fi
|
|
36
36
|
|
|
37
37
|
# ── Validate manifest JSON ──────────────────────────────────────
|
|
38
38
|
if ! jq empty "$MANIFEST" 2>/dev/null; then
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
err "Invalid JSON in file-manifest.json"
|
|
40
|
+
exit 1
|
|
41
41
|
fi
|
|
42
42
|
|
|
43
43
|
# ── Variable expansion ───────────────────────────────────────────
|
|
44
44
|
expand_vars() {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
local val="$1"
|
|
46
|
+
val="${val//\$\{CLAUDE_CONFIG_DIR\}/$CLAUDE_CONFIG_DIR}"
|
|
47
|
+
val="${val//\$\{WORKSPACE_ROOT\}/$WORKSPACE_ROOT}"
|
|
48
|
+
# Warn on any remaining unresolved ${...} tokens
|
|
49
|
+
if [[ "$val" =~ \$\{[^}]+\} ]]; then
|
|
50
|
+
warn "Unresolved variable in: $val"
|
|
51
|
+
fi
|
|
52
|
+
echo "$val"
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
# ── Change detection ─────────────────────────────────────────────
|
|
56
56
|
should_copy() {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
57
|
+
local src="$1" dest="$2"
|
|
58
|
+
[ ! -f "$dest" ] && return 0
|
|
59
|
+
local src_hash dest_hash
|
|
60
|
+
src_hash=$(sha256sum "$src" | cut -d' ' -f1)
|
|
61
|
+
dest_hash=$(sha256sum "$dest" | cut -d' ' -f1)
|
|
62
|
+
[ "$src_hash" != "$dest_hash" ]
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
# ── Process manifest ─────────────────────────────────────────────
|
|
66
66
|
log "Copying configuration files..."
|
|
67
67
|
|
|
68
68
|
# Single jq invocation to extract all fields (reduces N×5 subprocess calls to 1)
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
69
|
+
# Note: empty destFilename uses "__NONE__" sentinel because bash read collapses
|
|
70
|
+
# consecutive tab delimiters, which shifts fields when destFilename is empty.
|
|
71
|
+
jq -r '.[] | [.src, .dest, (.destFilename // "__NONE__"), (.enabled // true | tostring), (.overwrite // "if-changed")] | @tsv' "$MANIFEST" |
|
|
72
|
+
while IFS=$'\t' read -r src dest dest_filename enabled overwrite; do
|
|
73
|
+
# Skip disabled entries
|
|
74
|
+
if [ "$enabled" = "false" ]; then
|
|
75
|
+
log "Skipping $src (disabled)"
|
|
76
|
+
continue
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# Resolve paths
|
|
80
|
+
src_path="$CONFIG_DIR/$src"
|
|
81
|
+
dest_dir=$(expand_vars "$dest")
|
|
82
|
+
[ "$dest_filename" = "__NONE__" ] && dest_filename=""
|
|
83
|
+
filename="${dest_filename:-${src##*/}}"
|
|
84
|
+
dest_path="$dest_dir/$filename"
|
|
85
|
+
|
|
86
|
+
# Validate source exists
|
|
87
|
+
if [ ! -f "$src_path" ]; then
|
|
88
|
+
warn "$src not found in config dir, skipping"
|
|
89
|
+
continue
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# Ensure destination directory exists
|
|
93
|
+
mkdir -p "$dest_dir"
|
|
94
|
+
|
|
95
|
+
# Apply overwrite strategy
|
|
96
|
+
case "$overwrite" in
|
|
97
|
+
always)
|
|
98
|
+
cp "$src_path" "$dest_path"
|
|
99
|
+
log "Copied $src → $dest_path (always)"
|
|
100
|
+
;;
|
|
101
|
+
never)
|
|
102
|
+
if [ ! -f "$dest_path" ]; then
|
|
103
|
+
cp "$src_path" "$dest_path"
|
|
104
|
+
log "Copied $src → $dest_path (new)"
|
|
105
|
+
else
|
|
106
|
+
log "Skipping $src (exists, overwrite=never)"
|
|
107
|
+
fi
|
|
108
|
+
;;
|
|
109
|
+
if-changed | *)
|
|
110
|
+
if should_copy "$src_path" "$dest_path"; then
|
|
111
|
+
cp "$src_path" "$dest_path"
|
|
112
|
+
log "Copied $src → $dest_path (changed)"
|
|
113
|
+
else
|
|
114
|
+
log "Skipping $src (unchanged)"
|
|
115
|
+
fi
|
|
116
|
+
;;
|
|
117
|
+
esac
|
|
118
|
+
|
|
119
|
+
# Fix ownership
|
|
120
|
+
chown "$(id -un):$(id -gn)" "$dest_path" 2>/dev/null || true
|
|
121
|
+
done
|
|
119
122
|
|
|
120
123
|
log "Configuration complete"
|
package/package.json
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
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
|
-
|
|
2
|
+
"name": "codeforge-dev",
|
|
3
|
+
"version": "1.9.0",
|
|
4
|
+
"description": "Complete development container that sets up Claude Code with modular devcontainer features, modern dev tools, and persistent configurations. Drop it into any project and get a production-ready AI development environment in minutes.",
|
|
5
|
+
"main": "setup.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"codeforge": "setup.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "node test.js"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"devcontainer",
|
|
14
|
+
"claude",
|
|
15
|
+
"claude-code",
|
|
16
|
+
"mcp",
|
|
17
|
+
"mcp-server",
|
|
18
|
+
"ai",
|
|
19
|
+
"development-environment",
|
|
20
|
+
"vscode",
|
|
21
|
+
"container",
|
|
22
|
+
"qdrant",
|
|
23
|
+
"reasoner",
|
|
24
|
+
"ai-development"
|
|
25
|
+
],
|
|
26
|
+
"author": "AnExiledDev",
|
|
27
|
+
"license": "GPL-3.0",
|
|
28
|
+
"files": [
|
|
29
|
+
".devcontainer/**/*",
|
|
30
|
+
"setup.js",
|
|
31
|
+
"README.md"
|
|
32
|
+
],
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=14.0.0"
|
|
35
|
+
},
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "git+https://github.com/AnExiledDev/CodeForge.git"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://github.com/AnExiledDev/CodeForge#readme",
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/AnExiledDev/CodeForge/issues"
|
|
43
|
+
}
|
|
44
44
|
}
|