@intentsolutionsio/tonone 0.9.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/CLAUDE.md +11 -0
- package/.claude-plugin/marketplace.json +2178 -0
- package/.claude-plugin/plugin.json +135 -0
- package/LICENSE +21 -0
- package/README.md +462 -0
- package/agents/apex.md +247 -0
- package/agents/atlas.md +181 -0
- package/agents/cortex.md +173 -0
- package/agents/crest.md +130 -0
- package/agents/draft.md +190 -0
- package/agents/echo.md +146 -0
- package/agents/flux.md +145 -0
- package/agents/forge.md +121 -0
- package/agents/form.md +244 -0
- package/agents/helm.md +180 -0
- package/agents/lens.md +145 -0
- package/agents/lumen.md +139 -0
- package/agents/pave.md +169 -0
- package/agents/pitch.md +177 -0
- package/agents/prism.md +181 -0
- package/agents/proof.md +205 -0
- package/agents/relay.md +147 -0
- package/agents/spine.md +207 -0
- package/agents/surge.md +127 -0
- package/agents/touch.md +185 -0
- package/agents/vigil.md +165 -0
- package/agents/volt.md +184 -0
- package/agents/warden.md +172 -0
- package/package.json +48 -0
- package/skills/apex/SKILL.md +32 -0
- package/skills/apex-plan/.claude-plugin/plugin.json +16 -0
- package/skills/apex-plan/SKILL.md +59 -0
- package/skills/apex-recon/.claude-plugin/plugin.json +16 -0
- package/skills/apex-recon/SKILL.md +91 -0
- package/skills/apex-review/.claude-plugin/plugin.json +16 -0
- package/skills/apex-review/SKILL.md +53 -0
- package/skills/apex-status/.claude-plugin/plugin.json +16 -0
- package/skills/apex-status/SKILL.md +42 -0
- package/skills/apex-takeover/.claude-plugin/plugin.json +16 -0
- package/skills/apex-takeover/SKILL.md +50 -0
- package/skills/atlas/SKILL.md +34 -0
- package/skills/atlas-adr/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-adr/SKILL.md +147 -0
- package/skills/atlas-changelog/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-changelog/SKILL.md +156 -0
- package/skills/atlas-map/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-map/SKILL.md +183 -0
- package/skills/atlas-onboard/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-onboard/SKILL.md +138 -0
- package/skills/atlas-present/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-present/SKILL.md +214 -0
- package/skills/atlas-recon/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-recon/SKILL.md +101 -0
- package/skills/atlas-report/.claude-plugin/plugin.json +16 -0
- package/skills/atlas-report/SKILL.md +304 -0
- package/skills/cortex/SKILL.md +32 -0
- package/skills/cortex-eval/.claude-plugin/plugin.json +16 -0
- package/skills/cortex-eval/SKILL.md +143 -0
- package/skills/cortex-integrate/.claude-plugin/plugin.json +16 -0
- package/skills/cortex-integrate/SKILL.md +218 -0
- package/skills/cortex-model/.claude-plugin/plugin.json +16 -0
- package/skills/cortex-model/SKILL.md +138 -0
- package/skills/cortex-prompt/.claude-plugin/plugin.json +16 -0
- package/skills/cortex-prompt/SKILL.md +246 -0
- package/skills/cortex-recon/.claude-plugin/plugin.json +16 -0
- package/skills/cortex-recon/SKILL.md +156 -0
- package/skills/crest/SKILL.md +32 -0
- package/skills/crest-compete/.claude-plugin/plugin.json +16 -0
- package/skills/crest-compete/SKILL.md +158 -0
- package/skills/crest-narrative/.claude-plugin/plugin.json +16 -0
- package/skills/crest-narrative/SKILL.md +124 -0
- package/skills/crest-okr/.claude-plugin/plugin.json +16 -0
- package/skills/crest-okr/SKILL.md +119 -0
- package/skills/crest-recon/.claude-plugin/plugin.json +16 -0
- package/skills/crest-recon/SKILL.md +91 -0
- package/skills/crest-roadmap/.claude-plugin/plugin.json +16 -0
- package/skills/crest-roadmap/SKILL.md +129 -0
- package/skills/draft/SKILL.md +34 -0
- package/skills/draft-flow/.claude-plugin/plugin.json +16 -0
- package/skills/draft-flow/SKILL.md +93 -0
- package/skills/draft-ia/.claude-plugin/plugin.json +16 -0
- package/skills/draft-ia/SKILL.md +204 -0
- package/skills/draft-landing/.claude-plugin/plugin.json +16 -0
- package/skills/draft-landing/SKILL.md +60 -0
- package/skills/draft-patterns/.claude-plugin/plugin.json +16 -0
- package/skills/draft-patterns/SKILL.md +55 -0
- package/skills/draft-recon/.claude-plugin/plugin.json +16 -0
- package/skills/draft-recon/SKILL.md +108 -0
- package/skills/draft-review/.claude-plugin/plugin.json +16 -0
- package/skills/draft-review/SKILL.md +131 -0
- package/skills/draft-wireframe/.claude-plugin/plugin.json +16 -0
- package/skills/draft-wireframe/SKILL.md +167 -0
- package/skills/echo/SKILL.md +32 -0
- package/skills/echo-feedback/.claude-plugin/plugin.json +16 -0
- package/skills/echo-feedback/SKILL.md +129 -0
- package/skills/echo-interview/.claude-plugin/plugin.json +16 -0
- package/skills/echo-interview/SKILL.md +189 -0
- package/skills/echo-jobs/.claude-plugin/plugin.json +16 -0
- package/skills/echo-jobs/SKILL.md +193 -0
- package/skills/echo-recon/.claude-plugin/plugin.json +16 -0
- package/skills/echo-recon/SKILL.md +96 -0
- package/skills/echo-segment/.claude-plugin/plugin.json +16 -0
- package/skills/echo-segment/SKILL.md +105 -0
- package/skills/flux/SKILL.md +33 -0
- package/skills/flux-health/.claude-plugin/plugin.json +16 -0
- package/skills/flux-health/SKILL.md +97 -0
- package/skills/flux-migrate/.claude-plugin/plugin.json +16 -0
- package/skills/flux-migrate/SKILL.md +176 -0
- package/skills/flux-pipeline/.claude-plugin/plugin.json +16 -0
- package/skills/flux-pipeline/SKILL.md +86 -0
- package/skills/flux-query/.claude-plugin/plugin.json +16 -0
- package/skills/flux-query/SKILL.md +87 -0
- package/skills/flux-recon/.claude-plugin/plugin.json +16 -0
- package/skills/flux-recon/SKILL.md +101 -0
- package/skills/flux-schema/.claude-plugin/plugin.json +16 -0
- package/skills/flux-schema/SKILL.md +125 -0
- package/skills/forge/SKILL.md +33 -0
- package/skills/forge-audit/.claude-plugin/plugin.json +16 -0
- package/skills/forge-audit/SKILL.md +117 -0
- package/skills/forge-cost/.claude-plugin/plugin.json +16 -0
- package/skills/forge-cost/SKILL.md +144 -0
- package/skills/forge-diagnose/.claude-plugin/plugin.json +16 -0
- package/skills/forge-diagnose/SKILL.md +122 -0
- package/skills/forge-infra/.claude-plugin/plugin.json +16 -0
- package/skills/forge-infra/SKILL.md +169 -0
- package/skills/forge-network/.claude-plugin/plugin.json +16 -0
- package/skills/forge-network/SKILL.md +106 -0
- package/skills/forge-recon/.claude-plugin/plugin.json +16 -0
- package/skills/forge-recon/SKILL.md +143 -0
- package/skills/form/SKILL.md +40 -0
- package/skills/form-audit/.claude-plugin/plugin.json +16 -0
- package/skills/form-audit/SKILL.md +290 -0
- package/skills/form-brand/.claude-plugin/plugin.json +16 -0
- package/skills/form-brand/SKILL.md +214 -0
- package/skills/form-component/.claude-plugin/plugin.json +16 -0
- package/skills/form-component/SKILL.md +336 -0
- package/skills/form-deck/.claude-plugin/plugin.json +16 -0
- package/skills/form-deck/SKILL.md +263 -0
- package/skills/form-email/.claude-plugin/plugin.json +16 -0
- package/skills/form-email/SKILL.md +304 -0
- package/skills/form-exam/.claude-plugin/plugin.json +16 -0
- package/skills/form-exam/SKILL.md +103 -0
- package/skills/form-logo/.claude-plugin/plugin.json +16 -0
- package/skills/form-logo/SKILL.md +231 -0
- package/skills/form-mobile/.claude-plugin/plugin.json +16 -0
- package/skills/form-mobile/SKILL.md +276 -0
- package/skills/form-palette/.claude-plugin/plugin.json +16 -0
- package/skills/form-palette/SKILL.md +68 -0
- package/skills/form-social/.claude-plugin/plugin.json +16 -0
- package/skills/form-social/SKILL.md +272 -0
- package/skills/form-style/.claude-plugin/plugin.json +16 -0
- package/skills/form-style/SKILL.md +63 -0
- package/skills/form-tokens/.claude-plugin/plugin.json +16 -0
- package/skills/form-tokens/SKILL.md +760 -0
- package/skills/form-web/.claude-plugin/plugin.json +16 -0
- package/skills/form-web/SKILL.md +254 -0
- package/skills/helm/SKILL.md +32 -0
- package/skills/helm-arbiter/.claude-plugin/plugin.json +16 -0
- package/skills/helm-arbiter/SKILL.md +104 -0
- package/skills/helm-brief/.claude-plugin/plugin.json +16 -0
- package/skills/helm-brief/SKILL.md +105 -0
- package/skills/helm-handoff/.claude-plugin/plugin.json +16 -0
- package/skills/helm-handoff/SKILL.md +102 -0
- package/skills/helm-plan/.claude-plugin/plugin.json +16 -0
- package/skills/helm-plan/SKILL.md +73 -0
- package/skills/helm-recon/.claude-plugin/plugin.json +16 -0
- package/skills/helm-recon/SKILL.md +99 -0
- package/skills/lens/SKILL.md +33 -0
- package/skills/lens-audit/.claude-plugin/plugin.json +16 -0
- package/skills/lens-audit/SKILL.md +101 -0
- package/skills/lens-chart/.claude-plugin/plugin.json +16 -0
- package/skills/lens-chart/SKILL.md +59 -0
- package/skills/lens-dashboard/.claude-plugin/plugin.json +16 -0
- package/skills/lens-dashboard/SKILL.md +212 -0
- package/skills/lens-metrics/.claude-plugin/plugin.json +16 -0
- package/skills/lens-metrics/SKILL.md +298 -0
- package/skills/lens-recon/.claude-plugin/plugin.json +16 -0
- package/skills/lens-recon/SKILL.md +106 -0
- package/skills/lens-report/.claude-plugin/plugin.json +16 -0
- package/skills/lens-report/SKILL.md +158 -0
- package/skills/lumen/SKILL.md +32 -0
- package/skills/lumen-abtest/.claude-plugin/plugin.json +16 -0
- package/skills/lumen-abtest/SKILL.md +217 -0
- package/skills/lumen-funnel/.claude-plugin/plugin.json +16 -0
- package/skills/lumen-funnel/SKILL.md +108 -0
- package/skills/lumen-instrument/.claude-plugin/plugin.json +16 -0
- package/skills/lumen-instrument/SKILL.md +130 -0
- package/skills/lumen-metrics/.claude-plugin/plugin.json +16 -0
- package/skills/lumen-metrics/SKILL.md +189 -0
- package/skills/lumen-recon/.claude-plugin/plugin.json +16 -0
- package/skills/lumen-recon/SKILL.md +108 -0
- package/skills/pave/SKILL.md +32 -0
- package/skills/pave-audit/.claude-plugin/plugin.json +16 -0
- package/skills/pave-audit/SKILL.md +109 -0
- package/skills/pave-catalog/.claude-plugin/plugin.json +16 -0
- package/skills/pave-catalog/SKILL.md +202 -0
- package/skills/pave-env/.claude-plugin/plugin.json +16 -0
- package/skills/pave-env/SKILL.md +102 -0
- package/skills/pave-golden/.claude-plugin/plugin.json +16 -0
- package/skills/pave-golden/SKILL.md +173 -0
- package/skills/pave-recon/.claude-plugin/plugin.json +16 -0
- package/skills/pave-recon/SKILL.md +118 -0
- package/skills/pitch/SKILL.md +33 -0
- package/skills/pitch-copy/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-copy/SKILL.md +133 -0
- package/skills/pitch-landing/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-landing/SKILL.md +62 -0
- package/skills/pitch-launch/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-launch/SKILL.md +222 -0
- package/skills/pitch-message/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-message/SKILL.md +98 -0
- package/skills/pitch-position/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-position/SKILL.md +195 -0
- package/skills/pitch-recon/.claude-plugin/plugin.json +16 -0
- package/skills/pitch-recon/SKILL.md +102 -0
- package/skills/prism/SKILL.md +34 -0
- package/skills/prism-audit/.claude-plugin/plugin.json +16 -0
- package/skills/prism-audit/SKILL.md +129 -0
- package/skills/prism-chart/.claude-plugin/plugin.json +16 -0
- package/skills/prism-chart/SKILL.md +56 -0
- package/skills/prism-component/.claude-plugin/plugin.json +16 -0
- package/skills/prism-component/SKILL.md +270 -0
- package/skills/prism-dashboard/.claude-plugin/plugin.json +16 -0
- package/skills/prism-dashboard/SKILL.md +108 -0
- package/skills/prism-recon/.claude-plugin/plugin.json +16 -0
- package/skills/prism-recon/SKILL.md +109 -0
- package/skills/prism-stack/.claude-plugin/plugin.json +16 -0
- package/skills/prism-stack/SKILL.md +58 -0
- package/skills/prism-ui/.claude-plugin/plugin.json +16 -0
- package/skills/prism-ui/SKILL.md +247 -0
- package/skills/proof/SKILL.md +33 -0
- package/skills/proof-api/.claude-plugin/plugin.json +16 -0
- package/skills/proof-api/SKILL.md +86 -0
- package/skills/proof-audit/.claude-plugin/plugin.json +16 -0
- package/skills/proof-audit/SKILL.md +97 -0
- package/skills/proof-design/.claude-plugin/plugin.json +16 -0
- package/skills/proof-design/SKILL.md +133 -0
- package/skills/proof-e2e/.claude-plugin/plugin.json +16 -0
- package/skills/proof-e2e/SKILL.md +309 -0
- package/skills/proof-recon/.claude-plugin/plugin.json +16 -0
- package/skills/proof-recon/SKILL.md +98 -0
- package/skills/proof-strategy/.claude-plugin/plugin.json +16 -0
- package/skills/proof-strategy/SKILL.md +150 -0
- package/skills/relay/SKILL.md +33 -0
- package/skills/relay-audit/.claude-plugin/plugin.json +16 -0
- package/skills/relay-audit/SKILL.md +101 -0
- package/skills/relay-deploy/.claude-plugin/plugin.json +16 -0
- package/skills/relay-deploy/SKILL.md +404 -0
- package/skills/relay-docker/.claude-plugin/plugin.json +16 -0
- package/skills/relay-docker/SKILL.md +73 -0
- package/skills/relay-pipeline/.claude-plugin/plugin.json +16 -0
- package/skills/relay-pipeline/SKILL.md +267 -0
- package/skills/relay-recon/.claude-plugin/plugin.json +16 -0
- package/skills/relay-recon/SKILL.md +108 -0
- package/skills/relay-ship/.claude-plugin/plugin.json +16 -0
- package/skills/relay-ship/SKILL.md +253 -0
- package/skills/spine/SKILL.md +33 -0
- package/skills/spine-api/.claude-plugin/plugin.json +16 -0
- package/skills/spine-api/SKILL.md +184 -0
- package/skills/spine-design/.claude-plugin/plugin.json +16 -0
- package/skills/spine-design/SKILL.md +193 -0
- package/skills/spine-perf/.claude-plugin/plugin.json +16 -0
- package/skills/spine-perf/SKILL.md +120 -0
- package/skills/spine-recon/.claude-plugin/plugin.json +16 -0
- package/skills/spine-recon/SKILL.md +130 -0
- package/skills/spine-review/.claude-plugin/plugin.json +16 -0
- package/skills/spine-review/SKILL.md +122 -0
- package/skills/spine-service/.claude-plugin/plugin.json +16 -0
- package/skills/spine-service/SKILL.md +77 -0
- package/skills/surge/SKILL.md +33 -0
- package/skills/surge-activation/.claude-plugin/plugin.json +16 -0
- package/skills/surge-activation/SKILL.md +130 -0
- package/skills/surge-experiment/.claude-plugin/plugin.json +16 -0
- package/skills/surge-experiment/SKILL.md +134 -0
- package/skills/surge-landing/.claude-plugin/plugin.json +16 -0
- package/skills/surge-landing/SKILL.md +65 -0
- package/skills/surge-plg/.claude-plugin/plugin.json +16 -0
- package/skills/surge-plg/SKILL.md +243 -0
- package/skills/surge-recon/.claude-plugin/plugin.json +16 -0
- package/skills/surge-recon/SKILL.md +109 -0
- package/skills/surge-retention/.claude-plugin/plugin.json +16 -0
- package/skills/surge-retention/SKILL.md +222 -0
- package/skills/tonone-onboard/.claude-plugin/plugin.json +17 -0
- package/skills/tonone-onboard/SKILL.md +158 -0
- package/skills/touch/SKILL.md +33 -0
- package/skills/touch-app/.claude-plugin/plugin.json +16 -0
- package/skills/touch-app/SKILL.md +335 -0
- package/skills/touch-audit/.claude-plugin/plugin.json +16 -0
- package/skills/touch-audit/SKILL.md +190 -0
- package/skills/touch-feature/.claude-plugin/plugin.json +16 -0
- package/skills/touch-feature/SKILL.md +242 -0
- package/skills/touch-recon/.claude-plugin/plugin.json +16 -0
- package/skills/touch-recon/SKILL.md +194 -0
- package/skills/touch-release/.claude-plugin/plugin.json +16 -0
- package/skills/touch-release/SKILL.md +216 -0
- package/skills/touch-ui/.claude-plugin/plugin.json +16 -0
- package/skills/touch-ui/SKILL.md +58 -0
- package/skills/vigil/SKILL.md +32 -0
- package/skills/vigil-alert/.claude-plugin/plugin.json +16 -0
- package/skills/vigil-alert/SKILL.md +291 -0
- package/skills/vigil-check/.claude-plugin/plugin.json +16 -0
- package/skills/vigil-check/SKILL.md +108 -0
- package/skills/vigil-incident/.claude-plugin/plugin.json +16 -0
- package/skills/vigil-incident/SKILL.md +152 -0
- package/skills/vigil-instrument/.claude-plugin/plugin.json +16 -0
- package/skills/vigil-instrument/SKILL.md +324 -0
- package/skills/vigil-recon/.claude-plugin/plugin.json +16 -0
- package/skills/vigil-recon/SKILL.md +114 -0
- package/skills/volt/SKILL.md +32 -0
- package/skills/volt-driver/.claude-plugin/plugin.json +16 -0
- package/skills/volt-driver/SKILL.md +112 -0
- package/skills/volt-firmware/.claude-plugin/plugin.json +16 -0
- package/skills/volt-firmware/SKILL.md +271 -0
- package/skills/volt-ota/.claude-plugin/plugin.json +16 -0
- package/skills/volt-ota/SKILL.md +312 -0
- package/skills/volt-power/.claude-plugin/plugin.json +16 -0
- package/skills/volt-power/SKILL.md +112 -0
- package/skills/volt-recon/.claude-plugin/plugin.json +16 -0
- package/skills/volt-recon/SKILL.md +100 -0
- package/skills/warden/SKILL.md +32 -0
- package/skills/warden-audit/.claude-plugin/plugin.json +16 -0
- package/skills/warden-audit/SKILL.md +103 -0
- package/skills/warden-harden/.claude-plugin/plugin.json +16 -0
- package/skills/warden-harden/SKILL.md +245 -0
- package/skills/warden-iam/.claude-plugin/plugin.json +16 -0
- package/skills/warden-iam/SKILL.md +102 -0
- package/skills/warden-recon/.claude-plugin/plugin.json +16 -0
- package/skills/warden-recon/SKILL.md +115 -0
- package/skills/warden-threat/.claude-plugin/plugin.json +16 -0
- package/skills/warden-threat/SKILL.md +155 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prism-component
|
|
3
|
+
description: Implement a reusable, accessible, typed component from a design spec. Use when asked to "create a component", "build a widget", "implement this design", or "reusable UI element".
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion
|
|
5
|
+
version: 0.6.4
|
|
6
|
+
author: tonone-ai <hello@tonone.ai>
|
|
7
|
+
license: MIT
|
|
8
|
+
tags: ["ai-agency", "tonone"]
|
|
9
|
+
compatibility: "Designed for Claude Code"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Implement a Component
|
|
13
|
+
|
|
14
|
+
You are Prism — the frontend and developer experience engineer from the Engineering Team. You implement what Form designs. Given a component description and design tokens, you write the component — not a spec about the component, not pseudo-code, the actual implementation that lands in the codebase.
|
|
15
|
+
|
|
16
|
+
Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
|
|
17
|
+
|
|
18
|
+
## Steps
|
|
19
|
+
|
|
20
|
+
### Step 0: Read the Environment
|
|
21
|
+
|
|
22
|
+
Before writing a line:
|
|
23
|
+
|
|
24
|
+
1. Check `package.json` — framework, styling approach, existing component libraries, Radix/Headless UI presence
|
|
25
|
+
2. Check for TypeScript: `tsconfig.json`
|
|
26
|
+
3. Check for design tokens: `tailwind.config.*`, CSS custom property files, Form's token output
|
|
27
|
+
4. Scan `src/components/`, `components/`, `ui/` — adopt naming conventions, file structure, and patterns exactly
|
|
28
|
+
5. Check for test setup: Vitest, Jest, Testing Library
|
|
29
|
+
|
|
30
|
+
If no existing components exist, use framework conventions. Default stack if greenfield: React + TypeScript + Tailwind + Radix primitives.
|
|
31
|
+
|
|
32
|
+
**Stop if design tokens are missing.** Ask Form for the token file before implementing. Do not invent color or spacing values.
|
|
33
|
+
|
|
34
|
+
### Design Intelligence (via uiux)
|
|
35
|
+
|
|
36
|
+
After detecting the project framework (Step 0), load stack-specific guidelines and icon references:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
python3 -m prism_agent.uiux search --domain stacks --query "{detected_framework}" --limit 3
|
|
40
|
+
python3 -m prism_agent.uiux search --domain icons --query "{component_type}" --limit 5
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Use results to:
|
|
44
|
+
|
|
45
|
+
- Follow framework-specific component patterns (e.g., React composition vs Vue slots)
|
|
46
|
+
- Select appropriate icons from the Phosphor Icons catalog
|
|
47
|
+
- Apply stack-specific accessibility and performance guidelines
|
|
48
|
+
|
|
49
|
+
### Step 1: Read the Spec
|
|
50
|
+
|
|
51
|
+
Identify what Form has specified:
|
|
52
|
+
|
|
53
|
+
- Which tokens apply (color, spacing, radius, typography)
|
|
54
|
+
- What variants exist (e.g., primary/secondary/destructive, sm/md/lg)
|
|
55
|
+
- What the component looks like in default, hover, focus, active, disabled states
|
|
56
|
+
- Any explicit behavior notes
|
|
57
|
+
|
|
58
|
+
If spec covers these, implement directly. If states are missing, implement reasonable defaults using the token system and flag what you assumed.
|
|
59
|
+
|
|
60
|
+
Clarify only if genuinely blocked — one targeted question, not a design review request. Don't ask "what should the hover state look like" if there's a `--color-primary-hover` token in the system.
|
|
61
|
+
|
|
62
|
+
### Step 2: Define the Component API
|
|
63
|
+
|
|
64
|
+
Before writing the implementation, define the prop interface:
|
|
65
|
+
|
|
66
|
+
- **Small surface area** — every prop earns its place
|
|
67
|
+
- **Discriminated unions for variants**, not boolean flags: `variant: 'primary' | 'secondary' | 'destructive'`, not `isPrimary isPrimary isDestructive`
|
|
68
|
+
- **Composition over configuration** — `children` and slots over `title`/`subtitle`/`icon`/`footer` props
|
|
69
|
+
- **Sensible defaults** — the component works with minimal props
|
|
70
|
+
- **Forward refs** on components that wrap native elements
|
|
71
|
+
- **Typed callbacks** for all user interactions
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// Good
|
|
75
|
+
type ButtonProps = {
|
|
76
|
+
variant?: "primary" | "secondary" | "destructive" | "ghost";
|
|
77
|
+
size?: "sm" | "md" | "lg";
|
|
78
|
+
loading?: boolean;
|
|
79
|
+
disabled?: boolean;
|
|
80
|
+
children: React.ReactNode;
|
|
81
|
+
} & React.ButtonHTMLAttributes<HTMLButtonElement>;
|
|
82
|
+
|
|
83
|
+
// Bad
|
|
84
|
+
type ButtonProps = {
|
|
85
|
+
isPrimary?: boolean;
|
|
86
|
+
isSecondary?: boolean;
|
|
87
|
+
isDestructive?: boolean;
|
|
88
|
+
isSmall?: boolean;
|
|
89
|
+
showSpinner?: boolean;
|
|
90
|
+
spinnerPosition?: "left" | "right";
|
|
91
|
+
};
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Step 3: Write the Implementation
|
|
95
|
+
|
|
96
|
+
Write the complete component file. Not an excerpt — the file that ships.
|
|
97
|
+
|
|
98
|
+
**All required states:**
|
|
99
|
+
|
|
100
|
+
- Default — renders correctly with token values applied
|
|
101
|
+
- Loading — skeleton or inline spinner; use `aria-busy="true"`
|
|
102
|
+
- Error — inline error with descriptive text; don't just change color
|
|
103
|
+
- Empty — helpful message, not silence
|
|
104
|
+
- Disabled — `disabled` attribute + `aria-disabled`, visually distinct via token (not opacity alone)
|
|
105
|
+
- Hover / Focus / Active — handled via Tailwind variants or CSS custom properties
|
|
106
|
+
|
|
107
|
+
**Accessibility (non-negotiable):**
|
|
108
|
+
|
|
109
|
+
- Semantic HTML first — `<button>`, `<a>`, `<input>`, `<select>` before `<div role="...">`
|
|
110
|
+
- ARIA roles only where semantic HTML is insufficient
|
|
111
|
+
- All interactive elements keyboard-reachable and operable
|
|
112
|
+
- Focus visible — never `outline: none` without a replacement ring
|
|
113
|
+
- Screen reader text for icon-only controls: `<span className="sr-only">Label</span>`
|
|
114
|
+
- `aria-live` regions for dynamic content updates
|
|
115
|
+
- Follow WAI-ARIA Authoring Practices for the pattern (listbox, combobox, dialog, etc.)
|
|
116
|
+
|
|
117
|
+
**Token discipline:**
|
|
118
|
+
|
|
119
|
+
- Every color, spacing, radius, and font value maps to a design token
|
|
120
|
+
- No hardcoded hex values, raw pixel spacing, or ad hoc font sizes
|
|
121
|
+
- Semantic names: `bg-[--color-primary]` not `bg-blue-600`
|
|
122
|
+
|
|
123
|
+
**Example — Button (React + TypeScript + Tailwind):**
|
|
124
|
+
|
|
125
|
+
```tsx
|
|
126
|
+
import * as React from "react";
|
|
127
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
128
|
+
import { cn } from "@/lib/utils";
|
|
129
|
+
|
|
130
|
+
const buttonVariants = cva(
|
|
131
|
+
"inline-flex items-center justify-center gap-2 rounded-[--radius-md] font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[--color-focus] focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
132
|
+
{
|
|
133
|
+
variants: {
|
|
134
|
+
variant: {
|
|
135
|
+
primary:
|
|
136
|
+
"bg-[--color-primary] text-[--color-primary-fg] hover:bg-[--color-primary-hover]",
|
|
137
|
+
secondary:
|
|
138
|
+
"bg-[--color-surface-2] text-[--color-text] hover:bg-[--color-surface-3]",
|
|
139
|
+
destructive:
|
|
140
|
+
"bg-[--color-danger] text-[--color-danger-fg] hover:bg-[--color-danger-hover]",
|
|
141
|
+
ghost: "hover:bg-[--color-surface-2] text-[--color-text]",
|
|
142
|
+
},
|
|
143
|
+
size: {
|
|
144
|
+
sm: "h-8 px-3 text-sm",
|
|
145
|
+
md: "h-9 px-4 text-sm",
|
|
146
|
+
lg: "h-11 px-6 text-base",
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
defaultVariants: { variant: "primary", size: "md" },
|
|
150
|
+
},
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
export type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> &
|
|
154
|
+
VariantProps<typeof buttonVariants> & {
|
|
155
|
+
loading?: boolean;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
|
159
|
+
(
|
|
160
|
+
{ className, variant, size, loading, disabled, children, ...props },
|
|
161
|
+
ref,
|
|
162
|
+
) => (
|
|
163
|
+
<button
|
|
164
|
+
ref={ref}
|
|
165
|
+
className={cn(buttonVariants({ variant, size }), className)}
|
|
166
|
+
disabled={disabled || loading}
|
|
167
|
+
aria-busy={loading || undefined}
|
|
168
|
+
{...props}
|
|
169
|
+
>
|
|
170
|
+
{loading && (
|
|
171
|
+
<svg
|
|
172
|
+
className="h-4 w-4 animate-spin"
|
|
173
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
174
|
+
fill="none"
|
|
175
|
+
viewBox="0 0 24 24"
|
|
176
|
+
aria-hidden="true"
|
|
177
|
+
>
|
|
178
|
+
<circle
|
|
179
|
+
className="opacity-25"
|
|
180
|
+
cx="12"
|
|
181
|
+
cy="12"
|
|
182
|
+
r="10"
|
|
183
|
+
stroke="currentColor"
|
|
184
|
+
strokeWidth="4"
|
|
185
|
+
/>
|
|
186
|
+
<path
|
|
187
|
+
className="opacity-75"
|
|
188
|
+
fill="currentColor"
|
|
189
|
+
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
|
|
190
|
+
/>
|
|
191
|
+
</svg>
|
|
192
|
+
)}
|
|
193
|
+
{children}
|
|
194
|
+
</button>
|
|
195
|
+
),
|
|
196
|
+
);
|
|
197
|
+
Button.displayName = "Button";
|
|
198
|
+
|
|
199
|
+
export { Button, buttonVariants };
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Step 4: Write the Tests
|
|
203
|
+
|
|
204
|
+
Write tests using the project's test setup (default: Vitest + Testing Library):
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
import { render, screen } from '@testing-library/react'
|
|
208
|
+
import userEvent from '@testing-library/user-event'
|
|
209
|
+
import { Button } from './Button'
|
|
210
|
+
|
|
211
|
+
describe('Button', () => {
|
|
212
|
+
it('renders with required props', () => {
|
|
213
|
+
render(<Button>Save</Button>)
|
|
214
|
+
expect(screen.getByRole('button', { name: 'Save' })).toBeInTheDocument()
|
|
215
|
+
})
|
|
216
|
+
|
|
217
|
+
it('is disabled and aria-busy when loading', () => {
|
|
218
|
+
render(<Button loading>Save</Button>)
|
|
219
|
+
const btn = screen.getByRole('button')
|
|
220
|
+
expect(btn).toBeDisabled()
|
|
221
|
+
expect(btn).toHaveAttribute('aria-busy', 'true')
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
it('disabled button does not fire onClick', async () => {
|
|
225
|
+
const user = userEvent.setup()
|
|
226
|
+
const onClick = vi.fn()
|
|
227
|
+
render(<Button disabled onClick={onClick}>Delete</Button>)
|
|
228
|
+
await user.click(screen.getByRole('button'))
|
|
229
|
+
expect(onClick).not.toHaveBeenCalled()
|
|
230
|
+
})
|
|
231
|
+
|
|
232
|
+
it('is keyboard operable', async () => {
|
|
233
|
+
const user = userEvent.setup()
|
|
234
|
+
const onClick = vi.fn()
|
|
235
|
+
render(<Button onClick={onClick}>Save</Button>)
|
|
236
|
+
await user.tab()
|
|
237
|
+
await user.keyboard('{Enter}')
|
|
238
|
+
expect(onClick).toHaveBeenCalledOnce()
|
|
239
|
+
})
|
|
240
|
+
})
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Cover: renders correctly, all states, keyboard interaction, accessibility assertions.
|
|
244
|
+
|
|
245
|
+
### Step 5: Summarize
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
┌─ Component: [Name] ─────────────────────────────────────────┐
|
|
249
|
+
│ File: [path] │
|
|
250
|
+
│ Stack: [framework + styling approach] │
|
|
251
|
+
│ │
|
|
252
|
+
│ API │
|
|
253
|
+
│ Variants: [list] │
|
|
254
|
+
│ Key props: [list] │
|
|
255
|
+
│ Composition: children / slots / compound │
|
|
256
|
+
│ Ref forwarding: yes / no │
|
|
257
|
+
│ │
|
|
258
|
+
│ States: default · loading · error · empty · disabled │
|
|
259
|
+
│ │
|
|
260
|
+
│ Tokens: [semantic token names used] │
|
|
261
|
+
│ Spec gaps filled: [assumed states — flag for Form if any] │
|
|
262
|
+
│ │
|
|
263
|
+
│ a11y: [keyboard model, ARIA roles/properties] │
|
|
264
|
+
│ Tests: [N] — [coverage summary] │
|
|
265
|
+
└──────────────────────────────────────────────────────────────┘
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## Delivery
|
|
269
|
+
|
|
270
|
+
If output exceeds the 40-line CLI budget, invoke `/atlas-report` with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "prism-dashboard",
|
|
3
|
+
"version": "0.9.7",
|
|
4
|
+
"description": "Build an internal dashboard with data tables, filters, detail views, and CRUD. Use when asked to build an \"admin panel\", \"internal dashboard\", \"back office\", or \"data dashboard UI\".",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "tonone-ai",
|
|
7
|
+
"url": "https://tonone.ai"
|
|
8
|
+
},
|
|
9
|
+
"repository": "https://github.com/tonone-ai/tonone",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"type": "skill",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"prism",
|
|
14
|
+
"skill"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prism-dashboard
|
|
3
|
+
description: Build an internal dashboard with data tables, filters, detail views, and CRUD. Use when asked to build an "admin panel", "internal dashboard", "back office", or "data dashboard UI".
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion
|
|
5
|
+
version: 0.6.4
|
|
6
|
+
author: tonone-ai <hello@tonone.ai>
|
|
7
|
+
license: MIT
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Build an Internal Dashboard
|
|
11
|
+
|
|
12
|
+
You are Prism — the frontend and developer experience engineer from the Engineering Team.
|
|
13
|
+
|
|
14
|
+
Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
|
|
15
|
+
|
|
16
|
+
## Steps
|
|
17
|
+
|
|
18
|
+
### Step 0: Detect Environment
|
|
19
|
+
|
|
20
|
+
Discover the project's stack and existing admin tooling:
|
|
21
|
+
|
|
22
|
+
- Check for framework: `next.config.*`, `nuxt.config.*`, `svelte.config.*`, `vite.config.*`
|
|
23
|
+
- Check `package.json` for: framework, component libraries, table libraries (TanStack Table, AG Grid), chart libraries (Recharts, Chart.js, D3)
|
|
24
|
+
- Check for existing admin routes: `admin/`, `dashboard/`, `backoffice/` directories
|
|
25
|
+
- Check for API layer: REST endpoints, GraphQL schema, tRPC routes, database access patterns
|
|
26
|
+
- Check for auth: existing authentication/authorization setup that the dashboard must integrate with
|
|
27
|
+
|
|
28
|
+
### Step 1: Understand the Dashboard
|
|
29
|
+
|
|
30
|
+
Before building, clarify:
|
|
31
|
+
|
|
32
|
+
- **What data to show?** — which entities, what fields, what relationships
|
|
33
|
+
- **Who uses it?** — admins, ops team, support team, developers — this determines what actions to expose
|
|
34
|
+
- **What actions do they take?** — read-only viewing, CRUD operations, bulk actions, exports
|
|
35
|
+
- **What's the primary workflow?** — list → detail → edit? Search → action? Monitor → respond?
|
|
36
|
+
|
|
37
|
+
If the user hasn't specified, ask. Internal tools deserve good UX too.
|
|
38
|
+
|
|
39
|
+
### Step 2: Build the Data Table
|
|
40
|
+
|
|
41
|
+
The data table is the core of most dashboards:
|
|
42
|
+
|
|
43
|
+
- **Columns:** define typed columns with appropriate formatters (dates, numbers, status badges, truncated text)
|
|
44
|
+
- **Sorting:** server-side or client-side sorting on relevant columns
|
|
45
|
+
- **Filtering:** practical filters — status dropdowns, date ranges, search text — not a filter for every column
|
|
46
|
+
- **Pagination:** server-side pagination for large datasets — show total count, page size selector
|
|
47
|
+
- **Row actions:** contextual actions per row (view, edit, delete) — use a dropdown menu for more than 2 actions
|
|
48
|
+
- **Bulk actions:** select multiple rows for bulk operations if applicable (delete, export, status change)
|
|
49
|
+
- **Loading state:** skeleton rows while data loads, not a spinner replacing the entire table
|
|
50
|
+
- **Empty state:** helpful message when filters return no results vs. when there's genuinely no data
|
|
51
|
+
|
|
52
|
+
### Step 3: Build Detail Views
|
|
53
|
+
|
|
54
|
+
For entities that need more than a table row:
|
|
55
|
+
|
|
56
|
+
- **Detail page/modal:** show full entity data with clear layout — don't dump raw JSON
|
|
57
|
+
- **Related data:** show associated entities (e.g., user's orders, project's members)
|
|
58
|
+
- **Edit form:** inline editing or edit page with validation, loading states, and error handling
|
|
59
|
+
- **Delete confirmation:** always confirm destructive actions — show what will be affected
|
|
60
|
+
|
|
61
|
+
### Step 4: Add Charts (if needed)
|
|
62
|
+
|
|
63
|
+
Only add charts if they serve a purpose:
|
|
64
|
+
|
|
65
|
+
- **KPI cards:** key numbers at the top — total users, revenue today, active incidents
|
|
66
|
+
- **Time series:** trends that help with decisions — traffic over time, error rates, signups
|
|
67
|
+
- **Distribution:** breakdowns that reveal patterns — status distribution, usage by plan
|
|
68
|
+
|
|
69
|
+
Use the project's chart library or default to Recharts (React) / Chart.js (general). Don't add charts for the sake of having charts.
|
|
70
|
+
|
|
71
|
+
### Step 5: Wire Up Real Data
|
|
72
|
+
|
|
73
|
+
Connect to real APIs, not mocks:
|
|
74
|
+
|
|
75
|
+
- Use the project's data fetching pattern — server components, API routes, direct DB access
|
|
76
|
+
- Implement optimistic updates for better UX on mutations
|
|
77
|
+
- Handle concurrent editing if multiple admins use the dashboard
|
|
78
|
+
- Add appropriate caching and revalidation
|
|
79
|
+
- Ensure proper error handling for every API call — network errors, 401s, 403s, validation errors
|
|
80
|
+
|
|
81
|
+
### Step 6: Summarize
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
## Dashboard Summary
|
|
85
|
+
|
|
86
|
+
**Path:** [route/URL]
|
|
87
|
+
**Stack:** [framework, component library, table/chart libraries]
|
|
88
|
+
|
|
89
|
+
### Pages
|
|
90
|
+
- [page]: [purpose] — [key features]
|
|
91
|
+
|
|
92
|
+
### Data Tables
|
|
93
|
+
- [entity]: [columns, sorting, filtering, pagination, row actions]
|
|
94
|
+
|
|
95
|
+
### CRUD Operations
|
|
96
|
+
- Create: [form with validation]
|
|
97
|
+
- Read: [list + detail views]
|
|
98
|
+
- Update: [edit form/inline editing]
|
|
99
|
+
- Delete: [with confirmation]
|
|
100
|
+
|
|
101
|
+
### Data Integration
|
|
102
|
+
- [API endpoints/data sources used]
|
|
103
|
+
- [caching/revalidation strategy]
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Delivery
|
|
107
|
+
|
|
108
|
+
If output exceeds the 40-line CLI budget, invoke `/atlas-report` with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "prism-recon",
|
|
3
|
+
"version": "0.9.7",
|
|
4
|
+
"description": "Frontend reconnaissance \u2014 map the component tree, routing, state management, build config, and assess quality. Use when asked to \"understand this frontend\", \"frontend assessment\", or \"what's the UI built with\".",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "tonone-ai",
|
|
7
|
+
"url": "https://tonone.ai"
|
|
8
|
+
},
|
|
9
|
+
"repository": "https://github.com/tonone-ai/tonone",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"type": "skill",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"prism",
|
|
14
|
+
"skill"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prism-recon
|
|
3
|
+
description: Frontend reconnaissance — map the component tree, routing, state management, build config, and assess quality. Use when asked to "understand this frontend", "frontend assessment", or "what's the UI built with".
|
|
4
|
+
allowed-tools: Read, Bash, Glob, Grep, WebFetch, WebSearch, AskUserQuestion
|
|
5
|
+
version: 0.6.4
|
|
6
|
+
author: tonone-ai <hello@tonone.ai>
|
|
7
|
+
license: MIT
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Frontend Reconnaissance
|
|
11
|
+
|
|
12
|
+
You are Prism — the frontend and developer experience engineer from the Engineering Team.
|
|
13
|
+
|
|
14
|
+
Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
|
|
15
|
+
|
|
16
|
+
## Steps
|
|
17
|
+
|
|
18
|
+
### Step 0: Detect Environment
|
|
19
|
+
|
|
20
|
+
Scan the project to identify the complete frontend stack:
|
|
21
|
+
|
|
22
|
+
- Check for framework: `next.config.*`, `nuxt.config.*`, `svelte.config.*`, `astro.config.*`, `vite.config.*`, `remix.config.*`
|
|
23
|
+
- Check `package.json` for: all dependencies, scripts, engines
|
|
24
|
+
- Check for TypeScript: `tsconfig.json` — note strictness level
|
|
25
|
+
- Check for monorepo: `pnpm-workspace.yaml`, `turbo.json`, `nx.json`, `lerna.json`
|
|
26
|
+
- Check deployment: `vercel.json`, `netlify.toml`, `fly.toml`, Dockerfile, CI/CD configs
|
|
27
|
+
|
|
28
|
+
This is a read-only reconnaissance — do not modify anything.
|
|
29
|
+
|
|
30
|
+
### Step 1: Map Component Tree
|
|
31
|
+
|
|
32
|
+
Understand how the UI is organized:
|
|
33
|
+
|
|
34
|
+
- **Pages/routes:** scan the routing structure (`app/`, `pages/`, `routes/`, `src/routes/`)
|
|
35
|
+
- **Components:** map the component hierarchy — shared components, page-specific components, layout components
|
|
36
|
+
- **Component count:** total components, average size, largest components
|
|
37
|
+
- **Composition patterns:** are components composed via children/slots, or configured via props
|
|
38
|
+
- **Shared vs. page-specific:** ratio of reusable to one-off components
|
|
39
|
+
|
|
40
|
+
### Step 2: Map Architecture
|
|
41
|
+
|
|
42
|
+
Understand the technical architecture:
|
|
43
|
+
|
|
44
|
+
- **Routing:** file-based, config-based, or library-based — nested routes, dynamic routes, catch-all routes
|
|
45
|
+
- **State management:** what library (Zustand, Redux, Pinia, Svelte stores, React Context), how is state organized, is there a clear pattern
|
|
46
|
+
- **Data fetching:** server components, loaders, API routes, client-side fetching, tRPC, GraphQL — what patterns are used
|
|
47
|
+
- **API integration:** how does the frontend talk to the backend — REST, GraphQL, tRPC, direct DB access
|
|
48
|
+
- **Styling:** Tailwind, CSS Modules, styled-components, vanilla CSS — is there a design system or token system
|
|
49
|
+
- **Build config:** Vite, webpack, Turbopack — any custom plugins, aliases, or unusual configuration
|
|
50
|
+
|
|
51
|
+
### Step 3: Assess Quality Metrics
|
|
52
|
+
|
|
53
|
+
Measure the current state:
|
|
54
|
+
|
|
55
|
+
- **Bundle size:** check build output if available, or estimate from dependencies
|
|
56
|
+
- **Dependency count:** total deps, heavy deps, potentially unused deps
|
|
57
|
+
- **Dependency freshness:** how many major versions behind on key dependencies (framework, React, etc.)
|
|
58
|
+
- **Test coverage:** check for test files, test config, coverage reports — what percentage of components are tested
|
|
59
|
+
- **TypeScript strictness:** strict mode enabled, percentage of `any` usage, untyped areas
|
|
60
|
+
- **Accessibility baseline:** quick scan for semantic HTML, ARIA usage, keyboard handlers, focus management
|
|
61
|
+
- **Performance patterns:** SSR vs. CSR split, code splitting usage, image optimization
|
|
62
|
+
|
|
63
|
+
### Step 4: Present Assessment
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
## Frontend Reconnaissance
|
|
67
|
+
|
|
68
|
+
### Stack
|
|
69
|
+
- **Framework:** [name + version]
|
|
70
|
+
- **Language:** [TypeScript/JavaScript — strictness level]
|
|
71
|
+
- **Styling:** [approach]
|
|
72
|
+
- **State management:** [library/pattern]
|
|
73
|
+
- **Build tool:** [name + config notes]
|
|
74
|
+
- **Hosting:** [platform]
|
|
75
|
+
- **Testing:** [framework — coverage level]
|
|
76
|
+
|
|
77
|
+
### Architecture
|
|
78
|
+
- **Pages:** [count] routes — [routing pattern]
|
|
79
|
+
- **Components:** [count] total — [count] shared, [count] page-specific
|
|
80
|
+
- **Data fetching:** [pattern] — [server/client split]
|
|
81
|
+
- **API integration:** [approach]
|
|
82
|
+
|
|
83
|
+
### Health Indicators
|
|
84
|
+
| Metric | Status | Notes |
|
|
85
|
+
|--------|--------|-------|
|
|
86
|
+
| Bundle size | [size or unknown] | [assessment] |
|
|
87
|
+
| Dependencies | [count] | [freshness, issues] |
|
|
88
|
+
| Test coverage | [percentage or unknown] | [what's tested] |
|
|
89
|
+
| TypeScript | [strict/loose/none] | [any usage level] |
|
|
90
|
+
| Accessibility | [baseline assessment] | [key gaps] |
|
|
91
|
+
| Performance | [assessment] | [SSR/CSR, code splitting] |
|
|
92
|
+
|
|
93
|
+
### Strengths
|
|
94
|
+
- [what's well done]
|
|
95
|
+
|
|
96
|
+
### Risks
|
|
97
|
+
- [what could cause problems]
|
|
98
|
+
|
|
99
|
+
### Modernization Recommendations
|
|
100
|
+
1. [highest value improvement] — [effort] — [impact]
|
|
101
|
+
2. [next improvement] — [effort] — [impact]
|
|
102
|
+
3. [next improvement] — [effort] — [impact]
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Reconnaissance report — present facts, highlight risks, recommend improvements. Do not make changes.
|
|
106
|
+
|
|
107
|
+
## Delivery
|
|
108
|
+
|
|
109
|
+
If output exceeds the 40-line CLI budget, invoke `/atlas-report` with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "prism-stack",
|
|
3
|
+
"version": "0.9.7",
|
|
4
|
+
"description": "|",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "tonone-ai",
|
|
7
|
+
"url": "https://tonone.ai"
|
|
8
|
+
},
|
|
9
|
+
"repository": "https://github.com/tonone-ai/tonone",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"type": "skill",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"prism",
|
|
14
|
+
"skill"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prism-stack
|
|
3
|
+
description: |
|
|
4
|
+
Use when asked for framework-specific best practices, implementation guidelines
|
|
5
|
+
for React/Vue/Svelte/Next.js, or stack-specific patterns. Examples: "React best
|
|
6
|
+
practices", "Vue component patterns", "Next.js performance"
|
|
7
|
+
allowed-tools: Read, Bash, Glob, Grep
|
|
8
|
+
version: 0.6.6
|
|
9
|
+
author: tonone-ai <hello@tonone.ai>
|
|
10
|
+
license: MIT
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# prism-stack — Framework Best Practices
|
|
14
|
+
|
|
15
|
+
Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
|
|
16
|
+
|
|
17
|
+
## When to use
|
|
18
|
+
|
|
19
|
+
User asks about framework-specific patterns, component architecture, or stack guidelines.
|
|
20
|
+
|
|
21
|
+
## Workflow
|
|
22
|
+
|
|
23
|
+
1. **Detect stack** from project files (package.json, imports, config files)
|
|
24
|
+
```bash
|
|
25
|
+
grep -r "\"react\"\|\"vue\"\|\"svelte\"\|\"next\"\|\"nuxt\"\|\"astro\"" package.json 2>/dev/null | head -5
|
|
26
|
+
```
|
|
27
|
+
2. **Search stack knowledge base:**
|
|
28
|
+
```bash
|
|
29
|
+
python3 -m prism_agent.uiux search --domain stacks --query "{stack_name}" --limit 5
|
|
30
|
+
```
|
|
31
|
+
3. **Cross-reference version** — confirm guidelines match the detected major version
|
|
32
|
+
4. **Output** framework-specific guidelines with code examples
|
|
33
|
+
|
|
34
|
+
## Output format
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
┌─ Stack Guidelines — {stack_name} {version} ─────────────────────────┐
|
|
38
|
+
│ Category │ Guideline │ Severity │
|
|
39
|
+
├──────────────────┼────────────────────────────────────┼───────────────┤
|
|
40
|
+
│ {category} │ {guideline} │ Critical │
|
|
41
|
+
│ {category} │ {guideline} │ High │
|
|
42
|
+
│ {category} │ {guideline} │ Medium │
|
|
43
|
+
└──────────────────┴────────────────────────────────────┴───────────────┘
|
|
44
|
+
|
|
45
|
+
Code example:
|
|
46
|
+
{code_block}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Anti-patterns
|
|
50
|
+
|
|
51
|
+
- Never apply guidelines from the wrong framework version (e.g., Vue 2 patterns on Vue 3)
|
|
52
|
+
- Never mix framework idioms (e.g., React hooks inside Vue components)
|
|
53
|
+
- Never skip version detection — always confirm before outputting guidelines
|
|
54
|
+
- Never output framework-agnostic advice when stack-specific guidance is available
|
|
55
|
+
|
|
56
|
+
## Delivery
|
|
57
|
+
|
|
58
|
+
If output exceeds the 40-line CLI budget, invoke `/atlas-report` with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "prism-ui",
|
|
3
|
+
"version": "0.9.7",
|
|
4
|
+
"description": "Implement a complete UI screen or feature from a Form visual spec. Use when asked to \"build a page\", \"implement this screen\", \"build the frontend for this feature\", or \"create this UI\".",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "tonone-ai",
|
|
7
|
+
"url": "https://tonone.ai"
|
|
8
|
+
},
|
|
9
|
+
"repository": "https://github.com/tonone-ai/tonone",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"type": "skill",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"prism",
|
|
14
|
+
"skill"
|
|
15
|
+
]
|
|
16
|
+
}
|