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.
Files changed (39) hide show
  1. package/.devcontainer/CHANGELOG.md +51 -0
  2. package/.devcontainer/CLAUDE.md +1 -1
  3. package/.devcontainer/config/defaults/rules/spec-workflow.md +67 -0
  4. package/.devcontainer/config/defaults/rules/workspace-scope.md +7 -0
  5. package/.devcontainer/config/defaults/settings.json +63 -66
  6. package/.devcontainer/config/file-manifest.json +30 -18
  7. package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +104 -97
  8. package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/.claude-plugin/plugin.json +7 -0
  9. package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/README.md +158 -0
  10. package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/hooks/hooks.json +39 -0
  11. package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/scripts/collect-edited-files.py +47 -0
  12. package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/scripts/format-on-stop.py +297 -0
  13. package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/scripts/lint-file.py +536 -0
  14. package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/scripts/syntax-validator.py +146 -0
  15. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +77 -1
  16. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/debug-logs.md +18 -0
  17. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/dependency-analyst.md +18 -0
  18. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +86 -1
  19. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +18 -0
  20. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +142 -8
  21. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/git-archaeologist.md +18 -0
  22. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/migrator.md +108 -1
  23. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/perf-profiler.md +24 -0
  24. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/refactorer.md +97 -1
  25. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/researcher.md +33 -1
  26. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/security-auditor.md +24 -0
  27. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +29 -1
  28. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/test-writer.md +96 -1
  29. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +100 -95
  30. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/spec-reminder.py +121 -0
  31. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-check/SKILL.md +86 -0
  32. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/SKILL.md +97 -0
  33. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/backlog-template.md +7 -0
  34. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/roadmap-template.md +13 -0
  35. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/SKILL.md +101 -0
  36. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/references/template.md +110 -0
  37. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-update/SKILL.md +124 -0
  38. package/.devcontainer/scripts/setup-config.sh +86 -83
  39. 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() { echo "[setup-config] $*"; }
7
+ log() { echo "[setup-config] $*"; }
8
8
  warn() { echo "[setup-config] WARNING: $*"; }
9
- err() { echo "[setup-config] ERROR: $*" >&2; }
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
- warn "OVERWRITE_CONFIG is deprecated. Use per-file 'overwrite' in config/file-manifest.json instead."
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
- 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)"
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
- legacy_copy
34
- exit 0
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
- err "Invalid JSON in file-manifest.json"
40
- exit 1
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
- 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"
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
- 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" ]
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
- jq -r '.[] | [.src, .dest, (.destFilename // ""), (.enabled // true | tostring), (.overwrite // "if-changed")] | @tsv' "$MANIFEST" |
70
- while IFS=$'\t' read -r src dest dest_filename enabled overwrite; do
71
- # Skip disabled entries
72
- if [ "$enabled" = "false" ]; then
73
- log "Skipping $src (disabled)"
74
- continue
75
- fi
76
-
77
- # Resolve paths
78
- src_path="$CONFIG_DIR/$src"
79
- dest_dir=$(expand_vars "$dest")
80
- filename="${dest_filename:-${src##*/}}"
81
- dest_path="$dest_dir/$filename"
82
-
83
- # Validate source exists
84
- if [ ! -f "$src_path" ]; then
85
- warn "$src not found in config dir, skipping"
86
- continue
87
- fi
88
-
89
- # Ensure destination directory exists
90
- mkdir -p "$dest_dir"
91
-
92
- # Apply overwrite strategy
93
- case "$overwrite" in
94
- always)
95
- cp "$src_path" "$dest_path"
96
- log "Copied $src → $dest_path (always)"
97
- ;;
98
- never)
99
- if [ ! -f "$dest_path" ]; then
100
- cp "$src_path" "$dest_path"
101
- log "Copied $src → $dest_path (new)"
102
- else
103
- log "Skipping $src (exists, overwrite=never)"
104
- fi
105
- ;;
106
- if-changed|*)
107
- if should_copy "$src_path" "$dest_path"; then
108
- cp "$src_path" "$dest_path"
109
- log "Copied $src → $dest_path (changed)"
110
- else
111
- log "Skipping $src (unchanged)"
112
- fi
113
- ;;
114
- esac
115
-
116
- # Fix ownership
117
- chown "$(id -un):$(id -gn)" "$dest_path" 2>/dev/null || true
118
- done
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
- "name": "codeforge-dev",
3
- "version": "1.8.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
- }
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
  }