stashes 0.1.0 → 0.1.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 (39) hide show
  1. package/dist/cli.js +2020 -0
  2. package/dist/commands/apply.d.ts +2 -0
  3. package/dist/commands/apply.d.ts.map +1 -0
  4. package/dist/commands/apply.js +10 -0
  5. package/dist/commands/apply.js.map +1 -0
  6. package/dist/commands/cleanup.d.ts +2 -0
  7. package/dist/commands/cleanup.d.ts.map +1 -0
  8. package/dist/commands/cleanup.js +10 -0
  9. package/dist/commands/cleanup.js.map +1 -0
  10. package/dist/commands/generate.d.ts +8 -0
  11. package/dist/commands/generate.d.ts.map +1 -0
  12. package/dist/commands/generate.js +55 -0
  13. package/dist/commands/generate.js.map +1 -0
  14. package/dist/commands/list.d.ts +2 -0
  15. package/dist/commands/list.d.ts.map +1 -0
  16. package/dist/commands/list.js +19 -0
  17. package/dist/commands/list.js.map +1 -0
  18. package/dist/commands/remove.d.ts +2 -0
  19. package/dist/commands/remove.d.ts.map +1 -0
  20. package/dist/commands/remove.js +9 -0
  21. package/dist/commands/remove.js.map +1 -0
  22. package/dist/commands/setup.d.ts +7 -0
  23. package/dist/commands/setup.d.ts.map +1 -0
  24. package/dist/commands/setup.js +229 -0
  25. package/dist/commands/setup.js.map +1 -0
  26. package/dist/commands/start.d.ts +9 -0
  27. package/dist/commands/start.d.ts.map +1 -0
  28. package/dist/commands/start.js +42 -0
  29. package/dist/commands/start.js.map +1 -0
  30. package/dist/commands/vary.d.ts +2 -0
  31. package/dist/commands/vary.d.ts.map +1 -0
  32. package/dist/commands/vary.js +27 -0
  33. package/dist/commands/vary.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/mcp.js +1778 -0
  38. package/package.json +51 -4
  39. package/index.js +0 -1
@@ -0,0 +1,2 @@
1
+ export declare function applyCommand(stashId: string): Promise<void>;
2
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/commands/apply.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjE"}
@@ -0,0 +1,10 @@
1
+ import { resolve } from 'path';
2
+ import { apply, initLogFile } from '@stashes/core';
3
+ export async function applyCommand(stashId) {
4
+ const projectPath = resolve('.');
5
+ initLogFile(projectPath);
6
+ console.log(`\nApplying stash ${stashId}...`);
7
+ await apply({ projectPath, stashId });
8
+ console.log(`✓ Stash ${stashId} merged into current branch. Worktrees cleaned up.\n`);
9
+ }
10
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/commands/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,WAAW,CAAC,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,sDAAsD,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function cleanupCommand(): Promise<void>;
2
+ //# sourceMappingURL=cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAGA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAOpD"}
@@ -0,0 +1,10 @@
1
+ import { resolve } from 'path';
2
+ import { cleanup, initLogFile } from '@stashes/core';
3
+ export async function cleanupCommand() {
4
+ const projectPath = resolve('.');
5
+ initLogFile(projectPath);
6
+ console.log('\nCleaning up all stashes and worktrees...');
7
+ await cleanup(projectPath);
8
+ console.log('✓ All worktrees and stash branches removed.\n');
9
+ }
10
+ //# sourceMappingURL=cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,WAAW,CAAC,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,8 @@
1
+ interface GenerateOptions {
2
+ count: string;
3
+ file?: string;
4
+ export?: string;
5
+ }
6
+ export declare function generateCommand(prompt: string, options: GenerateOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD7F"}
@@ -0,0 +1,55 @@
1
+ import { resolve } from 'path';
2
+ import { generate, initLogFile, PersistenceService } from '@stashes/core';
3
+ export async function generateCommand(prompt, options) {
4
+ const projectPath = resolve('.');
5
+ const count = parseInt(options.count, 10);
6
+ initLogFile(projectPath);
7
+ const persistence = new PersistenceService(projectPath);
8
+ // Get or create default project
9
+ let projects = persistence.listProjects();
10
+ let project;
11
+ if (projects.length > 0) {
12
+ project = projects[0];
13
+ }
14
+ else {
15
+ project = {
16
+ id: `proj_${crypto.randomUUID().substring(0, 8)}`,
17
+ name: 'Default',
18
+ createdAt: new Date().toISOString(),
19
+ updatedAt: new Date().toISOString(),
20
+ };
21
+ persistence.saveProject(project);
22
+ }
23
+ console.log(`\nGenerating ${count} stashes...\n`);
24
+ const stashes = await generate({
25
+ projectPath,
26
+ projectId: project.id,
27
+ prompt,
28
+ count,
29
+ component: options.file ? { filePath: options.file, exportName: options.export } : undefined,
30
+ onProgress: (event) => {
31
+ switch (event.type) {
32
+ case 'generating':
33
+ console.log(` ${event.stashId} generating...`);
34
+ break;
35
+ case 'screenshotting':
36
+ console.log(` ${event.stashId} capturing screenshot...`);
37
+ break;
38
+ case 'ready':
39
+ console.log(` ${event.stashId} ✓ ready ${event.screenshotPath || ''}`);
40
+ break;
41
+ case 'error':
42
+ console.log(` ${event.stashId} ✗ error: ${event.error}`);
43
+ break;
44
+ }
45
+ },
46
+ });
47
+ console.log(`\n✓ ${stashes.length} stashes generated\n`);
48
+ console.log(' ID Status Screenshot');
49
+ console.log(' ── ────── ──────────');
50
+ for (const s of stashes) {
51
+ console.log(` ${s.id} ${s.status.padEnd(8)} ${s.screenshotUrl || 'none'}`);
52
+ }
53
+ console.log('\nRun `stashes browse` to interact live, or `stashes apply <id>` to merge.\n');
54
+ }
55
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAS1E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,OAAwB;IAC5E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE1C,WAAW,CAAC,WAAW,CAAC,CAAC;IACzB,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAExD,gCAAgC;IAChC,IAAI,QAAQ,GAAG,WAAW,CAAC,YAAY,EAAE,CAAC;IAC1C,IAAI,OAAgB,CAAC;IACrB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG;YACR,EAAE,EAAE,QAAQ,MAAM,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACjD,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,eAAe,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC;QAC7B,WAAW;QACX,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,MAAM;QACN,KAAK;QACL,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;QAC5F,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;YACpB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,YAAY;oBACf,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;oBACjD,MAAM;gBACR,KAAK,gBAAgB;oBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;oBAC3D,MAAM;gBACR,KAAK,OAAO;oBACV,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC1E,MAAM;gBACR,KAAK,OAAO;oBACV,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC3D,MAAM;YACV,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,MAAM,sBAAsB,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,MAAM,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function listCommand(): Promise<void>;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBjD"}
@@ -0,0 +1,19 @@
1
+ import { resolve } from 'path';
2
+ import { list, initLogFile } from '@stashes/core';
3
+ export async function listCommand() {
4
+ const projectPath = resolve('.');
5
+ initLogFile(projectPath);
6
+ const stashes = await list(projectPath);
7
+ if (stashes.length === 0) {
8
+ console.log('\nNo stashes found. Run `stashes generate "prompt"` to create some.\n');
9
+ return;
10
+ }
11
+ console.log(`\n${stashes.length} stash(es):\n`);
12
+ console.log(' ID Status Prompt');
13
+ console.log(' ── ────── ──────');
14
+ for (const s of stashes) {
15
+ console.log(` ${s.id} ${s.status.padEnd(8)} ${s.prompt.substring(0, 50)}`);
16
+ }
17
+ console.log('');
18
+ }
19
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,WAAW,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;IAExC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function removeCommand(stashId: string): Promise<void>;
2
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlE"}
@@ -0,0 +1,9 @@
1
+ import { resolve } from 'path';
2
+ import { remove, initLogFile } from '@stashes/core';
3
+ export async function removeCommand(stashId) {
4
+ const projectPath = resolve('.');
5
+ initLogFile(projectPath);
6
+ await remove(projectPath, stashId);
7
+ console.log(`\n✓ Stash ${stashId} removed.\n`);
8
+ }
9
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,WAAW,CAAC,CAAC;IAEzB,MAAM,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,aAAa,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface SetupOptions {
2
+ status?: boolean;
3
+ remove?: boolean;
4
+ }
5
+ export declare function setupCommand(options: SetupOptions): void;
6
+ export {};
7
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AA+QA,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAUxD"}
@@ -0,0 +1,229 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ // ── Constants ───────────────────────────────────────────────────────────────────
5
+ const MCP_SERVER_NAME = 'stashes';
6
+ const MCP_ENTRY_STANDARD = {
7
+ command: 'npx',
8
+ args: ['-y', 'stashes@latest'],
9
+ description: 'Generate AI-powered UI design explorations',
10
+ };
11
+ const MCP_ENTRY_ZED = {
12
+ command: {
13
+ path: 'npx',
14
+ args: ['-y', 'stashes@latest'],
15
+ },
16
+ settings: {},
17
+ };
18
+ // ── Tool definitions ────────────────────────────────────────────────────────────
19
+ function buildToolDefinitions() {
20
+ const home = homedir();
21
+ const appSupport = join(home, 'Library', 'Application Support');
22
+ return [
23
+ {
24
+ id: 'claude-code',
25
+ name: 'Claude Code',
26
+ configPath: join(home, '.claude.json'),
27
+ serversKey: 'mcpServers',
28
+ format: 'standard',
29
+ detect: () => existsSync(join(home, '.claude.json')) ||
30
+ existsSync(join(home, '.claude')),
31
+ },
32
+ {
33
+ id: 'claude-desktop',
34
+ name: 'Claude Desktop',
35
+ configPath: join(appSupport, 'Claude', 'claude_desktop_config.json'),
36
+ serversKey: 'mcpServers',
37
+ format: 'standard',
38
+ detect: () => existsSync(join(appSupport, 'Claude')) ||
39
+ existsSync('/Applications/Claude.app'),
40
+ },
41
+ {
42
+ id: 'vscode',
43
+ name: 'VS Code',
44
+ configPath: join(appSupport, 'Code', 'User', 'mcp.json'),
45
+ serversKey: 'servers',
46
+ format: 'standard',
47
+ detect: () => existsSync(join(appSupport, 'Code', 'User')),
48
+ },
49
+ {
50
+ id: 'cursor',
51
+ name: 'Cursor',
52
+ configPath: join(home, '.cursor', 'mcp.json'),
53
+ serversKey: 'mcpServers',
54
+ format: 'standard',
55
+ detect: () => existsSync(join(home, '.cursor')),
56
+ },
57
+ {
58
+ id: 'windsurf',
59
+ name: 'Windsurf',
60
+ configPath: join(home, '.codeium', 'windsurf', 'mcp_config.json'),
61
+ serversKey: 'mcpServers',
62
+ format: 'standard',
63
+ detect: () => existsSync(join(home, '.codeium', 'windsurf')),
64
+ },
65
+ {
66
+ id: 'zed',
67
+ name: 'Zed',
68
+ configPath: join(appSupport, 'Zed', 'settings.json'),
69
+ serversKey: 'context_servers',
70
+ format: 'zed',
71
+ detect: () => existsSync(join(appSupport, 'Zed')),
72
+ },
73
+ ];
74
+ }
75
+ // ── JSON helpers ────────────────────────────────────────────────────────────────
76
+ function readJsonFile(path) {
77
+ if (!existsSync(path))
78
+ return {};
79
+ try {
80
+ const raw = readFileSync(path, 'utf-8').trim();
81
+ if (!raw)
82
+ return {};
83
+ return JSON.parse(raw);
84
+ }
85
+ catch {
86
+ return {};
87
+ }
88
+ }
89
+ function writeJsonFile(path, data) {
90
+ mkdirSync(dirname(path), { recursive: true });
91
+ writeFileSync(path, JSON.stringify(data, null, 2) + '\n');
92
+ }
93
+ // ── Config operations ───────────────────────────────────────────────────────────
94
+ function isConfigured(tool) {
95
+ const config = readJsonFile(tool.configPath);
96
+ const servers = config[tool.serversKey];
97
+ return !!servers?.[MCP_SERVER_NAME];
98
+ }
99
+ function installMcp(tool) {
100
+ const config = readJsonFile(tool.configPath);
101
+ const servers = config[tool.serversKey] ?? {};
102
+ servers[MCP_SERVER_NAME] =
103
+ tool.format === 'zed' ? { ...MCP_ENTRY_ZED } : { ...MCP_ENTRY_STANDARD };
104
+ config[tool.serversKey] = servers;
105
+ writeJsonFile(tool.configPath, config);
106
+ }
107
+ function removeMcp(tool) {
108
+ const config = readJsonFile(tool.configPath);
109
+ const servers = config[tool.serversKey];
110
+ if (!servers)
111
+ return;
112
+ delete servers[MCP_SERVER_NAME];
113
+ if (Object.keys(servers).length === 0) {
114
+ delete config[tool.serversKey];
115
+ }
116
+ writeJsonFile(tool.configPath, config);
117
+ }
118
+ // ── Display helpers ─────────────────────────────────────────────────────────────
119
+ function shortenPath(fullPath) {
120
+ const home = homedir();
121
+ if (fullPath.startsWith(home)) {
122
+ return '~' + fullPath.slice(home.length);
123
+ }
124
+ return fullPath;
125
+ }
126
+ // ── Command actions ─────────────────────────────────────────────────────────────
127
+ function showStatus(tools) {
128
+ const detected = tools.filter((t) => t.detect());
129
+ console.log('');
130
+ console.log(' Stashes MCP Status');
131
+ console.log(' ' + '-'.repeat(50));
132
+ if (detected.length === 0) {
133
+ console.log(' No supported AI tools detected.');
134
+ console.log('');
135
+ return;
136
+ }
137
+ const nameWidth = Math.max(...detected.map((t) => t.name.length));
138
+ for (const tool of detected) {
139
+ const name = tool.name.padEnd(nameWidth);
140
+ const path = shortenPath(tool.configPath);
141
+ if (isConfigured(tool)) {
142
+ console.log(` \u2713 ${name} configured ${path}`);
143
+ }
144
+ else {
145
+ console.log(` - ${name} not set up ${path}`);
146
+ }
147
+ }
148
+ console.log('');
149
+ }
150
+ function runInstall(tools) {
151
+ const detected = tools.filter((t) => t.detect());
152
+ console.log('');
153
+ console.log(' Stashes Setup');
154
+ console.log(' ' + '-'.repeat(50));
155
+ if (detected.length === 0) {
156
+ console.log(' No supported AI tools detected on this system.');
157
+ console.log('');
158
+ return;
159
+ }
160
+ console.log(` Found ${detected.length} AI tool${detected.length === 1 ? '' : 's'}:`);
161
+ console.log('');
162
+ const results = detected.map((tool) => {
163
+ try {
164
+ installMcp(tool);
165
+ return { tool, ok: true };
166
+ }
167
+ catch (e) {
168
+ return { tool, ok: false, error: e.message };
169
+ }
170
+ });
171
+ for (const result of results) {
172
+ const path = shortenPath(result.tool.configPath);
173
+ if (result.ok) {
174
+ console.log(` \u2713 ${result.tool.name}`);
175
+ console.log(` ${path}`);
176
+ }
177
+ else {
178
+ console.log(` \u2717 ${result.tool.name} -- ${result.error}`);
179
+ console.log(` ${path}`);
180
+ }
181
+ }
182
+ const successCount = results.filter((r) => r.ok).length;
183
+ console.log('');
184
+ console.log(` Done. Stashes MCP registered in ${successCount} tool${successCount === 1 ? '' : 's'}.`);
185
+ console.log('');
186
+ }
187
+ function runRemove(tools) {
188
+ const configured = tools.filter((t) => {
189
+ try {
190
+ return t.detect() && isConfigured(t);
191
+ }
192
+ catch {
193
+ return false;
194
+ }
195
+ });
196
+ console.log('');
197
+ console.log(' Stashes Remove');
198
+ console.log(' ' + '-'.repeat(50));
199
+ if (configured.length === 0) {
200
+ console.log(' Stashes MCP is not configured in any detected tools.');
201
+ console.log('');
202
+ return;
203
+ }
204
+ for (const tool of configured) {
205
+ try {
206
+ removeMcp(tool);
207
+ console.log(` \u2713 Removed from ${tool.name}`);
208
+ }
209
+ catch (e) {
210
+ console.log(` \u2717 ${tool.name} -- ${e.message}`);
211
+ }
212
+ }
213
+ console.log('');
214
+ console.log(' Done.');
215
+ console.log('');
216
+ }
217
+ export function setupCommand(options) {
218
+ const tools = buildToolDefinitions();
219
+ if (options.status) {
220
+ showStatus(tools);
221
+ }
222
+ else if (options.remove) {
223
+ runRemove(tools);
224
+ }
225
+ else {
226
+ runInstall(tools);
227
+ }
228
+ }
229
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAqBlC,mFAAmF;AAEnF,MAAM,eAAe,GAAG,SAAS,CAAC;AAElC,MAAM,kBAAkB,GAAG;IACzB,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAC9B,WAAW,EAAE,4CAA4C;CAC1D,CAAC;AAEF,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE;QACP,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,CAAC,IAAI,EAAE,gBAAgB,CAAC;KAC/B;IACD,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,mFAAmF;AAEnF,SAAS,oBAAoB;IAC3B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;IAEhE,OAAO;QACL;YACE,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;YACtC,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,GAAG,EAAE,CACX,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;gBACtC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;SACpC;QACD;YACE,EAAE,EAAE,gBAAgB;YACpB,IAAI,EAAE,gBAAgB;YACtB,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,4BAA4B,CAAC;YACpE,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,GAAG,EAAE,CACX,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACtC,UAAU,CAAC,0BAA0B,CAAC;SACzC;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC;YACxD,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;SAC3D;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC;YAC7C,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;SAChD;QACD;YACE,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,CAAC;YACjE,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;SAC7D;QACD;YACE,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,KAAK;YACX,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,CAAC;YACpD,UAAU,EAAE,iBAAiB;YAC7B,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;SAClD;KACO,CAAC;AACb,CAAC;AAED,mFAAmF;AAEnF,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,IAA6B;IAChE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,mFAAmF;AAEnF,SAAS,YAAY,CAAC,IAAoB;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAwC,CAAC;IAC/E,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,UAAU,CAAC,IAAoB;IACtC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAA6B,IAAI,EAAE,CAAC;IAE3E,OAAO,CAAC,eAAe,CAAC;QACtB,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3E,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;IAClC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,SAAS,CAAC,IAAoB;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAwC,CAAC;IAC/E,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,OAAO,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAED,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,mFAAmF;AAEnF,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,mFAAmF;AAEnF,SAAS,UAAU,CAAC,KAAgC;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAElE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,iBAAiB,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,KAAgC;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,MAAM,WAAW,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,OAAO,GAAsB,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACvD,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,qCAAqC,YAAY,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACvG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,SAAS,CAAC,KAAgC;IACjD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,OAAO,CAAC,CAAC,MAAM,EAAE,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,OAAQ,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AASD,MAAM,UAAU,YAAY,CAAC,OAAqB;IAChD,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IAErC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface StartOptions {
2
+ port: string;
3
+ devPort?: string;
4
+ stashes: string;
5
+ open: boolean;
6
+ }
7
+ export declare function startCommand(path: string, options: StartOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAMA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BrF"}
@@ -0,0 +1,42 @@
1
+ import { resolve } from 'path';
2
+ import open from 'open';
3
+ import { startServer } from '@stashes/server';
4
+ import { detectFramework } from '@stashes/server/services/detector';
5
+ export async function startCommand(path, options) {
6
+ const projectPath = resolve(path || '.');
7
+ const port = parseInt(options.port, 10);
8
+ console.log('');
9
+ console.log(' ╔═╗╔╦╗╔═╗╔═╗╦ ╦╔═╗╔═╗');
10
+ console.log(' ╚═╗ ║ ╠═╣╚═╗╠═╣║╣ ╚═╗');
11
+ console.log(' ╚═╝ ╩ ╩ ╩╚═╝╩ ╩╚═╝╚═╝');
12
+ console.log('');
13
+ const detected = detectFramework(projectPath);
14
+ const devPort = parseInt(options.devPort || String(detected.devPort), 10);
15
+ console.log(` Project: ${projectPath}`);
16
+ console.log(` Framework: ${detected.framework}`);
17
+ console.log(` Dev server: http://localhost:${devPort}`);
18
+ console.log(` Stashes: http://localhost:${port}`);
19
+ console.log('');
20
+ const isDevRunning = await checkPort(devPort);
21
+ if (!isDevRunning) {
22
+ console.log(` ! Your dev server is not running on port ${devPort}`);
23
+ console.log(` Start it with: ${detected.devCommand}`);
24
+ console.log('');
25
+ }
26
+ startServer(projectPath, devPort, port);
27
+ if (options.open !== false) {
28
+ await open(`http://localhost:${port}`);
29
+ }
30
+ }
31
+ async function checkPort(port) {
32
+ try {
33
+ const response = await fetch(`http://localhost:${port}`, {
34
+ signal: AbortSignal.timeout(2000),
35
+ });
36
+ return response.ok || response.status < 500;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AASpE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,OAAqB;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAE1E,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,8CAA8C,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAExC,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,EAAE,EAAE;YACvD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function varyCommand(stashId: string, prompt: string): Promise<void>;
2
+ //# sourceMappingURL=vary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vary.d.ts","sourceRoot":"","sources":["../../src/commands/vary.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBhF"}
@@ -0,0 +1,27 @@
1
+ import { resolve } from 'path';
2
+ import { vary, initLogFile } from '@stashes/core';
3
+ export async function varyCommand(stashId, prompt) {
4
+ const projectPath = resolve('.');
5
+ initLogFile(projectPath);
6
+ console.log(`\nCreating variation of ${stashId}...`);
7
+ const stash = await vary({
8
+ projectPath,
9
+ sourceStashId: stashId,
10
+ prompt,
11
+ onProgress: (event) => {
12
+ switch (event.type) {
13
+ case 'generating':
14
+ console.log(` ${event.stashId} generating...`);
15
+ break;
16
+ case 'ready':
17
+ console.log(` ${event.stashId} ✓ ready`);
18
+ break;
19
+ case 'error':
20
+ console.log(` ${event.stashId} ✗ error: ${event.error}`);
21
+ break;
22
+ }
23
+ },
24
+ });
25
+ console.log(`\n✓ Variation ${stash.id} created from ${stashId}\n`);
26
+ }
27
+ //# sourceMappingURL=vary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vary.js","sourceRoot":"","sources":["../../src/commands/vary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,MAAc;IAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,WAAW,CAAC,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,KAAK,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC;QACvB,WAAW;QACX,aAAa,EAAE,OAAO;QACtB,MAAM;QACN,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;YACpB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,YAAY;oBACf,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;oBACjD,MAAM;gBACR,KAAK,OAAO;oBACV,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;oBAC3C,MAAM;gBACR,KAAK,OAAO;oBACV,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC3D,MAAM;YACV,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,EAAE,iBAAiB,OAAO,IAAI,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bun
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}