Skip to content

Commit 07f691a

Browse files
authored
Merge pull request #25 from script-development/security/harden-publish-workflow
security: harden publish pipeline + CI against supply-chain injection
2 parents 7d5bad9 + 1db5b18 commit 07f691a

3 files changed

Lines changed: 39 additions & 16 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
- uses: actions/setup-node@v6
1515
with:
1616
node-version: 24
17-
- run: npm ci
17+
- run: npm ci --ignore-scripts
1818
- run: npm audit
1919
- run: npm run format:check
2020
- run: npm run lint

.github/workflows/publish.yml

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,26 @@ on:
77
- "**/package.json"
88

99
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
permissions:
13+
contents: read
14+
steps:
15+
- uses: actions/checkout@v6
16+
- uses: actions/setup-node@v6
17+
with:
18+
node-version: 24
19+
- run: npm ci --ignore-scripts
20+
- run: npm run build
21+
- uses: actions/upload-artifact@v4
22+
with:
23+
name: build-output
24+
path: packages/*/dist/
25+
retention-days: 1
26+
if-no-files-found: error
27+
1028
publish:
29+
needs: build
1130
runs-on: ubuntu-latest
1231
permissions:
1332
contents: write
@@ -19,8 +38,11 @@ jobs:
1938
node-version: 24
2039
registry-url: "https://registry.npmjs.org"
2140
scope: "@script-development"
22-
- run: npm ci
23-
- run: npm run build
41+
- uses: actions/download-artifact@v4
42+
with:
43+
name: build-output
44+
path: .
45+
- run: npm ci --ignore-scripts
2446
- run: npx changeset publish
2547
env:
2648
NPM_CONFIG_PROVENANCE: "true"

CLAUDE.md

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,20 @@ Shared frontend service packages monorepo under the `@script-development` npm sc
1313
- **Publish:** OIDC Trusted Publishing to public npm registry (no stored tokens)
1414
- **CI:** 8-gate pipeline: audit → format → lint → build → typecheck → lint:pkg → coverage → mutation
1515

16-
## Packages (9)
17-
18-
| Package | Vue | Description |
19-
| ---------------- | --- | ----------------------------------------------------------------- |
20-
| fs-http | No | HTTP service factory with middleware architecture |
21-
| fs-storage | No | localStorage service factory with prefix namespacing |
22-
| fs-helpers | No | Tree-shakeable utilities: deep copy, type guards, case conversion |
23-
| fs-theme | Yes | Reactive dark/light mode with storage persistence |
24-
| fs-loading | Yes | Loading state service with HTTP middleware |
25-
| fs-adapter-store | Yes | Reactive adapter-store pattern with CRUD resource adapters |
26-
| fs-toast | Yes | Component-agnostic toast queue (FIFO) |
27-
| fs-dialog | Yes | Component-agnostic dialog stack (LIFO) with error middleware |
28-
| fs-translation | Yes | Type-safe reactive i18n with dot-notation keys |
16+
## Packages (10)
17+
18+
| Package | Vue | Description |
19+
| ---------------- | --- | ---------------------------------------------------------------------------------------------------------------- |
20+
| fs-http | No | HTTP service factory with middleware architecture |
21+
| fs-storage | No | localStorage service factory with prefix namespacing |
22+
| fs-helpers | No | Tree-shakeable utilities: deep copy, type guards, case conversion |
23+
| fs-theme | Yes | Reactive dark/light mode with storage persistence |
24+
| fs-loading | Yes | Loading state service with HTTP middleware |
25+
| fs-adapter-store | Yes | Reactive adapter-store pattern with CRUD resource adapters |
26+
| fs-toast | Yes | Component-agnostic toast queue (FIFO) |
27+
| fs-dialog | Yes | Component-agnostic dialog stack (LIFO) with error middleware |
28+
| fs-translation | Yes | Type-safe reactive i18n with dot-notation keys |
29+
| fs-router | Yes | Type-safe router service factory with CRUD navigation, middleware pipeline, and custom components for Vue Router |
2930

3031
## Conventions
3132

0 commit comments

Comments
 (0)