@invariant-ai/cli 0.1.0 → 0.1.2

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,7 @@
1
+ export declare function mcpInstallCommand(options: {
2
+ global?: boolean;
3
+ }): Promise<void>;
4
+ export declare function mcpUninstallCommand(options: {
5
+ global?: boolean;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAqFA,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CpF;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBtF"}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.mcpInstallCommand = mcpInstallCommand;
7
+ exports.mcpUninstallCommand = mcpUninstallCommand;
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const MCP_SERVER_NAME = 'invariant';
12
+ /**
13
+ * Resolves the version of @invariant-ai/mcp by reading its package.json.
14
+ * Works in both monorepo dev and published node_modules contexts.
15
+ */
16
+ function resolveMcpVersion() {
17
+ // In monorepo: __dirname is packages/cli/dist/commands → go up to packages/mcp/
18
+ const monorepoPath = (0, node_path_1.resolve)(__dirname, '..', '..', '..', 'mcp', 'package.json');
19
+ if ((0, node_fs_1.existsSync)(monorepoPath)) {
20
+ try {
21
+ const pkg = JSON.parse((0, node_fs_1.readFileSync)(monorepoPath, 'utf-8'));
22
+ if (pkg.version)
23
+ return pkg.version;
24
+ }
25
+ catch { /* fall through */ }
26
+ }
27
+ // Published: try require.resolve
28
+ try {
29
+ const mcpPkgPath = require.resolve('@invariant-ai/mcp/package.json');
30
+ const pkg = JSON.parse((0, node_fs_1.readFileSync)(mcpPkgPath, 'utf-8'));
31
+ if (pkg.version)
32
+ return pkg.version;
33
+ }
34
+ catch { /* fall through */ }
35
+ return '0.1.0'; // fallback
36
+ }
37
+ /**
38
+ * Determines the config file path for MCP server registration.
39
+ * Order: project .claude/settings.json → ~/.claude/settings.json → ~/.claude.json
40
+ */
41
+ function resolveConfigPath(globalFlag) {
42
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? '';
43
+ if (!globalFlag) {
44
+ // Check for project-local .claude/ directory
45
+ const projectConfig = (0, node_path_1.resolve)(process.cwd(), '.claude', 'settings.json');
46
+ const projectClaudeDir = (0, node_path_1.resolve)(process.cwd(), '.claude');
47
+ if ((0, node_fs_1.existsSync)(projectClaudeDir)) {
48
+ return projectConfig;
49
+ }
50
+ }
51
+ // User-level: prefer ~/.claude/settings.json
52
+ const userClaudeDir = (0, node_path_1.resolve)(home, '.claude');
53
+ const userSettings = (0, node_path_1.resolve)(userClaudeDir, 'settings.json');
54
+ if ((0, node_fs_1.existsSync)(userClaudeDir)) {
55
+ return userSettings;
56
+ }
57
+ // Fallback: ~/.claude.json
58
+ const legacyConfig = (0, node_path_1.resolve)(home, '.claude.json');
59
+ if ((0, node_fs_1.existsSync)(legacyConfig)) {
60
+ return legacyConfig;
61
+ }
62
+ // Default to ~/.claude/settings.json (will create)
63
+ return userSettings;
64
+ }
65
+ function readConfig(path) {
66
+ if (!(0, node_fs_1.existsSync)(path))
67
+ return {};
68
+ try {
69
+ return JSON.parse((0, node_fs_1.readFileSync)(path, 'utf-8'));
70
+ }
71
+ catch {
72
+ return {};
73
+ }
74
+ }
75
+ function writeConfig(path, config) {
76
+ const dir = (0, node_path_1.dirname)(path);
77
+ if (!(0, node_fs_1.existsSync)(dir)) {
78
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
79
+ }
80
+ (0, node_fs_1.writeFileSync)(path, JSON.stringify(config, null, 2) + '\n', 'utf-8');
81
+ }
82
+ async function mcpInstallCommand(options) {
83
+ const configPath = resolveConfigPath(options.global ?? false);
84
+ const config = readConfig(configPath);
85
+ const version = await resolveMcpVersion();
86
+ const serverEntry = {
87
+ command: 'npx',
88
+ args: ['-y', `@invariant-ai/mcp@${version}`],
89
+ env: {},
90
+ };
91
+ // Check if already installed with same config
92
+ if (config.mcpServers && config.mcpServers[MCP_SERVER_NAME]) {
93
+ const existing = config.mcpServers[MCP_SERVER_NAME];
94
+ if (existing.command === serverEntry.command &&
95
+ JSON.stringify(existing.args) === JSON.stringify(serverEntry.args)) {
96
+ console.log(chalk_1.default.yellow(`Invariant MCP server already registered in ${configPath}`));
97
+ console.log('No changes made.');
98
+ return;
99
+ }
100
+ }
101
+ // Append-only: only touch mcpServers.invariant
102
+ if (!config.mcpServers) {
103
+ config.mcpServers = {};
104
+ }
105
+ const before = config.mcpServers[MCP_SERVER_NAME] ? JSON.stringify(config.mcpServers[MCP_SERVER_NAME], null, 2) : null;
106
+ config.mcpServers[MCP_SERVER_NAME] = serverEntry;
107
+ writeConfig(configPath, config);
108
+ console.log(chalk_1.default.green('✓ Invariant MCP server registered'));
109
+ console.log(` File: ${configPath}`);
110
+ if (before) {
111
+ console.log(` Updated: mcpServers.${MCP_SERVER_NAME}`);
112
+ console.log(` Previous: ${before}`);
113
+ }
114
+ else {
115
+ console.log(` Added: mcpServers.${MCP_SERVER_NAME}`);
116
+ }
117
+ console.log(` Version: @invariant-ai/mcp@${version}`);
118
+ console.log('');
119
+ console.log(`To undo: npx invariant mcp uninstall${options.global ? ' --global' : ''}`);
120
+ }
121
+ async function mcpUninstallCommand(options) {
122
+ const configPath = resolveConfigPath(options.global ?? false);
123
+ const config = readConfig(configPath);
124
+ if (!config.mcpServers || !config.mcpServers[MCP_SERVER_NAME]) {
125
+ console.log(chalk_1.default.yellow('Invariant MCP server is not registered.'));
126
+ console.log(` Checked: ${configPath}`);
127
+ return;
128
+ }
129
+ delete config.mcpServers[MCP_SERVER_NAME];
130
+ // Clean up empty mcpServers object
131
+ if (Object.keys(config.mcpServers).length === 0) {
132
+ delete config.mcpServers;
133
+ }
134
+ writeConfig(configPath, config);
135
+ console.log(chalk_1.default.green('✓ Invariant MCP server unregistered'));
136
+ console.log(` File: ${configPath}`);
137
+ console.log(` Removed: mcpServers.${MCP_SERVER_NAME}`);
138
+ }
139
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,19 @@
1
+ import { ProofReport, JsonOutputError } from '../lib/report.js';
1
2
  interface RunOptions {
2
3
  quick?: boolean;
3
4
  headed?: boolean;
5
+ json?: boolean;
6
+ ci?: boolean;
7
+ }
8
+ type RunExitCode = 0 | 1 | 2;
9
+ export interface JsonOutputEnvelope {
10
+ envelopeVersion: 1;
11
+ ok: boolean;
12
+ exitCode: RunExitCode;
13
+ report?: ProofReport;
14
+ error?: JsonOutputError;
15
+ runDir?: string;
16
+ timestamp: string;
4
17
  }
5
18
  export declare function runCommand(options: RunOptions): Promise<void>;
6
19
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAcA,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAwPD,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA8SnE"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAuB,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQrF,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED,KAAK,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE7B,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,CAAC,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAwPD,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmUnE"}