mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 19:01:08 +02:00
Continuation of docs/plans/mana-mcp-and-personas.md. Personas are the
auto-test users the M3 runner will drive — they're real Mana users
(kind='persona', tier='founder'), registered through the same Better
Auth pipeline as humans, just stamped differently and metadata-tracked
so the persona-runner knows how to role-play them.
Schemas (auth namespace — personas are 1:1 with users, no reason for a
separate platform.* schema that the plan originally sketched)
- userKindEnum ('human' | 'persona' | 'system') + users.kind column,
wired into better-auth additionalFields so the JWT/user object carry
the flag. Default 'human' keeps every existing user untouched.
- auth.personas — 1:1 descriptor (archetype, systemPrompt, moduleMix
jsonb, tickCadence, lastActiveAt). CASCADE from users.id.
- auth.persona_actions — tick-grouped audit of every tool call the
runner makes (toolName, inputHash for dedup, result, latency).
- auth.persona_feedback — structured 1-5 ratings per module per tick,
plus free-text notes. This is where the runner writes the
self-reflection step at end of each tick.
Admin endpoints (/api/v1/admin/personas, admin-tier-gated)
- POST / create-or-update by email. Uses auth.api.signUpEmail
if the user's new, then stamps kind+tier+verified
and upserts the personas row. Idempotent — safe to
re-run after catalog edits.
- GET / list with 7-day action count per persona.
- GET /:id detail + recent 20 actions + per-module feedback
aggregate.
- DELETE /:id hard delete. Refuses non-persona users as
defense-in-depth: an admin typo here would cascade
through the full user-delete chain.
Catalog + seed pipeline (scripts/personas/)
- catalog.json 10 handwritten personas spanning 7 archetypes
(adhd-student, ceo-busy, creative-parent, solo-dev,
researcher, freelancer, overwhelmed-newbie).
Five pairs of personas that will later share
family/team spaces (cross-space setup is deferred
to M2.d per the plan).
- catalog.ts zod-validated loader. Refines email to require
@mana.test TLD — non-existent, no bounce risk.
- password.ts deterministic HMAC-SHA256(PERSONA_SEED_SECRET,
email). No stored per-persona credentials; the
runner re-derives on every login. Refuses the
dev-fallback secret in production.
- seed.ts POST /admin/personas per catalog entry. Flags:
--auth=, --jwt=, --dry-run.
- cleanup.ts Hard-delete every live persona. Warns when the
live set drifts from the catalog.
Root package.json:
pnpm seed:personas
pnpm seed:personas:cleanup
Extends the ESLint root-ignore list with `scripts/**` so Bun-typed
utility scripts don't fail the typed-parser check they weren't opted
into. Consistent with the rest of scripts/ being .mjs+.sh.
To go live (user action):
pnpm docker:up
cd services/mana-auth && bun run db:push
export MANA_ADMIN_JWT=...
pnpm seed:personas
M2.d deferred: cross-space (family/team/practice) memberships between
persona pairs. Better Auth's org-invite flow is multi-step and would
roughly double the M2 scope; the persona-runner (M3) can operate in
personal spaces first, shared-space tests land as their own milestone.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
81 lines
2.2 KiB
JavaScript
81 lines
2.2 KiB
JavaScript
// @ts-check
|
|
/**
|
|
* Root ESLint configuration for Mana monorepo
|
|
*
|
|
* Uses @mana/eslint-config for unified linting across all packages.
|
|
* Apps can use their own eslint.config.* to add framework-specific rules.
|
|
*
|
|
* Config hierarchy:
|
|
* 1. Root: base + typescript + prettier (this file)
|
|
* 2. SvelteKit: adds svelteConfig
|
|
* 3. Expo Mobile: adds reactConfig
|
|
* 4. NestJS Backend: adds nestjsConfig
|
|
*/
|
|
import { baseConfig, typescriptConfig, prettierConfig } from '@mana/eslint-config';
|
|
|
|
export default [
|
|
// ============================================
|
|
// Global ignores
|
|
// ============================================
|
|
{
|
|
ignores: [
|
|
// Build outputs
|
|
'**/node_modules/**',
|
|
'**/dist/**',
|
|
'**/build/**',
|
|
'**/coverage/**',
|
|
'**/.turbo/**',
|
|
|
|
// Framework-specific
|
|
'**/.svelte-kit/**',
|
|
'**/.expo/**',
|
|
'**/.next/**',
|
|
|
|
// Archived projects
|
|
'**/apps-archived/**',
|
|
|
|
// Generated files
|
|
'**/*.d.ts',
|
|
'**/generated/**',
|
|
|
|
// Config files (tool-specific, not part of app code)
|
|
'**/drizzle.config.ts',
|
|
'playwright.config.ts',
|
|
'**/vitest.config.{ts,js,mjs}',
|
|
'tests/**',
|
|
|
|
// Documentation examples
|
|
'docs/test-examples/**',
|
|
|
|
// Repo-level utility scripts — .mjs + .sh today, plus typed
|
|
// Bun scripts (scripts/personas/*.ts) that aren't part of any
|
|
// app's TS project graph. ESLint's typed rules need a
|
|
// tsconfig; rather than maintain one just for scripts we
|
|
// skip them here. They're still type-checked at runtime by
|
|
// Bun + the `bun run scripts/…` invocation site.
|
|
'scripts/**',
|
|
|
|
// Games with specific runtime environments
|
|
'games/whopixels/**',
|
|
|
|
// Apps with their own ESLint configs (framework-specific)
|
|
// These import from @mana/eslint-config but add framework rules
|
|
'apps/*/apps/mobile/**',
|
|
'apps/*/apps/web/**',
|
|
'apps/*/apps/backend/**',
|
|
'apps/*/apps/audio-backend/**',
|
|
'apps/*/apps/landing/**',
|
|
'apps/*/packages/**', // Project-specific packages
|
|
'games/*/apps/**',
|
|
'games/*/packages/**', // Game-specific packages
|
|
'services/**',
|
|
],
|
|
},
|
|
|
|
// ============================================
|
|
// Base configuration for all files
|
|
// ============================================
|
|
...baseConfig,
|
|
...typescriptConfig,
|
|
...prettierConfig,
|
|
];
|