@hiveforge/hivemind-mcp 3.4.0 → 3.5.0
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/README.md +89 -309
- package/dist/cli/fix/fixer.js +1 -1
- package/dist/cli/fix/fixer.js.map +1 -1
- package/dist/cli/fix/writer.d.ts.map +1 -1
- package/dist/cli/fix/writer.js +75 -3
- package/dist/cli/fix/writer.js.map +1 -1
- package/dist/cli/init/output.d.ts.map +1 -1
- package/dist/cli/init/output.js +6 -5
- package/dist/cli/init/output.js.map +1 -1
- package/dist/cli/validate/formatter.d.ts.map +1 -1
- package/dist/cli/validate/formatter.js +16 -0
- package/dist/cli/validate/formatter.js.map +1 -1
- package/dist/cli/validate/types.d.ts +3 -0
- package/dist/cli/validate/types.d.ts.map +1 -1
- package/dist/cli/validate/validator.d.ts.map +1 -1
- package/dist/cli/validate/validator.js +32 -1
- package/dist/cli/validate/validator.js.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/graph/database.d.ts +152 -0
- package/dist/graph/database.d.ts.map +1 -1
- package/dist/graph/database.js +418 -30
- package/dist/graph/database.js.map +1 -1
- package/dist/mcp/graph-tools.d.ts +78 -0
- package/dist/mcp/graph-tools.d.ts.map +1 -0
- package/dist/mcp/graph-tools.js +284 -0
- package/dist/mcp/graph-tools.js.map +1 -0
- package/dist/mcp/timeline-tools.d.ts +116 -0
- package/dist/mcp/timeline-tools.d.ts.map +1 -0
- package/dist/mcp/timeline-tools.js +317 -0
- package/dist/mcp/timeline-tools.js.map +1 -0
- package/dist/search/engine.d.ts +186 -0
- package/dist/search/engine.d.ts.map +1 -1
- package/dist/search/engine.js +263 -0
- package/dist/search/engine.js.map +1 -1
- package/dist/server.d.ts +52 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +472 -0
- package/dist/server.js.map +1 -1
- package/dist/templates/builtin/worldbuilding.d.ts.map +1 -1
- package/dist/templates/builtin/worldbuilding.js +401 -1
- package/dist/templates/builtin/worldbuilding.js.map +1 -1
- package/dist/templates/community/dnd-35e.d.ts +18 -0
- package/dist/templates/community/dnd-35e.d.ts.map +1 -0
- package/dist/templates/community/dnd-35e.js +859 -0
- package/dist/templates/community/dnd-35e.js.map +1 -0
- package/dist/templates/community/dnd-5e.d.ts +16 -0
- package/dist/templates/community/dnd-5e.d.ts.map +1 -0
- package/dist/templates/community/dnd-5e.js +509 -0
- package/dist/templates/community/dnd-5e.js.map +1 -0
- package/dist/templates/community/index.d.ts +9 -0
- package/dist/templates/community/index.d.ts.map +1 -1
- package/dist/templates/community/index.js +16 -0
- package/dist/templates/community/index.js.map +1 -1
- package/dist/templates/community/pathfinder-2e.d.ts +16 -0
- package/dist/templates/community/pathfinder-2e.d.ts.map +1 -0
- package/dist/templates/community/pathfinder-2e.js +711 -0
- package/dist/templates/community/pathfinder-2e.js.map +1 -0
- package/dist/templates/community/ttrpg-base.d.ts +17 -0
- package/dist/templates/community/ttrpg-base.d.ts.map +1 -0
- package/dist/templates/community/ttrpg-base.js +889 -0
- package/dist/templates/community/ttrpg-base.js.map +1 -0
- package/dist/templates/loader.d.ts +2 -0
- package/dist/templates/loader.d.ts.map +1 -1
- package/dist/templates/loader.js +45 -1
- package/dist/templates/loader.js.map +1 -1
- package/dist/templates/registry.d.ts +49 -2
- package/dist/templates/registry.d.ts.map +1 -1
- package/dist/templates/registry.js +276 -6
- package/dist/templates/registry.js.map +1 -1
- package/dist/templates/types.d.ts +28 -1
- package/dist/templates/types.d.ts.map +1 -1
- package/dist/templates/validator.d.ts +80 -1
- package/dist/templates/validator.d.ts.map +1 -1
- package/dist/templates/validator.js +22 -5
- package/dist/templates/validator.js.map +1 -1
- package/dist/types/index.d.ts +18 -18
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,359 +1,139 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="gh-social-preview.png" alt="Hivemind" width="100%"/>
|
|
2
|
+
<img src="gh-social-preview.png" alt="Hivemind for Obsidian" width="100%"/>
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
# Hivemind
|
|
5
|
+
# Hivemind for Obsidian
|
|
6
6
|
|
|
7
|
-
[](https://www.npmjs.com/package/@hiveforge/hivemind-mcp)
|
|
8
|
-
[](https://github.com/hiveforge-sh/hivemind/actions/workflows/test.yml)
|
|
9
|
-
[](https://github.com/hiveforge-sh/hivemind/actions/workflows/release.yml)
|
|
10
|
-
[](https://codecov.io/gh/hiveforge-sh/hivemind)
|
|
11
7
|
[](https://opensource.org/licenses/MIT)
|
|
12
|
-
[](https://github.com/hiveforge-sh/hivemind/issues)
|
|
13
|
-
[](https://github.com/hiveforge-sh/hivemind/stargazers)
|
|
14
8
|
|
|
15
|
-
|
|
9
|
+
**Your canon is the source of truth. AI stays inside the lines.**
|
|
16
10
|
|
|
17
|
-
|
|
11
|
+
## Why Hivemind?
|
|
18
12
|
|
|
19
|
-
|
|
13
|
+
When building fictional worlds — whether you're writing a novel, designing a game, or running an RPG campaign — AI tools can be powerful collaborators. But they hallucinate. Ask your AI assistant about a character you created last week, and it might invent details that contradict your established canon.
|
|
20
14
|
|
|
21
|
-
Hivemind
|
|
15
|
+
Hivemind solves this by giving AI tools structured access to your Obsidian vault. Think of it as an **AI Firewall**: your worldbuilding notes become a truth anchor that keeps AI grounded in facts you control. Ask about a character, and the AI reads your actual notes — not a hallucinated version. Query a timeline, and it references your established events — not invented dates.
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
- **
|
|
25
|
-
- **
|
|
26
|
-
- **
|
|
27
|
-
- **UX Research** — Interviews, Insights, Hypotheses, Personas *(community)*
|
|
17
|
+
Beyond AI integration, Hivemind provides powerful visualization tools:
|
|
18
|
+
- **Timeline View** — See your story's events laid out chronologically
|
|
19
|
+
- **Graph View** — Explore relationships between characters, locations, factions, and more
|
|
20
|
+
- **Canon Workflow** — Track which content is approved, in review, or still draft
|
|
28
21
|
|
|
29
|
-
|
|
22
|
+
Hivemind is built for worldbuilders, but the same principles apply to research vaults, people management, software architecture — anywhere you need AI to respect your established knowledge.
|
|
30
23
|
|
|
31
24
|
## Features
|
|
32
25
|
|
|
33
|
-
- **
|
|
34
|
-
- **
|
|
35
|
-
- **
|
|
36
|
-
- **
|
|
37
|
-
- **
|
|
38
|
-
- **
|
|
39
|
-
- **
|
|
40
|
-
- **High Performance**: <300ms query latency, supports 1000+ note vaults
|
|
26
|
+
- **Timeline View** — Visualize events chronologically with filtering and search
|
|
27
|
+
- **Graph View** — Explore entity relationships with interactive visualization
|
|
28
|
+
- **AI Integration** — MCP-compatible server for Claude, GitHub Copilot, and other AI tools
|
|
29
|
+
- **Pluggable Templates** — Built-in templates for worldbuilding, research, people management, and more
|
|
30
|
+
- **Canon Workflow** — Draft → Pending → Canon approval system with consistency validation
|
|
31
|
+
- **Obsidian Native** — Works with standard markdown, YAML frontmatter, and wikilinks
|
|
32
|
+
- **Local-First** — Your data stays on your machine
|
|
41
33
|
|
|
42
|
-
###
|
|
34
|
+
### Built-in Templates
|
|
43
35
|
|
|
44
|
-
|
|
36
|
+
| Template | Use Case | Entity Types |
|
|
37
|
+
|----------|----------|--------------|
|
|
38
|
+
| **Worldbuilding** | Fiction writers, game designers, RPG creators | Characters, Locations, Events, Factions, Lore, Assets |
|
|
39
|
+
| **Research** | Academics, knowledge workers | Papers, Citations, Concepts, Notes |
|
|
40
|
+
| **People Management** | Managers, team leads | People, Goals, Teams, 1:1 Meetings |
|
|
41
|
+
| **Software Architecture** | Engineers, architects | Systems, Components, ADRs, Constraints |
|
|
45
42
|
|
|
46
|
-
|
|
47
|
-
|--------|----------------------|
|
|
48
|
-
| **Worldbuilding** | Approved lore, character facts, timeline events |
|
|
49
|
-
| **Architecture** | Accepted ADRs, design decisions, constraints |
|
|
50
|
-
| **Brand** | Voice guidelines, approved messaging, visual identity |
|
|
51
|
-
| **Security** | Approved policies, access controls, compliance rules |
|
|
52
|
-
| **People Management** | Finalized goals, approved team structures |
|
|
43
|
+
Define your own custom entity types via config — no code required. See [CONTRIBUTING_TEMPLATES.md](CONTRIBUTING_TEMPLATES.md) for details.
|
|
53
44
|
|
|
54
|
-
|
|
45
|
+
## Installation
|
|
55
46
|
|
|
56
|
-
|
|
47
|
+
### Obsidian Plugin (Recommended)
|
|
57
48
|
|
|
58
|
-
|
|
49
|
+
1. Open Obsidian Settings
|
|
50
|
+
2. Go to Community plugins → Browse
|
|
51
|
+
3. Search for "Hivemind"
|
|
52
|
+
4. Click Install, then Enable
|
|
59
53
|
|
|
60
|
-
|
|
61
|
-
# Install globally
|
|
62
|
-
npm install -g @hiveforge/hivemind-mcp
|
|
54
|
+
### Manual Installation
|
|
63
55
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
56
|
+
1. Download the latest release from [GitHub Releases](https://github.com/hiveforge-sh/hivemind/releases)
|
|
57
|
+
2. Extract to your vault's `.obsidian/plugins/hivemind` directory
|
|
58
|
+
3. Reload Obsidian and enable the plugin in Settings
|
|
67
59
|
|
|
68
|
-
###
|
|
60
|
+
### AI Integration (Optional)
|
|
69
61
|
|
|
70
|
-
|
|
71
|
-
# Interactive setup - creates config.json
|
|
72
|
-
npx @hiveforge/hivemind-mcp init
|
|
62
|
+
Want AI tools to query your vault? Set up the MCP server:
|
|
73
63
|
|
|
74
|
-
|
|
75
|
-
npx @hiveforge/hivemind-mcp validate
|
|
64
|
+
**[MCP Setup Guide →](docs/MCP_SETUP_GUIDE.md)**
|
|
76
65
|
|
|
77
|
-
|
|
78
|
-
|
|
66
|
+
The guide covers:
|
|
67
|
+
- Claude Desktop configuration (Windows, macOS, Linux)
|
|
68
|
+
- GitHub Copilot configuration
|
|
69
|
+
- Template selection
|
|
70
|
+
- Troubleshooting
|
|
79
71
|
|
|
80
|
-
|
|
81
|
-
npx @hiveforge/hivemind-mcp --vault /path/to/vault
|
|
82
|
-
npx @hiveforge/hivemind-mcp --vault . # Use current directory
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### Configuration for MCP Clients
|
|
86
|
-
|
|
87
|
-
**Claude Desktop** (`%APPDATA%\Claude\claude_desktop_config.json`):
|
|
88
|
-
```json
|
|
89
|
-
{
|
|
90
|
-
"mcpServers": {
|
|
91
|
-
"hivemind": {
|
|
92
|
-
"command": "npx",
|
|
93
|
-
"args": ["-y", "@hiveforge/hivemind-mcp", "start"]
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
**Claude Desktop with vault override**:
|
|
100
|
-
```json
|
|
101
|
-
{
|
|
102
|
-
"mcpServers": {
|
|
103
|
-
"hivemind": {
|
|
104
|
-
"command": "npx",
|
|
105
|
-
"args": ["-y", "@hiveforge/hivemind-mcp", "--vault", "C:\\Path\\To\\Your\\Vault"]
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
**GitHub Copilot** (`~/.copilot/mcp-config.json`):
|
|
112
|
-
```json
|
|
113
|
-
{
|
|
114
|
-
"mcpServers": {
|
|
115
|
-
"hivemind": {
|
|
116
|
-
"type": "local",
|
|
117
|
-
"command": "npx",
|
|
118
|
-
"args": ["-y", "@hiveforge/hivemind-mcp", "start"],
|
|
119
|
-
"tools": ["*"]
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Manual Configuration
|
|
126
|
-
|
|
127
|
-
If you prefer to configure manually, create a `config.json`:
|
|
128
|
-
|
|
129
|
-
```json
|
|
130
|
-
{
|
|
131
|
-
"vault": {
|
|
132
|
-
"path": "/path/to/your/obsidian/vault",
|
|
133
|
-
"watchForChanges": true,
|
|
134
|
-
"debounceMs": 100
|
|
135
|
-
},
|
|
136
|
-
"server": {
|
|
137
|
-
"transport": "stdio"
|
|
138
|
-
},
|
|
139
|
-
"template": {
|
|
140
|
-
"activeTemplate": "worldbuilding"
|
|
141
|
-
},
|
|
142
|
-
"indexing": {
|
|
143
|
-
"strategy": "incremental",
|
|
144
|
-
"batchSize": 100,
|
|
145
|
-
"enableVectorSearch": false,
|
|
146
|
-
"enableFullTextSearch": true
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### Choosing a Template
|
|
72
|
+
## Quick Start
|
|
152
73
|
|
|
153
|
-
|
|
74
|
+
1. **Choose a template** — Open Hivemind settings in Obsidian and select a template (worldbuilding, research, etc.)
|
|
154
75
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
### Custom Templates
|
|
164
|
-
|
|
165
|
-
Define custom entity types directly in your `config.json`:
|
|
166
|
-
|
|
167
|
-
```json
|
|
168
|
-
{
|
|
169
|
-
"template": {
|
|
170
|
-
"activeTemplate": "my-template",
|
|
171
|
-
"templates": [{
|
|
172
|
-
"id": "my-template",
|
|
173
|
-
"name": "My Custom Template",
|
|
174
|
-
"version": "1.0.0",
|
|
175
|
-
"entityTypes": [{
|
|
176
|
-
"name": "project",
|
|
177
|
-
"displayName": "Project",
|
|
178
|
-
"pluralName": "Projects",
|
|
179
|
-
"fields": [
|
|
180
|
-
{ "name": "title", "type": "string", "required": true },
|
|
181
|
-
{ "name": "deadline", "type": "date" },
|
|
182
|
-
{ "name": "priority", "type": "enum", "enumValues": ["low", "medium", "high"] }
|
|
183
|
-
]
|
|
184
|
-
}],
|
|
185
|
-
"relationshipTypes": [{
|
|
186
|
-
"id": "depends_on",
|
|
187
|
-
"displayName": "Depends On",
|
|
188
|
-
"sourceTypes": ["project"],
|
|
189
|
-
"targetTypes": ["project"],
|
|
190
|
-
"bidirectional": true,
|
|
191
|
-
"reverseId": "blocks"
|
|
192
|
-
}]
|
|
193
|
-
}]
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
```
|
|
76
|
+
2. **Create entities** — Use Obsidian's note creation as usual. Add YAML frontmatter to define entity types:
|
|
77
|
+
```yaml
|
|
78
|
+
---
|
|
79
|
+
entity_type: character
|
|
80
|
+
canon_status: draft
|
|
81
|
+
---
|
|
82
|
+
```
|
|
197
83
|
|
|
198
|
-
|
|
84
|
+
3. **Visualize** — Open the Timeline view or Graph view from the ribbon icons
|
|
199
85
|
|
|
200
|
-
|
|
86
|
+
4. **Connect to AI** — Follow the [MCP Setup Guide](docs/MCP_SETUP_GUIDE.md) to let AI tools query your vault
|
|
201
87
|
|
|
202
|
-
|
|
88
|
+
For detailed setup instructions, see [docs/SETUP_GUIDE.md](docs/SETUP_GUIDE.md).
|
|
203
89
|
|
|
204
|
-
|
|
205
|
-
# List available templates (built-in + community)
|
|
206
|
-
npx @hiveforge/hivemind-mcp list-templates
|
|
90
|
+
## Screenshots
|
|
207
91
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
npx @hiveforge/hivemind-mcp add-template https://example.com/template.json
|
|
211
|
-
npx @hiveforge/hivemind-mcp add-template ./my-template.json
|
|
92
|
+
### Timeline View
|
|
93
|
+
*Coming soon — chronological visualization of events*
|
|
212
94
|
|
|
213
|
-
|
|
214
|
-
npx @hiveforge/hivemind-mcp create-template
|
|
95
|
+

|
|
215
96
|
|
|
216
|
-
|
|
217
|
-
|
|
97
|
+
### Graph View
|
|
98
|
+
*Coming soon — interactive entity relationship visualization*
|
|
218
99
|
|
|
219
|
-
|
|
220
|
-
npx @hiveforge/hivemind-mcp check-compatibility
|
|
221
|
-
npx @hiveforge/hivemind-mcp check-compatibility software-architecture
|
|
100
|
+

|
|
222
101
|
|
|
223
|
-
|
|
224
|
-
npx @hiveforge/hivemind-mcp generate-catalog
|
|
225
|
-
```
|
|
102
|
+
## Use Cases
|
|
226
103
|
|
|
227
|
-
|
|
104
|
+
**Worldbuilding:**
|
|
105
|
+
- Track characters, locations, and events across your novel
|
|
106
|
+
- AI remembers your character details when helping with dialogue
|
|
107
|
+
- Visualize timeline of your story's key events
|
|
228
108
|
|
|
229
|
-
|
|
109
|
+
**Research:**
|
|
110
|
+
- Organize papers, citations, and concepts in your field
|
|
111
|
+
- AI references your actual research when answering questions
|
|
112
|
+
- Explore connections between concepts in your knowledge base
|
|
230
113
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
│ │
|
|
236
|
-
Full-Text Index Vector Index
|
|
237
|
-
(SQLite) (FAISS)
|
|
238
|
-
│ │
|
|
239
|
-
└───────────────────┬─────────────────┘
|
|
240
|
-
↓
|
|
241
|
-
HybridRAG Router
|
|
242
|
-
↓
|
|
243
|
-
MCP Server
|
|
244
|
-
↓
|
|
245
|
-
AI Clients (Claude, etc.)
|
|
246
|
-
```
|
|
114
|
+
**People Management:**
|
|
115
|
+
- Track team goals, 1:1 meeting notes, and people details
|
|
116
|
+
- AI recalls context from previous meetings when drafting agendas
|
|
117
|
+
- Visualize team relationships and reporting structures
|
|
247
118
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
### v2.1 — Community Templates (Complete)
|
|
253
|
-
|
|
254
|
-
- [x] CLI tools: `create-template`, `validate-template`, `add-template`, `list-templates`
|
|
255
|
-
- [x] Community templates: software-architecture, ux-research
|
|
256
|
-
- [x] Enhanced metadata: category, tags, author, repository, license
|
|
257
|
-
- [x] Template catalog generation for docs sites
|
|
258
|
-
- [x] Version compatibility checking with `minHivemindVersion`
|
|
259
|
-
- [x] Template contribution guide
|
|
260
|
-
|
|
261
|
-
### v2.0 — Template System (Complete)
|
|
262
|
-
|
|
263
|
-
Hivemind is now domain-agnostic with pluggable templates:
|
|
264
|
-
|
|
265
|
-
- [x] Template registry with config-driven entity definitions
|
|
266
|
-
- [x] Dynamic Zod schema generation from config
|
|
267
|
-
- [x] Auto-generated MCP tools per entity type (`query_<type>`, `list_<type>`)
|
|
268
|
-
- [x] Worldbuilding template extraction (backwards compatible)
|
|
269
|
-
- [x] Custom relationship types per template with validation
|
|
270
|
-
- [x] Built-in templates: worldbuilding, research, people-management
|
|
271
|
-
- [x] Sample vaults for each template
|
|
272
|
-
|
|
273
|
-
### v1.0 — MVP + Core Features (Shipped)
|
|
274
|
-
|
|
275
|
-
- [x] MCP server with hybrid search (vector, graph, keyword)
|
|
276
|
-
- [x] Vault templates for all entity types (Character, Location, Event, Faction, Lore, Asset)
|
|
277
|
-
- [x] Canon workflow tools (status management, consistency validation)
|
|
278
|
-
- [x] Asset management with full provenance tracking
|
|
279
|
-
- [x] ComfyUI integration with workflow management
|
|
280
|
-
- [x] Obsidian plugin with image generation
|
|
281
|
-
- [x] CI/CD with semantic-release and CodeQL scanning
|
|
282
|
-
|
|
283
|
-
### Coming Soon
|
|
284
|
-
|
|
285
|
-
- [ ] Obsidian community plugin submission
|
|
286
|
-
- [ ] Timeline queries with date range filtering
|
|
287
|
-
- [ ] Web-based template builder
|
|
288
|
-
|
|
289
|
-
## MCP Tools
|
|
290
|
-
|
|
291
|
-
### Dynamic Entity Tools (Auto-Generated)
|
|
292
|
-
|
|
293
|
-
Tools are automatically generated for each entity type defined in the active template:
|
|
294
|
-
|
|
295
|
-
| Tool Pattern | Description |
|
|
296
|
-
|--------------|-------------|
|
|
297
|
-
| `query_<type>` | Get entity by ID/name with relationships and content |
|
|
298
|
-
| `list_<type>` | List all entities of type with optional filters |
|
|
299
|
-
|
|
300
|
-
**Built-in and community template tools:**
|
|
301
|
-
|
|
302
|
-
| Template | Generated Tools |
|
|
303
|
-
|----------|-----------------|
|
|
304
|
-
| `worldbuilding` | `query_character`, `query_location`, `query_event`, `query_faction`, `query_lore`, `query_asset`, `query_reference` + list variants |
|
|
305
|
-
| `research` | `query_paper`, `query_citation`, `query_concept`, `query_note` + list variants |
|
|
306
|
-
| `people-management` | `query_person`, `query_goal`, `query_team`, `query_one_on_one` + list variants |
|
|
307
|
-
| `software-architecture` | `query_system`, `query_component`, `query_decision`, `query_constraint`, `query_interface` + list variants |
|
|
308
|
-
| `ux-research` | `query_interview`, `query_insight`, `query_hypothesis`, `query_persona`, `query_experiment` + list variants |
|
|
309
|
-
|
|
310
|
-
### Search
|
|
311
|
-
| Tool | Description |
|
|
312
|
-
|------|-------------|
|
|
313
|
-
| `search_vault` | Hybrid search across all content with type/status filters |
|
|
314
|
-
|
|
315
|
-
### Asset Management
|
|
316
|
-
| Tool | Description |
|
|
317
|
-
|------|-------------|
|
|
318
|
-
| `store_asset` | Store generated image with provenance metadata |
|
|
319
|
-
| `query_asset` | Get asset with generation settings |
|
|
320
|
-
| `list_assets` | Filter assets by entity, type, status, workflow |
|
|
321
|
-
|
|
322
|
-
### Canon Workflow
|
|
323
|
-
| Tool | Description |
|
|
324
|
-
|------|-------------|
|
|
325
|
-
| `get_canon_status` | List entities grouped by status (draft/pending/canon) |
|
|
326
|
-
| `submit_for_review` | Move entity from draft to pending review |
|
|
327
|
-
| `validate_consistency` | Check for broken links, duplicates, conflicts |
|
|
328
|
-
|
|
329
|
-
### ComfyUI Integration (when enabled)
|
|
330
|
-
| Tool | Description |
|
|
331
|
-
|------|-------------|
|
|
332
|
-
| `store_workflow` | Save ComfyUI workflow to vault |
|
|
333
|
-
| `list_workflows` | Browse saved workflows |
|
|
334
|
-
| `get_workflow` | Retrieve workflow by ID |
|
|
335
|
-
| `generate_image` | Generate image with vault context injection |
|
|
336
|
-
|
|
337
|
-
### Utility
|
|
338
|
-
| Tool | Description |
|
|
339
|
-
|------|-------------|
|
|
340
|
-
| `rebuild_index` | Force complete re-index of vault |
|
|
341
|
-
| `get_vault_stats` | Vault statistics and token savings metrics |
|
|
119
|
+
**Software Architecture:**
|
|
120
|
+
- Document systems, components, and architectural decisions (ADRs)
|
|
121
|
+
- AI references your ADRs when suggesting design patterns
|
|
122
|
+
- Track dependencies between components visually
|
|
342
123
|
|
|
343
124
|
## Documentation
|
|
344
125
|
|
|
345
126
|
- [Setup Guide](docs/SETUP_GUIDE.md) — Getting started with Hivemind
|
|
127
|
+
- [MCP Setup Guide](docs/MCP_SETUP_GUIDE.md) — AI integration configuration
|
|
346
128
|
- [Vault Migration Guide](docs/VAULT_MIGRATION_GUIDE.md) — Migrating existing vaults
|
|
347
|
-
- [Canon Workflow
|
|
348
|
-
- [
|
|
349
|
-
- [ComfyUI Integration](docs/COMFYUI_INTEGRATION.md) — AI image generation
|
|
350
|
-
- [Obsidian Plugin Workflow](docs/OBSIDIAN_PLUGIN_WORKFLOW.md) — Plugin development
|
|
129
|
+
- [Canon Workflow](docs/CANON_WORKFLOW_ENTERPRISE.md) — Using canon workflow beyond worldbuilding
|
|
130
|
+
- [Contributing Templates](CONTRIBUTING_TEMPLATES.md) — Create and share templates
|
|
351
131
|
- [Sample Vaults](samples/README.md) — Example vaults for each template
|
|
352
|
-
- [Contributing Templates](CONTRIBUTING_TEMPLATES.md) — How to create and contribute templates
|
|
353
132
|
|
|
354
|
-
##
|
|
133
|
+
## Community
|
|
355
134
|
|
|
356
|
-
|
|
135
|
+
- **Issues & Feature Requests** — [GitHub Issues](https://github.com/hiveforge-sh/hivemind/issues)
|
|
136
|
+
- **Discussions** — [GitHub Discussions](https://github.com/hiveforge-sh/hivemind/discussions)
|
|
357
137
|
|
|
358
138
|
## Contributing
|
|
359
139
|
|
|
@@ -365,10 +145,10 @@ We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guid
|
|
|
365
145
|
<type>: <description>
|
|
366
146
|
|
|
367
147
|
[optional body]
|
|
368
|
-
|
|
369
|
-
[optional footer]
|
|
370
148
|
```
|
|
371
149
|
|
|
372
150
|
Common types: `feat`, `fix`, `docs`, `style`, `refactor`, `test`, `chore`
|
|
373
151
|
|
|
374
|
-
|
|
152
|
+
## License
|
|
153
|
+
|
|
154
|
+
[MIT](LICENSE) — Free for personal and commercial use.
|
package/dist/cli/fix/fixer.js
CHANGED
|
@@ -201,7 +201,7 @@ export class FileFixer {
|
|
|
201
201
|
if (!('status' in result)) {
|
|
202
202
|
result.status = 'draft';
|
|
203
203
|
}
|
|
204
|
-
// Tags - default to empty array
|
|
204
|
+
// Tags - default to empty array (visible so users know it's available)
|
|
205
205
|
if (!('tags' in result)) {
|
|
206
206
|
result.tags = [];
|
|
207
207
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixer.js","sourceRoot":"","sources":["../../../src/cli/fix/fixer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"fixer.js","sourceRoot":"","sources":["../../../src/cli/fix/fixer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/cli/fix/writer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/cli/fix/writer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAehD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC,WAAW,CAAC,CA2GtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,aAAa,EAAE,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC,CASxB"}
|
package/dist/cli/fix/writer.js
CHANGED
|
@@ -8,6 +8,18 @@ import { promises as fs } from 'fs';
|
|
|
8
8
|
import { join } from 'path';
|
|
9
9
|
import { tmpdir } from 'os';
|
|
10
10
|
import matter from 'gray-matter';
|
|
11
|
+
/**
|
|
12
|
+
* Post-process YAML output to fix inline empty arrays/objects.
|
|
13
|
+
* Converts `: []` and `: {}` to just `:` (YAML null) which is more
|
|
14
|
+
* parser-friendly while still showing the field exists.
|
|
15
|
+
*/
|
|
16
|
+
function fixEmptyYamlValues(yaml) {
|
|
17
|
+
// Replace inline empty arrays `: []` with just `:`
|
|
18
|
+
// Replace inline empty objects `: {}` with just `:`
|
|
19
|
+
return yaml
|
|
20
|
+
.replace(/: \[\]\s*$/gm, ':')
|
|
21
|
+
.replace(/: \{\}\s*$/gm, ':');
|
|
22
|
+
}
|
|
11
23
|
/**
|
|
12
24
|
* Write frontmatter to a file atomically.
|
|
13
25
|
*
|
|
@@ -30,10 +42,70 @@ export async function writeFile(vaultPath, operation) {
|
|
|
30
42
|
const content = await fs.readFile(targetPath, 'utf-8');
|
|
31
43
|
// Parse with gray-matter
|
|
32
44
|
const file = matter(content);
|
|
33
|
-
//
|
|
45
|
+
// Check for unparseable frontmatter: content starts with --- but data is empty
|
|
46
|
+
// This happens when YAML has syntax errors - gray-matter puts it in content
|
|
47
|
+
const hasUnparseableFrontmatter = Object.keys(file.data).length === 0 &&
|
|
48
|
+
file.content.trimStart().startsWith('---');
|
|
49
|
+
if (hasUnparseableFrontmatter) {
|
|
50
|
+
// Extract and merge with existing frontmatter manually
|
|
51
|
+
const frontmatterMatch = file.content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
52
|
+
if (frontmatterMatch) {
|
|
53
|
+
// Parse existing frontmatter as loose key-value pairs (tolerant parsing)
|
|
54
|
+
const existingLines = frontmatterMatch[1].split('\n');
|
|
55
|
+
const existingData = {};
|
|
56
|
+
for (const line of existingLines) {
|
|
57
|
+
const colonIndex = line.indexOf(':');
|
|
58
|
+
if (colonIndex > 0) {
|
|
59
|
+
const key = line.slice(0, colonIndex).trim();
|
|
60
|
+
let value = line.slice(colonIndex + 1).trim();
|
|
61
|
+
// Try to parse as JSON for arrays/objects, otherwise keep as string
|
|
62
|
+
if (value && typeof value === 'string') {
|
|
63
|
+
if (value.startsWith('[') || value.startsWith('{') || value.startsWith('"')) {
|
|
64
|
+
try {
|
|
65
|
+
value = JSON.parse(value);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Keep as string if JSON parse fails
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (value === 'true') {
|
|
72
|
+
value = true;
|
|
73
|
+
}
|
|
74
|
+
else if (value === 'false') {
|
|
75
|
+
value = false;
|
|
76
|
+
}
|
|
77
|
+
else if (/^-?\d+$/.test(value)) {
|
|
78
|
+
value = parseInt(value, 10);
|
|
79
|
+
}
|
|
80
|
+
else if (/^-?\d+\.\d+$/.test(value)) {
|
|
81
|
+
value = parseFloat(value);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (key) {
|
|
85
|
+
existingData[key] = value;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Merge: new fields + existing fields (existing takes precedence)
|
|
90
|
+
const mergedData = { ...operation.frontmatter, ...existingData };
|
|
91
|
+
// Get content after the frontmatter block
|
|
92
|
+
const contentAfterFrontmatter = file.content.slice(frontmatterMatch[0].length).trimStart();
|
|
93
|
+
// Stringify and fix empty values format
|
|
94
|
+
const output = fixEmptyYamlValues(matter.stringify(contentAfterFrontmatter, mergedData));
|
|
95
|
+
// Write to temp file
|
|
96
|
+
await fs.writeFile(tempPath, output, 'utf-8');
|
|
97
|
+
// Atomic rename to target
|
|
98
|
+
await fs.rename(tempPath, targetPath);
|
|
99
|
+
return {
|
|
100
|
+
path: operation.path,
|
|
101
|
+
success: true,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Normal case: merge frontmatter (existing values take precedence, add only missing fields)
|
|
34
106
|
const mergedData = { ...operation.frontmatter, ...file.data };
|
|
35
|
-
// Stringify back to markdown
|
|
36
|
-
const output = matter.stringify(file.content, mergedData);
|
|
107
|
+
// Stringify back to markdown and fix empty values format
|
|
108
|
+
const output = fixEmptyYamlValues(matter.stringify(file.content, mergedData));
|
|
37
109
|
// Write to temp file
|
|
38
110
|
await fs.writeFile(tempPath, output, 'utf-8');
|
|
39
111
|
// Atomic rename to target
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/cli/fix/writer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,MAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/cli/fix/writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/cli/init/output.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/cli/init/output.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAcnD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BjE;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,eAAe,EAAE,OAAO,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,MAAM,EAAE;QACN,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE;QACR,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE,aAAa,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,oBAAoB,EAAE,OAAO,CAAC;KAC/B,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAoBpF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAWtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAI3E;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG1D"}
|