@revealui/harnesses 0.1.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.
@@ -0,0 +1,305 @@
1
+ import { WorkboardManager } from './workboard/index.js';
2
+ export { ConflictResult, SessionType, WorkboardEntry, WorkboardSession, WorkboardState, deriveSessionId, detectSessionType } from './workboard/index.js';
3
+
4
+ /**
5
+ * Core types for the AI harness integration system.
6
+ * Mirrors packages/editors/src/types/core.ts for the harness domain.
7
+ */
8
+ interface HarnessCapabilities {
9
+ /** Can generate code from a prompt */
10
+ generateCode: boolean;
11
+ /** Can analyze/explain existing code */
12
+ analyzeCode: boolean;
13
+ /** Can apply inline code edits */
14
+ applyEdit: boolean;
15
+ /** Can sync configuration files */
16
+ applyConfig: boolean;
17
+ /** Can query workboard state */
18
+ readWorkboard: boolean;
19
+ /** Can write workboard state */
20
+ writeWorkboard: boolean;
21
+ }
22
+ type ConfigSyncDirection = 'push' | 'pull';
23
+ type HarnessCommand = {
24
+ type: 'generate-code';
25
+ prompt: string;
26
+ context?: string;
27
+ language?: string;
28
+ } | {
29
+ type: 'analyze-code';
30
+ filePath: string;
31
+ question?: string;
32
+ } | {
33
+ type: 'apply-edit';
34
+ filePath: string;
35
+ diff: string;
36
+ } | {
37
+ type: 'apply-config';
38
+ configPath: string;
39
+ content: string;
40
+ } | {
41
+ type: 'get-status';
42
+ } | {
43
+ type: 'get-running-instances';
44
+ } | {
45
+ type: 'sync-config';
46
+ direction: ConfigSyncDirection;
47
+ } | {
48
+ type: 'diff-config';
49
+ } | {
50
+ type: 'read-workboard';
51
+ } | {
52
+ type: 'update-workboard';
53
+ sessionId: string;
54
+ task?: string;
55
+ files?: string[];
56
+ };
57
+ interface HarnessCommandResult {
58
+ success: boolean;
59
+ command: HarnessCommand['type'];
60
+ message?: string;
61
+ data?: unknown;
62
+ }
63
+ type HarnessEvent = {
64
+ type: 'harness-connected';
65
+ harnessId: string;
66
+ } | {
67
+ type: 'harness-disconnected';
68
+ harnessId: string;
69
+ } | {
70
+ type: 'generation-started';
71
+ taskId: string;
72
+ } | {
73
+ type: 'generation-completed';
74
+ taskId: string;
75
+ output: string;
76
+ } | {
77
+ type: 'error';
78
+ harnessId: string;
79
+ message: string;
80
+ };
81
+ interface HarnessInfo {
82
+ id: string;
83
+ name: string;
84
+ version?: string;
85
+ capabilities: HarnessCapabilities;
86
+ }
87
+ interface HarnessProcessInfo {
88
+ pid: number;
89
+ command: string;
90
+ harnessId: string;
91
+ }
92
+ interface ConfigSyncResult {
93
+ success: boolean;
94
+ harnessId: string;
95
+ direction: ConfigSyncDirection;
96
+ message?: string;
97
+ }
98
+ interface ConfigDiffEntry {
99
+ harnessId: string;
100
+ localExists: boolean;
101
+ ssdExists: boolean;
102
+ identical: boolean;
103
+ }
104
+
105
+ /**
106
+ * Contract every AI harness adapter must satisfy.
107
+ * Mirrors EditorAdapter from packages/editors.
108
+ *
109
+ * AI tools are external executables — never linked libraries.
110
+ * Communication is data-only: commands in, results out.
111
+ */
112
+ interface HarnessAdapter {
113
+ /** Unique stable identifier, e.g. "claude-code", "cursor", "copilot" */
114
+ readonly id: string;
115
+ /** Human-readable display name */
116
+ readonly name: string;
117
+ /** Returns the static capability set for this harness */
118
+ getCapabilities(): HarnessCapabilities;
119
+ /** Returns live info (version, etc.) — may shell out */
120
+ getInfo(): Promise<HarnessInfo>;
121
+ /** True if the harness executable is on PATH and accessible */
122
+ isAvailable(): Promise<boolean>;
123
+ /** Execute a typed command against this harness */
124
+ execute(command: HarnessCommand): Promise<HarnessCommandResult>;
125
+ /** Subscribe to harness events; returns an unsubscribe function */
126
+ onEvent(handler: (event: HarnessEvent) => void): () => void;
127
+ /** Release all resources held by this adapter */
128
+ dispose(): Promise<void>;
129
+ }
130
+
131
+ /**
132
+ * Adapter for Anthropic Claude Code (CLI: `claude`).
133
+ *
134
+ * Claude Code communicates via its CLI. Config lives at
135
+ * ~/.claude/settings.json and project-level .claude/settings.json.
136
+ * MCP integration is handled separately by @revealui/mcp.
137
+ *
138
+ * Workboard read/write requires REVEALUI_WORKBOARD_PATH to be set to the
139
+ * absolute path of the workboard.md file.
140
+ */
141
+ declare class ClaudeCodeAdapter implements HarnessAdapter {
142
+ readonly id = "claude-code";
143
+ readonly name = "Claude Code";
144
+ private readonly eventHandlers;
145
+ private readonly workboardPath;
146
+ constructor(workboardPath?: string);
147
+ getCapabilities(): HarnessCapabilities;
148
+ getInfo(): Promise<HarnessInfo>;
149
+ isAvailable(): Promise<boolean>;
150
+ execute(command: HarnessCommand): Promise<HarnessCommandResult>;
151
+ onEvent(handler: (event: HarnessEvent) => void): () => void;
152
+ dispose(): Promise<void>;
153
+ }
154
+
155
+ /**
156
+ * Stub adapter for GitHub Copilot.
157
+ *
158
+ * Copilot has no standalone CLI — it runs as a VS Code extension.
159
+ * This adapter is a stub for future integration once Copilot exposes
160
+ * a programmatic interface.
161
+ */
162
+ declare class CopilotAdapter implements HarnessAdapter {
163
+ readonly id = "copilot";
164
+ readonly name = "GitHub Copilot";
165
+ private readonly eventHandlers;
166
+ getCapabilities(): HarnessCapabilities;
167
+ getInfo(): Promise<HarnessInfo>;
168
+ isAvailable(): Promise<boolean>;
169
+ execute(command: HarnessCommand): Promise<HarnessCommandResult>;
170
+ onEvent(handler: (event: HarnessEvent) => void): () => void;
171
+ dispose(): Promise<void>;
172
+ }
173
+
174
+ /**
175
+ * Syncs harness config between local filesystem and SSD backup.
176
+ * Mirrors config-sync.ts from packages/editors.
177
+ */
178
+ declare function syncConfig(harnessId: string, direction: ConfigSyncDirection, ssdBase?: string): ConfigSyncResult;
179
+ /** Compares local vs SSD config for a harness. */
180
+ declare function diffConfig(harnessId: string, ssdBase?: string): ConfigDiffEntry;
181
+
182
+ /** Returns the local config file path for a given harness id, or undefined if unknown. */
183
+ declare function getLocalConfigPath(harnessId: string): string | undefined;
184
+ /** Returns the SSD config file path for a given harness id, or undefined if unknown. */
185
+ declare function getSsdConfigPath(harnessId: string, ssdBase?: string): string | undefined;
186
+ /** Returns ids of all harnesses with known config paths. */
187
+ declare function getConfigurableHarnesses(): string[];
188
+
189
+ /**
190
+ * Manages the lifecycle of HarnessAdapter instances.
191
+ * Mirrors EditorRegistry from packages/editors.
192
+ */
193
+ declare class HarnessRegistry {
194
+ private readonly adapters;
195
+ /** Register an adapter. Throws if an adapter with the same id already exists. */
196
+ register(adapter: HarnessAdapter): void;
197
+ /** Unregister an adapter, disposing it in the process. */
198
+ unregister(id: string): Promise<void>;
199
+ /** Retrieve an adapter by id. */
200
+ get(id: string): HarnessAdapter | undefined;
201
+ /** List all registered adapter ids. */
202
+ listAll(): string[];
203
+ /** List ids of adapters that report isAvailable() === true. */
204
+ listAvailable(): Promise<string[]>;
205
+ /** Dispose all adapters and clear the registry. */
206
+ disposeAll(): Promise<void>;
207
+ }
208
+
209
+ interface CoordinatorOptions {
210
+ /** Absolute path to the project root (where .claude/workboard.md lives) */
211
+ projectRoot: string;
212
+ /** Unix socket path for the RPC server */
213
+ socketPath?: string;
214
+ /** Session task description shown in the workboard */
215
+ task?: string;
216
+ }
217
+ /**
218
+ * HarnessCoordinator — single entry point for harness-to-harness coordination.
219
+ *
220
+ * On start:
221
+ * 1. Auto-detects installed AI harnesses and registers them
222
+ * 2. Registers this session in the workboard
223
+ * 3. Starts the RPC server
224
+ *
225
+ * On stop:
226
+ * 1. Unregisters this session from the workboard
227
+ * 2. Stops the RPC server
228
+ * 3. Disposes all adapters
229
+ */
230
+ declare class HarnessCoordinator {
231
+ private readonly options;
232
+ private readonly registry;
233
+ private rpcServer;
234
+ private sessionId;
235
+ private readonly workboard;
236
+ constructor(options: CoordinatorOptions);
237
+ start(): Promise<void>;
238
+ stop(): Promise<void>;
239
+ /** The registry of detected harnesses. Available after start(). */
240
+ getRegistry(): HarnessRegistry;
241
+ /** The workboard manager. */
242
+ getWorkboard(): WorkboardManager;
243
+ /** Register a custom adapter (must be called before start()). */
244
+ registerAdapter(adapter: HarnessAdapter): void;
245
+ }
246
+
247
+ /**
248
+ * Detects available AI harnesses and registers them in the registry.
249
+ * Mirrors autoDetectEditors from packages/editors.
250
+ *
251
+ * Creates an adapter for each known harness, checks isAvailable(),
252
+ * and registers those that respond. Unavailable adapters are disposed.
253
+ */
254
+ declare function autoDetectHarnesses(registry: HarnessRegistry): Promise<string[]>;
255
+
256
+ /** Finds running processes matching a pattern using pgrep. */
257
+ declare function findProcesses(pattern: string): Promise<{
258
+ pid: number;
259
+ command: string;
260
+ }[]>;
261
+ /** Finds running process instances for a specific harness. */
262
+ declare function findHarnessProcesses(harnessId: string): Promise<HarnessProcessInfo[]>;
263
+ /** Finds running processes for all known harnesses. */
264
+ declare function findAllHarnessProcesses(): Promise<HarnessProcessInfo[]>;
265
+ /** Finds Claude Code Unix socket files (used for IPC). */
266
+ declare function findClaudeCodeSockets(): Promise<string[]>;
267
+
268
+ /**
269
+ * JSON-RPC 2.0 server over a Unix domain socket.
270
+ * Mirrors RpcServer from packages/editors.
271
+ *
272
+ * Methods:
273
+ * harness.list → HarnessInfo[]
274
+ * harness.execute → HarnessCommandResult
275
+ * harness.info → HarnessInfo
276
+ * harness.listRunning → HarnessProcessInfo[]
277
+ * harness.syncConfig → ConfigSyncResult
278
+ * harness.diffConfig → ConfigDiffEntry
279
+ */
280
+ declare class RpcServer {
281
+ private readonly registry;
282
+ private readonly socketPath;
283
+ private server;
284
+ constructor(registry: HarnessRegistry, socketPath: string);
285
+ private handleLine;
286
+ private dispatch;
287
+ start(): Promise<void>;
288
+ stop(): Promise<void>;
289
+ }
290
+
291
+ /**
292
+ * @revealui/harnesses — AI Harness Integration System (Server-side)
293
+ *
294
+ * Adapters, registry, workboard coordination, and JSON-RPC server for
295
+ * integrating AI coding tools (Claude Code, Cursor, Copilot) into the
296
+ * RevealUI development workflow.
297
+ *
298
+ * Pro tier feature: gated behind isFeatureEnabled("harnesses").
299
+ *
300
+ * @packageDocumentation
301
+ */
302
+ /** Check whether the harnesses feature is licensed for this installation. */
303
+ declare function checkHarnessesLicense(): Promise<boolean>;
304
+
305
+ export { ClaudeCodeAdapter, type ConfigDiffEntry, type ConfigSyncDirection, type ConfigSyncResult, type CoordinatorOptions, CopilotAdapter, type HarnessAdapter, type HarnessCapabilities, type HarnessCommand, type HarnessCommandResult, HarnessCoordinator, type HarnessEvent, type HarnessInfo, type HarnessProcessInfo, HarnessRegistry, RpcServer, WorkboardManager, autoDetectHarnesses, checkHarnessesLicense, diffConfig, findAllHarnessProcesses, findClaudeCodeSockets, findHarnessProcesses, findProcesses, getConfigurableHarnesses, getLocalConfigPath, getSsdConfigPath, syncConfig };
package/dist/index.js ADDED
@@ -0,0 +1,61 @@
1
+ import {
2
+ ClaudeCodeAdapter,
3
+ CopilotAdapter,
4
+ HarnessCoordinator,
5
+ HarnessRegistry,
6
+ RpcServer,
7
+ autoDetectHarnesses,
8
+ diffConfig,
9
+ findAllHarnessProcesses,
10
+ findClaudeCodeSockets,
11
+ findHarnessProcesses,
12
+ findProcesses,
13
+ getConfigurableHarnesses,
14
+ getLocalConfigPath,
15
+ getSsdConfigPath,
16
+ syncConfig
17
+ } from "./chunk-BDA7D725.js";
18
+ import "./chunk-JUNNIQS3.js";
19
+ import {
20
+ WorkboardManager,
21
+ deriveSessionId,
22
+ detectSessionType
23
+ } from "./chunk-PG4RAOWS.js";
24
+
25
+ // src/index.ts
26
+ import { isFeatureEnabled } from "@revealui/core/features";
27
+ import { initializeLicense } from "@revealui/core/license";
28
+ import { logger } from "@revealui/core/observability/logger";
29
+ async function checkHarnessesLicense() {
30
+ await initializeLicense();
31
+ if (!isFeatureEnabled("harnesses")) {
32
+ logger.warn(
33
+ "[@revealui/harnesses] AI harness integration requires a Pro or Enterprise license. Visit https://revealui.com/pricing for details.",
34
+ { feature: "harnesses" }
35
+ );
36
+ return false;
37
+ }
38
+ return true;
39
+ }
40
+ export {
41
+ ClaudeCodeAdapter,
42
+ CopilotAdapter,
43
+ HarnessCoordinator,
44
+ HarnessRegistry,
45
+ RpcServer,
46
+ WorkboardManager,
47
+ autoDetectHarnesses,
48
+ checkHarnessesLicense,
49
+ deriveSessionId,
50
+ detectSessionType,
51
+ diffConfig,
52
+ findAllHarnessProcesses,
53
+ findClaudeCodeSockets,
54
+ findHarnessProcesses,
55
+ findProcesses,
56
+ getConfigurableHarnesses,
57
+ getLocalConfigPath,
58
+ getSsdConfigPath,
59
+ syncConfig
60
+ };
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @revealui/harnesses — AI Harness Integration System (Server-side)\n *\n * Adapters, registry, workboard coordination, and JSON-RPC server for\n * integrating AI coding tools (Claude Code, Cursor, Copilot) into the\n * RevealUI development workflow.\n *\n * Pro tier feature: gated behind isFeatureEnabled(\"harnesses\").\n *\n * @packageDocumentation\n */\n\nimport { isFeatureEnabled } from '@revealui/core/features'\nimport { initializeLicense } from '@revealui/core/license'\nimport { logger } from '@revealui/core/observability/logger'\n\n/** Check whether the harnesses feature is licensed for this installation. */\nexport async function checkHarnessesLicense(): Promise<boolean> {\n await initializeLicense()\n if (!isFeatureEnabled('harnesses')) {\n logger.warn(\n '[@revealui/harnesses] AI harness integration requires a Pro or Enterprise license. ' +\n 'Visit https://revealui.com/pricing for details.',\n { feature: 'harnesses' },\n )\n return false\n }\n return true\n}\n\n// Adapters\nexport { ClaudeCodeAdapter } from './adapters/claude-code-adapter.js'\nexport { CopilotAdapter } from './adapters/copilot-adapter.js'\n\n// Config\nexport { diffConfig, syncConfig } from './config/config-sync.js'\nexport {\n getConfigurableHarnesses,\n getLocalConfigPath,\n getSsdConfigPath,\n} from './config/harness-config-paths.js'\nexport type { CoordinatorOptions } from './coordinator.js'\n// Coordinator\nexport { HarnessCoordinator } from './coordinator.js'\n\n// Detection\nexport { autoDetectHarnesses } from './detection/auto-detector.js'\nexport {\n findAllHarnessProcesses,\n findClaudeCodeSockets,\n findHarnessProcesses,\n findProcesses,\n} from './detection/process-detector.js'\n\n// Registry\nexport { HarnessRegistry } from './registry/harness-registry.js'\n\n// Server\nexport { RpcServer } from './server/rpc-server.js'\nexport type { HarnessAdapter } from './types/adapter.js'\n\n// Types — harness core\nexport type {\n ConfigDiffEntry,\n ConfigSyncDirection,\n ConfigSyncResult,\n HarnessCapabilities,\n HarnessCommand,\n HarnessCommandResult,\n HarnessEvent,\n HarnessInfo,\n HarnessProcessInfo,\n} from './types/core.js'\n// Workboard\nexport {\n deriveSessionId,\n detectSessionType,\n WorkboardManager,\n} from './workboard/index.js'\n// Types — session identity\nexport type { SessionType } from './workboard/session-identity.js'\n// Types — workboard protocol\nexport type {\n ConflictResult,\n WorkboardEntry,\n WorkboardSession,\n WorkboardState,\n} from './workboard/workboard-protocol.js'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAYA,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAClC,SAAS,cAAc;AAGvB,eAAsB,wBAA0C;AAC9D,QAAM,kBAAkB;AACxB,MAAI,CAAC,iBAAiB,WAAW,GAAG;AAClC,WAAO;AAAA,MACL;AAAA,MAEA,EAAE,SAAS,YAAY;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;","names":[]}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * WorkboardProtocol — types for the multi-agent coordination workboard.
3
+ *
4
+ * The workboard (.claude/workboard.md) is the shared coordination primitive
5
+ * that lets multiple AI coding agents (Claude Code, Cursor, etc.) work safely
6
+ * in parallel on the same codebase without stepping on each other.
7
+ *
8
+ * This module defines machine-readable types for parsing and writing the
9
+ * workboard's markdown structure programmatically.
10
+ */
11
+ /** A row in the ## Sessions table. */
12
+ interface WorkboardSession {
13
+ /** Unique session identifier, e.g. "zed-1", "terminal-2", "cursor-1" */
14
+ id: string;
15
+ /** Human-readable environment description, e.g. "Zed/ACP", "WSL/bash" */
16
+ env: string;
17
+ /** ISO timestamp of when the session registered */
18
+ started: string;
19
+ /** Current task description */
20
+ task: string;
21
+ /** Comma-separated list of file globs this session is actively modifying */
22
+ files: string;
23
+ /** ISO timestamp of last workboard update */
24
+ updated: string;
25
+ }
26
+ /** A timestamped entry in the ## Recent section. */
27
+ interface WorkboardEntry {
28
+ /** ISO-derived display timestamp "[YYYY-MM-DD HH:MM]" */
29
+ timestamp: string;
30
+ /** Session id that produced this entry */
31
+ sessionId: string;
32
+ /** Free-form description of what was accomplished */
33
+ description: string;
34
+ }
35
+ /** Full parsed workboard state. */
36
+ interface WorkboardState {
37
+ sessions: WorkboardSession[];
38
+ recent: WorkboardEntry[];
39
+ /** Freeform markdown content of the ## Plans section */
40
+ plans: string;
41
+ /** Freeform markdown content of the ## Context section */
42
+ context: string;
43
+ /** Freeform markdown content of the ## Plan Reference section */
44
+ planReference: string;
45
+ }
46
+ /** Result of a conflict detection check. */
47
+ interface ConflictResult {
48
+ /** True if no conflicting file reservations were found */
49
+ clean: boolean;
50
+ /** Sessions with overlapping file claims */
51
+ conflicts: Array<{
52
+ thisSession: string;
53
+ otherSession: string;
54
+ overlappingFiles: string[];
55
+ }>;
56
+ }
57
+
58
+ /**
59
+ * WorkboardManager — reads, parses, and writes .claude/workboard.md.
60
+ *
61
+ * The workboard is a markdown file with a specific structure:
62
+ * ## Sessions — markdown table
63
+ * ## Plans — freeform markdown
64
+ * ## Recent — bullet list
65
+ * ## Context — freeform markdown
66
+ * ## Plan Reference — freeform markdown
67
+ *
68
+ * This class provides programmatic access to the Sessions table and Recent list.
69
+ * Plans, Context, and Plan Reference are treated as opaque strings.
70
+ */
71
+ declare class WorkboardManager {
72
+ private readonly workboardPath;
73
+ constructor(workboardPath: string);
74
+ /** Read and parse the workboard. */
75
+ read(): WorkboardState;
76
+ /** Write a workboard state back to disk. */
77
+ write(state: WorkboardState): void;
78
+ /** Read and parse the workboard asynchronously. */
79
+ readAsync(): Promise<WorkboardState>;
80
+ /** Write a workboard state back to disk asynchronously. */
81
+ writeAsync(state: WorkboardState): Promise<void>;
82
+ /** Register a new session, replacing any existing row with the same id. */
83
+ registerSession(session: WorkboardSession): void;
84
+ /** Remove a session row by id. */
85
+ unregisterSession(id: string): void;
86
+ /** Update specific fields of an existing session row. */
87
+ updateSession(id: string, updates: Partial<WorkboardSession>): void;
88
+ /** Update a session's files list and timestamp. */
89
+ claimFiles(id: string, files: string[]): void;
90
+ /** Clear a session's file reservations. */
91
+ releaseFiles(id: string): void;
92
+ /** Prepend a timestamped entry to the ## Recent section (keeps last 20). */
93
+ addRecentEntry(entry: WorkboardEntry): void;
94
+ /** Returns sessions whose `updated` timestamp is older than 4 hours. */
95
+ detectStale(): WorkboardSession[];
96
+ /**
97
+ * Check whether the given files conflict with any other active session's reservations.
98
+ * Returns a ConflictResult describing any overlaps found.
99
+ */
100
+ checkConflicts(mySessionId: string, files: string[]): ConflictResult;
101
+ }
102
+
103
+ /** Type of session detected from the runtime environment. */
104
+ type SessionType = 'zed' | 'cursor' | 'terminal';
105
+ /**
106
+ * Detects whether the current process is running inside an AI tool (Zed, Cursor)
107
+ * or a plain terminal session by walking the parent process chain.
108
+ *
109
+ * Uses /proc/<pid>/cmdline on Linux/WSL. Falls back to TERM_PROGRAM env var.
110
+ */
111
+ declare function detectSessionType(): SessionType;
112
+ /**
113
+ * Derives a session ID (e.g. "zed-1", "terminal-2") given a type and a list
114
+ * of existing session IDs already in the workboard.
115
+ *
116
+ * Picks the next available numeric suffix to avoid collisions.
117
+ */
118
+ declare function deriveSessionId(type: SessionType, existingIds: string[]): string;
119
+
120
+ export { type ConflictResult, type SessionType, type WorkboardEntry, WorkboardManager, type WorkboardSession, type WorkboardState, deriveSessionId, detectSessionType };
@@ -0,0 +1,12 @@
1
+ import "../chunk-JUNNIQS3.js";
2
+ import {
3
+ WorkboardManager,
4
+ deriveSessionId,
5
+ detectSessionType
6
+ } from "../chunk-PG4RAOWS.js";
7
+ export {
8
+ WorkboardManager,
9
+ deriveSessionId,
10
+ detectSessionType
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@revealui/harnesses",
3
+ "version": "0.1.0",
4
+ "description": "AI harness integration system - adapters, daemon, workboard coordination, and JSON-RPC server",
5
+ "license": "SEE LICENSE IN ../../LICENSE.commercial",
6
+ "type": "module",
7
+ "bin": {
8
+ "revealui-harnesses": "./dist/cli.js"
9
+ },
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ },
15
+ "./types": {
16
+ "types": "./dist/types/index.d.ts",
17
+ "import": "./dist/types/index.js"
18
+ },
19
+ "./workboard": {
20
+ "types": "./dist/workboard/index.d.ts",
21
+ "import": "./dist/workboard/index.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "dependencies": {
28
+ "@revealui/core": "0.2.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "^25.3.0",
32
+ "tsup": "^8.5.1",
33
+ "typescript": "^5.9.3",
34
+ "vitest": "^4.0.18",
35
+ "dev": "0.0.1"
36
+ },
37
+ "publishConfig": {
38
+ "registry": "https://registry.npmjs.org",
39
+ "access": "public"
40
+ },
41
+ "scripts": {
42
+ "build": "tsup",
43
+ "dev": "tsup --watch",
44
+ "start": "node dist/cli.js",
45
+ "typecheck": "tsc --noEmit",
46
+ "test": "vitest run --passWithNoTests",
47
+ "test:coverage": "vitest run --coverage",
48
+ "test:watch": "vitest",
49
+ "lint": "biome check .",
50
+ "lint:fix": "biome check --write .",
51
+ "clean": "rm -rf dist"
52
+ }
53
+ }