Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
4709ff8
docs(coherence-engine): add ADR-014 and DDD for sheaf Laplacian coher…
Jan 22, 2026
1122e94
feat(prime-radiant): implement sheaf Laplacian coherence engine
Jan 22, 2026
cc5f073
docs(adr): add RuvLLM integration to ADR-014 v0.4
Jan 22, 2026
2a4aa1f
docs(adr): add 22 coherence engine internal ADRs
Jan 22, 2026
c5fe7f9
feat(prime-radiant): implement RuvLLM integration layer (ADR-014 v0.4)
Jan 22, 2026
3d70c36
docs(prime-radiant): add comprehensive README with examples
Jan 22, 2026
c6219df
docs(adr): add ADR-015 Coherence-Gated Transformer (Sheaf Attention)
Jan 22, 2026
f36334f
feat(prime-radiant): implement coherence engine with CGT attention
Jan 22, 2026
231729f
feat(prime-radiant): add GPU acceleration, SIMD optimizations, and be…
Jan 22, 2026
57109ed
perf(prime-radiant): optimize SIMD and core computation patterns
Jan 23, 2026
cc7b4a9
perf(prime-radiant): add CSR sparse matrix, GPU buffer prealloc, thre…
Jan 23, 2026
e31422e
chore: SEO optimize package metadata for crates.io and npm
Jan 23, 2026
104e3e1
chore(hyperbolic-hnsw): SEO optimize for crates.io publish
Jan 23, 2026
374085c
chore(prime-radiant): add version numbers to path dependencies for cr…
Jan 23, 2026
ab3a560
fix(prime-radiant): shorten keyword for crates.io compliance
Jan 23, 2026
d03e6d8
docs(readme): add prime-radiant and ruvector-attention-wasm package r…
Jan 23, 2026
67bf19c
feat(prime-radiant): implement 6 advanced mathematical frameworks
Jan 23, 2026
67b980b
fix(router-core): resolve HNSW index deadlock on second insert (#133)
Jan 24, 2026
a04ecf6
chore: bump versions for v2.0.1 release
Jan 24, 2026
75bc8e2
Merge branch 'main' into feat/prime-radiant-advanced-math
Jan 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
223 changes: 173 additions & 50 deletions .claude/helpers/statusline.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,56 @@ function getUserInfo() {
return { name, gitBranch, modelName };
}

// Get RuVector intelligence data (primary source of learning)
function getRuVectorIntelligence() {
const intelPaths = [
path.join(process.cwd(), '.ruvector', 'intelligence.json'),
path.join(process.cwd(), 'npm', 'packages', 'ruvector', '.ruvector', 'intelligence.json'),
path.join(require('os').homedir(), '.ruvector', 'intelligence.json'),
];

for (const intelPath of intelPaths) {
if (fs.existsSync(intelPath)) {
try {
const data = JSON.parse(fs.readFileSync(intelPath, 'utf-8'));
return {
patterns: data.patterns ? Object.keys(data.patterns).length : 0,
memories: data.memories ? data.memories.length : 0,
trajectories: data.trajectories ? data.trajectories.length : 0,
sessions: data.stats?.session_count || 0,
fileSequences: data.file_sequences ? Object.keys(data.file_sequences).length : 0,
agents: data.agents ? Object.keys(data.agents).length : 0,
errors: data.errors ? data.errors.length : 0,
learning: data.learning || null,
tensorCompress: data.tensorCompress || null,
raw: data,
};
} catch (e) {
// Ignore parse errors
}
}
}
return null;
}

// Get learning stats from memory database
function getLearningStats() {
// First try RuVector intelligence (primary source)
const ruVector = getRuVectorIntelligence();
if (ruVector && (ruVector.patterns > 0 || ruVector.memories > 0)) {
return {
patterns: ruVector.patterns,
sessions: ruVector.sessions,
trajectories: ruVector.trajectories,
memories: ruVector.memories,
fileSequences: ruVector.fileSequences,
agents: ruVector.agents,
errors: ruVector.errors,
learning: ruVector.learning,
tensorCompress: ruVector.tensorCompress,
};
}

const memoryPaths = [
path.join(process.cwd(), '.swarm', 'memory.db'),
path.join(process.cwd(), '.claude-flow', 'memory.db'),
Expand Down Expand Up @@ -175,7 +223,7 @@ function getLearningStats() {
}
}

return { patterns, sessions, trajectories };
return { patterns, sessions, trajectories, memories: 0, fileSequences: 0, agents: 0, errors: 0 };
}

// Get V3 progress from learning state (grows as system learns)
Expand All @@ -184,48 +232,54 @@ function getV3Progress() {

// Check for metrics file first (created by init)
const metricsPath = path.join(process.cwd(), '.claude-flow', 'metrics', 'v3-progress.json');
let metricsData = null;
if (fs.existsSync(metricsPath)) {
try {
const data = JSON.parse(fs.readFileSync(metricsPath, 'utf-8'));
if (data.domains) {
const domainsCompleted = data.domains.completed || 0;
const totalDomains = data.domains.total || 5;
// Use ddd.progress if provided and > 0, otherwise calculate from domains
const dddProgress = (data.ddd?.progress > 0)
? data.ddd.progress
: Math.min(100, Math.floor((domainsCompleted / totalDomains) * 100));
return {
domainsCompleted,
totalDomains,
dddProgress,
patternsLearned: data.learning?.patternsLearned || learning.patterns,
sessionsCompleted: data.learning?.sessionsCompleted || learning.sessions
};
}
metricsData = JSON.parse(fs.readFileSync(metricsPath, 'utf-8'));
} catch (e) {
// Fall through to pattern-based calculation
// Ignore
}
}

// DDD progress based on actual learned patterns
// New install: 0 patterns = 0/5 domains, 0% DDD
// As patterns grow: 10+ patterns = 1 domain, 50+ = 2, 100+ = 3, 200+ = 4, 500+ = 5
// Use RuVector patterns if available and greater than metrics file
const actualPatterns = Math.max(learning.patterns, metricsData?.learning?.patternsLearned || 0);
const actualSessions = Math.max(learning.sessions, metricsData?.learning?.sessionsCompleted || 0);

// DDD progress based on actual learned patterns + memories + trajectories
// Combined learning score = patterns + (memories/10) + (trajectories/5) + (agents*5)
const learningScore = actualPatterns +
Math.floor((learning.memories || 0) / 10) +
Math.floor((learning.trajectories || 0) / 5) +
((learning.agents || 0) * 5);

// Domain completion thresholds based on combined score
let domainsCompleted = 0;
if (learning.patterns >= 500) domainsCompleted = 5;
else if (learning.patterns >= 200) domainsCompleted = 4;
else if (learning.patterns >= 100) domainsCompleted = 3;
else if (learning.patterns >= 50) domainsCompleted = 2;
else if (learning.patterns >= 10) domainsCompleted = 1;
if (learningScore >= 500) domainsCompleted = 5;
else if (learningScore >= 200) domainsCompleted = 4;
else if (learningScore >= 100) domainsCompleted = 3;
else if (learningScore >= 50) domainsCompleted = 2;
else if (learningScore >= 10) domainsCompleted = 1;

// Override with metrics file if it has higher values
if (metricsData?.domains?.completed > domainsCompleted) {
domainsCompleted = metricsData.domains.completed;
}

const totalDomains = 5;
const dddProgress = Math.min(100, Math.floor((domainsCompleted / totalDomains) * 100));
const totalDomains = metricsData?.domains?.total || 5;
const dddProgress = metricsData?.ddd?.progress > 0
? metricsData.ddd.progress
: Math.min(100, Math.floor((domainsCompleted / totalDomains) * 100));

return {
domainsCompleted,
totalDomains,
dddProgress,
patternsLearned: learning.patterns,
sessionsCompleted: learning.sessions
patternsLearned: actualPatterns,
sessionsCompleted: actualSessions,
memories: learning.memories || 0,
trajectories: learning.trajectories || 0,
fileSequences: learning.fileSequences || 0,
agents: learning.agents || 0,
};
}

Expand Down Expand Up @@ -406,14 +460,36 @@ function getSystemMetrics() {
// Calculate all sources and take the maximum
let intelligencePct = 0;

if (intelligenceFromFile !== null) {
// Calculate intelligence from RuVector learning data (primary source)
// Weighted formula: patterns*2 + memories/5 + trajectories/2 + sessions*3 + agents*10
if (learning.patterns > 0 || learning.memories > 0 || learning.trajectories > 0) {
const ruVectorScore =
(learning.patterns * 2) +
Math.floor((learning.memories || 0) / 5) +
Math.floor((learning.trajectories || 0) / 2) +
((learning.sessions || 0) * 3) +
((learning.agents || 0) * 10);
// Scale: 0-50 score = 0-50%, 50-200 = 50-90%, 200+ = 90-100%
if (ruVectorScore >= 200) {
intelligencePct = Math.min(100, 90 + Math.floor((ruVectorScore - 200) / 50));
} else if (ruVectorScore >= 50) {
intelligencePct = 50 + Math.floor((ruVectorScore - 50) * 40 / 150);
} else {
intelligencePct = Math.floor(ruVectorScore);
}
}

// Fallback to metrics file if higher
if (intelligenceFromFile !== null && intelligenceFromFile > intelligencePct) {
intelligencePct = intelligenceFromFile;
} else {
// Calculate from multiple sources and take the best
const fromPatterns = learning.patterns > 0 ? Math.min(100, Math.floor(learning.patterns / 10)) : 0;
const fromVectors = agentdbStats.vectorCount > 0 ? Math.min(100, Math.floor(agentdbStats.vectorCount / 100)) : 0;
}

intelligencePct = Math.max(fromPatterns, fromVectors);
// Fallback to AgentDB vectors if higher
if (agentdbStats.vectorCount > 0) {
const fromVectors = Math.min(100, Math.floor(agentdbStats.vectorCount / 100));
if (fromVectors > intelligencePct) {
intelligencePct = fromVectors;
}
}

// If still 0, use project maturity fallback
Expand Down Expand Up @@ -716,6 +792,34 @@ function getAgentDBStats() {
}
}

// Check RuVector intelligence for vectors (memories with embeddings)
if (vectorCount === 0) {
const ruVector = getRuVectorIntelligence();
if (ruVector) {
// Memories with embeddings count as vectors
vectorCount = ruVector.memories || 0;
// Calculate size from intelligence file
const intelPaths = [
path.join(process.cwd(), '.ruvector', 'intelligence.json'),
path.join(require('os').homedir(), '.ruvector', 'intelligence.json'),
];
for (const intelPath of intelPaths) {
if (fs.existsSync(intelPath)) {
try {
const stats = fs.statSync(intelPath);
dbSizeKB = Math.floor(stats.size / 1024);
namespaces = 1;
// Check if we have trajectories (indicates HNSW-like indexing)
if (ruVector.trajectories > 10) {
hasHnsw = true;
}
break;
} catch (e) { /* ignore */ }
}
}
}
}

return { vectorCount, dbSizeKB: Math.floor(dbSizeKB), namespaces, hasHnsw };
}

Expand Down Expand Up @@ -1050,28 +1154,30 @@ function generateStatusline() {
// Separator
lines.push(`${c.dim}─────────────────────────────────────────────────────${c.reset}`);

// Line 1: DDD Domain Progress with dynamic performance indicator
// Line 1: DDD Domain Progress with learning indicators
const domainsColor = progress.domainsCompleted >= 3 ? c.brightGreen : progress.domainsCompleted > 0 ? c.yellow : c.red;
// Show HNSW speedup if enabled, otherwise show patterns learned
let perfIndicator = '';
// Build learning indicator with patterns, memories, trajectories
let learningIndicator = '';
const hasLearning = progress.patternsLearned > 0 || progress.memories > 0 || progress.trajectories > 0;
if (agentdb.hasHnsw && agentdb.vectorCount > 0) {
// HNSW enabled: show estimated speedup (150x-12500x based on vector count)
// HNSW enabled: show estimated speedup
const speedup = agentdb.vectorCount > 10000 ? '12500x' : agentdb.vectorCount > 1000 ? '150x' : '10x';
perfIndicator = `${c.brightGreen}⚡ HNSW ${speedup}${c.reset}`;
} else if (progress.patternsLearned > 0) {
// Show patterns learned
const patternsK = progress.patternsLearned >= 1000
? `${(progress.patternsLearned / 1000).toFixed(1)}k`
: String(progress.patternsLearned);
perfIndicator = `${c.brightYellow}📚 ${patternsK} patterns${c.reset}`;
learningIndicator = `${c.brightGreen}⚡ HNSW ${speedup}${c.reset}`;
} else if (hasLearning) {
// Show learning metrics: patterns/memories/trajectories
const parts = [];
if (progress.patternsLearned > 0) parts.push(`${c.brightYellow}◆${progress.patternsLearned}${c.reset}`);
if (progress.memories > 0) parts.push(`${c.brightBlue}⬡${progress.memories}${c.reset}`);
if (progress.trajectories > 0) parts.push(`${c.brightCyan}↝${progress.trajectories}${c.reset}`);
learningIndicator = `${c.brightPurple}🧠 Learning${c.reset} ${parts.join(' ')}`;
} else {
// New project: show target
perfIndicator = `${c.dim}⚡ target: 150x-12500x${c.reset}`;
learningIndicator = `${c.dim}⚡ target: 150x-12500x${c.reset}`;
}
lines.push(
`${c.brightCyan}🏗️ DDD Domains${c.reset} ${progressBar(progress.domainsCompleted, progress.totalDomains)} ` +
`${domainsColor}${progress.domainsCompleted}${c.reset}/${c.brightWhite}${progress.totalDomains}${c.reset} ` +
perfIndicator
learningIndicator
);

// Line 2: Swarm + Hooks + CVE + Memory + Context + Intelligence
Expand All @@ -1081,12 +1187,29 @@ function generateStatusline() {
let securityColor = security.status === 'CLEAN' ? c.brightGreen : security.status === 'IN_PROGRESS' ? c.brightYellow : c.brightRed;
const hooksColor = hooks.enabled > 0 ? c.brightGreen : c.dim;

// Get RuVector intelligence file size for memory indicator
let intelSizeKB = 0;
const intelFilePaths = [
path.join(process.cwd(), '.ruvector', 'intelligence.json'),
path.join(require('os').homedir(), '.ruvector', 'intelligence.json'),
];
for (const intelPath of intelFilePaths) {
if (fs.existsSync(intelPath)) {
try {
const stats = fs.statSync(intelPath);
intelSizeKB = Math.floor(stats.size / 1024);
break;
} catch (e) { /* ignore */ }
}
}
const memoryDisplay = intelSizeKB > 0 ? `${intelSizeKB}KB` : `${system.memoryMB}MB`;

lines.push(
`${c.brightYellow}🤖 Swarm${c.reset} ${swarmIndicator} [${agentsColor}${String(swarm.activeAgents).padStart(2)}${c.reset}/${c.brightWhite}${swarm.maxAgents}${c.reset}] ` +
`${c.brightPurple}👥 ${system.subAgents}${c.reset} ` +
`${c.brightBlue}🪝 ${hooksColor}${hooks.enabled}${c.reset}/${c.brightWhite}${hooks.total}${c.reset} ` +
`${securityIcon} ${securityColor}CVE ${security.cvesFixed}${c.reset}/${c.brightWhite}${security.totalCves}${c.reset} ` +
`${c.brightCyan}💾 ${system.memoryMB}MB${c.reset} ` +
`${c.brightCyan}💾 ${memoryDisplay}${c.reset} ` +
`${system.intelligencePct >= 80 ? c.brightGreen : system.intelligencePct >= 40 ? c.brightYellow : c.dim}🧠 ${String(system.intelligencePct).padStart(3)}%${intellTrend}${c.reset}`
);

Expand Down
4 changes: 2 additions & 2 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@
},
"statusLine": {
"type": "command",
"command": "npx @claude-flow/cli@latest hooks statusline 2>/dev/null || node .claude/helpers/statusline.cjs 2>/dev/null || echo \"▊ Claude Flow V3\"",
"command": "node .claude/helpers/statusline.cjs 2>/dev/null || npx @claude-flow/cli@latest hooks statusline 2>/dev/null || echo \"▊ Claude Flow V3\"",
"refreshMs": 5000,
"enabled": true
},
Expand Down Expand Up @@ -234,4 +234,4 @@
"threatModel": true
}
}
}
}
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ members = [
resolver = "2"

[workspace.package]
version = "2.0.0"
version = "2.0.1"
edition = "2021"
rust-version = "1.77"
license = "MIT"
Expand Down
Loading