code-foundry 1.48.0 → 1.48.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/.github/workflows/ci.yml +12 -0
- package/.github/workflows/eval.yml +3 -0
- package/.github/workflows/test.yml +15 -0
- package/.github/workflows/validation-billing.yml +16 -0
- package/CHANGELOG.md +8 -8
- package/docs/CACHING.md +15 -4
- package/docs/CONFIGURATION.md +4 -0
- package/package.json +2 -1
- package/.github/actions/attest-artifact/action.yml +0 -56
- package/.github/actions/cache/action.yml +0 -47
- package/.github/actions/codeql/action.yml +0 -33
- package/.github/actions/setup/action.yml +0 -988
package/.github/workflows/ci.yml
CHANGED
|
@@ -119,6 +119,9 @@ jobs:
|
|
|
119
119
|
if-no-files-found: error
|
|
120
120
|
retention-days: 14
|
|
121
121
|
|
|
122
|
+
- name: Save Vite+ task cache
|
|
123
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
124
|
+
|
|
122
125
|
lint:
|
|
123
126
|
name: Lint
|
|
124
127
|
if: vars.CI_BILLING_PAUSED != 'true'
|
|
@@ -180,6 +183,9 @@ jobs:
|
|
|
180
183
|
if-no-files-found: error
|
|
181
184
|
retention-days: 14
|
|
182
185
|
|
|
186
|
+
- name: Save Vite+ task cache
|
|
187
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
188
|
+
|
|
183
189
|
type-check:
|
|
184
190
|
name: Type-Check
|
|
185
191
|
if: vars.CI_BILLING_PAUSED != 'true'
|
|
@@ -246,6 +252,9 @@ jobs:
|
|
|
246
252
|
if-no-files-found: error
|
|
247
253
|
retention-days: 14
|
|
248
254
|
|
|
255
|
+
- name: Save Vite+ task cache
|
|
256
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
257
|
+
|
|
249
258
|
build:
|
|
250
259
|
name: Build
|
|
251
260
|
if: vars.CI_BILLING_PAUSED != 'true'
|
|
@@ -311,3 +320,6 @@ jobs:
|
|
|
311
320
|
include-hidden-files: true
|
|
312
321
|
if-no-files-found: error
|
|
313
322
|
retention-days: 14
|
|
323
|
+
|
|
324
|
+
- name: Save Vite+ task cache
|
|
325
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
@@ -161,6 +161,9 @@ jobs:
|
|
|
161
161
|
if-no-files-found: ignore
|
|
162
162
|
retention-days: 14
|
|
163
163
|
|
|
164
|
+
- name: Save Vite+ task cache
|
|
165
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
166
|
+
|
|
164
167
|
performance:
|
|
165
168
|
name: Performance
|
|
166
169
|
if: vars.CI_BILLING_PAUSED != 'true'
|
|
@@ -247,6 +250,9 @@ jobs:
|
|
|
247
250
|
if-no-files-found: ignore
|
|
248
251
|
retention-days: 14
|
|
249
252
|
|
|
253
|
+
- name: Save Vite+ task cache
|
|
254
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
255
|
+
|
|
250
256
|
integration:
|
|
251
257
|
name: Integration
|
|
252
258
|
if: vars.CI_BILLING_PAUSED != 'true' && inputs.unit-only != true
|
|
@@ -317,6 +323,9 @@ jobs:
|
|
|
317
323
|
if-no-files-found: error
|
|
318
324
|
retention-days: 14
|
|
319
325
|
|
|
326
|
+
- name: Save Vite+ task cache
|
|
327
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
328
|
+
|
|
320
329
|
e2e:
|
|
321
330
|
name: E2E
|
|
322
331
|
if: vars.CI_BILLING_PAUSED != 'true' && inputs.unit-only != true
|
|
@@ -410,6 +419,9 @@ jobs:
|
|
|
410
419
|
if-no-files-found: error
|
|
411
420
|
retention-days: 14
|
|
412
421
|
|
|
422
|
+
- name: Save Vite+ task cache
|
|
423
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
424
|
+
|
|
413
425
|
smoke:
|
|
414
426
|
name: Smoke
|
|
415
427
|
if: vars.CI_BILLING_PAUSED != 'true' && inputs.unit-only != true
|
|
@@ -479,3 +491,6 @@ jobs:
|
|
|
479
491
|
include-hidden-files: true
|
|
480
492
|
if-no-files-found: error
|
|
481
493
|
retention-days: 14
|
|
494
|
+
|
|
495
|
+
- name: Save Vite+ task cache
|
|
496
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
@@ -469,6 +469,9 @@ jobs:
|
|
|
469
469
|
if-no-files-found: error
|
|
470
470
|
retention-days: 14
|
|
471
471
|
|
|
472
|
+
- name: Save Vite+ task cache
|
|
473
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
474
|
+
|
|
472
475
|
lint:
|
|
473
476
|
name: Lint
|
|
474
477
|
if: vars.CI_BILLING_PAUSED != 'true'
|
|
@@ -530,6 +533,9 @@ jobs:
|
|
|
530
533
|
if-no-files-found: error
|
|
531
534
|
retention-days: 14
|
|
532
535
|
|
|
536
|
+
- name: Save Vite+ task cache
|
|
537
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
538
|
+
|
|
533
539
|
type-check:
|
|
534
540
|
name: Type-Check
|
|
535
541
|
if: vars.CI_BILLING_PAUSED != 'true'
|
|
@@ -596,6 +602,9 @@ jobs:
|
|
|
596
602
|
if-no-files-found: error
|
|
597
603
|
retention-days: 14
|
|
598
604
|
|
|
605
|
+
- name: Save Vite+ task cache
|
|
606
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
607
|
+
|
|
599
608
|
unit:
|
|
600
609
|
name: Unit
|
|
601
610
|
if: vars.CI_BILLING_PAUSED != 'true'
|
|
@@ -682,6 +691,9 @@ jobs:
|
|
|
682
691
|
if-no-files-found: ignore
|
|
683
692
|
retention-days: 14
|
|
684
693
|
|
|
694
|
+
- name: Save Vite+ task cache
|
|
695
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
696
|
+
|
|
685
697
|
e2e:
|
|
686
698
|
name: E2E
|
|
687
699
|
if: vars.CI_BILLING_PAUSED != 'true' && inputs.mode == 'audit'
|
|
@@ -775,11 +787,15 @@ jobs:
|
|
|
775
787
|
if-no-files-found: error
|
|
776
788
|
retention-days: 14
|
|
777
789
|
|
|
790
|
+
- name: Save Vite+ task cache
|
|
791
|
+
uses: ./.github/actions/vite-plus-cache-save
|
|
792
|
+
|
|
778
793
|
# Profile and dependency audit merged into one job. The split orchestrators
|
|
779
794
|
# run a profile job that feeds an audit matrix; here the language blocks run
|
|
780
795
|
# sequentially, driven directly by the profile step's outputs, so the second
|
|
781
796
|
# runner spin-up disappears. Python requirements run in one loop inside the
|
|
782
797
|
# audit step because a matrix cannot follow preceding steps in the same job.
|
|
798
|
+
|
|
783
799
|
audit:
|
|
784
800
|
name: Audit
|
|
785
801
|
if: vars.CI_BILLING_PAUSED != 'true' && inputs.mode == 'audit'
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.48.1](https://github.com/0xPlayerOne/code-foundry/compare/v1.48.0...v1.48.1) (2026-10-16)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* vite-plus-cache-post-job-save ([#765](https://github.com/0xPlayerOne/code-foundry/issues/765)) ([3f82e85](https://github.com/0xPlayerOne/code-foundry/commit/3f82e850f5c09af6cea4de6f1a791d098bbd2f6e))
|
|
9
|
+
|
|
3
10
|
## [1.48.0](https://github.com/0xPlayerOne/code-foundry/compare/v1.47.5...v1.48.0) (2026-10-16)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -133,16 +140,9 @@
|
|
|
133
140
|
|
|
134
141
|
* **release:** treat ref-creation errors in the REST fallback as non-fatal ([#727](https://github.com/0xPlayerOne/code-foundry/issues/727)) ([75ea614](https://github.com/0xPlayerOne/code-foundry/commit/75ea61465e7c4cacd39e3aa8c52df93c2ea9bf03))
|
|
135
142
|
|
|
136
|
-
## [1.44.9](https://github.com/0xPlayerOne/code-foundry/compare/v1.44.8...v1.44.9) (2026-10-06)
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
### Bug Fixes
|
|
140
|
-
|
|
141
|
-
* **release:** make the REST fallback draft-aware and idempotent ([#725](https://github.com/0xPlayerOne/code-foundry/issues/725)) ([c29da6e](https://github.com/0xPlayerOne/code-foundry/commit/c29da6efb919d68a568c2328eea2c2f7654334fe))
|
|
142
|
-
|
|
143
143
|
<!-- code-foundry: packaged changelog -->
|
|
144
144
|
|
|
145
145
|
---
|
|
146
146
|
|
|
147
|
-
This packaged changelog lists the 20 most recent releases;
|
|
147
|
+
This packaged changelog lists the 20 most recent releases; 249 older releases are omitted to keep the package small.
|
|
148
148
|
See the [full changelog](https://github.com/0xPlayerOne/code-foundry/blob/main/CHANGELOG.md) for the complete history.
|
package/docs/CACHING.md
CHANGED
|
@@ -34,10 +34,21 @@ When opted in, the setup action:
|
|
|
34
34
|
remote-cache step runs;
|
|
35
35
|
- restores `node_modules/.vite/task-cache` as its last step, after Install and
|
|
36
36
|
after every step that archives `node_modules` (Install can replace it);
|
|
37
|
-
-
|
|
38
|
-
|
|
37
|
+
- publishes a cache path, key, and save-intent contract for the explicit
|
|
38
|
+
`.github/actions/vite-plus-cache-save` action to use after repository tasks;
|
|
39
|
+
- saves it push-only, so pull requests and scheduled runs cannot poison it;
|
|
39
40
|
- keeps it out of the generic JavaScript build-state archive.
|
|
40
41
|
|
|
42
|
+
The generated CI, test, eval, and billing workflows call the save action at the
|
|
43
|
+
end of each task job. Custom workflows that use `.github/actions/setup` must
|
|
44
|
+
also call it after their Vite+ tasks complete; it reads the setup contract from
|
|
45
|
+
the job environment. A job can disable saving with `cache-save: false` on every
|
|
46
|
+
applicable setup call. With multiple setup calls in one job, save intent is
|
|
47
|
+
combined so an enabled Vite+ task setup is not overridden by a later disabled
|
|
48
|
+
setup. The setup action also exposes `vite-plus-cache-path`,
|
|
49
|
+
`vite-plus-cache-key`, and `vite-plus-cache-save` outputs for workflows that
|
|
50
|
+
prefer to pass these values explicitly to the save action.
|
|
51
|
+
|
|
41
52
|
Keys are `<namespace>-<workflow>-<job>-<lockfiles>-<vite.config>-<run id>-<attempt>`,
|
|
42
53
|
so every push saves a refreshed entry (more storage than a fixed key). Restore
|
|
43
54
|
keys fall back by lockfiles, job, then any job, but never leave the namespace
|
|
@@ -45,8 +56,8 @@ keys fall back by lockfiles, job, then any job, but never leave the namespace
|
|
|
45
56
|
Task does not fingerprint the Node or Bun binary. If the `vite-plus` version
|
|
46
57
|
cannot be resolved, nothing is restored or saved.
|
|
47
58
|
|
|
48
|
-
If `VITE_CACHE_PATH` (absolute) is set, Vite+
|
|
49
|
-
setup action caches that directory
|
|
59
|
+
If `VITE_CACHE_PATH` (absolute, from any environment source) is set, Vite+
|
|
60
|
+
writes its cache there and the setup action caches that directory too.
|
|
50
61
|
|
|
51
62
|
Vite+ has no remote cache and this repository does not configure one.
|
|
52
63
|
|
package/docs/CONFIGURATION.md
CHANGED
|
@@ -298,6 +298,10 @@ behavior:
|
|
|
298
298
|
- `cache-vite-plus: auto`, `true`, or `false` is an input of the setup action
|
|
299
299
|
(not a config key). It controls the local Vite+ task cache only when
|
|
300
300
|
`monorepo_tool: vite-plus` is set.
|
|
301
|
+
- Custom workflows using the setup action must add
|
|
302
|
+
`.github/actions/vite-plus-cache-save` after task execution. The generated
|
|
303
|
+
Code Foundry workflows already include this save boundary; see
|
|
304
|
+
[Caching and remote caching](CACHING.md).
|
|
301
305
|
|
|
302
306
|
Use these controls only after measuring a repeatable benefit. See [Caching and
|
|
303
307
|
remote caching](CACHING.md).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "code-foundry",
|
|
3
|
-
"version": "1.48.
|
|
3
|
+
"version": "1.48.1",
|
|
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": {
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"src",
|
|
19
19
|
"docs",
|
|
20
20
|
".github",
|
|
21
|
+
"!.github/actions/**",
|
|
21
22
|
".githooks",
|
|
22
23
|
".editorconfig",
|
|
23
24
|
".gitattributes",
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
name: Attest verified build artifacts
|
|
2
|
-
description: Generate checksums and signed provenance for explicitly selected build outputs.
|
|
3
|
-
inputs:
|
|
4
|
-
artifacts:
|
|
5
|
-
description: 'JSON array of nonempty regular artifact files relative to the workspace.'
|
|
6
|
-
required: true
|
|
7
|
-
outputs:
|
|
8
|
-
manifest-path:
|
|
9
|
-
description: Path to the generated SHA-256 JSON manifest.
|
|
10
|
-
value: ${{ steps.manifest.outputs.manifest-path }}
|
|
11
|
-
bundle-path:
|
|
12
|
-
description: Path to the signed provenance bundle.
|
|
13
|
-
value: ${{ steps.attest.outputs.bundle-path }}
|
|
14
|
-
attestation-url:
|
|
15
|
-
description: URL of the published attestation.
|
|
16
|
-
value: ${{ steps.attest.outputs.attestation-url }}
|
|
17
|
-
runs:
|
|
18
|
-
using: composite
|
|
19
|
-
steps:
|
|
20
|
-
- name: Select and hash build outputs
|
|
21
|
-
id: manifest
|
|
22
|
-
shell: bash
|
|
23
|
-
env:
|
|
24
|
-
ARTIFACTS: ${{ inputs.artifacts }}
|
|
25
|
-
run: |
|
|
26
|
-
set -euo pipefail
|
|
27
|
-
[[ "$GITHUB_EVENT_NAME" != pull_request && "$GITHUB_EVENT_NAME" != pull_request_target ]]
|
|
28
|
-
node --input-type=module <<'NODE'
|
|
29
|
-
import { appendFileSync, mkdtempSync, writeFileSync } from 'node:fs'
|
|
30
|
-
import { join, resolve } from 'node:path'
|
|
31
|
-
import { pathToFileURL } from 'node:url'
|
|
32
|
-
const helper = pathToFileURL(resolve(process.env.GITHUB_ACTION_PATH, '../../../src/commands/release-integrity.mjs'))
|
|
33
|
-
const { assetManifest } = await import(helper.href)
|
|
34
|
-
const files = JSON.parse(process.env.ARTIFACTS)
|
|
35
|
-
if (!Array.isArray(files) || files.some(file => typeof file !== 'string')) throw new Error('artifacts must be a JSON string array')
|
|
36
|
-
const manifest = assetManifest(process.env.GITHUB_WORKSPACE, files)
|
|
37
|
-
const directory = mkdtempSync(join(process.env.RUNNER_TEMP, 'foundry-attestation-'))
|
|
38
|
-
const manifestPath = join(directory, 'manifest.json')
|
|
39
|
-
const sumsPath = join(directory, 'SHA256SUMS')
|
|
40
|
-
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n')
|
|
41
|
-
writeFileSync(sumsPath, manifest.checksums)
|
|
42
|
-
appendFileSync(process.env.GITHUB_OUTPUT, `manifest-path=${manifestPath}\nchecksums-path=${sumsPath}\n`)
|
|
43
|
-
NODE
|
|
44
|
-
- name: Sign build provenance
|
|
45
|
-
id: attest
|
|
46
|
-
uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3
|
|
47
|
-
with:
|
|
48
|
-
subject-checksums: ${{ steps.manifest.outputs.checksums-path }}
|
|
49
|
-
- name: Verify artifacts were not changed during signing
|
|
50
|
-
shell: bash
|
|
51
|
-
env:
|
|
52
|
-
CHECKSUMS_PATH: ${{ steps.manifest.outputs.checksums-path }}
|
|
53
|
-
run: |
|
|
54
|
-
set -euo pipefail
|
|
55
|
-
cd "$GITHUB_WORKSPACE"
|
|
56
|
-
sha256sum --check "$CHECKSUMS_PATH"
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
name: Repository Cache
|
|
2
|
-
description: Restore a cache and optionally enable the post-job save performed by actions/cache.
|
|
3
|
-
|
|
4
|
-
inputs:
|
|
5
|
-
path:
|
|
6
|
-
description: Cache paths.
|
|
7
|
-
required: true
|
|
8
|
-
key:
|
|
9
|
-
description: Primary cache key.
|
|
10
|
-
required: true
|
|
11
|
-
restore-keys:
|
|
12
|
-
description: Optional newline-delimited restore keys.
|
|
13
|
-
required: false
|
|
14
|
-
default: ''
|
|
15
|
-
save:
|
|
16
|
-
description: Enable cache saving after the job completes.
|
|
17
|
-
required: false
|
|
18
|
-
default: 'true'
|
|
19
|
-
|
|
20
|
-
outputs:
|
|
21
|
-
cache-hit:
|
|
22
|
-
description: Whether an exact cache was restored.
|
|
23
|
-
value: ${{ steps.cache.outputs.cache-hit || steps.restore.outputs.cache-hit }}
|
|
24
|
-
|
|
25
|
-
runs:
|
|
26
|
-
using: composite
|
|
27
|
-
steps:
|
|
28
|
-
# Caches are restored on every event but saved on push only: scheduled
|
|
29
|
-
# and dispatched runs share the default branch with untrusted
|
|
30
|
-
# runtime-ref checkouts, so letting them save would allow cache
|
|
31
|
-
# poisoning. Push events require write access and stay trusted.
|
|
32
|
-
- name: Restore cache
|
|
33
|
-
id: restore
|
|
34
|
-
if: inputs.save != 'true' || github.event_name != 'push'
|
|
35
|
-
uses: actions/cache/restore@v5
|
|
36
|
-
with:
|
|
37
|
-
path: ${{ inputs.path }}
|
|
38
|
-
key: ${{ inputs.key }}
|
|
39
|
-
restore-keys: ${{ inputs.restore-keys }}
|
|
40
|
-
- name: Restore and save cache
|
|
41
|
-
id: cache
|
|
42
|
-
if: inputs.save == 'true' && github.event_name == 'push'
|
|
43
|
-
uses: actions/cache@v5
|
|
44
|
-
with:
|
|
45
|
-
path: ${{ inputs.path }}
|
|
46
|
-
key: ${{ inputs.key }}
|
|
47
|
-
restore-keys: ${{ inputs.restore-keys }}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
name: CodeQL Analyze
|
|
2
|
-
description: Initialize and analyze one CodeQL language using the repository baseline.
|
|
3
|
-
|
|
4
|
-
inputs:
|
|
5
|
-
language:
|
|
6
|
-
description: CodeQL language identifier.
|
|
7
|
-
required: true
|
|
8
|
-
build-mode:
|
|
9
|
-
description: CodeQL build mode.
|
|
10
|
-
required: false
|
|
11
|
-
default: none
|
|
12
|
-
category:
|
|
13
|
-
description: CodeQL analysis category.
|
|
14
|
-
required: true
|
|
15
|
-
|
|
16
|
-
runs:
|
|
17
|
-
using: composite
|
|
18
|
-
steps:
|
|
19
|
-
- name: Initialize
|
|
20
|
-
uses: github/codeql-action/init@v4
|
|
21
|
-
with:
|
|
22
|
-
languages: ${{ inputs.language }}
|
|
23
|
-
build-mode: ${{ inputs.build-mode }}
|
|
24
|
-
- name: Analyze
|
|
25
|
-
uses: github/codeql-action/analyze@v4
|
|
26
|
-
with:
|
|
27
|
-
category: ${{ inputs.category }}
|
|
28
|
-
# Pin pull-request uploads to the contributor's head SHA/ref so a
|
|
29
|
-
# moving merge ref cannot race the required code-scanning context.
|
|
30
|
-
ref: ${{ github.event_name == 'pull_request' && format('refs/pull/{0}/head', github.event.pull_request.number) || github.ref }}
|
|
31
|
-
sha: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
|
|
32
|
-
upload-database: false
|
|
33
|
-
wait-for-processing: false
|