@treeseed/sdk 0.6.15 → 0.6.17
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/db/d1.d.ts +3493 -0
- package/dist/db/d1.js +8 -0
- package/dist/db/index.d.ts +2 -0
- package/dist/db/index.js +2 -0
- package/dist/db/node-sqlite.d.ts +3544 -0
- package/dist/db/node-sqlite.js +119 -0
- package/dist/db/schema.d.ts +6272 -0
- package/dist/db/schema.js +231 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/operations/providers/default.js +1 -0
- package/dist/operations/services/commit-message-provider.d.ts +33 -1
- package/dist/operations/services/commit-message-provider.js +228 -51
- package/dist/operations/services/config-runtime.js +0 -1
- package/dist/operations/services/deploy.d.ts +19 -5
- package/dist/operations/services/deploy.js +75 -36
- package/dist/operations/services/github-actions-verification.d.ts +123 -0
- package/dist/operations/services/github-actions-verification.js +440 -0
- package/dist/operations/services/mailpit-runtime.d.ts +5 -0
- package/dist/operations/services/mailpit-runtime.js +2 -2
- package/dist/operations/services/repository-save-orchestrator.js +64 -8
- package/dist/operations/services/runtime-tools.d.ts +6 -0
- package/dist/operations/services/runtime-tools.js +11 -0
- package/dist/operations-registry.js +1 -0
- package/dist/platform/contracts.d.ts +6 -0
- package/dist/platform/deploy-config.js +17 -0
- package/dist/reconcile/builtin-adapters.js +2 -16
- package/dist/reconcile/contracts.d.ts +1 -1
- package/dist/reconcile/desired-state.d.ts +6 -0
- package/dist/reconcile/desired-state.js +1 -13
- package/dist/reconcile/engine.d.ts +12 -0
- package/dist/reconcile/state.js +2 -1
- package/dist/reconcile/units.js +0 -1
- package/dist/scripts/tenant-d1-migrate-local.js +5 -2
- package/dist/scripts/tenant-destroy.js +3 -1
- package/dist/sdk.js +2 -6
- package/dist/types/cloudflare.d.ts +0 -1
- package/dist/workflow/operations.d.ts +2 -1
- package/dist/workflow/operations.js +115 -35
- package/dist/workflow-support.d.ts +1 -0
- package/dist/workflow-support.js +6 -0
- package/dist/workflow.d.ts +24 -2
- package/dist/workflow.js +6 -0
- package/package.json +19 -5
- package/templates/github/deploy.workflow.yml +4 -0
- package/dist/wrangler-d1.d.ts +0 -25
- package/dist/wrangler-d1.js +0 -89
|
@@ -226,7 +226,7 @@ function resolveTargetPaths(tenantRoot, scopeOrTarget = "prod") {
|
|
|
226
226
|
target,
|
|
227
227
|
generatedRoot,
|
|
228
228
|
wranglerPath: resolve(generatedRoot, "wrangler.toml"),
|
|
229
|
-
workerEntryPath: resolve(
|
|
229
|
+
workerEntryPath: resolve(tenantRoot, "dist/_worker.js/index.js"),
|
|
230
230
|
statePath
|
|
231
231
|
};
|
|
232
232
|
}
|
|
@@ -314,6 +314,59 @@ function buildPublicVars(deployConfig) {
|
|
|
314
314
|
TREESEED_WEB_CACHE_R2_STALE_IF_ERROR_SECONDS: String(webCachePolicy.r2PublishedObjects.staleIfErrorSeconds)
|
|
315
315
|
};
|
|
316
316
|
}
|
|
317
|
+
function envValue(env, key) {
|
|
318
|
+
const value = env?.[key] ?? process.env[key];
|
|
319
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
320
|
+
}
|
|
321
|
+
const LOCAL_RUNTIME_AUTH_ENV_KEYS = [
|
|
322
|
+
"BETTER_AUTH_URL",
|
|
323
|
+
"TREESEED_SITE_URL",
|
|
324
|
+
"TREESEED_AUTH_MODE",
|
|
325
|
+
"TREESEED_AUTH_INTERNAL_SIGNUP",
|
|
326
|
+
"TREESEED_AUTH_EMAIL_LINKING",
|
|
327
|
+
"TREESEED_AUTH_ALLOW_MEMORY_DB",
|
|
328
|
+
"TREESEED_AUTH_LOCAL_USE_MAILPIT",
|
|
329
|
+
"TREESEED_AUTH_EMAIL_FROM",
|
|
330
|
+
"TREESEED_WEB_SESSION_TTL",
|
|
331
|
+
"TREESEED_API_BOOTSTRAP_ADMIN_ALLOWLIST",
|
|
332
|
+
"TREESEED_API_AUTH_SECRET",
|
|
333
|
+
"TREESEED_API_ISSUER",
|
|
334
|
+
"TREESEED_API_ACCESS_TOKEN_TTL",
|
|
335
|
+
"TREESEED_API_REFRESH_TOKEN_TTL",
|
|
336
|
+
"TREESEED_API_DEVICE_CODE_TTL",
|
|
337
|
+
"TREESEED_API_DEVICE_ACCESS_TOKEN_TTL",
|
|
338
|
+
"TREESEED_API_DEVICE_POLL_INTERVAL",
|
|
339
|
+
"TREESEED_API_WEB_EXCHANGE_TTL",
|
|
340
|
+
"TREESEED_GITHUB_CLIENT_ID",
|
|
341
|
+
"TREESEED_GITHUB_CLIENT_SECRET",
|
|
342
|
+
"TREESEED_GOOGLE_CLIENT_ID",
|
|
343
|
+
"TREESEED_GOOGLE_CLIENT_SECRET",
|
|
344
|
+
"TREESEED_MICROSOFT_CLIENT_ID",
|
|
345
|
+
"TREESEED_MICROSOFT_CLIENT_SECRET",
|
|
346
|
+
"TREESEED_APPLE_CLIENT_ID",
|
|
347
|
+
"TREESEED_APPLE_CLIENT_SECRET"
|
|
348
|
+
];
|
|
349
|
+
function localAuthRuntimeVars(env) {
|
|
350
|
+
return Object.fromEntries(
|
|
351
|
+
LOCAL_RUNTIME_AUTH_ENV_KEYS.map((key) => [key, envValue(env, key)]).filter(([, value]) => value != null)
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
function buildLocalRuntimeVars(deployConfig, state, target, env) {
|
|
355
|
+
if (target.kind !== "persistent" || target.scope !== "local") {
|
|
356
|
+
return {};
|
|
357
|
+
}
|
|
358
|
+
return {
|
|
359
|
+
...localAuthRuntimeVars(env),
|
|
360
|
+
TREESEED_LOCAL_DEV_MODE: envValue(env, "TREESEED_LOCAL_DEV_MODE") ?? "cloudflare",
|
|
361
|
+
TREESEED_FORM_TOKEN_SECRET: envValue(env, "TREESEED_FORM_TOKEN_SECRET") ?? state.generatedSecrets?.TREESEED_FORM_TOKEN_SECRET ?? "treeseed-local-form-token-secret",
|
|
362
|
+
TREESEED_BETTER_AUTH_SECRET: envValue(env, "TREESEED_BETTER_AUTH_SECRET") ?? state.generatedSecrets?.TREESEED_BETTER_AUTH_SECRET ?? state.generatedSecrets?.TREESEED_FORM_TOKEN_SECRET ?? "treeseed-local-better-auth-secret-minimum-32-characters",
|
|
363
|
+
TREESEED_EDITORIAL_PREVIEW_SECRET: envValue(env, "TREESEED_EDITORIAL_PREVIEW_SECRET") ?? state.generatedSecrets?.TREESEED_EDITORIAL_PREVIEW_SECRET ?? "treeseed-local-editorial-preview-secret",
|
|
364
|
+
TREESEED_FORMS_LOCAL_BYPASS_CLOUDFLARE_GUARDS: envValue(env, "TREESEED_FORMS_LOCAL_BYPASS_CLOUDFLARE_GUARDS") ?? "",
|
|
365
|
+
TREESEED_FORMS_LOCAL_USE_MAILPIT: envValue(env, "TREESEED_FORMS_LOCAL_USE_MAILPIT") ?? "false",
|
|
366
|
+
TREESEED_MAILPIT_SMTP_HOST: envValue(env, "TREESEED_MAILPIT_SMTP_HOST") ?? "127.0.0.1",
|
|
367
|
+
TREESEED_MAILPIT_SMTP_PORT: envValue(env, "TREESEED_MAILPIT_SMTP_PORT") ?? "1025"
|
|
368
|
+
};
|
|
369
|
+
}
|
|
317
370
|
function buildSecretMap(deployConfig, state) {
|
|
318
371
|
const generatedSecret = state.generatedSecrets?.TREESEED_FORM_TOKEN_SECRET ?? randomBytes(24).toString("hex");
|
|
319
372
|
const previewSecret = state.generatedSecrets?.TREESEED_EDITORIAL_PREVIEW_SECRET ?? randomBytes(24).toString("hex");
|
|
@@ -344,12 +397,6 @@ function defaultStateFromConfig(deployConfig, target) {
|
|
|
344
397
|
binding: "FORM_GUARD_KV",
|
|
345
398
|
id: `dryrun-${suffix}-form-guard`,
|
|
346
399
|
previewId: `dryrun-${suffix}-form-guard-preview`
|
|
347
|
-
},
|
|
348
|
-
SESSION: {
|
|
349
|
-
name: environmentScopedIdentityName(identity, "session", target),
|
|
350
|
-
binding: "SESSION",
|
|
351
|
-
id: `dryrun-${suffix}-session`,
|
|
352
|
-
previewId: `dryrun-${suffix}-session-preview`
|
|
353
400
|
}
|
|
354
401
|
},
|
|
355
402
|
d1Databases: {
|
|
@@ -508,19 +555,13 @@ function loadDeployState(tenantRoot, deployConfig, options = {}) {
|
|
|
508
555
|
workerName: defaults.workerName,
|
|
509
556
|
kvNamespaces: {
|
|
510
557
|
...defaults.kvNamespaces,
|
|
511
|
-
...persisted.kvNamespaces ?? {},
|
|
512
558
|
FORM_GUARD_KV: {
|
|
513
559
|
...defaults.kvNamespaces.FORM_GUARD_KV,
|
|
514
560
|
...persisted.kvNamespaces?.FORM_GUARD_KV ?? {},
|
|
515
561
|
name: defaults.kvNamespaces.FORM_GUARD_KV.name,
|
|
516
562
|
binding: defaults.kvNamespaces.FORM_GUARD_KV.binding
|
|
517
563
|
},
|
|
518
|
-
SESSION: {
|
|
519
|
-
...defaults.kvNamespaces.SESSION,
|
|
520
|
-
...persisted.kvNamespaces?.SESSION ?? {},
|
|
521
|
-
name: defaults.kvNamespaces.SESSION.name,
|
|
522
|
-
binding: defaults.kvNamespaces.SESSION.binding
|
|
523
|
-
}
|
|
564
|
+
...persisted.kvNamespaces?.SESSION ? { SESSION: persisted.kvNamespaces.SESSION } : {}
|
|
524
565
|
},
|
|
525
566
|
d1Databases: {
|
|
526
567
|
...defaults.d1Databases,
|
|
@@ -685,10 +726,13 @@ function buildWranglerConfigContents(tenantRoot, deployConfig, state, options =
|
|
|
685
726
|
const target = normalizeTarget(options.scope ?? options.target ?? state.target ?? "prod");
|
|
686
727
|
const { generatedRoot } = resolveTargetPaths(tenantRoot, target);
|
|
687
728
|
const workerName = state.workerName ?? targetWorkerName(deployConfig, target);
|
|
688
|
-
const mainPath = relativeFromGeneratedRoot(resolve(
|
|
729
|
+
const mainPath = relativeFromGeneratedRoot(resolve(tenantRoot, "dist/_worker.js/index.js"), generatedRoot);
|
|
689
730
|
const assetsDirectory = relativeFromGeneratedRoot(resolve(tenantRoot, "dist"), generatedRoot);
|
|
690
731
|
const migrationsDir = relativeFromGeneratedRoot(resolve(tenantRoot, "migrations"), generatedRoot);
|
|
691
|
-
const vars =
|
|
732
|
+
const vars = {
|
|
733
|
+
...buildPublicVars(deployConfig),
|
|
734
|
+
...buildLocalRuntimeVars(deployConfig, state, target, options.env)
|
|
735
|
+
};
|
|
692
736
|
const r2Config = deployConfig.cloudflare.r2;
|
|
693
737
|
const r2Binding = resolveConfiguredContentBucketBinding(deployConfig);
|
|
694
738
|
const r2BucketName = resolveConfiguredContentBucketName(deployConfig);
|
|
@@ -711,11 +755,6 @@ function buildWranglerConfigContents(tenantRoot, deployConfig, state, options =
|
|
|
711
755
|
`id = ${renderTomlString(state.kvNamespaces.FORM_GUARD_KV.id)}`,
|
|
712
756
|
`preview_id = ${renderTomlString(state.kvNamespaces.FORM_GUARD_KV.previewId ?? state.kvNamespaces.FORM_GUARD_KV.id)}`,
|
|
713
757
|
"",
|
|
714
|
-
"[[kv_namespaces]]",
|
|
715
|
-
'binding = "SESSION"',
|
|
716
|
-
`id = ${renderTomlString(state.kvNamespaces.SESSION.id)}`,
|
|
717
|
-
`preview_id = ${renderTomlString(state.kvNamespaces.SESSION.previewId ?? state.kvNamespaces.SESSION.id)}`,
|
|
718
|
-
"",
|
|
719
758
|
"[[d1_databases]]",
|
|
720
759
|
'binding = "SITE_DATA_DB"',
|
|
721
760
|
`database_name = ${renderTomlString(state.d1Databases.SITE_DATA_DB.databaseName)}`,
|
|
@@ -737,7 +776,7 @@ function ensureGeneratedWranglerConfig(tenantRoot, options = {}) {
|
|
|
737
776
|
const state = loadDeployState(tenantRoot, deployConfig, { target });
|
|
738
777
|
const { wranglerPath } = resolveTargetPaths(tenantRoot, target);
|
|
739
778
|
const manifestFingerprint = stableHash(JSON.stringify({ deployConfig, targetKey: targetKey(target) }));
|
|
740
|
-
const contents = buildWranglerConfigContents(tenantRoot, deployConfig, state, { target });
|
|
779
|
+
const contents = buildWranglerConfigContents(tenantRoot, deployConfig, state, { target, env: options.env });
|
|
741
780
|
ensureParent(wranglerPath);
|
|
742
781
|
writeFileSync(wranglerPath, contents, "utf8");
|
|
743
782
|
state.lastManifestFingerprint = manifestFingerprint;
|
|
@@ -887,7 +926,7 @@ function buildProvisioningSummary(deployConfig, state, target) {
|
|
|
887
926
|
accountId: resolveConfiguredCloudflareAccountId(deployConfig),
|
|
888
927
|
pages: state.pages ?? null,
|
|
889
928
|
formGuardKv: state.kvNamespaces.FORM_GUARD_KV,
|
|
890
|
-
sessionKv: state.kvNamespaces.SESSION,
|
|
929
|
+
sessionKv: state.kvNamespaces.SESSION ?? null,
|
|
891
930
|
siteDataDb: state.d1Databases.SITE_DATA_DB,
|
|
892
931
|
queue: state.queues?.agentWork ?? null,
|
|
893
932
|
content: state.content ?? null,
|
|
@@ -898,7 +937,6 @@ function buildProvisioningSummary(deployConfig, state, target) {
|
|
|
898
937
|
dlq: state.queues?.agentWork?.dlqName ?? null,
|
|
899
938
|
database: state.d1Databases?.SITE_DATA_DB?.databaseName ?? null,
|
|
900
939
|
formGuardKv: state.kvNamespaces?.FORM_GUARD_KV?.name ?? null,
|
|
901
|
-
sessionKv: state.kvNamespaces?.SESSION?.name ?? null,
|
|
902
940
|
railwayProject: state.services?.worker?.projectName ?? state.services?.api?.projectName ?? null,
|
|
903
941
|
webDomain: configuredWebDomain,
|
|
904
942
|
apiDomain: configuredApiDomain,
|
|
@@ -1254,7 +1292,7 @@ function queueId(entry) {
|
|
|
1254
1292
|
}
|
|
1255
1293
|
function hasProvisionedCloudflareResources(state) {
|
|
1256
1294
|
return Boolean(
|
|
1257
|
-
state?.pages?.projectName && state?.pages?.url && state?.d1Databases?.SITE_DATA_DB?.databaseId && state?.kvNamespaces?.FORM_GUARD_KV?.id && state?.
|
|
1295
|
+
state?.pages?.projectName && state?.pages?.url && state?.d1Databases?.SITE_DATA_DB?.databaseId && state?.kvNamespaces?.FORM_GUARD_KV?.id && state?.queues?.agentWork?.name && state?.content?.bucketName
|
|
1258
1296
|
);
|
|
1259
1297
|
}
|
|
1260
1298
|
function absoluteUrlForPath(baseUrl, path) {
|
|
@@ -1593,11 +1631,13 @@ function destroyCloudflareResources(tenantRoot, options = {}) {
|
|
|
1593
1631
|
state.kvNamespaces.FORM_GUARD_KV.name,
|
|
1594
1632
|
state.kvNamespaces.FORM_GUARD_KV.id
|
|
1595
1633
|
);
|
|
1596
|
-
state.kvNamespaces.SESSION
|
|
1597
|
-
kvNamespaces
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1634
|
+
if (state.kvNamespaces.SESSION?.name) {
|
|
1635
|
+
state.kvNamespaces.SESSION.id = resolveExistingKvIdByName(
|
|
1636
|
+
kvNamespaces,
|
|
1637
|
+
state.kvNamespaces.SESSION.name,
|
|
1638
|
+
state.kvNamespaces.SESSION.id
|
|
1639
|
+
);
|
|
1640
|
+
}
|
|
1601
1641
|
state.d1Databases.SITE_DATA_DB = resolveExistingD1ByName(
|
|
1602
1642
|
d1Databases,
|
|
1603
1643
|
state.d1Databases.SITE_DATA_DB.databaseName,
|
|
@@ -1606,8 +1646,8 @@ function destroyCloudflareResources(tenantRoot, options = {}) {
|
|
|
1606
1646
|
const worker = deleteWorker(tenantRoot, state.workerName, { env, dryRun, force });
|
|
1607
1647
|
const formGuard = deleteKvNamespace(tenantRoot, state.kvNamespaces.FORM_GUARD_KV.id, { env, dryRun });
|
|
1608
1648
|
const formGuardPreview = state.kvNamespaces.FORM_GUARD_KV.previewId && state.kvNamespaces.FORM_GUARD_KV.previewId !== state.kvNamespaces.FORM_GUARD_KV.id ? deleteKvNamespace(tenantRoot, state.kvNamespaces.FORM_GUARD_KV.previewId, { env, dryRun, preview: true }) : null;
|
|
1609
|
-
const session = deleteKvNamespace(tenantRoot, state.kvNamespaces.SESSION.id, { env, dryRun });
|
|
1610
|
-
const sessionPreview = state.kvNamespaces.SESSION
|
|
1649
|
+
const session = state.kvNamespaces.SESSION?.id ? deleteKvNamespace(tenantRoot, state.kvNamespaces.SESSION.id, { env, dryRun }) : null;
|
|
1650
|
+
const sessionPreview = state.kvNamespaces.SESSION?.previewId && state.kvNamespaces.SESSION.previewId !== state.kvNamespaces.SESSION.id ? deleteKvNamespace(tenantRoot, state.kvNamespaces.SESSION.previewId, { env, dryRun, preview: true }) : null;
|
|
1611
1651
|
const database = deleteD1Database(tenantRoot, state.d1Databases.SITE_DATA_DB.databaseName, { env, dryRun });
|
|
1612
1652
|
return {
|
|
1613
1653
|
target,
|
|
@@ -1820,7 +1860,6 @@ function provisionCloudflareResources(tenantRoot, options = {}) {
|
|
|
1820
1860
|
current.url = `https://${current.projectName}.pages.dev`;
|
|
1821
1861
|
};
|
|
1822
1862
|
ensureKv("FORM_GUARD_KV");
|
|
1823
|
-
ensureKv("SESSION");
|
|
1824
1863
|
ensureD1();
|
|
1825
1864
|
ensureQueue();
|
|
1826
1865
|
ensureR2Bucket();
|
|
@@ -1897,7 +1936,6 @@ function verifyProvisionedCloudflareResources(tenantRoot, options = {}) {
|
|
|
1897
1936
|
const checks = {
|
|
1898
1937
|
pages: Boolean(state.pages?.projectName && pagesProjects.find((entry) => entry?.name === state.pages.projectName)),
|
|
1899
1938
|
formGuardKv: Boolean(state.kvNamespaces?.FORM_GUARD_KV?.name && kvNamespaces.find((entry) => entry?.title === state.kvNamespaces.FORM_GUARD_KV.name)),
|
|
1900
|
-
sessionKv: Boolean(state.kvNamespaces?.SESSION?.name && kvNamespaces.find((entry) => entry?.title === state.kvNamespaces.SESSION.name)),
|
|
1901
1939
|
d1: Boolean(state.d1Databases?.SITE_DATA_DB?.databaseName && d1Databases.find((entry) => entry?.name === state.d1Databases.SITE_DATA_DB.databaseName)),
|
|
1902
1940
|
queue: Boolean(state.queues?.agentWork?.name && queues.find((entry) => queueName(entry) === state.queues.agentWork.name)),
|
|
1903
1941
|
dlq: !state.queues?.agentWork?.dlqName || Boolean(queues.find((entry) => queueName(entry) === state.queues.agentWork.dlqName)),
|
|
@@ -2078,7 +2116,6 @@ function printDeploySummary(summary) {
|
|
|
2078
2116
|
console.log(` Account ID: ${summary.accountId}`);
|
|
2079
2117
|
console.log(` D1: ${summary.siteDataDb.databaseName} (${summary.siteDataDb.databaseId})`);
|
|
2080
2118
|
console.log(` KV FORM_GUARD_KV: ${summary.formGuardKv.id}`);
|
|
2081
|
-
console.log(` KV SESSION: ${summary.sessionKv.id}`);
|
|
2082
2119
|
}
|
|
2083
2120
|
function printDestroySummary(result) {
|
|
2084
2121
|
const { summary, operations } = result;
|
|
@@ -2092,7 +2129,9 @@ function printDestroySummary(result) {
|
|
|
2092
2129
|
if (operations.formGuardPreview) {
|
|
2093
2130
|
console.log(` KV FORM_GUARD_KV preview -> ${operations.formGuardPreview.status}`);
|
|
2094
2131
|
}
|
|
2095
|
-
|
|
2132
|
+
if (summary.sessionKv && operations.session) {
|
|
2133
|
+
console.log(` KV SESSION (deprecated): ${summary.sessionKv.name} -> ${operations.session.status}`);
|
|
2134
|
+
}
|
|
2096
2135
|
if (operations.sessionPreview) {
|
|
2097
2136
|
console.log(` KV SESSION preview -> ${operations.sessionPreview.status}`);
|
|
2098
2137
|
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { type GitHubApiClient } from './github-api.ts';
|
|
2
|
+
export type GitHubActionsWorkflowState = 'success' | 'failure' | 'pending' | 'missing' | 'not_pushed' | 'error';
|
|
3
|
+
export type GitHubActionsVerificationTarget = {
|
|
4
|
+
name: string;
|
|
5
|
+
repoPath: string;
|
|
6
|
+
repository: string | null;
|
|
7
|
+
branch: string | null;
|
|
8
|
+
headSha: string | null;
|
|
9
|
+
workflows: string[];
|
|
10
|
+
kind?: 'root' | 'package';
|
|
11
|
+
};
|
|
12
|
+
export type GitHubActionsWorkflowGate = {
|
|
13
|
+
name: string;
|
|
14
|
+
repoPath: string;
|
|
15
|
+
repository?: string;
|
|
16
|
+
workflow: string;
|
|
17
|
+
branch: string;
|
|
18
|
+
headSha: string;
|
|
19
|
+
};
|
|
20
|
+
export type GitHubActionsWorkflowJobStep = {
|
|
21
|
+
name: string;
|
|
22
|
+
number: number | null;
|
|
23
|
+
status: string | null;
|
|
24
|
+
conclusion: string | null;
|
|
25
|
+
startedAt: string | null;
|
|
26
|
+
completedAt: string | null;
|
|
27
|
+
};
|
|
28
|
+
export type GitHubActionsWorkflowJob = {
|
|
29
|
+
id: number;
|
|
30
|
+
name: string;
|
|
31
|
+
status: string | null;
|
|
32
|
+
conclusion: string | null;
|
|
33
|
+
url: string | null;
|
|
34
|
+
steps: GitHubActionsWorkflowJobStep[];
|
|
35
|
+
failedSteps: GitHubActionsWorkflowJobStep[];
|
|
36
|
+
logExcerpt?: string | null;
|
|
37
|
+
};
|
|
38
|
+
export type GitHubActionsWorkflowRunInspection = {
|
|
39
|
+
workflow: string;
|
|
40
|
+
state: GitHubActionsWorkflowState;
|
|
41
|
+
status: string | null;
|
|
42
|
+
conclusion: string | null;
|
|
43
|
+
runId: number | null;
|
|
44
|
+
url: string | null;
|
|
45
|
+
headSha: string | null;
|
|
46
|
+
branch: string | null;
|
|
47
|
+
createdAt: string | null;
|
|
48
|
+
updatedAt: string | null;
|
|
49
|
+
jobs: GitHubActionsWorkflowJob[];
|
|
50
|
+
failedJobs: GitHubActionsWorkflowJob[];
|
|
51
|
+
inspectCommand: string | null;
|
|
52
|
+
message: string | null;
|
|
53
|
+
};
|
|
54
|
+
export type GitHubActionsRepositoryInspection = {
|
|
55
|
+
name: string;
|
|
56
|
+
repoPath: string;
|
|
57
|
+
repository: string | null;
|
|
58
|
+
kind: 'root' | 'package';
|
|
59
|
+
branch: string | null;
|
|
60
|
+
headSha: string | null;
|
|
61
|
+
remoteHeadSha: string | null;
|
|
62
|
+
remoteSynced: boolean;
|
|
63
|
+
state: GitHubActionsWorkflowState;
|
|
64
|
+
message: string | null;
|
|
65
|
+
workflows: GitHubActionsWorkflowRunInspection[];
|
|
66
|
+
};
|
|
67
|
+
export type GitHubActionsVerificationFailure = {
|
|
68
|
+
type: 'repository' | 'workflow' | 'job';
|
|
69
|
+
repository: string | null;
|
|
70
|
+
repoName: string;
|
|
71
|
+
workflow: string | null;
|
|
72
|
+
runId: number | null;
|
|
73
|
+
jobId: number | null;
|
|
74
|
+
jobName: string | null;
|
|
75
|
+
state: GitHubActionsWorkflowState;
|
|
76
|
+
conclusion: string | null;
|
|
77
|
+
url: string | null;
|
|
78
|
+
inspectCommand: string | null;
|
|
79
|
+
message: string;
|
|
80
|
+
failedSteps: GitHubActionsWorkflowJobStep[];
|
|
81
|
+
logExcerpt?: string | null;
|
|
82
|
+
};
|
|
83
|
+
export type GitHubActionsVerificationSummary = {
|
|
84
|
+
repositories: number;
|
|
85
|
+
workflows: number;
|
|
86
|
+
success: number;
|
|
87
|
+
failure: number;
|
|
88
|
+
pending: number;
|
|
89
|
+
missing: number;
|
|
90
|
+
notPushed: number;
|
|
91
|
+
error: number;
|
|
92
|
+
failures: number;
|
|
93
|
+
};
|
|
94
|
+
export type GitHubActionsVerificationReport = {
|
|
95
|
+
checkedAt: string;
|
|
96
|
+
repositories: GitHubActionsRepositoryInspection[];
|
|
97
|
+
failures: GitHubActionsVerificationFailure[];
|
|
98
|
+
summary: GitHubActionsVerificationSummary;
|
|
99
|
+
};
|
|
100
|
+
type GitHubActionsVerificationOptions = {
|
|
101
|
+
client?: GitHubApiClient;
|
|
102
|
+
includeLogs?: boolean;
|
|
103
|
+
logLines?: number;
|
|
104
|
+
};
|
|
105
|
+
export declare function inspectGitHubActionsVerification(targets: GitHubActionsVerificationTarget[], { client, includeLogs, logLines, }?: GitHubActionsVerificationOptions): Promise<GitHubActionsVerificationReport>;
|
|
106
|
+
export declare function skippedGitHubActionsGate(gate: GitHubActionsWorkflowGate, reason: string): {
|
|
107
|
+
name: string;
|
|
108
|
+
repository: string | null;
|
|
109
|
+
workflow: string;
|
|
110
|
+
branch: string;
|
|
111
|
+
headSha: string;
|
|
112
|
+
status: string;
|
|
113
|
+
reason: string;
|
|
114
|
+
conclusion: null;
|
|
115
|
+
runId: null;
|
|
116
|
+
url: null;
|
|
117
|
+
};
|
|
118
|
+
export declare function formatGitHubActionsGateFailure(gate: GitHubActionsWorkflowGate, result: Record<string, unknown>): string;
|
|
119
|
+
export declare function waitForGitHubActionsGate(gate: GitHubActionsWorkflowGate, options?: {
|
|
120
|
+
timeoutSeconds?: number;
|
|
121
|
+
pollSeconds?: number;
|
|
122
|
+
}): Promise<Record<string, unknown>>;
|
|
123
|
+
export {};
|