@ghx-dev/core 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/dist/{chunk-T3L2VDOS.js → chunk-7A73AXLY.js} +95 -5
- package/dist/chunk-7A73AXLY.js.map +1 -0
- package/dist/cli/index.js +21 -27
- 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 +3 -3
- 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-7A73AXLY.js";
|
|
12
14
|
import "../chunk-H7CLZHRO.js";
|
|
13
15
|
import "../chunk-NQ53ETYV.js";
|
|
14
16
|
import "../chunk-TGL33GEA.js";
|
|
@@ -211,13 +213,6 @@ function readStdin(timeoutMs = 1e4) {
|
|
|
211
213
|
});
|
|
212
214
|
});
|
|
213
215
|
}
|
|
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
216
|
async function executeGraphqlRequest(token, query, variables) {
|
|
222
217
|
const response = await fetch(GITHUB_GRAPHQL_ENDPOINT, {
|
|
223
218
|
method: "POST",
|
|
@@ -252,21 +247,27 @@ async function runCommand(argv = []) {
|
|
|
252
247
|
}
|
|
253
248
|
const { task, inputSource, skipGhPreflight, verbose } = parseRunFlags(argv);
|
|
254
249
|
const input = inputSource === "stdin" ? parseJsonInput(await readStdin()) : parseJsonInput(inputSource.raw);
|
|
255
|
-
const
|
|
256
|
-
const
|
|
250
|
+
const { token, source } = await resolveGithubToken();
|
|
251
|
+
const buildClient = (t) => createGithubClient({
|
|
257
252
|
async execute(query, variables) {
|
|
258
|
-
return executeGraphqlRequest(
|
|
253
|
+
return executeGraphqlRequest(t, query, variables);
|
|
259
254
|
}
|
|
260
255
|
});
|
|
261
|
-
const request = {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
const result = await executeTask(request, {
|
|
266
|
-
githubClient,
|
|
267
|
-
githubToken,
|
|
256
|
+
const request = { task, input };
|
|
257
|
+
let result = await executeTask(request, {
|
|
258
|
+
githubClient: buildClient(token),
|
|
259
|
+
githubToken: token,
|
|
268
260
|
skipGhPreflight
|
|
269
261
|
});
|
|
262
|
+
if (!result.ok && result.error?.code === errorCodes.Auth && source !== "env") {
|
|
263
|
+
await invalidateTokenCache();
|
|
264
|
+
const fresh = await resolveGithubToken();
|
|
265
|
+
result = await executeTask(request, {
|
|
266
|
+
githubClient: buildClient(fresh.token),
|
|
267
|
+
githubToken: fresh.token,
|
|
268
|
+
skipGhPreflight
|
|
269
|
+
});
|
|
270
|
+
}
|
|
270
271
|
const output = verbose ? result : compactRunResult(result);
|
|
271
272
|
process.stdout.write(`${JSON.stringify(output, null, verbose ? 2 : void 0)}
|
|
272
273
|
`);
|
|
@@ -308,13 +309,6 @@ function parseJsonSteps(raw) {
|
|
|
308
309
|
}
|
|
309
310
|
return parsed;
|
|
310
311
|
}
|
|
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
312
|
async function fetchGqlPayload(token, query, variables) {
|
|
319
313
|
const response = await fetch(GITHUB_GRAPHQL_ENDPOINT2, {
|
|
320
314
|
method: "POST",
|
|
@@ -367,7 +361,7 @@ async function chainCommand(argv = []) {
|
|
|
367
361
|
try {
|
|
368
362
|
const { stepsSource, skipGhPreflight, verbose } = parseChainFlags(argv);
|
|
369
363
|
const steps = stepsSource === "stdin" ? parseJsonSteps(await readStdin()) : parseJsonSteps(stepsSource.raw);
|
|
370
|
-
const githubToken =
|
|
364
|
+
const { token: githubToken } = await resolveGithubToken();
|
|
371
365
|
const githubClient = createGithubClient({
|
|
372
366
|
async execute(query, variables) {
|
|
373
367
|
return executeGraphqlRequest2(githubToken, query, variables);
|
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":"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","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 { 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 { 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 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":"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","names":["parseArgs","skipGhPreflight","GITHUB_GRAPHQL_ENDPOINT","skipGhPreflight","executeGraphqlRequest","usage","parseArgs","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-7A73AXLY.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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ghx-dev/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "GitHub execution router for AI agents with deterministic routing and normalized output.",
|
|
5
5
|
"author": "Arye Kogan",
|
|
6
6
|
"license": "MIT",
|
|
@@ -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!
|