@hyperdrive.bot/cli 1.0.13 → 1.0.17
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 +4526 -780
- package/dist/commands/deploy.d.ts +18 -0
- package/dist/commands/deploy.js +239 -0
- package/dist/commands/deployment/create.js +10 -2
- package/dist/commands/domain/{switch.d.ts → set-production.d.ts} +1 -1
- package/dist/commands/domain/set-production.js +27 -0
- package/dist/commands/git/list-open-prs.d.ts +12 -0
- package/dist/commands/git/list-open-prs.js +87 -0
- package/dist/commands/hook/add.d.ts +22 -0
- package/dist/commands/hook/add.js +299 -0
- package/dist/commands/hook/list.d.ts +11 -0
- package/dist/commands/hook/list.js +111 -0
- package/dist/commands/hook/logs.d.ts +13 -0
- package/dist/commands/hook/logs.js +124 -0
- package/dist/commands/hook/remove.d.ts +12 -0
- package/dist/commands/hook/remove.js +115 -0
- package/dist/commands/hook/toggle.d.ts +12 -0
- package/dist/commands/hook/toggle.js +125 -0
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +49 -9
- package/dist/commands/module/bindings.d.ts +14 -0
- package/dist/commands/module/bindings.js +125 -0
- package/dist/commands/module/create.d.ts +3 -0
- package/dist/commands/module/create.js +156 -78
- package/dist/commands/module/list.d.ts +1 -0
- package/dist/commands/module/list.js +22 -1
- package/dist/commands/module/sync.d.ts +29 -0
- package/dist/commands/module/sync.js +409 -0
- package/dist/commands/module/unlink.d.ts +11 -0
- package/dist/commands/module/unlink.js +77 -0
- package/dist/commands/module/update.d.ts +10 -0
- package/dist/commands/module/update.js +168 -5
- package/dist/commands/network/discover.d.ts +12 -0
- package/dist/commands/network/discover.js +210 -0
- package/dist/commands/network/get.d.ts +13 -0
- package/dist/commands/network/get.js +90 -0
- package/dist/commands/{auth/logout.d.ts → network/list.d.ts} +2 -9
- package/dist/commands/network/list.js +71 -0
- package/dist/commands/network/register.d.ts +16 -0
- package/dist/commands/network/register.js +144 -0
- package/dist/commands/parameter/sync.d.ts +13 -0
- package/dist/commands/parameter/sync.js +69 -1
- package/dist/commands/project/sync.d.ts +5 -11
- package/dist/commands/project/sync.js +12 -381
- package/dist/commands/seed.d.ts +93 -0
- package/dist/commands/seed.js +324 -0
- package/dist/commands/service/backup.d.ts +17 -0
- package/dist/commands/service/backup.js +156 -0
- package/dist/commands/service/backups.d.ts +14 -0
- package/dist/commands/service/backups.js +110 -0
- package/dist/commands/service/bind.d.ts +16 -0
- package/dist/commands/service/bind.js +106 -0
- package/dist/commands/service/bindings.d.ts +13 -0
- package/dist/commands/service/bindings.js +78 -0
- package/dist/commands/service/clone.d.ts +19 -0
- package/dist/commands/service/clone.js +153 -0
- package/dist/commands/service/create.d.ts +16 -0
- package/dist/commands/service/create.js +212 -0
- package/dist/commands/service/get.d.ts +13 -0
- package/dist/commands/service/get.js +97 -0
- package/dist/commands/service/list.d.ts +12 -0
- package/dist/commands/service/list.js +86 -0
- package/dist/commands/service/register.d.ts +21 -0
- package/dist/commands/service/register.js +215 -0
- package/dist/commands/service/restore.d.ts +19 -0
- package/dist/commands/service/restore.js +158 -0
- package/dist/commands/service/seed.d.ts +17 -0
- package/dist/commands/service/seed.js +173 -0
- package/dist/commands/service/templates.d.ts +10 -0
- package/dist/commands/service/templates.js +66 -0
- package/dist/commands/service/unbind.d.ts +15 -0
- package/dist/commands/service/unbind.js +74 -0
- package/dist/commands/stage/create.d.ts +23 -0
- package/dist/commands/stage/create.js +145 -6
- package/dist/commands/stage/delete.d.ts +11 -0
- package/dist/commands/stage/delete.js +85 -0
- package/dist/commands/stage/deploy.d.ts +34 -0
- package/dist/commands/stage/deploy.js +294 -0
- package/dist/commands/stage/ensure-branches.d.ts +23 -0
- package/dist/commands/stage/ensure-branches.js +101 -0
- package/dist/commands/stage/list.js +4 -0
- package/dist/commands/stage/status.d.ts +14 -0
- package/dist/commands/stage/status.js +100 -0
- package/dist/commands/{jira → tracker}/connect.js +32 -23
- package/dist/commands/tracker/hook/add.d.ts +25 -0
- package/dist/commands/tracker/hook/add.js +284 -0
- package/dist/commands/{jira → tracker}/hook/list.js +20 -11
- package/dist/commands/{jira/hook/add.d.ts → tracker/hook/logs.d.ts} +2 -3
- package/dist/commands/tracker/hook/logs.js +126 -0
- package/dist/commands/{jira → tracker}/hook/remove.js +9 -8
- package/dist/commands/{jira → tracker}/hook/toggle.js +14 -12
- package/dist/commands/tracker/project/init.d.ts +17 -0
- package/dist/commands/tracker/project/init.js +178 -0
- package/dist/commands/tracker/project/link-module.d.ts +17 -0
- package/dist/commands/tracker/project/link-module.js +287 -0
- package/dist/commands/tracker/project/list-modules.d.ts +11 -0
- package/dist/commands/tracker/project/list-modules.js +117 -0
- package/dist/commands/tracker/project/list.d.ts +10 -0
- package/dist/commands/tracker/project/list.js +90 -0
- package/dist/commands/tracker/project/status.d.ts +13 -0
- package/dist/commands/tracker/project/status.js +168 -0
- package/dist/commands/tracker/project/unlink-module.d.ts +13 -0
- package/dist/commands/tracker/project/unlink-module.js +251 -0
- package/dist/commands/{jira → tracker}/status.js +3 -3
- package/dist/lib/ensure-branches.d.ts +53 -0
- package/dist/lib/ensure-branches.js +149 -0
- package/dist/lib/git-providers/github.d.ts +16 -0
- package/dist/lib/git-providers/github.js +157 -0
- package/dist/lib/git-providers/gitlab.d.ts +16 -0
- package/dist/lib/git-providers/gitlab.js +148 -0
- package/dist/lib/git-providers/index.d.ts +67 -0
- package/dist/lib/git-providers/index.js +39 -0
- package/dist/lib/lambda-warmer.d.ts +106 -0
- package/dist/lib/lambda-warmer.js +189 -0
- package/dist/services/hyperdrive-sigv4.d.ts +359 -5
- package/dist/services/hyperdrive-sigv4.js +177 -12
- package/dist/utils/hook-flow.d.ts +60 -3
- package/dist/utils/hook-flow.js +437 -2
- package/dist/utils/hook-normalize.d.ts +6 -0
- package/dist/utils/hook-normalize.js +33 -0
- package/dist/utils/lifecycle-poller.d.ts +32 -0
- package/dist/utils/lifecycle-poller.js +72 -0
- package/dist/utils/retry.d.ts +43 -0
- package/dist/utils/retry.js +88 -0
- package/dist/utils/summary-display.js +1 -1
- package/dist/utils/tracker-project-flow.d.ts +84 -0
- package/dist/utils/tracker-project-flow.js +564 -0
- package/package.json +41 -13
- package/dist/commands/auth/login.d.ts +0 -16
- package/dist/commands/auth/login.js +0 -179
- package/dist/commands/auth/logout.js +0 -116
- package/dist/commands/auth/refresh.d.ts +0 -6
- package/dist/commands/auth/refresh.js +0 -66
- package/dist/commands/auth/status.d.ts +0 -6
- package/dist/commands/auth/status.js +0 -63
- package/dist/commands/config/get.d.ts +0 -9
- package/dist/commands/config/get.js +0 -37
- package/dist/commands/config/set.d.ts +0 -10
- package/dist/commands/config/set.js +0 -48
- package/dist/commands/config/show.d.ts +0 -6
- package/dist/commands/config/show.js +0 -10
- package/dist/commands/domain/current.d.ts +0 -6
- package/dist/commands/domain/current.js +0 -18
- package/dist/commands/domain/list.d.ts +0 -6
- package/dist/commands/domain/list.js +0 -42
- package/dist/commands/domain/switch.js +0 -40
- package/dist/commands/jira/hook/add.js +0 -147
- package/dist/services/tenant-service.d.ts +0 -127
- package/dist/services/tenant-service.js +0 -396
- package/dist/utils/auth-flow.d.ts +0 -147
- package/dist/utils/auth-flow.js +0 -479
- package/oclif.manifest.json +0 -3519
- /package/dist/commands/{jira → tracker}/connect.d.ts +0 -0
- /package/dist/commands/{jira → tracker}/hook/list.d.ts +0 -0
- /package/dist/commands/{jira → tracker}/hook/remove.d.ts +0 -0
- /package/dist/commands/{jira → tracker}/hook/toggle.d.ts +0 -0
- /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
|
|
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>;
|