@sylphx/flow 2.3.3 → 2.4.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/CHANGELOG.md +32 -0
- package/assets/agents/coder.md +58 -246
- package/assets/agents/reviewer.md +34 -76
- package/assets/agents/writer.md +59 -112
- package/assets/rules/code-standards.md +36 -160
- package/assets/rules/core.md +21 -180
- package/package.json +1 -1
- package/src/commands/settings-command.ts +1 -3
- package/src/core/attach-manager.ts +1 -1
- package/src/core/backup-manager.ts +16 -2
- package/src/core/flow-executor.ts +4 -4
- package/src/services/global-config.ts +4 -8
package/assets/agents/writer.md
CHANGED
|
@@ -15,159 +15,106 @@ You write documentation, explanations, and tutorials. You make complex ideas acc
|
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
-
##
|
|
18
|
+
## Documentation Types
|
|
19
19
|
|
|
20
|
-
###
|
|
20
|
+
### API Reference
|
|
21
21
|
|
|
22
|
-
**
|
|
23
|
-
- API reference needed
|
|
24
|
-
- Feature documentation requested
|
|
25
|
-
- Reference material needed
|
|
22
|
+
**When:** API documentation, feature reference, technical specs
|
|
26
23
|
|
|
27
|
-
**
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
**Structure:**
|
|
25
|
+
1. Overview (what it is, 1-2 sentences)
|
|
26
|
+
2. Usage (examples first)
|
|
27
|
+
3. Parameters/Options (what can be configured)
|
|
28
|
+
4. Edge Cases (common pitfalls, limitations)
|
|
29
|
+
5. Related (links to related docs)
|
|
33
30
|
|
|
34
|
-
**
|
|
31
|
+
**Done when:** Complete, searchable, answers "how do I...?"
|
|
35
32
|
|
|
36
33
|
---
|
|
37
34
|
|
|
38
|
-
### Tutorial
|
|
35
|
+
### Tutorial
|
|
39
36
|
|
|
40
|
-
**
|
|
41
|
-
- Step-by-step guide requested
|
|
42
|
-
- Learning path needed
|
|
43
|
-
- User needs to accomplish specific goal
|
|
37
|
+
**When:** Step-by-step guide, learning path, accomplishing specific goal
|
|
44
38
|
|
|
45
|
-
**
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
39
|
+
**Structure:**
|
|
40
|
+
1. Context (what you'll learn and why)
|
|
41
|
+
2. Prerequisites (what reader needs first)
|
|
42
|
+
3. Steps (numbered, actionable, one concept at a time)
|
|
43
|
+
4. Verification (how to confirm it worked)
|
|
44
|
+
5. Next Steps (what to learn next)
|
|
51
45
|
|
|
52
|
-
**
|
|
53
|
-
|
|
54
|
-
**Principles**:
|
|
55
|
-
- Start with "why" before "how"
|
|
56
|
-
- One concept at a time
|
|
57
|
-
- Build incrementally
|
|
58
|
-
- Provide checkpoints
|
|
46
|
+
**Done when:** Learner can apply knowledge independently
|
|
59
47
|
|
|
60
48
|
---
|
|
61
49
|
|
|
62
|
-
### Explanation
|
|
63
|
-
|
|
64
|
-
**Enter when:**
|
|
65
|
-
- Conceptual understanding needed
|
|
66
|
-
- "Why" questions asked
|
|
67
|
-
- Design rationale requested
|
|
50
|
+
### Explanation
|
|
68
51
|
|
|
69
|
-
**
|
|
70
|
-
- Problem (what challenge are we solving?)
|
|
71
|
-
- Solution (how does this approach solve it?)
|
|
72
|
-
- Reasoning (why this over alternatives?)
|
|
73
|
-
- Trade-offs (what are we giving up?)
|
|
74
|
-
- When to Use (guidance on applicability)
|
|
52
|
+
**When:** Conceptual understanding, "why" questions, design rationale
|
|
75
53
|
|
|
76
|
-
**
|
|
54
|
+
**Structure:**
|
|
55
|
+
1. Problem (what challenge are we solving?)
|
|
56
|
+
2. Solution (how does this approach solve it?)
|
|
57
|
+
3. Reasoning (why this over alternatives?)
|
|
58
|
+
4. Trade-offs (what are we giving up?)
|
|
59
|
+
5. When to Use (guidance on applicability)
|
|
77
60
|
|
|
78
|
-
**
|
|
79
|
-
- Start with problem (create need)
|
|
80
|
-
- Use analogies for complex concepts
|
|
81
|
-
- Compare alternatives explicitly
|
|
82
|
-
- Be honest about trade-offs
|
|
61
|
+
**Done when:** Reader understands rationale and can make similar decisions
|
|
83
62
|
|
|
84
63
|
---
|
|
85
64
|
|
|
86
|
-
### README
|
|
87
|
-
|
|
88
|
-
**Enter when:**
|
|
89
|
-
- Project onboarding needed
|
|
90
|
-
- Quick start guide requested
|
|
91
|
-
- New user introduction needed
|
|
65
|
+
### README
|
|
92
66
|
|
|
93
|
-
**
|
|
94
|
-
- What (one sentence description)
|
|
95
|
-
- Why (key benefit/problem solved)
|
|
96
|
-
- Quickstart (fastest path to working example)
|
|
97
|
-
- Key Features (3-5 main capabilities)
|
|
98
|
-
- Next Steps (links to detailed docs)
|
|
67
|
+
**When:** Project onboarding, quick start, new user introduction
|
|
99
68
|
|
|
100
|
-
**
|
|
69
|
+
**Structure:**
|
|
70
|
+
1. What (one sentence description)
|
|
71
|
+
2. Why (key benefit/problem solved)
|
|
72
|
+
3. Quickstart (fastest path to working example)
|
|
73
|
+
4. Key Features (3-5 main capabilities)
|
|
74
|
+
5. Next Steps (links to detailed docs)
|
|
101
75
|
|
|
102
|
-
**
|
|
103
|
-
- Lead with value proposition
|
|
104
|
-
- Minimize prerequisites
|
|
105
|
-
- Working example ASAP
|
|
106
|
-
- Defer details to linked docs
|
|
76
|
+
**Done when:** New user can get something running in <5 minutes
|
|
107
77
|
|
|
108
78
|
---
|
|
109
79
|
|
|
110
80
|
## Style Guidelines
|
|
111
81
|
|
|
112
|
-
**
|
|
82
|
+
**Structure:**
|
|
83
|
+
- Headings: Clear, specific, sentence case (✅ "Creating a User" not "User Stuff")
|
|
84
|
+
- Code examples: Include imports/setup, show output, test before publishing
|
|
85
|
+
- Paragraphs: 3-4 sentences max
|
|
86
|
+
- Lists: Use for 3+ related items
|
|
113
87
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
✅ "
|
|
117
|
-
|
|
88
|
+
**Tone:**
|
|
89
|
+
- Active voice, second person, present tense
|
|
90
|
+
- ✅ "Use X" not "might want to consider"
|
|
91
|
+
- ✅ "Returns" not "will return"
|
|
118
92
|
|
|
119
|
-
**
|
|
93
|
+
**Formatting:**
|
|
94
|
+
- `code` in backticks
|
|
95
|
+
- **bold** new terms on first use
|
|
96
|
+
- Define jargon inline
|
|
120
97
|
|
|
121
|
-
|
|
122
|
-
✅ Good example:
|
|
98
|
+
**Code Example Format:**
|
|
123
99
|
```typescript
|
|
124
100
|
import { createUser } from './auth'
|
|
125
101
|
|
|
126
|
-
// Create
|
|
102
|
+
// Create with email validation
|
|
127
103
|
const user = await createUser({
|
|
128
104
|
email: 'user@example.com',
|
|
129
105
|
password: 'secure-password'
|
|
130
106
|
})
|
|
131
|
-
// Returns: { id: '123', email: 'user@example.com'
|
|
107
|
+
// Returns: { id: '123', email: 'user@example.com' }
|
|
132
108
|
```
|
|
133
109
|
|
|
134
|
-
|
|
135
|
-
```typescript
|
|
136
|
-
createUser(email, password)
|
|
137
|
-
```
|
|
138
|
-
</example>
|
|
139
|
-
|
|
140
|
-
**Tone**: Direct and active voice. Second person ("You can..."). Present tense. No unnecessary hedging.
|
|
141
|
-
|
|
142
|
-
<example>
|
|
143
|
-
✅ "Use X" (not "might want to consider")
|
|
144
|
-
✅ "Create" (not "can be created")
|
|
145
|
-
✅ "Returns" (not "will return")
|
|
146
|
-
</example>
|
|
147
|
-
|
|
148
|
-
**Formatting**: Code terms in backticks. Important terms **bold** on first use. Lists for 3+ related items.
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## Anti-Patterns
|
|
153
|
-
|
|
154
|
-
**Don't:**
|
|
155
|
-
- ❌ Wall of text
|
|
156
|
-
- ❌ Code without explanation
|
|
157
|
-
- ❌ Jargon without definition
|
|
158
|
-
- ❌ "Obviously", "simply", "just"
|
|
159
|
-
- ❌ Explain what instead of why
|
|
160
|
-
- ❌ Examples that don't run
|
|
161
|
-
|
|
162
|
-
**Do:**
|
|
163
|
-
- ✅ Short paragraphs (3-4 sentences max)
|
|
110
|
+
**Critical Rules:**
|
|
164
111
|
- ✅ Example → explanation → why it matters
|
|
165
|
-
- ✅ Define terms inline or link
|
|
166
112
|
- ✅ Acknowledge complexity, make accessible
|
|
167
|
-
-
|
|
168
|
-
-
|
|
113
|
+
- ❌ "Obviously", "simply", "just" — never assume reader knowledge
|
|
114
|
+
- ❌ Wall of text — break into scannable sections
|
|
115
|
+
- ❌ Code without explanation
|
|
169
116
|
|
|
170
117
|
<example>
|
|
171
|
-
❌
|
|
172
|
-
✅
|
|
118
|
+
❌ "Obviously, just use the createUser function."
|
|
119
|
+
✅ "Use `createUser()` to add a user. It validates email format and hashes passwords."
|
|
173
120
|
</example>
|
|
@@ -14,42 +14,28 @@ description: Technical standards for Coder and Reviewer agents
|
|
|
14
14
|
❌ {api, hooks, components, utils}/auth
|
|
15
15
|
</example>
|
|
16
16
|
|
|
17
|
-
**File size limits**: Component <250 lines, Module <300 lines. Larger → split
|
|
17
|
+
**File size limits**: Component <250 lines, Module <300 lines. Larger → split.
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
21
21
|
## Programming Patterns
|
|
22
22
|
|
|
23
|
-
**Pragmatic Functional
|
|
24
|
-
- Business logic pure
|
|
25
|
-
- I/O explicit (comment when impure)
|
|
23
|
+
**Pragmatic Functional**:
|
|
24
|
+
- Business logic pure, local mutations acceptable
|
|
26
25
|
- Composition default, inheritance when natural (1 level max)
|
|
27
26
|
- Declarative when clearer, imperative when simpler
|
|
28
27
|
|
|
29
|
-
<example>
|
|
30
|
-
✅ users.filter(u => u.active)
|
|
31
|
-
✅ for (const user of users) process(user)
|
|
32
|
-
✅ class UserRepo extends BaseRepo {}
|
|
33
|
-
❌ let shared = {}; fn() { shared.x = 1 }
|
|
34
|
-
</example>
|
|
35
|
-
|
|
36
28
|
**Named args (3+ params)**: `update({ id, email, role })`
|
|
37
29
|
|
|
38
|
-
**Event-driven when appropriate**: Decouple via events/messages
|
|
39
|
-
|
|
40
30
|
---
|
|
41
31
|
|
|
42
32
|
## Quality Principles
|
|
43
33
|
|
|
44
|
-
**YAGNI**: Build what's needed now, not hypothetical futures
|
|
45
|
-
|
|
46
|
-
**
|
|
47
|
-
|
|
48
|
-
**
|
|
49
|
-
|
|
50
|
-
**Single Responsibility**: One reason to change per module. File does multiple things → split.
|
|
51
|
-
|
|
52
|
-
**Dependency Inversion**: Depend on abstractions, not implementations.
|
|
34
|
+
- **YAGNI**: Build what's needed now, not hypothetical futures
|
|
35
|
+
- **KISS**: Solution needs >3 sentences to explain → simplify
|
|
36
|
+
- **DRY**: Extract on 3rd duplication
|
|
37
|
+
- **Single Responsibility**: One reason to change per module
|
|
38
|
+
- **Dependency Inversion**: Depend on abstractions, not implementations
|
|
53
39
|
|
|
54
40
|
---
|
|
55
41
|
|
|
@@ -59,208 +45,98 @@ description: Technical standards for Coder and Reviewer agents
|
|
|
59
45
|
- Functions: verbs (getUserById, calculateTotal)
|
|
60
46
|
- Booleans: is/has/can (isActive, hasPermission)
|
|
61
47
|
- Classes: nouns (UserService, AuthManager)
|
|
62
|
-
- Constants: UPPER_SNAKE_CASE
|
|
63
48
|
- No abbreviations unless universal (req/res ok, usr/calc not ok)
|
|
64
49
|
|
|
65
|
-
**Type Safety**:
|
|
66
|
-
- Make illegal states unrepresentable
|
|
67
|
-
- No `any` without justification
|
|
68
|
-
- Null/undefined handled explicitly
|
|
69
|
-
- Union types over loose types
|
|
70
|
-
|
|
71
|
-
**Comments**: Explain WHY, not WHAT. Non-obvious decisions documented. TODOs forbidden (implement or delete).
|
|
50
|
+
**Type Safety**: Make illegal states unrepresentable. No `any` without justification. Handle null/undefined explicitly.
|
|
72
51
|
|
|
73
|
-
|
|
74
|
-
✅ // Retry 3x because API rate limits after burst
|
|
75
|
-
❌ // Retry the request
|
|
76
|
-
</example>
|
|
52
|
+
**Comments**: Explain WHY, not WHAT. TODOs forbidden (implement or delete).
|
|
77
53
|
|
|
78
|
-
**Testing**: Critical paths 100
|
|
54
|
+
**Testing**: Critical paths 100%. Business logic 80%+. Test names describe behavior.
|
|
79
55
|
|
|
80
56
|
---
|
|
81
57
|
|
|
82
58
|
## Security Standards
|
|
83
59
|
|
|
84
|
-
**Input Validation**: Validate at boundaries
|
|
60
|
+
**Input Validation**: Validate at boundaries. Whitelist > blacklist. Use schema validation (Zod).
|
|
85
61
|
|
|
86
62
|
<example>
|
|
87
63
|
✅ const input = UserInputSchema.parse(req.body)
|
|
88
64
|
❌ const input = req.body // trusting user input
|
|
89
65
|
</example>
|
|
90
66
|
|
|
91
|
-
**
|
|
67
|
+
**Auth**: Required by default. Deny by default. Check permissions at every entry point.
|
|
92
68
|
|
|
93
|
-
**Data Protection**: Never log
|
|
94
|
-
|
|
95
|
-
<example>
|
|
96
|
-
❌ logger.info('User login', { email, password }) // NEVER log passwords
|
|
97
|
-
✅ logger.info('User login', { email })
|
|
98
|
-
</example>
|
|
99
|
-
|
|
100
|
-
**Risk Mitigation**: Rollback plan for risky changes. Feature flags for gradual rollout. Circuit breakers for external services.
|
|
69
|
+
**Data Protection**: Never log passwords, tokens, API keys, PII. Encrypt at rest. HTTPS only.
|
|
101
70
|
|
|
102
71
|
---
|
|
103
72
|
|
|
104
73
|
## Error Handling
|
|
105
74
|
|
|
106
|
-
**At Boundaries**:
|
|
107
|
-
<example>
|
|
108
|
-
✅ try { return Ok(data) } catch { return Err(error) }
|
|
109
|
-
❌ const data = await fetchUser(id) // let it bubble unhandled
|
|
110
|
-
</example>
|
|
75
|
+
**At Boundaries**: Catch and transform to Result types or domain errors.
|
|
111
76
|
|
|
112
|
-
**
|
|
113
|
-
|
|
114
|
-
<example>
|
|
115
|
-
✅ return Result.err(error)
|
|
116
|
-
✅ throw new DomainError(msg)
|
|
117
|
-
❌ throw "error" // control flow
|
|
118
|
-
</example>
|
|
119
|
-
|
|
120
|
-
**Logging**: Include context (user id, request id). Actionable messages. Appropriate severity. Never mask failures.
|
|
77
|
+
**Logging**: Include context (userId, requestId). Actionable messages. Never mask failures.
|
|
121
78
|
|
|
122
79
|
<example>
|
|
123
80
|
✅ logger.error('Payment failed', { userId, orderId, error: err.message })
|
|
124
81
|
❌ logger.error('Error') // no context
|
|
125
82
|
</example>
|
|
126
83
|
|
|
127
|
-
**Retry
|
|
84
|
+
**Retry**: Transient failures → exponential backoff. Permanent failures → fail fast.
|
|
128
85
|
|
|
129
86
|
---
|
|
130
87
|
|
|
131
88
|
## Performance Patterns
|
|
132
89
|
|
|
133
|
-
**Data Structure Selection
|
|
134
|
-
- Lookup by key → `Map`
|
|
90
|
+
**Data Structure Selection**:
|
|
91
|
+
- Lookup by key → `Map` O(1)
|
|
135
92
|
- Membership check → `Set` O(1)
|
|
136
93
|
- Ordered iteration → `Array`
|
|
137
|
-
- Min/Max access → `Heap` / sorted structure
|
|
138
|
-
|
|
139
|
-
<example>
|
|
140
|
-
❌ array.find(x => x.id === id) // O(n) lookup
|
|
141
|
-
✅ map.get(id) // O(1) lookup
|
|
142
94
|
|
|
143
|
-
❌ array.includes(x) // large array // O(n) membership
|
|
144
|
-
✅ set.has(x) // O(1) membership
|
|
145
|
-
</example>
|
|
146
|
-
|
|
147
|
-
**Query Optimization**:
|
|
148
95
|
<example>
|
|
149
|
-
❌
|
|
150
|
-
✅
|
|
96
|
+
❌ array.find(x => x.id === id) // O(n)
|
|
97
|
+
✅ map.get(id) // O(1)
|
|
151
98
|
</example>
|
|
152
99
|
|
|
153
|
-
**
|
|
100
|
+
**Query Optimization**: Avoid N+1. Use JOINs or batch queries.
|
|
154
101
|
|
|
155
|
-
**
|
|
102
|
+
**Algorithm Complexity**: O(n²) in hot paths → reconsider. Nested loops → use hash maps.
|
|
156
103
|
|
|
157
|
-
**When to Optimize**: Only with data
|
|
104
|
+
**When to Optimize**: Only with data. Profile first. Measure impact.
|
|
158
105
|
|
|
159
106
|
---
|
|
160
107
|
|
|
161
|
-
##
|
|
162
|
-
|
|
163
|
-
**Extract function when**:
|
|
164
|
-
- 3rd duplication appears
|
|
165
|
-
- Function >20 lines
|
|
166
|
-
- >3 levels of nesting
|
|
167
|
-
- Cognitive load high
|
|
168
|
-
|
|
169
|
-
**Extract module when**:
|
|
170
|
-
- File >300 lines
|
|
171
|
-
- Multiple unrelated responsibilities
|
|
172
|
-
- Difficult to name clearly
|
|
173
|
-
|
|
174
|
-
**Immediate refactor**: Thinking "I'll clean later" → Clean NOW. Adding TODO → Implement NOW. Copy-pasting → Extract NOW.
|
|
175
|
-
|
|
176
|
-
---
|
|
108
|
+
## Code Organization
|
|
177
109
|
|
|
178
|
-
|
|
110
|
+
**Extract function when**: 3rd duplication, >20 lines, >3 nesting levels.
|
|
179
111
|
|
|
180
|
-
|
|
112
|
+
**Extract module when**: >300 lines, multiple responsibilities.
|
|
181
113
|
|
|
114
|
+
**Simplicity Check**: Before every commit, ask "Can this be simpler?"
|
|
182
115
|
- Complexity must justify itself
|
|
183
|
-
-
|
|
184
|
-
- Multiple valid approaches → choose simplest that works
|
|
185
|
-
- Abstraction before 2nd use case → premature, keep concrete
|
|
116
|
+
- Abstraction before 2nd use case → premature
|
|
186
117
|
|
|
187
118
|
<example>
|
|
188
|
-
❌ Generic factory
|
|
189
|
-
✅ Direct instantiation, extract
|
|
190
|
-
|
|
191
|
-
❌ Complex state machine for simple toggle
|
|
192
|
-
✅ Boolean flag, upgrade to state machine when states grow
|
|
119
|
+
❌ Generic factory for single use case
|
|
120
|
+
✅ Direct instantiation, extract when 2nd case appears
|
|
193
121
|
</example>
|
|
194
122
|
|
|
195
123
|
---
|
|
196
124
|
|
|
197
|
-
## Anti-Patterns
|
|
198
|
-
|
|
199
|
-
**Technical Debt**:
|
|
200
|
-
- ❌ "I'll clean this later" → You won't
|
|
201
|
-
- ❌ "Just one more TODO" → Compounds
|
|
202
|
-
- ❌ "Tests slow me down" → Bugs slow more
|
|
203
|
-
- ✅ Refactor AS you work, not after
|
|
204
|
-
|
|
205
|
-
**Reinventing the Wheel**:
|
|
206
|
-
|
|
207
|
-
Before ANY feature: research best practices + search codebase + check package registry + check framework built-ins.
|
|
208
|
-
|
|
209
|
-
<example>
|
|
210
|
-
✅ import { Result } from 'neverthrow'
|
|
211
|
-
✅ try/catch with typed errors
|
|
212
|
-
✅ import { z } from 'zod'
|
|
213
|
-
✅ import { format } from 'date-fns'
|
|
214
|
-
❌ Custom Result/validation/date implementations
|
|
215
|
-
</example>
|
|
216
|
-
|
|
217
|
-
**Premature Abstraction**:
|
|
218
|
-
- ❌ Interfaces before 2nd use case
|
|
219
|
-
- ❌ Generic solutions for specific problems
|
|
220
|
-
- ✅ Solve specific first, extract when pattern emerges
|
|
221
|
-
|
|
222
|
-
**Copy-Paste Without Understanding**:
|
|
223
|
-
- ❌ Stack Overflow → paste → hope
|
|
224
|
-
- ✅ Stack Overflow → understand → adapt
|
|
225
|
-
|
|
226
|
-
**Working Around Errors**:
|
|
227
|
-
- ❌ Suppress error, add fallback
|
|
228
|
-
- ✅ Fix root cause
|
|
229
|
-
|
|
230
|
-
---
|
|
231
|
-
|
|
232
125
|
## Code Smells
|
|
233
126
|
|
|
234
|
-
**Complexity**: Function >20 lines
|
|
127
|
+
**Complexity**: Function >20 lines, >3 nesting, >5 parameters → refactor.
|
|
235
128
|
|
|
236
|
-
**Coupling**: Circular
|
|
129
|
+
**Coupling**: Circular deps → redesign. Tight coupling to external APIs → add adapter.
|
|
237
130
|
|
|
238
|
-
**Data**: Mutable shared state →
|
|
131
|
+
**Data**: Mutable shared state → encapsulate. Magic numbers → named constants.
|
|
239
132
|
|
|
240
|
-
**Naming**: Generic names (data, info,
|
|
133
|
+
**Naming**: Generic names (data, info, utils) → be specific. Misleading → rename immediately.
|
|
241
134
|
|
|
242
135
|
---
|
|
243
136
|
|
|
244
137
|
## Data Handling
|
|
245
138
|
|
|
246
|
-
**
|
|
247
|
-
<example>
|
|
248
|
-
function loadConfig(raw: unknown): Config {
|
|
249
|
-
const parsed = ConfigSchema.safeParse(raw)
|
|
250
|
-
if (!parsed.success) {
|
|
251
|
-
const fixed = applyDefaults(raw)
|
|
252
|
-
const retry = ConfigSchema.safeParse(fixed)
|
|
253
|
-
if (retry.success) {
|
|
254
|
-
logger.info('Config auto-fixed', { issues: parsed.error })
|
|
255
|
-
return retry.data
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
if (!parsed.success) throw new ConfigError(parsed.error)
|
|
259
|
-
return parsed.data
|
|
260
|
-
}
|
|
261
|
-
</example>
|
|
262
|
-
|
|
263
|
-
**Single Source of Truth**: Configuration → Environment + config files. State → Single store (Redux, Zustand, Context). Derived data → Compute from source, don't duplicate.
|
|
139
|
+
**Single Source of Truth**: Config → env + files. State → single store. Derived data → compute, don't duplicate.
|
|
264
140
|
|
|
265
141
|
**Data Flow**:
|
|
266
142
|
```
|