hub-launch 1.21.0 → 1.22.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.
Files changed (44) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +54 -0
  3. package/dist/commands/launch.d.ts +91 -0
  4. package/dist/commands/launch.d.ts.map +1 -1
  5. package/dist/commands/launch.js +831 -143
  6. package/dist/commands/launch.js.map +1 -1
  7. package/dist/commands/upload.d.ts +9 -2
  8. package/dist/commands/upload.d.ts.map +1 -1
  9. package/dist/commands/upload.js +16 -6
  10. package/dist/commands/upload.js.map +1 -1
  11. package/dist/scripts/launch-run.d.ts +6 -0
  12. package/dist/scripts/launch-run.d.ts.map +1 -1
  13. package/dist/scripts/launch-run.js +70 -9
  14. package/dist/scripts/launch-run.js.map +1 -1
  15. package/dist/services/api/HulaApiClient.d.ts +53 -0
  16. package/dist/services/api/HulaApiClient.d.ts.map +1 -1
  17. package/dist/services/api/HulaApiClient.js +18 -0
  18. package/dist/services/api/HulaApiClient.js.map +1 -1
  19. package/dist/services/git/FilePublishService.d.ts +9 -1
  20. package/dist/services/git/FilePublishService.d.ts.map +1 -1
  21. package/dist/services/git/FilePublishService.js +13 -3
  22. package/dist/services/git/FilePublishService.js.map +1 -1
  23. package/dist/services/git/GitService.d.ts +19 -0
  24. package/dist/services/git/GitService.d.ts.map +1 -1
  25. package/dist/services/git/GitService.js +56 -31
  26. package/dist/services/git/GitService.js.map +1 -1
  27. package/dist/services/git/WorktreeService.d.ts +9 -0
  28. package/dist/services/git/WorktreeService.d.ts.map +1 -1
  29. package/dist/services/git/WorktreeService.js +6 -3
  30. package/dist/services/git/WorktreeService.js.map +1 -1
  31. package/dist/services/group/GroupLaunchService.d.ts +230 -0
  32. package/dist/services/group/GroupLaunchService.d.ts.map +1 -0
  33. package/dist/services/group/GroupLaunchService.js +282 -0
  34. package/dist/services/group/GroupLaunchService.js.map +1 -0
  35. package/dist/templates/skills/hula-launch/SKILL.md +38 -1
  36. package/dist/utils/github-cli.d.ts +1 -1
  37. package/dist/utils/github-cli.d.ts.map +1 -1
  38. package/dist/utils/github-cli.js +15 -7
  39. package/dist/utils/github-cli.js.map +1 -1
  40. package/dist/utils/project-resolver.d.ts +1 -1
  41. package/dist/utils/project-resolver.d.ts.map +1 -1
  42. package/dist/utils/project-resolver.js +2 -2
  43. package/dist/utils/project-resolver.js.map +1 -1
  44. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.22.0] - 2026-08-12
11
+
12
+ ### Added
13
+
14
+ - Multi-repo feature groups: client-side `--folder` fan-out enables launching and checking status across a group of repositories from a single parent folder (group launch, group status).
15
+
16
+ ### Fixed
17
+
18
+ - `--folder` group launch now works when invoked from the `/hula-launch` Agent Skill in non-TTY environments (#344).
19
+
10
20
  ## [1.21.0] - 2026-08-06
11
21
 
12
22
  ### Added
package/README.md CHANGED
@@ -131,6 +131,60 @@ Full details: [Commands Reference](./docs/commands.md) ·
131
131
  [Advanced Usage](./docs/advanced.md) (launch pipeline internals, resume,
132
132
  test mode, env forwarding, scheduling).
133
133
 
134
+ ## Multi-repo feature groups
135
+
136
+ A feature that spans several repositories — say a mobile app plus its backend
137
+ API — can be launched as **one correlated group** instead of unrelated jobs you
138
+ track by memory. Keep the repos as sibling checkouts under one parent folder,
139
+ each already `hula init`'d and `hula login`'d with its own project-scoped API
140
+ key:
141
+
142
+ ```
143
+ ~/code/myapp/
144
+ ├── mobile/ (.git + .hublaunch)
145
+ └── api/ (.git + .hublaunch)
146
+ ```
147
+
148
+ Then launch the whole group with one command:
149
+
150
+ ```bash
151
+ # Launch the plan in every initialized repo under ~/code/myapp as one group.
152
+ # The CLI resolves each repo's newest plan matching the issue name, shows a
153
+ # roster, asks once to confirm, then launches each repo with its OWN key plus a
154
+ # shared generated groupId (e.g. login-a3f9c1).
155
+ hula launch login --folder ~/code/myapp
156
+
157
+ # Override the auto-resolved plan for one repo (repeatable, path is repo-relative)
158
+ hula launch login --folder ~/code/myapp --plan api=.hublaunch/plans/2026-08-10-11:00-login-api.md
159
+
160
+ # Retry a failed member into the SAME group (idempotent per member)
161
+ hula launch login --folder ~/code/myapp --group-id login-a3f9c1
162
+
163
+ # Combined group status — run inside any member repo, or pass the id explicitly
164
+ hula launch --show-group login-a3f9c1
165
+
166
+ # Stop every member's in-flight task
167
+ hula launch login --folder ~/code/myapp --kill
168
+ ```
169
+
170
+ | Flag | What it does |
171
+ | ----------------------- | -------------------------------------------------------------------------------------------------- |
172
+ | `--folder <path>` | Launch the plan in every initialized repo **directly under** `<path>` as one feature group |
173
+ | `--group-id <id>` | Use/join an explicit group id instead of generating one (`^[A-Za-z0-9_-]{1,64}$`) |
174
+ | `--plan <repo>=<path>` | Override the auto-resolved plan for one repo (repeatable; `<path>` is relative to that repo's root) |
175
+ | `--show-group [id]` | Show combined per-repo status; the id is optional inside a member repo (uses the latest local record)|
176
+
177
+ > ⚠️ **`hula launch --folder` is NOT the same as `/hula-plan --folder`.** For
178
+ > `launch`, `--folder` is the **parent folder that contains your repos**. For
179
+ > `/hula-plan`, `--folder` names a **plans subdirectory** inside a single repo.
180
+ > The two flags share a name but mean different things — never conflate them.
181
+
182
+ Each grouped launch is an ordinary single-repo job (billed and gated
183
+ individually) that simply carries a shared `groupId`. Grouping and
184
+ `--show-group` require a **hula-server with feature-group support**; against an
185
+ older server launches still succeed but stay ungrouped and `--show-group`
186
+ returns a not-found message.
187
+
134
188
  ## Demo
135
189
 
136
190
  <a href="https://www.youtube.com/watch?v=4-YRVB7mQZ8" target="_blank">
@@ -7,6 +7,12 @@ import type { Config } from '../types/index.js';
7
7
  * Usage: hula launch --show <name>
8
8
  * Usage: hula launch --logs <name>
9
9
  */
10
+ /**
11
+ * Commander accumulator for the repeatable `--plan <repo>=<path>` option.
12
+ * Each occurrence is parsed as `repoName=relativePath` and merged into the
13
+ * override map. A missing `=` throws a clear error.
14
+ */
15
+ export declare function collectPlanOverrides(value: string, previous: Record<string, string>): Record<string, string>;
10
16
  export declare function launchCommand(program: Command, config: Config): void;
11
17
  interface LaunchOptions {
12
18
  url?: string;
@@ -34,6 +40,24 @@ interface LaunchOptions {
34
40
  containerDisk?: number;
35
41
  updateNotificationUrl?: string;
36
42
  updateNotificationNameTag?: string;
43
+ /** Parent folder containing sibling repos to fan out over. */
44
+ folder?: string;
45
+ /** Explicit group id (join/retry an existing group). */
46
+ groupId?: string;
47
+ /** Repeatable `--plan <repo>=<path>` overrides, keyed by repo directory name. */
48
+ plan?: Record<string, string>;
49
+ /**
50
+ * `--show-group [id]`: string when an id was given, `true` for the bare flag
51
+ * (resolve the latest local group record), undefined when not passed.
52
+ */
53
+ showGroup?: string | boolean;
54
+ /**
55
+ * `--yes`: skip the group-launch confirmation prompt and allow per-repo plan
56
+ * auto-resolve without a TTY. The /hula-launch skill path runs the CLI as a
57
+ * piped subprocess (never a TTY), so the skill passes this to opt in to the
58
+ * same auto-resolve + roster flow an interactive terminal gets.
59
+ */
60
+ yes?: boolean;
37
61
  }
38
62
  /**
39
63
  * Validate the `--kill` / `--kill-and-relaunch` flag combination.
@@ -51,6 +75,20 @@ export declare function validateKillFlags(options: LaunchOptions): string | null
51
75
  * `--kill` needs only the tracking name; every other mode needs a plan.
52
76
  */
53
77
  export declare function requiresPlanPath(options: LaunchOptions): boolean;
78
+ /**
79
+ * Validate the multi-repo `--folder` / `--group-id` / `--plan` flag matrix.
80
+ *
81
+ * - `--folder` resolves plans per repository, so it is incompatible with a
82
+ * positional `<planPath>` and with the read/resume flags `--show`, `--logs`,
83
+ * `--resume`, `--fix`.
84
+ * - `--plan` (per-repo override) only makes sense with `--folder`.
85
+ * - `--group-id` alone (no `--folder`) is allowed — it attaches a single-repo
86
+ * launch to an existing group.
87
+ * - `--kill --folder` is allowed (cancel-only fan-out).
88
+ *
89
+ * Returns an error message when the combination is invalid, or `null` when OK.
90
+ */
91
+ export declare function validateFolderFlags(options: LaunchOptions, hasPlanPathPositional: boolean): string | null;
54
92
  /**
55
93
  * Derive the request `conflictMode` from the CLI flags (plus an optional explicit
56
94
  * override used when re-invoking after an interactive 409 resolution).
@@ -84,6 +122,59 @@ export declare function resolveSteps(configSteps: Config['steps'], skipRegressio
84
122
  steps?: Record<string, unknown>;
85
123
  error?: string;
86
124
  };
125
+ /**
126
+ * Result of a single-repo launch attempt. In folder (group) mode this is
127
+ * captured per repo so the fan-out can continue past failures and print a
128
+ * summary; in single-repo mode a failure exits the process directly.
129
+ */
130
+ export interface RepoLaunchResult {
131
+ ok: boolean;
132
+ planId?: string;
133
+ status?: number;
134
+ message?: string;
135
+ }
136
+ /**
137
+ * Inputs to {@link buildRalphRunRequestBody}. Every optional field is omitted
138
+ * from the body when absent, keeping non-group / default request bodies
139
+ * byte-identical to the pre-fan-out CLI.
140
+ */
141
+ export interface RalphRunBodyInput {
142
+ issueName: string;
143
+ planPath: string;
144
+ repositoryId: string;
145
+ duration?: number;
146
+ /** From `--launch`; serialized as `ralphPath` for server compatibility. */
147
+ launchPath?: string;
148
+ worktree?: string | boolean;
149
+ resume?: number;
150
+ fix?: string;
151
+ regression?: boolean;
152
+ steps?: Record<string, unknown>;
153
+ test?: boolean;
154
+ conflictMode?: 'killAndRelaunch';
155
+ /** Maps to RalphRunRequest.groupId (hula-server PR #505). */
156
+ groupId?: string;
157
+ verbose?: boolean;
158
+ handoff?: string;
159
+ clientSessionId?: string;
160
+ anthropicApiKey: string;
161
+ containerResources?: {
162
+ cpu: number;
163
+ memory: number;
164
+ disk: number;
165
+ };
166
+ updateNotificationUrl?: string;
167
+ updateNotificationNameTag?: string;
168
+ githubToken?: string;
169
+ envVars?: Record<string, string>;
170
+ }
171
+ /**
172
+ * Assemble the `POST /api/v1/ralph-run` request body from already-resolved
173
+ * inputs. Fields are inserted in a fixed order and only when present, so a
174
+ * launch with no group flag produces a body byte-identical to the pre-fan-out
175
+ * CLI (verified by unit test — AC5).
176
+ */
177
+ export declare function buildRalphRunRequestBody(input: RalphRunBodyInput): Record<string, unknown>;
87
178
  /**
88
179
  * Handle API errors consistently
89
180
  * (exported for reuse by sibling commands, e.g. `hula info`)
@@ -1 +1 @@
1
- {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/commands/launch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AA6BhD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAwHpE;AAED,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC;AA2BD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAavE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAEhE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,EACtB,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,iBAAiB,GAAG,SAAS,CAI/B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAC5B,kBAAkB,EAAE,OAAO,GAAG,SAAS,EACvC,oBAAoB,EAAE,OAAO,GAAG,SAAS,GACxC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAkCrD;AAw+BD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAyBtE;AA+DD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAyCnE"}
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/commands/launch.ts"],"names":[],"mappings":"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"}