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.
- package/CHANGELOG.md +19 -0
- package/README.md +101 -437
- package/dist/commands/{merge.d.ts → approve.d.ts} +2 -2
- package/dist/commands/approve.d.ts.map +1 -0
- package/dist/commands/{merge.js → approve.js} +4 -4
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +6 -25
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/interactive.js +6 -6
- package/dist/commands/interactive.js.map +1 -1
- package/dist/commands/launch.d.ts +0 -2
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +1 -16
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/schedule.d.ts.map +1 -1
- package/dist/commands/schedule.js +5 -20
- package/dist/commands/schedule.js.map +1 -1
- package/dist/commands/script.d.ts +1 -1
- package/dist/commands/script.d.ts.map +1 -1
- package/dist/commands/script.js +2 -2
- package/dist/commands/script.js.map +1 -1
- package/dist/config/command-names.d.ts +1 -1
- package/dist/config/command-names.js +1 -1
- package/dist/config/command-names.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/scripts/{merge-local.d.ts → approve-local.d.ts} +1 -1
- package/dist/scripts/approve-local.d.ts.map +1 -0
- package/dist/scripts/{merge-local.js → approve-local.js} +7 -7
- package/dist/scripts/approve-local.js.map +1 -0
- package/dist/scripts/{merge-remote.d.ts → approve-remote.d.ts} +3 -3
- package/dist/scripts/approve-remote.d.ts.map +1 -0
- package/dist/scripts/{merge-remote.js → approve-remote.js} +6 -6
- package/dist/scripts/approve-remote.js.map +1 -0
- package/dist/templates/planning-instructions.md +54 -0
- package/dist/templates/proceed-instructions.md +66 -8
- package/dist/templates/skills/{hula-merge → hula-approve}/SKILL.md +15 -15
- package/dist/templates/skills/hula-confirm/SKILL.md +18 -1
- package/dist/templates/skills/hula-create/SKILL.md +1 -1
- package/dist/templates/skills/hula-fix/SKILL.md +2 -2
- package/dist/templates/skills/hula-help/SKILL.md +3 -3
- package/dist/templates/skills/hula-info/SKILL.md +1 -1
- package/dist/templates/skills/hula-launch/SKILL.md +2 -2
- package/dist/templates/skills/hula-plan/SKILL.md +10 -9
- package/dist/templates/skills/hula-schedule/SKILL.md +1 -1
- package/dist/templates/skills/hula-upload/SKILL.md +1 -1
- package/dist/templates/skills/hula-verify/SKILL.md +1 -1
- package/dist/types/config.schema.d.ts +0 -6
- package/dist/types/config.schema.d.ts.map +1 -1
- package/dist/types/config.schema.js +0 -3
- package/dist/types/config.schema.js.map +1 -1
- package/dist/utils/ephemeral-credentials.d.ts +8 -10
- package/dist/utils/ephemeral-credentials.d.ts.map +1 -1
- package/dist/utils/ephemeral-credentials.js +8 -12
- package/dist/utils/ephemeral-credentials.js.map +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.mjs +1 -1
- package/dist/commands/merge.d.ts.map +0 -1
- package/dist/commands/merge.js.map +0 -1
- package/dist/scripts/merge-local.d.ts.map +0 -1
- package/dist/scripts/merge-local.js.map +0 -1
- package/dist/scripts/merge-remote.d.ts.map +0 -1
- 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
|
|
3
|
+
> **You just plan and approve. AI does the rest.**
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
91
|
-
|
|
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
|
-
|
|
20
|
+
### 1. Plan
|
|
99
21
|
|
|
100
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
40
|
+
### 2. Approve
|
|
163
41
|
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
|
|
50
|
+
That's the whole loop. Everything between the two commands happens without you.
|
|
242
51
|
|
|
243
|
-
|
|
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
|
-
|
|
249
|
-
|
|
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
|
-
|
|
66
|
+
## Setup
|
|
253
67
|
|
|
254
|
-
|
|
255
|
-
name and immediately launch a fresh one (stale state is reset server-side):
|
|
68
|
+
Once per machine:
|
|
256
69
|
|
|
257
70
|
```bash
|
|
258
|
-
|
|
71
|
+
npm install -g hub-launch # or: pnpm add -g hub-launch
|
|
72
|
+
hula login # authenticate with GitHub + HubLaunch
|
|
259
73
|
```
|
|
260
74
|
|
|
261
|
-
|
|
262
|
-
**only the branch name** — no plan path, and it sends no credentials:
|
|
75
|
+
Once per project:
|
|
263
76
|
|
|
264
77
|
```bash
|
|
265
|
-
|
|
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
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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
|
-
|
|
308
|
-
|
|
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
|
-
|
|
311
|
-
|
|
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
|
-
|
|
94
|
+
## Notifications
|
|
321
95
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
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
|
-
|
|
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
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
374
|
-
|
|
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
|
-
|
|
377
|
-
|
|
378
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
457
|
-
|
|
458
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
473
|
-
|
|
474
|
-
|
|
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
|
|
479
|
-
|
|
|
480
|
-
| [Commands Reference](./docs/commands.md)
|
|
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
|
|
7
|
-
//# sourceMappingURL=
|
|
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"}
|