@biswaviraj/cc-setup 1.0.1 → 1.0.2

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Biswajeet Das
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -2,30 +2,12 @@
2
2
 
3
3
  Add your preferred Claude Code plugins and MCP servers to any project in seconds.
4
4
 
5
+ ![cc-setup demo](./demo.gif)
6
+
5
7
  ```bash
6
8
  npx @biswaviraj/cc-setup
7
9
  ```
8
10
 
9
- ```
10
- cc-setup v1.0.0
11
-
12
- i Claude Code 1.0.37
13
-
14
- ? Pick tools to add
15
- > Plugins
16
- [ ] Superpowers brainstorming, TDD, debugging, plans, worktrees
17
- [ ] Frontend Design production-grade UI components
18
- [ ] Context Mode context window optimization
19
- [ ] Context7 library & framework docs lookup
20
- [ ] Feature Dev guided feature development
21
- [ ] MongoDB database ops, schema design, queries
22
-
23
- ? Install scope
24
- > This project .claude/settings.local.json
25
- Shared with team .claude/settings.json (committed)
26
- Global ~/.claude/settings.json
27
- ```
28
-
29
11
  Pick what you need, choose the scope, done. No manual config editing.
30
12
 
31
13
  ## Install
@@ -1,62 +1,54 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ // src/index.ts
3
4
  import * as p from "@clack/prompts";
4
- import { execSync } from "node:child_process";
5
- import { existsSync, readFileSync } from "node:fs";
6
- import { homedir } from "node:os";
7
- import { join } from "node:path";
5
+ import { execSync } from "child_process";
6
+ import { existsSync, readFileSync } from "fs";
7
+ import { homedir } from "os";
8
+ import { join } from "path";
8
9
  import pc from "picocolors";
9
-
10
- // ── Built-in Registry ───────────────────────────────────────
11
- // Popular plugins & servers. Users can extend via ~/.cc-setup.json
12
-
13
- const BUILTIN_PLUGINS = [
10
+ var BUILTIN_PLUGINS = [
14
11
  {
15
12
  value: "superpowers",
16
13
  label: "Superpowers",
17
14
  hint: "brainstorming, TDD, debugging, plans, worktrees",
18
- install: "superpowers",
15
+ install: "superpowers"
19
16
  },
20
17
  {
21
18
  value: "frontend-design",
22
19
  label: "Frontend Design",
23
20
  hint: "production-grade UI components",
24
- install: "frontend-design",
21
+ install: "frontend-design"
25
22
  },
26
23
  {
27
24
  value: "context-mode",
28
25
  label: "Context Mode",
29
26
  hint: "context window optimization",
30
27
  install: "context-mode@context-mode",
31
- marketplace: "mksglu/context-mode",
28
+ marketplace: "mksglu/context-mode"
32
29
  },
33
30
  {
34
31
  value: "context7",
35
32
  label: "Context7",
36
33
  hint: "library & framework docs lookup",
37
34
  install: "context7-plugin@context7-marketplace",
38
- marketplace: "upstash/context7",
35
+ marketplace: "upstash/context7"
39
36
  },
40
37
  {
41
38
  value: "feature-dev",
42
39
  label: "Feature Dev",
43
40
  hint: "guided feature development",
44
- install: "feature-dev",
41
+ install: "feature-dev"
45
42
  },
46
43
  {
47
44
  value: "mongodb",
48
45
  label: "MongoDB",
49
46
  hint: "database ops, schema design, queries",
50
- install: "mongodb",
51
- },
47
+ install: "mongodb"
48
+ }
52
49
  ];
53
-
54
- const BUILTIN_MCP = [];
55
-
56
- // ── Config ──────────────────────────────────────────────────
57
-
58
- const CONFIG_PATH = join(homedir(), ".cc-setup.json");
59
-
50
+ var BUILTIN_MCP = [];
51
+ var CONFIG_PATH = join(homedir(), ".cc-setup.json");
60
52
  function loadConfig() {
61
53
  if (!existsSync(CONFIG_PATH)) return null;
62
54
  try {
@@ -65,43 +57,35 @@ function loadConfig() {
65
57
  return null;
66
58
  }
67
59
  }
68
-
69
60
  function merge(builtin, user) {
70
61
  if (!user?.length) return builtin;
71
62
  const seen = new Set(builtin.map((t) => t.value));
72
63
  return [...builtin, ...user.filter((t) => !seen.has(t.value))];
73
64
  }
74
-
75
- // ── Helpers ─────────────────────────────────────────────────
76
-
77
65
  function run(cmd) {
78
66
  try {
79
67
  return {
80
68
  ok: true,
81
- output: execSync(cmd, { encoding: "utf-8", stdio: "pipe" }).trim(),
69
+ output: execSync(cmd, { encoding: "utf-8", stdio: "pipe" }).trim()
82
70
  };
83
71
  } catch (e) {
84
- return { ok: false, output: (e.stderr || e.message).trim() };
72
+ const err = e;
73
+ return { ok: false, output: (err.stderr || err.message).trim() };
85
74
  }
86
75
  }
87
-
88
76
  function parseArgs() {
89
77
  const args = process.argv.slice(2);
90
78
  return {
91
79
  quick: args.includes("--quick") || args.includes("-q"),
92
80
  scope: args.find((_, i, a) => a[i - 1] === "--scope") || null,
93
- help: args.includes("--help") || args.includes("-h"),
81
+ help: args.includes("--help") || args.includes("-h")
94
82
  };
95
83
  }
96
-
97
- // ── Main ────────────────────────────────────────────────────
98
-
99
84
  async function main() {
100
85
  const args = parseArgs();
101
-
102
86
  if (args.help) {
103
87
  console.log(`
104
- ${pc.bold("cc-setup")} Add Claude Code plugins & MCP servers to any project
88
+ ${pc.bold("cc-setup")} \u2014 Add Claude Code plugins & MCP servers to any project
105
89
 
106
90
  ${pc.dim("Usage:")}
107
91
  cc-setup Interactive picker
@@ -126,35 +110,24 @@ async function main() {
126
110
  `);
127
111
  process.exit(0);
128
112
  }
129
-
130
113
  console.clear();
131
114
  p.intro(`${pc.bgCyan(pc.black(" cc-setup "))} ${pc.dim("v1.0.0")}`);
132
-
133
- // Preflight
134
115
  const check = run("claude --version");
135
116
  if (!check.ok) {
136
117
  p.cancel(
137
- "Claude Code CLI not found. Install: npm i -g @anthropic-ai/claude-code",
118
+ "Claude Code CLI not found. Install: npm i -g @anthropic-ai/claude-code"
138
119
  );
139
120
  process.exit(1);
140
121
  }
141
122
  p.log.info(`${pc.dim("Claude Code")} ${check.output}`);
142
-
143
- // Load & merge
144
123
  const config = loadConfig();
145
124
  if (config) p.log.info(`${pc.dim("Config loaded from")} ${CONFIG_PATH}`);
146
-
147
125
  const plugins = merge(BUILTIN_PLUGINS, config?.plugins);
148
126
  const mcpServers = merge(BUILTIN_MCP, config?.mcpServers);
149
127
  const defaults = config?.defaults || [];
150
-
151
128
  const pluginMap = new Map(plugins.map((pl) => [pl.value, pl]));
152
129
  const mcpMap = new Map(mcpServers.map((m) => [m.value, m]));
153
-
154
- // ── Select ────────────────────────────────────────────────
155
-
156
130
  let selectedIds;
157
-
158
131
  if (args.quick) {
159
132
  if (!defaults.length) {
160
133
  p.cancel('No defaults configured. Add "defaults" to ~/.cc-setup.json');
@@ -168,108 +141,87 @@ async function main() {
168
141
  groups["Plugins"] = plugins.map((t) => ({
169
142
  value: t.value,
170
143
  label: t.label,
171
- hint: t.hint,
144
+ hint: t.hint
172
145
  }));
173
146
  if (mcpServers.length)
174
147
  groups["MCP Servers"] = mcpServers.map((t) => ({
175
148
  value: t.value,
176
149
  label: t.label,
177
- hint: t.hint,
150
+ hint: t.hint
178
151
  }));
179
-
180
- selectedIds = await p.groupMultiselect({
152
+ const result = await p.groupMultiselect({
181
153
  message: "Pick tools to add",
182
154
  options: groups,
183
- required: false,
155
+ required: false
184
156
  });
185
-
186
- if (p.isCancel(selectedIds) || !selectedIds.length) {
157
+ if (p.isCancel(result) || !result.length) {
187
158
  p.cancel("Nothing selected.");
188
159
  process.exit(0);
189
160
  }
161
+ selectedIds = result;
190
162
  }
191
-
192
163
  const pluginIds = selectedIds.filter((id) => pluginMap.has(id));
193
164
  const mcpIds = selectedIds.filter((id) => mcpMap.has(id));
194
-
195
165
  if (!pluginIds.length && !mcpIds.length) {
196
166
  p.cancel("Nothing to install.");
197
167
  process.exit(0);
198
168
  }
199
-
200
- // ── Scope ─────────────────────────────────────────────────
201
-
202
169
  let scope = args.scope;
203
-
204
170
  if (!scope) {
205
- scope = await p.select({
171
+ const result = await p.select({
206
172
  message: "Install scope",
207
173
  options: [
208
174
  {
209
175
  value: "local",
210
176
  label: "This project",
211
- hint: ".claude/settings.local.json",
177
+ hint: ".claude/settings.local.json"
212
178
  },
213
179
  {
214
180
  value: "project",
215
181
  label: "Shared with team",
216
- hint: ".claude/settings.json (committed)",
182
+ hint: ".claude/settings.json (committed)"
217
183
  },
218
184
  {
219
185
  value: "user",
220
186
  label: "Global",
221
- hint: "~/.claude/settings.json",
222
- },
223
- ],
187
+ hint: "~/.claude/settings.json"
188
+ }
189
+ ]
224
190
  });
225
-
226
- if (p.isCancel(scope)) {
191
+ if (p.isCancel(result)) {
227
192
  p.cancel("Cancelled.");
228
193
  process.exit(0);
229
194
  }
195
+ scope = result;
230
196
  }
231
-
232
- // ── Install ───────────────────────────────────────────────
233
-
234
197
  const s = p.spinner();
235
198
  const results = [];
236
-
237
199
  for (const id of pluginIds) {
238
200
  const plugin = pluginMap.get(id);
239
-
240
201
  if (plugin.marketplace) {
241
202
  s.start(`Adding marketplace for ${plugin.label}...`);
242
203
  run(`claude plugins marketplace add ${plugin.marketplace}`);
243
204
  s.stop(`Marketplace ready for ${plugin.label}`);
244
205
  }
245
-
246
206
  s.start(`Installing ${plugin.label}...`);
247
207
  const result = run(`claude plugins install ${plugin.install} -s ${scope}`);
248
- s.stop(`${result.ok ? pc.green("") : pc.yellow("")} ${plugin.label}`);
208
+ s.stop(`${result.ok ? pc.green("\u2713") : pc.yellow("\u26A0")} ${plugin.label}`);
249
209
  results.push({ name: plugin.label, ...result });
250
210
  }
251
-
252
211
  for (const id of mcpIds) {
253
212
  const mcp = mcpMap.get(id);
254
213
  s.start(`Adding ${mcp.label}...`);
255
214
  const result = run(
256
- `claude mcp add ${mcp.value} -s ${scope} -- ${mcp.command}`,
215
+ `claude mcp add ${mcp.value} -s ${scope} -- ${mcp.command}`
257
216
  );
258
- s.stop(`${result.ok ? pc.green("") : pc.yellow("")} ${mcp.label}`);
217
+ s.stop(`${result.ok ? pc.green("\u2713") : pc.yellow("\u26A0")} ${mcp.label}`);
259
218
  results.push({ name: mcp.label, ...result });
260
219
  }
261
-
262
- // ── Summary ───────────────────────────────────────────────
263
-
264
- const summary = results
265
- .map((r) => {
266
- if (r.ok) return ` ${pc.green("✓")} ${r.name}`;
267
- return ` ${pc.red("✗")} ${r.name} ${pc.dim(`— ${r.output.split("\n")[0]}`)}`;
268
- })
269
- .join("\n");
270
-
220
+ const summary = results.map((r) => {
221
+ if (r.ok) return ` ${pc.green("\u2713")} ${r.name}`;
222
+ return ` ${pc.red("\u2717")} ${r.name} ${pc.dim(`\u2014 ${r.output.split("\n")[0]}`)}`;
223
+ }).join("\n");
271
224
  p.note(summary, "Results");
272
225
  p.outro("Restart Claude Code to activate new tools.");
273
226
  }
274
-
275
227
  main().catch(console.error);
package/package.json CHANGED
@@ -1,15 +1,23 @@
1
1
  {
2
2
  "name": "@biswaviraj/cc-setup",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Add your preferred Claude Code plugins and MCP servers to any project in seconds",
5
5
  "type": "module",
6
6
  "bin": {
7
- "cc-setup": "./index.mjs"
7
+ "cc-setup": "./dist/index.mjs"
8
8
  },
9
+ "files": [
10
+ "dist"
11
+ ],
9
12
  "author": {
10
13
  "name": "BiswaViraj",
11
14
  "url": "https://github.com/BiswaViraj"
12
15
  },
16
+ "homepage": "https://github.com/BiswaViraj/cc-setup#readme",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/BiswaViraj/cc-setup.git"
20
+ },
13
21
  "keywords": [
14
22
  "claude",
15
23
  "claude-code",
@@ -22,5 +30,13 @@
22
30
  "dependencies": {
23
31
  "@clack/prompts": "^0.11.0",
24
32
  "picocolors": "^1.1.1"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^25.6.0",
36
+ "tsup": "^8.0.0",
37
+ "typescript": "^6.0.0"
38
+ },
39
+ "scripts": {
40
+ "build": "tsup"
25
41
  }
26
42
  }
@@ -1,7 +0,0 @@
1
- {
2
- "enabledPlugins": {
3
- "superpowers@claude-plugins-official": true,
4
- "context-mode@context-mode": true,
5
- "feature-dev@claude-plugins-official": true
6
- }
7
- }