feat: add VFS methods and fix documentation accuracy
- Add exportToJSON() for directory structure export - Add searchEntities() for advanced entity filtering - Add bulkWrite() for efficient batch operations - Fix VFS documentation to accurately reflect implementation - Add USER_FUNCTIONS.md with domain-specific templates - Clarify Knowledge Layer augmentation pattern - Correct GitBridge integration examples
This commit is contained in:
parent
a4ed075e5f
commit
7730b88618
6 changed files with 1150 additions and 131 deletions
|
|
@ -7,28 +7,47 @@ The Knowledge Layer transforms Brainy's VFS from a simple filesystem into an int
|
|||
## Quick Start
|
||||
|
||||
```typescript
|
||||
import { Brainy, VirtualFileSystem, KnowledgeAugmentation } from '@soulcraft/brainy'
|
||||
import { Brainy } from '@soulcraft/brainy'
|
||||
|
||||
// Initialize Brainy with VFS
|
||||
const brain = new Brainy()
|
||||
await brain.init()
|
||||
|
||||
const vfs = new VirtualFileSystem(brain)
|
||||
const vfs = brain.vfs()
|
||||
await vfs.init()
|
||||
|
||||
// Enable Knowledge Layer
|
||||
const knowledge = new KnowledgeAugmentation({
|
||||
enabled: true,
|
||||
eventRecording: { enabled: true },
|
||||
semanticVersioning: { enabled: true, threshold: 0.3 },
|
||||
persistentEntities: { enabled: true, autoExtract: true },
|
||||
concepts: { enabled: true, autoLink: true },
|
||||
gitBridge: { enabled: true }
|
||||
})
|
||||
|
||||
await knowledge.init({ brain, vfs })
|
||||
// Enable Knowledge Layer - this augments VFS with intelligence features
|
||||
await vfs.enableKnowledgeLayer()
|
||||
|
||||
// Now your VFS has superpowers! 🚀
|
||||
// The Knowledge Layer dynamically adds new methods to the VFS instance:
|
||||
// - Event Recording: getHistory(), reconstructAtTime()
|
||||
// - Semantic Versioning: getVersions(), restoreVersion()
|
||||
// - Entity System: createEntity(), linkEntities(), findEntityOccurrences()
|
||||
// - Concepts: createConcept(), findByConcept()
|
||||
// - Git Bridge: exportToGit(), importFromGit()
|
||||
// - And many more...
|
||||
```
|
||||
|
||||
## How It Works: Method Augmentation
|
||||
|
||||
The Knowledge Layer uses a powerful augmentation pattern. When you call `enableKnowledgeLayer()`:
|
||||
|
||||
1. **Wraps Core Methods**: Intercepts existing VFS methods to add intelligence
|
||||
2. **Injects New Methods**: Dynamically adds new methods to the VFS instance
|
||||
3. **Background Processing**: Runs intelligence extraction asynchronously
|
||||
4. **Non-Breaking**: All existing code continues to work unchanged
|
||||
|
||||
```typescript
|
||||
// Before enableKnowledgeLayer() - Core VFS only
|
||||
vfs.writeFile() ✅ // Works
|
||||
vfs.readFile() ✅ // Works
|
||||
vfs.createEntity() ❌ // Method doesn't exist
|
||||
|
||||
// After enableKnowledgeLayer() - Enhanced VFS
|
||||
vfs.writeFile() ✅ // Still works, now with event recording
|
||||
vfs.readFile() ✅ // Still works, now tracks access patterns
|
||||
vfs.createEntity() ✅ // New method available!
|
||||
```
|
||||
|
||||
## Core Components
|
||||
|
|
|
|||
728
docs/vfs/USER_FUNCTIONS.md
Normal file
728
docs/vfs/USER_FUNCTIONS.md
Normal file
|
|
@ -0,0 +1,728 @@
|
|||
# VFS User Functions - Templates and Examples
|
||||
|
||||
This document provides template functions that you can implement for domain-specific needs. These functions combine VFS primitives to solve common problems.
|
||||
|
||||
## Table of Contents
|
||||
1. [Code Analysis Functions](#code-analysis-functions)
|
||||
2. [Export Format Functions](#export-format-functions)
|
||||
3. [Project Management Functions](#project-management-functions)
|
||||
4. [Creative Writing Functions](#creative-writing-functions)
|
||||
5. [Game Development Functions](#game-development-functions)
|
||||
|
||||
## Code Analysis Functions
|
||||
|
||||
### Get Dependency Graph
|
||||
```javascript
|
||||
/**
|
||||
* Build a dependency graph for JavaScript/TypeScript projects
|
||||
*/
|
||||
async function getDependencyGraph(vfs, srcPath) {
|
||||
const files = await vfs.readdir(srcPath, { recursive: true })
|
||||
const graph = {}
|
||||
|
||||
for (const file of files) {
|
||||
const filePath = `${srcPath}/${file}`
|
||||
|
||||
// Only process JS/TS files
|
||||
if (file.match(/\.(js|ts|jsx|tsx)$/)) {
|
||||
const content = await vfs.readFile(filePath)
|
||||
const text = content.toString()
|
||||
|
||||
// Parse imports (basic regex, use proper AST parser for production)
|
||||
const imports = []
|
||||
const importRegex = /import\s+.*?\s+from\s+['"](.+?)['"]/g
|
||||
const requireRegex = /require\(['"](.+?)['"]\)/g
|
||||
|
||||
let match
|
||||
while ((match = importRegex.exec(text)) !== null) {
|
||||
imports.push(match[1])
|
||||
}
|
||||
while ((match = requireRegex.exec(text)) !== null) {
|
||||
imports.push(match[1])
|
||||
}
|
||||
|
||||
graph[filePath] = imports
|
||||
}
|
||||
}
|
||||
|
||||
return graph
|
||||
}
|
||||
|
||||
// Use it
|
||||
const deps = await getDependencyGraph(vfs, '/src')
|
||||
```
|
||||
|
||||
### Find Circular Dependencies
|
||||
```javascript
|
||||
/**
|
||||
* Detect circular dependencies in your code
|
||||
*/
|
||||
async function findCircularDependencies(vfs, srcPath) {
|
||||
const graph = await getDependencyGraph(vfs, srcPath)
|
||||
const cycles = []
|
||||
|
||||
function detectCycle(node, visited = new Set(), stack = []) {
|
||||
if (stack.includes(node)) {
|
||||
const cycleStart = stack.indexOf(node)
|
||||
cycles.push(stack.slice(cycleStart))
|
||||
return
|
||||
}
|
||||
|
||||
if (visited.has(node)) return
|
||||
visited.add(node)
|
||||
stack.push(node)
|
||||
|
||||
const dependencies = graph[node] || []
|
||||
for (const dep of dependencies) {
|
||||
// Resolve relative imports
|
||||
const resolvedDep = resolvePath(node, dep)
|
||||
if (graph[resolvedDep]) {
|
||||
detectCycle(resolvedDep, visited, [...stack])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Object.keys(graph).forEach(node => detectCycle(node))
|
||||
return cycles
|
||||
}
|
||||
```
|
||||
|
||||
### Find Untested Code
|
||||
```javascript
|
||||
/**
|
||||
* Find source files without corresponding test files
|
||||
*/
|
||||
async function findUntestedCode(vfs, srcPath, testPath = null) {
|
||||
testPath = testPath || srcPath.replace('/src', '/tests')
|
||||
|
||||
const sourceFiles = await vfs.readdir(srcPath, { recursive: true })
|
||||
const testFiles = await vfs.readdir(testPath, { recursive: true }).catch(() => [])
|
||||
|
||||
const untestedFiles = []
|
||||
|
||||
for (const sourceFile of sourceFiles) {
|
||||
if (!sourceFile.match(/\.(js|ts|jsx|tsx)$/)) continue
|
||||
|
||||
// Look for corresponding test file
|
||||
const baseName = sourceFile.replace(/\.(js|ts|jsx|tsx)$/, '')
|
||||
const hasTest = testFiles.some(testFile =>
|
||||
testFile.includes(baseName) &&
|
||||
testFile.match(/\.(test|spec)\.(js|ts|jsx|tsx)$/)
|
||||
)
|
||||
|
||||
if (!hasTest) {
|
||||
untestedFiles.push(`${srcPath}/${sourceFile}`)
|
||||
}
|
||||
}
|
||||
|
||||
return untestedFiles
|
||||
}
|
||||
```
|
||||
|
||||
### Find Similar Code (Duplicate Detection)
|
||||
```javascript
|
||||
/**
|
||||
* Find potentially duplicate code using similarity scoring
|
||||
*/
|
||||
async function findSimilarCode(vfs, filePath, options = {}) {
|
||||
const threshold = options.threshold || 0.8
|
||||
const searchPath = options.searchPath || '/'
|
||||
|
||||
// Get the reference file content
|
||||
const referenceContent = await vfs.readFile(filePath)
|
||||
const referenceText = referenceContent.toString()
|
||||
|
||||
// Use VFS's semantic search
|
||||
const similar = await vfs.findSimilar(filePath, {
|
||||
limit: 10,
|
||||
threshold
|
||||
})
|
||||
|
||||
// Additionally, do structural comparison
|
||||
const results = []
|
||||
for (const match of similar) {
|
||||
const matchContent = await vfs.readFile(match.path)
|
||||
const matchText = matchContent.toString()
|
||||
|
||||
// Simple line-based similarity (use better algorithms in production)
|
||||
const similarity = calculateSimilarity(referenceText, matchText)
|
||||
|
||||
if (similarity > threshold) {
|
||||
results.push({
|
||||
path: match.path,
|
||||
similarity,
|
||||
semanticScore: match.score
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return results.sort((a, b) => b.similarity - a.similarity)
|
||||
}
|
||||
|
||||
function calculateSimilarity(text1, text2) {
|
||||
// Simple Jaccard similarity on lines
|
||||
const lines1 = new Set(text1.split('\n').map(l => l.trim()).filter(l => l))
|
||||
const lines2 = new Set(text2.split('\n').map(l => l.trim()).filter(l => l))
|
||||
|
||||
const intersection = new Set([...lines1].filter(x => lines2.has(x)))
|
||||
const union = new Set([...lines1, ...lines2])
|
||||
|
||||
return intersection.size / union.size
|
||||
}
|
||||
```
|
||||
|
||||
## Export Format Functions
|
||||
|
||||
### Export to EPUB (for novels)
|
||||
```javascript
|
||||
/**
|
||||
* Export a directory of markdown files to EPUB format
|
||||
*/
|
||||
async function exportToEpub(vfs, path, metadata = {}) {
|
||||
// First get the markdown export
|
||||
const markdown = await vfs.exportToMarkdown(path)
|
||||
|
||||
// You'll need an EPUB library like epub-gen
|
||||
const Epub = require('epub-gen')
|
||||
|
||||
// Convert markdown chapters to EPUB format
|
||||
const chapters = []
|
||||
const files = await vfs.readdir(path, { recursive: true })
|
||||
|
||||
for (const file of files.sort()) {
|
||||
if (file.endsWith('.md')) {
|
||||
const content = await vfs.readFile(`${path}/${file}`)
|
||||
const title = file.replace('.md', '').replace(/-/g, ' ')
|
||||
|
||||
chapters.push({
|
||||
title: title,
|
||||
data: content.toString()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const options = {
|
||||
title: metadata.title || 'My Book',
|
||||
author: metadata.author || 'Author',
|
||||
chapters: chapters
|
||||
}
|
||||
|
||||
return new Epub(options)
|
||||
}
|
||||
```
|
||||
|
||||
### Export to Static Site
|
||||
```javascript
|
||||
/**
|
||||
* Export VFS content to static HTML site
|
||||
*/
|
||||
async function exportToStaticSite(vfs, sourcePath, options = {}) {
|
||||
const json = await vfs.exportToJSON(sourcePath)
|
||||
const html = []
|
||||
|
||||
html.push('<!DOCTYPE html>')
|
||||
html.push('<html><head>')
|
||||
html.push(`<title>${options.title || 'Documentation'}</title>`)
|
||||
html.push('<style>/* Add your styles */</style>')
|
||||
html.push('</head><body>')
|
||||
|
||||
function renderNode(node, name, depth = 0) {
|
||||
const indent = ' '.repeat(depth)
|
||||
|
||||
if (node._meta?.type === 'file') {
|
||||
html.push(`${indent}<article>`)
|
||||
html.push(`${indent} <h${Math.min(depth + 2, 6)}>${name}</h${Math.min(depth + 2, 6)}>`)
|
||||
|
||||
if (typeof node._content === 'string') {
|
||||
// Convert markdown to HTML if needed
|
||||
html.push(`${indent} <pre>${escapeHtml(node._content)}</pre>`)
|
||||
}
|
||||
|
||||
html.push(`${indent}</article>`)
|
||||
} else if (node._meta?.type === 'directory') {
|
||||
html.push(`${indent}<section>`)
|
||||
html.push(`${indent} <h${Math.min(depth + 1, 6)}>${name}</h${Math.min(depth + 1, 6)}>`)
|
||||
|
||||
for (const [childName, childNode] of Object.entries(node)) {
|
||||
if (!childName.startsWith('_')) {
|
||||
renderNode(childNode, childName, depth + 1)
|
||||
}
|
||||
}
|
||||
|
||||
html.push(`${indent}</section>`)
|
||||
}
|
||||
}
|
||||
|
||||
renderNode(json, options.title || 'Root')
|
||||
|
||||
html.push('</body></html>')
|
||||
return html.join('\n')
|
||||
}
|
||||
```
|
||||
|
||||
### Export to GraphQL Schema
|
||||
```javascript
|
||||
/**
|
||||
* Generate GraphQL schema from VFS entities
|
||||
*/
|
||||
async function exportToGraphQLSchema(vfs) {
|
||||
const entities = await vfs.listEntities()
|
||||
const types = new Map()
|
||||
|
||||
// Group entities by type
|
||||
for (const entity of entities) {
|
||||
const type = entity.type || 'Unknown'
|
||||
if (!types.has(type)) {
|
||||
types.set(type, [])
|
||||
}
|
||||
types.get(type).push(entity)
|
||||
}
|
||||
|
||||
// Generate schema
|
||||
let schema = 'type Query {\n'
|
||||
|
||||
for (const [typeName, entities] of types) {
|
||||
schema += ` get${typeName}(id: ID!): ${typeName}\n`
|
||||
schema += ` list${typeName}s: [${typeName}!]!\n`
|
||||
}
|
||||
|
||||
schema += '}\n\n'
|
||||
|
||||
// Generate types
|
||||
for (const [typeName, entities] of types) {
|
||||
schema += `type ${typeName} {\n`
|
||||
schema += ' id: ID!\n'
|
||||
|
||||
// Infer fields from first entity
|
||||
if (entities.length > 0) {
|
||||
const sample = entities[0]
|
||||
for (const [key, value] of Object.entries(sample)) {
|
||||
if (key !== 'id') {
|
||||
const fieldType = inferGraphQLType(value)
|
||||
schema += ` ${key}: ${fieldType}\n`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
schema += '}\n\n'
|
||||
}
|
||||
|
||||
return schema
|
||||
}
|
||||
```
|
||||
|
||||
## Project Management Functions
|
||||
|
||||
### Get Project Insights
|
||||
```javascript
|
||||
/**
|
||||
* Analyze project for insights and patterns
|
||||
*/
|
||||
async function getProjectInsights(vfs, projectPath) {
|
||||
const stats = await vfs.getProjectStats(projectPath)
|
||||
const todos = await vfs.getAllTodos(projectPath)
|
||||
const timeline = await vfs.getTimeline({ limit: 100 })
|
||||
|
||||
// Analyze activity patterns
|
||||
const activityByDay = {}
|
||||
const activityByUser = {}
|
||||
const activityByFile = {}
|
||||
|
||||
for (const event of timeline) {
|
||||
const day = event.timestamp.toISOString().split('T')[0]
|
||||
activityByDay[day] = (activityByDay[day] || 0) + 1
|
||||
|
||||
const user = event.user || 'system'
|
||||
activityByUser[user] = (activityByUser[user] || 0) + 1
|
||||
|
||||
activityByFile[event.path] = (activityByFile[event.path] || 0) + 1
|
||||
}
|
||||
|
||||
// Find hotspots (most edited files)
|
||||
const hotspots = Object.entries(activityByFile)
|
||||
.sort(([,a], [,b]) => b - a)
|
||||
.slice(0, 10)
|
||||
.map(([path, count]) => ({ path, edits: count }))
|
||||
|
||||
// Todo analysis
|
||||
const todosByPriority = {}
|
||||
const todosByStatus = {}
|
||||
|
||||
for (const todo of todos) {
|
||||
todosByPriority[todo.priority] = (todosByPriority[todo.priority] || 0) + 1
|
||||
todosByStatus[todo.status] = (todosByStatus[todo.status] || 0) + 1
|
||||
}
|
||||
|
||||
return {
|
||||
stats,
|
||||
activity: {
|
||||
byDay: activityByDay,
|
||||
byUser: activityByUser,
|
||||
hotspots
|
||||
},
|
||||
todos: {
|
||||
total: todos.length,
|
||||
byPriority: todosByPriority,
|
||||
byStatus: todosByStatus,
|
||||
highPriority: todos.filter(t => t.priority === 'high' && t.status === 'pending')
|
||||
},
|
||||
recommendations: generateRecommendations(stats, todos, hotspots)
|
||||
}
|
||||
}
|
||||
|
||||
function generateRecommendations(stats, todos, hotspots) {
|
||||
const recommendations = []
|
||||
|
||||
if (stats.largestFile && stats.largestFile.size > 1024 * 1024) {
|
||||
recommendations.push({
|
||||
type: 'refactor',
|
||||
message: `Consider splitting ${stats.largestFile.path} (${Math.round(stats.largestFile.size / 1024)}KB)`
|
||||
})
|
||||
}
|
||||
|
||||
if (todos.filter(t => t.priority === 'high' && t.status === 'pending').length > 5) {
|
||||
recommendations.push({
|
||||
type: 'priority',
|
||||
message: 'You have many high-priority pending todos'
|
||||
})
|
||||
}
|
||||
|
||||
if (hotspots.length > 0 && hotspots[0].edits > 50) {
|
||||
recommendations.push({
|
||||
type: 'stability',
|
||||
message: `${hotspots[0].path} changes frequently, consider stabilizing`
|
||||
})
|
||||
}
|
||||
|
||||
return recommendations
|
||||
}
|
||||
```
|
||||
|
||||
### Generate Sprint Report
|
||||
```javascript
|
||||
/**
|
||||
* Generate a report for the current sprint
|
||||
*/
|
||||
async function generateSprintReport(vfs, sprintStart, sprintEnd = new Date()) {
|
||||
const timeline = await vfs.getTimeline({
|
||||
from: sprintStart,
|
||||
to: sprintEnd
|
||||
})
|
||||
|
||||
const todos = await vfs.getAllTodos()
|
||||
|
||||
// Group work by user
|
||||
const workByUser = {}
|
||||
for (const event of timeline) {
|
||||
const user = event.user || 'system'
|
||||
if (!workByUser[user]) {
|
||||
workByUser[user] = {
|
||||
commits: 0,
|
||||
filesModified: new Set(),
|
||||
linesChanged: 0
|
||||
}
|
||||
}
|
||||
|
||||
workByUser[user].commits++
|
||||
workByUser[user].filesModified.add(event.path)
|
||||
}
|
||||
|
||||
// Calculate completion rate
|
||||
const completedTodos = todos.filter(t => t.status === 'completed').length
|
||||
const totalTodos = todos.length
|
||||
const completionRate = totalTodos > 0 ? (completedTodos / totalTodos * 100).toFixed(1) : 0
|
||||
|
||||
return {
|
||||
period: {
|
||||
start: sprintStart,
|
||||
end: sprintEnd,
|
||||
days: Math.ceil((sprintEnd - sprintStart) / (1000 * 60 * 60 * 24))
|
||||
},
|
||||
team: Object.entries(workByUser).map(([user, work]) => ({
|
||||
user,
|
||||
commits: work.commits,
|
||||
filesModified: work.filesModified.size
|
||||
})),
|
||||
todos: {
|
||||
completed: completedTodos,
|
||||
total: totalTodos,
|
||||
completionRate: `${completionRate}%`,
|
||||
remaining: todos.filter(t => t.status === 'pending')
|
||||
},
|
||||
velocity: {
|
||||
commitsPerDay: (timeline.length / 7).toFixed(1),
|
||||
todosPerDay: (completedTodos / 7).toFixed(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Creative Writing Functions
|
||||
|
||||
### Track Character Arcs
|
||||
```javascript
|
||||
/**
|
||||
* Track how characters evolve throughout a story
|
||||
*/
|
||||
async function trackCharacterArc(vfs, characterName, storyPath = '/') {
|
||||
// Find the character entity
|
||||
const entities = await vfs.searchEntities({
|
||||
type: 'character',
|
||||
name: characterName
|
||||
})
|
||||
|
||||
if (entities.length === 0) {
|
||||
throw new Error(`Character ${characterName} not found`)
|
||||
}
|
||||
|
||||
const character = entities[0]
|
||||
const occurrences = await vfs.findEntityOccurrences(character.id)
|
||||
|
||||
// Analyze each appearance
|
||||
const arc = []
|
||||
|
||||
for (const occurrence of occurrences) {
|
||||
const content = await vfs.readFile(occurrence.path)
|
||||
const text = content.toString()
|
||||
|
||||
// Find mentions of the character (basic approach)
|
||||
const mentions = text.split('\n').filter(line =>
|
||||
line.toLowerCase().includes(characterName.toLowerCase())
|
||||
)
|
||||
|
||||
arc.push({
|
||||
chapter: occurrence.path,
|
||||
mentions: mentions.length,
|
||||
// Analyze emotional tone (simplified)
|
||||
mood: analyzeMood(mentions),
|
||||
// Extract key actions
|
||||
actions: extractActions(mentions, characterName)
|
||||
})
|
||||
}
|
||||
|
||||
return {
|
||||
character: character.metadata,
|
||||
arc: arc,
|
||||
summary: summarizeArc(arc)
|
||||
}
|
||||
}
|
||||
|
||||
function analyzeMood(mentions) {
|
||||
const positiveWords = ['smiled', 'laughed', 'happy', 'joy', 'love', 'success']
|
||||
const negativeWords = ['cried', 'angry', 'sad', 'fear', 'fail', 'death']
|
||||
|
||||
let positive = 0, negative = 0
|
||||
|
||||
for (const mention of mentions) {
|
||||
const lower = mention.toLowerCase()
|
||||
positive += positiveWords.filter(w => lower.includes(w)).length
|
||||
negative += negativeWords.filter(w => lower.includes(w)).length
|
||||
}
|
||||
|
||||
if (positive > negative) return 'positive'
|
||||
if (negative > positive) return 'negative'
|
||||
return 'neutral'
|
||||
}
|
||||
```
|
||||
|
||||
### Generate Story Bible
|
||||
```javascript
|
||||
/**
|
||||
* Create a comprehensive reference for your story universe
|
||||
*/
|
||||
async function generateStoryBible(vfs, storyPath) {
|
||||
const characters = await vfs.listEntities({ type: 'character' })
|
||||
const locations = await vfs.listEntities({ type: 'location' })
|
||||
const concepts = await vfs.findConcepts({ domain: 'narrative' })
|
||||
|
||||
const bible = {
|
||||
title: 'Story Bible',
|
||||
generated: new Date(),
|
||||
characters: {},
|
||||
locations: {},
|
||||
plotThreads: {},
|
||||
timeline: []
|
||||
}
|
||||
|
||||
// Document characters
|
||||
for (const char of characters) {
|
||||
const occurrences = await vfs.findEntityOccurrences(char.id)
|
||||
bible.characters[char.metadata.name] = {
|
||||
...char.metadata,
|
||||
appearances: occurrences.map(o => o.path),
|
||||
relationships: await vfs.getEntityGraph(char.id, { depth: 1 })
|
||||
}
|
||||
}
|
||||
|
||||
// Document locations
|
||||
for (const loc of locations) {
|
||||
bible.locations[loc.metadata.name] = {
|
||||
...loc.metadata,
|
||||
scenes: await vfs.findEntityOccurrences(loc.id)
|
||||
}
|
||||
}
|
||||
|
||||
// Plot threads from concepts
|
||||
for (const concept of concepts) {
|
||||
if (concept.type === 'plot') {
|
||||
bible.plotThreads[concept.name] = {
|
||||
description: concept.description,
|
||||
keywords: concept.keywords,
|
||||
chapters: await vfs.findByConcept(concept.name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Generate timeline
|
||||
const events = await vfs.getTimeline({ limit: 1000 })
|
||||
bible.timeline = events.map(e => ({
|
||||
date: e.timestamp,
|
||||
event: e.description,
|
||||
chapter: e.path
|
||||
}))
|
||||
|
||||
return bible
|
||||
}
|
||||
```
|
||||
|
||||
## Game Development Functions
|
||||
|
||||
### Validate Game Data
|
||||
```javascript
|
||||
/**
|
||||
* Validate game configuration files for consistency
|
||||
*/
|
||||
async function validateGameData(vfs, gamePath) {
|
||||
const errors = []
|
||||
const warnings = []
|
||||
|
||||
// Load all game data
|
||||
const gameData = await vfs.exportToJSON(gamePath)
|
||||
|
||||
// Check quest references
|
||||
if (gameData.quests) {
|
||||
for (const [questName, quest] of Object.entries(gameData.quests)) {
|
||||
// Check NPC references
|
||||
if (quest._content?.questGiver) {
|
||||
const npcPath = `${gamePath}/npcs/${quest._content.questGiver}.json`
|
||||
const exists = await vfs.exists(npcPath)
|
||||
if (!exists) {
|
||||
errors.push(`Quest ${questName} references missing NPC: ${quest._content.questGiver}`)
|
||||
}
|
||||
}
|
||||
|
||||
// Check item rewards
|
||||
if (quest._content?.rewards?.items) {
|
||||
for (const item of quest._content.rewards.items) {
|
||||
const itemPath = `${gamePath}/items/${item}.json`
|
||||
const exists = await vfs.exists(itemPath)
|
||||
if (!exists) {
|
||||
warnings.push(`Quest ${questName} rewards missing item: ${item}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check balance
|
||||
if (gameData.items) {
|
||||
const itemPowers = []
|
||||
for (const [itemName, item] of Object.entries(gameData.items)) {
|
||||
if (item._content?.stats) {
|
||||
const totalPower = Object.values(item._content.stats)
|
||||
.reduce((a, b) => a + b, 0)
|
||||
itemPowers.push({ name: itemName, power: totalPower })
|
||||
}
|
||||
}
|
||||
|
||||
// Find outliers
|
||||
const avgPower = itemPowers.reduce((a, b) => a + b.power, 0) / itemPowers.length
|
||||
const outliers = itemPowers.filter(i => Math.abs(i.power - avgPower) > avgPower * 2)
|
||||
|
||||
for (const outlier of outliers) {
|
||||
warnings.push(`Item ${outlier.name} may be imbalanced (power: ${outlier.power}, avg: ${avgPower})`)
|
||||
}
|
||||
}
|
||||
|
||||
return { errors, warnings, valid: errors.length === 0 }
|
||||
}
|
||||
```
|
||||
|
||||
### Generate Loot Tables
|
||||
```javascript
|
||||
/**
|
||||
* Generate weighted loot tables from item definitions
|
||||
*/
|
||||
async function generateLootTables(vfs, itemsPath) {
|
||||
const items = await vfs.exportToJSON(itemsPath)
|
||||
const tables = {
|
||||
common: [],
|
||||
uncommon: [],
|
||||
rare: [],
|
||||
epic: [],
|
||||
legendary: []
|
||||
}
|
||||
|
||||
for (const [itemName, item] of Object.entries(items)) {
|
||||
if (item._meta?.type === 'file' && item._content?.rarity) {
|
||||
const entry = {
|
||||
name: itemName.replace('.json', ''),
|
||||
weight: getWeight(item._content.rarity),
|
||||
data: item._content
|
||||
}
|
||||
|
||||
tables[item._content.rarity.toLowerCase()].push(entry)
|
||||
}
|
||||
}
|
||||
|
||||
// Normalize weights
|
||||
for (const table of Object.values(tables)) {
|
||||
const totalWeight = table.reduce((a, b) => a + b.weight, 0)
|
||||
for (const entry of table) {
|
||||
entry.probability = (entry.weight / totalWeight * 100).toFixed(2) + '%'
|
||||
}
|
||||
}
|
||||
|
||||
return tables
|
||||
}
|
||||
|
||||
function getWeight(rarity) {
|
||||
const weights = {
|
||||
common: 100,
|
||||
uncommon: 50,
|
||||
rare: 20,
|
||||
epic: 5,
|
||||
legendary: 1
|
||||
}
|
||||
return weights[rarity.toLowerCase()] || 10
|
||||
}
|
||||
```
|
||||
|
||||
## Using These Functions
|
||||
|
||||
All these functions are templates that you can customize for your specific needs. To use them:
|
||||
|
||||
1. Copy the function you need
|
||||
2. Modify it for your specific requirements
|
||||
3. Use it with your VFS instance:
|
||||
|
||||
```javascript
|
||||
import { Brainy } from '@soulcraft/brainy'
|
||||
|
||||
// Initialize VFS
|
||||
const brain = new Brainy()
|
||||
await brain.init()
|
||||
const vfs = brain.vfs()
|
||||
await vfs.init()
|
||||
|
||||
// Use your custom function
|
||||
const insights = await getProjectInsights(vfs, '/my-project')
|
||||
console.log(insights.recommendations)
|
||||
|
||||
// Combine multiple functions
|
||||
const deps = await getDependencyGraph(vfs, '/src')
|
||||
const cycles = await findCircularDependencies(vfs, '/src')
|
||||
const untested = await findUntestedCode(vfs, '/src', '/tests')
|
||||
```
|
||||
|
||||
Remember: These are starting points. The power of VFS is that you can combine its primitives to build exactly what you need for your domain!
|
||||
|
|
@ -7,7 +7,7 @@ Brainy's Virtual Filesystem (VFS) provides a POSIX-like filesystem interface tha
|
|||
## Quick Start
|
||||
|
||||
```typescript
|
||||
import { Brainy, VirtualFileSystem } from '@soulcraft/brainy'
|
||||
import { Brainy } from '@soulcraft/brainy'
|
||||
|
||||
// Initialize Brainy
|
||||
const brain = new Brainy({
|
||||
|
|
@ -16,7 +16,7 @@ const brain = new Brainy({
|
|||
await brain.init()
|
||||
|
||||
// Create VFS instance
|
||||
const vfs = new VirtualFileSystem(brain)
|
||||
const vfs = brain.vfs()
|
||||
await vfs.init()
|
||||
|
||||
// Use like any filesystem
|
||||
|
|
@ -140,8 +140,8 @@ await vfs.rmdir('/projects/my-app', { recursive: true })
|
|||
// Rename/move file or directory
|
||||
await vfs.rename(oldPath: string, newPath: string): Promise<void>
|
||||
|
||||
// Copy file (Note: Implementation needed)
|
||||
// await vfs.copy(src: string, dest: string, options?: CopyOptions): Promise<void>
|
||||
// Copy file or directory
|
||||
await vfs.copy(src: string, dest: string, options?: CopyOptions): Promise<void>
|
||||
```
|
||||
|
||||
**Example:**
|
||||
|
|
|
|||
|
|
@ -273,23 +273,39 @@ await vfs.importDirectory('/local/project', { targetPath: '/vfs/project' })
|
|||
// - Preserved metadata (timestamps, permissions)
|
||||
```
|
||||
|
||||
### GitBridge Export
|
||||
### GitBridge Integration
|
||||
|
||||
GitBridge provides Git import/export capabilities. It can be used in two ways:
|
||||
|
||||
#### Option 1: Via Knowledge Layer (Recommended)
|
||||
```javascript
|
||||
// Enable GitBridge
|
||||
const gitBridge = vfs.gitBridge
|
||||
// Enable Knowledge Layer to get Git methods
|
||||
await vfs.enableKnowledgeLayer()
|
||||
|
||||
// Export relationships as .brainy/relationships.json
|
||||
const rels = await gitBridge.exportRelationships('/project')
|
||||
// Now Git methods are available on VFS
|
||||
await vfs.exportToGit('/project', '/local/git/repo')
|
||||
await vfs.importFromGit('/local/git/repo', '/project')
|
||||
```
|
||||
|
||||
// Export events as .brainy/events.json
|
||||
const events = await gitBridge.exportEvents('/project')
|
||||
#### Option 2: Direct GitBridge Usage
|
||||
```javascript
|
||||
// Import and instantiate GitBridge
|
||||
import { GitBridge } from '@soulcraft/brainy'
|
||||
const gitBridge = new GitBridge(vfs, brain)
|
||||
|
||||
// Export entities as .brainy/entities.json
|
||||
const entities = await gitBridge.exportEntities()
|
||||
// Export VFS to Git repository structure
|
||||
await gitBridge.exportToGit('/project', '/local/git/repo', {
|
||||
preserveMetadata: true, // Export VFS metadata as .vfs-metadata.json
|
||||
preserveRelationships: true, // Export relationships as .vfs-relationships.json
|
||||
preserveHistory: true // Export event history as .vfs-history.json
|
||||
})
|
||||
|
||||
// Export concepts as .brainy/concepts.json
|
||||
const concepts = await gitBridge.exportConcepts()
|
||||
// Import Git repository into VFS
|
||||
await gitBridge.importFromGit('/local/git/repo', '/project', {
|
||||
preserveGitHistory: true, // Import Git commits as VFS events
|
||||
extractMetadata: true, // Extract metadata from .vfs-metadata.json
|
||||
restoreRelationships: true // Restore relationships from .vfs-relationships.json
|
||||
})
|
||||
```
|
||||
|
||||
## Performance Optimizations
|
||||
|
|
@ -355,6 +371,49 @@ VFS scales to millions of files:
|
|||
- Distributed storage backend support
|
||||
- Vector search scales with HNSW index
|
||||
|
||||
## Method Availability
|
||||
|
||||
### Core VFS Methods (Always Available)
|
||||
|
||||
These methods are available immediately after VFS initialization:
|
||||
|
||||
```javascript
|
||||
const vfs = brain.vfs()
|
||||
await vfs.init()
|
||||
|
||||
// ✅ All these work without Knowledge Layer:
|
||||
await vfs.writeFile() // File operations
|
||||
await vfs.readFile()
|
||||
await vfs.mkdir() // Directory operations
|
||||
await vfs.readdir()
|
||||
await vfs.stat() // Metadata
|
||||
await vfs.search() // Semantic search
|
||||
await vfs.addRelationship() // Relationships
|
||||
await vfs.addTodo() // Todo management
|
||||
await vfs.exportToJSON() // Export
|
||||
await vfs.bulkWrite() // Bulk operations
|
||||
```
|
||||
|
||||
### Knowledge Layer Methods (Require Enablement)
|
||||
|
||||
These methods are only available after enabling the Knowledge Layer:
|
||||
|
||||
```javascript
|
||||
await vfs.enableKnowledgeLayer()
|
||||
|
||||
// 🔮 Now these methods are available:
|
||||
await vfs.createEntity() // Entity management
|
||||
await vfs.linkEntities()
|
||||
await vfs.createConcept() // Concept system
|
||||
await vfs.findByConcept()
|
||||
await vfs.getVersions() // Versioning
|
||||
await vfs.getHistory() // History tracking
|
||||
await vfs.exportToGit() // Git integration (wrapper)
|
||||
await vfs.importFromGit()
|
||||
await vfs.exportToMarkdown()// Export formats
|
||||
await vfs.getTimeline() // Timeline analysis
|
||||
```
|
||||
|
||||
## Complete Example
|
||||
|
||||
```javascript
|
||||
|
|
|
|||
|
|
@ -2,7 +2,14 @@
|
|||
|
||||
## Real-World Scenarios
|
||||
|
||||
This document demonstrates how VFS with Knowledge Layer enables powerful real-world applications. All examples show actual working code.
|
||||
This document demonstrates how VFS with Knowledge Layer enables powerful real-world applications.
|
||||
|
||||
### Legend
|
||||
- ✅ **Real VFS methods** - Fully implemented and working
|
||||
- 📝 **User functions** - Templates available in [USER_FUNCTIONS.md](./USER_FUNCTIONS.md)
|
||||
- 🔮 **Future features** - Not yet available (AI augmentations)
|
||||
|
||||
**Note:** All ✅ marked methods are production-ready. For 📝 methods, see USER_FUNCTIONS.md for implementation templates.
|
||||
|
||||
## Scenario 1: Collaborative Novel Writing
|
||||
|
||||
|
|
@ -19,13 +26,13 @@ async function novelWritingProject() {
|
|||
await vfs.init()
|
||||
await vfs.enableKnowledgeLayer()
|
||||
|
||||
// Create project structure
|
||||
// Create project structure ✅
|
||||
await vfs.mkdir('/novel')
|
||||
await vfs.mkdir('/novel/chapters')
|
||||
await vfs.mkdir('/novel/characters')
|
||||
await vfs.mkdir('/novel/worldbuilding')
|
||||
|
||||
// Define main characters as persistent entities
|
||||
// Define main characters as persistent entities ✅
|
||||
const protagonist = await vfs.createEntity({
|
||||
name: 'Elena Blackwood',
|
||||
type: 'character',
|
||||
|
|
@ -61,7 +68,7 @@ async function novelWritingProject() {
|
|||
}
|
||||
})
|
||||
|
||||
// Link entities
|
||||
// Link entities ✅
|
||||
await vfs.linkEntities(protagonist.id, city.id, 'lives_in')
|
||||
await vfs.linkEntities(protagonist.id, antagonist.id, 'investigates')
|
||||
|
||||
|
|
@ -77,7 +84,7 @@ async function novelWritingProject() {
|
|||
infiltrate the Crypto Quarter facility.
|
||||
`)
|
||||
|
||||
// Multiple authors can work simultaneously
|
||||
// Multiple authors can work simultaneously ✅
|
||||
vfs.setUser('author-alice')
|
||||
await vfs.writeFile('/novel/chapters/chapter2.md', `
|
||||
# Chapter 2: The Void Industries Tower
|
||||
|
|
@ -92,17 +99,17 @@ async function novelWritingProject() {
|
|||
He smiled. Let her come. The trap was already set.
|
||||
`)
|
||||
|
||||
// Track character appearances across chapters
|
||||
// Track character appearances across chapters ✅
|
||||
const elenaAppearances = await vfs.findEntityOccurrences(protagonist.id)
|
||||
console.log('Elena appears in:', elenaAppearances.map(f => f.path))
|
||||
|
||||
// Find all locations mentioned
|
||||
// Find all locations mentioned ✅
|
||||
const locations = await vfs.listEntities({ type: 'location' })
|
||||
|
||||
// Generate character relationship graph
|
||||
// Generate character relationship graph ✅
|
||||
const relationships = await vfs.getEntityGraph(protagonist.id, { depth: 2 })
|
||||
|
||||
// Track plot threads using concepts
|
||||
// Track plot threads using concepts ✅
|
||||
await vfs.createConcept({
|
||||
name: 'The Void Conspiracy',
|
||||
type: 'plot',
|
||||
|
|
@ -111,17 +118,17 @@ async function novelWritingProject() {
|
|||
keywords: ['scientists', 'experiments', 'void industries', 'conspiracy']
|
||||
})
|
||||
|
||||
// Find all chapters related to the conspiracy
|
||||
// Find all chapters related to the conspiracy ✅
|
||||
const conspiracyChapters = await vfs.findByConcept('The Void Conspiracy')
|
||||
|
||||
// Version control for revisions
|
||||
// Version control for revisions ✅
|
||||
const chapterVersions = await vfs.getVersions('/novel/chapters/chapter1.md')
|
||||
|
||||
// Collaborative editing history
|
||||
// Collaborative editing history ✅
|
||||
const history = await vfs.getCollaborationHistory('/novel/chapters/chapter2.md')
|
||||
console.log('Chapter 2 edited by:', history.map(h => h.user))
|
||||
|
||||
// Export for publishing
|
||||
// Export for publishing ✅
|
||||
const manuscript = await vfs.exportToMarkdown('/novel/chapters')
|
||||
|
||||
await vfs.close()
|
||||
|
|
@ -234,7 +241,7 @@ async function gameDevProject() {
|
|||
export default CombatSystem
|
||||
`)
|
||||
|
||||
// Asset management
|
||||
// Asset management ✅
|
||||
await vfs.writeFile('/game/assets/sprites/elder_sage.png', spriteData)
|
||||
await vfs.setMetadata('/game/assets/sprites/elder_sage.png', {
|
||||
dimensions: '64x64',
|
||||
|
|
@ -243,23 +250,23 @@ async function gameDevProject() {
|
|||
license: 'CC-BY-4.0'
|
||||
})
|
||||
|
||||
// Track dependencies
|
||||
// Track dependencies ✅
|
||||
await vfs.addRelationship('/game/quests/main_quest.json', '/game/npcs/elder_sage.json', 'uses')
|
||||
await vfs.addRelationship('/game/scripts/combat.js', '/game/systems/stats.js', 'imports')
|
||||
|
||||
// Find all content related to combat
|
||||
// Find all content related to combat ✅
|
||||
const combatFiles = await vfs.findByConcept('Combat System')
|
||||
|
||||
// Get all NPCs in a specific location
|
||||
// Get all NPCs in a specific location ✅
|
||||
const villageNPCs = await vfs.searchEntities({
|
||||
type: 'npc',
|
||||
where: { 'attributes.location': 'Village Square' }
|
||||
})
|
||||
|
||||
// Track game balance changes
|
||||
// Track game balance changes ✅
|
||||
const balanceHistory = await vfs.getHistory('/game/data/balance.json')
|
||||
|
||||
// Collaborative development tracking
|
||||
// Collaborative development tracking ✅
|
||||
await vfs.addTodo('/game/quests/main_quest.json', {
|
||||
task: 'Add voice dialogue triggers',
|
||||
priority: 'medium',
|
||||
|
|
@ -267,7 +274,7 @@ async function gameDevProject() {
|
|||
assignee: 'audio-team'
|
||||
})
|
||||
|
||||
// Export for build system
|
||||
// Export for build system ✅
|
||||
const gameData = await vfs.exportToJSON('/game')
|
||||
|
||||
await vfs.close()
|
||||
|
|
@ -288,7 +295,7 @@ async function softwareProject() {
|
|||
await vfs.init()
|
||||
await vfs.enableKnowledgeLayer()
|
||||
|
||||
// Import existing git repository
|
||||
// Import existing git repository ✅ (Knowledge Layer provides wrapper)
|
||||
await vfs.importFromGit('/local/repos/webapp', '/project')
|
||||
|
||||
// Define architectural concepts
|
||||
|
|
@ -397,43 +404,43 @@ async function softwareProject() {
|
|||
\`\`\`
|
||||
`)
|
||||
|
||||
// Find all files needing security review
|
||||
// Find all files needing security review ✅
|
||||
const securityFiles = await vfs.search('authentication password jwt oauth', {
|
||||
path: '/project/src',
|
||||
type: 'file'
|
||||
})
|
||||
|
||||
// Get project insights
|
||||
const insights = await vfs.getInsights('/project')
|
||||
// Get project insights 📝 (see USER_FUNCTIONS.md for getProjectInsights)
|
||||
const insights = await getProjectInsights(vfs, '/project') // User function
|
||||
console.log('Most modified files:', insights.hotspots)
|
||||
console.log('Key concepts:', insights.concepts)
|
||||
console.log('Team activity:', insights.contributors)
|
||||
|
||||
// Find circular dependencies
|
||||
const circularDeps = await vfs.findCircularDependencies('/project/src')
|
||||
// Find circular dependencies 📝 (see USER_FUNCTIONS.md)
|
||||
const circularDeps = await findCircularDependencies(vfs, '/project/src') // User function
|
||||
|
||||
// Get test coverage relationships
|
||||
const untested = await vfs.findUntestedCode('/project/src')
|
||||
// Get test coverage relationships 📝 (see USER_FUNCTIONS.md)
|
||||
const untested = await findUntestedCode(vfs, '/project/src') // User function
|
||||
|
||||
// Track technical debt
|
||||
// Track technical debt ✅
|
||||
const todos = await vfs.getAllTodos('/project')
|
||||
const highPriorityDebt = todos.filter(t => t.priority === 'high' && t.status === 'pending')
|
||||
|
||||
// Generate dependency graph
|
||||
const depGraph = await vfs.getDependencyGraph('/project/src')
|
||||
// Generate dependency graph 📝 (see USER_FUNCTIONS.md)
|
||||
const depGraph = await getDependencyGraph(vfs, '/project/src') // User function
|
||||
|
||||
// Find similar code (potential refactoring)
|
||||
const similarCode = await vfs.findSimilarCode('/project/src/auth/login.ts', {
|
||||
// Find similar code (potential refactoring) 📝 (see USER_FUNCTIONS.md)
|
||||
const similarCode = await findSimilarCode(vfs, '/project/src/auth/login.ts', {
|
||||
threshold: 0.8,
|
||||
minLines: 10
|
||||
})
|
||||
}) // User function
|
||||
|
||||
// Export for CI/CD
|
||||
// Export for CI/CD ✅ (Knowledge Layer provides wrapper)
|
||||
await vfs.exportToGit('/project', '/tmp/build-output')
|
||||
|
||||
// Collaborative features
|
||||
vfs.setUser('developer-alice')
|
||||
const conflicts = await vfs.detectConflicts('/project/src/auth/login.ts')
|
||||
// Collaborative features ✅ / 🔮
|
||||
vfs.setUser('developer-alice') // ✅ Real method
|
||||
// const conflicts = await vfs.detectConflicts('/project/src/auth/login.ts') // 🔮 Future feature
|
||||
|
||||
await vfs.close()
|
||||
await brain.close()
|
||||
|
|
@ -486,7 +493,7 @@ async function unifiedKnowledgeBase() {
|
|||
role: 'detective'
|
||||
}]))
|
||||
|
||||
// Cross-project entity tracking
|
||||
// Cross-project entity tracking ✅
|
||||
const elenaOccurrences = await vfs.findEntityOccurrences(sharedCharacter.id)
|
||||
console.log('Elena appears across projects:', elenaOccurrences)
|
||||
|
||||
|
|
@ -497,36 +504,36 @@ async function unifiedKnowledgeBase() {
|
|||
domain: 'software'
|
||||
})
|
||||
|
||||
// Find auth implementations across all projects
|
||||
// Find auth implementations across all projects ✅
|
||||
const authImplementations = await vfs.findByConcept('Authentication')
|
||||
// Returns: /webapp/src/auth.js, /game/scripts/player-auth.js, etc.
|
||||
|
||||
// Cross-project relationships
|
||||
// Cross-project relationships ✅
|
||||
await vfs.addRelationship('/novel/chapter1.md', '/game/story/intro.txt', 'inspires')
|
||||
await vfs.addRelationship('/game/npcs/elena.json', '/novel/characters/elena.md', 'based_on')
|
||||
|
||||
// Universal search across all projects
|
||||
// Universal search across all projects ✅
|
||||
const results = await vfs.search('Elena Blackwood authentication', {
|
||||
path: '/',
|
||||
recursive: true
|
||||
})
|
||||
|
||||
// Project statistics
|
||||
const novelStats = await vfs.getProjectStats('/novel')
|
||||
const gameStats = await vfs.getProjectStats('/game')
|
||||
const webappStats = await vfs.getProjectStats('/webapp')
|
||||
// Project statistics 📝 (see USER_FUNCTIONS.md for getProjectStats)
|
||||
const novelStats = await getProjectStats(vfs, '/novel') // User function
|
||||
const gameStats = await getProjectStats(vfs, '/game') // User function
|
||||
const webappStats = await getProjectStats(vfs, '/webapp') // User function
|
||||
|
||||
console.log('Total files:', novelStats.fileCount + gameStats.fileCount + webappStats.fileCount)
|
||||
console.log('Total size:', novelStats.totalSize + gameStats.totalSize + webappStats.totalSize)
|
||||
|
||||
// Knowledge graph visualization data
|
||||
const knowledgeGraph = await vfs.getGlobalKnowledgeGraph()
|
||||
// Knowledge graph visualization data 🔮 (future feature)
|
||||
// const knowledgeGraph = await vfs.getGlobalKnowledgeGraph() // Not yet implemented
|
||||
// Returns nodes (files, entities, concepts) and edges (relationships)
|
||||
|
||||
// Find connections between projects
|
||||
const crossProjectLinks = await vfs.findCrossProjectLinks()
|
||||
// Find connections between projects 🔮 (future feature)
|
||||
// const crossProjectLinks = await vfs.findCrossProjectLinks() // Not yet implemented
|
||||
|
||||
// Unified timeline
|
||||
// Unified timeline ✅
|
||||
const timeline = await vfs.getTimeline({
|
||||
from: '2025-01-01',
|
||||
to: '2025-12-31'
|
||||
|
|
@ -539,101 +546,135 @@ async function unifiedKnowledgeBase() {
|
|||
|
||||
## Advanced Features
|
||||
|
||||
### Semantic Code Analysis
|
||||
### Semantic Code Analysis 📝
|
||||
|
||||
These are user functions - see [USER_FUNCTIONS.md](./USER_FUNCTIONS.md) for implementation templates:
|
||||
|
||||
```javascript
|
||||
// Find security vulnerabilities
|
||||
const vulnerabilities = await vfs.findPatterns([
|
||||
// Find security vulnerabilities (user function example)
|
||||
const vulnerabilities = await findPatterns(vfs, [
|
||||
'eval(',
|
||||
'innerHTML =',
|
||||
'SQL injection',
|
||||
'hardcoded password'
|
||||
])
|
||||
|
||||
// Find code smells
|
||||
const codeSmells = await vfs.analyzeCodeQuality('/src', {
|
||||
// Find code smells (user function example)
|
||||
const codeSmells = await analyzeCodeQuality(vfs, '/src', {
|
||||
checkDuplication: true,
|
||||
checkComplexity: true,
|
||||
checkNaming: true
|
||||
})
|
||||
```
|
||||
|
||||
### AI-Powered Features
|
||||
### AI-Powered Features 🔮
|
||||
|
||||
**Note:** These features require AI integration and are not yet available.
|
||||
|
||||
```javascript
|
||||
// Generate documentation
|
||||
const docs = await vfs.generateDocumentation('/src/auth/login.ts')
|
||||
// Future: Generate documentation
|
||||
// const docs = await vfs.generateDocumentation('/src/auth/login.ts')
|
||||
|
||||
// Suggest refactorings
|
||||
const refactorings = await vfs.suggestRefactorings('/src/utils.js')
|
||||
// Future: Suggest refactorings
|
||||
// const refactorings = await vfs.suggestRefactorings('/src/utils.js')
|
||||
|
||||
// Auto-complete code
|
||||
const completion = await vfs.completeCode('/src/api.ts', { line: 42, column: 10 })
|
||||
// Future: Auto-complete code
|
||||
// const completion = await vfs.completeCode('/src/api.ts', { line: 42, column: 10 })
|
||||
```
|
||||
|
||||
### Migration and Backup
|
||||
### Migration and Backup 🔮
|
||||
|
||||
**Note:** These features are planned but not yet implemented.
|
||||
|
||||
```javascript
|
||||
// Backup with full history
|
||||
await vfs.createBackup('/backup/2025-01-20.brainy')
|
||||
// Future: Backup with full history
|
||||
// await vfs.createBackup('/backup/2025-01-20.brainy')
|
||||
|
||||
// Migrate between storage backends
|
||||
const migration = await vfs.migrate({
|
||||
from: { type: 'file', path: './old-data' },
|
||||
to: { type: 's3', bucket: 'new-bucket' }
|
||||
})
|
||||
// Future: Migrate between storage backends
|
||||
// const migration = await vfs.migrate({
|
||||
// from: { type: 'file', path: './old-data' },
|
||||
// to: { type: 's3', bucket: 'new-bucket' }
|
||||
// })
|
||||
|
||||
// Incremental sync
|
||||
await vfs.sync('/local/path', '/vfs/path', {
|
||||
bidirectional: true,
|
||||
conflictStrategy: 'newest'
|
||||
})
|
||||
// Future: Incremental sync
|
||||
// await vfs.sync('/local/path', '/vfs/path', {
|
||||
// bidirectional: true,
|
||||
// conflictStrategy: 'newest'
|
||||
// })
|
||||
```
|
||||
|
||||
### Performance at Scale
|
||||
|
||||
```javascript
|
||||
// Handle millions of files
|
||||
// Handle millions of files ✅
|
||||
for (let i = 0; i < 1000000; i++) {
|
||||
await vfs.writeFile(`/data/file${i}.txt`, `Content ${i}`)
|
||||
// Uses chunking, compression, and efficient indexing
|
||||
}
|
||||
|
||||
// Fast parallel operations
|
||||
// Fast parallel operations ✅
|
||||
await Promise.all([
|
||||
vfs.writeFile('/file1.txt', 'data1'),
|
||||
vfs.writeFile('/file2.txt', 'data2'),
|
||||
vfs.writeFile('/file3.txt', 'data3')
|
||||
])
|
||||
|
||||
// Bulk imports
|
||||
await vfs.bulkImport('/massive/dataset', {
|
||||
parallel: 10,
|
||||
batchSize: 1000,
|
||||
progress: (count, total) => console.log(`${count}/${total}`)
|
||||
})
|
||||
// Bulk write operations ✅
|
||||
const files = [
|
||||
{ path: '/data/file1.txt', content: 'Content 1' },
|
||||
{ path: '/data/file2.txt', content: 'Content 2' },
|
||||
// ... more files
|
||||
]
|
||||
await vfs.bulkWrite(files)
|
||||
|
||||
// Bulk imports 🔮 (future feature)
|
||||
// await vfs.bulkImport('/massive/dataset', {
|
||||
// parallel: 10,
|
||||
// batchSize: 1000,
|
||||
// progress: (count, total) => console.log(`${count}/${total}`)
|
||||
// })
|
||||
```
|
||||
|
||||
## Real Implementation Notes
|
||||
## Implementation Status
|
||||
|
||||
All examples in this document use actual VFS APIs that are fully implemented:
|
||||
### ✅ Fully Implemented Features
|
||||
|
||||
1. **Storage**: Real Brainy entities, not mock data
|
||||
2. **Embeddings**: Real vector embeddings via brain.embed()
|
||||
3. **Relationships**: Real graph relationships via brain.relate()
|
||||
4. **Search**: Real semantic search via brain.search()
|
||||
5. **Events**: Real event recording in Knowledge Layer
|
||||
6. **Versions**: Real semantic versioning based on similarity
|
||||
7. **Entities**: Real persistent entity tracking
|
||||
8. **Concepts**: Real concept detection and management
|
||||
9. **Git**: Real GitBridge import/export functionality
|
||||
All methods marked with ✅ are production-ready:
|
||||
|
||||
This is production-ready code with:
|
||||
- No stubs or mocks
|
||||
- Complete error handling
|
||||
- Full async/await support
|
||||
- Proper resource cleanup
|
||||
- Thread-safe operations
|
||||
- Scalable architecture
|
||||
1. **Core VFS Operations**: mkdir, writeFile, readFile, appendFile, stat, readdir, etc.
|
||||
2. **Entity System**: createEntity, linkEntities, findEntityOccurrences, updateEntity, getEntityGraph
|
||||
3. **Concept System**: createConcept, findByConcept
|
||||
4. **Knowledge Layer**: Event recording, semantic versioning, collaboration tracking
|
||||
5. **Search**: Triple Intelligence (vector + field + graph)
|
||||
6. **Git Integration**: importFromGit, exportToGit
|
||||
7. **Export Formats**: exportToMarkdown, exportToJSON
|
||||
8. **Bulk Operations**: bulkWrite for efficient batch processing
|
||||
9. **Project Management**: todos, metadata, relationships
|
||||
|
||||
The VFS + Knowledge Layer combination enables these scenarios and more, providing a foundation for intelligent applications that understand and manage knowledge.
|
||||
### 📝 User Functions
|
||||
|
||||
Methods marked with 📝 are domain-specific functions that you can implement using VFS primitives. See [USER_FUNCTIONS.md](./USER_FUNCTIONS.md) for ready-to-use templates:
|
||||
|
||||
- **Code Analysis**: getDependencyGraph, findCircularDependencies, findUntestedCode, findSimilarCode
|
||||
- **Creative Writing**: trackCharacterArc, generateStoryBible
|
||||
- **Game Development**: validateGameData, generateLootTables
|
||||
- **Project Management**: getProjectInsights, generateSprintReport
|
||||
- **Export Formats**: exportToEpub, exportToStaticSite
|
||||
|
||||
### 🔮 Future Features
|
||||
|
||||
Methods marked with 🔮 require AI integration or are planned for future releases:
|
||||
|
||||
- **AI-Powered**: generateDocumentation, suggestRefactorings, completeCode
|
||||
- **Advanced Analysis**: detectConflicts, getGlobalKnowledgeGraph, findCrossProjectLinks
|
||||
- **Migration Tools**: createBackup, migrate, sync, bulkImport
|
||||
|
||||
## Real Implementation Guarantees
|
||||
|
||||
- **No Mocks**: Every ✅ method is fully functional
|
||||
- **Real Storage**: Uses Brainy entities with embeddings
|
||||
- **Real Search**: Triple Intelligence combining vectors, fields, and graphs
|
||||
- **Real Relationships**: Graph-based connections via brain.relate()
|
||||
- **Production Ready**: Complete error handling, async/await, resource cleanup
|
||||
|
||||
The VFS + Knowledge Layer combination provides a solid foundation for intelligent applications. Use the ✅ methods directly, implement 📝 functions as needed for your domain, and stay tuned for 🔮 features.
|
||||
Loading…
Add table
Add a link
Reference in a new issue