vectorforce 0.3.2 ā 0.3.4
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/CHANGELOG.md +38 -0
- package/README.md +185 -9
- package/bin/vf.js +142 -55
- package/package.json +1 -1
- package/src/mcp/harness-config.js +785 -40
- package/src/mcp/mcp-server.js +85 -13
- package/src/operations/project-service.js +18 -1
- package/src/policy/authorizer.js +15 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,44 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [Unreleased]
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- Cross-platform MCP availability: generated harness configs now use the absolute Node.js runtime (`process.execPath`) with `"type": "stdio"` instead of bare `node`, so GUI-launched clients on Windows, macOS, and Linux can spawn `vf mcp` even when `node` is not on their PATH.
|
|
14
|
+
- MCP protocol compatibility: the stdio server negotiates `protocolVersion` (`2025-11-25`, `2025-06-18`, `2025-03-26`, `2024-11-05`), reports the package version, answers `resources/list`, `resources/templates/list`, `prompts/list`, and JSON-RPC batches, and keeps `stdout` reserved for JSON-RPC in `vf mcp` mode.
|
|
15
|
+
- VS Code / Copilot: `.vscode/mcp.json` is now written under the top-level `servers` key (the only shape VS Code reads); legacy `mcpServers.vectorforce` entries are migrated on install and removed on uninstall.
|
|
16
|
+
- Kiro IDE: workspace config is now written to `.kiro/settings/mcp.json` (the path Kiro reads) with steering in `.kiro/steering/vectorforce.md`; the legacy `.kiro/mcp.json` entry is migrated.
|
|
17
|
+
- Meta Muse: `installMuseCode` now always ensures the global `~/.config/muse/settings.json` entry under the `mcpServers` key (the block Muse Code actually reads; a stale `mcp_servers.vectorforce` entry is migrated) with no workspace pin so one entry serves every project, and no longer deletes unrelated user keys.
|
|
18
|
+
- Antigravity: global config prefers `~/.gemini/config/mcp_config.json` with fallback to `~/.gemini/antigravity/mcp_config.json`.
|
|
19
|
+
- Codex TOML now embeds quoted absolute paths for both the Node runtime and `bin/vf.js`.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- `vf init` no longer creates every harness config at once: it auto-detects harnesses already in use (marker files/dirs), installs only those, and otherwise creates none while printing the exact follow-up commands. Override with `vf init --harness <id[,...]|all|none>` or `vf init --all`.
|
|
23
|
+
- Added `vf config list` showing supported harnesses with detected/configured status; `vf config install`/`uninstall` reject unknown harness names with that hint.
|
|
24
|
+
- `vf doctor`, `vf status`, and `vf config doctor` now verify the VectorForce entry exists instead of only the file.
|
|
25
|
+
|
|
26
|
+
## [0.3.2] - 2026-11-01
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
- **First-Class Support for 4 Additional AI Harnesses**:
|
|
30
|
+
- **Cursor IDE**: Added automated configuration for `.cursor/mcp.json` and `.cursorrules` in `HarnessConfig.installCursor`.
|
|
31
|
+
- **Windsurf (Codeium Cascade)**: Added automated configuration for `.windsurf/mcp_config.json` and `.windsurfrules` in `HarnessConfig.installWindsurf`.
|
|
32
|
+
- **GitHub Copilot / VS Code**: Added automated workspace configuration for `.vscode/mcp.json` and `.github/copilot-instructions.md` in `HarnessConfig.installCopilot`.
|
|
33
|
+
- **Kiro IDE**: Added automated configuration for `.kiro/mcp.json`, `kiro.json`, and `.kiro/rules.md` in `HarnessConfig.installKiro`.
|
|
34
|
+
- **Harness Policy & Tool Schema Expansion**:
|
|
35
|
+
- Updated `APPROVED_DESTINATIONS` in `Authorizer` to approve `cursor`, `windsurf`, `github-copilot`, `copilot`, `kiro`, and `kiro-ide`.
|
|
36
|
+
- Updated MCP tool schemas for `get_resume_briefing`, `export_handoff`, `get_timeline`, and `reason_about_task` to accept all newly supported harnesses.
|
|
37
|
+
- **Universal MCP Configuration Guide in Documentation**:
|
|
38
|
+
- Added dedicated installation instructions to `README.md` for Cline / Roo Code, Zed Editor, JetBrains IDEs (IntelliJ, WebStorm, PyCharm), Sourcegraph Cody, Aider, and generic stdio MCP clients.
|
|
39
|
+
- **Comprehensive Unit & Security Test Coverage**:
|
|
40
|
+
- Added automated reversible install/uninstall tests for Cursor, Windsurf, GitHub Copilot, and Kiro IDE (test suite expanded to 79 tests).
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
- `vf init`, `vf config install all`, `vf config doctor`, and `vf status` now inspect and provision all 9 AI coding harnesses.
|
|
44
|
+
- Pruned `package.json` package `files` whitelist to strictly include runtime artifacts (`bin/`, `src/`, `studio/dist/`, `CHANGELOG.md`, `LICENSE`, `README.md`).
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
10
48
|
## [0.2.0] - 2026-10-31
|
|
11
49
|
|
|
12
50
|
### Added
|
package/README.md
CHANGED
|
@@ -27,6 +27,85 @@ VectorForce provides an immutable, cryptographic context layer that tracks:
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
+
## Architecture & System Topology
|
|
31
|
+
|
|
32
|
+
VectorForce is engineered with a strict **Local-First & Zero Runtime Dependency** design. It operates entirely through Node.js built-ins (`node:sqlite`, `node:crypto`, `node:http`, `node:fs`) and integrates seamlessly across local IDEs, multi-agent MCP bridges, and zero-knowledge cloud sync.
|
|
33
|
+
|
|
34
|
+
```mermaid
|
|
35
|
+
flowchart TD
|
|
36
|
+
subgraph AI_Harnesses["AI Coding Agent Ecosystem (MCP Protocol)"]
|
|
37
|
+
A1["ā” Google Antigravity"]
|
|
38
|
+
A2["š¦ Meta Muse"]
|
|
39
|
+
A3["ā Claude / Command Code"]
|
|
40
|
+
A4["ā OpenAI Codex"]
|
|
41
|
+
A5["š±ļø Cursor IDE"]
|
|
42
|
+
A6["š Windsurf Cascade"]
|
|
43
|
+
A7["š GitHub Copilot"]
|
|
44
|
+
A8["ā” Kiro IDE"]
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
subgraph VectorForce_Core["VectorForce Core Engine (Zero Runtime Dependencies)"]
|
|
48
|
+
direction TB
|
|
49
|
+
MCP["MCP Server & JSON-RPC Bridge\n(src/mcp/mcp-server.js ⢠stdio)"]
|
|
50
|
+
CLI["CLI Control Interface\n(bin/vf.js ⢠init, status, drift, resume)"]
|
|
51
|
+
|
|
52
|
+
AUTH["Zero-Leak Policy Authorizer\n(src/policy/authorizer.js ⢠Symlink & Containment Guard)"]
|
|
53
|
+
|
|
54
|
+
subgraph Operations["Operations & Synthesis Services"]
|
|
55
|
+
CHK["Checkpoint Service\n(Claims vs Evidence Fencing)"]
|
|
56
|
+
BRF["Briefing & Drift Service\n(Git HEAD & SHA-256 Hash Matching)"]
|
|
57
|
+
RSN["AI Reasoning Service\n(Meta Muse ⢠Fireworks ⢠Llama 3.3)"]
|
|
58
|
+
HDF["Handoff Service\n(HMAC-SHA256 Manifest Export/Import)"]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
subgraph Providers["Zero-Dep Workspace Observers"]
|
|
62
|
+
GIT["Git Provider\n(Branch, Commit SHA, Diff, Dirty Tree)"]
|
|
63
|
+
DOC["Document Provider\n(Allowlisted Spec Reader & SHA-256 Hashes)"]
|
|
64
|
+
AST["Code Index Provider\n(AST Symbols & Import Dependency Graph)"]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
DB[("Local SQLite WAL Store\n(.vectorforce/vectorforce.db\nnode:sqlite WAL mode)")]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
subgraph Studio_UI["Local VectorForce Studio (Web UI)"]
|
|
71
|
+
WEB["Studio HTTP Server (127.0.0.1:3210)\nReact + Vite + Tailwind + XYFlow"]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
subgraph Cloud_Layer["VectorForce Cloud (Modal.com / E2EE Sync)"]
|
|
75
|
+
REMOTE["Zero-Knowledge Wire & Hub\nX25519 ECDH + AES-256-GCM + Ed25519 Signature\n(Multi-Project Hub ⢠PM Interpreter Portal)"]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
%% Wiring
|
|
79
|
+
A1 & A2 & A3 & A4 & A5 & A6 & A7 & A8 <-->|"stdio JSON-RPC 2.0"| MCP
|
|
80
|
+
CLI --> AUTH
|
|
81
|
+
MCP --> AUTH
|
|
82
|
+
AUTH --> Operations
|
|
83
|
+
Operations <--> Providers
|
|
84
|
+
Operations <--> DB
|
|
85
|
+
DB <--> WEB
|
|
86
|
+
Operations <-->|"vf push / vf pull\n(Encrypted Ciphertext)"| REMOTE
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Tech Stack Overview
|
|
92
|
+
|
|
93
|
+
VectorForce adheres to strict architectural purity, ensuring rock-solid stability, privacy, and speed without bloated dependency chains.
|
|
94
|
+
|
|
95
|
+
| Layer | Technology | Rationale / Key Capabilities |
|
|
96
|
+
| :--- | :--- | :--- |
|
|
97
|
+
| **Runtime & Core** | **Node.js (>= 22.5.0 ESM)** | Pure ES Modules, fast startup, native cross-platform support (macOS, Linux, Windows). |
|
|
98
|
+
| **Backend Dependencies** | **Zero External Runtime Dependencies** | Powered 100% by Node.js built-ins: `node:sqlite`, `node:crypto`, `node:http`, `node:fs`, `node:child_process`, `node:os`. |
|
|
99
|
+
| **Storage Engine** | **`node:sqlite` (WAL Mode)** | Local-first, zero-configuration database (`.vectorforce/vectorforce.db`) with Write-Ahead Logging for atomic concurrent reads/writes. |
|
|
100
|
+
| **Cryptographic Security** | **`node:crypto` (HMAC-SHA256, AES-256-GCM, X25519, Ed25519)** | Tamper-evident handoffs, verifiable file digests, and end-to-end zero-knowledge multi-machine sync. |
|
|
101
|
+
| **Protocol Integration** | **Model Context Protocol (MCP)** | JSON-RPC 2.0 over standard I/O (`stdio`), 9 deterministic tools, and auto-configuration for 8+ AI harnesses. |
|
|
102
|
+
| **AI Reasoning Layer** | **Meta Muse & Llama 3.3** | Native adapters for **Meta Muse (`muse-spark-1.3`)**, **Meta Muse Spark Open** (Fireworks AI / OpenRouter), Local **Ollama**, **OpenAI**, and **Anthropic** with graceful offline briefing fallback. |
|
|
103
|
+
| **AST & Code Indexer** | **Custom Zero-Dependency Regex/Tokenizer Indexer** | Extracts symbols (classes, functions, interfaces), imports, and module dependency graphs without heavy external parser bloat. |
|
|
104
|
+
| **Local Studio Frontend** | **React 18 + Vite + Tailwind CSS + XYFlow** | Interactive architecture control center, live blast radius inspector, Claims vs Evidence timeline, and memory console. |
|
|
105
|
+
| **Cloud Remote Sync** | **Modal.com Serverless Container (Debian + Node 22)** | Zero-Knowledge E2EE relay hub, scale-to-zero serverless deployment, PM Interpreter, and Multi-Project switcher. |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
30
109
|
## VectorForce Studio (Web UI)
|
|
31
110
|
|
|
32
111
|
VectorForce includes a local-first engineering control center:
|
|
@@ -47,9 +126,12 @@ node bin/vf.js studio
|
|
|
47
126
|
|
|
48
127
|
## Quickstart
|
|
49
128
|
|
|
50
|
-
### 1. Initialize a Project
|
|
129
|
+
### 1. Initialize a Project (auto-detects your AI harness)
|
|
51
130
|
```bash
|
|
52
131
|
node bin/vf.js init
|
|
132
|
+
# Only detected harnesses are configured; repos with no harness get no MCP files yet.
|
|
133
|
+
node bin/vf.js config list # supported harnesses + detected/configured status
|
|
134
|
+
node bin/vf.js config install cursor # or: --harness on init, or install all
|
|
53
135
|
```
|
|
54
136
|
|
|
55
137
|
### 2. Create and Select a Task
|
|
@@ -137,33 +219,37 @@ node bin/vf.js studio
|
|
|
137
219
|
|
|
138
220
|
## Model Context Protocol (MCP)
|
|
139
221
|
|
|
140
|
-
VectorForce exposes a standard stdio JSON-RPC MCP server for direct integration into **Google Antigravity**, **Claude Code**, **Command Code**, **Meta Muse**, and **
|
|
222
|
+
VectorForce exposes a standard stdio JSON-RPC MCP server for direct integration into **Google Antigravity**, **Claude Code**, **Command Code**, **Meta Muse**, **OpenAI Codex**, **Cursor**, **Windsurf**, **GitHub Copilot**, and **Kiro IDE**.
|
|
141
223
|
|
|
142
|
-
> **How MCP Starts:** You **never** need to run `vf mcp` manually in a terminal. Each AI coding agent reads its configuration file below and automatically spawns VectorForce in the background over `stdio`.
|
|
224
|
+
> **How MCP Starts:** You **never** need to run `vf mcp` manually in a terminal. Each AI coding agent reads its configuration file below and automatically spawns VectorForce in the background over `stdio`. Generated entries use the absolute Node.js runtime path, so GUI-launched clients find it even when `node` is not on their PATH (common on Windows).
|
|
143
225
|
|
|
144
226
|
| AI Coding Client | Config File Read by Client | 1-Command Auto-Setup |
|
|
145
227
|
|---|---|---|
|
|
146
|
-
| **Google Antigravity** | `.agents/mcp_config.json` & `~/.gemini/antigravity/mcp_config.json` | `node bin/vf.js config install antigravity` |
|
|
228
|
+
| **Google Antigravity** | `.agents/mcp_config.json` & `~/.gemini/config/mcp_config.json` (or `~/.gemini/antigravity/mcp_config.json`) | `node bin/vf.js config install antigravity` |
|
|
147
229
|
| **Claude Code (`claude`)** | `.mcp.json` (project root) | `node bin/vf.js config install claude-code` |
|
|
148
230
|
| **Command Code (`cmd`)** | `.mcp.json` & `commandcode.json` | `node bin/vf.js config install command-code` |
|
|
149
|
-
| **Meta Muse (`muse`)** |
|
|
231
|
+
| **Meta Muse (`muse`)** | `~/.config/muse/settings.json` (global `mcpServers`; `.muse/mcp_config.json` kept as mirror) | `node bin/vf.js config install muse` |
|
|
150
232
|
| **OpenAI Codex (`codex`)** | `.codex/config.toml` & `~/.codex/config.toml` | `node bin/vf.js config install codex` |
|
|
233
|
+
| **Cursor IDE** | `.cursor/mcp.json` & `.cursorrules` | `node bin/vf.js config install cursor` |
|
|
234
|
+
| **Windsurf (Codeium)** | `.windsurf/mcp_config.json` & `.windsurfrules` | `node bin/vf.js config install windsurf` |
|
|
235
|
+
| **GitHub Copilot / VS Code** | `.vscode/mcp.json` (top-level `servers`) & `.github/copilot-instructions.md` | `node bin/vf.js config install copilot` |
|
|
236
|
+
| **Kiro IDE** | `.kiro/settings/mcp.json` & `kiro.json` | `node bin/vf.js config install kiro` |
|
|
151
237
|
|
|
152
238
|
### Automated Configuration & Health Check
|
|
153
239
|
```bash
|
|
154
|
-
# Auto-configure all supported AI harnesses at once:
|
|
240
|
+
# Auto-configure all 9 supported AI harnesses at once:
|
|
155
241
|
node bin/vf.js config install all
|
|
156
242
|
|
|
157
243
|
# Verify SQLite DB, AGENTS.md, and all MCP client configs:
|
|
158
244
|
node bin/vf.js status
|
|
159
245
|
```
|
|
160
246
|
|
|
161
|
-
### JSON Configuration (Antigravity, Claude Code, Command Code, Muse)
|
|
247
|
+
### JSON Configuration (Antigravity, Claude Code, Command Code, Muse, Cursor, Windsurf, VS Code, Kiro)
|
|
162
248
|
```json
|
|
163
249
|
{
|
|
164
250
|
"mcpServers": {
|
|
165
251
|
"vectorforce": {
|
|
166
|
-
"command": "node",
|
|
252
|
+
"command": "/absolute/path/to/node",
|
|
167
253
|
"args": ["/absolute/path/to/VectorForce/bin/vf.js", "mcp"]
|
|
168
254
|
}
|
|
169
255
|
}
|
|
@@ -173,12 +259,102 @@ node bin/vf.js status
|
|
|
173
259
|
### TOML Configuration (OpenAI Codex CLI: `.codex/config.toml`)
|
|
174
260
|
```toml
|
|
175
261
|
[mcp_servers.vectorforce]
|
|
176
|
-
command = "node"
|
|
262
|
+
command = "/absolute/path/to/node"
|
|
177
263
|
args = ["/absolute/path/to/VectorForce/bin/vf.js", "mcp"]
|
|
178
264
|
[mcp_servers.vectorforce.env]
|
|
179
265
|
VF_HARNESS = "codex"
|
|
180
266
|
```
|
|
181
267
|
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## How to Configure & Update MCP for Any Other AI Coding Harness
|
|
271
|
+
|
|
272
|
+
If your AI assistant or IDE is not in the auto-configured list above, you can connect it to VectorForce in seconds using standard MCP configuration:
|
|
273
|
+
|
|
274
|
+
### 1. Cline & Roo Code (VS Code Extension)
|
|
275
|
+
Open VS Code Settings or click the **MCP** icon in the Cline panel:
|
|
276
|
+
- Open `cline_mcp_settings.json` (or `roo-cline_mcp_settings.json`) located at:
|
|
277
|
+
- **macOS:** `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`
|
|
278
|
+
- **Linux:** `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`
|
|
279
|
+
- **Windows:** `%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json`
|
|
280
|
+
- Add the VectorForce entry:
|
|
281
|
+
```json
|
|
282
|
+
{
|
|
283
|
+
"mcpServers": {
|
|
284
|
+
"vectorforce": {
|
|
285
|
+
"command": "npx",
|
|
286
|
+
"args": ["-y", "vectorforce", "mcp"],
|
|
287
|
+
"disabled": false,
|
|
288
|
+
"autoApprove": [
|
|
289
|
+
"list_tasks",
|
|
290
|
+
"check_workspace_drift",
|
|
291
|
+
"get_resume_briefing",
|
|
292
|
+
"save_checkpoint",
|
|
293
|
+
"reason_about_task"
|
|
294
|
+
]
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 2. Zed Editor
|
|
301
|
+
Zed natively supports MCP context servers. Open your Zed configuration (`~/.config/zed/settings.json` or `cmd-,`):
|
|
302
|
+
```json
|
|
303
|
+
{
|
|
304
|
+
"context_servers": {
|
|
305
|
+
"vectorforce": {
|
|
306
|
+
"command": {
|
|
307
|
+
"path": "npx",
|
|
308
|
+
"args": ["-y", "vectorforce", "mcp"]
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### 3. JetBrains IDEs (IntelliJ IDEA, WebStorm, PyCharm, RustRover)
|
|
316
|
+
For JetBrains IDEs supporting MCP or AI Assistant:
|
|
317
|
+
1. Open **Settings / Preferences** (`Ctrl+Alt+S` or `Cmd+,`).
|
|
318
|
+
2. Search for **Model Context Protocol** or **AI Assistant ā Context Providers**.
|
|
319
|
+
3. Click **Add Stdio Server**:
|
|
320
|
+
- **Name:** `vectorforce`
|
|
321
|
+
- **Command:** `node` (or `npx`)
|
|
322
|
+
- **Arguments:** `/path/to/VectorForce/bin/vf.js mcp` (or `-y vectorforce mcp`)
|
|
323
|
+
- **Environment Variables:** `VF_HARNESS=jetbrains`
|
|
324
|
+
|
|
325
|
+
### 4. Sourcegraph Cody
|
|
326
|
+
In Sourcegraph Cody settings (`cody.experimental.mcp.servers` in VS Code or JetBrains):
|
|
327
|
+
```json
|
|
328
|
+
{
|
|
329
|
+
"cody.experimental.mcp.servers": {
|
|
330
|
+
"vectorforce": {
|
|
331
|
+
"command": "node",
|
|
332
|
+
"args": ["/path/to/VectorForce/bin/vf.js", "mcp"]
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### 5. Aider (`aider-chat`)
|
|
339
|
+
Aider integrates directly with Git and can ingest VectorForce's immutable architectural briefings:
|
|
340
|
+
```bash
|
|
341
|
+
# Pipe VectorForce briefing directly to Aider on session start:
|
|
342
|
+
node bin/vf.js resume --task <task_id> --dest cli --raw | aider
|
|
343
|
+
|
|
344
|
+
# Or generate project conventions before running aider:
|
|
345
|
+
node bin/vf.js resume --task <task_id> --dest cli --raw > CONVENTIONS.md
|
|
346
|
+
aider
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### 6. Generic MCP Client (Any Tool Speaking JSON-RPC 2.0 over Stdio)
|
|
350
|
+
For any agent running locally, pass:
|
|
351
|
+
- **Executable:** `node`
|
|
352
|
+
- **Arguments:** `["/path/to/bin/vf.js", "mcp"]`
|
|
353
|
+
- **Working Directory:** Path to your project workspace
|
|
354
|
+
- **Environment:** `VF_WORKSPACE=/path/to/project` (optional if working directory matches)
|
|
355
|
+
|
|
356
|
+
Whenever you update VectorForce (`npm update -g vectorforce`), simply restart your AI agent or IDE window to immediately use the latest MCP tools.
|
|
357
|
+
|
|
182
358
|
### Available MCP Tools
|
|
183
359
|
| Tool | Purpose |
|
|
184
360
|
|---|---|
|
package/bin/vf.js
CHANGED
|
@@ -146,7 +146,7 @@ function printUsage() {
|
|
|
146
146
|
VectorForce (vf) - Git for AI Engineering Context
|
|
147
147
|
|
|
148
148
|
Usage:
|
|
149
|
-
vf init [project_name]
|
|
149
|
+
vf init [project_name] [--harness <id|all|none>] Init workspace (auto-detects harnesses)
|
|
150
150
|
vf task <id> [title] Create or register a task
|
|
151
151
|
vf tasks [active|completed|all] List tasks in workspace
|
|
152
152
|
vf policy list List allowed document paths
|
|
@@ -162,7 +162,7 @@ Usage:
|
|
|
162
162
|
vf studio [options] Launch VectorForce Studio web control center
|
|
163
163
|
vf ui [options] Alias for vf studio
|
|
164
164
|
vf mcp Start stdio MCP server for Antigravity / Command Code
|
|
165
|
-
vf config
|
|
165
|
+
vf config list|install|doctor List, install, or check harness MCP integrations
|
|
166
166
|
vf help Show this help
|
|
167
167
|
|
|
168
168
|
Checkpoint options:
|
|
@@ -235,7 +235,15 @@ function parseFlags(args) {
|
|
|
235
235
|
rationale: parts.slice(2).join(':') || 'Approved architecture decision'
|
|
236
236
|
});
|
|
237
237
|
} else if (arg === '--harness' && args[i + 1]) {
|
|
238
|
-
|
|
238
|
+
const harnessValue = args[++i];
|
|
239
|
+
flags.harness = harnessValue;
|
|
240
|
+
flags.harnessList = (flags.harnessList || []).concat(
|
|
241
|
+
harnessValue.split(',').map((value) => value.trim()).filter(Boolean)
|
|
242
|
+
);
|
|
243
|
+
} else if (arg === '--all') {
|
|
244
|
+
flags.all = true;
|
|
245
|
+
} else if (arg === '--none') {
|
|
246
|
+
flags.none = true;
|
|
239
247
|
} else if (arg === '--author' && args[i + 1]) {
|
|
240
248
|
flags.author = args[++i];
|
|
241
249
|
} else if (arg === '--next' && args[i + 1]) {
|
|
@@ -330,19 +338,50 @@ async function main() {
|
|
|
330
338
|
case 'init': {
|
|
331
339
|
const name = args[1] && !args[1].startsWith('--') ? args[1] : null;
|
|
332
340
|
const project = projectService.initProject(cwd, name);
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
341
|
+
const harnessRequest = flags.harnessList && flags.harnessList.length > 0 ? flags.harnessList : null;
|
|
342
|
+
let harnessTargets = [];
|
|
343
|
+
if (flags.all || (harnessRequest && harnessRequest.some((h) => h.toLowerCase() === 'all'))) {
|
|
344
|
+
harnessTargets = HarnessConfig.getSupportedHarnesses().map((h) => h.id);
|
|
345
|
+
} else if (flags.none || (harnessRequest && harnessRequest.some((h) => h.toLowerCase() === 'none'))) {
|
|
346
|
+
harnessTargets = [];
|
|
347
|
+
} else if (harnessRequest) {
|
|
348
|
+
const unknown = [];
|
|
349
|
+
for (const requested of harnessRequest) {
|
|
350
|
+
const resolved = HarnessConfig.resolveHarnessId(requested);
|
|
351
|
+
if (resolved && !harnessTargets.includes(resolved)) harnessTargets.push(resolved);
|
|
352
|
+
else if (!resolved) unknown.push(requested);
|
|
353
|
+
}
|
|
354
|
+
if (unknown.length > 0) {
|
|
355
|
+
console.error(`Unknown harness: ${unknown.join(', ')}. Run "vf config list" for supported values.`);
|
|
356
|
+
process.exit(1);
|
|
357
|
+
}
|
|
358
|
+
} else {
|
|
359
|
+
harnessTargets = HarnessConfig.detectHarnesses(cwd).map((h) => h.id);
|
|
360
|
+
}
|
|
361
|
+
const installedHarnesses = [];
|
|
362
|
+
for (const id of harnessTargets) {
|
|
363
|
+
try {
|
|
364
|
+
installedHarnesses.push({ id, path: HarnessConfig.installHarness(cwd, id) });
|
|
365
|
+
} catch (err) {
|
|
366
|
+
console.warn(`Warning: failed to configure ${id}: ${err.message}`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
337
369
|
const agentsMdPath = join(cwd, 'AGENTS.md');
|
|
338
370
|
if (!existsSync(agentsMdPath)) {
|
|
339
371
|
writeFileSync(
|
|
340
372
|
agentsMdPath,
|
|
341
|
-
`# Agent Continuity Protocol ā ${project.name}\n\nThis repository uses **VectorForce** ("Git for AI Context") across Google Antigravity, Meta Muse, Claude Code, Command Code, and
|
|
373
|
+
`# Agent Continuity Protocol ā ${project.name}\n\nThis repository uses **VectorForce** ("Git for AI Context") across Google Antigravity, Meta Muse, Claude Code, Command Code, OpenAI Codex, Cursor, Windsurf, GitHub Copilot, and Kiro IDE.\n\n## Workflow\n1. **Start/Resume Task**: Run \`vf tasks active\`, \`vf drift --task <id>\`, and \`vf resume --task <id> --dest <harness>\` (or MCP tools \`list_tasks\`, \`check_workspace_drift\`, \`get_resume_briefing\`, \`reason_about_task\`).\n2. **Save Checkpoint Before Switching IDE**: Run \`vf checkpoint --task <id> --summary "<summary>" --goal "<goal>" --constraint "<constraint>" --decision "<ID>:<Title>:<Rationale>" --next "<next>" --doc "AGENTS.md"\` (or MCP tool \`save_checkpoint\`).\n`,
|
|
342
374
|
'utf8'
|
|
343
375
|
);
|
|
344
376
|
}
|
|
345
377
|
console.log(`Initialized VectorForce project: ${project.name} (${project.project_id})`);
|
|
378
|
+
if (installedHarnesses.length > 0) {
|
|
379
|
+
console.log(`Configured harness integration(s): ${installedHarnesses.map((h) => h.id).join(', ')}`);
|
|
380
|
+
console.log('For other harnesses, run "vf config list" or "vf config install <harness|all>".');
|
|
381
|
+
} else {
|
|
382
|
+
console.log('No harness detected, so no MCP configs were created.');
|
|
383
|
+
console.log('Run "vf config list" to see supported harnesses, then "vf config install <harness>".');
|
|
384
|
+
}
|
|
346
385
|
break;
|
|
347
386
|
}
|
|
348
387
|
|
|
@@ -547,6 +586,8 @@ async function main() {
|
|
|
547
586
|
}
|
|
548
587
|
|
|
549
588
|
case 'mcp': {
|
|
589
|
+
console.log = (...args) => console.error(...args);
|
|
590
|
+
console.info = (...args) => console.error(...args);
|
|
550
591
|
const server = new McpServer({ store, projectService, checkpointService, briefingService, handoffService, reasoningService }, cwd);
|
|
551
592
|
server.connect(process.stdin, process.stdout);
|
|
552
593
|
process.on('SIGINT', () => {
|
|
@@ -564,37 +605,63 @@ async function main() {
|
|
|
564
605
|
case 'config': {
|
|
565
606
|
const sub = args[1];
|
|
566
607
|
if (sub === 'install' || sub === 'setup') {
|
|
567
|
-
const
|
|
568
|
-
const
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
608
|
+
const raw = (args[2] || 'all').toLowerCase();
|
|
609
|
+
const installNotes = {
|
|
610
|
+
antigravity: (p) => `Google Antigravity -> ${p} (+ global ~/.gemini MCP config when present)`,
|
|
611
|
+
'command-code': (p) => `Command Code / Claude Code -> .mcp.json & ${p}`,
|
|
612
|
+
muse: (p) => `Meta Muse -> ${p} (+ ~/.config/muse/settings.json)`,
|
|
613
|
+
codex: (p) => `Codex -> ${p} (+ ~/.codex/config.toml)`,
|
|
614
|
+
cursor: (p) => `Cursor -> ${p} (+ .cursorrules)`,
|
|
615
|
+
windsurf: (p) => `Windsurf -> ${p} (+ .windsurfrules)`,
|
|
616
|
+
copilot: (p) => `GitHub Copilot / VS Code -> ${p} (+ .github/copilot-instructions.md)`,
|
|
617
|
+
kiro: (p) => `Kiro IDE -> ${p} (+ kiro.json)`
|
|
618
|
+
};
|
|
619
|
+
let targets = [];
|
|
620
|
+
if (raw === 'all') {
|
|
621
|
+
targets = HarnessConfig.getSupportedHarnesses().map((h) => h.id);
|
|
622
|
+
} else {
|
|
623
|
+
const resolved = HarnessConfig.resolveHarnessId(raw);
|
|
624
|
+
if (!resolved) {
|
|
625
|
+
console.error(`Unknown harness "${args[2]}". Run "vf config list" for supported values.`);
|
|
626
|
+
process.exit(1);
|
|
627
|
+
}
|
|
628
|
+
targets = [resolved];
|
|
576
629
|
}
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
installed.push(
|
|
580
|
-
}
|
|
581
|
-
if (target === 'codex' || target === 'all') {
|
|
582
|
-
const p = HarnessConfig.installCodex(cwd);
|
|
583
|
-
installed.push(`Codex -> ${p} (+ ~/.codex/config.toml)`);
|
|
630
|
+
const installed = [];
|
|
631
|
+
for (const id of targets) {
|
|
632
|
+
installed.push(installNotes[id](HarnessConfig.installHarness(cwd, id)));
|
|
584
633
|
}
|
|
585
634
|
console.log(`\nā Configured harness integration(s):\n - ${installed.join('\n - ')}`);
|
|
586
635
|
console.log(`\nš” Next step: Restart or reload your AI agent, then ask in chat:\n "List active VectorForce tasks and check workspace drift"`);
|
|
587
636
|
break;
|
|
588
637
|
}
|
|
589
638
|
|
|
639
|
+
if (sub === 'list' || sub === 'harnesses') {
|
|
640
|
+
const detected = new Set(HarnessConfig.detectHarnesses(cwd).map((h) => h.id));
|
|
641
|
+
console.log(`\nSupported AI harnesses (${cwd}):\n`);
|
|
642
|
+
for (const harness of HarnessConfig.getSupportedHarnesses()) {
|
|
643
|
+
const aliases = harness.aliases ? ` (aliases: ${harness.aliases.join(', ')})` : '';
|
|
644
|
+
const detectedMark = detected.has(harness.id) ? 'detected' : 'not detected';
|
|
645
|
+
const configuredMark = HarnessConfig.isHarnessConfigured(cwd, harness.id) ? 'configured' : 'not configured';
|
|
646
|
+
console.log(` ${harness.id}${aliases}: ${harness.label} [${detectedMark}] [${configuredMark}]`);
|
|
647
|
+
}
|
|
648
|
+
console.log('\nSetup one harness: vf config install <harness> (e.g. vf config install cursor)');
|
|
649
|
+
console.log('Setup all harnesses: vf config install all\n');
|
|
650
|
+
break;
|
|
651
|
+
}
|
|
652
|
+
|
|
590
653
|
if (sub === 'doctor' || sub === 'check') {
|
|
591
654
|
const checks = [
|
|
592
655
|
{ name: 'SQLite Database (.vectorforce/vectorforce.db)', ok: existsSync(getDbPath(cwd)), path: getDbPath(cwd) },
|
|
593
656
|
{ name: 'Agent Protocol Rules (AGENTS.md)', ok: existsSync(join(cwd, 'AGENTS.md')), path: join(cwd, 'AGENTS.md') },
|
|
594
|
-
{ name: 'Google Antigravity (.agents/mcp_config.json)', ok:
|
|
595
|
-
{ name: 'Claude Code & Command Code (.mcp.json)', ok:
|
|
596
|
-
{ name: 'Meta Muse (.muse/mcp_config.json)', ok:
|
|
597
|
-
{ name: 'OpenAI Codex (.codex/config.toml)', ok:
|
|
657
|
+
{ name: 'Google Antigravity (.agents/mcp_config.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'antigravity'), path: join(cwd, '.agents', 'mcp_config.json') },
|
|
658
|
+
{ name: 'Claude Code & Command Code (.mcp.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'command-code'), path: join(cwd, '.mcp.json') },
|
|
659
|
+
{ name: 'Meta Muse (.muse/mcp_config.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'muse'), path: join(cwd, '.muse', 'mcp_config.json') },
|
|
660
|
+
{ name: 'OpenAI Codex (.codex/config.toml)', ok: HarnessConfig.isHarnessConfigured(cwd, 'codex'), path: join(cwd, '.codex', 'config.toml') },
|
|
661
|
+
{ name: 'Cursor (.cursor/mcp.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'cursor'), path: join(cwd, '.cursor', 'mcp.json') },
|
|
662
|
+
{ name: 'Windsurf (.windsurf/mcp_config.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'windsurf'), path: join(cwd, '.windsurf', 'mcp_config.json') },
|
|
663
|
+
{ name: 'GitHub Copilot / VS Code (.vscode/mcp.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'copilot'), path: join(cwd, '.vscode', 'mcp.json') },
|
|
664
|
+
{ name: 'Kiro IDE (.kiro/settings/mcp.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'kiro'), path: join(cwd, '.kiro', 'settings', 'mcp.json') }
|
|
598
665
|
];
|
|
599
666
|
console.log(`\nVectorForce Workspace & MCP Health Check (${cwd}):\n`);
|
|
600
667
|
for (const c of checks) {
|
|
@@ -607,19 +674,22 @@ async function main() {
|
|
|
607
674
|
}
|
|
608
675
|
|
|
609
676
|
if (sub === 'uninstall' || sub === 'remove') {
|
|
610
|
-
const
|
|
611
|
-
const
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
677
|
+
const raw = (args[2] || 'all').toLowerCase();
|
|
678
|
+
const displayNames = { antigravity: 'Antigravity', 'command-code': 'Command Code', muse: 'Muse Code', codex: 'Codex', cursor: 'Cursor', windsurf: 'Windsurf', copilot: 'GitHub Copilot / VS Code', kiro: 'Kiro IDE' };
|
|
679
|
+
let targets = [];
|
|
680
|
+
if (raw === 'all') {
|
|
681
|
+
targets = HarnessConfig.getSupportedHarnesses().map((h) => h.id);
|
|
682
|
+
} else {
|
|
683
|
+
const resolved = HarnessConfig.resolveHarnessId(raw);
|
|
684
|
+
if (!resolved) {
|
|
685
|
+
console.error(`Unknown harness "${args[2]}". Run "vf config list" for supported values.`);
|
|
686
|
+
process.exit(1);
|
|
687
|
+
}
|
|
688
|
+
targets = [resolved];
|
|
620
689
|
}
|
|
621
|
-
|
|
622
|
-
|
|
690
|
+
const uninstalled = [];
|
|
691
|
+
for (const id of targets) {
|
|
692
|
+
if (HarnessConfig.uninstallHarness(cwd, id)) uninstalled.push(displayNames[id]);
|
|
623
693
|
}
|
|
624
694
|
console.log(`\nā Removed harness integration(s): ${uninstalled.length ? uninstalled.join(', ') : 'none found'}`);
|
|
625
695
|
break;
|
|
@@ -843,7 +913,7 @@ VectorForce Harness Configuration:
|
|
|
843
913
|
{
|
|
844
914
|
"mcpServers": {
|
|
845
915
|
"vectorforce": {
|
|
846
|
-
"command": "
|
|
916
|
+
"command": "${process.execPath}",
|
|
847
917
|
"args": ["${binPath}", "mcp"]
|
|
848
918
|
}
|
|
849
919
|
}
|
|
@@ -855,7 +925,7 @@ VectorForce Harness Configuration:
|
|
|
855
925
|
{
|
|
856
926
|
"mcpServers": {
|
|
857
927
|
"vectorforce": {
|
|
858
|
-
"command": "
|
|
928
|
+
"command": "${process.execPath}",
|
|
859
929
|
"args": ["${binPath}", "mcp"],
|
|
860
930
|
"env": { "VF_HARNESS": "muse-code" }
|
|
861
931
|
}
|
|
@@ -870,7 +940,7 @@ VectorForce Harness Configuration:
|
|
|
870
940
|
File: .codex/config.toml (or codex.json)
|
|
871
941
|
Content:
|
|
872
942
|
[mcp_servers.vectorforce]
|
|
873
|
-
command = "
|
|
943
|
+
command = "${process.execPath}"
|
|
874
944
|
args = ["${binPath}", "mcp"]
|
|
875
945
|
[mcp_servers.vectorforce.env]
|
|
876
946
|
VF_HARNESS = "codex"
|
|
@@ -907,6 +977,9 @@ VectorForce Harness Configuration:
|
|
|
907
977
|
VF_OPENROUTER_MODEL=deepseek/deepseek-v4.1-flash-1017 # default
|
|
908
978
|
|
|
909
979
|
Privacy: set VF_LLM_ALLOW_CODE=false (or run with --no-code) to keep source out of the prompt.
|
|
980
|
+
|
|
981
|
+
Harnesses: run "vf config list" to see detected/configured harnesses,
|
|
982
|
+
then "vf config install <harness|all>" to configure one or all of them.
|
|
910
983
|
`);
|
|
911
984
|
break;
|
|
912
985
|
}
|
|
@@ -947,9 +1020,15 @@ VectorForce Harness Configuration:
|
|
|
947
1020
|
const remoteProjectId = flags.project || remote.remoteProjectId || 'default';
|
|
948
1021
|
const project = projectService.getProjectForWorkspace(cwd);
|
|
949
1022
|
const tasks = store.listTasks(project.project_id);
|
|
950
|
-
const
|
|
1023
|
+
const rawHost = hostname();
|
|
1024
|
+
const machineId = flags.machine || (
|
|
1025
|
+
rawHost.toLowerCase().includes('lenovo') ? `Lenovo Laptop (${rawHost})` :
|
|
1026
|
+
rawHost.toLowerCase().includes('macbook') || process.platform === 'darwin' ? `MacBook Pro (${rawHost})` :
|
|
1027
|
+
`${rawHost} (${process.platform})`
|
|
1028
|
+
);
|
|
1029
|
+
const devIdentity = flags.dev || `${process.env.USER || 'developer'}`;
|
|
951
1030
|
|
|
952
|
-
console.log(`š Pushing local context (${project.name}) -> ${targetUrl} ...`);
|
|
1031
|
+
console.log(`š Pushing local context (${project.name}) -> ${targetUrl} [Machine: ${machineId}] ...`);
|
|
953
1032
|
|
|
954
1033
|
for (const t of tasks) {
|
|
955
1034
|
if (flags.task && t.task_id !== flags.task) continue;
|
|
@@ -963,8 +1042,8 @@ VectorForce Harness Configuration:
|
|
|
963
1042
|
projectId: remoteProjectId,
|
|
964
1043
|
taskId: t.task_id,
|
|
965
1044
|
title: t.title || t.task_id,
|
|
966
|
-
assignee:
|
|
967
|
-
role: `
|
|
1045
|
+
assignee: devIdentity,
|
|
1046
|
+
role: `Workspace (${basename(cwd)})`,
|
|
968
1047
|
priority: 'P0',
|
|
969
1048
|
machineId,
|
|
970
1049
|
harness: flags.harness || 'antigravity'
|
|
@@ -989,13 +1068,17 @@ VectorForce Harness Configuration:
|
|
|
989
1068
|
taskId: cp.task_id,
|
|
990
1069
|
senderMachineId: machineId,
|
|
991
1070
|
recipientMachineId: 'computer-2-meta-muse-cloud',
|
|
992
|
-
authorName: `${cp.author?.name ||
|
|
993
|
-
authorHarness: cp.author?.harness || 'antigravity',
|
|
1071
|
+
authorName: `${cp.author?.name || devIdentity} (${basename(cwd)})`,
|
|
1072
|
+
authorHarness: cp.author?.harness || flags.harness || 'antigravity',
|
|
994
1073
|
summary: cp.summary,
|
|
995
1074
|
goals: cp.claims?.goals || [],
|
|
996
1075
|
constraints: cp.claims?.constraints || [],
|
|
997
1076
|
decisions: cp.claims?.decisions || [],
|
|
998
|
-
nextSteps: cp.claims?.next_steps || []
|
|
1077
|
+
nextSteps: cp.claims?.next_steps || [],
|
|
1078
|
+
gitCommit: cp.evidence?.git?.commit || null,
|
|
1079
|
+
gitBranch: cp.evidence?.git?.branch || 'main',
|
|
1080
|
+
gitDirty: cp.evidence?.git?.dirty !== undefined ? Boolean(cp.evidence.git.dirty) : false,
|
|
1081
|
+
documents: (cp.evidence?.documents || []).map((d) => d.path)
|
|
999
1082
|
})
|
|
1000
1083
|
});
|
|
1001
1084
|
lastResp = await res.json();
|
|
@@ -1098,10 +1181,14 @@ VectorForce Harness Configuration:
|
|
|
1098
1181
|
const checks = [
|
|
1099
1182
|
{ name: 'SQLite Database (.vectorforce/vectorforce.db)', ok: existsSync(getDbPath(cwd)) },
|
|
1100
1183
|
{ name: 'Agent Protocol Rules (AGENTS.md)', ok: existsSync(join(cwd, 'AGENTS.md')) },
|
|
1101
|
-
{ name: 'Google Antigravity (.agents/mcp_config.json)', ok:
|
|
1102
|
-
{ name: 'Claude Code & Command Code (.mcp.json)', ok:
|
|
1103
|
-
{ name: 'Meta Muse (.muse/mcp_config.json or musecode.json)', ok:
|
|
1104
|
-
{ name: 'OpenAI Codex (.codex/config.toml)', ok:
|
|
1184
|
+
{ name: 'Google Antigravity (.agents/mcp_config.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'antigravity') },
|
|
1185
|
+
{ name: 'Claude Code & Command Code (.mcp.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'command-code') },
|
|
1186
|
+
{ name: 'Meta Muse (.muse/mcp_config.json or musecode.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'muse') },
|
|
1187
|
+
{ name: 'OpenAI Codex (.codex/config.toml)', ok: HarnessConfig.isHarnessConfigured(cwd, 'codex') },
|
|
1188
|
+
{ name: 'Cursor (.cursor/mcp.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'cursor') },
|
|
1189
|
+
{ name: 'Windsurf (.windsurf/mcp_config.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'windsurf') },
|
|
1190
|
+
{ name: 'GitHub Copilot / VS Code (.vscode/mcp.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'copilot') },
|
|
1191
|
+
{ name: 'Kiro IDE (.kiro/settings/mcp.json)', ok: HarnessConfig.isHarnessConfigured(cwd, 'kiro') }
|
|
1105
1192
|
];
|
|
1106
1193
|
console.log(`\nVectorForce Workspace & MCP Status (${cwd}):\n`);
|
|
1107
1194
|
for (const c of checks) {
|
|
@@ -1109,7 +1196,7 @@ VectorForce Harness Configuration:
|
|
|
1109
1196
|
}
|
|
1110
1197
|
console.log(`\nš” How it works:`);
|
|
1111
1198
|
console.log(` 1. You do NOT need to run "vf mcp" manually.`);
|
|
1112
|
-
console.log(` 2. Your AI agent (Antigravity, Claude Code, Command Code, Muse, Codex) reads its config file above and automatically spawns "vf mcp" over stdio.`);
|
|
1199
|
+
console.log(` 2. Your AI agent (Antigravity, Claude Code, Command Code, Muse, Codex, Cursor, Windsurf, Copilot, Kiro) reads its config file above and automatically spawns "vf mcp" over stdio.`);
|
|
1113
1200
|
console.log(` 3. To verify in your AI chat, ask: "List active VectorForce tasks and check workspace drift"\n`);
|
|
1114
1201
|
break;
|
|
1115
1202
|
}
|