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.
- package/.devcontainer/.env +7 -1
- package/.devcontainer/.gitignore +1 -0
- package/.devcontainer/CHANGELOG.md +138 -0
- package/.devcontainer/CLAUDE.md +87 -8
- package/.devcontainer/README.md +55 -18
- package/.devcontainer/config/defaults/main-system-prompt.md +132 -152
- package/.devcontainer/config/defaults/rules/session-search.md +66 -0
- package/.devcontainer/config/defaults/rules/spec-workflow.md +39 -12
- package/.devcontainer/config/defaults/settings.json +2 -1
- package/.devcontainer/config/defaults/writing-system-prompt.md +185 -0
- package/.devcontainer/config/file-manifest.json +12 -0
- package/.devcontainer/connect-external-terminal.ps1 +1 -1
- package/.devcontainer/devcontainer.json +40 -10
- package/.devcontainer/docs/configuration-reference.md +3 -0
- package/.devcontainer/docs/plugins.md +9 -2
- package/.devcontainer/docs/troubleshooting.md +2 -2
- package/.devcontainer/features/README.md +8 -9
- package/.devcontainer/features/agent-browser/devcontainer-feature.json +21 -21
- package/.devcontainer/features/agent-browser/install.sh +0 -7
- package/.devcontainer/features/ast-grep/devcontainer-feature.json +22 -22
- package/.devcontainer/features/biome/devcontainer-feature.json +12 -14
- package/.devcontainer/features/ccms/README.md +50 -0
- package/.devcontainer/features/ccms/devcontainer-feature.json +21 -0
- package/.devcontainer/features/ccms/install.sh +122 -0
- package/.devcontainer/features/ccstatusline/install.sh +24 -2
- package/.devcontainer/features/lsp-servers/devcontainer-feature.json +43 -43
- package/.devcontainer/features/mcp-qdrant/poststart-hook.sh +2 -1
- package/.devcontainer/features/ruff/devcontainer-feature.json +17 -19
- package/.devcontainer/features/tmux/install.sh +2 -2
- package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +8 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/README.md +81 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/README.md +92 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/README.md +250 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/architect.md +1 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/claude-guide.md +2 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/debug-logs.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/dependency-analyst.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/doc-writer.md +4 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/explorer.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/generalist.md +2 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/git-archaeologist.md +2 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/researcher.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/security-auditor.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/agents/spec-writer.md +8 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +10 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/skill-suggester.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/git-state-injector.py +15 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/inject-cwd.py +37 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/skill-suggester.py +24 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/spec-reminder.py +3 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-build/SKILL.md +353 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-build/references/review-checklist.md +175 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-check/SKILL.md +15 -14
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/SKILL.md +12 -11
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/backlog-template.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-init/references/milestones-template.md +32 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/SKILL.md +17 -18
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-new/references/template.md +12 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-review/SKILL.md +229 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/spec-update/SKILL.md +6 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/skills/specification-writing/SKILL.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/codeforge-lsp/.claude-plugin/plugin.json +38 -5
- package/.devcontainer/plugins/devs-marketplace/plugins/codeforge-lsp/README.md +41 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/README.md +72 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/block-dangerous.py +73 -47
- package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/README.md +42 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/README.md +86 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/hooks/hooks.json +25 -15
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected-bash.py +122 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +3 -3
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/README.md +96 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/README.md +94 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/hooks/hooks.json +17 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/__pycache__/guard-workspace-scope.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/guard-workspace-scope.py +132 -0
- package/.devcontainer/scripts/check-setup.sh +1 -1
- package/.devcontainer/scripts/setup-aliases.sh +68 -75
- package/.devcontainer/scripts/setup-projects.sh +23 -16
- package/.devcontainer/scripts/setup.sh +48 -5
- package/README.md +17 -8
- package/package.json +1 -2
- package/.devcontainer/features/mcp-reasoner/README.md +0 -177
- package/.devcontainer/features/mcp-reasoner/devcontainer-feature.json +0 -25
- package/.devcontainer/features/mcp-reasoner/install.sh +0 -184
- package/.devcontainer/features/mcp-reasoner/poststart-hook.sh +0 -67
- package/.devcontainer/features/splitrail/README.md +0 -140
- package/.devcontainer/features/splitrail/devcontainer-feature.json +0 -39
- package/.devcontainer/features/splitrail/install.sh +0 -136
- 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
|
|
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
|
-
|
|
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.
|
|
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/
|
|
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": "
|
|
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": "
|
|
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
|
-
|
|
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
|
-
- **
|
|
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 (
|
|
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
|
|
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 | ✅
|
|
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
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
+
}
|