@ghx-dev/core 0.2.1 → 0.2.2

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.
Files changed (29) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +68 -231
  3. package/dist/{chunk-HEHONZTO.js → chunk-C2KRRSSX.js} +1 -1
  4. package/dist/chunk-C2KRRSSX.js.map +1 -0
  5. package/dist/{chunk-M5PJLKL5.js → chunk-T3L2VDOS.js} +11 -11
  6. package/dist/chunk-T3L2VDOS.js.map +1 -0
  7. package/dist/cli/index.js +3 -3
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/index.d.ts +160 -0
  10. package/dist/index.js +2 -2
  11. package/dist/index.js.map +1 -1
  12. package/dist/{issue-mutations-OW464JP3.js → issue-mutations-DIWPF3JH.js} +2 -2
  13. package/dist/{issue-queries-ORG3VPK4.js → issue-queries-YQL65J7X.js} +2 -2
  14. package/dist/{pr-mutations-WOTG6FAB.js → pr-mutations-BVHDCAPR.js} +2 -2
  15. package/dist/{pr-queries-6CJJW7BT.js → pr-queries-NUL2UZJB.js} +2 -2
  16. package/dist/{project-QFSCYDDW.js → project-3ZSPVIOC.js} +2 -2
  17. package/dist/{release-33236BBA.js → release-IQCWD655.js} +2 -2
  18. package/dist/{repo-M6DKCWBG.js → repo-JF47JAZG.js} +2 -2
  19. package/package.json +5 -5
  20. package/skills/using-ghx/SKILL.md +2 -0
  21. package/dist/chunk-HEHONZTO.js.map +0 -1
  22. package/dist/chunk-M5PJLKL5.js.map +0 -1
  23. /package/dist/{issue-mutations-OW464JP3.js.map → issue-mutations-DIWPF3JH.js.map} +0 -0
  24. /package/dist/{issue-queries-ORG3VPK4.js.map → issue-queries-YQL65J7X.js.map} +0 -0
  25. /package/dist/{pr-mutations-WOTG6FAB.js.map → pr-mutations-BVHDCAPR.js.map} +0 -0
  26. /package/dist/{pr-queries-6CJJW7BT.js.map → pr-queries-NUL2UZJB.js.map} +0 -0
  27. /package/dist/{project-QFSCYDDW.js.map → project-3ZSPVIOC.js.map} +0 -0
  28. /package/dist/{release-33236BBA.js.map → release-IQCWD655.js.map} +0 -0
  29. /package/dist/{repo-M6DKCWBG.js.map → repo-JF47JAZG.js.map} +0 -0
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-OQWLEFAH.js";
16
16
  import {
17
17
  createGraphqlRequestClient
18
- } from "./chunk-HEHONZTO.js";
18
+ } from "./chunk-C2KRRSSX.js";
19
19
 
20
20
  // src/gql/domains/pr-queries.ts
21
21
  async function runPrView(transport, input) {
@@ -140,4 +140,4 @@ export {
140
140
  runPrReviewsList,
141
141
  runPrView
142
142
  };
143
- //# sourceMappingURL=pr-queries-6CJJW7BT.js.map
143
+ //# sourceMappingURL=pr-queries-NUL2UZJB.js.map
@@ -19,7 +19,7 @@ import {
19
19
  } from "./chunk-OQWLEFAH.js";
20
20
  import {
21
21
  createGraphqlRequestClient
22
- } from "./chunk-HEHONZTO.js";
22
+ } from "./chunk-C2KRRSSX.js";
23
23
 
24
24
  // src/gql/operations/project-v2-fields-list-user.generated.ts
25
25
  var ProjectV2FieldsListUserDocument = `
@@ -426,4 +426,4 @@ export {
426
426
  runProjectV2OrgView,
427
427
  runProjectV2UserView
428
428
  };
429
- //# sourceMappingURL=project-QFSCYDDW.js.map
429
+ //# sourceMappingURL=project-3ZSPVIOC.js.map
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-OQWLEFAH.js";
10
10
  import {
11
11
  createGraphqlRequestClient
12
- } from "./chunk-HEHONZTO.js";
12
+ } from "./chunk-C2KRRSSX.js";
13
13
 
14
14
  // src/gql/domains/release.ts
15
15
  function mapReleaseNode(r) {
@@ -54,4 +54,4 @@ export {
54
54
  runReleaseList,
55
55
  runReleaseView
56
56
  };
57
- //# sourceMappingURL=release-33236BBA.js.map
57
+ //# sourceMappingURL=release-IQCWD655.js.map
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-OQWLEFAH.js";
11
11
  import {
12
12
  createGraphqlRequestClient
13
- } from "./chunk-HEHONZTO.js";
13
+ } from "./chunk-C2KRRSSX.js";
14
14
 
15
15
  // src/gql/domains/repo.ts
16
16
  async function runRepoView(transport, input) {
@@ -79,4 +79,4 @@ export {
79
79
  runRepoLabelsList,
80
80
  runRepoView
81
81
  };
82
- //# sourceMappingURL=repo-M6DKCWBG.js.map
82
+ //# sourceMappingURL=repo-JF47JAZG.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ghx-dev/core",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
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.11.0",
68
+ "graphql": "^16.13.0",
69
69
  "graphql-request": "^7.3.1",
70
70
  "graphql-tag": "^2.12.6",
71
71
  "js-yaml": "^4.1.0"
@@ -77,15 +77,15 @@
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.10",
80
+ "@opencode-ai/sdk": "^1.2.15",
81
81
  "@types/js-yaml": "^4.0.9",
82
82
  "@types/node": "^25.2.3",
83
- "@vitest/coverage-v8": "^2.1.8",
83
+ "@vitest/coverage-v8": "^3.2.4",
84
84
  "tsup": "^8.5.0",
85
85
  "tsx": "^4.21.0",
86
86
  "typescript": "^5.9.3",
87
87
  "vite-tsconfig-paths": "^6.1.1",
88
- "vitest": "^2.1.8"
88
+ "vitest": "^3.2.4"
89
89
  },
90
90
  "scripts": {
91
91
  "ghx": "tsx src/cli/index.ts",
@@ -125,3 +125,5 @@ EOF
125
125
  **Result:** `{ status, results[] }`. Each result: `{ task, ok, data? }` on success — `{ task, ok, error: { code, message } }` on failure.
126
126
 
127
127
  **CRITICAL:** Do not use `gh api` or any other raw `gh` commands unless no matching ghx capability exists. Always try `ghx` first.
128
+
129
+ **IMPORTANT:** Always use `ghx chain` when you have two or more operations to execute in a single call!
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/gql/transport.ts"],"sourcesContent":["import { type DocumentNode, print } from \"graphql\"\nimport type { GraphQLClient, RequestDocument, RequestOptions } from \"graphql-request\"\n\nexport type GraphqlVariables = Record<string, unknown>\n\nexport type GraphqlError = {\n message: string\n path?: ReadonlyArray<string | number>\n extensions?: Record<string, unknown>\n}\n\nexport type GraphqlRawResult<TData> = {\n data: TData | undefined\n errors: GraphqlError[] | undefined\n}\n\ntype GraphqlDocument = string | DocumentNode\ntype QueryLike = GraphqlDocument | RequestDocument\n\nexport interface GraphqlTransport {\n execute<TData>(query: string, variables?: GraphqlVariables): Promise<TData>\n executeRaw?<TData>(query: string, variables?: GraphqlVariables): Promise<GraphqlRawResult<TData>>\n}\n\nexport interface GraphqlClient {\n query<TData, TVariables extends GraphqlVariables = GraphqlVariables>(\n query: GraphqlDocument,\n variables?: TVariables,\n ): Promise<TData>\n queryRaw<TData, TVariables extends GraphqlVariables = GraphqlVariables>(\n query: GraphqlDocument,\n variables?: TVariables,\n ): Promise<GraphqlRawResult<TData>>\n}\n\nexport type TokenClientOptions = {\n token: string\n graphqlUrl?: string\n}\n\nfunction queryToString(query: QueryLike): string {\n if (typeof query === \"string\") {\n return query\n }\n\n if (typeof query === \"object\" && query !== null && \"kind\" in query) {\n return print(query as DocumentNode)\n }\n\n return String(query)\n}\n\nfunction assertQuery(query: string): void {\n if (query.trim().length === 0) {\n throw new Error(\"GraphQL query must be non-empty\")\n }\n}\n\nexport function createGraphqlClient(transport: GraphqlTransport): GraphqlClient {\n return {\n async query<TData, TVariables extends GraphqlVariables = GraphqlVariables>(\n query: GraphqlDocument,\n variables?: TVariables,\n ): Promise<TData> {\n const queryText = queryToString(query)\n assertQuery(queryText)\n return transport.execute<TData>(queryText, variables)\n },\n async queryRaw<TData, TVariables extends GraphqlVariables = GraphqlVariables>(\n query: GraphqlDocument,\n variables?: TVariables,\n ): Promise<GraphqlRawResult<TData>> {\n const queryText = queryToString(query)\n assertQuery(queryText)\n // Both paths normalize transport-level errors into settled results\n try {\n if (transport.executeRaw) {\n return await transport.executeRaw<TData>(queryText, variables)\n }\n const data = await transport.execute<TData>(queryText, variables)\n return { data, errors: undefined }\n } catch (err) {\n return {\n data: undefined,\n errors: [{ message: err instanceof Error ? err.message : String(err) }],\n }\n }\n },\n }\n}\n\nexport function createGraphqlRequestClient(transport: GraphqlTransport): GraphQLClient {\n const client: Pick<GraphQLClient, \"request\"> = {\n request<TData, TVariables extends object = object>(\n documentOrOptions: RequestDocument | RequestOptions<TVariables, TData>,\n ...variablesAndRequestHeaders: unknown[]\n ): Promise<TData> {\n const options =\n typeof documentOrOptions === \"object\" &&\n documentOrOptions !== null &&\n \"document\" in documentOrOptions\n ? documentOrOptions\n : {\n document: documentOrOptions,\n variables: variablesAndRequestHeaders[0] as TVariables | undefined,\n }\n\n const queryText = queryToString(options.document)\n assertQuery(queryText)\n return transport.execute<TData>(queryText, options.variables as GraphqlVariables)\n },\n }\n\n return client as GraphQLClient\n}\n\nconst DEFAULT_GRAPHQL_URL = \"https://api.github.com/graphql\"\n\nexport function resolveGraphqlUrl(): string {\n if (process.env.GITHUB_GRAPHQL_URL) {\n return process.env.GITHUB_GRAPHQL_URL\n }\n\n if (process.env.GH_HOST) {\n return `https://${process.env.GH_HOST}/api/graphql`\n }\n\n return DEFAULT_GRAPHQL_URL\n}\n\ntype JsonPayload<TData> = {\n data?: TData\n errors?: GraphqlError[]\n message?: string\n}\n\nasync function fetchGraphql<TData>(\n url: string,\n token: string,\n query: string,\n variables?: GraphqlVariables,\n): Promise<JsonPayload<TData>> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({ query, variables: variables ?? {} }),\n })\n\n if (!response.ok) {\n let message = `GraphQL request failed (${response.status})`\n try {\n const body = (await response.json()) as JsonPayload<TData>\n if (body.message) {\n message = body.message\n }\n } catch {\n // Non-JSON error body — use status-based message\n }\n throw new Error(message)\n }\n\n try {\n return (await response.json()) as JsonPayload<TData>\n } catch {\n throw new Error(`GraphQL response is not valid JSON (${response.status})`)\n }\n}\n\nexport function createTokenTransport(token: string, graphqlUrl?: string): GraphqlTransport {\n const url = graphqlUrl ?? resolveGraphqlUrl()\n\n return {\n async execute<TData>(query: string, variables?: GraphqlVariables): Promise<TData> {\n const payload = await fetchGraphql<TData>(url, token, query, variables)\n\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? \"GraphQL returned errors\")\n }\n\n if (payload.data === undefined) {\n throw new Error(\"GraphQL response missing data\")\n }\n\n return payload.data\n },\n\n async executeRaw<TData>(\n query: string,\n variables?: GraphqlVariables,\n ): Promise<GraphqlRawResult<TData>> {\n const payload = await fetchGraphql<TData>(url, token, query, variables)\n return {\n data: payload.data,\n errors: payload.errors?.length ? payload.errors : undefined,\n }\n },\n }\n}\n"],"mappings":"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","names":[]}