cyrus-config-updater 0.2.63 → 0.2.64-test.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/dist/ConfigUpdater.d.ts +4 -0
- package/dist/ConfigUpdater.d.ts.map +1 -1
- package/dist/ConfigUpdater.js +8 -0
- package/dist/ConfigUpdater.js.map +1 -1
- package/dist/handlers/githubTokens.d.ts +31 -0
- package/dist/handlers/githubTokens.d.ts.map +1 -0
- package/dist/handlers/githubTokens.js +110 -0
- package/dist/handlers/githubTokens.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +18 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -1
- package/package.json +4 -3
- package/scripts/git-credential-cyrus.cjs +84 -0
package/dist/ConfigUpdater.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigUpdater.d.ts","sourceRoot":"","sources":["../src/ConfigUpdater.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfigUpdater.d.ts","sourceRoot":"","sources":["../src/ConfigUpdater.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAiC/C;;;;;;;GAOG;AACH,qBAAa,aAAa;IACzB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAe;gBAG/B,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,MAAM;IAOxB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAyBhB;;OAEG;IACH,OAAO,CAAC,aAAa;IA4BrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4BxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;YACW,sBAAsB;IAapC;;OAEG;YACW,mBAAmB;IAajC;;OAEG;YACW,qBAAqB;IAMnC;;OAEG;YACW,kBAAkB;IAMhC;;OAEG;YACW,uBAAuB;IAMrC;;OAEG;YACW,uBAAuB;IAMrC;;OAEG;YACW,kBAAkB;IAMhC;;OAEG;YACW,oBAAoB;IAMlC;;OAEG;YACW,2BAA2B;IAMzC;;OAEG;YACW,sBAAsB;IAMpC;;OAEG;YACW,sBAAsB;IAMpC;;OAEG;YACW,qBAAqB;CAKnC"}
|
package/dist/ConfigUpdater.js
CHANGED
|
@@ -3,6 +3,7 @@ import { handleCheckGlab } from "./handlers/checkGlab.js";
|
|
|
3
3
|
import { handleConfigureMcp } from "./handlers/configureMcp.js";
|
|
4
4
|
import { handleCyrusConfig } from "./handlers/cyrusConfig.js";
|
|
5
5
|
import { handleCyrusEnv } from "./handlers/cyrusEnv.js";
|
|
6
|
+
import { handleGitHubTokens } from "./handlers/githubTokens.js";
|
|
6
7
|
import { handleRepository, handleRepositoryDelete, } from "./handlers/repository.js";
|
|
7
8
|
import { handleDeleteSkill, handleListSkills, handleUpdateSkill, } from "./handlers/skills.js";
|
|
8
9
|
import { handleTestMcp } from "./handlers/testMcp.js";
|
|
@@ -34,6 +35,7 @@ export class ConfigUpdater {
|
|
|
34
35
|
this.registerDeleteRoute("/api/update/repository", this.handleRepositoryDeleteRoute);
|
|
35
36
|
this.registerRoute("/api/update/test-mcp", this.handleTestMcpRoute);
|
|
36
37
|
this.registerRoute("/api/update/configure-mcp", this.handleConfigureMcpRoute);
|
|
38
|
+
this.registerRoute("/api/update/github-tokens", this.handleGitHubTokensRoute);
|
|
37
39
|
this.registerRoute("/api/check-gh", this.handleCheckGhRoute);
|
|
38
40
|
this.registerRoute("/api/check-glab", this.handleCheckGlabRoute);
|
|
39
41
|
this.registerRoute("/api/update/skill", this.handleUpdateSkillRoute);
|
|
@@ -172,6 +174,12 @@ export class ConfigUpdater {
|
|
|
172
174
|
async handleConfigureMcpRoute(payload) {
|
|
173
175
|
return handleConfigureMcp(payload, this.cyrusHome);
|
|
174
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Handle GitHub installation tokens push
|
|
179
|
+
*/
|
|
180
|
+
async handleGitHubTokensRoute(payload) {
|
|
181
|
+
return handleGitHubTokens(payload, this.cyrusHome);
|
|
182
|
+
}
|
|
175
183
|
/**
|
|
176
184
|
* Handle GitHub CLI check
|
|
177
185
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigUpdater.js","sourceRoot":"","sources":["../src/ConfigUpdater.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACN,gBAAgB,EAChB,sBAAsB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfigUpdater.js","sourceRoot":"","sources":["../src/ConfigUpdater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ApiResponse } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Install the Cyrus git credential helper and wire it into the global git
|
|
4
|
+
* config for github.com. Idempotent — safe to run on every token push and
|
|
5
|
+
* on EdgeWorker startup.
|
|
6
|
+
*
|
|
7
|
+
* - Copies the self-contained helper script to
|
|
8
|
+
* `<cyrusHome>/scripts/git-credential-cyrus.cjs` (executable).
|
|
9
|
+
* - Enables `credential."https://github.com".useHttpPath` so git passes the
|
|
10
|
+
* repo path (and thus the org) to the helper.
|
|
11
|
+
* - Replaces any inherited helpers for github.com (e.g. gh's keyring helper)
|
|
12
|
+
* with an empty entry followed by the Cyrus helper. Helper values must be
|
|
13
|
+
* prefixed with `!` to invoke an arbitrary command — without it git would
|
|
14
|
+
* look for a `git credential-<name>` binary.
|
|
15
|
+
*
|
|
16
|
+
* Returns the absolute path of the installed helper script.
|
|
17
|
+
*/
|
|
18
|
+
export declare function ensureGitHubCredentialHelper(cyrusHome: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Handle a GitHub installation tokens push from cyrus-hosted.
|
|
21
|
+
*
|
|
22
|
+
* Persists the per-installation tokens to `<cyrusHome>/github-tokens.json`
|
|
23
|
+
* (atomically, mode 0600) and ensures the git credential helper is
|
|
24
|
+
* installed so concurrent git operations against different GitHub orgs
|
|
25
|
+
* each authenticate with the right token.
|
|
26
|
+
*
|
|
27
|
+
* @param rawPayload - Unvalidated payload from the request
|
|
28
|
+
* @param cyrusHome - Path to the Cyrus home directory
|
|
29
|
+
*/
|
|
30
|
+
export declare function handleGitHubTokens(rawPayload: unknown, cyrusHome: string): Promise<ApiResponse>;
|
|
31
|
+
//# sourceMappingURL=githubTokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubTokens.d.ts","sourceRoot":"","sources":["../../src/handlers/githubTokens.ts"],"names":[],"mappings":"AAKA,OAAO,EACN,KAAK,WAAW,EAGhB,MAAM,aAAa,CAAC;AAUrB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA6BtE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACvC,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CA4CtB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { chmodSync, copyFileSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { GitHubTokenStore } from "cyrus-core";
|
|
6
|
+
import { GitHubTokensPayloadSchema, } from "../types.js";
|
|
7
|
+
/** Path of the bundled credential helper script within this package */
|
|
8
|
+
function bundledHelperPath() {
|
|
9
|
+
// Resolves from both src/handlers (tests) and dist/handlers (published)
|
|
10
|
+
// to <package root>/scripts/git-credential-cyrus.cjs.
|
|
11
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
return join(here, "..", "..", "scripts", "git-credential-cyrus.cjs");
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Install the Cyrus git credential helper and wire it into the global git
|
|
16
|
+
* config for github.com. Idempotent — safe to run on every token push and
|
|
17
|
+
* on EdgeWorker startup.
|
|
18
|
+
*
|
|
19
|
+
* - Copies the self-contained helper script to
|
|
20
|
+
* `<cyrusHome>/scripts/git-credential-cyrus.cjs` (executable).
|
|
21
|
+
* - Enables `credential."https://github.com".useHttpPath` so git passes the
|
|
22
|
+
* repo path (and thus the org) to the helper.
|
|
23
|
+
* - Replaces any inherited helpers for github.com (e.g. gh's keyring helper)
|
|
24
|
+
* with an empty entry followed by the Cyrus helper. Helper values must be
|
|
25
|
+
* prefixed with `!` to invoke an arbitrary command — without it git would
|
|
26
|
+
* look for a `git credential-<name>` binary.
|
|
27
|
+
*
|
|
28
|
+
* Returns the absolute path of the installed helper script.
|
|
29
|
+
*/
|
|
30
|
+
export function ensureGitHubCredentialHelper(cyrusHome) {
|
|
31
|
+
const scriptDir = join(cyrusHome, "scripts");
|
|
32
|
+
const scriptDest = join(scriptDir, "git-credential-cyrus.cjs");
|
|
33
|
+
mkdirSync(scriptDir, { recursive: true });
|
|
34
|
+
copyFileSync(bundledHelperPath(), scriptDest);
|
|
35
|
+
chmodSync(scriptDest, 0o755);
|
|
36
|
+
const credentialKey = "credential.https://github.com";
|
|
37
|
+
const git = (args) => {
|
|
38
|
+
execFileSync("git", args, { stdio: "ignore" });
|
|
39
|
+
};
|
|
40
|
+
// Pass the repo path to the helper so it can resolve the org.
|
|
41
|
+
git(["config", "--global", `${credentialKey}.useHttpPath`, "true"]);
|
|
42
|
+
// Clear inherited helpers (an empty value resets git's helper list for
|
|
43
|
+
// this key). --replace-all also makes repeated runs idempotent: every
|
|
44
|
+
// call ends with exactly ["", "!node <script>"].
|
|
45
|
+
git(["config", "--global", "--replace-all", `${credentialKey}.helper`, ""]);
|
|
46
|
+
// Quote the script path — helper commands are run through the shell.
|
|
47
|
+
git([
|
|
48
|
+
"config",
|
|
49
|
+
"--global",
|
|
50
|
+
"--add",
|
|
51
|
+
`${credentialKey}.helper`,
|
|
52
|
+
`!node "${scriptDest}"`,
|
|
53
|
+
]);
|
|
54
|
+
return scriptDest;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Handle a GitHub installation tokens push from cyrus-hosted.
|
|
58
|
+
*
|
|
59
|
+
* Persists the per-installation tokens to `<cyrusHome>/github-tokens.json`
|
|
60
|
+
* (atomically, mode 0600) and ensures the git credential helper is
|
|
61
|
+
* installed so concurrent git operations against different GitHub orgs
|
|
62
|
+
* each authenticate with the right token.
|
|
63
|
+
*
|
|
64
|
+
* @param rawPayload - Unvalidated payload from the request
|
|
65
|
+
* @param cyrusHome - Path to the Cyrus home directory
|
|
66
|
+
*/
|
|
67
|
+
export async function handleGitHubTokens(rawPayload, cyrusHome) {
|
|
68
|
+
const parseResult = GitHubTokensPayloadSchema.safeParse(rawPayload);
|
|
69
|
+
if (!parseResult.success) {
|
|
70
|
+
const firstIssue = parseResult.error.issues[0];
|
|
71
|
+
const path = firstIssue?.path.join(".") || "unknown";
|
|
72
|
+
const message = firstIssue?.message || "Invalid payload";
|
|
73
|
+
return {
|
|
74
|
+
success: false,
|
|
75
|
+
error: "GitHub tokens payload validation failed",
|
|
76
|
+
details: `${path}: ${message}`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const payload = parseResult.data;
|
|
80
|
+
// Persist the tokens first — even if git configuration fails below, the
|
|
81
|
+
// EdgeWorker can still resolve tokens from the store for API calls.
|
|
82
|
+
try {
|
|
83
|
+
new GitHubTokenStore(cyrusHome).save(payload.tokens);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
return {
|
|
87
|
+
success: false,
|
|
88
|
+
error: "Failed to save GitHub tokens",
|
|
89
|
+
details: error instanceof Error ? error.message : String(error),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
ensureGitHubCredentialHelper(cyrusHome);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
return {
|
|
97
|
+
success: false,
|
|
98
|
+
error: "Failed to configure git credential helper",
|
|
99
|
+
details: error instanceof Error ? error.message : String(error),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
success: true,
|
|
104
|
+
message: "GitHub installation tokens updated successfully",
|
|
105
|
+
data: {
|
|
106
|
+
tokensCount: payload.tokens.length,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=githubTokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubTokens.js","sourceRoot":"","sources":["../../src/handlers/githubTokens.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACN,4BAA4B,EAC5B,kBAAkB,GAClB,MAAM,4BAA4B,CAAC;AACpC,cAAc,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACN,4BAA4B,EAC5B,kBAAkB,GAClB,MAAM,4BAA4B,CAAC;AACpC,cAAc,YAAY,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -263,6 +263,24 @@ export interface CheckGlabData {
|
|
|
263
263
|
isInstalled: boolean;
|
|
264
264
|
isAuthenticated: boolean;
|
|
265
265
|
}
|
|
266
|
+
/**
|
|
267
|
+
* GitHub installation tokens push payload schema.
|
|
268
|
+
* Sent by cyrus-hosted with one short-lived GitHub App installation token
|
|
269
|
+
* per installation (org or user account) the team has attached.
|
|
270
|
+
*/
|
|
271
|
+
export declare const GitHubTokensPayloadSchema: z.ZodObject<{
|
|
272
|
+
tokens: z.ZodArray<z.ZodObject<{
|
|
273
|
+
installationId: z.ZodString;
|
|
274
|
+
organization: z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
|
|
275
|
+
accountType: z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
276
|
+
Organization: "Organization";
|
|
277
|
+
User: "User";
|
|
278
|
+
}>>>>;
|
|
279
|
+
token: z.ZodString;
|
|
280
|
+
expiresAt: z.ZodString;
|
|
281
|
+
}, z.core.$strip>>;
|
|
282
|
+
}, z.core.$strip>;
|
|
283
|
+
export type GitHubTokensPayload = z.infer<typeof GitHubTokensPayloadSchema>;
|
|
266
284
|
/**
|
|
267
285
|
* Error response to send back to cyrus-hosted
|
|
268
286
|
*/
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACrE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,aAAa,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAC7D,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IACxD,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACX;AAED,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,aAAa,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAClC,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,uHAAuH;IACvH,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAClC,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -10,4 +10,22 @@ export const CyrusConfigPayloadSchema = EdgeConfigPayloadSchema.extend({
|
|
|
10
10
|
restartCyrus: z.boolean().optional(),
|
|
11
11
|
backupConfig: z.boolean().optional(),
|
|
12
12
|
});
|
|
13
|
+
/**
|
|
14
|
+
* GitHub installation tokens push payload schema.
|
|
15
|
+
* Sent by cyrus-hosted with one short-lived GitHub App installation token
|
|
16
|
+
* per installation (org or user account) the team has attached.
|
|
17
|
+
*/
|
|
18
|
+
export const GitHubTokensPayloadSchema = z.object({
|
|
19
|
+
tokens: z.array(z.object({
|
|
20
|
+
installationId: z.string().min(1),
|
|
21
|
+
organization: z.string().nullable().optional().default(null),
|
|
22
|
+
accountType: z
|
|
23
|
+
.enum(["Organization", "User"])
|
|
24
|
+
.nullable()
|
|
25
|
+
.optional()
|
|
26
|
+
.default(null),
|
|
27
|
+
token: z.string().min(1),
|
|
28
|
+
expiresAt: z.string().min(1),
|
|
29
|
+
})),
|
|
30
|
+
});
|
|
13
31
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,uBAAuB,CAAC,MAAM,CAAC;IACtE,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACpC,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,uBAAuB,CAAC,MAAM,CAAC;IACtE,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACpC,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAwEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;QACR,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAC5D,WAAW,EAAE,CAAC;aACZ,IAAI,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;aAC9B,QAAQ,EAAE;aACV,QAAQ,EAAE;aACV,OAAO,CAAC,IAAI,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC5B,CAAC,CACF;CACD,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cyrus-config-updater",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.64-test.0",
|
|
4
4
|
"description": "Configuration update handlers for Cyrus agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -12,13 +12,14 @@
|
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
14
|
"files": [
|
|
15
|
-
"dist"
|
|
15
|
+
"dist",
|
|
16
|
+
"scripts"
|
|
16
17
|
],
|
|
17
18
|
"dependencies": {
|
|
18
19
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
19
20
|
"fastify": "^5.8.5",
|
|
20
21
|
"zod": "^4.3.6",
|
|
21
|
-
"cyrus-core": "0.2.
|
|
22
|
+
"cyrus-core": "0.2.64-test.0"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
25
|
"@types/node": "^20.12.7",
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* git-credential-cyrus — git credential helper for multi-org GitHub access.
|
|
4
|
+
*
|
|
5
|
+
* Self-contained Node script (no dependencies). Installed by Cyrus at
|
|
6
|
+
* `<cyrusHome>/scripts/git-credential-cyrus.cjs` and wired into git via:
|
|
7
|
+
*
|
|
8
|
+
* git config --global credential."https://github.com".useHttpPath true
|
|
9
|
+
* git config --global --replace-all credential."https://github.com".helper ""
|
|
10
|
+
* git config --global --add credential."https://github.com".helper "!node <this file>"
|
|
11
|
+
*
|
|
12
|
+
* For `get` operations against github.com it looks up the org (first path
|
|
13
|
+
* segment) in `<cyrusHome>/github-tokens.json` — the per-installation
|
|
14
|
+
* GitHub App tokens pushed by cyrus-hosted — and prints credentials for a
|
|
15
|
+
* case-insensitive org match. If no org matches but exactly one non-expired
|
|
16
|
+
* token exists, that token is used. Otherwise it prints nothing and exits 0
|
|
17
|
+
* so git falls through to other helpers / prompts.
|
|
18
|
+
*/
|
|
19
|
+
"use strict";
|
|
20
|
+
|
|
21
|
+
const fs = require("node:fs");
|
|
22
|
+
const os = require("node:os");
|
|
23
|
+
const path = require("node:path");
|
|
24
|
+
|
|
25
|
+
function main() {
|
|
26
|
+
// Only the `get` operation produces credentials; `store`/`erase` are no-ops.
|
|
27
|
+
if (process.argv[2] !== "get") return;
|
|
28
|
+
|
|
29
|
+
let input = "";
|
|
30
|
+
try {
|
|
31
|
+
input = fs.readFileSync(0, "utf8");
|
|
32
|
+
} catch {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const attrs = {};
|
|
37
|
+
for (const line of input.split("\n")) {
|
|
38
|
+
const idx = line.indexOf("=");
|
|
39
|
+
if (idx > 0) {
|
|
40
|
+
attrs[line.slice(0, idx)] = line.slice(idx + 1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if ((attrs.host || "").toLowerCase() !== "github.com") return;
|
|
45
|
+
|
|
46
|
+
// With credential.useHttpPath=true git sends e.g. path=owner/repo.git
|
|
47
|
+
const org = (attrs.path || "").split("/")[0] || "";
|
|
48
|
+
|
|
49
|
+
const cyrusHome = process.env.CYRUS_HOME || path.join(os.homedir(), ".cyrus");
|
|
50
|
+
const tokensFile = path.join(cyrusHome, "github-tokens.json");
|
|
51
|
+
|
|
52
|
+
let tokens = [];
|
|
53
|
+
try {
|
|
54
|
+
const parsed = JSON.parse(fs.readFileSync(tokensFile, "utf8"));
|
|
55
|
+
if (Array.isArray(parsed.tokens)) tokens = parsed.tokens;
|
|
56
|
+
} catch {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const now = Date.now();
|
|
61
|
+
const valid = tokens.filter((t) => {
|
|
62
|
+
if (!t || typeof t.token !== "string" || t.token.length === 0) return false;
|
|
63
|
+
const expiresAt = Date.parse(t.expiresAt);
|
|
64
|
+
return !Number.isNaN(expiresAt) && expiresAt > now;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
let match;
|
|
68
|
+
if (org) {
|
|
69
|
+
const lowered = org.toLowerCase();
|
|
70
|
+
match = valid.find(
|
|
71
|
+
(t) =>
|
|
72
|
+
typeof t.organization === "string" &&
|
|
73
|
+
t.organization.toLowerCase() === lowered,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
if (!match && valid.length === 1) {
|
|
77
|
+
match = valid[0];
|
|
78
|
+
}
|
|
79
|
+
if (!match) return;
|
|
80
|
+
|
|
81
|
+
process.stdout.write(`username=x-access-token\npassword=${match.token}\n`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
main();
|