@theholocron/holocron-plugin-github 5.0.0-alpha.35 → 5.0.0-alpha.350

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/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # `@theholocron/holocron-plugin-github`
2
2
 
3
- GitHub plugin for [Holocron](../cli). Implements five capabilities
4
- against the GitHub REST API:
3
+ GitHub plugin for [Holocron](../cli). Implements six capabilities
4
+ against the GitHub REST and GraphQL APIs:
5
5
 
6
6
  | Capability | What this plugin does |
7
7
  | -------------- | ---------------------------------------------------------------- |
@@ -10,6 +10,7 @@ against the GitHub REST API:
10
10
  | `secrets` | GH Actions secrets (repo + environment + organization) |
11
11
  | `environments` | Named deployment environments (reviewers, wait timers) |
12
12
  | `issues` | GitHub Issues as a tracker (with lifecycle slots) |
13
+ | `projects` | GitHub Projects v2 boards (GraphQL) |
13
14
 
14
15
  ## Install
15
16
 
@@ -34,6 +35,7 @@ Each capability resolves its own fine-grained token so a compromised credential
34
35
  | `HOLOCRON_SYNC_TOKEN` | `github.sync` | `sync-github` command |
35
36
  | `HOLOCRON_RELEASE_TOKEN` | `github.release` | semantic-release, GitHub releases |
36
37
  | `HOLOCRON_ADMIN_TOKEN` | `github.admin` | `source`, `secrets`, `environments` |
38
+ | `HOLOCRON_ORG_TOKEN` | `github.org` | `projects` |
37
39
 
38
40
  Store tokens once via the keyring so they are picked up automatically:
39
41
 
@@ -45,7 +47,7 @@ holocron auth set github.release ghp_xxx # semantic-release
45
47
  holocron auth set github.admin ghp_xxx # setup, secrets, environments
46
48
  ```
47
49
 
48
- See [docs/tokens.md](../../docs/tokens.md) for full scope requirements and CI setup.
50
+ See the [token reference](https://docs.theholocron.dev/holocron/tokens/) for full scope requirements and CI setup.
49
51
 
50
52
  ## Config
51
53
 
@@ -64,6 +66,29 @@ See [docs/tokens.md](../../docs/tokens.md) for full scope requirements and CI se
64
66
 
65
67
  ```
66
68
 
69
+ ## `projects` capability
70
+
71
+ GitHub Projects v2 boards over GraphQL, for `holocron project ...` (SPEC-0020, #1744). It uses the org token
72
+ (`HOLOCRON_ORG_TOKEN`, keyring `github.org`) with the **Projects** organization permission. Items are keyed `#N` in the
73
+ configured `repo` and `owner/repo#N` elsewhere.
74
+
75
+ | Method | What it does |
76
+ | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
77
+ | `list` | Every project of the organization, open and closed. `find` is the exact name among the open ones. |
78
+ | `create` | Copies the board `template.source` names (fields, options, views, automation rules, no items), or creates a project and applies the template. |
79
+ | `close` | `updateProjectV2` with `closed: true`. Reversible. |
80
+ | `read` | Statuses, other fields, board and table views and automation rules. |
81
+ | `ensure` | Adds what the template lists and the board lacks (options, fields, views, filters). Never deletes. Rules and view grouping the API cannot set come back as `todos`. |
82
+ | `items` | Each issue or pull request with its status, category, whether it is open and its open blockers. |
83
+ | `setStatus` | Sets an item's status. Idempotent: `transitioned: false` when it is already there. |
84
+ | `move` | Puts open items on another board with status and priority (only where the target has none); closed and merged ones stay and are set to done when theirs is not a done one. |
85
+ | `whoami` | How many boards the token sees, for `holocron doctor`. |
86
+
87
+ `ensure` is safe on a field that has items. `updateProjectV2Field` replaces a single select field's whole option list,
88
+ and an option sent without its `id` blanks the field on every item, so `ensure` reads the field first, sends every
89
+ existing option with its `id` in the template's order (new ones without), and stops when the field cannot be read. It
90
+ also keeps the item values in memory and, if a re-read shows any gone, writes them back by option name and fails.
91
+
67
92
  ## Status
68
93
 
69
94
  **`v2.0.0-alpha.0`** — published on npm under the `alpha` dist-tag.
package/dist/index.d.mts CHANGED
@@ -1,47 +1,65 @@
1
- import { GitHubClient, GitHubClientOptions, createGitHubClient } from "@theholocron/github-client";
2
- import { Auth, AuthError, Ci, CiRun, CiRunFilter, Environment, Environments, Issue, IssueSearchFilter, Issues, LabelDef, LifecycleResult, LifecycleSlot, PagesConfig, PullRequest, RepoRef, RepoSettings, ResolveTokenInput, Ruleset, SecretScope, Secrets, Source, TeamEntry, TeamEntry as TeamEntry$1, TeamPermission, TrackerDoctorReport, TrackerUser, createFeatureResolver } from "@theholocron/cli";
3
- //#region src/auth.d.ts
4
- declare const resolveReadToken: (input?: ResolveTokenInput) => string;
5
- declare const resolveIssuesToken: (input?: ResolveTokenInput) => string;
6
- declare const resolveSyncToken: (input?: ResolveTokenInput) => string;
7
- declare const resolveReleaseToken: (input?: ResolveTokenInput) => string;
8
- declare const resolveAdminToken: (input?: ResolveTokenInput) => string;
9
- declare const resolveDeployToken: (input?: ResolveTokenInput) => string;
10
- declare const resolveOrgToken: (input?: ResolveTokenInput) => string;
11
- //#endregion
12
- //#region src/capabilities/ci.d.ts
1
+ import { Auth, AuthError, BoardItem, BoardState, BoardSummary, BoardTemplate, Ci, CiRun, CiRunFilter, EnsureReport, Environment, Environments, Issue, IssueSearchFilter, Issues, LabelDef, LifecycleResult, LifecycleSlot, MoveReport, PagesConfig, PluginToken, Projects, PullRequest, RepoRef, RepoSettings, ResolveTokenInput, Ruleset, SecretScope, Secrets, Source, SourceBranch, SourceFile, SourceRepoInfo, SourceRulesetDetail, SourceSecurity, SourceTeamMember, TeamEntry, TeamEntry as TeamEntry$1, TeamPermission, TeamPermission as TeamPermission$1, TrackerDoctorReport, TrackerUser, VerifyTokenFailure, VerifyTokenResult, VerifyTokenResult as VerifyTokenResult$1, VerifyTokenSuccess, createFeatureResolver } from "@theholocron/cli";
2
+ import { GitHubClient, GitHubClientOptions, GraphQLClient, createGitHubClient } from "@theholocron/github-client";
3
+ /** Resolves the token for read-only GitHub access (`HOLOCRON_READ_TOKEN`, keyring key `github.read`). */
4
+ export declare const resolveReadToken: import("@theholocron/cli").FeatureResolver;
5
+ /** Resolves the token for issue operations (`HOLOCRON_ISSUES_TOKEN`, keyring key `github.issues`). */
6
+ export declare const resolveIssuesToken: import("@theholocron/cli").FeatureResolver;
7
+ /** Resolves the token for syncing repo files and settings (`HOLOCRON_SYNC_TOKEN`, keyring key `github.sync`). */
8
+ export declare const resolveSyncToken: import("@theholocron/cli").FeatureResolver;
9
+ /** Resolves the token for release operations (`HOLOCRON_RELEASE_TOKEN`, keyring key `github.release`). */
10
+ export declare const resolveReleaseToken: import("@theholocron/cli").FeatureResolver;
11
+ /** Resolves the repo-scoped admin token (`HOLOCRON_ADMIN_TOKEN`, keyring key `github.admin`). */
12
+ export declare const resolveAdminToken: import("@theholocron/cli").FeatureResolver;
13
+ /** Resolves the org-level secrets token (`HOLOCRON_SECRETS_TOKEN`, keyring key `github.secrets`). */
14
+ export declare const resolveSecretsToken: import("@theholocron/cli").FeatureResolver;
15
+ /** Resolves the token for deployment operations (`HOLOCRON_DEPLOY_TOKEN`, keyring key `github.deploy`). */
16
+ export declare const resolveDeployToken: import("@theholocron/cli").FeatureResolver;
17
+ /**
18
+ * Resolves the token for the user-sync files in the org's private config repo (`HOLOCRON_USER_SYNC_TOKEN`, keyring
19
+ * key `github.user-sync`).
20
+ */
21
+ export declare const resolveUserSyncToken: import("@theholocron/cli").FeatureResolver;
22
+ /** Resolves the org-level token (`HOLOCRON_ORG_TOKEN`, keyring key `github.org`). */
23
+ export declare const resolveOrgToken: import("@theholocron/cli").FeatureResolver;
13
24
  interface CiOptions {
14
25
  repo: string;
15
26
  }
16
- declare class GitHubCi implements Ci {
27
+ /** The GitHub implementation of the `ci` capability, backed by GitHub Actions workflow runs. */
28
+ export declare class GitHubCi implements Ci {
17
29
  private readonly client;
18
30
  private readonly opts;
31
+ /** Capability key, always `"ci"`. */
19
32
  readonly key: "ci";
33
+ /** Provider name, always `"github"`. */
20
34
  readonly providerName = "github";
21
35
  constructor(client: GitHubClient, opts: CiOptions);
36
+ /** Lists workflow runs for the repo, optionally filtered by branch, status and limit. */
22
37
  listRuns(filter?: CiRunFilter): Promise<CiRun[]>;
38
+ /** Fetches one workflow run by id. */
23
39
  getRun(id: string | number): Promise<CiRun>;
24
40
  private mapRun;
25
41
  private mapConclusion;
26
42
  }
27
- //#endregion
28
- //#region src/capabilities/environments.d.ts
29
43
  interface EnvironmentsOptions {
30
44
  repo: string;
31
45
  }
32
- declare class GitHubEnvironments implements Environments {
46
+ /** The GitHub implementation of the `environments` capability, managing a repo's deployment environments. */
47
+ export declare class GitHubEnvironments implements Environments {
33
48
  private readonly client;
34
49
  private readonly opts;
50
+ /** Capability key, always `"environments"`. */
35
51
  readonly key: "environments";
52
+ /** Provider name, always `"github"`. */
36
53
  readonly providerName = "github";
37
54
  constructor(client: GitHubClient, opts: EnvironmentsOptions);
55
+ /** Lists the repo's environments with their wait timer, self-review rule and required reviewers. */
38
56
  listEnvironments(): Promise<Environment[]>;
57
+ /** Creates or updates an environment, sending only the settings the given environment defines. */
39
58
  upsertEnvironment(env: Environment): Promise<void>;
59
+ /** Deletes the named environment. */
40
60
  deleteEnvironment(name: string): Promise<void>;
41
61
  private flattenReviewers;
42
62
  }
43
- //#endregion
44
- //#region src/capabilities/issues.d.ts
45
63
  interface IssuesOptions {
46
64
  repo: string;
47
65
  /**
@@ -55,9 +73,12 @@ interface IssuesOptions {
55
73
  inReview: string;
56
74
  };
57
75
  }
58
- declare class GitHubIssues implements Issues {
76
+ /** The GitHub implementation of the `issues` capability, backed by GitHub Issues and status labels. */
77
+ export declare class GitHubIssues implements Issues {
59
78
  private readonly client;
79
+ /** Capability key, always `"issues"`. */
60
80
  readonly key: "issues";
81
+ /** Provider name, always `"github"`. */
61
82
  readonly providerName = "github";
62
83
  private readonly owner;
63
84
  private readonly repoName;
@@ -65,8 +86,11 @@ declare class GitHubIssues implements Issues {
65
86
  private readonly labels;
66
87
  constructor(client: GitHubClient, opts: IssuesOptions);
67
88
  getMyself(): Promise<TrackerUser>;
89
+ /** Searches the repo's issues, newest update first, leaving out pull requests. */
68
90
  search(filter: IssueSearchFilter): Promise<Issue[]>;
91
+ /** Fetches one issue by its key. */
69
92
  get(key: string): Promise<Issue>;
93
+ /** Creates an issue and returns its key as `#<number>`; the milestone is resolved from its title. */
70
94
  create(input: {
71
95
  summary: string;
72
96
  body?: string;
@@ -76,17 +100,21 @@ declare class GitHubIssues implements Issues {
76
100
  key: string;
77
101
  }>;
78
102
  transition(key: string, slot: LifecycleSlot): Promise<LifecycleResult>;
103
+ /** Adds a comment to the issue with the given key. */
79
104
  comment(key: string, body: string): Promise<void>;
105
+ /** Checks the authenticated user, the repo and the label-backed lifecycle slots, and reports what resolves. */
80
106
  doctor(): Promise<TrackerDoctorReport>;
81
107
  private resolveMilestone;
82
108
  private removeStatusLabels;
83
109
  private mapIssue;
84
110
  }
85
- //#endregion
86
- //#region src/capabilities/labels.d.ts
111
+ /** A label the repo is expected to have. */
87
112
  interface CanonicalLabel {
113
+ /** The label's name. */
88
114
  readonly name: string;
115
+ /** The label's color, as a hex string. */
89
116
  readonly color: string;
117
+ /** The label's description. */
90
118
  readonly description: string;
91
119
  }
92
120
  /**
@@ -97,36 +125,113 @@ interface CanonicalLabel {
97
125
  * - DELETEs labels listed in `stale`.
98
126
  * - Leaves unrecognised labels that aren't in `stale` untouched.
99
127
  */
100
- declare function syncLabels(client: GitHubClient, repo: string, canonical: ReadonlyArray<CanonicalLabel>, stale: ReadonlyArray<string>): Promise<string>;
101
- //#endregion
102
- //#region src/capabilities/secrets.d.ts
128
+ export declare function syncLabels(client: GitHubClient, repo: string, canonical: ReadonlyArray<CanonicalLabel>, stale: ReadonlyArray<string>): Promise<string>;
129
+ /** Options of the GitHub `projects` capability. */
130
+ interface ProjectsOptions {
131
+ /** The repository the provider is configured for, as `owner/name`; its items get the short key `#N`. */
132
+ repo: string;
133
+ }
134
+ /** The GitHub implementation of the `projects` capability, backed by Projects v2. */
135
+ export declare class GitHubProjects implements Projects {
136
+ private readonly graphql;
137
+ /** Capability key, always `"projects"`. */
138
+ readonly key: "projects";
139
+ /** Provider name, always `"github"`. */
140
+ readonly providerName = "github";
141
+ private readonly repo;
142
+ constructor(graphql: GraphQLClient, opts: ProjectsOptions);
143
+ /** Every board of the organization, open and closed. */
144
+ list(owner: string): Promise<BoardSummary[]>;
145
+ /** The open board with exactly this name. */
146
+ find(owner: string, name: string): Promise<BoardSummary | undefined>;
147
+ /**
148
+ * Makes a board. With `template.source` naming an open board it is copied (fields, options, views and automation
149
+ * rules, no items); otherwise the board is created and brought in line with the template.
150
+ */
151
+ create(owner: string, name: string, template: BoardTemplate): Promise<BoardSummary>;
152
+ /** Closes the board; `updateProjectV2` with `closed: true` is the only way, and reversible. */
153
+ close(_owner: string, board: BoardSummary): Promise<void>;
154
+ /** The live board: statuses, other fields, views and automation rules. */
155
+ read(_owner: string, board: BoardSummary): Promise<BoardState>;
156
+ /**
157
+ * Brings the board in line with the template. Never deletes a field, option or view, and never sends an option
158
+ * list without ids. Stops (throws) when the status field cannot be read.
159
+ */
160
+ ensure(_owner: string, board: BoardSummary, template: BoardTemplate): Promise<EnsureReport>;
161
+ /**
162
+ * Makes a single select field hold the wanted options in order, every existing one sent with its id. Options the
163
+ * template does not mention stay, after the wanted ones. Returns what changed (`Blocked added`, `order set`).
164
+ */
165
+ private ensureOptions;
166
+ private createField;
167
+ private createView;
168
+ private updateView;
169
+ /** The board's issues and pull requests with their status, whether they are open and their open blockers. */
170
+ items(_owner: string, board: BoardSummary, template: BoardTemplate): Promise<BoardItem[]>;
171
+ /** Puts an item in a status; `transitioned` is false when it already is there. */
172
+ setStatus(_owner: string, board: BoardSummary, key: string, status: string): Promise<LifecycleResult>;
173
+ /**
174
+ * Puts the open items of `from` on `to` with their status and priority, only where the target has no value;
175
+ * closed and merged ones stay, and are set to the template's done status when theirs is not a done one.
176
+ */
177
+ move(_owner: string, from: BoardSummary, to: BoardSummary, template: BoardTemplate): Promise<MoveReport>;
178
+ /** A `holocron doctor` smoke check: how many boards the token sees in the configured repository's organization. */
179
+ whoami(): Promise<{
180
+ ok: boolean;
181
+ boards: number;
182
+ }>;
183
+ /** Sets a single select value by option name; a field or option the board lacks is skipped. */
184
+ private setOption;
185
+ private ownerId;
186
+ private readRaw;
187
+ private fetchItems;
188
+ private keyOf;
189
+ private parseKey;
190
+ }
103
191
  interface SecretsOptions {
104
192
  repo: string;
105
193
  }
106
- declare class GitHubSecrets implements Secrets {
194
+ /** The GitHub implementation of the `secrets` capability, covering repository, environment and organization secrets. */
195
+ export declare class GitHubSecrets implements Secrets {
107
196
  private readonly client;
108
197
  private readonly opts;
198
+ private readonly orgClient?;
199
+ /** Capability key, always `"secrets"`. */
109
200
  readonly key: "secrets";
201
+ /** Provider name, always `"github"`. */
110
202
  readonly providerName = "github";
111
- constructor(client: GitHubClient, opts: SecretsOptions);
203
+ /**
204
+ * `client` handles repo and environment scopes; `orgClient`, when given, handles
205
+ * the organization scope. They differ when a dedicated org-only token exists:
206
+ * it can write org secrets but not repo ones, and `github.admin` is the reverse.
207
+ */
208
+ constructor(client: GitHubClient, opts: SecretsOptions, orgClient?: GitHubClient | undefined);
209
+ private clientFor;
112
210
  listSecrets(scope: SecretScope): Promise<string[]>;
113
211
  setSecret(scope: SecretScope, name: string, value: string): Promise<void>;
212
+ /** Deletes the named secret in the given scope. */
114
213
  deleteSecret(scope: SecretScope, name: string): Promise<void>;
115
214
  }
116
- //#endregion
117
- //#region src/capabilities/source.d.ts
118
215
  interface SourceOptions {
119
216
  repo: string;
120
217
  repoRoot: string;
121
218
  /** Secondary client authenticated with HOLOCRON_ORG_TOKEN for org-scoped operations (teams, custom properties). */
122
219
  orgClient?: GitHubClient;
220
+ /** Client for the files that link GitHub accounts to other services (HOLOCRON_USER_SYNC_TOKEN); falls back to the org client. */
221
+ userSyncClient?: GitHubClient;
123
222
  /** Forwarded to a secondary client created for Pages calls (HOLOCRON_DEPLOY_TOKEN). */
124
223
  baseUrl?: string;
125
224
  fetch?: typeof fetch;
126
225
  }
127
- declare class GitHubSource implements Source {
226
+ /**
227
+ * The GitHub implementation of the `source` capability: repo settings, rulesets, branch protection, security
228
+ * features and local workflow files.
229
+ */
230
+ export declare class GitHubSource implements Source {
128
231
  private readonly client;
232
+ /** Capability key, always `"source"`. */
129
233
  readonly key: "source";
234
+ /** Provider name, always `"github"`. */
130
235
  readonly providerName = "github";
131
236
  private readonly owner;
132
237
  private readonly name;
@@ -134,83 +239,117 @@ declare class GitHubSource implements Source {
134
239
  private readonly repoRoot;
135
240
  private readonly workflowDir;
136
241
  private readonly orgClient?;
242
+ private readonly userSyncClient?;
137
243
  private readonly baseUrl?;
138
244
  private readonly fetchImpl?;
139
245
  constructor(client: GitHubClient, opts: SourceOptions);
140
246
  whoami(): Promise<{
141
247
  login: string;
142
248
  }>;
249
+ /** Returns the repo's owner, name and default branch. */
143
250
  getRepo(): Promise<RepoRef>;
251
+ /** Lists the repo's rulesets. */
144
252
  listRulesets(): Promise<Ruleset[]>;
253
+ /** Creates a ruleset from the given payload. */
145
254
  createRuleset(payload: Record<string, unknown>): Promise<Ruleset>;
255
+ /** Updates the ruleset with the given id from the payload. */
146
256
  updateRuleset(id: number, payload: Record<string, unknown>): Promise<Ruleset>;
257
+ /** Updates the repo's settings. */
147
258
  updateRepoSettings(settings: RepoSettings): Promise<void>;
148
259
  protectBranch(branch: string, payload: Record<string, unknown>): Promise<void>;
260
+ /** Enables Dependabot vulnerability alerts. */
149
261
  enableVulnerabilityAlerts(): Promise<void>;
262
+ /** Enables Dependabot automated security fixes. */
150
263
  enableAutomatedSecurityFixes(): Promise<void>;
264
+ /** Enables secret scanning. */
151
265
  enableSecretScanning(): Promise<void>;
152
266
  enableCodeScanning(): Promise<string>;
153
267
  disableDefaultCodeScanning(): Promise<void>;
154
268
  enableDependencyGraph(): Promise<void>;
269
+ /** Enables private vulnerability reporting. */
155
270
  enablePrivateVulnerabilityReporting(): Promise<void>;
271
+ /** Lists the `.yml` and `.yaml` files in `.github/workflows`, sorted by name; empty when the folder is missing. */
156
272
  listWorkflowFiles(): Promise<string[]>;
273
+ /** Reads a workflow file's text, or `null` when it does not exist. */
157
274
  readWorkflowFile(name: string): Promise<string | null>;
275
+ /** Writes a workflow file, creating `.github/workflows` first when needed. */
158
276
  writeWorkflowFile(name: string, contents: string): Promise<void>;
277
+ /** Removes a workflow file; a file that is already gone is not an error. */
159
278
  removeWorkflowFile(name: string): Promise<void>;
160
279
  writeRepoFile(path: string, contents: string): Promise<void>;
161
280
  syncLabels(canonical: ReadonlyArray<LabelDef>, stale: ReadonlyArray<string>): Promise<string>;
162
281
  syncProperties(values: Record<string, string | string[]>): Promise<string>;
282
+ checkPropertyValues(values: Record<string, string | string[]>): Promise<string[] | undefined>;
163
283
  syncTeams(teams: TeamEntry$1[]): Promise<string>;
284
+ teamMembers(teamSlug: string, org?: string): Promise<SourceTeamMember[]>;
285
+ readFile(path: string, repo?: string): Promise<SourceFile | null>;
286
+ writeFile(path: string, content: string, opts: {
287
+ message: string;
288
+ version?: string;
289
+ repo?: string;
290
+ }): Promise<void>;
164
291
  syncTopics(topics: string[]): Promise<string>;
292
+ syncVariables(variables: Record<string, string>, opts?: {
293
+ prune?: boolean;
294
+ dryRun?: boolean;
295
+ }): Promise<string>;
296
+ syncOrgVariables(org: string, variables: Record<string, {
297
+ value: string;
298
+ visibility: "all" | "private";
299
+ }>, opts?: {
300
+ prune?: boolean;
301
+ dryRun?: boolean;
302
+ }): Promise<string>;
303
+ listVariables(): Promise<Record<string, string>>;
304
+ listOrgVariables(org: string): Promise<Record<string, {
305
+ value: string;
306
+ visibility: "all" | "private" | "selected";
307
+ }>>;
308
+ getRepoInfo(): Promise<SourceRepoInfo>;
309
+ getProperties(): Promise<Record<string, string | string[]>>;
310
+ listLabels(): Promise<LabelDef[]>;
311
+ listTeamAccess(): Promise<Array<{
312
+ slug: string;
313
+ permission: TeamPermission$1;
314
+ }>>;
315
+ getRulesetDetail(id: number): Promise<SourceRulesetDetail>;
316
+ getSecurity(): Promise<SourceSecurity>;
165
317
  syncDescription(description: string): Promise<string>;
166
318
  syncHomepage(homepage: string): Promise<string>;
167
319
  getPullRequest(number: number, repo?: string): Promise<PullRequest>;
320
+ listPullRequests(state: "open" | "closed", repo?: string): Promise<PullRequest[]>;
321
+ listBranches(repo?: string): Promise<SourceBranch[]>;
322
+ deleteBranch(name: string, repo?: string): Promise<void>;
323
+ listPullRequestCommits(number: number, repo?: string): Promise<string[]>;
168
324
  configurePages(config: PagesConfig, token: string): Promise<void>;
169
325
  }
170
- //#endregion
171
- //#region src/capabilities/teams.d.ts
326
+ /** A team entry with the permission spelled out. */
172
327
  interface NormalizedTeamEntry {
328
+ /** The team's slug. */
173
329
  slug: string;
330
+ /** The permission the team gets on the repo. */
174
331
  permission: TeamPermission;
175
332
  }
176
- declare function normalizeTeamEntry(entry: TeamEntry): NormalizedTeamEntry;
177
- declare function syncTeams(client: GitHubClient, repo: string, teams: TeamEntry[]): Promise<string>;
178
- //#endregion
179
- //#region src/sodium.d.ts
333
+ /** Turns a team entry into slug and permission form; a bare slug gets `push`. */
334
+ export declare function normalizeTeamEntry(entry: TeamEntry): NormalizedTeamEntry;
335
+ /** Grants each team access to the repo and reports the outcome; throws when every team fails. */
336
+ export declare function syncTeams(client: GitHubClient, repo: string, teams: TeamEntry[]): Promise<string>;
180
337
  /**
181
338
  * Encrypt `value` for the given GitHub-provided base64 public key.
182
339
  * Returns the base64 ciphertext to send as `encrypted_value`.
183
340
  */
184
- declare function encryptSecret(publicKeyBase64: string, value: string): Promise<string>;
185
- //#endregion
186
- //#region src/verify-token.d.ts
187
- /**
188
- * `verifyToken` — plugin-level export used by `holocron auth set` +
189
- * `holocron auth check`. Hits `GET /user` and translates the response
190
- * into the normalized `VerifyTokenResult` shape.
191
- *
192
- * Kept as a standalone function (not a capability method) so the auth
193
- * command can call it without initializing the full plugin — plugin
194
- * construction requires an already-resolved token, which is exactly
195
- * what we don't have yet at bootstrap time.
196
- */
197
- interface VerifyTokenSuccess {
198
- ok: true;
199
- subject: string;
200
- }
201
- interface VerifyTokenFailure {
202
- ok: false;
203
- message: string;
204
- }
205
- type VerifyTokenResult = VerifyTokenSuccess | VerifyTokenFailure;
341
+ export declare function encryptSecret(publicKeyBase64: string, value: string): Promise<string>;
342
+ /** Options for `verifyToken`. */
206
343
  interface VerifyTokenOptions {
344
+ /** Overrides the API base URL, for tests. */
207
345
  baseUrl?: string;
346
+ /** Overrides `fetch`, for tests. */
208
347
  fetch?: typeof fetch;
209
348
  }
210
- declare function verifyToken(token: string, opts?: VerifyTokenOptions): Promise<VerifyTokenResult>;
211
- //#endregion
212
- //#region src/index.d.ts
213
- interface GitHubPluginOptions extends ResolveTokenInput {
349
+ /** Checks a token against `GET /user` and returns who it belongs to, or why it failed. */
350
+ export declare function verifyToken(token: string, opts?: VerifyTokenOptions): Promise<VerifyTokenResult$1>;
351
+ /** Options for the GitHub plugin. */
352
+ export interface GitHubPluginOptions extends ResolveTokenInput {
214
353
  /** "owner/name" — e.g., "theholocron/holocron". Required. */
215
354
  repo: string;
216
355
  /** Absolute path to the working repo root. Used by `source`'s
@@ -218,7 +357,9 @@ interface GitHubPluginOptions extends ResolveTokenInput {
218
357
  repoRoot?: string;
219
358
  /** Lifecycle slot → label name. Used by the `issues` capability. */
220
359
  labels?: {
360
+ /** Label that marks an issue as in progress. */
221
361
  inProgress: string;
362
+ /** Label that marks an issue as in review. */
222
363
  inReview: string;
223
364
  };
224
365
  /** Override base URL for tests. Defaults to https://api.github.com. */
@@ -226,31 +367,49 @@ interface GitHubPluginOptions extends ResolveTokenInput {
226
367
  /** Override `fetch` for tests. Defaults to global `fetch`. */
227
368
  fetch?: typeof fetch;
228
369
  }
229
- interface PluginContext {
370
+ /** What the capability factories receive: the plugin options, a client, the repo and its root. */
371
+ export interface PluginContext {
372
+ /** The plugin options. */
230
373
  options: GitHubPluginOptions;
374
+ /** The GitHub client the capability uses. */
231
375
  client: GitHubClient;
376
+ /** The repo as `owner/name`. */
232
377
  repo: string;
378
+ /** Absolute path to the working repo root. */
233
379
  repoRoot: string;
234
380
  }
235
- declare function source(ctx: PluginContext, orgClient?: GitHubClient): Source;
236
- declare function secrets(ctx: PluginContext): Secrets;
237
- declare function environments(ctx: PluginContext): Environments;
238
- declare function ci(ctx: PluginContext): Ci;
239
- declare function issues(ctx: PluginContext): Issues;
240
- declare function createPlugin(options: GitHubPluginOptions): {
381
+ /** Builds the `source` capability; the optional clients cover org-level and user-sync access. */
382
+ export declare function source(ctx: PluginContext, orgClient?: GitHubClient, userSyncClient?: GitHubClient): Source;
383
+ /** Builds the `secrets` capability; the optional client handles organization secrets. */
384
+ export declare function secrets(ctx: PluginContext, orgClient?: GitHubClient): Secrets;
385
+ /** Builds the `environments` capability. */
386
+ export declare function environments(ctx: PluginContext): Environments;
387
+ /** Builds the `ci` capability. */
388
+ export declare function ci(ctx: PluginContext): Ci;
389
+ /** Builds the `issues` capability, passing the lifecycle labels when configured. */
390
+ export declare function issues(ctx: PluginContext): Issues;
391
+ /** Builds the `projects` capability: GitHub Projects v2 over GraphQL, with items keyed relative to the configured repo. */
392
+ export declare function projects(ctx: PluginContext): Projects;
393
+ /** Creates the plugin, resolving a token per capability when it is first used. */
394
+ export declare function createPlugin(options: GitHubPluginOptions): {
241
395
  name: string;
396
+ probes: {
397
+ connection: import("@theholocron/cli").Probe;
398
+ };
242
399
  capabilities: {
243
400
  source: () => Source;
244
401
  ci: () => Ci;
245
402
  secrets: () => Secrets;
246
403
  environments: () => Environments;
247
404
  issues: () => Issues;
405
+ projects: () => Projects;
248
406
  };
249
407
  };
250
408
  /**
251
409
  * One-line hint printed by `holocron auth set github` when no token
252
410
  * is supplied or the supplied token is rejected.
253
411
  */
254
- declare const AUTH_HINT: string;
255
- //#endregion
256
- export { AUTH_HINT, type Auth, AuthError, type CanonicalLabel, GitHubCi, type GitHubClientOptions, GitHubEnvironments, GitHubIssues, GitHubPluginOptions, GitHubSecrets, GitHubSource, type NormalizedTeamEntry, PluginContext, type ResolveTokenInput, type TeamEntry, type TeamPermission, type VerifyTokenFailure, type VerifyTokenResult, type VerifyTokenSuccess, ci, createFeatureResolver, createGitHubClient, createPlugin, encryptSecret, environments, issues, normalizeTeamEntry, resolveAdminToken, resolveDeployToken, resolveIssuesToken, resolveOrgToken, resolveReadToken, resolveReleaseToken, resolveSyncToken, secrets, source, syncLabels, syncTeams, verifyToken };
412
+ export declare const AUTH_HINT: string;
413
+ /** Every token this plugin takes, for `holocron doctor tokens`. */
414
+ export declare const tokens: PluginToken[];
415
+ export { type Auth, AuthError, type CanonicalLabel, type GitHubClientOptions, type NormalizedTeamEntry, type ProjectsOptions, type ResolveTokenInput, type TeamEntry, type TeamPermission, type VerifyTokenFailure, type VerifyTokenResult, type VerifyTokenSuccess, createFeatureResolver, createGitHubClient };