claudepod 1.2.2 → 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.
Files changed (45) hide show
  1. package/.devcontainer/CHANGELOG.md +179 -50
  2. package/.devcontainer/CLAUDE.md +24 -7
  3. package/.devcontainer/README.md +2 -0
  4. package/.devcontainer/config/main-system-prompt.md +357 -81
  5. package/.devcontainer/config/settings.json +6 -3
  6. package/.devcontainer/devcontainer.json +17 -5
  7. package/.devcontainer/features/agent-browser/README.md +65 -0
  8. package/.devcontainer/features/agent-browser/devcontainer-feature.json +23 -0
  9. package/.devcontainer/features/agent-browser/install.sh +72 -0
  10. package/.devcontainer/features/lsp-servers/devcontainer-feature.json +8 -2
  11. package/.devcontainer/features/lsp-servers/install.sh +25 -1
  12. package/.devcontainer/features/notify-hook/README.md +86 -0
  13. package/.devcontainer/features/notify-hook/devcontainer-feature.json +23 -0
  14. package/.devcontainer/features/notify-hook/install.sh +38 -0
  15. package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +99 -0
  16. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/.claude-plugin/plugin.json +7 -0
  17. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/hooks/hooks.json +17 -0
  18. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/format-file.py +101 -0
  19. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/.claude-plugin/plugin.json +7 -0
  20. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/hooks/hooks.json +17 -0
  21. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/lint-file.py +137 -0
  22. package/.devcontainer/plugins/devs-marketplace/plugins/claudepod-lsp/.claude-plugin/plugin.json +7 -0
  23. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/.claude-plugin/plugin.json +7 -0
  24. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/hooks/hooks.json +17 -0
  25. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/block-dangerous.py +110 -0
  26. package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/.claude-plugin/plugin.json +7 -0
  27. package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/hooks/hooks.json +16 -0
  28. package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/.claude-plugin/plugin.json +7 -0
  29. package/.devcontainer/plugins/devs-marketplace/plugins/planning-reminder/hooks/hooks.json +17 -0
  30. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/.claude-plugin/plugin.json +7 -0
  31. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/hooks/hooks.json +17 -0
  32. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +108 -0
  33. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/commands/ticket:create-pr.md +337 -0
  34. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/commands/ticket:new.md +166 -0
  35. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/commands/ticket:review-commit.md +290 -0
  36. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/commands/ticket:work.md +257 -0
  37. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/plugin.json +8 -0
  38. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/system-prompt.md +184 -0
  39. package/.devcontainer/scripts/setup-aliases.sh +41 -13
  40. package/.devcontainer/scripts/setup-plugins.sh +35 -13
  41. package/.devcontainer/scripts/setup.sh +1 -3
  42. package/README.md +37 -0
  43. package/package.json +1 -2
  44. package/setup.js +14 -6
  45. 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 function for claude with local system prompt support
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
- # cc function: ensures local system prompt and settings exist, then runs claude
9
- CC_FUNCTION='cc() {
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 "[cc] Created $LOCAL_PROMPT from default"
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 "[cc] Created $LOCAL_SETTINGS from default"
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
- # Add cc function if not present
43
- if ! grep -q "^cc()" "$rc" 2>/dev/null; then
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 "$CC_FUNCTION" >> "$rc"
46
- echo "[setup-aliases] Added cc function to $(basename $rc)"
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 " cc -> claude with local .claude/system-prompt.md and .claude/settings.json (auto-created from defaults)"
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 plugins
2
+ # Install plugins: official Anthropic + local devs-marketplace
3
3
 
4
- echo "[setup-plugins] Installing official Anthropic plugins..."
4
+ echo "[setup-plugins] Installing plugins..."
5
5
 
6
- # Note: typescript-lsp and pyright-lsp are installed by setup-lsp.sh
7
- PLUGINS=(
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 "${PLUGINS[@]}"; do
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
- # code-simplifier requires npx method (not available via native CLI)
24
- echo "[setup-plugins] Installing code-simplifier (via npx)..."
25
- if npx -y claude-plugins install "@anthropics/claude-plugins-official/code-simplifier" 2>/dev/null; then
26
- echo "[setup-plugins] Installed: code-simplifier"
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] Warning: Failed to install code-simplifier (may already exist)"
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 SETUP_LSP SETUP_PLUGINS
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.2.2",
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": {
@@ -17,7 +17,6 @@
17
17
  "mcp-server",
18
18
  "ai",
19
19
  "development-environment",
20
- "devpod",
21
20
  "vscode",
22
21
  "container",
23
22
  "qdrant",
package/setup.js CHANGED
@@ -23,6 +23,9 @@ function copyDirectory(src, dest) {
23
23
  }
24
24
 
25
25
  function main() {
26
+ const args = process.argv.slice(2);
27
+ const force = args.includes('--force') || args.includes('-f');
28
+
26
29
  const currentDir = process.cwd();
27
30
  const packageDir = __dirname;
28
31
  const devcontainerSrc = path.join(packageDir, '.devcontainer');
@@ -32,9 +35,14 @@ function main() {
32
35
 
33
36
  // Check if .devcontainer already exists
34
37
  if (fs.existsSync(devcontainerDest)) {
35
- console.log('⚠️ .devcontainer directory already exists.');
36
- console.log(' Remove it first or run in a different directory.');
37
- process.exit(1);
38
+ if (force) {
39
+ console.log('⚠️ Removing existing .devcontainer directory...');
40
+ fs.rmSync(devcontainerDest, { recursive: true, force: true });
41
+ } else {
42
+ console.log('⚠️ .devcontainer directory already exists.');
43
+ console.log(' Use --force to overwrite, or remove it manually.');
44
+ process.exit(1);
45
+ }
38
46
  }
39
47
 
40
48
  // Check if source .devcontainer exists
@@ -50,9 +58,9 @@ function main() {
50
58
  console.log('✅ ClaudePod DevContainer configuration installed!');
51
59
  console.log('');
52
60
  console.log('🔧 Next steps:');
53
- console.log(' 1. devpod up .');
54
- console.log(' 2. devpod ssh <workspace-name> --ide vscode');
55
- console.log(' 3. Start coding with Claude: claude');
61
+ console.log(' 1. Open this folder in VS Code');
62
+ console.log(' 2. Select "Reopen in Container" from the command palette');
63
+ console.log(' 3. Run: claude');
56
64
  console.log('');
57
65
  console.log('📚 Features included:');
58
66
  console.log(' • Claude Code CLI with optimized tool configuration');
@@ -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"