gooseworks 0.1.0

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 (70) hide show
  1. package/README.md +180 -0
  2. package/dist/agents/claude.d.ts +4 -0
  3. package/dist/agents/claude.d.ts.map +1 -0
  4. package/dist/agents/claude.js +112 -0
  5. package/dist/agents/claude.js.map +1 -0
  6. package/dist/agents/cursor.d.ts +3 -0
  7. package/dist/agents/cursor.d.ts.map +1 -0
  8. package/dist/agents/cursor.js +95 -0
  9. package/dist/agents/cursor.js.map +1 -0
  10. package/dist/agents/detect.d.ts +9 -0
  11. package/dist/agents/detect.d.ts.map +1 -0
  12. package/dist/agents/detect.js +76 -0
  13. package/dist/agents/detect.js.map +1 -0
  14. package/dist/auth/credentials.d.ts +12 -0
  15. package/dist/auth/credentials.d.ts.map +1 -0
  16. package/dist/auth/credentials.js +87 -0
  17. package/dist/auth/credentials.js.map +1 -0
  18. package/dist/auth/oauth-server.d.ts +8 -0
  19. package/dist/auth/oauth-server.d.ts.map +1 -0
  20. package/dist/auth/oauth-server.js +132 -0
  21. package/dist/auth/oauth-server.js.map +1 -0
  22. package/dist/commands/credits.d.ts +3 -0
  23. package/dist/commands/credits.d.ts.map +1 -0
  24. package/dist/commands/credits.js +91 -0
  25. package/dist/commands/credits.js.map +1 -0
  26. package/dist/commands/install.d.ts +3 -0
  27. package/dist/commands/install.d.ts.map +1 -0
  28. package/dist/commands/install.js +104 -0
  29. package/dist/commands/install.js.map +1 -0
  30. package/dist/commands/login.d.ts +8 -0
  31. package/dist/commands/login.d.ts.map +1 -0
  32. package/dist/commands/login.js +79 -0
  33. package/dist/commands/login.js.map +1 -0
  34. package/dist/commands/logout.d.ts +3 -0
  35. package/dist/commands/logout.d.ts.map +1 -0
  36. package/dist/commands/logout.js +51 -0
  37. package/dist/commands/logout.js.map +1 -0
  38. package/dist/commands/search.d.ts +3 -0
  39. package/dist/commands/search.d.ts.map +1 -0
  40. package/dist/commands/search.js +122 -0
  41. package/dist/commands/search.js.map +1 -0
  42. package/dist/commands/update.d.ts +3 -0
  43. package/dist/commands/update.d.ts.map +1 -0
  44. package/dist/commands/update.js +64 -0
  45. package/dist/commands/update.js.map +1 -0
  46. package/dist/config.d.ts +10 -0
  47. package/dist/config.d.ts.map +1 -0
  48. package/dist/config.js +13 -0
  49. package/dist/config.js.map +1 -0
  50. package/dist/index.d.ts +3 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +23 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/skills/fetcher.d.ts +18 -0
  55. package/dist/skills/fetcher.d.ts.map +1 -0
  56. package/dist/skills/fetcher.js +118 -0
  57. package/dist/skills/fetcher.js.map +1 -0
  58. package/dist/skills/installer.d.ts +5 -0
  59. package/dist/skills/installer.d.ts.map +1 -0
  60. package/dist/skills/installer.js +72 -0
  61. package/dist/skills/installer.js.map +1 -0
  62. package/dist/skills/master-skill.d.ts +7 -0
  63. package/dist/skills/master-skill.d.ts.map +1 -0
  64. package/dist/skills/master-skill.js +84 -0
  65. package/dist/skills/master-skill.js.map +1 -0
  66. package/dist/utils/logger.d.ts +10 -0
  67. package/dist/utils/logger.d.ts.map +1 -0
  68. package/dist/utils/logger.js +44 -0
  69. package/dist/utils/logger.js.map +1 -0
  70. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,180 @@
1
+ # @gooseworks/cli
2
+
3
+ Give your coding agent (Claude Code, Cursor) access to GooseWorks data tools — find emails, search people, enrich companies, scrape Twitter/Reddit/websites — with one install.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ npx @gooseworks/cli install --claude
9
+ ```
10
+
11
+ This does three things:
12
+ 1. Opens browser for Google sign-in → gets you an API token
13
+ 2. Downloads skill files (SKILL.md + Python scripts) to `~/.agents/skills/`
14
+ 3. Symlinks them into `~/.claude/skills/` so Claude Code can use them
15
+
16
+ Then open Claude Code and say "find me leads" to get started.
17
+
18
+ ## Commands
19
+
20
+ ### `install`
21
+
22
+ Full setup: login + download skills + configure your coding agent.
23
+
24
+ ```bash
25
+ gooseworks install --claude # Configure for Claude Code
26
+ gooseworks install --cursor # Configure for Cursor
27
+ gooseworks install --all # Configure all detected agents
28
+ gooseworks install --claude --api-base http://localhost:5999 # Use local backend
29
+ ```
30
+
31
+ **What it does:**
32
+ - Runs `login` if you don't have credentials yet
33
+ - Fetches the skill catalog from GooseWorks API (falls back to GitHub)
34
+ - Writes skills to `~/.agents/skills/gooseworks-*/`
35
+ - Creates symlinks in `~/.claude/skills/` (Claude) or writes MCP config (Cursor)
36
+
37
+ ### `login`
38
+
39
+ Authenticate with GooseWorks via Google OAuth.
40
+
41
+ ```bash
42
+ gooseworks login
43
+ gooseworks login --api-base http://localhost:5999
44
+ ```
45
+
46
+ **Flow:**
47
+ 1. Starts a temporary HTTP server on a random local port
48
+ 2. Opens your browser to the GooseWorks sign-in page
49
+ 3. You sign in with Google (uses existing GooseWorks passport flow)
50
+ 4. Browser redirects back to the local server with your `cal_*` API token
51
+ 5. Token saved to `~/.gooseworks/credentials.json`
52
+
53
+ Timeout: 120 seconds. If the browser doesn't complete, re-run the command.
54
+
55
+ ### `logout`
56
+
57
+ Clear saved credentials.
58
+
59
+ ```bash
60
+ gooseworks logout
61
+ ```
62
+
63
+ Deletes `~/.gooseworks/credentials.json`. Does not revoke the API token server-side — you can do that from the GooseWorks web UI under Settings > API Keys.
64
+
65
+ ### `update`
66
+
67
+ Re-fetch the latest skills without re-authenticating.
68
+
69
+ ```bash
70
+ gooseworks update
71
+ ```
72
+
73
+ Removes old skill files, downloads the latest catalog, and reconfigures agent symlinks.
74
+
75
+ ### `credits`
76
+
77
+ Check your credit balance.
78
+
79
+ ```bash
80
+ gooseworks credits
81
+ ```
82
+
83
+ Output:
84
+ ```
85
+ Credits: 847 available (500 subscription + 347 purchased)
86
+ ```
87
+
88
+ ## File Layout
89
+
90
+ ### Credentials
91
+
92
+ ```
93
+ ~/.gooseworks/
94
+ └── credentials.json # API key, email, agent_id, api_base
95
+ ```
96
+
97
+ Directory: `700` permissions. File: `600` permissions.
98
+
99
+ ```json
100
+ {
101
+ "api_key": "cal_xxxxxxxxxxxxx",
102
+ "email": "user@example.com",
103
+ "agent_id": "uuid",
104
+ "api_base": "http://localhost:5999"
105
+ }
106
+ ```
107
+
108
+ ### Skills
109
+
110
+ ```
111
+ ~/.agents/skills/
112
+ ├── gooseworks-master/SKILL.md # Master skill with API reference
113
+ ├── gooseworks-twitter-scraper/
114
+ │ ├── SKILL.md
115
+ │ └── scripts/
116
+ │ ├── search_twitter.py
117
+ │ └── lib/gooseworks.py
118
+ ├── gooseworks-apollo-lead-finder/
119
+ │ ├── SKILL.md
120
+ │ └── scripts/
121
+ │ └── ...
122
+ └── ...
123
+ ```
124
+
125
+ ### Claude Code Symlinks
126
+
127
+ ```
128
+ ~/.claude/skills/
129
+ ├── gooseworks-master → ~/.agents/skills/gooseworks-master
130
+ ├── gooseworks-twitter-scraper → ~/.agents/skills/gooseworks-twitter-scraper
131
+ └── ...
132
+ ```
133
+
134
+ ## Environment Variables
135
+
136
+ | Variable | Default | Description |
137
+ |----------|---------|-------------|
138
+ | `GOOSEWORKS_FRONTEND_URL` | `http://localhost:3999` | Frontend URL for OAuth browser flow |
139
+
140
+ The `--api-base` flag (or `api_base` in credentials.json) controls the backend API URL. Defaults to `http://localhost:5999`.
141
+
142
+ ## Development
143
+
144
+ ```bash
145
+ cd cli/
146
+
147
+ # Install dependencies
148
+ npm install
149
+
150
+ # Run locally without building
151
+ npm run dev -- install --claude
152
+
153
+ # Build
154
+ npm run build
155
+
156
+ # Run tests
157
+ npm test
158
+ ```
159
+
160
+ ## Auth Flow (Technical)
161
+
162
+ The CLI does NOT do its own Google OAuth code exchange. It piggybacks on the existing GooseWorks passport flow:
163
+
164
+ ```
165
+ CLI starts localhost:19382
166
+ → opens browser to {FRONTEND}/cli/auth?callback_port=19382&state=nonce
167
+ → frontend page tries POST /api/cli/auth/token (fails: no session)
168
+ → shows "Sign in with Google" button
169
+ → button navigates to {BACKEND}/auth/google?returnTo=/cli/auth?callback_port=...
170
+ → normal passport Google OAuth flow
171
+ → Google redirects to {BACKEND}/auth/google/redirect (already registered)
172
+ → passport creates session cookie
173
+ → redirects back to {FRONTEND}/cli/auth?callback_port=19382&state=nonce
174
+ → frontend page retries POST /api/cli/auth/token (succeeds: session exists)
175
+ → backend creates cal_* token, returns it
176
+ → frontend redirects to localhost:19382/callback?token=cal_xxx&email=...
177
+ → CLI receives token, saves credentials, exits
178
+ ```
179
+
180
+ No new Google OAuth redirect URIs needed.
@@ -0,0 +1,4 @@
1
+ export declare function getClaudeSkillsDir(): string;
2
+ export declare function configureClaude(): number;
3
+ export declare function removeClaude(): void;
4
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"AAOA,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,eAAe,IAAI,MAAM,CA+CxC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAgBnC"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getClaudeSkillsDir = getClaudeSkillsDir;
37
+ exports.configureClaude = configureClaude;
38
+ exports.removeClaude = removeClaude;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const os = __importStar(require("os"));
42
+ const installer_1 = require("../skills/installer");
43
+ const CLAUDE_SKILLS_DIR = path.join(os.homedir(), '.claude', 'skills');
44
+ function getClaudeSkillsDir() {
45
+ return CLAUDE_SKILLS_DIR;
46
+ }
47
+ function configureClaude() {
48
+ const skillsBase = (0, installer_1.getSkillsBasePath)();
49
+ if (!fs.existsSync(skillsBase)) {
50
+ return 0;
51
+ }
52
+ fs.mkdirSync(CLAUDE_SKILLS_DIR, { recursive: true });
53
+ // Clean up ALL old gooseworks-* symlinks first
54
+ try {
55
+ const existing = fs.readdirSync(CLAUDE_SKILLS_DIR);
56
+ for (const entry of existing) {
57
+ if (!entry.startsWith('gooseworks-'))
58
+ continue;
59
+ const target = path.join(CLAUDE_SKILLS_DIR, entry);
60
+ try {
61
+ const stat = fs.lstatSync(target);
62
+ if (stat.isSymbolicLink()) {
63
+ fs.unlinkSync(target);
64
+ }
65
+ }
66
+ catch {
67
+ // Ignore
68
+ }
69
+ }
70
+ }
71
+ catch {
72
+ // Directory might not exist yet
73
+ }
74
+ // Symlink only what's currently in ~/.agents/skills/
75
+ const skillDirs = fs.readdirSync(skillsBase)
76
+ .filter((entry) => entry.startsWith('gooseworks-'));
77
+ let linked = 0;
78
+ for (const skillDir of skillDirs) {
79
+ const source = path.join(skillsBase, skillDir);
80
+ const target = path.join(CLAUDE_SKILLS_DIR, skillDir);
81
+ try {
82
+ fs.symlinkSync(source, target, 'dir');
83
+ }
84
+ catch {
85
+ // If it somehow still exists, remove and retry
86
+ fs.rmSync(target, { recursive: true, force: true });
87
+ fs.symlinkSync(source, target, 'dir');
88
+ }
89
+ linked++;
90
+ }
91
+ return linked;
92
+ }
93
+ function removeClaude() {
94
+ if (!fs.existsSync(CLAUDE_SKILLS_DIR))
95
+ return;
96
+ const entries = fs.readdirSync(CLAUDE_SKILLS_DIR);
97
+ for (const entry of entries) {
98
+ if (!entry.startsWith('gooseworks-'))
99
+ continue;
100
+ const target = path.join(CLAUDE_SKILLS_DIR, entry);
101
+ try {
102
+ const stat = fs.lstatSync(target);
103
+ if (stat.isSymbolicLink()) {
104
+ fs.unlinkSync(target);
105
+ }
106
+ }
107
+ catch {
108
+ // Ignore
109
+ }
110
+ }
111
+ }
112
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,gDAEC;AAED,0CA+CC;AAED,oCAgBC;AA5ED,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,mDAAwD;AAExD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEvE,SAAgB,kBAAkB;IAChC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAgB,eAAe;IAC7B,MAAM,UAAU,GAAG,IAAA,6BAAiB,GAAE,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,+CAA+C;IAC/C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;gBAAE,SAAS;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC1B,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IAED,qDAAqD;IACrD,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;SACzC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;IAEtD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;YAC/C,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,EAAE,CAAC;IACX,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,YAAY;IAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO;IAE9C,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,SAAS;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC1B,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function configureCursor(): void;
2
+ export declare function removeCursor(): void;
3
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"AA4BA,wBAAgB,eAAe,IAAI,IAAI,CA8BtC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAYnC"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.configureCursor = configureCursor;
37
+ exports.removeCursor = removeCursor;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const os = __importStar(require("os"));
41
+ const credentials_1 = require("../auth/credentials");
42
+ function getCursorConfigPath() {
43
+ const platform = process.platform;
44
+ const home = os.homedir();
45
+ if (platform === 'darwin') {
46
+ return path.join(home, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'cursor.mcp', 'config.json');
47
+ }
48
+ if (platform === 'linux') {
49
+ return path.join(home, '.config', 'Cursor', 'User', 'globalStorage', 'cursor.mcp', 'config.json');
50
+ }
51
+ // Windows
52
+ return path.join(home, 'AppData', 'Roaming', 'Cursor', 'User', 'globalStorage', 'cursor.mcp', 'config.json');
53
+ }
54
+ function configureCursor() {
55
+ const configPath = getCursorConfigPath();
56
+ const configDir = path.dirname(configPath);
57
+ fs.mkdirSync(configDir, { recursive: true });
58
+ let config = {};
59
+ try {
60
+ if (fs.existsSync(configPath)) {
61
+ config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
62
+ }
63
+ }
64
+ catch {
65
+ config = {};
66
+ }
67
+ if (!config.mcpServers) {
68
+ config.mcpServers = {};
69
+ }
70
+ const apiBase = (0, credentials_1.getApiBase)();
71
+ const apiKey = (0, credentials_1.getApiKey)();
72
+ config.mcpServers['gooseworks'] = {
73
+ url: `${apiBase}/mcp`,
74
+ env: {
75
+ GOOSEWORKS_API_KEY: apiKey || '',
76
+ },
77
+ };
78
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
79
+ }
80
+ function removeCursor() {
81
+ const configPath = getCursorConfigPath();
82
+ try {
83
+ if (!fs.existsSync(configPath))
84
+ return;
85
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
86
+ if (config.mcpServers?.gooseworks) {
87
+ delete config.mcpServers.gooseworks;
88
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
89
+ }
90
+ }
91
+ catch {
92
+ // Ignore errors
93
+ }
94
+ }
95
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type AgentType = 'claude' | 'cursor';
2
+ export interface DetectedAgent {
3
+ type: AgentType;
4
+ name: string;
5
+ configDir: string;
6
+ }
7
+ export declare function detectAgents(): DetectedAgent[];
8
+ export declare function isAgentInstalled(type: AgentType): boolean;
9
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/agents/detect.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,IAAI,aAAa,EAAE,CAmC9C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAEzD"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.detectAgents = detectAgents;
37
+ exports.isAgentInstalled = isAgentInstalled;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const os = __importStar(require("os"));
41
+ function detectAgents() {
42
+ const agents = [];
43
+ const home = os.homedir();
44
+ // Claude Code: ~/.claude/
45
+ const claudeDir = path.join(home, '.claude');
46
+ if (fs.existsSync(claudeDir)) {
47
+ agents.push({
48
+ type: 'claude',
49
+ name: 'Claude Code',
50
+ configDir: claudeDir,
51
+ });
52
+ }
53
+ // Cursor: ~/.cursor/ or platform-specific paths
54
+ const cursorPaths = [
55
+ path.join(home, '.cursor'),
56
+ // macOS
57
+ path.join(home, 'Library', 'Application Support', 'Cursor'),
58
+ // Linux
59
+ path.join(home, '.config', 'Cursor'),
60
+ ];
61
+ for (const cursorDir of cursorPaths) {
62
+ if (fs.existsSync(cursorDir)) {
63
+ agents.push({
64
+ type: 'cursor',
65
+ name: 'Cursor',
66
+ configDir: cursorDir,
67
+ });
68
+ break;
69
+ }
70
+ }
71
+ return agents;
72
+ }
73
+ function isAgentInstalled(type) {
74
+ return detectAgents().some((a) => a.type === type);
75
+ }
76
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/agents/detect.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,oCAmCC;AAED,4CAEC;AAnDD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAUzB,SAAgB,YAAY;IAC1B,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE1B,0BAA0B;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,MAAM,WAAW,GAAG;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QAC1B,QAAQ;QACR,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,CAAC;QAC3D,QAAQ;QACR,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;KACrC,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;QACpC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,SAAS;aACrB,CAAC,CAAC;YACH,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAe;IAC9C,OAAO,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface Credentials {
2
+ api_key: string;
3
+ email: string;
4
+ agent_id: string;
5
+ api_base: string;
6
+ }
7
+ export declare function getCredentials(): Credentials | null;
8
+ export declare function saveCredentials(creds: Credentials): void;
9
+ export declare function clearCredentials(): void;
10
+ export declare function getApiKey(): string | null;
11
+ export declare function getApiBase(): string;
12
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAcnD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CASxD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAQvC;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAGzC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAGnC"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getCredentials = getCredentials;
37
+ exports.saveCredentials = saveCredentials;
38
+ exports.clearCredentials = clearCredentials;
39
+ exports.getApiKey = getApiKey;
40
+ exports.getApiBase = getApiBase;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const os = __importStar(require("os"));
44
+ const config_1 = require("../config");
45
+ const CREDENTIALS_DIR = path.join(os.homedir(), '.gooseworks');
46
+ const CREDENTIALS_FILE = path.join(CREDENTIALS_DIR, 'credentials.json');
47
+ function getCredentials() {
48
+ try {
49
+ if (!fs.existsSync(CREDENTIALS_FILE)) {
50
+ return null;
51
+ }
52
+ const raw = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');
53
+ const parsed = JSON.parse(raw);
54
+ if (!parsed.api_key || !parsed.email || !parsed.agent_id) {
55
+ return null;
56
+ }
57
+ return parsed;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ function saveCredentials(creds) {
64
+ if (!fs.existsSync(CREDENTIALS_DIR)) {
65
+ fs.mkdirSync(CREDENTIALS_DIR, { mode: 0o700, recursive: true });
66
+ }
67
+ fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2) + '\n', { mode: 0o600 });
68
+ }
69
+ function clearCredentials() {
70
+ try {
71
+ if (fs.existsSync(CREDENTIALS_FILE)) {
72
+ fs.unlinkSync(CREDENTIALS_FILE);
73
+ }
74
+ }
75
+ catch {
76
+ // Ignore errors during cleanup
77
+ }
78
+ }
79
+ function getApiKey() {
80
+ const creds = getCredentials();
81
+ return creds?.api_key ?? null;
82
+ }
83
+ function getApiBase() {
84
+ const creds = getCredentials();
85
+ return creds?.api_base ?? config_1.API_BASE;
86
+ }
87
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,wCAcC;AAED,0CASC;AAED,4CAQC;AAED,8BAGC;AAED,gCAGC;AA5DD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,sCAAqC;AASrC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;AAExE,SAAgB,cAAc;IAC5B,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAqB,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,KAAkB;IAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,EAAE,CAAC,aAAa,CACd,gBAAgB,EAChB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACrC,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB;IAC9B,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC;AAED,SAAgB,SAAS;IACvB,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,OAAO,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC;AAChC,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,OAAO,KAAK,EAAE,QAAQ,IAAI,iBAAQ,CAAC;AACrC,CAAC"}
@@ -0,0 +1,8 @@
1
+ interface OAuthResult {
2
+ api_key: string;
3
+ email: string;
4
+ agent_id: string;
5
+ }
6
+ export declare function runOAuthFlow(apiBase: string): Promise<OAuthResult>;
7
+ export {};
8
+ //# sourceMappingURL=oauth-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-server.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-server.ts"],"names":[],"mappings":"AAUA,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAkGxE"}