@keystrokehq/cli 0.1.85 → 0.1.87
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/README.md +3 -3
- package/dist/index.mjs +185 -13
- package/dist/index.mjs.map +1 -1
- package/dist/maybe-auto-update-x2nClrff.mjs +139 -0
- package/dist/maybe-auto-update-x2nClrff.mjs.map +1 -0
- package/dist/{maybe-auto-update-B3xm1MYv.mjs → run-package-manager-update-BycMpenj.mjs} +183 -114
- package/dist/run-package-manager-update-BycMpenj.mjs.map +1 -0
- package/dist/skills-bundle/_AGENTS.mcp.md +9 -0
- package/dist/skills-bundle/_AGENTS.md +14 -4
- package/dist/templates/hello-world/package.json +0 -1
- package/package.json +1 -1
- package/dist/maybe-auto-update-B3xm1MYv.mjs.map +0 -1
- package/dist/version-ikvpTH-2.mjs +0 -187
- package/dist/version-ikvpTH-2.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ Keep the CLI small and boring.
|
|
|
15
15
|
- **Agent-first** — commands should be predictable, scriptable, and easy for AI agents to invoke
|
|
16
16
|
- **Split concerns** — non-secret config in one place, secrets in the OS keychain
|
|
17
17
|
|
|
18
|
-
Right now the CLI exposes `init`, `build`, `dev`, `start`, `lint`, `typecheck`, `test`, `deploy`, `health`, `auth`, `--help`, and `--version`.
|
|
18
|
+
Right now the CLI exposes `init`, `build`, `dev`, `start`, `lint`, `typecheck`, `test`, `deploy`, `pull`, `update`, `health`, `auth`, `--help`, and `--version`.
|
|
19
19
|
|
|
20
20
|
## Command grammar
|
|
21
21
|
|
|
@@ -24,7 +24,7 @@ Stripe-style: plural REST collection, then a verb, then the primary slug. New co
|
|
|
24
24
|
```text
|
|
25
25
|
keystroke <collection> <verb> [<slug>] [<sub-id>] [--flags]
|
|
26
26
|
keystroke <collection> <sub-collection> <verb> [<slug>] [<sub-id>] [--flags]
|
|
27
|
-
keystroke <verb> # lifecycle only (init, build, dev, deploy, …)
|
|
27
|
+
keystroke <verb> # lifecycle only (init, build, dev, deploy, update, …)
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
Rules:
|
|
@@ -134,7 +134,7 @@ keystroke init --name my-app --dir ./my-app --yes --skip-install
|
|
|
134
134
|
| `--skip-install` | Don't run package manager install |
|
|
135
135
|
| `--pm` | Force npm, pnpm, yarn, or bun |
|
|
136
136
|
|
|
137
|
-
Scaffolded projects include a committed `tsconfig.json` and `package.json` scripts for `lint`, `typecheck`, and `test
|
|
137
|
+
Scaffolded projects include a committed `tsconfig.json` and `package.json` scripts for `lint`, `typecheck`, and `test` (invoking the globally installed `keystroke` binary). Lint config (oxlint) ships in the CLI bundle; projects declare `@types/node`, TypeScript, and vitest in devDependencies — not `@keystrokehq/cli`.
|
|
138
138
|
|
|
139
139
|
### `lint`
|
|
140
140
|
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { $ as CredentialInstanceRecordSchema, $n as WorkflowRunDetailResponseSchema, $t as PresignProjectSourceResponseSchema, A as ConnectManagedServiceCredentialRequestSchema, An as TriggerRunListResponseSchema, At as ListManagedServiceCredentialsResponseSchema, B as CreateCustomAppResponseSchema, Bn as UpdateProjectMemberResponseSchema, Bt as ManagedServiceCredentialSchema, C as ChannelConnectionListResponseSchema, Cn as SubmitMarketingContactRequestSchema, Ct as ListAgentMemoryFilesResponseSchema, D as ConfirmCheckoutRequestSchema, Dn as TriggerInvokeResponseSchema, Dr as resolvePublicPlatformOrigin, Dt as ListChannelPlatformsResponseSchema, E as CompleteProjectArtifactResponseSchema, En as TriggerInvokeInputsSchema, Er as resolveDocsMcpUrl, Et as ListAppsResponseSchema, F as CreateCredentialInstanceBodySchema, Fn as UpdateManagedServiceCredentialRequestSchema, Ft as ListProjectDeploymentsResponseSchema, G as CreateProjectResponseSchema, Gn as UpsertGatewayAttachmentBodySchema, Gt as OrganizationSidebarBrandingSchema, H as CreateOrganizationResponseSchema, Hn as UpdateProjectSettingsRequestSchema, Ht as McpDiscoverResponseSchema, I as CreateCredentialsRequestSchema, In as UpdateOrganizationMemberRequestSchema, It as ListProjectFilesResponseSchema, J as CredentialAssignmentListResponseSchema, Jn as UserPreferencesPatchSchema, Jt as PresignChatAttachmentRequestSchema, K as CreateSubscriptionCheckoutRequestSchema, Kn as UserAvatarPatchSchema, Kt as PROJECT_PULL_STATE_RELATIVE_PATH, L as CreateCredentialsResponseSchema, Ln as UpdateOrganizationMemberResponseSchema, Lt as ListProjectMembersResponseSchema, M as CreateApiKeyRequestSchema, Mn as UpdateChannelBindingBodySchema, Mt as ListOrganizationMembersPageQuerySchema, N as CreateApiKeyResponseSchema, Nn as UpdateCredentialInstanceBodySchema, Nt as ListOrganizationMembersPageResponseSchema, O as ConfirmCheckoutResponseSchema, On as TriggerListResponseSchema, Or as slugifyAppName, Ot as ListCredentialsPageQuerySchema, P as CreateBillingPortalRequestSchema, Pn as UpdateCredentialRequestSchema, Pt as ListOrganizationsResponseSchema, Q as CredentialInstanceListResponseSchema, Qn as WorkflowCanvasSchema, Qt as PresignProjectSourceRequestSchema, R as CreateCreditsCheckoutRequestSchema, Rn as UpdateOrganizationRequestSchema, Rt as ListProjectMetricsResponseSchema, S as ChannelAccountListResponseSchema, Sn as StartOAuthConnectionResultSchema, Sr as parseErrorResponse, T as ChannelDirectoryListResponseSchema, Tn as TriggerDetailResponseSchema, Tr as resolveConnectAppSlug, Tt as ListApiKeysResponseSchema, U as CreateProjectArtifactResponseSchema, Un as UploadProjectSourceManifestRequestSchema, Ut as OpenApiDiscoverResponseSchema, V as CreateOrganizationRequestSchema, Vn as UpdateProjectRequestSchema, Vt as ManagedServiceKindSchema, W as CreateProjectRequestSchema, Wn as UploadProjectSourceResponseSchema, Wt as OrganizationSidebarBrandingPatchSchema, X as CredentialConsumerListQuerySchema, Xn as WorkflowCanvasCredentialBindingsSchema, Xt as PresignOrgLogoRequestSchema, Y as CredentialAssignmentRecordSchema, Yn as UserPreferencesSchema, Yt as PresignChatAttachmentResponseSchema, Z as CredentialConsumerListResponseSchema, Zn as WorkflowCanvasRunSchema, Zt as PresignOrgLogoResponseSchema, _ as BindChannelBodySchema, _n as StartKeystrokeConnectionInputSchema, _r as isAcceptableInstallExit, _t as HistoryRunListResponseSchema, a as AgentSessionListResponseSchema, an as ProjectSettingsResponseSchema, ar as WorkflowSummaryDetailResponseSchema, at as DownloadActiveProjectSourceResponseSchema, b as CatalogAppDetailResponseSchema, bn as StartMcpOAuthConnectionResultSchema, bt as InviteProjectMembersRequestSchema, c as AgentTriggerSummaryListResponseSchema, cn as PromptResponseSchema, cr as WorkspaceTriggerFileSchema, ct as GatewayAttachmentRecordSchema, d as AutoTopupSummarySchema, dn as QueuedRunResponseSchema, dr as WorkspaceTriggerRunListResponseSchema, dt as GetCustomAppResponseSchema, en as PresignUserAvatarRequestSchema, er as WorkflowRunHooksResponseSchema, f as BillingActivityResponseSchema, fr as WorkspaceWorkflowOverviewSchema, ft as GraphqlDiscoverResponseSchema, g as BillingUsageResponseSchema, gn as SlugAvailabilityResponseSchema, gr as detectProjectPackageManagerFromSnapshot, gt as HistoryRunListQuerySchema, h as BillingSummaryResponseSchema, hn as SkillSummaryListResponseSchema, hr as deriveCustomAppDisplay, ht as HistoryRunDetailResponseSchema, i as AgentSessionDetailResponseSchema, in as ProjectResponseSchema, ir as WorkflowRunResponseSchema, it as DownloadActiveProjectArtifactResponseSchema, j as ConnectProvidersResponseSchema, jn as UpdateAutoTopupRequestSchema, jt as ListOrganizationInvitationsResponseSchema, k as ConnectAuthorizeUrlResponseSchema, kn as TriggerRunDetailResponseSchema, kt as ListCredentialsPageResponseSchema, l as AppSlugAvailabilityResponseSchema, lr as WorkspaceTriggerListResponseSchema, lt as GetAppCatalogEntryResponseSchema, m as BillingRedirectResponseSchema, mn as SkillSummaryDetailResponseSchema, mt as HistoryRunCancelResponseSchema, n as AcceptOrganizationInvitationResponseSchema, nn as ProjectPullStateSchema, nr as WorkflowRunInputsSchema, nt as DOCS_SEARCH_TOOL, o as AgentSummaryDetailResponseSchema, on as ProjectSlugAvailabilityResponseSchema, or as WorkflowSummaryListResponseSchema, ot as ErrorResponseSchema, p as BillingInvoiceUrlResponseSchema, pn as RecentResourceListResponseSchema, pr as buildConnectDeeplink, pt as HealthResponseSchema, q as CredentialAssignmentListQuerySchema, qn as UserAvatarSchema, qt as PROJECT_REACHABILITY_REQUEST_TIMEOUT_MS, r as ActiveOrganizationResponseSchema, rn as ProjectReachabilityResponseSchema, rr as WorkflowRunListResponseSchema, rt as DeclineOrganizationInvitationResponseSchema, s as AgentSummaryListResponseSchema, sn as PromptInputSchema, sr as WorkspaceTriggerDetailSchema, st as ExecuteKeystrokeToolRequestSchema, t as ACTIVE_ORG_HEADER, tn as PresignUserAvatarResponseSchema, tr as WorkflowRunInputsPutBodySchema, tt as DOCS_QUERY_TOOL, u as AssignCredentialBodySchema, un as QueuedAgentPromptResponseSchema, ur as WorkspaceTriggerOverviewSchema, ut as GetCredentialResponseSchema, v as CatalogActionDetailResponseSchema, vn as StartKeystrokeConnectionResultSchema, vr as listenPortFromPublicUrl, vt as InviteOrganizationMembersRequestSchema, w as ChannelConnectionSchema, wn as SubmitTeamRequestRequestSchema, wt as ListAgentWorkspaceFilesResponseSchema, x as CatalogAppsPageResponseSchema, xn as StartOAuthConnectionInputSchema, xr as parseAppSlug, xt as InviteProjectMembersResponseSchema, y as CatalogActionsPageResponseSchema, yn as StartMcpOAuthConnectionInputSchema, yt as InviteOrganizationMembersResponseSchema, z as CreateCustomAppRequestSchema, zn as UpdateProjectMemberRequestSchema, zt as ListProjectsResponseSchema } from "./dist-CEmkrm9b.mjs";
|
|
3
3
|
import { i as packProjectArtifact, n as withMcpReadClient, r as mergeFilteredArtifact, t as mapInParallelBatches } from "./dist-uPQD-3bl.mjs";
|
|
4
|
-
import {
|
|
4
|
+
import { C as getWebUrl, E as resolvePlatformUrlForWebUrl, S as getPlatformUrl, _ as isNewerVersion, a as formatReleaseAgeBlockMessage, b as getConfigDir, c as detectManagerFromLockfile, d as detectPackageManager, f as installDependencies$1, g as resolveCliRoot, h as resolvePackageManager, i as fetchLatestCliRelease, l as readCliVersion, m as resolveGithubPackagesToken, n as computeReleaseAgeRetryAfter, o as isReleaseAgeBlock, p as installPlaygroundDependencies, r as readPnpmMinimumReleaseAgeMinutes, s as detectCliInstall, t as runPackageManagerUpdate, u as buildPlaygroundWorkspace, v as createCliConfig, w as DEFAULT_PLATFORM_URL, x as getEffectiveApiTarget, y as getCliConfigDir } from "./run-package-manager-update-BycMpenj.mjs";
|
|
5
5
|
import { createRequire } from "node:module";
|
|
6
6
|
import { Command } from "commander";
|
|
7
7
|
import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
@@ -6662,14 +6662,12 @@ function registerAuthCommand(program) {
|
|
|
6662
6662
|
registerAuthLogoutCommand(auth);
|
|
6663
6663
|
registerAuthStatusCommand(auth);
|
|
6664
6664
|
}
|
|
6665
|
-
|
|
6666
|
-
//#region src/update/ensure-sdk-current.ts
|
|
6667
|
-
const KEYSTROKE_SCOPE = "@keystrokehq/";
|
|
6665
|
+
const KEYSTROKE_SCOPE$1 = "@keystrokehq/";
|
|
6668
6666
|
const REGISTRY_TIMEOUT_MS = 3e3;
|
|
6669
6667
|
function shouldSkip() {
|
|
6670
6668
|
return Boolean(process.env.KEYSTROKE_SKIP_UPDATE || process.env.CI === "true" || process.env.CI === "1");
|
|
6671
6669
|
}
|
|
6672
|
-
function readPackageJson(root) {
|
|
6670
|
+
function readPackageJson$1(root) {
|
|
6673
6671
|
const path = join(root, "package.json");
|
|
6674
6672
|
if (!existsSync(path)) return;
|
|
6675
6673
|
try {
|
|
@@ -6685,16 +6683,19 @@ function isLocalSdkSpec(spec) {
|
|
|
6685
6683
|
return trimmed.startsWith("workspace:") || trimmed.startsWith("link:") || trimmed.startsWith("file:");
|
|
6686
6684
|
}
|
|
6687
6685
|
function listManagedKeystrokePackages(root) {
|
|
6688
|
-
const pkg = readPackageJson(root);
|
|
6686
|
+
const pkg = readPackageJson$1(root);
|
|
6689
6687
|
if (!pkg) return [];
|
|
6690
6688
|
const packages = [];
|
|
6691
6689
|
for (const [name, spec] of Object.entries({
|
|
6692
6690
|
...pkg.dependencies,
|
|
6693
6691
|
...pkg.devDependencies
|
|
6694
|
-
}))
|
|
6692
|
+
})) {
|
|
6693
|
+
if (name === "@keystrokehq/cli") continue;
|
|
6694
|
+
if (name.startsWith(KEYSTROKE_SCOPE$1) && !isLocalSdkSpec(spec)) packages.push({ name });
|
|
6695
|
+
}
|
|
6695
6696
|
return packages;
|
|
6696
6697
|
}
|
|
6697
|
-
function readInstalledVersion(root, packageName) {
|
|
6698
|
+
function readInstalledVersion$1(root, packageName) {
|
|
6698
6699
|
const path = join(root, "node_modules", ...packageName.split("/"), "package.json");
|
|
6699
6700
|
if (!existsSync(path)) return;
|
|
6700
6701
|
try {
|
|
@@ -6726,7 +6727,7 @@ function formatOutdatedLine(pkg) {
|
|
|
6726
6727
|
}
|
|
6727
6728
|
async function packagesNeedingUpdate(root, packages) {
|
|
6728
6729
|
return (await Promise.all(packages.map(async (pkg) => {
|
|
6729
|
-
const installed = readInstalledVersion(root, pkg.name);
|
|
6730
|
+
const installed = readInstalledVersion$1(root, pkg.name);
|
|
6730
6731
|
const latest = await fetchLatestPackageVersion(pkg.name);
|
|
6731
6732
|
if (!latest) return installed ? void 0 : {
|
|
6732
6733
|
name: pkg.name,
|
|
@@ -6741,7 +6742,7 @@ async function packagesNeedingUpdate(root, packages) {
|
|
|
6741
6742
|
}
|
|
6742
6743
|
/**
|
|
6743
6744
|
* Require @keystrokehq/* project dependencies to be on latest before build/deploy.
|
|
6744
|
-
*
|
|
6745
|
+
* Skips `@keystrokehq/cli` (global + self-updating). Throws instead of auto-installing.
|
|
6745
6746
|
*/
|
|
6746
6747
|
async function ensureSdkCurrent(root) {
|
|
6747
6748
|
if (shouldSkip()) return;
|
|
@@ -6750,7 +6751,7 @@ async function ensureSdkCurrent(root) {
|
|
|
6750
6751
|
const outdated = await packagesNeedingUpdate(root, packages);
|
|
6751
6752
|
if (outdated.length === 0) return;
|
|
6752
6753
|
const lines = outdated.map(formatOutdatedLine).join("\n");
|
|
6753
|
-
throw new Error(`Outdated @keystrokehq packages:\n${lines}\n\nPlease
|
|
6754
|
+
throw new Error(`Outdated @keystrokehq packages:\n${lines}\n\nPlease run \`keystroke update\` before continuing.`);
|
|
6754
6755
|
}
|
|
6755
6756
|
//#endregion
|
|
6756
6757
|
//#region src/commands/build.ts
|
|
@@ -7438,7 +7439,6 @@ function buildPlaygroundPackageJson(projectName, targetDir, monorepoRoot) {
|
|
|
7438
7439
|
zod: "latest"
|
|
7439
7440
|
},
|
|
7440
7441
|
devDependencies: {
|
|
7441
|
-
"@keystrokehq/cli": linkSpec(targetDir, join(monorepoRoot, "apps/cli")),
|
|
7442
7442
|
"@types/node": "latest",
|
|
7443
7443
|
typescript: "latest",
|
|
7444
7444
|
vitest: "latest"
|
|
@@ -8485,6 +8485,177 @@ function registerTriggersCommand(program) {
|
|
|
8485
8485
|
registerTriggerToggleCommands(triggers);
|
|
8486
8486
|
}
|
|
8487
8487
|
//#endregion
|
|
8488
|
+
//#region src/update/update-project-packages.ts
|
|
8489
|
+
const KEYSTROKE_SCOPE = "@keystrokehq/";
|
|
8490
|
+
function readPackageJson(root) {
|
|
8491
|
+
const path = join(root, "package.json");
|
|
8492
|
+
if (!existsSync(path)) return;
|
|
8493
|
+
try {
|
|
8494
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
8495
|
+
} catch (error) {
|
|
8496
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
8497
|
+
throw new Error(`Failed to read package.json at ${path}: ${detail}`);
|
|
8498
|
+
}
|
|
8499
|
+
}
|
|
8500
|
+
/** Registry-managed @keystrokehq/* deps (excludes workspace/link/file). */
|
|
8501
|
+
function listUpdatableKeystrokePackages(root) {
|
|
8502
|
+
const pkg = readPackageJson(root);
|
|
8503
|
+
if (!pkg) return [];
|
|
8504
|
+
const packages = [];
|
|
8505
|
+
for (const [name, spec] of Object.entries(pkg.dependencies ?? {})) {
|
|
8506
|
+
if (name === "@keystrokehq/cli") continue;
|
|
8507
|
+
if (name.startsWith(KEYSTROKE_SCOPE) && !isLocalSdkSpec(spec)) packages.push({
|
|
8508
|
+
name,
|
|
8509
|
+
dev: false
|
|
8510
|
+
});
|
|
8511
|
+
}
|
|
8512
|
+
for (const [name, spec] of Object.entries(pkg.devDependencies ?? {})) {
|
|
8513
|
+
if (name === "@keystrokehq/cli") continue;
|
|
8514
|
+
if (name.startsWith(KEYSTROKE_SCOPE) && !isLocalSdkSpec(spec)) packages.push({
|
|
8515
|
+
name,
|
|
8516
|
+
dev: true
|
|
8517
|
+
});
|
|
8518
|
+
}
|
|
8519
|
+
return packages;
|
|
8520
|
+
}
|
|
8521
|
+
function readInstalledVersion(root, packageName) {
|
|
8522
|
+
const path = join(root, "node_modules", ...packageName.split("/"), "package.json");
|
|
8523
|
+
if (!existsSync(path)) return;
|
|
8524
|
+
try {
|
|
8525
|
+
return JSON.parse(readFileSync(path, "utf8")).version?.trim() || void 0;
|
|
8526
|
+
} catch {
|
|
8527
|
+
return;
|
|
8528
|
+
}
|
|
8529
|
+
}
|
|
8530
|
+
function updateCommand(manager, packageName, dev) {
|
|
8531
|
+
const spec = `${packageName}@latest`;
|
|
8532
|
+
if (manager === "npm") return {
|
|
8533
|
+
command: "npm",
|
|
8534
|
+
args: dev ? [
|
|
8535
|
+
"install",
|
|
8536
|
+
"-D",
|
|
8537
|
+
spec
|
|
8538
|
+
] : ["install", spec]
|
|
8539
|
+
};
|
|
8540
|
+
return {
|
|
8541
|
+
command: manager,
|
|
8542
|
+
args: dev ? [
|
|
8543
|
+
"add",
|
|
8544
|
+
"-D",
|
|
8545
|
+
spec
|
|
8546
|
+
] : ["add", spec]
|
|
8547
|
+
};
|
|
8548
|
+
}
|
|
8549
|
+
function warnReleaseAgeBlock(packageName) {
|
|
8550
|
+
process.stderr.write(`Warning: ${packageName}@latest is held back by your minimum-release-age setting; continuing with the currently installed version.\n`);
|
|
8551
|
+
}
|
|
8552
|
+
/**
|
|
8553
|
+
* Install @latest for every managed project @keystrokehq/* dependency.
|
|
8554
|
+
* Skips `@keystrokehq/cli` (global; refreshed separately by `keystroke update`).
|
|
8555
|
+
* Release-age blocks warn and continue; other install failures throw.
|
|
8556
|
+
*/
|
|
8557
|
+
function updateProjectPackages(root) {
|
|
8558
|
+
const packages = listUpdatableKeystrokePackages(root);
|
|
8559
|
+
if (packages.length === 0) return {
|
|
8560
|
+
updated: [],
|
|
8561
|
+
skippedReleaseAge: []
|
|
8562
|
+
};
|
|
8563
|
+
const manager = detectManagerFromLockfile(root) ?? detectPackageManager();
|
|
8564
|
+
const token = resolveGithubPackagesToken();
|
|
8565
|
+
const env = token ? {
|
|
8566
|
+
...process.env,
|
|
8567
|
+
NODE_AUTH_TOKEN: token
|
|
8568
|
+
} : process.env;
|
|
8569
|
+
const updated = [];
|
|
8570
|
+
const skippedReleaseAge = [];
|
|
8571
|
+
for (const pkg of packages) {
|
|
8572
|
+
const from = readInstalledVersion(root, pkg.name);
|
|
8573
|
+
const { command, args } = updateCommand(manager, pkg.name, pkg.dev);
|
|
8574
|
+
process.stderr.write(`Updating ${pkg.name}...\n`);
|
|
8575
|
+
const result = spawnSync(command, args, {
|
|
8576
|
+
cwd: root,
|
|
8577
|
+
env,
|
|
8578
|
+
encoding: "utf8"
|
|
8579
|
+
});
|
|
8580
|
+
if (result.status === 0) {
|
|
8581
|
+
const to = readInstalledVersion(root, pkg.name);
|
|
8582
|
+
if (to && to !== from) updated.push({
|
|
8583
|
+
name: pkg.name,
|
|
8584
|
+
from,
|
|
8585
|
+
to
|
|
8586
|
+
});
|
|
8587
|
+
continue;
|
|
8588
|
+
}
|
|
8589
|
+
const output = `${result.stdout ?? ""}${result.stderr ?? ""}`;
|
|
8590
|
+
if (isReleaseAgeBlock(output)) {
|
|
8591
|
+
warnReleaseAgeBlock(pkg.name);
|
|
8592
|
+
skippedReleaseAge.push(pkg.name);
|
|
8593
|
+
continue;
|
|
8594
|
+
}
|
|
8595
|
+
throw new Error(`Failed to update ${pkg.name}:\n${output.trim() || `${command} exited ${result.status}`}`);
|
|
8596
|
+
}
|
|
8597
|
+
return {
|
|
8598
|
+
updated,
|
|
8599
|
+
skippedReleaseAge
|
|
8600
|
+
};
|
|
8601
|
+
}
|
|
8602
|
+
//#endregion
|
|
8603
|
+
//#region src/commands/update.ts
|
|
8604
|
+
async function updateCliInstall() {
|
|
8605
|
+
if (process.env.KEYSTROKE_DEV) return;
|
|
8606
|
+
const install = detectCliInstall(resolveCliRoot(import.meta.url));
|
|
8607
|
+
if (!install || install.kind === "local" && !install.projectRoot) return;
|
|
8608
|
+
const currentVersion = readCliVersion();
|
|
8609
|
+
const release = await fetchLatestCliRelease();
|
|
8610
|
+
if (!release || !isNewerVersion(release.version, currentVersion)) {
|
|
8611
|
+
process.stdout.write(`@keystrokehq/cli is up to date (${currentVersion}).\n`);
|
|
8612
|
+
return;
|
|
8613
|
+
}
|
|
8614
|
+
process.stderr.write(`Updating @keystrokehq/cli ${currentVersion} -> ${release.version} via ${install.packageManager}...\n`);
|
|
8615
|
+
const result = runPackageManagerUpdate(install);
|
|
8616
|
+
const installedVersion = readCliVersion();
|
|
8617
|
+
if (isNewerVersion(installedVersion, currentVersion)) {
|
|
8618
|
+
process.stdout.write(`Updated @keystrokehq/cli ${currentVersion} -> ${installedVersion}.\n`);
|
|
8619
|
+
return;
|
|
8620
|
+
}
|
|
8621
|
+
if (result.ok) {
|
|
8622
|
+
process.stdout.write(`@keystrokehq/cli is up to date (${installedVersion}).\n`);
|
|
8623
|
+
return;
|
|
8624
|
+
}
|
|
8625
|
+
if (isReleaseAgeBlock(result.output)) {
|
|
8626
|
+
const retryAfter = install.packageManager === "pnpm" ? computeReleaseAgeRetryAfter(release.publishedAt, readPnpmMinimumReleaseAgeMinutes()) : void 0;
|
|
8627
|
+
process.stderr.write(`${formatReleaseAgeBlockMessage({
|
|
8628
|
+
currentVersion,
|
|
8629
|
+
availableVersion: release.version,
|
|
8630
|
+
retryAfter
|
|
8631
|
+
})}\n`);
|
|
8632
|
+
return;
|
|
8633
|
+
}
|
|
8634
|
+
throw new Error(`Failed to update @keystrokehq/cli:\n${result.output.trim() || "package manager update failed"}`);
|
|
8635
|
+
}
|
|
8636
|
+
async function runUpdate(options) {
|
|
8637
|
+
const result = updateProjectPackages(resolveProjectRoot(options.dir));
|
|
8638
|
+
if (result.updated.length === 0 && result.skippedReleaseAge.length === 0) process.stdout.write("Project @keystrokehq packages are up to date.\n");
|
|
8639
|
+
else {
|
|
8640
|
+
for (const pkg of result.updated) {
|
|
8641
|
+
const range = pkg.from && pkg.to ? `${pkg.from} -> ${pkg.to}` : pkg.to ? `-> ${pkg.to}` : "updated";
|
|
8642
|
+
process.stdout.write(`Updated ${pkg.name} (${range}).\n`);
|
|
8643
|
+
}
|
|
8644
|
+
if (result.updated.length === 0 && result.skippedReleaseAge.length > 0) process.stdout.write("No project @keystrokehq packages were updated.\n");
|
|
8645
|
+
}
|
|
8646
|
+
await updateCliInstall();
|
|
8647
|
+
}
|
|
8648
|
+
function registerUpdateCommand(program) {
|
|
8649
|
+
program.command("update").description("Update @keystrokehq packages and the CLI to latest").option("--dir <path>", "Project directory", process.cwd()).action(async (options) => {
|
|
8650
|
+
try {
|
|
8651
|
+
await runUpdate(options);
|
|
8652
|
+
} catch (error) {
|
|
8653
|
+
process.stderr.write(`${formatCliError(error, "update failed")}\n`);
|
|
8654
|
+
process.exitCode = 1;
|
|
8655
|
+
}
|
|
8656
|
+
});
|
|
8657
|
+
}
|
|
8658
|
+
//#endregion
|
|
8488
8659
|
//#region src/commands/workflows/list.ts
|
|
8489
8660
|
function registerWorkflowListCommand(workflow) {
|
|
8490
8661
|
workflow.command("list").description("List workflows in the active organization").option("--admin", "List all org resources (org owner or admin only)").action((options) => runCliCommand("List workflows failed", async () => {
|
|
@@ -8840,6 +9011,7 @@ function createProgram() {
|
|
|
8840
9011
|
registerTestCommand(program);
|
|
8841
9012
|
registerDeployCommand(program);
|
|
8842
9013
|
registerPullCommand(program);
|
|
9014
|
+
registerUpdateCommand(program);
|
|
8843
9015
|
registerDevCommand(program);
|
|
8844
9016
|
registerStartCommand(program);
|
|
8845
9017
|
registerAgentsCommand(program);
|
|
@@ -8850,7 +9022,7 @@ function createProgram() {
|
|
|
8850
9022
|
return program;
|
|
8851
9023
|
}
|
|
8852
9024
|
async function runCli(argv) {
|
|
8853
|
-
const { maybeAutoUpdate } = await import("./maybe-auto-update-
|
|
9025
|
+
const { maybeAutoUpdate } = await import("./maybe-auto-update-x2nClrff.mjs");
|
|
8854
9026
|
await maybeAutoUpdate(argv);
|
|
8855
9027
|
createProgram().parse(argv);
|
|
8856
9028
|
}
|