Rename project from Gooti to Plebian Signer and add Claude Code config

- Rename all gooti-* files to plebian-signer-* across Chrome and Firefox
- Rename GootiMetaHandler to SignerMetaHandler in common library
- Update all references to use new naming convention
- Add CLAUDE.md with project build/architecture documentation
- Add Claude Code release command tailored for this npm/Angular project
- Add NWC-IMPLEMENTATION.md design document
- Add Claude skills for nostr, typescript, react, svelte, and applesauce libs
- Update README and various component templates with new branding

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-17 09:29:00 +01:00
parent e11ca7a0d2
commit 3c63e6555c
88 changed files with 19449 additions and 498 deletions

View File

@@ -19,17 +19,17 @@ export class StartupService {
// Step 0:
storageConfig.browserSyncNoHandler.setIgnoreProperties(
storageConfig.gootiMetaHandler.metaProperties
storageConfig.signerMetaHandler.metaProperties
);
// Step 1: Load the gooti's user settings
const gootiMetaData = await this.#storage.loadGootiMetaData();
if (typeof gootiMetaData?.syncFlow === 'undefined') {
// Very first run. The user has not set up Gooti yet.
// Step 1: Load the user settings
const signerMetaData = await this.#storage.loadSignerMetaData();
if (typeof signerMetaData?.syncFlow === 'undefined') {
// Very first run. The user has not set up Plebian Signer yet.
this.#router.navigateByUrl('/welcome');
return;
}
this.#storage.enableBrowserSyncFlow(gootiMetaData.syncFlow);
this.#storage.enableBrowserSyncFlow(signerMetaData.syncFlow);
// Load the browser session data.
const browserSessionData = await this.#storage.loadBrowserSessionData();

View File

@@ -113,7 +113,7 @@ export const deleteVault = async function (
doNotSetIsInitializedToFalse: boolean
): Promise<void> {
this.assureIsInitialized();
const syncFlow = this.getGootiMetaHandler().gootiMetaData?.syncFlow;
const syncFlow = this.getSignerMetaHandler().signerMetaData?.syncFlow;
if (typeof syncFlow === 'undefined') {
throw new Error('Sync flow is not set.');
}

View File

@@ -1,12 +1,12 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { BrowserSyncFlow, GootiMetaData } from './types';
import { BrowserSyncFlow, SignerMetaData } from './types';
export abstract class GootiMetaHandler {
get gootiMetaData(): GootiMetaData | undefined {
return this.#gootiMetaData;
export abstract class SignerMetaHandler {
get signerMetaData(): SignerMetaData | undefined {
return this.#signerMetaData;
}
#gootiMetaData?: GootiMetaData;
#signerMetaData?: SignerMetaData;
readonly metaProperties = ['syncFlow', 'vaultSnapshots'];
/**
@@ -18,25 +18,25 @@ export abstract class GootiMetaHandler {
*/
abstract loadFullData(): Promise<Partial<Record<string, any>>>;
setFullData(data: GootiMetaData) {
this.#gootiMetaData = data;
setFullData(data: SignerMetaData) {
this.#signerMetaData = data;
}
abstract saveFullData(data: GootiMetaData): Promise<void>;
abstract saveFullData(data: SignerMetaData): Promise<void>;
/**
* Sets the browser sync flow for the user and immediately saves it.
*/
async setBrowserSyncFlow(flow: BrowserSyncFlow): Promise<void> {
if (!this.#gootiMetaData) {
this.#gootiMetaData = {
if (!this.#signerMetaData) {
this.#signerMetaData = {
syncFlow: flow,
};
} else {
this.#gootiMetaData.syncFlow = flow;
this.#signerMetaData.syncFlow = flow;
}
await this.saveFullData(this.#gootiMetaData);
await this.saveFullData(this.#signerMetaData);
}
abstract clearData(keep: string[]): Promise<void>;

View File

@@ -6,10 +6,10 @@ import {
BrowserSessionData,
BrowserSyncData,
BrowserSyncFlow,
GootiMetaData,
SignerMetaData,
Relay_DECRYPTED,
} from './types';
import { GootiMetaHandler } from './gooti-meta-handler';
import { SignerMetaHandler } from './signer-meta-handler';
import { CryptoHelper } from '@common';
import {
addIdentity,
@@ -24,7 +24,7 @@ export interface StorageServiceConfig {
browserSessionHandler: BrowserSessionHandler;
browserSyncYesHandler: BrowserSyncHandler;
browserSyncNoHandler: BrowserSyncHandler;
gootiMetaHandler: GootiMetaHandler;
signerMetaHandler: SignerMetaHandler;
}
@Injectable({
@@ -37,7 +37,7 @@ export class StorageService {
#browserSessionHandler!: BrowserSessionHandler;
#browserSyncYesHandler!: BrowserSyncHandler;
#browserSyncNoHandler!: BrowserSyncHandler;
#gootiMetaHandler!: GootiMetaHandler;
#signerMetaHandler!: SignerMetaHandler;
initialize(config: StorageServiceConfig): void {
if (this.isInitialized) {
@@ -46,27 +46,27 @@ export class StorageService {
this.#browserSessionHandler = config.browserSessionHandler;
this.#browserSyncYesHandler = config.browserSyncYesHandler;
this.#browserSyncNoHandler = config.browserSyncNoHandler;
this.#gootiMetaHandler = config.gootiMetaHandler;
this.#signerMetaHandler = config.signerMetaHandler;
this.isInitialized = true;
}
async enableBrowserSyncFlow(flow: BrowserSyncFlow): Promise<void> {
this.assureIsInitialized();
this.#gootiMetaHandler.setBrowserSyncFlow(flow);
this.#signerMetaHandler.setBrowserSyncFlow(flow);
}
async loadGootiMetaData(): Promise<GootiMetaData | undefined> {
async loadSignerMetaData(): Promise<SignerMetaData | undefined> {
this.assureIsInitialized();
const data = await this.#gootiMetaHandler.loadFullData();
const data = await this.#signerMetaHandler.loadFullData();
if (Object.keys(data).length === 0) {
// No data available yet.
return undefined;
}
this.#gootiMetaHandler.setFullData(data as GootiMetaData);
return data as GootiMetaData;
this.#signerMetaHandler.setFullData(data as SignerMetaData);
return data as SignerMetaData;
}
async loadBrowserSessionData(): Promise<BrowserSessionData | undefined> {
@@ -119,7 +119,7 @@ export class StorageService {
this.assureIsInitialized();
await this.getBrowserSyncHandler().clearData();
await this.getBrowserSessionHandler().clearData();
await this.getGootiMetaHandler().clearData([]);
await this.getSignerMetaHandler().clearData([]);
this.isInitialized = false;
}
@@ -195,7 +195,7 @@ export class StorageService {
getBrowserSyncHandler(): BrowserSyncHandler {
this.assureIsInitialized();
switch (this.#gootiMetaHandler.gootiMetaData?.syncFlow) {
switch (this.#signerMetaHandler.signerMetaData?.syncFlow) {
case BrowserSyncFlow.NO_SYNC:
return this.#browserSyncNoHandler;
@@ -211,10 +211,10 @@ export class StorageService {
return this.#browserSessionHandler;
}
getGootiMetaHandler(): GootiMetaHandler {
getSignerMetaHandler(): SignerMetaHandler {
this.assureIsInitialized();
return this.#gootiMetaHandler;
return this.#signerMetaHandler;
}
/**

View File

@@ -62,7 +62,7 @@ export type BrowserSyncData = BrowserSyncData_PART_Unencrypted &
export enum BrowserSyncFlow {
NO_SYNC = 0,
BROWSER_SYNC = 1,
GOOTI_SYNC = 2,
SIGNER_SYNC = 2,
CUSTOM_SYNC = 3,
}
@@ -79,17 +79,17 @@ export interface BrowserSessionData {
relays: Relay_DECRYPTED[];
}
export interface GootiMetaData_VaultSnapshot {
export interface SignerMetaData_VaultSnapshot {
fileName: string;
data: BrowserSyncData;
}
export const GOOTI_META_DATA_KEY = {
export const SIGNER_META_DATA_KEY = {
vaultSnapshots: 'vaultSnapshots',
};
export interface GootiMetaData {
syncFlow?: number; // 0 = no sync, 1 = browser sync, (future: 2 = Gooti sync, 3 = Custom sync (bring your own sync))
export interface SignerMetaData {
syncFlow?: number; // 0 = no sync, 1 = browser sync, (future: 2 = Signer sync, 3 = Custom sync (bring your own sync))
vaultSnapshots?: GootiMetaData_VaultSnapshot[];
vaultSnapshots?: SignerMetaData_VaultSnapshot[];
}

View File

@@ -19,7 +19,7 @@ export * from './lib/services/storage/storage.service';
export * from './lib/services/storage/types';
export * from './lib/services/storage/browser-sync-handler';
export * from './lib/services/storage/browser-session-handler';
export * from './lib/services/storage/gooti-meta-handler';
export * from './lib/services/storage/signer-meta-handler';
export * from './lib/services/logger/logger.service';
export * from './lib/services/startup/startup.service';