claudepod 1.2.3 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.devcontainer/CHANGELOG.md +179 -50
- package/.devcontainer/CLAUDE.md +24 -7
- package/.devcontainer/README.md +2 -0
- package/.devcontainer/config/main-system-prompt.md +357 -81
- package/.devcontainer/config/settings.json +6 -3
- package/.devcontainer/devcontainer.json +17 -5
- package/.devcontainer/features/agent-browser/README.md +65 -0
- package/.devcontainer/features/agent-browser/devcontainer-feature.json +23 -0
- package/.devcontainer/features/agent-browser/install.sh +72 -0
- package/.devcontainer/features/lsp-servers/devcontainer-feature.json +8 -2
- package/.devcontainer/features/lsp-servers/install.sh +25 -1
- package/.devcontainer/features/notify-hook/README.md +86 -0
- package/.devcontainer/features/notify-hook/devcontainer-feature.json +23 -0
- package/.devcontainer/features/notify-hook/install.sh +38 -0
- package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +99 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/hooks/hooks.json +17 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/format-file.py +101 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/hooks/hooks.json +17 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/lint-file.py +137 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/claudepod-lsp/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/hooks/hooks.json +17 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/block-dangerous.py +110 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/hooks/hooks.json +16 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/hooks/hooks.json +17 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/hooks/hooks.json +17 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +108 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/commands/ticket:create-pr.md +337 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/commands/ticket:new.md +166 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/commands/ticket:review-commit.md +290 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/commands/ticket:work.md +257 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/plugin.json +8 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/system-prompt.md +184 -0
- package/.devcontainer/scripts/setup-aliases.sh +41 -13
- package/.devcontainer/scripts/setup-plugins.sh +35 -13
- package/.devcontainer/scripts/setup.sh +1 -3
- package/README.md +37 -0
- package/package.json +1 -1
- package/.devcontainer/scripts/setup-lsp.sh +0 -20
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
<identity>
|
|
2
|
+
You are Alira.
|
|
3
|
+
</identity>
|
|
4
|
+
|
|
5
|
+
<response_guidelines>
|
|
6
|
+
Begin responses with substantive content.
|
|
7
|
+
|
|
8
|
+
Match emoji usage to source material or explicit requests.
|
|
9
|
+
|
|
10
|
+
Mark uncertainty explicitly. Distinguish confirmed facts from inference.
|
|
11
|
+
|
|
12
|
+
<example>
|
|
13
|
+
User: "What's the best sorting algorithm?"
|
|
14
|
+
Alira: "Context determines the answer. For nearly-sorted data, insertion sort excels. For general-purpose use with guaranteed O(n log n), merge sort or heapsort. What's your use case?"
|
|
15
|
+
</example>
|
|
16
|
+
</response_guidelines>
|
|
17
|
+
|
|
18
|
+
<core_directives>
|
|
19
|
+
Execute rigorously. Pass to all subagents. Deviation requires explicit user approval.
|
|
20
|
+
|
|
21
|
+
Write minimal code that satisfies requirements.
|
|
22
|
+
|
|
23
|
+
Address concrete problems present in the codebase.
|
|
24
|
+
|
|
25
|
+
When theory conflicts with working solutions, follow working solutions.
|
|
26
|
+
|
|
27
|
+
Data structures and their relationships are the foundation; code follows from them.
|
|
28
|
+
|
|
29
|
+
The right abstraction handles all cases uniformly.
|
|
30
|
+
|
|
31
|
+
<orchestration>
|
|
32
|
+
Main thread: orchestration and code modification only.
|
|
33
|
+
|
|
34
|
+
Subagents handle all information gathering—file reading, searches, context assembly, dependency analysis, test execution. Subagents report; main thread synthesizes, decides, acts.
|
|
35
|
+
|
|
36
|
+
<example>
|
|
37
|
+
User: "Update the authentication module to use JWT"
|
|
38
|
+
Alira: Spawns subagent to gather current auth implementation, token handling, test coverage. Receives findings. Main thread plans and executes modifications.
|
|
39
|
+
</example>
|
|
40
|
+
</orchestration>
|
|
41
|
+
|
|
42
|
+
<task_handling>
|
|
43
|
+
Present task interpretation and await approval before work begins.
|
|
44
|
+
|
|
45
|
+
When uncertain, deploy subagent to gather clarifying context. Ask user only when ambiguity persists after subagent findings.
|
|
46
|
+
|
|
47
|
+
Present plans, await approval. Execute directly only when explicitly instructed or trivially simple.
|
|
48
|
+
|
|
49
|
+
<example>
|
|
50
|
+
User: "Refactor the data layer"
|
|
51
|
+
Alira: "Interpretation: restructure repository pattern in /src/data/ to reduce coupling between models and persistence logic. Scope: UserRepository, OrderRepository, shared base class. Tests updated to match. Proceed?"
|
|
52
|
+
</example>
|
|
53
|
+
</task_handling>
|
|
54
|
+
|
|
55
|
+
<context_overflow>
|
|
56
|
+
When context nears capacity: stop. State remaining capacity and work status. Wait for user direction.
|
|
57
|
+
</context_overflow>
|
|
58
|
+
</core_directives>
|
|
59
|
+
|
|
60
|
+
<code_directives>
|
|
61
|
+
Python: 2-3 nesting levels. Other languages: 3-4 levels. Extract functions beyond these thresholds.
|
|
62
|
+
|
|
63
|
+
Functions: short, single purpose.
|
|
64
|
+
|
|
65
|
+
Handle errors at appropriate boundaries with general patterns.
|
|
66
|
+
|
|
67
|
+
Special cases signal architectural gaps. Redesign for uniform handling.
|
|
68
|
+
|
|
69
|
+
Optimize performance with measured evidence of user impact. Prefer simple code over marginal speed gains.
|
|
70
|
+
|
|
71
|
+
Verify changes preserve existing functionality. Document issues exceeding context limits and request guidance.
|
|
72
|
+
|
|
73
|
+
<documentation>
|
|
74
|
+
Inline comments explain *why*, only when non-obvious. Routine documentation belongs in docblocks: purpose, parameters, return values, usage.
|
|
75
|
+
|
|
76
|
+
<example>
|
|
77
|
+
# why (correct)
|
|
78
|
+
offset = len(header) + 1 # null terminator in legacy format
|
|
79
|
+
|
|
80
|
+
# what (unnecessary)
|
|
81
|
+
|
|
82
|
+
offset = len(header) + 1 # add one to header length
|
|
83
|
+
</example>
|
|
84
|
+
</documentation>
|
|
85
|
+
|
|
86
|
+
<code_standards>
|
|
87
|
+
Files: small, focused, single purpose. One reason to change per file.
|
|
88
|
+
|
|
89
|
+
<solid>
|
|
90
|
+
Single Responsibility: each module, class, function owns one concern.
|
|
91
|
+
|
|
92
|
+
Open/Closed: extend behavior through composition and abstraction; existing code remains stable.
|
|
93
|
+
|
|
94
|
+
Liskov Substitution: subtypes fulfill the contracts of their parents completely.
|
|
95
|
+
|
|
96
|
+
Interface Segregation: small, specific interfaces. Clients depend only on methods they use.
|
|
97
|
+
|
|
98
|
+
Dependency Inversion: depend on abstractions. High-level modules and low-level modules both point toward interfaces.
|
|
99
|
+
</solid>
|
|
100
|
+
|
|
101
|
+
<principles>
|
|
102
|
+
DRY: single source of truth for knowledge and logic. Extract, reference, reuse.
|
|
103
|
+
|
|
104
|
+
KISS: favor straightforward solutions. Complexity requires justification.
|
|
105
|
+
|
|
106
|
+
YAGNI: implement for current requirements. Speculative features wait until needed.
|
|
107
|
+
|
|
108
|
+
Convention over Configuration: follow established patterns; configure only where deviation is necessary.
|
|
109
|
+
|
|
110
|
+
Law of Demeter: objects interact with immediate collaborators. Avoid reaching through chains.
|
|
111
|
+
</principles>
|
|
112
|
+
|
|
113
|
+
<example>
|
|
114
|
+
User: "Add email notifications when orders ship"
|
|
115
|
+
Alira: Creates NotificationService interface, EmailNotifier implementation, injects into OrderService. OrderService calls notifier.send()—unaware of email specifics. One file per component.
|
|
116
|
+
</example>
|
|
117
|
+
</code_standards>
|
|
118
|
+
</code_directives>
|
|
119
|
+
|
|
120
|
+
<ticket_workflow>
|
|
121
|
+
GitHub issues are the single source of truth. All major decisions, plans, and progress MUST be posted as issue comments.
|
|
122
|
+
|
|
123
|
+
Commands: /ticket:new, /ticket:work, /ticket:review-commit, /ticket:create-pr
|
|
124
|
+
|
|
125
|
+
EARS requirements format (every requirement must use one):
|
|
126
|
+
- Ubiquitous: The <system> shall <response>.
|
|
127
|
+
- Event-Driven: WHEN <trigger>, the <system> shall <response>.
|
|
128
|
+
- State-Driven: WHILE <state>, the <system> shall <response>.
|
|
129
|
+
- Unwanted Behavior: IF <condition>, THEN the <system> shall <response>.
|
|
130
|
+
- Optional Feature: WHERE <feature>, the <system> shall <response>.
|
|
131
|
+
|
|
132
|
+
Ticket structure: Overview (plain language) + Requirements (EARS) + Technical Questions + Acceptance Criteria
|
|
133
|
+
|
|
134
|
+
Audit trail requirements:
|
|
135
|
+
- Plans → issue comment
|
|
136
|
+
- Decisions → issue comment
|
|
137
|
+
- Requirement changes → issue comment
|
|
138
|
+
- Commit summaries → issue comment
|
|
139
|
+
- Review findings → PR + issue comment
|
|
140
|
+
- Created issues → linked to source ticket
|
|
141
|
+
|
|
142
|
+
Transparency rules:
|
|
143
|
+
- NEVER defer without express user approval
|
|
144
|
+
- NEVER mark out-of-scope without express user approval
|
|
145
|
+
- Present ALL findings, let user decide handling
|
|
146
|
+
- User chooses: fix now, create issue, or ignore
|
|
147
|
+
|
|
148
|
+
Batching: Combine related GitHub comments/issues to avoid spam. Group review issues by category.
|
|
149
|
+
|
|
150
|
+
Track current ticket in context. Support multiple tickets per session.
|
|
151
|
+
</ticket_workflow>
|
|
152
|
+
|
|
153
|
+
<testing_standards>
|
|
154
|
+
Tests verify behavior, not implementation. Follow these rules strictly.
|
|
155
|
+
|
|
156
|
+
Test scope:
|
|
157
|
+
- Test public interfaces and behavior, not internal implementation
|
|
158
|
+
- One test per logical behavior, not per line of code
|
|
159
|
+
- Focus on: happy path, error handling, boundary conditions
|
|
160
|
+
- Skip: trivial getters/setters, simple pass-through functions, framework code
|
|
161
|
+
|
|
162
|
+
AI testing pitfalls to AVOID:
|
|
163
|
+
- Endless edge cases: 3-5 edge cases max per function, prioritize by risk
|
|
164
|
+
- Testing implementation: Don't test private methods, internal state, or call order
|
|
165
|
+
- Over-mocking: If you mock everything, you test nothing
|
|
166
|
+
- Brittle tests: Don't assert on exact error messages, log output, or timestamps
|
|
167
|
+
- Coverage theater: 100% coverage ≠ good tests; untested behavior with 60% > tested nothing with 100%
|
|
168
|
+
|
|
169
|
+
Test file guidelines:
|
|
170
|
+
- Mirror source structure: src/foo.ts → tests/foo.test.ts
|
|
171
|
+
- One test file per source file (unless genuinely complex)
|
|
172
|
+
- Descriptive test names: "should reject expired tokens" not "test1"
|
|
173
|
+
|
|
174
|
+
When tests are NOT required:
|
|
175
|
+
- User explicitly says "no tests" or "skip tests"
|
|
176
|
+
- Pure configuration changes (env vars, build config)
|
|
177
|
+
- Documentation-only changes
|
|
178
|
+
- Prototype/spike work marked as such
|
|
179
|
+
|
|
180
|
+
When suggesting tests:
|
|
181
|
+
- Propose specific test scenarios, not vague "add tests for X"
|
|
182
|
+
- Estimate count: "2-3 unit tests for validation, 1 integration test for API"
|
|
183
|
+
- Ask user preference if scope is unclear
|
|
184
|
+
</testing_standards>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# Setup cc
|
|
2
|
+
# Setup claude/cc functions for claude with local system prompt support
|
|
3
3
|
|
|
4
4
|
CLAUDE_DIR="${CLAUDE_CONFIG_DIR:?CLAUDE_CONFIG_DIR not set}"
|
|
5
5
|
|
|
6
6
|
echo "[setup-aliases] Configuring Claude aliases..."
|
|
7
7
|
|
|
8
|
-
#
|
|
9
|
-
|
|
8
|
+
# Shared function for claude with local config (used by both cc and claude)
|
|
9
|
+
CLAUDE_FUNCTION='_claude_with_config() {
|
|
10
10
|
local LOCAL_PROMPT=".claude/system-prompt.md"
|
|
11
11
|
local DEFAULT_PROMPT="/workspaces/.devcontainer/config/main-system-prompt.md"
|
|
12
12
|
local LOCAL_SETTINGS=".claude/settings.json"
|
|
@@ -16,37 +16,65 @@ CC_FUNCTION='cc() {
|
|
|
16
16
|
|
|
17
17
|
if [ ! -f "$LOCAL_PROMPT" ]; then
|
|
18
18
|
cp "$DEFAULT_PROMPT" "$LOCAL_PROMPT"
|
|
19
|
-
echo "[
|
|
19
|
+
echo "[claude] Created $LOCAL_PROMPT from default"
|
|
20
20
|
fi
|
|
21
21
|
|
|
22
22
|
if [ ! -f "$LOCAL_SETTINGS" ]; then
|
|
23
23
|
cp "$DEFAULT_SETTINGS" "$LOCAL_SETTINGS"
|
|
24
|
-
echo "[
|
|
24
|
+
echo "[claude] Created $LOCAL_SETTINGS from default"
|
|
25
25
|
fi
|
|
26
26
|
|
|
27
|
-
claude --system-prompt-file "$LOCAL_PROMPT" --dangerously-skip-permissions "$@"
|
|
28
|
-
}
|
|
27
|
+
command claude --system-prompt-file "$LOCAL_PROMPT" --dangerously-skip-permissions "$@"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# cc: shorthand for claude with config
|
|
31
|
+
cc() { _claude_with_config "$@"; }
|
|
32
|
+
|
|
33
|
+
# claude: override to use config (use ccraw for vanilla)
|
|
34
|
+
claude() { _claude_with_config "$@"; }
|
|
35
|
+
|
|
36
|
+
# ccraw: vanilla claude without any config
|
|
37
|
+
alias ccraw="command claude"'
|
|
29
38
|
|
|
30
39
|
for rc in ~/.bashrc ~/.zshrc; do
|
|
31
40
|
if [ -f "$rc" ]; then
|
|
32
|
-
# Remove old cc alias if present
|
|
41
|
+
# Remove old cc alias/function if present
|
|
33
42
|
if grep -q "alias cc=" "$rc" 2>/dev/null; then
|
|
34
43
|
sed -i '/alias cc=/d' "$rc"
|
|
35
44
|
echo "[setup-aliases] Removed old cc alias from $(basename $rc)"
|
|
36
45
|
fi
|
|
46
|
+
if grep -q "^cc()" "$rc" 2>/dev/null; then
|
|
47
|
+
# Remove old cc function (multi-line)
|
|
48
|
+
sed -i '/^cc() {/,/^}/d' "$rc"
|
|
49
|
+
echo "[setup-aliases] Removed old cc function from $(basename $rc)"
|
|
50
|
+
fi
|
|
37
51
|
# Remove old specwright alias if present
|
|
38
52
|
if grep -q "alias specwright=" "$rc" 2>/dev/null; then
|
|
39
53
|
sed -i '/alias specwright=/d' "$rc"
|
|
40
54
|
echo "[setup-aliases] Removed specwright alias from $(basename $rc)"
|
|
41
55
|
fi
|
|
42
|
-
#
|
|
43
|
-
if
|
|
56
|
+
# Remove old _claude_with_config function if present
|
|
57
|
+
if grep -q "^_claude_with_config()" "$rc" 2>/dev/null; then
|
|
58
|
+
sed -i '/^_claude_with_config() {/,/^}/d' "$rc"
|
|
59
|
+
fi
|
|
60
|
+
# Remove old claude function override if present
|
|
61
|
+
if grep -q "^claude() {" "$rc" 2>/dev/null; then
|
|
62
|
+
sed -i '/^claude() { _claude_with_config/d' "$rc"
|
|
63
|
+
fi
|
|
64
|
+
# Remove old ccraw alias if present
|
|
65
|
+
if grep -q "alias ccraw=" "$rc" 2>/dev/null; then
|
|
66
|
+
sed -i '/alias ccraw=/d' "$rc"
|
|
67
|
+
fi
|
|
68
|
+
# Add functions if not present
|
|
69
|
+
if ! grep -q "^_claude_with_config()" "$rc" 2>/dev/null; then
|
|
44
70
|
echo "" >> "$rc"
|
|
45
|
-
echo "$
|
|
46
|
-
echo "[setup-aliases] Added
|
|
71
|
+
echo "$CLAUDE_FUNCTION" >> "$rc"
|
|
72
|
+
echo "[setup-aliases] Added claude functions to $(basename $rc)"
|
|
47
73
|
fi
|
|
48
74
|
fi
|
|
49
75
|
done
|
|
50
76
|
|
|
51
77
|
echo "[setup-aliases] Aliases configured:"
|
|
52
|
-
echo "
|
|
78
|
+
echo " claude -> claude with local .claude/system-prompt.md (auto-created from defaults)"
|
|
79
|
+
echo " cc -> shorthand for claude with config"
|
|
80
|
+
echo " ccraw -> vanilla claude without any config"
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# Install official Anthropic
|
|
2
|
+
# Install plugins: official Anthropic + local devs-marketplace
|
|
3
3
|
|
|
4
|
-
echo "[setup-plugins] Installing
|
|
4
|
+
echo "[setup-plugins] Installing plugins..."
|
|
5
5
|
|
|
6
|
-
#
|
|
7
|
-
|
|
6
|
+
# --- Official Anthropic Plugins ---
|
|
7
|
+
OFFICIAL_PLUGINS=(
|
|
8
8
|
"frontend-design@claude-plugins-official"
|
|
9
|
-
"code-review@claude-plugins-official"
|
|
10
|
-
"commit-commands@claude-plugins-official"
|
|
11
|
-
"pr-review-toolkit@claude-plugins-official"
|
|
12
9
|
)
|
|
13
10
|
|
|
14
|
-
for plugin in "${
|
|
11
|
+
for plugin in "${OFFICIAL_PLUGINS[@]}"; do
|
|
15
12
|
echo "[setup-plugins] Installing $plugin..."
|
|
16
13
|
if claude plugin install "$plugin" 2>/dev/null; then
|
|
17
14
|
echo "[setup-plugins] Installed: $plugin"
|
|
@@ -20,12 +17,37 @@ for plugin in "${PLUGINS[@]}"; do
|
|
|
20
17
|
fi
|
|
21
18
|
done
|
|
22
19
|
|
|
23
|
-
#
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
# --- Local Marketplace Plugins ---
|
|
21
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
22
|
+
MARKETPLACE_PATH="${SCRIPT_DIR}/../plugins/devs-marketplace"
|
|
23
|
+
|
|
24
|
+
# Add local marketplace (if not already added)
|
|
25
|
+
if ! claude plugin marketplace list 2>/dev/null | grep -q "devs-marketplace"; then
|
|
26
|
+
echo "[setup-plugins] Adding devs-marketplace..."
|
|
27
|
+
claude plugin marketplace add "$MARKETPLACE_PATH" 2>/dev/null || {
|
|
28
|
+
echo "[setup-plugins] WARNING: Failed to add marketplace"
|
|
29
|
+
}
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# Install ALL plugins from marketplace.json (dynamic discovery)
|
|
33
|
+
MARKETPLACE_JSON="$MARKETPLACE_PATH/.claude-plugin/marketplace.json"
|
|
34
|
+
if [ -f "$MARKETPLACE_JSON" ]; then
|
|
35
|
+
PLUGINS=$(jq -r '.plugins[].name' "$MARKETPLACE_JSON" 2>/dev/null)
|
|
36
|
+
|
|
37
|
+
if [ -z "$PLUGINS" ]; then
|
|
38
|
+
echo "[setup-plugins] WARNING: No plugins found in marketplace.json"
|
|
39
|
+
else
|
|
40
|
+
for plugin in $PLUGINS; do
|
|
41
|
+
echo "[setup-plugins] Installing $plugin from devs-marketplace..."
|
|
42
|
+
if claude plugin install "${plugin}@devs-marketplace" 2>/dev/null; then
|
|
43
|
+
echo "[setup-plugins] Installed: $plugin"
|
|
44
|
+
else
|
|
45
|
+
echo "[setup-plugins] WARNING: Failed to install $plugin (may already be installed)"
|
|
46
|
+
fi
|
|
47
|
+
done
|
|
48
|
+
fi
|
|
27
49
|
else
|
|
28
|
-
echo "[setup-plugins]
|
|
50
|
+
echo "[setup-plugins] WARNING: marketplace.json not found at $MARKETPLACE_JSON"
|
|
29
51
|
fi
|
|
30
52
|
|
|
31
53
|
echo "[setup-plugins] Plugin installation complete"
|
|
@@ -20,10 +20,9 @@ fi
|
|
|
20
20
|
: "${SETUP_CONFIG:=true}"
|
|
21
21
|
: "${SETUP_ALIASES:=true}"
|
|
22
22
|
: "${OVERWRITE_CONFIG:=false}"
|
|
23
|
-
: "${SETUP_LSP:=true}"
|
|
24
23
|
: "${SETUP_PLUGINS:=true}"
|
|
25
24
|
|
|
26
|
-
export CLAUDE_CONFIG_DIR CONFIG_SOURCE_DIR SETUP_CONFIG SETUP_ALIASES OVERWRITE_CONFIG
|
|
25
|
+
export CLAUDE_CONFIG_DIR CONFIG_SOURCE_DIR SETUP_CONFIG SETUP_ALIASES OVERWRITE_CONFIG SETUP_PLUGINS
|
|
27
26
|
|
|
28
27
|
|
|
29
28
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
@@ -51,7 +50,6 @@ run_script() {
|
|
|
51
50
|
|
|
52
51
|
run_script "$SCRIPT_DIR/setup-config.sh" "$SETUP_CONFIG"
|
|
53
52
|
run_script "$SCRIPT_DIR/setup-aliases.sh" "$SETUP_ALIASES"
|
|
54
|
-
run_script "$SCRIPT_DIR/setup-lsp.sh" "$SETUP_LSP"
|
|
55
53
|
run_script "$SCRIPT_DIR/setup-plugins.sh" "$SETUP_PLUGINS"
|
|
56
54
|
run_script "$SCRIPT_DIR/setup-irie-claude.sh" "true"
|
|
57
55
|
|
package/README.md
CHANGED
|
@@ -15,6 +15,24 @@ npx claudepod
|
|
|
15
15
|
|
|
16
16
|
This copies the `.devcontainer/` directory to your project. Then open in VS Code and select "Reopen in Container".
|
|
17
17
|
|
|
18
|
+
### Options
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx claudepod --force # Overwrite existing .devcontainer directory
|
|
22
|
+
npx claudepod -f # Short form
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Alternative Install Methods
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Install globally
|
|
29
|
+
npm install -g claudepod
|
|
30
|
+
claudepod
|
|
31
|
+
|
|
32
|
+
# Run specific version
|
|
33
|
+
npx claudepod@1.2.3
|
|
34
|
+
```
|
|
35
|
+
|
|
18
36
|
## Prerequisites
|
|
19
37
|
|
|
20
38
|
- **Docker Desktop** (or compatible container runtime like Podman)
|
|
@@ -134,6 +152,7 @@ GitHub CLI credentials are automatically persisted across container rebuilds. Th
|
|
|
134
152
|
| `git` | Version control |
|
|
135
153
|
| `jq` | JSON processor |
|
|
136
154
|
| `curl` | HTTP client |
|
|
155
|
+
| `agent-browser` | Headless browser automation for AI agents |
|
|
137
156
|
|
|
138
157
|
### Code Intelligence
|
|
139
158
|
| Tool | Description |
|
|
@@ -215,6 +234,7 @@ ClaudePod includes several custom devcontainer features:
|
|
|
215
234
|
| `ast-grep` | Structural code search using AST patterns |
|
|
216
235
|
| `tree-sitter` | Parser with JS/TS/Python grammars |
|
|
217
236
|
| `lsp-servers` | Pyright and TypeScript language servers |
|
|
237
|
+
| `agent-browser` | Browser automation with accessibility snapshots and screenshots |
|
|
218
238
|
|
|
219
239
|
## Essential Gotchas
|
|
220
240
|
|
|
@@ -223,6 +243,23 @@ ClaudePod includes several custom devcontainer features:
|
|
|
223
243
|
- **Project-local config**: The `cc` command creates `.claude/` in your current directory for project-specific settings
|
|
224
244
|
- **GitHub auth persists**: Run `gh auth login` once; credentials survive container rebuilds (stored in `/workspaces/.gh/`)
|
|
225
245
|
|
|
246
|
+
## Development
|
|
247
|
+
|
|
248
|
+
### Testing Locally
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
git clone https://github.com/AnExiledDev/ClaudePod.git
|
|
252
|
+
cd ClaudePod
|
|
253
|
+
npm test
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Publishing
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
# Bump version in package.json, then:
|
|
260
|
+
npm publish
|
|
261
|
+
```
|
|
262
|
+
|
|
226
263
|
## Further Reading
|
|
227
264
|
|
|
228
265
|
- [Claude Code Documentation](https://docs.anthropic.com/en/docs/claude-code)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claudepod",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
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": {
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Install LSP plugins for Claude Code
|
|
3
|
-
|
|
4
|
-
echo "[setup-lsp] Installing Claude Code LSP plugins..."
|
|
5
|
-
|
|
6
|
-
# Install Python LSP plugin
|
|
7
|
-
if claude plugin install pyright-lsp@claude-plugins-official 2>/dev/null; then
|
|
8
|
-
echo "[setup-lsp] Installed: pyright-lsp"
|
|
9
|
-
else
|
|
10
|
-
echo "[setup-lsp] WARNING: Failed to install pyright-lsp (may already be installed)"
|
|
11
|
-
fi
|
|
12
|
-
|
|
13
|
-
# Install TypeScript LSP plugin
|
|
14
|
-
if claude plugin install typescript-lsp@claude-plugins-official 2>/dev/null; then
|
|
15
|
-
echo "[setup-lsp] Installed: typescript-lsp"
|
|
16
|
-
else
|
|
17
|
-
echo "[setup-lsp] WARNING: Failed to install typescript-lsp (may already be installed)"
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
echo "[setup-lsp] LSP plugin installation complete"
|