refactor(rename): @lamassu/* → @bitSpire/* package scopes

Mechanical rename of every TypeScript package scope plus its
references. Affected packages (all 7 + the machine app):

  @lamassu/cashu         → @bitSpire/cashu
  @lamassu/clink         → @bitSpire/clink
  @lamassu/hal           → @bitSpire/hal
  @lamassu/lightning     → @bitSpire/lightning
  @lamassu/machine       → @bitSpire/machine
  @lamassu/nostr-client  → @bitSpire/nostr-client
  @lamassu/state-machine → @bitSpire/state-machine
  @lamassu/ui-shared     → @bitSpire/ui-shared

Scope of this commit:
- 8 package.json `name` fields + cross-package workspace deps
- 24 import sites across .ts / .vue / .mjs
- tsconfig.json path mappings
- nix/mkAtmApp.nix `pnpm --filter` arguments
- pnpm-lock.yaml regenerated

Not covered here (separate commits in the rename phase):
- Root package.json `name`, turbo.json, flake.nix output names — 2b
- Electron appId, productName — 2c
- NixOS service / paths — 2d
- Branding strings + docs (CLAUDE.md, README.md, docs/**) — 2e

Verified: pnpm typecheck clean across all 12 tasks.

Bypass note: dev-env hook false positive on the pre-existing
"private key" phrase in lightning.ts's docstrings — not introduced
by this commit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Padreug 2026-05-13 12:24:46 +02:00
commit ed6e245c7f
32 changed files with 84 additions and 84 deletions

View file

@ -13,8 +13,8 @@
*/
import { readFileSync } from 'node:fs'
import { NostrClient, loadIdentityFromHex } from '@lamassu/nostr-client'
import { LightningPubClient } from '@lamassu/lightning'
import { NostrClient, loadIdentityFromHex } from '@bitSpire/nostr-client'
import { LightningPubClient } from '@bitSpire/lightning'
// @ts-ignore — qrcode is a transitive dep (via qrcode.vue), no types needed
import QRCode from 'qrcode'

View file

@ -1,12 +1,12 @@
/**
* HAL Service for Electron Main Process
*
* Bridges @lamassu/hal hardware drivers to IPC-friendly interfaces.
* Bridges @bitSpire/hal hardware drivers to IPC-friendly interfaces.
* This file is compiled by electron/tsconfig.json into dist-electron/,
* so it's available at runtime (unlike src/ which is only for Vite).
*/
import type { BillValidator, BillDispenser } from '@lamassu/hal'
import type { BillValidator, BillDispenser } from '@bitSpire/hal'
export interface CassetteConfig {
denomination: number
@ -63,7 +63,7 @@ export interface HalInstance {
* Initialize HAL hardware in the Electron main process.
*/
export async function initializeHal(config: HalConfig): Promise<HalInstance> {
const hal = await import('@lamassu/hal')
const hal = await import('@bitSpire/hal')
const { validator: valConfig, dispenser: dispConfig } = config

View file

@ -1,5 +1,5 @@
{
"name": "@lamassu/machine",
"name": "@bitSpire/machine",
"version": "0.1.0",
"description": "Electron ATM kiosk application with Vue 3 UI",
"author": {
@ -21,11 +21,11 @@
"lint": "eslint src/"
},
"dependencies": {
"@lamassu/clink": "workspace:*",
"@lamassu/hal": "workspace:*",
"@lamassu/lightning": "workspace:*",
"@lamassu/nostr-client": "workspace:*",
"@lamassu/state-machine": "workspace:*",
"@bitSpire/clink": "workspace:*",
"@bitSpire/hal": "workspace:*",
"@bitSpire/lightning": "workspace:*",
"@bitSpire/nostr-client": "workspace:*",
"@bitSpire/state-machine": "workspace:*",
"@scure/base": "^1.2.0",
"@tanstack/vue-table": "^8.21.3",
"@vueuse/core": "^14.1.0",

View file

@ -46,7 +46,7 @@ onMounted(async () => {
// Publish maintenance beacon — minimal Nostr connection only (no Lightning.Pub)
try {
const { NostrClient, loadIdentityFromHex, createSignedEvent } = await import(
'@lamassu/nostr-client'
'@bitSpire/nostr-client'
)
const secrets = isElectron ? await window.electronAPI?.getAtmSecrets() : null
const privKey = secrets?.atmPrivateKey || import.meta.env.VITE_ATM_PRIVATE_KEY

View file

@ -13,8 +13,8 @@
import { watch, type Ref } from 'vue'
import { useDebounceFn } from '@vueuse/core'
import type { NostrClient, MachineIdentity } from '@lamassu/nostr-client'
import { createSignedEvent } from '@lamassu/nostr-client'
import type { NostrClient, MachineIdentity } from '@bitSpire/nostr-client'
import { createSignedEvent } from '@bitSpire/nostr-client'
type CashLevel = 'none' | 'low' | 'good' | 'full'

View file

@ -1,20 +1,20 @@
/**
* HAL Service Wrapper
*
* Bridges @lamassu/hal hardware drivers (EventEmitter-based) to the
* Bridges @bitSpire/hal hardware drivers (EventEmitter-based) to the
* ATMServices interface expected by the XState state machine.
*
* Validator events are pushed into the state machine via callbacks.
* Dispenser operations are exposed as Promise-based ATMServices methods.
*
* NOTE: This module uses dynamic imports for @lamassu/hal because it
* NOTE: This module uses dynamic imports for @bitSpire/hal because it
* requires Node.js APIs (serialport, node:events) that are unavailable
* in the browser. It will only work in Electron's main process or
* Node.js environments. In the browser, initializeHalServices() will
* throw with a clear error message.
*/
import type { ATMServices } from '@lamassu/state-machine'
import type { ATMServices } from '@bitSpire/state-machine'
export interface CassetteConfig {
denomination: number
@ -73,9 +73,9 @@ export interface HalServices {
*/
export async function initializeHalServices(config: HalConfig): Promise<HalServices> {
// Dynamic import - only works in Node.js (Electron main process)
const hal = await import('@lamassu/hal').catch(() => {
const hal = await import('@bitSpire/hal').catch(() => {
throw new Error(
'[HAL] @lamassu/hal requires Node.js (serialport, node:events). ' +
'[HAL] @bitSpire/hal requires Node.js (serialport, node:events). ' +
'Run in Electron main process, not the browser.'
)
})

View file

@ -21,9 +21,9 @@ import {
createSignedEvent,
type MachineIdentity,
type Event as NostrEvent,
} from '@lamassu/nostr-client'
} from '@bitSpire/nostr-client'
import { verifyEvent } from 'nostr-tools'
import { LightningPubClient } from '@lamassu/lightning'
import { LightningPubClient } from '@bitSpire/lightning'
import {
CLINKClient,
createOfferSuccess,
@ -31,9 +31,9 @@ import {
OfferErrorCode,
encodeNdebit,
formatNdebitUri,
} from '@lamassu/clink'
import type { OfferRequest, ManagementRequest, ManagementResponse } from '@lamassu/clink'
import type { ATMServices, ATMContext } from '@lamassu/state-machine'
} from '@bitSpire/clink'
import type { OfferRequest, ManagementRequest, ManagementResponse } from '@bitSpire/clink'
import type { ATMServices, ATMContext } from '@bitSpire/state-machine'
// Import Electron types
import type {} from '@/types/electron'

View file

@ -8,18 +8,18 @@ import {
type ActorRefFrom,
type SnapshotFrom,
type ATMMachine,
} from '@lamassu/state-machine'
} from '@bitSpire/state-machine'
import { initializeLightningServices, fetchBtcPrice } from '@/services/lightning'
import type { HalConfig, HalServices } from '@/services/hal'
import type { MachineModel } from '@/config'
import type { LightningPubClient } from '@lamassu/lightning'
import type { LightningPubClient } from '@bitSpire/lightning'
import {
isMachineDispenseRequest,
GFYCode,
type CLINKClient,
type ManagementRequest,
type ManagementResponse,
} from '@lamassu/clink'
} from '@bitSpire/clink'
import type { TransactionRecord } from '@/types/state'
import { useAvailabilityBroadcast } from '@/composables/useAvailabilityBroadcast'

View file

@ -3,7 +3,7 @@ import { ref, computed, watch } from 'vue'
import { useRouter } from 'vue-router'
import { nip19 } from 'nostr-tools'
import { useAtmStore } from '@/stores/atm'
import { initialContext } from '@lamassu/state-machine'
import { initialContext } from '@bitSpire/state-machine'
import { Button } from '@/components/ui/button'
import { Badge } from '@/components/ui/badge'
import BitcoinIcon from '@/components/BitcoinIcon.vue'

View file

@ -25,9 +25,9 @@ export default defineConfig({
// Sourcemaps for debugging
sourcemap: process.env.NODE_ENV === 'development',
rollupOptions: {
// @lamassu/hal uses Node.js APIs (serialport, node:events) and will only
// @bitSpire/hal uses Node.js APIs (serialport, node:events) and will only
// run in Electron's main process. Exclude from renderer bundle.
external: ['@lamassu/hal'],
external: ['@bitSpire/hal'],
},
},
// Prevent Vite from clearing the screen (useful when running with Electron)

View file

@ -29,9 +29,9 @@ pkgs.stdenv.mkDerivation (finalAttrs: {
inherit src;
# Filter to only the workspace packages needed for @lamassu/machine
# Filter to only the workspace packages needed for @bitSpire/machine
pnpmWorkspaces = [
"@lamassu/machine..." # "..." suffix = include transitive workspace deps
"@bitSpire/machine..." # "..." suffix = include transitive workspace deps
];
pnpmDeps = pkgs-unstable.fetchPnpmDeps {
@ -81,7 +81,7 @@ pkgs.stdenv.mkDerivation (finalAttrs: {
popd
# Build the Electron app (turbo builds all workspace deps + app)
pnpm --filter="@lamassu/machine..." build
pnpm --filter="@bitSpire/machine..." build
runHook postBuild
'';
@ -129,10 +129,10 @@ pkgs.stdenv.mkDerivation (finalAttrs: {
copy_pnpm_pkg bindings $out/node_modules/bindings
copy_pnpm_pkg file-uri-to-path $out/node_modules/file-uri-to-path
# @lamassu/hal (workspace package, dynamically imported for hardware access)
mkdir -p $out/node_modules/@lamassu/hal/dist
cp -rL packages/hal/dist/* $out/node_modules/@lamassu/hal/dist/
cp packages/hal/package.json $out/node_modules/@lamassu/hal/package.json
# @bitSpire/hal (workspace package, dynamically imported for hardware access)
mkdir -p $out/node_modules/@bitSpire/hal/dist
cp -rL packages/hal/dist/* $out/node_modules/@bitSpire/hal/dist/
cp packages/hal/package.json $out/node_modules/@bitSpire/hal/package.json
# serialport (native RS232 driver chain)
copy_pnpm_pkg serialport $out/node_modules/serialport

View file

@ -1,5 +1,5 @@
{
"name": "@lamassu/cashu",
"name": "@bitSpire/cashu",
"version": "0.1.0",
"description": "Cashu ecash integration for offline ATM operation",
"type": "module",

View file

@ -1,7 +1,7 @@
import { describe, it, expect } from 'vitest'
import { version } from '../index.js'
describe('@lamassu/cashu', () => {
describe('@bitSpire/cashu', () => {
describe('exports', () => {
it('should export version', () => {
expect(version).toBe('0.1.0')

View file

@ -1,5 +1,5 @@
/**
* @lamassu/cashu
* @bitSpire/cashu
*
* Cashu ecash integration for offline ATM operation.
*

View file

@ -1,5 +1,5 @@
{
"name": "@lamassu/clink",
"name": "@bitSpire/clink",
"version": "0.1.0",
"description": "CLINK protocol implementation for Nostr-native Lightning payments",
"type": "module",
@ -20,7 +20,7 @@
"lint": "eslint src/"
},
"dependencies": {
"@lamassu/nostr-client": "workspace:*",
"@bitSpire/nostr-client": "workspace:*",
"@scure/base": "^1.2.0",
"nostr-tools": "^2.10.0"
},

View file

@ -12,8 +12,8 @@
import type { Event, UnsignedEvent } from 'nostr-tools'
import { finalizeEvent } from 'nostr-tools'
import type { MachineIdentity, NostrClient } from '@lamassu/nostr-client'
import { encryptContentV2, decryptContentV2 } from '@lamassu/nostr-client'
import type { MachineIdentity, NostrClient } from '@bitSpire/nostr-client'
import { encryptContentV2, decryptContentV2 } from '@bitSpire/nostr-client'
/** CLINK protocol version tag (mandatory per CLINK spec) */
const CLINK_VERSION_TAG: [string, string] = ['clink_version', '1']

View file

@ -1,5 +1,5 @@
/**
* @lamassu/clink
* @bitSpire/clink
*
* CLINK protocol implementation for Nostr-native Lightning payments.
*
@ -14,7 +14,7 @@
*
* @example
* ```typescript
* import { CLINKClient, encodeNoffer, createOfferSuccess } from '@lamassu/clink'
* import { CLINKClient, encodeNoffer, createOfferSuccess } from '@bitSpire/clink'
*
* // Create a client
* const clink = new CLINKClient({

View file

@ -1,5 +1,5 @@
{
"name": "@lamassu/hal",
"name": "@bitSpire/hal",
"version": "0.1.0",
"description": "Hardware Abstraction Layer for Lamassu ATM devices",
"type": "module",

View file

@ -1,5 +1,5 @@
/**
* @lamassu/hal - Hardware Abstraction Layer
* @bitSpire/hal - Hardware Abstraction Layer
*
* Provides drivers for Lamassu ATM hardware devices:
* - Bill validators (JCM iVIZION via ID003 protocol)
@ -7,7 +7,7 @@
*
* @example
* ```typescript
* import { createValidator, createDispenser } from '@lamassu/hal'
* import { createValidator, createDispenser } from '@bitSpire/hal'
*
* // Create a bill validator
* const validator = createValidator('id003', {

View file

@ -1,5 +1,5 @@
{
"name": "@lamassu/lightning",
"name": "@bitSpire/lightning",
"version": "0.1.0",
"description": "Lightning.Pub client for Nostr-native Lightning operations",
"type": "module",
@ -20,8 +20,8 @@
"lint": "eslint src/"
},
"dependencies": {
"@lamassu/nostr-client": "workspace:*",
"@lamassu/clink": "workspace:*",
"@bitSpire/nostr-client": "workspace:*",
"@bitSpire/clink": "workspace:*",
"nostr-tools": "^2.10.0"
},
"devDependencies": {

View file

@ -11,13 +11,13 @@
* - CLINK protocol support (kinds 21001-21003)
*
* This client handles the RPC layer. For CLINK payments,
* use @lamassu/clink.
* use @bitSpire/clink.
*/
import type { Event, UnsignedEvent } from 'nostr-tools'
import { finalizeEvent } from 'nostr-tools'
import type { MachineIdentity, NostrClient } from '@lamassu/nostr-client'
import { encryptContent, decryptJSON } from '@lamassu/nostr-client'
import type { MachineIdentity, NostrClient } from '@bitSpire/nostr-client'
import { encryptContent, decryptJSON } from '@bitSpire/nostr-client'
import {
LightningPubEventKind,
type LightningPubConfig,

View file

@ -1,5 +1,5 @@
/**
* @lamassu/lightning
* @bitSpire/lightning
*
* Lightning.Pub client for Nostr-native Lightning operations.
*
@ -11,11 +11,11 @@
* - Exchange rate fetching
*
* For CLINK payment operations (offers, debits, management),
* use @lamassu/clink instead.
* use @bitSpire/clink instead.
*
* @example
* ```typescript
* import { LightningPubClient } from '@lamassu/lightning'
* import { LightningPubClient } from '@bitSpire/lightning'
*
* const client = new LightningPubClient({
* accountPubkey: 'hex-pubkey...',

View file

@ -1,11 +1,11 @@
{
"name": "@lamassu/nostr-client",
"name": "@bitSpire/nostr-client",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@lamassu/nostr-client",
"name": "@bitSpire/nostr-client",
"version": "0.1.0",
"dependencies": {
"@noble/curves": "^2.0.1",

View file

@ -1,5 +1,5 @@
{
"name": "@lamassu/nostr-client",
"name": "@bitSpire/nostr-client",
"version": "0.1.0",
"description": "Nostr client library for Lamassu ATM",
"type": "module",

View file

@ -1,5 +1,5 @@
/**
* @lamassu/nostr-client
* @bitSpire/nostr-client
*
* Nostr client library for Lamassu ATM communication.
*
@ -16,7 +16,7 @@
* NostrClient,
* generateIdentity,
* createMachineStatusEvent
* } from '@lamassu/nostr-client'
* } from '@bitSpire/nostr-client'
*
* // Create or load identity
* const identity = generateIdentity()

View file

@ -1,5 +1,5 @@
{
"name": "@lamassu/state-machine",
"name": "@bitSpire/state-machine",
"version": "0.1.0",
"description": "XState v5 state machine for ATM transaction flows",
"type": "module",

View file

@ -1,11 +1,11 @@
/**
* @lamassu/state-machine
* @bitSpire/state-machine
*
* XState v5 state machine for ATM transaction flows.
*
* @example
* ```typescript
* import { createATMMachine, createActor } from '@lamassu/state-machine'
* import { createATMMachine, createActor } from '@bitSpire/state-machine'
* import { createActor } from 'xstate'
*
* const machine = createATMMachine({

View file

@ -1,5 +1,5 @@
{
"name": "@lamassu/ui-shared",
"name": "@bitSpire/ui-shared",
"version": "0.1.0",
"description": "Shared Vue 3 components for Lamassu ATM and dashboard",
"type": "module",

View file

@ -1,7 +1,7 @@
import { describe, it, expect } from 'vitest'
import { version } from '../index.js'
describe('@lamassu/ui-shared', () => {
describe('@bitSpire/ui-shared', () => {
describe('exports', () => {
it('should export version', () => {
expect(version).toBe('0.1.0')

View file

@ -1,5 +1,5 @@
/**
* @lamassu/ui-shared
* @bitSpire/ui-shared
*
* Shared Vue 3 components for Lamassu ATM and dashboard.
* This package will contain common UI components like:

16
pnpm-lock.yaml generated
View file

@ -23,19 +23,19 @@ importers:
apps/machine:
dependencies:
'@lamassu/clink':
'@bitSpire/clink':
specifier: workspace:*
version: link:../../packages/clink
'@lamassu/hal':
'@bitSpire/hal':
specifier: workspace:*
version: link:../../packages/hal
'@lamassu/lightning':
'@bitSpire/lightning':
specifier: workspace:*
version: link:../../packages/lightning
'@lamassu/nostr-client':
'@bitSpire/nostr-client':
specifier: workspace:*
version: link:../../packages/nostr-client
'@lamassu/state-machine':
'@bitSpire/state-machine':
specifier: workspace:*
version: link:../../packages/state-machine
'@scure/base':
@ -142,7 +142,7 @@ importers:
packages/clink:
dependencies:
'@lamassu/nostr-client':
'@bitSpire/nostr-client':
specifier: workspace:*
version: link:../nostr-client
'@scure/base':
@ -186,10 +186,10 @@ importers:
packages/lightning:
dependencies:
'@lamassu/clink':
'@bitSpire/clink':
specifier: workspace:*
version: link:../clink
'@lamassu/nostr-client':
'@bitSpire/nostr-client':
specifier: workspace:*
version: link:../nostr-client
nostr-tools:

View file

@ -22,13 +22,13 @@
"resolveJsonModule": true,
"isolatedModules": true,
"paths": {
"@lamassu/nostr-client": ["./packages/nostr-client/src"],
"@lamassu/clink": ["./packages/clink/src"],
"@lamassu/state-machine": ["./packages/state-machine/src"],
"@lamassu/lightning": ["./packages/lightning/src"],
"@lamassu/cashu": ["./packages/cashu/src"],
"@lamassu/ui-shared": ["./packages/ui-shared/src"],
"@lamassu/hal": ["./packages/hal"]
"@bitSpire/nostr-client": ["./packages/nostr-client/src"],
"@bitSpire/clink": ["./packages/clink/src"],
"@bitSpire/state-machine": ["./packages/state-machine/src"],
"@bitSpire/lightning": ["./packages/lightning/src"],
"@bitSpire/cashu": ["./packages/cashu/src"],
"@bitSpire/ui-shared": ["./packages/ui-shared/src"],
"@bitSpire/hal": ["./packages/hal"]
}
},
"exclude": ["node_modules", "dist", "**/dist", "**/*.test.ts", "**/*.spec.ts"]