Replace JWT claim system with npm maintainer email matching and provenance metadata

- Remove ApplicationNpmClaimService, NpmClaimTokenDTO, NPM_CLAIM JWT type,
  and all claim-related mutations/methods across server, SDK, and frontend
- Add provenanceRepositoryUrl, isProvenanceVerified, provenanceVerifiedAt
  fields to ApplicationRegistrationEntity with core migration
- Create ApplicationNpmRegistrationService with email-based ownership
  verification and lightweight npm provenance attestation fetching
- Add registerNpmPackage GraphQL mutation with workspace auth guards
- Enforce twenty-app- prefix for all npm package names in validation
  and marketplace search filtering
- Create .github/actions/publish-twenty-app composite action for
  building and publishing apps with --provenance
- Scaffold publish.yml GitHub workflow in create-twenty-app
- Add app:register CLI command and public operation in SDK
- Update frontend empty state to show app:register instructions
- Enrich MarketplaceCatalogSyncService to fetch and store provenance
  metadata during npm app discovery
- Add unit tests for registration service and package name validation

Made-with: Cursor
This commit is contained in:
Félix Malfait
2026-03-07 11:02:47 +01:00
parent ae8a0713b0
commit d4ce4414e2
30 changed files with 971 additions and 694 deletions
@@ -0,0 +1,37 @@
name: Publish Twenty App
description: Build and publish a Twenty app to npm with provenance
inputs:
npm-token:
description: npm token with publish permissions
required: true
npm-tag:
description: npm dist-tag
required: false
default: latest
app-path:
description: Path to the app directory
required: false
default: '.'
runs:
using: composite
steps:
- uses: actions/setup-node@v4
with:
node-version: '24'
registry-url: https://registry.npmjs.org
- name: Install and build
shell: bash
working-directory: ${{ inputs.app-path }}
run: |
yarn install --immutable
npx twenty app:build
- name: Publish with provenance
shell: bash
working-directory: ${{ inputs.app-path }}/.twenty/output
env:
NODE_AUTH_TOKEN: ${{ inputs.npm-token }}
run: npm publish --provenance --access public --tag ${{ inputs.npm-tag }}