100xprism 2.3.1
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/LICENSE +21 -0
- package/README.md +196 -0
- package/VERSION +1 -0
- package/adapters/antigravity.sh +14 -0
- package/adapters/claude-code.sh +160 -0
- package/adapters/codex.sh +13 -0
- package/adapters/copilot.sh +13 -0
- package/adapters/cursor.sh +13 -0
- package/adapters/gemini.sh +13 -0
- package/adapters/lib/__pycache__/modules.cpython-312.pyc +0 -0
- package/adapters/lib/modules.py +592 -0
- package/adapters/lib/shared.sh +83 -0
- package/adapters/lib/sync_plugins.py +113 -0
- package/adapters/windsurf.sh +15 -0
- package/bin/100xprism.js +29 -0
- package/get.sh +24 -0
- package/install-project.sh +82 -0
- package/install.sh +281 -0
- package/lib/adapters/windows.js +429 -0
- package/lib/bootstrap.js +33 -0
- package/lib/init.js +19 -0
- package/lib/install.js +18 -0
- package/lib/migrate.js +52 -0
- package/lib/platform.js +22 -0
- package/lib/update.js +29 -0
- package/modules/_lib/reference.md +77 -0
- package/modules/a11y-auditor/SKILL.md +151 -0
- package/modules/ab-test-setup/SKILL.md +266 -0
- package/modules/ab-test-setup/evals/evals.json +105 -0
- package/modules/ab-test-setup/references/sample-size-guide.md +263 -0
- package/modules/ab-test-setup/references/test-templates.md +277 -0
- package/modules/ad-creative/SKILL.md +362 -0
- package/modules/ad-creative/evals/evals.json +90 -0
- package/modules/ad-creative/references/generative-tools.md +637 -0
- package/modules/ad-creative/references/platform-specs.md +213 -0
- package/modules/ai-seo/SKILL.md +398 -0
- package/modules/ai-seo/evals/evals.json +90 -0
- package/modules/ai-seo/references/content-patterns.md +285 -0
- package/modules/ai-seo/references/platform-ranking-factors.md +152 -0
- package/modules/analytics-tracking/SKILL.md +309 -0
- package/modules/analytics-tracking/evals/evals.json +90 -0
- package/modules/analytics-tracking/references/event-library.md +260 -0
- package/modules/analytics-tracking/references/ga4-implementation.md +300 -0
- package/modules/analytics-tracking/references/gtm-implementation.md +390 -0
- package/modules/architect/SKILL.md +282 -0
- package/modules/branch/SKILL.md +105 -0
- package/modules/churn-prevention/SKILL.md +424 -0
- package/modules/churn-prevention/evals/evals.json +93 -0
- package/modules/churn-prevention/references/cancel-flow-patterns.md +316 -0
- package/modules/churn-prevention/references/dunning-playbook.md +408 -0
- package/modules/cloud-security/SKILL.md +240 -0
- package/modules/cold-email/SKILL.md +178 -0
- package/modules/cold-email/evals/evals.json +94 -0
- package/modules/cold-email/references/benchmarks.md +83 -0
- package/modules/cold-email/references/follow-up-sequences.md +81 -0
- package/modules/cold-email/references/frameworks.md +90 -0
- package/modules/cold-email/references/personalization.md +79 -0
- package/modules/cold-email/references/subject-lines.md +53 -0
- package/modules/commit/SKILL.md +195 -0
- package/modules/competitor-alternatives/SKILL.md +256 -0
- package/modules/competitor-alternatives/evals/evals.json +93 -0
- package/modules/competitor-alternatives/references/content-architecture.md +271 -0
- package/modules/competitor-alternatives/references/templates.md +223 -0
- package/modules/connect/SKILL.md +894 -0
- package/modules/content-strategy/SKILL.md +359 -0
- package/modules/content-strategy/evals/evals.json +90 -0
- package/modules/context-dump/SKILL.md +67 -0
- package/modules/copy-editing/SKILL.md +447 -0
- package/modules/copy-editing/evals/evals.json +89 -0
- package/modules/copy-editing/references/plain-english-alternatives.md +394 -0
- package/modules/copywriting/SKILL.md +271 -0
- package/modules/copywriting/evals/evals.json +111 -0
- package/modules/copywriting/references/cold-email-benchmarks.md +83 -0
- package/modules/copywriting/references/cold-email-follow-ups.md +81 -0
- package/modules/copywriting/references/cold-email-frameworks.md +90 -0
- package/modules/copywriting/references/cold-email-personalization.md +79 -0
- package/modules/copywriting/references/cold-email-subject-lines.md +53 -0
- package/modules/copywriting/references/copy-frameworks.md +344 -0
- package/modules/copywriting/references/email-copy-guidelines.md +113 -0
- package/modules/copywriting/references/email-types.md +515 -0
- package/modules/copywriting/references/natural-transitions.md +272 -0
- package/modules/copywriting/references/sequence-templates.md +168 -0
- package/modules/data-query/SKILL.md +58 -0
- package/modules/data-viz/SKILL.md +225 -0
- package/modules/db/SKILL.md +205 -0
- package/modules/db/db-engines/_router.md +24 -0
- package/modules/db/db-engines/athena.md +16 -0
- package/modules/db/db-engines/cloud-sql.md +16 -0
- package/modules/db/db-engines/databricks.md +14 -0
- package/modules/db/db-engines/oracle.md +14 -0
- package/modules/db/db-engines/postgres.md +15 -0
- package/modules/db/db-engines/presto.md +14 -0
- package/modules/db/db-engines/snowflake.md +14 -0
- package/modules/docs/SKILL.md +100 -0
- package/modules/email-sequence/SKILL.md +309 -0
- package/modules/email-sequence/evals/evals.json +93 -0
- package/modules/email-sequence/references/copy-guidelines.md +113 -0
- package/modules/email-sequence/references/email-types.md +515 -0
- package/modules/email-sequence/references/sequence-templates.md +168 -0
- package/modules/enterprise-design/SKILL.md +75 -0
- package/modules/eval/SKILL.md +105 -0
- package/modules/figma-translator/SKILL.md +49 -0
- package/modules/fix-bugs/SKILL.md +104 -0
- package/modules/form-cro/SKILL.md +429 -0
- package/modules/form-cro/evals/evals.json +90 -0
- package/modules/free-tool-strategy/SKILL.md +178 -0
- package/modules/free-tool-strategy/evals/evals.json +90 -0
- package/modules/free-tool-strategy/references/tool-types.md +217 -0
- package/modules/gate/SKILL.md +232 -0
- package/modules/grill-me/SKILL.md +59 -0
- package/modules/interaction-engineer/SKILL.md +49 -0
- package/modules/issue/SKILL.md +272 -0
- package/modules/launch/SKILL.md +345 -0
- package/modules/launch-strategy/SKILL.md +353 -0
- package/modules/launch-strategy/evals/evals.json +91 -0
- package/modules/lint/SKILL.md +126 -0
- package/modules/marketing-ideas/SKILL.md +167 -0
- package/modules/marketing-ideas/evals/evals.json +90 -0
- package/modules/marketing-ideas/references/ideas-by-category.md +366 -0
- package/modules/marketing-psychology/SKILL.md +455 -0
- package/modules/marketing-psychology/evals/evals.json +88 -0
- package/modules/motion-designer/SKILL.md +214 -0
- package/modules/onboarding-cro/SKILL.md +220 -0
- package/modules/onboarding-cro/evals/evals.json +92 -0
- package/modules/onboarding-cro/references/experiments.md +258 -0
- package/modules/orchestrate/SKILL.md +77 -0
- package/modules/page-cro/SKILL.md +182 -0
- package/modules/page-cro/evals/evals.json +111 -0
- package/modules/page-cro/references/experiments.md +248 -0
- package/modules/page-cro/references/paywall-experiments.md +164 -0
- package/modules/paid-ads/SKILL.md +315 -0
- package/modules/paid-ads/evals/evals.json +90 -0
- package/modules/paid-ads/references/ad-copy-templates.md +207 -0
- package/modules/paid-ads/references/audience-targeting.md +243 -0
- package/modules/paid-ads/references/platform-setup-checklists.md +277 -0
- package/modules/paywall-upgrade-cro/SKILL.md +227 -0
- package/modules/paywall-upgrade-cro/evals/evals.json +93 -0
- package/modules/paywall-upgrade-cro/references/experiments.md +164 -0
- package/modules/popup-cro/SKILL.md +453 -0
- package/modules/popup-cro/evals/evals.json +94 -0
- package/modules/pr/SKILL.md +203 -0
- package/modules/pricing-strategy/SKILL.md +231 -0
- package/modules/pricing-strategy/evals/evals.json +90 -0
- package/modules/pricing-strategy/references/research-methods.md +152 -0
- package/modules/pricing-strategy/references/tier-structure.md +232 -0
- package/modules/product-marketing-context/SKILL.md +241 -0
- package/modules/product-marketing-context/evals/evals.json +85 -0
- package/modules/programmatic-seo/SKILL.md +238 -0
- package/modules/programmatic-seo/evals/evals.json +94 -0
- package/modules/programmatic-seo/references/playbooks.md +308 -0
- package/modules/push/SKILL.md +202 -0
- package/modules/referral-program/SKILL.md +255 -0
- package/modules/referral-program/evals/evals.json +89 -0
- package/modules/referral-program/references/affiliate-programs.md +164 -0
- package/modules/referral-program/references/program-examples.md +143 -0
- package/modules/release/SKILL.md +293 -0
- package/modules/revops/SKILL.md +343 -0
- package/modules/revops/evals/evals.json +91 -0
- package/modules/revops/references/automation-playbooks.md +290 -0
- package/modules/revops/references/lifecycle-definitions.md +278 -0
- package/modules/revops/references/routing-rules.md +203 -0
- package/modules/revops/references/scoring-models.md +247 -0
- package/modules/sales-enablement/SKILL.md +349 -0
- package/modules/sales-enablement/evals/evals.json +91 -0
- package/modules/sales-enablement/references/deck-frameworks.md +263 -0
- package/modules/sales-enablement/references/demo-scripts.md +355 -0
- package/modules/sales-enablement/references/objection-library.md +270 -0
- package/modules/sales-enablement/references/one-pager-templates.md +208 -0
- package/modules/schema-markup/SKILL.md +179 -0
- package/modules/schema-markup/evals/evals.json +87 -0
- package/modules/schema-markup/references/schema-examples.md +398 -0
- package/modules/security/SKILL.md +138 -0
- package/modules/seo-audit/SKILL.md +412 -0
- package/modules/seo-audit/evals/evals.json +136 -0
- package/modules/seo-audit/references/ai-writing-detection.md +200 -0
- package/modules/seo-audit/references/content-patterns.md +285 -0
- package/modules/seo-audit/references/platform-ranking-factors.md +152 -0
- package/modules/signup-flow-cro/SKILL.md +359 -0
- package/modules/signup-flow-cro/evals/evals.json +88 -0
- package/modules/site-architecture/SKILL.md +357 -0
- package/modules/site-architecture/evals/evals.json +88 -0
- package/modules/site-architecture/references/mermaid-templates.md +216 -0
- package/modules/site-architecture/references/navigation-patterns.md +305 -0
- package/modules/site-architecture/references/site-type-templates.md +293 -0
- package/modules/social-content/SKILL.md +278 -0
- package/modules/social-content/evals/evals.json +92 -0
- package/modules/social-content/references/platforms.md +170 -0
- package/modules/social-content/references/post-templates.md +177 -0
- package/modules/social-content/references/reverse-engineering.md +195 -0
- package/modules/spec/SKILL.md +81 -0
- package/modules/subagents/SKILL.md +123 -0
- package/modules/techdebt/SKILL.md +71 -0
- package/modules/terminal-setup/SKILL.md +49 -0
- package/modules/test/SKILL.md +493 -0
- package/modules/test/references/e2e-patterns.md +294 -0
- package/modules/update-claude-md/SKILL.md +52 -0
- package/modules/visual-system-architect/SKILL.md +53 -0
- package/package.json +44 -0
- package/plugins/plugins.json +43 -0
- package/shell/aliases.sh +24 -0
- package/shell/check-update.sh +212 -0
- package/templates/.env.example +199 -0
- package/templates/docker-compose.md +46 -0
- package/templates/node-frontend.md +56 -0
- package/templates/node-fullstack.md +59 -0
- package/templates/python-api.md +57 -0
- package/update.sh +231 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# E2E Test Patterns
|
|
2
|
+
|
|
3
|
+
Reference patterns used by the `/test` workflow. All patterns follow the real-over-mocked principle: create real users via the API, run against a real Docker stack, verify persistence in the DB.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Auth Fixture
|
|
8
|
+
|
|
9
|
+
**`e2e/fixtures/api.ts`** — create test users and get tokens via real API calls:
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import { APIRequestContext } from '@playwright/test'
|
|
13
|
+
|
|
14
|
+
export async function createTestUser(
|
|
15
|
+
request: APIRequestContext,
|
|
16
|
+
overrides?: Partial<{ email: string; password: string; name: string }>
|
|
17
|
+
) {
|
|
18
|
+
const email = overrides?.email ?? `test-${Date.now()}@example.com`
|
|
19
|
+
const password = overrides?.password ?? 'TestPass123!'
|
|
20
|
+
const name = overrides?.name ?? 'Test User'
|
|
21
|
+
const res = await request.post('/api/auth/register', { data: { email, password, name } })
|
|
22
|
+
if (!res.ok()) throw new Error(`User creation failed: ${await res.text()}`)
|
|
23
|
+
return { email, password, name, id: (await res.json()).id }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function getAuthToken(
|
|
27
|
+
request: APIRequestContext,
|
|
28
|
+
email: string,
|
|
29
|
+
password: string
|
|
30
|
+
): Promise<string> {
|
|
31
|
+
const res = await request.post('/api/auth/login', { data: { email, password } })
|
|
32
|
+
if (!res.ok()) throw new Error(`Login failed: ${await res.text()}`)
|
|
33
|
+
return (await res.json()).token
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**`e2e/fixtures/auth.ts`** — real auth fixture (actual login, not mocked JWT):
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { test as base } from '@playwright/test'
|
|
41
|
+
import { createTestUser, getAuthToken } from './api'
|
|
42
|
+
|
|
43
|
+
type AuthFixtures = {
|
|
44
|
+
authToken: string
|
|
45
|
+
authenticatedPage: import('@playwright/test').Page
|
|
46
|
+
testUser: { email: string; password: string; name: string; id: string }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const test = base.extend<AuthFixtures>({
|
|
50
|
+
testUser: async ({ request }, use) => {
|
|
51
|
+
const user = await createTestUser(request)
|
|
52
|
+
await use(user)
|
|
53
|
+
},
|
|
54
|
+
authToken: async ({ request, testUser }, use) => {
|
|
55
|
+
const token = await getAuthToken(request, testUser.email, testUser.password)
|
|
56
|
+
await use(token)
|
|
57
|
+
},
|
|
58
|
+
authenticatedPage: async ({ page, authToken }, use) => {
|
|
59
|
+
await page.goto('/')
|
|
60
|
+
await page.evaluate((token) => localStorage.setItem('authToken', token), authToken)
|
|
61
|
+
await page.reload()
|
|
62
|
+
await use(page)
|
|
63
|
+
},
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
export { expect } from '@playwright/test'
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Smoke Tests
|
|
72
|
+
|
|
73
|
+
Run these first — fast gate before the full suite.
|
|
74
|
+
|
|
75
|
+
**`e2e/smoke/health.spec.ts`**:
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
import { test, expect } from '@playwright/test'
|
|
79
|
+
|
|
80
|
+
test('API /health returns 200', async ({ request }) => {
|
|
81
|
+
const res = await request.get('/health')
|
|
82
|
+
expect(res.status()).toBe(200)
|
|
83
|
+
expect((await res.json()).status).toBe('ok')
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
test('API /health/db confirms DB connection', async ({ request }) => {
|
|
87
|
+
const res = await request.get('/health/db')
|
|
88
|
+
expect(res.status()).toBe(200)
|
|
89
|
+
expect((await res.json()).database).toBe('connected')
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
test('frontend loads without JS errors', async ({ page }) => {
|
|
93
|
+
const errors: string[] = []
|
|
94
|
+
page.on('console', (msg) => { if (msg.type() === 'error') errors.push(msg.text()) })
|
|
95
|
+
await page.goto('/')
|
|
96
|
+
await expect(page).toHaveTitle(/your app name/i)
|
|
97
|
+
expect(errors).toHaveLength(0)
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
test('login page renders', async ({ page }) => {
|
|
101
|
+
await page.goto('/login')
|
|
102
|
+
await expect(page.getByRole('button', { name: /sign in/i })).toBeVisible()
|
|
103
|
+
})
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Auth Flow Tests
|
|
109
|
+
|
|
110
|
+
**`e2e/auth/login.spec.ts`**:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
import { test, expect } from '../fixtures/auth'
|
|
114
|
+
|
|
115
|
+
test('user can register and land on dashboard', async ({ page, request }) => {
|
|
116
|
+
const email = `e2e-${Date.now()}@example.com`
|
|
117
|
+
const password = 'TestPass123!'
|
|
118
|
+
|
|
119
|
+
await page.goto('/register')
|
|
120
|
+
await page.getByLabel('Email').fill(email)
|
|
121
|
+
await page.getByLabel('Password').fill(password)
|
|
122
|
+
await page.getByRole('button', { name: /create account/i }).click()
|
|
123
|
+
|
|
124
|
+
await expect(page).toHaveURL(/\/dashboard/)
|
|
125
|
+
await expect(page.getByText(/welcome/i)).toBeVisible()
|
|
126
|
+
|
|
127
|
+
// Confirm user exists in DB
|
|
128
|
+
const token = await (await request.post('/api/auth/login', { data: { email, password } })).json()
|
|
129
|
+
expect(token.token).toBeTruthy()
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
test('user can log in with real credentials', async ({ page, testUser }) => {
|
|
133
|
+
await page.goto('/login')
|
|
134
|
+
await page.getByLabel('Email').fill(testUser.email)
|
|
135
|
+
await page.getByLabel('Password').fill(testUser.password)
|
|
136
|
+
await page.getByRole('button', { name: /sign in/i }).click()
|
|
137
|
+
|
|
138
|
+
await expect(page).toHaveURL(/\/dashboard/)
|
|
139
|
+
await expect(page.getByText(testUser.name)).toBeVisible()
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
test('invalid credentials show error', async ({ page }) => {
|
|
143
|
+
await page.goto('/login')
|
|
144
|
+
await page.getByLabel('Email').fill('nobody@example.com')
|
|
145
|
+
await page.getByLabel('Password').fill('wrongpassword')
|
|
146
|
+
await page.getByRole('button', { name: /sign in/i }).click()
|
|
147
|
+
|
|
148
|
+
await expect(page.getByRole('alert')).toContainText(/invalid/i)
|
|
149
|
+
await expect(page).toHaveURL(/\/login/)
|
|
150
|
+
})
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## CRUD Tests
|
|
156
|
+
|
|
157
|
+
Browser creates entity → API confirms it persisted. No mock return values.
|
|
158
|
+
|
|
159
|
+
**`e2e/[entity]/crud.spec.ts`** (adapt to your entity):
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import { test, expect } from '../fixtures/auth'
|
|
163
|
+
|
|
164
|
+
test('create entity via UI and verify persistence', async ({
|
|
165
|
+
authenticatedPage: page, request, authToken,
|
|
166
|
+
}) => {
|
|
167
|
+
await page.goto('/dashboard/entities')
|
|
168
|
+
await page.getByRole('button', { name: /new/i }).click()
|
|
169
|
+
|
|
170
|
+
const name = `Test Entity ${Date.now()}`
|
|
171
|
+
await page.getByLabel('Name').fill(name)
|
|
172
|
+
await page.getByRole('button', { name: /create/i }).click()
|
|
173
|
+
|
|
174
|
+
await expect(page.getByText(name)).toBeVisible()
|
|
175
|
+
|
|
176
|
+
// Confirm it actually persisted — not just UI state
|
|
177
|
+
const res = await request.get('/api/entities', {
|
|
178
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
179
|
+
})
|
|
180
|
+
const items = await res.json()
|
|
181
|
+
expect(items.find((i: { name: string }) => i.name === name)).toBeDefined()
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
test('edit entity updates DB record', async ({
|
|
185
|
+
authenticatedPage: page, request, authToken,
|
|
186
|
+
}) => {
|
|
187
|
+
const createRes = await request.post('/api/entities', {
|
|
188
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
189
|
+
data: { name: 'Original Name' },
|
|
190
|
+
})
|
|
191
|
+
const item = await createRes.json()
|
|
192
|
+
|
|
193
|
+
await page.goto(`/dashboard/entities/${item.id}`)
|
|
194
|
+
await page.getByLabel('Name').clear()
|
|
195
|
+
await page.getByLabel('Name').fill('Updated Name')
|
|
196
|
+
await page.getByRole('button', { name: /save/i }).click()
|
|
197
|
+
|
|
198
|
+
await expect(page.getByText('Updated Name')).toBeVisible()
|
|
199
|
+
|
|
200
|
+
const fetchRes = await request.get(`/api/entities/${item.id}`, {
|
|
201
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
202
|
+
})
|
|
203
|
+
expect((await fetchRes.json()).name).toBe('Updated Name')
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
test('delete entity removes from DB', async ({
|
|
207
|
+
authenticatedPage: page, request, authToken,
|
|
208
|
+
}) => {
|
|
209
|
+
const createRes = await request.post('/api/entities', {
|
|
210
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
211
|
+
data: { name: 'To Be Deleted' },
|
|
212
|
+
})
|
|
213
|
+
const item = await createRes.json()
|
|
214
|
+
|
|
215
|
+
await page.goto('/dashboard/entities')
|
|
216
|
+
await page.getByTestId(`entity-row-${item.id}`).getByRole('button', { name: /delete/i }).click()
|
|
217
|
+
await page.getByRole('button', { name: /confirm/i }).click()
|
|
218
|
+
|
|
219
|
+
await expect(page.getByText('To Be Deleted')).not.toBeVisible()
|
|
220
|
+
|
|
221
|
+
const fetchRes = await request.get(`/api/entities/${item.id}`, {
|
|
222
|
+
headers: { Authorization: `Bearer ${authToken}` },
|
|
223
|
+
})
|
|
224
|
+
expect(fetchRes.status()).toBe(404)
|
|
225
|
+
})
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Running E2E
|
|
231
|
+
|
|
232
|
+
**Start full stack:**
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
if [ -f docker-compose.e2e.yml ] && [ -f docker-compose.yml ]; then
|
|
236
|
+
COMPOSE_CMD="docker compose -f docker-compose.yml -f docker-compose.e2e.yml"
|
|
237
|
+
elif [ -f docker-compose.test.yml ]; then
|
|
238
|
+
COMPOSE_CMD="docker compose -f docker-compose.test.yml"
|
|
239
|
+
else
|
|
240
|
+
COMPOSE_CMD="docker compose"
|
|
241
|
+
fi
|
|
242
|
+
$COMPOSE_CMD up -d --build --wait
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
**Wait for app health:**
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
for i in $(seq 1 12); do
|
|
249
|
+
curl -sf http://localhost:3000/health 2>/dev/null && break ||
|
|
250
|
+
curl -sf http://localhost:8000/health 2>/dev/null && break ||
|
|
251
|
+
{ echo "Attempt $i/12 — waiting..."; sleep 5; }
|
|
252
|
+
done
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**Run smoke first, then full suite:**
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
# 1. Smoke gate (fast)
|
|
259
|
+
npx playwright test e2e/smoke/ --config=playwright.e2e.config.ts
|
|
260
|
+
|
|
261
|
+
# 2. Full suite
|
|
262
|
+
npx playwright test --config=playwright.e2e.config.ts
|
|
263
|
+
|
|
264
|
+
# Against staging or prod
|
|
265
|
+
BASE_URL=https://staging.example.com npx playwright test --config=playwright.e2e.config.ts
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
**Python projects:**
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
BASE_URL="${E2E_BASE_URL:-http://localhost:8000}" \
|
|
272
|
+
./venv/bin/pytest tests/e2e/ -v --tb=short
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**Teardown:**
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
$COMPOSE_CMD down -v 2>/dev/null || true
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## What to Mock (and What Not To)
|
|
284
|
+
|
|
285
|
+
```python
|
|
286
|
+
# ✅ Mock this — genuinely unreachable locally
|
|
287
|
+
monkeypatch.setattr("stripe.PaymentIntent.create", AsyncMock(return_value={"id": "pi_test"}))
|
|
288
|
+
monkeypatch.setattr("sendgrid.send", AsyncMock(return_value=None))
|
|
289
|
+
|
|
290
|
+
# ❌ Never mock this — use a real Docker DB instead
|
|
291
|
+
monkeypatch.setattr("db.session.add", MagicMock()) # masks constraint violations
|
|
292
|
+
monkeypatch.setattr("db.session.commit", MagicMock()) # masks transaction failures
|
|
293
|
+
monkeypatch.setattr("redis_client.get", MagicMock()) # masks TTL/serialisation bugs
|
|
294
|
+
```
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: update-claude-md
|
|
3
|
+
description: After any correction from the user, update CLAUDE.md with a rule to prevent the same mistake from recurring. Use when the user corrects your behavior or says "don't do that again". Ruthlessly iterate CLAUDE.md until mistake rate measurably drops.
|
|
4
|
+
category: engineering
|
|
5
|
+
tier: core
|
|
6
|
+
slash_command: /update-claude
|
|
7
|
+
allowed-tools: Read Edit Write
|
|
8
|
+
model: haiku
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Update-Claude — CLAUDE.md Rule Writer
|
|
12
|
+
|
|
13
|
+
After any correction, update CLAUDE.md with a rule to prevent the same mistake recurring.
|
|
14
|
+
|
|
15
|
+
## How to use
|
|
16
|
+
- `/update-claude` — after a correction, write a rule to CLAUDE.md
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Phase 1 — Identify the pattern
|
|
21
|
+
|
|
22
|
+
What went wrong? What should have been done instead? Be specific — one clear pattern, not a vague note.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Phase 2 — Write a rule
|
|
27
|
+
|
|
28
|
+
Formulate as a clear, actionable rule:
|
|
29
|
+
```
|
|
30
|
+
- [Rule]: [What to do / not to do]. Why: [brief context].
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Short rules stick. Long paragraphs get ignored.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Phase 3 — Update CLAUDE.md
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
PROJECT_ROOT=$(git rev-parse --show-toplevel)
|
|
41
|
+
INSTRUCTION_FILE=$(for f in CLAUDE.md AGENTS.md .cursorrules .windsurfrules .github/copilot-instructions.md GEMINI.md; do [ -f "$PROJECT_ROOT/$f" ] && echo "$PROJECT_ROOT/$f" && break; done)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Append the rule under a `## Rules` or `## Corrections` section in the project's instruction file. If no instruction file exists, create `CLAUDE.md` in the project root.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Phase 4 — Confirm
|
|
49
|
+
|
|
50
|
+
Tell the user: "Updated [file] with: [rule summary]"
|
|
51
|
+
|
|
52
|
+
If the rule isn't reducing mistakes after 2–3 sessions: rewrite it — be more specific or more prominent.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: visual-system-architect
|
|
3
|
+
description: Act as a Global Design Director to produce a complete design system — color palette, typography scale, 8px grid, 30+ components, responsive patterns, animations, and WCAG AA accessibility. Exports design tokens (JSON), CSS variables, and Figma-ready docs. Use when building a brand's visual foundation for Figma Make or a design handoff.
|
|
4
|
+
category: design
|
|
5
|
+
tier: on-demand
|
|
6
|
+
allowed-tools: Read Write
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
You are a Global Design Director tasked with building a scalable design system for the described brand.
|
|
10
|
+
|
|
11
|
+
## Required Input
|
|
12
|
+
|
|
13
|
+
Provide the following before invoking:
|
|
14
|
+
- **Brand name**: [BRAND]
|
|
15
|
+
- **Brand personality**: MINIMAL / BOLD / LUXURY / PLAYFUL / MODERN / TECHNICAL (pick or describe)
|
|
16
|
+
|
|
17
|
+
## Deliverables
|
|
18
|
+
|
|
19
|
+
Produce a complete, production-ready design system including:
|
|
20
|
+
|
|
21
|
+
### 1. Color System
|
|
22
|
+
- Primary, secondary, semantic, and neutral palettes
|
|
23
|
+
- Dark mode equivalents for every color
|
|
24
|
+
|
|
25
|
+
### 2. Typography Framework
|
|
26
|
+
- 9-step type scale with font pairing rationale
|
|
27
|
+
|
|
28
|
+
### 3. Spatial System
|
|
29
|
+
- 8px grid foundation with spacing tokens
|
|
30
|
+
|
|
31
|
+
### 4. Component Library
|
|
32
|
+
- 30+ components with interaction states and usage rules
|
|
33
|
+
|
|
34
|
+
### 5. Responsive Layout Patterns
|
|
35
|
+
- Breakpoints and adaptive behavior logic for all components
|
|
36
|
+
|
|
37
|
+
### 6. Animation Principles
|
|
38
|
+
- Transition curves, durations, and micro-interaction animation philosophy
|
|
39
|
+
|
|
40
|
+
### 7. Accessibility Standards
|
|
41
|
+
- WCAG AA compliance guidance and contrast ratios throughout
|
|
42
|
+
|
|
43
|
+
## Export Formats
|
|
44
|
+
|
|
45
|
+
Deliver in three formats:
|
|
46
|
+
|
|
47
|
+
1. **Design tokens** — JSON structure
|
|
48
|
+
2. **CSS variable declarations**
|
|
49
|
+
3. **Figma-ready component documentation**
|
|
50
|
+
|
|
51
|
+
## Output Goal
|
|
52
|
+
|
|
53
|
+
This output will power the visual foundation inside Figma Make. Format all specs for direct handoff — no further interpretation required.
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "100xprism",
|
|
3
|
+
"version": "2.3.1",
|
|
4
|
+
"description": "66 cross-tool modules (workflows + skills). Quality gates on every commit. Works with Claude Code, Cursor, Codex, Windsurf, Antigravity, Copilot, Gemini.",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"test": "node --test",
|
|
7
|
+
"check": "node --test && python3 scripts/meta-check.py && HOME=$(mktemp -d) ./adapters/claude-code.sh"
|
|
8
|
+
},
|
|
9
|
+
"bin": {
|
|
10
|
+
"100xprism": "bin/100xprism.js",
|
|
11
|
+
"100x-dev": "bin/100xprism.js"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"bin/",
|
|
15
|
+
"lib/",
|
|
16
|
+
"modules/",
|
|
17
|
+
"plugins/",
|
|
18
|
+
"templates/",
|
|
19
|
+
"shell/",
|
|
20
|
+
"adapters/",
|
|
21
|
+
"get.sh",
|
|
22
|
+
"install.sh",
|
|
23
|
+
"install-project.sh",
|
|
24
|
+
"update.sh",
|
|
25
|
+
"VERSION"
|
|
26
|
+
],
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=18.0.0"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"claude-code",
|
|
32
|
+
"cursor",
|
|
33
|
+
"codex",
|
|
34
|
+
"ai-coding",
|
|
35
|
+
"developer-workflow",
|
|
36
|
+
"slash-commands"
|
|
37
|
+
],
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/rajitsaha/100xprism.git"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://github.com/rajitsaha/100xprism"
|
|
44
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"plugins": [
|
|
3
|
+
"frontend-design@claude-plugins-official",
|
|
4
|
+
"superpowers@claude-plugins-official",
|
|
5
|
+
"playwright@claude-plugins-official",
|
|
6
|
+
"github@claude-plugins-official",
|
|
7
|
+
"security-guidance@claude-code-plugins",
|
|
8
|
+
"skill-creator@claude-plugins-official",
|
|
9
|
+
"code-simplifier@claude-plugins-official",
|
|
10
|
+
"pr-review-toolkit@claude-plugins-official",
|
|
11
|
+
"hookify@claude-plugins-official",
|
|
12
|
+
"claude-mem@thedotmack",
|
|
13
|
+
"understand-anything@understand-anything",
|
|
14
|
+
"ui-ux-pro-max@ui-ux-pro-max-skill",
|
|
15
|
+
"chrome-devtools-mcp@claude-plugins-official"
|
|
16
|
+
],
|
|
17
|
+
"extraKnownMarketplaces": {
|
|
18
|
+
"claude-code-plugins": {
|
|
19
|
+
"source": {
|
|
20
|
+
"source": "github",
|
|
21
|
+
"repo": "anthropics/claude-code"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"thedotmack": {
|
|
25
|
+
"source": {
|
|
26
|
+
"source": "github",
|
|
27
|
+
"repo": "thedotmack/claude-mem"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"understand-anything": {
|
|
31
|
+
"source": {
|
|
32
|
+
"source": "github",
|
|
33
|
+
"repo": "Lum1104/Understand-Anything"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"ui-ux-pro-max-skill": {
|
|
37
|
+
"source": {
|
|
38
|
+
"source": "github",
|
|
39
|
+
"repo": "nextlevelbuilder/ui-ux-pro-max-skill"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
package/shell/aliases.sh
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# shellcheck shell=bash
|
|
2
|
+
# 100x Dev shortcuts
|
|
3
|
+
# Source this file from ~/.zshrc or ~/.bashrc:
|
|
4
|
+
# source ~/100xprism/shell/aliases.sh
|
|
5
|
+
|
|
6
|
+
# Launch Claude
|
|
7
|
+
alias cc='claude'
|
|
8
|
+
alias ccc='claude --continue'
|
|
9
|
+
|
|
10
|
+
# Setup management
|
|
11
|
+
# shellcheck disable=SC2139
|
|
12
|
+
alias 100xprism="node $HOME/100xprism/bin/100xprism.js"
|
|
13
|
+
# shellcheck disable=SC2139
|
|
14
|
+
alias 100x-update="$HOME/100xprism/update.sh"
|
|
15
|
+
# shellcheck disable=SC2139
|
|
16
|
+
alias 100x-check="$HOME/100xprism/update.sh --check-only"
|
|
17
|
+
|
|
18
|
+
# ── Version check ─────────────────────────────────────────────────────────────
|
|
19
|
+
# On shell startup: read cached update status (no network) + prompt if available.
|
|
20
|
+
# Then kick off a background cache refresh for next session.
|
|
21
|
+
if [[ -x "$HOME/100xprism/shell/check-update.sh" ]]; then
|
|
22
|
+
bash "$HOME/100xprism/shell/check-update.sh" --notify
|
|
23
|
+
("$HOME/100xprism/shell/check-update.sh" --silent &) 2>/dev/null
|
|
24
|
+
fi
|