@hyperdrive.bot/cli 1.0.12 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +1495 -474
  2. package/dist/commands/deploy.d.ts +18 -0
  3. package/dist/commands/deploy.js +239 -0
  4. package/dist/commands/deployment/create.js +10 -2
  5. package/dist/commands/domain/{switch.d.ts → set-production.d.ts} +1 -1
  6. package/dist/commands/domain/set-production.js +27 -0
  7. package/dist/commands/git/list-open-prs.d.ts +12 -0
  8. package/dist/commands/git/list-open-prs.js +87 -0
  9. package/dist/commands/hook/add.d.ts +22 -0
  10. package/dist/commands/hook/add.js +299 -0
  11. package/dist/commands/hook/list.d.ts +11 -0
  12. package/dist/commands/hook/list.js +111 -0
  13. package/dist/commands/hook/logs.d.ts +13 -0
  14. package/dist/commands/hook/logs.js +124 -0
  15. package/dist/commands/hook/remove.d.ts +12 -0
  16. package/dist/commands/hook/remove.js +115 -0
  17. package/dist/commands/hook/toggle.d.ts +12 -0
  18. package/dist/commands/hook/toggle.js +125 -0
  19. package/dist/commands/init.d.ts +1 -1
  20. package/dist/commands/init.js +49 -9
  21. package/dist/commands/module/bindings.d.ts +14 -0
  22. package/dist/commands/module/bindings.js +125 -0
  23. package/dist/commands/module/create.d.ts +3 -0
  24. package/dist/commands/module/create.js +156 -78
  25. package/dist/commands/module/list.d.ts +1 -0
  26. package/dist/commands/module/list.js +22 -1
  27. package/dist/commands/module/sync.d.ts +29 -0
  28. package/dist/commands/module/sync.js +409 -0
  29. package/dist/commands/module/unlink.d.ts +11 -0
  30. package/dist/commands/module/unlink.js +77 -0
  31. package/dist/commands/module/update.d.ts +10 -0
  32. package/dist/commands/module/update.js +168 -5
  33. package/dist/commands/network/discover.d.ts +12 -0
  34. package/dist/commands/network/discover.js +210 -0
  35. package/dist/commands/network/get.d.ts +13 -0
  36. package/dist/commands/network/get.js +90 -0
  37. package/dist/commands/{auth/logout.d.ts → network/list.d.ts} +2 -9
  38. package/dist/commands/network/list.js +71 -0
  39. package/dist/commands/network/register.d.ts +16 -0
  40. package/dist/commands/network/register.js +144 -0
  41. package/dist/commands/parameter/sync.d.ts +13 -0
  42. package/dist/commands/parameter/sync.js +69 -1
  43. package/dist/commands/project/sync.d.ts +5 -11
  44. package/dist/commands/project/sync.js +12 -381
  45. package/dist/commands/seed.d.ts +93 -0
  46. package/dist/commands/seed.js +324 -0
  47. package/dist/commands/service/backup.d.ts +17 -0
  48. package/dist/commands/service/backup.js +156 -0
  49. package/dist/commands/service/backups.d.ts +14 -0
  50. package/dist/commands/service/backups.js +110 -0
  51. package/dist/commands/service/bind.d.ts +16 -0
  52. package/dist/commands/service/bind.js +106 -0
  53. package/dist/commands/service/bindings.d.ts +13 -0
  54. package/dist/commands/service/bindings.js +78 -0
  55. package/dist/commands/service/clone.d.ts +19 -0
  56. package/dist/commands/service/clone.js +153 -0
  57. package/dist/commands/service/create.d.ts +16 -0
  58. package/dist/commands/service/create.js +212 -0
  59. package/dist/commands/service/get.d.ts +13 -0
  60. package/dist/commands/service/get.js +97 -0
  61. package/dist/commands/service/list.d.ts +12 -0
  62. package/dist/commands/service/list.js +86 -0
  63. package/dist/commands/service/register.d.ts +21 -0
  64. package/dist/commands/service/register.js +215 -0
  65. package/dist/commands/service/restore.d.ts +19 -0
  66. package/dist/commands/service/restore.js +158 -0
  67. package/dist/commands/service/seed.d.ts +17 -0
  68. package/dist/commands/service/seed.js +173 -0
  69. package/dist/commands/service/templates.d.ts +10 -0
  70. package/dist/commands/service/templates.js +66 -0
  71. package/dist/commands/service/unbind.d.ts +15 -0
  72. package/dist/commands/service/unbind.js +74 -0
  73. package/dist/commands/stage/create.d.ts +23 -0
  74. package/dist/commands/stage/create.js +145 -6
  75. package/dist/commands/stage/delete.d.ts +11 -0
  76. package/dist/commands/stage/delete.js +85 -0
  77. package/dist/commands/stage/deploy.d.ts +34 -0
  78. package/dist/commands/stage/deploy.js +294 -0
  79. package/dist/commands/stage/ensure-branches.d.ts +23 -0
  80. package/dist/commands/stage/ensure-branches.js +101 -0
  81. package/dist/commands/stage/list.js +4 -0
  82. package/dist/commands/stage/status.d.ts +14 -0
  83. package/dist/commands/stage/status.js +100 -0
  84. package/dist/commands/{jira → tracker}/connect.js +32 -23
  85. package/dist/commands/tracker/hook/add.d.ts +25 -0
  86. package/dist/commands/tracker/hook/add.js +284 -0
  87. package/dist/commands/{jira → tracker}/hook/list.js +20 -11
  88. package/dist/commands/{jira/hook/add.d.ts → tracker/hook/logs.d.ts} +2 -3
  89. package/dist/commands/tracker/hook/logs.js +126 -0
  90. package/dist/commands/{jira → tracker}/hook/remove.js +9 -8
  91. package/dist/commands/{jira → tracker}/hook/toggle.js +14 -12
  92. package/dist/commands/tracker/project/init.d.ts +17 -0
  93. package/dist/commands/tracker/project/init.js +178 -0
  94. package/dist/commands/tracker/project/link-module.d.ts +17 -0
  95. package/dist/commands/tracker/project/link-module.js +287 -0
  96. package/dist/commands/tracker/project/list-modules.d.ts +11 -0
  97. package/dist/commands/tracker/project/list-modules.js +117 -0
  98. package/dist/commands/tracker/project/list.d.ts +10 -0
  99. package/dist/commands/tracker/project/list.js +90 -0
  100. package/dist/commands/tracker/project/status.d.ts +13 -0
  101. package/dist/commands/tracker/project/status.js +168 -0
  102. package/dist/commands/tracker/project/unlink-module.d.ts +13 -0
  103. package/dist/commands/tracker/project/unlink-module.js +251 -0
  104. package/dist/commands/{jira → tracker}/status.js +3 -3
  105. package/dist/lib/ensure-branches.d.ts +53 -0
  106. package/dist/lib/ensure-branches.js +149 -0
  107. package/dist/lib/git-providers/github.d.ts +16 -0
  108. package/dist/lib/git-providers/github.js +157 -0
  109. package/dist/lib/git-providers/gitlab.d.ts +16 -0
  110. package/dist/lib/git-providers/gitlab.js +148 -0
  111. package/dist/lib/git-providers/index.d.ts +67 -0
  112. package/dist/lib/git-providers/index.js +39 -0
  113. package/dist/lib/lambda-warmer.d.ts +106 -0
  114. package/dist/lib/lambda-warmer.js +189 -0
  115. package/dist/services/hyperdrive-sigv4.d.ts +360 -5
  116. package/dist/services/hyperdrive-sigv4.js +192 -24
  117. package/dist/utils/hook-flow.d.ts +60 -3
  118. package/dist/utils/hook-flow.js +437 -2
  119. package/dist/utils/hook-normalize.d.ts +6 -0
  120. package/dist/utils/hook-normalize.js +33 -0
  121. package/dist/utils/lifecycle-poller.d.ts +32 -0
  122. package/dist/utils/lifecycle-poller.js +72 -0
  123. package/dist/utils/retry.d.ts +43 -0
  124. package/dist/utils/retry.js +88 -0
  125. package/dist/utils/summary-display.js +1 -1
  126. package/dist/utils/tracker-project-flow.d.ts +84 -0
  127. package/dist/utils/tracker-project-flow.js +564 -0
  128. package/package.json +35 -7
  129. package/dist/commands/auth/login.d.ts +0 -16
  130. package/dist/commands/auth/login.js +0 -179
  131. package/dist/commands/auth/logout.js +0 -116
  132. package/dist/commands/auth/refresh.d.ts +0 -6
  133. package/dist/commands/auth/refresh.js +0 -66
  134. package/dist/commands/auth/status.d.ts +0 -6
  135. package/dist/commands/auth/status.js +0 -63
  136. package/dist/commands/config/get.d.ts +0 -9
  137. package/dist/commands/config/get.js +0 -37
  138. package/dist/commands/config/set.d.ts +0 -10
  139. package/dist/commands/config/set.js +0 -48
  140. package/dist/commands/config/show.d.ts +0 -6
  141. package/dist/commands/config/show.js +0 -10
  142. package/dist/commands/domain/current.d.ts +0 -6
  143. package/dist/commands/domain/current.js +0 -18
  144. package/dist/commands/domain/list.d.ts +0 -6
  145. package/dist/commands/domain/list.js +0 -42
  146. package/dist/commands/domain/switch.js +0 -40
  147. package/dist/commands/jira/hook/add.js +0 -147
  148. package/dist/services/tenant-service.d.ts +0 -127
  149. package/dist/services/tenant-service.js +0 -396
  150. package/dist/utils/auth-flow.d.ts +0 -147
  151. package/dist/utils/auth-flow.js +0 -479
  152. package/oclif.manifest.json +0 -3519
  153. /package/dist/commands/{jira → tracker}/connect.d.ts +0 -0
  154. /package/dist/commands/{jira → tracker}/hook/list.d.ts +0 -0
  155. /package/dist/commands/{jira → tracker}/hook/remove.d.ts +0 -0
  156. /package/dist/commands/{jira → tracker}/hook/toggle.d.ts +0 -0
  157. /package/dist/commands/{jira → tracker}/status.d.ts +0 -0
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Retry utility with exponential backoff for transient upload failures.
3
+ *
4
+ * Classifies errors as retryable (network errors, 429, 5xx) vs permanent
5
+ * (4xx except 429) and only retries transient failures.
6
+ */
7
+ /** Network error codes that indicate transient failures */
8
+ const RETRYABLE_ERROR_CODES = new Set([
9
+ 'ECONNRESET',
10
+ 'ECONNREFUSED',
11
+ 'ENOTFOUND',
12
+ 'EPIPE',
13
+ 'ETIMEDOUT',
14
+ 'UND_ERR_CONNECT_TIMEOUT',
15
+ 'UND_ERR_SOCKET',
16
+ ]);
17
+ /**
18
+ * Check whether an error is transient and should be retried.
19
+ *
20
+ * Retryable:
21
+ * - Network errors: ECONNRESET, ETIMEDOUT, EPIPE, ENOTFOUND, etc.
22
+ * - HTTP 429 (rate limited)
23
+ * - HTTP 5xx (server errors)
24
+ *
25
+ * Non-retryable:
26
+ * - HTTP 4xx except 429 (client errors — bad URL, expired signature, etc.)
27
+ */
28
+ export function isRetryableError(error) {
29
+ if (error instanceof Response || (error && typeof error === 'object' && 'status' in error)) {
30
+ const status = error.status;
31
+ if (status === 429)
32
+ return true;
33
+ if (status >= 500 && status < 600)
34
+ return true;
35
+ return false;
36
+ }
37
+ if (error instanceof Error) {
38
+ const code = error.code;
39
+ if (code && RETRYABLE_ERROR_CODES.has(code))
40
+ return true;
41
+ // fetch() wraps network errors in TypeError
42
+ if (error.name === 'TypeError' && error.message.includes('fetch'))
43
+ return true;
44
+ // AbortError from timeouts
45
+ if (error.name === 'AbortError')
46
+ return true;
47
+ }
48
+ return false;
49
+ }
50
+ /**
51
+ * Execute an async function with exponential backoff retry.
52
+ *
53
+ * @param fn - Async function to execute. Should throw or return a failed Response on failure.
54
+ * @param config - Retry configuration
55
+ * @returns The successful result and attempt count
56
+ * @throws The last error after all retries are exhausted
57
+ */
58
+ export async function retryWithBackoff(fn, config = {}) {
59
+ const { backoffMultiplier = 2, baseDelayMs = 1000, maxRetries = 3 } = config;
60
+ let lastError;
61
+ for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {
62
+ try {
63
+ const result = await fn();
64
+ return { attempts: attempt, result };
65
+ }
66
+ catch (error) {
67
+ lastError = error;
68
+ // If it's the last attempt or not retryable, throw immediately
69
+ if (attempt > maxRetries || !isRetryableError(error)) {
70
+ throw error;
71
+ }
72
+ // Exponential backoff: baseDelayMs * (multiplier ^ (attempt - 1))
73
+ // attempt 1 → baseDelayMs * 1 = 1000ms
74
+ // attempt 2 → baseDelayMs * 2 = 2000ms
75
+ // attempt 3 → baseDelayMs * 4 = 4000ms
76
+ const delay = baseDelayMs * (backoffMultiplier ** (attempt - 1));
77
+ await sleep(delay);
78
+ }
79
+ }
80
+ // Should not reach here, but satisfy TypeScript
81
+ throw lastError;
82
+ }
83
+ /** Awaitable sleep helper (exported for testing) */
84
+ export function sleep(ms) {
85
+ return new Promise((resolve) => {
86
+ setTimeout(resolve, ms);
87
+ });
88
+ }
@@ -40,7 +40,7 @@ export function getNextSteps(results) {
40
40
  // Jira integration is fourth priority
41
41
  if (results.jiraSkipped) {
42
42
  steps.push({
43
- command: 'hd jira connect',
43
+ command: 'hd tracker connect',
44
44
  description: 'Connect Jira for project management',
45
45
  priority: 4,
46
46
  });
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Tracker Project Init Wizard Flow
3
+ *
4
+ * Multi-step wizard functions for creating a tracker project,
5
+ * linking modules, mapping statuses, and configuring hooks.
6
+ */
7
+ import type { HookActionType, HookCreateRequestV2, NormalizedWorkflowState, TrackerHookResponseV2, TrackerProject, TrackerProjectModuleLink } from '../services/hyperdrive-sigv4.js';
8
+ import { HyperdriveSigV4Service } from '../services/hyperdrive-sigv4.js';
9
+ export interface TrackerConnection {
10
+ cloudId?: string;
11
+ domain?: string;
12
+ jiraDomain?: string;
13
+ status?: string;
14
+ trackerId: string;
15
+ }
16
+ export interface SelectedTracker {
17
+ domain: string;
18
+ provider: string;
19
+ trackerId: string;
20
+ }
21
+ export interface SelectedExternalProject {
22
+ externalProjectKey: string;
23
+ externalProjectName: string;
24
+ }
25
+ export interface LinkedModule {
26
+ moduleId: string;
27
+ moduleName: string;
28
+ role: 'primary' | 'supporting';
29
+ }
30
+ export interface StatusMappingResult {
31
+ hooks: HookCreateRequestV2[];
32
+ statusMapping: Record<string, NormalizedWorkflowState>;
33
+ }
34
+ export interface TrackerProjectConfig {
35
+ externalProject: SelectedExternalProject;
36
+ hooks: HookCreateRequestV2[];
37
+ linkedModules: LinkedModule[];
38
+ statusMapping: Record<string, NormalizedWorkflowState>;
39
+ tracker: SelectedTracker;
40
+ }
41
+ export type ExistingProjectAction = 'skip' | 'replace-hooks' | 'abort';
42
+ export interface TrackerProjectInitOptions {
43
+ nonInteractive?: boolean;
44
+ }
45
+ export interface TrackerProjectInitResult {
46
+ hooks: TrackerHookResponseV2[];
47
+ moduleLinks: TrackerProjectModuleLink[];
48
+ trackerProject: TrackerProject;
49
+ }
50
+ export interface ConfigFileHook {
51
+ actionConfig: Record<string, unknown>;
52
+ actionType: HookActionType;
53
+ triggerStatus: string;
54
+ }
55
+ export interface ConfigFile {
56
+ hooks?: ConfigFileHook[];
57
+ statusMapping?: Record<string, NormalizedWorkflowState>;
58
+ }
59
+ export declare function parseConfigFile(filePath: string): {
60
+ hooks: HookCreateRequestV2[];
61
+ statusMapping: Record<string, NormalizedWorkflowState>;
62
+ };
63
+ export declare function stepSelectTracker(service: HyperdriveSigV4Service, preselectedTrackerId?: string): Promise<SelectedTracker>;
64
+ export declare function stepSelectExternalProject(service: HyperdriveSigV4Service, _trackerId: string, override?: {
65
+ projectKey: string;
66
+ projectName: string;
67
+ }): Promise<SelectedExternalProject>;
68
+ export declare function stepLinkModules(service: HyperdriveSigV4Service, override?: {
69
+ moduleIds: string[];
70
+ primaryModuleId?: string;
71
+ }): Promise<LinkedModule[]>;
72
+ export declare function stepMapStatuses(service: HyperdriveSigV4Service, _trackerId: string, externalProjectKey: string, override?: StatusMappingResult): Promise<StatusMappingResult>;
73
+ export declare function displaySummary(config: TrackerProjectConfig, log: (msg: string) => void): void;
74
+ export declare function stepConfirm(): Promise<boolean>;
75
+ export declare function findExistingTrackerProject(service: HyperdriveSigV4Service, config: TrackerProjectConfig): Promise<TrackerProject | null>;
76
+ export declare function promptExistingProjectAction(existingProject: TrackerProject): Promise<ExistingProjectAction>;
77
+ export declare function deleteExistingHooks(service: HyperdriveSigV4Service, trackerProjectId: string): Promise<number>;
78
+ export declare function executeTrackerProjectInit(service: HyperdriveSigV4Service, config: TrackerProjectConfig, options?: TrackerProjectInitOptions): Promise<TrackerProjectInitResult>;
79
+ export interface SelectedTrackerProject {
80
+ externalProjectKey: string;
81
+ externalProjectName: string;
82
+ trackerProjectId: string;
83
+ }
84
+ export declare function selectTrackerProject(service: HyperdriveSigV4Service, trackerProjectId?: string): Promise<SelectedTrackerProject>;