claude-flow-novice 1.5.0 → 1.5.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/.claude/commands/fullstack.md +134 -0
- package/.claude/commands/index.js +4 -0
- package/CHANGELOG.md +13 -0
- package/CLAUDE.md +127 -989
- package/package.json +1 -1
- package/src/cli/simple-commands/init/templates/CLAUDE.md +2 -1
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Launch full-stack development team with coordinated consensus validation"
|
|
3
|
+
argument-hint: "<goal description>"
|
|
4
|
+
allowed-tools: ["Task", "TodoWrite", "Read", "Write", "Edit", "Bash", "Glob", "Grep"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Full-Stack Development Team
|
|
8
|
+
|
|
9
|
+
Launch a coordinated full-stack development team to accomplish complex features with built-in consensus validation.
|
|
10
|
+
|
|
11
|
+
**Goal**: $ARGUMENTS
|
|
12
|
+
|
|
13
|
+
## Team Composition
|
|
14
|
+
|
|
15
|
+
The fullstack team includes:
|
|
16
|
+
- **Researcher**: Requirements analysis, pattern detection, architectural planning
|
|
17
|
+
- **Coder**: Implementation of backend and frontend features
|
|
18
|
+
- **Tester**: Comprehensive testing including unit, integration, and E2E tests
|
|
19
|
+
- **Reviewer**: Code quality analysis, security review, performance optimization
|
|
20
|
+
- **Architect** (for complex tasks): System design and architectural decisions
|
|
21
|
+
|
|
22
|
+
## Execution Pattern
|
|
23
|
+
|
|
24
|
+
### Phase 1: Execute
|
|
25
|
+
1. **Launch Primary Swarm** (3-5 agents in parallel using Claude Code's Task tool)
|
|
26
|
+
- All agents execute concurrently in a single message
|
|
27
|
+
- Each agent receives full context and specific responsibilities
|
|
28
|
+
- Agents produce deliverables with confidence scores
|
|
29
|
+
|
|
30
|
+
2. **Progress Tracking**
|
|
31
|
+
- Use TodoWrite to track all tasks (5-10+ items minimum)
|
|
32
|
+
- Mark tasks as in_progress before starting
|
|
33
|
+
- Complete tasks immediately after finishing (no batching)
|
|
34
|
+
|
|
35
|
+
### Phase 2: Verify (Only when Primary Swarm believes it's done)
|
|
36
|
+
1. **Self-Assessment**: Primary swarm evaluates completion (confidence ≥75% required)
|
|
37
|
+
2. **Launch Consensus Swarm** (2-4 validators in parallel)
|
|
38
|
+
- Independent verification with Byzantine fault tolerance
|
|
39
|
+
- Comprehensive validation: tests, security, performance, architecture
|
|
40
|
+
- Voting mechanism with critical criteria checks
|
|
41
|
+
|
|
42
|
+
### Phase 3: Decision
|
|
43
|
+
**PASS Criteria** (≥90% agreement + all critical checks):
|
|
44
|
+
- All tests passing (100% for critical paths, ≥80% coverage overall)
|
|
45
|
+
- No security vulnerabilities
|
|
46
|
+
- Performance within acceptable thresholds
|
|
47
|
+
- Architecture review approved
|
|
48
|
+
|
|
49
|
+
**FAIL Criteria**:
|
|
50
|
+
- <90% validator agreement OR critical criteria failed
|
|
51
|
+
- Round counter increments
|
|
52
|
+
- Feedback injected into context
|
|
53
|
+
|
|
54
|
+
### Phase 4: Action
|
|
55
|
+
- **PASS**: Store results → Move to next task → Report completion
|
|
56
|
+
- **FAIL**:
|
|
57
|
+
- If Round < 10: Inject feedback → Relaunch primary swarm with improvements
|
|
58
|
+
- If Round ≥ 10: Escalate to human with full history + recommendations
|
|
59
|
+
|
|
60
|
+
### Phase 5: Repeat
|
|
61
|
+
Iterative improvement with accumulated context from all previous rounds until:
|
|
62
|
+
- Success achieved (PASS)
|
|
63
|
+
- Maximum rounds reached (10)
|
|
64
|
+
- Human intervention requested
|
|
65
|
+
|
|
66
|
+
## Consensus Validation Requirements
|
|
67
|
+
|
|
68
|
+
**Validator Team** (4 agents for Byzantine fault tolerance):
|
|
69
|
+
1. **Validator 1** - Test Coverage & Quality
|
|
70
|
+
2. **Validator 2** - Security & Compliance
|
|
71
|
+
3. **Validator 3** - Performance & Optimization
|
|
72
|
+
4. **Validator 4** - Architecture & Design
|
|
73
|
+
|
|
74
|
+
**Scoring System**:
|
|
75
|
+
- Overall Score: 0-100 (weighted average)
|
|
76
|
+
- Pass Threshold: ≥90/100 with unanimous approval
|
|
77
|
+
- Tier 2: 85-94 (production-ready with minor issues)
|
|
78
|
+
- Tier 3: 75-84 (needs improvements)
|
|
79
|
+
- Fail: <75 (significant issues)
|
|
80
|
+
|
|
81
|
+
**Critical Criteria** (all must pass):
|
|
82
|
+
- Tests executing and passing
|
|
83
|
+
- No critical security vulnerabilities
|
|
84
|
+
- Code compiles/builds successfully
|
|
85
|
+
- Core functionality working
|
|
86
|
+
|
|
87
|
+
## Usage Examples
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Simple feature
|
|
91
|
+
/fullstack Add user authentication with JWT tokens and password hashing
|
|
92
|
+
|
|
93
|
+
# Complex feature with multiple components
|
|
94
|
+
/fullstack Build a real-time chat system with user presence, typing indicators, message history, and file sharing
|
|
95
|
+
|
|
96
|
+
# Backend API
|
|
97
|
+
/fullstack Create REST API for product catalog with CRUD operations, search, filtering, and pagination
|
|
98
|
+
|
|
99
|
+
# Frontend feature
|
|
100
|
+
/fullstack Implement responsive dashboard with data visualization, real-time updates, and mobile support
|
|
101
|
+
|
|
102
|
+
# Full-stack integration
|
|
103
|
+
/fullstack Develop e-commerce checkout flow with payment processing, order management, and email notifications
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Execution Instructions
|
|
107
|
+
|
|
108
|
+
When this command is invoked:
|
|
109
|
+
|
|
110
|
+
1. **Parse the goal** from $ARGUMENTS
|
|
111
|
+
2. **Create comprehensive task list** using TodoWrite (5-10+ items)
|
|
112
|
+
3. **Launch primary swarm** using Claude Code's Task tool in a SINGLE message:
|
|
113
|
+
```
|
|
114
|
+
Task("Research and analyze requirements", "Analyze goal: [goal]. Research patterns, identify requirements, create detailed specifications...", "researcher")
|
|
115
|
+
Task("Implement core features", "Implement goal: [goal]. Write production code following best practices...", "coder")
|
|
116
|
+
Task("Create comprehensive tests", "Test goal: [goal]. Write unit, integration, and E2E tests...", "tester")
|
|
117
|
+
Task("Review and optimize", "Review implementation of goal: [goal]. Check security, performance, architecture...", "reviewer")
|
|
118
|
+
```
|
|
119
|
+
4. **Monitor progress** and update TodoWrite in real-time
|
|
120
|
+
5. **Self-assess** when primary work complete
|
|
121
|
+
6. **Launch consensus swarm** if confidence ≥75%
|
|
122
|
+
7. **Process results** according to validation outcome
|
|
123
|
+
8. **Iterate or complete** based on consensus decision
|
|
124
|
+
|
|
125
|
+
## Important Notes
|
|
126
|
+
|
|
127
|
+
- **Always use Task tool in parallel** - spawn all agents in ONE message
|
|
128
|
+
- **Update TodoWrite immediately** - never batch completions
|
|
129
|
+
- **Run post-edit hooks** after EVERY file modification
|
|
130
|
+
- **Store results in appropriate directories** - never save to root
|
|
131
|
+
- **Follow file organization** - use /src, /tests, /docs structure
|
|
132
|
+
- **Enable consensus validation** - for production-ready code quality
|
|
133
|
+
|
|
134
|
+
Execute the fullstack development workflow for the specified goal with comprehensive validation.
|
|
@@ -43,6 +43,7 @@ export { default as registerClaudeMd } from './register-claude-md.js';
|
|
|
43
43
|
export const Commands = {
|
|
44
44
|
SPARC: 'sparc',
|
|
45
45
|
SWARM: 'swarm',
|
|
46
|
+
FULLSTACK: 'fullstack',
|
|
46
47
|
HOOKS: 'hooks',
|
|
47
48
|
NEURAL: 'neural',
|
|
48
49
|
PERFORMANCE: 'performance',
|
|
@@ -57,6 +58,8 @@ export const Commands = {
|
|
|
57
58
|
*/
|
|
58
59
|
export const Aliases = {
|
|
59
60
|
s: 'swarm',
|
|
61
|
+
fs: 'fullstack',
|
|
62
|
+
full: 'fullstack',
|
|
60
63
|
h: 'hooks',
|
|
61
64
|
n: 'neural',
|
|
62
65
|
p: 'performance',
|
|
@@ -91,6 +94,7 @@ export function getQuickHelp() {
|
|
|
91
94
|
🚀 **CLAUDE-FLOW SLASH COMMANDS**
|
|
92
95
|
|
|
93
96
|
**Essential Commands:**
|
|
97
|
+
- \`/fullstack "goal"\` - Launch full-stack development team with consensus validation
|
|
94
98
|
- \`/swarm init mesh 8\` - Initialize agent swarm
|
|
95
99
|
- \`/hooks enable\` - Enable automation hooks
|
|
96
100
|
- \`/sparc spec "task"\` - Run SPARC methodology
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,19 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### ✨ Added
|
|
11
|
+
- **`/fullstack` Slash Command**: Launch coordinated full-stack development team with consensus validation
|
|
12
|
+
- Automatic team composition (researcher, coder, tester, reviewer, architect)
|
|
13
|
+
- Built-in consensus validation with 4-validator Byzantine fault tolerance
|
|
14
|
+
- Iterative improvement with up to 10 rounds and feedback injection
|
|
15
|
+
- Production-ready code quality (≥90% agreement + critical criteria)
|
|
16
|
+
- User can specify custom goals: `/fullstack "Add authentication with JWT"`
|
|
17
|
+
- Command aliases: `/fs`, `/full`
|
|
18
|
+
- Comprehensive documentation in `docs/commands/fullstack.md`
|
|
19
|
+
- Auto-discovered by Claude Code (no manual registration required)
|
|
20
|
+
|
|
8
21
|
## [1.4.1] - 2025-09-29
|
|
9
22
|
|
|
10
23
|
### 🔧 Fixed
|
package/CLAUDE.md
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
# Claude
|
|
1
|
+
# Claude Flow Novice - AI Agent Orchestration
|
|
2
|
+
|
|
3
|
+
## Core Orchestration Patterns
|
|
2
4
|
|
|
3
5
|
## 🚨 CRITICAL: CONCURRENT EXECUTION & FILE MANAGEMENT
|
|
4
6
|
|
|
7
|
+
|
|
5
8
|
**ABSOLUTE RULES**:
|
|
6
9
|
1. ALL operations MUST be concurrent/parallel in a single message
|
|
7
10
|
2. **NEVER save working files, text/mds and tests to the root folder**
|
|
@@ -17,63 +20,6 @@
|
|
|
17
20
|
- **Bash commands**: ALWAYS batch ALL terminal operations in ONE message
|
|
18
21
|
- **Memory operations**: ALWAYS batch ALL memory store/retrieve in ONE message
|
|
19
22
|
|
|
20
|
-
### 🎯 CRITICAL: Claude Code Task Tool for Agent Execution
|
|
21
|
-
|
|
22
|
-
**Claude Code's Task tool is the PRIMARY way to spawn agents:**
|
|
23
|
-
```javascript
|
|
24
|
-
// ✅ CORRECT: Use Claude Code's Task tool for parallel agent execution
|
|
25
|
-
[Single Message]:
|
|
26
|
-
Task("Research agent", "Analyze requirements and patterns...", "researcher")
|
|
27
|
-
Task("Coder agent", "Implement core features...", "coder")
|
|
28
|
-
Task("Tester agent", "Create comprehensive tests...", "tester")
|
|
29
|
-
Task("Reviewer agent", "Review code quality...", "reviewer")
|
|
30
|
-
Task("Architect agent", "Design system architecture...", "system-architect")
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Project Overview
|
|
34
|
-
|
|
35
|
-
**Project Type**: react-typescript
|
|
36
|
-
**Primary Language**: javascript
|
|
37
|
-
**Primary Framework**: react
|
|
38
|
-
**Package Manager**: npm
|
|
39
|
-
**Build Tools**: none
|
|
40
|
-
|
|
41
|
-
**Detected Languages**: javascript, typescript, rust, python
|
|
42
|
-
**Detected Frameworks**: react, express, vue, django, flask, nextjs, angular, spring, fastapi
|
|
43
|
-
**Project Directories**: src
|
|
44
|
-
|
|
45
|
-
*Auto-generated on 2025-09-29*
|
|
46
|
-
|
|
47
|
-
## 📁 File Organization Rules
|
|
48
|
-
|
|
49
|
-
**NEVER save to root folder. Use these directories:**
|
|
50
|
-
- `/src` - Source code files
|
|
51
|
-
- `/tests` - Test files
|
|
52
|
-
- `/docs` - Documentation and markdown files
|
|
53
|
-
- `/config` - Configuration files
|
|
54
|
-
- `/scripts` - Utility scripts
|
|
55
|
-
- `/examples` - Example code
|
|
56
|
-
|
|
57
|
-
## 🚀 Available Agent Types
|
|
58
|
-
|
|
59
|
-
### Core Development
|
|
60
|
-
`coder`, `reviewer`, `tester`, `planner`, `researcher`
|
|
61
|
-
|
|
62
|
-
### Backend Development
|
|
63
|
-
`backend-dev`, `api-docs`, `system-architect`, `code-analyzer`
|
|
64
|
-
|
|
65
|
-
### Frontend Development
|
|
66
|
-
`mobile-dev` (React Native), specialized frontend agents
|
|
67
|
-
|
|
68
|
-
### Testing & Validation
|
|
69
|
-
`tdd-london-swarm`, `production-validator`
|
|
70
|
-
|
|
71
|
-
### GitHub & Repository Management
|
|
72
|
-
`github-modes`, `pr-manager`, `code-review-swarm`, `issue-tracker`, `release-manager`
|
|
73
|
-
|
|
74
|
-
### Performance & Optimization
|
|
75
|
-
`perf-analyzer`, `performance-benchmarker`, `task-orchestrator`
|
|
76
|
-
|
|
77
23
|
## 🎯 Claude Code vs MCP Tools
|
|
78
24
|
|
|
79
25
|
### Claude Code Handles ALL EXECUTION:
|
|
@@ -82,971 +28,163 @@
|
|
|
82
28
|
- Code generation and programming
|
|
83
29
|
- Bash commands and system operations
|
|
84
30
|
- Implementation work
|
|
31
|
+
- Project navigation and analysis
|
|
32
|
+
- TodoWrite and task management
|
|
33
|
+
- Git operations
|
|
34
|
+
- Package management
|
|
35
|
+
- Testing and debugging
|
|
85
36
|
|
|
86
37
|
### MCP Tools ONLY COORDINATE:
|
|
87
38
|
- Swarm initialization (topology setup)
|
|
88
39
|
- Agent type definitions (coordination patterns)
|
|
89
40
|
- Task orchestration (high-level planning)
|
|
90
41
|
- Memory management
|
|
42
|
+
- Neural features
|
|
91
43
|
- Performance tracking
|
|
44
|
+
- GitHub integration
|
|
92
45
|
|
|
93
46
|
**KEY**: MCP coordinates the strategy, Claude Code's Task tool executes with real agents.
|
|
94
47
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
### Every Agent Spawned via Task Tool MUST:
|
|
48
|
+
### Agent Coordination Framework
|
|
98
49
|
|
|
99
|
-
|
|
50
|
+
#### Pre-Task Hooks (Setup & Validation)
|
|
100
51
|
```bash
|
|
101
|
-
|
|
102
|
-
npx claude-flow
|
|
103
|
-
```
|
|
52
|
+
# Validate safety and prepare resources
|
|
53
|
+
npx claude-flow-novice hooks pre-command --command "[command]" --validate-safety true --prepare-resources true
|
|
104
54
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
npx claude-flow@alpha hooks post-edit --file "[file]" --memory-key "swarm/[agent]/[step]"
|
|
108
|
-
npx claude-flow@alpha hooks notify --message "[what was done]"
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
**3️⃣ AFTER Work:**
|
|
112
|
-
```bash
|
|
113
|
-
npx claude-flow@alpha hooks post-task --task-id "[task]"
|
|
114
|
-
npx claude-flow@alpha hooks session-end --export-metrics true
|
|
55
|
+
# Auto-assign agents and load context
|
|
56
|
+
npx claude-flow-novice hooks pre-edit --file "[file]" --auto-assign-agents true --load-context true
|
|
115
57
|
```
|
|
116
58
|
|
|
117
|
-
|
|
118
|
-
|
|
59
|
+
#### Post-Task Hooks (Validation & Quality)
|
|
119
60
|
```bash
|
|
120
|
-
#
|
|
121
|
-
|
|
122
|
-
npm run build
|
|
123
|
-
npm run test
|
|
124
|
-
npm run lint
|
|
125
|
-
|
|
126
|
-
# Claude Flow commands
|
|
127
|
-
npx claude-flow@alpha init
|
|
128
|
-
npx claude-flow@alpha hooks setup
|
|
129
|
-
npx claude-flow@alpha memory store
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
## Javascript Configuration
|
|
133
|
-
|
|
134
|
-
### JavaScript Development Patterns
|
|
135
|
-
|
|
136
|
-
**Code Style & Standards:**
|
|
137
|
-
- Use ES6+ features (arrow functions, destructuring, modules)
|
|
138
|
-
- Prefer `const`/`let` over `var`
|
|
139
|
-
- Use async/await over Promise chains
|
|
140
|
-
- Implement proper error boundaries
|
|
141
|
-
- Follow ESLint/Prettier configurations
|
|
61
|
+
# Track metrics and store results
|
|
62
|
+
npx claude-flow-novice hooks post-command --command "[command]" --track-metrics true --store-results true
|
|
142
63
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
// ✅ CORRECT: JavaScript development with concurrent agents
|
|
146
|
-
[Single Message]:
|
|
147
|
-
Task("Frontend Developer", "Build responsive UI with modern JavaScript", "coder")
|
|
148
|
-
Task("API Developer", "Create REST endpoints with Express/Fastify", "backend-dev")
|
|
149
|
-
Task("Test Engineer", "Write Jest/Vitest tests with >85% coverage", "tester")
|
|
150
|
-
Task("Build Engineer", "Configure Webpack/Vite build system", "system-architect")
|
|
151
|
-
Task("Quality Reviewer", "Review code quality and performance", "reviewer")
|
|
64
|
+
# Enhanced post-edit pipeline with comprehensive TDD validation
|
|
65
|
+
npx enhanced-hooks post-edit "[file]" --memory-key "swarm/[agent]/[step]" --minimum-coverage 80 --structured
|
|
152
66
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
Write("src/api/routes.js")
|
|
156
|
-
Write("tests/app.test.js")
|
|
157
|
-
Write("webpack.config.js")
|
|
67
|
+
# Manual hook execution (guaranteed working)
|
|
68
|
+
node src/hooks/enhanced-hooks-cli.js post-edit "[file]" --memory-key "[key]" --structured
|
|
158
69
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
{content: "Set up project structure", status: "in_progress", activeForm: "Setting up project structure"},
|
|
162
|
-
{content: "Implement core modules", status: "pending", activeForm: "Implementing core modules"},
|
|
163
|
-
{content: "Add error handling", status: "pending", activeForm: "Adding error handling"},
|
|
164
|
-
{content: "Write comprehensive tests", status: "pending", activeForm: "Writing comprehensive tests"},
|
|
165
|
-
{content: "Configure build pipeline", status: "pending", activeForm: "Configuring build pipeline"}
|
|
166
|
-
]})
|
|
70
|
+
# Validates: formatting, linting, type checking, dependencies, security, tests, TDD compliance
|
|
71
|
+
# Progressive validation: graceful degradation when dependencies missing (beginner-friendly)
|
|
167
72
|
```
|
|
168
73
|
|
|
169
|
-
**
|
|
170
|
-
```javascript
|
|
171
|
-
// Preferred module structure
|
|
172
|
-
src/
|
|
173
|
-
components/ # Reusable components
|
|
174
|
-
utils/ # Helper functions
|
|
175
|
-
services/ # API and business logic
|
|
176
|
-
config/ # Configuration files
|
|
177
|
-
hooks/ # Custom hooks (if React)
|
|
178
|
-
types/ # Type definitions (if TypeScript)
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
**Testing Patterns:**
|
|
182
|
-
```javascript
|
|
183
|
-
import { jest } from '@jest/globals';
|
|
184
|
-
|
|
185
|
-
describe('Module Tests', () => {
|
|
186
|
-
beforeEach(() => {
|
|
187
|
-
jest.clearAllMocks();
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
test('handles async operations correctly', async () => {
|
|
191
|
-
const mockFn = jest.fn().mockResolvedValue({ success: true });
|
|
192
|
-
const result = await asyncOperation(mockFn);
|
|
74
|
+
## 🎯 **Enhanced Post-Edit Hook System**
|
|
193
75
|
|
|
194
|
-
|
|
195
|
-
expect(mockFn).toHaveBeenCalledTimes(1);
|
|
196
|
-
});
|
|
76
|
+
### **🚨 MANDATORY: Manual Hook Execution After Every File Edit**
|
|
197
77
|
|
|
198
|
-
|
|
199
|
-
const mockFn = jest.fn().mockRejectedValue(new Error('Test error'));
|
|
78
|
+
**CRITICAL RULE**: After **EVERY** file edit operation, you **MUST** run the enhanced post-edit hook:
|
|
200
79
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
-
|
|
211
|
-
-
|
|
80
|
+
```bash
|
|
81
|
+
# After editing any file, IMMEDIATELY run:
|
|
82
|
+
npx enhanced-hooks post-edit "[FILE_PATH]" --memory-key "swarm/[AGENT]/[STEP]" --minimum-coverage 80 --structured
|
|
83
|
+
|
|
84
|
+
# Or via slash command:
|
|
85
|
+
/hooks post-edit [FILE_PATH] --memory-key "[CONTEXT]" --structured
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**⚠️ NO EXCEPTIONS**: This applies to:
|
|
89
|
+
- All JavaScript/TypeScript files
|
|
90
|
+
- All Rust files
|
|
91
|
+
- All Python files
|
|
92
|
+
- All configuration files
|
|
93
|
+
- ALL file modifications
|
|
94
|
+
|
|
95
|
+
### **Enhanced Post-Edit Pipeline Features:**
|
|
96
|
+
- **🧪 TDD Testing**: Single-file testing without full system compilation
|
|
97
|
+
- **📊 Real-time Coverage**: Coverage analysis with configurable thresholds (default: 80%)
|
|
98
|
+
- **🌐 Multi-Language Support**:
|
|
99
|
+
- **JavaScript/TypeScript**: Jest, Mocha, Prettier, ESLint integration
|
|
100
|
+
- **Rust**: cargo check, cargo test, cargo-tarpaulin, rustfmt
|
|
101
|
+
- **Python**: pytest, unittest, black, pylint
|
|
102
|
+
- **Go**: go test, go fmt, go vet
|
|
103
|
+
- **Java**: JUnit, TestNG, google-java-format
|
|
104
|
+
- **C/C++**: GTest, Catch2, clang-format
|
|
105
|
+
- **🎨 Formatting**: Prettier, Black, RustFmt, GoFmt with diff preview
|
|
106
|
+
- **🔒 Security Analysis**: XSS, eval(), hardcoded credentials, SQL injection detection
|
|
107
|
+
- **✅ TDD Compliance**: Red-Green-Refactor phase detection and enforcement
|
|
108
|
+
- **🔍 Framework Detection**: Automatic test framework identification
|
|
109
|
+
- **🤖 Agent Feedback**: Structured JSON with actionable recommendations
|
|
110
|
+
- **💾 Memory Coordination**: Cross-agent state sharing and enhanced persistence
|
|
111
|
+
- **🚫 Blocking Mechanisms**: Quality gates for critical validation failures
|
|
112
|
+
|
|
113
|
+
### **Usage Examples:**
|
|
114
|
+
```bash
|
|
115
|
+
# For JavaScript/TypeScript files
|
|
116
|
+
npx enhanced-hooks post-edit "src/components/Button.tsx" --memory-key "frontend/button" --structured
|
|
212
117
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
// Global error handler
|
|
216
|
-
process.on('unhandledRejection', (reason, promise) => {
|
|
217
|
-
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
|
|
218
|
-
// Application specific logging logic here
|
|
219
|
-
});
|
|
118
|
+
# For Rust files (full cargo integration)
|
|
119
|
+
npx enhanced-hooks post-edit "src/lib.rs" --memory-key "backend/rust" --minimum-coverage 90 --structured
|
|
220
120
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
Promise.resolve(fn(req, res, next)).catch(next);
|
|
224
|
-
};
|
|
121
|
+
# Via slash commands in Claude Code
|
|
122
|
+
/hooks post-edit your-file.js --memory-key "agent-memory-key" --structured
|
|
225
123
|
```
|
|
226
124
|
|
|
227
|
-
**
|
|
228
|
-
```javascript
|
|
229
|
-
// config/index.js
|
|
230
|
-
const config = {
|
|
231
|
-
development: {
|
|
232
|
-
api: {
|
|
233
|
-
baseURL: 'http://localhost:3000',
|
|
234
|
-
timeout: 5000
|
|
235
|
-
}
|
|
236
|
-
},
|
|
237
|
-
production: {
|
|
238
|
-
api: {
|
|
239
|
-
baseURL: process.env.API_BASE_URL,
|
|
240
|
-
timeout: 10000
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
export default config[process.env.NODE_ENV || 'development'];
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
## Typescript Configuration
|
|
249
|
-
|
|
250
|
-
### TypeScript Configuration & Patterns
|
|
251
|
-
|
|
252
|
-
**Type Safety & Standards:**
|
|
253
|
-
- Use strict TypeScript configuration
|
|
254
|
-
- Prefer interfaces over types for object shapes
|
|
255
|
-
- Use utility types (Partial, Pick, Omit, Record)
|
|
256
|
-
- Implement proper generic constraints
|
|
257
|
-
- Avoid `any` type - use `unknown` when necessary
|
|
258
|
-
|
|
259
|
-
**TypeScript Config (tsconfig.json):**
|
|
125
|
+
### **Response Structure:**
|
|
260
126
|
```json
|
|
261
127
|
{
|
|
262
|
-
"
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
"
|
|
270
|
-
"
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
"allowSyntheticDefaultImports": true,
|
|
274
|
-
"forceConsistentCasingInFileNames": true,
|
|
275
|
-
"moduleResolution": "node",
|
|
276
|
-
"resolveJsonModule": true,
|
|
277
|
-
"isolatedModules": true,
|
|
278
|
-
"noEmit": true
|
|
279
|
-
},
|
|
280
|
-
"include": ["src/**/*"],
|
|
281
|
-
"exclude": ["node_modules", "dist", "build"]
|
|
282
|
-
}
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
**Concurrent Agent Execution:**
|
|
286
|
-
```typescript
|
|
287
|
-
// ✅ CORRECT: TypeScript development with strict typing
|
|
288
|
-
[Single Message]:
|
|
289
|
-
Task("TypeScript Developer", "Build type-safe modules with generics", "coder")
|
|
290
|
-
Task("Interface Designer", "Design comprehensive type definitions", "system-architect")
|
|
291
|
-
Task("Test Engineer", "Write typed tests with Jest and @types", "tester")
|
|
292
|
-
Task("Build Engineer", "Configure TypeScript compilation pipeline", "backend-dev")
|
|
293
|
-
Task("Type Reviewer", "Review type safety and consistency", "reviewer")
|
|
294
|
-
|
|
295
|
-
// Batch file operations with TypeScript focus
|
|
296
|
-
Write("src/types/api.ts")
|
|
297
|
-
Write("src/services/ApiService.ts")
|
|
298
|
-
Write("src/utils/validators.ts")
|
|
299
|
-
Write("tests/ApiService.test.ts")
|
|
300
|
-
|
|
301
|
-
// TypeScript-specific todos
|
|
302
|
-
TodoWrite({ todos: [
|
|
303
|
-
{content: "Define core type interfaces", status: "in_progress", activeForm: "Defining core type interfaces"},
|
|
304
|
-
{content: "Implement generic utility functions", status: "pending", activeForm: "Implementing generic utility functions"},
|
|
305
|
-
{content: "Add runtime type validation", status: "pending", activeForm: "Adding runtime type validation"},
|
|
306
|
-
{content: "Configure path mapping aliases", status: "pending", activeForm: "Configuring path mapping aliases"},
|
|
307
|
-
{content: "Setup strict linting rules", status: "pending", activeForm: "Setting up strict linting rules"}
|
|
308
|
-
]})
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
**Type Definitions Pattern:**
|
|
312
|
-
```typescript
|
|
313
|
-
// types/api.ts
|
|
314
|
-
export interface ApiResponse<T = unknown> {
|
|
315
|
-
data: T;
|
|
316
|
-
message: string;
|
|
317
|
-
status: 'success' | 'error';
|
|
318
|
-
timestamp: string;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
export interface PaginatedResponse<T> extends ApiResponse<T[]> {
|
|
322
|
-
pagination: {
|
|
323
|
-
page: number;
|
|
324
|
-
limit: number;
|
|
325
|
-
total: number;
|
|
326
|
-
hasNext: boolean;
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
// Generic service interface
|
|
331
|
-
export interface CRUDService<T, CreateT = Partial<T>, UpdateT = Partial<T>> {
|
|
332
|
-
getAll(): Promise<ApiResponse<T[]>>;
|
|
333
|
-
getById(id: string): Promise<ApiResponse<T>>;
|
|
334
|
-
create(data: CreateT): Promise<ApiResponse<T>>;
|
|
335
|
-
update(id: string, data: UpdateT): Promise<ApiResponse<T>>;
|
|
336
|
-
delete(id: string): Promise<ApiResponse<void>>;
|
|
337
|
-
}
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
**Advanced TypeScript Patterns:**
|
|
341
|
-
```typescript
|
|
342
|
-
// Utility types for better type inference
|
|
343
|
-
type NonNullable<T> = T extends null | undefined ? never : T;
|
|
344
|
-
|
|
345
|
-
// Conditional types for API responses
|
|
346
|
-
type ApiResult<T> = T extends string
|
|
347
|
-
? ApiResponse<string>
|
|
348
|
-
: T extends number
|
|
349
|
-
? ApiResponse<number>
|
|
350
|
-
: ApiResponse<T>;
|
|
351
|
-
|
|
352
|
-
// Template literal types for routes
|
|
353
|
-
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
354
|
-
type ApiRoute<T extends string> = `/api/${T}`;
|
|
355
|
-
|
|
356
|
-
// Branded types for stronger type safety
|
|
357
|
-
type UserId = string & { readonly __brand: unique symbol };
|
|
358
|
-
type Email = string & { readonly __brand: unique symbol };
|
|
359
|
-
|
|
360
|
-
// Factory function with proper typing
|
|
361
|
-
function createUserId(value: string): UserId {
|
|
362
|
-
// Runtime validation here
|
|
363
|
-
return value as UserId;
|
|
364
|
-
}
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
**Testing with TypeScript:**
|
|
368
|
-
```typescript
|
|
369
|
-
import { describe, it, expect, jest, beforeEach } from '@jest/globals';
|
|
370
|
-
|
|
371
|
-
interface MockApiService {
|
|
372
|
-
fetchUser: jest.MockedFunction<(id: string) => Promise<User>>;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
describe('UserService', () => {
|
|
376
|
-
let mockApi: MockApiService;
|
|
377
|
-
let userService: UserService;
|
|
378
|
-
|
|
379
|
-
beforeEach(() => {
|
|
380
|
-
mockApi = {
|
|
381
|
-
fetchUser: jest.fn()
|
|
382
|
-
};
|
|
383
|
-
userService = new UserService(mockApi);
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
it('should fetch user with proper typing', async () => {
|
|
387
|
-
const mockUser: User = {
|
|
388
|
-
id: 'user-123',
|
|
389
|
-
name: 'Test User',
|
|
390
|
-
email: 'test@example.com'
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
mockApi.fetchUser.mockResolvedValue(mockUser);
|
|
394
|
-
|
|
395
|
-
const result = await userService.getUser('user-123');
|
|
396
|
-
|
|
397
|
-
expect(result).toEqual(mockUser);
|
|
398
|
-
expect(mockApi.fetchUser).toHaveBeenCalledWith('user-123');
|
|
399
|
-
});
|
|
400
|
-
});
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
**Error Handling with Types:**
|
|
404
|
-
```typescript
|
|
405
|
-
// Result pattern for better error handling
|
|
406
|
-
type Result<T, E = Error> =
|
|
407
|
-
| { success: true; data: T }
|
|
408
|
-
| { success: false; error: E };
|
|
409
|
-
|
|
410
|
-
class ApiService {
|
|
411
|
-
async fetchData<T>(url: string): Promise<Result<T, ApiError>> {
|
|
412
|
-
try {
|
|
413
|
-
const response = await fetch(url);
|
|
414
|
-
if (!response.ok) {
|
|
415
|
-
return { success: false, error: new ApiError(response.statusText) };
|
|
416
|
-
}
|
|
417
|
-
const data = await response.json() as T;
|
|
418
|
-
return { success: true, data };
|
|
419
|
-
} catch (error) {
|
|
420
|
-
return { success: false, error: error as ApiError };
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
// Usage with proper type checking
|
|
426
|
-
const result = await apiService.fetchData<User>('/api/users/123');
|
|
427
|
-
if (result.success) {
|
|
428
|
-
console.log(result.data.name); // TypeScript knows this is User
|
|
429
|
-
} else {
|
|
430
|
-
console.error(result.error.message); // TypeScript knows this is ApiError
|
|
128
|
+
"success": true,
|
|
129
|
+
"file": "src/component.js",
|
|
130
|
+
"validation": { "passed": true, "issues": [], "coverage": "advanced" },
|
|
131
|
+
"formatting": { "needed": true, "changes": 12, "formatter": "prettier" },
|
|
132
|
+
"testing": { "executed": true, "framework": "jest", "results": {...} },
|
|
133
|
+
"tddCompliance": { "hasTests": true, "coverage": 85, "recommendations": [...] },
|
|
134
|
+
"recommendations": [
|
|
135
|
+
{ "type": "security", "priority": "high", "message": "...", "action": "..." },
|
|
136
|
+
{ "type": "formatting", "priority": "medium", "action": "prettier file.js" }
|
|
137
|
+
],
|
|
138
|
+
"memory": { "stored": true, "enhancedStore": true }
|
|
431
139
|
}
|
|
432
140
|
```
|
|
433
141
|
|
|
434
|
-
|
|
142
|
+
#### Session Management
|
|
143
|
+
```bash
|
|
144
|
+
# Generate summaries and persist state
|
|
145
|
+
npx claude-flow-novice hooks session-end --generate-summary true --persist-state true --export-metrics true
|
|
435
146
|
```
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
domain.ts # Business domain types
|
|
440
|
-
utils.ts # Utility types
|
|
441
|
-
services/
|
|
442
|
-
BaseService.ts # Generic base service
|
|
443
|
-
UserService.ts # Concrete implementations
|
|
444
|
-
utils/
|
|
445
|
-
validators.ts # Runtime type validation
|
|
446
|
-
typeGuards.ts # Type guard functions
|
|
447
|
-
hooks/ # Custom hooks (if React)
|
|
448
|
-
useApi.ts # Generic API hook
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
## React Framework Configuration
|
|
452
|
-
|
|
453
|
-
### React Development Patterns
|
|
454
|
-
|
|
455
|
-
**Component Architecture:**
|
|
456
|
-
- Use functional components with hooks
|
|
457
|
-
- Implement proper component composition
|
|
458
|
-
- Follow single responsibility principle
|
|
459
|
-
- Use TypeScript for better type safety
|
|
460
|
-
- Implement proper error boundaries
|
|
461
|
-
|
|
462
|
-
**Concurrent Agent Execution:**
|
|
463
|
-
```jsx
|
|
464
|
-
// ✅ CORRECT: React development with specialized agents
|
|
147
|
+
**Claude Code's Task tool is the PRIMARY way to spawn agents:**
|
|
148
|
+
```javascript
|
|
149
|
+
// ✅ CORRECT: Use Claude Code's Task tool for parallel agent execution
|
|
465
150
|
[Single Message]:
|
|
466
|
-
Task("
|
|
467
|
-
Task("
|
|
468
|
-
Task("
|
|
469
|
-
Task("
|
|
470
|
-
Task("
|
|
471
|
-
|
|
472
|
-
// Batch React file operations
|
|
473
|
-
Write("src/components/App.jsx")
|
|
474
|
-
Write("src/hooks/useApi.js")
|
|
475
|
-
Write("src/context/AppContext.jsx")
|
|
476
|
-
Write("src/styles/globals.css")
|
|
477
|
-
Write("tests/components/App.test.jsx")
|
|
478
|
-
|
|
479
|
-
// React-specific todos
|
|
480
|
-
TodoWrite({ todos: [
|
|
481
|
-
{content: "Setup component library structure", status: "in_progress", activeForm: "Setting up component library structure"},
|
|
482
|
-
{content: "Implement custom hooks for data fetching", status: "pending", activeForm: "Implementing custom hooks for data fetching"},
|
|
483
|
-
{content: "Add error boundaries and loading states", status: "pending", activeForm: "Adding error boundaries and loading states"},
|
|
484
|
-
{content: "Configure routing with React Router", status: "pending", activeForm: "Configuring routing with React Router"},
|
|
485
|
-
{content: "Optimize performance with memoization", status: "pending", activeForm: "Optimizing performance with memoization"}
|
|
486
|
-
]})
|
|
487
|
-
```
|
|
488
|
-
|
|
489
|
-
**Project Structure:**
|
|
490
|
-
```
|
|
491
|
-
src/
|
|
492
|
-
components/
|
|
493
|
-
common/ # Reusable UI components
|
|
494
|
-
Button.jsx
|
|
495
|
-
Modal.jsx
|
|
496
|
-
Input.jsx
|
|
497
|
-
layout/ # Layout components
|
|
498
|
-
Header.jsx
|
|
499
|
-
Sidebar.jsx
|
|
500
|
-
Footer.jsx
|
|
501
|
-
pages/ # Page-level components
|
|
502
|
-
HomePage.jsx
|
|
503
|
-
UserProfile.jsx
|
|
504
|
-
hooks/ # Custom hooks
|
|
505
|
-
useApi.js
|
|
506
|
-
useLocalStorage.js
|
|
507
|
-
useAuth.js
|
|
508
|
-
context/ # React context providers
|
|
509
|
-
AuthContext.jsx
|
|
510
|
-
ThemeContext.jsx
|
|
511
|
-
services/ # API services
|
|
512
|
-
api.js
|
|
513
|
-
auth.js
|
|
514
|
-
utils/ # Helper functions
|
|
515
|
-
validators.js
|
|
516
|
-
formatters.js
|
|
517
|
-
styles/ # Global styles
|
|
518
|
-
globals.css
|
|
519
|
-
variables.css
|
|
520
|
-
```
|
|
521
|
-
|
|
522
|
-
**Component Patterns:**
|
|
523
|
-
```jsx
|
|
524
|
-
import React, { useState, useEffect, useCallback, useMemo } from 'react';
|
|
525
|
-
import PropTypes from 'prop-types';
|
|
526
|
-
|
|
527
|
-
// Functional component with hooks
|
|
528
|
-
const UserProfile = ({ userId, onUpdate }) => {
|
|
529
|
-
const [user, setUser] = useState(null);
|
|
530
|
-
const [loading, setLoading] = useState(true);
|
|
531
|
-
const [error, setError] = useState(null);
|
|
532
|
-
|
|
533
|
-
// Memoized expensive calculations
|
|
534
|
-
const userStats = useMemo(() => {
|
|
535
|
-
if (!user) return null;
|
|
536
|
-
return {
|
|
537
|
-
totalPosts: user.posts?.length || 0,
|
|
538
|
-
joinedDate: new Date(user.createdAt).toLocaleDateString()
|
|
539
|
-
};
|
|
540
|
-
}, [user]);
|
|
541
|
-
|
|
542
|
-
// Memoized callbacks to prevent unnecessary re-renders
|
|
543
|
-
const handleUpdateUser = useCallback(async (updates) => {
|
|
544
|
-
try {
|
|
545
|
-
const updatedUser = await updateUser(userId, updates);
|
|
546
|
-
setUser(updatedUser);
|
|
547
|
-
onUpdate?.(updatedUser);
|
|
548
|
-
} catch (err) {
|
|
549
|
-
setError(err.message);
|
|
550
|
-
}
|
|
551
|
-
}, [userId, onUpdate]);
|
|
552
|
-
|
|
553
|
-
useEffect(() => {
|
|
554
|
-
let cancelled = false;
|
|
555
|
-
|
|
556
|
-
const fetchUser = async () => {
|
|
557
|
-
try {
|
|
558
|
-
setLoading(true);
|
|
559
|
-
const userData = await getUserById(userId);
|
|
560
|
-
if (!cancelled) {
|
|
561
|
-
setUser(userData);
|
|
562
|
-
}
|
|
563
|
-
} catch (err) {
|
|
564
|
-
if (!cancelled) {
|
|
565
|
-
setError(err.message);
|
|
566
|
-
}
|
|
567
|
-
} finally {
|
|
568
|
-
if (!cancelled) {
|
|
569
|
-
setLoading(false);
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
};
|
|
573
|
-
|
|
574
|
-
fetchUser();
|
|
575
|
-
|
|
576
|
-
return () => {
|
|
577
|
-
cancelled = true;
|
|
578
|
-
};
|
|
579
|
-
}, [userId]);
|
|
580
|
-
|
|
581
|
-
if (loading) return <LoadingSpinner />;
|
|
582
|
-
if (error) return <ErrorMessage message={error} />;
|
|
583
|
-
if (!user) return <NotFound />;
|
|
584
|
-
|
|
585
|
-
return (
|
|
586
|
-
<div className="user-profile">
|
|
587
|
-
<ProfileHeader user={user} stats={userStats} />
|
|
588
|
-
<ProfileContent user={user} onUpdate={handleUpdateUser} />
|
|
589
|
-
</div>
|
|
590
|
-
);
|
|
591
|
-
};
|
|
592
|
-
|
|
593
|
-
UserProfile.propTypes = {
|
|
594
|
-
userId: PropTypes.string.isRequired,
|
|
595
|
-
onUpdate: PropTypes.func
|
|
596
|
-
};
|
|
597
|
-
|
|
598
|
-
export default React.memo(UserProfile);
|
|
599
|
-
```
|
|
600
|
-
|
|
601
|
-
**Custom Hooks Pattern:**
|
|
602
|
-
```jsx
|
|
603
|
-
import { useState, useEffect, useCallback } from 'react';
|
|
604
|
-
|
|
605
|
-
// Generic API hook
|
|
606
|
-
export const useApi = (url, options = {}) => {
|
|
607
|
-
const [data, setData] = useState(null);
|
|
608
|
-
const [loading, setLoading] = useState(true);
|
|
609
|
-
const [error, setError] = useState(null);
|
|
610
|
-
|
|
611
|
-
const fetchData = useCallback(async () => {
|
|
612
|
-
try {
|
|
613
|
-
setLoading(true);
|
|
614
|
-
setError(null);
|
|
615
|
-
const response = await fetch(url, options);
|
|
616
|
-
|
|
617
|
-
if (!response.ok) {
|
|
618
|
-
throw new Error(`HTTP error! status: ${response.status}`);
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
const result = await response.json();
|
|
622
|
-
setData(result);
|
|
623
|
-
} catch (err) {
|
|
624
|
-
setError(err.message);
|
|
625
|
-
} finally {
|
|
626
|
-
setLoading(false);
|
|
627
|
-
}
|
|
628
|
-
}, [url, options]);
|
|
629
|
-
|
|
630
|
-
useEffect(() => {
|
|
631
|
-
fetchData();
|
|
632
|
-
}, [fetchData]);
|
|
633
|
-
|
|
634
|
-
const refetch = useCallback(() => {
|
|
635
|
-
fetchData();
|
|
636
|
-
}, [fetchData]);
|
|
637
|
-
|
|
638
|
-
return { data, loading, error, refetch };
|
|
639
|
-
};
|
|
640
|
-
|
|
641
|
-
// Local storage hook
|
|
642
|
-
export const useLocalStorage = (key, initialValue) => {
|
|
643
|
-
const [storedValue, setStoredValue] = useState(() => {
|
|
644
|
-
try {
|
|
645
|
-
const item = window.localStorage.getItem(key);
|
|
646
|
-
return item ? JSON.parse(item) : initialValue;
|
|
647
|
-
} catch (error) {
|
|
648
|
-
console.error(`Error reading localStorage key "${key}":`, error);
|
|
649
|
-
return initialValue;
|
|
650
|
-
}
|
|
651
|
-
});
|
|
652
|
-
|
|
653
|
-
const setValue = useCallback((value) => {
|
|
654
|
-
try {
|
|
655
|
-
const valueToStore = value instanceof Function ? value(storedValue) : value;
|
|
656
|
-
setStoredValue(valueToStore);
|
|
657
|
-
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
658
|
-
} catch (error) {
|
|
659
|
-
console.error(`Error setting localStorage key "${key}":`, error);
|
|
660
|
-
}
|
|
661
|
-
}, [key, storedValue]);
|
|
662
|
-
|
|
663
|
-
return [storedValue, setValue];
|
|
664
|
-
};
|
|
665
|
-
```
|
|
666
|
-
|
|
667
|
-
**Context Pattern:**
|
|
668
|
-
```jsx
|
|
669
|
-
import React, { createContext, useContext, useReducer, useCallback } from 'react';
|
|
670
|
-
|
|
671
|
-
// State and actions
|
|
672
|
-
const initialState = {
|
|
673
|
-
user: null,
|
|
674
|
-
isAuthenticated: false,
|
|
675
|
-
loading: false,
|
|
676
|
-
error: null
|
|
677
|
-
};
|
|
678
|
-
|
|
679
|
-
const authReducer = (state, action) => {
|
|
680
|
-
switch (action.type) {
|
|
681
|
-
case 'LOGIN_START':
|
|
682
|
-
return { ...state, loading: true, error: null };
|
|
683
|
-
case 'LOGIN_SUCCESS':
|
|
684
|
-
return {
|
|
685
|
-
...state,
|
|
686
|
-
user: action.payload,
|
|
687
|
-
isAuthenticated: true,
|
|
688
|
-
loading: false,
|
|
689
|
-
error: null
|
|
690
|
-
};
|
|
691
|
-
case 'LOGIN_FAILURE':
|
|
692
|
-
return {
|
|
693
|
-
...state,
|
|
694
|
-
user: null,
|
|
695
|
-
isAuthenticated: false,
|
|
696
|
-
loading: false,
|
|
697
|
-
error: action.payload
|
|
698
|
-
};
|
|
699
|
-
case 'LOGOUT':
|
|
700
|
-
return initialState;
|
|
701
|
-
default:
|
|
702
|
-
return state;
|
|
703
|
-
}
|
|
704
|
-
};
|
|
705
|
-
|
|
706
|
-
// Context creation
|
|
707
|
-
const AuthContext = createContext();
|
|
708
|
-
|
|
709
|
-
// Provider component
|
|
710
|
-
export const AuthProvider = ({ children }) => {
|
|
711
|
-
const [state, dispatch] = useReducer(authReducer, initialState);
|
|
712
|
-
|
|
713
|
-
const login = useCallback(async (credentials) => {
|
|
714
|
-
dispatch({ type: 'LOGIN_START' });
|
|
715
|
-
try {
|
|
716
|
-
const user = await authService.login(credentials);
|
|
717
|
-
dispatch({ type: 'LOGIN_SUCCESS', payload: user });
|
|
718
|
-
return user;
|
|
719
|
-
} catch (error) {
|
|
720
|
-
dispatch({ type: 'LOGIN_FAILURE', payload: error.message });
|
|
721
|
-
throw error;
|
|
722
|
-
}
|
|
723
|
-
}, []);
|
|
724
|
-
|
|
725
|
-
const logout = useCallback(() => {
|
|
726
|
-
authService.logout();
|
|
727
|
-
dispatch({ type: 'LOGOUT' });
|
|
728
|
-
}, []);
|
|
729
|
-
|
|
730
|
-
const value = {
|
|
731
|
-
...state,
|
|
732
|
-
login,
|
|
733
|
-
logout
|
|
734
|
-
};
|
|
735
|
-
|
|
736
|
-
return (
|
|
737
|
-
<AuthContext.Provider value={value}>
|
|
738
|
-
{children}
|
|
739
|
-
</AuthContext.Provider>
|
|
740
|
-
);
|
|
741
|
-
};
|
|
742
|
-
|
|
743
|
-
// Custom hook for using auth context
|
|
744
|
-
export const useAuth = () => {
|
|
745
|
-
const context = useContext(AuthContext);
|
|
746
|
-
if (!context) {
|
|
747
|
-
throw new Error('useAuth must be used within an AuthProvider');
|
|
748
|
-
}
|
|
749
|
-
return context;
|
|
750
|
-
};
|
|
751
|
-
```
|
|
752
|
-
|
|
753
|
-
**Testing with React Testing Library:**
|
|
754
|
-
```jsx
|
|
755
|
-
import React from 'react';
|
|
756
|
-
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
757
|
-
import userEvent from '@testing-library/user-event';
|
|
758
|
-
import { jest } from '@jest/globals';
|
|
759
|
-
import UserProfile from '../UserProfile';
|
|
760
|
-
import * as api from '../../services/api';
|
|
761
|
-
|
|
762
|
-
// Mock the API module
|
|
763
|
-
jest.mock('../../services/api');
|
|
764
|
-
|
|
765
|
-
describe('UserProfile', () => {
|
|
766
|
-
const mockUser = {
|
|
767
|
-
id: '123',
|
|
768
|
-
name: 'John Doe',
|
|
769
|
-
email: 'john@example.com',
|
|
770
|
-
posts: [{ id: 1, title: 'Test Post' }]
|
|
771
|
-
};
|
|
772
|
-
|
|
773
|
-
beforeEach(() => {
|
|
774
|
-
jest.clearAllMocks();
|
|
775
|
-
});
|
|
776
|
-
|
|
777
|
-
test('renders user profile after loading', async () => {
|
|
778
|
-
api.getUserById.mockResolvedValue(mockUser);
|
|
779
|
-
|
|
780
|
-
render(<UserProfile userId="123" />);
|
|
781
|
-
|
|
782
|
-
// Check loading state
|
|
783
|
-
expect(screen.getByTestId('loading-spinner')).toBeInTheDocument();
|
|
784
|
-
|
|
785
|
-
// Wait for user data to load
|
|
786
|
-
await waitFor(() => {
|
|
787
|
-
expect(screen.getByText('John Doe')).toBeInTheDocument();
|
|
788
|
-
});
|
|
789
|
-
|
|
790
|
-
expect(screen.getByText('john@example.com')).toBeInTheDocument();
|
|
791
|
-
expect(screen.getByText('1 Posts')).toBeInTheDocument();
|
|
792
|
-
});
|
|
793
|
-
|
|
794
|
-
test('handles update user interaction', async () => {
|
|
795
|
-
const user = userEvent.setup();
|
|
796
|
-
const onUpdate = jest.fn();
|
|
797
|
-
|
|
798
|
-
api.getUserById.mockResolvedValue(mockUser);
|
|
799
|
-
api.updateUser.mockResolvedValue({ ...mockUser, name: 'Jane Doe' });
|
|
800
|
-
|
|
801
|
-
render(<UserProfile userId="123" onUpdate={onUpdate} />);
|
|
802
|
-
|
|
803
|
-
await waitFor(() => {
|
|
804
|
-
expect(screen.getByText('John Doe')).toBeInTheDocument();
|
|
805
|
-
});
|
|
806
|
-
|
|
807
|
-
const editButton = screen.getByRole('button', { name: /edit/i });
|
|
808
|
-
await user.click(editButton);
|
|
809
|
-
|
|
810
|
-
const nameInput = screen.getByDisplayValue('John Doe');
|
|
811
|
-
await user.clear(nameInput);
|
|
812
|
-
await user.type(nameInput, 'Jane Doe');
|
|
813
|
-
|
|
814
|
-
const saveButton = screen.getByRole('button', { name: /save/i });
|
|
815
|
-
await user.click(saveButton);
|
|
816
|
-
|
|
817
|
-
await waitFor(() => {
|
|
818
|
-
expect(onUpdate).toHaveBeenCalledWith({ ...mockUser, name: 'Jane Doe' });
|
|
819
|
-
});
|
|
820
|
-
});
|
|
821
|
-
|
|
822
|
-
test('displays error message on API failure', async () => {
|
|
823
|
-
api.getUserById.mockRejectedValue(new Error('Network error'));
|
|
824
|
-
|
|
825
|
-
render(<UserProfile userId="123" />);
|
|
826
|
-
|
|
827
|
-
await waitFor(() => {
|
|
828
|
-
expect(screen.getByText(/network error/i)).toBeInTheDocument();
|
|
829
|
-
});
|
|
830
|
-
});
|
|
831
|
-
});
|
|
832
|
-
```
|
|
833
|
-
|
|
834
|
-
**Performance Optimization:**
|
|
835
|
-
```jsx
|
|
836
|
-
import React, { memo, lazy, Suspense } from 'react';
|
|
837
|
-
|
|
838
|
-
// Lazy loading for code splitting
|
|
839
|
-
const LazyUserProfile = lazy(() => import('./UserProfile'));
|
|
840
|
-
const LazyUserSettings = lazy(() => import('./UserSettings'));
|
|
841
|
-
|
|
842
|
-
// Memoized component to prevent unnecessary re-renders
|
|
843
|
-
const UserCard = memo(({ user, onUpdate }) => {
|
|
844
|
-
return (
|
|
845
|
-
<div className="user-card">
|
|
846
|
-
<h3>{user.name}</h3>
|
|
847
|
-
<p>{user.email}</p>
|
|
848
|
-
<button onClick={() => onUpdate(user.id)}>
|
|
849
|
-
Update
|
|
850
|
-
</button>
|
|
851
|
-
</div>
|
|
852
|
-
);
|
|
853
|
-
});
|
|
854
|
-
|
|
855
|
-
// Main app with lazy loading
|
|
856
|
-
const App = () => {
|
|
857
|
-
return (
|
|
858
|
-
<div className="app">
|
|
859
|
-
<Suspense fallback={<div>Loading...</div>}>
|
|
860
|
-
<Routes>
|
|
861
|
-
<Route path="/profile" element={<LazyUserProfile />} />
|
|
862
|
-
<Route path="/settings" element={<LazyUserSettings />} />
|
|
863
|
-
</Routes>
|
|
864
|
-
</Suspense>
|
|
865
|
-
</div>
|
|
866
|
-
);
|
|
867
|
-
};
|
|
151
|
+
Task("Research agent", "Analyze requirements and patterns...", "researcher")
|
|
152
|
+
Task("Coder agent", "Implement core features...", "coder")
|
|
153
|
+
Task("Tester agent", "Create comprehensive tests...", "tester")
|
|
154
|
+
Task("Reviewer agent", "Review code quality...", "reviewer")
|
|
155
|
+
Task("Architect agent", "Design system architecture...", "system-architect")
|
|
868
156
|
```
|
|
869
157
|
|
|
870
|
-
**
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
}));
|
|
904
|
-
return updatedUser;
|
|
905
|
-
}
|
|
906
|
-
}),
|
|
907
|
-
{ name: 'user-store' }
|
|
908
|
-
)
|
|
909
|
-
)
|
|
910
|
-
);
|
|
911
|
-
|
|
912
|
-
// Usage in component
|
|
913
|
-
const UserList = () => {
|
|
914
|
-
const { users, loading, fetchUsers } = useUserStore();
|
|
915
|
-
|
|
916
|
-
useEffect(() => {
|
|
917
|
-
fetchUsers();
|
|
918
|
-
}, [fetchUsers]);
|
|
919
|
-
|
|
920
|
-
if (loading) return <LoadingSpinner />;
|
|
921
|
-
|
|
922
|
-
return (
|
|
923
|
-
<div>
|
|
924
|
-
{users.map((user) => (
|
|
925
|
-
<UserCard key={user.id} user={user} />
|
|
926
|
-
))}
|
|
927
|
-
</div>
|
|
928
|
-
);
|
|
929
|
-
};
|
|
930
|
-
```
|
|
931
|
-
|
|
932
|
-
## 🚀 Concurrent Execution Patterns
|
|
933
|
-
|
|
934
|
-
### JavaScript/TypeScript Patterns
|
|
935
|
-
|
|
936
|
-
```javascript
|
|
937
|
-
// ✅ CORRECT: Batch all operations in single message
|
|
938
|
-
[Single Message]:
|
|
939
|
-
Task("Frontend Developer", "Build React components with hooks", "coder")
|
|
940
|
-
Task("Backend Developer", "Create Express API endpoints", "backend-dev")
|
|
941
|
-
Task("Test Engineer", "Write Jest tests with >80% coverage", "tester")
|
|
942
|
-
|
|
943
|
-
// Batch file operations
|
|
944
|
-
Write("src/components/App.jsx")
|
|
945
|
-
Write("src/api/server.js")
|
|
946
|
-
Write("tests/App.test.js")
|
|
947
|
-
```
|
|
948
|
-
|
|
949
|
-
### Python Patterns
|
|
950
|
-
|
|
951
|
-
```python
|
|
952
|
-
# ✅ CORRECT: Parallel agent execution
|
|
953
|
-
[Single Message]:
|
|
954
|
-
Task("Django Developer", "Build models and views with DRF", "backend-dev")
|
|
955
|
-
Task("Frontend Developer", "Create React frontend with API integration", "coder")
|
|
956
|
-
Task("Test Engineer", "Write pytest tests with fixtures", "tester")
|
|
957
|
-
|
|
958
|
-
# Batch Python operations
|
|
959
|
-
Write("apps/models.py")
|
|
960
|
-
Write("apps/views.py")
|
|
961
|
-
Write("tests/test_models.py")
|
|
962
|
-
```
|
|
963
|
-
|
|
964
|
-
### React Development Patterns
|
|
965
|
-
|
|
966
|
-
```javascript
|
|
967
|
-
// React-specific concurrent patterns
|
|
968
|
-
[Single Message]:
|
|
969
|
-
Task("Component Developer", "Build reusable components with TypeScript", "coder")
|
|
970
|
-
Task("State Manager", "Implement Redux/Context state management", "coder")
|
|
971
|
-
Task("Test Engineer", "Write React Testing Library tests", "tester")
|
|
972
|
-
Task("Style Developer", "Create responsive CSS/Styled Components", "coder")
|
|
973
|
-
```
|
|
974
|
-
|
|
975
|
-
### API Development Patterns
|
|
976
|
-
|
|
977
|
-
```bash
|
|
978
|
-
# API-focused concurrent execution
|
|
979
|
-
[Single Message]:
|
|
980
|
-
Task("API Developer", "Build RESTful endpoints with validation", "backend-dev")
|
|
981
|
-
Task("Database Designer", "Design schema and migrations", "code-analyzer")
|
|
982
|
-
Task("Security Engineer", "Implement authentication and authorization", "reviewer")
|
|
983
|
-
Task("API Tester", "Create integration and unit tests", "tester")
|
|
984
|
-
Task("Documentation Writer", "Generate OpenAPI/Swagger docs", "researcher")
|
|
985
|
-
```
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
## 📋 Best Practices
|
|
990
|
-
|
|
991
|
-
### General Development
|
|
992
|
-
- **Modular Design**: Keep files under 500 lines
|
|
993
|
-
- **Environment Safety**: Never hardcode secrets
|
|
994
|
-
- **Test-First**: Write tests before implementation
|
|
995
|
-
- **Clean Architecture**: Separate concerns
|
|
996
|
-
- **Documentation**: Keep updated
|
|
997
|
-
|
|
998
|
-
### JavaScript/TypeScript
|
|
999
|
-
- **ES6+ Features**: Use modern JavaScript syntax
|
|
1000
|
-
- **Type Safety**: Prefer TypeScript for larger projects
|
|
1001
|
-
- **Async/Await**: Use async/await over Promise chains
|
|
1002
|
-
- **Error Handling**: Implement proper error boundaries
|
|
1003
|
-
- **Code Splitting**: Lazy load components and routes
|
|
1004
|
-
|
|
1005
|
-
### Python
|
|
1006
|
-
- **PEP 8**: Follow Python style guidelines
|
|
1007
|
-
- **Type Hints**: Use type annotations for clarity
|
|
1008
|
-
- **Virtual Environments**: Always use venv or conda
|
|
1009
|
-
- **Docstrings**: Document all functions and classes
|
|
1010
|
-
- **Error Handling**: Use specific exception types
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
## 🧪 Testing Patterns
|
|
1015
|
-
|
|
1016
|
-
### React Testing
|
|
1017
|
-
|
|
1018
|
-
```javascript
|
|
1019
|
-
import { render, screen, fireEvent } from '@testing-library/react';
|
|
1020
|
-
import userEvent from '@testing-library/user-event';
|
|
1021
|
-
|
|
1022
|
-
// Component testing pattern
|
|
1023
|
-
describe('Component', () => {
|
|
1024
|
-
test('renders and handles interaction', async () => {
|
|
1025
|
-
const user = userEvent.setup();
|
|
1026
|
-
render(<Component />);
|
|
1027
|
-
|
|
1028
|
-
const button = screen.getByRole('button');
|
|
1029
|
-
await user.click(button);
|
|
1030
|
-
|
|
1031
|
-
expect(screen.getByText(/result/i)).toBeInTheDocument();
|
|
1032
|
-
});
|
|
1033
|
-
});
|
|
1034
|
-
```
|
|
1035
|
-
|
|
1036
|
-
### Python Testing
|
|
1037
|
-
|
|
1038
|
-
```python
|
|
1039
|
-
import pytest
|
|
1040
|
-
from unittest.mock import patch, MagicMock
|
|
1041
|
-
|
|
1042
|
-
class TestAPI:
|
|
1043
|
-
@pytest.fixture
|
|
1044
|
-
def client(self):
|
|
1045
|
-
return TestClient()
|
|
1046
|
-
|
|
1047
|
-
def test_endpoint(self, client):
|
|
1048
|
-
response = client.get("/api/endpoint")
|
|
1049
|
-
assert response.status_code == 200
|
|
1050
|
-
assert response.json()["status"] == "success"
|
|
1051
|
-
```
|
|
1052
|
-
|
|
158
|
+
**MCP tools are ONLY for coordination setup:**
|
|
159
|
+
### MCP Integration
|
|
160
|
+
**TRIGGER WORDS: SWARM, SPAWN, COORDINATE, TEAM**
|
|
161
|
+
- `mcp__claude-flow-novice__swarm_init` - Initialize coordination topology
|
|
162
|
+
- `mcp__claude-flow-novice__agent_spawn` - Define agent types for coordination
|
|
163
|
+
- `mcp__claude-flow-novice__task_orchestrate` - Orchestrate high-level workflows
|
|
164
|
+
- **Monitoring**: `swarm_status`, `agent_metrics`, `task_results`
|
|
165
|
+
- **Memory**: `memory_usage`, `memory_search`
|
|
166
|
+
|
|
167
|
+
## File Organization
|
|
168
|
+
- **Never save working files to root**
|
|
169
|
+
|
|
170
|
+
# Add MCP server
|
|
171
|
+
claude mcp add claude-flow-novice npx claude-flow-novice mcp start
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
## Essential Commands
|
|
175
|
+
- `npx claude-flow-novice status` - System health
|
|
176
|
+
- `npx claude-flow-novice --help` - Available commands
|
|
177
|
+
- `/fullstack "goal"` - Launch full-stack development team with consensus validation
|
|
178
|
+
- `/swarm`, `/sparc`, `/hooks` - Other slash commands (auto-discovered)
|
|
179
|
+
|
|
180
|
+
## DEVELOPMENT FLOW
|
|
181
|
+
1. Execute - Primary swarm (3-8 agents) produces deliverables with confidence score
|
|
182
|
+
1a. Only when the swarm believes its done move to step 2.
|
|
183
|
+
1b. If swarm does not believe it's done (confidence scores < 75%, repeat step 1)
|
|
184
|
+
2. Verify - Consensus swarm (2-4 validators) runs comprehensive checks with Byzantine voting
|
|
185
|
+
3. Decision - PASS (≥90% agreement + critical criteria) OR FAIL
|
|
186
|
+
4. Action -
|
|
187
|
+
- PASS → Store results → Move to next task
|
|
188
|
+
- FAIL → Round++ → If <10: inject feedback → Relaunch swarm | If ≥10: Escalate to human
|
|
189
|
+
5. Repeat - Iterative improvement with accumulated context from all previous rounds
|
|
190
|
+
6. Escalate - Full history + feedback + recommendations after 10 rounds
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-flow-novice",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.2",
|
|
4
4
|
"description": "Standalone Claude Flow for beginners - AI agent orchestration made easy with enhanced TDD testing pipeline. Enhanced init command creates complete agent system, MCP configuration with 30 essential tools, and automated hooks with single-file testing, real-time coverage analysis, and advanced validation. Fully standalone with zero external dependencies, complete project setup in one command.",
|
|
5
5
|
"mcpName": "io.github.ruvnet/claude-flow",
|
|
6
6
|
"main": ".claude-flow-novice/dist/index.js",
|
|
@@ -174,7 +174,8 @@ claude mcp add claude-flow-novice npx claude-flow-novice mcp start
|
|
|
174
174
|
## Essential Commands
|
|
175
175
|
- `npx claude-flow-novice status` - System health
|
|
176
176
|
- `npx claude-flow-novice --help` - Available commands
|
|
177
|
-
- `/
|
|
177
|
+
- `/fullstack "goal"` - Launch full-stack development team with consensus validation
|
|
178
|
+
- `/swarm`, `/sparc`, `/hooks` - Other slash commands (auto-discovered)
|
|
178
179
|
|
|
179
180
|
## DEVELOPMENT FLOW
|
|
180
181
|
1. Execute - Primary swarm (3-8 agents) produces deliverables with confidence score
|