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 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;AAgHhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmBrE"}
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"}
@@ -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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"}
@@ -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
- * Generate hook templates based on authentication provider
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 generateHookTemplates(projectRoot: string, authProvider: string): Promise<void>;
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;AAehD;;;;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;AA4bD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Bf;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,CAuqBhB"}
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"}
@@ -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
- console.log("✅ Successfully logged in with Auth0!");
257
- console.log("Browser will remain open for testing.");
134
+ This directory contains project-specific hooks that extend HubLaunch functionality.
258
135
 
259
- } catch (error) {
260
- console.error("❌ Login failed:", error);
261
- await browser.close();
262
- process.exit(1);
263
- }
264
- }
136
+ ## Available Hooks
265
137
 
266
- main().catch(console.error);
267
- `);
268
- }
269
- // Generic template (no auth or custom)
270
- return (header +
271
- `
272
- // Add your custom preview initialization logic here
273
- //
274
- // Examples:
275
- // - Authenticate to deployment
276
- // - Seed test data via API
277
- // - Configure browser state
278
- // - Navigate to specific page
279
-
280
- console.log("✅ Preview setup complete!");
281
- console.log("Browser opened at:", context.deploymentUrl);
282
-
283
- // Optionally close browser after delay
284
- // await new Promise(resolve => setTimeout(resolve, 30000));
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
- main().catch(console.error);
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
- const HOOKS_README_TEMPLATE = `# HubLaunch Hooks
164
+ \`\`\`
298
165
 
299
- This directory contains project-specific hooks that extend HubLaunch functionality.
166
+ ---
300
167
 
301
- ## Available Hooks
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
- ### \`deploymentStartupScript.ts\`
304
- Runs before opening a preview deployment. Use for:
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
- deploymentUrl: string; // Preview deployment URL
314
- issueNumber?: number; // Associated issue number
315
- prNumber?: number; // Associated PR number
316
- prTitle?: string; // PR title
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
- deploymentStartup: ".hublaunch/hooks/deploymentStartupScript.ts",
376
- beforePreview: ".hublaunch/hooks/beforePreview.ts", // optional
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/deploymentStartupScript.ts '{"deploymentUrl":"https://example.com","prNumber":123}'
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/deploymentStartupScript.ts '{"deploymentUrl":"https://example.com"}'
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 templates based on authentication provider
451
+ * Generate hook directory structure with documentation
562
452
  */
563
- export async function generateHookTemplates(projectRoot, authProvider) {
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 (omitted entirely when not configured)
1108
- const hooksConfigSection = finalConfig.hooks
1109
- ? `\n\n // Lifecycle hooks\n hooks: ${JSON.stringify(finalConfig.hooks, null, 2).replace(/\n/g, '\n ')},`
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 and optionally script)
1163
+ // Always generate hooks directory structure (with README)
1293
1164
  logger.blank();
1294
1165
  logger.info('Generating hooks directory structure...');
1295
- await generateHookTemplates(repoRoot, authProvider);
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
  }