hub-launch 1.19.0 → 1.20.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 (64) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +101 -437
  3. package/dist/commands/{merge.d.ts → approve.d.ts} +2 -2
  4. package/dist/commands/approve.d.ts.map +1 -0
  5. package/dist/commands/{merge.js → approve.js} +4 -4
  6. package/dist/commands/approve.js.map +1 -0
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +6 -25
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/interactive.js +6 -6
  11. package/dist/commands/interactive.js.map +1 -1
  12. package/dist/commands/launch.d.ts +0 -2
  13. package/dist/commands/launch.d.ts.map +1 -1
  14. package/dist/commands/launch.js +1 -16
  15. package/dist/commands/launch.js.map +1 -1
  16. package/dist/commands/schedule.d.ts.map +1 -1
  17. package/dist/commands/schedule.js +5 -20
  18. package/dist/commands/schedule.js.map +1 -1
  19. package/dist/commands/script.d.ts +1 -1
  20. package/dist/commands/script.d.ts.map +1 -1
  21. package/dist/commands/script.js +2 -2
  22. package/dist/commands/script.js.map +1 -1
  23. package/dist/config/command-names.d.ts +1 -1
  24. package/dist/config/command-names.js +1 -1
  25. package/dist/config/command-names.js.map +1 -1
  26. package/dist/index.js +2 -2
  27. package/dist/index.js.map +1 -1
  28. package/dist/scripts/{merge-local.d.ts → approve-local.d.ts} +1 -1
  29. package/dist/scripts/approve-local.d.ts.map +1 -0
  30. package/dist/scripts/{merge-local.js → approve-local.js} +7 -7
  31. package/dist/scripts/approve-local.js.map +1 -0
  32. package/dist/scripts/{merge-remote.d.ts → approve-remote.d.ts} +3 -3
  33. package/dist/scripts/approve-remote.d.ts.map +1 -0
  34. package/dist/scripts/{merge-remote.js → approve-remote.js} +6 -6
  35. package/dist/scripts/approve-remote.js.map +1 -0
  36. package/dist/templates/planning-instructions.md +54 -0
  37. package/dist/templates/proceed-instructions.md +66 -8
  38. package/dist/templates/skills/{hula-merge → hula-approve}/SKILL.md +15 -15
  39. package/dist/templates/skills/hula-confirm/SKILL.md +18 -1
  40. package/dist/templates/skills/hula-create/SKILL.md +1 -1
  41. package/dist/templates/skills/hula-fix/SKILL.md +2 -2
  42. package/dist/templates/skills/hula-help/SKILL.md +3 -3
  43. package/dist/templates/skills/hula-info/SKILL.md +1 -1
  44. package/dist/templates/skills/hula-launch/SKILL.md +2 -2
  45. package/dist/templates/skills/hula-plan/SKILL.md +10 -9
  46. package/dist/templates/skills/hula-schedule/SKILL.md +1 -1
  47. package/dist/templates/skills/hula-upload/SKILL.md +1 -1
  48. package/dist/templates/skills/hula-verify/SKILL.md +1 -1
  49. package/dist/types/config.schema.d.ts +0 -6
  50. package/dist/types/config.schema.d.ts.map +1 -1
  51. package/dist/types/config.schema.js +0 -3
  52. package/dist/types/config.schema.js.map +1 -1
  53. package/dist/utils/ephemeral-credentials.d.ts +8 -10
  54. package/dist/utils/ephemeral-credentials.d.ts.map +1 -1
  55. package/dist/utils/ephemeral-credentials.js +8 -12
  56. package/dist/utils/ephemeral-credentials.js.map +1 -1
  57. package/package.json +1 -1
  58. package/scripts/postinstall.mjs +1 -1
  59. package/dist/commands/merge.d.ts.map +0 -1
  60. package/dist/commands/merge.js.map +0 -1
  61. package/dist/scripts/merge-local.d.ts.map +0 -1
  62. package/dist/scripts/merge-local.js.map +0 -1
  63. package/dist/scripts/merge-remote.d.ts.map +0 -1
  64. package/dist/scripts/merge-remote.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.20.0] - 2026-08-04
11
+
12
+ ### Added
13
+
14
+ - Added a one-plan-one-PR scope check to plan validation.
15
+ - Made `/hula-plan` output clearer with a summary, folded detail section, optional diagram, and pre-save checklist.
16
+
17
+ ### Changed
18
+
19
+ - Renamed the `hula-merge` Agent Skill to `hula-approve`, updating the CLI command, wrapper scripts, and docs.
20
+
21
+ ### Security
22
+
23
+ - Removed client-side Daytona API key handling.
24
+
25
+ ### Documentation
26
+
27
+ - Updated the plan/approve-first README, notifications guide, and skill descriptions.
28
+
10
29
  ## [1.19.0] - 2026-07-29
11
30
 
12
31
  ### Added
package/README.md CHANGED
@@ -1,508 +1,172 @@
1
1
  # hub-launch
2
2
 
3
- > **AI coding without the chaos**
3
+ > **You just plan and approve. AI does the rest.**
4
4
 
5
- AI coding agents write great code — but you're still stuck doing the busywork around them: creating issues, wrangling branches, monitoring runs, and cleaning up afterward. That constant context switching can be anything from disruptive to stressful. Anyone who knows how to code would agree that good development requires focus.
5
+ <p align="center">
6
+ <img src="./docs/assets/plan-approve-cycle.svg" alt="The cycle: you plan, AI implements, tests and opens a PR; you approve, AI merges and ships." width="640"/>
7
+ </p>
6
8
 
7
- hub-launch handles all of that by removing most of the interruptions and only requiring you to perform the critical steps of planning and review. Describe what you want to build, and it creates the GitHub issue, runs Claude Code in an isolated Daytona cloud container, and opens the PR for your review. Nothing touches your local machine or your current branch.
9
+ Describe what you want built. HubLaunch drafts an implementation plan with you,
10
+ validates it until it's self-contained, then implements it in a clean cloud
11
+ sandbox — tests run, PR opened, checked against the plan — and pings you when
12
+ it's your turn. Nothing runs on your machine, and nothing touches your current
13
+ branch.
8
14
 
9
- ```bash
10
- /hula-plan Add password reset support # generates plan, auto-validates
11
- /hula-launch password-reset-support # creates issue, starts AI session
12
- # (Claude Code writes the code, runs tests, pushes branch, opens PR)
13
- /hula-fix # perform any follow-up needed locally in a worktree
14
- /hula-merge # merge, close issue, restore branch
15
- ```
16
-
17
- That's the whole fundamental workflow.
18
-
19
- ## Demo
20
-
21
- <a href="https://www.youtube.com/watch?v=4-YRVB7mQZ8" target="_blank">
22
- <img src="./docs/assets/demo-preview.svg" alt="Watch hub-launch demo on YouTube" width="100%"/>
23
- </a>
24
-
25
- ## Why hub-launch?
26
-
27
- | Without hub-launch | With hub-launch |
28
- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
29
- | Several steps in the AI cycle, requiring interruptions | complete integration into Github, and many automated validation steps |
30
- | AI agent runs on your machine, taxing your local resources | ralph-like script on a container in a cloud — zero local overhead |
31
- | Coding work and progress clutters your workspace | Each issue runs in its own isolated container — safe and clean |
32
- | frequent switching between tools and sites | Everything orchestrated from your local agent session |
33
-
34
- ## Features
35
-
36
- - 🤖 **AI-Powered Workflow** — plan → launch → verify → merge skills that are run by your agent
37
- - 🔄 **Github Integration** — creating issues, hand-off if needed, generating PRs, merging and cleaning up
38
- - ☁️ **Cloud Container Isolation** — each issue runs in a dedicated cloud container, keeping your branch and environment clean
39
- - **Configurable** — we use a Ralph script which can be extended with custom lifecycle hooks, and you can configure locally several options
40
- - 🖥️ **Client Agnostic** — based on skills that can be adapted to most agent harnesses
41
- - 🔔 **Notifications** - you can configure an endpoint for notifications about progress. For instance, a slack channel.
42
- - 📋 **Logging** - run `hula-info` for progress in the container. Also pushes several documents within each PR showing logging.
43
- - 🧭 **Guided Help** — run `/hula-help` anytime for an interactive walkthrough of setup, the workflow, and any command or skill
44
- - 🖥️ **Dashboard** — track all your active plans at [https://www.hublaunch.site/dashboard](https://www.hublaunch.site/dashboard)
45
- - 🔒 **Safe** - tokens are maintained by you locally in your config file, and on our server securely protected and removed when no longer needed.
46
-
47
- ### The Workflow
48
-
49
- All users follow the same workflow:
50
-
51
- ```
52
- /hula-plan → /hula-launch → /hula-verify → /hula-fix (if needed)
53
- ```
54
-
55
- `/hula-launch` runs a full automated pipeline in a cloud container (Claude Code via Daytona) — it creates the GitHub issue, runs the implementation, executes tests, and opens a PR, all without touching your local machine. `/hula-verify` checks the PR against the plan's acceptance criteria, and `/hula-fix` addresses any gaps. `/hula-merge` merges and cleans up when you're ready.
56
-
57
- Visit [https://www.hublaunch.site](https://www.hublaunch.site) for plans and pricing.
58
-
59
- > ℹ️ Historically, HubLaunch offered a Free tier (`/hula-create`, which assigned issues to GitHub Copilot) alongside a Pro tier. The current workflow unifies on Claude Code via `/hula-launch` for all users. The legacy `/hula-create` command remains available for backward compatibility but is no longer the recommended path.
60
-
61
- ## Quick Start
62
-
63
- ```bash
64
- # 1. Install
65
- npm install -g hub-launch
66
- # or with pnpm
67
- pnpm add -g hub-launch
68
-
69
- # 2. Initialize in your project
70
- cd <your-project>
71
- hula init
72
-
73
- # 3. Use it
74
- hula launch <branch-name> # create the issue and start the AI coding session
75
- hula --help
76
- ```
77
-
78
- ### Upgrading
79
-
80
- After upgrading the CLI:
81
-
82
- ```bash
83
- npm install -g hub-launch@latest # or: pnpm add -g hub-launch
84
- ```
85
-
86
- re-run `hula init` inside each project to refresh the bundled Agent Skills and
87
- config scaffolding (workflow scripts and instruction docs now ship with the
88
- package, so they update automatically with the CLI):
15
+ ## The two commands
89
16
 
90
- ```bash
91
- cd <your-project>
92
- hula init # safe to re-run; preserves your keys and team settings
93
- ```
94
-
95
- The CLI reminds you automatically when a project was initialized with a
96
- different version than the one currently installed.
17
+ Everything happens inside your coding agent (e.g. Claude Code), as slash
18
+ commands. There are only two you need.
97
19
 
98
- ## Core Workflow
20
+ ### 1. Plan
99
21
 
100
- The primary use case is AI-assisted issue development via the hula-project server:
101
-
102
- ```bash
103
- # 1. Plan the feature
104
- # Validation runs automatically in the same session after the plan is saved.
105
- # When validation finishes, the assistant offers to launch right away with a
106
- # default issue name derived from the plan (reply "yes" to launch, or decline
107
- # and run /hula-launch <name> yourself later).
108
- # Add --autoLaunch (optionally with --test / --handoff <username>) to skip the
109
- # post-validation confirmation and launch immediately.
22
+ ```text
110
23
  /hula-plan Add password reset support
111
-
112
- # 2. Upload the plan to origin/main
113
- # (Optional — /hula-launch runs this automatically if skipped)
114
- # The upload auto-retries (fetch + rebase, up to 3 attempts) if origin/main
115
- # advances mid-push; a genuine conflict fails fast with a clear message.
116
- /hula-upload
117
-
118
- # 3. Launch — creates the issue and starts the AI coding session
119
- # Includes /hula-upload automatically, so step 2 can be omitted
120
- /hula-launch password-reset-support
121
-
122
- # 4. (AI coding agent works on the issue, creates a PR automatically)
123
-
124
- # 5. Apply any fixes needed on the PR branch
125
- /hula-fix the email validation is rejecting valid addresses
126
-
127
- # 6. Verify all acceptance criteria are met
128
- /hula-verify
129
-
130
- # 7. Merge and clean up
131
- # Equivalent to merging the PR manually on GitHub
132
- /hula-merge
133
- ```
134
-
135
- > 💡 `/hula-confirm` remains available as a standalone command for re-validating a plan you've edited by hand.
136
-
137
- Or directly via CLI:
138
-
139
- ```bash
140
- hula launch password-reset-support .hublaunch/plans/2026-05-07-17:00-password-reset.md
141
24
  ```
142
25
 
143
- ## Commands
144
-
145
- Top-level commands:
26
+ The plan skill asks clarifying questions, studies your codebase, and writes a
27
+ detailed implementation plan with acceptance criteria. It then validates the
28
+ plan until it stands completely on its own — no hidden chat context — and asks
29
+ one question: **ready to launch?**
146
30
 
147
- | Command | Alias | Description |
148
- | -------------- | ----- | ---------------------------------------------------------------- |
149
- | `hula` | `hl` | Main CLI |
150
- | `hula login` | — | Authenticate with GitHub + hula-project |
151
- | `hula init` | — | Initialize configuration |
152
- | `hula create` | — | Create issue from plan file |
153
- | `hula merge` | — | Merge PR and clean up |
154
- | `hula launch` | — | Trigger AI coding session on hula-project server |
155
- | `hula schedule` | — | Trigger or schedule an execute-action (e.g. `--built-in harden`) |
156
- | `hula script <name>` | — | Run a bundled cross-platform workflow script (used by the Agent Skills) |
157
- | `hula instructions <name>` | — | Print a bundled instruction doc (`planning`, `proceed`, `skill-creation`) |
158
- | `hula session-hook` | — | Claude Code PreToolUse hook that captures launch-session provenance |
31
+ Say yes, and the rest is automatic: a GitHub issue is created, a cloud sandbox
32
+ implements the plan, runs your checks and tests, opens a pull request, and
33
+ verifies the result against the plan — posting a merge-safety score so you know
34
+ what you're looking at before you look.
159
35
 
160
- Run `hula <command> --help` for details, or see the full [Commands Reference](./docs/commands.md).
36
+ Planning something big? One plan is one PR if a plan is really several PRs'
37
+ worth of work, validation says so and offers to split it into a sequence of
38
+ right-sized plans, each independently launched, verified, and approved.
161
39
 
162
- ### Cross-platform, low-footprint tooling
40
+ ### 2. Approve
163
41
 
164
- The workflow scripts and instruction documents that power the Agent Skills ship
165
- **inside the `hula` package** as cross-platform Node — they are no longer copied
166
- into your repo, and they need **no `bash` and no `jq`**, so they run identically
167
- on macOS, Linux, and Windows. `hula init` therefore does not write
168
- `.github/scripts/*.sh` or `.hublaunch/*-instructions.md`.
169
-
170
- Skills invoke them via the global bin:
171
-
172
- ```bash
173
- # Run a bundled workflow script (cross-platform, no bash/jq)
174
- hula script merge-local -- 42 ".hula-worktrees/issue-42" "fix(#42): message"
175
-
176
- # Print a bundled instruction document
177
- hula instructions planning
42
+ ```text
43
+ /hula-approve
178
44
  ```
179
45
 
180
- **Migration:** upgrading from an older version? Existing
181
- `.github/scripts/hula-*.sh` and `.hublaunch/*-instructions.md` keep working, but
182
- are now obsolete and safe to delete — `hula init` prints a reminder listing them
183
- (it never deletes anything).
184
-
185
- **Claude Code commands:** the `/hula-*` commands are available as a Claude Code
186
- plugin so they load globally, so `hula init` no longer writes `.claude/commands/*`
187
- symlinks by default. Prefer repo-local command files instead? Run
188
- `hula init --with-claude-commands`. The committed `.agents/skills/` directory
189
- (read by GitHub Copilot, Cursor, Codex, and 30+ tools) is unchanged.
190
-
191
- ## `hula launch` and Resume
192
-
193
- `hula launch` submits a job to the hula-project server, which runs an AI coding agent (Claude Code) through a fixed 9-step pipeline:
194
-
195
- | Step | Description |
196
- | ---- | ----------------------------------------------------------------------------- |
197
- | 1 | Change to worktree directory (worktree is created before the pipeline starts) |
198
- | 2 | Bug review & fix loop (LLM-based review with iterative fixes) |
199
- | 3 | Commit remaining changes |
200
- | 4 | TypeScript / lint check (`pnpm check`) |
201
- | 5 | Production build (`pnpm build`) |
202
- | 6 | Regression tests |
203
- | 7 | Push branch to origin |
204
- | 8 | Merge latest main |
205
- | 9 | Cleanup & create PR |
206
-
207
- > 💡 After a PR is merged, `hula merge` automatically fast-forwards your **local**
208
- > `main` at the project root to match `origin/main` — no manual `git pull` needed.
209
- > It is non-destructive (fast-forward only) and works even when run from inside a
210
- > worktree; it is skipped safely if local `main` can't fast-forward. When it is
211
- > skipped, `/hula-merge` reports the specific reason and the exact command to fix it.
212
-
213
- #### Troubleshooting `/hula-merge`
214
-
215
- **Q: My local `main` wasn't updated after the merge.**
216
-
217
- The fast-forward is best-effort and is skipped (never failing the merge) when:
218
-
219
- - **Uncommitted changes** at the project root — commit or stash them first:
220
- `git commit -am 'wip'` or `git stash`.
221
- - **On a different branch** — the project root isn't checked out on the default
222
- branch. Switch to it: `git checkout main`.
223
- - **Non-standard git config** — the project root worktree couldn't be located.
224
- Inspect with `git worktree list`.
225
- - **`git pull --ff-only` couldn't fast-forward** (e.g. diverged history or a
226
- network issue). Run it manually: `git pull --ff-only origin main`.
227
-
228
- `/hula-merge` prints the specific reason and remediation in its output, and its
229
- summary shows ⚠️ when the local update was skipped.
230
-
231
- Use `--resume <step>` to re-run from a specific step after a failure, without re-doing earlier steps:
232
-
233
- ```bash
234
- # Resume from step 4 (skips setup, bug review, and commit)
235
- hula launch my-issue .hublaunch/plans/my-plan.md --resume 4
236
-
237
- # Resume from step 7 with fix instructions
238
- hula launch my-issue .hublaunch/plans/my-plan.md --resume 7 --fix "address build warning in src/utils/shell.ts"
239
- ```
46
+ Review the verified PR and approve it. HubLaunch merges, closes the issue,
47
+ cleans up branches and worktrees, and fast-forwards your local `main`. Plan the
48
+ next thing.
240
49
 
241
- > **Note**: `--fix` requires `--resume` and passes instructions to the AI agent for that stage.
50
+ That's the whole loop. Everything between the two commands happens without you.
242
51
 
243
- Use `--test` for a fast end-to-end run: the server runs the full production
244
- pipeline but swaps the real Claude CLI for a mock, so it finishes in milliseconds
245
- without consuming Anthropic credits. **A real GitHub PR is still created**, so
246
- clean it up afterward.
52
+ ## Why it's different
247
53
 
248
- ```bash
249
- hula launch my-branch .hublaunch/plans/my-plan.md --test
250
- ```
54
+ - **Close your laptop** — work runs remotely in a clean sandbox. Nothing to
55
+ install in your project's environment, nothing hogging your machine; the run
56
+ keeps going when you walk away.
57
+ - **Real artifacts, not chat** — every task lands as a GitHub issue, branch,
58
+ and pull request in your repo. Your history reads like engineering, not
59
+ transcripts.
60
+ - **Verified before you see it** — every PR is checked against its plan's
61
+ acceptance criteria and scored before it reaches you. Approving is an
62
+ informed decision.
63
+ - **Interrupted only on purpose** — you're notified when it's your turn — plan
64
+ ready, PR verified — and only then.
251
65
 
252
- ### Stopping or replacing an in-flight task
66
+ ## Setup
253
67
 
254
- Use `--kill-and-relaunch` to cancel the task currently running for a tracking
255
- name and immediately launch a fresh one (stale state is reset server-side):
68
+ Once per machine:
256
69
 
257
70
  ```bash
258
- hula launch feature-auth .hublaunch/plans/2026-07-07-feature-auth.md --kill-and-relaunch
71
+ npm install -g hub-launch # or: pnpm add -g hub-launch
72
+ hula login # authenticate with GitHub + HubLaunch
259
73
  ```
260
74
 
261
- Use `--kill` to just stop the in-flight task without relaunching. It needs
262
- **only the branch name** — no plan path, and it sends no credentials:
75
+ Once per project:
263
76
 
264
77
  ```bash
265
- hula launch feature-auth --kill
266
- ```
267
-
268
- When there is nothing to cancel, `--kill` prints "No active task to cancel…" and
269
- exits 0 (a no-op is a success). `--kill` and `--kill-and-relaunch` are mutually
270
- exclusive, and `--kill` cannot be combined with launch-only flags (`--resume`,
271
- `--fix`, `--test`, `--handoff`, `--regression`).
272
-
273
- If you run a normal `hula launch` while a task is already running for that
274
- tracking name, the behavior depends on the context:
275
-
276
- - **In an interactive terminal**, you're shown recovery options — kill and
277
- relaunch, just stop the running task, resume from a step, or cancel — and the
278
- launch is re-invoked with the flag you pick.
279
- - **Non-interactively** (from the `/hula-launch` skill wrapper, CI, or a pipe),
280
- the server's message (which names the recovery flags) is printed and the
281
- process exits non-zero — no prompt, no hang.
282
-
283
- ### Forwarding environment variables to the container
284
-
285
- Tests that need credentials (a test user login, a third-party API key, etc.) can
286
- have those values forwarded from your local `.env` into the launch container.
287
- Configure this by listing the variable **names** in `envVars` in
288
- `.hublaunch/hublaunch.config.js`:
289
-
290
- ```js
291
- export const config = {
292
- // ...
293
- envVars: ["TEST_USER_EMAIL", "API_KEY"], // names only — values are read from .env
294
- };
78
+ cd <your-project>
79
+ hula init
295
80
  ```
296
81
 
297
- To forward **every** non-reserved variable from `.env` without listing each one,
298
- set `envVars` to the string `"all"`:
299
-
300
- ```js
301
- export const config = {
302
- // ...
303
- envVars: "all", // forward all non-reserved variables found in .env
304
- };
305
- ```
82
+ `hula init` walks you through configuration interactively and installs the
83
+ slash commands (Agent Skills) into your project, so `/hula-plan` and friends are
84
+ available the next time you open your agent. It's safe to re-run any time —
85
+ your keys and team settings are preserved — and you should re-run it after
86
+ upgrading the CLI.
306
87
 
307
- At launch time `hula launch` reads your project's `.env`, picks out exactly those
308
- variables, and includes them in the request to the server. Notes:
88
+ That's the only time you'll meaningfully touch the `hula` CLI: the rest of it
89
+ exists mostly for your agent to call on your behalf.
309
90
 
310
- - **Opt-in** only the names you list are forwarded (or, with `"all"`, every
311
- non-reserved variable in `.env`); nothing is sent by default, so existing
312
- configs are unaffected.
313
- - **Validated early** — if a listed variable is missing from `.env`, or the `.env`
314
- file is absent, `hula launch` fails before submitting the job.
315
- - **Reserved names blocked** — system/internal variables (e.g. `PATH`, `HOME`,
316
- `ANTHROPIC_API_KEY`, `AWS_SECRET_ACCESS_KEY`) cannot be forwarded.
317
- - Only forward variables your tests actually need; treat anything you list as
318
- leaving your machine.
91
+ **Requirements:** Node.js 18, the GitHub CLI (`gh`) authenticated via
92
+ `gh auth login`, and a Claude subscription (Pro or Max) for the sandbox agent.
319
93
 
320
- ### Configuring per-step model & iteration overrides
94
+ ## Notifications
321
95
 
322
- `hula launch` runs your plan through a fixed 9-step server-side pipeline. By
323
- default every step uses the server's built-in model, loop-iteration cap, and
324
- skip behavior. To override those per step for your project, add a `steps` block
325
- to `.hublaunch/hublaunch.config.js` (config-file only — this is a persistent
326
- project setting, not a per-launch flag):
96
+ HubLaunch tells you when it's your turn. Set `updateNotificationUrl` in
97
+ `.hublaunch/hublaunch.config.js` to any webhook a Slack channel works out of
98
+ the box, and Telegram or anything else works through a tiny bridge:
327
99
 
328
100
  ```js
329
101
  export const config = {
330
102
  // ...
331
- steps: {
332
- implementation: { model: "opus" },
333
- lintfix: { model: "haiku", maxIterations: 2 },
334
- regression: { skip: true },
335
- },
103
+ updateNotificationUrl: "https://hooks.slack.com/services/T0/B0/secret",
336
104
  };
337
105
  ```
338
106
 
339
- Each of the 9 keys maps to a pipeline step. All fields are optional; omit a step
340
- (or the whole `steps` block) to keep the server default:
341
-
342
- | Step key | `model` | `maxIterations` | `skip` | Other |
343
- | ---------------- | :-----: | :-------------: | :----: | ----- |
344
- | `implementation` | ✅ | | | |
345
- | `findBugs` | ✅ | ✅ (1–20) | | `diffMaxLines` (≥1), `excludeRegex` (string) |
346
- | `bugfix` | ✅ | | | |
347
- | `lintfix` | ✅ | ✅ (1–20) | | |
348
- | `build` | ✅ | ✅ (1–20) | | |
349
- | `regression` | | | ✅ | |
350
- | `mergeConflict` | ✅ | | | |
351
- | `summary` | ✅ | ✅ (1–20) | | |
352
- | `verify` | ✅ | ✅ (1–20) | ✅ | |
353
-
354
- `model` values are free-form strings passed straight through to the server
355
- (`claude --model <value>`); no allowlist is enforced. Values are validated at
356
- config-load time — an out-of-range `maxIterations`, a non-boolean `skip`, or an
357
- empty `model` string fails immediately with a clear error.
358
-
359
- #### `--skip-regression`
360
-
361
- As a per-launch counterpart to the config `steps.regression.skip`, `hula launch`
362
- accepts a `--skip-regression` flag that force-skips the regression-tests step for
363
- that one invocation (it wins over whatever `steps.regression.skip` is set to in
364
- config):
107
+ You'll get a message when the task starts, when the issue is created, and when
108
+ the PR is ready (with its verification score). See
109
+ [Notifications](./docs/notifications.md) for the payloads, a Telegram setup,
110
+ and ideas for automating your side of the loop with `hula info`.
365
111
 
366
- ```bash
367
- # Skip regression tests for a single launch
368
- hula launch feature-auth .hublaunch/plans/my-plan.md --skip-regression
369
- ```
112
+ ## Other commands
370
113
 
371
- #### Conflict rules (validated locally before any network call)
114
+ You'll rarely need these the two commands above cover the normal loop — but
115
+ they're there when you want them:
372
116
 
373
- Two combinations are rejected client-side — `hula launch` exits `1` immediately
374
- with the same message the server would return, so misconfigurations fail fast:
117
+ | Command | What it's for |
118
+ | ---------------- | ----------------------------------------------------------------------------------- |
119
+ | `/hula-fix` | Fix a gap or bug on the PR branch in an isolated worktree — describe the problem |
120
+ | `/hula-verify` | Full verification report, criterion by criterion (a summary score is auto-posted) |
121
+ | `/hula-info` | Peek at a run: live logs, PR diff, initial summary, lessons |
122
+ | `/hula-launch` | Launch a plan manually (normally offered automatically after `/hula-plan`) |
123
+ | `/hula-confirm` | Re-validate a plan you've edited by hand |
124
+ | `/hula-upload` | Sync a plan to `origin/main` (normally automatic during launch) |
125
+ | `/hula-schedule` | Run or schedule autonomous actions (e.g. a nightly `harden` security audit) |
126
+ | `/hula-help` | Interactive onboarding and reference — walks through setup, the workflow, or any command/skill |
127
+ | `/hula-create` | Legacy: create an issue without launching (the modern flow is `/hula-plan` → launch) |
375
128
 
376
- - **`bugfix.model` `mergeConflict.model`** — both map to the same
377
- `RALPH_BUGFIX_MODEL` env var on the server, so they cannot be set to different
378
- values:
379
- `bugfix.model and mergeConflict.model both map to RALPH_BUGFIX_MODEL and cannot conflict`
380
- - **`regression.skip: true` combined with the legacy `--regression` flag** — one
381
- forces the step off, the other forces it on. This also covers passing both
382
- `--skip-regression` and `--regression`, and a config `steps.regression.skip:
383
- true` combined with a one-off `--regression`:
384
- `regression.skip and the legacy regression flag are contradictory`
129
+ Full details: [Commands Reference](./docs/commands.md) ·
130
+ [Advanced Usage](./docs/advanced.md) (launch pipeline internals, resume,
131
+ test mode, env forwarding, scheduling).
385
132
 
386
- ## `hula schedule`
387
-
388
- `hula schedule` triggers a built-in or custom execute-action (e.g. the `harden` security audit) on the hula-project server, which provisions a sandbox to run it and opens a PR / plan / feedback as the outcome.
389
-
390
- ```bash
391
- # Run the built-in harden action against src/
392
- hula schedule --built-in harden --entry-point src/
393
-
394
- # Run a custom action file
395
- hula schedule --action-path skills/my-action.md
396
-
397
- # Recurring schedule (cron)
398
- hula schedule --built-in harden --entry-point src/ --schedule "0 3 * * *"
399
- ```
400
-
401
- > **Tip**: prefer the `/hula-schedule` agent skill to drive this command from plain
402
- > language — e.g. `/hula-schedule harden src/ every night and open a PR`. It
403
- > translates schedule phrasing into cron and confirms before running.
404
- >
405
- > The skill can also **author an action from a description** and **manage** runs
406
- > and schedules conversationally:
407
- >
408
- > ```text
409
- > # Describe an action — the skill asks questions, writes & publishes the file, then runs it
410
- > /hula-schedule remove unreachable code in src/ every night and open a PR
411
- >
412
- > # Manage
413
- > /hula-schedule list
414
- > /hula-schedule show <runId>
415
- > /hula-schedule run now <scheduleId>
416
- > /hula-schedule cancel <scheduleId> # offers to delete the related action file
417
- > /hula-schedule update <scheduleId> cron to every Monday 9am
418
- > /hula-schedule update the skill file for <scheduleId> to also remove unused imports
419
- > ```
420
- >
421
- > Authored actions are written to `.hublaunch/skills/<YYYY-MM-DD-HH:MM-slug>.md`
422
- > and pushed to `origin/main` via a temporary worktree **before** the run (the
423
- > server reads the file from the default branch at run time).
424
-
425
- Required (provide exactly one):
426
-
427
- - **`--built-in <name>`** — a built-in action name (e.g. `harden`).
428
- - **`--action-path <path>`** — a repo-relative path or `https://` URL to a custom action file.
429
-
430
- Optional flags include `--entry-point <path>`, `--outcome-type <pr|plan|feedback>`, and `--schedule "<cron>"`. Run `hula schedule --help` for the full grouped list and cron examples.
431
-
432
- Defaults and requirements:
433
-
434
- - **Server URL**: defaults to `https://www.hublaunch.site`. Override with `--url <url>` or the `HULA_PROJECT_URL` environment variable.
435
- - **`--outcome-type`**: defaults to `pr`. Valid values are `pr`, `plan`, and `feedback`.
436
- - **GitHub login**: run `hula login` first so your GitHub token is attached to the request automatically (the server requires it). Alternatively, set the `GITHUB_TOKEN` environment variable.
437
- - **Anthropic OAuth token**: an OAuth token (`sk-ant-oat…`) is required — the sandbox needs it as `CLAUDE_CODE_OAUTH_TOKEN`. It is resolved from `--anthropic-key <key>`, then `config.anthropicApiKey` in `.hublaunch/hublaunch.config.js`, then the `ANTHROPIC_API_KEY` environment variable. Get a token at [claude.ai/settings](https://claude.ai/settings) (requires a paid Claude.ai plan — Pro or Max). Standard API keys (`sk-ant-api03-…`) are not accepted.
438
- - **Daytona API key**: required by the server. Resolved from `--daytona-key <key>`, then `config.daytonaApiKey`, then the `DAYTONA_API_KEY` environment variable.
439
-
440
- ## `hula info`
441
-
442
- `hula info <trackingName>` surfaces facts about a tracked plan. Each flag adds a
443
- key to the request:
444
-
445
- | Flag | Meaning |
446
- | ------------------- | -------------------------------------------------------- |
447
- | `--logs` | Full stored run log |
448
- | `--lastLogs` | Last N lines of live output (see `--lines`) |
449
- | `--diff` | PR unified diff (fetched server-side from GitHub) |
450
- | `--initial` | Initial PR body / AI summary |
451
- | `--lessons` | Lessons-learned content |
452
- | `--clientSessionId` | Claude Code session id that launched the plan |
453
- | `--lines <n>` | Trailing line count for `--lastLogs` (default: 100) |
454
- | `-r, --raw` | For a single content key, print raw content to stdout |
133
+ ## Demo
455
134
 
456
- ```bash
457
- hula info my-feature --logs # opens the full run log in the editor
458
- hula info my-feature --lastLogs --lines 50 # opens the last 50 lines of live output
459
- hula info my-feature --diff # opens the PR diff
460
- hula info my-feature --clientSessionId # prints the launching session id (plain)
461
- hula info my-feature --logs --diff # prints a merged JSON object {logs, diff}
462
- hula info my-feature --logs --raw # prints the raw run log to stdout
463
- ```
135
+ <a href="https://www.youtube.com/watch?v=4-YRVB7mQZ8" target="_blank">
136
+ <img src="./docs/assets/demo-preview.svg" alt="Watch hub-launch demo on YouTube" width="100%"/>
137
+ </a>
464
138
 
465
- **Output rules** (let K = number of requested keys):
139
+ > Some command names in the video predate the current flow — the cycle you'll
140
+ > use today is the two-command loop above.
466
141
 
467
- - **K == 1, content key** → the content is formatted, written to a temp file,
468
- and opened in your editor. With `--raw` the raw content is printed to stdout.
469
- - **K == 1, `--clientSessionId`** → the session id (or `null`) is printed plain.
470
- - **K >= 2** → the keys are merged into one JSON object printed to stdout.
142
+ ## Dashboard
471
143
 
472
- Content keys route to `GET /api/v1/info/:planName`; `--clientSessionId` routes to
473
- the status endpoint. `--diff`/`--initial` can be `null` when there is no PR yet.
474
- See the [Commands Reference](./docs/commands.md#hula-info) for details.
144
+ Track all your active plans, runs, and PRs at
145
+ [hublaunch.site/dashboard](https://www.hublaunch.site/dashboard). Visit
146
+ [hublaunch.site](https://www.hublaunch.site) for plans and pricing.
475
147
 
476
148
  ## Documentation
477
149
 
478
- | Document | Description |
479
- | ---------------------------------------- | ------------------------------------------- |
480
- | [Commands Reference](./docs/commands.md) | Every CLI command with options and examples |
150
+ | Document | Description |
151
+ | ------------------------------------------- | ----------------------------------------------- |
152
+ | [Commands Reference](./docs/commands.md) | Every CLI command with options and examples |
153
+ | [Advanced Usage](./docs/advanced.md) | Pipeline internals, resume, env forwarding |
154
+ | [Notifications](./docs/notifications.md) | Slack, Telegram, and automating your responses |
481
155
 
482
156
  The full documentation index is at [docs/README.md](./docs/README.md).
483
157
 
484
- ## Requirements
485
-
486
- - **Node.js** >= 18.0.0
487
- - **pnpm** (or npm)
488
- - **GitHub CLI (`gh`)** >= 2.4.0, authenticated via `gh auth login`
489
- - **Playwright Chromium** — `npx playwright install chromium`
490
-
491
158
  ## Contributing
492
159
 
493
160
  1. Fork and create a feature branch
494
161
  2. Run `pnpm run typecheck`
495
162
  3. Submit a pull request
496
163
 
497
- See the [Commands Reference](./docs/commands.md) for available commands.
498
-
499
164
  ## Links
500
165
 
501
166
  - [HubLaunch Website](https://www.hublaunch.site)
502
167
  - [Dashboard](https://www.hublaunch.site/dashboard)
503
168
  - [GitHub Repository](https://github.com/NoStackApp/hub-launch)
504
169
  - [Issue Tracker](https://github.com/NoStackApp/hub-launch/issues)
505
- - [Documentation](./docs/README.md)
506
170
 
507
171
  ## License
508
172
 
@@ -3,5 +3,5 @@ import type { Config } from "../types/index.js";
3
3
  /**
4
4
  * Merge command - Merge PR, delete branch, remove from tracking
5
5
  */
6
- export declare function mergeCommand(program: Command, config: Config): void;
7
- //# sourceMappingURL=merge.d.ts.map
6
+ export declare function approveCommand(program: Command, config: Config): void;
7
+ //# sourceMappingURL=approve.d.ts.map
@@ -0,0 +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"}