cfsa-antigravity 2.19.0 → 2.19.2
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/package.json +1 -1
- package/template/.agent/kit-sync.md +3 -3
- package/template/.claude/commands/audit-ambiguity-execute.md +6 -0
- package/template/.claude/commands/audit-ambiguity-rubrics.md +6 -0
- package/template/.claude/commands/audit-ambiguity.md +6 -0
- package/template/.claude/commands/bootstrap-agents-fill.md +6 -0
- package/template/.claude/commands/bootstrap-agents-provision.md +6 -0
- package/template/.claude/commands/bootstrap-agents.md +6 -0
- package/template/.claude/commands/create-prd-architecture.md +6 -0
- package/template/.claude/commands/create-prd-compile.md +6 -0
- package/template/.claude/commands/create-prd-design-system.md +6 -0
- package/template/.claude/commands/create-prd-security.md +6 -0
- package/template/.claude/commands/create-prd-stack.md +6 -0
- package/template/.claude/commands/decompose-architecture-structure.md +6 -0
- package/template/.claude/commands/decompose-architecture-validate.md +6 -0
- package/template/.claude/commands/evolve-contract.md +6 -0
- package/template/.claude/commands/evolve-feature-cascade.md +6 -0
- package/template/.claude/commands/evolve-feature-classify.md +6 -0
- package/template/.claude/commands/evolve-feature.md +6 -0
- package/template/.claude/commands/ideate-discover.md +6 -0
- package/template/.claude/commands/ideate-extract.md +6 -0
- package/template/.claude/commands/ideate-validate.md +6 -0
- package/template/.claude/commands/implement-slice-setup.md +6 -0
- package/template/.claude/commands/implement-slice-tdd.md +6 -0
- package/template/.claude/commands/plan-phase-preflight.md +6 -0
- package/template/.claude/commands/plan-phase-write.md +6 -0
- package/template/.claude/commands/propagate-decision-apply.md +6 -0
- package/template/.claude/commands/propagate-decision-scan.md +6 -0
- package/template/.claude/commands/propagate-decision.md +6 -0
- package/template/.claude/commands/remediate-pipeline-assess.md +6 -0
- package/template/.claude/commands/remediate-pipeline-execute.md +6 -0
- package/template/.claude/commands/remediate-pipeline.md +6 -0
- package/template/.claude/commands/remediate-shard-split.md +6 -0
- package/template/.claude/commands/resolve-ambiguity.md +6 -0
- package/template/.claude/commands/setup-workspace-cicd.md +6 -0
- package/template/.claude/commands/setup-workspace-data.md +6 -0
- package/template/.claude/commands/setup-workspace-hosting.md +6 -0
- package/template/.claude/commands/setup-workspace-scaffold.md +6 -0
- package/template/.claude/commands/sync-kit.md +6 -0
- package/template/.claude/commands/update-architecture-map.md +6 -0
- package/template/.claude/commands/validate-phase-quality.md +6 -0
- package/template/.claude/commands/validate-phase-readiness.md +6 -0
- package/template/.claude/commands/verify-infrastructure.md +6 -0
- package/template/.claude/commands/write-architecture-spec-deepen.md +6 -0
- package/template/.claude/commands/write-architecture-spec-design.md +6 -0
- package/template/.claude/commands/write-be-spec-classify.md +6 -0
- package/template/.claude/commands/write-be-spec-write.md +6 -0
- package/template/.claude/commands/write-fe-spec-classify.md +6 -0
- package/template/.claude/commands/write-fe-spec-write.md +6 -0
- package/template/.claude/skills/accessibility/SKILL.md +522 -0
- package/template/.claude/skills/accessibility/references/WCAG.md +162 -0
- package/template/.claude/skills/accessibility/references/ia-spec-checklist.md +35 -0
- package/template/.claude/skills/adversarial-review/SKILL.md +90 -0
- package/template/.claude/skills/antigravity-workflows/SKILL.md +81 -0
- package/template/.claude/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
- package/template/.claude/skills/api-design-principles/SKILL.md +169 -0
- package/template/.claude/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/template/.claude/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/template/.claude/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/template/.claude/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/template/.claude/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/template/.claude/skills/api-versioning/SKILL.md +166 -0
- package/template/.claude/skills/api-versioning/references/typescript.md +157 -0
- package/template/.claude/skills/architecture-mapping/SKILL.md +219 -0
- package/template/.claude/skills/bootstrap-agents/SKILL.md +258 -0
- package/template/.claude/skills/brainstorming/SKILL.md +177 -0
- package/template/.claude/skills/brand-guidelines/SKILL.md +44 -0
- package/template/.claude/skills/clean-code/SKILL.md +196 -0
- package/template/.claude/skills/clean-code/references/typescript.md +126 -0
- package/template/.claude/skills/code-review-pro/SKILL.md +152 -0
- package/template/.claude/skills/concise-planning/SKILL.md +107 -0
- package/template/.claude/skills/cross-layer-consistency/SKILL.md +117 -0
- package/template/.claude/skills/database-schema-design/SKILL.md +205 -0
- package/template/.claude/skills/database-schema-design/references/relational.md +228 -0
- package/template/.claude/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.claude/skills/design-anti-cliche/SKILL.md +159 -0
- package/template/.claude/skills/design-direction/SKILL.md +45 -0
- package/template/.claude/skills/error-handling-patterns/SKILL.md +226 -0
- package/template/.claude/skills/error-handling-patterns/references/go.md +162 -0
- package/template/.claude/skills/error-handling-patterns/references/python.md +262 -0
- package/template/.claude/skills/error-handling-patterns/references/rust.md +112 -0
- package/template/.claude/skills/error-handling-patterns/references/typescript.md +178 -0
- package/template/.claude/skills/find-skills/SKILL.md +145 -0
- package/template/.claude/skills/git-advanced/SKILL.md +972 -0
- package/template/.claude/skills/git-workflow/SKILL.md +420 -0
- package/template/.claude/skills/idea-extraction/SKILL.md +644 -0
- package/template/.claude/skills/logging-best-practices/SKILL.md +192 -0
- package/template/.claude/skills/logging-best-practices/references/go.md +49 -0
- package/template/.claude/skills/logging-best-practices/references/python.md +52 -0
- package/template/.claude/skills/logging-best-practices/references/typescript.md +215 -0
- package/template/.claude/skills/migration-management/SKILL.md +200 -0
- package/template/.claude/skills/migration-management/references/relational.md +214 -0
- package/template/.claude/skills/minimalist-surgical-development/SKILL.md +135 -0
- package/template/.claude/skills/parallel-agents/SKILL.md +165 -0
- package/template/.claude/skills/parallel-debugging/SKILL.md +135 -0
- package/template/.claude/skills/parallel-feature-development/SKILL.md +157 -0
- package/template/.claude/skills/performance-budgeting/SKILL.md +144 -0
- package/template/.claude/skills/pipeline-rubrics/SKILL.md +51 -0
- package/template/.claude/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
- package/template/.claude/skills/pipeline-rubrics/references/be-rubric.md +21 -0
- package/template/.claude/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
- package/template/.claude/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
- package/template/.claude/skills/pipeline-rubrics/references/scoring.md +32 -0
- package/template/.claude/skills/pipeline-rubrics/references/vision-rubric.md +12 -0
- package/template/.claude/skills/prd-templates/SKILL.md +107 -0
- package/template/.claude/skills/prd-templates/references/architecture-completeness-checklist.md +28 -0
- package/template/.claude/skills/prd-templates/references/architecture-design-template.md +88 -0
- package/template/.claude/skills/prd-templates/references/be-spec-classification.md +41 -0
- package/template/.claude/skills/prd-templates/references/be-spec-template.md +107 -0
- package/template/.claude/skills/prd-templates/references/bootstrap-verification-protocol.md +50 -0
- package/template/.claude/skills/prd-templates/references/constraint-exploration.md +41 -0
- package/template/.claude/skills/prd-templates/references/data-placement-template.md +74 -0
- package/template/.claude/skills/prd-templates/references/decision-confirmation-protocol.md +68 -0
- package/template/.claude/skills/prd-templates/references/decision-propagation.md +121 -0
- package/template/.claude/skills/prd-templates/references/decomposition-templates.md +226 -0
- package/template/.claude/skills/prd-templates/references/deep-ideation-loading-protocol.md +114 -0
- package/template/.claude/skills/prd-templates/references/design-system-decisions.md +198 -0
- package/template/.claude/skills/prd-templates/references/design-system-prerequisite-check.md +18 -0
- package/template/.claude/skills/prd-templates/references/domain-exhaustion-criteria.md +37 -0
- package/template/.claude/skills/prd-templates/references/engagement-tier-protocol.md +58 -0
- package/template/.claude/skills/prd-templates/references/engineering-standards-template.md +126 -0
- package/template/.claude/skills/prd-templates/references/evolution-layer-guidance.md +91 -0
- package/template/.claude/skills/prd-templates/references/expansion-modes.md +27 -0
- package/template/.claude/skills/prd-templates/references/fe-classification-procedures.md +47 -0
- package/template/.claude/skills/prd-templates/references/fe-spec-template.md +90 -0
- package/template/.claude/skills/prd-templates/references/feature-ledger-protocol.md +149 -0
- package/template/.claude/skills/prd-templates/references/folder-seeding-protocol.md +77 -0
- package/template/.claude/skills/prd-templates/references/fractal-cx-template.md +58 -0
- package/template/.claude/skills/prd-templates/references/fractal-feature-template.md +93 -0
- package/template/.claude/skills/prd-templates/references/fractal-node-index-template.md +55 -0
- package/template/.claude/skills/prd-templates/references/gate-applicability.md +92 -0
- package/template/.claude/skills/prd-templates/references/ideation-crosscut-template.md +36 -0
- package/template/.claude/skills/prd-templates/references/ideation-index-template.md +111 -0
- package/template/.claude/skills/prd-templates/references/ideation-meta-template.md +126 -0
- package/template/.claude/skills/prd-templates/references/infrastructure-report-template.md +71 -0
- package/template/.claude/skills/prd-templates/references/input-classification.md +23 -0
- package/template/.claude/skills/prd-templates/references/map-guard-protocol.md +65 -0
- package/template/.claude/skills/prd-templates/references/operational-templates.md +116 -0
- package/template/.claude/skills/prd-templates/references/persona-completeness-gate.md +20 -0
- package/template/.claude/skills/prd-templates/references/placeholder-guard-template.md +21 -0
- package/template/.claude/skills/prd-templates/references/placeholder-workflow-mapping.md +50 -0
- package/template/.claude/skills/prd-templates/references/shard-boundary-analysis.md +103 -0
- package/template/.claude/skills/prd-templates/references/shard-split-remediation.md +157 -0
- package/template/.claude/skills/prd-templates/references/skill-loading-protocol.md +36 -0
- package/template/.claude/skills/prd-templates/references/slice-completion-gates.md +29 -0
- package/template/.claude/skills/prd-templates/references/spec-coverage-sweep.md +44 -0
- package/template/.claude/skills/prd-templates/references/surface-model.md +61 -0
- package/template/.claude/skills/prd-templates/references/tdd-testing-policy.md +39 -0
- package/template/.claude/skills/prd-templates/references/vision-template.md +57 -0
- package/template/.claude/skills/prd-templates/references/workflow-checkpoint-protocol.md +112 -0
- package/template/.claude/skills/prd-templates/references/write-verification-protocol.md +57 -0
- package/template/.claude/skills/prompt-engineer/SKILL.md +203 -0
- package/template/.claude/skills/regex-patterns/SKILL.md +333 -0
- package/template/.claude/skills/regex-patterns/references/go.md +44 -0
- package/template/.claude/skills/regex-patterns/references/javascript.md +63 -0
- package/template/.claude/skills/regex-patterns/references/python.md +77 -0
- package/template/.claude/skills/regex-patterns/references/rust.md +43 -0
- package/template/.claude/skills/resolve-ambiguity/SKILL.md +278 -0
- package/template/.claude/skills/security-scanning-security-hardening/SKILL.md +231 -0
- package/template/.claude/skills/session-continuity/SKILL.md +732 -0
- package/template/.claude/skills/session-continuity/protocols/01-session-resumption.md +38 -0
- package/template/.claude/skills/session-continuity/protocols/02-progress-generation.md +85 -0
- package/template/.claude/skills/session-continuity/protocols/03-progress-update.md +70 -0
- package/template/.claude/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
- package/template/.claude/skills/session-continuity/protocols/05-session-close.md +37 -0
- package/template/.claude/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
- package/template/.claude/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
- package/template/.claude/skills/session-continuity/protocols/08-spec-pipeline-update.md +55 -0
- package/template/.claude/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
- package/template/.claude/skills/session-continuity/protocols/10-placeholder-verification-gate.md +83 -0
- package/template/.claude/skills/session-continuity/protocols/11-parallel-synthesis.md +21 -0
- package/template/.claude/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
- package/template/.claude/skills/skill-creator/SKILL.md +203 -0
- package/template/.claude/skills/skill-creator/references/.gitkeep +0 -0
- package/template/.claude/skills/skill-creator/scripts/.gitkeep +0 -0
- package/template/.claude/skills/spec-writing/SKILL.md +110 -0
- package/template/.claude/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/template/.claude/skills/systematic-debugging/SKILL.md +297 -0
- package/template/.claude/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/template/.claude/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/template/.claude/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/template/.claude/skills/systematic-debugging/find-polluter.sh +63 -0
- package/template/.claude/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/template/.claude/skills/systematic-debugging/test-academic.md +14 -0
- package/template/.claude/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/template/.claude/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/template/.claude/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/template/.claude/skills/tdd-workflow/SKILL.md +186 -0
- package/template/.claude/skills/tdd-workflow/references/typescript.md +231 -0
- package/template/.claude/skills/tech-stack-catalog/SKILL.md +49 -0
- package/template/.claude/skills/tech-stack-catalog/references/constraint-questions.md +237 -0
- package/template/.claude/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
- package/template/.claude/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
- package/template/.claude/skills/technical-writer/SKILL.md +242 -0
- package/template/.claude/skills/testing-strategist/SKILL.md +319 -0
- package/template/.claude/skills/testing-strategist/references/typescript.md +328 -0
- package/template/.claude/skills/verification-before-completion/SKILL.md +97 -0
- package/template/.claude/skills/workflow-automation/SKILL.md +166 -0
- package/template/.claude/skills/workflow-automation/references/inngest.md +88 -0
- package/template/.claude/skills/workflow-automation/references/temporal.md +64 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# TypeScript TDD Patterns
|
|
2
|
+
|
|
3
|
+
Language-specific patterns for the `tdd-workflow` skill. Read `SKILL.md` first for universal methodology.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Test Frameworks
|
|
8
|
+
|
|
9
|
+
| Tool | Purpose |
|
|
10
|
+
|------|---------|
|
|
11
|
+
| **Jest** or **Vitest** | Unit + integration test runner |
|
|
12
|
+
| **React Testing Library** | Component testing (user-centric) |
|
|
13
|
+
| **Playwright** | E2E browser automation |
|
|
14
|
+
|
|
15
|
+
## Commands
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Run tests
|
|
19
|
+
npm test
|
|
20
|
+
|
|
21
|
+
# Watch mode
|
|
22
|
+
npm test -- --watch
|
|
23
|
+
|
|
24
|
+
# Coverage report
|
|
25
|
+
npm run test:coverage
|
|
26
|
+
|
|
27
|
+
# E2E tests
|
|
28
|
+
npx playwright test
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Unit Test Pattern (Jest/Vitest)
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import { render, screen, fireEvent } from '@testing-library/react'
|
|
35
|
+
import { Button } from './Button'
|
|
36
|
+
|
|
37
|
+
describe('Button Component', () => {
|
|
38
|
+
it('renders with correct text', () => {
|
|
39
|
+
render(<Button>Click me</Button>)
|
|
40
|
+
expect(screen.getByText('Click me')).toBeInTheDocument()
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('calls onClick when clicked', () => {
|
|
44
|
+
const handleClick = jest.fn()
|
|
45
|
+
render(<Button onClick={handleClick}>Click</Button>)
|
|
46
|
+
|
|
47
|
+
fireEvent.click(screen.getByRole('button'))
|
|
48
|
+
|
|
49
|
+
expect(handleClick).toHaveBeenCalledTimes(1)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('is disabled when disabled prop is true', () => {
|
|
53
|
+
render(<Button disabled>Click</Button>)
|
|
54
|
+
expect(screen.getByRole('button')).toBeDisabled()
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## API Integration Test Pattern
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
import { NextRequest } from 'next/server'
|
|
63
|
+
import { GET } from './route'
|
|
64
|
+
|
|
65
|
+
describe('GET /api/markets', () => {
|
|
66
|
+
it('returns markets successfully', async () => {
|
|
67
|
+
const request = new NextRequest('http://localhost/api/markets')
|
|
68
|
+
const response = await GET(request)
|
|
69
|
+
const data = await response.json()
|
|
70
|
+
|
|
71
|
+
expect(response.status).toBe(200)
|
|
72
|
+
expect(data.success).toBe(true)
|
|
73
|
+
expect(Array.isArray(data.data)).toBe(true)
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it('validates query parameters', async () => {
|
|
77
|
+
const request = new NextRequest('http://localhost/api/markets?limit=invalid')
|
|
78
|
+
const response = await GET(request)
|
|
79
|
+
|
|
80
|
+
expect(response.status).toBe(400)
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('handles database errors gracefully', async () => {
|
|
84
|
+
// Mock database failure
|
|
85
|
+
const request = new NextRequest('http://localhost/api/markets')
|
|
86
|
+
// Test error handling
|
|
87
|
+
})
|
|
88
|
+
})
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## E2E Test Pattern (Playwright)
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
import { test, expect } from '@playwright/test'
|
|
95
|
+
|
|
96
|
+
test('user can search and filter markets', async ({ page }) => {
|
|
97
|
+
await page.goto('/')
|
|
98
|
+
await page.click('a[href="/markets"]')
|
|
99
|
+
|
|
100
|
+
await expect(page.locator('h1')).toContainText('Markets')
|
|
101
|
+
|
|
102
|
+
await page.fill('input[placeholder="Search markets"]', 'election')
|
|
103
|
+
await page.waitForTimeout(600)
|
|
104
|
+
|
|
105
|
+
const results = page.locator('[data-testid="market-card"]')
|
|
106
|
+
await expect(results).toHaveCount(5, { timeout: 5000 })
|
|
107
|
+
|
|
108
|
+
const firstResult = results.first()
|
|
109
|
+
await expect(firstResult).toContainText('election', { ignoreCase: true })
|
|
110
|
+
|
|
111
|
+
await page.click('button:has-text("Active")')
|
|
112
|
+
await expect(results).toHaveCount(3)
|
|
113
|
+
})
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## File Organization
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
src/
|
|
120
|
+
├── components/
|
|
121
|
+
│ ├── Button/
|
|
122
|
+
│ │ ├── Button.tsx
|
|
123
|
+
│ │ ├── Button.test.tsx # Unit tests
|
|
124
|
+
│ │ └── Button.stories.tsx # Storybook
|
|
125
|
+
│ └── MarketCard/
|
|
126
|
+
│ ├── MarketCard.tsx
|
|
127
|
+
│ └── MarketCard.test.tsx
|
|
128
|
+
├── app/
|
|
129
|
+
│ └── api/
|
|
130
|
+
│ └── markets/
|
|
131
|
+
│ ├── route.ts
|
|
132
|
+
│ └── route.test.ts # Integration tests
|
|
133
|
+
└── e2e/
|
|
134
|
+
├── markets.spec.ts # E2E tests
|
|
135
|
+
├── trading.spec.ts
|
|
136
|
+
└── auth.spec.ts
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Mocking External Services
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
// Supabase mock
|
|
143
|
+
jest.mock('@/lib/supabase', () => ({
|
|
144
|
+
supabase: {
|
|
145
|
+
from: jest.fn(() => ({
|
|
146
|
+
select: jest.fn(() => ({
|
|
147
|
+
eq: jest.fn(() => Promise.resolve({
|
|
148
|
+
data: [{ id: 1, name: 'Test Market' }],
|
|
149
|
+
error: null
|
|
150
|
+
}))
|
|
151
|
+
}))
|
|
152
|
+
}))
|
|
153
|
+
}
|
|
154
|
+
}))
|
|
155
|
+
|
|
156
|
+
// Redis mock
|
|
157
|
+
jest.mock('@/lib/redis', () => ({
|
|
158
|
+
searchMarketsByVector: jest.fn(() => Promise.resolve([
|
|
159
|
+
{ slug: 'test-market', similarity_score: 0.95 }
|
|
160
|
+
])),
|
|
161
|
+
checkRedisHealth: jest.fn(() => Promise.resolve({ connected: true }))
|
|
162
|
+
}))
|
|
163
|
+
|
|
164
|
+
// OpenAI mock
|
|
165
|
+
jest.mock('@/lib/openai', () => ({
|
|
166
|
+
generateEmbedding: jest.fn(() => Promise.resolve(
|
|
167
|
+
new Array(1536).fill(0.1) // Mock 1536-dim embedding
|
|
168
|
+
))
|
|
169
|
+
}))
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Coverage Thresholds
|
|
173
|
+
|
|
174
|
+
```json
|
|
175
|
+
{
|
|
176
|
+
"jest": {
|
|
177
|
+
"coverageThresholds": {
|
|
178
|
+
"global": {
|
|
179
|
+
"branches": 80,
|
|
180
|
+
"functions": 80,
|
|
181
|
+
"lines": 80,
|
|
182
|
+
"statements": 80
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## CI/CD Integration
|
|
190
|
+
|
|
191
|
+
```yaml
|
|
192
|
+
# GitHub Actions
|
|
193
|
+
- name: Run Tests
|
|
194
|
+
run: npm test -- --coverage
|
|
195
|
+
- name: Upload Coverage
|
|
196
|
+
uses: codecov/codecov-action@v3
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Assertion Examples
|
|
200
|
+
|
|
201
|
+
### ❌ Shallow (BANNED)
|
|
202
|
+
```typescript
|
|
203
|
+
expect(result).toBeDefined()
|
|
204
|
+
expect(result).toBeTruthy()
|
|
205
|
+
expect(response.status).toBe(200) // alone — doesn't verify body
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### ✅ Deep (REQUIRED)
|
|
209
|
+
```typescript
|
|
210
|
+
expect(result).toEqual({
|
|
211
|
+
id: expect.any(String),
|
|
212
|
+
name: 'Test Market',
|
|
213
|
+
status: 'active',
|
|
214
|
+
trades: expect.arrayContaining([
|
|
215
|
+
expect.objectContaining({ amount: 100 })
|
|
216
|
+
])
|
|
217
|
+
})
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Selector Guidance
|
|
221
|
+
|
|
222
|
+
### ❌ Brittle
|
|
223
|
+
```typescript
|
|
224
|
+
await page.click('.css-class-xyz')
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### ✅ Semantic
|
|
228
|
+
```typescript
|
|
229
|
+
await page.click('button:has-text("Submit")')
|
|
230
|
+
await page.click('[data-testid="submit-button"]')
|
|
231
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tech-stack-catalog
|
|
3
|
+
description: "Per-surface tech stack decision tables and development tooling options. Use during /create-prd-stack to present constraint-filtered options to the user."
|
|
4
|
+
category: reference
|
|
5
|
+
risk: none
|
|
6
|
+
source: self
|
|
7
|
+
date_added: "2026-02-28"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Tech Stack Catalog
|
|
11
|
+
|
|
12
|
+
Reference tables for tech stack decisions organized by project surface type. Used by `/create-prd-stack` to present constraint-filtered options.
|
|
13
|
+
|
|
14
|
+
## When to Use This Skill
|
|
15
|
+
|
|
16
|
+
- During `/create-prd-stack` — load the decision tables for each applicable surface
|
|
17
|
+
- When adding a new surface to an existing project
|
|
18
|
+
- When evaluating tech stack alternatives
|
|
19
|
+
|
|
20
|
+
## How to Use
|
|
21
|
+
|
|
22
|
+
1. Read the project's surface classification from `docs/plans/ideation/meta/constraints.md`
|
|
23
|
+
2. Load `references/surface-decision-tables.md` for the applicable surface sections
|
|
24
|
+
3. Filter options using constraint questions before presenting
|
|
25
|
+
4. Load `references/dev-tooling-decisions.md` for development tooling
|
|
26
|
+
|
|
27
|
+
## Reference Files
|
|
28
|
+
|
|
29
|
+
| File | Contents |
|
|
30
|
+
|------|----------|
|
|
31
|
+
| `references/surface-decision-tables.md` | Universal, web, desktop, mobile, CLI, multi-surface decision axes |
|
|
32
|
+
| `references/dev-tooling-decisions.md` | Package manager, test runner, linter, type checker + bootstrap keys |
|
|
33
|
+
| `references/constraint-questions.md` | Per-axis constraint questions for filtering options |
|
|
34
|
+
|
|
35
|
+
## Option Presentation Format
|
|
36
|
+
|
|
37
|
+
For each axis, filter options using constraints, then present:
|
|
38
|
+
|
|
39
|
+
| # | Option | Strengths | Risks | Fit |
|
|
40
|
+
|---|--------|-----------|-------|-----|
|
|
41
|
+
| 1 | [Option] | ... | ... | [/5] |
|
|
42
|
+
| H | **Hybrid** | [Combine elements] | ... | [/5] |
|
|
43
|
+
|
|
44
|
+
> **Recommendation**: Based on constraints [list], **Option [N]** scores highest because [rationale].
|
|
45
|
+
|
|
46
|
+
## Related Skills
|
|
47
|
+
|
|
48
|
+
- `design-direction` — visual direction interview (runs during stack decisions)
|
|
49
|
+
- `brainstorming` — one-decision-at-a-time approach
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# Constraint Questions
|
|
2
|
+
|
|
3
|
+
Per-axis constraint questions with mandatory ideation grounding. Every axis has two tiers of questions and a citation gate.
|
|
4
|
+
|
|
5
|
+
## How to Use This File
|
|
6
|
+
|
|
7
|
+
For **each** tech stack axis:
|
|
8
|
+
|
|
9
|
+
1. **Tier 1 — Self-answer from ideation**: Answer these questions by reading the ideation files listed in the **Required Reads** column. Do NOT ask the user these questions — you already have the answers in the ideation output. Write a 3-5 bullet **Ideation Synthesis** summarizing what you found.
|
|
10
|
+
2. **Cite-or-Stop Gate**: Your Ideation Synthesis must contain ≥ 2 project-specific findings with file citations (e.g., "From `diagnostics/diagnostics-index.md`: multi-agent orchestration requires persistent task queues"). If you cannot produce 2 citations → you have not read deeply enough → **STOP** and read the deep dives and CX files before continuing.
|
|
11
|
+
3. **Tier 2 — Ask the user**: Only after passing the citation gate, ask these questions to the user. These are things only the user can answer (budget, team expertise, preferences).
|
|
12
|
+
4. **Present options**: Combine ideation synthesis + user answers to filter and score options. Your recommendation MUST cite ideation findings as supporting evidence.
|
|
13
|
+
|
|
14
|
+
> ❌ **Anti-pattern**: Presenting generic strengths/risks like "Good ecosystem support" or "Scalable" without tying them to a specific ideation finding. Every strength/risk in the option table must reference a concrete project requirement from the ideation output.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Hosting
|
|
19
|
+
|
|
20
|
+
### Required Reads
|
|
21
|
+
|
|
22
|
+
| File Pattern | What to Extract |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `meta/constraints.md` → `## Project Surfaces` | Which surfaces need hosting (web, API, desktop distribution, mobile distribution) |
|
|
25
|
+
| `meta/constraints.md` → compliance section | Data residency, regulatory requirements that constrain hosting region/provider |
|
|
26
|
+
| Every domain `{domain}-index.md` | Features requiring edge compute, real-time, WebSocket, or heavy compute |
|
|
27
|
+
| CX files (`ideation-cx.md` + domain CX) | Cross-surface data flow that affects deployment topology |
|
|
28
|
+
| Deep dives with latency or performance mentions | P95 requirements, geographic distribution needs |
|
|
29
|
+
|
|
30
|
+
### Tier 1 — Self-answer from ideation
|
|
31
|
+
|
|
32
|
+
- What surfaces need hosting and what type of hosting each requires (static, SSR, API, worker)?
|
|
33
|
+
- Are there latency-sensitive features that require edge deployment?
|
|
34
|
+
- Are there compliance or data residency constraints that limit hosting geography?
|
|
35
|
+
- Do any features require persistent connections (WebSocket, SSE) that affect hosting choice?
|
|
36
|
+
- What is the deployment topology implied by the architecture (monolith, microservices, serverless)?
|
|
37
|
+
|
|
38
|
+
### Tier 2 — Ask the user
|
|
39
|
+
|
|
40
|
+
- Is there an existing cloud provider or hosting preference?
|
|
41
|
+
- What is the monthly hosting budget ceiling?
|
|
42
|
+
- How much operational complexity is acceptable (managed vs self-hosted)?
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Database / Persistence
|
|
47
|
+
|
|
48
|
+
### Required Reads
|
|
49
|
+
|
|
50
|
+
| File Pattern | What to Extract |
|
|
51
|
+
|---|---|
|
|
52
|
+
| Every domain `{domain}-index.md` | Entity types, relationship complexity, data cardinality |
|
|
53
|
+
| Deep dives with data model mentions | Graph relationships, hierarchical data, polymorphic entities |
|
|
54
|
+
| Deep dives with search/query mentions | Full-text search, faceted search, complex query patterns |
|
|
55
|
+
| Deep dives with sync/real-time mentions | Offline-first, CRDT, conflict resolution, real-time subscriptions |
|
|
56
|
+
| CX files | Cross-domain entity ownership, shared entities, data flow direction |
|
|
57
|
+
| `meta/constraints.md` | PII fields, compliance (HIPAA/PCI/GDPR) affecting data placement |
|
|
58
|
+
|
|
59
|
+
### Tier 1 — Self-answer from ideation
|
|
60
|
+
|
|
61
|
+
- What are the primary entity types and their relationships (flat, hierarchical, graph)?
|
|
62
|
+
- Are there features requiring graph traversal (e.g., dependency chains, social connections, multi-hop queries)?
|
|
63
|
+
- Are there features requiring full-text search, vector similarity, or faceted filtering?
|
|
64
|
+
- What are the read/write patterns implied by the feature workflows (read-heavy dashboards, write-heavy logging, balanced CRUD)?
|
|
65
|
+
- Are there real-time or offline-first requirements that affect database choice?
|
|
66
|
+
- Do any entities require time-series storage (metrics, audit logs, sensor data)?
|
|
67
|
+
- What PII fields exist and what isolation boundaries are required?
|
|
68
|
+
|
|
69
|
+
### Tier 2 — Ask the user
|
|
70
|
+
|
|
71
|
+
- Is there existing database expertise or infrastructure to leverage?
|
|
72
|
+
- Are there multi-tenancy requirements the ideation didn't capture?
|
|
73
|
+
- Budget constraints for managed database services?
|
|
74
|
+
|
|
75
|
+
> **Note**: Database is handled by the Persistence Map Interview in `create-prd-stack.md`. These questions feed into that interview — they do not replace it.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Auth Provider
|
|
80
|
+
|
|
81
|
+
### Required Reads
|
|
82
|
+
|
|
83
|
+
| File Pattern | What to Extract |
|
|
84
|
+
|---|---|
|
|
85
|
+
| Every domain `{domain}-index.md` → Role Matrix | All roles, permission levels (Full/Config/Read-only/None), per-domain access |
|
|
86
|
+
| `meta/constraints.md` → compliance section | COPPA, GDPR, age restrictions, SSO requirements |
|
|
87
|
+
| Domain deep dives with access control mentions | Multi-tenant isolation, resource ownership, escalation paths |
|
|
88
|
+
| CX files | Trust boundaries across domains, cross-domain permission handoff |
|
|
89
|
+
|
|
90
|
+
### Tier 1 — Self-answer from ideation
|
|
91
|
+
|
|
92
|
+
- How many distinct roles exist and what are their permission boundaries?
|
|
93
|
+
- Is there a multi-tenant model (org-level isolation, workspace-level, etc.)?
|
|
94
|
+
- Are there age restrictions or minor-handling requirements (COPPA)?
|
|
95
|
+
- Do any features require granular resource-level permissions (ABAC) vs role-based (RBAC)?
|
|
96
|
+
- Are there third-party integration points that need OAuth/API key authentication?
|
|
97
|
+
- Does the app need social login, SSO/SAML, or enterprise federation?
|
|
98
|
+
|
|
99
|
+
### Tier 2 — Ask the user
|
|
100
|
+
|
|
101
|
+
- Is social login (Google, GitHub, Apple, etc.) required? Which providers?
|
|
102
|
+
- Is SSO/SAML needed for enterprise customers?
|
|
103
|
+
- Budget for auth provider (free tier vs paid)?
|
|
104
|
+
- Team experience with specific auth providers?
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Frontend Framework
|
|
109
|
+
|
|
110
|
+
### Required Reads
|
|
111
|
+
|
|
112
|
+
| File Pattern | What to Extract |
|
|
113
|
+
|---|---|
|
|
114
|
+
| `meta/constraints.md` → `## Project Surfaces` | Web surface type (app, content site, hybrid), SEO requirements |
|
|
115
|
+
| Every domain `{domain}-index.md` | UI complexity per domain — forms, dashboards, real-time views, interactive editors |
|
|
116
|
+
| Deep dives with UI/interaction mentions | Complex interaction patterns (drag-drop, canvas, WYSIWYG, collaborative editing) |
|
|
117
|
+
| Deep dives with real-time mentions | Live updates, WebSocket-driven UI, optimistic updates |
|
|
118
|
+
| CX files | Cross-domain navigation patterns, shared UI state requirements |
|
|
119
|
+
|
|
120
|
+
### Tier 1 — Self-answer from ideation
|
|
121
|
+
|
|
122
|
+
- Is SSR required for SEO or first-paint performance, or is this a pure SPA?
|
|
123
|
+
- How complex are the interactive patterns (simple forms vs complex editors vs canvas-based)?
|
|
124
|
+
- Are there real-time UI requirements (live dashboards, collaborative editing)?
|
|
125
|
+
- What is the page count / route complexity implied by the feature inventory?
|
|
126
|
+
- Are there offline-first or PWA requirements that affect framework choice?
|
|
127
|
+
- Does the app need to share code with other surfaces (mobile, desktop)?
|
|
128
|
+
|
|
129
|
+
### Tier 2 — Ask the user
|
|
130
|
+
|
|
131
|
+
- Team framework experience or preference?
|
|
132
|
+
- Is there an existing frontend codebase to integrate with?
|
|
133
|
+
- Performance priority: bundle size vs DX vs ecosystem maturity?
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Backend Framework / Runtime
|
|
138
|
+
|
|
139
|
+
### Required Reads
|
|
140
|
+
|
|
141
|
+
| File Pattern | What to Extract |
|
|
142
|
+
|---|---|
|
|
143
|
+
| `meta/constraints.md` → `## Project Surfaces` | Backend surface type (API-only, BFF, monolith) |
|
|
144
|
+
| Every domain `{domain}-index.md` | Feature complexity — CRUD-heavy vs computation-heavy vs orchestration-heavy |
|
|
145
|
+
| Deep dives with AI/ML mentions | AI orchestration, model serving, agent coordination |
|
|
146
|
+
| Deep dives with integration mentions | External API calls, webhook handling, queue processing |
|
|
147
|
+
| CX files | Cross-domain business logic, shared middleware requirements |
|
|
148
|
+
|
|
149
|
+
### Tier 1 — Self-answer from ideation
|
|
150
|
+
|
|
151
|
+
- What type of backend logic dominates — simple CRUD, complex business rules, AI orchestration, or data pipelines?
|
|
152
|
+
- Are there features requiring long-running processes (agents, batch jobs, async workflows)?
|
|
153
|
+
- What are the latency requirements (P95 targets from deep dives)?
|
|
154
|
+
- Is there a need for background job processing or event-driven architecture?
|
|
155
|
+
- Does the backend need to serve multiple surfaces with different protocols (REST for web, gRPC for internal)?
|
|
156
|
+
- Are there cold-start sensitivity constraints (serverless viability)?
|
|
157
|
+
|
|
158
|
+
### Tier 2 — Ask the user
|
|
159
|
+
|
|
160
|
+
- Team language/framework expertise?
|
|
161
|
+
- Deployment target preference (traditional server, serverless, edge)?
|
|
162
|
+
- Is there an existing backend to extend vs greenfield?
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## API Layer
|
|
167
|
+
|
|
168
|
+
### Required Reads
|
|
169
|
+
|
|
170
|
+
| File Pattern | What to Extract |
|
|
171
|
+
|---|---|
|
|
172
|
+
| Every domain `{domain}-index.md` | Query complexity per domain — simple lookups vs complex filtered/nested queries |
|
|
173
|
+
| Deep dives with data fetching mentions | Over-fetching risks, real-time subscription needs, batch query patterns |
|
|
174
|
+
| CX files | Cross-domain data aggregation, BFF patterns, gateway needs |
|
|
175
|
+
| `meta/constraints.md` → `## Project Surfaces` | Number of consuming surfaces (affects API style choice) |
|
|
176
|
+
|
|
177
|
+
### Tier 1 — Self-answer from ideation
|
|
178
|
+
|
|
179
|
+
- How varied are the data fetching patterns (uniform CRUD vs highly variable query shapes)?
|
|
180
|
+
- Are there features requiring real-time subscriptions?
|
|
181
|
+
- How many surfaces consume the API (affects REST vs GraphQL vs tRPC calculus)?
|
|
182
|
+
- Is there a need for API-to-API communication (microservice internal APIs)?
|
|
183
|
+
- Are there complex nested data requirements that would benefit from flexible query languages?
|
|
184
|
+
|
|
185
|
+
### Tier 2 — Ask the user
|
|
186
|
+
|
|
187
|
+
- Is the API public-facing (needs REST + OpenAPI) or internal-only (tRPC viable)?
|
|
188
|
+
- Team experience with GraphQL vs REST vs tRPC?
|
|
189
|
+
- Is API versioning a concern (breaking change frequency)?
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## CI/CD
|
|
194
|
+
|
|
195
|
+
### Required Reads
|
|
196
|
+
|
|
197
|
+
| File Pattern | What to Extract |
|
|
198
|
+
|---|---|
|
|
199
|
+
| `meta/constraints.md` → `## Project Surfaces` | Number of deployable surfaces (affects pipeline complexity) |
|
|
200
|
+
| `meta/constraints.md` → compliance section | Audit requirements, approval gates, compliance-mandated scanning |
|
|
201
|
+
|
|
202
|
+
### Tier 1 — Self-answer from ideation
|
|
203
|
+
|
|
204
|
+
- How many independently deployable artifacts exist?
|
|
205
|
+
- Are there compliance requirements mandating specific CI/CD gates (security scanning, approval workflows)?
|
|
206
|
+
- Is the project monorepo or polyrepo (affects CI/CD tooling)?
|
|
207
|
+
|
|
208
|
+
### Tier 2 — Ask the user
|
|
209
|
+
|
|
210
|
+
- Is there an existing CI/CD provider?
|
|
211
|
+
- Deployment frequency expectations (continuous vs scheduled)?
|
|
212
|
+
- Are manual approval gates needed for production deploys?
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Monitoring / Observability
|
|
217
|
+
|
|
218
|
+
### Required Reads
|
|
219
|
+
|
|
220
|
+
| File Pattern | What to Extract |
|
|
221
|
+
|---|---|
|
|
222
|
+
| Deep dives with performance/SLA mentions | Which features have SLA requirements driving alert thresholds |
|
|
223
|
+
| `meta/constraints.md` → compliance section | Audit logging requirements, log retention mandates |
|
|
224
|
+
| Every domain `{domain}-index.md` | Features with error-sensitive flows (payments, auth, data sync) |
|
|
225
|
+
|
|
226
|
+
### Tier 1 — Self-answer from ideation
|
|
227
|
+
|
|
228
|
+
- Which features are error-critical (payment flows, auth, data integrity)?
|
|
229
|
+
- Are there SLA or uptime requirements from the ideation?
|
|
230
|
+
- What audit logging is mandated by compliance?
|
|
231
|
+
- Are there features requiring distributed tracing (multi-service request paths)?
|
|
232
|
+
|
|
233
|
+
### Tier 2 — Ask the user
|
|
234
|
+
|
|
235
|
+
- Is there an existing monitoring stack?
|
|
236
|
+
- Budget for monitoring services?
|
|
237
|
+
- On-call expectations (who gets alerted)?
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Development Tooling Decisions
|
|
2
|
+
|
|
3
|
+
## Tooling axes
|
|
4
|
+
|
|
5
|
+
| Tool | Question |
|
|
6
|
+
|------|----------|
|
|
7
|
+
| **Package manager / build system** | pnpm, npm, yarn, bun, cargo, go modules, pip/poetry? |
|
|
8
|
+
| **Test runner** | Vitest, Jest, pytest, cargo test, go test, XCTest? |
|
|
9
|
+
| **Linter** | ESLint, Biome, Ruff, clippy, golangci-lint? |
|
|
10
|
+
| **Type checker** | TypeScript (tsc), mypy, Rust compiler, Go compiler? |
|
|
11
|
+
| **Build command** | What builds the project for production? |
|
|
12
|
+
|
|
13
|
+
## Bootstrap keys to fire after confirmation
|
|
14
|
+
|
|
15
|
+
After the user confirms all development tooling, fire bootstrap with `PIPELINE_STAGE=create-prd` and ALL of these keys:
|
|
16
|
+
|
|
17
|
+
- `PACKAGE_MANAGER` — the confirmed package manager (e.g., `pnpm`)
|
|
18
|
+
- `TEST_RUNNER` — the confirmed test runner (e.g., `vitest`)
|
|
19
|
+
- `LINTER` — the confirmed linter (e.g., `eslint`)
|
|
20
|
+
- `TYPE_CHECKER` — the confirmed type checker (e.g., `tsc`)
|
|
21
|
+
- `TEST_COMMAND` — derived from package manager + test runner (e.g., `pnpm test`)
|
|
22
|
+
- `TEST_WATCH_COMMAND` — derived test watch command (e.g., `pnpm test:watch`)
|
|
23
|
+
- `TEST_COVERAGE_COMMAND` — derived coverage command (e.g., `pnpm test:coverage`)
|
|
24
|
+
- `LINT_COMMAND` — derived lint command (e.g., `pnpm lint`)
|
|
25
|
+
- `LINT_FIX_COMMAND` — derived lint fix command (e.g., `pnpm lint:fix`)
|
|
26
|
+
- `FORMAT_COMMAND` — derived format command (e.g., `pnpm format`)
|
|
27
|
+
- `TYPE_CHECK_COMMAND` — derived type-check command (e.g., `pnpm type-check`)
|
|
28
|
+
- `BUILD_COMMAND` — derived build command (e.g., `pnpm build`)
|
|
29
|
+
- `VALIDATION_COMMAND` — the full validation pipeline (e.g., `pnpm test && pnpm lint && pnpm type-check && pnpm build`)
|
|
30
|
+
|
|
31
|
+
This fills command placeholders in `commands.md`, `workflow.md`, `implement-slice-tdd.md`, and `validate-phase.md`.
|
|
32
|
+
|
|
33
|
+
## Validation command derivation
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
{{BUILD_TOOL}} test && {{BUILD_TOOL}} lint && {{BUILD_TOOL}} type-check && {{BUILD_TOOL}} build
|
|
37
|
+
```
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Surface Decision Tables
|
|
2
|
+
|
|
3
|
+
## Universal decisions (all project types)
|
|
4
|
+
|
|
5
|
+
| Axis | Decision Needed |
|
|
6
|
+
|------|----------------|
|
|
7
|
+
| **Primary language(s)** | TypeScript, Rust, Go, Python, Swift, Kotlin, C++, etc. |
|
|
8
|
+
| **Database** | ⚠️ **Handled by Persistence Map Interview** in `create-prd-stack.md` — do NOT process as a single axis. Covers primary, vector, graph, cache, and time-series sub-keys. |
|
|
9
|
+
| **Auth provider** | Firebase vs Auth0 vs Clerk vs custom vs OS-level keychain |
|
|
10
|
+
| **CI/CD** | GitHub Actions vs GitLab CI vs custom |
|
|
11
|
+
| **Monitoring** | Sentry vs Datadog vs custom |
|
|
12
|
+
|
|
13
|
+
## Web surface decisions
|
|
14
|
+
|
|
15
|
+
| Axis | Decision Needed |
|
|
16
|
+
|------|----------------|
|
|
17
|
+
| **Frontend framework** | SSR vs SSG vs hybrid, which framework (Next.js, Astro, SvelteKit, etc.) |
|
|
18
|
+
| **Backend runtime** | Edge workers vs traditional server vs serverless |
|
|
19
|
+
| **Hosting** | Cloudflare vs Vercel vs AWS vs self-hosted |
|
|
20
|
+
| **CDN/Assets** | Provider-native vs S3 vs Cloudinary |
|
|
21
|
+
|
|
22
|
+
## Desktop surface decisions
|
|
23
|
+
|
|
24
|
+
| Axis | Decision Needed |
|
|
25
|
+
|------|----------------|
|
|
26
|
+
| **UI framework** | Tauri vs Electron vs native (GTK, Qt, SwiftUI, WPF, WinUI) |
|
|
27
|
+
| **Cross-platform strategy** | Single OS, cross-platform with shared UI (Tauri, Electron, Flutter Desktop), or cross-platform with native UI per OS |
|
|
28
|
+
| **Local data storage** | SQLite vs LevelDB vs filesystem vs embedded DB (RocksDB, etc.) |
|
|
29
|
+
| **Distribution** | Installer type (MSI, DMG, AppImage, Flatpak), auto-updater strategy (Sparkle, squirrel, custom) |
|
|
30
|
+
| **OS targets** | Windows, macOS, Linux — which combinations and minimum versions? |
|
|
31
|
+
|
|
32
|
+
## Mobile surface decisions
|
|
33
|
+
|
|
34
|
+
| Axis | Decision Needed |
|
|
35
|
+
|------|----------------|
|
|
36
|
+
| **Framework** | Native per-platform (Swift/Kotlin) vs cross-platform (React Native, Flutter, .NET MAUI, Kotlin Multiplatform) |
|
|
37
|
+
| **Cross-platform strategy** | iOS-only, Android-only, or both? Shared codebase or separate? |
|
|
38
|
+
| **Local data storage** | SQLite, Realm, Core Data, Room |
|
|
39
|
+
| **Distribution** | App Store, Play Store, enterprise sideload, TestFlight/Firebase App Distribution |
|
|
40
|
+
| **OS targets** | iOS minimum version, Android minimum API level |
|
|
41
|
+
|
|
42
|
+
## Desktop + Mobile shared decisions
|
|
43
|
+
|
|
44
|
+
Some frameworks support building for **both** desktop and mobile from one codebase. If the vision indicates this is desired:
|
|
45
|
+
|
|
46
|
+
| Axis | Decision Needed |
|
|
47
|
+
|------|----------------|
|
|
48
|
+
| **Shared framework** | Flutter (desktop + mobile + web), Kotlin Multiplatform, .NET MAUI, Compose Multiplatform |
|
|
49
|
+
| **Shared vs platform-specific UI** | Fully shared UI, shared logic with native UI per platform, or hybrid? |
|
|
50
|
+
| **Platform-specific features** | What functionality requires native code per platform? (file system, notifications, hardware access) |
|
|
51
|
+
|
|
52
|
+
## CLI surface decisions
|
|
53
|
+
|
|
54
|
+
| Axis | Decision Needed |
|
|
55
|
+
|------|----------------|
|
|
56
|
+
| **Language** | Rust (clap), Go (cobra), Python (click/typer), Node (commander/yargs) |
|
|
57
|
+
| **Distribution** | npm, cargo, homebrew, apt, binary releases (goreleaser, cross) |
|
|
58
|
+
| **Shell integration** | Tab completions, man pages, config file format (TOML, YAML, JSON) |
|
|
59
|
+
|
|
60
|
+
## Multi-surface connection decisions (2+ connected surfaces)
|
|
61
|
+
|
|
62
|
+
| Axis | Decision Needed |
|
|
63
|
+
|------|----------------|
|
|
64
|
+
| **Shared API protocol** | REST vs gRPC vs GraphQL vs WebSocket between surfaces |
|
|
65
|
+
| **Sync strategy** | Real-time (WebSocket/SSE), eventual consistency (message queue), batch (cron), offline-first (CRDT/merge) |
|
|
66
|
+
| **Shared contract layer** | How are data shapes shared? Monorepo with shared package? Published npm/crate package? Code generation from OpenAPI/protobuf? |
|
|
67
|
+
| **Auth federation** | Shared auth server with SSO? OAuth2 token exchange? Separate auth per surface? |
|
|
68
|
+
| **Conflict resolution** | Last-write-wins, operational transform, CRDT, manual resolution, server-authoritative |
|
|
69
|
+
| **Offline support** | Which surfaces work offline? What data is cached locally? How are conflicts resolved on reconnect? |
|