monomind 1.15.5 → 1.15.7
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/agents/github/repo-architect.md +1 -1
- package/.claude/agents/specialists/integration-architect.md +6 -6
- package/.claude/commands/hive-mind/hive-mind-init.md +1 -1
- package/.claude/commands/hive-mind/hive-mind-memory.md +1 -1
- package/.claude/commands/mastermind/brain.md +11 -11
- package/.claude/commands/mastermind/master.md +4 -4
- package/.claude/commands/mastermind/memory.md +6 -6
- package/.claude/commands/memory/README.md +4 -4
- package/.claude/commands/truth/start.md +3 -3
- package/.claude/helpers/extras-registry.json +2 -2
- package/.claude/helpers/skill-registry.json +26 -26
- package/.claude/helpers/statusline.cjs +8 -8
- package/.claude/skills/agentic-jujutsu/SKILL.md +3 -3
- package/.claude/skills/mastermind/_protocol.md +8 -8
- package/README.md +6 -6
- package/package.json +2 -2
- package/packages/@monomind/cli/README.md +6 -6
- package/packages/@monomind/cli/dist/src/__tests__/browse-analyzer.test.js +18 -1
- package/packages/@monomind/cli/dist/src/commands/agent.js +2 -2
- package/packages/@monomind/cli/dist/src/commands/autopilot.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/completions.js +2 -21
- package/packages/@monomind/cli/dist/src/commands/config.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/hive-mind.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/hooks-coverage-commands.js +31 -31
- package/packages/@monomind/cli/dist/src/commands/hooks-routing-commands.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/hooks.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/index.d.ts +0 -1
- package/packages/@monomind/cli/dist/src/commands/index.js +0 -4
- package/packages/@monomind/cli/dist/src/commands/init.js +8 -8
- package/packages/@monomind/cli/dist/src/commands/memory.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/commands/memory.js +25 -25
- package/packages/@monomind/cli/dist/src/commands/migrate.js +2 -2
- package/packages/@monomind/cli/dist/src/commands/neural.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/swarm.js +1 -1
- package/packages/@monomind/cli/dist/src/config-adapter.js +8 -8
- package/packages/@monomind/cli/dist/src/index.js +1 -1
- package/packages/@monomind/cli/dist/src/init/claudemd-generator.js +2 -2
- package/packages/@monomind/cli/dist/src/init/executor.js +16 -16
- package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.js +1 -1
- package/packages/@monomind/cli/dist/src/init/statusline-generator.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/init/statusline-generator.js +8 -8
- package/packages/@monomind/cli/dist/src/init/types.d.ts +3 -3
- package/packages/@monomind/cli/dist/src/init/types.js +3 -3
- package/packages/@monomind/cli/dist/src/mcp-client.js +4 -11
- package/packages/@monomind/cli/dist/src/mcp-tools/autopilot-tools.js +3 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence-tools.d.ts +2 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/coherence-tools.js +2 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +13 -13
- package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +4 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +4 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-intelligence.js +1 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.js +23 -23
- package/packages/@monomind/cli/dist/src/mcp-tools/index.d.ts +0 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/index.js +0 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.d.ts +22 -6
- package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +553 -505
- package/packages/@monomind/cli/dist/src/mcp-tools/progress-tools.js +1 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/quality-tools.d.ts +2 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/quality-tools.js +3 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.js +5 -5
- package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +1 -156
- package/packages/@monomind/cli/dist/src/memory/embedding-operations.js +3 -3
- package/packages/@monomind/cli/dist/src/memory/hnsw-operations.js +5 -5
- package/packages/@monomind/cli/dist/src/memory/intelligence.js +2 -2
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.d.ts +86 -234
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +455 -1702
- package/packages/@monomind/cli/dist/src/memory/memory-crud.js +3 -3
- package/packages/@monomind/cli/dist/src/memory/memory-initializer.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +5 -5
- package/packages/@monomind/cli/dist/src/memory/memory-read.js +4 -4
- package/packages/@monomind/cli/dist/src/suggest.js +0 -1
- package/packages/@monomind/cli/dist/src/types.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/ui/dashboard.html +41 -5
- package/packages/@monomind/cli/dist/src/ui/orgs.html +91 -5
- package/packages/@monomind/cli/dist/src/ui/server.mjs +44 -0
- package/packages/@monomind/cli/dist/src/update/validator.js +1 -3
- package/packages/@monomind/cli/package.json +4 -4
- package/scripts/verify-appliance.sh +1 -1
- package/packages/@monomind/cli/dist/src/commands/plugins.d.ts +0 -11
- package/packages/@monomind/cli/dist/src/commands/plugins.js +0 -799
- package/packages/@monomind/cli/dist/src/plugins/manager.d.ts +0 -133
- package/packages/@monomind/cli/dist/src/plugins/manager.js +0 -498
- package/packages/@monomind/cli/dist/src/plugins/store/discovery.d.ts +0 -88
- package/packages/@monomind/cli/dist/src/plugins/store/discovery.js +0 -770
- package/packages/@monomind/cli/dist/src/plugins/store/index.d.ts +0 -76
- package/packages/@monomind/cli/dist/src/plugins/store/index.js +0 -141
- package/packages/@monomind/cli/dist/src/plugins/store/search.d.ts +0 -46
- package/packages/@monomind/cli/dist/src/plugins/store/search.js +0 -231
- package/packages/@monomind/cli/dist/src/plugins/store/types.d.ts +0 -274
- package/packages/@monomind/cli/dist/src/plugins/store/types.js +0 -7
- package/packages/@monomind/cli/dist/src/plugins/tests/demo-plugin-store.d.ts +0 -7
- package/packages/@monomind/cli/dist/src/plugins/tests/demo-plugin-store.js +0 -126
- package/packages/@monomind/cli/dist/src/plugins/tests/standalone-test.d.ts +0 -12
- package/packages/@monomind/cli/dist/src/plugins/tests/standalone-test.js +0 -188
- package/packages/@monomind/cli/dist/src/plugins/tests/test-plugin-store.d.ts +0 -7
- package/packages/@monomind/cli/dist/src/plugins/tests/test-plugin-store.js +0 -206
- package/packages/@monomind/cli/dist/src/services/registry-api.d.ts +0 -58
- package/packages/@monomind/cli/dist/src/services/registry-api.js +0 -199
|
@@ -66,7 +66,7 @@ flowchart TD
|
|
|
66
66
|
R["Reviewer"]
|
|
67
67
|
M["Growth Marketer"]
|
|
68
68
|
BOARD[("Shared\nTask Board")]
|
|
69
|
-
MEM[("
|
|
69
|
+
MEM[("LanceDB\nMemory")]
|
|
70
70
|
|
|
71
71
|
U --> CO --> RO --> BOSS
|
|
72
72
|
BOSS -->|spawns| W
|
|
@@ -126,7 +126,7 @@ Type "go" to save, or describe changes.
|
|
|
126
126
|
| **Boss agent** | Coordinator type, no supervisor — owns the goal |
|
|
127
127
|
| **Role agents** | Spawned on demand, specialized by task type |
|
|
128
128
|
| **Task board** | Todo → Doing → Done, shared across all agents |
|
|
129
|
-
| **Memory** | All output stored in org-scoped
|
|
129
|
+
| **Memory** | All output stored in org-scoped LanceDB namespace |
|
|
130
130
|
| **Checkpoint** | State saved every 30 min — survives crashes and restarts |
|
|
131
131
|
| **Governance** | `auto` (free), `board` (approve sensitive), `strict` (approve all external actions) |
|
|
132
132
|
|
|
@@ -221,13 +221,13 @@ Open Claude Code. You now have 80+ slash commands available:
|
|
|
221
221
|
|
|
222
222
|
## 🧠 Memory That Persists
|
|
223
223
|
|
|
224
|
-
Every session, every agent, every org writes to **
|
|
224
|
+
Every session, every agent, every org writes to **LanceDB** — a hybrid SQLite + HNSW vector store that survives across sessions. The next time you run anything, Monomind already knows what was built, what failed, and which patterns work.
|
|
225
225
|
|
|
226
226
|
```mermaid
|
|
227
227
|
graph TD
|
|
228
228
|
L0["L0 - In-flight\nCurrent session drawers\nephemeral"]
|
|
229
229
|
L1["L1 - Working\nCross-session memory\nBM25 K1=1.5, B=0.75"]
|
|
230
|
-
L2["L2 - Long-term\
|
|
230
|
+
L2["L2 - Long-term\nLanceDB + HNSW index\nSemantic search"]
|
|
231
231
|
L3["L3 - Shared\nCross-agent namespace\nFederated swarm reads"]
|
|
232
232
|
|
|
233
233
|
L0 -->|promoted| L1 --> L2 --> L3
|
|
@@ -275,7 +275,7 @@ flowchart LR
|
|
|
275
275
|
H --> I["route\nlearn\nbuild-agents"]
|
|
276
276
|
H --> T["teammate-idle\ntask-completed"]
|
|
277
277
|
|
|
278
|
-
I --> DB[("
|
|
278
|
+
I --> DB[("LanceDB\npatterns.json")]
|
|
279
279
|
DB -->|next session| CE
|
|
280
280
|
```
|
|
281
281
|
|
|
@@ -358,7 +358,7 @@ graph TD
|
|
|
358
358
|
CC <-->|"23 tools: monograph, memory, swarm"| MCP
|
|
359
359
|
MCP <--> D
|
|
360
360
|
|
|
361
|
-
D --> ADB[("
|
|
361
|
+
D --> ADB[("LanceDB\nSQLite + HNSW")]
|
|
362
362
|
D --> MG[("Monograph\ncode graph")]
|
|
363
363
|
D --> HK["Hooks\n22 event types"]
|
|
364
364
|
D --> SW["Swarm\n6 topologies\n5 consensus algos"]
|
|
@@ -38,7 +38,24 @@ function mockPage(url = 'https://linkedin.com/feed', title = 'LinkedIn') {
|
|
|
38
38
|
describe('analyzePageForAction', () => {
|
|
39
39
|
let analyzePageForAction;
|
|
40
40
|
beforeEach(async () => {
|
|
41
|
-
mockCreate.
|
|
41
|
+
mockCreate.mockResolvedValue({
|
|
42
|
+
content: [{
|
|
43
|
+
type: 'text',
|
|
44
|
+
text: JSON.stringify({
|
|
45
|
+
id: 'linkedin:comment_post',
|
|
46
|
+
platform: 'linkedin',
|
|
47
|
+
name: 'Comment on Post',
|
|
48
|
+
params: ['post_url', 'text'],
|
|
49
|
+
steps: [
|
|
50
|
+
{ type: 'navigate', url: '{{params.post_url}}' },
|
|
51
|
+
{ type: 'find', selectors: ['.comment-box'], as: 'box' },
|
|
52
|
+
{ type: 'click', target: '{{box}}' },
|
|
53
|
+
{ type: 'type', target: '{{box}}', text: '{{params.text}}', humanDelay: true },
|
|
54
|
+
{ type: 'wait', condition: 'network_idle', timeout: 3000 },
|
|
55
|
+
],
|
|
56
|
+
}),
|
|
57
|
+
}],
|
|
58
|
+
});
|
|
42
59
|
const mod = await import('@monoes/monobrowse');
|
|
43
60
|
analyzePageForAction = mod.analyzePageForAction;
|
|
44
61
|
});
|
|
@@ -53,7 +53,7 @@ const AGENT_TYPES = [
|
|
|
53
53
|
{ value: 'optimizer', label: 'Optimizer', hint: 'Performance optimization and bottleneck analysis' },
|
|
54
54
|
{ value: 'security-architect', label: 'Security Architect', hint: 'Security architecture and threat modeling' },
|
|
55
55
|
{ value: 'security-auditor', label: 'Security Auditor', hint: 'CVE remediation and security testing' },
|
|
56
|
-
{ value: 'memory-specialist', label: 'Memory Specialist', hint: '
|
|
56
|
+
{ value: 'memory-specialist', label: 'Memory Specialist', hint: 'LanceDB ANN search (150x-12,500x faster)' },
|
|
57
57
|
{ value: 'swarm-specialist', label: 'Swarm Specialist', hint: 'Unified coordination engine' },
|
|
58
58
|
{ value: 'performance-engineer', label: 'Performance Engineer', hint: '2.49x-7.47x optimization targets' },
|
|
59
59
|
{ value: 'core-architect', label: 'Core Architect', hint: 'Domain-driven design restructure' },
|
|
@@ -918,7 +918,7 @@ function getAgentCapabilities(type) {
|
|
|
918
918
|
architect: ['system-design', 'pattern-analysis', 'scalability', 'documentation'],
|
|
919
919
|
coordinator: ['task-orchestration', 'agent-management', 'workflow-control'],
|
|
920
920
|
'security-architect': ['threat-modeling', 'security-patterns', 'compliance', 'audit'],
|
|
921
|
-
'memory-specialist': ['vector-search', '
|
|
921
|
+
'memory-specialist': ['vector-search', 'lancedb', 'caching', 'optimization'],
|
|
922
922
|
'performance-engineer': ['benchmarking', 'profiling', 'optimization', 'monitoring']
|
|
923
923
|
};
|
|
924
924
|
return capabilities[type] || ['general'];
|
|
@@ -221,7 +221,7 @@ const learnCommand = {
|
|
|
221
221
|
action: async (ctx) => {
|
|
222
222
|
const learning = await tryLoadLearning();
|
|
223
223
|
if (!learning) {
|
|
224
|
-
output.writeln('Learning not available (
|
|
224
|
+
output.writeln('Learning not available (memory backend not initialized). Autopilot still works for task completion tracking.');
|
|
225
225
|
return { success: true };
|
|
226
226
|
}
|
|
227
227
|
const metrics = await learning.getMetrics();
|
|
@@ -9,7 +9,7 @@ import { output } from '../output.js';
|
|
|
9
9
|
const TOP_LEVEL_COMMANDS = [
|
|
10
10
|
'swarm', 'agent', 'task', 'session', 'config', 'memory', 'workflow',
|
|
11
11
|
'hive-mind', 'hooks', 'daemon', 'neural', 'security', 'performance',
|
|
12
|
-
'providers', '
|
|
12
|
+
'providers', 'deployment', 'claims', 'embeddings',
|
|
13
13
|
'doctor', 'completions', 'help', 'version'
|
|
14
14
|
];
|
|
15
15
|
// Swarm subcommands
|
|
@@ -81,10 +81,6 @@ _monomind_completions() {
|
|
|
81
81
|
COMPREPLY=( $(compgen -W "benchmark profile metrics optimize bottleneck" -- "\${cur}") )
|
|
82
82
|
return 0
|
|
83
83
|
;;
|
|
84
|
-
plugins)
|
|
85
|
-
COMPREPLY=( $(compgen -W "list install uninstall toggle info create" -- "\${cur}") )
|
|
86
|
-
return 0
|
|
87
|
-
;;
|
|
88
84
|
deployment|deploy)
|
|
89
85
|
COMPREPLY=( $(compgen -W "deploy status rollback history environments logs" -- "\${cur}") )
|
|
90
86
|
return 0
|
|
@@ -138,7 +134,7 @@ _monomind() {
|
|
|
138
134
|
'task:Task creation and management'
|
|
139
135
|
'session:Session management'
|
|
140
136
|
'config:Configuration management'
|
|
141
|
-
'memory:Memory operations with
|
|
137
|
+
'memory:Memory operations with LanceDB'
|
|
142
138
|
'workflow:Workflow automation'
|
|
143
139
|
'hive-mind:Queen-led consensus coordination'
|
|
144
140
|
'hooks:Self-learning automation hooks'
|
|
@@ -147,7 +143,6 @@ _monomind() {
|
|
|
147
143
|
'security:Security scanning and CVE detection'
|
|
148
144
|
'performance:Performance profiling'
|
|
149
145
|
'providers:AI provider management'
|
|
150
|
-
'plugins:Plugin management'
|
|
151
146
|
'deployment:Deployment management'
|
|
152
147
|
'claims:Claims-based authorization'
|
|
153
148
|
'embeddings:Vector embeddings'
|
|
@@ -273,16 +268,6 @@ _monomind() {
|
|
|
273
268
|
'bottleneck:Find bottlenecks'
|
|
274
269
|
)
|
|
275
270
|
;;
|
|
276
|
-
plugins)
|
|
277
|
-
subcommands=(
|
|
278
|
-
'list:List plugins'
|
|
279
|
-
'install:Install plugin'
|
|
280
|
-
'uninstall:Remove plugin'
|
|
281
|
-
'toggle:Enable/disable'
|
|
282
|
-
'info:Plugin details'
|
|
283
|
-
'create:Scaffold plugin'
|
|
284
|
-
)
|
|
285
|
-
;;
|
|
286
271
|
deployment|deploy)
|
|
287
272
|
subcommands=(
|
|
288
273
|
'deploy:Deploy to environment'
|
|
@@ -379,9 +364,6 @@ complete -c monomind -n "__fish_seen_subcommand_from security" -a "scan cve thre
|
|
|
379
364
|
# Performance subcommands
|
|
380
365
|
complete -c monomind -n "__fish_seen_subcommand_from performance" -a "benchmark profile metrics optimize bottleneck"
|
|
381
366
|
|
|
382
|
-
# Plugins subcommands
|
|
383
|
-
complete -c monomind -n "__fish_seen_subcommand_from plugins" -a "list install uninstall toggle info create"
|
|
384
|
-
|
|
385
367
|
# Deployment subcommands
|
|
386
368
|
complete -c monomind -n "__fish_seen_subcommand_from deployment deploy" -a "deploy status rollback history environments logs"
|
|
387
369
|
|
|
@@ -419,7 +401,6 @@ $script:SubCommands = @{
|
|
|
419
401
|
'neural' = @('train', 'status', 'patterns', 'predict', 'optimize')
|
|
420
402
|
'security' = @('scan', 'cve', 'threats', 'audit', 'secrets')
|
|
421
403
|
'performance' = @('benchmark', 'profile', 'metrics', 'optimize', 'bottleneck')
|
|
422
|
-
'plugins' = @('list', 'install', 'uninstall', 'toggle', 'info', 'create')
|
|
423
404
|
'deployment' = @('deploy', 'status', 'rollback', 'history', 'environments', 'logs')
|
|
424
405
|
'deploy' = @('deploy', 'status', 'rollback', 'history', 'environments', 'logs')
|
|
425
406
|
'claims' = @('list', 'check', 'grant', 'revoke', 'roles', 'policies')
|
|
@@ -146,7 +146,7 @@ const setCommand = {
|
|
|
146
146
|
],
|
|
147
147
|
examples: [
|
|
148
148
|
{ command: 'monomind config set swarm.maxAgents 20', description: 'Set max agents' },
|
|
149
|
-
{ command: 'monomind config set -k memory.backend -v
|
|
149
|
+
{ command: 'monomind config set -k memory.backend -v lancedb', description: 'Set memory backend' }
|
|
150
150
|
],
|
|
151
151
|
action: async (ctx) => {
|
|
152
152
|
const key = (ctx.flags.key || ctx.args[0] || '').slice(0, 256);
|
|
@@ -1049,8 +1049,8 @@ export const statuslineCommand = {
|
|
|
1049
1049
|
}
|
|
1050
1050
|
catch { /* ignore */ }
|
|
1051
1051
|
}
|
|
1052
|
-
// Get
|
|
1053
|
-
const
|
|
1052
|
+
// Get memory backend stats
|
|
1053
|
+
const memoryStats = { vectorCount: 0, dbSizeKB: 0, hasHnsw: false };
|
|
1054
1054
|
// Check for direct database files first
|
|
1055
1055
|
const dbPaths = [
|
|
1056
1056
|
path.join(process.cwd(), '.swarm', 'memory.db'),
|
|
@@ -1058,30 +1058,30 @@ export const statuslineCommand = {
|
|
|
1058
1058
|
path.join(process.cwd(), '.claude', 'memory.db'),
|
|
1059
1059
|
path.join(process.cwd(), 'data', 'memory.db'),
|
|
1060
1060
|
path.join(process.cwd(), 'memory.db'),
|
|
1061
|
-
path.join(process.cwd(),
|
|
1062
|
-
path.join(process.cwd(),
|
|
1061
|
+
path.join(process.cwd(), ".swarm", "lancedb"),
|
|
1062
|
+
path.join(process.cwd(), ".monomind", "memory", "lancedb"),
|
|
1063
1063
|
];
|
|
1064
1064
|
for (const dbPath of dbPaths) {
|
|
1065
1065
|
if (fs.existsSync(dbPath)) {
|
|
1066
1066
|
try {
|
|
1067
1067
|
const stats = fs.statSync(dbPath);
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1068
|
+
memoryStats.dbSizeKB = Math.round(stats.size / 1024);
|
|
1069
|
+
memoryStats.vectorCount = Math.floor(memoryStats.dbSizeKB / 2);
|
|
1070
|
+
memoryStats.hasHnsw = memoryStats.vectorCount > 100;
|
|
1071
1071
|
break;
|
|
1072
1072
|
}
|
|
1073
1073
|
catch { /* ignore */ }
|
|
1074
1074
|
}
|
|
1075
1075
|
}
|
|
1076
|
-
// Check for
|
|
1077
|
-
if (
|
|
1078
|
-
const
|
|
1079
|
-
path.join(process.cwd(),
|
|
1080
|
-
path.join(process.cwd(),
|
|
1081
|
-
path.join(process.cwd(),
|
|
1082
|
-
path.join(process.cwd(),
|
|
1076
|
+
// Check for LanceDB directories if no direct db found
|
|
1077
|
+
if (memoryStats.vectorCount === 0) {
|
|
1078
|
+
const lancedbDirs = [
|
|
1079
|
+
path.join(process.cwd(), ".monomind", "lancedb"),
|
|
1080
|
+
path.join(process.cwd(), ".swarm", "lancedb"),
|
|
1081
|
+
path.join(process.cwd(), "data", "lancedb"),
|
|
1082
|
+
path.join(process.cwd(), ".swarm", "lancedb"),
|
|
1083
1083
|
];
|
|
1084
|
-
for (const dir of
|
|
1084
|
+
for (const dir of lancedbDirs) {
|
|
1085
1085
|
if (fs.existsSync(dir)) {
|
|
1086
1086
|
try {
|
|
1087
1087
|
const files = fs.readdirSync(dir);
|
|
@@ -1089,12 +1089,12 @@ export const statuslineCommand = {
|
|
|
1089
1089
|
if (f.endsWith('.db') || f.endsWith('.sqlite')) {
|
|
1090
1090
|
const filePath = path.join(dir, f);
|
|
1091
1091
|
const fileStat = fs.statSync(filePath);
|
|
1092
|
-
|
|
1092
|
+
memoryStats.dbSizeKB += Math.round(fileStat.size / 1024);
|
|
1093
1093
|
}
|
|
1094
1094
|
}
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
if (
|
|
1095
|
+
memoryStats.vectorCount = Math.floor(memoryStats.dbSizeKB / 2);
|
|
1096
|
+
memoryStats.hasHnsw = memoryStats.vectorCount > 100;
|
|
1097
|
+
if (memoryStats.vectorCount > 0)
|
|
1098
1098
|
break;
|
|
1099
1099
|
}
|
|
1100
1100
|
catch { /* ignore */ }
|
|
@@ -1109,14 +1109,14 @@ export const statuslineCommand = {
|
|
|
1109
1109
|
];
|
|
1110
1110
|
for (const hnswPath of hnswPaths) {
|
|
1111
1111
|
if (fs.existsSync(hnswPath)) {
|
|
1112
|
-
|
|
1112
|
+
memoryStats.hasHnsw = true;
|
|
1113
1113
|
try {
|
|
1114
1114
|
const hnswFiles = fs.readdirSync(hnswPath);
|
|
1115
1115
|
const indexFile = hnswFiles.find(f => f.endsWith('.index'));
|
|
1116
1116
|
if (indexFile) {
|
|
1117
1117
|
const indexStat = fs.statSync(path.join(hnswPath, indexFile));
|
|
1118
1118
|
const hnswVectors = Math.floor(indexStat.size / 512);
|
|
1119
|
-
|
|
1119
|
+
memoryStats.vectorCount = Math.max(memoryStats.vectorCount, hnswVectors);
|
|
1120
1120
|
}
|
|
1121
1121
|
}
|
|
1122
1122
|
catch { /* ignore */ }
|
|
@@ -1125,15 +1125,15 @@ export const statuslineCommand = {
|
|
|
1125
1125
|
}
|
|
1126
1126
|
// Check for vectors.json file
|
|
1127
1127
|
const vectorsPath = path.join(process.cwd(), '.monomind', 'vectors.json');
|
|
1128
|
-
if (fs.existsSync(vectorsPath) &&
|
|
1128
|
+
if (fs.existsSync(vectorsPath) && memoryStats.vectorCount === 0) {
|
|
1129
1129
|
try {
|
|
1130
1130
|
if (fs.statSync(vectorsPath).size <= 8_388_608) {
|
|
1131
1131
|
const data = JSON.parse(fs.readFileSync(vectorsPath, 'utf-8'));
|
|
1132
1132
|
if (Array.isArray(data)) {
|
|
1133
|
-
|
|
1133
|
+
memoryStats.vectorCount = data.length;
|
|
1134
1134
|
}
|
|
1135
1135
|
else if (data.vectors) {
|
|
1136
|
-
|
|
1136
|
+
memoryStats.vectorCount = Object.keys(data.vectors).length;
|
|
1137
1137
|
}
|
|
1138
1138
|
}
|
|
1139
1139
|
}
|
|
@@ -1169,8 +1169,8 @@ export const statuslineCommand = {
|
|
|
1169
1169
|
const domainsColor = progress.domainsCompleted >= 3 ? c.brightGreen : progress.domainsCompleted > 0 ? c.yellow : c.red;
|
|
1170
1170
|
// Dynamic perf indicator based on patterns/HNSW
|
|
1171
1171
|
let perfIndicator = `${c.dim}⚡ HNSW: idle${c.reset}`;
|
|
1172
|
-
if (
|
|
1173
|
-
perfIndicator = `${c.brightGreen}⚡ HNSW ${
|
|
1172
|
+
if (memoryStats.hasHnsw && memoryStats.vectorCount > 0) {
|
|
1173
|
+
perfIndicator = `${c.brightGreen}⚡ HNSW ${memoryStats.vectorCount.toLocaleString()} vec${c.reset}`;
|
|
1174
1174
|
}
|
|
1175
1175
|
else if (progress.patternsLearned > 0) {
|
|
1176
1176
|
const patternsK = progress.patternsLearned >= 1000 ? `${(progress.patternsLearned / 1000).toFixed(1)}k` : String(progress.patternsLearned);
|
|
@@ -1195,13 +1195,13 @@ export const statuslineCommand = {
|
|
|
1195
1195
|
`${c.cyan}ADRs${c.reset} ${c.dim}●0/0${c.reset} ${c.dim}│${c.reset} ` +
|
|
1196
1196
|
`${c.cyan}DDD${c.reset} ${dddColor}●${String(progress.dddProgress).padStart(3)}%${c.reset} ${c.dim}│${c.reset} ` +
|
|
1197
1197
|
`${c.cyan}Security${c.reset} ${securityColor}●${security.status}${c.reset}`;
|
|
1198
|
-
const vectorColor =
|
|
1198
|
+
const vectorColor = memoryStats.vectorCount > 0 ? c.brightGreen : c.dim;
|
|
1199
1199
|
const testColor = testStats.testFiles > 0 ? c.brightGreen : c.dim;
|
|
1200
1200
|
const mcpColor = mcpStats.enabled > 0 ? c.brightGreen : c.dim;
|
|
1201
|
-
const sizeDisplay =
|
|
1202
|
-
const hnswIndicator =
|
|
1203
|
-
const line4 = `${c.brightCyan}📊
|
|
1204
|
-
`${c.cyan}Vectors${c.reset} ${vectorColor}●${
|
|
1201
|
+
const sizeDisplay = memoryStats.dbSizeKB >= 1024 ? `${(memoryStats.dbSizeKB / 1024).toFixed(1)}MB` : `${memoryStats.dbSizeKB}KB`;
|
|
1202
|
+
const hnswIndicator = memoryStats.hasHnsw ? `${c.brightGreen}⚡${c.reset}` : '';
|
|
1203
|
+
const line4 = `${c.brightCyan}📊 LanceDB${c.reset} ` +
|
|
1204
|
+
`${c.cyan}Vectors${c.reset} ${vectorColor}●${memoryStats.vectorCount}${hnswIndicator}${c.reset} ${c.dim}│${c.reset} ` +
|
|
1205
1205
|
`${c.cyan}Size${c.reset} ${c.brightWhite}${sizeDisplay}${c.reset} ${c.dim}│${c.reset} ` +
|
|
1206
1206
|
`${c.cyan}Tests${c.reset} ${testColor}●${testStats.testFiles}${c.reset} ${c.dim}(${testStats.testCases} cases)${c.reset} ${c.dim}│${c.reset} ` +
|
|
1207
1207
|
`${c.cyan}MCP${c.reset} ${mcpColor}●${mcpStats.enabled}/${mcpStats.total}${c.reset}`;
|
|
@@ -623,7 +623,7 @@ export const transferFromProjectCommand = {
|
|
|
623
623
|
// Parent transfer command combining all transfer methods
|
|
624
624
|
export const transferCommand = {
|
|
625
625
|
name: 'transfer',
|
|
626
|
-
description: 'Transfer patterns
|
|
626
|
+
description: 'Transfer patterns via IPFS-based decentralized registry',
|
|
627
627
|
subcommands: [storeCommand, transferFromProjectCommand],
|
|
628
628
|
examples: [
|
|
629
629
|
{ command: 'monomind hooks transfer store list', description: 'List patterns from registry' },
|
|
@@ -498,7 +498,7 @@ export const hooksCommand = {
|
|
|
498
498
|
output.printList([
|
|
499
499
|
'🧠 Trajectory + outcome logging',
|
|
500
500
|
'🎯 Keyword routing + route-outcome measurement',
|
|
501
|
-
'🔍
|
|
501
|
+
'🔍 LanceDB integration (ANN vector search)',
|
|
502
502
|
'🎯 32.3% token reduction',
|
|
503
503
|
'👥 Agent Teams integration (auto task assignment)'
|
|
504
504
|
]);
|
|
@@ -43,7 +43,6 @@ export declare function getNeuralCommand(): Promise<Command | undefined>;
|
|
|
43
43
|
export declare function getSecurityCommand(): Promise<Command | undefined>;
|
|
44
44
|
export declare function getPerformanceCommand(): Promise<Command | undefined>;
|
|
45
45
|
export declare function getProvidersCommand(): Promise<Command | undefined>;
|
|
46
|
-
export declare function getPluginsCommand(): Promise<Command | undefined>;
|
|
47
46
|
export declare function getDeploymentCommand(): Promise<Command | undefined>;
|
|
48
47
|
export declare function getClaimsCommand(): Promise<Command | undefined>;
|
|
49
48
|
export declare function getCompletionsCommand(): Promise<Command | undefined>;
|
|
@@ -36,7 +36,6 @@ const commandLoaders = {
|
|
|
36
36
|
security: () => import('./security.js'),
|
|
37
37
|
performance: () => import('./performance.js'),
|
|
38
38
|
providers: () => import('./providers.js'),
|
|
39
|
-
plugins: () => import('./plugins.js'),
|
|
40
39
|
deployment: () => import('./deployment.js'),
|
|
41
40
|
claims: () => import('./claims.js'),
|
|
42
41
|
// P0 Commands
|
|
@@ -133,7 +132,6 @@ import { analyzeCommand } from './analyze.js';
|
|
|
133
132
|
import { routeCommand } from './route.js';
|
|
134
133
|
import { progressCommand } from './progress.js';
|
|
135
134
|
import { providersCommand } from './providers.js';
|
|
136
|
-
import { pluginsCommand } from './plugins.js';
|
|
137
135
|
import { deploymentCommand } from './deployment.js';
|
|
138
136
|
import { claimsCommand } from './claims.js';
|
|
139
137
|
import { issuesCommand } from './issues.js';
|
|
@@ -217,7 +215,6 @@ export async function getNeuralCommand() { return loadCommand('neural'); }
|
|
|
217
215
|
export async function getSecurityCommand() { return loadCommand('security'); }
|
|
218
216
|
export async function getPerformanceCommand() { return loadCommand('performance'); }
|
|
219
217
|
export async function getProvidersCommand() { return loadCommand('providers'); }
|
|
220
|
-
export async function getPluginsCommand() { return loadCommand('plugins'); }
|
|
221
218
|
export async function getDeploymentCommand() { return loadCommand('deployment'); }
|
|
222
219
|
export async function getClaimsCommand() { return loadCommand('claims'); }
|
|
223
220
|
export async function getCompletionsCommand() { return loadCommand('completions'); }
|
|
@@ -304,7 +301,6 @@ export const commandsByCategory = {
|
|
|
304
301
|
],
|
|
305
302
|
management: [
|
|
306
303
|
providersCommand,
|
|
307
|
-
pluginsCommand,
|
|
308
304
|
deploymentCommand,
|
|
309
305
|
claimsCommand,
|
|
310
306
|
issuesCommand,
|
|
@@ -346,12 +346,12 @@ const wizardCommand = {
|
|
|
346
346
|
message: 'Select skill sets:',
|
|
347
347
|
options: [
|
|
348
348
|
{ value: 'core', label: 'Core', hint: 'Swarm, memory, SPARC skills', selected: true },
|
|
349
|
-
{ value: '
|
|
349
|
+
{ value: 'memory', label: 'Memory (LanceDB)', hint: 'Vector database skills', selected: true },
|
|
350
350
|
{ value: 'github', label: 'GitHub', hint: 'GitHub integration skills', selected: true },
|
|
351
351
|
],
|
|
352
352
|
});
|
|
353
353
|
options.skills.core = skillSets.includes('core');
|
|
354
|
-
options.skills.
|
|
354
|
+
options.skills.memory = skillSets.includes('memory');
|
|
355
355
|
options.skills.github = skillSets.includes('github');
|
|
356
356
|
}
|
|
357
357
|
// Hooks selection
|
|
@@ -401,15 +401,15 @@ const wizardCommand = {
|
|
|
401
401
|
const memoryBackend = await select({
|
|
402
402
|
message: 'Select memory backend:',
|
|
403
403
|
options: [
|
|
404
|
-
{ value: 'hybrid', label: 'Hybrid', hint: 'SQLite +
|
|
405
|
-
{ value: '
|
|
404
|
+
{ value: 'hybrid', label: 'Hybrid', hint: 'SQLite + LanceDB (recommended)' },
|
|
405
|
+
{ value: 'lancedb', label: 'LanceDB', hint: '150x faster vector search' },
|
|
406
406
|
{ value: 'sqlite', label: 'SQLite', hint: 'Standard SQL storage' },
|
|
407
407
|
{ value: 'memory', label: 'In-Memory', hint: 'Fast but non-persistent' },
|
|
408
408
|
],
|
|
409
409
|
});
|
|
410
410
|
options.runtime.memoryBackend = memoryBackend;
|
|
411
411
|
// HNSW indexing
|
|
412
|
-
if (memoryBackend === '
|
|
412
|
+
if (memoryBackend === 'lancedb' || memoryBackend === 'hybrid') {
|
|
413
413
|
const enableHNSW = await confirm({
|
|
414
414
|
message: 'Enable HNSW indexing for faster vector search?',
|
|
415
415
|
default: true,
|
|
@@ -423,7 +423,7 @@ const wizardCommand = {
|
|
|
423
423
|
});
|
|
424
424
|
options.runtime.enableNeural = enableNeural;
|
|
425
425
|
// ADR-049: Self-Learning Memory capabilities
|
|
426
|
-
if (memoryBackend === '
|
|
426
|
+
if (memoryBackend === 'lancedb' || memoryBackend === 'hybrid') {
|
|
427
427
|
const enableSelfLearning = await confirm({
|
|
428
428
|
message: 'Enable self-learning memory? (LearningBridge + Knowledge Graph + Agent Scopes)',
|
|
429
429
|
default: true,
|
|
@@ -582,7 +582,7 @@ const skillsCommand = {
|
|
|
582
582
|
options: [
|
|
583
583
|
{ name: 'all', description: 'Install all skills', type: 'boolean', default: false },
|
|
584
584
|
{ name: 'core', description: 'Install core skills', type: 'boolean', default: true },
|
|
585
|
-
{ name: '
|
|
585
|
+
{ name: 'memory', description: 'Install memory skills', type: 'boolean', default: false },
|
|
586
586
|
{ name: 'github', description: 'Install GitHub skills', type: 'boolean', default: false },
|
|
587
587
|
],
|
|
588
588
|
action: async (ctx) => {
|
|
@@ -605,7 +605,7 @@ const skillsCommand = {
|
|
|
605
605
|
skills: {
|
|
606
606
|
all: ctx.flags.all,
|
|
607
607
|
core: ctx.flags.core,
|
|
608
|
-
|
|
608
|
+
memory: ctx.flags.memory,
|
|
609
609
|
github: ctx.flags.github,
|
|
610
610
|
browser: false,
|
|
611
611
|
advanced: false,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CLI Memory Command
|
|
3
|
-
* Memory operations for
|
|
3
|
+
* Memory operations for LanceDB integration
|
|
4
4
|
*/
|
|
5
5
|
import { output } from '../output.js';
|
|
6
6
|
import { select, confirm, input } from '../prompt.js';
|
|
@@ -8,9 +8,9 @@ import { callMCPTool, MCPClientError } from '../mcp-client.js';
|
|
|
8
8
|
import { configManager } from '../services/config-file-manager.js';
|
|
9
9
|
// Memory backends
|
|
10
10
|
const BACKENDS = [
|
|
11
|
-
{ value: '
|
|
11
|
+
{ value: 'lancedb', label: 'LanceDB', hint: 'Vector database with ANN indexing' },
|
|
12
12
|
{ value: 'sqlite', label: 'SQLite', hint: 'Lightweight local storage' },
|
|
13
|
-
{ value: 'hybrid', label: 'Hybrid', hint: 'SQLite +
|
|
13
|
+
{ value: 'hybrid', label: 'Hybrid', hint: 'SQLite + LanceDB (recommended)' },
|
|
14
14
|
{ value: 'memory', label: 'In-Memory', hint: 'Fast but non-persistent' }
|
|
15
15
|
];
|
|
16
16
|
// Store command
|
|
@@ -447,29 +447,29 @@ function formatRelativeTime(isoDate) {
|
|
|
447
447
|
// Edit command
|
|
448
448
|
const editCommand = {
|
|
449
449
|
name: 'edit',
|
|
450
|
-
description: 'Edit a memory entry (
|
|
450
|
+
description: 'Edit a memory entry (LanceDB, Memory Palace, or knowledge chunk)',
|
|
451
451
|
options: [
|
|
452
|
-
{ name: 'key', short: 'k', description: 'Storage key
|
|
453
|
-
{ name: 'namespace', short: 'n', description: 'Memory namespace
|
|
452
|
+
{ name: 'key', short: 'k', description: 'Storage key', type: 'string' },
|
|
453
|
+
{ name: 'namespace', short: 'n', description: 'Memory namespace', type: 'string', default: 'default' },
|
|
454
454
|
{ name: 'value', description: 'New value/content', type: 'string' },
|
|
455
|
-
{ name: 'source', short: 's', description: 'Source to edit:
|
|
455
|
+
{ name: 'source', short: 's', description: 'Source to edit: lancedb, palace, knowledge', type: 'string', default: 'lancedb', choices: ['lancedb', 'palace', 'knowledge'] },
|
|
456
456
|
{ name: 'id', description: 'Entry ID (palace/knowledge)', type: 'string' }
|
|
457
457
|
],
|
|
458
458
|
examples: [
|
|
459
|
-
{ command: 'monomind memory edit -k "pattern/auth" --value "updated content"', description: 'Edit
|
|
459
|
+
{ command: 'monomind memory edit -k "pattern/auth" --value "updated content"', description: 'Edit LanceDB entry' },
|
|
460
460
|
{ command: 'monomind memory edit --source palace --id "abc123" --value "new content"', description: 'Edit Memory Palace drawer' },
|
|
461
461
|
{ command: 'monomind memory edit --source knowledge --id "chunk-42" --value "updated"', description: 'Edit knowledge chunk' }
|
|
462
462
|
],
|
|
463
463
|
action: async (ctx) => {
|
|
464
|
-
const source = ctx.flags.source || '
|
|
464
|
+
const source = ctx.flags.source || 'lancedb';
|
|
465
465
|
let value = ctx.flags.value || ctx.args[0];
|
|
466
466
|
const fs = await import('fs');
|
|
467
467
|
const path = await import('path');
|
|
468
|
-
if (source === '
|
|
468
|
+
if (source === 'lancedb') {
|
|
469
469
|
const key = ctx.flags.key;
|
|
470
470
|
const namespace = ctx.flags.namespace || 'default';
|
|
471
471
|
if (!key) {
|
|
472
|
-
output.printError('Key is required for
|
|
472
|
+
output.printError('Key is required for lancedb edit. Use --key or -k');
|
|
473
473
|
return { success: false, exitCode: 1 };
|
|
474
474
|
}
|
|
475
475
|
if (!value && ctx.interactive) {
|
|
@@ -666,28 +666,28 @@ const templatesCommand = {
|
|
|
666
666
|
const deleteCommand = {
|
|
667
667
|
name: 'delete',
|
|
668
668
|
aliases: ['rm'],
|
|
669
|
-
description: 'Delete a memory entry (
|
|
669
|
+
description: 'Delete a memory entry (LanceDB, Memory Palace, or knowledge chunk)',
|
|
670
670
|
options: [
|
|
671
671
|
{
|
|
672
672
|
name: 'key',
|
|
673
673
|
short: 'k',
|
|
674
|
-
description: 'Storage key
|
|
674
|
+
description: 'Storage key',
|
|
675
675
|
type: 'string'
|
|
676
676
|
},
|
|
677
677
|
{
|
|
678
678
|
name: 'namespace',
|
|
679
679
|
short: 'n',
|
|
680
|
-
description: 'Memory namespace
|
|
680
|
+
description: 'Memory namespace',
|
|
681
681
|
type: 'string',
|
|
682
682
|
default: 'default'
|
|
683
683
|
},
|
|
684
684
|
{
|
|
685
685
|
name: 'source',
|
|
686
686
|
short: 's',
|
|
687
|
-
description: 'Source to delete from:
|
|
687
|
+
description: 'Source to delete from: lancedb, palace, knowledge',
|
|
688
688
|
type: 'string',
|
|
689
|
-
default: '
|
|
690
|
-
choices: ['
|
|
689
|
+
default: 'lancedb',
|
|
690
|
+
choices: ['lancedb', 'palace', 'knowledge']
|
|
691
691
|
},
|
|
692
692
|
{
|
|
693
693
|
name: 'id',
|
|
@@ -703,15 +703,15 @@ const deleteCommand = {
|
|
|
703
703
|
}
|
|
704
704
|
],
|
|
705
705
|
examples: [
|
|
706
|
-
{ command: 'monomind memory delete -k "mykey"', description: 'Delete
|
|
706
|
+
{ command: 'monomind memory delete -k "mykey"', description: 'Delete memory entry' },
|
|
707
707
|
{ command: 'monomind memory delete -k "lesson" -n "lessons"', description: 'Delete from specific namespace' },
|
|
708
708
|
{ command: 'monomind memory delete --source palace --id "abc123"', description: 'Delete Memory Palace drawer' },
|
|
709
709
|
{ command: 'monomind memory delete --source knowledge --id "chunk-42" -f', description: 'Delete knowledge chunk (no confirm)' }
|
|
710
710
|
],
|
|
711
711
|
action: async (ctx) => {
|
|
712
|
-
const source = ctx.flags.source || '
|
|
712
|
+
const source = ctx.flags.source || 'lancedb';
|
|
713
713
|
const force = ctx.flags.force;
|
|
714
|
-
if (source === '
|
|
714
|
+
if (source === 'lancedb') {
|
|
715
715
|
const key = ctx.flags.key || ctx.args[0];
|
|
716
716
|
const namespace = ctx.flags.namespace || 'default';
|
|
717
717
|
if (!key) {
|
|
@@ -1342,7 +1342,7 @@ const initMemoryCommand = {
|
|
|
1342
1342
|
{
|
|
1343
1343
|
name: 'backend',
|
|
1344
1344
|
short: 'b',
|
|
1345
|
-
description: 'Backend type: hybrid (default), sqlite, or
|
|
1345
|
+
description: 'Backend type: hybrid (default), sqlite, or lancedb',
|
|
1346
1346
|
type: 'string',
|
|
1347
1347
|
default: 'hybrid'
|
|
1348
1348
|
},
|
|
@@ -1380,7 +1380,7 @@ const initMemoryCommand = {
|
|
|
1380
1380
|
],
|
|
1381
1381
|
examples: [
|
|
1382
1382
|
{ command: 'monomind memory init', description: 'Initialize hybrid backend with all features' },
|
|
1383
|
-
{ command: 'monomind memory init -b
|
|
1383
|
+
{ command: 'monomind memory init -b lancedb', description: 'Initialize LanceDB backend' },
|
|
1384
1384
|
{ command: 'monomind memory init -p ./data/memory.db --force', description: 'Reinitialize at custom path' },
|
|
1385
1385
|
{ command: 'monomind memory init --verbose --verify', description: 'Initialize with full verification' }
|
|
1386
1386
|
],
|
|
@@ -1447,7 +1447,7 @@ const initMemoryCommand = {
|
|
|
1447
1447
|
const { activated, failed, initTimeMs } = result.controllers;
|
|
1448
1448
|
if (activated.length > 0 || failed.length > 0) {
|
|
1449
1449
|
const controllerLines = [
|
|
1450
|
-
output.bold('
|
|
1450
|
+
output.bold('Memory Controllers:'),
|
|
1451
1451
|
` Activated: ${activated.length} Failed: ${failed.length} Init: ${Math.round(initTimeMs)}ms`,
|
|
1452
1452
|
];
|
|
1453
1453
|
if (verbose && activated.length > 0) {
|
|
@@ -1586,11 +1586,11 @@ export const memoryCommand = {
|
|
|
1586
1586
|
output.printList([
|
|
1587
1587
|
`${output.highlight('init')} - Initialize memory database (sql.js)`,
|
|
1588
1588
|
`${output.highlight('store')} - Store data in memory`,
|
|
1589
|
-
`${output.highlight('edit')} - Edit an entry (
|
|
1589
|
+
`${output.highlight('edit')} - Edit an entry (LanceDB, palace, knowledge)`,
|
|
1590
1590
|
`${output.highlight('retrieve')} - Retrieve data from memory`,
|
|
1591
1591
|
`${output.highlight('search')} - Semantic/vector search`,
|
|
1592
1592
|
`${output.highlight('list')} - List memory entries`,
|
|
1593
|
-
`${output.highlight('delete')} - Delete an entry (
|
|
1593
|
+
`${output.highlight('delete')} - Delete an entry (LanceDB, palace, knowledge)`,
|
|
1594
1594
|
`${output.highlight('templates')} - Show best-practice entry templates`,
|
|
1595
1595
|
`${output.highlight('stats')} - Show statistics`,
|
|
1596
1596
|
`${output.highlight('configure')} - Configure backend`,
|