@rosthq/cli 0.6.8 → 0.7.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/index.d.ts.map +1 -1
- package/dist/index.js +926 -127
- package/dist/index.js.map +4 -4
- package/dist/operations.d.ts.map +1 -1
- package/dist/runner-serve.d.ts.map +1 -1
- package/dist/runner-service.d.ts +36 -0
- package/dist/runner-service.d.ts.map +1 -0
- package/dist/token-store.d.ts +66 -1
- package/dist/token-store.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/operations.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAEL,KAAK,UAAU,EAEf,KAAK,SAAS,EACf,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,OAAO,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA2E3D,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAAqC,CAAC;AAEpF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,cAAc,CAEnF;AAUD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE7E;AA2BD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE/E;AAKD,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAStG;AAKD,wBAAgB,0BAA0B,IAAI;IAAE,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAEvH;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,UAAU,CAAA;CAAE,GAClF,OAAO,CAAC,MAAM,CAAC,CAUjB;AAOD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAEL,KAAK,UAAU,EAEf,KAAK,SAAS,EACf,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,OAAO,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA2E3D,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAAqC,CAAC;AAEpF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,cAAc,CAEnF;AAUD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE7E;AA2BD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE/E;AAKD,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAStG;AAKD,wBAAgB,0BAA0B,IAAI;IAAE,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAEvH;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,UAAU,CAAA;CAAE,GAClF,OAAO,CAAC,MAAM,CAAC,CAUjB;AAOD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CA2BzD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-serve.d.ts","sourceRoot":"","sources":["../src/runner-serve.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMzD,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;CAC3C,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,EAAE,EAAE,aAAa,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,CAAC;
|
|
1
|
+
{"version":3,"file":"runner-serve.d.ts","sourceRoot":"","sources":["../src/runner-serve.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMzD,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;CAC3C,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,EAAE,EAAE,aAAa,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,CAAC;AA+BF,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDjF;AAmED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW5F"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
type RunnerServiceIo = {
|
|
2
|
+
stdout: Pick<NodeJS.WriteStream, "write">;
|
|
3
|
+
stderr: Pick<NodeJS.WriteStream, "write">;
|
|
4
|
+
};
|
|
5
|
+
export type RunnerServiceExec = (file: string, args: string[]) => Promise<{
|
|
6
|
+
stdout: string;
|
|
7
|
+
stderr: string;
|
|
8
|
+
}>;
|
|
9
|
+
export type RunnerServicePaths = {
|
|
10
|
+
launchAgentPath: string;
|
|
11
|
+
stateFile: string;
|
|
12
|
+
logDir: string;
|
|
13
|
+
};
|
|
14
|
+
export type RunnerServiceConfig = {
|
|
15
|
+
binPath: string;
|
|
16
|
+
runnerName: string;
|
|
17
|
+
stateFile: string;
|
|
18
|
+
logDir: string;
|
|
19
|
+
appUrl: string;
|
|
20
|
+
execute: boolean;
|
|
21
|
+
};
|
|
22
|
+
export declare function isRunnerServiceInvocation(args: string[]): boolean;
|
|
23
|
+
export declare function runnerServicePaths(homeDir: string, runnerName: string): RunnerServicePaths;
|
|
24
|
+
export declare function renderLaunchdPlist(config: RunnerServiceConfig): string;
|
|
25
|
+
export declare function runRunnerService(options: {
|
|
26
|
+
io: RunnerServiceIo;
|
|
27
|
+
args: string[];
|
|
28
|
+
appUrl: string;
|
|
29
|
+
binPath?: string;
|
|
30
|
+
homeDir?: string;
|
|
31
|
+
platform?: NodeJS.Platform;
|
|
32
|
+
exec?: RunnerServiceExec;
|
|
33
|
+
uid?: number;
|
|
34
|
+
}): Promise<number>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=runner-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-service.d.ts","sourceRoot":"","sources":["../src/runner-service.ts"],"names":[],"mappings":"AAYA,KAAK,eAAe,GAAG;IACrB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;CAC3C,CAAC;AAOF,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE9G,MAAM,MAAM,kBAAkB,GAAG;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IAGf,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAmBF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAMjE;AAKD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,CAO1F;AAMD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAwCtE;AAiBD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,EAAE,EAAE,eAAe,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,MAAM,CAAC,CA8ClB"}
|
package/dist/token-store.d.ts
CHANGED
|
@@ -11,11 +11,76 @@ export type TokenStore = {
|
|
|
11
11
|
clear(): Promise<void>;
|
|
12
12
|
describe(): string;
|
|
13
13
|
};
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Seam over `child_process.execFile` that also supports feeding the child's
|
|
16
|
+
* stdin. Secrets are delivered via `options.input` (never argv), so they stay
|
|
17
|
+
* out of process listings (`ps`), shell history, and the args a test inspects.
|
|
18
|
+
*/
|
|
19
|
+
type ExecFileOptions = {
|
|
20
|
+
readonly input?: string;
|
|
21
|
+
};
|
|
22
|
+
type ExecFile = (file: string, args: readonly string[], options?: ExecFileOptions) => Promise<{
|
|
15
23
|
stdout: string;
|
|
16
24
|
stderr: string;
|
|
17
25
|
}>;
|
|
18
26
|
export declare class KeychainTokenStore implements TokenStore {
|
|
27
|
+
protected readonly run: ExecFile;
|
|
28
|
+
constructor(run?: ExecFile);
|
|
29
|
+
read(): Promise<CliSession | null>;
|
|
30
|
+
write(session: CliSession): Promise<void>;
|
|
31
|
+
clear(): Promise<void>;
|
|
32
|
+
describe(): string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* macOS store that selects its backend by capability, not just platform.
|
|
36
|
+
*
|
|
37
|
+
* On an interactive Mac with an unlocked login keychain it behaves exactly like
|
|
38
|
+
* `KeychainTokenStore`. On a headless / service / SSH account where `security`
|
|
39
|
+
* cannot reach a usable keychain (e.g. exit 128 "Unable to obtain
|
|
40
|
+
* authorization"), it transparently persists to an owner-only file store
|
|
41
|
+
* (directory `0700`, file `0600`) — no `ROST_CLI_ALLOW_FILE_TOKEN_STORE` flag and
|
|
42
|
+
* no development-only warning. This is a supported, first-class headless path
|
|
43
|
+
* (ADR-0017 § "Credential storage is headless-first-class").
|
|
44
|
+
*
|
|
45
|
+
* `createTokenStore` stays synchronous, so keychain usability is probed lazily
|
|
46
|
+
* on the first read/write and the decision is cached for the store's lifetime.
|
|
47
|
+
*/
|
|
48
|
+
export declare class DarwinTokenStore extends KeychainTokenStore {
|
|
49
|
+
private readonly filePath?;
|
|
50
|
+
private backend;
|
|
51
|
+
private fileStore;
|
|
52
|
+
constructor(run?: ExecFile, filePath?: string | undefined);
|
|
53
|
+
read(): Promise<CliSession | null>;
|
|
54
|
+
write(session: CliSession): Promise<void>;
|
|
55
|
+
clear(): Promise<void>;
|
|
56
|
+
describe(): string;
|
|
57
|
+
private file;
|
|
58
|
+
private selectBackend;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Windows Credential Manager via the advapi32 `Cred*` APIs (P/Invoke through
|
|
62
|
+
* PowerShell). The session is delivered on stdin for writes and returned on
|
|
63
|
+
* stdout for reads, so it never appears in this process's — or a child's — argv.
|
|
64
|
+
*
|
|
65
|
+
* Note: these PowerShell paths run only on `win32`, which has no CI runner in
|
|
66
|
+
* this repo; the unit tests exercise the argv/stdin contract through the
|
|
67
|
+
* injected `ExecFile` seam and the P/Invoke itself is verified by manual/dogfood
|
|
68
|
+
* runs on Windows.
|
|
69
|
+
*/
|
|
70
|
+
export declare class WindowsCredentialTokenStore implements TokenStore {
|
|
71
|
+
private readonly run;
|
|
72
|
+
constructor(run?: ExecFile);
|
|
73
|
+
read(): Promise<CliSession | null>;
|
|
74
|
+
write(session: CliSession): Promise<void>;
|
|
75
|
+
clear(): Promise<void>;
|
|
76
|
+
describe(): string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Linux Secret Service via `secret-tool`. `secret-tool store` reads the secret
|
|
80
|
+
* from stdin (never argv) and `secret-tool lookup` prints it to stdout, so the
|
|
81
|
+
* session stays off the command line on both paths.
|
|
82
|
+
*/
|
|
83
|
+
export declare class SecretServiceTokenStore implements TokenStore {
|
|
19
84
|
private readonly run;
|
|
20
85
|
constructor(run?: ExecFile);
|
|
21
86
|
read(): Promise<CliSession | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"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"}
|