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.
Files changed (279) hide show
  1. package/dist/main.mjs +4589 -0
  2. package/{dist → node_modules/@clawdlets/core/dist}/lib/context.d.ts +2 -2
  3. package/{dist → node_modules/@clawdlets/core/dist}/lib/context.d.ts.map +1 -1
  4. package/{dist → node_modules/@clawdlets/core/dist}/lib/context.js +2 -2
  5. package/node_modules/@clawdlets/core/dist/lib/context.js.map +1 -0
  6. package/{dist → node_modules/@clawdlets/core/dist}/lib/host-resolve.js +2 -2
  7. package/node_modules/@clawdlets/core/dist/lib/host-resolve.js.map +1 -0
  8. package/node_modules/@clawdlets/core/dist/repo-layout.d.ts +1 -0
  9. package/node_modules/@clawdlets/core/dist/repo-layout.d.ts.map +1 -1
  10. package/node_modules/@clawdlets/core/dist/repo-layout.js +2 -0
  11. package/node_modules/@clawdlets/core/dist/repo-layout.js.map +1 -1
  12. package/node_modules/@clawdlets/core/package.json +1 -3
  13. package/package.json +16 -16
  14. package/dist/commands/bootstrap.d.ts +0 -43
  15. package/dist/commands/bootstrap.d.ts.map +0 -1
  16. package/dist/commands/bootstrap.js +0 -318
  17. package/dist/commands/bootstrap.js.map +0 -1
  18. package/dist/commands/bot.d.ts +0 -2
  19. package/dist/commands/bot.d.ts.map +0 -1
  20. package/dist/commands/bot.js +0 -97
  21. package/dist/commands/bot.js.map +0 -1
  22. package/dist/commands/cattle/common.d.ts +0 -29
  23. package/dist/commands/cattle/common.d.ts.map +0 -1
  24. package/dist/commands/cattle/common.js +0 -102
  25. package/dist/commands/cattle/common.js.map +0 -1
  26. package/dist/commands/cattle/destroy.d.ts +0 -33
  27. package/dist/commands/cattle/destroy.d.ts.map +0 -1
  28. package/dist/commands/cattle/destroy.js +0 -72
  29. package/dist/commands/cattle/destroy.js.map +0 -1
  30. package/dist/commands/cattle/list.d.ts +0 -20
  31. package/dist/commands/cattle/list.d.ts.map +0 -1
  32. package/dist/commands/cattle/list.js +0 -78
  33. package/dist/commands/cattle/list.js.map +0 -1
  34. package/dist/commands/cattle/logs.d.ts +0 -34
  35. package/dist/commands/cattle/logs.d.ts.map +0 -1
  36. package/dist/commands/cattle/logs.js +0 -55
  37. package/dist/commands/cattle/logs.js.map +0 -1
  38. package/dist/commands/cattle/persona.d.ts +0 -2
  39. package/dist/commands/cattle/persona.d.ts.map +0 -1
  40. package/dist/commands/cattle/persona.js +0 -85
  41. package/dist/commands/cattle/persona.js.map +0 -1
  42. package/dist/commands/cattle/reap.d.ts +0 -20
  43. package/dist/commands/cattle/reap.d.ts.map +0 -1
  44. package/dist/commands/cattle/reap.js +0 -60
  45. package/dist/commands/cattle/reap.js.map +0 -1
  46. package/dist/commands/cattle/spawn.d.ts +0 -73
  47. package/dist/commands/cattle/spawn.d.ts.map +0 -1
  48. package/dist/commands/cattle/spawn.js +0 -147
  49. package/dist/commands/cattle/spawn.js.map +0 -1
  50. package/dist/commands/cattle/ssh.d.ts +0 -20
  51. package/dist/commands/cattle/ssh.d.ts.map +0 -1
  52. package/dist/commands/cattle/ssh.js +0 -37
  53. package/dist/commands/cattle/ssh.js.map +0 -1
  54. package/dist/commands/cattle.d.ts +0 -2
  55. package/dist/commands/cattle.d.ts.map +0 -1
  56. package/dist/commands/cattle.js +0 -21
  57. package/dist/commands/cattle.js.map +0 -1
  58. package/dist/commands/config.d.ts +0 -2
  59. package/dist/commands/config.d.ts.map +0 -1
  60. package/dist/commands/config.js +0 -163
  61. package/dist/commands/config.js.map +0 -1
  62. package/dist/commands/doctor.d.ts +0 -35
  63. package/dist/commands/doctor.d.ts.map +0 -1
  64. package/dist/commands/doctor.js +0 -65
  65. package/dist/commands/doctor.js.map +0 -1
  66. package/dist/commands/env.d.ts +0 -22
  67. package/dist/commands/env.d.ts.map +0 -1
  68. package/dist/commands/env.js +0 -132
  69. package/dist/commands/env.js.map +0 -1
  70. package/dist/commands/fleet.d.ts +0 -2
  71. package/dist/commands/fleet.d.ts.map +0 -1
  72. package/dist/commands/fleet.js +0 -61
  73. package/dist/commands/fleet.js.map +0 -1
  74. package/dist/commands/host.d.ts +0 -2
  75. package/dist/commands/host.d.ts.map +0 -1
  76. package/dist/commands/host.js +0 -277
  77. package/dist/commands/host.js.map +0 -1
  78. package/dist/commands/image.d.ts +0 -2
  79. package/dist/commands/image.d.ts.map +0 -1
  80. package/dist/commands/image.js +0 -133
  81. package/dist/commands/image.js.map +0 -1
  82. package/dist/commands/infra.d.ts +0 -2
  83. package/dist/commands/infra.d.ts.map +0 -1
  84. package/dist/commands/infra.js +0 -171
  85. package/dist/commands/infra.js.map +0 -1
  86. package/dist/commands/lockdown.d.ts +0 -25
  87. package/dist/commands/lockdown.d.ts.map +0 -1
  88. package/dist/commands/lockdown.js +0 -93
  89. package/dist/commands/lockdown.js.map +0 -1
  90. package/dist/commands/project.d.ts +0 -2
  91. package/dist/commands/project.d.ts.map +0 -1
  92. package/dist/commands/project.js +0 -264
  93. package/dist/commands/project.js.map +0 -1
  94. package/dist/commands/secrets/common.d.ts +0 -8
  95. package/dist/commands/secrets/common.d.ts.map +0 -1
  96. package/dist/commands/secrets/common.js +0 -20
  97. package/dist/commands/secrets/common.js.map +0 -1
  98. package/dist/commands/secrets/init.d.ts +0 -39
  99. package/dist/commands/secrets/init.d.ts.map +0 -1
  100. package/dist/commands/secrets/init.js +0 -455
  101. package/dist/commands/secrets/init.js.map +0 -1
  102. package/dist/commands/secrets/path.d.ts +0 -11
  103. package/dist/commands/secrets/path.d.ts.map +0 -1
  104. package/dist/commands/secrets/path.js +0 -24
  105. package/dist/commands/secrets/path.js.map +0 -1
  106. package/dist/commands/secrets/sync.d.ts +0 -25
  107. package/dist/commands/secrets/sync.d.ts.map +0 -1
  108. package/dist/commands/secrets/sync.js +0 -67
  109. package/dist/commands/secrets/sync.js.map +0 -1
  110. package/dist/commands/secrets/verify.d.ts +0 -28
  111. package/dist/commands/secrets/verify.d.ts.map +0 -1
  112. package/dist/commands/secrets/verify.js +0 -118
  113. package/dist/commands/secrets/verify.js.map +0 -1
  114. package/dist/commands/secrets.d.ts +0 -2
  115. package/dist/commands/secrets.d.ts.map +0 -1
  116. package/dist/commands/secrets.js +0 -18
  117. package/dist/commands/secrets.js.map +0 -1
  118. package/dist/commands/server/common.d.ts +0 -3
  119. package/dist/commands/server/common.d.ts.map +0 -1
  120. package/dist/commands/server/common.js +0 -3
  121. package/dist/commands/server/common.js.map +0 -1
  122. package/dist/commands/server/deploy.d.ts +0 -53
  123. package/dist/commands/server/deploy.d.ts.map +0 -1
  124. package/dist/commands/server/deploy.js +0 -177
  125. package/dist/commands/server/deploy.js.map +0 -1
  126. package/dist/commands/server/github-sync.d.ts +0 -2
  127. package/dist/commands/server/github-sync.d.ts.map +0 -1
  128. package/dist/commands/server/github-sync.js +0 -166
  129. package/dist/commands/server/github-sync.js.map +0 -1
  130. package/dist/commands/server/manifest.d.ts +0 -28
  131. package/dist/commands/server/manifest.d.ts.map +0 -1
  132. package/dist/commands/server/manifest.js +0 -82
  133. package/dist/commands/server/manifest.js.map +0 -1
  134. package/dist/commands/server.d.ts +0 -2
  135. package/dist/commands/server.d.ts.map +0 -1
  136. package/dist/commands/server.js +0 -267
  137. package/dist/commands/server.js.map +0 -1
  138. package/dist/commands/ssh-target.d.ts +0 -3
  139. package/dist/commands/ssh-target.d.ts.map +0 -1
  140. package/dist/commands/ssh-target.js +0 -15
  141. package/dist/commands/ssh-target.js.map +0 -1
  142. package/dist/lib/context.js.map +0 -1
  143. package/dist/lib/deploy-gate.d.ts +0 -9
  144. package/dist/lib/deploy-gate.d.ts.map +0 -1
  145. package/dist/lib/deploy-gate.js +0 -20
  146. package/dist/lib/deploy-gate.js.map +0 -1
  147. package/dist/lib/deploy-manifest.d.ts +0 -11
  148. package/dist/lib/deploy-manifest.d.ts.map +0 -1
  149. package/dist/lib/deploy-manifest.js +0 -46
  150. package/dist/lib/deploy-manifest.js.map +0 -1
  151. package/dist/lib/doctor-render.d.ts +0 -14
  152. package/dist/lib/doctor-render.d.ts.map +0 -1
  153. package/dist/lib/doctor-render.js +0 -131
  154. package/dist/lib/doctor-render.js.map +0 -1
  155. package/dist/lib/host-resolve.js.map +0 -1
  156. package/dist/lib/linux-build.d.ts +0 -8
  157. package/dist/lib/linux-build.d.ts.map +0 -1
  158. package/dist/lib/linux-build.js +0 -15
  159. package/dist/lib/linux-build.js.map +0 -1
  160. package/dist/lib/manifest-signature.d.ts +0 -17
  161. package/dist/lib/manifest-signature.d.ts.map +0 -1
  162. package/dist/lib/manifest-signature.js +0 -52
  163. package/dist/lib/manifest-signature.js.map +0 -1
  164. package/dist/lib/template-spec.d.ts +0 -9
  165. package/dist/lib/template-spec.d.ts.map +0 -1
  166. package/dist/lib/template-spec.js +0 -50
  167. package/dist/lib/template-spec.js.map +0 -1
  168. package/dist/lib/version.d.ts +0 -3
  169. package/dist/lib/version.d.ts.map +0 -1
  170. package/dist/lib/version.js +0 -17
  171. package/dist/lib/version.js.map +0 -1
  172. package/dist/lib/wizard.d.ts +0 -10
  173. package/dist/lib/wizard.d.ts.map +0 -1
  174. package/dist/lib/wizard.js +0 -25
  175. package/dist/lib/wizard.js.map +0 -1
  176. package/dist/main.d.ts +0 -3
  177. package/dist/main.d.ts.map +0 -1
  178. package/dist/main.js +0 -50
  179. package/dist/main.js.map +0 -1
  180. package/node_modules/@clawdlets/clf-queue/dist/client.d.ts +0 -21
  181. package/node_modules/@clawdlets/clf-queue/dist/client.d.ts.map +0 -1
  182. package/node_modules/@clawdlets/clf-queue/dist/client.js +0 -132
  183. package/node_modules/@clawdlets/clf-queue/dist/client.js.map +0 -1
  184. package/node_modules/@clawdlets/clf-queue/dist/index.d.ts +0 -9
  185. package/node_modules/@clawdlets/clf-queue/dist/index.d.ts.map +0 -1
  186. package/node_modules/@clawdlets/clf-queue/dist/index.js +0 -5
  187. package/node_modules/@clawdlets/clf-queue/dist/index.js.map +0 -1
  188. package/node_modules/@clawdlets/clf-queue/dist/jobs.d.ts +0 -32
  189. package/node_modules/@clawdlets/clf-queue/dist/jobs.d.ts.map +0 -1
  190. package/node_modules/@clawdlets/clf-queue/dist/jobs.js +0 -24
  191. package/node_modules/@clawdlets/clf-queue/dist/jobs.js.map +0 -1
  192. package/node_modules/@clawdlets/clf-queue/dist/protocol.d.ts +0 -118
  193. package/node_modules/@clawdlets/clf-queue/dist/protocol.d.ts.map +0 -1
  194. package/node_modules/@clawdlets/clf-queue/dist/protocol.js +0 -46
  195. package/node_modules/@clawdlets/clf-queue/dist/protocol.js.map +0 -1
  196. package/node_modules/@clawdlets/clf-queue/dist/queue/bootstrap-tokens.d.ts +0 -3
  197. package/node_modules/@clawdlets/clf-queue/dist/queue/bootstrap-tokens.d.ts.map +0 -1
  198. package/node_modules/@clawdlets/clf-queue/dist/queue/bootstrap-tokens.js +0 -112
  199. package/node_modules/@clawdlets/clf-queue/dist/queue/bootstrap-tokens.js.map +0 -1
  200. package/node_modules/@clawdlets/clf-queue/dist/queue/jobs.d.ts +0 -3
  201. package/node_modules/@clawdlets/clf-queue/dist/queue/jobs.d.ts.map +0 -1
  202. package/node_modules/@clawdlets/clf-queue/dist/queue/jobs.js +0 -313
  203. package/node_modules/@clawdlets/clf-queue/dist/queue/jobs.js.map +0 -1
  204. package/node_modules/@clawdlets/clf-queue/dist/queue/migrate.d.ts +0 -2
  205. package/node_modules/@clawdlets/clf-queue/dist/queue/migrate.d.ts.map +0 -1
  206. package/node_modules/@clawdlets/clf-queue/dist/queue/migrate.js +0 -74
  207. package/node_modules/@clawdlets/clf-queue/dist/queue/migrate.js.map +0 -1
  208. package/node_modules/@clawdlets/clf-queue/dist/queue/open.d.ts +0 -3
  209. package/node_modules/@clawdlets/clf-queue/dist/queue/open.d.ts.map +0 -1
  210. package/node_modules/@clawdlets/clf-queue/dist/queue/open.js +0 -27
  211. package/node_modules/@clawdlets/clf-queue/dist/queue/open.js.map +0 -1
  212. package/node_modules/@clawdlets/clf-queue/dist/queue/types.d.ts +0 -113
  213. package/node_modules/@clawdlets/clf-queue/dist/queue/types.d.ts.map +0 -1
  214. package/node_modules/@clawdlets/clf-queue/dist/queue/types.js +0 -2
  215. package/node_modules/@clawdlets/clf-queue/dist/queue/types.js.map +0 -1
  216. package/node_modules/@clawdlets/clf-queue/dist/queue/util.d.ts +0 -10
  217. package/node_modules/@clawdlets/clf-queue/dist/queue/util.d.ts.map +0 -1
  218. package/node_modules/@clawdlets/clf-queue/dist/queue/util.js +0 -30
  219. package/node_modules/@clawdlets/clf-queue/dist/queue/util.js.map +0 -1
  220. package/node_modules/@clawdlets/clf-queue/dist/queue.d.ts +0 -3
  221. package/node_modules/@clawdlets/clf-queue/dist/queue.d.ts.map +0 -1
  222. package/node_modules/@clawdlets/clf-queue/dist/queue.js +0 -2
  223. package/node_modules/@clawdlets/clf-queue/dist/queue.js.map +0 -1
  224. package/node_modules/@clawdlets/clf-queue/package.json +0 -34
  225. package/node_modules/@clawdlets/core/dist/lib/cattle-state.d.ts +0 -25
  226. package/node_modules/@clawdlets/core/dist/lib/cattle-state.d.ts.map +0 -1
  227. package/node_modules/@clawdlets/core/dist/lib/cattle-state.js +0 -136
  228. package/node_modules/@clawdlets/core/dist/lib/cattle-state.js.map +0 -1
  229. package/node_modules/better-sqlite3/LICENSE +0 -21
  230. package/node_modules/better-sqlite3/README.md +0 -99
  231. package/node_modules/better-sqlite3/binding.gyp +0 -38
  232. package/node_modules/better-sqlite3/deps/common.gypi +0 -68
  233. package/node_modules/better-sqlite3/deps/copy.js +0 -31
  234. package/node_modules/better-sqlite3/deps/defines.gypi +0 -41
  235. package/node_modules/better-sqlite3/deps/download.sh +0 -122
  236. package/node_modules/better-sqlite3/deps/patches/1208.patch +0 -15
  237. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +0 -265969
  238. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +0 -13968
  239. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3ext.h +0 -730
  240. package/node_modules/better-sqlite3/deps/sqlite3.gyp +0 -80
  241. package/node_modules/better-sqlite3/deps/test_extension.c +0 -21
  242. package/node_modules/better-sqlite3/lib/database.js +0 -90
  243. package/node_modules/better-sqlite3/lib/index.js +0 -3
  244. package/node_modules/better-sqlite3/lib/methods/aggregate.js +0 -43
  245. package/node_modules/better-sqlite3/lib/methods/backup.js +0 -67
  246. package/node_modules/better-sqlite3/lib/methods/function.js +0 -31
  247. package/node_modules/better-sqlite3/lib/methods/inspect.js +0 -7
  248. package/node_modules/better-sqlite3/lib/methods/pragma.js +0 -12
  249. package/node_modules/better-sqlite3/lib/methods/serialize.js +0 -16
  250. package/node_modules/better-sqlite3/lib/methods/table.js +0 -189
  251. package/node_modules/better-sqlite3/lib/methods/transaction.js +0 -78
  252. package/node_modules/better-sqlite3/lib/methods/wrappers.js +0 -54
  253. package/node_modules/better-sqlite3/lib/sqlite-error.js +0 -20
  254. package/node_modules/better-sqlite3/lib/util.js +0 -12
  255. package/node_modules/better-sqlite3/package.json +0 -59
  256. package/node_modules/better-sqlite3/src/addon.cpp +0 -47
  257. package/node_modules/better-sqlite3/src/better_sqlite3.cpp +0 -74
  258. package/node_modules/better-sqlite3/src/objects/backup.cpp +0 -120
  259. package/node_modules/better-sqlite3/src/objects/backup.hpp +0 -36
  260. package/node_modules/better-sqlite3/src/objects/database.cpp +0 -417
  261. package/node_modules/better-sqlite3/src/objects/database.hpp +0 -103
  262. package/node_modules/better-sqlite3/src/objects/statement-iterator.cpp +0 -113
  263. package/node_modules/better-sqlite3/src/objects/statement-iterator.hpp +0 -50
  264. package/node_modules/better-sqlite3/src/objects/statement.cpp +0 -383
  265. package/node_modules/better-sqlite3/src/objects/statement.hpp +0 -58
  266. package/node_modules/better-sqlite3/src/util/bind-map.cpp +0 -73
  267. package/node_modules/better-sqlite3/src/util/binder.cpp +0 -193
  268. package/node_modules/better-sqlite3/src/util/constants.cpp +0 -172
  269. package/node_modules/better-sqlite3/src/util/custom-aggregate.cpp +0 -121
  270. package/node_modules/better-sqlite3/src/util/custom-function.cpp +0 -59
  271. package/node_modules/better-sqlite3/src/util/custom-table.cpp +0 -409
  272. package/node_modules/better-sqlite3/src/util/data-converter.cpp +0 -17
  273. package/node_modules/better-sqlite3/src/util/data.cpp +0 -194
  274. package/node_modules/better-sqlite3/src/util/helpers.cpp +0 -109
  275. package/node_modules/better-sqlite3/src/util/macros.cpp +0 -70
  276. package/node_modules/better-sqlite3/src/util/query-macros.cpp +0 -71
  277. package/node_modules/better-sqlite3/src/util/row-builder.cpp +0 -49
  278. /package/{dist → node_modules/@clawdlets/core/dist}/lib/host-resolve.d.ts +0 -0
  279. /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":"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"}
@@ -1,2 +0,0 @@
1
- export declare const secrets: import("citty").CommandDef<import("citty").ArgsDef>;
2
- //# sourceMappingURL=secrets.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,OAAO,qDAWlB,CAAC"}
@@ -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,3 +0,0 @@
1
- import { needsSudo, requireTargetHost } from "../ssh-target.js";
2
- export { needsSudo, requireTargetHost };
3
- //# sourceMappingURL=common.d.ts.map
@@ -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,3 +0,0 @@
1
- import { needsSudo, requireTargetHost } from "../ssh-target.js";
2
- export { needsSudo, requireTargetHost };
3
- //# sourceMappingURL=common.js.map
@@ -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,2 +0,0 @@
1
- export declare const serverGithubSync: import("citty").CommandDef<import("citty").ArgsDef>;
2
- //# sourceMappingURL=github-sync.d.ts.map
@@ -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