gooseworks 0.4.4 → 0.4.5-dev.15.facf60fb
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 +42 -11
- package/dist/agents/staging.d.ts +38 -0
- package/dist/agents/staging.d.ts.map +1 -0
- package/dist/agents/staging.js +309 -0
- package/dist/agents/staging.js.map +1 -0
- package/dist/auth/credentials.d.ts +1 -0
- package/dist/auth/credentials.d.ts.map +1 -1
- package/dist/auth/credentials.js +26 -8
- package/dist/auth/credentials.js.map +1 -1
- package/dist/auth/device-flow.d.ts +79 -0
- package/dist/auth/device-flow.d.ts.map +1 -0
- package/dist/auth/device-flow.js +411 -0
- package/dist/auth/device-flow.js.map +1 -0
- package/dist/auth/login-mode.d.ts +25 -0
- package/dist/auth/login-mode.d.ts.map +1 -0
- package/dist/auth/login-mode.js +87 -0
- package/dist/auth/login-mode.js.map +1 -0
- package/dist/auth/oauth-server.d.ts +2 -2
- package/dist/auth/oauth-server.d.ts.map +1 -1
- package/dist/auth/oauth-server.js +28 -5
- package/dist/auth/oauth-server.js.map +1 -1
- package/dist/auth/paste-login.d.ts +27 -0
- package/dist/auth/paste-login.d.ts.map +1 -0
- package/dist/auth/paste-login.js +203 -0
- package/dist/auth/paste-login.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +17 -8
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/formats.js +2 -2
- package/dist/commands/formats.js.map +1 -1
- package/dist/commands/graphics/publish-flow.js +1 -1
- package/dist/commands/graphics/publish-flow.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +101 -34
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/launch.d.ts +3 -0
- package/dist/commands/launch.d.ts.map +1 -0
- package/dist/commands/launch.js +35 -0
- package/dist/commands/launch.js.map +1 -0
- package/dist/commands/login.d.ts +21 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +106 -29
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +7 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/skills.d.ts +16 -0
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +52 -1
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/styles.js +2 -2
- package/dist/commands/styles.js.map +1 -1
- package/dist/commands/tool.d.ts +17 -0
- package/dist/commands/tool.d.ts.map +1 -0
- package/dist/commands/tool.js +239 -0
- package/dist/commands/tool.js.map +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +20 -0
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/video-local.d.ts.map +1 -1
- package/dist/commands/video-local.js +2 -2
- package/dist/commands/video-local.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -3
- package/dist/config.js.map +1 -1
- package/dist/environment.d.ts +9 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +105 -0
- package/dist/environment.js.map +1 -0
- package/dist/index.js +12 -45
- package/dist/index.js.map +1 -1
- package/dist/lib/graphics-cache.d.ts.map +1 -1
- package/dist/lib/graphics-cache.js +2 -2
- package/dist/lib/graphics-cache.js.map +1 -1
- package/dist/lib/mcp-client.d.ts +53 -0
- package/dist/lib/mcp-client.d.ts.map +1 -0
- package/dist/lib/mcp-client.js +196 -0
- package/dist/lib/mcp-client.js.map +1 -0
- package/dist/program.d.ts +2 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +56 -0
- package/dist/program.js.map +1 -0
- package/dist/skills/custom-video-skill.d.ts +1 -1
- package/dist/skills/custom-video-skill.d.ts.map +1 -1
- package/dist/skills/custom-video-skill.js +1 -1
- package/dist/skills/custom-video-skill.js.map +1 -1
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +42 -24
- package/dist/skills/installer.js.map +1 -1
- package/dist/skills/master-skill.d.ts +12 -9
- package/dist/skills/master-skill.d.ts.map +1 -1
- package/dist/skills/master-skill.js +857 -372
- package/dist/skills/master-skill.js.map +1 -1
- package/dist/skills/releases.d.ts +1 -1
- package/dist/skills/releases.d.ts.map +1 -1
- package/dist/skills/releases.js +8 -5
- package/dist/skills/releases.js.map +1 -1
- package/dist/skills/routes.js +8 -8
- package/dist/skills/routes.js.map +1 -1
- package/dist/skills/staging-content.d.ts +3 -0
- package/dist/skills/staging-content.d.ts.map +1 -0
- package/dist/skills/staging-content.js +12 -0
- package/dist/skills/staging-content.js.map +1 -0
- package/dist/utils/http.d.ts +7 -1
- package/dist/utils/http.d.ts.map +1 -1
- package/dist/utils/http.js +5 -1
- package/dist/utils/http.js.map +1 -1
- package/package.json +12 -4
- package/skills/goose-ads/SKILL.md +386 -224
- package/skills/goose-product-photos/SKILL.md +107 -58
- package/skills/goose-video/SKILL.md +300 -36
- package/skills/goose-video-local/SKILL.md +239 -31
- package/skills/gooseworks/SKILL.md +133 -26
- package/skills/make-custom-video/SKILL.md +256 -11
- package/skills/manifest.json +7 -7
- package/skills/routes.json +8 -8
- package/dist/skills/fetcher.d.ts +0 -18
- package/dist/skills/fetcher.d.ts.map +0 -1
- package/dist/skills/fetcher.js +0 -118
- package/dist/skills/fetcher.js.map +0 -1
package/README.md
CHANGED
|
@@ -4,27 +4,44 @@ Put your AI agent on the growth team. GooseWorks gives Claude Code, Cursor, and
|
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**Paste this into your agent** (Claude Code, Cursor, Codex, or a chat app like Claude or ChatGPT):
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Install gooseworks: https://gooseworks.ai/install.md
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Your agent reads that page and follows it. The page is short and you can read it too. It makes the agent:
|
|
14
|
+
|
|
15
|
+
1. **Ask you first.** It says exactly what it will install and waits for your OK. The install touches your agent's skills folder, its MCP config and `~/.gooseworks/credentials.json`, nothing else, and only ever runs `npx gooseworks@latest …`.
|
|
16
|
+
2. **Install** the GooseWorks skills and register the `gooseworks` MCP server with the right flag for your agent (`--claude`, `--cursor`, `--codex`), always with `--mcp`.
|
|
17
|
+
3. **Sign you in** with Google in your browser (the URL is always printed too).
|
|
18
|
+
4. **Check the install** with `npx gooseworks@latest doctor` and tell you to restart the agent so the MCP tools load.
|
|
19
|
+
5. **Set up your company** after the restart: it asks for your website and saves what it learns as a reusable **Company Brain** that improves every later research, creative, and growth task.
|
|
20
|
+
|
|
21
|
+
Want a specific skill too? Say so: `Install gooseworks: https://gooseworks.ai/install.md, including the goose-graphics skill.`
|
|
22
|
+
|
|
23
|
+
If your agent cannot run terminal commands (claude.ai, ChatGPT), the page tells it to give you the MCP connector address (`https://mcp.gooseworks.ai/mcp`) instead.
|
|
24
|
+
|
|
25
|
+
### Run it yourself
|
|
26
|
+
|
|
27
|
+
Prefer the terminal? Pick your agent (keep `--mcp`; `--all` includes it):
|
|
8
28
|
|
|
9
29
|
```bash
|
|
10
30
|
# Claude Code
|
|
11
|
-
npx gooseworks install --claude --mcp
|
|
12
|
-
npx gooseworks install --claude --mcp --with goose-graphics
|
|
31
|
+
npx gooseworks@latest install --claude --mcp
|
|
32
|
+
npx gooseworks@latest install --claude --mcp --with goose-graphics
|
|
13
33
|
|
|
14
34
|
# Cursor
|
|
15
|
-
npx gooseworks install --cursor --mcp
|
|
35
|
+
npx gooseworks@latest install --cursor --mcp
|
|
16
36
|
|
|
17
37
|
# Codex
|
|
18
|
-
npx gooseworks install --codex --mcp
|
|
38
|
+
npx gooseworks@latest install --codex --mcp
|
|
19
39
|
|
|
20
40
|
# All detected agents
|
|
21
|
-
npx gooseworks install --all
|
|
41
|
+
npx gooseworks@latest install --all
|
|
22
42
|
```
|
|
23
43
|
|
|
24
|
-
|
|
25
|
-
1. Opens browser for Google sign-in
|
|
26
|
-
2. Installs the GooseWorks skill into your coding agent
|
|
27
|
-
3. You're ready — ask your agent to "scrape reddit", "find leads", "research competitors", or "create product photos"
|
|
44
|
+
Restart your coding agent afterwards (MCP servers are only read at startup), then ask it to "scrape reddit", "find leads", "research competitors", or "create product photos".
|
|
28
45
|
|
|
29
46
|
You do not need a special onboarding command. Ask GooseWorks to do a normal task, or say:
|
|
30
47
|
|
|
@@ -90,7 +107,9 @@ npx gooseworks login
|
|
|
90
107
|
3. You sign in with Google
|
|
91
108
|
4. Token saved to `~/.gooseworks/credentials.json`
|
|
92
109
|
|
|
93
|
-
Timeout:
|
|
110
|
+
Timeout: 5 minutes. The sign-in link is always printed, so you can open it yourself if no browser opens.
|
|
111
|
+
|
|
112
|
+
**Cloud agents, SSH and CI** (the browser is on another device): run `npx gooseworks login --device`. It prints a link and a code; open the link on any device, sign in and tap **Approve**, and the CLI finishes on its own. The CLI picks this mode by itself over SSH, in CI, in containers and on Linux with no display (`--browser` forces the browser flow). Agents whose shell only shows output when a command exits should add `--no-wait`: it prints the link and exits, and the next `gooseworks login` or `gooseworks install --skills-only` finishes the sign-in once you approve.
|
|
94
113
|
|
|
95
114
|
### `logout`
|
|
96
115
|
|
|
@@ -218,6 +237,18 @@ npx gooseworks call scrapecreators /v1/facebook/adLibrary/search/ads \
|
|
|
218
237
|
--body='{"query":"running shoes","country":"US"}'
|
|
219
238
|
```
|
|
220
239
|
|
|
240
|
+
### `tool`
|
|
241
|
+
|
|
242
|
+
Call any GooseWorks tool (the same tools the GooseWorks MCP connector gives an agent) with your saved sign-in. It's meant for agents that have a shell but no connector, such as a cloud sandbox in ChatGPT agent, Meta AI or Grok:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
npx gooseworks tool --list # the server's rules + every tool
|
|
246
|
+
npx gooseworks tool brand_onboarding --schema # one tool's arguments
|
|
247
|
+
npx gooseworks tool brand_onboarding '{"action":"status"}' # call it
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
The result prints as JSON (`--json` prints the raw MCP result). Arguments can also come from a file (`--file args.json`) or stdin (`-`). It exits 1 when the tool reports an error. Paid tools follow the same rules as over the connector.
|
|
251
|
+
|
|
221
252
|
## Security & data handling
|
|
222
253
|
|
|
223
254
|
We'd rather you know exactly what this CLI does before you run it:
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export { stagingContent } from '../skills/staging-content';
|
|
2
|
+
export type StagingAgent = 'claude' | 'codex';
|
|
3
|
+
interface Manifest {
|
|
4
|
+
environment: 'staging';
|
|
5
|
+
project: string;
|
|
6
|
+
version: string;
|
|
7
|
+
sourceBranch: 'dev';
|
|
8
|
+
sourceRevision: string | null;
|
|
9
|
+
mcpEndpoint: string;
|
|
10
|
+
agents: StagingAgent[];
|
|
11
|
+
skills: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
export declare function projectProfile(project: string): {
|
|
14
|
+
project: string;
|
|
15
|
+
root: string;
|
|
16
|
+
home: string;
|
|
17
|
+
manifest: string;
|
|
18
|
+
};
|
|
19
|
+
/** Project/parent customizations could reintroduce a production plugin or MCP. */
|
|
20
|
+
export declare function assertCleanProject(project: string): void;
|
|
21
|
+
export declare function installStagingProject(project: string, agents: string[]): Manifest;
|
|
22
|
+
export declare function stagingLaunch(project: string, agent: string): {
|
|
23
|
+
command: string;
|
|
24
|
+
args: string[];
|
|
25
|
+
cwd: string;
|
|
26
|
+
env: NodeJS.ProcessEnv;
|
|
27
|
+
home: string;
|
|
28
|
+
manifest: Manifest;
|
|
29
|
+
};
|
|
30
|
+
/** Read Claude's startup event and stop before a model request (no provider credential needed). */
|
|
31
|
+
export declare function inspectClaudeSkills(launch: ReturnType<typeof stagingLaunch>): Promise<string[]>;
|
|
32
|
+
/** Real, free Codex discovery. Refuse incompatible versions before starting a session. */
|
|
33
|
+
export declare function inspectCodexSkills(launch: ReturnType<typeof stagingLaunch>): Promise<Array<{
|
|
34
|
+
name: string;
|
|
35
|
+
path: string;
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
}>>;
|
|
38
|
+
//# sourceMappingURL=staging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staging.d.ts","sourceRoot":"","sources":["../../src/agents/staging.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC9C,UAAU,QAAQ;IAAG,WAAW,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,KAAK,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAAE;AAGjN,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAMjH;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAWxD;AAQD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CA+BjF;AAYD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CA0BxK;AAiBD,mGAAmG;AACnG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA2B/F;AAED,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CA8C7I"}
|
|
@@ -0,0 +1,309 @@
|
|
|
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.stagingContent = void 0;
|
|
37
|
+
exports.projectProfile = projectProfile;
|
|
38
|
+
exports.assertCleanProject = assertCleanProject;
|
|
39
|
+
exports.installStagingProject = installStagingProject;
|
|
40
|
+
exports.stagingLaunch = stagingLaunch;
|
|
41
|
+
exports.inspectClaudeSkills = inspectClaudeSkills;
|
|
42
|
+
exports.inspectCodexSkills = inspectCodexSkills;
|
|
43
|
+
const fs = __importStar(require("node:fs"));
|
|
44
|
+
const path = __importStar(require("node:path"));
|
|
45
|
+
const os = __importStar(require("node:os"));
|
|
46
|
+
const node_crypto_1 = require("node:crypto");
|
|
47
|
+
const node_child_process_1 = require("node:child_process");
|
|
48
|
+
const credentials_1 = require("../auth/credentials");
|
|
49
|
+
const environment_1 = require("../environment");
|
|
50
|
+
const installer_1 = require("../skills/installer");
|
|
51
|
+
const version_1 = require("../version");
|
|
52
|
+
var staging_content_1 = require("../skills/staging-content");
|
|
53
|
+
Object.defineProperty(exports, "stagingContent", { enumerable: true, get: function () { return staging_content_1.stagingContent; } });
|
|
54
|
+
const hash = (value) => (0, node_crypto_1.createHash)('sha256').update(value).digest('hex');
|
|
55
|
+
function projectProfile(project) {
|
|
56
|
+
if (!project)
|
|
57
|
+
throw new Error('Staging requires --project <folder>');
|
|
58
|
+
const resolved = fs.realpathSync(path.resolve(project));
|
|
59
|
+
if (!fs.statSync(resolved).isDirectory())
|
|
60
|
+
throw new Error('--project must be a directory');
|
|
61
|
+
const root = path.join((0, environment_1.profileRoot)(), 'projects', hash(resolved).slice(0, 20));
|
|
62
|
+
return { project: resolved, root, home: path.join(root, 'home'), manifest: path.join(root, 'manifest.json') };
|
|
63
|
+
}
|
|
64
|
+
/** Project/parent customizations could reintroduce a production plugin or MCP. */
|
|
65
|
+
function assertCleanProject(project) {
|
|
66
|
+
const userHome = fs.realpathSync(process.env.GOOSEWORKS_USER_HOME || os.homedir());
|
|
67
|
+
for (let dir = project;; dir = path.dirname(dir)) {
|
|
68
|
+
// User-global roots are excluded by the child home; they must stay installed.
|
|
69
|
+
if (dir !== userHome) {
|
|
70
|
+
for (const name of ['.claude', '.codex', '.agents', '.cursor', '.mcp.json']) {
|
|
71
|
+
if (fs.existsSync(path.join(dir, name)))
|
|
72
|
+
throw new Error(`Staging cannot safely load project customization ${path.join(dir, name)}. Use a clean test folder outside that project tree.`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (path.dirname(dir) === dir)
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function privateWrite(file, body, mode = 0o600) {
|
|
80
|
+
fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
81
|
+
if (fs.lstatSync(file, { throwIfNoEntry: false })?.isSymbolicLink())
|
|
82
|
+
throw new Error(`Refusing linked staging config: ${file}`);
|
|
83
|
+
fs.writeFileSync(file, body, { mode });
|
|
84
|
+
fs.chmodSync(file, mode);
|
|
85
|
+
}
|
|
86
|
+
function installStagingProject(project, agents) {
|
|
87
|
+
if ((0, environment_1.getEnvironment)() !== 'staging')
|
|
88
|
+
throw new Error('Project isolation is available with --env staging');
|
|
89
|
+
if (!agents.length || agents.some(agent => !['claude', 'codex'].includes(agent)))
|
|
90
|
+
throw new Error('Staging supports --claude and --codex. Cursor staging is refused until its skill isolation can be verified.');
|
|
91
|
+
const profile = projectProfile(project);
|
|
92
|
+
assertCleanProject(profile.project);
|
|
93
|
+
if (fs.existsSync(profile.manifest)) {
|
|
94
|
+
const previous = JSON.parse(fs.readFileSync(profile.manifest, 'utf8'));
|
|
95
|
+
for (const agent of previous.agents)
|
|
96
|
+
stagingLaunch(project, agent);
|
|
97
|
+
}
|
|
98
|
+
const credentials = (0, credentials_1.getCredentials)();
|
|
99
|
+
if (!credentials?.mcp_server_url)
|
|
100
|
+
throw new Error('Staging requires a staging GooseWorks login with an MCP connection. Run gooseworks --env staging login.');
|
|
101
|
+
const skills = {};
|
|
102
|
+
const source = (0, installer_1.getSkillsBasePath)();
|
|
103
|
+
for (const name of fs.readdirSync(source)) {
|
|
104
|
+
if (name.startsWith('.'))
|
|
105
|
+
continue;
|
|
106
|
+
const directory = path.join(source, name);
|
|
107
|
+
if (!fs.statSync(directory).isDirectory() || !fs.existsSync(path.join(directory, 'SKILL.md')))
|
|
108
|
+
continue;
|
|
109
|
+
if (fs.lstatSync(directory).isSymbolicLink())
|
|
110
|
+
throw new Error(`Linked staging package refused: ${name}`);
|
|
111
|
+
for (const agent of agents) {
|
|
112
|
+
const target = path.join(profile.home, `.${agent}`, 'skills', name);
|
|
113
|
+
// Refuse edits instead of silently destroying previously tested instructions.
|
|
114
|
+
if (fs.existsSync(target))
|
|
115
|
+
fs.rmSync(target, { recursive: true });
|
|
116
|
+
fs.cpSync(directory, target, { recursive: true, dereference: false });
|
|
117
|
+
}
|
|
118
|
+
skills[name] = treeHash(directory);
|
|
119
|
+
}
|
|
120
|
+
if (!skills.gooseworks)
|
|
121
|
+
throw new Error('Install the bundled staging entry skills first');
|
|
122
|
+
const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname, '..', '..', 'package.json'), 'utf8'));
|
|
123
|
+
const manifest = { environment: 'staging', project: profile.project, version: (0, version_1.getVersion)(), sourceBranch: 'dev', sourceRevision: pkg.gooseworksRelease?.commit || null, mcpEndpoint: credentials.mcp_server_url, agents: agents, skills };
|
|
124
|
+
privateWrite(profile.manifest, JSON.stringify(manifest, null, 2) + '\n');
|
|
125
|
+
writeConnections(profile.home, credentials);
|
|
126
|
+
return manifest;
|
|
127
|
+
}
|
|
128
|
+
function writeConnections(home, credentials) {
|
|
129
|
+
const endpoint = credentials.mcp_server_url.replace(/\/$/, '');
|
|
130
|
+
const url = endpoint.endsWith('/mcp') ? endpoint : `${endpoint}/mcp`;
|
|
131
|
+
privateWrite(path.join(home, 'mcp.json'), JSON.stringify({ mcpServers: { 'gooseworks-staging': { type: 'http', url, headers: { Authorization: `Bearer ${credentials.api_key}` } } } }));
|
|
132
|
+
// Codex shells can otherwise filter custom environment variables or reset PATH.
|
|
133
|
+
const pinned = { HOME: home, GOOSEWORKS_USER_HOME: process.env.GOOSEWORKS_USER_HOME || os.homedir(), GOOSEWORKS_SESSION_ENV: 'staging', GOOSEWORKS_API_BASE: credentials.api_base, PATH: `${path.join(home, 'bin')}${path.delimiter}${process.env.PATH || ''}` };
|
|
134
|
+
const shell = Object.entries(pinned).map(([key, value]) => `${key} = ${JSON.stringify(value)}`).join('\n');
|
|
135
|
+
privateWrite(path.join(home, '.codex', 'config.toml'), `allow_login_shell = false\n[shell_environment_policy]\ninherit = "all"\n[shell_environment_policy.set]\n${shell}\n[mcp_servers.gooseworks-staging]\nurl = ${JSON.stringify(url)}\n[mcp_servers.gooseworks-staging.http_headers]\nAuthorization = ${JSON.stringify(`Bearer ${credentials.api_key}`)}\n`);
|
|
136
|
+
}
|
|
137
|
+
function stagingLaunch(project, agent) {
|
|
138
|
+
if (!['claude', 'codex'].includes(agent))
|
|
139
|
+
throw new Error('Use --agent claude or --agent codex for an isolated staging session');
|
|
140
|
+
const profile = projectProfile(project);
|
|
141
|
+
assertCleanProject(profile.project);
|
|
142
|
+
const manifest = JSON.parse(fs.readFileSync(profile.manifest, 'utf8'));
|
|
143
|
+
if (manifest.environment !== 'staging' || manifest.project !== profile.project || !manifest.agents.includes(agent))
|
|
144
|
+
throw new Error('Project/environment mismatch. Install staging for this project and agent first.');
|
|
145
|
+
const root = path.join(profile.home, `.${agent}`, 'skills');
|
|
146
|
+
const actual = fs.readdirSync(root).filter(name => !name.startsWith('.'));
|
|
147
|
+
if (actual.length !== Object.keys(manifest.skills).length)
|
|
148
|
+
throw new Error('Unexpected skill in staging profile; reinstall into a fresh test folder');
|
|
149
|
+
for (const [name, expected] of Object.entries(manifest.skills)) {
|
|
150
|
+
const file = path.join(root, name, 'SKILL.md');
|
|
151
|
+
if (treeHash(path.dirname(file)) !== expected)
|
|
152
|
+
throw new Error(`Staging skill changed or linked: ${name}. Review it and install into a fresh test folder.`);
|
|
153
|
+
}
|
|
154
|
+
const credentials = (0, credentials_1.getCredentials)();
|
|
155
|
+
if (!credentials?.mcp_server_url)
|
|
156
|
+
throw new Error('Sign in to staging again before launching');
|
|
157
|
+
writeConnections(profile.home, credentials);
|
|
158
|
+
const env = { ...process.env };
|
|
159
|
+
// Do not carry production Goose tokens, custom provider homes, or daemon handles.
|
|
160
|
+
for (const key of Object.keys(env))
|
|
161
|
+
if (/^(GOOSEWORKS_|CODEX_|CLAUDE_|CLAUDECODE$|CURSOR_|XDG_)/.test(key))
|
|
162
|
+
delete env[key];
|
|
163
|
+
Object.assign(env, { HOME: profile.home, USERPROFILE: profile.home, XDG_CONFIG_HOME: path.join(profile.home, '.config'), XDG_DATA_HOME: path.join(profile.home, '.local', 'share'), CODEX_HOME: path.join(profile.home, '.codex'), CLAUDE_CONFIG_DIR: path.join(profile.home, '.claude'), GOOSEWORKS_USER_HOME: process.env.GOOSEWORKS_USER_HOME || os.homedir(), GOOSEWORKS_SESSION_ENV: 'staging', GOOSEWORKS_API_BASE: credentials.api_base });
|
|
164
|
+
// Use this exact CLI build inside the agent, even if its PATH has an older global CLI.
|
|
165
|
+
const bin = path.join(profile.home, 'bin');
|
|
166
|
+
if (process.platform === 'win32')
|
|
167
|
+
throw new Error('Isolated staging launch currently requires macOS or Linux');
|
|
168
|
+
const quote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
|
|
169
|
+
privateWrite(path.join(bin, 'gooseworks'), `#!/bin/sh\nGOOSEWORKS_SESSION_ENV=staging\nexport GOOSEWORKS_SESSION_ENV\nexec ${quote(process.execPath)} ${quote(path.resolve(__dirname, '..', 'index.js'))} "$@"\n`, 0o700);
|
|
170
|
+
env.PATH = `${bin}${path.delimiter}${process.env.PATH || ''}`;
|
|
171
|
+
return { command: agent, cwd: profile.project, env, home: profile.home, manifest, args: agent === 'claude' ? ['--setting-sources', 'user', '--strict-mcp-config', '--mcp-config', path.join(profile.home, 'mcp.json')] : ['--cd', profile.project] };
|
|
172
|
+
}
|
|
173
|
+
function treeHash(directory) {
|
|
174
|
+
const digest = (0, node_crypto_1.createHash)('sha256');
|
|
175
|
+
function visit(dir) {
|
|
176
|
+
for (const name of fs.readdirSync(dir).sort()) {
|
|
177
|
+
const file = path.join(dir, name);
|
|
178
|
+
const stat = fs.lstatSync(file);
|
|
179
|
+
if (stat.isSymbolicLink())
|
|
180
|
+
throw new Error(`Linked staging package file refused: ${file}`);
|
|
181
|
+
digest.update(path.relative(directory, file) + '\0');
|
|
182
|
+
if (stat.isDirectory())
|
|
183
|
+
visit(file);
|
|
184
|
+
else if (stat.isFile())
|
|
185
|
+
digest.update(fs.readFileSync(file));
|
|
186
|
+
else
|
|
187
|
+
throw new Error(`Unsupported staging package file: ${file}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
visit(directory);
|
|
191
|
+
return digest.digest('hex');
|
|
192
|
+
}
|
|
193
|
+
/** Read Claude's startup event and stop before a model request (no provider credential needed). */
|
|
194
|
+
function inspectClaudeSkills(launch) {
|
|
195
|
+
return new Promise((resolve, reject) => {
|
|
196
|
+
const env = { ...launch.env, ANTHROPIC_API_KEY: 'sk-ant-gooseworks-inventory-invalid-key' };
|
|
197
|
+
// Inventory must never use a real billable provider connection.
|
|
198
|
+
for (const key of Object.keys(env))
|
|
199
|
+
if (/^(ANTHROPIC_AUTH_TOKEN|ANTHROPIC_BASE_URL|CLAUDE_CODE_USE_|AWS_|GOOGLE_|AZURE_)/.test(key))
|
|
200
|
+
delete env[key];
|
|
201
|
+
const child = (0, node_child_process_1.spawn)('claude', [...launch.args, '-p', '--input-format', 'stream-json', '--output-format', 'stream-json', '--verbose'], { cwd: launch.cwd, env, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
202
|
+
let finished = false;
|
|
203
|
+
let buffer = '';
|
|
204
|
+
const finish = (error, skills) => { if (finished)
|
|
205
|
+
return; finished = true; clearTimeout(timer); child.kill(); error ? reject(error) : resolve(skills); };
|
|
206
|
+
const timer = setTimeout(() => finish(new Error('Claude startup inventory timed out; update Claude and retry')), 30000);
|
|
207
|
+
child.on('error', error => finish(error));
|
|
208
|
+
child.on('exit', () => { if (!finished)
|
|
209
|
+
finish(new Error('Claude did not provide its skill inventory; update Claude')); });
|
|
210
|
+
child.stderr.on('data', () => undefined);
|
|
211
|
+
child.stdout.on('data', data => {
|
|
212
|
+
buffer += data;
|
|
213
|
+
if (buffer.length > 2 * 1024 * 1024)
|
|
214
|
+
return finish(new Error('Invalid Claude startup event'));
|
|
215
|
+
let end;
|
|
216
|
+
while ((end = buffer.indexOf('\n')) >= 0) {
|
|
217
|
+
let message;
|
|
218
|
+
try {
|
|
219
|
+
message = JSON.parse(buffer.slice(0, end));
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
buffer = buffer.slice(end + 1);
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
buffer = buffer.slice(end + 1);
|
|
226
|
+
if (message.type !== 'system' || message.subtype !== 'init')
|
|
227
|
+
continue;
|
|
228
|
+
if (!Array.isArray(message.skills) || !Array.isArray(message.plugins) || !Array.isArray(message.mcp_servers))
|
|
229
|
+
return finish(new Error('Incompatible Claude startup inventory'));
|
|
230
|
+
const expected = Object.keys(launch.manifest.skills);
|
|
231
|
+
if (expected.some(name => !message.skills.includes(name)) || message.skills.some((name) => /^(goose|make-custom-video)/.test(name) && !expected.includes(name)) || message.plugins.length || message.mcp_servers.some((server) => server.name !== 'gooseworks-staging'))
|
|
232
|
+
return finish(new Error('Claude loaded an unexpected skill, plugin, or MCP. Staging launch refused.'));
|
|
233
|
+
finish(undefined, message.skills);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
child.stdin.write(JSON.stringify({ type: 'user', message: { role: 'user', content: '/skills' } }) + '\n');
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/** Real, free Codex discovery. Refuse incompatible versions before starting a session. */
|
|
240
|
+
function inspectCodexSkills(launch) {
|
|
241
|
+
return new Promise((resolve, reject) => {
|
|
242
|
+
const child = (0, node_child_process_1.spawn)('codex', ['app-server'], { cwd: launch.cwd, env: launch.env, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
243
|
+
let buffer = '';
|
|
244
|
+
let finished = false;
|
|
245
|
+
let inventory;
|
|
246
|
+
let configVerified = false;
|
|
247
|
+
const finish = (error, skills) => { if (finished)
|
|
248
|
+
return; finished = true; clearTimeout(timer); child.kill(); error ? reject(error) : resolve(skills); };
|
|
249
|
+
const timer = setTimeout(() => finish(new Error('Codex skill isolation check timed out; update Codex and retry')), 15000);
|
|
250
|
+
child.on('error', error => finish(error));
|
|
251
|
+
child.on('exit', () => { if (!finished)
|
|
252
|
+
finish(new Error('Codex does not support the staging inventory check; update Codex')); });
|
|
253
|
+
child.stderr.on('data', () => undefined);
|
|
254
|
+
child.stdout.on('data', data => {
|
|
255
|
+
buffer += data;
|
|
256
|
+
if (buffer.length > 2 * 1024 * 1024)
|
|
257
|
+
return finish(new Error('Invalid Codex inventory response'));
|
|
258
|
+
let end;
|
|
259
|
+
while ((end = buffer.indexOf('\n')) >= 0) {
|
|
260
|
+
const line = buffer.slice(0, end);
|
|
261
|
+
buffer = buffer.slice(end + 1);
|
|
262
|
+
let message;
|
|
263
|
+
try {
|
|
264
|
+
message = JSON.parse(line);
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
if (message.error)
|
|
270
|
+
return finish(new Error('Codex rejected the staging inventory check; update Codex'));
|
|
271
|
+
if (message.id === 1) {
|
|
272
|
+
child.stdin.write(JSON.stringify({ method: 'initialized' }) + '\n');
|
|
273
|
+
child.stdin.write(JSON.stringify({ id: 2, method: 'skills/list', params: { cwds: [launch.cwd], forceReload: true } }) + '\n');
|
|
274
|
+
child.stdin.write(JSON.stringify({ id: 3, method: 'config/read', params: { cwd: launch.cwd, includeLayers: false } }) + '\n');
|
|
275
|
+
}
|
|
276
|
+
if (message.id === 2) {
|
|
277
|
+
const rows = message.result?.data;
|
|
278
|
+
if (!Array.isArray(rows) || rows.some(row => row.errors?.length))
|
|
279
|
+
return finish(new Error('Could not read the complete Codex skill inventory'));
|
|
280
|
+
const skills = rows.flatMap(row => row.skills || []).filter(skill => skill.enabled);
|
|
281
|
+
const allowed = fs.realpathSync(launch.home) + path.sep;
|
|
282
|
+
if (skills.some(skill => !fs.realpathSync(skill.path).startsWith(allowed)))
|
|
283
|
+
return finish(new Error('Codex discovered skills outside the staging profile. Launch refused.'));
|
|
284
|
+
const names = new Set(skills.map(skill => skill.name));
|
|
285
|
+
if (Object.keys(launch.manifest.skills).some(name => !names.has(name)))
|
|
286
|
+
return finish(new Error('Codex did not load all staging skills. Launch refused.'));
|
|
287
|
+
inventory = skills.map(skill => ({ name: skill.name, path: skill.path, enabled: skill.enabled }));
|
|
288
|
+
if (configVerified)
|
|
289
|
+
finish(undefined, inventory);
|
|
290
|
+
}
|
|
291
|
+
if (message.id === 3) {
|
|
292
|
+
const servers = message.result?.config?.mcp_servers;
|
|
293
|
+
const endpoint = launch.manifest.mcpEndpoint.replace(/\/$/, '');
|
|
294
|
+
const expectedUrl = endpoint.endsWith('/mcp') ? endpoint : `${endpoint}/mcp`;
|
|
295
|
+
if (!servers || Object.keys(servers).length !== 1 || !servers['gooseworks-staging'] || servers['gooseworks-staging'].url !== expectedUrl)
|
|
296
|
+
return finish(new Error('Codex effective MCP configuration is not isolated to staging. Launch refused.'));
|
|
297
|
+
const plugins = message.result?.config?.plugins;
|
|
298
|
+
if (plugins && Object.values(plugins).some((plugin) => plugin?.enabled !== false))
|
|
299
|
+
return finish(new Error('Codex loaded unexpected plugin configuration. Launch refused.'));
|
|
300
|
+
configVerified = true;
|
|
301
|
+
if (inventory)
|
|
302
|
+
finish(undefined, inventory);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
child.stdin.write(JSON.stringify({ id: 1, method: 'initialize', params: { clientInfo: { name: 'gooseworks-staging-check', version: (0, version_1.getVersion)() } } }) + '\n');
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=staging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staging.js","sourceRoot":"","sources":["../../src/agents/staging.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ export interface Credentials {
|
|
|
11
11
|
/** Base URL for the GooseWorks MCP server (e.g. http://localhost:6200 in dev). */
|
|
12
12
|
mcp_server_url?: string;
|
|
13
13
|
}
|
|
14
|
+
export declare function validateCredentials(creds: Credentials): void;
|
|
14
15
|
export declare function getCredentials(): Credentials | null;
|
|
15
16
|
export declare function saveCredentials(creds: Credentials): void;
|
|
16
17
|
export declare function clearCredentials(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAG5D;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAgBnD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAcxD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAUvC;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAGzC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAGnC"}
|
package/dist/auth/credentials.js
CHANGED
|
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.validateCredentials = validateCredentials;
|
|
36
37
|
exports.getCredentials = getCredentials;
|
|
37
38
|
exports.saveCredentials = saveCredentials;
|
|
38
39
|
exports.clearCredentials = clearCredentials;
|
|
@@ -42,35 +43,52 @@ const fs = __importStar(require("fs"));
|
|
|
42
43
|
const path = __importStar(require("path"));
|
|
43
44
|
const os = __importStar(require("os"));
|
|
44
45
|
const config_1 = require("../config");
|
|
45
|
-
const
|
|
46
|
-
|
|
46
|
+
const environment_1 = require("../environment");
|
|
47
|
+
function credentialsFile() { return path.join((0, environment_1.profileRoot)(), 'credentials.json'); }
|
|
48
|
+
const LEGACY_FILE = path.join(os.homedir(), '.gooseworks', 'credentials.json');
|
|
49
|
+
function validateCredentials(creds) {
|
|
50
|
+
(0, environment_1.assertConnection)(creds.api_base, 'api');
|
|
51
|
+
if (creds.mcp_server_url)
|
|
52
|
+
(0, environment_1.assertConnection)(creds.mcp_server_url, 'mcp');
|
|
53
|
+
}
|
|
47
54
|
function getCredentials() {
|
|
55
|
+
let parsed;
|
|
48
56
|
try {
|
|
49
|
-
|
|
57
|
+
const file = fs.existsSync(credentialsFile()) ? credentialsFile()
|
|
58
|
+
: (0, environment_1.getEnvironment)() === 'production' && fs.existsSync(LEGACY_FILE) ? LEGACY_FILE : null;
|
|
59
|
+
if (!file)
|
|
50
60
|
return null;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const parsed = JSON.parse(raw);
|
|
54
|
-
if (!parsed.api_key || !parsed.email || !parsed.agent_id) {
|
|
61
|
+
parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
62
|
+
if (!parsed.api_key || !parsed.email || !parsed.agent_id || !parsed.api_base) {
|
|
55
63
|
return null;
|
|
56
64
|
}
|
|
57
|
-
return parsed;
|
|
58
65
|
}
|
|
59
66
|
catch {
|
|
60
67
|
return null;
|
|
61
68
|
}
|
|
69
|
+
// A mismatched saved login is an error, never an excuse to use another profile.
|
|
70
|
+
validateCredentials(parsed);
|
|
71
|
+
return parsed;
|
|
62
72
|
}
|
|
63
73
|
function saveCredentials(creds) {
|
|
74
|
+
validateCredentials(creds);
|
|
75
|
+
const CREDENTIALS_DIR = (0, environment_1.profileRoot)();
|
|
76
|
+
const CREDENTIALS_FILE = credentialsFile();
|
|
64
77
|
if (!fs.existsSync(CREDENTIALS_DIR)) {
|
|
65
78
|
fs.mkdirSync(CREDENTIALS_DIR, { mode: 0o700, recursive: true });
|
|
66
79
|
}
|
|
67
80
|
fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2) + '\n', { mode: 0o600 });
|
|
81
|
+
fs.chmodSync(CREDENTIALS_DIR, 0o700);
|
|
82
|
+
fs.chmodSync(CREDENTIALS_FILE, 0o600);
|
|
68
83
|
}
|
|
69
84
|
function clearCredentials() {
|
|
85
|
+
const CREDENTIALS_FILE = credentialsFile();
|
|
70
86
|
try {
|
|
71
87
|
if (fs.existsSync(CREDENTIALS_FILE)) {
|
|
72
88
|
fs.unlinkSync(CREDENTIALS_FILE);
|
|
73
89
|
}
|
|
90
|
+
if ((0, environment_1.getEnvironment)() === 'production' && fs.existsSync(LEGACY_FILE))
|
|
91
|
+
fs.unlinkSync(LEGACY_FILE);
|
|
74
92
|
}
|
|
75
93
|
catch {
|
|
76
94
|
// Ignore errors during cleanup
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"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"}
|