@vodmal/vdx-cli 0.32.0 → 0.32.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vodmal/vdx-cli",
3
- "version": "0.32.0",
3
+ "version": "0.32.1",
4
4
  "description": "vdx — unified lifecycle interface (up/down/build/test/check/fix) + versioned maturity audit with drift detection. Pairs with the vdx Claude Code plugin.",
5
5
  "keywords": [
6
6
  "vdx",
package/src/gate.ts CHANGED
@@ -119,11 +119,16 @@ export function pushThroughGate(t: GateTarget, d: GateDeps): void {
119
119
  const names = t.checks.join(', ');
120
120
  const link = `https://github.com/${t.repo}/commit/${sha}/checks`;
121
121
  const again = `once they pass: vdx push (${link})`;
122
- const ask = () => {
122
+ // No answer at all — a timeout, the network — is not a refusal: the wait asks again
123
+ // (0.32.0's release push stopped on one ETIMEDOUT at a load of ~7, 2026-10-20).
124
+ let silent: string | null = null;
125
+ const ask = (): CheckState[] | Unknown | null => {
123
126
  try {
127
+ silent = null;
124
128
  return commitChecks(d.io, t.repo, sha, t.checks, t.token);
125
129
  } catch (e) {
126
- return { unknown: `GitHub did not answer: ${errorMessage(e)}` };
130
+ silent = `GitHub did not answer: ${errorMessage(e)}`;
131
+ return null;
127
132
  }
128
133
  };
129
134
  const toBranch = () => {
@@ -137,7 +142,7 @@ export function pushThroughGate(t: GateTarget, d: GateDeps): void {
137
142
  // A commit not pushed yet is not asked about — GitHub would only answer 422.
138
143
  if (d.io.git(['rev-parse', '--verify', '--quiet', `refs/remotes/${t.remote}/${gate}`]) === sha) {
139
144
  const before = ask();
140
- if (!isUnknown(before) && passed(before)) {
145
+ if (before !== null && !isUnknown(before) && passed(before)) {
141
146
  d.log(`✓ ${short} has passed ${names}`);
142
147
  toBranch();
143
148
  return;
@@ -165,6 +170,15 @@ export function pushThroughGate(t: GateTarget, d: GateDeps): void {
165
170
  }
166
171
  const states = ask();
167
172
  d.progress?.('');
173
+ if (states === null) {
174
+ if (d.now() - started >= d.timeoutMs) {
175
+ throw new Error(
176
+ `${silent} after ${Math.round(d.timeoutMs / 60_000)} min — ${t.branch} did not take ${short}; ${again}`,
177
+ );
178
+ }
179
+ d.log(` … ${seconds()} s — ${silent}; asking again`);
180
+ continue;
181
+ }
168
182
  if (isUnknown(states)) throw new Error(`${states.unknown} — ${t.branch} did not take ${short}; ${again}`);
169
183
  const failed = states.filter((s) => s.state === 'failed');
170
184
  if (failed.length > 0) {
package/src/hosting.ts CHANGED
@@ -28,7 +28,7 @@ const GET = `
28
28
  const headers = { accept: 'application/vnd.github+json', 'x-github-api-version': '2022-11-28', 'user-agent': 'vdx' };
29
29
  if (process.env.VDX_GITHUB_TOKEN) headers.authorization = 'Bearer ' + process.env.VDX_GITHUB_TOKEN;
30
30
  try {
31
- const r = await fetch(process.argv[1], { headers, signal: AbortSignal.timeout(8000) });
31
+ const r = await fetch(process.argv[1], { headers, signal: AbortSignal.timeout(15000) });
32
32
  process.stdout.write(JSON.stringify({ status: r.status, text: await r.text() }));
33
33
  } catch (e) {
34
34
  process.stdout.write(JSON.stringify({ error: String(e?.cause?.code ?? e?.cause?.message ?? e?.message ?? e) }));
@@ -43,7 +43,8 @@ function get(apiPath: string, token: string | null): Answer {
43
43
  execFileSync(process.execPath, ['--input-type=module', '-e', GET, `https://api.github.com${apiPath}`], {
44
44
  encoding: 'utf8',
45
45
  env,
46
- timeout: 10_000,
46
+ // node's own start counts too: at a load of ~7 on lft 10 s ran out (2026-10-20).
47
+ timeout: 20_000,
47
48
  stdio: ['ignore', 'pipe', 'ignore'],
48
49
  }),
49
50
  );