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/src/CommandPath.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Telemetry-safe command-path extraction. Only tokens that sit in legal
|
|
3
|
-
* command-path positions of the tree below are ever reported — never
|
|
4
|
-
* free-form args, URLs, or queries. The walk stops at the first token that
|
|
5
|
-
* isn't a subcommand of the current node, so positional user input can't
|
|
6
|
-
* leak even when it happens to equal a command word
|
|
7
|
-
* (`expandai search snap_abc login` reports just `search`). Choice-arg
|
|
8
|
-
* values (hosts, scopes) are positional data and deliberately absent.
|
|
9
|
-
*/
|
|
10
|
-
const COMMAND_TREE = new Map<string, ReadonlySet<string>>([
|
|
11
|
-
['fetch', new Set()],
|
|
12
|
-
['search', new Set()],
|
|
13
|
-
['login', new Set()],
|
|
14
|
-
['whoami', new Set()],
|
|
15
|
-
['logout', new Set()],
|
|
16
|
-
['init', new Set()],
|
|
17
|
-
['status', new Set()],
|
|
18
|
-
['uninstall', new Set()],
|
|
19
|
-
['mcp', new Set(['run', 'install', 'uninstall'])],
|
|
20
|
-
['skill', new Set(['install', 'uninstall'])],
|
|
21
|
-
['hook', new Set(['claude-code', 'opencode', 'install', 'uninstall'])],
|
|
22
|
-
['telemetry', new Set(['status', 'enable', 'disable'])],
|
|
23
|
-
])
|
|
24
|
-
|
|
25
|
-
export function commandFromArgv(argv: readonly string[]): string {
|
|
26
|
-
const [first, second] = argv.slice(2)
|
|
27
|
-
const subcommands = first === undefined ? undefined : COMMAND_TREE.get(first)
|
|
28
|
-
if (first === undefined || subcommands === undefined) return '(none)'
|
|
29
|
-
return second !== undefined && subcommands.has(second) ? `${first} ${second}` : first
|
|
30
|
-
}
|
package/src/Commands/Fetch.ts
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { Args, Command, HelpDoc, Options } from '@effect/cli'
|
|
2
|
-
import { DEFAULT_PLAYGROUND_HOST, resolvePlaygroundHost } from '@expandai/sdk/Playground'
|
|
3
|
-
import { Console, Effect, Match, Option, Schema, String } from 'effect'
|
|
4
|
-
import { ApiClient } from '../ApiClient.js'
|
|
5
|
-
import { withCitationFooter } from '../Hook/SnapshotNote.js'
|
|
6
|
-
import { highlightMarkdownAnsi, shouldColorizeMarkdown } from '../MarkdownAnsi.js'
|
|
7
|
-
import { renderSnippets, withCitationUrls } from '../Snippets.js'
|
|
8
|
-
|
|
9
|
-
export class MarkdownUnavailable extends Schema.TaggedError<MarkdownUnavailable>()('MarkdownUnavailable', {
|
|
10
|
-
url: Schema.String,
|
|
11
|
-
}) {
|
|
12
|
-
get message() {
|
|
13
|
-
return `No markdown content was returned for ${this.url}`
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export class SnippetsUnavailable extends Schema.TaggedError<SnippetsUnavailable>()('SnippetsUnavailable', {
|
|
18
|
-
url: Schema.String,
|
|
19
|
-
query: Schema.String,
|
|
20
|
-
}) {
|
|
21
|
-
get message() {
|
|
22
|
-
return `No snippets were returned for ${this.url} matching '${this.query}'`
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// `Options.text('format').pipe(Options.withDefault('text'))` is optional, so
|
|
27
|
-
// when the user types `expandai fetch --format` (no value) the parser falls
|
|
28
|
-
// through to the default and `--format` is fed to the URL positional. WHATWG's
|
|
29
|
-
// URL parser accepts `https://--format` as a host-only URL, so without this
|
|
30
|
-
// guard the bogus value reaches the API. Reject flag-looking input up front,
|
|
31
|
-
// and require a hostname with a dot (or `localhost`) so `fetch help` etc. fail
|
|
32
|
-
// here with a clear message instead of via the API's schema decoder.
|
|
33
|
-
//
|
|
34
|
-
// `Args.mapEffect` is preferred over `Args.withSchema` because the latter
|
|
35
|
-
// renders failures with `ParseResult.TreeFormatter`, which dumps the full
|
|
36
|
-
// schema-decode trace.
|
|
37
|
-
export const parseUrlArg = Effect.fn('Fetch.parseUrlArg')(function* (raw: string) {
|
|
38
|
-
if (raw.startsWith('-')) {
|
|
39
|
-
return yield* Effect.fail(HelpDoc.p(`Missing argument <url> (received '${raw}')`))
|
|
40
|
-
}
|
|
41
|
-
const candidate = raw.startsWith('http://') || raw.startsWith('https://') ? raw : `https://${raw}`
|
|
42
|
-
const parsed = yield* Effect.try({
|
|
43
|
-
try: () => new URL(candidate),
|
|
44
|
-
catch: () => HelpDoc.p(`Invalid URL '${raw}'`),
|
|
45
|
-
})
|
|
46
|
-
if (!parsed.hostname.includes('.') && parsed.hostname !== 'localhost') {
|
|
47
|
-
return yield* Effect.fail(HelpDoc.p(`URL must contain a valid domain (got '${raw}')`))
|
|
48
|
-
}
|
|
49
|
-
return parsed
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
const url = Args.text({ name: 'url' }).pipe(Args.mapEffect(parseUrlArg))
|
|
53
|
-
|
|
54
|
-
const format = Options.text('format').pipe(
|
|
55
|
-
Options.withDefault('text'),
|
|
56
|
-
Options.withDescription('Output format (text or json)'),
|
|
57
|
-
Options.withSchema(Schema.Literal('text', 'json')),
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
const search = Options.text('search').pipe(
|
|
61
|
-
Options.optional,
|
|
62
|
-
Options.withDescription('Semantic search query. Returns relevant snippets instead of markdown.'),
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
const maxResults = Options.integer('max-results').pipe(
|
|
66
|
-
Options.withDefault(5),
|
|
67
|
-
Options.withDescription('Maximum snippets to return when using --search (default: 5)'),
|
|
68
|
-
Options.withSchema(Schema.Int.pipe(Schema.greaterThanOrEqualTo(1), Schema.lessThanOrEqualTo(50))),
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
const minScore = Options.float('min-score').pipe(
|
|
72
|
-
Options.withDefault(0.6),
|
|
73
|
-
Options.withDescription('Minimum snippet relevance score from 0 to 1 when using --search (default: 0.6)'),
|
|
74
|
-
Options.withSchema(Schema.Number.pipe(Schema.greaterThanOrEqualTo(0), Schema.lessThanOrEqualTo(1))),
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
const fetchConfig = {
|
|
78
|
-
url,
|
|
79
|
-
format,
|
|
80
|
-
search,
|
|
81
|
-
maxResults,
|
|
82
|
-
minScore,
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
interface FetchCommandConfig {
|
|
86
|
-
readonly url: URL
|
|
87
|
-
readonly format: 'text' | 'json'
|
|
88
|
-
readonly search: Option.Option<string>
|
|
89
|
-
readonly maxResults: number
|
|
90
|
-
readonly minScore: number
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export const FetchCommand: Command.Command<'fetch', never, unknown, FetchCommandConfig> = Command.make(
|
|
94
|
-
'fetch',
|
|
95
|
-
fetchConfig,
|
|
96
|
-
).pipe(
|
|
97
|
-
Command.withDescription('Fetch content from a URL as markdown or snippets'),
|
|
98
|
-
Command.withHandler(
|
|
99
|
-
Effect.fnUntraced(function* ({ format, maxResults, minScore, search, url }) {
|
|
100
|
-
const client = yield* ApiClient
|
|
101
|
-
const query = Option.getOrUndefined(search)
|
|
102
|
-
const fetchRequest =
|
|
103
|
-
query === undefined
|
|
104
|
-
? {
|
|
105
|
-
params: {},
|
|
106
|
-
payload: {
|
|
107
|
-
url: url.toString(),
|
|
108
|
-
include: { markdown: true },
|
|
109
|
-
},
|
|
110
|
-
}
|
|
111
|
-
: {
|
|
112
|
-
params: {},
|
|
113
|
-
payload: {
|
|
114
|
-
url: url.toString(),
|
|
115
|
-
include: { markdown: true, json: true },
|
|
116
|
-
search: {
|
|
117
|
-
query,
|
|
118
|
-
maxResults,
|
|
119
|
-
minScore,
|
|
120
|
-
},
|
|
121
|
-
},
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const output =
|
|
125
|
-
format === 'text' && query === undefined
|
|
126
|
-
? yield* client.fetchFetch(fetchRequest).pipe(
|
|
127
|
-
Effect.flatMap((markdown) =>
|
|
128
|
-
String.isNonEmpty(markdown)
|
|
129
|
-
? Effect.succeed(markdown)
|
|
130
|
-
: Effect.fail(new MarkdownUnavailable({ url: url.toString() })),
|
|
131
|
-
),
|
|
132
|
-
// Interactive terminals get ANSI-highlighted markdown. Piped output is
|
|
133
|
-
// being read by an agent, so it also carries the citation contract —
|
|
134
|
-
// this is the third fetch path (with the hook and the MCP tools) and
|
|
135
|
-
// was the only one that shipped evidence ids without telling anyone
|
|
136
|
-
// to use them.
|
|
137
|
-
Effect.map((markdown) =>
|
|
138
|
-
shouldColorizeMarkdown() ? highlightMarkdownAnsi(markdown) : withCitationFooter(markdown),
|
|
139
|
-
),
|
|
140
|
-
)
|
|
141
|
-
: yield* client.fetchFetchResult(fetchRequest).pipe(
|
|
142
|
-
Effect.flatMap((fetched) =>
|
|
143
|
-
Match.value(format).pipe(
|
|
144
|
-
Match.when('text', () => {
|
|
145
|
-
const snippets = fetched.data?.search?.snippets ?? []
|
|
146
|
-
return snippets.length === 0
|
|
147
|
-
? Effect.fail(new SnippetsUnavailable({ url: url.toString(), query: query ?? '' }))
|
|
148
|
-
: Effect.succeed(
|
|
149
|
-
renderSnippets(
|
|
150
|
-
fetched.meta.snapshotId,
|
|
151
|
-
resolvePlaygroundHost(fetched.meta.playground, DEFAULT_PLAYGROUND_HOST),
|
|
152
|
-
snippets,
|
|
153
|
-
),
|
|
154
|
-
)
|
|
155
|
-
}),
|
|
156
|
-
Match.when('json', () => {
|
|
157
|
-
// Snippets carry a citation link in every other output path
|
|
158
|
-
// (text here, and both MCP tools). Without it a JSON consumer
|
|
159
|
-
// cannot cite what it just searched.
|
|
160
|
-
const search = fetched.data?.search
|
|
161
|
-
const cited =
|
|
162
|
-
search == null
|
|
163
|
-
? fetched
|
|
164
|
-
: {
|
|
165
|
-
...fetched,
|
|
166
|
-
data: {
|
|
167
|
-
...fetched.data,
|
|
168
|
-
search: {
|
|
169
|
-
...search,
|
|
170
|
-
snippets: withCitationUrls(
|
|
171
|
-
fetched.meta.snapshotId,
|
|
172
|
-
resolvePlaygroundHost(fetched.meta.playground, DEFAULT_PLAYGROUND_HOST),
|
|
173
|
-
search.snippets,
|
|
174
|
-
),
|
|
175
|
-
},
|
|
176
|
-
},
|
|
177
|
-
}
|
|
178
|
-
return Schema.encode(Schema.parseJson(Schema.Unknown, { space: 2 }))(cited)
|
|
179
|
-
}),
|
|
180
|
-
Match.exhaustive,
|
|
181
|
-
),
|
|
182
|
-
),
|
|
183
|
-
)
|
|
184
|
-
|
|
185
|
-
yield* Console.log(output)
|
|
186
|
-
}, Effect.provide(ApiClient.Default)),
|
|
187
|
-
),
|
|
188
|
-
)
|
package/src/Commands/Hook.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { Args, Command } from '@effect/cli'
|
|
2
|
-
import { Effect } from 'effect'
|
|
3
|
-
import { ClaudeHook } from '../Hook/Claude.js'
|
|
4
|
-
import { OpencodeHook } from '../Hook/Opencode.js'
|
|
5
|
-
import { HookInstaller } from '../Install/Hook.js'
|
|
6
|
-
|
|
7
|
-
const ClaudeRunCommand = Command.make('claude-code').pipe(
|
|
8
|
-
Command.withDescription('Run the Claude Code WebFetch hook protocol over stdio'),
|
|
9
|
-
Command.withHandler(() => Effect.flatMap(ClaudeHook, (hook) => hook.runProtocol())),
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
const OpencodeRunCommand = Command.make('opencode').pipe(
|
|
13
|
-
Command.withDescription('Run the OpenCode webfetch plugin protocol over stdio'),
|
|
14
|
-
Command.withHandler(() => Effect.flatMap(OpencodeHook, (hook) => hook.runProtocol())),
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
const hostArg = Args.choice([
|
|
18
|
-
['claude-code', 'claude-code' as const],
|
|
19
|
-
['opencode', 'opencode' as const],
|
|
20
|
-
])
|
|
21
|
-
const scopeArg = Args.choice([
|
|
22
|
-
['global', 'global' as const],
|
|
23
|
-
['project', 'project' as const],
|
|
24
|
-
])
|
|
25
|
-
|
|
26
|
-
const InstallSubCommand = Command.make('install', { host: hostArg, scope: scopeArg }).pipe(
|
|
27
|
-
Command.withDescription('Install the expandai MCP server + webfetch hook for the chosen host + scope'),
|
|
28
|
-
Command.withHandler(({ host, scope }) =>
|
|
29
|
-
Effect.flatMap(HookInstaller, (installer) => installer.install(host, scope)),
|
|
30
|
-
),
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
const UninstallSubCommand = Command.make('uninstall', { host: hostArg, scope: scopeArg }).pipe(
|
|
34
|
-
Command.withDescription('Remove the expandai MCP server + webfetch hook for the chosen host + scope'),
|
|
35
|
-
Command.withHandler(({ host, scope }) =>
|
|
36
|
-
Effect.flatMap(HookInstaller, (installer) => installer.uninstall(host, scope)),
|
|
37
|
-
),
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
export const HumanHookCommand = Command.make('hook').pipe(
|
|
41
|
-
Command.withDescription('expandai hooks for AI coding assistants'),
|
|
42
|
-
Command.withSubcommands([ClaudeRunCommand, OpencodeRunCommand, InstallSubCommand, UninstallSubCommand]),
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
export const AgentHookCommand = Command.make('hook').pipe(
|
|
46
|
-
Command.withDescription('expandai hooks for AI coding assistants'),
|
|
47
|
-
Command.withSubcommands([ClaudeRunCommand, OpencodeRunCommand]),
|
|
48
|
-
)
|