@ghx-dev/core 0.1.2 → 0.2.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.
Files changed (216) hide show
  1. package/.claude-plugin/plugin.json +21 -0
  2. package/README.md +49 -45
  3. package/dist/cards/issue.assignees.add.yaml +51 -0
  4. package/dist/cards/issue.assignees.remove.yaml +51 -0
  5. package/dist/cards/issue.assignees.set.yaml +48 -0
  6. package/dist/cards/issue.close.yaml +17 -2
  7. package/dist/cards/issue.comments.create.yaml +17 -2
  8. package/dist/cards/issue.comments.list.yaml +1 -0
  9. package/dist/cards/issue.create.yaml +12 -0
  10. package/dist/cards/issue.delete.yaml +17 -2
  11. package/dist/cards/issue.labels.add.yaml +49 -0
  12. package/dist/cards/issue.labels.remove.yaml +51 -0
  13. package/dist/cards/issue.labels.set.yaml +48 -0
  14. package/dist/cards/issue.list.yaml +1 -0
  15. package/dist/cards/issue.milestone.clear.yaml +41 -0
  16. package/dist/cards/issue.milestone.set.yaml +24 -4
  17. package/dist/{core/registry/cards/issue.blocked_by.add.yaml → cards/issue.relations.blocked_by.add.yaml} +4 -2
  18. package/dist/cards/{issue.blocked_by.remove.yaml → issue.relations.blocked_by.remove.yaml} +2 -1
  19. package/dist/cards/{issue.parent.remove.yaml → issue.relations.parent.remove.yaml} +12 -1
  20. package/dist/{core/registry/cards/issue.parent.set.yaml → cards/issue.relations.parent.set.yaml} +4 -2
  21. package/dist/{core/registry/cards/issue.linked_prs.list.yaml → cards/issue.relations.prs.list.yaml} +2 -1
  22. package/dist/cards/{issue.relations.get.yaml → issue.relations.view.yaml} +2 -1
  23. package/dist/cards/issue.reopen.yaml +17 -2
  24. package/dist/cards/issue.update.yaml +17 -2
  25. package/dist/cards/issue.view.yaml +8 -5
  26. package/dist/cards/pr.assignees.add.yaml +33 -0
  27. package/dist/cards/pr.assignees.remove.yaml +33 -0
  28. package/dist/cards/pr.branch.update.yaml +6 -2
  29. package/dist/{core/registry/cards/pr.status.checks.yaml → cards/pr.checks.list.yaml} +15 -2
  30. package/dist/{core/registry/cards/pr.checks.rerun_all.yaml → cards/pr.checks.rerun.all.yaml} +2 -4
  31. package/dist/{core/registry/cards/pr.checks.rerun_failed.yaml → cards/pr.checks.rerun.failed.yaml} +3 -5
  32. package/dist/cards/pr.create.yaml +34 -0
  33. package/dist/cards/{pr.diff.list_files.yaml → pr.diff.files.yaml} +2 -1
  34. package/dist/cards/{pr.ready_for_review.set.yaml → pr.diff.view.yaml} +6 -8
  35. package/dist/cards/pr.list.yaml +1 -0
  36. package/dist/{core/registry/cards/pr.mergeability.view.yaml → cards/pr.merge.status.yaml} +7 -3
  37. package/dist/{core/registry/cards/pr.merge.execute.yaml → cards/pr.merge.yaml} +10 -4
  38. package/dist/cards/pr.reviews.list.yaml +2 -1
  39. package/dist/cards/{pr.reviewers.request.yaml → pr.reviews.request.yaml} +7 -4
  40. package/dist/cards/pr.reviews.submit.yaml +68 -0
  41. package/dist/cards/{pr.comments.list.yaml → pr.threads.list.yaml} +3 -2
  42. package/dist/cards/{pr.comment.reply.yaml → pr.threads.reply.yaml} +5 -2
  43. package/dist/{core/registry/cards/pr.comment.resolve.yaml → cards/pr.threads.resolve.yaml} +2 -1
  44. package/dist/cards/{pr.comment.unresolve.yaml → pr.threads.unresolve.yaml} +2 -1
  45. package/dist/cards/pr.update.yaml +34 -0
  46. package/dist/cards/pr.view.yaml +8 -5
  47. package/dist/cards/project_v2.fields.list.yaml +18 -2
  48. package/dist/cards/{project_v2.item.field.update.yaml → project_v2.items.field.update.yaml} +9 -6
  49. package/dist/cards/{project_v2.item.add_issue.yaml → project_v2.items.issue.add.yaml} +10 -6
  50. package/dist/cards/project_v2.items.issue.remove.yaml +26 -0
  51. package/dist/cards/project_v2.items.list.yaml +8 -2
  52. package/dist/{core/registry/cards/project_v2.org.get.yaml → cards/project_v2.org.view.yaml} +7 -3
  53. package/dist/cards/{project_v2.user.get.yaml → project_v2.user.view.yaml} +7 -3
  54. package/dist/{core/registry/cards/release.create_draft.yaml → cards/release.create.yaml} +1 -1
  55. package/dist/cards/release.list.yaml +8 -3
  56. package/dist/cards/{release.publish_draft.yaml → release.publish.yaml} +1 -1
  57. package/dist/cards/{release.get.yaml → release.view.yaml} +9 -5
  58. package/dist/cards/repo.issue_types.list.yaml +7 -3
  59. package/dist/cards/repo.labels.list.yaml +7 -2
  60. package/dist/cards/repo.view.yaml +3 -4
  61. package/dist/cards/{workflow_dispatch.run.yaml → workflow.dispatch.yaml} +1 -1
  62. package/dist/cards/{workflow_job.logs.get.yaml → workflow.job.logs.raw.yaml} +2 -2
  63. package/dist/{core/registry/cards/workflow_job.logs.analyze.yaml → cards/workflow.job.logs.view.yaml} +1 -1
  64. package/dist/{core/registry/cards/workflow_run.artifacts.list.yaml → cards/workflow.run.artifacts.list.yaml} +1 -1
  65. package/dist/cards/{workflow_run.cancel.yaml → workflow.run.cancel.yaml} +1 -1
  66. package/dist/cards/{workflow_run.rerun_all.yaml → workflow.run.rerun.all.yaml} +3 -3
  67. package/dist/{core/registry/cards/workflow_run.rerun_failed.yaml → cards/workflow.run.rerun.failed.yaml} +3 -3
  68. package/dist/{core/registry/cards/workflow_run.get.yaml → cards/workflow.run.view.yaml} +19 -4
  69. package/dist/cards/{workflow_runs.list.yaml → workflow.runs.list.yaml} +1 -1
  70. package/dist/cards/{workflow.get.yaml → workflow.view.yaml} +2 -2
  71. package/dist/chunk-3DU2WHXF.js +15 -0
  72. package/dist/chunk-3DU2WHXF.js.map +1 -0
  73. package/dist/chunk-7HUKYNI2.js +536 -0
  74. package/dist/chunk-7HUKYNI2.js.map +1 -0
  75. package/dist/chunk-GQO6BHJV.js +98 -0
  76. package/dist/chunk-GQO6BHJV.js.map +1 -0
  77. package/dist/chunk-H7CLZHRO.js +280 -0
  78. package/dist/chunk-H7CLZHRO.js.map +1 -0
  79. package/dist/chunk-HEHONZTO.js +121 -0
  80. package/dist/chunk-HEHONZTO.js.map +1 -0
  81. package/dist/chunk-M5PJLKL5.js +6132 -0
  82. package/dist/chunk-M5PJLKL5.js.map +1 -0
  83. package/dist/chunk-NQ53ETYV.js +128 -0
  84. package/dist/chunk-NQ53ETYV.js.map +1 -0
  85. package/dist/chunk-OQWLEFAH.js +436 -0
  86. package/dist/chunk-OQWLEFAH.js.map +1 -0
  87. package/dist/chunk-Q2NW7DJE.js +878 -0
  88. package/dist/chunk-Q2NW7DJE.js.map +1 -0
  89. package/dist/chunk-QRHKAMRY.js +211 -0
  90. package/dist/chunk-QRHKAMRY.js.map +1 -0
  91. package/dist/chunk-R3CBGJZX.js +12 -0
  92. package/dist/chunk-R3CBGJZX.js.map +1 -0
  93. package/dist/chunk-TGL33GEA.js +132 -0
  94. package/dist/chunk-TGL33GEA.js.map +1 -0
  95. package/dist/chunk-TPQYVCAS.js +15 -0
  96. package/dist/chunk-TPQYVCAS.js.map +1 -0
  97. package/dist/chunk-ZGBVX2VG.js +32 -0
  98. package/dist/chunk-ZGBVX2VG.js.map +1 -0
  99. package/dist/cli/index.js +268 -22
  100. package/dist/cli/index.js.map +1 -1
  101. package/dist/core/registry/cards/issue.assignees.add.yaml +51 -0
  102. package/dist/core/registry/cards/issue.assignees.remove.yaml +51 -0
  103. package/dist/core/registry/cards/issue.assignees.set.yaml +48 -0
  104. package/dist/core/registry/cards/issue.close.yaml +17 -2
  105. package/dist/core/registry/cards/issue.comments.create.yaml +17 -2
  106. package/dist/core/registry/cards/issue.comments.list.yaml +1 -0
  107. package/dist/core/registry/cards/issue.create.yaml +12 -0
  108. package/dist/core/registry/cards/issue.delete.yaml +17 -2
  109. package/dist/core/registry/cards/issue.labels.add.yaml +49 -0
  110. package/dist/core/registry/cards/issue.labels.remove.yaml +51 -0
  111. package/dist/core/registry/cards/issue.labels.set.yaml +48 -0
  112. package/dist/core/registry/cards/issue.list.yaml +1 -0
  113. package/dist/core/registry/cards/issue.milestone.clear.yaml +41 -0
  114. package/dist/core/registry/cards/issue.milestone.set.yaml +24 -4
  115. package/dist/{cards/issue.blocked_by.add.yaml → core/registry/cards/issue.relations.blocked_by.add.yaml} +4 -2
  116. package/dist/core/registry/cards/{issue.blocked_by.remove.yaml → issue.relations.blocked_by.remove.yaml} +2 -1
  117. package/dist/core/registry/cards/{issue.parent.remove.yaml → issue.relations.parent.remove.yaml} +12 -1
  118. package/dist/{cards/issue.parent.set.yaml → core/registry/cards/issue.relations.parent.set.yaml} +4 -2
  119. package/dist/{cards/issue.linked_prs.list.yaml → core/registry/cards/issue.relations.prs.list.yaml} +2 -1
  120. package/dist/core/registry/cards/{issue.relations.get.yaml → issue.relations.view.yaml} +2 -1
  121. package/dist/core/registry/cards/issue.reopen.yaml +17 -2
  122. package/dist/core/registry/cards/issue.update.yaml +17 -2
  123. package/dist/core/registry/cards/issue.view.yaml +8 -5
  124. package/dist/core/registry/cards/pr.assignees.add.yaml +33 -0
  125. package/dist/core/registry/cards/pr.assignees.remove.yaml +33 -0
  126. package/dist/core/registry/cards/pr.branch.update.yaml +6 -2
  127. package/dist/{cards/pr.status.checks.yaml → core/registry/cards/pr.checks.list.yaml} +15 -2
  128. package/dist/{cards/pr.checks.rerun_all.yaml → core/registry/cards/pr.checks.rerun.all.yaml} +2 -4
  129. package/dist/{cards/pr.checks.rerun_failed.yaml → core/registry/cards/pr.checks.rerun.failed.yaml} +3 -5
  130. package/dist/core/registry/cards/pr.create.yaml +34 -0
  131. package/dist/core/registry/cards/{pr.diff.list_files.yaml → pr.diff.files.yaml} +2 -1
  132. package/dist/core/registry/cards/{pr.ready_for_review.set.yaml → pr.diff.view.yaml} +6 -8
  133. package/dist/core/registry/cards/pr.list.yaml +1 -0
  134. package/dist/{cards/pr.mergeability.view.yaml → core/registry/cards/pr.merge.status.yaml} +7 -3
  135. package/dist/{cards/pr.merge.execute.yaml → core/registry/cards/pr.merge.yaml} +10 -4
  136. package/dist/core/registry/cards/pr.reviews.list.yaml +2 -1
  137. package/dist/core/registry/cards/{pr.reviewers.request.yaml → pr.reviews.request.yaml} +7 -4
  138. package/dist/core/registry/cards/pr.reviews.submit.yaml +68 -0
  139. package/dist/core/registry/cards/{pr.comments.list.yaml → pr.threads.list.yaml} +3 -2
  140. package/dist/core/registry/cards/{pr.comment.reply.yaml → pr.threads.reply.yaml} +5 -2
  141. package/dist/{cards/pr.comment.resolve.yaml → core/registry/cards/pr.threads.resolve.yaml} +2 -1
  142. package/dist/core/registry/cards/{pr.comment.unresolve.yaml → pr.threads.unresolve.yaml} +2 -1
  143. package/dist/core/registry/cards/pr.update.yaml +34 -0
  144. package/dist/core/registry/cards/pr.view.yaml +8 -5
  145. package/dist/core/registry/cards/project_v2.fields.list.yaml +18 -2
  146. package/dist/core/registry/cards/{project_v2.item.field.update.yaml → project_v2.items.field.update.yaml} +9 -6
  147. package/dist/core/registry/cards/{project_v2.item.add_issue.yaml → project_v2.items.issue.add.yaml} +10 -6
  148. package/dist/core/registry/cards/project_v2.items.issue.remove.yaml +26 -0
  149. package/dist/core/registry/cards/project_v2.items.list.yaml +8 -2
  150. package/dist/{cards/project_v2.org.get.yaml → core/registry/cards/project_v2.org.view.yaml} +7 -3
  151. package/dist/core/registry/cards/{project_v2.user.get.yaml → project_v2.user.view.yaml} +7 -3
  152. package/dist/{cards/release.create_draft.yaml → core/registry/cards/release.create.yaml} +1 -1
  153. package/dist/core/registry/cards/release.list.yaml +8 -3
  154. package/dist/core/registry/cards/{release.publish_draft.yaml → release.publish.yaml} +1 -1
  155. package/dist/core/registry/cards/{release.get.yaml → release.view.yaml} +9 -5
  156. package/dist/core/registry/cards/repo.issue_types.list.yaml +7 -3
  157. package/dist/core/registry/cards/repo.labels.list.yaml +7 -2
  158. package/dist/core/registry/cards/repo.view.yaml +3 -4
  159. package/dist/core/registry/cards/{workflow_dispatch.run.yaml → workflow.dispatch.yaml} +1 -1
  160. package/dist/core/registry/cards/{workflow_job.logs.get.yaml → workflow.job.logs.raw.yaml} +2 -2
  161. package/dist/{cards/workflow_job.logs.analyze.yaml → core/registry/cards/workflow.job.logs.view.yaml} +1 -1
  162. package/dist/{cards/workflow_run.artifacts.list.yaml → core/registry/cards/workflow.run.artifacts.list.yaml} +1 -1
  163. package/dist/core/registry/cards/{workflow_run.cancel.yaml → workflow.run.cancel.yaml} +1 -1
  164. package/dist/core/registry/cards/{workflow_run.rerun_all.yaml → workflow.run.rerun.all.yaml} +3 -3
  165. package/dist/{cards/workflow_run.rerun_failed.yaml → core/registry/cards/workflow.run.rerun.failed.yaml} +3 -3
  166. package/dist/{cards/workflow_run.get.yaml → core/registry/cards/workflow.run.view.yaml} +19 -4
  167. package/dist/core/registry/cards/{workflow_runs.list.yaml → workflow.runs.list.yaml} +1 -1
  168. package/dist/core/registry/cards/{workflow.get.yaml → workflow.view.yaml} +2 -2
  169. package/dist/index.d.ts +671 -35
  170. package/dist/index.js +41 -5
  171. package/dist/index.js.map +1 -1
  172. package/dist/issue-mutations-OW464JP3.js +645 -0
  173. package/dist/issue-mutations-OW464JP3.js.map +1 -0
  174. package/dist/issue-queries-ORG3VPK4.js +93 -0
  175. package/dist/issue-queries-ORG3VPK4.js.map +1 -0
  176. package/dist/pr-mutations-WOTG6FAB.js +484 -0
  177. package/dist/pr-mutations-WOTG6FAB.js.map +1 -0
  178. package/dist/pr-queries-6CJJW7BT.js +143 -0
  179. package/dist/pr-queries-6CJJW7BT.js.map +1 -0
  180. package/dist/project-QFSCYDDW.js +429 -0
  181. package/dist/project-QFSCYDDW.js.map +1 -0
  182. package/dist/release-33236BBA.js +57 -0
  183. package/dist/release-33236BBA.js.map +1 -0
  184. package/dist/repo-M6DKCWBG.js +82 -0
  185. package/dist/repo-M6DKCWBG.js.map +1 -0
  186. package/package.json +19 -16
  187. package/skills/using-ghx/SKILL.md +127 -0
  188. package/dist/agent.d.ts +0 -32
  189. package/dist/agent.js +0 -36
  190. package/dist/agent.js.map +0 -1
  191. package/dist/cards/check_run.annotations.list.yaml +0 -35
  192. package/dist/cards/issue.assignees.update.yaml +0 -27
  193. package/dist/cards/issue.labels.update.yaml +0 -27
  194. package/dist/cards/pr.assignees.update.yaml +0 -38
  195. package/dist/cards/pr.checks.get_failed.yaml +0 -42
  196. package/dist/cards/pr.review.submit_approve.yaml +0 -26
  197. package/dist/cards/pr.review.submit_comment.yaml +0 -26
  198. package/dist/cards/pr.review.submit_request_changes.yaml +0 -26
  199. package/dist/cards/workflow_run.jobs.list.yaml +0 -35
  200. package/dist/chunk-2FCPR3XZ.js +0 -54
  201. package/dist/chunk-2FCPR3XZ.js.map +0 -1
  202. package/dist/chunk-RDUPMVHG.js +0 -4139
  203. package/dist/chunk-RDUPMVHG.js.map +0 -1
  204. package/dist/chunk-UN5YHUNK.js +0 -245
  205. package/dist/chunk-UN5YHUNK.js.map +0 -1
  206. package/dist/cli/assets/skills/ghx/SKILL.md +0 -57
  207. package/dist/core/registry/cards/check_run.annotations.list.yaml +0 -35
  208. package/dist/core/registry/cards/issue.assignees.update.yaml +0 -27
  209. package/dist/core/registry/cards/issue.labels.update.yaml +0 -27
  210. package/dist/core/registry/cards/pr.assignees.update.yaml +0 -38
  211. package/dist/core/registry/cards/pr.checks.get_failed.yaml +0 -42
  212. package/dist/core/registry/cards/pr.review.submit_approve.yaml +0 -26
  213. package/dist/core/registry/cards/pr.review.submit_comment.yaml +0 -26
  214. package/dist/core/registry/cards/pr.review.submit_request_changes.yaml +0 -26
  215. package/dist/core/registry/cards/workflow_run.jobs.list.yaml +0 -35
  216. package/dist/envelope-BpF6MNCv.d.ts +0 -55
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/gql/operations/fragments/pr-core-fields.generated.ts"],"sourcesContent":["import type { GraphQLClient, RequestOptions } from \"graphql-request\"\nimport type * as Types from \"../base-types.js\"\n\ntype GraphQLClientRequestHeaders = RequestOptions[\"requestHeaders\"]\nexport type PrCoreFieldsFragment = {\n __typename?: \"PullRequest\"\n id: string\n number: number\n title: string\n state: Types.PullRequestState\n url: any\n}\n\nexport const PrCoreFieldsFragmentDoc = `\n fragment PrCoreFields on PullRequest {\n id\n number\n title\n state\n url\n}\n `\n\nexport type SdkFunctionWrapper = <T>(\n action: (requestHeaders?: Record<string, string>) => Promise<T>,\n operationName: string,\n operationType?: string,\n variables?: any,\n) => Promise<T>\n\nconst defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType, _variables) =>\n action()\n\nexport function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {\n return {}\n}\nexport type Sdk = ReturnType<typeof getSdk>\n"],"mappings":";AAaO,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
@@ -0,0 +1,32 @@
1
+ // src/gql/operations/issue-create-repository-id.generated.ts
2
+ var IssueCreateRepositoryIdDocument = `
3
+ query IssueCreateRepositoryId($owner: String!, $name: String!) {
4
+ repository(owner: $owner, name: $name) {
5
+ id
6
+ }
7
+ }
8
+ `;
9
+ var defaultWrapper = (action, _operationName, _operationType, _variables) => action();
10
+ function getSdk(client, withWrapper = defaultWrapper) {
11
+ return {
12
+ IssueCreateRepositoryId(variables, requestHeaders, signal) {
13
+ return withWrapper(
14
+ (wrappedRequestHeaders) => client.request({
15
+ document: IssueCreateRepositoryIdDocument,
16
+ variables,
17
+ requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders },
18
+ signal
19
+ }),
20
+ "IssueCreateRepositoryId",
21
+ "query",
22
+ variables
23
+ );
24
+ }
25
+ };
26
+ }
27
+
28
+ export {
29
+ IssueCreateRepositoryIdDocument,
30
+ getSdk
31
+ };
32
+ //# sourceMappingURL=chunk-ZGBVX2VG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/gql/operations/issue-create-repository-id.generated.ts"],"sourcesContent":["import type { GraphQLClient, RequestOptions } from \"graphql-request\"\nimport type * as Types from \"./base-types.js\"\n\ntype GraphQLClientRequestHeaders = RequestOptions[\"requestHeaders\"]\nexport type IssueCreateRepositoryIdQueryVariables = Types.Exact<{\n owner: Types.Scalars[\"String\"][\"input\"]\n name: Types.Scalars[\"String\"][\"input\"]\n}>\n\nexport type IssueCreateRepositoryIdQuery = {\n __typename?: \"Query\"\n repository?: { __typename?: \"Repository\"; id: string } | null\n}\n\nexport const IssueCreateRepositoryIdDocument = `\n query IssueCreateRepositoryId($owner: String!, $name: String!) {\n repository(owner: $owner, name: $name) {\n id\n }\n}\n `\n\nexport type SdkFunctionWrapper = <T>(\n action: (requestHeaders?: Record<string, string>) => Promise<T>,\n operationName: string,\n operationType?: string,\n variables?: any,\n) => Promise<T>\n\nconst defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType, _variables) =>\n action()\n\nexport function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) {\n return {\n IssueCreateRepositoryId(\n variables: IssueCreateRepositoryIdQueryVariables,\n requestHeaders?: GraphQLClientRequestHeaders,\n signal?: RequestInit[\"signal\"],\n ): Promise<IssueCreateRepositoryIdQuery> {\n return withWrapper(\n (wrappedRequestHeaders) =>\n client.request<IssueCreateRepositoryIdQuery>({\n document: IssueCreateRepositoryIdDocument,\n variables,\n requestHeaders: { ...requestHeaders, ...wrappedRequestHeaders },\n signal,\n }),\n \"IssueCreateRepositoryId\",\n \"query\",\n variables,\n )\n },\n }\n}\nexport type Sdk = ReturnType<typeof getSdk>\n"],"mappings":";AAcO,IAAM,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe/C,IAAM,iBAAqC,CAAC,QAAQ,gBAAgB,gBAAgB,eAClF,OAAO;AAEF,SAAS,OAAO,QAAuB,cAAkC,gBAAgB;AAC9F,SAAO;AAAA,IACL,wBACE,WACA,gBACA,QACuC;AACvC,aAAO;AAAA,QACL,CAAC,0BACC,OAAO,QAAsC;AAAA,UAC3C,UAAU;AAAA,UACV;AAAA,UACA,gBAAgB,EAAE,GAAG,gBAAgB,GAAG,sBAAsB;AAAA,UAC9D;AAAA,QACF,CAAC;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/dist/cli/index.js CHANGED
@@ -1,14 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ createGithubClient,
4
+ createResolutionCache,
5
+ errorCodes,
6
+ executeTask,
7
+ executeTasks,
3
8
  explainCapability,
9
+ extractArrayItemHints,
4
10
  listCapabilities
5
- } from "../chunk-2FCPR3XZ.js";
11
+ } from "../chunk-M5PJLKL5.js";
12
+ import "../chunk-H7CLZHRO.js";
13
+ import "../chunk-NQ53ETYV.js";
14
+ import "../chunk-TGL33GEA.js";
15
+ import "../chunk-Q2NW7DJE.js";
16
+ import "../chunk-3DU2WHXF.js";
17
+ import "../chunk-QRHKAMRY.js";
18
+ import "../chunk-TPQYVCAS.js";
19
+ import "../chunk-7HUKYNI2.js";
20
+ import "../chunk-ZGBVX2VG.js";
21
+ import "../chunk-GQO6BHJV.js";
22
+ import "../chunk-R3CBGJZX.js";
6
23
  import {
7
- createGithubClient,
8
- errorCodes,
9
- executeTask
10
- } from "../chunk-RDUPMVHG.js";
11
- import "../chunk-UN5YHUNK.js";
24
+ resolveGraphqlUrl
25
+ } from "../chunk-HEHONZTO.js";
12
26
 
13
27
  // src/cli/index.ts
14
28
  import { realpathSync } from "fs";
@@ -50,49 +64,152 @@ async function capabilitiesExplainCommand(argv = []) {
50
64
 
51
65
  // src/cli/commands/capabilities-list.ts
52
66
  function parseArgs2(argv) {
67
+ const domainIndex = argv.indexOf("--domain");
53
68
  return {
54
- asJson: argv.includes("--json")
69
+ asJson: argv.includes("--json"),
70
+ asCompact: argv.includes("--compact"),
71
+ domain: domainIndex !== -1 ? argv[domainIndex + 1] : void 0
55
72
  };
56
73
  }
74
+ function formatCompact(capabilities) {
75
+ const ids = new Set(capabilities.map((c) => c.capability_id));
76
+ const lines = capabilities.map((item) => {
77
+ const req = item.required_inputs.join(",");
78
+ const opt = item.optional_inputs.map((o) => `${o}?`).join(",");
79
+ const inputs = [req, opt].filter(Boolean).join(",");
80
+ const sig = `${item.capability_id}(${inputs})`;
81
+ const addSibling = item.capability_id.replace(/\.set$/, ".add");
82
+ const needsWarning = item.capability_id.endsWith(".set") && ids.has(addSibling);
83
+ return needsWarning ? `${sig} [replaces all]` : sig;
84
+ });
85
+ return lines.join("\n") + "\n";
86
+ }
57
87
  async function capabilitiesListCommand(argv = []) {
58
- const { asJson } = parseArgs2(argv);
59
- const capabilities = listCapabilities();
88
+ const { asJson, asCompact, domain } = parseArgs2(argv);
89
+ const capabilities = listCapabilities(domain);
90
+ if (capabilities.length === 0) {
91
+ process.stderr.write(
92
+ domain ? `No capabilities found for domain: ${domain}
93
+ ` : "No capabilities found\n"
94
+ );
95
+ return 1;
96
+ }
97
+ if (asCompact) {
98
+ process.stdout.write(formatCompact(capabilities));
99
+ return 0;
100
+ }
60
101
  if (asJson) {
61
102
  process.stdout.write(`${JSON.stringify(capabilities)}
62
103
  `);
63
104
  return 0;
64
105
  }
65
- const lines = capabilities.map((item) => `${item.capability_id} - ${item.description}`);
106
+ const maxIdLen = Math.max(...capabilities.map((c) => c.capability_id.length));
107
+ const maxDescLen = Math.max(...capabilities.map((c) => c.description.length));
108
+ const lines = capabilities.map((item) => {
109
+ const id = item.capability_id.padEnd(maxIdLen);
110
+ const desc = item.description.padEnd(maxDescLen);
111
+ const required = item.required_inputs.join(", ");
112
+ const arrayHints = extractArrayItemHints({ properties: item.optional_inputs_detail });
113
+ const optional = item.optional_inputs.map((n) => {
114
+ const hints = arrayHints[n];
115
+ return hints ? `${n}?[${hints.join(", ")}]` : `${n}?`;
116
+ }).join(", ");
117
+ const inputs = optional.length > 0 ? `[${required}, ${optional}]` : `[${required}]`;
118
+ return `${id} - ${desc} ${inputs}`;
119
+ });
66
120
  process.stdout.write(`${lines.join("\n")}
67
121
  `);
68
122
  return 0;
69
123
  }
70
124
 
125
+ // src/cli/formatters/compact.ts
126
+ function compactRunResult(envelope) {
127
+ if (envelope.ok) {
128
+ return envelope.meta.pagination !== void 0 ? { ok: true, data: envelope.data, pagination: envelope.meta.pagination } : { ok: true, data: envelope.data };
129
+ }
130
+ const err = envelope.error;
131
+ return {
132
+ ok: false,
133
+ error: {
134
+ code: err?.code ?? "UNKNOWN",
135
+ message: err?.message ?? ""
136
+ }
137
+ };
138
+ }
139
+ function compactChainResult(envelope) {
140
+ return {
141
+ status: envelope.status,
142
+ results: envelope.results.map((step) => {
143
+ if (step.ok) {
144
+ return { task: step.task, ok: true };
145
+ }
146
+ return {
147
+ task: step.task,
148
+ ok: false,
149
+ error: {
150
+ code: step.error?.code ?? "UNKNOWN",
151
+ message: step.error?.message ?? ""
152
+ }
153
+ };
154
+ })
155
+ };
156
+ }
157
+
71
158
  // src/cli/commands/run.ts
72
159
  var GITHUB_GRAPHQL_ENDPOINT = "https://api.github.com/graphql";
73
- function parseRunArgs(argv) {
160
+ function parseRunFlags(argv) {
74
161
  const [task, ...rest] = argv;
75
162
  if (!task || task.trim().length === 0) {
76
- throw new Error("Usage: ghx run <task> --input '<json>' [--check-gh-preflight]");
163
+ throw new Error(
164
+ "Usage: ghx run <task> --input '<json>' | --input - [--check-gh-preflight] [--verbose]"
165
+ );
77
166
  }
78
167
  const inputIndex = rest.findIndex((arg) => arg === "--input");
79
168
  const inlineInput = rest.find((arg) => arg.startsWith("--input="));
80
169
  const inputCandidate = inputIndex >= 0 ? rest[inputIndex + 1] : void 0;
170
+ const verbose = rest.includes("--verbose");
171
+ if (inputCandidate === "-") {
172
+ const skipGhPreflight2 = !rest.includes("--check-gh-preflight");
173
+ return { task, inputSource: "stdin", skipGhPreflight: skipGhPreflight2, verbose };
174
+ }
81
175
  const inputRaw = inputCandidate && !inputCandidate.startsWith("--") ? inputCandidate : inlineInput ? inlineInput.slice("--input=".length) : void 0;
82
176
  if (!inputRaw) {
83
177
  throw new Error("Missing --input JSON");
84
178
  }
179
+ const skipGhPreflight = !rest.includes("--check-gh-preflight");
180
+ return { task, inputSource: { raw: inputRaw }, skipGhPreflight, verbose };
181
+ }
182
+ function parseJsonInput(raw) {
85
183
  let parsed;
86
184
  try {
87
- parsed = JSON.parse(inputRaw);
185
+ parsed = JSON.parse(raw);
88
186
  } catch {
89
187
  throw new Error("Invalid JSON for --input");
90
188
  }
91
189
  if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
92
190
  throw new Error("--input must be a JSON object");
93
191
  }
94
- const skipGhPreflight = !rest.includes("--check-gh-preflight");
95
- return { task, input: parsed, skipGhPreflight };
192
+ return parsed;
193
+ }
194
+ function readStdin(timeoutMs = 1e4) {
195
+ return new Promise((resolve, reject) => {
196
+ const parts = [];
197
+ const stream = process.stdin;
198
+ const timer = setTimeout(() => {
199
+ stream.destroy();
200
+ reject(new Error("Timed out reading from stdin"));
201
+ }, timeoutMs);
202
+ stream.setEncoding("utf8");
203
+ stream.on("data", (chunk) => parts.push(chunk));
204
+ stream.on("end", () => {
205
+ clearTimeout(timer);
206
+ resolve(parts.join(""));
207
+ });
208
+ stream.on("error", (err) => {
209
+ clearTimeout(timer);
210
+ reject(err);
211
+ });
212
+ });
96
213
  }
97
214
  function resolveGithubToken() {
98
215
  const token = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;
@@ -128,10 +245,13 @@ async function executeGraphqlRequest(token, query, variables) {
128
245
  }
129
246
  async function runCommand(argv = []) {
130
247
  if (argv.length === 0) {
131
- process.stdout.write("Usage: ghx run <task> --input '<json>' [--check-gh-preflight]\n");
248
+ process.stdout.write(
249
+ "Usage: ghx run <task> --input '<json>' | --input - [--check-gh-preflight]\n"
250
+ );
132
251
  return 1;
133
252
  }
134
- const { task, input, skipGhPreflight } = parseRunArgs(argv);
253
+ const { task, inputSource, skipGhPreflight, verbose } = parseRunFlags(argv);
254
+ const input = inputSource === "stdin" ? parseJsonInput(await readStdin()) : parseJsonInput(inputSource.raw);
135
255
  const githubToken = resolveGithubToken();
136
256
  const githubClient = createGithubClient({
137
257
  async execute(query, variables) {
@@ -147,11 +267,134 @@ async function runCommand(argv = []) {
147
267
  githubToken,
148
268
  skipGhPreflight
149
269
  });
150
- process.stdout.write(`${JSON.stringify(result)}
270
+ const output = verbose ? result : compactRunResult(result);
271
+ process.stdout.write(`${JSON.stringify(output, null, verbose ? 2 : void 0)}
151
272
  `);
152
273
  return 0;
153
274
  }
154
275
 
276
+ // src/cli/commands/chain.ts
277
+ var GITHUB_GRAPHQL_ENDPOINT2 = resolveGraphqlUrl();
278
+ function parseChainFlags(argv) {
279
+ const stepsIndex = argv.findIndex((arg) => arg === "--steps");
280
+ const inlineSteps = argv.find((arg) => arg.startsWith("--steps="));
281
+ const stepsCandidate = stepsIndex >= 0 ? argv[stepsIndex + 1] : void 0;
282
+ const verbose = argv.includes("--verbose");
283
+ if (stepsCandidate === "-") {
284
+ const skipGhPreflight2 = !argv.includes("--check-gh-preflight");
285
+ return { stepsSource: "stdin", skipGhPreflight: skipGhPreflight2, verbose };
286
+ }
287
+ const stepsRaw = stepsCandidate && !stepsCandidate.startsWith("--") ? stepsCandidate : inlineSteps ? inlineSteps.slice("--steps=".length) : void 0;
288
+ if (!stepsRaw) {
289
+ throw new Error("Missing --steps JSON");
290
+ }
291
+ const skipGhPreflight = !argv.includes("--check-gh-preflight");
292
+ return { stepsSource: { raw: stepsRaw }, skipGhPreflight, verbose };
293
+ }
294
+ function parseJsonSteps(raw) {
295
+ let parsed;
296
+ try {
297
+ parsed = JSON.parse(raw);
298
+ } catch {
299
+ throw new Error("Invalid JSON for --steps");
300
+ }
301
+ if (!Array.isArray(parsed)) {
302
+ throw new Error("--steps must be a JSON array");
303
+ }
304
+ for (const item of parsed) {
305
+ if (typeof item !== "object" || item === null || typeof item.task !== "string" || typeof item.input !== "object" || item.input === null) {
306
+ throw new Error('Each step must have "task" (string) and "input" (object) fields');
307
+ }
308
+ }
309
+ return parsed;
310
+ }
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
+ async function fetchGqlPayload(token, query, variables) {
319
+ const response = await fetch(GITHUB_GRAPHQL_ENDPOINT2, {
320
+ method: "POST",
321
+ headers: {
322
+ "content-type": "application/json",
323
+ accept: "application/json",
324
+ authorization: `Bearer ${token}`,
325
+ "user-agent": "ghx"
326
+ },
327
+ body: JSON.stringify({ query, variables: variables ?? {} }),
328
+ signal: AbortSignal.timeout(3e4)
329
+ });
330
+ let payload;
331
+ try {
332
+ payload = await response.json();
333
+ } catch {
334
+ throw new Error(`GitHub GraphQL returned non-JSON response (status ${response.status})`);
335
+ }
336
+ if (!response.ok) {
337
+ const message = payload.message ?? `GitHub GraphQL request failed with status ${response.status}`;
338
+ throw new Error(message);
339
+ }
340
+ return payload;
341
+ }
342
+ async function executeGraphqlRequest2(token, query, variables) {
343
+ const payload = await fetchGqlPayload(token, query, variables);
344
+ if (Array.isArray(payload.errors) && payload.errors.length > 0) {
345
+ const message = payload.errors[0]?.message ?? "GitHub GraphQL returned errors";
346
+ throw new Error(message);
347
+ }
348
+ if (payload.data === void 0) {
349
+ throw new Error("GitHub GraphQL response missing data");
350
+ }
351
+ return payload.data;
352
+ }
353
+ async function executeRawGraphqlRequest(token, query, variables) {
354
+ const payload = await fetchGqlPayload(token, query, variables);
355
+ return {
356
+ data: payload.data,
357
+ errors: payload.errors?.length ? payload.errors : void 0
358
+ };
359
+ }
360
+ async function chainCommand(argv = []) {
361
+ if (argv.length === 0) {
362
+ process.stdout.write(
363
+ "Usage: ghx chain --steps '<json-array>' | --steps - [--check-gh-preflight] [--verbose]\n"
364
+ );
365
+ return 1;
366
+ }
367
+ try {
368
+ const { stepsSource, skipGhPreflight, verbose } = parseChainFlags(argv);
369
+ const steps = stepsSource === "stdin" ? parseJsonSteps(await readStdin()) : parseJsonSteps(stepsSource.raw);
370
+ const githubToken = resolveGithubToken2();
371
+ const githubClient = createGithubClient({
372
+ async execute(query, variables) {
373
+ return executeGraphqlRequest2(githubToken, query, variables);
374
+ },
375
+ async executeRaw(query, variables) {
376
+ return executeRawGraphqlRequest(githubToken, query, variables);
377
+ }
378
+ });
379
+ const resolutionCache = createResolutionCache();
380
+ const result = await executeTasks(steps, {
381
+ githubClient,
382
+ githubToken,
383
+ skipGhPreflight,
384
+ resolutionCache
385
+ });
386
+ const output = verbose ? result : compactChainResult(result);
387
+ process.stdout.write(`${JSON.stringify(output, null, verbose ? 2 : void 0)}
388
+ `);
389
+ return result.status === "success" || result.status === "partial" ? 0 : 1;
390
+ } catch (err) {
391
+ const message = err instanceof Error ? err.message : String(err);
392
+ process.stderr.write(`${message}
393
+ `);
394
+ return 1;
395
+ }
396
+ }
397
+
155
398
  // src/cli/commands/setup.ts
156
399
  import { access, appendFile, mkdir, readFile, writeFile } from "fs/promises";
157
400
  import { homedir } from "os";
@@ -178,9 +421,8 @@ var setupOptionsSchema = {
178
421
  var validateSetupOptions = ajv.compile(setupOptionsSchema);
179
422
  var setupCommandDirectory = dirname(fileURLToPath(import.meta.url));
180
423
  var setupSkillAssetPathCandidates = [
181
- join(setupCommandDirectory, "..", "assets", "skills", "ghx", "SKILL.md"),
182
- join(setupCommandDirectory, "assets", "skills", "ghx", "SKILL.md"),
183
- join(setupCommandDirectory, "cli", "assets", "skills", "ghx", "SKILL.md")
424
+ join(setupCommandDirectory, "..", "..", "..", "skills", "using-ghx", "SKILL.md"),
425
+ join(setupCommandDirectory, "..", "..", "skills", "using-ghx", "SKILL.md")
184
426
  ];
185
427
  function isENOENT(error) {
186
428
  return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
@@ -376,7 +618,8 @@ async function setupCommand(argv = []) {
376
618
  function usage3() {
377
619
  return [
378
620
  "Usage:",
379
- " ghx run <task> --input '<json>' [--check-gh-preflight]",
621
+ " ghx run <task> --input '<json>' | --input - [--check-gh-preflight]",
622
+ " ghx chain --steps '<json-array>' | --steps - [--check-gh-preflight]",
380
623
  " ghx setup --scope <user|project> [--yes] [--dry-run] [--verify] [--track]",
381
624
  " ghx capabilities list",
382
625
  " ghx capabilities explain <capability_id>"
@@ -392,6 +635,9 @@ async function main(argv = process.argv.slice(2)) {
392
635
  if (command === "run") {
393
636
  return runCommand(rest);
394
637
  }
638
+ if (command === "chain") {
639
+ return chainCommand(rest);
640
+ }
395
641
  if (command === "setup") {
396
642
  return setupCommand(rest);
397
643
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/capabilities-explain.ts","../../src/cli/commands/capabilities-list.ts","../../src/cli/commands/run.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 { 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>' [--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 === \"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 \"../../agent-interface/tools/explain-tool.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 { listCapabilities } from \"../../agent-interface/tools/list-capabilities-tool.js\"\n\nfunction parseArgs(argv: string[]): { asJson: boolean } {\n return {\n asJson: argv.includes(\"--json\"),\n }\n}\n\nexport async function capabilitiesListCommand(argv: string[] = []): Promise<number> {\n const { asJson } = parseArgs(argv)\n const capabilities = listCapabilities()\n\n if (asJson) {\n process.stdout.write(`${JSON.stringify(capabilities)}\\n`)\n return 0\n }\n\n const lines = capabilities.map((item) => `${item.capability_id} - ${item.description}`)\n process.stdout.write(`${lines.join(\"\\n\")}\\n`)\n return 0\n}\n","import type { TaskRequest } from \"../../core/contracts/task.js\"\nimport { executeTask } from \"../../core/routing/engine.js\"\nimport { createGithubClient } from \"../../gql/client.js\"\n\nconst GITHUB_GRAPHQL_ENDPOINT = \"https://api.github.com/graphql\"\n\nfunction parseRunArgs(argv: string[]): {\n task: string\n input: Record<string, unknown>\n skipGhPreflight: boolean\n} {\n const [task, ...rest] = argv\n if (!task || task.trim().length === 0) {\n throw new Error(\"Usage: ghx run <task> --input '<json>' [--check-gh-preflight]\")\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 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 let parsed: unknown\n try {\n parsed = JSON.parse(inputRaw)\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 const skipGhPreflight = !rest.includes(\"--check-gh-preflight\")\n\n return { task, input: parsed as Record<string, unknown>, skipGhPreflight }\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(\"Usage: ghx run <task> --input '<json>' [--check-gh-preflight]\\n\")\n return 1\n }\n\n const { task, input, skipGhPreflight } = parseRunArgs(argv)\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 process.stdout.write(`${JSON.stringify(result)}\\n`)\n return 0\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\"\n\nimport { Ajv } from \"ajv\"\nimport type { ErrorCode } from \"../../core/errors/codes.js\"\nimport { errorCodes } from \"../../core/errors/codes.js\"\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, \"..\", \"assets\", \"skills\", \"ghx\", \"SKILL.md\"),\n join(setupCommandDirectory, \"assets\", \"skills\", \"ghx\", \"SKILL.md\"),\n join(setupCommandDirectory, \"cli\", \"assets\", \"skills\", \"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","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 }\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 { 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"]}
@@ -0,0 +1,51 @@
1
+ capability_id: issue.assignees.add
2
+ version: "1.0.0"
3
+ description: Add assignees to an issue without replacing existing ones.
4
+ input_schema:
5
+ type: object
6
+ required: [owner, name, issueNumber, assignees]
7
+ properties:
8
+ owner: { type: string, minLength: 1 }
9
+ name: { type: string, minLength: 1 }
10
+ issueNumber: { type: integer, minimum: 1 }
11
+ assignees:
12
+ type: array
13
+ items: { type: string, minLength: 1 }
14
+ minItems: 1
15
+ additionalProperties: false
16
+ output_schema:
17
+ type: object
18
+ required: [issueNumber, added]
19
+ properties:
20
+ issueNumber: { type: integer, minimum: 1 }
21
+ added:
22
+ type: array
23
+ items: { type: string }
24
+ additionalProperties: false
25
+ routing:
26
+ preferred: graphql
27
+ fallbacks: [cli]
28
+ graphql:
29
+ operationName: IssueAssigneesAdd
30
+ operationType: mutation
31
+ documentPath: src/gql/operations/issue-assignees-add.graphql
32
+ resolution:
33
+ lookup:
34
+ operationName: IssueAssigneesLookupByNumber
35
+ documentPath: src/gql/operations/issue-assignees-lookup-by-number.graphql
36
+ vars:
37
+ owner: owner
38
+ name: name
39
+ issueNumber: issueNumber
40
+ inject:
41
+ - target: assignableId
42
+ source: scalar
43
+ path: repository.issue.id
44
+ - target: assigneeIds
45
+ source: map_array
46
+ from_input: assignees
47
+ nodes_path: repository.assignableUsers.nodes
48
+ match_field: login
49
+ extract_field: id
50
+ cli:
51
+ command: issue edit