clawdlets 0.2.2 → 0.3.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/main.mjs +4589 -0
- package/{dist → node_modules/@clawdlets/core/dist}/lib/context.d.ts +2 -2
- package/{dist → node_modules/@clawdlets/core/dist}/lib/context.d.ts.map +1 -1
- package/{dist → node_modules/@clawdlets/core/dist}/lib/context.js +2 -2
- package/node_modules/@clawdlets/core/dist/lib/context.js.map +1 -0
- package/{dist → node_modules/@clawdlets/core/dist}/lib/host-resolve.js +2 -2
- package/node_modules/@clawdlets/core/dist/lib/host-resolve.js.map +1 -0
- package/node_modules/@clawdlets/core/dist/repo-layout.d.ts +1 -0
- package/node_modules/@clawdlets/core/dist/repo-layout.d.ts.map +1 -1
- package/node_modules/@clawdlets/core/dist/repo-layout.js +2 -0
- package/node_modules/@clawdlets/core/dist/repo-layout.js.map +1 -1
- package/node_modules/@clawdlets/core/package.json +1 -3
- package/package.json +16 -16
- package/dist/commands/bootstrap.d.ts +0 -43
- package/dist/commands/bootstrap.d.ts.map +0 -1
- package/dist/commands/bootstrap.js +0 -318
- package/dist/commands/bootstrap.js.map +0 -1
- package/dist/commands/bot.d.ts +0 -2
- package/dist/commands/bot.d.ts.map +0 -1
- package/dist/commands/bot.js +0 -97
- package/dist/commands/bot.js.map +0 -1
- package/dist/commands/cattle/common.d.ts +0 -29
- package/dist/commands/cattle/common.d.ts.map +0 -1
- package/dist/commands/cattle/common.js +0 -102
- package/dist/commands/cattle/common.js.map +0 -1
- package/dist/commands/cattle/destroy.d.ts +0 -33
- package/dist/commands/cattle/destroy.d.ts.map +0 -1
- package/dist/commands/cattle/destroy.js +0 -72
- package/dist/commands/cattle/destroy.js.map +0 -1
- package/dist/commands/cattle/list.d.ts +0 -20
- package/dist/commands/cattle/list.d.ts.map +0 -1
- package/dist/commands/cattle/list.js +0 -78
- package/dist/commands/cattle/list.js.map +0 -1
- package/dist/commands/cattle/logs.d.ts +0 -34
- package/dist/commands/cattle/logs.d.ts.map +0 -1
- package/dist/commands/cattle/logs.js +0 -55
- package/dist/commands/cattle/logs.js.map +0 -1
- package/dist/commands/cattle/persona.d.ts +0 -2
- package/dist/commands/cattle/persona.d.ts.map +0 -1
- package/dist/commands/cattle/persona.js +0 -85
- package/dist/commands/cattle/persona.js.map +0 -1
- package/dist/commands/cattle/reap.d.ts +0 -20
- package/dist/commands/cattle/reap.d.ts.map +0 -1
- package/dist/commands/cattle/reap.js +0 -60
- package/dist/commands/cattle/reap.js.map +0 -1
- package/dist/commands/cattle/spawn.d.ts +0 -73
- package/dist/commands/cattle/spawn.d.ts.map +0 -1
- package/dist/commands/cattle/spawn.js +0 -147
- package/dist/commands/cattle/spawn.js.map +0 -1
- package/dist/commands/cattle/ssh.d.ts +0 -20
- package/dist/commands/cattle/ssh.d.ts.map +0 -1
- package/dist/commands/cattle/ssh.js +0 -37
- package/dist/commands/cattle/ssh.js.map +0 -1
- package/dist/commands/cattle.d.ts +0 -2
- package/dist/commands/cattle.d.ts.map +0 -1
- package/dist/commands/cattle.js +0 -21
- package/dist/commands/cattle.js.map +0 -1
- package/dist/commands/config.d.ts +0 -2
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -163
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -35
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -65
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/env.d.ts +0 -22
- package/dist/commands/env.d.ts.map +0 -1
- package/dist/commands/env.js +0 -132
- package/dist/commands/env.js.map +0 -1
- package/dist/commands/fleet.d.ts +0 -2
- package/dist/commands/fleet.d.ts.map +0 -1
- package/dist/commands/fleet.js +0 -61
- package/dist/commands/fleet.js.map +0 -1
- package/dist/commands/host.d.ts +0 -2
- package/dist/commands/host.d.ts.map +0 -1
- package/dist/commands/host.js +0 -277
- package/dist/commands/host.js.map +0 -1
- package/dist/commands/image.d.ts +0 -2
- package/dist/commands/image.d.ts.map +0 -1
- package/dist/commands/image.js +0 -133
- package/dist/commands/image.js.map +0 -1
- package/dist/commands/infra.d.ts +0 -2
- package/dist/commands/infra.d.ts.map +0 -1
- package/dist/commands/infra.js +0 -171
- package/dist/commands/infra.js.map +0 -1
- package/dist/commands/lockdown.d.ts +0 -25
- package/dist/commands/lockdown.d.ts.map +0 -1
- package/dist/commands/lockdown.js +0 -93
- package/dist/commands/lockdown.js.map +0 -1
- package/dist/commands/project.d.ts +0 -2
- package/dist/commands/project.d.ts.map +0 -1
- package/dist/commands/project.js +0 -264
- package/dist/commands/project.js.map +0 -1
- package/dist/commands/secrets/common.d.ts +0 -8
- package/dist/commands/secrets/common.d.ts.map +0 -1
- package/dist/commands/secrets/common.js +0 -20
- package/dist/commands/secrets/common.js.map +0 -1
- package/dist/commands/secrets/init.d.ts +0 -39
- package/dist/commands/secrets/init.d.ts.map +0 -1
- package/dist/commands/secrets/init.js +0 -455
- package/dist/commands/secrets/init.js.map +0 -1
- package/dist/commands/secrets/path.d.ts +0 -11
- package/dist/commands/secrets/path.d.ts.map +0 -1
- package/dist/commands/secrets/path.js +0 -24
- package/dist/commands/secrets/path.js.map +0 -1
- package/dist/commands/secrets/sync.d.ts +0 -25
- package/dist/commands/secrets/sync.d.ts.map +0 -1
- package/dist/commands/secrets/sync.js +0 -67
- package/dist/commands/secrets/sync.js.map +0 -1
- package/dist/commands/secrets/verify.d.ts +0 -28
- package/dist/commands/secrets/verify.d.ts.map +0 -1
- package/dist/commands/secrets/verify.js +0 -118
- package/dist/commands/secrets/verify.js.map +0 -1
- package/dist/commands/secrets.d.ts +0 -2
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js +0 -18
- package/dist/commands/secrets.js.map +0 -1
- package/dist/commands/server/common.d.ts +0 -3
- package/dist/commands/server/common.d.ts.map +0 -1
- package/dist/commands/server/common.js +0 -3
- package/dist/commands/server/common.js.map +0 -1
- package/dist/commands/server/deploy.d.ts +0 -53
- package/dist/commands/server/deploy.d.ts.map +0 -1
- package/dist/commands/server/deploy.js +0 -177
- package/dist/commands/server/deploy.js.map +0 -1
- package/dist/commands/server/github-sync.d.ts +0 -2
- package/dist/commands/server/github-sync.d.ts.map +0 -1
- package/dist/commands/server/github-sync.js +0 -166
- package/dist/commands/server/github-sync.js.map +0 -1
- package/dist/commands/server/manifest.d.ts +0 -28
- package/dist/commands/server/manifest.d.ts.map +0 -1
- package/dist/commands/server/manifest.js +0 -82
- package/dist/commands/server/manifest.js.map +0 -1
- package/dist/commands/server.d.ts +0 -2
- package/dist/commands/server.d.ts.map +0 -1
- package/dist/commands/server.js +0 -267
- package/dist/commands/server.js.map +0 -1
- package/dist/commands/ssh-target.d.ts +0 -3
- package/dist/commands/ssh-target.d.ts.map +0 -1
- package/dist/commands/ssh-target.js +0 -15
- package/dist/commands/ssh-target.js.map +0 -1
- package/dist/lib/context.js.map +0 -1
- package/dist/lib/deploy-gate.d.ts +0 -9
- package/dist/lib/deploy-gate.d.ts.map +0 -1
- package/dist/lib/deploy-gate.js +0 -20
- package/dist/lib/deploy-gate.js.map +0 -1
- package/dist/lib/deploy-manifest.d.ts +0 -11
- package/dist/lib/deploy-manifest.d.ts.map +0 -1
- package/dist/lib/deploy-manifest.js +0 -46
- package/dist/lib/deploy-manifest.js.map +0 -1
- package/dist/lib/doctor-render.d.ts +0 -14
- package/dist/lib/doctor-render.d.ts.map +0 -1
- package/dist/lib/doctor-render.js +0 -131
- package/dist/lib/doctor-render.js.map +0 -1
- package/dist/lib/host-resolve.js.map +0 -1
- package/dist/lib/linux-build.d.ts +0 -8
- package/dist/lib/linux-build.d.ts.map +0 -1
- package/dist/lib/linux-build.js +0 -15
- package/dist/lib/linux-build.js.map +0 -1
- package/dist/lib/manifest-signature.d.ts +0 -17
- package/dist/lib/manifest-signature.d.ts.map +0 -1
- package/dist/lib/manifest-signature.js +0 -52
- package/dist/lib/manifest-signature.js.map +0 -1
- package/dist/lib/template-spec.d.ts +0 -9
- package/dist/lib/template-spec.d.ts.map +0 -1
- package/dist/lib/template-spec.js +0 -50
- package/dist/lib/template-spec.js.map +0 -1
- package/dist/lib/version.d.ts +0 -3
- package/dist/lib/version.d.ts.map +0 -1
- package/dist/lib/version.js +0 -17
- package/dist/lib/version.js.map +0 -1
- package/dist/lib/wizard.d.ts +0 -10
- package/dist/lib/wizard.d.ts.map +0 -1
- package/dist/lib/wizard.js +0 -25
- package/dist/lib/wizard.js.map +0 -1
- package/dist/main.d.ts +0 -3
- package/dist/main.d.ts.map +0 -1
- package/dist/main.js +0 -50
- package/dist/main.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/client.d.ts +0 -21
- package/node_modules/@clawdlets/clf-queue/dist/client.d.ts.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/client.js +0 -132
- package/node_modules/@clawdlets/clf-queue/dist/client.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/index.d.ts +0 -9
- package/node_modules/@clawdlets/clf-queue/dist/index.d.ts.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/index.js +0 -5
- package/node_modules/@clawdlets/clf-queue/dist/index.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/jobs.d.ts +0 -32
- package/node_modules/@clawdlets/clf-queue/dist/jobs.d.ts.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/jobs.js +0 -24
- package/node_modules/@clawdlets/clf-queue/dist/jobs.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/protocol.d.ts +0 -118
- package/node_modules/@clawdlets/clf-queue/dist/protocol.d.ts.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/protocol.js +0 -46
- package/node_modules/@clawdlets/clf-queue/dist/protocol.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/bootstrap-tokens.d.ts +0 -3
- package/node_modules/@clawdlets/clf-queue/dist/queue/bootstrap-tokens.d.ts.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/bootstrap-tokens.js +0 -112
- package/node_modules/@clawdlets/clf-queue/dist/queue/bootstrap-tokens.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/jobs.d.ts +0 -3
- package/node_modules/@clawdlets/clf-queue/dist/queue/jobs.d.ts.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/jobs.js +0 -313
- package/node_modules/@clawdlets/clf-queue/dist/queue/jobs.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/migrate.d.ts +0 -2
- package/node_modules/@clawdlets/clf-queue/dist/queue/migrate.d.ts.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/migrate.js +0 -74
- package/node_modules/@clawdlets/clf-queue/dist/queue/migrate.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/open.d.ts +0 -3
- package/node_modules/@clawdlets/clf-queue/dist/queue/open.d.ts.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/open.js +0 -27
- package/node_modules/@clawdlets/clf-queue/dist/queue/open.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/types.d.ts +0 -113
- package/node_modules/@clawdlets/clf-queue/dist/queue/types.d.ts.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/types.js +0 -2
- package/node_modules/@clawdlets/clf-queue/dist/queue/types.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/util.d.ts +0 -10
- package/node_modules/@clawdlets/clf-queue/dist/queue/util.d.ts.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue/util.js +0 -30
- package/node_modules/@clawdlets/clf-queue/dist/queue/util.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue.d.ts +0 -3
- package/node_modules/@clawdlets/clf-queue/dist/queue.d.ts.map +0 -1
- package/node_modules/@clawdlets/clf-queue/dist/queue.js +0 -2
- package/node_modules/@clawdlets/clf-queue/dist/queue.js.map +0 -1
- package/node_modules/@clawdlets/clf-queue/package.json +0 -34
- package/node_modules/@clawdlets/core/dist/lib/cattle-state.d.ts +0 -25
- package/node_modules/@clawdlets/core/dist/lib/cattle-state.d.ts.map +0 -1
- package/node_modules/@clawdlets/core/dist/lib/cattle-state.js +0 -136
- package/node_modules/@clawdlets/core/dist/lib/cattle-state.js.map +0 -1
- package/node_modules/better-sqlite3/LICENSE +0 -21
- package/node_modules/better-sqlite3/README.md +0 -99
- package/node_modules/better-sqlite3/binding.gyp +0 -38
- package/node_modules/better-sqlite3/deps/common.gypi +0 -68
- package/node_modules/better-sqlite3/deps/copy.js +0 -31
- package/node_modules/better-sqlite3/deps/defines.gypi +0 -41
- package/node_modules/better-sqlite3/deps/download.sh +0 -122
- package/node_modules/better-sqlite3/deps/patches/1208.patch +0 -15
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +0 -265969
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +0 -13968
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3ext.h +0 -730
- package/node_modules/better-sqlite3/deps/sqlite3.gyp +0 -80
- package/node_modules/better-sqlite3/deps/test_extension.c +0 -21
- package/node_modules/better-sqlite3/lib/database.js +0 -90
- package/node_modules/better-sqlite3/lib/index.js +0 -3
- package/node_modules/better-sqlite3/lib/methods/aggregate.js +0 -43
- package/node_modules/better-sqlite3/lib/methods/backup.js +0 -67
- package/node_modules/better-sqlite3/lib/methods/function.js +0 -31
- package/node_modules/better-sqlite3/lib/methods/inspect.js +0 -7
- package/node_modules/better-sqlite3/lib/methods/pragma.js +0 -12
- package/node_modules/better-sqlite3/lib/methods/serialize.js +0 -16
- package/node_modules/better-sqlite3/lib/methods/table.js +0 -189
- package/node_modules/better-sqlite3/lib/methods/transaction.js +0 -78
- package/node_modules/better-sqlite3/lib/methods/wrappers.js +0 -54
- package/node_modules/better-sqlite3/lib/sqlite-error.js +0 -20
- package/node_modules/better-sqlite3/lib/util.js +0 -12
- package/node_modules/better-sqlite3/package.json +0 -59
- package/node_modules/better-sqlite3/src/addon.cpp +0 -47
- package/node_modules/better-sqlite3/src/better_sqlite3.cpp +0 -74
- package/node_modules/better-sqlite3/src/objects/backup.cpp +0 -120
- package/node_modules/better-sqlite3/src/objects/backup.hpp +0 -36
- package/node_modules/better-sqlite3/src/objects/database.cpp +0 -417
- package/node_modules/better-sqlite3/src/objects/database.hpp +0 -103
- package/node_modules/better-sqlite3/src/objects/statement-iterator.cpp +0 -113
- package/node_modules/better-sqlite3/src/objects/statement-iterator.hpp +0 -50
- package/node_modules/better-sqlite3/src/objects/statement.cpp +0 -383
- package/node_modules/better-sqlite3/src/objects/statement.hpp +0 -58
- package/node_modules/better-sqlite3/src/util/bind-map.cpp +0 -73
- package/node_modules/better-sqlite3/src/util/binder.cpp +0 -193
- package/node_modules/better-sqlite3/src/util/constants.cpp +0 -172
- package/node_modules/better-sqlite3/src/util/custom-aggregate.cpp +0 -121
- package/node_modules/better-sqlite3/src/util/custom-function.cpp +0 -59
- package/node_modules/better-sqlite3/src/util/custom-table.cpp +0 -409
- package/node_modules/better-sqlite3/src/util/data-converter.cpp +0 -17
- package/node_modules/better-sqlite3/src/util/data.cpp +0 -194
- package/node_modules/better-sqlite3/src/util/helpers.cpp +0 -109
- package/node_modules/better-sqlite3/src/util/macros.cpp +0 -70
- package/node_modules/better-sqlite3/src/util/query-macros.cpp +0 -71
- package/node_modules/better-sqlite3/src/util/row-builder.cpp +0 -49
- /package/{dist → node_modules/@clawdlets/core/dist}/lib/host-resolve.d.ts +0 -0
- /package/{dist → node_modules/@clawdlets/core/dist}/lib/host-resolve.d.ts.map +0 -0
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export declare const secretsVerify: import("citty").CommandDef<{
|
|
2
|
-
runtimeDir: {
|
|
3
|
-
type: "string";
|
|
4
|
-
description: string;
|
|
5
|
-
};
|
|
6
|
-
envFile: {
|
|
7
|
-
type: "string";
|
|
8
|
-
description: string;
|
|
9
|
-
};
|
|
10
|
-
host: {
|
|
11
|
-
type: "string";
|
|
12
|
-
description: string;
|
|
13
|
-
};
|
|
14
|
-
operator: {
|
|
15
|
-
type: "string";
|
|
16
|
-
description: string;
|
|
17
|
-
};
|
|
18
|
-
ageKeyFile: {
|
|
19
|
-
type: "string";
|
|
20
|
-
description: string;
|
|
21
|
-
};
|
|
22
|
-
json: {
|
|
23
|
-
type: "boolean";
|
|
24
|
-
description: string;
|
|
25
|
-
default: false;
|
|
26
|
-
};
|
|
27
|
-
}>;
|
|
28
|
-
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/commands/secrets/verify.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;EA6GxB,CAAC"}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import process from "node:process";
|
|
4
|
-
import { defineCommand } from "citty";
|
|
5
|
-
import YAML from "yaml";
|
|
6
|
-
import { sopsDecryptYamlFile } from "@clawdlets/core/lib/sops";
|
|
7
|
-
import { sanitizeOperatorId } from "@clawdlets/core/lib/identifiers";
|
|
8
|
-
import { buildFleetSecretsPlan } from "@clawdlets/core/lib/fleet-secrets";
|
|
9
|
-
import { isPlaceholderSecretValue } from "@clawdlets/core/lib/secrets-init";
|
|
10
|
-
import { loadDeployCreds } from "@clawdlets/core/lib/deploy-creds";
|
|
11
|
-
import { getHostSecretsDir, getLocalOperatorAgeKeyPath } from "@clawdlets/core/repo-layout";
|
|
12
|
-
import { loadHostContextOrExit } from "../../lib/context.js";
|
|
13
|
-
export const secretsVerify = defineCommand({
|
|
14
|
-
meta: {
|
|
15
|
-
name: "verify",
|
|
16
|
-
description: "Verify secrets decrypt correctly and contain no placeholders.",
|
|
17
|
-
},
|
|
18
|
-
args: {
|
|
19
|
-
runtimeDir: { type: "string", description: "Runtime directory (default: .clawdlets)." },
|
|
20
|
-
envFile: { type: "string", description: "Env file for deploy creds (default: <runtimeDir>/env)." },
|
|
21
|
-
host: { type: "string", description: "Host name (defaults to clawdlets.json defaultHost / sole host)." },
|
|
22
|
-
operator: {
|
|
23
|
-
type: "string",
|
|
24
|
-
description: "Operator id for age key name (default: $USER). Used if SOPS_AGE_KEY_FILE is not set.",
|
|
25
|
-
},
|
|
26
|
-
ageKeyFile: { type: "string", description: "Override SOPS_AGE_KEY_FILE path." },
|
|
27
|
-
json: { type: "boolean", description: "Output JSON.", default: false },
|
|
28
|
-
},
|
|
29
|
-
async run({ args }) {
|
|
30
|
-
const cwd = process.cwd();
|
|
31
|
-
const ctx = loadHostContextOrExit({ cwd, runtimeDir: args.runtimeDir, hostArg: args.host });
|
|
32
|
-
if (!ctx)
|
|
33
|
-
return;
|
|
34
|
-
const { layout, config, hostName, hostCfg } = ctx;
|
|
35
|
-
const deployCreds = loadDeployCreds({ cwd, runtimeDir: args.runtimeDir, envFile: args.envFile });
|
|
36
|
-
if (deployCreds.envFile?.origin === "explicit" && deployCreds.envFile.status !== "ok") {
|
|
37
|
-
throw new Error(`deploy env file rejected: ${deployCreds.envFile.path} (${deployCreds.envFile.error || deployCreds.envFile.status})`);
|
|
38
|
-
}
|
|
39
|
-
const operatorId = sanitizeOperatorId(String(args.operator || process.env.USER || "operator"));
|
|
40
|
-
const operatorKeyPath = (args.ageKeyFile ? String(args.ageKeyFile).trim() : "") ||
|
|
41
|
-
(deployCreds.values.SOPS_AGE_KEY_FILE ? String(deployCreds.values.SOPS_AGE_KEY_FILE).trim() : "") ||
|
|
42
|
-
getLocalOperatorAgeKeyPath(layout, operatorId);
|
|
43
|
-
const nix = { nixBin: String(deployCreds.values.NIX_BIN || "nix").trim() || "nix", cwd: layout.repoRoot, dryRun: false };
|
|
44
|
-
const localDir = getHostSecretsDir(layout, hostName);
|
|
45
|
-
const secretsPlan = buildFleetSecretsPlan({ config, hostName });
|
|
46
|
-
const requiredSecretNames = new Set(secretsPlan.secretNamesRequired);
|
|
47
|
-
const tailnetMode = String(hostCfg.tailnet?.mode || "none");
|
|
48
|
-
const requiredSecrets = Array.from(new Set([
|
|
49
|
-
...(tailnetMode === "tailscale" ? ["tailscale_auth_key"] : []),
|
|
50
|
-
"admin_password_hash",
|
|
51
|
-
]));
|
|
52
|
-
const secretNames = secretsPlan.secretNamesAll;
|
|
53
|
-
const optionalSecrets = ["root_password_hash"];
|
|
54
|
-
const results = [];
|
|
55
|
-
if (!fs.existsSync(operatorKeyPath)) {
|
|
56
|
-
results.push({ secret: "SOPS_AGE_KEY_FILE", status: "missing", detail: operatorKeyPath });
|
|
57
|
-
}
|
|
58
|
-
const verifyOne = async (secretName, optional, allowOptionalMarker) => {
|
|
59
|
-
const filePath = path.join(localDir, `${secretName}.yaml`);
|
|
60
|
-
if (!fs.existsSync(filePath)) {
|
|
61
|
-
results.push({ secret: secretName, status: optional ? "warn" : "missing", detail: `(missing: ${filePath})` });
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
try {
|
|
65
|
-
const decrypted = await sopsDecryptYamlFile({ filePath, ageKeyFile: operatorKeyPath, nix });
|
|
66
|
-
const parsed = YAML.parse(decrypted) || {};
|
|
67
|
-
const keys = Object.keys(parsed).filter((k) => k !== "sops");
|
|
68
|
-
if (keys.length !== 1 || keys[0] !== secretName) {
|
|
69
|
-
results.push({ secret: secretName, status: "missing", detail: "(invalid: expected exactly 1 key matching filename)" });
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
const v = parsed[secretName];
|
|
73
|
-
const value = typeof v === "string" ? v : v == null ? "" : String(v);
|
|
74
|
-
if (!allowOptionalMarker && value.trim() === "<OPTIONAL>") {
|
|
75
|
-
results.push({ secret: secretName, status: "missing", detail: "(placeholder: <OPTIONAL>)" });
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
if (!optional && isPlaceholderSecretValue(value)) {
|
|
79
|
-
results.push({ secret: secretName, status: "missing", detail: `(placeholder: ${value.trim()})` });
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
if (optional && isPlaceholderSecretValue(value)) {
|
|
83
|
-
results.push({ secret: secretName, status: "missing", detail: `(placeholder: ${value.trim()})` });
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
if (!optional && !value.trim()) {
|
|
87
|
-
results.push({ secret: secretName, status: "missing", detail: "(empty)" });
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
results.push({ secret: secretName, status: "ok" });
|
|
91
|
-
}
|
|
92
|
-
catch (e) {
|
|
93
|
-
results.push({ secret: secretName, status: "missing", detail: String(e?.message || e) });
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
if (!fs.existsSync(localDir)) {
|
|
97
|
-
results.push({ secret: "secrets.localDir", status: "missing", detail: localDir });
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
for (const s of requiredSecrets)
|
|
101
|
-
await verifyOne(s, false, false);
|
|
102
|
-
for (const s of secretNames)
|
|
103
|
-
await verifyOne(s, false, !requiredSecretNames.has(s));
|
|
104
|
-
for (const s of optionalSecrets)
|
|
105
|
-
await verifyOne(s, true, true);
|
|
106
|
-
}
|
|
107
|
-
if (args.json) {
|
|
108
|
-
console.log(JSON.stringify({ host: hostName, localDir, results }, null, 2));
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
for (const r of results)
|
|
112
|
-
console.log(`${r.status}: ${r.secret}${r.detail ? ` (${r.detail})` : ""}`);
|
|
113
|
-
}
|
|
114
|
-
if (results.some((r) => r.status === "missing"))
|
|
115
|
-
process.exitCode = 1;
|
|
116
|
-
},
|
|
117
|
-
});
|
|
118
|
-
//# sourceMappingURL=verify.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/commands/secrets/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,+DAA+D;KAC7E;IACD,IAAI,EAAE;QACJ,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;QACvF,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wDAAwD,EAAE;QAClG,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iEAAiE,EAAE;QACxG,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,sFAAsF;SACpG;QACD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;QAC/E,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE;KACvE;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,qBAAqB,CAAC,EAAE,GAAG,EAAE,UAAU,EAAG,IAAY,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrG,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QAElD,MAAM,WAAW,GAAG,eAAe,CAAC,EAAE,GAAG,EAAE,UAAU,EAAG,IAAY,CAAC,UAAU,EAAE,OAAO,EAAG,IAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QACnH,IAAI,WAAW,CAAC,OAAO,EAAE,MAAM,KAAK,UAAU,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACtF,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxI,CAAC;QAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC;QAE/F,MAAM,eAAe,GACnB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,CAAC,WAAW,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjG,0BAA0B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAEjD,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAW,CAAC;QAElI,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,qBAAqB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChE,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAS,WAAW,CAAC,mBAAmB,CAAC,CAAC;QAE7E,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;YACzC,GAAG,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,qBAAqB;SACtB,CAAC,CAAC,CAAC;QACJ,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC;QAC/C,MAAM,eAAe,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAG/C,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,EAAE,UAAkB,EAAE,QAAiB,EAAE,mBAA4B,EAAE,EAAE;YAC9F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,UAAU,OAAO,CAAC,CAAC;YAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,QAAQ,GAAG,EAAE,CAAC,CAAC;gBAC9G,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC5F,MAAM,MAAM,GAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAA6B,IAAI,EAAE,CAAC;gBACxE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;gBAC7D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;oBAChD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,qDAAqD,EAAE,CAAC,CAAC;oBACvH,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACrE,IAAI,CAAC,mBAAmB,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,YAAY,EAAE,CAAC;oBAC1D,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC,CAAC;oBAC7F,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,QAAQ,IAAI,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;oBAClG,OAAO;gBACT,CAAC;gBACD,IAAI,QAAQ,IAAI,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;oBAClG,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBAC3E,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAE,CAAW,EAAE,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YACtG,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,eAAe;gBAAE,MAAM,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAClE,KAAK,MAAM,CAAC,IAAI,WAAW;gBAAE,MAAM,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,KAAK,MAAM,CAAC,IAAI,eAAe;gBAAE,MAAM,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtG,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACxE,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,OAAO,qDAWlB,CAAC"}
|
package/dist/commands/secrets.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { defineCommand } from "citty";
|
|
2
|
-
import { secretsInit } from "./secrets/init.js";
|
|
3
|
-
import { secretsPath } from "./secrets/path.js";
|
|
4
|
-
import { secretsSync } from "./secrets/sync.js";
|
|
5
|
-
import { secretsVerify } from "./secrets/verify.js";
|
|
6
|
-
export const secrets = defineCommand({
|
|
7
|
-
meta: {
|
|
8
|
-
name: "secrets",
|
|
9
|
-
description: "Secrets workflow (/secrets + extra-files + sync).",
|
|
10
|
-
},
|
|
11
|
-
subCommands: {
|
|
12
|
-
init: secretsInit,
|
|
13
|
-
verify: secretsVerify,
|
|
14
|
-
sync: secretsSync,
|
|
15
|
-
path: secretsPath,
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
//# sourceMappingURL=secrets.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC;IACnC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,mDAAmD;KACjE;IACD,WAAW,EAAE;QACX,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;KAClB;CACF,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/commands/server/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/commands/server/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
export declare const serverDeploy: import("citty").CommandDef<{
|
|
2
|
-
runtimeDir: {
|
|
3
|
-
type: "string";
|
|
4
|
-
description: string;
|
|
5
|
-
};
|
|
6
|
-
envFile: {
|
|
7
|
-
type: "string";
|
|
8
|
-
description: string;
|
|
9
|
-
};
|
|
10
|
-
host: {
|
|
11
|
-
type: "string";
|
|
12
|
-
description: string;
|
|
13
|
-
};
|
|
14
|
-
targetHost: {
|
|
15
|
-
type: "string";
|
|
16
|
-
description: string;
|
|
17
|
-
};
|
|
18
|
-
rev: {
|
|
19
|
-
type: "string";
|
|
20
|
-
description: string;
|
|
21
|
-
default: string;
|
|
22
|
-
};
|
|
23
|
-
toplevel: {
|
|
24
|
-
type: "string";
|
|
25
|
-
description: string;
|
|
26
|
-
};
|
|
27
|
-
manifest: {
|
|
28
|
-
type: "string";
|
|
29
|
-
description: string;
|
|
30
|
-
};
|
|
31
|
-
manifestSignature: {
|
|
32
|
-
type: "string";
|
|
33
|
-
description: string;
|
|
34
|
-
};
|
|
35
|
-
manifestPublicKey: {
|
|
36
|
-
type: "string";
|
|
37
|
-
description: string;
|
|
38
|
-
};
|
|
39
|
-
manifestPublicKeyFile: {
|
|
40
|
-
type: "string";
|
|
41
|
-
description: string;
|
|
42
|
-
};
|
|
43
|
-
manifestOut: {
|
|
44
|
-
type: "string";
|
|
45
|
-
description: string;
|
|
46
|
-
};
|
|
47
|
-
sshTty: {
|
|
48
|
-
type: "boolean";
|
|
49
|
-
description: string;
|
|
50
|
-
default: true;
|
|
51
|
-
};
|
|
52
|
-
}>;
|
|
53
|
-
//# sourceMappingURL=deploy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/server/deploy.ts"],"names":[],"mappings":"AA2CA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmJvB,CAAC"}
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import process from "node:process";
|
|
4
|
-
import { defineCommand } from "citty";
|
|
5
|
-
import { resolveGitRev } from "@clawdlets/core/lib/git";
|
|
6
|
-
import { capture, run } from "@clawdlets/core/lib/run";
|
|
7
|
-
import { loadDeployCreds } from "@clawdlets/core/lib/deploy-creds";
|
|
8
|
-
import { withFlakesEnv } from "@clawdlets/core/lib/nix-flakes";
|
|
9
|
-
import { shellQuote, sshRun } from "@clawdlets/core/lib/ssh-remote";
|
|
10
|
-
import { getHostSecretsDir } from "@clawdlets/core/repo-layout";
|
|
11
|
-
import { createSecretsTar } from "@clawdlets/core/lib/secrets-tar";
|
|
12
|
-
import { requireDeployGate } from "../../lib/deploy-gate.js";
|
|
13
|
-
import { loadHostContextOrExit } from "../../lib/context.js";
|
|
14
|
-
import { needsSudo, requireTargetHost } from "../ssh-target.js";
|
|
15
|
-
import { formatDeployManifest, parseDeployManifest, requireToplevel } from "../../lib/deploy-manifest.js";
|
|
16
|
-
import { resolveManifestPublicKey, resolveManifestSignaturePath, verifyManifestSignature } from "../../lib/manifest-signature.js";
|
|
17
|
-
import { requireLinuxForLocalNixosBuild } from "../../lib/linux-build.js";
|
|
18
|
-
async function buildLocalToplevel(params) {
|
|
19
|
-
requireLinuxForLocalNixosBuild({ platform: process.platform, command: "clawdlets server deploy" });
|
|
20
|
-
const attr = `.#nixosConfigurations.${params.host}.config.system.build.toplevel`;
|
|
21
|
-
const out = await capture(params.nixBin, ["build", "--json", "--no-link", attr], {
|
|
22
|
-
cwd: params.repoRoot,
|
|
23
|
-
env: withFlakesEnv(process.env),
|
|
24
|
-
});
|
|
25
|
-
let parsed;
|
|
26
|
-
try {
|
|
27
|
-
parsed = JSON.parse(out);
|
|
28
|
-
}
|
|
29
|
-
catch (e) {
|
|
30
|
-
throw new Error(`nix build --json returned invalid JSON (${String(e?.message || e)})`);
|
|
31
|
-
}
|
|
32
|
-
const toplevel = parsed?.[0]?.outputs?.out;
|
|
33
|
-
if (!toplevel || typeof toplevel !== "string") {
|
|
34
|
-
throw new Error("nix build did not return a toplevel store path");
|
|
35
|
-
}
|
|
36
|
-
return requireToplevel(toplevel);
|
|
37
|
-
}
|
|
38
|
-
export const serverDeploy = defineCommand({
|
|
39
|
-
meta: {
|
|
40
|
-
name: "deploy",
|
|
41
|
-
description: "Deploy a prebuilt NixOS system + secrets by store path.",
|
|
42
|
-
},
|
|
43
|
-
args: {
|
|
44
|
-
runtimeDir: { type: "string", description: "Runtime directory (default: .clawdlets)." },
|
|
45
|
-
envFile: { type: "string", description: "Env file for deploy creds (default: <runtimeDir>/env)." },
|
|
46
|
-
host: { type: "string", description: "Host name (defaults to clawdlets.json defaultHost / sole host)." },
|
|
47
|
-
targetHost: { type: "string", description: "SSH target override (default: from clawdlets.json)." },
|
|
48
|
-
rev: { type: "string", description: "Git rev to pin (HEAD/sha/tag).", default: "HEAD" },
|
|
49
|
-
toplevel: { type: "string", description: "NixOS system toplevel store path (CI mode)." },
|
|
50
|
-
manifest: { type: "string", description: "Path to deploy manifest JSON (CI mode)." },
|
|
51
|
-
manifestSignature: { type: "string", description: "Path to manifest minisign signature (.minisig)." },
|
|
52
|
-
manifestPublicKey: { type: "string", description: "Minisign public key string (verify manifest)." },
|
|
53
|
-
manifestPublicKeyFile: { type: "string", description: "Path to minisign public key (verify manifest)." },
|
|
54
|
-
manifestOut: { type: "string", description: "Write deploy manifest JSON to this path." },
|
|
55
|
-
sshTty: { type: "boolean", description: "Allocate TTY for sudo prompts.", default: true },
|
|
56
|
-
},
|
|
57
|
-
async run({ args }) {
|
|
58
|
-
const cwd = process.cwd();
|
|
59
|
-
const ctx = loadHostContextOrExit({ cwd, runtimeDir: args.runtimeDir, hostArg: args.host });
|
|
60
|
-
if (!ctx)
|
|
61
|
-
return;
|
|
62
|
-
const { repoRoot, layout, hostName, hostCfg } = ctx;
|
|
63
|
-
await requireDeployGate({
|
|
64
|
-
runtimeDir: args.runtimeDir,
|
|
65
|
-
envFile: args.envFile,
|
|
66
|
-
host: hostName,
|
|
67
|
-
scope: "server-deploy",
|
|
68
|
-
strict: false,
|
|
69
|
-
skipGithubTokenCheck: true,
|
|
70
|
-
});
|
|
71
|
-
const targetHost = requireTargetHost(String(args.targetHost || hostCfg.targetHost || ""), hostName);
|
|
72
|
-
const sudo = needsSudo(targetHost);
|
|
73
|
-
const deployCreds = loadDeployCreds({ cwd, runtimeDir: args.runtimeDir, envFile: args.envFile });
|
|
74
|
-
if (deployCreds.envFile?.origin === "explicit" && deployCreds.envFile.status !== "ok") {
|
|
75
|
-
throw new Error(`deploy env file rejected: ${deployCreds.envFile.path} (${deployCreds.envFile.error || deployCreds.envFile.status})`);
|
|
76
|
-
}
|
|
77
|
-
const nixBin = String(deployCreds.values.NIX_BIN || "nix").trim() || "nix";
|
|
78
|
-
const manifestPath = String(args.manifest || "").trim();
|
|
79
|
-
const toplevelArg = String(args.toplevel || "").trim();
|
|
80
|
-
if (manifestPath && toplevelArg)
|
|
81
|
-
throw new Error("use either --manifest or --toplevel (not both)");
|
|
82
|
-
let resolvedRev = "";
|
|
83
|
-
let toplevel = "";
|
|
84
|
-
let manifestDigest;
|
|
85
|
-
if (manifestPath) {
|
|
86
|
-
const signaturePath = resolveManifestSignaturePath({
|
|
87
|
-
cwd,
|
|
88
|
-
manifestPath,
|
|
89
|
-
signaturePathArg: args.manifestSignature,
|
|
90
|
-
});
|
|
91
|
-
const publicKey = resolveManifestPublicKey({
|
|
92
|
-
publicKeyArg: args.manifestPublicKey,
|
|
93
|
-
publicKeyFileArg: args.manifestPublicKeyFile,
|
|
94
|
-
defaultKeyPath: path.join(repoRoot, "config", "manifest.minisign.pub"),
|
|
95
|
-
hostPublicKey: hostCfg?.selfUpdate?.publicKey,
|
|
96
|
-
});
|
|
97
|
-
await verifyManifestSignature({ manifestPath, signaturePath, publicKey });
|
|
98
|
-
const manifest = parseDeployManifest(manifestPath);
|
|
99
|
-
if (manifest.host !== hostName) {
|
|
100
|
-
throw new Error(`manifest host mismatch: ${manifest.host} vs ${hostName}`);
|
|
101
|
-
}
|
|
102
|
-
const revArg = String(args.rev || "").trim();
|
|
103
|
-
if (revArg && revArg !== "HEAD" && revArg !== manifest.rev) {
|
|
104
|
-
throw new Error(`manifest rev mismatch: ${manifest.rev} vs ${revArg}`);
|
|
105
|
-
}
|
|
106
|
-
resolvedRev = manifest.rev;
|
|
107
|
-
toplevel = manifest.toplevel;
|
|
108
|
-
manifestDigest = manifest.secretsDigest;
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
const revRaw = String(args.rev || "").trim() || "HEAD";
|
|
112
|
-
const resolved = await resolveGitRev(layout.repoRoot, revRaw);
|
|
113
|
-
if (!resolved)
|
|
114
|
-
throw new Error(`unable to resolve git rev: ${revRaw}`);
|
|
115
|
-
resolvedRev = resolved;
|
|
116
|
-
if (toplevelArg) {
|
|
117
|
-
toplevel = requireToplevel(toplevelArg);
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
const flakeHost = String(hostCfg.flakeHost || hostName).trim() || hostName;
|
|
121
|
-
toplevel = await buildLocalToplevel({ repoRoot, nixBin, host: flakeHost });
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
const secretsDir = getHostSecretsDir(layout, hostName);
|
|
125
|
-
const { tarPath: tarLocal, digest } = await createSecretsTar({ hostName, localDir: secretsDir });
|
|
126
|
-
const tarRemote = `/tmp/clawdlets-secrets.${hostName}.${process.pid}.tgz`;
|
|
127
|
-
if (manifestDigest && manifestDigest !== digest) {
|
|
128
|
-
throw new Error(`secrets digest mismatch (manifest ${manifestDigest}, local ${digest}); regenerate or omit secretsDigest`);
|
|
129
|
-
}
|
|
130
|
-
try {
|
|
131
|
-
await run("scp", [tarLocal, `${targetHost}:${tarRemote}`], { redact: [] });
|
|
132
|
-
}
|
|
133
|
-
finally {
|
|
134
|
-
try {
|
|
135
|
-
if (fs.existsSync(tarLocal))
|
|
136
|
-
fs.unlinkSync(tarLocal);
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
// best-effort cleanup
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
const installCmd = [
|
|
143
|
-
...(sudo ? ["sudo"] : []),
|
|
144
|
-
"/etc/clawdlets/bin/install-secrets",
|
|
145
|
-
"--host",
|
|
146
|
-
hostName,
|
|
147
|
-
"--tar",
|
|
148
|
-
tarRemote,
|
|
149
|
-
"--rev",
|
|
150
|
-
resolvedRev,
|
|
151
|
-
"--digest",
|
|
152
|
-
digest,
|
|
153
|
-
].map(shellQuote).join(" ");
|
|
154
|
-
await sshRun(targetHost, installCmd, { tty: sudo && args.sshTty });
|
|
155
|
-
const switchCmd = [
|
|
156
|
-
...(sudo ? ["sudo"] : []),
|
|
157
|
-
"/etc/clawdlets/bin/switch-system",
|
|
158
|
-
"--toplevel",
|
|
159
|
-
toplevel,
|
|
160
|
-
"--rev",
|
|
161
|
-
resolvedRev,
|
|
162
|
-
].map(shellQuote).join(" ");
|
|
163
|
-
await sshRun(targetHost, switchCmd, { tty: sudo && args.sshTty });
|
|
164
|
-
const manifestOutRaw = String(args.manifestOut || "").trim();
|
|
165
|
-
const manifestOut = manifestOutRaw
|
|
166
|
-
? (path.isAbsolute(manifestOutRaw) ? manifestOutRaw : path.resolve(cwd, manifestOutRaw))
|
|
167
|
-
: (manifestPath ? "" : path.join(layout.runtimeDir, "deploy.json"));
|
|
168
|
-
if (manifestOut) {
|
|
169
|
-
fs.mkdirSync(path.dirname(manifestOut), { recursive: true });
|
|
170
|
-
const manifest = { rev: resolvedRev, host: hostName, toplevel, secretsDigest: digest };
|
|
171
|
-
fs.writeFileSync(manifestOut, formatDeployManifest(manifest), "utf8");
|
|
172
|
-
console.log(`ok: wrote deploy manifest ${manifestOut}`);
|
|
173
|
-
}
|
|
174
|
-
console.log(`ok: deployed ${hostName} (${resolvedRev})`);
|
|
175
|
-
},
|
|
176
|
-
});
|
|
177
|
-
//# sourceMappingURL=deploy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/server/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github-sync.d.ts","sourceRoot":"","sources":["../../../src/commands/server/github-sync.ts"],"names":[],"mappings":"AA4JA,eAAO,MAAM,gBAAgB,qDAW3B,CAAC"}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import process from "node:process";
|
|
2
|
-
import { defineCommand } from "citty";
|
|
3
|
-
import { shellQuote, sshRun } from "@clawdlets/core/lib/ssh-remote";
|
|
4
|
-
import { needsSudo, requireTargetHost } from "./common.js";
|
|
5
|
-
import { loadHostContextOrExit } from "../../lib/context.js";
|
|
6
|
-
function normalizeKind(raw) {
|
|
7
|
-
const v = raw.trim();
|
|
8
|
-
if (v === "prs" || v === "issues")
|
|
9
|
-
return v;
|
|
10
|
-
throw new Error(`invalid --kind: ${raw} (expected prs|issues)`);
|
|
11
|
-
}
|
|
12
|
-
const serverGithubSyncStatus = defineCommand({
|
|
13
|
-
meta: {
|
|
14
|
-
name: "status",
|
|
15
|
-
description: "Show GitHub sync timers (clawdbot-gh-sync-*.timer).",
|
|
16
|
-
},
|
|
17
|
-
args: {
|
|
18
|
-
runtimeDir: { type: "string", description: "Runtime directory (default: .clawdlets)." },
|
|
19
|
-
host: { type: "string", description: "Host name (defaults to clawdlets.json defaultHost / sole host)." },
|
|
20
|
-
targetHost: { type: "string", description: "SSH target override (default: from clawdlets.json)." },
|
|
21
|
-
sshTty: { type: "boolean", description: "Allocate TTY for sudo prompts.", default: true },
|
|
22
|
-
},
|
|
23
|
-
async run({ args }) {
|
|
24
|
-
const cwd = process.cwd();
|
|
25
|
-
const ctx = loadHostContextOrExit({ cwd, runtimeDir: args.runtimeDir, hostArg: args.host });
|
|
26
|
-
if (!ctx)
|
|
27
|
-
return;
|
|
28
|
-
const { hostName, hostCfg } = ctx;
|
|
29
|
-
const targetHost = requireTargetHost(String(args.targetHost || hostCfg.targetHost || ""), hostName);
|
|
30
|
-
const sudo = needsSudo(targetHost);
|
|
31
|
-
const remoteCmd = [
|
|
32
|
-
...(sudo ? ["sudo"] : []),
|
|
33
|
-
"systemctl",
|
|
34
|
-
"list-timers",
|
|
35
|
-
"--all",
|
|
36
|
-
"--no-pager",
|
|
37
|
-
shellQuote("clawdbot-gh-sync-*.timer"),
|
|
38
|
-
].join(" ");
|
|
39
|
-
await sshRun(targetHost, remoteCmd, { tty: sudo && args.sshTty });
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
const serverGithubSyncRun = defineCommand({
|
|
43
|
-
meta: {
|
|
44
|
-
name: "run",
|
|
45
|
-
description: "Run a GitHub sync now (oneshot).",
|
|
46
|
-
},
|
|
47
|
-
args: {
|
|
48
|
-
runtimeDir: { type: "string", description: "Runtime directory (default: .clawdlets)." },
|
|
49
|
-
host: { type: "string", description: "Host name (defaults to clawdlets.json defaultHost / sole host)." },
|
|
50
|
-
targetHost: { type: "string", description: "SSH target override (default: from clawdlets.json)." },
|
|
51
|
-
bot: { type: "string", description: "Bot id (default: all bots with sync enabled)." },
|
|
52
|
-
sshTty: { type: "boolean", description: "Allocate TTY for sudo prompts.", default: true },
|
|
53
|
-
},
|
|
54
|
-
async run({ args }) {
|
|
55
|
-
const cwd = process.cwd();
|
|
56
|
-
const ctx = loadHostContextOrExit({ cwd, runtimeDir: args.runtimeDir, hostArg: args.host });
|
|
57
|
-
if (!ctx)
|
|
58
|
-
return;
|
|
59
|
-
const { hostName, hostCfg } = ctx;
|
|
60
|
-
const targetHost = requireTargetHost(String(args.targetHost || hostCfg.targetHost || ""), hostName);
|
|
61
|
-
const bot = String(args.bot || "").trim();
|
|
62
|
-
const unit = bot ? `clawdbot-gh-sync-${bot}.service` : "clawdbot-gh-sync-*.service";
|
|
63
|
-
const sudo = needsSudo(targetHost);
|
|
64
|
-
const remoteCmd = [
|
|
65
|
-
...(sudo ? ["sudo"] : []),
|
|
66
|
-
"systemctl",
|
|
67
|
-
"start",
|
|
68
|
-
shellQuote(unit),
|
|
69
|
-
].join(" ");
|
|
70
|
-
await sshRun(targetHost, remoteCmd, { tty: sudo && args.sshTty });
|
|
71
|
-
},
|
|
72
|
-
});
|
|
73
|
-
const serverGithubSyncLogs = defineCommand({
|
|
74
|
-
meta: {
|
|
75
|
-
name: "logs",
|
|
76
|
-
description: "Show GitHub sync logs (journalctl).",
|
|
77
|
-
},
|
|
78
|
-
args: {
|
|
79
|
-
runtimeDir: { type: "string", description: "Runtime directory (default: .clawdlets)." },
|
|
80
|
-
host: { type: "string", description: "Host name (defaults to clawdlets.json defaultHost / sole host)." },
|
|
81
|
-
targetHost: { type: "string", description: "SSH target override (default: from clawdlets.json)." },
|
|
82
|
-
bot: { type: "string", description: "Bot id (required)." },
|
|
83
|
-
follow: { type: "boolean", description: "Follow logs.", default: false },
|
|
84
|
-
lines: { type: "string", description: "Number of lines (default: 200).", default: "200" },
|
|
85
|
-
sshTty: { type: "boolean", description: "Allocate TTY for sudo prompts.", default: true },
|
|
86
|
-
},
|
|
87
|
-
async run({ args }) {
|
|
88
|
-
const cwd = process.cwd();
|
|
89
|
-
const ctx = loadHostContextOrExit({ cwd, runtimeDir: args.runtimeDir, hostArg: args.host });
|
|
90
|
-
if (!ctx)
|
|
91
|
-
return;
|
|
92
|
-
const { hostName, hostCfg } = ctx;
|
|
93
|
-
const targetHost = requireTargetHost(String(args.targetHost || hostCfg.targetHost || ""), hostName);
|
|
94
|
-
const bot = String(args.bot || "").trim();
|
|
95
|
-
if (!bot)
|
|
96
|
-
throw new Error("missing --bot (example: --bot maren)");
|
|
97
|
-
const sudo = needsSudo(targetHost);
|
|
98
|
-
const unit = `clawdbot-gh-sync-${bot}.service`;
|
|
99
|
-
const n = String(args.lines || "200").trim() || "200";
|
|
100
|
-
if (!/^\d+$/.test(n) || Number(n) <= 0)
|
|
101
|
-
throw new Error(`invalid --lines: ${n}`);
|
|
102
|
-
const remoteCmd = [
|
|
103
|
-
...(sudo ? ["sudo"] : []),
|
|
104
|
-
"journalctl",
|
|
105
|
-
"-u",
|
|
106
|
-
shellQuote(unit),
|
|
107
|
-
"-n",
|
|
108
|
-
shellQuote(n),
|
|
109
|
-
...(args.follow ? ["-f"] : []),
|
|
110
|
-
"--no-pager",
|
|
111
|
-
].join(" ");
|
|
112
|
-
await sshRun(targetHost, remoteCmd, { tty: sudo && args.sshTty });
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
const serverGithubSyncShow = defineCommand({
|
|
116
|
-
meta: {
|
|
117
|
-
name: "show",
|
|
118
|
-
description: "Show the last synced snapshot (prs|issues) from bot workspace memory.",
|
|
119
|
-
},
|
|
120
|
-
args: {
|
|
121
|
-
runtimeDir: { type: "string", description: "Runtime directory (default: .clawdlets)." },
|
|
122
|
-
host: { type: "string", description: "Host name (defaults to clawdlets.json defaultHost / sole host)." },
|
|
123
|
-
targetHost: { type: "string", description: "SSH target override (default: from clawdlets.json)." },
|
|
124
|
-
bot: { type: "string", description: "Bot id (required)." },
|
|
125
|
-
kind: { type: "string", description: "Snapshot kind: prs|issues.", default: "prs" },
|
|
126
|
-
lines: { type: "string", description: "Max lines to print (default: 200).", default: "200" },
|
|
127
|
-
sshTty: { type: "boolean", description: "Allocate TTY for sudo prompts.", default: true },
|
|
128
|
-
},
|
|
129
|
-
async run({ args }) {
|
|
130
|
-
const cwd = process.cwd();
|
|
131
|
-
const ctx = loadHostContextOrExit({ cwd, runtimeDir: args.runtimeDir, hostArg: args.host });
|
|
132
|
-
if (!ctx)
|
|
133
|
-
return;
|
|
134
|
-
const { hostName, hostCfg } = ctx;
|
|
135
|
-
const targetHost = requireTargetHost(String(args.targetHost || hostCfg.targetHost || ""), hostName);
|
|
136
|
-
const bot = String(args.bot || "").trim();
|
|
137
|
-
if (!bot)
|
|
138
|
-
throw new Error("missing --bot (example: --bot maren)");
|
|
139
|
-
const kind = normalizeKind(String(args.kind || "prs"));
|
|
140
|
-
const n = String(args.lines || "200").trim() || "200";
|
|
141
|
-
if (!/^\d+$/.test(n) || Number(n) <= 0)
|
|
142
|
-
throw new Error(`invalid --lines: ${n}`);
|
|
143
|
-
const sudo = needsSudo(targetHost);
|
|
144
|
-
const remoteCmd = [
|
|
145
|
-
...(sudo ? ["sudo"] : []),
|
|
146
|
-
"/etc/clawdlets/bin/gh-sync-read",
|
|
147
|
-
shellQuote(bot),
|
|
148
|
-
shellQuote(kind),
|
|
149
|
-
shellQuote(n),
|
|
150
|
-
].join(" ");
|
|
151
|
-
await sshRun(targetHost, remoteCmd, { tty: sudo && args.sshTty });
|
|
152
|
-
},
|
|
153
|
-
});
|
|
154
|
-
export const serverGithubSync = defineCommand({
|
|
155
|
-
meta: {
|
|
156
|
-
name: "github-sync",
|
|
157
|
-
description: "GitHub inventory sync (systemd timers + logs + snapshots).",
|
|
158
|
-
},
|
|
159
|
-
subCommands: {
|
|
160
|
-
status: serverGithubSyncStatus,
|
|
161
|
-
run: serverGithubSyncRun,
|
|
162
|
-
logs: serverGithubSyncLogs,
|
|
163
|
-
show: serverGithubSyncShow,
|
|
164
|
-
},
|
|
165
|
-
});
|
|
166
|
-
//# sourceMappingURL=github-sync.js.map
|