@intutic/cli 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +309 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/benchmark.d.ts +31 -0
- package/dist/commands/benchmark.d.ts.map +1 -0
- package/dist/commands/benchmark.js +211 -0
- package/dist/commands/benchmark.js.map +1 -0
- package/dist/commands/connect.d.ts +8 -6
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +322 -82
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/enterprise-install.d.ts +36 -0
- package/dist/commands/enterprise-install.d.ts.map +1 -0
- package/dist/commands/enterprise-install.js +289 -0
- package/dist/commands/enterprise-install.js.map +1 -0
- package/dist/commands/eval.d.ts +13 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +67 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/exec.d.ts +34 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +114 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/exec.test.d.ts +2 -0
- package/dist/commands/exec.test.d.ts.map +1 -0
- package/dist/commands/exec.test.js +29 -0
- package/dist/commands/exec.test.js.map +1 -0
- package/dist/commands/export.d.ts +21 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +116 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +28 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install-daemon.d.ts +61 -0
- package/dist/commands/install-daemon.d.ts.map +1 -0
- package/dist/commands/install-daemon.js +691 -0
- package/dist/commands/install-daemon.js.map +1 -0
- package/dist/commands/install-daemon.test.d.ts +2 -0
- package/dist/commands/install-daemon.test.d.ts.map +1 -0
- package/dist/commands/install-daemon.test.js +93 -0
- package/dist/commands/install-daemon.test.js.map +1 -0
- package/dist/commands/login.js +2 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/mdm.d.ts +23 -0
- package/dist/commands/mdm.d.ts.map +1 -0
- package/dist/commands/mdm.js +134 -0
- package/dist/commands/mdm.js.map +1 -0
- package/dist/commands/sop-audit.d.ts +17 -0
- package/dist/commands/sop-audit.d.ts.map +1 -0
- package/dist/commands/sop-audit.js +136 -0
- package/dist/commands/sop-audit.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +53 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/syncContext.d.ts +18 -0
- package/dist/commands/syncContext.d.ts.map +1 -0
- package/dist/commands/syncContext.js +37 -0
- package/dist/commands/syncContext.js.map +1 -0
- package/dist/commands/traces.d.ts +13 -0
- package/dist/commands/traces.d.ts.map +1 -1
- package/dist/commands/traces.js +104 -10
- package/dist/commands/traces.js.map +1 -1
- package/dist/commands/whoami.js +1 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config/keychain.d.ts +28 -0
- package/dist/config/keychain.d.ts.map +1 -0
- package/dist/config/keychain.js +99 -0
- package/dist/config/keychain.js.map +1 -0
- package/dist/config/store.d.ts +3 -3
- package/dist/config/store.d.ts.map +1 -1
- package/dist/config/store.js +30 -6
- package/dist/config/store.js.map +1 -1
- package/dist/harness/aider.d.ts +4 -3
- package/dist/harness/aider.d.ts.map +1 -1
- package/dist/harness/aider.js +13 -27
- package/dist/harness/aider.js.map +1 -1
- package/dist/harness/claudeDesktop.d.ts +18 -0
- package/dist/harness/claudeDesktop.d.ts.map +1 -0
- package/dist/harness/claudeDesktop.js +69 -0
- package/dist/harness/claudeDesktop.js.map +1 -0
- package/dist/harness/cline.d.ts +13 -0
- package/dist/harness/cline.d.ts.map +1 -0
- package/dist/harness/cline.js +75 -0
- package/dist/harness/cline.js.map +1 -0
- package/dist/harness/codex.d.ts +4 -4
- package/dist/harness/codex.d.ts.map +1 -1
- package/dist/harness/codex.js +33 -21
- package/dist/harness/codex.js.map +1 -1
- package/dist/harness/continue.d.ts +14 -0
- package/dist/harness/continue.d.ts.map +1 -0
- package/dist/harness/continue.js +97 -0
- package/dist/harness/continue.js.map +1 -0
- package/dist/harness/cursor.d.ts +13 -1
- package/dist/harness/cursor.d.ts.map +1 -1
- package/dist/harness/cursor.js +59 -3
- package/dist/harness/cursor.js.map +1 -1
- package/dist/harness/detector.d.ts +1 -1
- package/dist/harness/detector.d.ts.map +1 -1
- package/dist/harness/detector.js +13 -1
- package/dist/harness/detector.js.map +1 -1
- package/dist/harness/goose.d.ts +13 -0
- package/dist/harness/goose.d.ts.map +1 -0
- package/dist/harness/goose.js +45 -0
- package/dist/harness/goose.js.map +1 -0
- package/dist/harness/n8n.d.ts +8 -4
- package/dist/harness/n8n.d.ts.map +1 -1
- package/dist/harness/n8n.js +108 -13
- package/dist/harness/n8n.js.map +1 -1
- package/dist/harness/openWebUI.d.ts +13 -0
- package/dist/harness/openWebUI.d.ts.map +1 -0
- package/dist/harness/openWebUI.js +25 -0
- package/dist/harness/openWebUI.js.map +1 -0
- package/dist/harness/openhands.d.ts +3 -3
- package/dist/harness/openhands.d.ts.map +1 -1
- package/dist/harness/openhands.js +13 -9
- package/dist/harness/openhands.js.map +1 -1
- package/dist/harness/rooCode.d.ts +14 -0
- package/dist/harness/rooCode.d.ts.map +1 -0
- package/dist/harness/rooCode.js +77 -0
- package/dist/harness/rooCode.js.map +1 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js +6 -0
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/vscodeSettingsWriter.d.ts +40 -0
- package/dist/harness/vscodeSettingsWriter.d.ts.map +1 -0
- package/dist/harness/vscodeSettingsWriter.js +116 -0
- package/dist/harness/vscodeSettingsWriter.js.map +1 -0
- package/dist/harness/windsurf.d.ts +13 -1
- package/dist/harness/windsurf.d.ts.map +1 -1
- package/dist/harness/windsurf.js +58 -3
- package/dist/harness/windsurf.js.map +1 -1
- package/dist/lib/api.d.ts +2 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +3 -0
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/envInjector.d.ts +24 -0
- package/dist/lib/envInjector.d.ts.map +1 -0
- package/dist/lib/envInjector.js +146 -0
- package/dist/lib/envInjector.js.map +1 -0
- package/dist/lib/envInjector.test.d.ts +2 -0
- package/dist/lib/envInjector.test.d.ts.map +1 -0
- package/dist/lib/envInjector.test.js +32 -0
- package/dist/lib/envInjector.test.js.map +1 -0
- package/dist/lib/gitHooks.d.ts +19 -0
- package/dist/lib/gitHooks.d.ts.map +1 -0
- package/dist/lib/gitHooks.js +58 -0
- package/dist/lib/gitHooks.js.map +1 -0
- package/dist/lib/onboarding.d.ts +17 -0
- package/dist/lib/onboarding.d.ts.map +1 -0
- package/dist/lib/onboarding.js +164 -0
- package/dist/lib/onboarding.js.map +1 -0
- package/dist/lib/process.d.ts +53 -0
- package/dist/lib/process.d.ts.map +1 -0
- package/dist/lib/process.js +181 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/lib/process.test.d.ts +2 -0
- package/dist/lib/process.test.d.ts.map +1 -0
- package/dist/lib/process.test.js +44 -0
- package/dist/lib/process.test.js.map +1 -0
- package/package.json +39 -17
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vscodeSettingsWriter.ts — VS Code settings.json proxy injection.
|
|
3
|
+
*
|
|
4
|
+
* Shared by the Cline and Roo Code adapters. Merges Intutic proxy
|
|
5
|
+
* API base URL keys into:
|
|
6
|
+
* - macOS: ~/Library/Application Support/Code/User/settings.json
|
|
7
|
+
* - Linux: ~/.config/Code/User/settings.json
|
|
8
|
+
* - Workspace: <workspaceRoot>/.vscode/settings.json
|
|
9
|
+
*
|
|
10
|
+
* Also writes ~/.intutic/.env.intutic with exported env vars for
|
|
11
|
+
* shells that source it before launching VS Code.
|
|
12
|
+
*
|
|
13
|
+
* LLD #14 — Phase 3 cross-harness defence
|
|
14
|
+
* HLD §3.14 — Three-Tier Defense Cascade
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import * as fs from 'node:fs/promises';
|
|
19
|
+
import * as path from 'node:path';
|
|
20
|
+
import * as os from 'node:os';
|
|
21
|
+
import { createLogger } from '@intutic/logger';
|
|
22
|
+
import { newIso } from '@intutic/id';
|
|
23
|
+
const log = createLogger('sync-vscode-writer');
|
|
24
|
+
/** VS Code user settings path by platform. */
|
|
25
|
+
function getVscodeUserSettingsPath() {
|
|
26
|
+
switch (process.platform) {
|
|
27
|
+
case 'darwin':
|
|
28
|
+
return path.join(os.homedir(), 'Library', 'Application Support', 'Code', 'User', 'settings.json');
|
|
29
|
+
case 'win32':
|
|
30
|
+
return path.join(process.env.APPDATA ?? os.homedir(), 'Code', 'User', 'settings.json');
|
|
31
|
+
default: // linux
|
|
32
|
+
return path.join(os.homedir(), '.config', 'Code', 'User', 'settings.json');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Settings keys injected for each harness.
|
|
37
|
+
* These are checked during drift detection and restored on tamper.
|
|
38
|
+
*/
|
|
39
|
+
export const CLINE_PROXY_KEYS = ['cline.apiBase', 'cline.openAiBaseUrl'];
|
|
40
|
+
export const ROO_CODE_PROXY_KEYS = ['roo-cline.openAiBaseUrl', 'roo-cline.apiBase'];
|
|
41
|
+
/**
|
|
42
|
+
* Merge Intutic proxy URL into VS Code user + workspace settings.json
|
|
43
|
+
* for the Cline extension.
|
|
44
|
+
*/
|
|
45
|
+
export async function injectClineProxySettings(workspaceRoot, proxyUrl) {
|
|
46
|
+
const keys = {};
|
|
47
|
+
for (const k of CLINE_PROXY_KEYS) {
|
|
48
|
+
keys[k] = proxyUrl;
|
|
49
|
+
}
|
|
50
|
+
await mergeVscodeSettings(getVscodeUserSettingsPath(), keys);
|
|
51
|
+
await mergeVscodeSettings(path.join(workspaceRoot, '.vscode', 'settings.json'), keys);
|
|
52
|
+
await writeEnvSidecar(proxyUrl);
|
|
53
|
+
log.info({ action: 'cline_proxy_injected', proxyUrl }, 'Cline proxy keys injected into VS Code settings');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Merge Intutic proxy URL into VS Code user + workspace settings.json
|
|
57
|
+
* for the Roo Code extension.
|
|
58
|
+
*/
|
|
59
|
+
export async function injectRooCodeProxySettings(workspaceRoot, proxyUrl) {
|
|
60
|
+
const keys = {};
|
|
61
|
+
for (const k of ROO_CODE_PROXY_KEYS) {
|
|
62
|
+
keys[k] = proxyUrl;
|
|
63
|
+
}
|
|
64
|
+
await mergeVscodeSettings(getVscodeUserSettingsPath(), keys);
|
|
65
|
+
await mergeVscodeSettings(path.join(workspaceRoot, '.vscode', 'settings.json'), keys);
|
|
66
|
+
await writeEnvSidecar(proxyUrl);
|
|
67
|
+
log.info({ action: 'roo_code_proxy_injected', proxyUrl }, 'Roo Code proxy keys injected into VS Code settings');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Write (or update) ~/.intutic/.env.intutic with proxy env vars.
|
|
71
|
+
* Users/CI pipelines can `source ~/.intutic/.env.intutic` to get proxy routing
|
|
72
|
+
* for any harness that respects OPENAI_BASE_URL / ANTHROPIC_BASE_URL.
|
|
73
|
+
*/
|
|
74
|
+
export async function writeEnvSidecar(proxyUrl) {
|
|
75
|
+
const intuticDir = path.join(os.homedir(), '.intutic');
|
|
76
|
+
await fs.mkdir(intuticDir, { recursive: true });
|
|
77
|
+
const envPath = path.join(intuticDir, '.env.intutic');
|
|
78
|
+
const content = [
|
|
79
|
+
`# Intutic proxy env vars — auto-generated by intutic sync daemon`,
|
|
80
|
+
`# Source this file in your shell rc: source ~/.intutic/.env.intutic`,
|
|
81
|
+
`# Last sync: ${newIso()}`,
|
|
82
|
+
'',
|
|
83
|
+
`export ANTHROPIC_BASE_URL="${proxyUrl}"`,
|
|
84
|
+
`export OPENAI_BASE_URL="${proxyUrl}"`,
|
|
85
|
+
`export OPENAI_API_BASE="${proxyUrl}"`,
|
|
86
|
+
`export CLINE_API_BASE="${proxyUrl}"`,
|
|
87
|
+
`export AIDER_OPENAI_API_BASE="${proxyUrl}"`,
|
|
88
|
+
`export GOOSE_OPENAI_HOST="${proxyUrl}"`,
|
|
89
|
+
`export LLM_BASE_URL="${proxyUrl}"`,
|
|
90
|
+
'',
|
|
91
|
+
].join('\n');
|
|
92
|
+
const tmp = envPath + '.intutic-tmp';
|
|
93
|
+
await fs.writeFile(tmp, content, 'utf-8');
|
|
94
|
+
await fs.rename(tmp, envPath);
|
|
95
|
+
log.info({ action: 'env_sidecar_written', path: envPath }, '.env.intutic sidecar written');
|
|
96
|
+
}
|
|
97
|
+
// ─── Internal ────────────────────────────────────────────────────────
|
|
98
|
+
async function mergeVscodeSettings(settingsPath, keys) {
|
|
99
|
+
let existing = {};
|
|
100
|
+
try {
|
|
101
|
+
const raw = await fs.readFile(settingsPath, 'utf-8');
|
|
102
|
+
// Strip JSON5-style comments before parsing
|
|
103
|
+
const stripped = raw.replace(/\/\/[^\n]*/g, '').replace(/\/\*[\s\S]*?\*\//g, '');
|
|
104
|
+
existing = JSON.parse(stripped);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// No file or parse error — start fresh
|
|
108
|
+
}
|
|
109
|
+
const merged = { ...existing, ...keys };
|
|
110
|
+
await fs.mkdir(path.dirname(settingsPath), { recursive: true });
|
|
111
|
+
const tmp = settingsPath + '.intutic-tmp';
|
|
112
|
+
await fs.writeFile(tmp, JSON.stringify(merged, null, 2) + '\n', 'utf-8');
|
|
113
|
+
await fs.rename(tmp, settingsPath);
|
|
114
|
+
log.debug({ action: 'vscode_settings_merged', path: settingsPath }, 'VS Code settings merged');
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=vscodeSettingsWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vscodeSettingsWriter.js","sourceRoot":"","sources":["../../src/harness/vscodeSettingsWriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* windsurf.ts — Windsurf adapter (full implementation with hooks + TLS MITM proxy config).
|
|
3
|
+
*
|
|
4
|
+
* Writes .windsurfrules governance text and injects Cascade hook scripts
|
|
5
|
+
* at user-level (~/.codeium/windsurf/hooks.json) and workspace-level
|
|
6
|
+
* (.windsurf/hooks.json). Also writes HTTP proxy settings so Windsurf
|
|
7
|
+
* routes its AI traffic through the Intutic TLS MITM proxy.
|
|
8
|
+
*
|
|
9
|
+
* HLD §3.14 — Harness Onboarding Matrix
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import type { IHarnessAdapter } from './types.js';
|
|
13
|
+
export declare const windsurfAdapter: IHarnessAdapter;
|
|
2
14
|
//# sourceMappingURL=windsurf.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"windsurf.d.ts","sourceRoot":"","sources":["../../src/harness/windsurf.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"windsurf.d.ts","sourceRoot":"","sources":["../../src/harness/windsurf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAUjD,eAAO,MAAM,eAAe,EAAE,eA8B7B,CAAA"}
|
package/dist/harness/windsurf.js
CHANGED
|
@@ -1,9 +1,64 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Windsurf adapter
|
|
2
|
+
* windsurf.ts — Windsurf adapter (full implementation with hooks + TLS MITM proxy config).
|
|
3
|
+
*
|
|
4
|
+
* Writes .windsurfrules governance text and injects Cascade hook scripts
|
|
5
|
+
* at user-level (~/.codeium/windsurf/hooks.json) and workspace-level
|
|
6
|
+
* (.windsurf/hooks.json). Also writes HTTP proxy settings so Windsurf
|
|
7
|
+
* routes its AI traffic through the Intutic TLS MITM proxy.
|
|
8
|
+
*
|
|
3
9
|
* HLD §3.14 — Harness Onboarding Matrix
|
|
4
10
|
* @module
|
|
5
11
|
*/
|
|
12
|
+
import { access } from 'node:fs/promises';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { homedir } from 'node:os';
|
|
6
15
|
import { HarnessType } from '@intutic/shared-types';
|
|
7
|
-
import {
|
|
8
|
-
|
|
16
|
+
import { hashFile } from '../lib/hash.js';
|
|
17
|
+
import { buildMarkdownContent } from './base.js';
|
|
18
|
+
import { writeWindsurfHooks } from '@intutic/sync-daemon/harness/windsurfHooks';
|
|
19
|
+
import { writeFile, rename, mkdir } from 'node:fs/promises';
|
|
20
|
+
import { dirname } from 'node:path';
|
|
21
|
+
const CONFIG_FILE = '.windsurfrules';
|
|
22
|
+
const WINDSURF_USER_DIR = join(homedir(), '.codeium', 'windsurf');
|
|
23
|
+
export const windsurfAdapter = {
|
|
24
|
+
type: HarnessType.WINDSURF,
|
|
25
|
+
configFileName: CONFIG_FILE,
|
|
26
|
+
async detect(workspaceRoot) {
|
|
27
|
+
for (const marker of [CONFIG_FILE, '.windsurf']) {
|
|
28
|
+
try {
|
|
29
|
+
await access(join(workspaceRoot, marker));
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch { /* fall through */ }
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
await access(WINDSURF_USER_DIR);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
async writeConfig(workspaceRoot, sops, proxyUrl) {
|
|
43
|
+
// 1. Write .windsurfrules markdown governance text
|
|
44
|
+
const filePath = join(workspaceRoot, CONFIG_FILE);
|
|
45
|
+
const content = buildMarkdownContent(sops, proxyUrl);
|
|
46
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
47
|
+
const tmp = filePath + '.intutic-tmp';
|
|
48
|
+
await writeFile(tmp, content, 'utf-8');
|
|
49
|
+
await rename(tmp, filePath);
|
|
50
|
+
// 2. Write Cascade hooks.json at user + workspace level, configure TLS MITM proxy
|
|
51
|
+
const proxyPort = parseInt(process.env.INTUTIC_PROXY_PORT ?? '8877', 10);
|
|
52
|
+
await writeWindsurfHooks(workspaceRoot, proxyUrl, proxyPort);
|
|
53
|
+
return filePath;
|
|
54
|
+
},
|
|
55
|
+
async readCurrentHash(workspaceRoot) {
|
|
56
|
+
try {
|
|
57
|
+
return await hashFile(join(workspaceRoot, CONFIG_FILE));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
};
|
|
9
64
|
//# sourceMappingURL=windsurf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/harness/windsurf.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/harness/windsurf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,WAAW,GAAG,gBAAgB,CAAA;AACpC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,cAAc,EAAE,WAAW;IAE3B,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAAC,OAAO,IAAI,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,KAAK,CAAA;QAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,IAAoB,EAAE,QAAgB;QAC7E,mDAAmD;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QACjD,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QACpD,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACnD,MAAM,GAAG,GAAG,QAAQ,GAAG,cAAc,CAAA;QACrC,MAAM,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QACtC,MAAM,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QAE3B,kFAAkF;QAClF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAA;QACxE,MAAM,kBAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;QAE5D,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAAqB;QACzC,IAAI,CAAC;YAAC,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAA;QAAC,CAAC;IACvF,CAAC;CACF,CAAA"}
|
package/dist/lib/api.d.ts
CHANGED
|
@@ -33,6 +33,8 @@ export interface ApiClient {
|
|
|
33
33
|
}>;
|
|
34
34
|
/** Generic GET request for arbitrary API paths. */
|
|
35
35
|
get<T>(path: string): Promise<T>;
|
|
36
|
+
/** Generic POST request for arbitrary API paths. */
|
|
37
|
+
post<T>(path: string, body?: unknown): Promise<T>;
|
|
36
38
|
}
|
|
37
39
|
/**
|
|
38
40
|
* Create an API client bound to a control plane URL and API key.
|
package/dist/lib/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACd,MAAM,uBAAuB,CAAA;AAE9B,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC5D,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpF,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpE,KAAK,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpJ,mDAAmD;IACnD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACd,MAAM,uBAAuB,CAAA;AAE9B,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC5D,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpF,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpE,KAAK,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpJ,mDAAmD;IACnD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAChC,oDAAoD;IACpD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAClD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAmDlF"}
|
package/dist/lib/api.js
CHANGED
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqBH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,eAAuB,EAAE,MAAc;IACrE,MAAM,OAAO,GAAG;QACd,cAAc,EAAE,kBAAkB;QAClC,eAAe,EAAE,UAAU,MAAM,EAAE;KACpC,CAAA;IAED,KAAK,UAAU,OAAO,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;QACpE,MAAM,GAAG,GAAG,GAAG,eAAe,GAAG,IAAI,EAAE,CAAA;QACvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAA;YAC1D,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,IAAI,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAA;QAC1E,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAA;IACjC,CAAC;IAED,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,WAAmB;YACnC,OAAO,OAAO,CAAoB,MAAM,EAAE,qBAAqB,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QACnF,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,MAAoB;YACrC,OAAO,OAAO,CAAC,MAAM,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAA;QACvD,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,MAAqB;YACtC,OAAO,OAAO,CAAC,MAAM,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAA;QACzD,CAAC;QAED,KAAK,CAAC,KAAK;YACT,OAAO,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;QAC1C,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,QAAgB;YACzC,OAAO,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACnE,CAAC;QAED,KAAK,CAAC,GAAG,CAAI,IAAY;YACvB,OAAO,OAAO,CAAI,KAAK,EAAE,IAAI,CAAC,CAAA;QAChC,CAAC;QAED,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,IAAc;YACxC,OAAO,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QACvC,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface InjectionResult {
|
|
2
|
+
platform: NodeJS.Platform;
|
|
3
|
+
scope: 'system' | 'user';
|
|
4
|
+
vars: string[];
|
|
5
|
+
method: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class PlatformNotSupportedError extends Error {
|
|
8
|
+
constructor(platform: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class ElevationRequiredError extends Error {
|
|
11
|
+
constructor(path: string);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Injects ANTHROPIC_BASE_URL and OPENAI_BASE_URL as persistent env vars.
|
|
15
|
+
*
|
|
16
|
+
* @param proxyUrl - The Intutic proxy URL (e.g. https://proxy.acme.intutic.ai)
|
|
17
|
+
* @returns InjectionResult describing what was done
|
|
18
|
+
*/
|
|
19
|
+
export declare function injectBaseUrlEnvVars(proxyUrl: string): Promise<InjectionResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Removes the injected base URL env vars.
|
|
22
|
+
*/
|
|
23
|
+
export declare function removeBaseUrlEnvVars(): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=envInjector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envInjector.d.ts","sourceRoot":"","sources":["../../src/lib/envInjector.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAG,MAAM,CAAC,QAAQ,CAAA;IAC1B,KAAK,EAAM,QAAQ,GAAG,MAAM,CAAA;IAC5B,IAAI,EAAO,MAAM,EAAE,CAAA;IACnB,MAAM,EAAK,MAAM,CAAA;CAClB;AAED,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,QAAQ,EAAE,MAAM;CAI7B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,IAAI,EAAE,MAAM;CAIzB;AA0CD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAwCrF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB1D"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Variable Injector (TD-041 graduation)
|
|
3
|
+
*
|
|
4
|
+
* Injects ANTHROPIC_BASE_URL and OPENAI_BASE_URL as persistent
|
|
5
|
+
* system-level environment variables that survive terminal restarts.
|
|
6
|
+
*
|
|
7
|
+
* Platform support:
|
|
8
|
+
* macOS: launchctl setenv <KEY> <VALUE>
|
|
9
|
+
* Linux: ~/.bashrc append (user-level; system /etc/environment requires sudo)
|
|
10
|
+
* Windows: setx <KEY> <VALUE> (user-level, no /M)
|
|
11
|
+
*
|
|
12
|
+
* LLD #30: Multi-Region Preparation, WS-5MR (TD-041)
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import { execSync } from 'node:child_process';
|
|
16
|
+
import fs from 'node:fs';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import os from 'node:os';
|
|
19
|
+
import { createLogger } from '@intutic/logger';
|
|
20
|
+
const logger = createLogger('envInjector');
|
|
21
|
+
const ENV_VARS = ['ANTHROPIC_BASE_URL', 'OPENAI_BASE_URL'];
|
|
22
|
+
export class PlatformNotSupportedError extends Error {
|
|
23
|
+
constructor(platform) {
|
|
24
|
+
super(`Platform not supported for env injection: ${platform}`);
|
|
25
|
+
this.name = 'PlatformNotSupportedError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class ElevationRequiredError extends Error {
|
|
29
|
+
constructor(path) {
|
|
30
|
+
super(`System-level write requires root access to ${path}. Falling back to user-level.`);
|
|
31
|
+
this.name = 'ElevationRequiredError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function macosInject(key, value) {
|
|
35
|
+
execSync(`launchctl setenv ${key} "${value.replace(/"/g, '\\"')}"`, { stdio: 'pipe' });
|
|
36
|
+
}
|
|
37
|
+
function macosRemove(key) {
|
|
38
|
+
try {
|
|
39
|
+
execSync(`launchctl unsetenv ${key}`, { stdio: 'pipe' });
|
|
40
|
+
}
|
|
41
|
+
catch { }
|
|
42
|
+
}
|
|
43
|
+
function linuxInjectUser(key, value) {
|
|
44
|
+
const rcFile = path.join(os.homedir(), '.bashrc');
|
|
45
|
+
const marker = `# intutic-env-${key}`;
|
|
46
|
+
const line = `export ${key}="${value.replace(/"/g, '\\"')}" ${marker}`;
|
|
47
|
+
let content = '';
|
|
48
|
+
try {
|
|
49
|
+
content = fs.readFileSync(rcFile, 'utf8');
|
|
50
|
+
}
|
|
51
|
+
catch { }
|
|
52
|
+
// Remove existing entry for this key
|
|
53
|
+
const lines = content.split('\n').filter(l => !l.includes(marker));
|
|
54
|
+
lines.push(line);
|
|
55
|
+
fs.writeFileSync(rcFile, lines.join('\n') + '\n', { mode: 0o644 });
|
|
56
|
+
}
|
|
57
|
+
function linuxRemoveUser(key) {
|
|
58
|
+
const rcFile = path.join(os.homedir(), '.bashrc');
|
|
59
|
+
const marker = `# intutic-env-${key}`;
|
|
60
|
+
try {
|
|
61
|
+
const content = fs.readFileSync(rcFile, 'utf8');
|
|
62
|
+
const filtered = content.split('\n').filter(l => !l.includes(marker)).join('\n');
|
|
63
|
+
fs.writeFileSync(rcFile, filtered + '\n', { mode: 0o644 });
|
|
64
|
+
}
|
|
65
|
+
catch { }
|
|
66
|
+
}
|
|
67
|
+
function windowsInject(key, value) {
|
|
68
|
+
execSync(`setx ${key} "${value.replace(/"/g, '\\"')}"`, { stdio: 'pipe' });
|
|
69
|
+
}
|
|
70
|
+
function windowsRemove(key) {
|
|
71
|
+
try {
|
|
72
|
+
execSync(`reg delete HKCU\\Environment /v ${key} /f`, { stdio: 'pipe' });
|
|
73
|
+
}
|
|
74
|
+
catch { }
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Injects ANTHROPIC_BASE_URL and OPENAI_BASE_URL as persistent env vars.
|
|
78
|
+
*
|
|
79
|
+
* @param proxyUrl - The Intutic proxy URL (e.g. https://proxy.acme.intutic.ai)
|
|
80
|
+
* @returns InjectionResult describing what was done
|
|
81
|
+
*/
|
|
82
|
+
export async function injectBaseUrlEnvVars(proxyUrl) {
|
|
83
|
+
const platform = os.platform();
|
|
84
|
+
logger.info({ platform, proxyUrl }, 'envInjector.inject_start');
|
|
85
|
+
if (platform === 'darwin') {
|
|
86
|
+
for (const key of ENV_VARS)
|
|
87
|
+
macosInject(key, proxyUrl);
|
|
88
|
+
logger.info({ platform, vars: ENV_VARS }, 'envInjector.macos_launchctl_set');
|
|
89
|
+
return { platform, scope: 'system', vars: [...ENV_VARS], method: 'launchctl setenv' };
|
|
90
|
+
}
|
|
91
|
+
if (platform === 'linux') {
|
|
92
|
+
// Attempt system-level first; fall back to user-level
|
|
93
|
+
let scope = 'user';
|
|
94
|
+
try {
|
|
95
|
+
const etcEnv = '/etc/environment';
|
|
96
|
+
// Only attempt if writable (i.e., running as root)
|
|
97
|
+
fs.accessSync(etcEnv, fs.constants.W_OK);
|
|
98
|
+
for (const key of ENV_VARS) {
|
|
99
|
+
let content = fs.readFileSync(etcEnv, 'utf8');
|
|
100
|
+
content = content.split('\n').filter(l => !l.startsWith(`${key}=`)).join('\n');
|
|
101
|
+
content += `\n${key}="${proxyUrl.replace(/"/g, '\\"')}"`;
|
|
102
|
+
fs.writeFileSync(etcEnv, content.trim() + '\n', { mode: 0o644 });
|
|
103
|
+
}
|
|
104
|
+
scope = 'system';
|
|
105
|
+
logger.info({ platform, vars: ENV_VARS }, 'envInjector.linux_etc_environment_set');
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Not root \u2014 user-level fallback
|
|
109
|
+
for (const key of ENV_VARS)
|
|
110
|
+
linuxInjectUser(key, proxyUrl);
|
|
111
|
+
logger.info({ platform, vars: ENV_VARS }, 'envInjector.linux_bashrc_set');
|
|
112
|
+
}
|
|
113
|
+
return { platform, scope, vars: [...ENV_VARS], method: scope === 'system' ? '/etc/environment' : '~/.bashrc' };
|
|
114
|
+
}
|
|
115
|
+
if (platform === 'win32') {
|
|
116
|
+
for (const key of ENV_VARS)
|
|
117
|
+
windowsInject(key, proxyUrl);
|
|
118
|
+
logger.info({ platform, vars: ENV_VARS }, 'envInjector.windows_setx_set');
|
|
119
|
+
return { platform, scope: 'user', vars: [...ENV_VARS], method: 'setx' };
|
|
120
|
+
}
|
|
121
|
+
throw new PlatformNotSupportedError(platform);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Removes the injected base URL env vars.
|
|
125
|
+
*/
|
|
126
|
+
export async function removeBaseUrlEnvVars() {
|
|
127
|
+
const platform = os.platform();
|
|
128
|
+
logger.info({ platform }, 'envInjector.remove_start');
|
|
129
|
+
if (platform === 'darwin') {
|
|
130
|
+
for (const key of ENV_VARS)
|
|
131
|
+
macosRemove(key);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (platform === 'linux') {
|
|
135
|
+
for (const key of ENV_VARS)
|
|
136
|
+
linuxRemoveUser(key);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (platform === 'win32') {
|
|
140
|
+
for (const key of ENV_VARS)
|
|
141
|
+
windowsRemove(key);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
throw new PlatformNotSupportedError(platform);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=envInjector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envInjector.js","sourceRoot":"","sources":["../../src/lib/envInjector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envInjector.test.d.ts","sourceRoot":"","sources":["../../src/lib/envInjector.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { injectBaseUrlEnvVars, removeBaseUrlEnvVars } from './envInjector.js';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import { execSync } from 'node:child_process';
|
|
5
|
+
describe('Environment Variable Injector', () => {
|
|
6
|
+
it('correctly injects and removes env variables on the current platform', async () => {
|
|
7
|
+
const platform = os.platform();
|
|
8
|
+
const testProxyUrl = 'http://127.0.0.1:3001';
|
|
9
|
+
const result = await injectBaseUrlEnvVars(testProxyUrl);
|
|
10
|
+
expect(result.platform).toBe(platform);
|
|
11
|
+
expect(result.vars).toContain('ANTHROPIC_BASE_URL');
|
|
12
|
+
expect(result.vars).toContain('OPENAI_BASE_URL');
|
|
13
|
+
if (platform === 'darwin') {
|
|
14
|
+
expect(result.scope).toBe('system');
|
|
15
|
+
expect(result.method).toBe('launchctl setenv');
|
|
16
|
+
// Verify launchctl has it
|
|
17
|
+
const anthropicVal = execSync('launchctl getenv ANTHROPIC_BASE_URL').toString().trim();
|
|
18
|
+
expect(anthropicVal).toBe(testProxyUrl);
|
|
19
|
+
const openaiVal = execSync('launchctl getenv OPENAI_BASE_URL').toString().trim();
|
|
20
|
+
expect(openaiVal).toBe(testProxyUrl);
|
|
21
|
+
}
|
|
22
|
+
// Now clean up/remove
|
|
23
|
+
await removeBaseUrlEnvVars();
|
|
24
|
+
if (platform === 'darwin') {
|
|
25
|
+
const anthropicValAfter = execSync('launchctl getenv ANTHROPIC_BASE_URL').toString().trim();
|
|
26
|
+
expect(anthropicValAfter).toBe('');
|
|
27
|
+
const openaiValAfter = execSync('launchctl getenv OPENAI_BASE_URL').toString().trim();
|
|
28
|
+
expect(openaiValAfter).toBe('');
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=envInjector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envInjector.test.js","sourceRoot":"","sources":["../../src/lib/envInjector.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC7E,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;QAC9B,MAAM,YAAY,GAAG,uBAAuB,CAAA;QAE5C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QAEhD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;YAE9C,0BAA0B;YAC1B,MAAM,YAAY,GAAG,QAAQ,CAAC,qCAAqC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;YACtF,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAEvC,MAAM,SAAS,GAAG,QAAQ,CAAC,kCAAkC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;YAChF,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACtC,CAAC;QAED,sBAAsB;QACtB,MAAM,oBAAoB,EAAE,CAAA;QAE5B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,iBAAiB,GAAG,QAAQ,CAAC,qCAAqC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;YAC3F,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAClC,MAAM,cAAc,GAAG,QAAQ,CAAC,kCAAkC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;YACrF,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACjC,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gitHooks.ts — Install and manage Git context hooks.
|
|
3
|
+
*
|
|
4
|
+
* Installs post-commit and post-checkout hooks into the workspace's
|
|
5
|
+
* `.git/hooks/` directory to trigger real-time branch/commit tracking.
|
|
6
|
+
*
|
|
7
|
+
* LLD #14 — gitHooks.ts
|
|
8
|
+
* HLD §3.14 — Real-Time State Mirroring (Git hooks context integration)
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Installs post-commit and post-checkout hooks into `.git/hooks/`.
|
|
14
|
+
*
|
|
15
|
+
* @param workspaceRoot - Workspace root directory.
|
|
16
|
+
* @returns Promise<boolean> - True if successfully installed, false otherwise.
|
|
17
|
+
*/
|
|
18
|
+
export declare function installGitHooks(workspaceRoot: string): Promise<boolean>;
|
|
19
|
+
//# sourceMappingURL=gitHooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitHooks.d.ts","sourceRoot":"","sources":["../../src/lib/gitHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiC7E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gitHooks.ts — Install and manage Git context hooks.
|
|
3
|
+
*
|
|
4
|
+
* Installs post-commit and post-checkout hooks into the workspace's
|
|
5
|
+
* `.git/hooks/` directory to trigger real-time branch/commit tracking.
|
|
6
|
+
*
|
|
7
|
+
* LLD #14 — gitHooks.ts
|
|
8
|
+
* HLD §3.14 — Real-Time State Mirroring (Git hooks context integration)
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import * as node_fs from 'node:fs/promises';
|
|
13
|
+
import * as node_path from 'node:path';
|
|
14
|
+
import { log } from './logger.js';
|
|
15
|
+
const HOOK_CONTENT = `
|
|
16
|
+
#!/bin/sh
|
|
17
|
+
# Intutic Git Context Sync Hook
|
|
18
|
+
if command -v intutic >/dev/null 2>&1; then
|
|
19
|
+
intutic sync-context --git --branch "$(git branch --show-current)" --commit "$(git rev-parse HEAD)" >/dev/null 2>&1 &
|
|
20
|
+
fi
|
|
21
|
+
`.trim();
|
|
22
|
+
/**
|
|
23
|
+
* Installs post-commit and post-checkout hooks into `.git/hooks/`.
|
|
24
|
+
*
|
|
25
|
+
* @param workspaceRoot - Workspace root directory.
|
|
26
|
+
* @returns Promise<boolean> - True if successfully installed, false otherwise.
|
|
27
|
+
*/
|
|
28
|
+
export async function installGitHooks(workspaceRoot) {
|
|
29
|
+
const gitDir = node_path.join(workspaceRoot, '.git');
|
|
30
|
+
try {
|
|
31
|
+
const stat = await node_fs.stat(gitDir);
|
|
32
|
+
if (!stat.isDirectory()) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Not a Git repository, skip hook installation
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const hooksDir = node_path.join(gitDir, 'hooks');
|
|
41
|
+
try {
|
|
42
|
+
await node_fs.mkdir(hooksDir, { recursive: true });
|
|
43
|
+
const postCommitPath = node_path.join(hooksDir, 'post-commit');
|
|
44
|
+
const postCheckoutPath = node_path.join(hooksDir, 'post-checkout');
|
|
45
|
+
await node_fs.writeFile(postCommitPath, HOOK_CONTENT + '\n', { encoding: 'utf-8', mode: 0o755 });
|
|
46
|
+
await node_fs.writeFile(postCheckoutPath, HOOK_CONTENT + '\n', { encoding: 'utf-8', mode: 0o755 });
|
|
47
|
+
// Double check execute permissions
|
|
48
|
+
await node_fs.chmod(postCommitPath, 0o755);
|
|
49
|
+
await node_fs.chmod(postCheckoutPath, 0o755);
|
|
50
|
+
log.info('Successfully installed Git sync hooks (post-commit, post-checkout)');
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
log.warn(`Failed to write Git hooks: ${err instanceof Error ? err.message : String(err)}`);
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=gitHooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitHooks.js","sourceRoot":"","sources":["../../src/lib/gitHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,MAAM,YAAY,GAAG;;;;;;CAMpB,CAAC,IAAI,EAAE,CAAA;AAER;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,aAAqB;IACzD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;IAEpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;QAC/C,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAElD,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;QAC9D,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;QAElE,MAAM,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAChG,MAAM,OAAO,CAAC,SAAS,CAAC,gBAAgB,EAAE,YAAY,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAElG,mCAAmC;QACnC,MAAM,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;QAC1C,MAAM,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;QAE5C,GAAG,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;QAC9E,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC1F,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Onboarding setup guide generator.
|
|
3
|
+
*
|
|
4
|
+
* Prints tailored, step-by-step setup guides for each detected harness.
|
|
5
|
+
*
|
|
6
|
+
* LLD #8 — Sync Daemon / CLI
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Print tailored setup instructions for a list of harnesses.
|
|
11
|
+
*
|
|
12
|
+
* @param harnesses - List of harness types (e.g. ['cursor', 'aider'])
|
|
13
|
+
* @param apiKey - Optional API key to display in the instructions
|
|
14
|
+
* @param devMode - If true, use localhost:4000; otherwise use remote proxy
|
|
15
|
+
*/
|
|
16
|
+
export declare function printOnboardingGuide(harnesses: string[], apiKey?: string, devMode?: boolean): void;
|
|
17
|
+
//# sourceMappingURL=onboarding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,IAAI,CAmKhG"}
|