create-snipara 1.3.16 → 1.3.17

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 (3) hide show
  1. package/README.md +15 -8
  2. package/dist/index.js +266 -38
  3. package/package.json +5 -1
package/README.md CHANGED
@@ -16,7 +16,7 @@ so an LLM client can use Snipara context and reviewed memory.
16
16
 
17
17
  Use it for:
18
18
 
19
- - Hosted MCP onboarding for Codex, Claude Code, Cursor, ChatGPT Desktop, and similar clients
19
+ - Hosted MCP onboarding for Claude Code, Cursor, Windsurf, Codex, Gemini, VS Code/Copilot, Continue, ChatGPT Desktop, and similar clients
20
20
  - free account signup with reviewed Context + Memory
21
21
  - local project wiring, `doctor`, `repair`, and `upgrade`
22
22
  - GitHub repository sync and PR Answer Packs approval when the current folder is a GitHub repo
@@ -32,8 +32,8 @@ flowchart LR
32
32
  Project["Local project"] --> CLI["npx create-snipara"]
33
33
  CLI --> Auth["Snipara auth and project key"]
34
34
  CLI --> MCP["Hosted MCP config"]
35
- CLI --> Templates["AGENTS.md, CLAUDE.md, Cursor, Codex snippets"]
36
- MCP --> Agents["Codex, Claude Code, Cursor, ChatGPT Desktop"]
35
+ CLI --> Templates["AGENTS.md, CLAUDE.md, Cursor, Codex, MCP references"]
36
+ MCP --> Agents["Claude Code, Cursor, Codex, Gemini, VS Code, ChatGPT"]
37
37
  Templates --> Agents
38
38
  Agents --> Context["Snipara context and memory"]
39
39
  ```
@@ -74,7 +74,7 @@ Free onboarding is now **Context + Memory**, not Context-only:
74
74
 
75
75
  - Context Free: three projects and 1,000 context queries/month
76
76
  - Memory Free: reviewed hosted memories for continuity across sessions
77
- - Hosted MCP: direct connection for Claude Code, Codex, Cursor, ChatGPT Desktop, and other MCP clients
77
+ - Hosted MCP: direct connection for Claude Code, Cursor, Windsurf, Codex, Gemini, VS Code/Copilot, Continue, ChatGPT Desktop, and other MCP clients
78
78
 
79
79
  The CLI opens a browser device-flow login when the user does not already have a key, auto-provisions the free Context + Memory account when needed, then writes the returned API key into the local MCP config.
80
80
 
@@ -105,6 +105,7 @@ That distinction matters:
105
105
  - configures `.mcp.json`
106
106
  - generates merge-ready AI agent templates in `.snipara/templates/`, including Pro+ symbol-card, code-impact, and managed workflow guidance for paid Context plans
107
107
  - creates `AGENTS.md`, `CLAUDE.md`, `.cursor/rules/snipara.mdc`, and `.codex/config.toml` when those files do not already exist
108
+ - writes client-specific companion packs such as `.snipara/companion/CODEX.md` or `.snipara/companion/GEMINI.md`
108
109
  - updates `.env`, `.env.local`, and `.env.example`
109
110
  - generates `.snipara/companion/README.md`
110
111
  - generates `.snipara/companion/commands.json`
@@ -155,6 +156,7 @@ The generated agent templates cover:
155
156
  - Cursor `.cursor/rules/snipara.mdc`
156
157
  - Codex `.codex/config.toml` snippet
157
158
  - ChatGPT/OpenAI HTTP MCP snippet
159
+ - Gemini, VS Code, Continue, and custom HTTP MCP reference snippets
158
160
 
159
161
  When `snipara-companion` is installed, the companion pack also includes the compaction-safe managed workflow:
160
162
 
@@ -297,18 +299,22 @@ The intended split is:
297
299
  - `snipara-mcp`: local stdio bridge, client-package development, compatibility, and testing
298
300
  - `snipara-sandbox`: optional local execution engine
299
301
 
300
- ## Codex Setup
302
+ ## Client Packs
301
303
 
302
- For Codex, keep Hosted MCP as the core path and let companion add workflow
303
- ergonomics:
304
+ For every selected AI client, keep Hosted MCP as the core path and let
305
+ companion add workflow ergonomics:
304
306
 
305
307
  - use Hosted MCP as the core Snipara surface
306
308
  - use `AGENTS.md` for project instructions
309
+ - use the selected pack under `.snipara/companion/`, for example `CODEX.md`, `CURSOR.md`, or `GEMINI.md`
307
310
  - use the default `hosted-companion` path when you want compaction-safe local phase commits
308
311
  - choose `hosted-only` or `--skip-companion` only in locked-down environments
309
312
  - use local `snipara-mcp` only for stdio compatibility, development, or tests
310
313
 
311
- Codex does not require hook presets to use Snipara successfully.
314
+ Claude Code, Cursor, and Windsurf can receive generated automation files when
315
+ that client has a useful local hook surface. Codex, Gemini, VS Code, Continue,
316
+ ChatGPT, and custom clients are treated as MCP-first: they get the hosted MCP
317
+ configuration/reference and agent instructions, not invented local hooks.
312
318
 
313
319
  This keeps setup and runtime separated while still giving the user one obvious command to start from.
314
320
 
@@ -317,6 +323,7 @@ This keeps setup and runtime separated while still giving the user one obvious c
317
323
  After setup, the project gets a local pack at `.snipara/companion/`:
318
324
 
319
325
  - `README.md`: local usage guidance
326
+ - `<CLIENT>.md`: selected client setup overlay, such as `CODEX.md` or `GEMINI.md`
320
327
  - `commands.json`: starter commands for the current project
321
328
  - `doctor.json`: most recent validation report
322
329
 
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import fs from "fs";
9
9
  import path from "path";
10
10
  import { execSync, spawn } from "child_process";
11
11
  import { homedir } from "os";
12
- var VERSION = "1.3.15";
12
+ var VERSION = "1.3.17";
13
13
  var BASE_URL = "https://www.snipara.com";
14
14
  var API_URL = "https://api.snipara.com";
15
15
  var COMPANION_PACKAGE_NAME = "snipara-companion";
@@ -25,11 +25,68 @@ var LEGACY_SANDBOX_COMMAND_NAME = "rlm";
25
25
  var DEVICE_CLIENT_ID = "create-snipara";
26
26
  var DeviceAuthorizationAborted = class extends Error {
27
27
  };
28
+ var AI_CLIENT_CHOICES = [
29
+ {
30
+ title: "Claude Code (CLI/VS Code extension)",
31
+ value: "claude-code",
32
+ description: "Best hooks support"
33
+ },
34
+ {
35
+ title: "Cursor",
36
+ value: "cursor",
37
+ description: "Hosted MCP plus Cursor rules and automation bundles"
38
+ },
39
+ {
40
+ title: "Windsurf",
41
+ value: "windsurf",
42
+ description: "Hosted MCP plus Windsurf automation bundles"
43
+ },
44
+ {
45
+ title: "OpenAI Codex",
46
+ value: "codex",
47
+ description: "Hosted MCP plus AGENTS.md and Codex config"
48
+ },
49
+ {
50
+ title: "Gemini CLI",
51
+ value: "gemini",
52
+ description: "Hosted MCP reference plus agent instructions"
53
+ },
54
+ {
55
+ title: "VS Code / Copilot",
56
+ value: "vscode",
57
+ description: "Hosted MCP reference for VS Code-compatible clients"
58
+ },
59
+ {
60
+ title: "Continue",
61
+ value: "continue",
62
+ description: "Hosted MCP reference for Continue"
63
+ },
64
+ {
65
+ title: "ChatGPT / OpenAI MCP",
66
+ value: "chatgpt",
67
+ description: "Hosted MCP for ChatGPT Desktop or OpenAI-compatible clients"
68
+ },
69
+ {
70
+ title: "Claude Desktop",
71
+ value: "claude-desktop",
72
+ description: "Desktop MCP config flow"
73
+ },
74
+ { title: "Other MCP client", value: "other" }
75
+ ];
28
76
  function getCompanionInitClientFlag(aiClient) {
29
- if (aiClient === "cursor") {
30
- return " --client cursor";
31
- }
32
- return aiClient === "claude-code" ? " --client claude-code" : "";
77
+ const supportedClientMap = {
78
+ "claude-code": "claude-code",
79
+ cursor: "cursor",
80
+ windsurf: "windsurf",
81
+ codex: "codex",
82
+ gemini: "gemini",
83
+ chatgpt: "chatgpt",
84
+ vscode: "vscode",
85
+ continue: "continue",
86
+ other: "custom"
87
+ };
88
+ const companionClient = supportedClientMap[aiClient];
89
+ return companionClient ? ` --client ${companionClient}` : "";
33
90
  }
34
91
  function buildProgram() {
35
92
  const program = new Command();
@@ -363,37 +420,11 @@ async function gatherConfiguration(options) {
363
420
  type: "select",
364
421
  name: "aiClient",
365
422
  message: "Which AI client are you using?",
366
- initial: ["claude-code", "cursor", "codex", "chatgpt", "claude-desktop", "other"].indexOf(
367
- detectedClient
423
+ initial: Math.max(
424
+ 0,
425
+ AI_CLIENT_CHOICES.findIndex((choice) => choice.value === detectedClient)
368
426
  ),
369
- choices: [
370
- {
371
- title: "Claude Code (CLI/VS Code extension)",
372
- value: "claude-code",
373
- description: "Best hooks support"
374
- },
375
- {
376
- title: "Cursor",
377
- value: "cursor",
378
- description: "MCP via .mcp.json plus companion terminal workflows"
379
- },
380
- {
381
- title: "OpenAI Codex",
382
- value: "codex",
383
- description: "Hosted MCP plus AGENTS.md"
384
- },
385
- {
386
- title: "ChatGPT / OpenAI MCP",
387
- value: "chatgpt",
388
- description: "Hosted MCP for ChatGPT Desktop or OpenAI-compatible clients"
389
- },
390
- {
391
- title: "Claude Desktop",
392
- value: "claude-desktop",
393
- description: "Desktop MCP config flow"
394
- },
395
- { title: "Other", value: "other" }
396
- ]
427
+ choices: AI_CLIENT_CHOICES
397
428
  },
398
429
  {
399
430
  type: showAdvancedPrompts ? "confirm" : null,
@@ -906,6 +937,22 @@ async function createAgentTemplates(answers) {
906
937
  {
907
938
  path: path.join(templatesDir, "chatgpt-openai-mcp.json"),
908
939
  content: buildChatGptMcpTemplate(answers)
940
+ },
941
+ {
942
+ path: path.join(templatesDir, "gemini-mcp-reference.json"),
943
+ content: buildGenericMcpReferenceTemplate(answers, "gemini")
944
+ },
945
+ {
946
+ path: path.join(templatesDir, "vscode-mcp-reference.json"),
947
+ content: buildGenericMcpReferenceTemplate(answers, "vscode")
948
+ },
949
+ {
950
+ path: path.join(templatesDir, "continue-mcp-reference.json"),
951
+ content: buildGenericMcpReferenceTemplate(answers, "continue")
952
+ },
953
+ {
954
+ path: path.join(templatesDir, "custom-mcp-reference.json"),
955
+ content: buildGenericMcpReferenceTemplate(answers, "custom")
909
956
  }
910
957
  ];
911
958
  for (const template of templates) {
@@ -1054,6 +1101,26 @@ function buildChatGptMcpTemplate(answers) {
1054
1101
  )}
1055
1102
  `;
1056
1103
  }
1104
+ function buildGenericMcpReferenceTemplate(answers, client) {
1105
+ return `${JSON.stringify(
1106
+ {
1107
+ client,
1108
+ note: "Reference format only; paste the server fields into this client's MCP settings.",
1109
+ mcpServers: {
1110
+ snipara: {
1111
+ type: "http",
1112
+ url: buildHostedMcpEndpoint(answers),
1113
+ headers: {
1114
+ "X-API-Key": "${SNIPARA_API_KEY}"
1115
+ }
1116
+ }
1117
+ }
1118
+ },
1119
+ null,
1120
+ 2
1121
+ )}
1122
+ `;
1123
+ }
1057
1124
  function ensureGitignoreEntry(entry, comment) {
1058
1125
  const gitignorePath = path.join(process.cwd(), ".gitignore");
1059
1126
  if (fs.existsSync(gitignorePath)) {
@@ -1347,12 +1414,36 @@ function getClientGuidance(client) {
1347
1414
  "Use the companion CLI only for explicit upload, planning, chunk lookup, doctor, and task commit workflows outside the editor UI."
1348
1415
  ];
1349
1416
  }
1417
+ if (client === "windsurf") {
1418
+ return [
1419
+ "Windsurf should use the hosted MCP surface plus generated Windsurf automation bundles when available.",
1420
+ "Use snipara-companion automations install --client windsurf when you want dashboard-managed hook files in the local project."
1421
+ ];
1422
+ }
1350
1423
  if (client === "codex") {
1351
1424
  return [
1352
1425
  "Codex should use the hosted MCP surface plus AGENTS.md as the canonical project instruction file.",
1353
1426
  "The generated .snipara/templates/codex-config.toml is a merge-ready snippet for ~/.codex/config.toml if your Codex app does not read project .codex/config.toml."
1354
1427
  ];
1355
1428
  }
1429
+ if (client === "gemini") {
1430
+ return [
1431
+ "Gemini should use Hosted MCP plus the generated AGENTS.md rules; no local shell hooks are assumed.",
1432
+ "Use .snipara/templates/gemini-mcp-reference.json as a field reference for the client's MCP settings."
1433
+ ];
1434
+ }
1435
+ if (client === "vscode") {
1436
+ return [
1437
+ "VS Code and Copilot-style clients should use Hosted MCP plus AGENTS.md for project workflow rules.",
1438
+ "Use .snipara/templates/vscode-mcp-reference.json as the Snipara server reference when adding an MCP server."
1439
+ ];
1440
+ }
1441
+ if (client === "continue") {
1442
+ return [
1443
+ "Continue should use Hosted MCP for Snipara tools and keep AGENTS.md as the shared project instruction source.",
1444
+ "Use .snipara/templates/continue-mcp-reference.json as the Snipara server reference when wiring MCP."
1445
+ ];
1446
+ }
1356
1447
  if (client === "chatgpt") {
1357
1448
  return [
1358
1449
  "ChatGPT and OpenAI-compatible MCP clients should use the direct hosted MCP endpoint.",
@@ -1366,13 +1457,13 @@ function getClientGuidance(client) {
1366
1457
  ];
1367
1458
  }
1368
1459
  return [
1369
- "The generated pack assumes Hosted MCP for agents and API / SDK for product integrations.",
1370
- "Use the companion CLI only when local planning, upload, doctor, or task commit flows help."
1460
+ "The generated pack assumes a generic streamable HTTP MCP client plus AGENTS.md for shared workflow rules.",
1461
+ "Use .snipara/templates/custom-mcp-reference.json as the server reference and use companion only when local planning, upload, doctor, or task commit flows help."
1371
1462
  ];
1372
1463
  }
1373
1464
  function getCompanionCommands(answers) {
1374
1465
  const projectIdFlag = answers.projectId ? ` --project-id ${answers.projectId}` : "";
1375
- const apiKeyFlag = answers.apiKeyType === "none" || answers.apiKey.includes("YOUR_") ? " --api-key <rlm-key>" : ` --api-key ${answers.apiKey}`;
1466
+ const apiKeyFlag = " --api-key <snipara-key>";
1376
1467
  const clientFlag = getCompanionInitClientFlag(answers.aiClient);
1377
1468
  const businessOnboardingCommands = answers.installCompanion ? [
1378
1469
  {
@@ -1496,12 +1587,118 @@ function getCompanionCommands(answers) {
1496
1587
  }
1497
1588
  ];
1498
1589
  }
1590
+ function getClientDisplayName(client) {
1591
+ const names = {
1592
+ "claude-code": "Claude Code",
1593
+ cursor: "Cursor",
1594
+ windsurf: "Windsurf",
1595
+ codex: "OpenAI Codex",
1596
+ gemini: "Gemini",
1597
+ chatgpt: "ChatGPT / OpenAI MCP",
1598
+ vscode: "VS Code",
1599
+ continue: "Continue",
1600
+ "claude-desktop": "Claude Desktop",
1601
+ other: "Custom MCP client"
1602
+ };
1603
+ return names[client];
1604
+ }
1605
+ function getClientPackFilename(client) {
1606
+ const names = {
1607
+ "claude-code": "CLAUDE_CODE.md",
1608
+ cursor: "CURSOR.md",
1609
+ windsurf: "WINDSURF.md",
1610
+ codex: "CODEX.md",
1611
+ gemini: "GEMINI.md",
1612
+ chatgpt: "CHATGPT.md",
1613
+ vscode: "VSCODE.md",
1614
+ continue: "CONTINUE.md",
1615
+ "claude-desktop": "CLAUDE_DESKTOP.md",
1616
+ other: "CUSTOM_MCP.md"
1617
+ };
1618
+ return names[client];
1619
+ }
1620
+ function getClientConfigArtifacts(client) {
1621
+ if (client === "claude-code") {
1622
+ return ["AGENTS.md", "CLAUDE.md", ".claude/settings.json when hooks are installed"];
1623
+ }
1624
+ if (client === "cursor") {
1625
+ return [".mcp.json", ".cursor/rules/snipara.mdc", "dashboard automation bundle when installed"];
1626
+ }
1627
+ if (client === "windsurf") {
1628
+ return [".mcp.json", "dashboard automation bundle when installed"];
1629
+ }
1630
+ if (client === "codex") {
1631
+ return ["AGENTS.md", ".codex/config.toml", ".snipara/templates/codex-config.toml"];
1632
+ }
1633
+ if (client === "gemini") {
1634
+ return ["AGENTS.md", ".snipara/templates/gemini-mcp-reference.json"];
1635
+ }
1636
+ if (client === "vscode") {
1637
+ return ["AGENTS.md", ".snipara/templates/vscode-mcp-reference.json"];
1638
+ }
1639
+ if (client === "continue") {
1640
+ return ["AGENTS.md", ".snipara/templates/continue-mcp-reference.json"];
1641
+ }
1642
+ if (client === "chatgpt") {
1643
+ return ["AGENTS.md", ".snipara/templates/chatgpt-openai-mcp.json"];
1644
+ }
1645
+ if (client === "claude-desktop") {
1646
+ return ["AGENTS.md", "Claude Desktop MCP config"];
1647
+ }
1648
+ return ["AGENTS.md", ".snipara/templates/custom-mcp-reference.json"];
1649
+ }
1650
+ function getClientAutomationCommand(client) {
1651
+ const companionClient = getCompanionInitClientFlag(client).match(/--client\s+(\S+)/)?.[1];
1652
+ return companionClient ? `${COMPANION_COMMAND_NAME} automations install --client ${companionClient}` : null;
1653
+ }
1654
+ function buildClientPackMarkdown(answers, commands, guidance) {
1655
+ const clientName = getClientDisplayName(answers.aiClient);
1656
+ const automationCommand = getClientAutomationCommand(answers.aiClient);
1657
+ const bootstrapCommand = commands.find(
1658
+ (command) => command.title === "Bootstrap local companion"
1659
+ );
1660
+ return `# Snipara Pack: ${clientName}
1661
+
1662
+ This pack is the client-specific overlay for the generated Snipara project setup.
1663
+ Use \`AGENTS.md\` as the shared source of agent behavior, then apply the client-specific files below.
1664
+
1665
+ ## Hosted MCP
1666
+
1667
+ - Endpoint: \`${buildHostedMcpEndpoint(answers)}\`
1668
+ - Auth: \`SNIPARA_API_KEY\` from the environment or local client secret store
1669
+ - Do not commit API keys or bearer tokens.
1670
+
1671
+ ## Client Files
1672
+
1673
+ ${getClientConfigArtifacts(answers.aiClient).map((item) => `- \`${item}\``).join("\n")}
1674
+
1675
+ ## Recommended Setup
1676
+
1677
+ ${bootstrapCommand ? `1. Bootstrap companion: \`${bootstrapCommand.command}\`` : "1. Bootstrap companion with `snipara-companion init`."}
1678
+ 2. Confirm the client can list or call the \`snipara_*\` MCP tools.
1679
+ 3. Keep exact edits, tests, and dirty working-tree checks local; use Snipara for memory, source truth, and indexed code graph context.
1680
+ ${automationCommand ? `4. For generated local automations, run \`${automationCommand}\` when that client exposes usable automation files.` : "4. This client is treated as MCP-first; no local hook surface is assumed."}
1681
+
1682
+ ## Client Guidance
1683
+
1684
+ ${guidance.map((line) => `- ${line}`).join("\n")}
1685
+
1686
+ ## Agent Workflow
1687
+
1688
+ - Start substantial work with \`snipara_recall\` and \`snipara_context_query\`.
1689
+ - Use \`answer_pack\` facts, caveats, source maps, and verification checks before making claims.
1690
+ - Use \`snipara_code_symbol_card\` and \`snipara_code_impact\` for important symbols or risky multi-file changes when available.
1691
+ - Use \`snipara-companion workflow start\`, \`phase-start\`, \`phase-commit\`, \`workflow resume\`, and \`final-commit\` for multi-phase work.
1692
+ - Persist only durable decisions, learnings, preferences, workflows, and troubleshooting outcomes. Never persist secrets.
1693
+ `;
1694
+ }
1499
1695
  async function createCompanionPack(answers) {
1500
1696
  console.log(chalk.bold("\n\u{1F5C2}\uFE0F Generating Companion Pack\n"));
1501
1697
  const packDir = path.join(process.cwd(), ".snipara", "companion");
1502
1698
  const commands = getCompanionCommands(answers);
1503
1699
  const guidance = getClientGuidance(answers.aiClient);
1504
1700
  const detection = detectEnvironment();
1701
+ const clientPackFilename = getClientPackFilename(answers.aiClient);
1505
1702
  fs.mkdirSync(packDir, { recursive: true });
1506
1703
  const readme = `# Snipara Companion Pack
1507
1704
 
@@ -1513,6 +1710,7 @@ This project uses Snipara as a hosted-first context and memory layer with local
1513
1710
  - Project slug: \`${answers.projectSlug}\`
1514
1711
  - Project id: \`${answers.projectId || "not-set"}\`
1515
1712
  - AI client: \`${answers.aiClient}\`
1713
+ - Client pack: \`${clientPackFilename}\`
1516
1714
  - Installed local companion: \`${answers.installCompanion ? "yes" : "no"}\`
1517
1715
  - Generated hosted MCP config: \`${answers.profile !== "runtime-only" ? "yes" : "no"}\`
1518
1716
  - Installed local snipara-mcp package: \`${answers.installMcp ? "yes" : "no"}\`
@@ -1594,13 +1792,19 @@ ${item.purpose}`
1594
1792
  llm_provider: answers.llmProvider || null,
1595
1793
  github_repository: answers.githubRepo || null,
1596
1794
  github_automation_url: answers.githubRepo ? buildGitHubAutomationUrl(answers) : null,
1795
+ client_pack: clientPackFilename,
1597
1796
  commands,
1598
1797
  guidance,
1599
1798
  detection
1600
1799
  };
1601
1800
  fs.writeFileSync(path.join(packDir, "README.md"), readme + "\n");
1801
+ fs.writeFileSync(
1802
+ path.join(packDir, clientPackFilename),
1803
+ buildClientPackMarkdown(answers, commands, guidance) + "\n"
1804
+ );
1602
1805
  fs.writeFileSync(path.join(packDir, "commands.json"), JSON.stringify(pack, null, 2) + "\n");
1603
1806
  console.log(chalk.green(" \u2713 Created .snipara/companion/README.md"));
1807
+ console.log(chalk.green(` \u2713 Created .snipara/companion/${clientPackFilename}`));
1604
1808
  console.log(chalk.green(" \u2713 Created .snipara/companion/commands.json"));
1605
1809
  }
1606
1810
  async function runSandboxInit() {
@@ -2143,12 +2347,36 @@ function detectAiClient() {
2143
2347
  if (fs.existsSync(path.join(process.cwd(), ".codex"))) {
2144
2348
  return "codex";
2145
2349
  }
2350
+ if (fs.existsSync(path.join(process.cwd(), ".cursor"))) {
2351
+ return "cursor";
2352
+ }
2353
+ if (fs.existsSync(path.join(process.cwd(), ".windsurf"))) {
2354
+ return "windsurf";
2355
+ }
2356
+ if (fs.existsSync(path.join(process.cwd(), ".gemini"))) {
2357
+ return "gemini";
2358
+ }
2359
+ if (fs.existsSync(path.join(process.cwd(), ".continue"))) {
2360
+ return "continue";
2361
+ }
2362
+ if (fs.existsSync(path.join(process.cwd(), ".vscode"))) {
2363
+ return "vscode";
2364
+ }
2146
2365
  if (fs.existsSync(path.join(homedir(), ".claude")) || process.env.CLAUDE_CODE) {
2147
2366
  return "claude-code";
2148
2367
  }
2149
2368
  if (fs.existsSync(path.join(homedir(), ".cursor")) || process.env.CURSOR_EDITOR) {
2150
2369
  return "cursor";
2151
2370
  }
2371
+ if (fs.existsSync(path.join(homedir(), ".windsurf")) || process.env.WINDSURF_EDITOR) {
2372
+ return "windsurf";
2373
+ }
2374
+ if (fs.existsSync(path.join(homedir(), ".gemini")) || process.env.GEMINI_CLI) {
2375
+ return "gemini";
2376
+ }
2377
+ if (fs.existsSync(path.join(homedir(), ".continue")) || process.env.CONTINUE_GLOBAL_DIR) {
2378
+ return "continue";
2379
+ }
2152
2380
  const claudeDesktopPath = process.platform === "darwin" ? path.join(homedir(), "Library", "Application Support", "Claude") : process.platform === "win32" ? path.join(homedir(), "AppData", "Roaming", "Claude") : path.join(homedir(), ".config", "claude");
2153
2381
  if (fs.existsSync(claudeDesktopPath)) {
2154
2382
  return "claude-desktop";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-snipara",
3
- "version": "1.3.16",
3
+ "version": "1.3.17",
4
4
  "description": "Onboard Snipara Hosted MCP Context + Memory with auth, companion workflows, and optional Snipara Sandbox",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -32,6 +32,10 @@
32
32
  "chatgpt",
33
33
  "openai",
34
34
  "cursor",
35
+ "windsurf",
36
+ "gemini",
37
+ "vscode",
38
+ "continue",
35
39
  "claude-desktop"
36
40
  ],
37
41
  "author": "Snipara",