Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/FUNDING.yml

This file was deleted.

140 changes: 140 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
name: Publish Package with Provenance

on:
workflow_dispatch:
inputs:
package:
description: 'Package to publish'
required: true
type: choice
options:
- '@magmacomputing/tempo'
- '@magmacomputing/tempo-pro'
- '@magmacomputing/tempo-fns'
- '@magmacomputing/tempo-plugin-ai'
- '@magmacomputing/tempo-plugin-astro'
- '@magmacomputing/tempo-plugin-batch'
- '@magmacomputing/tempo-plugin-finance'
- '@magmacomputing/tempo-plugin-snap'
- '@magmacomputing/tempo-plugin-sync'
- '@magmacomputing/tempo-plugin-ticker'
- 'all'
dry_run:
description: 'Dry run (simulate without uploading to registry)'
required: false
type: boolean
default: false

permissions:
contents: read
id-token: write # Mandatory for npm Sigstore/OIDC cryptographic provenance

jobs:
validate-and-publish:
name: Publish with Provenance
if: github.ref == 'refs/heads/main'
environment:
name: npm
url: https://www.npmjs.com/org/magmacomputing
runs-on: ubuntu-latest
timeout-minutes: 20
env:
TZ: America/New_York
LANG: en_US.UTF-8
LC_ALL: en_US.UTF-8
TEMPO_LICENSE_KEY: ${{ secrets.TEMPO_LICENSE_KEY || '' }}

steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
persist-credentials: false

- name: Setup Node.js 22
uses: actions/setup-node@v4
with:
node-version: '22'
registry-url: 'https://registry.npmjs.org'

- name: Install dependencies
run: npm ci

- name: Setup Tempo License Key
run: |
if [ -n "$TEMPO_LICENSE_KEY" ]; then
LICENSE_FILE="${{ runner.temp }}/tempo.key"
echo "$TEMPO_LICENSE_KEY" > "$LICENSE_FILE"
echo "TEMPO_LICENSE_PATH=$LICENSE_FILE" >> $GITHUB_ENV
fi

- name: Build Monorepo Workspaces
run: |
npm run build:library
npm run build:tempo
npm run build --workspace=@magmacomputing/tempo-pro --workspace=@magmacomputing/tempo-fns --workspace=@magmacomputing/tempo-plugin-ai --workspace=@magmacomputing/tempo-plugin-astro --workspace=@magmacomputing/tempo-plugin-batch --workspace=@magmacomputing/tempo-plugin-finance --workspace=@magmacomputing/tempo-plugin-snap --workspace=@magmacomputing/tempo-plugin-sync --workspace=@magmacomputing/tempo-plugin-ticker --if-present

- name: Run Tests
run: npm run test

- name: Publish Selected Package
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
SELECTED_PKG: ${{ inputs.package }}
DRY_RUN: ${{ inputs.dry_run }}
run: |
PROVENANCE_FLAG="--provenance --access public"
if [ "$DRY_RUN" = "true" ]; then
PROVENANCE_FLAG="$PROVENANCE_FLAG --dry-run"
echo "🔍 DRY RUN MODE ACTIVATED — Simulating publication..."
fi

WORKSPACES=(
"@magmacomputing/tempo"
"@magmacomputing/tempo-pro"
"@magmacomputing/tempo-fns"
"@magmacomputing/tempo-plugin-ai"
"@magmacomputing/tempo-plugin-astro"
"@magmacomputing/tempo-plugin-batch"
"@magmacomputing/tempo-plugin-finance"
"@magmacomputing/tempo-plugin-snap"
"@magmacomputing/tempo-plugin-sync"
"@magmacomputing/tempo-plugin-ticker"
)

publish_workspace() {
local pkg="$1"
local ver
ver=$(npm pkg get version --workspace="$pkg" --json | node -p "const d=JSON.parse(require('fs').readFileSync(0, 'utf8')); typeof d === 'string' ? d : (d['$pkg']?.version ?? d['$pkg'] ?? d.version ?? '')")
if [ -z "$ver" ] || [ "$ver" = "null" ]; then
echo "❌ Failed to resolve version for $pkg"
exit 1
fi
echo "Checking $pkg@$ver on npm..."

if [ "$DRY_RUN" != "true" ] && npm view "$pkg@$ver" version >/dev/null 2>&1; then
echo "⏩ $pkg@$ver is already published on npm. Skipping to support partial release recovery."
return 0
fi

echo "🚀 Publishing $pkg@$ver..."
npm publish --workspace="$pkg" $PROVENANCE_FLAG
}

if [ "$SELECTED_PKG" = "all" ]; then
echo "🔎 Preflighting all ${#WORKSPACES[@]} package versions..."
for pkg in "${WORKSPACES[@]}"; do
ver=$(npm pkg get version --workspace="$pkg" --json | node -p "const d=JSON.parse(require('fs').readFileSync(0, 'utf8')); typeof d === 'string' ? d : (d['$pkg']?.version ?? d['$pkg'] ?? d.version ?? '')")
echo " - $pkg: $ver"
if [ -z "$ver" ] || [ "$ver" = "null" ]; then
echo "❌ Failed to resolve version for $pkg"
exit 1
fi
done

echo "🚀 Publishing all workspaces..."
for pkg in "${WORKSPACES[@]}"; do
publish_workspace "$pkg"
done
else
publish_workspace "$SELECTED_PKG"
fi
14 changes: 14 additions & 0 deletions bin/build-plugins.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import fs from 'node:fs';
import { execSync } from 'node:child_process';

const pluginsDir = new URL('../packages/plugins', import.meta.url);
const entries = fs.readdirSync(pluginsDir, { withFileTypes: true });

const workspaceArgs = entries
.filter(dirent => dirent.isDirectory() && !dirent.name.startsWith('.bin') && !dirent.name.startsWith('.setup'))
.map(dirent => `--workspace=packages/plugins/${dirent.name}`)
.join(' ');

if (workspaceArgs) {
execSync(`npm run build ${workspaceArgs}`, { stdio: 'inherit' });
}
2 changes: 1 addition & 1 deletion bin/version-sync.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ if (!version) {
console.log(`\n🔄 Syncing version ${version} to workspaces...`);

try {
const workspaces = ['@magmacomputing/tempo', '@magmacomputing/library'];
const workspaces = ['@magmacomputing/tempo', '@magmacomputing/library', '@magmacomputing/tempo-pro'];
let syncedCount = 0;
for (const ws of workspaces) {
try {
Expand Down
Loading
Loading