@theholocron/cli 2.0.0-alpha.0 → 2.0.0-alpha.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/README.md CHANGED
@@ -3,22 +3,26 @@
3
3
  The Holocron CLI — a pluggable, capability-based orchestrator for
4
4
  spinning up and operating software projects.
5
5
 
6
- ## Status
6
+ ## Install
7
7
 
8
- **v2 alpha.** The shape is being built up per
9
- [`.notes/tech-architecture.spec.md`](../../.notes/tech-architecture.spec.md).
10
- Most commands aren't wired yet.
8
+ ```bash
9
+ npm i -g @theholocron/cli@alpha
10
+ holocron --help
11
+ ```
11
12
 
12
13
  ## What's in here
13
14
 
14
15
  - `src/capabilities/` — the 14 capability interfaces that providers
15
- implement
16
+ implement
16
17
  - `src/config.ts` — `holocron.config.json` parser + plugin resolution
17
- - `src/cli.ts` — yargs entry, dispatches subcommands (WIP)
18
+ - `src/cli.ts` — yargs entry, dispatches subcommands
19
+ - `src/commands/` — `setup`, `doctor`, `deploy`, `secret set`,
20
+ `secrets sync`, `npm publish-initial`
18
21
 
19
- ## Install (when published)
22
+ ## Status
20
23
 
21
- ```bash
22
- pnpm add -D @theholocron/cli
23
- pnpm holocron --help
24
- ```
24
+ **`v2.0.0-alpha.0`** — published on npm under the `alpha` dist-tag.
25
+ [Release notes](https://github.com/theholocron/holocron/releases/tag/v2.0.0-alpha.0).
26
+ Design in
27
+ [`.notes/tech-architecture.spec.md`](../../.notes/tech-architecture.spec.md).
28
+ APIs may still shift before stable v2.0.0.
@@ -1,2 +1,2 @@
1
- import { $ as Tooling, A as Environments, B as ProviderApiError, C as DeploymentTarget, D as DnsRecordType, E as DnsRecord, F as LifecycleSlot, G as ResolvedCapability, H as REQUIRED_CAPABILITIES, I as NormalizedAuthUser, J as Secrets, K as Ruleset, L as Notifications, M as IssueSearchFilter, N as Issues, O as Environment, P as LifecycleResult, Q as StorageBranch, R as Observability, S as DeploymentRecord, T as Dns, U as RepoRef, V as ProviderIdentity, W as RepoSettings, X as StatusCategory, Y as Source, Z as Storage, _ as ConnectionStringOptions, a as AuthEventType, at as WebhookVerificationError, b as DeploymentProject, c as CARDINALITY, d as Cardinality, et as ToolingDoctorReport, f as CardinalityFor, g as CiRunStatus, h as CiRunFilter, i as AuthEvent, it as WebhookDashboardInfo, j as Issue, k as EnvironmentReviewer, l as CapabilityImpls, m as CiRun, n as Auth, nt as TrackerUser, o as AuthIdentity, ot as isMulti, p as Ci, q as SecretScope, r as AuthDescription, rt as Vault, s as AuthUser, t as Analytics, tt as TrackerDoctorReport, u as CapabilityKey, v as CreateAuthUserInput, w as DeploymentTrigger, x as DeploymentProjectSettings, y as Deployment, z as ParseWebhookInput } from "../index-DDxKXqtR.mjs";
1
+ import { $ as Tooling, A as Environments, B as ProviderApiError, C as DeploymentTarget, D as DnsRecordType, E as DnsRecord, F as LifecycleSlot, G as ResolvedCapability, H as REQUIRED_CAPABILITIES, I as NormalizedAuthUser, J as Secrets, K as Ruleset, L as Notifications, M as IssueSearchFilter, N as Issues, O as Environment, P as LifecycleResult, Q as StorageBranch, R as Observability, S as DeploymentRecord, T as Dns, U as RepoRef, V as ProviderIdentity, W as RepoSettings, X as StatusCategory, Y as Source, Z as Storage, _ as ConnectionStringOptions, a as AuthEventType, at as WebhookVerificationError, b as DeploymentProject, c as CARDINALITY, d as Cardinality, et as ToolingDoctorReport, f as CardinalityFor, g as CiRunStatus, h as CiRunFilter, i as AuthEvent, it as WebhookDashboardInfo, j as Issue, k as EnvironmentReviewer, l as CapabilityImpls, m as CiRun, n as Auth, nt as TrackerUser, o as AuthIdentity, ot as isMulti, p as Ci, q as SecretScope, r as AuthDescription, rt as Vault, s as AuthUser, t as Analytics, tt as TrackerDoctorReport, u as CapabilityKey, v as CreateAuthUserInput, w as DeploymentTrigger, x as DeploymentProjectSettings, y as Deployment, z as ParseWebhookInput } from "../index-CSxf0Yc7.mjs";
2
2
  export { Analytics, Auth, AuthDescription, AuthEvent, AuthEventType, AuthIdentity, AuthUser, CARDINALITY, CapabilityImpls, CapabilityKey, Cardinality, CardinalityFor, Ci, CiRun, CiRunFilter, CiRunStatus, ConnectionStringOptions, CreateAuthUserInput, Deployment, DeploymentProject, DeploymentProjectSettings, DeploymentRecord, DeploymentTarget, DeploymentTrigger, Dns, DnsRecord, DnsRecordType, Environment, EnvironmentReviewer, Environments, Issue, IssueSearchFilter, Issues, LifecycleResult, LifecycleSlot, NormalizedAuthUser, Notifications, Observability, ParseWebhookInput, ProviderApiError, ProviderIdentity, REQUIRED_CAPABILITIES, RepoRef, RepoSettings, ResolvedCapability, Ruleset, SecretScope, Secrets, Source, StatusCategory, Storage, StorageBranch, Tooling, ToolingDoctorReport, TrackerDoctorReport, TrackerUser, Vault, WebhookDashboardInfo, WebhookVerificationError, isMulti };
package/dist/cli.mjs CHANGED
@@ -233,11 +233,25 @@ async function runNpmPublishInitial(input = {}) {
233
233
  const cwd = input.cwd ?? process.cwd();
234
234
  const tag = input.tag ?? "alpha";
235
235
  const dryRun = input.dryRun ?? false;
236
+ const otp = input.otp;
236
237
  const env = input.env ?? process.env;
237
238
  const exec = input.exec ?? defaultExec;
239
+ const publishArgs = [
240
+ "-r",
241
+ "--filter=./packages/*",
242
+ "--filter=!@theholocron/cli-utils",
243
+ "publish",
244
+ "--access",
245
+ "public",
246
+ "--no-git-checks",
247
+ "--tag",
248
+ tag,
249
+ ...otp ? ["--otp", otp] : []
250
+ ];
238
251
  print(`Holocron npm publish-initial${dryRun ? " (dry-run)" : ""}`);
239
252
  print(` cwd: ${cwd}`);
240
253
  print(` tag: ${tag}`);
254
+ if (otp) print(` otp: <${otp.length} chars>`);
241
255
  print("");
242
256
  print(" → verifying npm auth (`npm whoami`)…");
243
257
  const whoami = await exec("npm", ["whoami"], { cwd });
@@ -254,7 +268,7 @@ async function runNpmPublishInitial(input = {}) {
254
268
  if (dryRun) {
255
269
  print("");
256
270
  print(" … (dry-run) skipping actual publish");
257
- print(` would run: pnpm -r --filter='./packages/*' --filter='!@theholocron/cli-utils' publish --access public --no-git-checks --tag ${tag}`);
271
+ print(` would run: pnpm ${publishArgs.join(" ")}`);
258
272
  printNextSteps(print, env);
259
273
  return {
260
274
  status: "dry-run",
@@ -264,20 +278,15 @@ async function runNpmPublishInitial(input = {}) {
264
278
  }
265
279
  print("");
266
280
  print(" → publishing all public @theholocron/* packages…");
267
- const publish = await exec("pnpm", [
268
- "-r",
269
- "--filter=./packages/*",
270
- "--filter=!@theholocron/cli-utils",
271
- "publish",
272
- "--access",
273
- "public",
274
- "--no-git-checks",
275
- "--tag",
276
- tag
277
- ], { cwd });
281
+ const publish = await exec("pnpm", publishArgs, { cwd });
278
282
  if (publish.exitCode !== 0) {
279
283
  const message = `publish failed (exit ${publish.exitCode}): ${publish.stderr.trim() || publish.stdout.trim() || "no output"}`;
280
284
  print(` ✗ ${message}`);
285
+ if (publish.stdout.includes("EOTP") || publish.stderr.includes("EOTP")) {
286
+ print("");
287
+ print(" → hint: your npm account requires 2FA for writes. Re-run with `--otp <code>`:");
288
+ print(` pnpm exec tsx packages/cli/src/cli.ts npm publish-initial --otp <6-digit-code>`);
289
+ }
281
290
  return {
282
291
  status: "fail",
283
292
  message,
@@ -810,11 +819,15 @@ await yargs(hideBin(process.argv)).scriptName("holocron").usage("$0 <command> [o
810
819
  type: "string",
811
820
  default: "alpha",
812
821
  describe: "npm distribution tag (defaults to alpha)"
822
+ }).option("otp", {
823
+ type: "string",
824
+ describe: "One-time password from your authenticator (required if npm needs 2FA for writes)"
813
825
  }), async (argv) => {
814
826
  if ((await runNpmPublishInitial({
815
827
  cwd: argv.cwd,
816
828
  tag: argv.tag,
817
- dryRun: argv.dryRun
829
+ dryRun: argv.dryRun,
830
+ ...argv.otp ? { otp: argv.otp } : {}
818
831
  })).status === "fail") process.exitCode = 1;
819
832
  }).command("config show", "Print the resolved holocron config", () => {}, async (argv) => {
820
833
  const loaded = await loadConfig(argv.cwd);
@@ -11,8 +11,8 @@
11
11
  * See `.notes/tech-architecture.spec.md` for the design narrative
12
12
  * (status: proposed, issue: #74).
13
13
  */
14
- type CapabilityKey = 'source' | 'ci' | 'secrets' | 'environments' | 'issues' | 'deployment' | 'storage' | 'auth' | 'vault' | 'dns' | 'tooling' | 'notifications' | 'analytics' | 'observability';
15
- type Cardinality = 'single' | 'many';
14
+ type CapabilityKey = "source" | "ci" | "secrets" | "environments" | "issues" | "deployment" | "storage" | "auth" | "vault" | "dns" | "tooling" | "notifications" | "analytics" | "observability";
15
+ type Cardinality = "single" | "many";
16
16
  declare const CARDINALITY: {
17
17
  readonly source: "single";
18
18
  readonly ci: "single";
@@ -50,7 +50,7 @@ declare class ProviderApiError extends Error {
50
50
  interface Ruleset {
51
51
  id: number;
52
52
  name: string;
53
- enforcement: 'active' | 'evaluate' | 'disabled';
53
+ enforcement: "active" | "evaluate" | "disabled";
54
54
  target?: string;
55
55
  }
56
56
  interface RepoSettings {
@@ -69,7 +69,7 @@ interface RepoRef {
69
69
  defaultBranch: string;
70
70
  }
71
71
  interface Source extends ProviderIdentity {
72
- readonly key: 'source';
72
+ readonly key: "source";
73
73
  /** Auth sanity-check. Throws ProviderApiError on auth failure. */
74
74
  whoami(): Promise<{
75
75
  login: string;
@@ -88,7 +88,7 @@ interface Source extends ProviderIdentity {
88
88
  writeWorkflowFile(name: string, contents: string): Promise<void>;
89
89
  removeWorkflowFile(name: string): Promise<void>;
90
90
  }
91
- type CiRunStatus = 'queued' | 'in_progress' | 'completed' | 'cancelled' | 'failure' | 'success' | 'skipped';
91
+ type CiRunStatus = "queued" | "in_progress" | "completed" | "cancelled" | "failure" | "success" | "skipped";
92
92
  interface CiRun {
93
93
  id: string | number;
94
94
  workflowName: string;
@@ -105,21 +105,21 @@ interface CiRunFilter {
105
105
  limit?: number;
106
106
  }
107
107
  interface Ci extends ProviderIdentity {
108
- readonly key: 'ci';
108
+ readonly key: "ci";
109
109
  listRuns(filter?: CiRunFilter): Promise<CiRun[]>;
110
110
  getRun(id: string | number): Promise<CiRun>;
111
111
  }
112
112
  type SecretScope = {
113
- kind: 'repo';
113
+ kind: "repo";
114
114
  } | {
115
- kind: 'environment';
115
+ kind: "environment";
116
116
  name: string;
117
117
  } | {
118
- kind: 'organization';
118
+ kind: "organization";
119
119
  name: string;
120
120
  };
121
121
  interface Secrets extends ProviderIdentity {
122
- readonly key: 'secrets';
122
+ readonly key: "secrets";
123
123
  /** List secret NAMES (not values) at the given scope. */
124
124
  listSecrets(scope: SecretScope): Promise<string[]>;
125
125
  /** Idempotent upsert. Adapter handles encryption. */
@@ -127,7 +127,7 @@ interface Secrets extends ProviderIdentity {
127
127
  deleteSecret(scope: SecretScope, name: string): Promise<void>;
128
128
  }
129
129
  interface EnvironmentReviewer {
130
- type: 'User' | 'Team';
130
+ type: "User" | "Team";
131
131
  /** Numeric id — GitHub's reviewer API silently ignores login strings. */
132
132
  id: number;
133
133
  }
@@ -138,13 +138,13 @@ interface Environment {
138
138
  preventSelfReview?: boolean;
139
139
  }
140
140
  interface Environments extends ProviderIdentity {
141
- readonly key: 'environments';
141
+ readonly key: "environments";
142
142
  listEnvironments(): Promise<Environment[]>;
143
143
  upsertEnvironment(env: Environment): Promise<void>;
144
144
  deleteEnvironment(name: string): Promise<void>;
145
145
  }
146
- type LifecycleSlot = 'inProgress' | 'inReview' | 'done';
147
- type StatusCategory = 'open' | 'in-progress' | 'in-review' | 'done' | 'other';
146
+ type LifecycleSlot = "inProgress" | "inReview" | "done";
147
+ type StatusCategory = "open" | "in-progress" | "in-review" | "done" | "other";
148
148
  interface TrackerUser {
149
149
  id: string;
150
150
  displayName: string;
@@ -165,7 +165,7 @@ interface Issue {
165
165
  }
166
166
  interface IssueSearchFilter {
167
167
  /** Restrict to issues assigned to a specific id, or 'currentUser'. */
168
- assignee?: string | 'currentUser';
168
+ assignee?: string | "currentUser";
169
169
  /** Exclude issues in the `done` category. */
170
170
  openOnly?: boolean;
171
171
  /** Max number of issues to return. Adapters apply a sensible default. */
@@ -202,7 +202,7 @@ interface TrackerDoctorReport {
202
202
  }>;
203
203
  }
204
204
  interface Issues extends ProviderIdentity {
205
- readonly key: 'issues';
205
+ readonly key: "issues";
206
206
  /** Currently-authenticated user. */
207
207
  getMyself(): Promise<TrackerUser>;
208
208
  search(filter: IssueSearchFilter): Promise<Issue[]>;
@@ -221,12 +221,12 @@ interface Issues extends ProviderIdentity {
221
221
  doctor(): Promise<TrackerDoctorReport>;
222
222
  }
223
223
  /** Env-var scope on the deploy platform. */
224
- type DeploymentTarget = 'development' | 'preview' | 'production';
224
+ type DeploymentTarget = "development" | "preview" | "production";
225
225
  /**
226
226
  * Named deployment trigger target — `undefined` means a branch
227
227
  * preview (no named environment).
228
228
  */
229
- type DeploymentTrigger = 'production' | 'staging';
229
+ type DeploymentTrigger = "production" | "staging";
230
230
  interface DeploymentProject {
231
231
  id: string;
232
232
  name: string;
@@ -248,10 +248,10 @@ interface DeploymentRecord {
248
248
  branch: string | null;
249
249
  /** Named environment if one was targeted; undefined for branch previews. */
250
250
  target?: DeploymentTrigger;
251
- status: 'queued' | 'building' | 'ready' | 'error' | 'cancelled';
251
+ status: "queued" | "building" | "ready" | "error" | "cancelled";
252
252
  }
253
253
  interface Deployment extends ProviderIdentity {
254
- readonly key: 'deployment';
254
+ readonly key: "deployment";
255
255
  listProjects(): Promise<DeploymentProject[]>;
256
256
  /** Create if missing, otherwise return existing. Idempotent. */
257
257
  ensureProject(input: {
@@ -287,7 +287,7 @@ interface ConnectionStringOptions {
287
287
  pooled?: boolean;
288
288
  }
289
289
  interface Storage extends ProviderIdentity {
290
- readonly key: 'storage';
290
+ readonly key: "storage";
291
291
  /**
292
292
  * Connection string for the given scope. Scope is provider-specific:
293
293
  *
@@ -343,7 +343,7 @@ interface WebhookDashboardInfo {
343
343
  url: string;
344
344
  }
345
345
  interface Auth extends ProviderIdentity {
346
- readonly key: 'auth';
346
+ readonly key: "auth";
347
347
  /** Env-var keys the runtime app needs. */
348
348
  describe(): Promise<AuthDescription>;
349
349
  /** Reachability probe — proves the configured key works. */
@@ -362,7 +362,7 @@ interface Auth extends ProviderIdentity {
362
362
  secretRef: string;
363
363
  }): Promise<void>;
364
364
  }
365
- type AuthEventType = 'user.created' | 'user.updated' | 'user.deleted';
365
+ type AuthEventType = "user.created" | "user.updated" | "user.deleted";
366
366
  interface NormalizedAuthUser {
367
367
  id: string;
368
368
  email: string;
@@ -389,7 +389,7 @@ declare class WebhookVerificationError extends Error {
389
389
  name: string;
390
390
  }
391
391
  interface Vault extends ProviderIdentity {
392
- readonly key: 'vault';
392
+ readonly key: "vault";
393
393
  /**
394
394
  * Read a secret by reference. The reference format is
395
395
  * provider-specific (1P: "op://Vault/Item/field"; HashiCorp Vault:
@@ -414,7 +414,7 @@ interface Vault extends ProviderIdentity {
414
414
  */
415
415
  readEnvironment?(environmentId: string): Promise<Record<string, string>>;
416
416
  }
417
- type DnsRecordType = 'A' | 'AAAA' | 'CNAME' | 'TXT' | 'MX' | 'NS' | 'SRV' | 'CAA';
417
+ type DnsRecordType = "A" | "AAAA" | "CNAME" | "TXT" | "MX" | "NS" | "SRV" | "CAA";
418
418
  interface DnsRecord {
419
419
  id?: string;
420
420
  type: DnsRecordType;
@@ -424,7 +424,7 @@ interface DnsRecord {
424
424
  priority?: number;
425
425
  }
426
426
  interface Dns extends ProviderIdentity {
427
- readonly key: 'dns';
427
+ readonly key: "dns";
428
428
  listRecords(domain: string): Promise<DnsRecord[]>;
429
429
  upsertRecord(domain: string, record: DnsRecord): Promise<DnsRecord>;
430
430
  deleteRecord(domain: string, id: string): Promise<void>;
@@ -434,13 +434,13 @@ interface ToolingDoctorReport {
434
434
  message: string;
435
435
  }
436
436
  interface Tooling extends ProviderIdentity {
437
- readonly key: 'tooling';
437
+ readonly key: "tooling";
438
438
  /** Sync the tool's authoritative state from the repo. */
439
439
  sync(): Promise<void>;
440
440
  doctor(): Promise<ToolingDoctorReport>;
441
441
  }
442
442
  interface Notifications extends ProviderIdentity {
443
- readonly key: 'notifications';
443
+ readonly key: "notifications";
444
444
  /**
445
445
  * Send a message. `channel` is provider-specific (Slack channel id,
446
446
  * Discord webhook url-name, etc.); adapters resolve from config.
@@ -448,14 +448,14 @@ interface Notifications extends ProviderIdentity {
448
448
  send(channel: string, message: string): Promise<void>;
449
449
  }
450
450
  interface Analytics extends ProviderIdentity {
451
- readonly key: 'analytics';
451
+ readonly key: "analytics";
452
452
  describe(): Promise<{
453
453
  provider: string;
454
454
  dsnEnvKey: string;
455
455
  }>;
456
456
  }
457
457
  interface Observability extends ProviderIdentity {
458
- readonly key: 'observability';
458
+ readonly key: "observability";
459
459
  describe(): Promise<{
460
460
  provider: string;
461
461
  dsnEnvKey: string;
@@ -479,7 +479,7 @@ interface CapabilityImpls {
479
479
  }
480
480
  type CardinalityFor<K extends CapabilityKey> = (typeof CARDINALITY)[K];
481
481
  /** Resolved runtime shape: single → one impl; many → array. */
482
- type ResolvedCapability<K extends CapabilityKey> = CardinalityFor<K> extends 'many' ? CapabilityImpls[K][] : CapabilityImpls[K];
483
- declare function isMulti<K extends CapabilityKey>(key: K): CardinalityFor<K> extends 'many' ? true : false;
482
+ type ResolvedCapability<K extends CapabilityKey> = CardinalityFor<K> extends "many" ? CapabilityImpls[K][] : CapabilityImpls[K];
483
+ declare function isMulti<K extends CapabilityKey>(key: K): CardinalityFor<K> extends "many" ? true : false;
484
484
  //#endregion
485
485
  export { Tooling as $, Environments as A, ProviderApiError as B, DeploymentTarget as C, DnsRecordType as D, DnsRecord as E, LifecycleSlot as F, ResolvedCapability as G, REQUIRED_CAPABILITIES as H, NormalizedAuthUser as I, Secrets as J, Ruleset as K, Notifications as L, IssueSearchFilter as M, Issues as N, Environment as O, LifecycleResult as P, StorageBranch as Q, Observability as R, DeploymentRecord as S, Dns as T, RepoRef as U, ProviderIdentity as V, RepoSettings as W, StatusCategory as X, Source as Y, Storage as Z, ConnectionStringOptions as _, AuthEventType as a, WebhookVerificationError as at, DeploymentProject as b, CARDINALITY as c, Cardinality as d, ToolingDoctorReport as et, CardinalityFor as f, CiRunStatus as g, CiRunFilter as h, AuthEvent as i, WebhookDashboardInfo as it, Issue as j, EnvironmentReviewer as k, CapabilityImpls as l, CiRun as m, Auth as n, TrackerUser as nt, AuthIdentity as o, isMulti as ot, Ci as p, SecretScope as q, AuthDescription as r, Vault as rt, AuthUser as s, Analytics as t, TrackerDoctorReport as tt, CapabilityKey as u, CreateAuthUserInput as v, DeploymentTrigger as w, DeploymentProjectSettings as x, Deployment as y, ParseWebhookInput as z };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as Tooling, A as Environments, B as ProviderApiError, C as DeploymentTarget, D as DnsRecordType, E as DnsRecord, F as LifecycleSlot, G as ResolvedCapability, H as REQUIRED_CAPABILITIES, I as NormalizedAuthUser, J as Secrets, K as Ruleset, L as Notifications, M as IssueSearchFilter, N as Issues, O as Environment, P as LifecycleResult, Q as StorageBranch, R as Observability, S as DeploymentRecord, T as Dns, U as RepoRef, V as ProviderIdentity, W as RepoSettings, X as StatusCategory, Y as Source, Z as Storage, _ as ConnectionStringOptions, a as AuthEventType, at as WebhookVerificationError, b as DeploymentProject, c as CARDINALITY, d as Cardinality, et as ToolingDoctorReport, f as CardinalityFor, g as CiRunStatus, h as CiRunFilter, i as AuthEvent, it as WebhookDashboardInfo, j as Issue, k as EnvironmentReviewer, l as CapabilityImpls, m as CiRun, n as Auth, nt as TrackerUser, o as AuthIdentity, ot as isMulti, p as Ci, q as SecretScope, r as AuthDescription, rt as Vault, s as AuthUser, t as Analytics, tt as TrackerDoctorReport, u as CapabilityKey, v as CreateAuthUserInput, w as DeploymentTrigger, x as DeploymentProjectSettings, y as Deployment, z as ParseWebhookInput } from "./index-DDxKXqtR.mjs";
1
+ import { $ as Tooling, A as Environments, B as ProviderApiError, C as DeploymentTarget, D as DnsRecordType, E as DnsRecord, F as LifecycleSlot, G as ResolvedCapability, H as REQUIRED_CAPABILITIES, I as NormalizedAuthUser, J as Secrets, K as Ruleset, L as Notifications, M as IssueSearchFilter, N as Issues, O as Environment, P as LifecycleResult, Q as StorageBranch, R as Observability, S as DeploymentRecord, T as Dns, U as RepoRef, V as ProviderIdentity, W as RepoSettings, X as StatusCategory, Y as Source, Z as Storage, _ as ConnectionStringOptions, a as AuthEventType, at as WebhookVerificationError, b as DeploymentProject, c as CARDINALITY, d as Cardinality, et as ToolingDoctorReport, f as CardinalityFor, g as CiRunStatus, h as CiRunFilter, i as AuthEvent, it as WebhookDashboardInfo, j as Issue, k as EnvironmentReviewer, l as CapabilityImpls, m as CiRun, n as Auth, nt as TrackerUser, o as AuthIdentity, ot as isMulti, p as Ci, q as SecretScope, r as AuthDescription, rt as Vault, s as AuthUser, t as Analytics, tt as TrackerDoctorReport, u as CapabilityKey, v as CreateAuthUserInput, w as DeploymentTrigger, x as DeploymentProjectSettings, y as Deployment, z as ParseWebhookInput } from "./index-CSxf0Yc7.mjs";
2
2
 
3
3
  //#region src/config.d.ts
4
4
  type ProviderOptions = Record<string, unknown>;
@@ -30,15 +30,15 @@ interface ResolvedTuple {
30
30
  options: ProviderOptions;
31
31
  }
32
32
  type ResolvedProviderEntry = {
33
- cardinality: 'single';
33
+ cardinality: "single";
34
34
  tuple: ResolvedTuple;
35
35
  } | {
36
- cardinality: 'many';
36
+ cardinality: "many";
37
37
  tuples: ResolvedTuple[];
38
38
  };
39
39
  type ResolvedProvidersConfig = Partial<Record<CapabilityKey, ResolvedProviderEntry>>;
40
40
  interface ResolvedHolocronConfig {
41
- project: HolocronConfig['project'];
41
+ project: HolocronConfig["project"];
42
42
  providers: ResolvedProvidersConfig;
43
43
  apps: AppConfig[];
44
44
  doctor: DoctorConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theholocron/cli",
3
- "version": "2.0.0-alpha.0",
3
+ "version": "2.0.0-alpha.1",
4
4
  "description": "The Holocron CLI — a pluggable, capability-based orchestrator for spinning up and operating software projects.",
5
5
  "homepage": "https://github.com/theholocron/holocron/tree/main/packages/cli#readme",
6
6
  "bugs": "https://github.com/theholocron/holocron/issues",