hub-launch 1.25.0 → 1.26.0
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/CHANGELOG.md +14 -0
- package/dist/commands/approve.d.ts.map +1 -1
- package/dist/commands/approve.js +15 -0
- package/dist/commands/approve.js.map +1 -1
- package/dist/commands/init.d.ts +12 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +85 -217
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/launch.d.ts +15 -0
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +73 -0
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/preview.js +4 -16
- package/dist/commands/preview.js.map +1 -1
- package/dist/services/group/GroupLaunchService.d.ts +6 -6
- package/dist/services/hooks/HookExecutor.d.ts +24 -0
- package/dist/services/hooks/HookExecutor.d.ts.map +1 -1
- package/dist/services/hooks/HookExecutor.js +61 -3
- package/dist/services/hooks/HookExecutor.js.map +1 -1
- package/dist/types/config.schema.d.ts +8 -8
- package/dist/types/config.schema.js +1 -1
- package/dist/types/config.schema.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.26.0] - 2026-09-03
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- `beforeLaunch` and `afterMerge` project hooks. `beforeLaunch` runs before `hula launch` sends its request, letting a project hook provision per-launch resources (e.g. an isolated database branch) and inject the resulting environment variables into the launch — a hook failure aborts the launch rather than proceeding against the wrong resources. `afterMerge` runs after `hula approve` successfully merges a PR, for best-effort cleanup of whatever `beforeLaunch` provisioned. `hula init` now scaffolds commented-out placeholders for both in generated configs.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- Removed the `deploymentStartup` hook and its Clerk/Auth0 preview-auto-login scaffold — unrelated to the new lifecycle hooks and superseded by `hula preview`'s built-in auto-login fallback.
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- Hook execution no longer runs through a shell on POSIX systems, so shell metacharacters in a hook's context (e.g. backticks in a PR title) can no longer be reinterpreted instead of passed through as literal text.
|
|
23
|
+
|
|
10
24
|
## [1.25.0] - 2026-08-23
|
|
11
25
|
|
|
12
26
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAiHhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmBrE"}
|
package/dist/commands/approve.js
CHANGED
|
@@ -6,6 +6,7 @@ import { searchSelect, UserCancelledError } from "../utils/prompts.js";
|
|
|
6
6
|
import { GitService } from "../services/git/GitService.js";
|
|
7
7
|
import { WorktreeService } from "../services/git/WorktreeService.js";
|
|
8
8
|
import { runCommand } from "../utils/shell.js";
|
|
9
|
+
import { HookExecutor } from "../services/hooks/HookExecutor.js";
|
|
9
10
|
/**
|
|
10
11
|
* Best-effort: after a successful remote merge, fast-forward the project
|
|
11
12
|
* root's local default branch to match origin.
|
|
@@ -302,6 +303,20 @@ async function executeMerge(config, issueNumberArg, options) {
|
|
|
302
303
|
// Update local root main to match the just-merged remote main
|
|
303
304
|
const rootMainUpdated = await updateRootMainBranch();
|
|
304
305
|
logger.debug(`Local main update: ${rootMainUpdated ? "succeeded" : "skipped"}`);
|
|
306
|
+
// Best-effort afterMerge hook — e.g. cleanup of a per-launch resource
|
|
307
|
+
// (a provisioned preview database branch, a deployment env var) created by
|
|
308
|
+
// a beforeLaunch hook. Never blocks: the merge has already succeeded.
|
|
309
|
+
if (config.hooks?.afterMerge) {
|
|
310
|
+
const hookExecutor = new HookExecutor();
|
|
311
|
+
if (hookExecutor.exists(config.hooks.afterMerge)) {
|
|
312
|
+
await hookExecutor.execute(config.hooks.afterMerge, {
|
|
313
|
+
issueNumber,
|
|
314
|
+
prNumber,
|
|
315
|
+
prTitle: pr.title,
|
|
316
|
+
branch: pr.head.ref,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
305
320
|
logger.blank();
|
|
306
321
|
logger.success("═══════════════════════════════════════════════════════");
|
|
307
322
|
logger.success("✨ Merge Complete!");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
2
|
import type { Config } from '../types/index.js';
|
|
3
|
+
import type { HooksConfig } from '../types/config.schema.js';
|
|
3
4
|
/**
|
|
4
5
|
* Idempotently append a `.gitignore` entry with its own comment header, if
|
|
5
6
|
* `marker` isn't already present in `content`. Pure/sync so the append logic is
|
|
@@ -61,9 +62,18 @@ export declare function needsLoginChain(hulaApiKey: string | undefined, tokenDat
|
|
|
61
62
|
*/
|
|
62
63
|
export declare function initCommand(program: Command, _config: Config): void;
|
|
63
64
|
/**
|
|
64
|
-
*
|
|
65
|
+
* Build the `hooks: { ... }` config section. A key already present in the
|
|
66
|
+
* existing/merged config is written as a real, uncommented line and never
|
|
67
|
+
* overridden. Each key in HOOK_KEY_DEFAULTS additionally gets a commented-out
|
|
68
|
+
* placeholder when absent, so those hook points stay discoverable without
|
|
69
|
+
* reading docs. Any other configured hook key (valid per HooksSchema, just
|
|
70
|
+
* not advertised) is still preserved as a real line — it is never dropped.
|
|
65
71
|
*/
|
|
66
|
-
export declare function
|
|
72
|
+
export declare function buildHooksConfigSection(hooks: HooksConfig | undefined): string;
|
|
73
|
+
/**
|
|
74
|
+
* Generate hook directory structure with documentation
|
|
75
|
+
*/
|
|
76
|
+
export declare function generateHookTemplates(projectRoot: string): Promise<void>;
|
|
67
77
|
/**
|
|
68
78
|
* Ensure the `.hublaunch/skills/` action-file directory exists.
|
|
69
79
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAa9E;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,MAAM,CAIR;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,qBAAqB,aAiBhC,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,aAG/B,CAAC;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAiB9E;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,OAAO,GAAG,IAAI,GACxB,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA2BnE;AAqKD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAc9E;AA2ID;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAyED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQlF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,OAAO,GAC1B,OAAO,CAAC,IAAI,CAAC,CAmEf;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC5E;AAwED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD9E;AAsCD,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2pBhB"}
|
package/dist/commands/init.js
CHANGED
|
@@ -129,200 +129,60 @@ export function initCommand(program, _config) {
|
|
|
129
129
|
}
|
|
130
130
|
});
|
|
131
131
|
}
|
|
132
|
-
|
|
133
|
-
* Get the deployment startup script template based on auth provider
|
|
134
|
-
*/
|
|
135
|
-
function getDeploymentStartupTemplate(authProvider) {
|
|
136
|
-
const header = `#!/usr/bin/env tsx
|
|
137
|
-
/**
|
|
138
|
-
* Deployment Startup Script
|
|
139
|
-
* Automatically logs in to preview deployment before opening
|
|
140
|
-
*
|
|
141
|
-
* Context passed as first argument (JSON string):
|
|
142
|
-
* {
|
|
143
|
-
* deploymentUrl: string;
|
|
144
|
-
* issueNumber?: number;
|
|
145
|
-
* prNumber?: number;
|
|
146
|
-
* prTitle?: string;
|
|
147
|
-
* prUrl?: string;
|
|
148
|
-
* }
|
|
149
|
-
*/
|
|
150
|
-
|
|
151
|
-
import { chromium } from "@playwright/test";
|
|
152
|
-
|
|
153
|
-
interface HookContext {
|
|
154
|
-
deploymentUrl: string;
|
|
155
|
-
issueNumber?: number;
|
|
156
|
-
prNumber?: number;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
async function main() {
|
|
160
|
-
const contextJson = process.argv[2];
|
|
161
|
-
if (!contextJson) {
|
|
162
|
-
console.error("Error: No context provided");
|
|
163
|
-
process.exit(1);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
const context: HookContext = JSON.parse(contextJson);
|
|
167
|
-
console.log(\`🚀 Starting preview for: \${context.deploymentUrl}\`);
|
|
168
|
-
|
|
169
|
-
// Browser headless mode: Use env var or default to visible
|
|
170
|
-
const headless = process.env.CI === "true" || process.env.HEADLESS === "true";
|
|
171
|
-
|
|
172
|
-
const browser = await chromium.launch({
|
|
173
|
-
headless,
|
|
174
|
-
slowMo: headless ? 0 : 100,
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
const page = await browser.newPage();
|
|
178
|
-
|
|
179
|
-
try {
|
|
180
|
-
await page.goto(context.deploymentUrl);
|
|
181
|
-
`;
|
|
182
|
-
if (authProvider === 'clerk') {
|
|
183
|
-
return (header +
|
|
184
|
-
`
|
|
185
|
-
// Wait for Clerk authentication widget
|
|
186
|
-
await page.waitForSelector('[data-clerk-id]', { timeout: 5000 });
|
|
187
|
-
|
|
188
|
-
// Click sign-in button
|
|
189
|
-
await page.click('button:has-text("Sign in")');
|
|
190
|
-
|
|
191
|
-
// Fill in credentials from environment
|
|
192
|
-
const email = process.env.TEST_USER_EMAIL;
|
|
193
|
-
const password = process.env.TEST_USER_PASSWORD;
|
|
194
|
-
|
|
195
|
-
if (!email || !password) {
|
|
196
|
-
throw new Error(
|
|
197
|
-
"Required: TEST_USER_EMAIL and TEST_USER_PASSWORD environment variables"
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// Enter email
|
|
202
|
-
await page.fill('input[name="identifier"]', email);
|
|
203
|
-
await page.click('button:has-text("Continue")');
|
|
204
|
-
|
|
205
|
-
// Enter password
|
|
206
|
-
await page.fill('input[name="password"]', password);
|
|
207
|
-
await page.click('button:has-text("Continue")');
|
|
208
|
-
|
|
209
|
-
// Wait for successful login
|
|
210
|
-
await page.waitForURL(\`\${context.deploymentUrl}/**\`, {
|
|
211
|
-
timeout: 10000
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
console.log("✅ Successfully logged in with Clerk!");
|
|
215
|
-
console.log("Browser will remain open for testing.");
|
|
216
|
-
|
|
217
|
-
// Keep browser open - user closes when done
|
|
218
|
-
// Don't call browser.close()
|
|
219
|
-
|
|
220
|
-
} catch (error) {
|
|
221
|
-
console.error("❌ Login failed:", error);
|
|
222
|
-
await browser.close();
|
|
223
|
-
process.exit(1);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
main().catch(console.error);
|
|
228
|
-
`);
|
|
229
|
-
}
|
|
230
|
-
if (authProvider === 'auth0') {
|
|
231
|
-
return (header +
|
|
232
|
-
`
|
|
233
|
-
// Wait for Auth0 login form
|
|
234
|
-
await page.waitForSelector('[name="username"]', { timeout: 5000 });
|
|
235
|
-
|
|
236
|
-
// Fill in credentials from environment
|
|
237
|
-
const email = process.env.TEST_USER_EMAIL;
|
|
238
|
-
const password = process.env.TEST_USER_PASSWORD;
|
|
239
|
-
|
|
240
|
-
if (!email || !password) {
|
|
241
|
-
throw new Error(
|
|
242
|
-
"Required: TEST_USER_EMAIL and TEST_USER_PASSWORD environment variables"
|
|
243
|
-
);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// Auth0 login flow
|
|
247
|
-
await page.fill('input[name="username"]', email);
|
|
248
|
-
await page.fill('input[name="password"]', password);
|
|
249
|
-
await page.click('button[type="submit"]');
|
|
250
|
-
|
|
251
|
-
// Wait for redirect back to app
|
|
252
|
-
await page.waitForURL(\`\${context.deploymentUrl}/**\`, {
|
|
253
|
-
timeout: 10000
|
|
254
|
-
});
|
|
132
|
+
const HOOKS_README_TEMPLATE = `# HubLaunch Hooks
|
|
255
133
|
|
|
256
|
-
|
|
257
|
-
console.log("Browser will remain open for testing.");
|
|
134
|
+
This directory contains project-specific hooks that extend HubLaunch functionality.
|
|
258
135
|
|
|
259
|
-
|
|
260
|
-
console.error("❌ Login failed:", error);
|
|
261
|
-
await browser.close();
|
|
262
|
-
process.exit(1);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
136
|
+
## Available Hooks
|
|
265
137
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
// await browser.close();
|
|
286
|
-
|
|
287
|
-
} catch (error) {
|
|
288
|
-
console.error("❌ Preview setup failed:", error);
|
|
289
|
-
await browser.close();
|
|
290
|
-
process.exit(1);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
138
|
+
### \`beforeLaunch.ts\`
|
|
139
|
+
Runs **before** \`hula launch\` sends its launch request, so a project can
|
|
140
|
+
provision a freshly-created, per-launch resource (e.g. a database branch) and
|
|
141
|
+
inject its connection string into the container.
|
|
142
|
+
|
|
143
|
+
- On success it must print \`{"envVars": {"KEY": "value", ...}}\` to **stdout**.
|
|
144
|
+
Those values are merged into the launch request's \`envVars\`, taking
|
|
145
|
+
precedence over any \`.env\`-sourced values with the same key.
|
|
146
|
+
- **A nonzero exit, or stdout that is not valid \`{"envVars": {...}}\` JSON,
|
|
147
|
+
aborts the launch** — no request is sent. (Launching against the wrong
|
|
148
|
+
resource, e.g. a shared database, is worse than not launching.)
|
|
149
|
+
- **stderr streams live** to your terminal, so you can watch the hook's
|
|
150
|
+
progress (it may make several seconds of API calls).
|
|
151
|
+
- Printing nothing, \`{}\`, or \`{"envVars": {}}\` is a valid no-op — the launch
|
|
152
|
+
proceeds with no injected variables.
|
|
153
|
+
- The hook is responsible for its own **find-or-create idempotency**: a
|
|
154
|
+
kill-and-relaunch runs \`beforeLaunch\` again with the same context, so key
|
|
155
|
+
your resource off \`issueName\`/\`planPath\` and reuse an existing resource
|
|
156
|
+
rather than creating a duplicate.
|
|
293
157
|
|
|
294
|
-
|
|
295
|
-
|
|
158
|
+
**Context Provided**:
|
|
159
|
+
\`\`\`typescript
|
|
160
|
+
{
|
|
161
|
+
issueName: string; // The launch's issue/plan name
|
|
162
|
+
planPath: string; // Path to the plan being launched
|
|
296
163
|
}
|
|
297
|
-
|
|
164
|
+
\`\`\`
|
|
298
165
|
|
|
299
|
-
|
|
166
|
+
---
|
|
300
167
|
|
|
301
|
-
|
|
168
|
+
### \`afterMerge.ts\`
|
|
169
|
+
Runs **after** \`hula approve\` successfully merges a PR. Use it to clean up
|
|
170
|
+
whatever a \`beforeLaunch\` hook provisioned (e.g. delete the per-launch
|
|
171
|
+
database branch).
|
|
302
172
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
- **Authentication** (Clerk, Auth0, custom login flows)
|
|
306
|
-
- **Browser automation** (Playwright-based interactions)
|
|
307
|
-
- **Test data seeding** (API calls to populate data)
|
|
308
|
-
- **Environment setup** (configure local state)
|
|
173
|
+
- **Best-effort**: a failure only logs a warning — it never fails the merge,
|
|
174
|
+
which has already completed by the time this hook runs.
|
|
309
175
|
|
|
310
176
|
**Context Provided**:
|
|
311
177
|
\`\`\`typescript
|
|
312
178
|
{
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
prUrl?: string; // PR URL
|
|
179
|
+
issueNumber: number; // Associated issue number
|
|
180
|
+
prNumber: number; // Merged PR number
|
|
181
|
+
prTitle: string; // Merged PR title
|
|
182
|
+
branch: string; // The merged PR's source branch
|
|
318
183
|
}
|
|
319
184
|
\`\`\`
|
|
320
185
|
|
|
321
|
-
**Usage**:
|
|
322
|
-
- Configured in \`.hublaunch/hublaunch.config.ts\`
|
|
323
|
-
- Runs automatically when you run \`hula preview\`
|
|
324
|
-
- Runs in **background** (non-blocking)
|
|
325
|
-
|
|
326
186
|
---
|
|
327
187
|
|
|
328
188
|
## Creating Custom Hooks
|
|
@@ -372,11 +232,8 @@ export const config = {
|
|
|
372
232
|
// ... other config ...
|
|
373
233
|
|
|
374
234
|
hooks: {
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
afterPreview: ".hublaunch/hooks/afterPreview.ts", // optional
|
|
378
|
-
beforeMerge: ".hublaunch/hooks/beforeMerge.ts", // optional
|
|
379
|
-
afterMerge: ".hublaunch/hooks/afterMerge.ts", // optional
|
|
235
|
+
beforeLaunch: ".hublaunch/hooks/beforeLaunch.ts", // optional — inject per-launch env vars
|
|
236
|
+
afterMerge: ".hublaunch/hooks/afterMerge.ts", // optional — cleanup after merge
|
|
380
237
|
},
|
|
381
238
|
};
|
|
382
239
|
\`\`\`
|
|
@@ -409,10 +266,10 @@ Run hook manually for testing:
|
|
|
409
266
|
|
|
410
267
|
\`\`\`bash
|
|
411
268
|
# Test with sample context
|
|
412
|
-
tsx .hublaunch/hooks/
|
|
269
|
+
tsx .hublaunch/hooks/beforeLaunch.ts '{"issueName":"my-feature","planPath":".hublaunch/plans/my-feature.md"}'
|
|
413
270
|
|
|
414
271
|
# Enable debug mode
|
|
415
|
-
DEBUG=true tsx .hublaunch/hooks/
|
|
272
|
+
DEBUG=true tsx .hublaunch/hooks/beforeLaunch.ts '{"issueName":"my-feature","planPath":".hublaunch/plans/my-feature.md"}'
|
|
416
273
|
\`\`\`
|
|
417
274
|
|
|
418
275
|
---
|
|
@@ -423,6 +280,39 @@ DEBUG=true tsx .hublaunch/hooks/deploymentStartupScript.ts '{"deploymentUrl":"ht
|
|
|
423
280
|
- **Examples**: https://github.com/YizYah/hub-launch/tree/main/examples
|
|
424
281
|
- **Support**: https://github.com/YizYah/hub-launch/issues
|
|
425
282
|
`;
|
|
283
|
+
// Hook keys advertised as a commented-out placeholder when not yet
|
|
284
|
+
// configured. Order here is the order their lines are written to the
|
|
285
|
+
// generated config. Deliberately not every HooksSchema key — beforePreview,
|
|
286
|
+
// afterPreview, beforeMerge, and deploymentShutdown are valid config keys but
|
|
287
|
+
// are not suggested by init (see the fallback loop below, which still
|
|
288
|
+
// preserves any of them if a config already has one set).
|
|
289
|
+
const HOOK_KEY_DEFAULTS = [
|
|
290
|
+
{ key: 'beforeLaunch', defaultPath: '.hublaunch/hooks/beforeLaunch.ts' },
|
|
291
|
+
{ key: 'afterMerge', defaultPath: '.hublaunch/hooks/afterMerge.ts' },
|
|
292
|
+
];
|
|
293
|
+
/**
|
|
294
|
+
* Build the `hooks: { ... }` config section. A key already present in the
|
|
295
|
+
* existing/merged config is written as a real, uncommented line and never
|
|
296
|
+
* overridden. Each key in HOOK_KEY_DEFAULTS additionally gets a commented-out
|
|
297
|
+
* placeholder when absent, so those hook points stay discoverable without
|
|
298
|
+
* reading docs. Any other configured hook key (valid per HooksSchema, just
|
|
299
|
+
* not advertised) is still preserved as a real line — it is never dropped.
|
|
300
|
+
*/
|
|
301
|
+
export function buildHooksConfigSection(hooks) {
|
|
302
|
+
const advertisedKeys = new Set(HOOK_KEY_DEFAULTS.map((d) => d.key));
|
|
303
|
+
const lines = HOOK_KEY_DEFAULTS.map(({ key, defaultPath }) => {
|
|
304
|
+
const existingValue = hooks?.[key];
|
|
305
|
+
return existingValue
|
|
306
|
+
? ` ${key}: ${JSON.stringify(existingValue)},`
|
|
307
|
+
: ` // ${key}: ${JSON.stringify(defaultPath)},`;
|
|
308
|
+
});
|
|
309
|
+
for (const [key, value] of Object.entries(hooks ?? {})) {
|
|
310
|
+
if (value && !advertisedKeys.has(key)) {
|
|
311
|
+
lines.push(` ${key}: ${JSON.stringify(value)},`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return `\n\n // Lifecycle hooks\n hooks: {\n${lines.join('\n')}\n },`;
|
|
315
|
+
}
|
|
426
316
|
const ADAPTERS_README_TEMPLATE = `# HubLaunch Adapters
|
|
427
317
|
|
|
428
318
|
This directory contains custom service adapters for extending HubLaunch functionality.
|
|
@@ -558,27 +448,13 @@ Templates are automatically detected and used by HubLaunch when creating issues
|
|
|
558
448
|
\`\`\`
|
|
559
449
|
`;
|
|
560
450
|
/**
|
|
561
|
-
* Generate hook
|
|
451
|
+
* Generate hook directory structure with documentation
|
|
562
452
|
*/
|
|
563
|
-
export async function generateHookTemplates(projectRoot
|
|
453
|
+
export async function generateHookTemplates(projectRoot) {
|
|
564
454
|
const hooksDir = join(projectRoot, '.hublaunch/hooks');
|
|
565
455
|
// Create hooks directory
|
|
566
456
|
await mkdir(hooksDir, { recursive: true });
|
|
567
457
|
logger.success(`Created directory: .hublaunch/hooks/`);
|
|
568
|
-
// Generate deploymentStartupScript.ts template based on auth provider
|
|
569
|
-
// Only create if auth provider is configured (not "none"). An existing script
|
|
570
|
-
// is never overwritten — the user may have customized it.
|
|
571
|
-
if (authProvider !== 'none') {
|
|
572
|
-
const startupScriptPath = join(hooksDir, 'deploymentStartupScript.ts');
|
|
573
|
-
if (!existsSync(startupScriptPath)) {
|
|
574
|
-
const template = getDeploymentStartupTemplate(authProvider);
|
|
575
|
-
await writeFile(startupScriptPath, template, 'utf-8');
|
|
576
|
-
logger.success(`Created: .hublaunch/hooks/deploymentStartupScript.ts`);
|
|
577
|
-
}
|
|
578
|
-
else {
|
|
579
|
-
logger.info('Keeping existing deploymentStartupScript.ts');
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
458
|
// Generate README for hooks
|
|
583
459
|
const readmePath = join(hooksDir, 'README.md');
|
|
584
460
|
if (!existsSync(readmePath)) {
|
|
@@ -1076,12 +952,6 @@ export async function executeInit(options) {
|
|
|
1076
952
|
},
|
|
1077
953
|
};
|
|
1078
954
|
}
|
|
1079
|
-
// Add hooks if configured
|
|
1080
|
-
if (authProvider !== 'none') {
|
|
1081
|
-
baseConfig.hooks = {
|
|
1082
|
-
deploymentStartup: '.hublaunch/hooks/deploymentStartupScript.ts',
|
|
1083
|
-
};
|
|
1084
|
-
}
|
|
1085
955
|
// Merge with existing config (existing values take precedence)
|
|
1086
956
|
const finalConfig = existingConfig
|
|
1087
957
|
? mergeConfigs(existingConfig, baseConfig)
|
|
@@ -1104,10 +974,11 @@ export async function executeInit(options) {
|
|
|
1104
974
|
const cliVersion = getCliVersion();
|
|
1105
975
|
if (cliVersion)
|
|
1106
976
|
finalConfig.version = cliVersion;
|
|
1107
|
-
// Generate hooks config section
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
977
|
+
// Generate hooks config section. Always emitted: every known hook key gets
|
|
978
|
+
// a line — a real, uncommented value when already configured (never
|
|
979
|
+
// overridden), otherwise a commented-out placeholder so the available hook
|
|
980
|
+
// points are discoverable without reading docs.
|
|
981
|
+
const hooksConfigSection = buildHooksConfigSection(finalConfig.hooks);
|
|
1111
982
|
// Generate services config section without credentials (omitted when not configured)
|
|
1112
983
|
const servicesConfigSection = finalConfig.services
|
|
1113
984
|
? `\n\n // Service configuration\n services: ${JSON.stringify(finalConfig.services, null, 2).replace(/\n/g, '\n ')},`
|
|
@@ -1289,10 +1160,10 @@ ${envVarsLine}${stepsLine}${buildPreservedSection(finalConfig)}
|
|
|
1289
1160
|
logger.info(`ℹ️ .env file already exists at ${envPath} - skipping to preserve your existing configuration`);
|
|
1290
1161
|
logger.info(' Add any required environment variables manually if needed');
|
|
1291
1162
|
}
|
|
1292
|
-
// Always generate hooks directory structure (with README
|
|
1163
|
+
// Always generate hooks directory structure (with README)
|
|
1293
1164
|
logger.blank();
|
|
1294
1165
|
logger.info('Generating hooks directory structure...');
|
|
1295
|
-
await generateHookTemplates(repoRoot
|
|
1166
|
+
await generateHookTemplates(repoRoot);
|
|
1296
1167
|
// Always generate adapters directory structure
|
|
1297
1168
|
logger.blank();
|
|
1298
1169
|
logger.info('Generating adapter directory structure...');
|
|
@@ -1362,9 +1233,6 @@ ${envVarsLine}${stepsLine}${buildPreservedSection(finalConfig)}
|
|
|
1362
1233
|
logger.listItem('- TEST_USER_PASSWORD: Test user password', 2);
|
|
1363
1234
|
logger.blank();
|
|
1364
1235
|
}
|
|
1365
|
-
if (authProvider !== 'none') {
|
|
1366
|
-
logger.listItem('Customize .hublaunch/hooks/deploymentStartupScript.ts as needed', 1);
|
|
1367
|
-
}
|
|
1368
1236
|
if (showLoginHint) {
|
|
1369
1237
|
logger.listItem("Run 'hula login' to authenticate.", 1);
|
|
1370
1238
|
}
|