codeforge-dev 1.5.8 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/.devcontainer/.env +4 -5
  2. package/.devcontainer/.env.example +29 -0
  3. package/.devcontainer/.gitignore +8 -0
  4. package/.devcontainer/.secrets.example +12 -0
  5. package/.devcontainer/CHANGELOG.md +186 -0
  6. package/.devcontainer/CLAUDE.md +108 -21
  7. package/.devcontainer/README.md +173 -57
  8. package/.devcontainer/config/defaults/keybindings.json +5 -0
  9. package/.devcontainer/config/{main-system-prompt.md → defaults/main-system-prompt.md} +135 -2
  10. package/.devcontainer/config/{settings.json → defaults/settings.json} +25 -6
  11. package/.devcontainer/config/file-manifest.json +20 -0
  12. package/.devcontainer/devcontainer.json +38 -2
  13. package/.devcontainer/docs/configuration-reference.md +90 -0
  14. package/.devcontainer/docs/keybindings.md +100 -0
  15. package/.devcontainer/docs/optional-features.md +129 -0
  16. package/.devcontainer/docs/plugins.md +154 -0
  17. package/.devcontainer/docs/troubleshooting.md +128 -0
  18. package/.devcontainer/features/README.md +21 -7
  19. package/.devcontainer/features/agent-browser/install.sh +6 -0
  20. package/.devcontainer/features/ast-grep/install.sh +6 -0
  21. package/.devcontainer/features/biome/README.md +27 -0
  22. package/.devcontainer/features/biome/install.sh +6 -0
  23. package/.devcontainer/features/ccburn/README.md +60 -0
  24. package/.devcontainer/features/ccburn/devcontainer-feature.json +38 -0
  25. package/.devcontainer/features/ccburn/install.sh +180 -0
  26. package/.devcontainer/features/ccstatusline/README.md +22 -21
  27. package/.devcontainer/features/ccstatusline/devcontainer-feature.json +6 -1
  28. package/.devcontainer/features/ccstatusline/install.sh +55 -16
  29. package/.devcontainer/features/ccusage/install.sh +6 -0
  30. package/.devcontainer/features/claude-monitor/install.sh +6 -0
  31. package/.devcontainer/features/dprint/README.md +30 -0
  32. package/.devcontainer/features/dprint/devcontainer-feature.json +18 -0
  33. package/.devcontainer/features/dprint/install.sh +131 -0
  34. package/.devcontainer/features/hadolint/README.md +35 -0
  35. package/.devcontainer/features/hadolint/devcontainer-feature.json +13 -0
  36. package/.devcontainer/features/hadolint/install.sh +86 -0
  37. package/.devcontainer/features/lsp-servers/devcontainer-feature.json +5 -0
  38. package/.devcontainer/features/lsp-servers/install.sh +7 -0
  39. package/.devcontainer/features/mcp-qdrant/devcontainer-feature.json +6 -1
  40. package/.devcontainer/features/mcp-qdrant/install.sh +13 -6
  41. package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +6 -1
  42. package/.devcontainer/features/mcp-reasoner/install.sh +8 -1
  43. package/.devcontainer/features/notify-hook/devcontainer-feature.json +5 -0
  44. package/.devcontainer/features/notify-hook/install.sh +7 -0
  45. package/.devcontainer/features/ruff/README.md +26 -0
  46. package/.devcontainer/features/ruff/devcontainer-feature.json +21 -0
  47. package/.devcontainer/features/ruff/install.sh +74 -0
  48. package/.devcontainer/features/shellcheck/README.md +38 -0
  49. package/.devcontainer/features/shellcheck/devcontainer-feature.json +13 -0
  50. package/.devcontainer/features/shellcheck/install.sh +24 -0
  51. package/.devcontainer/features/shfmt/README.md +37 -0
  52. package/.devcontainer/features/shfmt/devcontainer-feature.json +13 -0
  53. package/.devcontainer/features/shfmt/install.sh +85 -0
  54. package/.devcontainer/features/splitrail/devcontainer-feature.json +5 -0
  55. package/.devcontainer/features/splitrail/install.sh +7 -0
  56. package/.devcontainer/features/tmux/install.sh +8 -0
  57. package/.devcontainer/features/tree-sitter/install.sh +6 -0
  58. package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +3 -10
  59. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/.claude-plugin/plugin.json +1 -1
  60. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/__pycache__/format-on-stop.cpython-314.pyc +0 -0
  61. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/format-on-stop.py +133 -13
  62. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/.claude-plugin/plugin.json +1 -1
  63. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/hooks/hooks.json +4 -5
  64. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/__pycache__/lint-file.cpython-314.pyc +0 -0
  65. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/lint-file.py +477 -78
  66. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/.claude-plugin/plugin.json +1 -1
  67. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/AGENT-REDIRECTION.md +226 -0
  68. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/REVIEW-RUBRIC.md +440 -0
  69. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +207 -0
  70. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/bash-exec.md +173 -0
  71. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/claude-guide.md +146 -0
  72. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/debug-logs.md +2 -0
  73. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/dependency-analyst.md +250 -0
  74. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +246 -0
  75. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +237 -0
  76. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +134 -0
  77. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/git-archaeologist.md +242 -0
  78. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/migrator.md +201 -0
  79. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/perf-profiler.md +265 -0
  80. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/refactorer.md +213 -0
  81. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/researcher.md +195 -0
  82. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/security-auditor.md +289 -0
  83. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +297 -0
  84. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/statusline-config.md +188 -0
  85. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/test-writer.md +248 -0
  86. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +51 -0
  87. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/advisory-test-runner.cpython-314.pyc +0 -0
  88. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/collect-edited-files.cpython-314.pyc +0 -0
  89. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/commit-reminder.cpython-314.pyc +0 -0
  90. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/git-state-injector.cpython-314.pyc +0 -0
  91. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/guard-readonly-bash.cpython-314.pyc +0 -0
  92. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/redirect-builtin-agents.cpython-314.pyc +0 -0
  93. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/skill-suggester.cpython-314.pyc +0 -0
  94. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/syntax-validator.cpython-314.pyc +0 -0
  95. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/ticket-linker.cpython-314.pyc +0 -0
  96. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/todo-harvester.cpython-314.pyc +0 -0
  97. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-no-regression.cpython-314.pyc +0 -0
  98. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-tests-pass.cpython-314.pyc +0 -0
  99. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/advisory-test-runner.py +174 -0
  100. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/collect-edited-files.py +8 -6
  101. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/commit-reminder.py +90 -0
  102. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/git-state-injector.py +114 -0
  103. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/guard-readonly-bash.py +611 -0
  104. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/redirect-builtin-agents.py +83 -0
  105. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/skill-suggester.py +146 -2
  106. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/syntax-validator.py +9 -4
  107. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/ticket-linker.py +137 -0
  108. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/todo-harvester.py +130 -0
  109. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/verify-no-regression.py +221 -0
  110. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/verify-tests-pass.py +176 -0
  111. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/SKILL.md +224 -0
  112. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/error-handling.md +166 -0
  113. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/api-design/references/rest-conventions.md +215 -0
  114. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/SKILL.md +211 -0
  115. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/ast-grep-patterns/references/language-patterns.md +327 -0
  116. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/claude-agent-sdk/SKILL.md +599 -0
  117. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/claude-agent-sdk/references/sdk-typescript-reference.md +954 -0
  118. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/SKILL.md +134 -0
  119. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/ecosystem-commands.md +264 -0
  120. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/dependency-management/references/license-compliance.md +80 -0
  121. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/SKILL.md +153 -0
  122. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/api-doc-templates.md +221 -0
  123. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/documentation-patterns/references/docstring-formats.md +296 -0
  124. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/git-forensics/SKILL.md +276 -0
  125. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/git-forensics/references/advanced-commands.md +332 -0
  126. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/git-forensics/references/investigation-playbooks.md +319 -0
  127. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/SKILL.md +150 -0
  128. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/javascript-migrations.md +179 -0
  129. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/migration-patterns/references/python-migrations.md +141 -0
  130. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/performance-profiling/SKILL.md +341 -0
  131. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/performance-profiling/references/interpreting-results.md +235 -0
  132. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/performance-profiling/references/tool-commands.md +395 -0
  133. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/refactoring-patterns/SKILL.md +344 -0
  134. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/refactoring-patterns/references/safe-transformations.md +247 -0
  135. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/refactoring-patterns/references/smell-catalog.md +332 -0
  136. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/security-checklist/SKILL.md +277 -0
  137. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/security-checklist/references/owasp-patterns.md +269 -0
  138. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/security-checklist/references/secrets-patterns.md +253 -0
  139. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/SKILL.md +320 -0
  140. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/references/criteria-patterns.md +245 -0
  141. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/references/ears-templates.md +239 -0
  142. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/__pycache__/block-dangerous.cpython-314.pyc +0 -0
  143. package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/hooks/hooks.json +1 -1
  144. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/__pycache__/guard-protected.cpython-314.pyc +0 -0
  145. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +40 -39
  146. package/.devcontainer/scripts/check-setup.sh +72 -0
  147. package/.devcontainer/scripts/setup-aliases.sh +51 -6
  148. package/.devcontainer/scripts/setup-auth.sh +74 -0
  149. package/.devcontainer/scripts/setup-config.sh +112 -20
  150. package/.devcontainer/scripts/setup-plugins.sh +38 -46
  151. package/.devcontainer/scripts/setup-projects.sh +175 -0
  152. package/.devcontainer/scripts/setup-symlink-claude.sh +36 -0
  153. package/.devcontainer/scripts/setup-update-claude.sh +19 -8
  154. package/.devcontainer/scripts/setup.sh +49 -14
  155. package/README.md +23 -190
  156. package/package.json +1 -1
  157. package/setup.js +245 -71
  158. package/.devcontainer/features/claude-code/README.md +0 -498
  159. package/.devcontainer/features/claude-code/config/settings.json +0 -36
  160. package/.devcontainer/features/claude-code/config/system-prompt.md +0 -118
  161. package/.devcontainer/features/claude-code/config/world-building-sp.md +0 -1432
  162. package/.devcontainer/features/claude-code/devcontainer-feature.json +0 -42
  163. package/.devcontainer/features/claude-code/install.sh +0 -466
  164. package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/.claude-plugin/plugin.json +0 -7
  165. package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/hooks/hooks.json +0 -17
  166. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/.claude-plugin/plugin.json +0 -6
  167. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/config/planning-instructions.md +0 -14
  168. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/functional-conjuring-map.md +0 -989
  169. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/hooks/hooks.json +0 -33
  170. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/__pycache__/post-enhance-task.cpython-314.pyc +0 -0
  171. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhance-planning.py +0 -71
  172. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-plan.sh +0 -68
  173. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/enhancers/enhance-task.sh +0 -120
  174. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-plan.py +0 -133
  175. package/.devcontainer/plugins/devs-marketplace/plugins/workflow-enhancer/scripts/post-enhance-task.py +0 -253
  176. package/.devcontainer/scripts/setup-irie-claude.sh +0 -32
package/README.md CHANGED
@@ -37,215 +37,46 @@ npx codeforge-dev@1.2.3
37
37
 
38
38
  - **Docker Desktop** (or compatible container runtime like Podman)
39
39
  - **VS Code** with the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers), or **GitHub Codespaces**
40
- - **Claude Code authentication** - see [Authentication](#authentication) section
40
+ - **Claude Code authentication** run `claude` on first start to authenticate
41
41
 
42
- ## Quick Start
43
-
44
- 1. **Open in Container**
45
- - VS Code: Open the folder, then select "Reopen in Container" from the command palette
46
- - Codespaces: Create a new codespace from this repository
47
-
48
- 2. **Authenticate** (first time only)
49
- ```bash
50
- claude
51
- ```
52
- Follow the prompts to authenticate via browser or API key.
53
-
54
- 3. **Start Claude Code**
55
- ```bash
56
- cc
57
- ```
58
-
59
- ## Authentication
60
-
61
- Claude Code supports multiple authentication methods. On first run, you'll be prompted to choose:
62
-
63
- ### Browser Login (Recommended)
64
-
65
- ```bash
66
- claude
67
- ```
68
-
69
- Select "Login with browser" and complete authentication in your browser. This uses your Claude.ai account.
70
-
71
- ### API Key
72
-
73
- For programmatic access or environments without browsers:
74
-
75
- ```bash
76
- export ANTHROPIC_API_KEY="sk-ant-..."
77
- claude
78
- ```
79
-
80
- Get an API key from [console.anthropic.com](https://console.anthropic.com/).
81
-
82
- ### Credential Persistence
83
-
84
- Authentication credentials are stored in `/workspaces/.claude/` and persist across container rebuilds.
85
-
86
- For more options, see the [Claude Code documentation](https://docs.anthropic.com/en/docs/claude-code).
87
-
88
- ## GitHub CLI Authentication
89
-
90
- GitHub CLI (`gh`) is pre-installed for repository operations like pushing code, creating pull requests, and accessing private repositories.
91
-
92
- ### Interactive Login (Recommended)
93
-
94
- ```bash
95
- gh auth login
96
- ```
97
-
98
- Follow the prompts:
99
- 1. Select **GitHub.com** (or your enterprise server)
100
- 2. Choose your preferred protocol: **HTTPS** (recommended) or **SSH**
101
- 3. Authenticate via **browser** (easiest) or paste a personal access token
102
-
103
- ### Token-Based Login
104
-
105
- For automated setups or environments without browser access:
106
-
107
- ```bash
108
- # From a file
109
- gh auth login --with-token < ~/github-token.txt
110
-
111
- # From environment variable
112
- echo "$GITHUB_TOKEN" | gh auth login --with-token
113
- ```
114
-
115
- Generate a token at [github.com/settings/tokens](https://github.com/settings/tokens) with appropriate scopes (typically `repo`, `read:org`).
116
-
117
- ### Verifying Authentication
118
-
119
- ```bash
120
- gh auth status
121
- ```
122
-
123
- Expected output shows your authenticated account and token scopes.
124
-
125
- ### Credential Persistence
126
-
127
- GitHub CLI credentials are automatically persisted across container rebuilds. The container is configured to store credentials in `/workspaces/.gh/` (via `GH_CONFIG_DIR`), which is part of the bind-mounted workspace.
128
-
129
- **You only need to authenticate once.** After running `gh auth login`, your credentials will survive container rebuilds and be available in future sessions.
130
-
131
- ## Available Tools
42
+ ## What's Included
132
43
 
133
44
  ### Languages & Runtimes
134
- | Tool | Description |
135
- |------|-------------|
136
- | Python 3.14 | Base language runtime |
137
- | Node.js LTS | JavaScript runtime |
138
- | TypeScript | Via Node.js |
139
-
140
- ### Package Managers
141
- | Tool | Description |
142
- |------|-------------|
143
- | `uv` | Fast Python package manager (pip alternative) |
144
- | `npm` | Node.js package manager |
145
- | `pip` / `pipx` | Python package installers |
146
-
147
- ### Development Tools
148
- | Tool | Description |
149
- |------|-------------|
150
- | `gh` | GitHub CLI for repository operations |
151
- | `docker` | Container CLI (connects to host Docker) |
152
- | `git` | Version control |
153
- | `jq` | JSON processor |
154
- | `curl` | HTTP client |
155
- | `tmux` | Terminal multiplexer for Agent Teams split-pane sessions |
156
- | `biome` | Fast JS/TS/JSON/CSS formatter |
157
- | `agent-browser` | Headless browser automation for AI agents |
158
-
159
- ### Code Intelligence
160
- | Tool | Description |
161
- |------|-------------|
162
- | tree-sitter | AST parsing for JavaScript, TypeScript, Python |
163
- | ast-grep | Structural code search and rewriting |
164
- | Pyright | Python language server |
165
- | TypeScript LSP | TypeScript/JavaScript language server |
166
45
 
167
- ### Claude Code Tools
168
- | Tool | Description |
169
- |------|-------------|
170
- | `claude` | Claude Code CLI |
171
- | `cc` | Wrapper with auto-configuration |
172
- | `ccusage` | Token usage analyzer |
173
- | `ccstatusline` | Status line for sessions |
174
- | `claude-monitor` | Real-time usage tracking |
175
-
176
- ## Using Claude Code
177
-
178
- ### The `cc` Command
179
-
180
- The `cc` command is a wrapper that:
181
- - Creates a project-local `.claude/` directory if missing
182
- - Copies default configuration files
183
- - Launches Claude Code with the project's system prompt
184
-
185
- ```bash
186
- cc # Start Claude Code in current directory
187
- cc "explain this" # Start with an initial prompt
188
- ```
189
-
190
- ### Direct CLI
46
+ Python 3.14, Node.js LTS, TypeScript, Go
191
47
 
192
- For more control, use the `claude` command directly:
193
-
194
- ```bash
195
- claude # Basic invocation
196
- claude --help # View all options
197
- claude --resume # Resume previous session
198
- ```
48
+ ### Package Managers
199
49
 
200
- ## Configuration
50
+ `uv`, `npm`, `pip` / `pipx`
201
51
 
202
- ### Environment Variables
52
+ ### Development Tools
203
53
 
204
- Edit `.devcontainer/.env` to customize behavior:
54
+ `gh` (GitHub CLI), `docker`, `git`, `jq`, `curl`, `tmux`, `biome`, `agent-browser`
205
55
 
206
- | Variable | Default | Description |
207
- |----------|---------|-------------|
208
- | `CLAUDE_CONFIG_DIR` | `/workspaces/.claude` | Claude configuration directory |
209
- | `SETUP_CONFIG` | `true` | Copy config files during setup |
210
- | `OVERWRITE_CONFIG` | `true` | Overwrite existing configs |
211
- | `SETUP_ALIASES` | `true` | Add `cc` alias to shell |
212
- | `SETUP_PLUGINS` | `true` | Install official plugins |
56
+ ### Code Intelligence
213
57
 
214
- ### Claude Code Settings
58
+ tree-sitter (JS/TS/Python), ast-grep, Pyright, TypeScript LSP
215
59
 
216
- Default settings are in `.devcontainer/config/settings.json`. These are copied to `/workspaces/.claude/settings.json` on first run.
60
+ ### Claude Code Tools
217
61
 
218
- Key defaults:
219
- - **Model**: Claude Opus 4-6
220
- - **Default mode**: Plan (prompts before executing)
221
- - **Max output tokens**: 128,000
62
+ `claude`, `cc` (wrapper), `ccusage`, `ccburn`, `ccstatusline`, `claude-monitor`
222
63
 
223
- ### System Prompt
64
+ ### Custom Features (14)
224
65
 
225
- The default system prompt is in `.devcontainer/config/main-system-prompt.md`. Override it by creating a `.claude/system-prompt.md` in your project directory.
66
+ tmux, agent-browser, claude-monitor, ccusage, ccburn, ccstatusline, ast-grep, tree-sitter, lsp-servers, biome, notify-hook, mcp-qdrant, mcp-reasoner, splitrail
226
67
 
227
- ## Custom Features
68
+ ### Agents (17) & Skills (16)
228
69
 
229
- CodeForge includes several custom devcontainer features:
70
+ The `code-directive` plugin includes specialized agents (architect, explorer, test-writer, security-auditor, etc.) and domain-specific coding reference skills (fastapi, svelte5, docker, testing, etc.).
230
71
 
231
- | Feature | Description |
232
- |---------|-------------|
233
- | `claude-monitor` | Real-time token usage monitoring with ML predictions |
234
- | `ccusage` | Usage analytics CLI |
235
- | `ccstatusline` | Compact powerline status display |
236
- | `ast-grep` | Structural code search using AST patterns |
237
- | `tree-sitter` | Parser with JS/TS/Python grammars |
238
- | `lsp-servers` | Pyright and TypeScript language servers |
239
- | `agent-browser` | Browser automation with accessibility snapshots and screenshots |
240
- | `tmux` | Terminal multiplexer with Catppuccin theme for Agent Teams |
241
- | `biome` | Fast JS/TS/JSON/CSS formatter (global install) |
72
+ ## Quick Start
242
73
 
243
- ## Essential Gotchas
74
+ 1. **Install**: `npx codeforge-dev`
75
+ 2. **Open in Container**: "Reopen in Container" in VS Code, or create a Codespace
76
+ 3. **Authenticate**: Run `claude` and follow prompts
77
+ 4. **Start coding**: Run `cc`
244
78
 
245
- - **Authentication required**: Run `claude` once to authenticate before using `cc`
246
- - **Plan mode default**: The container starts in "plan" mode, which prompts for approval before making changes
247
- - **Project-local config**: The `cc` command creates `.claude/` in your current directory for project-specific settings
248
- - **GitHub auth persists**: Run `gh auth login` once; credentials survive container rebuilds (stored in `/workspaces/.gh/`)
79
+ For full usage documentation authentication, configuration, tools, agents, and keybindings — see [`.devcontainer/README.md`](.devcontainer/README.md).
249
80
 
250
81
  ## Development
251
82
 
@@ -266,6 +97,8 @@ npm publish
266
97
 
267
98
  ## Further Reading
268
99
 
100
+ - [Full Usage Guide](.devcontainer/README.md)
101
+ - [Changelog](.devcontainer/CHANGELOG.md)
269
102
  - [Claude Code Documentation](https://docs.anthropic.com/en/docs/claude-code)
270
103
  - [Dev Containers Specification](https://containers.dev/)
271
104
  - [GitHub CLI Manual](https://cli.github.com/manual/)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeforge-dev",
3
- "version": "1.5.8",
3
+ "version": "1.8.0",
4
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
5
  "main": "setup.js",
6
6
  "bin": {
package/setup.js CHANGED
@@ -1,83 +1,257 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const fs = require('fs');
4
- const path = require('path');
3
+ const fs = require("fs");
4
+ const path = require("path");
5
5
 
6
+ // ── Default preserve list ────────────────────────────────────────
7
+ // Files in the package that should NOT overwrite user customizations.
8
+ // The package version is saved as <file>.codeforge-new for diffing.
9
+ const DEFAULT_PRESERVE = [
10
+ "config/defaults/settings.json",
11
+ "config/defaults/main-system-prompt.md",
12
+ "config/defaults/keybindings.json",
13
+ "config/file-manifest.json",
14
+ ".codeforge-preserve",
15
+ ];
16
+
17
+ // ── copyDirectory ────────────────────────────────────────────────
18
+ // Simple recursive copy (used for fresh install and --reset).
6
19
  function copyDirectory(src, dest) {
7
- if (!fs.existsSync(dest)) {
8
- fs.mkdirSync(dest, { recursive: true });
9
- }
10
-
11
- const entries = fs.readdirSync(src, { withFileTypes: true });
12
-
13
- for (const entry of entries) {
14
- const srcPath = path.join(src, entry.name);
15
- const destPath = path.join(dest, entry.name);
16
-
17
- if (entry.isDirectory()) {
18
- copyDirectory(srcPath, destPath);
19
- } else {
20
- fs.copyFileSync(srcPath, destPath);
21
- }
22
- }
20
+ if (!fs.existsSync(dest)) {
21
+ fs.mkdirSync(dest, { recursive: true });
22
+ }
23
+
24
+ const entries = fs.readdirSync(src, { withFileTypes: true });
25
+
26
+ for (const entry of entries) {
27
+ const srcPath = path.join(src, entry.name);
28
+ const destPath = path.join(dest, entry.name);
29
+
30
+ if (entry.isDirectory()) {
31
+ copyDirectory(srcPath, destPath);
32
+ } else {
33
+ fs.copyFileSync(srcPath, destPath);
34
+ }
35
+ }
23
36
  }
24
37
 
38
+ // ── loadPreserveList ─────────────────────────────────────────────
39
+ // Builds the set of relative paths to preserve during --force update.
40
+ // Combines built-in defaults with user entries from .codeforge-preserve.
41
+ function loadPreserveList(devcontainerDest) {
42
+ const preserveFile = path.join(devcontainerDest, ".codeforge-preserve");
43
+ let custom = [];
44
+
45
+ if (fs.existsSync(preserveFile)) {
46
+ custom = fs
47
+ .readFileSync(preserveFile, "utf-8")
48
+ .split("\n")
49
+ .map((line) => line.trim())
50
+ .filter((line) => line && !line.startsWith("#"));
51
+ }
52
+
53
+ return new Set([...DEFAULT_PRESERVE, ...custom]);
54
+ }
55
+
56
+ // ── syncDirectory ────────────────────────────────────────────────
57
+ // Selective overwrite: walks the package tree and copies files to dest.
58
+ // - Framework files (scripts, features, plugins): always overwrite
59
+ // - Preserved files: skip, save package version as .codeforge-new
60
+ // - devcontainer.json: overwrite, save user's as .bak
61
+ // - User-created files not in package: untouched (never visited)
62
+ function syncDirectory(src, dest, preserveSet) {
63
+ const stats = {
64
+ updated: 0,
65
+ preserved: 0,
66
+ added: 0,
67
+ backedUp: 0,
68
+ preservedFiles: [],
69
+ };
70
+
71
+ function walk(srcDir, destDir, relativeBase) {
72
+ if (!fs.existsSync(destDir)) {
73
+ fs.mkdirSync(destDir, { recursive: true });
74
+ }
75
+
76
+ const entries = fs.readdirSync(srcDir, { withFileTypes: true });
77
+
78
+ for (const entry of entries) {
79
+ const srcPath = path.join(srcDir, entry.name);
80
+ const destPath = path.join(destDir, entry.name);
81
+ const relativePath = relativeBase
82
+ ? relativeBase + "/" + entry.name
83
+ : entry.name;
84
+
85
+ if (entry.isDirectory()) {
86
+ walk(srcPath, destPath, relativePath);
87
+ continue;
88
+ }
89
+
90
+ // Special handling for devcontainer.json: overwrite + save .bak
91
+ if (relativePath === "devcontainer.json" && fs.existsSync(destPath)) {
92
+ fs.copyFileSync(destPath, destPath + ".bak");
93
+ fs.copyFileSync(srcPath, destPath);
94
+ stats.backedUp++;
95
+ stats.updated++;
96
+ continue;
97
+ }
98
+
99
+ // Preserved files: skip overwrite, save package version as .codeforge-new
100
+ if (preserveSet.has(relativePath) && fs.existsSync(destPath)) {
101
+ fs.copyFileSync(srcPath, destPath + ".codeforge-new");
102
+ stats.preserved++;
103
+ stats.preservedFiles.push(relativePath);
104
+ continue;
105
+ }
106
+
107
+ // Framework files: always overwrite (or create if new)
108
+ const isNew = !fs.existsSync(destPath);
109
+ fs.copyFileSync(srcPath, destPath);
110
+ if (isNew) {
111
+ stats.added++;
112
+ } else {
113
+ stats.updated++;
114
+ }
115
+ }
116
+ }
117
+
118
+ walk(src, dest, "");
119
+ return stats;
120
+ }
121
+
122
+ // ── main ─────────────────────────────────────────────────────────
25
123
  function main() {
26
- const args = process.argv.slice(2);
27
- const force = args.includes('--force') || args.includes('-f');
28
-
29
- const currentDir = process.cwd();
30
- const packageDir = __dirname;
31
- const devcontainerSrc = path.join(packageDir, '.devcontainer');
32
- const devcontainerDest = path.join(currentDir, '.devcontainer');
33
-
34
- console.log('🚀 Setting up CodeForge DevContainer...');
35
-
36
- // Check if .devcontainer already exists
37
- if (fs.existsSync(devcontainerDest)) {
38
- if (force) {
39
- console.log('⚠️ Removing existing .devcontainer directory...');
40
- fs.rmSync(devcontainerDest, { recursive: true, force: true });
41
- } else {
42
- console.log('⚠️ .devcontainer directory already exists.');
43
- console.log(' Use --force to overwrite, or remove it manually.');
44
- process.exit(1);
45
- }
46
- }
47
-
48
- // Check if source .devcontainer exists
49
- if (!fs.existsSync(devcontainerSrc)) {
50
- console.error('❌ Error: .devcontainer source directory not found in package.');
51
- process.exit(1);
52
- }
53
-
54
- try {
55
- // Copy .devcontainer directory
56
- copyDirectory(devcontainerSrc, devcontainerDest);
57
-
58
- console.log('✅ CodeForge DevContainer configuration installed!');
59
- console.log('');
60
- console.log('🔧 Next steps:');
61
- console.log(' 1. Open this folder in VS Code');
62
- console.log(' 2. Select "Reopen in Container" from the command palette');
63
- console.log(' 3. Run: claude');
64
- console.log('');
65
- console.log('📚 Features included:');
66
- console.log(' • Claude Code CLI with optimized tool configuration');
67
- console.log(' • MCP servers: Qdrant (vector memory), Reasoner');
68
- console.log(' • Development tools: Node.js LTS, Python 3.14, Git with delta');
69
- console.log(' • Persistent configuration and shell history');
70
- console.log('');
71
- console.log('🔗 Documentation: See .devcontainer/README.md');
72
-
73
- } catch (error) {
74
- console.error('❌ Error copying .devcontainer:', error.message);
75
- process.exit(1);
76
- }
124
+ const args = process.argv.slice(2);
125
+ const force = args.includes("--force") || args.includes("-f");
126
+ const reset = args.includes("--reset");
127
+
128
+ if (args.includes("--help") || args.includes("-h")) {
129
+ console.log("Usage: codeforge [options]");
130
+ console.log("");
131
+ console.log("Options:");
132
+ console.log(
133
+ " --force, -f Update existing .devcontainer (preserves user config)",
134
+ );
135
+ console.log(
136
+ " --reset Remove all customizations and install fresh defaults",
137
+ );
138
+ console.log(" --help, -h Show this help message");
139
+ console.log("");
140
+ console.log(
141
+ "Without flags, installs only if .devcontainer does not exist.",
142
+ );
143
+ process.exit(0);
144
+ }
145
+
146
+ const currentDir = process.cwd();
147
+ const packageDir = __dirname;
148
+ const devcontainerSrc = path.join(packageDir, ".devcontainer");
149
+ const devcontainerDest = path.join(currentDir, ".devcontainer");
150
+
151
+ console.log("");
152
+
153
+ // Check if source .devcontainer exists in the package
154
+ if (!fs.existsSync(devcontainerSrc)) {
155
+ console.error(
156
+ "Error: .devcontainer source directory not found in package.",
157
+ );
158
+ process.exit(1);
159
+ }
160
+
161
+ if (fs.existsSync(devcontainerDest)) {
162
+ if (reset) {
163
+ // Nuclear: delete everything and copy fresh
164
+ console.log("Resetting .devcontainer to package defaults...");
165
+ console.log("");
166
+ fs.rmSync(devcontainerDest, { recursive: true, force: true });
167
+ copyDirectory(devcontainerSrc, devcontainerDest);
168
+ console.log(" Reset complete. All user customizations removed.");
169
+ console.log("");
170
+ printNextSteps();
171
+ } else if (force) {
172
+ // Smart update: selective overwrite with preservation
173
+ console.log("Updating .devcontainer (preserving user config)...");
174
+ console.log("");
175
+
176
+ const preserveSet = loadPreserveList(devcontainerDest);
177
+ const stats = syncDirectory(
178
+ devcontainerSrc,
179
+ devcontainerDest,
180
+ preserveSet,
181
+ );
182
+
183
+ // Summary
184
+ console.log(` Updated: ${stats.updated} files`);
185
+ console.log(` Added: ${stats.added} new files`);
186
+ console.log(` Preserved: ${stats.preserved} user config files`);
187
+ console.log("");
188
+
189
+ if (stats.backedUp > 0) {
190
+ console.log(
191
+ " devcontainer.json updated (previous saved as devcontainer.json.bak)",
192
+ );
193
+ console.log("");
194
+ }
195
+
196
+ if (stats.preservedFiles.length > 0) {
197
+ console.log(
198
+ " Review .codeforge-new files for new defaults you may want to merge:",
199
+ );
200
+ for (const file of stats.preservedFiles) {
201
+ console.log(` ${file}.codeforge-new`);
202
+ }
203
+ console.log("");
204
+ }
205
+
206
+ printNextSteps();
207
+ } else {
208
+ // No flags: error with guidance
209
+ console.log(".devcontainer directory already exists.");
210
+ console.log("");
211
+ console.log(" --force Update (preserves your config files)");
212
+ console.log(" --reset Start fresh (removes all customizations)");
213
+ console.log("");
214
+ process.exit(1);
215
+ }
216
+ } else {
217
+ // Fresh install
218
+ console.log("Setting up CodeForge DevContainer...");
219
+ console.log("");
220
+
221
+ try {
222
+ copyDirectory(devcontainerSrc, devcontainerDest);
223
+ console.log(" CodeForge DevContainer configuration installed!");
224
+ console.log("");
225
+ printNextSteps();
226
+ printFeatures();
227
+ } catch (error) {
228
+ console.error("Error copying .devcontainer:", error.message);
229
+ process.exit(1);
230
+ }
231
+ }
232
+ }
233
+
234
+ function printNextSteps() {
235
+ console.log("Next steps:");
236
+ console.log(" 1. Open this folder in VS Code");
237
+ console.log(' 2. Select "Reopen in Container" from the command palette');
238
+ console.log(" 3. Run: claude");
239
+ console.log("");
240
+ console.log("Documentation: .devcontainer/README.md");
241
+ console.log("");
242
+ }
243
+
244
+ function printFeatures() {
245
+ console.log("Features included:");
246
+ console.log(" - Claude Code CLI with optimized tool configuration");
247
+ console.log(" - MCP servers: Qdrant (vector memory), Reasoner");
248
+ console.log(" - Development tools: Node.js LTS, Python 3.14, Go, Bun");
249
+ console.log(" - Persistent configuration and shell history");
250
+ console.log("");
77
251
  }
78
252
 
79
253
  if (require.main === module) {
80
- main();
254
+ main();
81
255
  }
82
256
 
83
- module.exports = { copyDirectory, main };
257
+ module.exports = { copyDirectory, syncDirectory, loadPreserveList, main };