code-foundry 1.28.10 → 1.28.11

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.
@@ -53,6 +53,7 @@ jobs:
53
53
  name: Format
54
54
  if: vars.CI_BILLING_PAUSED != 'true'
55
55
  runs-on: ${{ inputs.runner }}
56
+ timeout-minutes: 30
56
57
  steps:
57
58
  - name: Checkout
58
59
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
@@ -112,6 +113,7 @@ jobs:
112
113
  name: Lint
113
114
  if: vars.CI_BILLING_PAUSED != 'true'
114
115
  runs-on: ${{ inputs.runner }}
116
+ timeout-minutes: 30
115
117
  steps:
116
118
  - name: Checkout
117
119
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
@@ -166,6 +168,7 @@ jobs:
166
168
  name: Type-Check
167
169
  if: vars.CI_BILLING_PAUSED != 'true'
168
170
  runs-on: ${{ inputs.runner }}
171
+ timeout-minutes: 30
169
172
  steps:
170
173
  - name: Checkout
171
174
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
@@ -220,6 +223,7 @@ jobs:
220
223
  name: Build
221
224
  if: vars.CI_BILLING_PAUSED != 'true'
222
225
  runs-on: ${{ inputs.runner }}
226
+ timeout-minutes: 30
223
227
  env:
224
228
  # Framework builds may validate server-side configuration at build time.
225
229
  # Consumers can provide the real value; the fallback is intentionally
@@ -50,6 +50,7 @@ jobs:
50
50
  name: Eval
51
51
  if: vars.CI_BILLING_PAUSED != 'true'
52
52
  runs-on: ${{ inputs.runner }}
53
+ timeout-minutes: 30
53
54
  steps:
54
55
  - name: Checkout
55
56
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
@@ -16,6 +16,7 @@ jobs:
16
16
  name: OpenCode Security / Detect
17
17
  if: vars.CI_BILLING_PAUSED != 'true' && (github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && github.event.pull_request.draft == false))
18
18
  runs-on: ubuntu-slim
19
+ timeout-minutes: 10
19
20
  outputs:
20
21
  enabled: ${{ steps.detect.outputs.enabled }}
21
22
  token: ${{ steps.detect.outputs.token }}
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.28.11](https://github.com/0xPlayerOne/code-foundry/compare/v1.28.10...v1.28.11) (2026-09-11)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **fleet:** bound rendered jobs with timeouts and refresh stale runtime pins ([#616](https://github.com/0xPlayerOne/code-foundry/issues/616)) ([f8d20b4](https://github.com/0xPlayerOne/code-foundry/commit/f8d20b4ad48cddd20630ff9b7c1c21d0c5ac9520))
9
+
3
10
  ## [1.28.10](https://github.com/0xPlayerOne/code-foundry/compare/v1.28.9...v1.28.10) (2026-09-11)
4
11
 
5
12
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "code-foundry",
3
- "version": "1.28.10",
3
+ "version": "1.28.11",
4
4
  "description": "A fast, language-aware repository factory for agent-ready workflows, testing, security, and release automation.",
5
5
  "homepage": "https://github.com/0xPlayerOne/code-foundry#readme",
6
6
  "bugs": {
@@ -1,6 +1,14 @@
1
1
  // @ts-check
2
2
 
3
- import { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
3
+ import {
4
+ chmodSync,
5
+ existsSync,
6
+ mkdirSync,
7
+ readdirSync,
8
+ readFileSync,
9
+ rmSync,
10
+ writeFileSync,
11
+ } from 'node:fs'
4
12
  import { dirname, join, resolve } from 'node:path'
5
13
  import { spawnSync } from 'node:child_process'
6
14
  import {
@@ -321,6 +329,37 @@ function synchronize(options) {
321
329
  }
322
330
  }
323
331
 
332
+ // Preserved (repository-owned) workflows may reference the runtime directly,
333
+ // for example a hand-maintained Cloudflare preview caller. Advance their
334
+ // plain semver pins to the synced runtime ref so a stale hand-added pin
335
+ // cannot keep an old runtime alive after a fleet upgrade. Intentional refs
336
+ // (branch names, immutable SHAs) and other repositories' actions are left
337
+ // untouched, mirroring the config pin policy above.
338
+ if (!selfRepository && /^v\d+\.\d+\.\d+$/.test(runtimeRef)) {
339
+ const standard = new Set(standardFiles)
340
+ const workflowsDir = join(target, '.github/workflows')
341
+ if (existsSync(workflowsDir)) {
342
+ const runtimePin = new RegExp(
343
+ `(uses:\\s*${escapeRegExp(runtimeRepository)}/\\.github/(?:workflows|actions)/[^\\s@]+)@v\\d+\\.\\d+\\.\\d+`,
344
+ 'g'
345
+ )
346
+ for (const entry of readdirSync(workflowsDir).toSorted()) {
347
+ if (!entry.endsWith('.yml') || standard.has(`.github/workflows/${entry}`)) continue
348
+ const destination = join(workflowsDir, entry)
349
+ const original = readFileSync(destination, 'utf8')
350
+ const updated = original.replace(runtimePin, `$1@${runtimeRef}`)
351
+ if (updated !== original) {
352
+ changed.push(`.github/workflows/${entry}`)
353
+ if (dryRun)
354
+ console.log(
355
+ `Would refresh the runtime pin in .github/workflows/${entry} to ${runtimeRef}.`
356
+ )
357
+ else writeOrReport(destination, updated, dryRun)
358
+ }
359
+ }
360
+ }
361
+ }
362
+
324
363
  // A repository that no longer opts into the staging-release topology must
325
364
  // not keep a generated staging promotion caller that would otherwise
326
365
  // linger dormant (it triggers on pushes to a branch that does not exist).