claude-flow-novice 1.5.18 → 1.5.20
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-flow-novice/dist/config/hooks/post-edit-pipeline.js +30 -0
- package/.claude-flow-novice/dist/src/agents/frontend/index.js +124 -0
- package/.claude-flow-novice/dist/src/agents/frontend/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/agents/frontend/interaction-tester.js +146 -0
- package/.claude-flow-novice/dist/src/agents/frontend/interaction-tester.js.map +1 -0
- package/.claude-flow-novice/dist/src/agents/frontend/state-architect.js +146 -0
- package/.claude-flow-novice/dist/src/agents/frontend/state-architect.js.map +1 -0
- package/.claude-flow-novice/dist/src/agents/frontend/ui-designer.js +100 -0
- package/.claude-flow-novice/dist/src/agents/frontend/ui-designer.js.map +1 -0
- package/CHANGELOG.md +22 -0
- package/package.json +1 -1
- package/src/cli/simple-commands/init/templates/settings.json.enhanced +20 -2
|
@@ -1505,6 +1505,36 @@ class UnifiedPostEditPipeline {
|
|
|
1505
1505
|
|
|
1506
1506
|
async run(filePath, options = {}) {
|
|
1507
1507
|
const language = this.detectLanguage(filePath);
|
|
1508
|
+
|
|
1509
|
+
// Bypass non-code files (config/documentation)
|
|
1510
|
+
const bypassExtensions = ['.toml', '.md', '.txt', '.json', '.yaml', '.yml'];
|
|
1511
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
1512
|
+
if (bypassExtensions.includes(ext)) {
|
|
1513
|
+
console.log(`\n⏭️ BYPASSED: ${ext} files don't require validation`);
|
|
1514
|
+
return {
|
|
1515
|
+
file: filePath,
|
|
1516
|
+
language,
|
|
1517
|
+
timestamp: new Date().toISOString(),
|
|
1518
|
+
editId: `edit-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
1519
|
+
agentContext: this.extractAgentContext(options),
|
|
1520
|
+
status: 'BYPASSED',
|
|
1521
|
+
bypassed: true,
|
|
1522
|
+
reason: `${ext} files are configuration/documentation and don't require validation`,
|
|
1523
|
+
summary: {
|
|
1524
|
+
success: true,
|
|
1525
|
+
warnings: [],
|
|
1526
|
+
errors: [],
|
|
1527
|
+
suggestions: []
|
|
1528
|
+
}
|
|
1529
|
+
};
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
// Auto-enable Rust strict mode for .rs files
|
|
1533
|
+
if (language === 'rust' && !this.rustStrict) {
|
|
1534
|
+
this.rustStrict = true;
|
|
1535
|
+
console.log('🦀 Auto-enabled Rust strict mode for .rs file');
|
|
1536
|
+
}
|
|
1537
|
+
|
|
1508
1538
|
const results = {
|
|
1509
1539
|
file: filePath,
|
|
1510
1540
|
language,
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frontend Agent Team
|
|
3
|
+
* Coordinates UI design, interaction testing, and state architecture
|
|
4
|
+
*/ export { UIDesigner } from './ui-designer';
|
|
5
|
+
export { InteractionTester } from './interaction-tester';
|
|
6
|
+
export { StateArchitect } from './state-architect';
|
|
7
|
+
export const FRONTEND_TEAM_CAPABILITIES = {
|
|
8
|
+
uiDesigner: {
|
|
9
|
+
name: 'UI Designer',
|
|
10
|
+
description: 'Component design, layout, accessibility, shadcn integration',
|
|
11
|
+
mcpTools: [
|
|
12
|
+
'mcp__shadcn__getComponents',
|
|
13
|
+
'mcp__shadcn__getComponent'
|
|
14
|
+
],
|
|
15
|
+
expertise: [
|
|
16
|
+
'react',
|
|
17
|
+
'tailwindcss',
|
|
18
|
+
'shadcn/ui',
|
|
19
|
+
'responsive-design',
|
|
20
|
+
'accessibility'
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
interactionTester: {
|
|
24
|
+
name: 'Interaction Tester',
|
|
25
|
+
description: 'Browser automation, user flows, visual regression, Playwright integration',
|
|
26
|
+
mcpTools: [
|
|
27
|
+
'mcp__playwright__browser_navigate',
|
|
28
|
+
'mcp__playwright__browser_click',
|
|
29
|
+
'mcp__playwright__browser_snapshot',
|
|
30
|
+
'mcp__playwright__browser_take_screenshot'
|
|
31
|
+
],
|
|
32
|
+
expertise: [
|
|
33
|
+
'playwright',
|
|
34
|
+
'e2e-testing',
|
|
35
|
+
'visual-testing',
|
|
36
|
+
'accessibility-testing'
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
stateArchitect: {
|
|
40
|
+
name: 'State Architect',
|
|
41
|
+
description: 'State management, data flow, sequential planning',
|
|
42
|
+
mcpTools: [
|
|
43
|
+
'mcp__sequential-thinking'
|
|
44
|
+
],
|
|
45
|
+
expertise: [
|
|
46
|
+
'zustand',
|
|
47
|
+
'react-query',
|
|
48
|
+
'state-management',
|
|
49
|
+
'data-fetching',
|
|
50
|
+
'architecture'
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Frontend team coordination
|
|
56
|
+
*/ export class FrontendTeam {
|
|
57
|
+
/**
|
|
58
|
+
* Coordinate full frontend implementation
|
|
59
|
+
*/ static async coordinateImplementation(requirements) {
|
|
60
|
+
return {
|
|
61
|
+
phase: 'coordination',
|
|
62
|
+
teams: [
|
|
63
|
+
{
|
|
64
|
+
agent: 'state-architect',
|
|
65
|
+
task: 'Design state architecture',
|
|
66
|
+
priority: 1
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
agent: 'ui-designer',
|
|
70
|
+
task: 'Design component hierarchy',
|
|
71
|
+
priority: 2
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
agent: 'interaction-tester',
|
|
75
|
+
task: 'Plan test scenarios',
|
|
76
|
+
priority: 3
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
mcpIntegration: {
|
|
80
|
+
sequentialThinking: 'Planning agent coordination',
|
|
81
|
+
shadcn: 'Component specifications',
|
|
82
|
+
playwright: 'Interaction validation'
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Recommended agent spawning pattern
|
|
88
|
+
*/ static getSpawnPattern(complexity) {
|
|
89
|
+
const patterns = {
|
|
90
|
+
simple: {
|
|
91
|
+
agents: [
|
|
92
|
+
'ui-designer',
|
|
93
|
+
'interaction-tester'
|
|
94
|
+
],
|
|
95
|
+
topology: 'mesh',
|
|
96
|
+
maxAgents: 2
|
|
97
|
+
},
|
|
98
|
+
medium: {
|
|
99
|
+
agents: [
|
|
100
|
+
'state-architect',
|
|
101
|
+
'ui-designer',
|
|
102
|
+
'interaction-tester'
|
|
103
|
+
],
|
|
104
|
+
topology: 'mesh',
|
|
105
|
+
maxAgents: 3
|
|
106
|
+
},
|
|
107
|
+
complex: {
|
|
108
|
+
agents: [
|
|
109
|
+
'state-architect',
|
|
110
|
+
'ui-designer',
|
|
111
|
+
'ui-designer',
|
|
112
|
+
'interaction-tester',
|
|
113
|
+
'interaction-tester'
|
|
114
|
+
],
|
|
115
|
+
topology: 'hierarchical',
|
|
116
|
+
maxAgents: 5
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
return patterns[complexity];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export default FrontendTeam;
|
|
123
|
+
|
|
124
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/agents/frontend/index.ts"],"names":["UIDesigner","InteractionTester","StateArchitect","FRONTEND_TEAM_CAPABILITIES","uiDesigner","name","description","mcpTools","expertise","interactionTester","stateArchitect","FrontendTeam","coordinateImplementation","requirements","phase","teams","agent","task","priority","mcpIntegration","sequentialThinking","shadcn","playwright","getSpawnPattern","complexity","patterns","simple","agents","topology","maxAgents","medium","complex"],"mappings":"AAAA;;;CAGC,GAED,SAASA,UAAU,QAAQ,gBAAgB;AAC3C,SAASC,iBAAiB,QAAQ,uBAAuB;AACzD,SAASC,cAAc,QAAQ,oBAAoB;AAEnD,OAAO,MAAMC,6BAA6B;IACxCC,YAAY;QACVC,MAAM;QACNC,aAAa;QACbC,UAAU;YAAC;YAA8B;SAA4B;QACrEC,WAAW;YAAC;YAAS;YAAe;YAAa;YAAqB;SAAgB;IACxF;IACAC,mBAAmB;QACjBJ,MAAM;QACNC,aAAa;QACbC,UAAU;YACR;YACA;YACA;YACA;SACD;QACDC,WAAW;YAAC;YAAc;YAAe;YAAkB;SAAwB;IACrF;IACAE,gBAAgB;QACdL,MAAM;QACNC,aAAa;QACbC,UAAU;YAAC;SAA2B;QACtCC,WAAW;YAAC;YAAW;YAAe;YAAoB;YAAiB;SAAe;IAC5F;AACF,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMG;IACX;;GAEC,GACD,aAAaC,yBAAyBC,YAAiB,EAAgB;QACrE,OAAO;YACLC,OAAO;YACPC,OAAO;gBACL;oBAAEC,OAAO;oBAAmBC,MAAM;oBAA6BC,UAAU;gBAAE;gBAC3E;oBAAEF,OAAO;oBAAeC,MAAM;oBAA8BC,UAAU;gBAAE;gBACxE;oBAAEF,OAAO;oBAAsBC,MAAM;oBAAuBC,UAAU;gBAAE;aACzE;YACDC,gBAAgB;gBACdC,oBAAoB;gBACpBC,QAAQ;gBACRC,YAAY;YACd;QACF;IACF;IAEA;;GAEC,GACD,OAAOC,gBAAgBC,UAA2C,EAAO;QACvE,MAAMC,WAAW;YACfC,QAAQ;gBACNC,QAAQ;oBAAC;oBAAe;iBAAqB;gBAC7CC,UAAU;gBACVC,WAAW;YACb;YACAC,QAAQ;gBACNH,QAAQ;oBAAC;oBAAmB;oBAAe;iBAAqB;gBAChEC,UAAU;gBACVC,WAAW;YACb;YACAE,SAAS;gBACPJ,QAAQ;oBACN;oBACA;oBACA;oBACA;oBACA;iBACD;gBACDC,UAAU;gBACVC,WAAW;YACb;QACF;QAEA,OAAOJ,QAAQ,CAACD,WAAW;IAC7B;AACF;AAEA,eAAeb,aAAa"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interaction Tester Agent
|
|
3
|
+
* Specializes in browser automation testing using Playwright MCP
|
|
4
|
+
* Validates user flows, component interactions, and visual regressions
|
|
5
|
+
*/ export class InteractionTester {
|
|
6
|
+
config;
|
|
7
|
+
constructor(config = {}){
|
|
8
|
+
this.config = {
|
|
9
|
+
browsers: config.browsers || [
|
|
10
|
+
'chromium'
|
|
11
|
+
],
|
|
12
|
+
viewports: config.viewports || [
|
|
13
|
+
{
|
|
14
|
+
width: 1920,
|
|
15
|
+
height: 1080
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
width: 1366,
|
|
19
|
+
height: 768
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
width: 375,
|
|
23
|
+
height: 667
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
screenshotOnFailure: config.screenshotOnFailure ?? true,
|
|
27
|
+
recordVideo: config.recordVideo ?? false
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Test user interaction flow using Playwright MCP
|
|
32
|
+
*/ async testUserFlow(flowName, steps) {
|
|
33
|
+
const testResults = {
|
|
34
|
+
flowName,
|
|
35
|
+
passed: true,
|
|
36
|
+
steps: [],
|
|
37
|
+
screenshots: [],
|
|
38
|
+
errors: []
|
|
39
|
+
};
|
|
40
|
+
for (const step of steps){
|
|
41
|
+
try {
|
|
42
|
+
// Use Playwright MCP tools:
|
|
43
|
+
// - mcp__playwright__browser_navigate
|
|
44
|
+
// - mcp__playwright__browser_click
|
|
45
|
+
// - mcp__playwright__browser_type
|
|
46
|
+
// - mcp__playwright__browser_snapshot
|
|
47
|
+
// - mcp__playwright__browser_take_screenshot
|
|
48
|
+
const stepResult = {
|
|
49
|
+
action: step.action,
|
|
50
|
+
selector: step.selector,
|
|
51
|
+
status: 'passed',
|
|
52
|
+
duration: 0
|
|
53
|
+
};
|
|
54
|
+
testResults.steps.push(stepResult);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
testResults.passed = false;
|
|
57
|
+
testResults.errors.push(`Step "${step.action}" failed: ${error}`);
|
|
58
|
+
if (this.config.screenshotOnFailure) {
|
|
59
|
+
// Take screenshot on failure
|
|
60
|
+
testResults.screenshots.push(`failure-${flowName}-${step.action}.png`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return testResults;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Test form interactions
|
|
68
|
+
*/ async testForm(formConfig) {
|
|
69
|
+
return {
|
|
70
|
+
formName: formConfig.name,
|
|
71
|
+
fields: formConfig.fields.map((field)=>({
|
|
72
|
+
name: field.name,
|
|
73
|
+
type: field.type,
|
|
74
|
+
validation: 'pending',
|
|
75
|
+
accessibility: 'pending'
|
|
76
|
+
})),
|
|
77
|
+
submitTest: 'pending'
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Visual regression testing
|
|
82
|
+
*/ async testVisualRegression(componentName, baselineUrl) {
|
|
83
|
+
const results = {
|
|
84
|
+
component: componentName,
|
|
85
|
+
viewportTests: [],
|
|
86
|
+
passed: true
|
|
87
|
+
};
|
|
88
|
+
for (const viewport of this.config.viewports){
|
|
89
|
+
const test = {
|
|
90
|
+
width: viewport.width,
|
|
91
|
+
height: viewport.height,
|
|
92
|
+
pixelDifference: 0,
|
|
93
|
+
passed: true
|
|
94
|
+
};
|
|
95
|
+
results.viewportTests.push(test);
|
|
96
|
+
}
|
|
97
|
+
return results;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Test component accessibility
|
|
101
|
+
*/ async testAccessibility(component) {
|
|
102
|
+
return {
|
|
103
|
+
component,
|
|
104
|
+
violations: [],
|
|
105
|
+
warnings: [],
|
|
106
|
+
passed: true,
|
|
107
|
+
wcagLevel: 'AA',
|
|
108
|
+
tests: [
|
|
109
|
+
{
|
|
110
|
+
name: 'keyboard-navigation',
|
|
111
|
+
passed: true
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: 'screen-reader',
|
|
115
|
+
passed: true
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: 'color-contrast',
|
|
119
|
+
passed: true
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: 'focus-management',
|
|
123
|
+
passed: true
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Performance testing
|
|
130
|
+
*/ async testPerformance(url) {
|
|
131
|
+
return {
|
|
132
|
+
url,
|
|
133
|
+
metrics: {
|
|
134
|
+
firstContentfulPaint: 0,
|
|
135
|
+
largestContentfulPaint: 0,
|
|
136
|
+
timeToInteractive: 0,
|
|
137
|
+
cumulativeLayoutShift: 0
|
|
138
|
+
},
|
|
139
|
+
score: 0,
|
|
140
|
+
recommendations: []
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export default InteractionTester;
|
|
145
|
+
|
|
146
|
+
//# sourceMappingURL=interaction-tester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/agents/frontend/interaction-tester.ts"],"names":["InteractionTester","config","browsers","viewports","width","height","screenshotOnFailure","recordVideo","testUserFlow","flowName","steps","testResults","passed","screenshots","errors","step","stepResult","action","selector","status","duration","push","error","testForm","formConfig","formName","name","fields","map","field","type","validation","accessibility","submitTest","testVisualRegression","componentName","baselineUrl","results","component","viewportTests","viewport","test","pixelDifference","testAccessibility","violations","warnings","wcagLevel","tests","testPerformance","url","metrics","firstContentfulPaint","largestContentfulPaint","timeToInteractive","cumulativeLayoutShift","score","recommendations"],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Architect Agent
|
|
3
|
+
* Specializes in state management architecture and data flow
|
|
4
|
+
* Uses sequential-thinking MCP for complex state planning
|
|
5
|
+
*/ export class StateArchitect {
|
|
6
|
+
config;
|
|
7
|
+
constructor(config = {}){
|
|
8
|
+
this.config = {
|
|
9
|
+
stateLibrary: config.stateLibrary || 'zustand',
|
|
10
|
+
dataFetchingLibrary: config.dataFetchingLibrary || 'react-query',
|
|
11
|
+
persistenceStrategy: config.persistenceStrategy || 'localStorage'
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Design state architecture using sequential-thinking MCP
|
|
16
|
+
* Breaks down complex state requirements into logical steps
|
|
17
|
+
*/ async designStateArchitecture(requirements) {
|
|
18
|
+
// Use sequential-thinking MCP for step-by-step state design
|
|
19
|
+
const stateDesign = {
|
|
20
|
+
library: this.config.stateLibrary,
|
|
21
|
+
stores: [],
|
|
22
|
+
actions: [],
|
|
23
|
+
selectors: [],
|
|
24
|
+
middleware: []
|
|
25
|
+
};
|
|
26
|
+
// Sequential thinking steps:
|
|
27
|
+
// 1. Identify state domains (user, cart, products, etc.)
|
|
28
|
+
// 2. Define state shape for each domain
|
|
29
|
+
// 3. Determine actions and mutations
|
|
30
|
+
// 4. Design selectors for derived state
|
|
31
|
+
// 5. Configure middleware (logging, persistence, etc.)
|
|
32
|
+
return stateDesign;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create store configuration
|
|
36
|
+
*/ async createStore(storeName, initialState) {
|
|
37
|
+
const storeConfig = {
|
|
38
|
+
name: storeName,
|
|
39
|
+
library: this.config.stateLibrary,
|
|
40
|
+
initialState,
|
|
41
|
+
actions: {},
|
|
42
|
+
middleware: [],
|
|
43
|
+
persistence: this.config.persistenceStrategy
|
|
44
|
+
};
|
|
45
|
+
if (this.config.stateLibrary === 'zustand') {
|
|
46
|
+
return this.createZustandStore(storeConfig);
|
|
47
|
+
} else if (this.config.stateLibrary === 'redux') {
|
|
48
|
+
return this.createReduxStore(storeConfig);
|
|
49
|
+
}
|
|
50
|
+
return storeConfig;
|
|
51
|
+
}
|
|
52
|
+
createZustandStore(config) {
|
|
53
|
+
return {
|
|
54
|
+
...config,
|
|
55
|
+
template: `
|
|
56
|
+
import { create } from 'zustand';
|
|
57
|
+
import { persist } from 'zustand/middleware';
|
|
58
|
+
|
|
59
|
+
interface ${config.name}State {
|
|
60
|
+
// State shape
|
|
61
|
+
${Object.keys(config.initialState).map((key)=>`${key}: ${typeof config.initialState[key]};`).join('\n ')}
|
|
62
|
+
|
|
63
|
+
// Actions
|
|
64
|
+
actions: {
|
|
65
|
+
// Define actions here
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export const use${config.name}Store = create<${config.name}State>()(
|
|
70
|
+
persist(
|
|
71
|
+
(set, get) => ({
|
|
72
|
+
...${JSON.stringify(config.initialState, null, 2)},
|
|
73
|
+
actions: {
|
|
74
|
+
// Implement actions here
|
|
75
|
+
},
|
|
76
|
+
}),
|
|
77
|
+
{
|
|
78
|
+
name: '${config.name.toLowerCase()}-storage',
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
);
|
|
82
|
+
`.trim()
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
createReduxStore(config) {
|
|
86
|
+
return {
|
|
87
|
+
...config,
|
|
88
|
+
template: `
|
|
89
|
+
import { createSlice, configureStore } from '@reduxjs/toolkit';
|
|
90
|
+
|
|
91
|
+
const ${config.name.toLowerCase()}Slice = createSlice({
|
|
92
|
+
name: '${config.name.toLowerCase()}',
|
|
93
|
+
initialState: ${JSON.stringify(config.initialState, null, 2)},
|
|
94
|
+
reducers: {
|
|
95
|
+
// Define reducers here
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
export const { actions } = ${config.name.toLowerCase()}Slice;
|
|
100
|
+
export default ${config.name.toLowerCase()}Slice.reducer;
|
|
101
|
+
`.trim()
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Design data fetching strategy
|
|
106
|
+
*/ async designDataFetching(entityName, endpoints) {
|
|
107
|
+
return {
|
|
108
|
+
entity: entityName,
|
|
109
|
+
library: this.config.dataFetchingLibrary,
|
|
110
|
+
endpoints: endpoints.map((endpoint)=>({
|
|
111
|
+
name: endpoint.name,
|
|
112
|
+
method: endpoint.method,
|
|
113
|
+
caching: true,
|
|
114
|
+
refetchInterval: endpoint.realtime ? 5000 : 0,
|
|
115
|
+
staleTime: endpoint.staleTime || 300000
|
|
116
|
+
}))
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Plan state synchronization
|
|
121
|
+
*/ async planStateSynchronization(sources) {
|
|
122
|
+
// Use sequential-thinking MCP to plan synchronization strategy
|
|
123
|
+
return {
|
|
124
|
+
sources,
|
|
125
|
+
strategy: 'optimistic-updates',
|
|
126
|
+
conflictResolution: 'last-write-wins',
|
|
127
|
+
offlineSupport: true,
|
|
128
|
+
syncInterval: 30000
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Design derived state selectors
|
|
133
|
+
*/ async createSelectors(storeName, derivedValues) {
|
|
134
|
+
return {
|
|
135
|
+
store: storeName,
|
|
136
|
+
selectors: derivedValues.map((dv)=>({
|
|
137
|
+
name: dv.name,
|
|
138
|
+
dependencies: dv.dependencies || [],
|
|
139
|
+
memoized: true
|
|
140
|
+
}))
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export default StateArchitect;
|
|
145
|
+
|
|
146
|
+
//# sourceMappingURL=state-architect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/agents/frontend/state-architect.ts"],"names":["StateArchitect","config","stateLibrary","dataFetchingLibrary","persistenceStrategy","designStateArchitecture","requirements","stateDesign","library","stores","actions","selectors","middleware","createStore","storeName","initialState","storeConfig","name","persistence","createZustandStore","createReduxStore","template","Object","keys","map","key","join","JSON","stringify","toLowerCase","trim","designDataFetching","entityName","endpoints","entity","endpoint","method","caching","refetchInterval","realtime","staleTime","planStateSynchronization","sources","strategy","conflictResolution","offlineSupport","syncInterval","createSelectors","derivedValues","store","dv","dependencies","memoized"],"mappings":"AAAA;;;;CAIC,GAQD,OAAO,MAAMA;IACHC,OAA6B;IAErC,YAAYA,SAAwC,CAAC,CAAC,CAAE;QACtD,IAAI,CAACA,MAAM,GAAG;YACZC,cAAcD,OAAOC,YAAY,IAAI;YACrCC,qBAAqBF,OAAOE,mBAAmB,IAAI;YACnDC,qBAAqBH,OAAOG,mBAAmB,IAAI;QACrD;IACF;IAEA;;;GAGC,GACD,MAAMC,wBAAwBC,YAAiB,EAAgB;QAC7D,4DAA4D;QAC5D,MAAMC,cAAc;YAClBC,SAAS,IAAI,CAACP,MAAM,CAACC,YAAY;YACjCO,QAAQ,EAAE;YACVC,SAAS,EAAE;YACXC,WAAW,EAAE;YACbC,YAAY,EAAE;QAChB;QAEA,6BAA6B;QAC7B,yDAAyD;QACzD,wCAAwC;QACxC,qCAAqC;QACrC,wCAAwC;QACxC,uDAAuD;QAEvD,OAAOL;IACT;IAEA;;GAEC,GACD,MAAMM,YAAYC,SAAiB,EAAEC,YAAiB,EAAgB;QACpE,MAAMC,cAAc;YAClBC,MAAMH;YACNN,SAAS,IAAI,CAACP,MAAM,CAACC,YAAY;YACjCa;YACAL,SAAS,CAAC;YACVE,YAAY,EAAE;YACdM,aAAa,IAAI,CAACjB,MAAM,CAACG,mBAAmB;QAC9C;QAEA,IAAI,IAAI,CAACH,MAAM,CAACC,YAAY,KAAK,WAAW;YAC1C,OAAO,IAAI,CAACiB,kBAAkB,CAACH;QACjC,OAAO,IAAI,IAAI,CAACf,MAAM,CAACC,YAAY,KAAK,SAAS;YAC/C,OAAO,IAAI,CAACkB,gBAAgB,CAACJ;QAC/B;QAEA,OAAOA;IACT;IAEQG,mBAAmBlB,MAAW,EAAO;QAC3C,OAAO;YACL,GAAGA,MAAM;YACToB,UAAU,CAAC;;;;UAIP,EAAEpB,OAAOgB,IAAI,CAAC;;EAEtB,EAAEK,OAAOC,IAAI,CAACtB,OAAOc,YAAY,EAC9BS,GAAG,CAAC,CAACC,MAAQ,GAAGA,IAAI,EAAE,EAAE,OAAOxB,OAAOc,YAAY,CAACU,IAAI,CAAC,CAAC,CAAC,EAC1DC,IAAI,CAAC,QAAQ;;;;;;;;gBAQF,EAAEzB,OAAOgB,IAAI,CAAC,eAAe,EAAEhB,OAAOgB,IAAI,CAAC;;;SAGlD,EAAEU,KAAKC,SAAS,CAAC3B,OAAOc,YAAY,EAAE,MAAM,GAAG;;;;;;aAM3C,EAAEd,OAAOgB,IAAI,CAACY,WAAW,GAAG;;;;MAInC,CAAC,CAACC,IAAI;QACR;IACF;IAEQV,iBAAiBnB,MAAW,EAAO;QACzC,OAAO;YACL,GAAGA,MAAM;YACToB,UAAU,CAAC;;;MAGX,EAAEpB,OAAOgB,IAAI,CAACY,WAAW,GAAG;SACzB,EAAE5B,OAAOgB,IAAI,CAACY,WAAW,GAAG;gBACrB,EAAEF,KAAKC,SAAS,CAAC3B,OAAOc,YAAY,EAAE,MAAM,GAAG;;;;;;2BAMpC,EAAEd,OAAOgB,IAAI,CAACY,WAAW,GAAG;eACxC,EAAE5B,OAAOgB,IAAI,CAACY,WAAW,GAAG;MACrC,CAAC,CAACC,IAAI;QACR;IACF;IAEA;;GAEC,GACD,MAAMC,mBAAmBC,UAAkB,EAAEC,SAAgB,EAAgB;QAC3E,OAAO;YACLC,QAAQF;YACRxB,SAAS,IAAI,CAACP,MAAM,CAACE,mBAAmB;YACxC8B,WAAWA,UAAUT,GAAG,CAAC,CAACW,WAAc,CAAA;oBACtClB,MAAMkB,SAASlB,IAAI;oBACnBmB,QAAQD,SAASC,MAAM;oBACvBC,SAAS;oBACTC,iBAAiBH,SAASI,QAAQ,GAAG,OAAO;oBAC5CC,WAAWL,SAASK,SAAS,IAAI;gBACnC,CAAA;QACF;IACF;IAEA;;GAEC,GACD,MAAMC,yBAAyBC,OAAiB,EAAgB;QAC9D,+DAA+D;QAC/D,OAAO;YACLA;YACAC,UAAU;YACVC,oBAAoB;YACpBC,gBAAgB;YAChBC,cAAc;QAChB;IACF;IAEA;;GAEC,GACD,MAAMC,gBAAgBjC,SAAiB,EAAEkC,aAAoB,EAAgB;QAC3E,OAAO;YACLC,OAAOnC;YACPH,WAAWqC,cAAcxB,GAAG,CAAC,CAAC0B,KAAQ,CAAA;oBACpCjC,MAAMiC,GAAGjC,IAAI;oBACbkC,cAAcD,GAAGC,YAAY,IAAI,EAAE;oBACnCC,UAAU;gBACZ,CAAA;QACF;IACF;AACF;AAEA,eAAepD,eAAe"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Designer Agent
|
|
3
|
+
* Specializes in component design, layout, and visual hierarchy
|
|
4
|
+
* Uses shadcn MCP for component specs
|
|
5
|
+
*/ export class UIDesigner {
|
|
6
|
+
config;
|
|
7
|
+
constructor(config = {}){
|
|
8
|
+
this.config = {
|
|
9
|
+
framework: config.framework || 'react',
|
|
10
|
+
designSystem: config.designSystem || 'shadcn',
|
|
11
|
+
responsiveBreakpoints: config.responsiveBreakpoints || [
|
|
12
|
+
'sm',
|
|
13
|
+
'md',
|
|
14
|
+
'lg',
|
|
15
|
+
'xl',
|
|
16
|
+
'2xl'
|
|
17
|
+
],
|
|
18
|
+
accessibilityLevel: config.accessibilityLevel || 'wcag-aa'
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Design component structure using shadcn MCP
|
|
23
|
+
*/ async designComponent(componentType, requirements) {
|
|
24
|
+
// Query shadcn MCP for component specs
|
|
25
|
+
const componentSpec = {
|
|
26
|
+
type: componentType,
|
|
27
|
+
framework: this.config.framework,
|
|
28
|
+
designSystem: this.config.designSystem,
|
|
29
|
+
accessibility: this.config.accessibilityLevel,
|
|
30
|
+
responsive: true,
|
|
31
|
+
requirements
|
|
32
|
+
};
|
|
33
|
+
return componentSpec;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generate responsive layout
|
|
37
|
+
*/ async createLayout(layoutType, components) {
|
|
38
|
+
return {
|
|
39
|
+
layoutType,
|
|
40
|
+
components,
|
|
41
|
+
breakpoints: this.config.responsiveBreakpoints,
|
|
42
|
+
spacing: 'responsive',
|
|
43
|
+
container: 'max-w-7xl mx-auto px-4 sm:px-6 lg:px-8'
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Validate accessibility compliance
|
|
48
|
+
*/ async validateAccessibility(component) {
|
|
49
|
+
const issues = [];
|
|
50
|
+
// Check ARIA labels
|
|
51
|
+
if (!component.ariaLabel && !component.ariaLabelledBy) {
|
|
52
|
+
issues.push('Missing ARIA label for screen readers');
|
|
53
|
+
}
|
|
54
|
+
// Check color contrast (mock validation)
|
|
55
|
+
if (component.colorContrast && component.colorContrast < 4.5) {
|
|
56
|
+
issues.push(`Color contrast ${component.colorContrast} below WCAG AA minimum (4.5:1)`);
|
|
57
|
+
}
|
|
58
|
+
// Check keyboard navigation
|
|
59
|
+
if (component.interactive && !component.tabIndex) {
|
|
60
|
+
issues.push('Interactive element not keyboard accessible');
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
compliant: issues.length === 0,
|
|
64
|
+
issues
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Design token system
|
|
69
|
+
*/ async createDesignTokens() {
|
|
70
|
+
return {
|
|
71
|
+
colors: {
|
|
72
|
+
primary: 'hsl(var(--primary))',
|
|
73
|
+
secondary: 'hsl(var(--secondary))',
|
|
74
|
+
accent: 'hsl(var(--accent))',
|
|
75
|
+
background: 'hsl(var(--background))',
|
|
76
|
+
foreground: 'hsl(var(--foreground))'
|
|
77
|
+
},
|
|
78
|
+
spacing: {
|
|
79
|
+
xs: '0.25rem',
|
|
80
|
+
sm: '0.5rem',
|
|
81
|
+
md: '1rem',
|
|
82
|
+
lg: '1.5rem',
|
|
83
|
+
xl: '2rem'
|
|
84
|
+
},
|
|
85
|
+
typography: {
|
|
86
|
+
fontFamily: 'var(--font-sans)',
|
|
87
|
+
fontSize: {
|
|
88
|
+
xs: '0.75rem',
|
|
89
|
+
sm: '0.875rem',
|
|
90
|
+
base: '1rem',
|
|
91
|
+
lg: '1.125rem',
|
|
92
|
+
xl: '1.25rem'
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export default UIDesigner;
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=ui-designer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/agents/frontend/ui-designer.ts"],"names":["UIDesigner","config","framework","designSystem","responsiveBreakpoints","accessibilityLevel","designComponent","componentType","requirements","componentSpec","type","accessibility","responsive","createLayout","layoutType","components","breakpoints","spacing","container","validateAccessibility","component","issues","ariaLabel","ariaLabelledBy","push","colorContrast","interactive","tabIndex","compliant","length","createDesignTokens","colors","primary","secondary","accent","background","foreground","xs","sm","md","lg","xl","typography","fontFamily","fontSize","base"],"mappings":"AAAA;;;;CAIC,GASD,OAAO,MAAMA;IACHC,OAAyB;IAEjC,YAAYA,SAAoC,CAAC,CAAC,CAAE;QAClD,IAAI,CAACA,MAAM,GAAG;YACZC,WAAWD,OAAOC,SAAS,IAAI;YAC/BC,cAAcF,OAAOE,YAAY,IAAI;YACrCC,uBAAuBH,OAAOG,qBAAqB,IAAI;gBAAC;gBAAM;gBAAM;gBAAM;gBAAM;aAAM;YACtFC,oBAAoBJ,OAAOI,kBAAkB,IAAI;QACnD;IACF;IAEA;;GAEC,GACD,MAAMC,gBAAgBC,aAAqB,EAAEC,YAAiB,EAAgB;QAC5E,uCAAuC;QACvC,MAAMC,gBAAgB;YACpBC,MAAMH;YACNL,WAAW,IAAI,CAACD,MAAM,CAACC,SAAS;YAChCC,cAAc,IAAI,CAACF,MAAM,CAACE,YAAY;YACtCQ,eAAe,IAAI,CAACV,MAAM,CAACI,kBAAkB;YAC7CO,YAAY;YACZJ;QACF;QAEA,OAAOC;IACT;IAEA;;GAEC,GACD,MAAMI,aAAaC,UAAqC,EAAEC,UAAoB,EAAgB;QAC5F,OAAO;YACLD;YACAC;YACAC,aAAa,IAAI,CAACf,MAAM,CAACG,qBAAqB;YAC9Ca,SAAS;YACTC,WAAW;QACb;IACF;IAEA;;GAEC,GACD,MAAMC,sBAAsBC,SAAc,EAAqD;QAC7F,MAAMC,SAAmB,EAAE;QAE3B,oBAAoB;QACpB,IAAI,CAACD,UAAUE,SAAS,IAAI,CAACF,UAAUG,cAAc,EAAE;YACrDF,OAAOG,IAAI,CAAC;QACd;QAEA,yCAAyC;QACzC,IAAIJ,UAAUK,aAAa,IAAIL,UAAUK,aAAa,GAAG,KAAK;YAC5DJ,OAAOG,IAAI,CAAC,CAAC,eAAe,EAAEJ,UAAUK,aAAa,CAAC,8BAA8B,CAAC;QACvF;QAEA,4BAA4B;QAC5B,IAAIL,UAAUM,WAAW,IAAI,CAACN,UAAUO,QAAQ,EAAE;YAChDN,OAAOG,IAAI,CAAC;QACd;QAEA,OAAO;YACLI,WAAWP,OAAOQ,MAAM,KAAK;YAC7BR;QACF;IACF;IAEA;;GAEC,GACD,MAAMS,qBAAmC;QACvC,OAAO;YACLC,QAAQ;gBACNC,SAAS;gBACTC,WAAW;gBACXC,QAAQ;gBACRC,YAAY;gBACZC,YAAY;YACd;YACAnB,SAAS;gBACPoB,IAAI;gBACJC,IAAI;gBACJC,IAAI;gBACJC,IAAI;gBACJC,IAAI;YACN;YACAC,YAAY;gBACVC,YAAY;gBACZC,UAAU;oBACRP,IAAI;oBACJC,IAAI;oBACJO,MAAM;oBACNL,IAAI;oBACJC,IAAI;gBACN;YACF;QACF;IACF;AACF;AAEA,eAAezC,WAAW"}
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.5.19] - 2025-10-01
|
|
11
|
+
|
|
12
|
+
### ✨ Added
|
|
13
|
+
- **Auto-enable Rust Strict Mode**: Automatically enables `--rust-strict` flag for `.rs` files
|
|
14
|
+
- Detects `.unwrap()`, `.expect()`, `panic!()`, `todo!()`, `unimplemented!()`
|
|
15
|
+
- Provides line numbers, code snippets, and actionable suggestions
|
|
16
|
+
- No manual flag required - activates automatically for all Rust files
|
|
17
|
+
- Populates `rustQuality` JSON field with comprehensive analysis
|
|
18
|
+
- **Bypass Non-Code Files**: Skip validation for config/documentation files
|
|
19
|
+
- Bypassed extensions: `.toml`, `.md`, `.txt`, `.json`, `.yaml`, `.yml`
|
|
20
|
+
- Returns immediate success status without running formatters/linters
|
|
21
|
+
- Improves performance for Cargo.toml, README.md, package.json edits
|
|
22
|
+
- Agent-friendly: no wasted processing on configuration files
|
|
23
|
+
|
|
24
|
+
### 🔧 Improved
|
|
25
|
+
- **Post-Edit Pipeline**: Smarter file type detection and processing
|
|
26
|
+
- Console shows `🦀 Auto-enabled Rust strict mode` for visibility
|
|
27
|
+
- Bypass message: `⏭️ BYPASSED: .md files don't require validation`
|
|
28
|
+
- Structured JSON includes `bypassed: true` and reason field
|
|
29
|
+
|
|
30
|
+
## [1.5.18] - Previous Release
|
|
31
|
+
|
|
10
32
|
### ✨ Added
|
|
11
33
|
- **`/fullstack` Slash Command**: Launch coordinated full-stack development team with consensus validation
|
|
12
34
|
- Automatic team composition (researcher, coder, tester, reviewer, architect)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-flow-novice",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.20",
|
|
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",
|
|
@@ -8,10 +8,13 @@
|
|
|
8
8
|
"session-end": ".claude/commands/hooks/session-end.md"
|
|
9
9
|
},
|
|
10
10
|
"permissions": {
|
|
11
|
-
"allow": ["mcp__ruv-swarm", "mcp__claude-flow"],
|
|
11
|
+
"allow": ["mcp__ruv-swarm", "mcp__claude-flow", "mcp__sequential-thinking", "mcp__playwright", "mcp__shadcn"],
|
|
12
12
|
"autoApprove": {
|
|
13
13
|
"mcp__ruv-swarm": ["*"],
|
|
14
|
-
"mcp__claude-flow": ["*"]
|
|
14
|
+
"mcp__claude-flow": ["*"],
|
|
15
|
+
"mcp__sequential-thinking": ["*"],
|
|
16
|
+
"mcp__playwright": ["*"],
|
|
17
|
+
"mcp__shadcn": ["*"]
|
|
15
18
|
}
|
|
16
19
|
},
|
|
17
20
|
"mcpServers": {
|
|
@@ -24,6 +27,21 @@
|
|
|
24
27
|
"command": "npx",
|
|
25
28
|
"args": ["ruv-swarm@latest", "mcp", "start"],
|
|
26
29
|
"type": "stdio"
|
|
30
|
+
},
|
|
31
|
+
"sequential-thinking": {
|
|
32
|
+
"command": "npx",
|
|
33
|
+
"args": ["@modelcontextprotocol/server-sequential-thinking@latest"],
|
|
34
|
+
"type": "stdio"
|
|
35
|
+
},
|
|
36
|
+
"playwright": {
|
|
37
|
+
"command": "npx",
|
|
38
|
+
"args": ["@playwright/mcp@latest"],
|
|
39
|
+
"type": "stdio"
|
|
40
|
+
},
|
|
41
|
+
"shadcn": {
|
|
42
|
+
"command": "npx",
|
|
43
|
+
"args": ["@shadcn/mcp@latest"],
|
|
44
|
+
"type": "stdio"
|
|
27
45
|
}
|
|
28
46
|
},
|
|
29
47
|
"features": {
|