// MoreViews.jsx — Personalities, Quick Commands, Platforms, Credentials, // Plugins, Webhooks, Profiles, Gateway. Each is a focused list/detail or grid. // ─────────────── Personalities ─────────────── const PERSONALITIES = [ { id: 'forge', name: 'Forge', emoji: '⚒', color: '#C25A2A', desc: 'Engineering pair. Refactors, tests, reviews PRs.', model: 'sonnet-4.5', tools: 14, used: '2m ago' }, { id: 'hermes', name: 'Hermes', emoji: '✉', color: '#7E5BA9', desc: 'Operations. Handles ops scripts, summaries, status.', model: 'haiku-4.5', tools: 8, used: '32m ago' }, { id: 'atlas', name: 'Atlas', emoji: '◇', color: '#3F6BA9', desc: 'Long-form writer. Spec drafts, release notes, docs.', model: 'opus-4.1', tools: 6, used: 'yesterday' }, { id: 'vesta', name: 'Vesta', emoji: '✿', color: '#3F8A6E', desc: 'Design partner. Critiques layouts, suggests patterns.', model: 'sonnet-4.5', tools: 4, used: '3 days ago' }, { id: 'gaia', name: 'Gaia', emoji: '✱', color: '#A8741F', desc: 'Researcher. Web search, summarization, citations.', model: 'sonnet-4.5', tools: 5, used: '1 week ago' }, ]; function Personalities() { React.useEffect(() => { requestAnimationFrame(() => window.lucide && window.lucide.createIcons()); }); return (
New personality} />
{PERSONALITIES.map(p => )}
New personality
); } function PersonalityCard({ p }) { return (
{p.emoji}
{p.name}
last used {p.used}
{p.desc}
{p.model} {p.tools} tools
); } window.Personalities = Personalities; // ─────────────── Quick Commands ─────────────── const QC = [ { trigger: '/test', name: 'Run tests', desc: 'Run the project test suite, summarize failures.', personality: 'Forge', uses: 142 }, { trigger: '/review', name: 'Review PR', desc: 'Walk the diff in a checked-out PR and post review notes.', personality: 'Forge', uses: 38 }, { trigger: '/standup', name: 'Standup summary', desc: 'Summarize yesterday\'s commits + Linear updates.', personality: 'Hermes', uses: 24 }, { trigger: '/notes', name: 'Release notes', desc: 'Group merged PRs since last tag into release notes.', personality: 'Atlas', uses: 8 }, { trigger: '/figma', name: 'Open Figma frame', desc: 'Resolve a Figma URL and import frame metadata.', personality: 'Vesta', uses: 14 }, { trigger: '/cite', name: 'Cite source', desc: 'Web search + return citations as Markdown footnotes.', personality: 'Gaia', uses: 9 }, ]; function QuickCommands() { React.useEffect(() => { requestAnimationFrame(() => window.lucide && window.lucide.createIcons()); }); return (
New command} />
{QC.map((q, i) => (
{q.trigger}
{q.name}
{q.desc}
{q.personality} {q.uses} uses
))}
); } window.QuickCommands = QuickCommands; // ─────────────── Platforms ─────────────── const PLATFORMS = [ { id: 'github', name: 'GitHub', desc: 'Repos, issues, PRs', conn: true, scope: 'org/wizemann · 14 repos' }, { id: 'linear', name: 'Linear', desc: 'Issues & projects', conn: true, scope: 'wizemann · all teams' }, { id: 'slack', name: 'Slack', desc: 'Messaging', conn: false, scope: '—' }, { id: 'notion', name: 'Notion', desc: 'Docs', conn: false, scope: '—' }, { id: 'figma', name: 'Figma', desc: 'Design files', conn: true, scope: 'wizemann-design' }, { id: 'sentry', name: 'Sentry', desc: 'Error monitoring', conn: false, scope: '—' }, { id: 'pagerduty', name: 'PagerDuty', desc: 'On-call', conn: false, scope: '—' }, { id: 'stripe', name: 'Stripe', desc: 'Payments', conn: false, scope: '—' }, ]; function Platforms() { React.useEffect(() => { requestAnimationFrame(() => window.lucide && window.lucide.createIcons()); }); const palette = { github: '#1F1B16', linear: '#5E6AD2', slack: '#611F69', notion: '#191919', figma: '#F24E1E', sentry: '#362D59', pagerduty: '#06AC38', stripe: '#635BFF' }; return (
Browse marketplace} />
{PLATFORMS.map(p => (
{p.name[0]}
{p.name}
{p.desc}
{p.conn && on}
{p.scope}
{p.conn ? 'Configure' : 'Connect'}
))}
); } window.Platforms = Platforms; // ─────────────── Credentials ─────────────── const CREDS = [ { name: 'ANTHROPIC_API_KEY', kind: 'api-key', source: 'Keychain', last: '2m ago', scope: 'global', value: 'sk-ant-•••••••••a4f2' }, { name: 'GITHUB_TOKEN', kind: 'oauth', source: 'OAuth', last: '14m ago', scope: 'global', value: 'gho_•••••••••••3kP9' }, { name: 'LINEAR_TOKEN', kind: 'oauth', source: 'OAuth', last: '2h ago', scope: 'global', value: 'lin_oauth_•••••8m2x' }, { name: 'POSTGRES_URL', kind: 'secret', source: 'env (.env)', last: '4h ago', scope: 'project · sera', value: 'postgres://ro@•••' }, { name: 'OPENAI_API_KEY', kind: 'api-key', source: 'Keychain', last: 'never', scope: 'global', value: 'sk-•••••••••••L7Pw' }, { name: 'AWS_ACCESS_KEY_ID', kind: 'secret', source: '~/.aws/credentials', last: '1d ago', scope: 'global', value: 'AKIA•••••••••QZX' }, ]; function Credentials() { React.useEffect(() => { requestAnimationFrame(() => window.lucide && window.lucide.createIcons()); }); const [reveal, setReveal] = React.useState({}); return (
Add credential} />
Credentials are never sent to Anthropic. They're injected into tool calls at the local gateway.
{CREDS.map((c, i) => (
{c.name}
{c.source} · {c.scope} · used {c.last}
{reveal[c.name] ? c.value.replace(/•+/g, '************') : c.value} setReveal({ ...reveal, [c.name]: !reveal[c.name] })} />
))}
); } window.Credentials = Credentials; // ─────────────── Plugins ─────────────── const PLUGINS = [ { id: 'commit-message', name: 'Smart commits', desc: 'Generate conventional-commit messages from staged changes.', author: 'wizemann', enabled: true, hooks: ['pre-commit'] }, { id: 'review-helper', name: 'Review helper', desc: 'Auto-tag PR reviewers based on touched paths.', author: 'wizemann', enabled: true, hooks: ['pr-open'] }, { id: 'todo-extractor', name: 'TODO extractor', desc: 'Surface inline TODOs as a checklist on the dashboard.', author: 'community', enabled: false, hooks: ['session-start'] }, { id: 'speak', name: 'Speak responses', desc: 'Read agent responses aloud via system TTS.', author: 'community', enabled: false, hooks: ['turn-end'] }, ]; function Plugins() { React.useEffect(() => { requestAnimationFrame(() => window.lucide && window.lucide.createIcons()); }); return (
MarketplaceInstall} />
{PLUGINS.map((p, i) => (
{p.name} by {p.author}
{p.desc}
{p.hooks.map(h => {h})}
))}
); } window.Plugins = Plugins; // ─────────────── Webhooks ─────────────── const WEBHOOKS = [ { name: 'PR opened → review', url: 'https://hooks.scarf.local/pr-review', events: ['github.pr.opened'], status: 'active', last: '2h ago' }, { name: 'Sentry → triage', url: 'https://hooks.scarf.local/sentry-triage', events: ['sentry.issue.created', 'sentry.issue.regression'], status: 'active', last: '14m ago' }, { name: 'Linear cycle → recap', url: 'https://hooks.scarf.local/cycle-recap', events: ['linear.cycle.completed'], status: 'paused', last: '8d ago' }, ]; function Webhooks() { React.useEffect(() => { requestAnimationFrame(() => window.lucide && window.lucide.createIcons()); }); return (
New webhook} />
{WEBHOOKS.map((w, i) => (
{w.name}
{w.url}
{w.events.map(e => {e})}
{w.status === 'active' ? active : paused} {w.last}
))}
); } window.Webhooks = Webhooks; // ─────────────── Profiles ─────────────── const PROFILES = [ { id: 'dev', name: 'Development', desc: 'Permissive — auto-approve writes & execs in dev branches.', active: true, policies: 14 }, { id: 'review', name: 'Code review', desc: 'Read-only filesystem, no execute, network only via MCP.', active: false, policies: 8 }, { id: 'prod', name: 'Production', desc: 'All writes & execs require approval. No deletions.', active: false, policies: 22 }, { id: 'air-gap', name: 'Air-gapped', desc: 'No network. Local tools only. For sensitive code paths.', active: false, policies: 6 }, ]; function Profiles() { React.useEffect(() => { requestAnimationFrame(() => window.lucide && window.lucide.createIcons()); }); return (
New profile} />
{PROFILES.map(p => (
{p.name}
{p.active && active}
{p.desc}
{p.policies} policies {p.active ? 'Edit' : 'Activate'}
))}
); } window.Profiles = Profiles; // ─────────────── Gateway ─────────────── function Gateway() { React.useEffect(() => { requestAnimationFrame(() => window.lucide && window.lucide.createIcons()); }); return (
Restart} />
} /> } /> Edit} last /> } /> } /> } last /> } /> } last />
); } window.Gateway = Gateway;