@soleri/core 9.14.0 → 9.14.4
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/dist/skills/sync-skills.d.ts.map +1 -1
- package/dist/skills/sync-skills.js +9 -3
- package/dist/skills/sync-skills.js.map +1 -1
- package/package.json +2 -2
- package/src/skills/sync-skills.ts +9 -3
- package/dist/knowledge-packs/knowledge-packs/community/.gitkeep +0 -0
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/accessibility.json +0 -53
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/design-tokens.json +0 -26
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/design.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/styling.json +0 -44
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/ux-laws.json +0 -36
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/ux.json +0 -36
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/architecture.json +0 -143
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/commercial.json +0 -16
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/communication.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/component.json +0 -16
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/express.json +0 -34
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/leadership.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/methodology.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/monorepo.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/other.json +0 -73
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/performance.json +0 -35
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/prisma.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/product-strategy.json +0 -42
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/react.json +0 -47
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/security.json +0 -34
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/testing.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/tooling.json +0 -85
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/typescript.json +0 -34
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/workflow.json +0 -46
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-uipro/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-uipro/vault/design.json +0 -2589
- package/dist/knowledge-packs/knowledge-packs/starter/architecture/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/starter/architecture/vault/patterns.json +0 -137
- package/dist/knowledge-packs/knowledge-packs/starter/design/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/starter/design/vault/patterns.json +0 -137
- package/dist/knowledge-packs/knowledge-packs/starter/security/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/starter/security/vault/patterns.json +0 -137
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/api-design/soleri-pack.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/api-design/vault/patterns.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/nodejs/soleri-pack.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/nodejs/vault/patterns.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/react/soleri-pack.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/react/vault/patterns.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/testing/soleri-pack.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/testing/vault/patterns.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/typescript/soleri-pack.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/typescript/vault/patterns.json +0 -0
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "starter-architecture",
|
|
3
|
-
"name": "Architecture Starter Pack",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "Clean architecture, DDD patterns, API design, error handling — foundational architecture patterns and anti-patterns.",
|
|
6
|
-
"domains": ["architecture"],
|
|
7
|
-
"vault": {
|
|
8
|
-
"dir": "vault"
|
|
9
|
-
}
|
|
10
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "arch-001",
|
|
4
|
-
"type": "pattern",
|
|
5
|
-
"domain": "architecture",
|
|
6
|
-
"title": "Dependency Inversion via Interfaces",
|
|
7
|
-
"description": "High-level modules should not depend on low-level modules. Both should depend on abstractions. Define interfaces for external dependencies (databases, APIs, file systems) and inject implementations. This enables testing and swapping implementations without changing business logic.",
|
|
8
|
-
"severity": "warning",
|
|
9
|
-
"tags": ["solid", "dependency-injection", "clean-architecture"]
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"id": "arch-002",
|
|
13
|
-
"type": "pattern",
|
|
14
|
-
"domain": "architecture",
|
|
15
|
-
"title": "Error Boundaries at Layer Edges",
|
|
16
|
-
"description": "Catch and translate errors at the boundary between architectural layers. Database errors become domain errors. HTTP errors become user-facing messages. Each layer speaks its own error language. Never let implementation details leak through error messages.",
|
|
17
|
-
"severity": "warning",
|
|
18
|
-
"tags": ["error-handling", "layers", "boundaries"]
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"id": "arch-003",
|
|
22
|
-
"type": "pattern",
|
|
23
|
-
"domain": "architecture",
|
|
24
|
-
"title": "Command Query Separation",
|
|
25
|
-
"description": "Functions should either change state (command) or return data (query), never both. Commands return void or a simple status. Queries are side-effect free. This makes code predictable, testable, and easier to reason about.",
|
|
26
|
-
"severity": "suggestion",
|
|
27
|
-
"tags": ["cqs", "clean-code", "functional"]
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"id": "arch-004",
|
|
31
|
-
"type": "pattern",
|
|
32
|
-
"domain": "architecture",
|
|
33
|
-
"title": "Idempotent Operations",
|
|
34
|
-
"description": "Design operations to be safely retryable. Use unique request IDs for deduplication. Make database writes idempotent with UPSERT or conditional INSERT. This is critical for distributed systems where network failures cause retries.",
|
|
35
|
-
"severity": "warning",
|
|
36
|
-
"tags": ["idempotency", "distributed-systems", "reliability"]
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"id": "arch-005",
|
|
40
|
-
"type": "pattern",
|
|
41
|
-
"domain": "architecture",
|
|
42
|
-
"title": "Graceful Degradation",
|
|
43
|
-
"description": "When an external dependency fails, degrade gracefully instead of crashing. Return cached data, empty results, or reduced functionality. Log the failure for monitoring. The system should remain useful even when parts are down.",
|
|
44
|
-
"severity": "warning",
|
|
45
|
-
"tags": ["resilience", "fault-tolerance", "reliability"]
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"id": "arch-006",
|
|
49
|
-
"type": "pattern",
|
|
50
|
-
"domain": "architecture",
|
|
51
|
-
"title": "Configuration as Data",
|
|
52
|
-
"description": "Express variation through configuration, not code branches. Feature flags, policy objects, and declarative config files are easier to audit, test, and change than if/else chains. Logic in config, not code.",
|
|
53
|
-
"severity": "suggestion",
|
|
54
|
-
"tags": ["configuration", "data-driven", "clean-code"]
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"id": "arch-007",
|
|
58
|
-
"type": "pattern",
|
|
59
|
-
"domain": "architecture",
|
|
60
|
-
"title": "Reversible Migrations",
|
|
61
|
-
"description": "Every database migration must have a corresponding rollback. Test both up and down paths. Prefer additive changes (add column, add table) over destructive ones (drop column, rename). Make breaking schema changes in multiple steps: add new → migrate data → remove old.",
|
|
62
|
-
"severity": "warning",
|
|
63
|
-
"tags": ["database", "migrations", "schema"]
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"id": "arch-008",
|
|
67
|
-
"type": "anti-pattern",
|
|
68
|
-
"domain": "architecture",
|
|
69
|
-
"title": "God Object",
|
|
70
|
-
"description": "Avoid classes or modules that know too much or do too much. A 2000-line service class with 30 methods violates single responsibility. Split by cohesion: group related data and behavior together. If a change to feature A requires modifying the same file as feature B, they should be separate modules.",
|
|
71
|
-
"severity": "warning",
|
|
72
|
-
"tags": ["solid", "cohesion", "refactoring"]
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
"id": "arch-009",
|
|
76
|
-
"type": "anti-pattern",
|
|
77
|
-
"domain": "architecture",
|
|
78
|
-
"title": "Premature Abstraction",
|
|
79
|
-
"description": "Don't abstract before you have three concrete examples of the same pattern. One-off helpers and single-use base classes add indirection without value. Wait for the pattern to emerge from real usage, then extract. Three similar lines are better than a premature abstraction.",
|
|
80
|
-
"severity": "suggestion",
|
|
81
|
-
"tags": ["abstraction", "yagni", "clean-code"]
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"id": "arch-010",
|
|
85
|
-
"type": "anti-pattern",
|
|
86
|
-
"domain": "architecture",
|
|
87
|
-
"title": "Circular Dependencies",
|
|
88
|
-
"description": "When module A imports B and B imports A, you have a circular dependency. This signals tangled responsibilities and makes code hard to test and refactor. Fix by extracting shared types into a third module, or inverting the dependency with an interface.",
|
|
89
|
-
"severity": "warning",
|
|
90
|
-
"tags": ["dependencies", "coupling", "modules"]
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
"id": "arch-011",
|
|
94
|
-
"type": "pattern",
|
|
95
|
-
"domain": "architecture",
|
|
96
|
-
"title": "API Versioning Strategy",
|
|
97
|
-
"description": "Version APIs from day one using URL path (/v1/) or headers. Never break existing consumers. Deprecate old versions with sunset dates. New versions can change behavior; existing versions are frozen. Document breaking changes in changelogs.",
|
|
98
|
-
"severity": "warning",
|
|
99
|
-
"tags": ["api-design", "versioning", "backwards-compatibility"]
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
"id": "arch-012",
|
|
103
|
-
"type": "anti-pattern",
|
|
104
|
-
"domain": "architecture",
|
|
105
|
-
"title": "Shared Mutable State Without Synchronization",
|
|
106
|
-
"description": "Accessing shared mutable state from multiple concurrent contexts (threads, async operations, workers) without synchronization leads to race conditions. Use immutable data structures, message passing, or explicit synchronization primitives.",
|
|
107
|
-
"severity": "critical",
|
|
108
|
-
"tags": ["concurrency", "race-conditions", "state"]
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
"id": "arch-013",
|
|
112
|
-
"type": "rule",
|
|
113
|
-
"domain": "architecture",
|
|
114
|
-
"title": "Validate at System Boundaries Only",
|
|
115
|
-
"description": "Validate input at the edge of your system (HTTP handlers, CLI parsers, message consumers). Internal functions trust their callers. This avoids redundant validation scattered throughout the codebase and keeps business logic clean.",
|
|
116
|
-
"severity": "suggestion",
|
|
117
|
-
"tags": ["validation", "boundaries", "clean-code"]
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
"id": "arch-014",
|
|
121
|
-
"type": "pattern",
|
|
122
|
-
"domain": "architecture",
|
|
123
|
-
"title": "Repository Pattern for Data Access",
|
|
124
|
-
"description": "Encapsulate data access behind a repository interface. The repository exposes domain-oriented methods (findByEmail, listActive) instead of raw queries. This decouples business logic from storage implementation and makes testing trivial with in-memory implementations.",
|
|
125
|
-
"severity": "suggestion",
|
|
126
|
-
"tags": ["repository", "data-access", "clean-architecture"]
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
"id": "arch-015",
|
|
130
|
-
"type": "anti-pattern",
|
|
131
|
-
"domain": "architecture",
|
|
132
|
-
"title": "Feature Flags as Permanent Conditionals",
|
|
133
|
-
"description": "Feature flags are temporary. If a flag has been active for more than one release cycle, either remove the old path or make the new behavior permanent. Accumulated flags create combinatorial complexity that is impossible to test exhaustively.",
|
|
134
|
-
"severity": "suggestion",
|
|
135
|
-
"tags": ["feature-flags", "technical-debt", "complexity"]
|
|
136
|
-
}
|
|
137
|
-
]
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "starter-design",
|
|
3
|
-
"name": "Frontend & Design Starter Pack",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "React patterns, accessibility, performance, component composition — essential frontend and UI design patterns.",
|
|
6
|
-
"domains": ["frontend", "accessibility"],
|
|
7
|
-
"vault": {
|
|
8
|
-
"dir": "vault"
|
|
9
|
-
}
|
|
10
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "fe-001",
|
|
4
|
-
"type": "pattern",
|
|
5
|
-
"domain": "frontend",
|
|
6
|
-
"title": "Composition Over Inheritance in Components",
|
|
7
|
-
"description": "Build components by composing smaller, focused pieces rather than extending base components. Use children, render props, or slots for flexibility. A Card component with CardHeader, CardBody, CardFooter slots is more reusable than a monolithic Card with 15 props.",
|
|
8
|
-
"severity": "warning",
|
|
9
|
-
"tags": ["react", "composition", "components"]
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"id": "fe-002",
|
|
13
|
-
"type": "pattern",
|
|
14
|
-
"domain": "frontend",
|
|
15
|
-
"title": "Controlled Components for Forms",
|
|
16
|
-
"description": "Prefer controlled components (state-driven) over uncontrolled (DOM-driven) for form inputs. This gives you validation on every keystroke, conditional rendering, and predictable state. Use uncontrolled only for simple, isolated forms where performance is critical.",
|
|
17
|
-
"severity": "suggestion",
|
|
18
|
-
"tags": ["react", "forms", "state"]
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"id": "fe-003",
|
|
22
|
-
"type": "pattern",
|
|
23
|
-
"domain": "frontend",
|
|
24
|
-
"title": "Semantic HTML Before ARIA",
|
|
25
|
-
"description": "Use native HTML elements for their intended purpose before reaching for ARIA attributes. A <button> is better than a <div role='button'>. A <nav> is better than <div aria-label='navigation'>. Native elements get keyboard handling, focus management, and screen reader support for free.",
|
|
26
|
-
"severity": "warning",
|
|
27
|
-
"tags": ["accessibility", "html", "aria", "wcag"]
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"id": "fe-004",
|
|
31
|
-
"type": "pattern",
|
|
32
|
-
"domain": "frontend",
|
|
33
|
-
"title": "Error Boundaries for Resilient UI",
|
|
34
|
-
"description": "Wrap major UI sections in error boundaries so a crash in one component doesn't take down the entire page. Show a meaningful fallback UI with a retry option. Log errors to your monitoring service. Place boundaries at route level and around third-party components.",
|
|
35
|
-
"severity": "warning",
|
|
36
|
-
"tags": ["react", "error-handling", "resilience"]
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"id": "fe-005",
|
|
40
|
-
"type": "pattern",
|
|
41
|
-
"domain": "frontend",
|
|
42
|
-
"title": "Lazy Loading for Route-Level Code Splitting",
|
|
43
|
-
"description": "Use dynamic imports (React.lazy, import()) for route-level components. This reduces initial bundle size and improves first paint. Combine with Suspense for loading states. Only eagerly load the routes users are most likely to visit first.",
|
|
44
|
-
"severity": "suggestion",
|
|
45
|
-
"tags": ["performance", "code-splitting", "react"]
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"id": "fe-006",
|
|
49
|
-
"type": "pattern",
|
|
50
|
-
"domain": "accessibility",
|
|
51
|
-
"title": "Focus Management on Navigation",
|
|
52
|
-
"description": "When the user navigates to a new page or opens a modal, move focus to the appropriate element. After route change, focus the main heading or skip-to-content link. In modals, trap focus within the modal and restore it on close.",
|
|
53
|
-
"severity": "warning",
|
|
54
|
-
"tags": ["accessibility", "focus", "keyboard", "wcag"]
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"id": "fe-007",
|
|
58
|
-
"type": "pattern",
|
|
59
|
-
"domain": "accessibility",
|
|
60
|
-
"title": "Color Contrast Minimum 4.5:1",
|
|
61
|
-
"description": "Ensure text has at least 4.5:1 contrast ratio against its background (WCAG AA). Large text (18px+ bold or 24px+ regular) needs 3:1 minimum. Use semantic design tokens that guarantee compliant pairs. Test with a contrast checker tool.",
|
|
62
|
-
"severity": "warning",
|
|
63
|
-
"tags": ["accessibility", "contrast", "wcag", "design-tokens"]
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"id": "fe-008",
|
|
67
|
-
"type": "anti-pattern",
|
|
68
|
-
"domain": "frontend",
|
|
69
|
-
"title": "Prop Drilling Through Many Layers",
|
|
70
|
-
"description": "Passing props through 3+ intermediate components that don't use them is prop drilling. It creates tight coupling and makes refactoring painful. Use React Context for truly global state, or component composition (passing children) to reduce nesting depth.",
|
|
71
|
-
"severity": "suggestion",
|
|
72
|
-
"tags": ["react", "state", "composition"]
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
"id": "fe-009",
|
|
76
|
-
"type": "anti-pattern",
|
|
77
|
-
"domain": "frontend",
|
|
78
|
-
"title": "Inline Styles Over Design Tokens",
|
|
79
|
-
"description": "Don't use inline styles or raw hex colors in components. They bypass the design system, create inconsistency, and make theming impossible. Use semantic tokens (bg-surface, text-primary) that resolve to values through the token system.",
|
|
80
|
-
"severity": "warning",
|
|
81
|
-
"tags": ["design-tokens", "css", "consistency"]
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"id": "fe-010",
|
|
85
|
-
"type": "anti-pattern",
|
|
86
|
-
"domain": "frontend",
|
|
87
|
-
"title": "useEffect for Derived State",
|
|
88
|
-
"description": "Don't use useEffect to sync state that can be computed from other state. If fullName = firstName + lastName, compute it during render, not in an effect. Effects for derived state cause extra re-renders and race conditions. Use useMemo for expensive computations.",
|
|
89
|
-
"severity": "warning",
|
|
90
|
-
"tags": ["react", "hooks", "performance"]
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
"id": "fe-011",
|
|
94
|
-
"type": "pattern",
|
|
95
|
-
"domain": "frontend",
|
|
96
|
-
"title": "Optimistic UI Updates",
|
|
97
|
-
"description": "Update the UI immediately on user action before the server confirms. Show the expected outcome with a subtle loading indicator. Roll back on error with a toast notification. This makes the app feel instant even on slow connections.",
|
|
98
|
-
"severity": "suggestion",
|
|
99
|
-
"tags": ["ux", "performance", "state"]
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
"id": "fe-012",
|
|
103
|
-
"type": "anti-pattern",
|
|
104
|
-
"domain": "accessibility",
|
|
105
|
-
"title": "Click Handlers on Non-Interactive Elements",
|
|
106
|
-
"description": "Don't add onClick to divs or spans without also adding role='button', tabIndex=0, and keyboard event handlers. Screen readers and keyboard users can't interact with these elements. Use a <button> element instead — it handles all of this natively.",
|
|
107
|
-
"severity": "warning",
|
|
108
|
-
"tags": ["accessibility", "keyboard", "html", "wcag"]
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
"id": "fe-013",
|
|
112
|
-
"type": "pattern",
|
|
113
|
-
"domain": "frontend",
|
|
114
|
-
"title": "Skeleton Loading States",
|
|
115
|
-
"description": "Show skeleton placeholders that match the layout of the content being loaded. This reduces perceived load time and prevents layout shift. Use CSS animations for shimmer effects. Skeletons are better than spinners for content-heavy pages.",
|
|
116
|
-
"severity": "suggestion",
|
|
117
|
-
"tags": ["ux", "performance", "loading"]
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
"id": "fe-014",
|
|
121
|
-
"type": "rule",
|
|
122
|
-
"domain": "accessibility",
|
|
123
|
-
"title": "Every Interactive Element Must Be Keyboard Accessible",
|
|
124
|
-
"description": "Every element that can be clicked must also be reachable and operable via keyboard. This means focusable (tabindex or native element), visible focus indicator (focus-visible ring), and keyboard activation (Enter/Space for buttons, Enter for links).",
|
|
125
|
-
"severity": "critical",
|
|
126
|
-
"tags": ["accessibility", "keyboard", "wcag"]
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
"id": "fe-015",
|
|
130
|
-
"type": "anti-pattern",
|
|
131
|
-
"domain": "frontend",
|
|
132
|
-
"title": "Boolean Prop Explosion",
|
|
133
|
-
"description": "Avoid components with many boolean props like isPrimary, isOutlined, isSmall, isDisabled. Use a variant prop with explicit values instead: variant='primary' | 'outlined' | 'ghost'. This prevents impossible states (isPrimary && isOutlined) and is self-documenting.",
|
|
134
|
-
"severity": "suggestion",
|
|
135
|
-
"tags": ["react", "api-design", "components"]
|
|
136
|
-
}
|
|
137
|
-
]
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "starter-security",
|
|
3
|
-
"name": "Security Starter Pack",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "OWASP Top 10, auth patterns, input validation, secrets management — essential security patterns and anti-patterns for any codebase.",
|
|
6
|
-
"domains": ["security"],
|
|
7
|
-
"vault": {
|
|
8
|
-
"dir": "vault"
|
|
9
|
-
}
|
|
10
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "sec-001",
|
|
4
|
-
"type": "pattern",
|
|
5
|
-
"domain": "security",
|
|
6
|
-
"title": "Parameterized Queries",
|
|
7
|
-
"description": "Always use parameterized queries or prepared statements for database access. Never concatenate user input into SQL strings. This prevents SQL injection, the most common and most dangerous web vulnerability.",
|
|
8
|
-
"severity": "critical",
|
|
9
|
-
"tags": ["sql-injection", "owasp", "database"]
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"id": "sec-002",
|
|
13
|
-
"type": "pattern",
|
|
14
|
-
"domain": "security",
|
|
15
|
-
"title": "Input Validation at System Boundaries",
|
|
16
|
-
"description": "Validate and sanitize all input at system boundaries: HTTP handlers, CLI args, file readers, message consumers. Use allowlists over denylists. Validate type, length, format, and range. Reject early, fail loudly.",
|
|
17
|
-
"severity": "critical",
|
|
18
|
-
"tags": ["input-validation", "owasp", "boundaries"]
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"id": "sec-003",
|
|
22
|
-
"type": "pattern",
|
|
23
|
-
"domain": "security",
|
|
24
|
-
"title": "Secrets in Environment Variables",
|
|
25
|
-
"description": "Store secrets (API keys, database passwords, tokens) in environment variables or a secrets manager. Never store them in source code, config files committed to git, or client-side bundles. Use .env files locally with .gitignore protection.",
|
|
26
|
-
"severity": "critical",
|
|
27
|
-
"tags": ["secrets", "configuration", "environment"]
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"id": "sec-004",
|
|
31
|
-
"type": "pattern",
|
|
32
|
-
"domain": "security",
|
|
33
|
-
"title": "Principle of Least Privilege",
|
|
34
|
-
"description": "Grant the minimum permissions necessary for each component, service, or user. Database connections should use read-only credentials when writes are not needed. API tokens should be scoped to required operations only.",
|
|
35
|
-
"severity": "warning",
|
|
36
|
-
"tags": ["access-control", "permissions", "zero-trust"]
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"id": "sec-005",
|
|
40
|
-
"type": "pattern",
|
|
41
|
-
"domain": "security",
|
|
42
|
-
"title": "CSRF Protection with Tokens",
|
|
43
|
-
"description": "Protect state-changing endpoints with CSRF tokens. Use the synchronizer token pattern or double-submit cookie. SameSite cookie attributes provide defense-in-depth but are not sufficient alone.",
|
|
44
|
-
"severity": "warning",
|
|
45
|
-
"tags": ["csrf", "owasp", "cookies"]
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"id": "sec-006",
|
|
49
|
-
"type": "pattern",
|
|
50
|
-
"domain": "security",
|
|
51
|
-
"title": "Content Security Policy Headers",
|
|
52
|
-
"description": "Set Content-Security-Policy headers to prevent XSS by controlling which scripts, styles, and resources can load. Start with a strict policy and relax as needed. Avoid unsafe-inline and unsafe-eval directives.",
|
|
53
|
-
"severity": "warning",
|
|
54
|
-
"tags": ["xss", "csp", "headers", "owasp"]
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"id": "sec-007",
|
|
58
|
-
"type": "pattern",
|
|
59
|
-
"domain": "security",
|
|
60
|
-
"title": "Rate Limiting on Authentication Endpoints",
|
|
61
|
-
"description": "Apply rate limiting to login, password reset, and registration endpoints. Use exponential backoff or sliding window algorithms. Lock accounts after repeated failures. This prevents brute-force and credential stuffing attacks.",
|
|
62
|
-
"severity": "warning",
|
|
63
|
-
"tags": ["authentication", "rate-limiting", "brute-force"]
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"id": "sec-008",
|
|
67
|
-
"type": "anti-pattern",
|
|
68
|
-
"domain": "security",
|
|
69
|
-
"title": "Hardcoded Credentials",
|
|
70
|
-
"description": "Never hardcode passwords, API keys, or tokens in source code. They end up in version control, logs, and error messages. Use environment variables or a secrets manager instead.",
|
|
71
|
-
"severity": "critical",
|
|
72
|
-
"tags": ["secrets", "credentials", "owasp"]
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
"id": "sec-009",
|
|
76
|
-
"type": "anti-pattern",
|
|
77
|
-
"domain": "security",
|
|
78
|
-
"title": "Rolling Your Own Crypto",
|
|
79
|
-
"description": "Never implement custom encryption, hashing, or token generation. Use well-tested libraries: bcrypt or argon2 for passwords, AES-256-GCM for encryption, crypto.randomUUID() for tokens. Custom crypto has subtle flaws that attackers exploit.",
|
|
80
|
-
"severity": "critical",
|
|
81
|
-
"tags": ["cryptography", "hashing", "encryption"]
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"id": "sec-010",
|
|
85
|
-
"type": "anti-pattern",
|
|
86
|
-
"domain": "security",
|
|
87
|
-
"title": "Verbose Error Messages in Production",
|
|
88
|
-
"description": "Do not expose stack traces, SQL queries, or internal paths in production error responses. Return generic error messages to users and log details server-side. Information disclosure helps attackers map your system.",
|
|
89
|
-
"severity": "warning",
|
|
90
|
-
"tags": ["error-handling", "information-disclosure", "owasp"]
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
"id": "sec-011",
|
|
94
|
-
"type": "anti-pattern",
|
|
95
|
-
"domain": "security",
|
|
96
|
-
"title": "Disabling SSL Certificate Verification",
|
|
97
|
-
"description": "Never disable TLS certificate verification in production. This opens the door to man-in-the-middle attacks. Fix certificate issues at the source: install proper CA certificates, use correct hostnames.",
|
|
98
|
-
"severity": "critical",
|
|
99
|
-
"tags": ["tls", "ssl", "mitm"]
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
"id": "sec-012",
|
|
103
|
-
"type": "rule",
|
|
104
|
-
"domain": "security",
|
|
105
|
-
"title": "Dependency Audit on Every PR",
|
|
106
|
-
"description": "Run npm audit or equivalent on every pull request. Block merges with known critical vulnerabilities. Keep dependencies updated since most breaches exploit known vulnerabilities in outdated packages.",
|
|
107
|
-
"severity": "warning",
|
|
108
|
-
"tags": ["dependencies", "supply-chain", "ci-cd"]
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
"id": "sec-013",
|
|
112
|
-
"type": "pattern",
|
|
113
|
-
"domain": "security",
|
|
114
|
-
"title": "Output Encoding for XSS Prevention",
|
|
115
|
-
"description": "Encode output based on context: HTML entity encoding for HTML body, JavaScript encoding for script contexts, URL encoding for URL parameters. Use framework auto-escaping (React JSX, template engines) and avoid injecting raw HTML.",
|
|
116
|
-
"severity": "critical",
|
|
117
|
-
"tags": ["xss", "encoding", "owasp"]
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
"id": "sec-014",
|
|
121
|
-
"type": "pattern",
|
|
122
|
-
"domain": "security",
|
|
123
|
-
"title": "Secure Session Management",
|
|
124
|
-
"description": "Use HttpOnly, Secure, and SameSite flags on session cookies. Regenerate session IDs after authentication. Set appropriate expiration. Store sessions server-side with cryptographically random identifiers.",
|
|
125
|
-
"severity": "warning",
|
|
126
|
-
"tags": ["sessions", "cookies", "authentication"]
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
"id": "sec-015",
|
|
130
|
-
"type": "anti-pattern",
|
|
131
|
-
"domain": "security",
|
|
132
|
-
"title": "JWT Stored in localStorage",
|
|
133
|
-
"description": "Do not store JWTs or sensitive tokens in localStorage because it is accessible to any JavaScript on the page, making XSS attacks devastating. Use HttpOnly cookies instead, or store in memory with refresh token rotation.",
|
|
134
|
-
"severity": "warning",
|
|
135
|
-
"tags": ["jwt", "xss", "storage", "authentication"]
|
|
136
|
-
}
|
|
137
|
-
]
|
/package/dist/knowledge-packs/{knowledge-packs/starter → starter}/api-design/soleri-pack.json
RENAMED
|
File without changes
|
/package/dist/knowledge-packs/{knowledge-packs/starter → starter}/api-design/vault/patterns.json
RENAMED
|
File without changes
|
|
File without changes
|
/package/dist/knowledge-packs/{knowledge-packs/starter → starter}/nodejs/vault/patterns.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/knowledge-packs/{knowledge-packs/starter → starter}/testing/vault/patterns.json
RENAMED
|
File without changes
|
/package/dist/knowledge-packs/{knowledge-packs/starter → starter}/typescript/soleri-pack.json
RENAMED
|
File without changes
|
/package/dist/knowledge-packs/{knowledge-packs/starter → starter}/typescript/vault/patterns.json
RENAMED
|
File without changes
|