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.
- package/README.md +180 -0
- package/dist/agents/claude.d.ts +4 -0
- package/dist/agents/claude.d.ts.map +1 -0
- package/dist/agents/claude.js +112 -0
- package/dist/agents/claude.js.map +1 -0
- package/dist/agents/cursor.d.ts +3 -0
- package/dist/agents/cursor.d.ts.map +1 -0
- package/dist/agents/cursor.js +95 -0
- package/dist/agents/cursor.js.map +1 -0
- package/dist/agents/detect.d.ts +9 -0
- package/dist/agents/detect.d.ts.map +1 -0
- package/dist/agents/detect.js +76 -0
- package/dist/agents/detect.js.map +1 -0
- package/dist/auth/credentials.d.ts +12 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +87 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/auth/oauth-server.d.ts +8 -0
- package/dist/auth/oauth-server.d.ts.map +1 -0
- package/dist/auth/oauth-server.js +132 -0
- package/dist/auth/oauth-server.js.map +1 -0
- package/dist/commands/credits.d.ts +3 -0
- package/dist/commands/credits.d.ts.map +1 -0
- package/dist/commands/credits.js +91 -0
- package/dist/commands/credits.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +104 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +79 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +51 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +122 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +64 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/skills/fetcher.d.ts +18 -0
- package/dist/skills/fetcher.d.ts.map +1 -0
- package/dist/skills/fetcher.js +118 -0
- package/dist/skills/fetcher.js.map +1 -0
- package/dist/skills/installer.d.ts +5 -0
- package/dist/skills/installer.d.ts.map +1 -0
- package/dist/skills/installer.js +72 -0
- package/dist/skills/installer.js.map +1 -0
- package/dist/skills/master-skill.d.ts +7 -0
- package/dist/skills/master-skill.d.ts.map +1 -0
- package/dist/skills/master-skill.js +84 -0
- package/dist/skills/master-skill.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +44 -0
- package/dist/utils/logger.js.map +1 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|