expandai 0.0.4 → 0.0.6
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/README.md +2 -2
- package/build/{esm/Install/Opencode → assets/opencode}/expandai-webfetch.js +22 -4
- package/build/dts/Mcp/RequestHeaders.d.ts +0 -1
- package/build/dts/Mcp/Server.d.ts +1 -2
- package/build/dts/index.d.ts +0 -1
- package/build/esm/index.js +193 -2
- package/build/esm/main.js +691 -200
- package/build/skills/expandai/SKILL.md +100 -8
- package/package.json +20 -12
- package/build/dts/ApiClient.d.ts +0 -165
- package/build/dts/ApiClient.d.ts.map +0 -1
- package/build/dts/Auth/Domain.d.ts +0 -95
- package/build/dts/Auth/Domain.d.ts.map +0 -1
- package/build/dts/Auth/ManualAuthorization.d.ts +0 -107
- package/build/dts/Auth/ManualAuthorization.d.ts.map +0 -1
- package/build/dts/Auth/PendingInit.d.ts +0 -35
- package/build/dts/Auth/PendingInit.d.ts.map +0 -1
- package/build/dts/Auth/Pkce.d.ts +0 -10
- package/build/dts/Auth/Pkce.d.ts.map +0 -1
- package/build/dts/Auth/SetupGrantAuthorization.d.ts +0 -34
- package/build/dts/Auth/SetupGrantAuthorization.d.ts.map +0 -1
- package/build/dts/Authentication.d.ts +0 -24
- package/build/dts/Authentication.d.ts.map +0 -1
- package/build/dts/BrowserOAuth.d.ts +0 -99
- package/build/dts/BrowserOAuth.d.ts.map +0 -1
- package/build/dts/CommandPath.d.ts +0 -2
- package/build/dts/CommandPath.d.ts.map +0 -1
- package/build/dts/Commands/Fetch.d.ts +0 -30
- package/build/dts/Commands/Fetch.d.ts.map +0 -1
- package/build/dts/Commands/Hook.d.ts +0 -17
- package/build/dts/Commands/Hook.d.ts.map +0 -1
- package/build/dts/Commands/Init.d.ts +0 -55
- package/build/dts/Commands/Init.d.ts.map +0 -1
- package/build/dts/Commands/Mcp.d.ts +0 -11
- package/build/dts/Commands/Mcp.d.ts.map +0 -1
- package/build/dts/Commands/McpRun.d.ts +0 -5
- package/build/dts/Commands/McpRun.d.ts.map +0 -1
- package/build/dts/Commands/Search.d.ts +0 -21
- package/build/dts/Commands/Search.d.ts.map +0 -1
- package/build/dts/Commands/Skill.d.ts +0 -12
- package/build/dts/Commands/Skill.d.ts.map +0 -1
- package/build/dts/Commands/Status.d.ts +0 -27
- package/build/dts/Commands/Status.d.ts.map +0 -1
- package/build/dts/Commands/Telemetry.d.ts +0 -7
- package/build/dts/Commands/Telemetry.d.ts.map +0 -1
- package/build/dts/Commands/Uninstall.d.ts +0 -9
- package/build/dts/Commands/Uninstall.d.ts.map +0 -1
- package/build/dts/Config.d.ts +0 -196
- package/build/dts/Config.d.ts.map +0 -1
- package/build/dts/Hook/Claude.d.ts +0 -13
- package/build/dts/Hook/Claude.d.ts.map +0 -1
- package/build/dts/Hook/Errors.d.ts +0 -20
- package/build/dts/Hook/Errors.d.ts.map +0 -1
- package/build/dts/Hook/Opencode.d.ts +0 -13
- package/build/dts/Hook/Opencode.d.ts.map +0 -1
- package/build/dts/Hook/SnapshotNote.d.ts +0 -12
- package/build/dts/Hook/SnapshotNote.d.ts.map +0 -1
- package/build/dts/Init/ClaudeAdapter.d.ts +0 -61
- package/build/dts/Init/ClaudeAdapter.d.ts.map +0 -1
- package/build/dts/Init/ClaudeProfile.d.ts +0 -77
- package/build/dts/Init/ClaudeProfile.d.ts.map +0 -1
- package/build/dts/Init/Domain.d.ts +0 -139
- package/build/dts/Init/Domain.d.ts.map +0 -1
- package/build/dts/Init/HarnessAdapter.d.ts +0 -33
- package/build/dts/Init/HarnessAdapter.d.ts.map +0 -1
- package/build/dts/Init/HarnessDetector.d.ts +0 -19
- package/build/dts/Init/HarnessDetector.d.ts.map +0 -1
- package/build/dts/Init/HarnessRegistry.d.ts +0 -50
- package/build/dts/Init/HarnessRegistry.d.ts.map +0 -1
- package/build/dts/Init/MutationTransaction.d.ts +0 -96
- package/build/dts/Init/MutationTransaction.d.ts.map +0 -1
- package/build/dts/Init/Service.d.ts +0 -72
- package/build/dts/Init/Service.d.ts.map +0 -1
- package/build/dts/Init/StandardAdapters.d.ts +0 -42
- package/build/dts/Init/StandardAdapters.d.ts.map +0 -1
- package/build/dts/Init/Status.d.ts +0 -149
- package/build/dts/Init/Status.d.ts.map +0 -1
- package/build/dts/Install/Claude/Hook.d.ts +0 -88
- package/build/dts/Install/Claude/Hook.d.ts.map +0 -1
- package/build/dts/Install/Claude/Mcp.d.ts +0 -48
- package/build/dts/Install/Claude/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Claude/Skill.d.ts +0 -23
- package/build/dts/Install/Claude/Skill.d.ts.map +0 -1
- package/build/dts/Install/Codex/Mcp.d.ts +0 -45
- package/build/dts/Install/Codex/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Codex/Skill.d.ts +0 -22
- package/build/dts/Install/Codex/Skill.d.ts.map +0 -1
- package/build/dts/Install/Cursor/Mcp.d.ts +0 -45
- package/build/dts/Install/Cursor/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Cursor/Skill.d.ts +0 -29
- package/build/dts/Install/Cursor/Skill.d.ts.map +0 -1
- package/build/dts/Install/Domain.d.ts +0 -103
- package/build/dts/Install/Domain.d.ts.map +0 -1
- package/build/dts/Install/Hook.d.ts +0 -30
- package/build/dts/Install/Hook.d.ts.map +0 -1
- package/build/dts/Install/Mcp.d.ts +0 -28
- package/build/dts/Install/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Opencode/Hook.d.ts +0 -24
- package/build/dts/Install/Opencode/Hook.d.ts.map +0 -1
- package/build/dts/Install/Opencode/Mcp.d.ts +0 -47
- package/build/dts/Install/Opencode/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Opencode/Skill.d.ts +0 -26
- package/build/dts/Install/Opencode/Skill.d.ts.map +0 -1
- package/build/dts/Install/Skill.d.ts +0 -32
- package/build/dts/Install/Skill.d.ts.map +0 -1
- package/build/dts/Install/Uninstall.d.ts +0 -32
- package/build/dts/Install/Uninstall.d.ts.map +0 -1
- package/build/dts/MarkdownAnsi.d.ts +0 -29
- package/build/dts/MarkdownAnsi.d.ts.map +0 -1
- package/build/dts/Mcp/ExpandDocs.d.ts +0 -19
- package/build/dts/Mcp/ExpandDocs.d.ts.map +0 -1
- package/build/dts/Mcp/RequestHeaders.d.ts.map +0 -1
- package/build/dts/Mcp/Server.d.ts.map +0 -1
- package/build/dts/Mcp/Toolkit.d.ts +0 -3
- package/build/dts/Mcp/Toolkit.d.ts.map +0 -1
- package/build/dts/Mcp/tools/Citations.d.ts +0 -266
- package/build/dts/Mcp/tools/Citations.d.ts.map +0 -1
- package/build/dts/Mcp/tools/Fetch.d.ts +0 -168
- package/build/dts/Mcp/tools/Fetch.d.ts.map +0 -1
- package/build/dts/SecureFile.d.ts +0 -23
- package/build/dts/SecureFile.d.ts.map +0 -1
- package/build/dts/Snippets.d.ts +0 -18
- package/build/dts/Snippets.d.ts.map +0 -1
- package/build/dts/Telemetry.d.ts +0 -30
- package/build/dts/Telemetry.d.ts.map +0 -1
- package/build/dts/Version.d.ts +0 -2
- package/build/dts/Version.d.ts.map +0 -1
- package/build/dts/Xdg.d.ts +0 -11
- package/build/dts/Xdg.d.ts.map +0 -1
- package/build/dts/index.d.ts.map +0 -1
- package/build/dts/main.d.ts +0 -3
- package/build/dts/main.d.ts.map +0 -1
- package/build/esm/ApiClient.js +0 -305
- package/build/esm/ApiClient.js.map +0 -1
- package/build/esm/Auth/Domain.js +0 -56
- package/build/esm/Auth/Domain.js.map +0 -1
- package/build/esm/Auth/ManualAuthorization.js +0 -253
- package/build/esm/Auth/ManualAuthorization.js.map +0 -1
- package/build/esm/Auth/PendingInit.js +0 -267
- package/build/esm/Auth/PendingInit.js.map +0 -1
- package/build/esm/Auth/Pkce.js +0 -23
- package/build/esm/Auth/Pkce.js.map +0 -1
- package/build/esm/Auth/SetupGrantAuthorization.js +0 -91
- package/build/esm/Auth/SetupGrantAuthorization.js.map +0 -1
- package/build/esm/Authentication.js +0 -143
- package/build/esm/Authentication.js.map +0 -1
- package/build/esm/BrowserOAuth.js +0 -251
- package/build/esm/BrowserOAuth.js.map +0 -1
- package/build/esm/CommandPath.js +0 -31
- package/build/esm/CommandPath.js.map +0 -1
- package/build/esm/Commands/Fetch.js +0 -119
- package/build/esm/Commands/Fetch.js.map +0 -1
- package/build/esm/Commands/Hook.js +0 -20
- package/build/esm/Commands/Hook.js.map +0 -1
- package/build/esm/Commands/Init.js +0 -371
- package/build/esm/Commands/Init.js.map +0 -1
- package/build/esm/Commands/Mcp.js +0 -19
- package/build/esm/Commands/Mcp.js.map +0 -1
- package/build/esm/Commands/McpRun.js +0 -15
- package/build/esm/Commands/McpRun.js.map +0 -1
- package/build/esm/Commands/Search.js +0 -46
- package/build/esm/Commands/Search.js.map +0 -1
- package/build/esm/Commands/Skill.js +0 -17
- package/build/esm/Commands/Skill.js.map +0 -1
- package/build/esm/Commands/Status.js +0 -186
- package/build/esm/Commands/Status.js.map +0 -1
- package/build/esm/Commands/Telemetry.js +0 -23
- package/build/esm/Commands/Telemetry.js.map +0 -1
- package/build/esm/Commands/Uninstall.js +0 -28
- package/build/esm/Commands/Uninstall.js.map +0 -1
- package/build/esm/Config.js +0 -619
- package/build/esm/Config.js.map +0 -1
- package/build/esm/Hook/Claude.js +0 -74
- package/build/esm/Hook/Claude.js.map +0 -1
- package/build/esm/Hook/Errors.js +0 -18
- package/build/esm/Hook/Errors.js.map +0 -1
- package/build/esm/Hook/Opencode.js +0 -50
- package/build/esm/Hook/Opencode.js.map +0 -1
- package/build/esm/Hook/SnapshotNote.js +0 -65
- package/build/esm/Hook/SnapshotNote.js.map +0 -1
- package/build/esm/Init/ClaudeAdapter.js +0 -137
- package/build/esm/Init/ClaudeAdapter.js.map +0 -1
- package/build/esm/Init/ClaudeProfile.js +0 -344
- package/build/esm/Init/ClaudeProfile.js.map +0 -1
- package/build/esm/Init/Domain.js +0 -118
- package/build/esm/Init/Domain.js.map +0 -1
- package/build/esm/Init/HarnessAdapter.js +0 -21
- package/build/esm/Init/HarnessAdapter.js.map +0 -1
- package/build/esm/Init/HarnessDetector.js +0 -65
- package/build/esm/Init/HarnessDetector.js.map +0 -1
- package/build/esm/Init/HarnessRegistry.js +0 -58
- package/build/esm/Init/HarnessRegistry.js.map +0 -1
- package/build/esm/Init/MutationTransaction.js +0 -494
- package/build/esm/Init/MutationTransaction.js.map +0 -1
- package/build/esm/Init/Service.js +0 -319
- package/build/esm/Init/Service.js.map +0 -1
- package/build/esm/Init/StandardAdapters.js +0 -116
- package/build/esm/Init/StandardAdapters.js.map +0 -1
- package/build/esm/Init/Status.js +0 -215
- package/build/esm/Init/Status.js.map +0 -1
- package/build/esm/Install/Claude/Hook.js +0 -77
- package/build/esm/Install/Claude/Hook.js.map +0 -1
- package/build/esm/Install/Claude/Mcp.js +0 -101
- package/build/esm/Install/Claude/Mcp.js.map +0 -1
- package/build/esm/Install/Claude/Skill.js +0 -56
- package/build/esm/Install/Claude/Skill.js.map +0 -1
- package/build/esm/Install/Codex/Mcp.js +0 -97
- package/build/esm/Install/Codex/Mcp.js.map +0 -1
- package/build/esm/Install/Codex/Skill.js +0 -33
- package/build/esm/Install/Codex/Skill.js.map +0 -1
- package/build/esm/Install/Cursor/Mcp.js +0 -74
- package/build/esm/Install/Cursor/Mcp.js.map +0 -1
- package/build/esm/Install/Cursor/Skill.js +0 -40
- package/build/esm/Install/Cursor/Skill.js.map +0 -1
- package/build/esm/Install/Domain.js +0 -162
- package/build/esm/Install/Domain.js.map +0 -1
- package/build/esm/Install/Hook.js +0 -38
- package/build/esm/Install/Hook.js.map +0 -1
- package/build/esm/Install/Mcp.js +0 -40
- package/build/esm/Install/Mcp.js.map +0 -1
- package/build/esm/Install/Opencode/Hook.js +0 -44
- package/build/esm/Install/Opencode/Hook.js.map +0 -1
- package/build/esm/Install/Opencode/Mcp.js +0 -76
- package/build/esm/Install/Opencode/Mcp.js.map +0 -1
- package/build/esm/Install/Opencode/Skill.js +0 -37
- package/build/esm/Install/Opencode/Skill.js.map +0 -1
- package/build/esm/Install/Skill.js +0 -41
- package/build/esm/Install/Skill.js.map +0 -1
- package/build/esm/Install/Uninstall.js +0 -49
- package/build/esm/Install/Uninstall.js.map +0 -1
- package/build/esm/MarkdownAnsi.js +0 -142
- package/build/esm/MarkdownAnsi.js.map +0 -1
- package/build/esm/Mcp/ExpandDocs.js +0 -56
- package/build/esm/Mcp/ExpandDocs.js.map +0 -1
- package/build/esm/Mcp/RequestHeaders.js +0 -13
- package/build/esm/Mcp/RequestHeaders.js.map +0 -1
- package/build/esm/Mcp/Server.js +0 -12
- package/build/esm/Mcp/Server.js.map +0 -1
- package/build/esm/Mcp/Toolkit.js +0 -16
- package/build/esm/Mcp/Toolkit.js.map +0 -1
- package/build/esm/Mcp/tools/Citations.js +0 -193
- package/build/esm/Mcp/tools/Citations.js.map +0 -1
- package/build/esm/Mcp/tools/Fetch.js +0 -165
- package/build/esm/Mcp/tools/Fetch.js.map +0 -1
- package/build/esm/SecureFile.js +0 -36
- package/build/esm/SecureFile.js.map +0 -1
- package/build/esm/Snippets.js +0 -29
- package/build/esm/Snippets.js.map +0 -1
- package/build/esm/Telemetry.js +0 -157
- package/build/esm/Telemetry.js.map +0 -1
- package/build/esm/Version.js +0 -4
- package/build/esm/Version.js.map +0 -1
- package/build/esm/Xdg.js +0 -15
- package/build/esm/Xdg.js.map +0 -1
- package/build/esm/index.js.map +0 -1
- package/build/esm/main.js.map +0 -1
- package/src/ApiClient.ts +0 -450
- package/src/Auth/Domain.ts +0 -63
- package/src/Auth/ManualAuthorization.ts +0 -296
- package/src/Auth/PendingInit.ts +0 -338
- package/src/Auth/Pkce.ts +0 -26
- package/src/Auth/SetupGrantAuthorization.ts +0 -116
- package/src/Authentication.ts +0 -202
- package/src/BrowserOAuth.ts +0 -359
- package/src/CommandPath.ts +0 -30
- package/src/Commands/Fetch.ts +0 -188
- package/src/Commands/Hook.ts +0 -48
- package/src/Commands/Init.ts +0 -489
- package/src/Commands/Mcp.ts +0 -30
- package/src/Commands/McpRun.ts +0 -25
- package/src/Commands/Search.ts +0 -97
- package/src/Commands/Skill.ts +0 -30
- package/src/Commands/Status.ts +0 -228
- package/src/Commands/Telemetry.ts +0 -42
- package/src/Commands/Uninstall.ts +0 -38
- package/src/Config.ts +0 -840
- package/src/Hook/Claude.ts +0 -81
- package/src/Hook/Errors.ts +0 -19
- package/src/Hook/Opencode.ts +0 -58
- package/src/Hook/SnapshotNote.ts +0 -66
- package/src/Init/ClaudeAdapter.ts +0 -191
- package/src/Init/ClaudeProfile.ts +0 -453
- package/src/Init/Domain.ts +0 -153
- package/src/Init/HarnessAdapter.ts +0 -35
- package/src/Init/HarnessDetector.ts +0 -77
- package/src/Init/HarnessRegistry.ts +0 -87
- package/src/Init/MutationTransaction.ts +0 -747
- package/src/Init/Service.ts +0 -385
- package/src/Init/StandardAdapters.ts +0 -141
- package/src/Init/Status.ts +0 -253
- package/src/Install/Claude/Hook.ts +0 -123
- package/src/Install/Claude/Mcp.ts +0 -129
- package/src/Install/Claude/Skill.ts +0 -77
- package/src/Install/Codex/Mcp.ts +0 -114
- package/src/Install/Codex/Skill.ts +0 -44
- package/src/Install/Cursor/Mcp.ts +0 -85
- package/src/Install/Cursor/Skill.ts +0 -51
- package/src/Install/Domain.ts +0 -221
- package/src/Install/Hook.ts +0 -50
- package/src/Install/Mcp.ts +0 -71
- package/src/Install/Opencode/Hook.ts +0 -55
- package/src/Install/Opencode/Mcp.ts +0 -87
- package/src/Install/Opencode/Skill.ts +0 -48
- package/src/Install/Opencode/expandai-webfetch.d.ts +0 -23
- package/src/Install/Opencode/expandai-webfetch.js +0 -56
- package/src/Install/Skill.ts +0 -57
- package/src/Install/Uninstall.ts +0 -82
- package/src/MarkdownAnsi.ts +0 -162
- package/src/Mcp/ExpandDocs.ts +0 -62
- package/src/Mcp/RequestHeaders.ts +0 -16
- package/src/Mcp/Server.ts +0 -15
- package/src/Mcp/Toolkit.ts +0 -21
- package/src/Mcp/tools/Citations.ts +0 -219
- package/src/Mcp/tools/Fetch.ts +0 -203
- package/src/SecureFile.ts +0 -70
- package/src/Snippets.ts +0 -39
- package/src/Telemetry.ts +0 -186
- package/src/Version.ts +0 -3
- package/src/Xdg.ts +0 -18
- package/src/index.ts +0 -1
- package/src/main.ts +0 -305
package/build/esm/Init/Status.js
DELETED
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import { DateTime, Effect, Option, Schema } from 'effect';
|
|
2
|
-
import { CLI_AUTHORIZATION_CLIENT_ID, PendingInitCorrupt, } from '../Auth/Domain.js';
|
|
3
|
-
import { PendingInitStore } from '../Auth/PendingInit.js';
|
|
4
|
-
import { authMethodState } from '../Authentication.js';
|
|
5
|
-
import { ConfigManager, ConfigParseError, CredentialStoreInsecure, NotAuthenticated } from '../Config.js';
|
|
6
|
-
import { CLI_VERSION } from '../Version.js';
|
|
7
|
-
import { CLAUDE_POLICY_READ_ONLY } from './ClaudeProfile.js';
|
|
8
|
-
import { InitHarness, InitScope } from './Domain.js';
|
|
9
|
-
import { HarnessRegistry } from './HarnessRegistry.js';
|
|
10
|
-
const VERSION_PATTERN = /^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u;
|
|
11
|
-
const BoundedVersion = Schema.String.pipe(Schema.minLength(1), Schema.maxLength(64), Schema.pattern(VERSION_PATTERN));
|
|
12
|
-
export class StatusRequest extends Schema.Class('StatusRequest')({
|
|
13
|
-
harness: InitHarness,
|
|
14
|
-
scope: InitScope,
|
|
15
|
-
}) {
|
|
16
|
-
}
|
|
17
|
-
const StatusAuth = Schema.Struct({
|
|
18
|
-
// `healthy` means a call would authenticate right now. An expired access
|
|
19
|
-
// token with a refresh token on disk reports `refresh_required`, because the
|
|
20
|
-
// renewal has not happened and can fail.
|
|
21
|
-
state: Schema.Literal('absent', 'unusable', 'refresh_required', 'healthy'),
|
|
22
|
-
healthy: Schema.Boolean,
|
|
23
|
-
});
|
|
24
|
-
const PendingAuthorization = Schema.Union(Schema.Struct({ state: Schema.Literal('none'), count: Schema.Literal(0) }), Schema.Struct({
|
|
25
|
-
state: Schema.Literal('approval_pending'),
|
|
26
|
-
count: Schema.Literal(1),
|
|
27
|
-
approvalExpiresAt: Schema.DateTimeUtc,
|
|
28
|
-
}));
|
|
29
|
-
const StatusInstallation = Schema.Struct({
|
|
30
|
-
configured: Schema.Boolean,
|
|
31
|
-
integrationVersion: Schema.optional(BoundedVersion),
|
|
32
|
-
components: Schema.Struct({
|
|
33
|
-
webfetchHook: Schema.Boolean,
|
|
34
|
-
runtimeSkill: Schema.Boolean,
|
|
35
|
-
mcp: Schema.Boolean,
|
|
36
|
-
}),
|
|
37
|
-
runtimeState: Schema.Literal('unverified', 'reload_required', 'blocked'),
|
|
38
|
-
reloadState: Schema.Literal('not_required', 'required'),
|
|
39
|
-
consentState: Schema.Literal('not_required', 'may_be_required'),
|
|
40
|
-
policyState: Schema.Literal('unverified', 'blocked'),
|
|
41
|
-
policyCodes: Schema.Array(Schema.Literal('managed_policy_blocked', 'target_read_only')).pipe(Schema.maxItems(1)),
|
|
42
|
-
});
|
|
43
|
-
export class StatusResult extends Schema.Class('StatusResult')({
|
|
44
|
-
schemaVersion: Schema.Literal(1),
|
|
45
|
-
status: Schema.Literal('ok'),
|
|
46
|
-
harness: InitHarness,
|
|
47
|
-
scope: InitScope,
|
|
48
|
-
cli: Schema.Struct({ version: BoundedVersion }),
|
|
49
|
-
auth: StatusAuth,
|
|
50
|
-
pendingAuthorization: PendingAuthorization,
|
|
51
|
-
installation: StatusInstallation,
|
|
52
|
-
}) {
|
|
53
|
-
}
|
|
54
|
-
export const StatusServiceErrorCode = Schema.Literal('credential_config_malformed', 'credential_storage_insecure', 'credential_health_failed', 'pending_state_malformed', 'pending_state_unavailable', 'harness_inspection_failed', 'invalid_status_result');
|
|
55
|
-
export class StatusServiceError extends Schema.TaggedError()('StatusServiceError', {
|
|
56
|
-
code: StatusServiceErrorCode,
|
|
57
|
-
recoverable: Schema.Boolean,
|
|
58
|
-
}) {
|
|
59
|
-
get message() {
|
|
60
|
-
switch (this.code) {
|
|
61
|
-
case 'credential_config_malformed':
|
|
62
|
-
return 'Stored credential configuration is malformed.';
|
|
63
|
-
case 'credential_storage_insecure':
|
|
64
|
-
return 'Credential storage is not secure enough to inspect.';
|
|
65
|
-
case 'credential_health_failed':
|
|
66
|
-
return 'Stored credentials could not be inspected safely.';
|
|
67
|
-
case 'pending_state_malformed':
|
|
68
|
-
return 'Pending authorization state is malformed.';
|
|
69
|
-
case 'pending_state_unavailable':
|
|
70
|
-
return 'Pending authorization state could not be inspected safely.';
|
|
71
|
-
case 'harness_inspection_failed':
|
|
72
|
-
return 'The harness configuration could not be inspected safely.';
|
|
73
|
-
case 'invalid_status_result':
|
|
74
|
-
return 'Local diagnostics returned an invalid result.';
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
function statusError(code, recoverable) {
|
|
79
|
-
return new StatusServiceError({ code, recoverable });
|
|
80
|
-
}
|
|
81
|
-
function mapCredentialError(error) {
|
|
82
|
-
if (error instanceof ConfigParseError)
|
|
83
|
-
return statusError('credential_config_malformed', false);
|
|
84
|
-
if (error instanceof CredentialStoreInsecure)
|
|
85
|
-
return statusError('credential_storage_insecure', false);
|
|
86
|
-
return statusError('credential_health_failed', false);
|
|
87
|
-
}
|
|
88
|
-
function mapPendingError(error) {
|
|
89
|
-
if (error instanceof CredentialStoreInsecure)
|
|
90
|
-
return statusError('credential_storage_insecure', false);
|
|
91
|
-
return error instanceof PendingInitCorrupt
|
|
92
|
-
? statusError('pending_state_malformed', true)
|
|
93
|
-
: statusError('pending_state_unavailable', true);
|
|
94
|
-
}
|
|
95
|
-
function authStatus(configManager) {
|
|
96
|
-
return Effect.gen(function* () {
|
|
97
|
-
const loaded = yield* Effect.either(configManager.loadConfig());
|
|
98
|
-
if (loaded._tag === 'Left') {
|
|
99
|
-
if (loaded.left instanceof NotAuthenticated)
|
|
100
|
-
return { state: 'absent', healthy: false };
|
|
101
|
-
return yield* mapCredentialError(loaded.left);
|
|
102
|
-
}
|
|
103
|
-
const now = yield* DateTime.now;
|
|
104
|
-
const state = authMethodState(loaded.right.authMethod, now);
|
|
105
|
-
return { state, healthy: state === 'healthy' };
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
function pendingStatus(record) {
|
|
109
|
-
return Effect.gen(function* () {
|
|
110
|
-
if (Option.isNone(record))
|
|
111
|
-
return { state: 'none', count: 0 };
|
|
112
|
-
const now = DateTime.toEpochMillis(yield* DateTime.now);
|
|
113
|
-
if (DateTime.toEpochMillis(record.value.approvalExpiresAt) <= now) {
|
|
114
|
-
return { state: 'none', count: 0 };
|
|
115
|
-
}
|
|
116
|
-
return {
|
|
117
|
-
state: 'approval_pending',
|
|
118
|
-
count: 1,
|
|
119
|
-
approvalExpiresAt: DateTime.formatIso(record.value.approvalExpiresAt),
|
|
120
|
-
};
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
function validateInspection(harness, inspection) {
|
|
124
|
-
const componentSet = new Set(inspection.components);
|
|
125
|
-
// Only the harnesses with a web-fetch hook install three components; cursor
|
|
126
|
-
// and codex are complete with two. Demanding three of them reported a
|
|
127
|
-
// correctly configured machine as an invalid result.
|
|
128
|
-
const expectsHook = harness === 'opencode';
|
|
129
|
-
const allComponents = componentSet.has('runtime-skill') &&
|
|
130
|
-
componentSet.has('mcp') &&
|
|
131
|
-
(expectsHook ? componentSet.has('webfetch-hook') && componentSet.size === 3 : componentSet.size === 2);
|
|
132
|
-
const versionValid = inspection.integrationVersion === undefined ||
|
|
133
|
-
(inspection.integrationVersion.length <= 64 && VERSION_PATTERN.test(inspection.integrationVersion));
|
|
134
|
-
const configuredValid = inspection.configured === allComponents;
|
|
135
|
-
const runtimeValid = inspection.runtimeState !== 'observed';
|
|
136
|
-
return componentSet.size === inspection.components.length && versionValid && configuredValid && runtimeValid
|
|
137
|
-
? Effect.succeed(inspection)
|
|
138
|
-
: statusError('invalid_status_result', false);
|
|
139
|
-
}
|
|
140
|
-
function installationStatus(inspection, scope) {
|
|
141
|
-
const components = new Set(inspection.components);
|
|
142
|
-
const policyBlocked = inspection.policyBlock !== undefined || inspection.runtimeState === 'blocked';
|
|
143
|
-
const policyCodes = inspection.policyBlock === CLAUDE_POLICY_READ_ONLY
|
|
144
|
-
? ['target_read_only']
|
|
145
|
-
: policyBlocked
|
|
146
|
-
? ['managed_policy_blocked']
|
|
147
|
-
: [];
|
|
148
|
-
const reloadRequired = !policyBlocked && inspection.runtimeState === 'reload_required';
|
|
149
|
-
return {
|
|
150
|
-
configured: inspection.configured,
|
|
151
|
-
...(inspection.integrationVersion === undefined ? {} : { integrationVersion: inspection.integrationVersion }),
|
|
152
|
-
components: {
|
|
153
|
-
webfetchHook: components.has('webfetch-hook'),
|
|
154
|
-
runtimeSkill: components.has('runtime-skill'),
|
|
155
|
-
mcp: components.has('mcp'),
|
|
156
|
-
},
|
|
157
|
-
runtimeState: policyBlocked
|
|
158
|
-
? 'blocked'
|
|
159
|
-
: reloadRequired
|
|
160
|
-
? 'reload_required'
|
|
161
|
-
: 'unverified',
|
|
162
|
-
reloadState: reloadRequired ? 'required' : 'not_required',
|
|
163
|
-
consentState: scope === 'project' ? 'may_be_required' : 'not_required',
|
|
164
|
-
policyState: policyBlocked ? 'blocked' : 'unverified',
|
|
165
|
-
policyCodes,
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
export class StatusService extends Effect.Service()('@expandai/cli/Init/StatusService', {
|
|
169
|
-
dependencies: [ConfigManager.Default, PendingInitStore.Default, HarnessRegistry.Default],
|
|
170
|
-
effect: Effect.gen(function* () {
|
|
171
|
-
const configManager = yield* ConfigManager;
|
|
172
|
-
const pendingStore = yield* PendingInitStore;
|
|
173
|
-
const registry = yield* HarnessRegistry;
|
|
174
|
-
const run = Effect.fn('StatusService.run')(function* (request) {
|
|
175
|
-
yield* Effect.annotateCurrentSpan({ harness: request.harness, scope: request.scope });
|
|
176
|
-
return yield* Effect.gen(function* () {
|
|
177
|
-
yield* configManager
|
|
178
|
-
.inspectSecureStorage()
|
|
179
|
-
.pipe(Effect.withTracerEnabled(false), Effect.mapError(mapCredentialError));
|
|
180
|
-
const auth = yield* authStatus(configManager).pipe(Effect.withTracerEnabled(false));
|
|
181
|
-
const apiUrl = yield* configManager
|
|
182
|
-
.getApiUrl()
|
|
183
|
-
.pipe(Effect.withTracerEnabled(false), Effect.mapError(mapCredentialError));
|
|
184
|
-
const canonicalScopeRoot = yield* pendingStore
|
|
185
|
-
.canonicalScopeRoot(request.scope)
|
|
186
|
-
.pipe(Effect.withTracerEnabled(false), Effect.mapError(mapPendingError));
|
|
187
|
-
const key = {
|
|
188
|
-
apiOrigin: apiUrl.origin,
|
|
189
|
-
clientId: CLI_AUTHORIZATION_CLIENT_ID,
|
|
190
|
-
harness: 'agent-harnesses',
|
|
191
|
-
scope: request.scope,
|
|
192
|
-
canonicalScopeRoot,
|
|
193
|
-
};
|
|
194
|
-
const pending = yield* pendingStore
|
|
195
|
-
.peek(key)
|
|
196
|
-
.pipe(Effect.withTracerEnabled(false), Effect.mapError(mapPendingError));
|
|
197
|
-
const inspection = yield* registry.inspect(request.harness, request.scope).pipe(Effect.withTracerEnabled(false), Effect.mapError(() => statusError('harness_inspection_failed', true)), Effect.flatMap((inspection) => validateInspection(request.harness, inspection)));
|
|
198
|
-
const candidate = {
|
|
199
|
-
schemaVersion: 1,
|
|
200
|
-
status: 'ok',
|
|
201
|
-
harness: request.harness,
|
|
202
|
-
scope: request.scope,
|
|
203
|
-
cli: { version: CLI_VERSION },
|
|
204
|
-
auth,
|
|
205
|
-
pendingAuthorization: yield* pendingStatus(pending),
|
|
206
|
-
installation: installationStatus(inspection, request.scope),
|
|
207
|
-
};
|
|
208
|
-
return yield* Schema.decodeUnknown(StatusResult)(candidate).pipe(Effect.mapError(() => statusError('invalid_status_result', false)));
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
return { run };
|
|
212
|
-
}),
|
|
213
|
-
}) {
|
|
214
|
-
}
|
|
215
|
-
//# sourceMappingURL=Status.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Status.js","sourceRoot":"","sources":["../../../src/Init/Status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { Config, Console, Effect, Match, Schema } from 'effect';
|
|
3
|
-
import { ConfigIo, cliShellCommand, DIRECT_CLI } from '../Domain.js';
|
|
4
|
-
/** Claude Code WebFetch hook invocation persisted in harness settings. */
|
|
5
|
-
export const HOOK_INVOCATION = 'expandai hook claude-code';
|
|
6
|
-
export const HOOK_COMMAND = HOOK_INVOCATION;
|
|
7
|
-
const HOOK_ARGS = ['hook', 'claude-code'];
|
|
8
|
-
/**
|
|
9
|
-
* The hook line for a resolved CLI. Defaults to the bare `expandai` command;
|
|
10
|
-
* when the CLI is not on PATH — an `npx expandai init` with no global install —
|
|
11
|
-
* `CliInvocation` resolves to the npx form and the written hook stays runnable.
|
|
12
|
-
*/
|
|
13
|
-
export function hookCommandFor(cli = DIRECT_CLI) {
|
|
14
|
-
return cliShellCommand(cli, HOOK_ARGS);
|
|
15
|
-
}
|
|
16
|
-
export const WEBFETCH_MATCHER = 'WebFetch';
|
|
17
|
-
export const HookCommandEntry = Schema.Struct({
|
|
18
|
-
type: Schema.Literal('command'),
|
|
19
|
-
command: Schema.String,
|
|
20
|
-
expandaiProfileVersion: Schema.optional(Schema.String),
|
|
21
|
-
/** Whether this install added the `WebFetch` deny rule — see `makeExpandaiMatcher`. */
|
|
22
|
-
expandaiManagedDeny: Schema.optional(Schema.Boolean),
|
|
23
|
-
}, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
|
|
24
|
-
export const HookMatcher = Schema.Struct({
|
|
25
|
-
matcher: Schema.optional(Schema.String),
|
|
26
|
-
hooks: Schema.Array(HookCommandEntry),
|
|
27
|
-
}, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
|
|
28
|
-
const HooksSection = Schema.Struct({ PreToolUse: Schema.optional(Schema.Array(HookMatcher)) }, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
|
|
29
|
-
const PermissionsSection = Schema.Struct({ deny: Schema.optional(Schema.Array(Schema.String)) }, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
|
|
30
|
-
export const SettingsSchema = Schema.parseJson(Schema.Struct({
|
|
31
|
-
hooks: Schema.optionalWith(HooksSection, { default: () => ({}) }),
|
|
32
|
-
permissions: Schema.optional(PermissionsSection),
|
|
33
|
-
}, Schema.Record({ key: Schema.String, value: Schema.Unknown })), { space: 2 });
|
|
34
|
-
export function isExpandaiHookCommand(command) {
|
|
35
|
-
const value = command.trim();
|
|
36
|
-
const invocation = String.raw `expandai(?:\.exe)?\s+hook\s+(?:claude-code|claude)`;
|
|
37
|
-
const direct = new RegExp(String.raw `^(?:npx\s+-y\s+)?${invocation}$`, 'u');
|
|
38
|
-
const absolute = new RegExp(String.raw `^(?:"(?:[A-Za-z]:\\|/)[^"]*[\\/]expandai(?:\.exe)?"|'(?:[A-Za-z]:\\|/)[^']*[\\/]expandai(?:\.exe)?'|(?:[A-Za-z]:\\|/)[^\s]*[\\/]expandai(?:\.exe)?)\s+hook\s+(?:claude-code|claude)$`, 'u');
|
|
39
|
-
const shellFallback = /^if\s+command\s+-v\s+expandai\s+>\/dev\/null\s+2>&1;\s*then\s+expandai\s+hook\s+(?:claude-code|claude);\s*else\s+npx\s+-y\s+expandai\s+hook\s+(?:claude-code|claude);\s*fi$/u;
|
|
40
|
-
return direct.test(value) || absolute.test(value) || shellFallback.test(value);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Nothing here writes to `settings.json`, and nothing here removes from it.
|
|
44
|
-
*
|
|
45
|
-
* A `WebFetch` deny entry is a bare string with nowhere to record who wrote it,
|
|
46
|
-
* and our hook is not proof either: `hook install` used to write the hook on its
|
|
47
|
-
* own, so a settings file carrying our hook and a `WebFetch` deny may well hold a
|
|
48
|
-
* rule the user added afterwards. Removing it would revoke a restriction its
|
|
49
|
-
* owner chose. Since Claude Code no longer gets a hook or a deny rule from us,
|
|
50
|
-
* there is nothing of ours left to clean up, and guessing is the only thing a
|
|
51
|
-
* cleanup pass could do.
|
|
52
|
-
*/
|
|
53
|
-
export class ClaudeHook extends Effect.Service()('@expandai/cli/Install/Claude/Hook', {
|
|
54
|
-
dependencies: [ConfigIo.Default],
|
|
55
|
-
effect: Effect.gen(function* () {
|
|
56
|
-
const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
|
|
57
|
-
const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
|
|
58
|
-
const pathFor = Effect.fn(function* (scope) {
|
|
59
|
-
return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.claude/settings.json`)), Match.when('project', () => Effect.succeed(`${cwd}/.claude/settings.json`)), Match.exhaustive);
|
|
60
|
-
});
|
|
61
|
-
const NOTICE = 'expandai does not install a WebFetch hook for Claude Code — the MCP server and runtime skill replace it, and neither can disable a built-in tool.';
|
|
62
|
-
/**
|
|
63
|
-
* Kept as a no-op rather than deleted so `hook install|uninstall claude-code`
|
|
64
|
-
* still resolves. Both say what the profile is instead of touching
|
|
65
|
-
* `settings.json`, which expandai no longer writes for Claude Code.
|
|
66
|
-
*/
|
|
67
|
-
const install = Effect.fn('ClaudeHook.install')(function* (_scope) {
|
|
68
|
-
yield* Console.log(NOTICE);
|
|
69
|
-
});
|
|
70
|
-
const uninstall = Effect.fn('ClaudeHook.uninstall')(function* (_scope) {
|
|
71
|
-
yield* Console.log(NOTICE);
|
|
72
|
-
});
|
|
73
|
-
return { install, uninstall, pathFor };
|
|
74
|
-
}),
|
|
75
|
-
}) {
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=Hook.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Hook.js","sourceRoot":"","sources":["../../../../src/Install/Claude/Hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/D,OAAO,EAAmB,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGrF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAG,2BAA2B,CAAA;AAC1D,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAA;AAC3C,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,aAAa,CAAU,CAAA;AAElD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAG,GAAe,UAAU;IAC1D,OAAO,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;AACvC,CAAC;AACD,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAA;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAC5C;IACC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,sBAAsB,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACtD,uFAAuF;IACvF,mBAAmB,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;CACpD,EACD,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAC5D,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CACvC;IACC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACrC,EACD,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAC5D,CAAA;AAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CACjC,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,EAC1D,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAC5D,CAAA;AAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CACvC,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EACtD,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAC5D,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAC7C,MAAM,CAAC,MAAM,CACZ;IACC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAA6B,EAAE,CAAC;IAC7F,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CAChD,EACD,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAC5D,EACD,EAAE,KAAK,EAAE,CAAC,EAAE,CACZ,CAAA;AAOD,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAA,oDAAoD,CAAA;IACjF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,oBAAoB,UAAU,GAAG,EAAE,GAAG,CAAC,CAAA;IAC3E,MAAM,QAAQ,GAAG,IAAI,MAAM,CAC1B,MAAM,CAAC,GAAG,CAAA,sLAAsL,EAChM,GAAG,CACH,CAAA;IACD,MAAM,aAAa,GAClB,8KAA8K,CAAA;IAC/K,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC/E,CAAC;AAED;;;;;;;;;;GAUG;AAEH,MAAM,OAAO,UAAW,SAAQ,MAAM,CAAC,OAAO,EAAc,CAAC,mCAAmC,EAAE;IACjG,YAAY,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAC7E,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAE/E,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAmB;YACvD,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,wBAAwB,CAAC,CAAC,EAC3E,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,wBAAwB,CAAC,CAAC,EAC3E,KAAK,CAAC,UAAU,CAChB,CAAA;QACF,CAAC,CAAC,CAAA;QAEF,MAAM,MAAM,GACX,mJAAmJ,CAAA;QAEpJ;;;;WAIG;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAoB;YAC9E,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAoB;YAClF,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAW,CAAA;IAChD,CAAC,CAAC;CACF,CAAC;CAAG"}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { Config, Console, Effect, Match, Record, Schema } from 'effect';
|
|
3
|
-
import { ConfigIo, DIRECT_CLI, McpParseError, McpServersConfigSchema, McpWriteError, SERVER_KEY, } from '../Domain.js';
|
|
4
|
-
/** Claude Code MCP descriptor stored under the Expand-owned server key. */
|
|
5
|
-
export class Entry extends Schema.Class('ClaudeMcpEntry')({
|
|
6
|
-
type: Schema.Literal('stdio'),
|
|
7
|
-
command: Schema.NonEmptyTrimmedString,
|
|
8
|
-
args: Schema.Array(Schema.String),
|
|
9
|
-
env: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.String })),
|
|
10
|
-
}) {
|
|
11
|
-
}
|
|
12
|
-
const MCP_ARGS = ['mcp', 'run'];
|
|
13
|
-
/** Claude execs the descriptor directly, so `command`/`args` stay separate. */
|
|
14
|
-
export function claudeMcpEntry(cli = DIRECT_CLI) {
|
|
15
|
-
return new Entry({
|
|
16
|
-
type: 'stdio',
|
|
17
|
-
command: cli.command,
|
|
18
|
-
args: [...cli.args, ...MCP_ARGS],
|
|
19
|
-
env: { EXPANDAI_HARNESS: 'claude-code' },
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
export const CLAUDE_MCP_ENTRY = claudeMcpEntry();
|
|
23
|
-
function isUnknownRecord(value) {
|
|
24
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
25
|
-
}
|
|
26
|
-
function isCurrentEntry(value, expected) {
|
|
27
|
-
if (!isUnknownRecord(value))
|
|
28
|
-
return false;
|
|
29
|
-
const args = value.args;
|
|
30
|
-
const env = value.env;
|
|
31
|
-
return (value.type === expected.type &&
|
|
32
|
-
value.command === expected.command &&
|
|
33
|
-
Array.isArray(args) &&
|
|
34
|
-
args.length === expected.args.length &&
|
|
35
|
-
args.every((arg, index) => arg === expected.args[index]) &&
|
|
36
|
-
isUnknownRecord(env) &&
|
|
37
|
-
env.EXPANDAI_HARNESS === 'claude-code');
|
|
38
|
-
}
|
|
39
|
-
export function planClaudeMcp(config, cli = DIRECT_CLI) {
|
|
40
|
-
const entry = claudeMcpEntry(cli);
|
|
41
|
-
if (isCurrentEntry(config.mcpServers[SERVER_KEY], entry))
|
|
42
|
-
return { changed: false, config };
|
|
43
|
-
return {
|
|
44
|
-
changed: true,
|
|
45
|
-
config: {
|
|
46
|
-
...config,
|
|
47
|
-
mcpServers: { ...config.mcpServers, [SERVER_KEY]: entry },
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
export function planClaudeMcpRemoval(config) {
|
|
52
|
-
if (!(SERVER_KEY in config.mcpServers))
|
|
53
|
-
return { changed: false, config };
|
|
54
|
-
return {
|
|
55
|
-
changed: true,
|
|
56
|
-
config: { ...config, mcpServers: Record.remove(config.mcpServers, SERVER_KEY) },
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
export class ClaudeMcp extends Effect.Service()('@expandai/cli/Install/Claude/Mcp', {
|
|
60
|
-
dependencies: [ConfigIo.Default],
|
|
61
|
-
effect: Effect.gen(function* () {
|
|
62
|
-
const io = yield* ConfigIo;
|
|
63
|
-
const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
|
|
64
|
-
const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
|
|
65
|
-
const pathFor = Effect.fn(function* (scope) {
|
|
66
|
-
return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.claude.json`)), Match.when('project', () => Effect.succeed(`${cwd}/.mcp.json`)), Match.exhaustive);
|
|
67
|
-
});
|
|
68
|
-
const readConfig = Effect.fn(function* (file) {
|
|
69
|
-
return yield* io
|
|
70
|
-
.read(file, McpServersConfigSchema)
|
|
71
|
-
.pipe(Effect.mapError((error) => new McpParseError({ path: file, error })));
|
|
72
|
-
});
|
|
73
|
-
const writeConfig = Effect.fn(function* (file, value) {
|
|
74
|
-
yield* io
|
|
75
|
-
.write(file, value, McpServersConfigSchema)
|
|
76
|
-
.pipe(Effect.mapError((error) => new McpWriteError({ path: file, error })));
|
|
77
|
-
});
|
|
78
|
-
const install = Effect.fn(function* (scope) {
|
|
79
|
-
const file = yield* pathFor(scope);
|
|
80
|
-
const plan = planClaudeMcp(yield* readConfig(file));
|
|
81
|
-
if (plan.changed)
|
|
82
|
-
yield* writeConfig(file, plan.config);
|
|
83
|
-
yield* Console.log(`Installed expandai MCP server into ${file}`);
|
|
84
|
-
});
|
|
85
|
-
const uninstall = Effect.fn(function* (scope) {
|
|
86
|
-
const file = yield* pathFor(scope);
|
|
87
|
-
const plan = planClaudeMcpRemoval(yield* readConfig(file));
|
|
88
|
-
if (!plan.changed)
|
|
89
|
-
return;
|
|
90
|
-
yield* writeConfig(file, plan.config);
|
|
91
|
-
yield* Console.log(`Removed expandai MCP server from ${file}`);
|
|
92
|
-
});
|
|
93
|
-
const isInstalled = Effect.fn(function* (scope) {
|
|
94
|
-
const file = yield* pathFor(scope);
|
|
95
|
-
return SERVER_KEY in (yield* readConfig(file)).mcpServers;
|
|
96
|
-
});
|
|
97
|
-
return { install, uninstall, isInstalled, pathFor };
|
|
98
|
-
}),
|
|
99
|
-
}) {
|
|
100
|
-
}
|
|
101
|
-
//# sourceMappingURL=Mcp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Mcp.js","sourceRoot":"","sources":["../../../../src/Install/Claude/Mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { FileSystem, Path } from '@effect/platform';
|
|
3
|
-
import { NodeFileSystem, NodePath } from '@effect/platform-node';
|
|
4
|
-
import { Config, Effect, Match } from 'effect';
|
|
5
|
-
import { CLI_VERSION } from '../../Version.js';
|
|
6
|
-
export const SKILL_NAME = 'expandai';
|
|
7
|
-
export const SKILL_FILE_NAME = 'SKILL.md';
|
|
8
|
-
const PROFILE_VERSION_LINE = /^(\s*expandai-profile-version:\s*).+$/mu;
|
|
9
|
-
export function renderClaudeSkill(source, profileVersion = CLI_VERSION) {
|
|
10
|
-
if (!PROFILE_VERSION_LINE.test(source)) {
|
|
11
|
-
throw new Error('Bundled Expand skill is missing expandai-profile-version metadata');
|
|
12
|
-
}
|
|
13
|
-
return source.replace(PROFILE_VERSION_LINE, `$1${profileVersion}`);
|
|
14
|
-
}
|
|
15
|
-
export function planClaudeSkill(current, source, profileVersion = CLI_VERSION) {
|
|
16
|
-
const text = renderClaudeSkill(source, profileVersion);
|
|
17
|
-
return { changed: current !== text, text };
|
|
18
|
-
}
|
|
19
|
-
const makeClaudeSkill = Effect.gen(function* () {
|
|
20
|
-
const fileSystem = yield* FileSystem.FileSystem;
|
|
21
|
-
const path = yield* Path.Path;
|
|
22
|
-
const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
|
|
23
|
-
const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
|
|
24
|
-
const moduleFile = yield* path.fromFileUrl(new URL(import.meta.url));
|
|
25
|
-
const sourceFile = path.resolve(path.dirname(moduleFile), '..', '..', '..', 'skills', SKILL_NAME, SKILL_FILE_NAME);
|
|
26
|
-
const pathFor = Effect.fn(function* (scope) {
|
|
27
|
-
return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(path.join(home, '.claude', 'skills', SKILL_NAME))), Match.when('project', () => Effect.succeed(path.join(cwd, '.claude', 'skills', SKILL_NAME))), Match.exhaustive);
|
|
28
|
-
});
|
|
29
|
-
const source = Effect.fn('ClaudeSkill.source')(function* () {
|
|
30
|
-
return yield* fileSystem.readFileString(sourceFile);
|
|
31
|
-
});
|
|
32
|
-
const install = Effect.fn('ClaudeSkill.install')(function* (scope) {
|
|
33
|
-
const target = yield* pathFor(scope);
|
|
34
|
-
const targetFile = path.join(target, SKILL_FILE_NAME);
|
|
35
|
-
const current = (yield* fileSystem.exists(targetFile)) ? yield* fileSystem.readFileString(targetFile) : undefined;
|
|
36
|
-
const plan = planClaudeSkill(current, yield* source());
|
|
37
|
-
if (plan.changed) {
|
|
38
|
-
yield* fileSystem.makeDirectory(target, { recursive: true });
|
|
39
|
-
yield* fileSystem.writeFileString(targetFile, plan.text);
|
|
40
|
-
}
|
|
41
|
-
return target;
|
|
42
|
-
});
|
|
43
|
-
const uninstall = Effect.fn('ClaudeSkill.uninstall')(function* (scope) {
|
|
44
|
-
const target = yield* pathFor(scope);
|
|
45
|
-
if (yield* fileSystem.exists(target))
|
|
46
|
-
yield* fileSystem.remove(target, { recursive: true });
|
|
47
|
-
return target;
|
|
48
|
-
});
|
|
49
|
-
return { install, uninstall, pathFor, source };
|
|
50
|
-
});
|
|
51
|
-
export class ClaudeSkill extends Effect.Service()('@expandai/cli/Install/Claude/Skill', {
|
|
52
|
-
dependencies: [NodeFileSystem.layer, NodePath.layer],
|
|
53
|
-
effect: makeClaudeSkill,
|
|
54
|
-
}) {
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=Skill.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Skill.js","sourceRoot":"","sources":["../../../../src/Install/Claude/Skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { Config, Console, Effect, Match, Record, Schema } from 'effect';
|
|
3
|
-
import { parse, stringify } from 'smol-toml';
|
|
4
|
-
import { CliInvocation, ConfigIo, McpParseError, McpWriteError, SERVER_KEY } from '../Domain.js';
|
|
5
|
-
export class Entry extends Schema.Class('CodexMcpEntry')({
|
|
6
|
-
command: Schema.NonEmptyTrimmedString,
|
|
7
|
-
args: Schema.Array(Schema.String),
|
|
8
|
-
env: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.String })),
|
|
9
|
-
enabled: Schema.Boolean,
|
|
10
|
-
}) {
|
|
11
|
-
}
|
|
12
|
-
function isRecord(value) {
|
|
13
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
14
|
-
}
|
|
15
|
-
const getMcpServers = Effect.fn(function* (config) {
|
|
16
|
-
const servers = config.mcp_servers;
|
|
17
|
-
return isRecord(servers) ? servers : {};
|
|
18
|
-
});
|
|
19
|
-
function toStringifyValue(value) {
|
|
20
|
-
// smol-toml's stringify type accepts any; keep the unsafe boundary local.
|
|
21
|
-
return value;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Codex MCP descriptor — Codex stores MCP servers in TOML config under
|
|
25
|
-
* `[mcp_servers.<name>]`.
|
|
26
|
-
*
|
|
27
|
-
* - global → `~/.codex/config.toml`
|
|
28
|
-
* - project → `<cwd>/.codex/config.toml`
|
|
29
|
-
*/
|
|
30
|
-
export class CodexMcp extends Effect.Service()('@expandai/cli/Install/Codex/Mcp', {
|
|
31
|
-
dependencies: [ConfigIo.Default, CliInvocation.Default],
|
|
32
|
-
effect: Effect.gen(function* () {
|
|
33
|
-
const io = yield* ConfigIo;
|
|
34
|
-
const cli = yield* CliInvocation;
|
|
35
|
-
const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
|
|
36
|
-
const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
|
|
37
|
-
const pathFor = Effect.fn(function* (scope) {
|
|
38
|
-
return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.codex/config.toml`)), Match.when('project', () => Effect.succeed(`${cwd}/.codex/config.toml`)), Match.exhaustive);
|
|
39
|
-
});
|
|
40
|
-
const readConfig = Effect.fn(function* (file) {
|
|
41
|
-
const text = yield* io.readText(file);
|
|
42
|
-
return yield* Effect.try({
|
|
43
|
-
try: () => parse(text, { integersAsBigInt: false }),
|
|
44
|
-
catch: (error) => new McpParseError({ path: file, error }),
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
const writeConfig = Effect.fn(function* (file, value) {
|
|
48
|
-
const encoded = yield* Effect.try({
|
|
49
|
-
try: () => stringify(toStringifyValue(value)),
|
|
50
|
-
catch: (error) => new McpWriteError({ path: file, error }),
|
|
51
|
-
});
|
|
52
|
-
yield* io.writeText(file, encoded).pipe(Effect.mapError((error) => new McpWriteError({ path: file, error })));
|
|
53
|
-
});
|
|
54
|
-
const install = Effect.fn(function* (scope) {
|
|
55
|
-
const file = yield* pathFor(scope);
|
|
56
|
-
const config = yield* readConfig(file);
|
|
57
|
-
const servers = yield* getMcpServers(config);
|
|
58
|
-
const invocation = yield* cli.resolve();
|
|
59
|
-
const entryModel = new Entry({
|
|
60
|
-
command: invocation.command,
|
|
61
|
-
args: [...invocation.args, 'mcp', 'run'],
|
|
62
|
-
env: { EXPANDAI_HARNESS: 'codex' },
|
|
63
|
-
enabled: true,
|
|
64
|
-
});
|
|
65
|
-
const entry = {
|
|
66
|
-
command: entryModel.command,
|
|
67
|
-
args: [...entryModel.args],
|
|
68
|
-
env: { ...entryModel.env },
|
|
69
|
-
enabled: entryModel.enabled,
|
|
70
|
-
};
|
|
71
|
-
yield* writeConfig(file, {
|
|
72
|
-
...config,
|
|
73
|
-
mcp_servers: Record.set(servers, SERVER_KEY, entry),
|
|
74
|
-
});
|
|
75
|
-
yield* Console.log(`Installed expandai MCP server into ${file}`);
|
|
76
|
-
});
|
|
77
|
-
const uninstall = Effect.fn(function* (scope) {
|
|
78
|
-
const file = yield* pathFor(scope);
|
|
79
|
-
const config = yield* readConfig(file);
|
|
80
|
-
const servers = yield* getMcpServers(config);
|
|
81
|
-
if (!(SERVER_KEY in servers)) {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
yield* writeConfig(file, { ...config, mcp_servers: Record.remove(servers, SERVER_KEY) });
|
|
85
|
-
yield* Console.log(`Removed expandai MCP server from ${file}`);
|
|
86
|
-
});
|
|
87
|
-
const isInstalled = Effect.fn(function* (scope) {
|
|
88
|
-
const file = yield* pathFor(scope);
|
|
89
|
-
const config = yield* readConfig(file);
|
|
90
|
-
const servers = yield* getMcpServers(config);
|
|
91
|
-
return SERVER_KEY in servers;
|
|
92
|
-
});
|
|
93
|
-
return { install, uninstall, isInstalled, pathFor };
|
|
94
|
-
}),
|
|
95
|
-
}) {
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=Mcp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Mcp.js","sourceRoot":"","sources":["../../../../src/Install/Codex/Mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { homedir } from 'node:os';
|
|
2
|
-
import { Config, Effect, Match } from 'effect';
|
|
3
|
-
import { SkillIo } from '../Domain.js';
|
|
4
|
-
/**
|
|
5
|
-
* Codex skills use the open agent skills locations:
|
|
6
|
-
*
|
|
7
|
-
* - global → `~/.agents/skills/<name>/`
|
|
8
|
-
* - project → `<cwd>/.agents/skills/<name>/`
|
|
9
|
-
*/
|
|
10
|
-
export const SKILL_NAME = 'expandai';
|
|
11
|
-
export class CodexSkill extends Effect.Service()('@expandai/cli/Install/Codex/Skill', {
|
|
12
|
-
dependencies: [SkillIo.Default],
|
|
13
|
-
effect: Effect.gen(function* () {
|
|
14
|
-
const io = yield* SkillIo;
|
|
15
|
-
const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
|
|
16
|
-
const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
|
|
17
|
-
const pathFor = Effect.fn(function* (scope) {
|
|
18
|
-
return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.agents/skills/${SKILL_NAME}`)), Match.when('project', () => Effect.succeed(`${cwd}/.agents/skills/${SKILL_NAME}`)), Match.exhaustive);
|
|
19
|
-
});
|
|
20
|
-
const install = Effect.fn(function* (scope) {
|
|
21
|
-
return yield* io.install(yield* pathFor(scope));
|
|
22
|
-
});
|
|
23
|
-
const uninstall = Effect.fn(function* (scope) {
|
|
24
|
-
return yield* io.uninstall(yield* pathFor(scope));
|
|
25
|
-
});
|
|
26
|
-
const isCurrent = Effect.fn(function* (scope) {
|
|
27
|
-
return yield* io.isCurrent(yield* pathFor(scope));
|
|
28
|
-
});
|
|
29
|
-
return { install, uninstall, isCurrent, pathFor };
|
|
30
|
-
}),
|
|
31
|
-
}) {
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=Skill.js.map
|