@ghx-dev/core 0.2.2 → 0.3.1
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/.claude-plugin/plugin.json +3 -2
- package/dist/{chunk-T3L2VDOS.js → chunk-VCBQTH5J.js} +95 -5
- package/dist/chunk-VCBQTH5J.js.map +1 -0
- package/dist/cli/index.js +62 -31
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/skills/using-ghx/SKILL.md +23 -5
- package/dist/chunk-T3L2VDOS.js.map +0 -1
package/dist/cli/index.js
CHANGED
|
@@ -7,8 +7,10 @@ import {
|
|
|
7
7
|
executeTasks,
|
|
8
8
|
explainCapability,
|
|
9
9
|
extractArrayItemHints,
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
invalidateTokenCache,
|
|
11
|
+
listCapabilities,
|
|
12
|
+
resolveGithubToken
|
|
13
|
+
} from "../chunk-VCBQTH5J.js";
|
|
12
14
|
import "../chunk-H7CLZHRO.js";
|
|
13
15
|
import "../chunk-NQ53ETYV.js";
|
|
14
16
|
import "../chunk-TGL33GEA.js";
|
|
@@ -25,8 +27,9 @@ import {
|
|
|
25
27
|
} from "../chunk-C2KRRSSX.js";
|
|
26
28
|
|
|
27
29
|
// src/cli/index.ts
|
|
28
|
-
import { realpathSync } from "fs";
|
|
29
|
-
import {
|
|
30
|
+
import { readFileSync, realpathSync } from "fs";
|
|
31
|
+
import { dirname as dirname2, join as join2 } from "path";
|
|
32
|
+
import { fileURLToPath as fileURLToPath2, pathToFileURL } from "url";
|
|
30
33
|
|
|
31
34
|
// src/cli/commands/capabilities-explain.ts
|
|
32
35
|
function usage() {
|
|
@@ -211,13 +214,6 @@ function readStdin(timeoutMs = 1e4) {
|
|
|
211
214
|
});
|
|
212
215
|
});
|
|
213
216
|
}
|
|
214
|
-
function resolveGithubToken() {
|
|
215
|
-
const token = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;
|
|
216
|
-
if (!token || token.trim().length === 0) {
|
|
217
|
-
throw new Error("Missing GITHUB_TOKEN or GH_TOKEN for GraphQL transport");
|
|
218
|
-
}
|
|
219
|
-
return token;
|
|
220
|
-
}
|
|
221
217
|
async function executeGraphqlRequest(token, query, variables) {
|
|
222
218
|
const response = await fetch(GITHUB_GRAPHQL_ENDPOINT, {
|
|
223
219
|
method: "POST",
|
|
@@ -252,21 +248,27 @@ async function runCommand(argv = []) {
|
|
|
252
248
|
}
|
|
253
249
|
const { task, inputSource, skipGhPreflight, verbose } = parseRunFlags(argv);
|
|
254
250
|
const input = inputSource === "stdin" ? parseJsonInput(await readStdin()) : parseJsonInput(inputSource.raw);
|
|
255
|
-
const
|
|
256
|
-
const
|
|
251
|
+
const { token, source } = await resolveGithubToken();
|
|
252
|
+
const buildClient = (t) => createGithubClient({
|
|
257
253
|
async execute(query, variables) {
|
|
258
|
-
return executeGraphqlRequest(
|
|
254
|
+
return executeGraphqlRequest(t, query, variables);
|
|
259
255
|
}
|
|
260
256
|
});
|
|
261
|
-
const request = {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
const result = await executeTask(request, {
|
|
266
|
-
githubClient,
|
|
267
|
-
githubToken,
|
|
257
|
+
const request = { task, input };
|
|
258
|
+
let result = await executeTask(request, {
|
|
259
|
+
githubClient: buildClient(token),
|
|
260
|
+
githubToken: token,
|
|
268
261
|
skipGhPreflight
|
|
269
262
|
});
|
|
263
|
+
if (!result.ok && result.error?.code === errorCodes.Auth && source !== "env") {
|
|
264
|
+
await invalidateTokenCache();
|
|
265
|
+
const fresh = await resolveGithubToken();
|
|
266
|
+
result = await executeTask(request, {
|
|
267
|
+
githubClient: buildClient(fresh.token),
|
|
268
|
+
githubToken: fresh.token,
|
|
269
|
+
skipGhPreflight
|
|
270
|
+
});
|
|
271
|
+
}
|
|
270
272
|
const output = verbose ? result : compactRunResult(result);
|
|
271
273
|
process.stdout.write(`${JSON.stringify(output, null, verbose ? 2 : void 0)}
|
|
272
274
|
`);
|
|
@@ -308,13 +310,6 @@ function parseJsonSteps(raw) {
|
|
|
308
310
|
}
|
|
309
311
|
return parsed;
|
|
310
312
|
}
|
|
311
|
-
function resolveGithubToken2() {
|
|
312
|
-
const token = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;
|
|
313
|
-
if (!token || token.trim().length === 0) {
|
|
314
|
-
throw new Error("Missing GITHUB_TOKEN or GH_TOKEN for GraphQL transport");
|
|
315
|
-
}
|
|
316
|
-
return token;
|
|
317
|
-
}
|
|
318
313
|
async function fetchGqlPayload(token, query, variables) {
|
|
319
314
|
const response = await fetch(GITHUB_GRAPHQL_ENDPOINT2, {
|
|
320
315
|
method: "POST",
|
|
@@ -367,7 +362,7 @@ async function chainCommand(argv = []) {
|
|
|
367
362
|
try {
|
|
368
363
|
const { stepsSource, skipGhPreflight, verbose } = parseChainFlags(argv);
|
|
369
364
|
const steps = stepsSource === "stdin" ? parseJsonSteps(await readStdin()) : parseJsonSteps(stepsSource.raw);
|
|
370
|
-
const githubToken =
|
|
365
|
+
const { token: githubToken } = await resolveGithubToken();
|
|
371
366
|
const githubClient = createGithubClient({
|
|
372
367
|
async execute(query, variables) {
|
|
373
368
|
return executeGraphqlRequest2(githubToken, query, variables);
|
|
@@ -489,7 +484,7 @@ function parseArgs3(argv) {
|
|
|
489
484
|
}
|
|
490
485
|
function resolveSkillPath(scope) {
|
|
491
486
|
const base = scope === "user" ? homedir() : process.cwd();
|
|
492
|
-
return join(base, ".agents", "skills", "ghx", "SKILL.md");
|
|
487
|
+
return join(base, ".agents", "skills", "using-ghx", "SKILL.md");
|
|
493
488
|
}
|
|
494
489
|
function resolveTrackingPath() {
|
|
495
490
|
return join(homedir(), ".agents", "ghx", "setup-events.jsonl");
|
|
@@ -598,6 +593,16 @@ async function setupCommand(argv = []) {
|
|
|
598
593
|
await writeFile(skillPath, skillContent, "utf8");
|
|
599
594
|
process.stdout.write(`Setup complete: wrote ${skillPath}
|
|
600
595
|
`);
|
|
596
|
+
try {
|
|
597
|
+
const { source } = await resolveGithubToken();
|
|
598
|
+
if (source === "gh-cli") {
|
|
599
|
+
process.stdout.write("GitHub token cached from gh CLI (enables sandboxed agent access)\n");
|
|
600
|
+
}
|
|
601
|
+
} catch (error) {
|
|
602
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
603
|
+
process.stderr.write(`Warning: could not resolve GitHub token \u2014 ${detail}
|
|
604
|
+
`);
|
|
605
|
+
}
|
|
601
606
|
process.stdout.write("Try: ghx capabilities list\n");
|
|
602
607
|
await writeTrackingEvent({
|
|
603
608
|
track: parsed.track,
|
|
@@ -615,20 +620,46 @@ async function setupCommand(argv = []) {
|
|
|
615
620
|
}
|
|
616
621
|
|
|
617
622
|
// src/cli/index.ts
|
|
623
|
+
function resolveVersion() {
|
|
624
|
+
const cliDir = dirname2(fileURLToPath2(import.meta.url));
|
|
625
|
+
const candidates = [join2(cliDir, "..", "..", "package.json"), join2(cliDir, "..", "package.json")];
|
|
626
|
+
for (const candidate of candidates) {
|
|
627
|
+
try {
|
|
628
|
+
const pkg = JSON.parse(readFileSync(candidate, "utf8"));
|
|
629
|
+
if (pkg.version) {
|
|
630
|
+
return pkg.version;
|
|
631
|
+
}
|
|
632
|
+
} catch {
|
|
633
|
+
continue;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
return "unknown";
|
|
637
|
+
}
|
|
618
638
|
function usage3() {
|
|
619
639
|
return [
|
|
640
|
+
`ghx ${resolveVersion()} \u2014 GitHub execution router for AI agents`,
|
|
641
|
+
"",
|
|
620
642
|
"Usage:",
|
|
621
643
|
" ghx run <task> --input '<json>' | --input - [--check-gh-preflight]",
|
|
622
644
|
" ghx chain --steps '<json-array>' | --steps - [--check-gh-preflight]",
|
|
623
645
|
" ghx setup --scope <user|project> [--yes] [--dry-run] [--verify] [--track]",
|
|
624
646
|
" ghx capabilities list",
|
|
625
|
-
" ghx capabilities explain <capability_id>"
|
|
647
|
+
" ghx capabilities explain <capability_id>",
|
|
648
|
+
"",
|
|
649
|
+
"Flags:",
|
|
650
|
+
" -h, --help Show this help",
|
|
651
|
+
" -v, --version Show version"
|
|
626
652
|
].join("\n");
|
|
627
653
|
}
|
|
628
654
|
async function main(argv = process.argv.slice(2)) {
|
|
629
655
|
const [command, ...rest] = argv;
|
|
630
656
|
if (!command || command === "--help" || command === "-h") {
|
|
631
657
|
process.stdout.write(`${usage3()}
|
|
658
|
+
`);
|
|
659
|
+
return 0;
|
|
660
|
+
}
|
|
661
|
+
if (command === "--version" || command === "-V" || command === "-v") {
|
|
662
|
+
process.stdout.write(`ghx ${resolveVersion()}
|
|
632
663
|
`);
|
|
633
664
|
return 0;
|
|
634
665
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/capabilities-explain.ts","../../src/cli/commands/capabilities-list.ts","../../src/cli/formatters/compact.ts","../../src/cli/commands/run.ts","../../src/cli/commands/chain.ts","../../src/cli/commands/setup.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { realpathSync } from \"node:fs\"\nimport { pathToFileURL } from \"node:url\"\n\nimport { capabilitiesExplainCommand } from \"./commands/capabilities-explain.js\"\nimport { capabilitiesListCommand } from \"./commands/capabilities-list.js\"\nimport { chainCommand } from \"./commands/chain.js\"\nimport { runCommand } from \"./commands/run.js\"\nimport { setupCommand } from \"./commands/setup.js\"\n\nfunction usage(): string {\n return [\n \"Usage:\",\n \" ghx run <task> --input '<json>' | --input - [--check-gh-preflight]\",\n \" ghx chain --steps '<json-array>' | --steps - [--check-gh-preflight]\",\n \" ghx setup --scope <user|project> [--yes] [--dry-run] [--verify] [--track]\",\n \" ghx capabilities list\",\n \" ghx capabilities explain <capability_id>\",\n ].join(\"\\n\")\n}\n\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<number> {\n const [command, ...rest] = argv\n\n if (!command || command === \"--help\" || command === \"-h\") {\n process.stdout.write(`${usage()}\\n`)\n return 0\n }\n\n if (command === \"run\") {\n return runCommand(rest)\n }\n\n if (command === \"chain\") {\n return chainCommand(rest)\n }\n\n if (command === \"setup\") {\n return setupCommand(rest)\n }\n\n if (command === \"capabilities\") {\n const [subcommand, ...subcommandArgs] = rest\n\n if (!subcommand) {\n process.stderr.write(`Missing capabilities subcommand.\\n${usage()}\\n`)\n return 1\n }\n\n if (subcommand === \"list\") {\n return capabilitiesListCommand(subcommandArgs)\n }\n\n if (subcommand === \"explain\") {\n return capabilitiesExplainCommand(subcommandArgs)\n }\n\n process.stderr.write(`Unknown capabilities subcommand: ${subcommand}\\n${usage()}\\n`)\n return 1\n }\n\n process.stderr.write(`Unknown command: ${command}\\n${usage()}\\n`)\n return 1\n}\n\nconst isDirectRun = (() => {\n if (!process.argv[1]) {\n return false\n }\n\n try {\n const currentEntry = realpathSync(new URL(import.meta.url))\n const invokedEntry = realpathSync(process.argv[1])\n return currentEntry === invokedEntry || import.meta.url === pathToFileURL(process.argv[1]).href\n } catch {\n return import.meta.url === pathToFileURL(process.argv[1]).href\n }\n})()\n\nif (isDirectRun) {\n main().then(\n (exitCode) => {\n process.exitCode = exitCode\n },\n (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n process.stderr.write(`${message}\\n`)\n process.exit(1)\n },\n )\n}\n","import { explainCapability } from \"@core/core/registry/explain-capability.js\"\n\nfunction usage(): string {\n return \"Usage: ghx capabilities explain <capability_id> [--json]\"\n}\n\nfunction parseArgs(argv: string[]): { capabilityId: string | undefined; asJson: boolean } {\n const asJson = argv.includes(\"--json\")\n const capabilityId = argv.find((arg) => !arg.startsWith(\"-\"))\n return { capabilityId, asJson }\n}\n\nexport async function capabilitiesExplainCommand(argv: string[] = []): Promise<number> {\n const { capabilityId, asJson } = parseArgs(argv)\n\n if (!capabilityId) {\n process.stderr.write(`${usage()}\\n`)\n return 1\n }\n\n try {\n const explained = explainCapability(capabilityId)\n\n if (asJson) {\n process.stdout.write(`${JSON.stringify(explained)}\\n`)\n return 0\n }\n\n process.stdout.write(`${JSON.stringify(explained, null, 2)}\\n`)\n return 0\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n process.stderr.write(`${message}\\n`)\n return 1\n }\n}\n","import type { CapabilityListItem } from \"@core/core/registry/list-capabilities.js\"\nimport { listCapabilities } from \"@core/core/registry/list-capabilities.js\"\nimport { extractArrayItemHints } from \"@core/core/registry/schema-utils.js\"\n\nfunction parseArgs(argv: string[]): {\n asJson: boolean\n asCompact: boolean\n domain: string | undefined\n} {\n const domainIndex = argv.indexOf(\"--domain\")\n return {\n asJson: argv.includes(\"--json\"),\n asCompact: argv.includes(\"--compact\"),\n domain: domainIndex !== -1 ? argv[domainIndex + 1] : undefined,\n }\n}\n\nfunction formatCompact(capabilities: CapabilityListItem[]): string {\n const ids = new Set(capabilities.map((c) => c.capability_id))\n\n const lines = capabilities.map((item) => {\n const req = item.required_inputs.join(\",\")\n const opt = item.optional_inputs.map((o) => `${o}?`).join(\",\")\n const inputs = [req, opt].filter(Boolean).join(\",\")\n const sig = `${item.capability_id}(${inputs})`\n\n const addSibling = item.capability_id.replace(/\\.set$/, \".add\")\n const needsWarning = item.capability_id.endsWith(\".set\") && ids.has(addSibling)\n return needsWarning ? `${sig} [replaces all]` : sig\n })\n\n return lines.join(\"\\n\") + \"\\n\"\n}\n\nexport async function capabilitiesListCommand(argv: string[] = []): Promise<number> {\n const { asJson, asCompact, domain } = parseArgs(argv)\n const capabilities = listCapabilities(domain)\n\n if (capabilities.length === 0) {\n process.stderr.write(\n domain ? `No capabilities found for domain: ${domain}\\n` : \"No capabilities found\\n\",\n )\n return 1\n }\n\n if (asCompact) {\n process.stdout.write(formatCompact(capabilities))\n return 0\n }\n\n if (asJson) {\n process.stdout.write(`${JSON.stringify(capabilities)}\\n`)\n return 0\n }\n\n const maxIdLen = Math.max(...capabilities.map((c) => c.capability_id.length))\n const maxDescLen = Math.max(...capabilities.map((c) => c.description.length))\n\n const lines = capabilities.map((item) => {\n const id = item.capability_id.padEnd(maxIdLen)\n const desc = item.description.padEnd(maxDescLen)\n const required = item.required_inputs.join(\", \")\n const arrayHints = extractArrayItemHints({ properties: item.optional_inputs_detail })\n const optional = item.optional_inputs\n .map((n) => {\n const hints = arrayHints[n]\n return hints ? `${n}?[${hints.join(\", \")}]` : `${n}?`\n })\n .join(\", \")\n const inputs = optional.length > 0 ? `[${required}, ${optional}]` : `[${required}]`\n return `${id} - ${desc} ${inputs}`\n })\n process.stdout.write(`${lines.join(\"\\n\")}\\n`)\n return 0\n}\n","import type { ChainResultEnvelope, ResultEnvelope } from \"../../core/contracts/envelope.js\"\n\nexport type CompactRunResult =\n | { ok: true; data: unknown; pagination?: ResultEnvelope[\"meta\"][\"pagination\"] }\n | { ok: false; error: { code: string; message: string } }\n\nexport type CompactChainStepResult =\n | { task: string; ok: true; data?: unknown }\n | { task: string; ok: false; error: { code: string; message: string } }\n\nexport type CompactChainResult = {\n status: ChainResultEnvelope[\"status\"]\n results: CompactChainStepResult[]\n}\n\nexport function compactRunResult(envelope: ResultEnvelope): CompactRunResult {\n if (envelope.ok) {\n return envelope.meta.pagination !== undefined\n ? { ok: true, data: envelope.data, pagination: envelope.meta.pagination }\n : { ok: true, data: envelope.data }\n }\n const err = envelope.error\n return {\n ok: false,\n error: {\n code: err?.code ?? \"UNKNOWN\",\n message: err?.message ?? \"\",\n },\n }\n}\n\nexport function compactChainResult(envelope: ChainResultEnvelope): CompactChainResult {\n return {\n status: envelope.status,\n results: envelope.results.map((step) => {\n if (step.ok) {\n return step.data !== undefined\n ? { task: step.task, ok: true as const, data: step.data }\n : { task: step.task, ok: true as const }\n }\n return {\n task: step.task,\n ok: false as const,\n error: {\n code: step.error?.code ?? \"UNKNOWN\",\n message: step.error?.message ?? \"\",\n },\n }\n }),\n }\n}\n","import { compactRunResult } from \"@core/cli/formatters/compact.js\"\nimport type { TaskRequest } from \"../../core/contracts/task.js\"\nimport { executeTask } from \"../../core/routing/engine/index.js\"\nimport { createGithubClient } from \"../../gql/github-client.js\"\n\nconst GITHUB_GRAPHQL_ENDPOINT = \"https://api.github.com/graphql\"\n\ninterface ParsedRunFlags {\n task: string\n inputSource: \"stdin\" | { raw: string }\n skipGhPreflight: boolean\n verbose: boolean\n}\n\nexport function parseRunFlags(argv: string[]): ParsedRunFlags {\n const [task, ...rest] = argv\n if (!task || task.trim().length === 0) {\n throw new Error(\n \"Usage: ghx run <task> --input '<json>' | --input - [--check-gh-preflight] [--verbose]\",\n )\n }\n\n const inputIndex = rest.findIndex((arg) => arg === \"--input\")\n const inlineInput = rest.find((arg) => arg.startsWith(\"--input=\"))\n const inputCandidate = inputIndex >= 0 ? rest[inputIndex + 1] : undefined\n\n const verbose = rest.includes(\"--verbose\")\n\n if (inputCandidate === \"-\") {\n const skipGhPreflight = !rest.includes(\"--check-gh-preflight\")\n return { task, inputSource: \"stdin\", skipGhPreflight, verbose }\n }\n\n const inputRaw =\n inputCandidate && !inputCandidate.startsWith(\"--\")\n ? inputCandidate\n : inlineInput\n ? inlineInput.slice(\"--input=\".length)\n : undefined\n\n if (!inputRaw) {\n throw new Error(\"Missing --input JSON\")\n }\n\n const skipGhPreflight = !rest.includes(\"--check-gh-preflight\")\n return { task, inputSource: { raw: inputRaw }, skipGhPreflight, verbose }\n}\n\nfunction parseJsonInput(raw: string): Record<string, unknown> {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n throw new Error(\"Invalid JSON for --input\")\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"--input must be a JSON object\")\n }\n\n return parsed as Record<string, unknown>\n}\n\nexport function readStdin(timeoutMs = 10_000): Promise<string> {\n return new Promise((resolve, reject) => {\n const parts: string[] = []\n const stream = process.stdin\n const timer = setTimeout(() => {\n stream.destroy()\n reject(new Error(\"Timed out reading from stdin\"))\n }, timeoutMs)\n stream.setEncoding(\"utf8\")\n stream.on(\"data\", (chunk: string) => parts.push(chunk))\n stream.on(\"end\", () => {\n clearTimeout(timer)\n resolve(parts.join(\"\"))\n })\n stream.on(\"error\", (err: Error) => {\n clearTimeout(timer)\n reject(err)\n })\n })\n}\n\nfunction resolveGithubToken(): string {\n const token = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN\n if (!token || token.trim().length === 0) {\n throw new Error(\"Missing GITHUB_TOKEN or GH_TOKEN for GraphQL transport\")\n }\n\n return token\n}\n\nasync function executeGraphqlRequest<TData>(\n token: string,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<TData> {\n const response = await fetch(GITHUB_GRAPHQL_ENDPOINT, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n authorization: `Bearer ${token}`,\n \"user-agent\": \"ghx\",\n },\n body: JSON.stringify({ query, variables: variables ?? {} }),\n })\n\n const payload = (await response.json()) as {\n data?: TData\n errors?: Array<{ message?: string }>\n message?: string\n }\n\n if (!response.ok) {\n const message =\n payload.message ?? `GitHub GraphQL request failed with status ${response.status}`\n throw new Error(message)\n }\n\n if (Array.isArray(payload.errors) && payload.errors.length > 0) {\n const message = payload.errors[0]?.message ?? \"GitHub GraphQL returned errors\"\n throw new Error(message)\n }\n\n if (payload.data === undefined) {\n throw new Error(\"GitHub GraphQL response missing data\")\n }\n\n return payload.data\n}\n\nexport async function runCommand(argv: string[] = []): Promise<number> {\n if (argv.length === 0) {\n process.stdout.write(\n \"Usage: ghx run <task> --input '<json>' | --input - [--check-gh-preflight]\\n\",\n )\n return 1\n }\n\n const { task, inputSource, skipGhPreflight, verbose } = parseRunFlags(argv)\n const input =\n inputSource === \"stdin\" ? parseJsonInput(await readStdin()) : parseJsonInput(inputSource.raw)\n const githubToken = resolveGithubToken()\n\n const githubClient = createGithubClient({\n async execute<TData>(query: string, variables?: Record<string, unknown>): Promise<TData> {\n return executeGraphqlRequest<TData>(githubToken, query, variables)\n },\n })\n\n const request: TaskRequest = {\n task,\n input,\n }\n\n const result = await executeTask(request, {\n githubClient,\n githubToken,\n skipGhPreflight,\n })\n\n const output = verbose ? result : compactRunResult(result)\n process.stdout.write(`${JSON.stringify(output, null, verbose ? 2 : undefined)}\\n`)\n return 0\n}\n","import { compactChainResult } from \"@core/cli/formatters/compact.js\"\nimport { executeTasks } from \"@core/core/routing/engine/index.js\"\nimport { createResolutionCache } from \"@core/core/routing/resolution-cache.js\"\nimport { createGithubClient } from \"@core/gql/github-client.js\"\nimport type { GraphqlError, GraphqlRawResult } from \"@core/gql/transport.js\"\nimport { resolveGraphqlUrl } from \"@core/gql/transport.js\"\nimport { readStdin } from \"./run.js\"\n\nconst GITHUB_GRAPHQL_ENDPOINT = resolveGraphqlUrl()\n\ninterface ParsedChainFlags {\n stepsSource: \"stdin\" | { raw: string }\n skipGhPreflight: boolean\n verbose: boolean\n}\n\nexport function parseChainFlags(argv: string[]): ParsedChainFlags {\n const stepsIndex = argv.findIndex((arg) => arg === \"--steps\")\n const inlineSteps = argv.find((arg) => arg.startsWith(\"--steps=\"))\n const stepsCandidate = stepsIndex >= 0 ? argv[stepsIndex + 1] : undefined\n const verbose = argv.includes(\"--verbose\")\n\n if (stepsCandidate === \"-\") {\n const skipGhPreflight = !argv.includes(\"--check-gh-preflight\")\n return { stepsSource: \"stdin\", skipGhPreflight, verbose }\n }\n\n const stepsRaw =\n stepsCandidate && !stepsCandidate.startsWith(\"--\")\n ? stepsCandidate\n : inlineSteps\n ? inlineSteps.slice(\"--steps=\".length)\n : undefined\n\n if (!stepsRaw) {\n throw new Error(\"Missing --steps JSON\")\n }\n\n const skipGhPreflight = !argv.includes(\"--check-gh-preflight\")\n return { stepsSource: { raw: stepsRaw }, skipGhPreflight, verbose }\n}\n\nfunction parseJsonSteps(raw: string): Array<{ task: string; input: Record<string, unknown> }> {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n throw new Error(\"Invalid JSON for --steps\")\n }\n\n if (!Array.isArray(parsed)) {\n throw new Error(\"--steps must be a JSON array\")\n }\n\n for (const item of parsed) {\n if (\n typeof item !== \"object\" ||\n item === null ||\n typeof (item as Record<string, unknown>).task !== \"string\" ||\n typeof (item as Record<string, unknown>).input !== \"object\" ||\n (item as Record<string, unknown>).input === null\n ) {\n throw new Error('Each step must have \"task\" (string) and \"input\" (object) fields')\n }\n }\n\n return parsed as Array<{ task: string; input: Record<string, unknown> }>\n}\n\nfunction resolveGithubToken(): string {\n const token = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN\n if (!token || token.trim().length === 0) {\n throw new Error(\"Missing GITHUB_TOKEN or GH_TOKEN for GraphQL transport\")\n }\n\n return token\n}\n\ntype GqlPayload<TData> = {\n data?: TData\n errors?: GraphqlError[]\n message?: string\n}\n\nasync function fetchGqlPayload<TData>(\n token: string,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<GqlPayload<TData>> {\n const response = await fetch(GITHUB_GRAPHQL_ENDPOINT, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n authorization: `Bearer ${token}`,\n \"user-agent\": \"ghx\",\n },\n body: JSON.stringify({ query, variables: variables ?? {} }),\n signal: AbortSignal.timeout(30_000),\n })\n\n let payload: GqlPayload<TData>\n try {\n payload = (await response.json()) as GqlPayload<TData>\n } catch {\n throw new Error(`GitHub GraphQL returned non-JSON response (status ${response.status})`)\n }\n\n if (!response.ok) {\n const message =\n payload.message ?? `GitHub GraphQL request failed with status ${response.status}`\n throw new Error(message)\n }\n\n return payload\n}\n\nasync function executeGraphqlRequest<TData>(\n token: string,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<TData> {\n const payload = await fetchGqlPayload<TData>(token, query, variables)\n\n if (Array.isArray(payload.errors) && payload.errors.length > 0) {\n const message = payload.errors[0]?.message ?? \"GitHub GraphQL returned errors\"\n throw new Error(message)\n }\n\n if (payload.data === undefined) {\n throw new Error(\"GitHub GraphQL response missing data\")\n }\n\n return payload.data\n}\n\nasync function executeRawGraphqlRequest<TData>(\n token: string,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<GraphqlRawResult<TData>> {\n const payload = await fetchGqlPayload<TData>(token, query, variables)\n return {\n data: payload.data,\n errors: payload.errors?.length ? payload.errors : undefined,\n }\n}\n\nexport async function chainCommand(argv: string[] = []): Promise<number> {\n if (argv.length === 0) {\n process.stdout.write(\n \"Usage: ghx chain --steps '<json-array>' | --steps - [--check-gh-preflight] [--verbose]\\n\",\n )\n return 1\n }\n\n try {\n const { stepsSource, skipGhPreflight, verbose } = parseChainFlags(argv)\n const steps =\n stepsSource === \"stdin\" ? parseJsonSteps(await readStdin()) : parseJsonSteps(stepsSource.raw)\n const githubToken = resolveGithubToken()\n\n const githubClient = createGithubClient({\n async execute<TData>(query: string, variables?: Record<string, unknown>): Promise<TData> {\n return executeGraphqlRequest<TData>(githubToken, query, variables)\n },\n async executeRaw<TData>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphqlRawResult<TData>> {\n return executeRawGraphqlRequest<TData>(githubToken, query, variables)\n },\n })\n\n const resolutionCache = createResolutionCache()\n const result = await executeTasks(steps, {\n githubClient,\n githubToken,\n skipGhPreflight,\n resolutionCache,\n })\n\n const output = verbose ? result : compactChainResult(result)\n process.stdout.write(`${JSON.stringify(output, null, verbose ? 2 : undefined)}\\n`)\n return result.status === \"success\" || result.status === \"partial\" ? 0 : 1\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n process.stderr.write(`${message}\\n`)\n return 1\n }\n}\n","import { access, appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\nimport readline from \"node:readline/promises\"\nimport { fileURLToPath } from \"node:url\"\nimport type { ErrorCode } from \"@core/core/errors/codes.js\"\nimport { errorCodes } from \"@core/core/errors/codes.js\"\nimport { Ajv } from \"ajv\"\n\ntype SetupScope = \"user\" | \"project\"\n\ntype SetupOptions = {\n scope: SetupScope\n assumeYes: boolean\n dryRun: boolean\n verifyOnly: boolean\n track: boolean\n}\n\ntype SetupError = Error & { code?: ErrorCode }\n\nconst ajv = new Ajv({ allErrors: true, strict: false })\n\nconst setupOptionsSchema = {\n type: \"object\",\n additionalProperties: false,\n required: [\"scope\", \"assumeYes\", \"dryRun\", \"verifyOnly\", \"track\"],\n properties: {\n scope: {\n type: \"string\",\n enum: [\"user\", \"project\"],\n },\n assumeYes: { type: \"boolean\" },\n dryRun: { type: \"boolean\" },\n verifyOnly: { type: \"boolean\" },\n track: { type: \"boolean\" },\n },\n} as const\n\nconst validateSetupOptions = ajv.compile(setupOptionsSchema)\n\nconst setupCommandDirectory = dirname(fileURLToPath(import.meta.url))\nconst setupSkillAssetPathCandidates = [\n join(setupCommandDirectory, \"..\", \"..\", \"..\", \"skills\", \"using-ghx\", \"SKILL.md\"),\n join(setupCommandDirectory, \"..\", \"..\", \"skills\", \"using-ghx\", \"SKILL.md\"),\n]\n\nfunction isENOENT(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n )\n}\n\nfunction createSetupError(message: string, code: ErrorCode): SetupError {\n const error = new Error(message) as SetupError\n error.code = code\n return error\n}\n\nasync function loadSetupSkillContent(): Promise<string> {\n for (const candidatePath of setupSkillAssetPathCandidates) {\n try {\n return await readFile(candidatePath, \"utf8\")\n } catch (error) {\n if (isENOENT(error)) {\n continue\n }\n\n throw error\n }\n }\n\n throw createSetupError(\n `Setup skill asset not found. Checked: ${setupSkillAssetPathCandidates.join(\", \")}`,\n errorCodes.NotFound,\n )\n}\n\nfunction usage(): string {\n return \"Usage: ghx setup --scope <user|project> [--yes] [--dry-run] [--verify] [--track]\"\n}\n\nfunction parseScope(argv: string[]): SetupScope | undefined {\n const inline = argv.find((arg) => arg.startsWith(\"--scope=\"))\n if (inline) {\n const raw = inline.slice(\"--scope=\".length)\n if (raw === \"user\" || raw === \"project\") {\n return raw\n }\n return undefined\n }\n\n const scopeIndex = argv.findIndex((arg) => arg === \"--scope\")\n if (scopeIndex < 0) {\n return undefined\n }\n\n const value = argv[scopeIndex + 1]\n if (value === \"user\" || value === \"project\") {\n return value\n }\n\n return undefined\n}\n\nfunction parseArgs(argv: string[]): SetupOptions | null {\n const scope = parseScope(argv)\n if (!scope) {\n return null\n }\n\n const options: SetupOptions = {\n scope,\n assumeYes: argv.includes(\"--yes\"),\n dryRun: argv.includes(\"--dry-run\"),\n verifyOnly: argv.includes(\"--verify\"),\n track: argv.includes(\"--track\"),\n }\n\n if (!validateSetupOptions(options)) {\n return null\n }\n\n return options\n}\n\nfunction resolveSkillPath(scope: SetupScope): string {\n const base = scope === \"user\" ? homedir() : process.cwd()\n return join(base, \".agents\", \"skills\", \"ghx\", \"SKILL.md\")\n}\n\nfunction resolveTrackingPath(): string {\n return join(homedir(), \".agents\", \"ghx\", \"setup-events.jsonl\")\n}\n\nasync function writeTrackingEvent(options: {\n track: boolean\n scope: SetupScope\n mode: \"apply\"\n success: boolean\n}): Promise<void> {\n if (!options.track) {\n return\n }\n\n const trackingPath = resolveTrackingPath()\n await mkdir(join(homedir(), \".agents\", \"ghx\"), { recursive: true })\n await appendFile(\n trackingPath,\n `${JSON.stringify({\n command: \"setup\",\n scope: options.scope,\n mode: options.mode,\n success: options.success,\n timestamp: new Date().toISOString(),\n })}\\n`,\n \"utf8\",\n )\n}\n\nasync function confirmOverwrite(skillPath: string): Promise<boolean> {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n return false\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n\n try {\n const answer = await rl.question(`Skill already exists at ${skillPath}. Overwrite? [y/N] `)\n const normalized = answer.trim().toLowerCase()\n return normalized === \"y\" || normalized === \"yes\"\n } finally {\n rl.close()\n }\n}\n\nasync function verifySkill(skillPath: string): Promise<boolean> {\n try {\n const content = await readFile(skillPath, \"utf8\")\n return content.includes(\"ghx capabilities\")\n } catch (error) {\n if (isENOENT(error)) {\n return false\n }\n\n throw error\n }\n}\n\nasync function skillFileExists(skillPath: string): Promise<boolean> {\n try {\n await access(skillPath)\n return true\n } catch (error) {\n if (isENOENT(error)) {\n return false\n }\n\n throw error\n }\n}\n\nexport async function setupCommand(argv: string[] = []): Promise<number> {\n const parsed = parseArgs(argv)\n if (!parsed) {\n process.stderr.write(`${usage()}\\n`)\n return 1\n }\n\n const skillPath = resolveSkillPath(parsed.scope)\n\n try {\n if (parsed.verifyOnly) {\n const ok = await verifySkill(skillPath)\n if (!ok) {\n process.stderr.write(`Verify failed: skill not installed at ${skillPath}\\n`)\n return 1\n }\n\n process.stdout.write(`Verify passed: skill installed at ${skillPath}\\n`)\n return 0\n }\n\n if (parsed.dryRun) {\n process.stdout.write(`Dry run: would write ${skillPath}\\n`)\n return 0\n }\n\n const alreadyExists = await skillFileExists(skillPath)\n if (alreadyExists && !parsed.assumeYes) {\n const approved = await confirmOverwrite(skillPath)\n if (!approved) {\n process.stderr.write(\n `Skill already exists at ${skillPath}. Re-run with --yes or confirm overwrite interactively.\\n`,\n )\n await writeTrackingEvent({\n track: parsed.track,\n scope: parsed.scope,\n mode: \"apply\",\n success: false,\n })\n return 1\n }\n }\n\n const skillContent = await loadSetupSkillContent()\n await mkdir(dirname(skillPath), { recursive: true })\n await writeFile(skillPath, skillContent, \"utf8\")\n\n process.stdout.write(`Setup complete: wrote ${skillPath}\\n`)\n process.stdout.write(\"Try: ghx capabilities list\\n\")\n await writeTrackingEvent({\n track: parsed.track,\n scope: parsed.scope,\n mode: \"apply\",\n success: true,\n })\n return 0\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n process.stderr.write(`Setup failed: ${message}\\n`)\n return 1\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;;;ACD9B,SAAS,QAAgB;AACvB,SAAO;AACT;AAEA,SAAS,UAAU,MAAuE;AACxF,QAAM,SAAS,KAAK,SAAS,QAAQ;AACrC,QAAM,eAAe,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC;AAC5D,SAAO,EAAE,cAAc,OAAO;AAChC;AAEA,eAAsB,2BAA2B,OAAiB,CAAC,GAAoB;AACrF,QAAM,EAAE,cAAc,OAAO,IAAI,UAAU,IAAI;AAE/C,MAAI,CAAC,cAAc;AACjB,YAAQ,OAAO,MAAM,GAAG,MAAM,CAAC;AAAA,CAAI;AACnC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,YAAY,kBAAkB,YAAY;AAEhD,QAAI,QAAQ;AACV,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,CAAC;AAAA,CAAI;AACrD,aAAO;AAAA,IACT;AAEA,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,CAAI;AAC9D,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AACnC,WAAO;AAAA,EACT;AACF;;;AC/BA,SAASA,WAAU,MAIjB;AACA,QAAM,cAAc,KAAK,QAAQ,UAAU;AAC3C,SAAO;AAAA,IACL,QAAQ,KAAK,SAAS,QAAQ;AAAA,IAC9B,WAAW,KAAK,SAAS,WAAW;AAAA,IACpC,QAAQ,gBAAgB,KAAK,KAAK,cAAc,CAAC,IAAI;AAAA,EACvD;AACF;AAEA,SAAS,cAAc,cAA4C;AACjE,QAAM,MAAM,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;AAE5D,QAAM,QAAQ,aAAa,IAAI,CAAC,SAAS;AACvC,UAAM,MAAM,KAAK,gBAAgB,KAAK,GAAG;AACzC,UAAM,MAAM,KAAK,gBAAgB,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG;AAC7D,UAAM,SAAS,CAAC,KAAK,GAAG,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAClD,UAAM,MAAM,GAAG,KAAK,aAAa,IAAI,MAAM;AAE3C,UAAM,aAAa,KAAK,cAAc,QAAQ,UAAU,MAAM;AAC9D,UAAM,eAAe,KAAK,cAAc,SAAS,MAAM,KAAK,IAAI,IAAI,UAAU;AAC9E,WAAO,eAAe,GAAG,GAAG,oBAAoB;AAAA,EAClD,CAAC;AAED,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;AAEA,eAAsB,wBAAwB,OAAiB,CAAC,GAAoB;AAClF,QAAM,EAAE,QAAQ,WAAW,OAAO,IAAIA,WAAU,IAAI;AACpD,QAAM,eAAe,iBAAiB,MAAM;AAE5C,MAAI,aAAa,WAAW,GAAG;AAC7B,YAAQ,OAAO;AAAA,MACb,SAAS,qCAAqC,MAAM;AAAA,IAAO;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AACb,YAAQ,OAAO,MAAM,cAAc,YAAY,CAAC;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACV,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,YAAY,CAAC;AAAA,CAAI;AACxD,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,MAAM,EAAE,cAAc,MAAM,CAAC;AAC5E,QAAM,aAAa,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,MAAM,EAAE,YAAY,MAAM,CAAC;AAE5E,QAAM,QAAQ,aAAa,IAAI,CAAC,SAAS;AACvC,UAAM,KAAK,KAAK,cAAc,OAAO,QAAQ;AAC7C,UAAM,OAAO,KAAK,YAAY,OAAO,UAAU;AAC/C,UAAM,WAAW,KAAK,gBAAgB,KAAK,IAAI;AAC/C,UAAM,aAAa,sBAAsB,EAAE,YAAY,KAAK,uBAAuB,CAAC;AACpF,UAAM,WAAW,KAAK,gBACnB,IAAI,CAAC,MAAM;AACV,YAAM,QAAQ,WAAW,CAAC;AAC1B,aAAO,QAAQ,GAAG,CAAC,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;AAAA,IACpD,CAAC,EACA,KAAK,IAAI;AACZ,UAAM,SAAS,SAAS,SAAS,IAAI,IAAI,QAAQ,KAAK,QAAQ,MAAM,IAAI,QAAQ;AAChF,WAAO,GAAG,EAAE,MAAM,IAAI,IAAI,MAAM;AAAA,EAClC,CAAC;AACD,UAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAC5C,SAAO;AACT;;;AC3DO,SAAS,iBAAiB,UAA4C;AAC3E,MAAI,SAAS,IAAI;AACf,WAAO,SAAS,KAAK,eAAe,SAChC,EAAE,IAAI,MAAM,MAAM,SAAS,MAAM,YAAY,SAAS,KAAK,WAAW,IACtE,EAAE,IAAI,MAAM,MAAM,SAAS,KAAK;AAAA,EACtC;AACA,QAAM,MAAM,SAAS;AACrB,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,MACL,MAAM,KAAK,QAAQ;AAAA,MACnB,SAAS,KAAK,WAAW;AAAA,IAC3B;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,UAAmD;AACpF,SAAO;AAAA,IACL,QAAQ,SAAS;AAAA,IACjB,SAAS,SAAS,QAAQ,IAAI,CAAC,SAAS;AACtC,UAAI,KAAK,IAAI;AACX,eAAO,KAAK,SAAS,SACjB,EAAE,MAAM,KAAK,MAAM,IAAI,MAAe,MAAM,KAAK,KAAK,IACtD,EAAE,MAAM,KAAK,MAAM,IAAI,KAAc;AAAA,MAC3C;AACA,aAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM,KAAK,OAAO,QAAQ;AAAA,UAC1B,SAAS,KAAK,OAAO,WAAW;AAAA,QAClC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC7CA,IAAM,0BAA0B;AASzB,SAAS,cAAc,MAAgC;AAC5D,QAAM,CAAC,MAAM,GAAG,IAAI,IAAI;AACxB,MAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACrC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,UAAU,CAAC,QAAQ,QAAQ,SAAS;AAC5D,QAAM,cAAc,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,UAAU,CAAC;AACjE,QAAM,iBAAiB,cAAc,IAAI,KAAK,aAAa,CAAC,IAAI;AAEhE,QAAM,UAAU,KAAK,SAAS,WAAW;AAEzC,MAAI,mBAAmB,KAAK;AAC1B,UAAMC,mBAAkB,CAAC,KAAK,SAAS,sBAAsB;AAC7D,WAAO,EAAE,MAAM,aAAa,SAAS,iBAAAA,kBAAiB,QAAQ;AAAA,EAChE;AAEA,QAAM,WACJ,kBAAkB,CAAC,eAAe,WAAW,IAAI,IAC7C,iBACA,cACE,YAAY,MAAM,WAAW,MAAM,IACnC;AAER,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,QAAM,kBAAkB,CAAC,KAAK,SAAS,sBAAsB;AAC7D,SAAO,EAAE,MAAM,aAAa,EAAE,KAAK,SAAS,GAAG,iBAAiB,QAAQ;AAC1E;AAEA,SAAS,eAAe,KAAsC;AAC5D,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,MAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC1E,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAEA,SAAO;AACT;AAEO,SAAS,UAAU,YAAY,KAAyB;AAC7D,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAkB,CAAC;AACzB,UAAM,SAAS,QAAQ;AACvB,UAAM,QAAQ,WAAW,MAAM;AAC7B,aAAO,QAAQ;AACf,aAAO,IAAI,MAAM,8BAA8B,CAAC;AAAA,IAClD,GAAG,SAAS;AACZ,WAAO,YAAY,MAAM;AACzB,WAAO,GAAG,QAAQ,CAAC,UAAkB,MAAM,KAAK,KAAK,CAAC;AACtD,WAAO,GAAG,OAAO,MAAM;AACrB,mBAAa,KAAK;AAClB,cAAQ,MAAM,KAAK,EAAE,CAAC;AAAA,IACxB,CAAC;AACD,WAAO,GAAG,SAAS,CAAC,QAAe;AACjC,mBAAa,KAAK;AAClB,aAAO,GAAG;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,qBAA6B;AACpC,QAAM,QAAQ,QAAQ,IAAI,gBAAgB,QAAQ,IAAI;AACtD,MAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACvC,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,SAAO;AACT;AAEA,eAAe,sBACb,OACA,OACA,WACgB;AAChB,QAAM,WAAW,MAAM,MAAM,yBAAyB;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,eAAe,UAAU,KAAK;AAAA,MAC9B,cAAc;AAAA,IAChB;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,OAAO,WAAW,aAAa,CAAC,EAAE,CAAC;AAAA,EAC5D,CAAC;AAED,QAAM,UAAW,MAAM,SAAS,KAAK;AAMrC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,UACJ,QAAQ,WAAW,6CAA6C,SAAS,MAAM;AACjF,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAEA,MAAI,MAAM,QAAQ,QAAQ,MAAM,KAAK,QAAQ,OAAO,SAAS,GAAG;AAC9D,UAAM,UAAU,QAAQ,OAAO,CAAC,GAAG,WAAW;AAC9C,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAEA,MAAI,QAAQ,SAAS,QAAW;AAC9B,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAEA,SAAO,QAAQ;AACjB;AAEA,eAAsB,WAAW,OAAiB,CAAC,GAAoB;AACrE,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,OAAO;AAAA,MACb;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,MAAM,aAAa,iBAAiB,QAAQ,IAAI,cAAc,IAAI;AAC1E,QAAM,QACJ,gBAAgB,UAAU,eAAe,MAAM,UAAU,CAAC,IAAI,eAAe,YAAY,GAAG;AAC9F,QAAM,cAAc,mBAAmB;AAEvC,QAAM,eAAe,mBAAmB;AAAA,IACtC,MAAM,QAAe,OAAe,WAAqD;AACvF,aAAO,sBAA6B,aAAa,OAAO,SAAS;AAAA,IACnE;AAAA,EACF,CAAC;AAED,QAAM,UAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,YAAY,SAAS;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,SAAS,UAAU,SAAS,iBAAiB,MAAM;AACzD,UAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,UAAU,IAAI,MAAS,CAAC;AAAA,CAAI;AACjF,SAAO;AACT;;;AC9JA,IAAMC,2BAA0B,kBAAkB;AAQ3C,SAAS,gBAAgB,MAAkC;AAChE,QAAM,aAAa,KAAK,UAAU,CAAC,QAAQ,QAAQ,SAAS;AAC5D,QAAM,cAAc,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,UAAU,CAAC;AACjE,QAAM,iBAAiB,cAAc,IAAI,KAAK,aAAa,CAAC,IAAI;AAChE,QAAM,UAAU,KAAK,SAAS,WAAW;AAEzC,MAAI,mBAAmB,KAAK;AAC1B,UAAMC,mBAAkB,CAAC,KAAK,SAAS,sBAAsB;AAC7D,WAAO,EAAE,aAAa,SAAS,iBAAAA,kBAAiB,QAAQ;AAAA,EAC1D;AAEA,QAAM,WACJ,kBAAkB,CAAC,eAAe,WAAW,IAAI,IAC7C,iBACA,cACE,YAAY,MAAM,WAAW,MAAM,IACnC;AAER,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,QAAM,kBAAkB,CAAC,KAAK,SAAS,sBAAsB;AAC7D,SAAO,EAAE,aAAa,EAAE,KAAK,SAAS,GAAG,iBAAiB,QAAQ;AACpE;AAEA,SAAS,eAAe,KAAsE;AAC5F,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,aAAW,QAAQ,QAAQ;AACzB,QACE,OAAO,SAAS,YAChB,SAAS,QACT,OAAQ,KAAiC,SAAS,YAClD,OAAQ,KAAiC,UAAU,YAClD,KAAiC,UAAU,MAC5C;AACA,YAAM,IAAI,MAAM,iEAAiE;AAAA,IACnF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASC,sBAA6B;AACpC,QAAM,QAAQ,QAAQ,IAAI,gBAAgB,QAAQ,IAAI;AACtD,MAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACvC,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,SAAO;AACT;AAQA,eAAe,gBACb,OACA,OACA,WAC4B;AAC5B,QAAM,WAAW,MAAM,MAAMF,0BAAyB;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,eAAe,UAAU,KAAK;AAAA,MAC9B,cAAc;AAAA,IAChB;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,OAAO,WAAW,aAAa,CAAC,EAAE,CAAC;AAAA,IAC1D,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAED,MAAI;AACJ,MAAI;AACF,cAAW,MAAM,SAAS,KAAK;AAAA,EACjC,QAAQ;AACN,UAAM,IAAI,MAAM,qDAAqD,SAAS,MAAM,GAAG;AAAA,EACzF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,UACJ,QAAQ,WAAW,6CAA6C,SAAS,MAAM;AACjF,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAEA,SAAO;AACT;AAEA,eAAeG,uBACb,OACA,OACA,WACgB;AAChB,QAAM,UAAU,MAAM,gBAAuB,OAAO,OAAO,SAAS;AAEpE,MAAI,MAAM,QAAQ,QAAQ,MAAM,KAAK,QAAQ,OAAO,SAAS,GAAG;AAC9D,UAAM,UAAU,QAAQ,OAAO,CAAC,GAAG,WAAW;AAC9C,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAEA,MAAI,QAAQ,SAAS,QAAW;AAC9B,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAEA,SAAO,QAAQ;AACjB;AAEA,eAAe,yBACb,OACA,OACA,WACkC;AAClC,QAAM,UAAU,MAAM,gBAAuB,OAAO,OAAO,SAAS;AACpE,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,SAAS;AAAA,EACpD;AACF;AAEA,eAAsB,aAAa,OAAiB,CAAC,GAAoB;AACvE,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,OAAO;AAAA,MACb;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,EAAE,aAAa,iBAAiB,QAAQ,IAAI,gBAAgB,IAAI;AACtE,UAAM,QACJ,gBAAgB,UAAU,eAAe,MAAM,UAAU,CAAC,IAAI,eAAe,YAAY,GAAG;AAC9F,UAAM,cAAcD,oBAAmB;AAEvC,UAAM,eAAe,mBAAmB;AAAA,MACtC,MAAM,QAAe,OAAe,WAAqD;AACvF,eAAOC,uBAA6B,aAAa,OAAO,SAAS;AAAA,MACnE;AAAA,MACA,MAAM,WACJ,OACA,WACkC;AAClC,eAAO,yBAAgC,aAAa,OAAO,SAAS;AAAA,MACtE;AAAA,IACF,CAAC;AAED,UAAM,kBAAkB,sBAAsB;AAC9C,UAAM,SAAS,MAAM,aAAa,OAAO;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,SAAS,UAAU,SAAS,mBAAmB,MAAM;AAC3D,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,UAAU,IAAI,MAAS,CAAC;AAAA,CAAI;AACjF,WAAO,OAAO,WAAW,aAAa,OAAO,WAAW,YAAY,IAAI;AAAA,EAC1E,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AACnC,WAAO;AAAA,EACT;AACF;;;AC9LA,SAAS,QAAQ,YAAY,OAAO,UAAU,iBAAiB;AAC/D,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY;AAC9B,OAAO,cAAc;AACrB,SAAS,qBAAqB;AAG9B,SAAS,WAAW;AAcpB,IAAM,MAAM,IAAI,IAAI,EAAE,WAAW,MAAM,QAAQ,MAAM,CAAC;AAEtD,IAAM,qBAAqB;AAAA,EACzB,MAAM;AAAA,EACN,sBAAsB;AAAA,EACtB,UAAU,CAAC,SAAS,aAAa,UAAU,cAAc,OAAO;AAAA,EAChE,YAAY;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,CAAC,QAAQ,SAAS;AAAA,IAC1B;AAAA,IACA,WAAW,EAAE,MAAM,UAAU;AAAA,IAC7B,QAAQ,EAAE,MAAM,UAAU;AAAA,IAC1B,YAAY,EAAE,MAAM,UAAU;AAAA,IAC9B,OAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACF;AAEA,IAAM,uBAAuB,IAAI,QAAQ,kBAAkB;AAE3D,IAAM,wBAAwB,QAAQ,cAAc,YAAY,GAAG,CAAC;AACpE,IAAM,gCAAgC;AAAA,EACpC,KAAK,uBAAuB,MAAM,MAAM,MAAM,UAAU,aAAa,UAAU;AAAA,EAC/E,KAAK,uBAAuB,MAAM,MAAM,UAAU,aAAa,UAAU;AAC3E;AAEA,SAAS,SAAS,OAAyB;AACzC,SACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAA4B,SAAS;AAE1C;AAEA,SAAS,iBAAiB,SAAiB,MAA6B;AACtE,QAAM,QAAQ,IAAI,MAAM,OAAO;AAC/B,QAAM,OAAO;AACb,SAAO;AACT;AAEA,eAAe,wBAAyC;AACtD,aAAW,iBAAiB,+BAA+B;AACzD,QAAI;AACF,aAAO,MAAM,SAAS,eAAe,MAAM;AAAA,IAC7C,SAAS,OAAO;AACd,UAAI,SAAS,KAAK,GAAG;AACnB;AAAA,MACF;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM;AAAA,IACJ,yCAAyC,8BAA8B,KAAK,IAAI,CAAC;AAAA,IACjF,WAAW;AAAA,EACb;AACF;AAEA,SAASC,SAAgB;AACvB,SAAO;AACT;AAEA,SAAS,WAAW,MAAwC;AAC1D,QAAM,SAAS,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,UAAU,CAAC;AAC5D,MAAI,QAAQ;AACV,UAAM,MAAM,OAAO,MAAM,WAAW,MAAM;AAC1C,QAAI,QAAQ,UAAU,QAAQ,WAAW;AACvC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,UAAU,CAAC,QAAQ,QAAQ,SAAS;AAC5D,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,aAAa,CAAC;AACjC,MAAI,UAAU,UAAU,UAAU,WAAW;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAASC,WAAU,MAAqC;AACtD,QAAM,QAAQ,WAAW,IAAI;AAC7B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,UAAwB;AAAA,IAC5B;AAAA,IACA,WAAW,KAAK,SAAS,OAAO;AAAA,IAChC,QAAQ,KAAK,SAAS,WAAW;AAAA,IACjC,YAAY,KAAK,SAAS,UAAU;AAAA,IACpC,OAAO,KAAK,SAAS,SAAS;AAAA,EAChC;AAEA,MAAI,CAAC,qBAAqB,OAAO,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAA2B;AACnD,QAAM,OAAO,UAAU,SAAS,QAAQ,IAAI,QAAQ,IAAI;AACxD,SAAO,KAAK,MAAM,WAAW,UAAU,OAAO,UAAU;AAC1D;AAEA,SAAS,sBAA8B;AACrC,SAAO,KAAK,QAAQ,GAAG,WAAW,OAAO,oBAAoB;AAC/D;AAEA,eAAe,mBAAmB,SAKhB;AAChB,MAAI,CAAC,QAAQ,OAAO;AAClB;AAAA,EACF;AAEA,QAAM,eAAe,oBAAoB;AACzC,QAAM,MAAM,KAAK,QAAQ,GAAG,WAAW,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AAClE,QAAM;AAAA,IACJ;AAAA,IACA,GAAG,KAAK,UAAU;AAAA,MAChB,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ;AAAA,MACd,SAAS,QAAQ;AAAA,MACjB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC,CAAC;AAAA;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,iBAAiB,WAAqC;AACnE,MAAI,CAAC,QAAQ,MAAM,SAAS,CAAC,QAAQ,OAAO,OAAO;AACjD,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,SAAS,gBAAgB;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI;AACF,UAAM,SAAS,MAAM,GAAG,SAAS,2BAA2B,SAAS,qBAAqB;AAC1F,UAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,WAAO,eAAe,OAAO,eAAe;AAAA,EAC9C,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEA,eAAe,YAAY,WAAqC;AAC9D,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,WAAW,MAAM;AAChD,WAAO,QAAQ,SAAS,kBAAkB;AAAA,EAC5C,SAAS,OAAO;AACd,QAAI,SAAS,KAAK,GAAG;AACnB,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,gBAAgB,WAAqC;AAClE,MAAI;AACF,UAAM,OAAO,SAAS;AACtB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,SAAS,KAAK,GAAG;AACnB,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,aAAa,OAAiB,CAAC,GAAoB;AACvE,QAAM,SAASA,WAAU,IAAI;AAC7B,MAAI,CAAC,QAAQ;AACX,YAAQ,OAAO,MAAM,GAAGD,OAAM,CAAC;AAAA,CAAI;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,iBAAiB,OAAO,KAAK;AAE/C,MAAI;AACF,QAAI,OAAO,YAAY;AACrB,YAAM,KAAK,MAAM,YAAY,SAAS;AACtC,UAAI,CAAC,IAAI;AACP,gBAAQ,OAAO,MAAM,yCAAyC,SAAS;AAAA,CAAI;AAC3E,eAAO;AAAA,MACT;AAEA,cAAQ,OAAO,MAAM,qCAAqC,SAAS;AAAA,CAAI;AACvE,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,QAAQ;AACjB,cAAQ,OAAO,MAAM,wBAAwB,SAAS;AAAA,CAAI;AAC1D,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,MAAM,gBAAgB,SAAS;AACrD,QAAI,iBAAiB,CAAC,OAAO,WAAW;AACtC,YAAM,WAAW,MAAM,iBAAiB,SAAS;AACjD,UAAI,CAAC,UAAU;AACb,gBAAQ,OAAO;AAAA,UACb,2BAA2B,SAAS;AAAA;AAAA,QACtC;AACA,cAAM,mBAAmB;AAAA,UACvB,OAAO,OAAO;AAAA,UACd,OAAO,OAAO;AAAA,UACd,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,sBAAsB;AACjD,UAAM,MAAM,QAAQ,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,UAAM,UAAU,WAAW,cAAc,MAAM;AAE/C,YAAQ,OAAO,MAAM,yBAAyB,SAAS;AAAA,CAAI;AAC3D,YAAQ,OAAO,MAAM,8BAA8B;AACnD,UAAM,mBAAmB;AAAA,MACvB,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AACD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAQ,OAAO,MAAM,iBAAiB,OAAO;AAAA,CAAI;AACjD,WAAO;AAAA,EACT;AACF;;;ANlQA,SAASE,SAAgB;AACvB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAsB,KAAK,OAAiB,QAAQ,KAAK,MAAM,CAAC,GAAoB;AAClF,QAAM,CAAC,SAAS,GAAG,IAAI,IAAI;AAE3B,MAAI,CAAC,WAAW,YAAY,YAAY,YAAY,MAAM;AACxD,YAAQ,OAAO,MAAM,GAAGA,OAAM,CAAC;AAAA,CAAI;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,OAAO;AACrB,WAAO,WAAW,IAAI;AAAA,EACxB;AAEA,MAAI,YAAY,SAAS;AACvB,WAAO,aAAa,IAAI;AAAA,EAC1B;AAEA,MAAI,YAAY,SAAS;AACvB,WAAO,aAAa,IAAI;AAAA,EAC1B;AAEA,MAAI,YAAY,gBAAgB;AAC9B,UAAM,CAAC,YAAY,GAAG,cAAc,IAAI;AAExC,QAAI,CAAC,YAAY;AACf,cAAQ,OAAO,MAAM;AAAA,EAAqCA,OAAM,CAAC;AAAA,CAAI;AACrE,aAAO;AAAA,IACT;AAEA,QAAI,eAAe,QAAQ;AACzB,aAAO,wBAAwB,cAAc;AAAA,IAC/C;AAEA,QAAI,eAAe,WAAW;AAC5B,aAAO,2BAA2B,cAAc;AAAA,IAClD;AAEA,YAAQ,OAAO,MAAM,oCAAoC,UAAU;AAAA,EAAKA,OAAM,CAAC;AAAA,CAAI;AACnF,WAAO;AAAA,EACT;AAEA,UAAQ,OAAO,MAAM,oBAAoB,OAAO;AAAA,EAAKA,OAAM,CAAC;AAAA,CAAI;AAChE,SAAO;AACT;AAEA,IAAM,eAAe,MAAM;AACzB,MAAI,CAAC,QAAQ,KAAK,CAAC,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,eAAe,aAAa,IAAI,IAAI,YAAY,GAAG,CAAC;AAC1D,UAAM,eAAe,aAAa,QAAQ,KAAK,CAAC,CAAC;AACjD,WAAO,iBAAiB,gBAAgB,YAAY,QAAQ,cAAc,QAAQ,KAAK,CAAC,CAAC,EAAE;AAAA,EAC7F,QAAQ;AACN,WAAO,YAAY,QAAQ,cAAc,QAAQ,KAAK,CAAC,CAAC,EAAE;AAAA,EAC5D;AACF,GAAG;AAEH,IAAI,aAAa;AACf,OAAK,EAAE;AAAA,IACL,CAAC,aAAa;AACZ,cAAQ,WAAW;AAAA,IACrB;AAAA,IACA,CAAC,UAAmB;AAClB,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AACnC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;","names":["parseArgs","skipGhPreflight","GITHUB_GRAPHQL_ENDPOINT","skipGhPreflight","resolveGithubToken","executeGraphqlRequest","usage","parseArgs","usage"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/capabilities-explain.ts","../../src/cli/commands/capabilities-list.ts","../../src/cli/formatters/compact.ts","../../src/cli/commands/run.ts","../../src/cli/commands/chain.ts","../../src/cli/commands/setup.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { readFileSync, realpathSync } from \"node:fs\"\nimport { dirname, join } from \"node:path\"\nimport { fileURLToPath, pathToFileURL } from \"node:url\"\n\nimport { capabilitiesExplainCommand } from \"./commands/capabilities-explain.js\"\nimport { capabilitiesListCommand } from \"./commands/capabilities-list.js\"\nimport { chainCommand } from \"./commands/chain.js\"\nimport { runCommand } from \"./commands/run.js\"\nimport { setupCommand } from \"./commands/setup.js\"\n\nfunction resolveVersion(): string {\n const cliDir = dirname(fileURLToPath(import.meta.url))\n const candidates = [join(cliDir, \"..\", \"..\", \"package.json\"), join(cliDir, \"..\", \"package.json\")]\n for (const candidate of candidates) {\n try {\n const pkg = JSON.parse(readFileSync(candidate, \"utf8\")) as { version?: string }\n if (pkg.version) {\n return pkg.version\n }\n } catch {\n continue\n }\n }\n return \"unknown\"\n}\n\nfunction usage(): string {\n return [\n `ghx ${resolveVersion()} — GitHub execution router for AI agents`,\n \"\",\n \"Usage:\",\n \" ghx run <task> --input '<json>' | --input - [--check-gh-preflight]\",\n \" ghx chain --steps '<json-array>' | --steps - [--check-gh-preflight]\",\n \" ghx setup --scope <user|project> [--yes] [--dry-run] [--verify] [--track]\",\n \" ghx capabilities list\",\n \" ghx capabilities explain <capability_id>\",\n \"\",\n \"Flags:\",\n \" -h, --help Show this help\",\n \" -v, --version Show version\",\n ].join(\"\\n\")\n}\n\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<number> {\n const [command, ...rest] = argv\n\n if (!command || command === \"--help\" || command === \"-h\") {\n process.stdout.write(`${usage()}\\n`)\n return 0\n }\n\n if (command === \"--version\" || command === \"-V\" || command === \"-v\") {\n process.stdout.write(`ghx ${resolveVersion()}\\n`)\n return 0\n }\n\n if (command === \"run\") {\n return runCommand(rest)\n }\n\n if (command === \"chain\") {\n return chainCommand(rest)\n }\n\n if (command === \"setup\") {\n return setupCommand(rest)\n }\n\n if (command === \"capabilities\") {\n const [subcommand, ...subcommandArgs] = rest\n\n if (!subcommand) {\n process.stderr.write(`Missing capabilities subcommand.\\n${usage()}\\n`)\n return 1\n }\n\n if (subcommand === \"list\") {\n return capabilitiesListCommand(subcommandArgs)\n }\n\n if (subcommand === \"explain\") {\n return capabilitiesExplainCommand(subcommandArgs)\n }\n\n process.stderr.write(`Unknown capabilities subcommand: ${subcommand}\\n${usage()}\\n`)\n return 1\n }\n\n process.stderr.write(`Unknown command: ${command}\\n${usage()}\\n`)\n return 1\n}\n\nconst isDirectRun = (() => {\n if (!process.argv[1]) {\n return false\n }\n\n try {\n const currentEntry = realpathSync(new URL(import.meta.url))\n const invokedEntry = realpathSync(process.argv[1])\n return currentEntry === invokedEntry || import.meta.url === pathToFileURL(process.argv[1]).href\n } catch {\n return import.meta.url === pathToFileURL(process.argv[1]).href\n }\n})()\n\nif (isDirectRun) {\n main().then(\n (exitCode) => {\n process.exitCode = exitCode\n },\n (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error)\n process.stderr.write(`${message}\\n`)\n process.exit(1)\n },\n )\n}\n","import { explainCapability } from \"@core/core/registry/explain-capability.js\"\n\nfunction usage(): string {\n return \"Usage: ghx capabilities explain <capability_id> [--json]\"\n}\n\nfunction parseArgs(argv: string[]): { capabilityId: string | undefined; asJson: boolean } {\n const asJson = argv.includes(\"--json\")\n const capabilityId = argv.find((arg) => !arg.startsWith(\"-\"))\n return { capabilityId, asJson }\n}\n\nexport async function capabilitiesExplainCommand(argv: string[] = []): Promise<number> {\n const { capabilityId, asJson } = parseArgs(argv)\n\n if (!capabilityId) {\n process.stderr.write(`${usage()}\\n`)\n return 1\n }\n\n try {\n const explained = explainCapability(capabilityId)\n\n if (asJson) {\n process.stdout.write(`${JSON.stringify(explained)}\\n`)\n return 0\n }\n\n process.stdout.write(`${JSON.stringify(explained, null, 2)}\\n`)\n return 0\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n process.stderr.write(`${message}\\n`)\n return 1\n }\n}\n","import type { CapabilityListItem } from \"@core/core/registry/list-capabilities.js\"\nimport { listCapabilities } from \"@core/core/registry/list-capabilities.js\"\nimport { extractArrayItemHints } from \"@core/core/registry/schema-utils.js\"\n\nfunction parseArgs(argv: string[]): {\n asJson: boolean\n asCompact: boolean\n domain: string | undefined\n} {\n const domainIndex = argv.indexOf(\"--domain\")\n return {\n asJson: argv.includes(\"--json\"),\n asCompact: argv.includes(\"--compact\"),\n domain: domainIndex !== -1 ? argv[domainIndex + 1] : undefined,\n }\n}\n\nfunction formatCompact(capabilities: CapabilityListItem[]): string {\n const ids = new Set(capabilities.map((c) => c.capability_id))\n\n const lines = capabilities.map((item) => {\n const req = item.required_inputs.join(\",\")\n const opt = item.optional_inputs.map((o) => `${o}?`).join(\",\")\n const inputs = [req, opt].filter(Boolean).join(\",\")\n const sig = `${item.capability_id}(${inputs})`\n\n const addSibling = item.capability_id.replace(/\\.set$/, \".add\")\n const needsWarning = item.capability_id.endsWith(\".set\") && ids.has(addSibling)\n return needsWarning ? `${sig} [replaces all]` : sig\n })\n\n return lines.join(\"\\n\") + \"\\n\"\n}\n\nexport async function capabilitiesListCommand(argv: string[] = []): Promise<number> {\n const { asJson, asCompact, domain } = parseArgs(argv)\n const capabilities = listCapabilities(domain)\n\n if (capabilities.length === 0) {\n process.stderr.write(\n domain ? `No capabilities found for domain: ${domain}\\n` : \"No capabilities found\\n\",\n )\n return 1\n }\n\n if (asCompact) {\n process.stdout.write(formatCompact(capabilities))\n return 0\n }\n\n if (asJson) {\n process.stdout.write(`${JSON.stringify(capabilities)}\\n`)\n return 0\n }\n\n const maxIdLen = Math.max(...capabilities.map((c) => c.capability_id.length))\n const maxDescLen = Math.max(...capabilities.map((c) => c.description.length))\n\n const lines = capabilities.map((item) => {\n const id = item.capability_id.padEnd(maxIdLen)\n const desc = item.description.padEnd(maxDescLen)\n const required = item.required_inputs.join(\", \")\n const arrayHints = extractArrayItemHints({ properties: item.optional_inputs_detail })\n const optional = item.optional_inputs\n .map((n) => {\n const hints = arrayHints[n]\n return hints ? `${n}?[${hints.join(\", \")}]` : `${n}?`\n })\n .join(\", \")\n const inputs = optional.length > 0 ? `[${required}, ${optional}]` : `[${required}]`\n return `${id} - ${desc} ${inputs}`\n })\n process.stdout.write(`${lines.join(\"\\n\")}\\n`)\n return 0\n}\n","import type { ChainResultEnvelope, ResultEnvelope } from \"../../core/contracts/envelope.js\"\n\nexport type CompactRunResult =\n | { ok: true; data: unknown; pagination?: ResultEnvelope[\"meta\"][\"pagination\"] }\n | { ok: false; error: { code: string; message: string } }\n\nexport type CompactChainStepResult =\n | { task: string; ok: true; data?: unknown }\n | { task: string; ok: false; error: { code: string; message: string } }\n\nexport type CompactChainResult = {\n status: ChainResultEnvelope[\"status\"]\n results: CompactChainStepResult[]\n}\n\nexport function compactRunResult(envelope: ResultEnvelope): CompactRunResult {\n if (envelope.ok) {\n return envelope.meta.pagination !== undefined\n ? { ok: true, data: envelope.data, pagination: envelope.meta.pagination }\n : { ok: true, data: envelope.data }\n }\n const err = envelope.error\n return {\n ok: false,\n error: {\n code: err?.code ?? \"UNKNOWN\",\n message: err?.message ?? \"\",\n },\n }\n}\n\nexport function compactChainResult(envelope: ChainResultEnvelope): CompactChainResult {\n return {\n status: envelope.status,\n results: envelope.results.map((step) => {\n if (step.ok) {\n return step.data !== undefined\n ? { task: step.task, ok: true as const, data: step.data }\n : { task: step.task, ok: true as const }\n }\n return {\n task: step.task,\n ok: false as const,\n error: {\n code: step.error?.code ?? \"UNKNOWN\",\n message: step.error?.message ?? \"\",\n },\n }\n }),\n }\n}\n","import { compactRunResult } from \"@core/cli/formatters/compact.js\"\nimport { invalidateTokenCache, resolveGithubToken } from \"@core/core/auth/resolve-token.js\"\nimport { errorCodes } from \"@core/core/errors/codes.js\"\nimport type { TaskRequest } from \"../../core/contracts/task.js\"\nimport { executeTask } from \"../../core/routing/engine/index.js\"\nimport { createGithubClient } from \"../../gql/github-client.js\"\n\nconst GITHUB_GRAPHQL_ENDPOINT = \"https://api.github.com/graphql\"\n\ninterface ParsedRunFlags {\n task: string\n inputSource: \"stdin\" | { raw: string }\n skipGhPreflight: boolean\n verbose: boolean\n}\n\nexport function parseRunFlags(argv: string[]): ParsedRunFlags {\n const [task, ...rest] = argv\n if (!task || task.trim().length === 0) {\n throw new Error(\n \"Usage: ghx run <task> --input '<json>' | --input - [--check-gh-preflight] [--verbose]\",\n )\n }\n\n const inputIndex = rest.findIndex((arg) => arg === \"--input\")\n const inlineInput = rest.find((arg) => arg.startsWith(\"--input=\"))\n const inputCandidate = inputIndex >= 0 ? rest[inputIndex + 1] : undefined\n\n const verbose = rest.includes(\"--verbose\")\n\n if (inputCandidate === \"-\") {\n const skipGhPreflight = !rest.includes(\"--check-gh-preflight\")\n return { task, inputSource: \"stdin\", skipGhPreflight, verbose }\n }\n\n const inputRaw =\n inputCandidate && !inputCandidate.startsWith(\"--\")\n ? inputCandidate\n : inlineInput\n ? inlineInput.slice(\"--input=\".length)\n : undefined\n\n if (!inputRaw) {\n throw new Error(\"Missing --input JSON\")\n }\n\n const skipGhPreflight = !rest.includes(\"--check-gh-preflight\")\n return { task, inputSource: { raw: inputRaw }, skipGhPreflight, verbose }\n}\n\nfunction parseJsonInput(raw: string): Record<string, unknown> {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n throw new Error(\"Invalid JSON for --input\")\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"--input must be a JSON object\")\n }\n\n return parsed as Record<string, unknown>\n}\n\nexport function readStdin(timeoutMs = 10_000): Promise<string> {\n return new Promise((resolve, reject) => {\n const parts: string[] = []\n const stream = process.stdin\n const timer = setTimeout(() => {\n stream.destroy()\n reject(new Error(\"Timed out reading from stdin\"))\n }, timeoutMs)\n stream.setEncoding(\"utf8\")\n stream.on(\"data\", (chunk: string) => parts.push(chunk))\n stream.on(\"end\", () => {\n clearTimeout(timer)\n resolve(parts.join(\"\"))\n })\n stream.on(\"error\", (err: Error) => {\n clearTimeout(timer)\n reject(err)\n })\n })\n}\n\nasync function executeGraphqlRequest<TData>(\n token: string,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<TData> {\n const response = await fetch(GITHUB_GRAPHQL_ENDPOINT, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n authorization: `Bearer ${token}`,\n \"user-agent\": \"ghx\",\n },\n body: JSON.stringify({ query, variables: variables ?? {} }),\n })\n\n const payload = (await response.json()) as {\n data?: TData\n errors?: Array<{ message?: string }>\n message?: string\n }\n\n if (!response.ok) {\n const message =\n payload.message ?? `GitHub GraphQL request failed with status ${response.status}`\n throw new Error(message)\n }\n\n if (Array.isArray(payload.errors) && payload.errors.length > 0) {\n const message = payload.errors[0]?.message ?? \"GitHub GraphQL returned errors\"\n throw new Error(message)\n }\n\n if (payload.data === undefined) {\n throw new Error(\"GitHub GraphQL response missing data\")\n }\n\n return payload.data\n}\n\nexport async function runCommand(argv: string[] = []): Promise<number> {\n if (argv.length === 0) {\n process.stdout.write(\n \"Usage: ghx run <task> --input '<json>' | --input - [--check-gh-preflight]\\n\",\n )\n return 1\n }\n\n const { task, inputSource, skipGhPreflight, verbose } = parseRunFlags(argv)\n const input =\n inputSource === \"stdin\" ? parseJsonInput(await readStdin()) : parseJsonInput(inputSource.raw)\n\n const { token, source } = await resolveGithubToken()\n\n const buildClient = (t: string) =>\n createGithubClient({\n async execute<TData>(query: string, variables?: Record<string, unknown>): Promise<TData> {\n return executeGraphqlRequest<TData>(t, query, variables)\n },\n })\n\n const request: TaskRequest = { task, input }\n\n let result = await executeTask(request, {\n githubClient: buildClient(token),\n githubToken: token,\n skipGhPreflight,\n })\n\n if (!result.ok && result.error?.code === errorCodes.Auth && source !== \"env\") {\n await invalidateTokenCache()\n const fresh = await resolveGithubToken()\n result = await executeTask(request, {\n githubClient: buildClient(fresh.token),\n githubToken: fresh.token,\n skipGhPreflight,\n })\n }\n\n const output = verbose ? result : compactRunResult(result)\n process.stdout.write(`${JSON.stringify(output, null, verbose ? 2 : undefined)}\\n`)\n return 0\n}\n","import { compactChainResult } from \"@core/cli/formatters/compact.js\"\nimport { resolveGithubToken } from \"@core/core/auth/resolve-token.js\"\nimport { executeTasks } from \"@core/core/routing/engine/index.js\"\nimport { createResolutionCache } from \"@core/core/routing/resolution-cache.js\"\nimport { createGithubClient } from \"@core/gql/github-client.js\"\nimport type { GraphqlError, GraphqlRawResult } from \"@core/gql/transport.js\"\nimport { resolveGraphqlUrl } from \"@core/gql/transport.js\"\nimport { readStdin } from \"./run.js\"\n\nconst GITHUB_GRAPHQL_ENDPOINT = resolveGraphqlUrl()\n\ninterface ParsedChainFlags {\n stepsSource: \"stdin\" | { raw: string }\n skipGhPreflight: boolean\n verbose: boolean\n}\n\nexport function parseChainFlags(argv: string[]): ParsedChainFlags {\n const stepsIndex = argv.findIndex((arg) => arg === \"--steps\")\n const inlineSteps = argv.find((arg) => arg.startsWith(\"--steps=\"))\n const stepsCandidate = stepsIndex >= 0 ? argv[stepsIndex + 1] : undefined\n const verbose = argv.includes(\"--verbose\")\n\n if (stepsCandidate === \"-\") {\n const skipGhPreflight = !argv.includes(\"--check-gh-preflight\")\n return { stepsSource: \"stdin\", skipGhPreflight, verbose }\n }\n\n const stepsRaw =\n stepsCandidate && !stepsCandidate.startsWith(\"--\")\n ? stepsCandidate\n : inlineSteps\n ? inlineSteps.slice(\"--steps=\".length)\n : undefined\n\n if (!stepsRaw) {\n throw new Error(\"Missing --steps JSON\")\n }\n\n const skipGhPreflight = !argv.includes(\"--check-gh-preflight\")\n return { stepsSource: { raw: stepsRaw }, skipGhPreflight, verbose }\n}\n\nfunction parseJsonSteps(raw: string): Array<{ task: string; input: Record<string, unknown> }> {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n throw new Error(\"Invalid JSON for --steps\")\n }\n\n if (!Array.isArray(parsed)) {\n throw new Error(\"--steps must be a JSON array\")\n }\n\n for (const item of parsed) {\n if (\n typeof item !== \"object\" ||\n item === null ||\n typeof (item as Record<string, unknown>).task !== \"string\" ||\n typeof (item as Record<string, unknown>).input !== \"object\" ||\n (item as Record<string, unknown>).input === null\n ) {\n throw new Error('Each step must have \"task\" (string) and \"input\" (object) fields')\n }\n }\n\n return parsed as Array<{ task: string; input: Record<string, unknown> }>\n}\n\ntype GqlPayload<TData> = {\n data?: TData\n errors?: GraphqlError[]\n message?: string\n}\n\nasync function fetchGqlPayload<TData>(\n token: string,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<GqlPayload<TData>> {\n const response = await fetch(GITHUB_GRAPHQL_ENDPOINT, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n authorization: `Bearer ${token}`,\n \"user-agent\": \"ghx\",\n },\n body: JSON.stringify({ query, variables: variables ?? {} }),\n signal: AbortSignal.timeout(30_000),\n })\n\n let payload: GqlPayload<TData>\n try {\n payload = (await response.json()) as GqlPayload<TData>\n } catch {\n throw new Error(`GitHub GraphQL returned non-JSON response (status ${response.status})`)\n }\n\n if (!response.ok) {\n const message =\n payload.message ?? `GitHub GraphQL request failed with status ${response.status}`\n throw new Error(message)\n }\n\n return payload\n}\n\nasync function executeGraphqlRequest<TData>(\n token: string,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<TData> {\n const payload = await fetchGqlPayload<TData>(token, query, variables)\n\n if (Array.isArray(payload.errors) && payload.errors.length > 0) {\n const message = payload.errors[0]?.message ?? \"GitHub GraphQL returned errors\"\n throw new Error(message)\n }\n\n if (payload.data === undefined) {\n throw new Error(\"GitHub GraphQL response missing data\")\n }\n\n return payload.data\n}\n\nasync function executeRawGraphqlRequest<TData>(\n token: string,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<GraphqlRawResult<TData>> {\n const payload = await fetchGqlPayload<TData>(token, query, variables)\n return {\n data: payload.data,\n errors: payload.errors?.length ? payload.errors : undefined,\n }\n}\n\nexport async function chainCommand(argv: string[] = []): Promise<number> {\n if (argv.length === 0) {\n process.stdout.write(\n \"Usage: ghx chain --steps '<json-array>' | --steps - [--check-gh-preflight] [--verbose]\\n\",\n )\n return 1\n }\n\n try {\n const { stepsSource, skipGhPreflight, verbose } = parseChainFlags(argv)\n const steps =\n stepsSource === \"stdin\" ? parseJsonSteps(await readStdin()) : parseJsonSteps(stepsSource.raw)\n const { token: githubToken } = await resolveGithubToken()\n\n const githubClient = createGithubClient({\n async execute<TData>(query: string, variables?: Record<string, unknown>): Promise<TData> {\n return executeGraphqlRequest<TData>(githubToken, query, variables)\n },\n async executeRaw<TData>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphqlRawResult<TData>> {\n return executeRawGraphqlRequest<TData>(githubToken, query, variables)\n },\n })\n\n const resolutionCache = createResolutionCache()\n const result = await executeTasks(steps, {\n githubClient,\n githubToken,\n skipGhPreflight,\n resolutionCache,\n })\n\n const output = verbose ? result : compactChainResult(result)\n process.stdout.write(`${JSON.stringify(output, null, verbose ? 2 : undefined)}\\n`)\n return result.status === \"success\" || result.status === \"partial\" ? 0 : 1\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n process.stderr.write(`${message}\\n`)\n return 1\n }\n}\n","import { access, appendFile, mkdir, readFile, writeFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\nimport readline from \"node:readline/promises\"\nimport { fileURLToPath } from \"node:url\"\nimport { resolveGithubToken } from \"@core/core/auth/resolve-token.js\"\nimport type { ErrorCode } from \"@core/core/errors/codes.js\"\nimport { errorCodes } from \"@core/core/errors/codes.js\"\nimport { Ajv } from \"ajv\"\n\ntype SetupScope = \"user\" | \"project\"\n\ntype SetupOptions = {\n scope: SetupScope\n assumeYes: boolean\n dryRun: boolean\n verifyOnly: boolean\n track: boolean\n}\n\ntype SetupError = Error & { code?: ErrorCode }\n\nconst ajv = new Ajv({ allErrors: true, strict: false })\n\nconst setupOptionsSchema = {\n type: \"object\",\n additionalProperties: false,\n required: [\"scope\", \"assumeYes\", \"dryRun\", \"verifyOnly\", \"track\"],\n properties: {\n scope: {\n type: \"string\",\n enum: [\"user\", \"project\"],\n },\n assumeYes: { type: \"boolean\" },\n dryRun: { type: \"boolean\" },\n verifyOnly: { type: \"boolean\" },\n track: { type: \"boolean\" },\n },\n} as const\n\nconst validateSetupOptions = ajv.compile(setupOptionsSchema)\n\nconst setupCommandDirectory = dirname(fileURLToPath(import.meta.url))\nconst setupSkillAssetPathCandidates = [\n join(setupCommandDirectory, \"..\", \"..\", \"..\", \"skills\", \"using-ghx\", \"SKILL.md\"),\n join(setupCommandDirectory, \"..\", \"..\", \"skills\", \"using-ghx\", \"SKILL.md\"),\n]\n\nfunction isENOENT(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n )\n}\n\nfunction createSetupError(message: string, code: ErrorCode): SetupError {\n const error = new Error(message) as SetupError\n error.code = code\n return error\n}\n\nasync function loadSetupSkillContent(): Promise<string> {\n for (const candidatePath of setupSkillAssetPathCandidates) {\n try {\n return await readFile(candidatePath, \"utf8\")\n } catch (error) {\n if (isENOENT(error)) {\n continue\n }\n\n throw error\n }\n }\n\n throw createSetupError(\n `Setup skill asset not found. Checked: ${setupSkillAssetPathCandidates.join(\", \")}`,\n errorCodes.NotFound,\n )\n}\n\nfunction usage(): string {\n return \"Usage: ghx setup --scope <user|project> [--yes] [--dry-run] [--verify] [--track]\"\n}\n\nfunction parseScope(argv: string[]): SetupScope | undefined {\n const inline = argv.find((arg) => arg.startsWith(\"--scope=\"))\n if (inline) {\n const raw = inline.slice(\"--scope=\".length)\n if (raw === \"user\" || raw === \"project\") {\n return raw\n }\n return undefined\n }\n\n const scopeIndex = argv.findIndex((arg) => arg === \"--scope\")\n if (scopeIndex < 0) {\n return undefined\n }\n\n const value = argv[scopeIndex + 1]\n if (value === \"user\" || value === \"project\") {\n return value\n }\n\n return undefined\n}\n\nfunction parseArgs(argv: string[]): SetupOptions | null {\n const scope = parseScope(argv)\n if (!scope) {\n return null\n }\n\n const options: SetupOptions = {\n scope,\n assumeYes: argv.includes(\"--yes\"),\n dryRun: argv.includes(\"--dry-run\"),\n verifyOnly: argv.includes(\"--verify\"),\n track: argv.includes(\"--track\"),\n }\n\n if (!validateSetupOptions(options)) {\n return null\n }\n\n return options\n}\n\nfunction resolveSkillPath(scope: SetupScope): string {\n const base = scope === \"user\" ? homedir() : process.cwd()\n return join(base, \".agents\", \"skills\", \"using-ghx\", \"SKILL.md\")\n}\n\nfunction resolveTrackingPath(): string {\n return join(homedir(), \".agents\", \"ghx\", \"setup-events.jsonl\")\n}\n\nasync function writeTrackingEvent(options: {\n track: boolean\n scope: SetupScope\n mode: \"apply\"\n success: boolean\n}): Promise<void> {\n if (!options.track) {\n return\n }\n\n const trackingPath = resolveTrackingPath()\n await mkdir(join(homedir(), \".agents\", \"ghx\"), { recursive: true })\n await appendFile(\n trackingPath,\n `${JSON.stringify({\n command: \"setup\",\n scope: options.scope,\n mode: options.mode,\n success: options.success,\n timestamp: new Date().toISOString(),\n })}\\n`,\n \"utf8\",\n )\n}\n\nasync function confirmOverwrite(skillPath: string): Promise<boolean> {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n return false\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n\n try {\n const answer = await rl.question(`Skill already exists at ${skillPath}. Overwrite? [y/N] `)\n const normalized = answer.trim().toLowerCase()\n return normalized === \"y\" || normalized === \"yes\"\n } finally {\n rl.close()\n }\n}\n\nasync function verifySkill(skillPath: string): Promise<boolean> {\n try {\n const content = await readFile(skillPath, \"utf8\")\n return content.includes(\"ghx capabilities\")\n } catch (error) {\n if (isENOENT(error)) {\n return false\n }\n\n throw error\n }\n}\n\nasync function skillFileExists(skillPath: string): Promise<boolean> {\n try {\n await access(skillPath)\n return true\n } catch (error) {\n if (isENOENT(error)) {\n return false\n }\n\n throw error\n }\n}\n\nexport async function setupCommand(argv: string[] = []): Promise<number> {\n const parsed = parseArgs(argv)\n if (!parsed) {\n process.stderr.write(`${usage()}\\n`)\n return 1\n }\n\n const skillPath = resolveSkillPath(parsed.scope)\n\n try {\n if (parsed.verifyOnly) {\n const ok = await verifySkill(skillPath)\n if (!ok) {\n process.stderr.write(`Verify failed: skill not installed at ${skillPath}\\n`)\n return 1\n }\n\n process.stdout.write(`Verify passed: skill installed at ${skillPath}\\n`)\n return 0\n }\n\n if (parsed.dryRun) {\n process.stdout.write(`Dry run: would write ${skillPath}\\n`)\n return 0\n }\n\n const alreadyExists = await skillFileExists(skillPath)\n if (alreadyExists && !parsed.assumeYes) {\n const approved = await confirmOverwrite(skillPath)\n if (!approved) {\n process.stderr.write(\n `Skill already exists at ${skillPath}. Re-run with --yes or confirm overwrite interactively.\\n`,\n )\n await writeTrackingEvent({\n track: parsed.track,\n scope: parsed.scope,\n mode: \"apply\",\n success: false,\n })\n return 1\n }\n }\n\n const skillContent = await loadSetupSkillContent()\n await mkdir(dirname(skillPath), { recursive: true })\n await writeFile(skillPath, skillContent, \"utf8\")\n\n process.stdout.write(`Setup complete: wrote ${skillPath}\\n`)\n\n try {\n const { source } = await resolveGithubToken()\n if (source === \"gh-cli\") {\n process.stdout.write(\"GitHub token cached from gh CLI (enables sandboxed agent access)\\n\")\n }\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n process.stderr.write(`Warning: could not resolve GitHub token — ${detail}\\n`)\n }\n\n process.stdout.write(\"Try: ghx capabilities list\\n\")\n await writeTrackingEvent({\n track: parsed.track,\n scope: parsed.scope,\n mode: \"apply\",\n success: true,\n })\n return 0\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n process.stderr.write(`Setup failed: ${message}\\n`)\n return 1\n }\n}\n"],"mappings":"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","names":["dirname","join","fileURLToPath","parseArgs","skipGhPreflight","GITHUB_GRAPHQL_ENDPOINT","skipGhPreflight","executeGraphqlRequest","usage","parseArgs","dirname","fileURLToPath","join","usage"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { DocumentNode } from 'graphql';
|
|
2
2
|
|
|
3
|
+
type TokenResolution = {
|
|
4
|
+
token: string;
|
|
5
|
+
source: "env" | "cache" | "gh-cli";
|
|
6
|
+
};
|
|
7
|
+
declare function resolveGithubToken(): Promise<TokenResolution>;
|
|
8
|
+
declare function invalidateTokenCache(): Promise<void>;
|
|
9
|
+
|
|
3
10
|
/**
|
|
4
11
|
* All possible error codes returned in {@link ResultError.code}.
|
|
5
12
|
*
|
|
@@ -1263,4 +1270,4 @@ declare function executeTasks(requests: Array<{
|
|
|
1263
1270
|
input: Record<string, unknown>;
|
|
1264
1271
|
}>, deps: ExecutionDeps): Promise<ChainResultEnvelope>;
|
|
1265
1272
|
|
|
1266
|
-
export { type AttemptMeta, type CapabilityExplanation, type CapabilityListItem, type ChainResultEnvelope, type ChainStatus, type ChainStepResult, type CliCommandRunner, type GithubClient, type GraphqlClient, type GraphqlError, type GraphqlRawResult, type GraphqlTransport, type OperationCard, type ResolutionCache, type ResolutionCacheOptions, type ResultEnvelope, type ResultError, type ResultMeta, type RouteReasonCode, type RouteSource, type TaskRequest, type TokenClientOptions, buildCacheKey, createExecuteTool, createGithubClient, createGithubClientFromToken, createGraphqlClient, createResolutionCache, createSafeCliCommandRunner, executeTask, executeTasks, explainCapability, getOperationCard, listCapabilities, listOperationCards };
|
|
1273
|
+
export { type AttemptMeta, type CapabilityExplanation, type CapabilityListItem, type ChainResultEnvelope, type ChainStatus, type ChainStepResult, type CliCommandRunner, type GithubClient, type GraphqlClient, type GraphqlError, type GraphqlRawResult, type GraphqlTransport, type OperationCard, type ResolutionCache, type ResolutionCacheOptions, type ResultEnvelope, type ResultError, type ResultMeta, type RouteReasonCode, type RouteSource, type TaskRequest, type TokenClientOptions, type TokenResolution, buildCacheKey, createExecuteTool, createGithubClient, createGithubClientFromToken, createGraphqlClient, createResolutionCache, createSafeCliCommandRunner, executeTask, executeTasks, explainCapability, getOperationCard, invalidateTokenCache, listCapabilities, listOperationCards, resolveGithubToken };
|
package/dist/index.js
CHANGED
|
@@ -8,9 +8,11 @@ import {
|
|
|
8
8
|
executeTasks,
|
|
9
9
|
explainCapability,
|
|
10
10
|
getOperationCard,
|
|
11
|
+
invalidateTokenCache,
|
|
11
12
|
listCapabilities,
|
|
12
|
-
listOperationCards
|
|
13
|
-
|
|
13
|
+
listOperationCards,
|
|
14
|
+
resolveGithubToken
|
|
15
|
+
} from "./chunk-VCBQTH5J.js";
|
|
14
16
|
import "./chunk-H7CLZHRO.js";
|
|
15
17
|
import "./chunk-NQ53ETYV.js";
|
|
16
18
|
import "./chunk-TGL33GEA.js";
|
|
@@ -51,7 +53,9 @@ export {
|
|
|
51
53
|
executeTasks,
|
|
52
54
|
explainCapability,
|
|
53
55
|
getOperationCard,
|
|
56
|
+
invalidateTokenCache,
|
|
54
57
|
listCapabilities,
|
|
55
|
-
listOperationCards
|
|
58
|
+
listOperationCards,
|
|
59
|
+
resolveGithubToken
|
|
56
60
|
};
|
|
57
61
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/execute/execute-tool.ts"],"sourcesContent":["import type { ResultEnvelope } from \"../contracts/envelope.js\"\n\ntype ExecuteTaskFn = (request: {\n task: string\n input: Record<string, unknown>\n options?: Record<string, unknown>\n}) => Promise<ResultEnvelope>\n\n/**\n * Creates an execute tool suitable for wiring into an AI agent's tool loop.\n *\n * Wraps the execution engine into a simple `{ execute(capabilityId, params) }` shape.\n *\n * @example\n * ```ts\n * const tool = createExecuteTool({\n * executeTask: (req) => executeTask(req, deps),\n * })\n * const result = await tool.execute(\"repo.view\", { owner: \"aryeko\", name: \"ghx\" })\n * ```\n */\nexport function createExecuteTool(deps: { executeTask: ExecuteTaskFn }) {\n return {\n execute(\n capabilityId: string,\n params: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<ResultEnvelope> {\n const request = {\n task: capabilityId,\n input: params,\n ...(options ? { options } : {}),\n }\n\n return deps.executeTask(request)\n },\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/core/execute/execute-tool.ts"],"sourcesContent":["import type { ResultEnvelope } from \"../contracts/envelope.js\"\n\ntype ExecuteTaskFn = (request: {\n task: string\n input: Record<string, unknown>\n options?: Record<string, unknown>\n}) => Promise<ResultEnvelope>\n\n/**\n * Creates an execute tool suitable for wiring into an AI agent's tool loop.\n *\n * Wraps the execution engine into a simple `{ execute(capabilityId, params) }` shape.\n *\n * @example\n * ```ts\n * const tool = createExecuteTool({\n * executeTask: (req) => executeTask(req, deps),\n * })\n * const result = await tool.execute(\"repo.view\", { owner: \"aryeko\", name: \"ghx\" })\n * ```\n */\nexport function createExecuteTool(deps: { executeTask: ExecuteTaskFn }) {\n return {\n execute(\n capabilityId: string,\n params: Record<string, unknown>,\n options?: Record<string, unknown>,\n ): Promise<ResultEnvelope> {\n const request = {\n task: capabilityId,\n input: params,\n ...(options ? { options } : {}),\n }\n\n return deps.executeTask(request)\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBO,SAAS,kBAAkB,MAAsC;AACtE,SAAO;AAAA,IACL,QACE,cACA,QACA,SACyB;AACzB,YAAM,UAAU;AAAA,QACd,MAAM;AAAA,QACN,OAAO;AAAA,QACP,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC/B;AAEA,aAAO,KAAK,YAAY,OAAO;AAAA,IACjC;AAAA,EACF;AACF;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ghx-dev/core",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "GitHub
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "Route GitHub operations through deterministic adapters instead of fragile shell scraping. 70+ capabilities covering issues, PRs, repos, releases, and projects — each with validated input, normalized output, and automatic fallback routing.",
|
|
5
5
|
"author": "Arye Kogan",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"keywords": [
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
67
|
"ajv": "^8.18.0",
|
|
68
|
-
"graphql": "^16.13.
|
|
68
|
+
"graphql": "^16.13.1",
|
|
69
69
|
"graphql-request": "^7.3.1",
|
|
70
70
|
"graphql-tag": "^2.12.6",
|
|
71
71
|
"js-yaml": "^4.1.0"
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"@graphql-codegen/typescript": "^5.0.8",
|
|
78
78
|
"@graphql-codegen/typescript-graphql-request": "^6.3.0",
|
|
79
79
|
"@graphql-codegen/typescript-operations": "^5.0.8",
|
|
80
|
-
"@opencode-ai/sdk": "^1.2.
|
|
80
|
+
"@opencode-ai/sdk": "^1.2.23",
|
|
81
81
|
"@types/js-yaml": "^4.0.9",
|
|
82
82
|
"@types/node": "^25.2.3",
|
|
83
83
|
"@vitest/coverage-v8": "^3.2.4",
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
2
|
+
name: using-ghx
|
|
3
|
+
description: Executes GitHub operations via ghx. Use for all GitHub interactions instead of raw gh or gh api commands.
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
# ghx CLI Skill
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
## Authentication
|
|
9
|
+
|
|
10
|
+
ghx automatically resolves your GitHub token. It checks (in order):
|
|
11
|
+
1. `GITHUB_TOKEN` environment variable
|
|
12
|
+
2. `GH_TOKEN` environment variable
|
|
13
|
+
3. Cached token (from previous resolution)
|
|
14
|
+
4. `gh auth token` (requires `gh` CLI authenticated via `gh auth login`)
|
|
15
|
+
|
|
16
|
+
If you are authenticated via `gh auth login`, ghx works out of the box with no extra configuration.
|
|
8
17
|
|
|
9
18
|
## Capabilities
|
|
10
19
|
|
|
@@ -103,7 +112,16 @@ Example (submitting a review with inline comments):
|
|
|
103
112
|
|
|
104
113
|
```bash
|
|
105
114
|
ghx run pr.reviews.submit --input - <<'EOF'
|
|
106
|
-
{
|
|
115
|
+
{
|
|
116
|
+
"owner": "acme",
|
|
117
|
+
"name": "my-repo",
|
|
118
|
+
"prNumber": 42,
|
|
119
|
+
"event": "REQUEST_CHANGES",
|
|
120
|
+
"body": "Please fix the issues.",
|
|
121
|
+
"comments": [
|
|
122
|
+
{ "path": "src/index.ts", "line": 10, "body": "Off-by-one error here." }
|
|
123
|
+
]
|
|
124
|
+
}
|
|
107
125
|
EOF
|
|
108
126
|
```
|
|
109
127
|
|
|
@@ -111,7 +129,7 @@ EOF
|
|
|
111
129
|
|
|
112
130
|
## Chain
|
|
113
131
|
|
|
114
|
-
|
|
132
|
+
Use `ghx chain` when you have two or more operations to run. It batches steps into as few GraphQL round-trips as possible (typically one) — reducing latency and avoiding mid-sequence failures. Steps are not transactional; a `"partial"` result is possible if one step fails after another has already succeeded.
|
|
115
133
|
|
|
116
134
|
```bash
|
|
117
135
|
ghx chain --steps - <<'EOF'
|
|
@@ -126,4 +144,4 @@ EOF
|
|
|
126
144
|
|
|
127
145
|
**CRITICAL:** Do not use `gh api` or any other raw `gh` commands unless no matching ghx capability exists. Always try `ghx` first.
|
|
128
146
|
|
|
129
|
-
**IMPORTANT:** Always use `ghx chain` when you have two or more operations to execute in a single call!
|
|
147
|
+
**IMPORTANT:** Always use `ghx chain` when you have two or more operations to execute in a single call!
|