claude-flow-novice 2.14.4 → 2.14.5

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.
Files changed (35) hide show
  1. package/.claude/commands/seo/SEO_TASK_MODE.md +892 -0
  2. package/.claude/commands/seo/seo-blog.md +428 -0
  3. package/.claude/commands/seo/seo-landing.md +91 -0
  4. package/.claude/commands/seo/seo-product.md +104 -0
  5. package/claude-assets/agents/cfn-dev-team/coordinators/epic-creator.md +120 -0
  6. package/claude-assets/agents/cfn-seo-team/AGENT_CREATION_REPORT.md +481 -0
  7. package/claude-assets/agents/cfn-seo-team/DELEGATION_MATRIX.md +371 -0
  8. package/claude-assets/agents/cfn-seo-team/HUMANIZER_PROMPTS.md +536 -0
  9. package/claude-assets/agents/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +642 -0
  10. package/claude-assets/agents/cfn-seo-team/cfn-seo-coordinator.md +414 -0
  11. package/claude-assets/agents/cfn-seo-team/competitive-seo-analyst.md +423 -0
  12. package/claude-assets/agents/cfn-seo-team/content-atomization-specialist.md +580 -0
  13. package/claude-assets/agents/cfn-seo-team/content-seo-strategist.md +245 -0
  14. package/claude-assets/agents/cfn-seo-team/eeat-content-auditor.md +389 -0
  15. package/claude-assets/agents/cfn-seo-team/geo-optimization-expert.md +269 -0
  16. package/claude-assets/agents/cfn-seo-team/link-building-specialist.md +291 -0
  17. package/claude-assets/agents/cfn-seo-team/local-seo-optimizer.md +333 -0
  18. package/claude-assets/agents/cfn-seo-team/programmatic-seo-engineer.md +244 -0
  19. package/claude-assets/agents/cfn-seo-team/schema-markup-engineer.md +430 -0
  20. package/claude-assets/agents/cfn-seo-team/seo-analytics-specialist.md +376 -0
  21. package/claude-assets/agents/cfn-seo-team/seo-validators/accessibility-validator.md +565 -0
  22. package/claude-assets/agents/cfn-seo-team/seo-validators/audience-validator.md +484 -0
  23. package/claude-assets/agents/cfn-seo-team/seo-validators/branding-validator.md +452 -0
  24. package/claude-assets/agents/cfn-seo-team/seo-validators/humanizer-validator.md +333 -0
  25. package/claude-assets/agents/cfn-seo-team/technical-seo-specialist.md +228 -0
  26. package/claude-assets/commands/seo/SEO_TASK_MODE.md +892 -0
  27. package/claude-assets/commands/seo/seo-blog.md +428 -0
  28. package/claude-assets/commands/seo/seo-landing.md +91 -0
  29. package/claude-assets/commands/seo/seo-product.md +104 -0
  30. package/claude-assets/skills/seo-orchestration/SKILL.md +292 -0
  31. package/claude-assets/skills/seo-orchestration/orchestrate-seo.sh +566 -0
  32. package/claude-assets/skills/seo-orchestration/orchestrate-seo.sh.backup +755 -0
  33. package/claude-assets/skills/seo-orchestration/validate-consensus.sh +270 -0
  34. package/dist/cli/config-manager.js +109 -91
  35. package/package.json +1 -1
@@ -0,0 +1,270 @@
1
+ #!/usr/bin/env bash
2
+
3
+ ##############################################################################
4
+ # SEO Consensus Validation Script
5
+ # Version: 1.0.0
6
+ #
7
+ # Validates SEO consensus scores against thresholds and quorum requirements.
8
+ # Used to determine if SEO optimizations meet quality standards.
9
+ ##############################################################################
10
+
11
+ set -euo pipefail
12
+
13
+ # Configuration
14
+ TASK_ID=""
15
+ AGENTS=""
16
+ THRESHOLD="0.80"
17
+ MIN_QUORUM="0.66"
18
+
19
+ # Script directory
20
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
21
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../../" && pwd)"
22
+
23
+ # Logging
24
+ log() {
25
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] SEO-VALIDATE-CONSENSUS: $*" >&2
26
+ }
27
+
28
+ error() {
29
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] SEO-VALIDATE-CONSENSUS ERROR: $*" >&2
30
+ exit 1
31
+ }
32
+
33
+ # Display usage
34
+ usage() {
35
+ cat << EOF
36
+ SEO Consensus Validation
37
+
38
+ Usage: $0 [OPTIONS]
39
+
40
+ Required Options:
41
+ --task-id <id> Unique identifier for SEO task
42
+ --agents <agents> Comma-separated list of SEO agent IDs
43
+ --threshold <value> Minimum confidence threshold (0.0-1.0)
44
+ --min-quorum <value> Minimum quorum (n, n%, or 0.n format)
45
+
46
+ Optional Options:
47
+ --help Show this help message
48
+
49
+ Examples:
50
+ $0 --task-id seo-001 --agents seo-analyst,content-writer --threshold 0.75 --min-quorum 0.66
51
+
52
+ EOF
53
+ }
54
+
55
+ # Parse command line arguments
56
+ parse_args() {
57
+ while [[ $# -gt 0 ]]; do
58
+ case $1 in
59
+ --task-id)
60
+ TASK_ID="$2"
61
+ shift 2
62
+ ;;
63
+ --agents)
64
+ AGENTS="$2"
65
+ shift 2
66
+ ;;
67
+ --threshold)
68
+ THRESHOLD="$2"
69
+ shift 2
70
+ ;;
71
+ --min-quorum)
72
+ MIN_QUORUM="$2"
73
+ shift 2
74
+ ;;
75
+ --help)
76
+ usage
77
+ exit 0
78
+ ;;
79
+ *)
80
+ error "Unknown option: $1. Use --help for usage information."
81
+ ;;
82
+ esac
83
+ done
84
+ }
85
+
86
+ # Validate inputs
87
+ validate_inputs() {
88
+ [[ -z "$TASK_ID" ]] && error "Task ID is required"
89
+ [[ -z "$AGENTS" ]] && error "Agents list is required"
90
+ [[ -z "$THRESHOLD" ]] && error "Threshold is required"
91
+ [[ -z "$MIN_QUORUM" ]] && error "Min quorum is required"
92
+
93
+ # Validate threshold
94
+ if ! [[ "$THRESHOLD" =~ ^[0-9]*\.?[0-9]+$ ]]; then
95
+ error "Threshold must be a numeric value between 0.0 and 1.0"
96
+ fi
97
+
98
+ local threshold_float
99
+ threshold_float=$(echo "$THRESHOLD" | bc -l 2>/dev/null || echo "0")
100
+ if [[ $(echo "$threshold_float < 0 || $threshold_float > 1" | bc -l) -eq 1 ]]; then
101
+ error "Threshold must be between 0.0 and 1.0"
102
+ fi
103
+
104
+ # Check Redis connectivity
105
+ if ! command -v redis-cli &> /dev/null; then
106
+ error "redis-cli is required but not installed"
107
+ fi
108
+
109
+ if ! redis-cli ping &> /dev/null; then
110
+ error "Cannot connect to Redis server"
111
+ fi
112
+ }
113
+
114
+ # Calculate quorum requirement
115
+ calculate_quorum_requirement() {
116
+ local total_agents=$1
117
+ local min_quorum_spec="$2"
118
+
119
+ # Parse quorum specification
120
+ if [[ "$min_quorum_spec" =~ ^[0-9]+$ ]]; then
121
+ # Absolute number
122
+ echo "$min_quorum_spec"
123
+ elif [[ "$min_quorum_spec" =~ ^([0-9]+)%$ ]]; then
124
+ # Percentage
125
+ local percentage="${BASH_REMATCH[1]}"
126
+ local required
127
+ required=$(echo "scale=0; ($total_agents * $percentage) / 100" | bc -l)
128
+ echo "$required"
129
+ elif [[ "$min_quorum_spec" =~ ^0\.[0-9]+$ ]]; then
130
+ # Fraction
131
+ local required
132
+ required=$(echo "scale=0; $total_agents * $min_quorum_spec" | bc -l)
133
+ echo "$required"
134
+ else
135
+ error "Invalid quorum specification: $min_quorum_spec"
136
+ fi
137
+ }
138
+
139
+ # Collect agent confidence scores
140
+ collect_agent_scores() {
141
+ local agents_array
142
+ IFS=',' read -ra agents_array <<< "$AGENTS"
143
+
144
+ local scores=()
145
+ local completed_agents=()
146
+
147
+ log "Collecting confidence scores from agents"
148
+
149
+ for agent_id in "${agents_array[@]}"; do
150
+ agent_id=$(echo "$agent_id" | xargs) # trim whitespace
151
+
152
+ # Get confidence score from Redis
153
+ local confidence_key="swarm:${TASK_ID}:${agent_id}:confidence"
154
+ local confidence_score
155
+ confidence_score=$(redis-cli get "$confidence_key" 2>/dev/null || echo "")
156
+
157
+ if [[ -n "$confidence_score" ]] && [[ "$confidence_score" =~ ^[0-9]*\.?[0-9]+$ ]]; then
158
+ scores+=("$confidence_score")
159
+ completed_agents+=("$agent_id")
160
+ log "Agent $agent_id confidence: $confidence_score"
161
+ else
162
+ log "Warning: No confidence score found for agent $agent_id"
163
+ fi
164
+ done
165
+
166
+ # Store results in Redis for debugging
167
+ printf '%s\n' "${completed_agents[@]}" | redis-cli -x set "swarm:${TASK_ID}:validated-agents" > /dev/null 2>&1 || true
168
+ printf '%s\n' "${scores[@]}" | redis-cli -x set "swarm:${TASK_ID}:confidence-scores" > /dev/null 2>&1 || true
169
+
170
+ # Return scores array
171
+ printf '%s\n' "${scores[@]}"
172
+ }
173
+
174
+ # Validate consensus
175
+ validate_consensus() {
176
+ local scores=("$@")
177
+
178
+ if [[ ${#scores[@]} -eq 0 ]]; then
179
+ error "No confidence scores available for validation"
180
+ fi
181
+
182
+ # Calculate required quorum
183
+ local total_agents
184
+ total_agents=$(echo "$AGENTS" | tr ',' '\n' | wc -l)
185
+ local required_quorum
186
+ required_quorum=$(calculate_quorum_requirement "$total_agents" "$MIN_QUORUM")
187
+
188
+ log "Total agents: $total_agents, Required quorum: $required_quorum"
189
+ log "Available scores: ${#scores[@]}"
190
+
191
+ # Check quorum requirement
192
+ if [[ ${#scores[@]} -lt $required_quorum ]]; then
193
+ log "Consensus validation failed: Insufficient agent responses (${#scores[@]} < $required_quorum)"
194
+ return 1
195
+ fi
196
+
197
+ # Calculate average confidence
198
+ local sum=0.0
199
+ local count=0
200
+
201
+ for score in "${scores[@]}"; do
202
+ sum=$(echo "$sum + $score" | bc -l)
203
+ ((count++))
204
+ done
205
+
206
+ local average_confidence
207
+ average_confidence=$(echo "scale=3; $sum / $count" | bc -l)
208
+
209
+ log "Average confidence: $average_confidence, Threshold: $THRESHOLD"
210
+
211
+ # Compare against threshold
212
+ local comparison
213
+ comparison=$(echo "$average_confidence >= $THRESHOLD" | bc -l 2>/dev/null || echo "0")
214
+
215
+ # Store validation results
216
+ local validation_result
217
+ validation_result=$(cat << EOF
218
+ {
219
+ "task_id": "$TASK_ID",
220
+ "timestamp": "$(date -Iseconds)",
221
+ "total_agents": $total_agents,
222
+ "completed_agents": $count,
223
+ "required_quorum": $required_quorum,
224
+ "quorum_met": $([[ $count -ge $required_quorum ]] && echo "true" || echo "false"),
225
+ "confidence_scores": [$(IFS=','; echo "${scores[*]}")],
226
+ "average_confidence": $average_confidence,
227
+ "threshold": $THRESHOLD,
228
+ "threshold_met": $([[ $comparison -eq 1 ]] && echo "true" || echo "false"),
229
+ "consensus_validated": $([[ $comparison -eq 1 ]] && echo "true" || echo "false")
230
+ }
231
+ EOF
232
+ )
233
+
234
+ echo "$validation_result" | redis-cli -x set "swarm:${TASK_ID}:consensus-validation" > /dev/null
235
+ log "Validation result stored: $validation_result"
236
+
237
+ if [[ $comparison -eq 1 ]]; then
238
+ log "SEO consensus validation PASSED (average: $average_confidence >= threshold: $THRESHOLD)"
239
+ return 0
240
+ else
241
+ log "SEO consensus validation FAILED (average: $average_confidence < threshold: $THRESHOLD)"
242
+ return 1
243
+ fi
244
+ }
245
+
246
+ # Main function
247
+ main() {
248
+ parse_args "$@"
249
+ validate_inputs
250
+
251
+ log "Starting SEO consensus validation for task: $TASK_ID"
252
+
253
+ # Collect agent scores
254
+ local scores_array
255
+ readarray -t scores_array < <(collect_agent_scores)
256
+
257
+ # Validate consensus
258
+ if validate_consensus "${scores_array[@]}"; then
259
+ log "SEO consensus validation completed successfully"
260
+ exit 0
261
+ else
262
+ log "SEO consensus validation failed"
263
+ exit 1
264
+ fi
265
+ }
266
+
267
+ # Script entry point
268
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
269
+ main "$@"
270
+ fi
@@ -1,100 +1,118 @@
1
- import * as fs from "fs/promises";
2
- import * as path from "path";
3
- import Ajv from "ajv";
4
- import * as lodash from "lodash";
5
- let ConfigManager = class ConfigManager {
6
- static _instance = null;
7
- configPath;
8
- schemaPath;
9
- ajv;
10
- constructor(){
11
- this.configPath = path.join(process.env.HOME || "", ".claude-flow-config.json");
12
- this.schemaPath = path.join(__dirname, "../../.claude/skills/config-management/config.json");
13
- this.ajv = new Ajv();
14
- }
15
- static getInstance() {
16
- if (!ConfigManager._instance) {
17
- ConfigManager._instance = new ConfigManager();
18
- }
19
- return ConfigManager._instance;
20
- }
21
- async readConfig() {
22
- try {
23
- const configContent = await fs.readFile(this.configPath, "utf-8");
24
- return JSON.parse(configContent);
25
- } catch (error) {
26
- // If config doesn't exist, create from schema
27
- return this.resetToDefaults();
28
- }
29
- }
30
- async writeConfig(config) {
31
- const schemaContent = await fs.readFile(this.schemaPath, "utf-8");
32
- const schema = JSON.parse(schemaContent);
33
- const validate = this.ajv.compile(schema);
34
- if (!validate(config)) {
35
- throw new Error("Invalid configuration: " + this.ajv.errorsText(validate.errors));
36
- }
37
- await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), "utf-8");
1
+ "use strict";
2
+ var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
3
+ function adopt(value) {
4
+ return value instanceof P ? value : new P(function(resolve) {
5
+ resolve(value);
6
+ });
38
7
  }
39
- async getValue(keyPath) {
40
- const config = await this.readConfig();
41
- const value = lodash.get(config, keyPath);
42
- if (value === undefined) {
43
- // Check if it's a custom key path not in the schema
44
- const customConfig = await this.readCustomConfig();
45
- return lodash.get(customConfig, keyPath);
8
+ return new (P || (P = Promise))(function(resolve, reject) {
9
+ function fulfilled(value) {
10
+ try {
11
+ step(generator.next(value));
12
+ } catch (e) {
13
+ reject(e);
14
+ }
46
15
  }
47
- return value;
48
- }
49
- async readCustomConfig() {
50
- try {
51
- const customConfigPath = path.join(process.env.HOME || "", ".claude-flow-custom-config.json");
52
- const customConfigContent = await fs.readFile(customConfigPath, "utf-8");
53
- return JSON.parse(customConfigContent);
54
- } catch (error) {
55
- // If custom config doesn't exist or can't be read, return empty object
56
- return {};
16
+ function rejected(value) {
17
+ try {
18
+ step(generator["throw"](value));
19
+ } catch (e) {
20
+ reject(e);
21
+ }
57
22
  }
58
- }
59
- async set(key, value) {
60
- const config = await this.readConfig();
61
- // Type assertion to handle full object
62
- if (typeof value === "object" && value !== null) {
63
- config[key] = value;
64
- } else {
65
- throw new Error("Invalid configuration value");
23
+ function step(result) {
24
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
66
25
  }
67
- await this.writeConfig(config);
68
- }
69
- async getAll() {
70
- return this.readConfig();
71
- }
72
- async resetToDefaults() {
73
- const schemaContent = await fs.readFile(this.schemaPath, "utf-8");
74
- const schema = JSON.parse(schemaContent);
75
- // Extract default values from the schema
76
- const defaultConfig = {
77
- redis: {
78
- host: schema.properties.redis.properties.host.default,
79
- port: schema.properties.redis.properties.port.default
80
- },
81
- agent: {
82
- default_strategy: schema.properties.agent.properties.default_strategy.default,
83
- max_concurrent_agents: schema.properties.agent.properties.max_concurrent_agents.default,
84
- log_level: schema.properties.agent.properties.log_level.default
85
- },
86
- security: {
87
- enabled: schema.properties.security.properties.enabled.default,
88
- max_retry_attempts: schema.properties.security.properties.max_retry_attempts.default
89
- }
26
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
27
+ });
28
+ };
29
+ var __generator = this && this.__generator || function(thisArg, body) {
30
+ var _ = {
31
+ label: 0,
32
+ sent: function() {
33
+ if (t[0] & 1) throw t[1];
34
+ return t[1];
35
+ },
36
+ trys: [],
37
+ ops: []
38
+ }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
39
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
40
+ return this;
41
+ }), g;
42
+ function verb(n) {
43
+ return function(v) {
44
+ return step([
45
+ n,
46
+ v
47
+ ]);
90
48
  };
91
- await this.writeConfig(defaultConfig);
92
- return defaultConfig;
93
49
  }
94
- };
95
- export default ConfigManager;
96
-
97
- //# sourceMappingURL=config-manager.js.mapop[1] : void 0,
50
+ function step(op) {
51
+ if (f) throw new TypeError("Generator is already executing.");
52
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
53
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
54
+ if (y = 0, t) op = [
55
+ op[0] & 2,
56
+ t.value
57
+ ];
58
+ switch(op[0]){
59
+ case 0:
60
+ case 1:
61
+ t = op;
62
+ break;
63
+ case 4:
64
+ _.label++;
65
+ return {
66
+ value: op[1],
67
+ done: false
68
+ };
69
+ case 5:
70
+ _.label++;
71
+ y = op[1];
72
+ op = [
73
+ 0
74
+ ];
75
+ continue;
76
+ case 7:
77
+ op = _.ops.pop();
78
+ _.trys.pop();
79
+ continue;
80
+ default:
81
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
82
+ _ = 0;
83
+ continue;
84
+ }
85
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
86
+ _.label = op[1];
87
+ break;
88
+ }
89
+ if (op[0] === 6 && _.label < t[1]) {
90
+ _.label = t[1];
91
+ t = op;
92
+ break;
93
+ }
94
+ if (t && _.label < t[2]) {
95
+ _.label = t[2];
96
+ _.ops.push(op);
97
+ break;
98
+ }
99
+ if (t[2]) _.ops.pop();
100
+ _.trys.pop();
101
+ continue;
102
+ }
103
+ op = body.call(thisArg, _);
104
+ } catch (e) {
105
+ op = [
106
+ 6,
107
+ e
108
+ ];
109
+ y = 0;
110
+ } finally{
111
+ f = t = 0;
112
+ }
113
+ if (op[0] & 5) throw op[1];
114
+ return {
115
+ value: op[0] ? op[1] : void 0,
98
116
  done: true
99
117
  };
100
118
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-flow-novice",
3
- "version": "2.14.4",
3
+ "version": "2.14.5",
4
4
  "description": "AI agent orchestration framework with namespace-isolated skills, agents, and CFN Loop validation. Safe installation with ~0.01% collision risk.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",