@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.
- package/.claude-plugin/plugin.json +21 -0
- package/README.md +49 -45
- package/dist/cards/issue.assignees.add.yaml +51 -0
- package/dist/cards/issue.assignees.remove.yaml +51 -0
- package/dist/cards/issue.assignees.set.yaml +48 -0
- package/dist/cards/issue.close.yaml +17 -2
- package/dist/cards/issue.comments.create.yaml +17 -2
- package/dist/cards/issue.comments.list.yaml +1 -0
- package/dist/cards/issue.create.yaml +12 -0
- package/dist/cards/issue.delete.yaml +17 -2
- package/dist/cards/issue.labels.add.yaml +49 -0
- package/dist/cards/issue.labels.remove.yaml +51 -0
- package/dist/cards/issue.labels.set.yaml +48 -0
- package/dist/cards/issue.list.yaml +1 -0
- package/dist/cards/issue.milestone.clear.yaml +41 -0
- package/dist/cards/issue.milestone.set.yaml +24 -4
- package/dist/{core/registry/cards/issue.blocked_by.add.yaml → cards/issue.relations.blocked_by.add.yaml} +4 -2
- package/dist/cards/{issue.blocked_by.remove.yaml → issue.relations.blocked_by.remove.yaml} +2 -1
- package/dist/cards/{issue.parent.remove.yaml → issue.relations.parent.remove.yaml} +12 -1
- package/dist/{core/registry/cards/issue.parent.set.yaml → cards/issue.relations.parent.set.yaml} +4 -2
- package/dist/{core/registry/cards/issue.linked_prs.list.yaml → cards/issue.relations.prs.list.yaml} +2 -1
- package/dist/cards/{issue.relations.get.yaml → issue.relations.view.yaml} +2 -1
- package/dist/cards/issue.reopen.yaml +17 -2
- package/dist/cards/issue.update.yaml +17 -2
- package/dist/cards/issue.view.yaml +8 -5
- package/dist/cards/pr.assignees.add.yaml +33 -0
- package/dist/cards/pr.assignees.remove.yaml +33 -0
- package/dist/cards/pr.branch.update.yaml +6 -2
- package/dist/{core/registry/cards/pr.status.checks.yaml → cards/pr.checks.list.yaml} +15 -2
- package/dist/{core/registry/cards/pr.checks.rerun_all.yaml → cards/pr.checks.rerun.all.yaml} +2 -4
- package/dist/{core/registry/cards/pr.checks.rerun_failed.yaml → cards/pr.checks.rerun.failed.yaml} +3 -5
- package/dist/cards/pr.create.yaml +34 -0
- package/dist/cards/{pr.diff.list_files.yaml → pr.diff.files.yaml} +2 -1
- package/dist/cards/{pr.ready_for_review.set.yaml → pr.diff.view.yaml} +6 -8
- package/dist/cards/pr.list.yaml +1 -0
- package/dist/{core/registry/cards/pr.mergeability.view.yaml → cards/pr.merge.status.yaml} +7 -3
- package/dist/{core/registry/cards/pr.merge.execute.yaml → cards/pr.merge.yaml} +10 -4
- package/dist/cards/pr.reviews.list.yaml +2 -1
- package/dist/cards/{pr.reviewers.request.yaml → pr.reviews.request.yaml} +7 -4
- package/dist/cards/pr.reviews.submit.yaml +68 -0
- package/dist/cards/{pr.comments.list.yaml → pr.threads.list.yaml} +3 -2
- package/dist/cards/{pr.comment.reply.yaml → pr.threads.reply.yaml} +5 -2
- package/dist/{core/registry/cards/pr.comment.resolve.yaml → cards/pr.threads.resolve.yaml} +2 -1
- package/dist/cards/{pr.comment.unresolve.yaml → pr.threads.unresolve.yaml} +2 -1
- package/dist/cards/pr.update.yaml +34 -0
- package/dist/cards/pr.view.yaml +8 -5
- package/dist/cards/project_v2.fields.list.yaml +18 -2
- package/dist/cards/{project_v2.item.field.update.yaml → project_v2.items.field.update.yaml} +9 -6
- package/dist/cards/{project_v2.item.add_issue.yaml → project_v2.items.issue.add.yaml} +10 -6
- package/dist/cards/project_v2.items.issue.remove.yaml +26 -0
- package/dist/cards/project_v2.items.list.yaml +8 -2
- package/dist/{core/registry/cards/project_v2.org.get.yaml → cards/project_v2.org.view.yaml} +7 -3
- package/dist/cards/{project_v2.user.get.yaml → project_v2.user.view.yaml} +7 -3
- package/dist/{core/registry/cards/release.create_draft.yaml → cards/release.create.yaml} +1 -1
- package/dist/cards/release.list.yaml +8 -3
- package/dist/cards/{release.publish_draft.yaml → release.publish.yaml} +1 -1
- package/dist/cards/{release.get.yaml → release.view.yaml} +9 -5
- package/dist/cards/repo.issue_types.list.yaml +7 -3
- package/dist/cards/repo.labels.list.yaml +7 -2
- package/dist/cards/repo.view.yaml +3 -4
- package/dist/cards/{workflow_dispatch.run.yaml → workflow.dispatch.yaml} +1 -1
- package/dist/cards/{workflow_job.logs.get.yaml → workflow.job.logs.raw.yaml} +2 -2
- package/dist/{core/registry/cards/workflow_job.logs.analyze.yaml → cards/workflow.job.logs.view.yaml} +1 -1
- package/dist/{core/registry/cards/workflow_run.artifacts.list.yaml → cards/workflow.run.artifacts.list.yaml} +1 -1
- package/dist/cards/{workflow_run.cancel.yaml → workflow.run.cancel.yaml} +1 -1
- package/dist/cards/{workflow_run.rerun_all.yaml → workflow.run.rerun.all.yaml} +3 -3
- package/dist/{core/registry/cards/workflow_run.rerun_failed.yaml → cards/workflow.run.rerun.failed.yaml} +3 -3
- package/dist/{core/registry/cards/workflow_run.get.yaml → cards/workflow.run.view.yaml} +19 -4
- package/dist/cards/{workflow_runs.list.yaml → workflow.runs.list.yaml} +1 -1
- package/dist/cards/{workflow.get.yaml → workflow.view.yaml} +2 -2
- package/dist/chunk-3DU2WHXF.js +15 -0
- package/dist/chunk-3DU2WHXF.js.map +1 -0
- package/dist/chunk-7HUKYNI2.js +536 -0
- package/dist/chunk-7HUKYNI2.js.map +1 -0
- package/dist/chunk-GQO6BHJV.js +98 -0
- package/dist/chunk-GQO6BHJV.js.map +1 -0
- package/dist/chunk-H7CLZHRO.js +280 -0
- package/dist/chunk-H7CLZHRO.js.map +1 -0
- package/dist/chunk-HEHONZTO.js +121 -0
- package/dist/chunk-HEHONZTO.js.map +1 -0
- package/dist/chunk-M5PJLKL5.js +6132 -0
- package/dist/chunk-M5PJLKL5.js.map +1 -0
- package/dist/chunk-NQ53ETYV.js +128 -0
- package/dist/chunk-NQ53ETYV.js.map +1 -0
- package/dist/chunk-OQWLEFAH.js +436 -0
- package/dist/chunk-OQWLEFAH.js.map +1 -0
- package/dist/chunk-Q2NW7DJE.js +878 -0
- package/dist/chunk-Q2NW7DJE.js.map +1 -0
- package/dist/chunk-QRHKAMRY.js +211 -0
- package/dist/chunk-QRHKAMRY.js.map +1 -0
- package/dist/chunk-R3CBGJZX.js +12 -0
- package/dist/chunk-R3CBGJZX.js.map +1 -0
- package/dist/chunk-TGL33GEA.js +132 -0
- package/dist/chunk-TGL33GEA.js.map +1 -0
- package/dist/chunk-TPQYVCAS.js +15 -0
- package/dist/chunk-TPQYVCAS.js.map +1 -0
- package/dist/chunk-ZGBVX2VG.js +32 -0
- package/dist/chunk-ZGBVX2VG.js.map +1 -0
- package/dist/cli/index.js +268 -22
- package/dist/cli/index.js.map +1 -1
- package/dist/core/registry/cards/issue.assignees.add.yaml +51 -0
- package/dist/core/registry/cards/issue.assignees.remove.yaml +51 -0
- package/dist/core/registry/cards/issue.assignees.set.yaml +48 -0
- package/dist/core/registry/cards/issue.close.yaml +17 -2
- package/dist/core/registry/cards/issue.comments.create.yaml +17 -2
- package/dist/core/registry/cards/issue.comments.list.yaml +1 -0
- package/dist/core/registry/cards/issue.create.yaml +12 -0
- package/dist/core/registry/cards/issue.delete.yaml +17 -2
- package/dist/core/registry/cards/issue.labels.add.yaml +49 -0
- package/dist/core/registry/cards/issue.labels.remove.yaml +51 -0
- package/dist/core/registry/cards/issue.labels.set.yaml +48 -0
- package/dist/core/registry/cards/issue.list.yaml +1 -0
- package/dist/core/registry/cards/issue.milestone.clear.yaml +41 -0
- package/dist/core/registry/cards/issue.milestone.set.yaml +24 -4
- package/dist/{cards/issue.blocked_by.add.yaml → core/registry/cards/issue.relations.blocked_by.add.yaml} +4 -2
- package/dist/core/registry/cards/{issue.blocked_by.remove.yaml → issue.relations.blocked_by.remove.yaml} +2 -1
- package/dist/core/registry/cards/{issue.parent.remove.yaml → issue.relations.parent.remove.yaml} +12 -1
- package/dist/{cards/issue.parent.set.yaml → core/registry/cards/issue.relations.parent.set.yaml} +4 -2
- package/dist/{cards/issue.linked_prs.list.yaml → core/registry/cards/issue.relations.prs.list.yaml} +2 -1
- package/dist/core/registry/cards/{issue.relations.get.yaml → issue.relations.view.yaml} +2 -1
- package/dist/core/registry/cards/issue.reopen.yaml +17 -2
- package/dist/core/registry/cards/issue.update.yaml +17 -2
- package/dist/core/registry/cards/issue.view.yaml +8 -5
- package/dist/core/registry/cards/pr.assignees.add.yaml +33 -0
- package/dist/core/registry/cards/pr.assignees.remove.yaml +33 -0
- package/dist/core/registry/cards/pr.branch.update.yaml +6 -2
- package/dist/{cards/pr.status.checks.yaml → core/registry/cards/pr.checks.list.yaml} +15 -2
- package/dist/{cards/pr.checks.rerun_all.yaml → core/registry/cards/pr.checks.rerun.all.yaml} +2 -4
- package/dist/{cards/pr.checks.rerun_failed.yaml → core/registry/cards/pr.checks.rerun.failed.yaml} +3 -5
- package/dist/core/registry/cards/pr.create.yaml +34 -0
- package/dist/core/registry/cards/{pr.diff.list_files.yaml → pr.diff.files.yaml} +2 -1
- package/dist/core/registry/cards/{pr.ready_for_review.set.yaml → pr.diff.view.yaml} +6 -8
- package/dist/core/registry/cards/pr.list.yaml +1 -0
- package/dist/{cards/pr.mergeability.view.yaml → core/registry/cards/pr.merge.status.yaml} +7 -3
- package/dist/{cards/pr.merge.execute.yaml → core/registry/cards/pr.merge.yaml} +10 -4
- package/dist/core/registry/cards/pr.reviews.list.yaml +2 -1
- package/dist/core/registry/cards/{pr.reviewers.request.yaml → pr.reviews.request.yaml} +7 -4
- package/dist/core/registry/cards/pr.reviews.submit.yaml +68 -0
- package/dist/core/registry/cards/{pr.comments.list.yaml → pr.threads.list.yaml} +3 -2
- package/dist/core/registry/cards/{pr.comment.reply.yaml → pr.threads.reply.yaml} +5 -2
- package/dist/{cards/pr.comment.resolve.yaml → core/registry/cards/pr.threads.resolve.yaml} +2 -1
- package/dist/core/registry/cards/{pr.comment.unresolve.yaml → pr.threads.unresolve.yaml} +2 -1
- package/dist/core/registry/cards/pr.update.yaml +34 -0
- package/dist/core/registry/cards/pr.view.yaml +8 -5
- package/dist/core/registry/cards/project_v2.fields.list.yaml +18 -2
- package/dist/core/registry/cards/{project_v2.item.field.update.yaml → project_v2.items.field.update.yaml} +9 -6
- package/dist/core/registry/cards/{project_v2.item.add_issue.yaml → project_v2.items.issue.add.yaml} +10 -6
- package/dist/core/registry/cards/project_v2.items.issue.remove.yaml +26 -0
- package/dist/core/registry/cards/project_v2.items.list.yaml +8 -2
- package/dist/{cards/project_v2.org.get.yaml → core/registry/cards/project_v2.org.view.yaml} +7 -3
- package/dist/core/registry/cards/{project_v2.user.get.yaml → project_v2.user.view.yaml} +7 -3
- package/dist/{cards/release.create_draft.yaml → core/registry/cards/release.create.yaml} +1 -1
- package/dist/core/registry/cards/release.list.yaml +8 -3
- package/dist/core/registry/cards/{release.publish_draft.yaml → release.publish.yaml} +1 -1
- package/dist/core/registry/cards/{release.get.yaml → release.view.yaml} +9 -5
- package/dist/core/registry/cards/repo.issue_types.list.yaml +7 -3
- package/dist/core/registry/cards/repo.labels.list.yaml +7 -2
- package/dist/core/registry/cards/repo.view.yaml +3 -4
- package/dist/core/registry/cards/{workflow_dispatch.run.yaml → workflow.dispatch.yaml} +1 -1
- package/dist/core/registry/cards/{workflow_job.logs.get.yaml → workflow.job.logs.raw.yaml} +2 -2
- package/dist/{cards/workflow_job.logs.analyze.yaml → core/registry/cards/workflow.job.logs.view.yaml} +1 -1
- package/dist/{cards/workflow_run.artifacts.list.yaml → core/registry/cards/workflow.run.artifacts.list.yaml} +1 -1
- package/dist/core/registry/cards/{workflow_run.cancel.yaml → workflow.run.cancel.yaml} +1 -1
- package/dist/core/registry/cards/{workflow_run.rerun_all.yaml → workflow.run.rerun.all.yaml} +3 -3
- package/dist/{cards/workflow_run.rerun_failed.yaml → core/registry/cards/workflow.run.rerun.failed.yaml} +3 -3
- package/dist/{cards/workflow_run.get.yaml → core/registry/cards/workflow.run.view.yaml} +19 -4
- package/dist/core/registry/cards/{workflow_runs.list.yaml → workflow.runs.list.yaml} +1 -1
- package/dist/core/registry/cards/{workflow.get.yaml → workflow.view.yaml} +2 -2
- package/dist/index.d.ts +671 -35
- package/dist/index.js +41 -5
- package/dist/index.js.map +1 -1
- package/dist/issue-mutations-OW464JP3.js +645 -0
- package/dist/issue-mutations-OW464JP3.js.map +1 -0
- package/dist/issue-queries-ORG3VPK4.js +93 -0
- package/dist/issue-queries-ORG3VPK4.js.map +1 -0
- package/dist/pr-mutations-WOTG6FAB.js +484 -0
- package/dist/pr-mutations-WOTG6FAB.js.map +1 -0
- package/dist/pr-queries-6CJJW7BT.js +143 -0
- package/dist/pr-queries-6CJJW7BT.js.map +1 -0
- package/dist/project-QFSCYDDW.js +429 -0
- package/dist/project-QFSCYDDW.js.map +1 -0
- package/dist/release-33236BBA.js +57 -0
- package/dist/release-33236BBA.js.map +1 -0
- package/dist/repo-M6DKCWBG.js +82 -0
- package/dist/repo-M6DKCWBG.js.map +1 -0
- package/package.json +19 -16
- package/skills/using-ghx/SKILL.md +127 -0
- package/dist/agent.d.ts +0 -32
- package/dist/agent.js +0 -36
- package/dist/agent.js.map +0 -1
- package/dist/cards/check_run.annotations.list.yaml +0 -35
- package/dist/cards/issue.assignees.update.yaml +0 -27
- package/dist/cards/issue.labels.update.yaml +0 -27
- package/dist/cards/pr.assignees.update.yaml +0 -38
- package/dist/cards/pr.checks.get_failed.yaml +0 -42
- package/dist/cards/pr.review.submit_approve.yaml +0 -26
- package/dist/cards/pr.review.submit_comment.yaml +0 -26
- package/dist/cards/pr.review.submit_request_changes.yaml +0 -26
- package/dist/cards/workflow_run.jobs.list.yaml +0 -35
- package/dist/chunk-2FCPR3XZ.js +0 -54
- package/dist/chunk-2FCPR3XZ.js.map +0 -1
- package/dist/chunk-RDUPMVHG.js +0 -4139
- package/dist/chunk-RDUPMVHG.js.map +0 -1
- package/dist/chunk-UN5YHUNK.js +0 -245
- package/dist/chunk-UN5YHUNK.js.map +0 -1
- package/dist/cli/assets/skills/ghx/SKILL.md +0 -57
- package/dist/core/registry/cards/check_run.annotations.list.yaml +0 -35
- package/dist/core/registry/cards/issue.assignees.update.yaml +0 -27
- package/dist/core/registry/cards/issue.labels.update.yaml +0 -27
- package/dist/core/registry/cards/pr.assignees.update.yaml +0 -38
- package/dist/core/registry/cards/pr.checks.get_failed.yaml +0 -42
- package/dist/core/registry/cards/pr.review.submit_approve.yaml +0 -26
- package/dist/core/registry/cards/pr.review.submit_comment.yaml +0 -26
- package/dist/core/registry/cards/pr.review.submit_request_changes.yaml +0 -26
- package/dist/core/registry/cards/workflow_run.jobs.list.yaml +0 -35
- 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-
|
|
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
|
-
|
|
8
|
-
|
|
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
|
|
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
|
|
160
|
+
function parseRunFlags(argv) {
|
|
74
161
|
const [task, ...rest] = argv;
|
|
75
162
|
if (!task || task.trim().length === 0) {
|
|
76
|
-
throw new Error(
|
|
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(
|
|
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
|
-
|
|
95
|
-
|
|
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(
|
|
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,
|
|
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
|
-
|
|
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, "..", "
|
|
182
|
-
join(setupCommandDirectory, "
|
|
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
|
}
|
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/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
|