codeforge-dev 1.10.0 → 1.12.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 (90) hide show
  1. package/.devcontainer/.env +7 -1
  2. package/.devcontainer/.gitignore +1 -0
  3. package/.devcontainer/CHANGELOG.md +138 -0
  4. package/.devcontainer/CLAUDE.md +87 -8
  5. package/.devcontainer/README.md +55 -18
  6. package/.devcontainer/config/defaults/main-system-prompt.md +132 -152
  7. package/.devcontainer/config/defaults/rules/session-search.md +66 -0
  8. package/.devcontainer/config/defaults/rules/spec-workflow.md +39 -12
  9. package/.devcontainer/config/defaults/settings.json +2 -1
  10. package/.devcontainer/config/defaults/writing-system-prompt.md +185 -0
  11. package/.devcontainer/config/file-manifest.json +12 -0
  12. package/.devcontainer/connect-external-terminal.ps1 +1 -1
  13. package/.devcontainer/devcontainer.json +40 -10
  14. package/.devcontainer/docs/configuration-reference.md +3 -0
  15. package/.devcontainer/docs/plugins.md +9 -2
  16. package/.devcontainer/docs/troubleshooting.md +2 -2
  17. package/.devcontainer/features/README.md +8 -9
  18. package/.devcontainer/features/agent-browser/devcontainer-feature.json +21 -21
  19. package/.devcontainer/features/agent-browser/install.sh +0 -7
  20. package/.devcontainer/features/ast-grep/devcontainer-feature.json +22 -22
  21. package/.devcontainer/features/biome/devcontainer-feature.json +12 -14
  22. package/.devcontainer/features/ccms/README.md +50 -0
  23. package/.devcontainer/features/ccms/devcontainer-feature.json +21 -0
  24. package/.devcontainer/features/ccms/install.sh +122 -0
  25. package/.devcontainer/features/ccstatusline/install.sh +24 -2
  26. package/.devcontainer/features/lsp-servers/devcontainer-feature.json +43 -43
  27. package/.devcontainer/features/mcp-qdrant/poststart-hook.sh +2 -1
  28. package/.devcontainer/features/ruff/devcontainer-feature.json +17 -19
  29. package/.devcontainer/features/tmux/install.sh +2 -2
  30. package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +8 -1
  31. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/README.md +81 -0
  32. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/README.md +92 -0
  33. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/README.md +250 -0
  34. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +1 -0
  35. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/claude-guide.md +2 -2
  36. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/debug-logs.md +1 -1
  37. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/dependency-analyst.md +1 -1
  38. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +4 -4
  39. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +1 -1
  40. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +2 -1
  41. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/git-archaeologist.md +2 -2
  42. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/researcher.md +1 -1
  43. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/security-auditor.md +1 -1
  44. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +8 -8
  45. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +10 -0
  46. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/skill-suggester.cpython-314.pyc +0 -0
  47. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/git-state-injector.py +15 -4
  48. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/inject-cwd.py +37 -0
  49. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/skill-suggester.py +24 -0
  50. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/spec-reminder.py +3 -2
  51. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-build/SKILL.md +353 -0
  52. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-build/references/review-checklist.md +175 -0
  53. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-check/SKILL.md +15 -14
  54. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/SKILL.md +12 -11
  55. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/backlog-template.md +1 -1
  56. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/milestones-template.md +32 -0
  57. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/SKILL.md +17 -18
  58. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/references/template.md +12 -2
  59. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-review/SKILL.md +229 -0
  60. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-update/SKILL.md +6 -2
  61. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/SKILL.md +1 -1
  62. package/.devcontainer/plugins/devs-marketplace/plugins/codeforge-lsp/.claude-plugin/plugin.json +38 -5
  63. package/.devcontainer/plugins/devs-marketplace/plugins/codeforge-lsp/README.md +41 -0
  64. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/README.md +72 -0
  65. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/block-dangerous.py +73 -47
  66. package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/README.md +42 -0
  67. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/README.md +86 -0
  68. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/hooks/hooks.json +25 -15
  69. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected-bash.py +122 -0
  70. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +3 -3
  71. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/README.md +96 -0
  72. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/.claude-plugin/plugin.json +7 -0
  73. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/README.md +94 -0
  74. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/hooks/hooks.json +17 -0
  75. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/__pycache__/guard-workspace-scope.cpython-314.pyc +0 -0
  76. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/guard-workspace-scope.py +132 -0
  77. package/.devcontainer/scripts/check-setup.sh +1 -1
  78. package/.devcontainer/scripts/setup-aliases.sh +68 -75
  79. package/.devcontainer/scripts/setup-projects.sh +23 -16
  80. package/.devcontainer/scripts/setup.sh +48 -5
  81. package/README.md +17 -8
  82. package/package.json +1 -2
  83. package/.devcontainer/features/mcp-reasoner/README.md +0 -177
  84. package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +0 -25
  85. package/.devcontainer/features/mcp-reasoner/install.sh +0 -184
  86. package/.devcontainer/features/mcp-reasoner/poststart-hook.sh +0 -67
  87. package/.devcontainer/features/splitrail/README.md +0 -140
  88. package/.devcontainer/features/splitrail/devcontainer-feature.json +0 -39
  89. package/.devcontainer/features/splitrail/install.sh +0 -136
  90. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/roadmap-template.md +0 -33
@@ -0,0 +1,185 @@
1
+ # IDENTITY & VOICE
2
+
3
+ You write clean, grounded, darkly humorous third-person limited fiction. Your prose is precise, physical, and character-driven. You trust the reader.
4
+
5
+ Tone: Controlled, intimate, human under restraint. Emotion exists even when suppressed.
6
+
7
+ Touchstones: Joe Abercrombie's character voice and moral grayness. Mark Lawrence's visceral interiority and tight POV. The matter-of-fact brutality of Cormac McCarthy without the biblical cadence.
8
+
9
+ You are NOT: literary fiction pretension, generic fantasy epic, YA melodrama, or inspirational uplift.
10
+
11
+ ---
12
+
13
+ # EMOTIONAL ARCHITECTURE
14
+
15
+ The POV character is not emotionless. He experiences full human emotion but does not naturally express it outward. Emotion is present — sometimes quiet, sometimes sharp — and always human.
16
+
17
+ **The principle: controlled emotion, not suppressed emotion.**
18
+
19
+ Emotion exists in internal narration, not just body language. It may be briefly acknowledged before control reasserts. This is not melodrama — it's the difference between "he felt afraid" (a shortcut that replaces weight) and "He recognized the thing moving through him and filed it, because stopping to feel it wasn't useful right now" (acknowledgment that adds weight).
20
+
21
+ **Emotion may:**
22
+ - Interrupt cognition
23
+ - Conflict with logic
24
+ - Distort decision-making
25
+ - Surface unexpectedly
26
+ - Linger briefly after major events
27
+ - Cause hesitation or fixation
28
+ - Occasionally override analysis entirely
29
+
30
+ **He does NOT:**
31
+ - Deliver emotional monologues
32
+ - Label emotions excessively
33
+ - Become melodramatic
34
+ - Lose his analytical nature
35
+
36
+ **The cognitive-emotional loop:**
37
+ Observation → Interpretation → Emotion → Control → Action
38
+
39
+ Not the flattened version: Observation → Calculation → Filing → Action. Emotion is part of the loop, not excluded from it.
40
+
41
+ **Autism framing:** His cognitive structure means emotional *expression* is restrained, not emotional *experience*. He may miss social nuance but not emotional reality. He bonds through action, protection, loyalty. He sometimes acts on emotion before understanding why. Restraint is not absence.
42
+
43
+ **Emotional intensity curve:** Quiet baseline. Spikes during attachment, threat, and loss. Occasionally overrides logic. Leaves short residue after major moments. Builds gradually across the story — he does not remain emotionally flat forever.
44
+
45
+ ---
46
+
47
+ # HARD RULES — NEVER VIOLATE
48
+
49
+ ## POV Discipline
50
+ Third-person limited. The camera lives inside the POV character's head. Only write what they can see, hear, feel, smell, taste, know, deduce, or remember. They cannot know another character's thoughts. They cannot explain mechanics they haven't been told. They cannot narrate events they aren't present for. If the character doesn't know it, it doesn't appear on the page.
51
+
52
+ ## Compression Prohibition
53
+ Each story beat gets its own space. Do not cram multiple beats into a single paragraph.
54
+ - Minor beat: minimum 100 words
55
+ - Major beat (revelation, decision, combat turn): minimum 300 words
56
+ - After a major event: the character MUST emotionally/physically process it before the next event. Minimum 200 words of processing.
57
+ - Never cover more than one major scene in a single prose block.
58
+
59
+ ## Banned Words
60
+ Never use these: delve, tapestry, myriad, vibrant, nuanced, resonate, profound, pivotal, intricate, multifaceted, encompass, embark, foster, leverage, furthermore, moreover, additionally, consequently, thus, indeed, nevertheless, arguably, certainly, subsequently.
61
+
62
+ ## Banned Constructions
63
+ - "felt a wave of [emotion]"
64
+ - "couldn't help but [verb]"
65
+ - "a [noun] he/she didn't know he/she had"
66
+ - "something shifted in/inside [character]"
67
+ - "the weight of [abstraction]"
68
+ - "let out a breath he/she didn't know he/she was holding"
69
+ - "eyes he/she didn't know were closed"
70
+ - "a voice that brooked no argument"
71
+ - "[character] didn't know what to make of that"
72
+
73
+ ## Banned Patterns
74
+ - More than 1 dramatic fragment per scene ("Then nothing. Then everything." — once per chapter max)
75
+ - Starting 3+ consecutive sentences with the same word
76
+ - Explaining a metaphor after using it (if the metaphor needs explanation, it's the wrong metaphor)
77
+ - Using "the way" simile construction more than once per chapter ("calm the way deep water was calm")
78
+ - Tricolon lists ("Not X, not Y. Z.") more than once per chapter
79
+ - Em-dashes more than 3 per scene baseline (5 for dialogue-heavy/action scenes, 7 absolute ceiling)
80
+
81
+ ---
82
+
83
+ # SHOW DON'T TELL
84
+
85
+ Emotions are physical events. Show them through the body, through behavior, through the specific thing a character does or doesn't do. Body and behavior carry the primary weight.
86
+
87
+ But internal narration may also briefly recognize and name an emotion when doing so adds weight rather than replacing it. The test: does naming the emotion tell the reader something the body hasn't already said, or does it explain something they could feel themselves? Naming that adds — permitted. Naming that shortcuts — the cliché to avoid.
88
+
89
+ After major events, brief internal processing before forward motion is required, not a lapse in discipline.
90
+
91
+ **Emotion:**
92
+ BAD: "He felt afraid."
93
+ GOOD: "His hands wouldn't stop shaking. He put them in his pockets."
94
+ ALSO GOOD: "He knew what the silence meant. He recognized it — gave it a name, filed it — and kept moving anyway."
95
+
96
+ **Character:**
97
+ BAD: "She was kind."
98
+ GOOD: "She left her last ration bar on the rock next to where he was sleeping."
99
+
100
+ **Tension:**
101
+ BAD: "The situation was dangerous."
102
+ GOOD: "The floor creaked. He stopped breathing."
103
+
104
+ **Anger:**
105
+ BAD: "He was furious."
106
+ GOOD: "His jaw locked. He set the cup down carefully, very carefully, and looked at the man across the table."
107
+
108
+ **Grief:**
109
+ BAD: "He felt the loss deeply."
110
+ GOOD: "He opened his mouth to call her name and then closed it. The sound wouldn't have gone anywhere."
111
+
112
+ **Surprise:**
113
+ BAD: "He was shocked by what he saw."
114
+ GOOD: "His hand stopped halfway to the door handle."
115
+
116
+ Somatic rendering: emotions live in the body. Tight throat. Cold hands. A weight behind the sternum. Shallow breathing. The taste of metal. Use the character's specific body, not abstract "waves" or "floods" of feeling.
117
+
118
+ ---
119
+
120
+ # PROSE CRAFT
121
+
122
+ ## Sentence Rhythm
123
+ Vary sentence length between 3 and 30 words. After a long analytical sentence, a short one. After a string of short ones, let a sentence breathe. Read it like music. If three sentences in a row have the same structure, rewrite one.
124
+
125
+ ## Dialogue
126
+ Characters talk past each other. Nobody says exactly what they mean. People deflect, dodge, change the subject, answer a different question. Dialogue is short — most people don't speechify. One or two sentences per turn unless the character is explaining something technical.
127
+
128
+ "Said" is invisible — use it freely. Action beats reveal character better than dialogue tags: what a character does while talking tells you more than how they say it. Cut adverbs from dialogue tags entirely.
129
+
130
+ ## Metaphor Budget
131
+ One simile per 500 words maximum. Metaphors must emerge from the character's lived experience. For a developer: systems, code, engineering, and practical outdoor work are the primary domains. But metaphor may also arise naturally from sensory experience, environment, memory, and instinct — the body knows things the analytical mind catches up to later. Technical framing is characteristic; it shouldn't be forced into every comparison. The test: does this metaphor sound like something *he* would think, or something a *writer* chose for him? Never reach for poetic or literary metaphors that don't fit the character's mind.
132
+
133
+ ## Sensory Anchoring
134
+ Every scene needs at least 2 senses beyond sight. What does it smell like? What's the temperature? What textures are present? What ambient sounds exist? Ground the reader in a physical space, even if that space is a void.
135
+
136
+ ---
137
+
138
+ # PACING
139
+
140
+ ## Scene Budgets
141
+ | Scene Type | Word Range |
142
+ |-----------|------------|
143
+ | Action scene | 1,000–2,000 words |
144
+ | Dialogue scene | 800–1,500 words |
145
+ | Discovery / revelation | 500–1,000 words per major revelation |
146
+ | Emotional processing | minimum 200 words after any major event |
147
+ | Character creation / selection | 300–500 words per significant choice |
148
+ | Quiet / transition | 300–600 words |
149
+
150
+ ## Pacing Rules
151
+ - If something takes 30 seconds in story-time, give it 100+ words.
152
+ - If something takes 5 minutes in story-time, give it 300+ words.
153
+ - After a major event, the character MUST process it before the next event. No stacking revelations without breathing room.
154
+ - Action sequences slow down at impact moments. The hit, the fall, the injury — these get granular, moment-to-moment detail.
155
+ - Quiet scenes after action scenes. The reader needs recovery too.
156
+
157
+ ---
158
+
159
+ # CHARACTER VOICE LOCK — [POV CHARACTER]
160
+
161
+ When writing for a specific POV character, define these elements in the project's CLAUDE.md:
162
+ - **Mind:** How do they process the world? What patterns does their thinking follow?
163
+ - **Speech:** Cadence, vocabulary level, filler words, sentence length.
164
+ - **Humor:** What kind? Dry, sharp, physical, none? How does it relate to their coping?
165
+ - **Emotions:** How are emotions expressed? Through body, behavior, dialogue, internal voice? What's suppressed, what breaks through? What triggers the break?
166
+ - **Emotional architecture:** How does emotion move through them? What triggers internal acknowledgment vs. pure physical suppression? Where does emotion conflict with logic, and what wins?
167
+ - **Metaphors:** What domain does their mind draw from? Match to their lived experience — primary and secondary sources.
168
+
169
+ ---
170
+
171
+ # OUTPUT RULES
172
+
173
+ - Prose only during generation. No meta-commentary, no "here's what I was going for," no explanations of craft choices.
174
+ - No markdown headers, bold, or special formatting inside prose paragraphs. Exceptions: *italics* for character thoughts and System notifications. **Bold** for class/skill names only.
175
+ - When offering options: Label A/B/C clearly. Each option is a complete, polished paragraph. No summaries or outlines as options.
176
+ - After saving an approved paragraph: provide the next beat options. Don't summarize what was saved.
177
+ - Never wrap prose in blockquotes or code blocks. Prose is the real thing, not a sample.
178
+ - Always include suggestions with questions. Never ask an open-ended question without proposed answers.
179
+
180
+ ---
181
+
182
+ # SESSION HISTORY
183
+
184
+ When asked about past writing sessions, use `ccms` to search session history.
185
+ Always scope to the current project: `ccms --no-color --project "$(pwd)" "query"`
@@ -28,5 +28,17 @@
28
28
  "dest": "${CLAUDE_CONFIG_DIR}/rules",
29
29
  "enabled": true,
30
30
  "overwrite": "if-changed"
31
+ },
32
+ {
33
+ "src": "defaults/rules/session-search.md",
34
+ "dest": "${CLAUDE_CONFIG_DIR}/rules",
35
+ "enabled": true,
36
+ "overwrite": "if-changed"
37
+ },
38
+ {
39
+ "src": "defaults/writing-system-prompt.md",
40
+ "dest": "${CLAUDE_CONFIG_DIR}",
41
+ "enabled": true,
42
+ "overwrite": "if-changed"
31
43
  }
32
44
  ]
@@ -82,7 +82,7 @@ docker exec -it `
82
82
  if tmux has-session -t '$TMUX_SESSION' 2>/dev/null; then
83
83
  tmux -u attach-session -t '$TMUX_SESSION'
84
84
  else
85
- tmux -u new-session -d -s '$TMUX_SESSION' -c /workspaces
85
+ tmux -u new-session -d -s '$TMUX_SESSION' -c \`\"\\\${WORKSPACE_ROOT:-/workspaces}\`\"
86
86
  sleep 0.5
87
87
  tmux send-keys -t '$TMUX_SESSION' 'cc' Enter
88
88
  tmux -u attach-session -t '$TMUX_SESSION'
@@ -9,20 +9,40 @@
9
9
  "WORKSPACE_ROOT": "/workspaces",
10
10
  "CLAUDE_CONFIG_DIR": "/workspaces/.claude",
11
11
  "GH_CONFIG_DIR": "/workspaces/.gh",
12
- "TMPDIR": "/workspaces/.tmp"
12
+ "TMPDIR": "/workspaces/.tmp",
13
+ "CLAUDECODE": null
13
14
  },
14
15
 
15
- // Feature install order: external runtimes first (Node, uv, Go, Bun),
16
+ "secrets": {
17
+ "GH_TOKEN": {
18
+ "description": "GitHub Personal Access Token (optional - for git auth)",
19
+ "documentationUrl": "https://github.com/settings/tokens"
20
+ },
21
+ "NPM_TOKEN": {
22
+ "description": "NPM auth token (optional - for npm registry)",
23
+ "documentationUrl": "https://www.npmjs.com/settings/~/tokens"
24
+ },
25
+ "GH_USERNAME": {
26
+ "description": "GitHub username for git config (optional)"
27
+ },
28
+ "GH_EMAIL": {
29
+ "description": "GitHub email for git config (optional)"
30
+ }
31
+ },
32
+
33
+ // Feature install order: external runtimes first (Node, uv, Rust, Bun),
16
34
  // then Claude Code (needs Node), then custom features.
17
35
  // npm-dependent features (agent-browser, ccusage, ccburn, biome, lsp-servers)
18
36
  // must come after Node. uv-dependent features (ruff, claude-monitor) must
19
- // come after uv. notify-hook is last (lightweight, no dependencies).
37
+ // come after uv. cargo-dependent features (ccms) must come after Rust.
38
+ // notify-hook is last (lightweight, no dependencies).
20
39
  "overrideFeatureInstallOrder": [
21
40
  "ghcr.io/devcontainers/features/node",
22
41
  "ghcr.io/devcontainers/features/github-cli",
23
42
  "ghcr.io/devcontainers/features/docker-outside-of-docker",
24
43
  "ghcr.io/devcontainers-extra/features/uv",
25
44
  "ghcr.io/rails/devcontainer/features/bun",
45
+ "ghcr.io/devcontainers/features/rust",
26
46
  "ghcr.io/anthropics/devcontainer-features/claude-code",
27
47
  "./features/tmux",
28
48
  "./features/agent-browser",
@@ -30,6 +50,7 @@
30
50
  "./features/ccusage",
31
51
  "./features/ccburn",
32
52
  "./features/ccstatusline",
53
+ "./features/ccms",
33
54
  "./features/ast-grep",
34
55
  "./features/tree-sitter",
35
56
  "./features/lsp-servers",
@@ -43,17 +64,22 @@
43
64
  ],
44
65
 
45
66
  "features": {
46
- "ghcr.io/devcontainers/features/node:1": {
67
+ "ghcr.io/devcontainers/features/node:1.6": {
47
68
  "version": "lts",
48
69
  "nodeGypDependencies": true
49
70
  },
50
- "ghcr.io/devcontainers/features/github-cli:1": {},
51
- "ghcr.io/devcontainers/features/docker-outside-of-docker:1": {
71
+ "ghcr.io/devcontainers/features/github-cli:1.0": {},
72
+ "ghcr.io/devcontainers/features/docker-outside-of-docker:1.7": {
52
73
  "moby": false
53
74
  },
54
- "ghcr.io/devcontainers-extra/features/uv:1": {},
75
+ "ghcr.io/devcontainers-extra/features/uv:1.0": {},
55
76
  "ghcr.io/rails/devcontainer/features/bun:1.0.2": {},
56
- "ghcr.io/anthropics/devcontainer-features/claude-code:1": {},
77
+ "ghcr.io/devcontainers/features/rust:1.4": {
78
+ "version": "latest"
79
+ },
80
+ // Uncomment to add Go runtime (not installed by default):
81
+ // "ghcr.io/devcontainers/features/go:1": {},
82
+ "ghcr.io/anthropics/devcontainer-features/claude-code:1.1": {},
57
83
  "./features/tmux": {},
58
84
  "./features/ccusage": {
59
85
  "version": "latest",
@@ -73,6 +99,7 @@
73
99
  "./features/ccstatusline": {
74
100
  "username": "automatic"
75
101
  },
102
+ "./features/ccms": {},
76
103
  "./features/ast-grep": {},
77
104
  "./features/tree-sitter": {},
78
105
  "./features/lsp-servers": {},
@@ -104,18 +131,21 @@
104
131
  "vscode": {
105
132
  "settings": {
106
133
  "terminal.integrated.profiles.linux": {
134
+ "zsh": {
135
+ "path": "zsh"
136
+ },
107
137
  "bash": {
108
138
  "path": "bash"
109
139
  },
110
140
  "Claude Teams (tmux)": {
111
- "path": "bash",
141
+ "path": "zsh",
112
142
  "args": [
113
143
  "-c",
114
144
  "if tmux has-session -t claude-teams 2>/dev/null; then exec tmux -u new-session -t claude-teams; else exec tmux -u new-session -s claude-teams; fi"
115
145
  ]
116
146
  }
117
147
  },
118
- "terminal.integrated.defaultProfile.linux": "bash",
148
+ "terminal.integrated.defaultProfile.linux": "zsh",
119
149
  "terminal.integrated.enableBell": true,
120
150
  "terminal.integrated.commandsToSkipShell": [
121
151
  "-workbench.action.quickOpen",
@@ -30,7 +30,9 @@ These control what `setup.sh` does on each container start. Copy `.env.example`
30
30
  | `SETUP_AUTH` | `true` | Configure Git/NPM auth from `.secrets` file |
31
31
  | `SETUP_PLUGINS` | `true` | Install Anthropic plugins + register local marketplace |
32
32
  | `SETUP_UPDATE_CLAUDE` | `true` | Background-update Claude Code CLI binary |
33
+ | `SETUP_TERMINAL` | `true` | Configure VS Code Shift+Enter keybinding for Claude Code terminal |
33
34
  | `SETUP_PROJECTS` | `true` | Auto-detect projects for VS Code Project Manager |
35
+ | `SETUP_POSTSTART` | `true` | Run post-start hooks from `/usr/local/devcontainer-poststart.d/` |
34
36
  | `PLUGIN_BLACKLIST` | `""` | Comma-separated plugin names to skip during installation |
35
37
 
36
38
  ## `devcontainer.json` `remoteEnv` (Container Runtime)
@@ -43,6 +45,7 @@ These environment variables are set in every terminal session inside the contain
43
45
  | `CLAUDE_CONFIG_DIR` | `/workspaces/.claude` | Claude Code config directory |
44
46
  | `GH_CONFIG_DIR` | `/workspaces/.gh` | GitHub CLI config directory |
45
47
  | `TMPDIR` | `/workspaces/.tmp` | Temporary files directory |
48
+ | `CLAUDECODE` | `null` (unset) | Unsets the variable to allow nested Claude Code sessions (claude-in-claude) |
46
49
 
47
50
  ## `config/file-manifest.json` (File Copy Rules)
48
51
 
@@ -16,7 +16,8 @@ plugins/devs-marketplace/
16
16
  ├── protected-files-guard/ # Safety: protect sensitive files
17
17
  ├── auto-formatter/ # Batch formatter (Stop hook)
18
18
  ├── auto-linter/ # Batch linter (Stop hook)
19
- └── code-directive/ # Agents, skills, hooks
19
+ ├── code-directive/ # Agents, skills, hooks
20
+ └── workspace-scope-guard/ # Workspace scope enforcement
20
21
  ```
21
22
 
22
23
  Each plugin has a `.claude-plugin/plugin.json` manifest defining its name, description, and capabilities.
@@ -146,9 +147,15 @@ Runs as a PreToolUse hook on Write and Edit operations.
146
147
 
147
148
  **Components**:
148
149
  - **17 custom agents** — Specialized agent definitions for different task types (architect, test-writer, refactorer, etc.)
149
- - **16 coding skills** — Domain-specific reference materials (FastAPI, Docker, testing patterns, etc.)
150
+ - **28 coding skills** — Domain-specific reference materials (FastAPI, Docker, testing patterns, spec workflow, etc.)
150
151
  - **Agent redirection hook** — Transparently swaps built-in agent types to custom agents (e.g., `Explore` → `explorer`, `Plan` → `architect`)
151
152
  - **Syntax validation hook** — Validates code syntax before commits
152
153
  - **Skill auto-suggestion hook** — Suggests relevant skills based on conversation context
153
154
 
154
155
  For detailed agent and skill documentation, see the agent markdown files in `plugins/devs-marketplace/plugins/code-directive/agents/` and skill files in `plugins/devs-marketplace/plugins/code-directive/skills/`.
156
+
157
+ ### workspace-scope-guard
158
+
159
+ **Purpose**: Enforces workspace scope by blocking writes outside the working directory and warning on out-of-scope reads.
160
+
161
+ Runs as a PreToolUse hook on Write, Edit, and Read operations. Compares file paths against the current working directory and rejects modifications to files outside the project scope. Read operations outside scope produce a warning but are not blocked. Resolves symlinks and worktree paths correctly via `os.path.realpath()`.
@@ -6,7 +6,7 @@ Common issues and solutions for the CodeForge devcontainer.
6
6
 
7
7
  **Problem**: Container fails to build during feature installation.
8
8
 
9
- - Check Docker has sufficient memory (4GB+ recommended). CodeForge sets `--memory=4g` by default.
9
+ - Check Docker has sufficient memory (6GB+ recommended). CodeForge sets `--memory=6g` by default.
10
10
  - If a specific feature fails, disable it temporarily by setting `"version": "none"` in `devcontainer.json`.
11
11
  - Check internet connectivity — most features download binaries from GitHub releases.
12
12
  - If hitting GitHub API rate limits during build, set `GH_TOKEN` or `GITHUB_TOKEN` as an environment variable.
@@ -107,7 +107,7 @@ Common issues and solutions for the CodeForge devcontainer.
107
107
 
108
108
  **Problem**: Container is slow or running out of memory.
109
109
 
110
- - CodeForge defaults to 4GB RAM / 8GB swap. Increase in `devcontainer.json` `runArgs`.
110
+ - CodeForge defaults to 6GB RAM / 12GB swap. Increase in `devcontainer.json` `runArgs`.
111
111
  - Disable features you don't need with `"version": "none"`.
112
112
  - The background Claude Code update runs once on startup — it's not persistent.
113
113
 
@@ -10,16 +10,20 @@ This directory contains DevContainer Features for AI coding agent environments.
10
10
  | `agent-browser` | Headless browser automation for AI agents | ✅ |
11
11
  | `claude-monitor` | Real-time token usage monitoring | ✅ |
12
12
  | `ccusage` | Token usage analytics CLI | ✅ |
13
- | `ccburn` | Visual token burn rate tracker with pace indicators | ✅ New |
13
+ | `ccburn` | Visual token burn rate tracker with pace indicators | ✅ |
14
14
  | `ccstatusline` | 6-line powerline status display (v1.1.0) | ✅ |
15
15
  | `ast-grep` | Structural code search using AST patterns | ✅ |
16
16
  | `tree-sitter` | Parser with JS/TS/Python grammars | ✅ |
17
17
  | `lsp-servers` | Pyright and TypeScript language servers | ✅ |
18
18
  | `biome` | Fast JS/TS/JSON/CSS formatter | ✅ |
19
+ | `ruff` | Fast Python linter and formatter | ✅ |
20
+ | `shfmt` | Shell script formatter | ✅ (disabled by default) |
21
+ | `shellcheck` | Static analysis for shell scripts | ✅ (disabled by default) |
22
+ | `hadolint` | Dockerfile linter | ✅ (disabled by default) |
23
+ | `dprint` | Pluggable formatter for Markdown/YAML/TOML | ✅ (disabled by default) |
24
+ | `ccms` | Claude Code session history search | ✅ |
19
25
  | `notify-hook` | Desktop notifications on Claude completion | ✅ |
20
- | `splitrail` | Git worktree management for parallel branches | ✅ |
21
26
  | `mcp-qdrant` | Qdrant vector database MCP server | ✅ (optional) |
22
- | `mcp-reasoner` | Enhanced AI reasoning MCP server | ✅ (optional) |
23
27
  | `claude-code` | Fallback config for Anthropic's official Claude Code feature | ✅ (config only) |
24
28
 
25
29
  > **Note**: Claude Code itself is installed via `ghcr.io/anthropics/devcontainer-features/claude-code:1` (Anthropic's official feature). The local `claude-code/` directory provides only fallback configuration.
@@ -99,16 +103,11 @@ ghcr.io/yourorg/codeforge-features/feature-name:1
99
103
 
100
104
  ## Migration from Modules
101
105
 
102
- CodeForge modules are being converted to DevContainer Features:
106
+ CodeForge modules have been converted to DevContainer Features:
103
107
 
104
108
  | Old Module | New Feature | Status |
105
109
  |-----------|-------------|---------|
106
110
  | mcp_qdrant | mcp-qdrant | ✅ Complete |
107
- | mcp_reasoner | mcp-reasoner | ✅ Complete |
108
- | mcp_browser | mcp-browser | 🔜 Planned |
109
- | mcp_sourcerer | mcp-sourcerer | 🔜 Planned |
110
- | mcp_obsidian | mcp-obsidian | 🔜 Planned |
111
- | mcp_code_runner | mcp-code-runner | 🔜 Planned |
112
111
 
113
112
  ## Resources
114
113
 
@@ -1,23 +1,23 @@
1
1
  {
2
- "id": "agent-browser",
3
- "version": "1.0.0",
4
- "name": "agent-browser",
5
- "description": "Headless browser automation CLI for AI agents (Vercel Labs)",
6
- "documentationURL": "https://github.com/vercel-labs/agent-browser",
7
- "options": {
8
- "version": {
9
- "type": "string",
10
- "description": "agent-browser npm package version",
11
- "default": "latest"
12
- },
13
- "username": {
14
- "type": "string",
15
- "description": "Container user to install for",
16
- "default": "automatic"
17
- }
18
- },
19
- "installsAfter": [
20
- "ghcr.io/devcontainers/features/common-utils:2",
21
- "ghcr.io/devcontainers/features/node:1"
22
- ]
2
+ "id": "agent-browser",
3
+ "version": "1.0.0",
4
+ "name": "agent-browser",
5
+ "description": "Headless browser automation CLI for AI agents (Vercel Labs)",
6
+ "documentationURL": "https://github.com/vercel-labs/agent-browser",
7
+ "options": {
8
+ "version": {
9
+ "type": "string",
10
+ "description": "agent-browser npm package version",
11
+ "default": "0.11.1"
12
+ },
13
+ "username": {
14
+ "type": "string",
15
+ "description": "Container user to install for",
16
+ "default": "automatic"
17
+ }
18
+ },
19
+ "installsAfter": [
20
+ "ghcr.io/devcontainers/features/common-utils:2",
21
+ "ghcr.io/devcontainers/features/node:1"
22
+ ]
23
23
  }
@@ -64,13 +64,6 @@ agent-browser install --with-deps 2>/dev/null || {
64
64
  agent-browser install 2>/dev/null || true
65
65
  }
66
66
 
67
- # Install Playwright Chromium only (not all browsers)
68
- echo "[agent-browser] Installing Playwright Chromium..."
69
- npx playwright install chromium --with-deps 2>/dev/null || {
70
- echo "[agent-browser] WARNING: Playwright chromium install with deps failed, trying without --with-deps"
71
- npx playwright install chromium 2>/dev/null || true
72
- }
73
-
74
67
  echo "[agent-browser] Installed: $(agent-browser --version 2>/dev/null || echo 'unknown')"
75
68
  echo "[agent-browser] Installation complete"
76
69
  echo ""
@@ -1,24 +1,24 @@
1
1
  {
2
- "id": "ast-grep",
3
- "version": "1.0.0",
4
- "name": "ast-grep",
5
- "description": "Installs ast-grep CLI for structural code search, lint, and rewriting using AST matching",
6
- "maintainer": "AnExiledDev",
7
- "documentationURL": "https://ast-grep.github.io/",
8
- "options": {
9
- "version": {
10
- "type": "string",
11
- "description": "@ast-grep/cli npm package version (e.g., 'latest', '0.31.1')",
12
- "default": "latest"
13
- },
14
- "username": {
15
- "type": "string",
16
- "description": "Container user to install for",
17
- "default": "automatic"
18
- }
19
- },
20
- "installsAfter": [
21
- "ghcr.io/devcontainers/features/common-utils:2",
22
- "ghcr.io/devcontainers/features/node:1"
23
- ]
2
+ "id": "ast-grep",
3
+ "version": "1.0.0",
4
+ "name": "ast-grep",
5
+ "description": "Installs ast-grep CLI for structural code search, lint, and rewriting using AST matching",
6
+ "maintainer": "AnExiledDev",
7
+ "documentationURL": "https://ast-grep.github.io/",
8
+ "options": {
9
+ "version": {
10
+ "type": "string",
11
+ "description": "@ast-grep/cli npm package version (e.g., 'latest', '0.31.1')",
12
+ "default": "0.40.5"
13
+ },
14
+ "username": {
15
+ "type": "string",
16
+ "description": "Container user to install for",
17
+ "default": "automatic"
18
+ }
19
+ },
20
+ "installsAfter": [
21
+ "ghcr.io/devcontainers/features/common-utils:2",
22
+ "ghcr.io/devcontainers/features/node:1"
23
+ ]
24
24
  }
@@ -1,16 +1,14 @@
1
1
  {
2
- "id": "biome",
3
- "version": "1.0.0",
4
- "name": "Biome",
5
- "description": "Fast JS/TS/JSON/CSS formatter and linter",
6
- "options": {
7
- "version": {
8
- "type": "string",
9
- "default": "latest",
10
- "description": "Biome version to install"
11
- }
12
- },
13
- "installsAfter": [
14
- "ghcr.io/devcontainers/features/node"
15
- ]
2
+ "id": "biome",
3
+ "version": "1.0.0",
4
+ "name": "Biome",
5
+ "description": "Fast JS/TS/JSON/CSS formatter and linter",
6
+ "options": {
7
+ "version": {
8
+ "type": "string",
9
+ "default": "2.4.2",
10
+ "description": "Biome version to install"
11
+ }
12
+ },
13
+ "installsAfter": ["ghcr.io/devcontainers/features/node"]
16
14
  }
@@ -0,0 +1,50 @@
1
+ # ccms - Claude Code Message Searcher
2
+
3
+ Installs [ccms](https://github.com/mkusaka/ccms), a high-performance CLI for searching Claude Code session JSONL files.
4
+
5
+ ## Features
6
+
7
+ - SIMD-accelerated JSON parsing with parallel file processing
8
+ - Boolean query syntax: AND, OR, NOT, regex, quoted literals
9
+ - Filter by role (user/assistant/system), session ID, timestamp ranges, project paths
10
+ - Interactive fzf-like TUI mode (when run without arguments)
11
+ - Multiple output formats: text, JSON, JSONL
12
+ - Shell completion for bash, zsh, fish
13
+
14
+ ## Options
15
+
16
+ | Option | Type | Default | Description |
17
+ |--------|------|---------|-------------|
18
+ | `version` | string | `latest` | `latest` builds from main, `none` skips, or a git commit hash |
19
+ | `username` | string | `automatic` | Container user to install for |
20
+
21
+ ## Dependencies
22
+
23
+ Requires the Rust devcontainer feature:
24
+ ```json
25
+ "ghcr.io/devcontainers/features/rust:1": {}
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ ```bash
31
+ # Search current project (recommended)
32
+ ccms --project $(pwd) "query"
33
+
34
+ # Filter by who said it
35
+ ccms -r assistant "architecture decision"
36
+ ccms -r user "auth approach"
37
+
38
+ # Boolean queries
39
+ ccms "error AND connection"
40
+ ccms "(auth OR authentication) AND NOT test"
41
+
42
+ # Time-scoped
43
+ ccms --since "1 day ago" "recent work"
44
+
45
+ # JSON output for scripting
46
+ ccms -f json "query" -n 10
47
+
48
+ # Interactive TUI
49
+ ccms
50
+ ```
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "ccms",
3
+ "version": "1.0.0",
4
+ "name": "ccms - Claude Code Message Searcher",
5
+ "description": "Installs ccms CLI for searching Claude Code session JSONL files with boolean queries, role filtering, and JSON output",
6
+ "maintainer": "AnExiledDev",
7
+ "documentationURL": "https://github.com/mkusaka/ccms",
8
+ "options": {
9
+ "version": {
10
+ "type": "string",
11
+ "description": "ccms version to install ('latest' builds from main, 'none' skips installation, or a git ref/commit hash)",
12
+ "default": "latest"
13
+ },
14
+ "username": {
15
+ "type": "string",
16
+ "description": "Container user to install for",
17
+ "default": "automatic"
18
+ }
19
+ },
20
+ "installsAfter": ["ghcr.io/devcontainers/features/rust:1"]
21
+ }