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 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 **OpenAI Codex**.
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`)** | `.muse/mcp_config.json` & `~/.config/muse/settings.json` | `node bin/vf.js config install 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] Initialize current workspace
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 Display MCP configuration snippet for harnesses
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
- flags.harness = args[++i];
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
- HarnessConfig.installAntigravity(cwd);
334
- HarnessConfig.installCommandCode(cwd);
335
- HarnessConfig.installMuseCode(cwd);
336
- HarnessConfig.installCodex(cwd);
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 OpenAI Codex.\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`,
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 target = (args[2] || 'all').toLowerCase();
568
- const installed = [];
569
- if (target === 'antigravity' || target === 'all') {
570
- const p = HarnessConfig.installAntigravity(cwd);
571
- installed.push(`Google Antigravity -> ${p} (+ ~/.gemini/antigravity/mcp_config.json)`);
572
- }
573
- if (target === 'command-code' || target === 'cmd' || target === 'claude' || target === 'claude-code' || target === 'all') {
574
- const p = HarnessConfig.installCommandCode(cwd);
575
- installed.push(`Command Code / Claude Code -> .mcp.json & ${p}`);
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
- if (target === 'muse' || target === 'muse-code' || target === 'all') {
578
- const p = HarnessConfig.installMuseCode(cwd);
579
- installed.push(`Meta Muse -> ${p} (+ ~/.config/muse/settings.json)`);
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: existsSync(join(cwd, '.agents', 'mcp_config.json')), path: join(cwd, '.agents', 'mcp_config.json') },
595
- { name: 'Claude Code & Command Code (.mcp.json)', ok: existsSync(join(cwd, '.mcp.json')), path: join(cwd, '.mcp.json') },
596
- { name: 'Meta Muse (.muse/mcp_config.json)', ok: existsSync(join(cwd, '.muse', 'mcp_config.json')), path: join(cwd, '.muse', 'mcp_config.json') },
597
- { name: 'OpenAI Codex (.codex/config.toml)', ok: existsSync(join(cwd, '.codex', 'config.toml')), path: join(cwd, '.codex', 'config.toml') }
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 target = (args[2] || 'all').toLowerCase();
611
- const uninstalled = [];
612
- if (target === 'antigravity' || target === 'all') {
613
- if (HarnessConfig.uninstallAntigravity(cwd)) uninstalled.push('Antigravity');
614
- }
615
- if (target === 'command-code' || target === 'cmd' || target === 'all') {
616
- if (HarnessConfig.uninstallCommandCode(cwd)) uninstalled.push('Command Code');
617
- }
618
- if (target === 'muse' || target === 'muse-code' || target === 'all') {
619
- if (HarnessConfig.uninstallMuseCode(cwd)) uninstalled.push('Muse Code');
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
- if (target === 'codex' || target === 'all') {
622
- if (HarnessConfig.uninstallCodex(cwd)) uninstalled.push('Codex');
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": "node",
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": "node",
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 = "node"
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 machineId = `${hostname()}-local`;
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: `${process.env.USER || 'developer'}@local-mac`,
967
- role: `Local Workspace (${basename(cwd)})`,
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 || process.env.USER || 'developer'} (${basename(cwd)})`,
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: existsSync(join(cwd, '.agents', 'mcp_config.json')) },
1102
- { name: 'Claude Code & Command Code (.mcp.json)', ok: existsSync(join(cwd, '.mcp.json')) },
1103
- { name: 'Meta Muse (.muse/mcp_config.json or musecode.json)', ok: existsSync(join(cwd, '.muse', 'mcp_config.json')) || existsSync(join(cwd, 'musecode.json')) },
1104
- { name: 'OpenAI Codex (.codex/config.toml)', ok: existsSync(join(cwd, '.codex', 'config.toml')) }
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vectorforce",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Portable engineering context platform - Git for AI context",
5
5
  "type": "module",
6
6
  "main": "src/index.js",