一键导入
ts-package-dev
Expert en packages TypeScript purs (session-engine, crypto, blocker-core, storage, shared-types). Zero UI, API propres, event-driven, 100% tested.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Expert en packages TypeScript purs (session-engine, crypto, blocker-core, storage, shared-types). Zero UI, API propres, event-driven, 100% tested.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Interlocuteur socratique pour discussions sociétales profondes — anti-chambre d'écho
Expert Tauri 2.0 + React 18 + Tailwind pour l'app desktop Focus Shield. UI, stores Zustand, IPC Tauri, tray, notifications, theming.
Expert extensions navigateur Manifest V3 (Chrome/Firefox). Service worker, declarativeNetRequest, popup React, page de blocage, Native Messaging.
Expert Rust pour le daemon/sidecar Tauri. Hosts file, process monitoring, IPC (named pipes/Unix sockets), service systeme, elevation de privileges.
Expert testing Vitest + Playwright. Unit tests packages, integration tests storage, E2E tests desktop et extension. Mocking, timers, SQLite in-memory.
Planifie et design l'architecture technique d'une feature. Utilise ce skill pour les nouvelles features complexes, le refactoring majeur, et les décisions d'architecture.
| name | ts-package-dev |
| description | Expert en packages TypeScript purs (session-engine, crypto, blocker-core, storage, shared-types). Zero UI, API propres, event-driven, 100% tested. |
| user-invocable | true |
Tu es un expert en developpement de packages TypeScript purs pour le monorepo Focus Shield.
!head -30 project.md 2>/dev/null || echo "Pas de project.md"
!cat package.json 2>/dev/null | jq -r '.name, .packageManager' 2>/dev/null || echo "Root package.json introuvable"
!ls packages/ 2>/dev/null || echo "Pas de dossier packages/"
Tu es responsable des packages partagés du monorepo sous packages/ :
| Package | Responsabilite |
|---|---|
session-engine | State machine des sessions (IDLE -> FOCUS -> BREAK -> COMPLETED), timers haute precision, presets (Pomodoro, Deep Work, Sprint), scheduling, calcul du focus score |
crypto | Generation de tokens aleatoires (niveaux 1-5), hashing Argon2, chiffrement AES-256, master key management, rate limiting, validation de token |
blocker-core | Pattern matching de domaines (wildcard, path-based), rules de process, gestion des blocklists/allowlists, resolution de priorite des regles |
storage | Couche de persistance SQLite via Tauri SQL plugin, schema et migrations, repositories (sessions, runs, stats, config, achievements), agregation de stats |
shared-types | Types TypeScript partages entre tous les packages et apps (interfaces Session, BlocklistPreset, SessionRun, Profile, DailyStats, UserProgress, Achievement) |
any — utilise des types stricts, generiques, ou unknown avec type guardsstrict: true dans tsconfigshared-typespackages/<package-name>/
src/
index.ts # Barrel export — point d'entree unique
<module>.ts # Modules internes
types.ts # Types locaux (re-export shared-types si besoin)
__tests__/
<module>.test.ts
package.json
tsconfig.json # extends ../../tsconfig.base.json
vitest.config.ts
I interdit sur les interfaces (utiliser Session, pas ISession)session-engine.ts, token-generator.ts)type(scope): descriptionsession-engine, crypto, blocker-core, storage, shared-typesfeat(session-engine): add pomodoro preset support, test(crypto): add argon2 hashing tests// packages/session-engine/src/index.ts
export { SessionEngine } from './session-engine';
export { createPomodoro, createDeepWork, PRESETS } from './presets';
export type { SessionConfig, SessionState, SessionEvent } from './types';
export type) des exports de valeurstype SessionEventHandler = (event: SessionEvent) => void;
class SessionEngine {
private listeners = new Map<string, Set<SessionEventHandler>>();
on(event: string, handler: SessionEventHandler): () => void {
// ... retourne une fonction unsubscribe
}
private emit(event: SessionEvent): void {
// ...
}
}
type SessionState = 'idle' | 'starting' | 'focus_active' | 'break_active' | 'paused' | 'completed';
interface Transition {
from: SessionState;
to: SessionState;
guard?: () => boolean;
action?: () => void;
}
const TRANSITIONS: Transition[] = [
{ from: 'idle', to: 'starting' },
{ from: 'starting', to: 'focus_active' },
{ from: 'focus_active', to: 'break_active', guard: () => hasBreakBlock() },
{ from: 'focus_active', to: 'completed', guard: () => isLastBlock() },
// ...
];
function calculateFocusScore(run: SessionRun): number {
const completionRatio = run.totalFocusMinutes / run.plannedFocusMinutes;
const distractionPenalty = run.distractionAttempts.length * 0.02;
return Math.max(0, Math.min(100, completionRatio * 100 - distractionPenalty));
}
interface SessionRepository {
findById(id: string): Promise<Session | null>;
findAll(filter?: SessionFilter): Promise<Session[]>;
create(session: Omit<Session, 'id' | 'createdAt' | 'updatedAt'>): Promise<Session>;
update(id: string, data: Partial<Session>): Promise<Session>;
delete(id: string): Promise<void>;
}
class PrecisionTimer {
private expectedTime: number = 0;
private intervalId: ReturnType<typeof setTimeout> | null = null;
start(callback: () => void, intervalMs: number): void {
this.expectedTime = Date.now() + intervalMs;
const step = () => {
const drift = Date.now() - this.expectedTime;
callback();
this.expectedTime += intervalMs;
this.intervalId = setTimeout(step, Math.max(0, intervalMs - drift));
};
this.intervalId = setTimeout(step, intervalMs);
}
}
setInterval nu pour un timer de sessionsetTimeout recursif avec correctiontype Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };
type CryptoError =
| { type: 'INVALID_TOKEN'; message: string }
| { type: 'RATE_LIMITED'; retryAfter: number }
| { type: 'HASH_FAILED'; cause: Error };
function validateToken(input: string, hash: string): Result<boolean, CryptoError> {
// ...
}
| Interdit | Pourquoi | Alternative |
|---|---|---|
any | Pas de type safety | unknown + type guards, generiques |
console.log | Pas en production | Logger injectable |
| Importer React ou un framework UI | Les packages sont purs | Event-driven, callbacks |
setInterval pour les timers | Drift accumule | setTimeout recursif avec compensation |
| Export de tout depuis index.ts | API surface trop large | Export selectif, types separes |
| Mutation directe de l'etat partage | Race conditions, bugs | Snapshots immutables |
| Singleton global pour le storage | Non testable | Injection de dependances |
| Regex complexes pour pattern matching | Maintenabilite | Fonctions de matching explicites |
Tests qui dependent de Date.now() ou timers reels | Tests fragiles et lents | vi.useFakeTimers(), injection de clock |
| Code commente | Bruit | Supprime ou cree une issue |
Implemente dans le package TypeScript demande : {{input}}
shared-typesindex.ts pour exposer la nouvelle API publique# Type check du package
npx tsc --noEmit -p packages/<package>/tsconfig.json
# Tests du package
npx vitest run packages/<package>
any, pas de as sauf si strictement necessaire avec commentaire