hub-launch 1.16.0 → 1.18.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 (101) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +102 -2
  3. package/dist/commands/init.d.ts +61 -0
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +125 -114
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/instructions.d.ts +17 -0
  8. package/dist/commands/instructions.d.ts.map +1 -0
  9. package/dist/commands/instructions.js +51 -0
  10. package/dist/commands/instructions.js.map +1 -0
  11. package/dist/commands/launch.d.ts +21 -0
  12. package/dist/commands/launch.d.ts.map +1 -1
  13. package/dist/commands/launch.js +61 -0
  14. package/dist/commands/launch.js.map +1 -1
  15. package/dist/commands/script.d.ts +28 -0
  16. package/dist/commands/script.d.ts.map +1 -0
  17. package/dist/commands/script.js +69 -0
  18. package/dist/commands/script.js.map +1 -0
  19. package/dist/commands/session-hook.d.ts +26 -0
  20. package/dist/commands/session-hook.d.ts.map +1 -0
  21. package/dist/commands/session-hook.js +146 -0
  22. package/dist/commands/session-hook.js.map +1 -0
  23. package/dist/index.js +22 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/scripts/fix-commit.d.ts +2 -0
  26. package/dist/scripts/fix-commit.d.ts.map +1 -0
  27. package/dist/scripts/fix-commit.js +125 -0
  28. package/dist/scripts/fix-commit.js.map +1 -0
  29. package/dist/scripts/fix-setup.d.ts +2 -0
  30. package/dist/scripts/fix-setup.d.ts.map +1 -0
  31. package/dist/scripts/fix-setup.js +161 -0
  32. package/dist/scripts/fix-setup.js.map +1 -0
  33. package/dist/scripts/launch-run.d.ts +14 -0
  34. package/dist/scripts/launch-run.d.ts.map +1 -0
  35. package/dist/scripts/launch-run.js +117 -0
  36. package/dist/scripts/launch-run.js.map +1 -0
  37. package/dist/scripts/lib/exec.d.ts +48 -0
  38. package/dist/scripts/lib/exec.d.ts.map +1 -0
  39. package/dist/scripts/lib/exec.js +61 -0
  40. package/dist/scripts/lib/exec.js.map +1 -0
  41. package/dist/scripts/lib/io.d.ts +48 -0
  42. package/dist/scripts/lib/io.d.ts.map +1 -0
  43. package/dist/scripts/lib/io.js +72 -0
  44. package/dist/scripts/lib/io.js.map +1 -0
  45. package/dist/scripts/lib/read-config.d.ts +26 -0
  46. package/dist/scripts/lib/read-config.d.ts.map +1 -0
  47. package/dist/scripts/lib/read-config.js +65 -0
  48. package/dist/scripts/lib/read-config.js.map +1 -0
  49. package/dist/scripts/merge-local.d.ts +2 -0
  50. package/dist/scripts/merge-local.d.ts.map +1 -0
  51. package/dist/scripts/merge-local.js +146 -0
  52. package/dist/scripts/merge-local.js.map +1 -0
  53. package/dist/scripts/merge-remote.d.ts +12 -0
  54. package/dist/scripts/merge-remote.d.ts.map +1 -0
  55. package/dist/scripts/merge-remote.js +71 -0
  56. package/dist/scripts/merge-remote.js.map +1 -0
  57. package/dist/scripts/schedule-manage.d.ts +2 -0
  58. package/dist/scripts/schedule-manage.d.ts.map +1 -0
  59. package/dist/scripts/schedule-manage.js +151 -0
  60. package/dist/scripts/schedule-manage.js.map +1 -0
  61. package/dist/scripts/schedule-run.d.ts +2 -0
  62. package/dist/scripts/schedule-run.d.ts.map +1 -0
  63. package/dist/scripts/schedule-run.js +146 -0
  64. package/dist/scripts/schedule-run.js.map +1 -0
  65. package/dist/scripts/verify-gather.d.ts +2 -0
  66. package/dist/scripts/verify-gather.d.ts.map +1 -0
  67. package/dist/scripts/verify-gather.js +206 -0
  68. package/dist/scripts/verify-gather.js.map +1 -0
  69. package/dist/scripts/verify-post.d.ts +12 -0
  70. package/dist/scripts/verify-post.d.ts.map +1 -0
  71. package/dist/scripts/verify-post.js +91 -0
  72. package/dist/scripts/verify-post.js.map +1 -0
  73. package/dist/templates/planning-instructions.md +7 -7
  74. package/dist/templates/skill-creation-instructions.md +2 -2
  75. package/dist/templates/skills/hula-confirm/SKILL.md +3 -3
  76. package/dist/templates/skills/hula-fix/SKILL.md +3 -3
  77. package/dist/templates/skills/hula-help/SKILL.md +117 -0
  78. package/dist/templates/skills/hula-launch/SKILL.md +14 -8
  79. package/dist/templates/skills/hula-merge/SKILL.md +2 -2
  80. package/dist/templates/skills/hula-plan/SKILL.md +5 -5
  81. package/dist/templates/skills/hula-schedule/SKILL.md +16 -16
  82. package/dist/templates/skills/hula-verify/SKILL.md +32 -33
  83. package/dist/types/config.schema.d.ts +235 -0
  84. package/dist/types/config.schema.d.ts.map +1 -1
  85. package/dist/types/config.schema.js +66 -0
  86. package/dist/types/config.schema.js.map +1 -1
  87. package/dist/utils/client-session.d.ts +2 -2
  88. package/dist/utils/client-session.js +2 -2
  89. package/package.json +6 -5
  90. package/scripts/postinstall.mjs +102 -0
  91. package/dist/templates/scripts/hula-fix-commit.sh +0 -114
  92. package/dist/templates/scripts/hula-fix-setup.sh +0 -152
  93. package/dist/templates/scripts/hula-launch-run.sh +0 -140
  94. package/dist/templates/scripts/hula-merge-local.sh +0 -138
  95. package/dist/templates/scripts/hula-merge-remote.sh +0 -94
  96. package/dist/templates/scripts/hula-read-config.sh +0 -38
  97. package/dist/templates/scripts/hula-schedule-manage.sh +0 -159
  98. package/dist/templates/scripts/hula-schedule-run.sh +0 -148
  99. package/dist/templates/scripts/hula-session-hook.sh +0 -68
  100. package/dist/templates/scripts/hula-verify-gather.sh +0 -135
  101. package/dist/templates/scripts/hula-verify-post.sh +0 -84
@@ -0,0 +1,12 @@
1
+ /**
2
+ * verify-post — Step 8 of the hula.verify workflow.
3
+ * Invoked as: `hula script verify-post -- <pr-number> <report-file> [--repo-root <path>]`
4
+ *
5
+ * Posts a verification report as a PR comment mentioning @copilot.
6
+ * Emits structured JSON to stdout; all other output goes to stderr.
7
+ * Exit codes: 0=success, 1=user error, 2=tool error.
8
+ *
9
+ * Node port of `hula-verify-post.sh` (cross-platform: no bash, no jq).
10
+ */
11
+ export declare function main(args: string[]): Promise<number>;
12
+ //# sourceMappingURL=verify-post.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-post.d.ts","sourceRoot":"","sources":["../../src/scripts/verify-post.ts"],"names":[],"mappings":"AAOA;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmFpD"}
@@ -0,0 +1,91 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { runGh } from './lib/exec.js';
5
+ import { emitJson, fail, logStderr, runScript } from './lib/io.js';
6
+ import { resolveRepoRoot } from './lib/read-config.js';
7
+ /**
8
+ * verify-post — Step 8 of the hula.verify workflow.
9
+ * Invoked as: `hula script verify-post -- <pr-number> <report-file> [--repo-root <path>]`
10
+ *
11
+ * Posts a verification report as a PR comment mentioning @copilot.
12
+ * Emits structured JSON to stdout; all other output goes to stderr.
13
+ * Exit codes: 0=success, 1=user error, 2=tool error.
14
+ *
15
+ * Node port of `hula-verify-post.sh` (cross-platform: no bash, no jq).
16
+ */
17
+ export function main(args) {
18
+ return runScript(async () => {
19
+ // ── argument parsing ──────────────────────────────────────────────────
20
+ let prNumber = '';
21
+ let reportFile = '';
22
+ let repoRootArg = '';
23
+ for (let i = 0; i < args.length; i++) {
24
+ const a = args[i];
25
+ if (a === '--repo-root') {
26
+ repoRootArg = args[++i] ?? '';
27
+ }
28
+ else if (a.startsWith('--repo-root=')) {
29
+ repoRootArg = a.slice('--repo-root='.length);
30
+ }
31
+ else if (/^[0-9]/.test(a)) {
32
+ if (!prNumber)
33
+ prNumber = a;
34
+ else
35
+ fail(1, `Unexpected positional argument: ${a}`);
36
+ }
37
+ else if (!reportFile) {
38
+ reportFile = a;
39
+ }
40
+ else {
41
+ fail(1, `Unknown argument: ${a}`);
42
+ }
43
+ }
44
+ if (!prNumber) {
45
+ fail(1, 'Usage: hula script verify-post -- <pr-number> <report-file> [--repo-root <path>]');
46
+ }
47
+ if (!reportFile) {
48
+ fail(1, 'Report file path is required as second argument.');
49
+ }
50
+ if (!existsSync(reportFile)) {
51
+ fail(1, `Report file not found: ${reportFile}`);
52
+ }
53
+ // Resolve the repo root and ensure the repo-local tmp directory exists.
54
+ // Done defensively here too (not just in verify-gather) in case verify-post
55
+ // is invoked in isolation without verify-gather having run first.
56
+ const cwd = repoRootArg || undefined;
57
+ const repoRoot = await resolveRepoRoot(cwd);
58
+ const tmpDir = join(repoRoot, '.hublaunch', 'tmp');
59
+ await mkdir(tmpDir, { recursive: true });
60
+ // ── Build comment body with @copilot mention ──────────────────────────
61
+ const commentTmp = join(tmpDir, `hula-verify-comment-${prNumber}.md`);
62
+ const report = await readFile(reportFile, 'utf-8');
63
+ const body = '@copilot Please review this verification report and address any gaps.\n\n' +
64
+ report;
65
+ await writeFile(commentTmp, body, 'utf-8');
66
+ // ── Post comment ──────────────────────────────────────────────────────
67
+ logStderr(`📝 Posting verification report to PR #${prNumber}...`);
68
+ const res = await runGh(['pr', 'comment', prNumber, '--body-file', commentTmp], { cwd });
69
+ if (res.code !== 0) {
70
+ fail(2, `Failed to post comment to PR #${prNumber}. You can copy the report manually.`);
71
+ }
72
+ // Best-effort cleanup of all three repo-local scratch files for this PR:
73
+ // the comment body, the report Claude wrote, and the diff verify-gather
74
+ // wrote. `{ force: true }` so a missing file (e.g. the diff was never
75
+ // fetched, or gather ran under a different --repo-root) is a silent no-op
76
+ // and never turns a successful post into a reported failure.
77
+ const diffFile = join(tmpDir, `hula-verify-diff-${prNumber}.patch`);
78
+ await Promise.all([
79
+ rm(commentTmp, { force: true }),
80
+ rm(reportFile, { force: true }),
81
+ rm(diffFile, { force: true }),
82
+ ]);
83
+ // ── Output result ─────────────────────────────────────────────────────
84
+ emitJson({
85
+ status: 'success',
86
+ prNumber: Number(prNumber),
87
+ commentUrl: res.stdout.trim(),
88
+ });
89
+ }, args);
90
+ }
91
+ //# sourceMappingURL=verify-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-post.js","sourceRoot":"","sources":["../../src/scripts/verify-post.ts"],"names":[],"mappings":"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"}
@@ -54,13 +54,13 @@ This means:
54
54
  - Inform the user that the plan has been created
55
55
  - **Immediately proceed** to the confirmation/validation workflow
56
56
  - Do NOT wait for the user to type `/hula-confirm` — continue in the same session
57
- - Read `.hublaunch/proceed-instructions.md` and execute validation against the saved plan
57
+ - Read `hula instructions proceed` and execute validation against the saved plan
58
58
  - Skip the file-location confirmation step (the path is already known from this session)
59
59
 
60
60
  **PHASE 6: INLINE VALIDATION (replaces separate /hula-confirm)**
61
61
 
62
62
  - Validation runs automatically after the plan file is saved
63
- - Execute the full `proceed-instructions.md` validation workflow inline
63
+ - Execute the full `hula instructions proceed` validation workflow inline
64
64
  - The MCQ validation questions (if any) are asked in this same session
65
65
  - Plan is updated with improvements before handing off to the user
66
66
  - `/hula-confirm` remains available as a standalone command for re-validation at any time
@@ -237,10 +237,10 @@ After generating and saving the draft plan file (following Phase 6 below), infor
237
237
 
238
238
  1. **Inform the user** that the plan has been created
239
239
  2. **Announce auto-continue**: State that validation is starting now (no user action needed)
240
- 3. **Execute validation inline**: Read `.hublaunch/proceed-instructions.md` and run the full validation workflow against the plan file you just saved
240
+ 3. **Execute validation inline**: Read `hula instructions proceed` and run the full validation workflow against the plan file you just saved
241
241
  4. **Skip the file-location guard**: The plan path is already known from this session — do not ask "Is this correct?"
242
242
  5. **Carry forward context**: Use everything learned during planning to resolve validation questions where possible
243
- 6. **Offer the launch**: After validation completes, follow the "Launch Offer" section of `.hublaunch/proceed-instructions.md` — determine the issue name, ask the launch question, and on an affirmative reply execute the `/hula-launch` workflow. Never launch without an affirmative reply.
243
+ 6. **Offer the launch**: After validation completes, follow the "Launch Offer" section of `hula instructions proceed` — determine the issue name, ask the launch question, and on an affirmative reply execute the `/hula-launch` workflow. Never launch without an affirmative reply.
244
244
 
245
245
  **Output format after saving the plan file:**
246
246
 
@@ -252,7 +252,7 @@ After generating and saving the draft plan file (following Phase 6 below), infor
252
252
  📋 **Proceeding to validation now…**
253
253
  ```
254
254
 
255
- Then continue immediately by reading `.hublaunch/proceed-instructions.md` and executing the validation workflow against the saved plan path. Begin at Step 2 (Comprehensive Validation Analysis) — skip Step 1 (file location) because the path is already known.
255
+ Then continue immediately by reading `hula instructions proceed` and executing the validation workflow against the saved plan path. Begin at Step 2 (Comprehensive Validation Analysis) — skip Step 1 (file location) because the path is already known.
256
256
 
257
257
  **Recovery fallback:** If inline validation cannot complete (context window limit, tool error, interrupted session), print:
258
258
 
@@ -292,7 +292,7 @@ After successfully saving the plan, output the handoff message from Phase 5 abov
292
292
  📋 **Proceeding to validation now…**
293
293
  ```
294
294
 
295
- Then immediately continue with the inline validation workflow described in Phase 5 (read `.hublaunch/proceed-instructions.md` and execute it against the saved plan path, starting from Step 2 and skipping the file-location confirmation).
295
+ Then immediately continue with the inline validation workflow described in Phase 5 (read `hula instructions proceed` and execute it against the saved plan path, starting from Step 2 and skipping the file-location confirmation).
296
296
 
297
297
  The HTML comment allows the system to reference the plan file for further operations.
298
298
 
@@ -701,7 +701,7 @@ src/
701
701
  - Phase 3: Create DRAFT plan
702
702
  - Phase 4: Save the plan file immediately
703
703
  - Phase 5: Auto-continue to validation in the same session
704
- - Phase 6: Inline validation (replaces separate `/hula-confirm`; the standalone command remains available) — ends with the Launch Offer (see `.hublaunch/proceed-instructions.md`)
704
+ - Phase 6: Inline validation (replaces separate `/hula-confirm`; the standalone command remains available) — ends with the Launch Offer (see `hula instructions proceed`)
705
705
 
706
706
  4. **PLAN FOR AI IMPLEMENTATION**: The plan must be self-contained
707
707
 
@@ -88,7 +88,7 @@ branch at run time (and re-reads it on every scheduled fire). The file MUST be o
88
88
  the branch before the run, so publish it first:
89
89
 
90
90
  ```bash
91
- bash .github/scripts/hula-schedule-manage.sh --publish-skill .hublaunch/skills/<filename>
91
+ hula script schedule-manage -- --publish-skill .hublaunch/skills/<filename>
92
92
  ```
93
93
 
94
94
  Parse the single JSON object it prints:
@@ -103,7 +103,7 @@ Only after a successful publish, invoke the run wrapper with `--action-path`
103
103
  pointing at the committed file:
104
104
 
105
105
  ```bash
106
- bash .github/scripts/hula-schedule-run.sh --action-path .hublaunch/skills/<filename> [--entry-point <path>] [--outcome-type <type>] [--schedule "<cron>"]
106
+ hula script schedule-run -- --action-path .hublaunch/skills/<filename> [--entry-point <path>] [--outcome-type <type>] [--schedule "<cron>"]
107
107
  ```
108
108
 
109
109
  Pass only the flags you resolved. Quote the cron expression.
@@ -10,9 +10,9 @@ You are an expert plan validator for the HubLaunch project, specializing in ensu
10
10
 
11
11
  ## Instructions
12
12
 
13
- Read the detailed confirmation guidelines from the workspace file:
13
+ Read the detailed confirmation guidelines by running:
14
14
 
15
- `.hublaunch/proceed-instructions.md`
15
+ `hula instructions proceed`
16
16
 
17
17
  Follow those instructions carefully to validate and enhance implementation plans.
18
18
 
@@ -296,7 +296,7 @@ After updating the plan:
296
296
  🚀 Are you ready to launch? (Unless you tell me otherwise, I'll use the issue name `<issueName>`.)
297
297
  ```
298
298
 
299
- Then follow the **Launch Offer** section of `.hublaunch/proceed-instructions.md`: resolve `<issueName>`, ask the launch question, and on an affirmative reply execute the `/hula-launch` workflow with `<issueName> <planPath>` (plus any `--handoff`/`--test` flags). Never launch without an affirmative reply; on a negative or deferring reply, print the fallback message and stop.
299
+ Then follow the **Launch Offer** section of `hula instructions proceed`: resolve `<issueName>`, ask the launch question, and on an affirmative reply execute the `/hula-launch` workflow with `<issueName> <planPath>` (plus any `--handoff`/`--test` flags). Never launch without an affirmative reply; on a negative or deferring reply, print the fallback message and stop.
300
300
 
301
301
  ## Important Guidelines
302
302
 
@@ -68,7 +68,7 @@ Stop execution here. Do not proceed.
68
68
  Run the setup script — it handles issue lookup, validation, worktree creation, and session file writing in one terminal approval:
69
69
 
70
70
  ```bash
71
- bash .github/scripts/hula-fix-setup.sh <issue-number>
71
+ hula script fix-setup -- <issue-number>
72
72
  ```
73
73
 
74
74
  The script outputs JSON with `status`, `issueTitle`, `prBranch`, `worktreePath`, and `sessionFile`.
@@ -111,7 +111,7 @@ Switch your working context:
111
111
  cd <worktreePath>
112
112
  ```
113
113
 
114
- Where `<worktreePath>` is the path returned by `hula-fix-setup.sh` in Step 2.
114
+ Where `<worktreePath>` is the path returned by `hula script fix-setup` in Step 2.
115
115
 
116
116
  Apply fixes using the edit tool, making sure file paths are relative to (or inside) the worktree directory.
117
117
 
@@ -133,7 +133,7 @@ Progress display:
133
133
  Generate a commit message based on the issue number, files changed, and nature of changes, then run the commit script (one terminal approval):
134
134
 
135
135
  ```bash
136
- bash .github/scripts/hula-fix-commit.sh <issue-number> "fix(#42): <generated-message>"
136
+ hula script fix-commit -- <issue-number> "fix(#42): <generated-message>"
137
137
  ```
138
138
 
139
139
  The script outputs JSON with `status`, `commitMessage`, and `filesChanged`.
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: hula-help
3
+ description: Interactive onboarding and reference guide for hub-launch. Walks new users through prerequisites, hula login, hula init, and the plan → launch → verify → fix → merge workflow, and looks up any hula command or /hula-* skill. Use when the user is new to hub-launch, unsure what to run next, or asks how a command/skill works.
4
+ disable-model-invocation: true
5
+ argument-hint: "[getting-started|workflow|commands|config|<question>]"
6
+ allowed-tools: Bash Read
7
+ ---
8
+
9
+ You are an onboarding guide for hub-launch (the `hula` CLI and its `/hula-*` Agent Skills). Your job is to help a user — often a beginner — understand what hub-launch is, what's already set up in their project, and what to do next, through a short, interactive conversation. Never overwhelm: one focused answer or menu at a time, then wait for the user's next pick.
10
+
11
+ ## Golden rules
12
+
13
+ 1. **Read live, never guess or embed stale copy.** Always pull current facts from `README.md`, `docs/commands.md`, and (where relevant) `hula <command> --help` in this repo — never rely on memorized text, since it can drift out of date.
14
+ 2. **Informational by default.** Explain what to run and why. Only *run* a command yourself under "What you're allowed to run" below.
15
+ 3. **One step at a time.** Don't dump the whole README. Answer what was asked, then offer the next logical option.
16
+ 4. **Beginner-safe tone.** No unexplained jargon. Define terms the first time you use them (e.g. "a *plan* is a markdown file describing what to build").
17
+ 5. **No troubleshooting.** This skill is for getting started and looking things up, not for diagnosing errors or stuck states. If asked to debug something broken, say that's outside what this skill covers and point at the relevant command's own error output instead.
18
+
19
+ ## Input
20
+
21
+ $ARGUMENTS
22
+
23
+ - No argument → run the **State Check**, then show the **Topic Menu**.
24
+ - One of `getting-started`, `workflow`, `commands`, `config` → run the **State Check** silently, then skip the menu and go straight to that topic's section below.
25
+ - Anything else (free text) → run the **State Check** silently, then treat it as a free-form question — answer it by reading the relevant doc section(s), same read-live rule applies.
26
+
27
+ ## Step 1: State Check (silent, read-only, no confirmation needed)
28
+
29
+ Before responding, gather context. None of these require confirmation — they don't mutate anything:
30
+
31
+ ```bash
32
+ test -f .hublaunch/hublaunch.config.js && echo "initialized" || echo "not-initialized"
33
+ git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "no-git"
34
+ hula --version 2>/dev/null
35
+ ```
36
+
37
+ If initialized, `Read .hublaunch/hublaunch.config.js` and note (never print the values themselves, only presence/absence):
38
+ - Is `hulaApiKey` (or `anthropicApiKey`/`daytonaApiKey`) present with a non-empty value? → user has likely completed `hula login`.
39
+ - If `.hublaunch/trackedPlans.json` exists, `Read` it — does it have any entries? → user has launched at least one plan before.
40
+
41
+ If any check fails (not a git repo, config unreadable), treat that signal as unknown and continue — don't block on it.
42
+
43
+ Classify into one state:
44
+ - **Fresh** — no `.hublaunch/hublaunch.config.js` → hasn't run `hula init` yet.
45
+ - **Initialized, not logged in** — config exists, no API key set.
46
+ - **Ready, no history** — config + key set, `trackedPlans.json` empty/missing.
47
+ - **Mid-workflow** — tracked plans exist and/or current git branch isn't the default branch.
48
+
49
+ ## Step 2: Opening line (tailored, one line, then always show the menu)
50
+
51
+ Pick ONE line matching the state:
52
+
53
+ - Fresh: `👋 Looks like hub-launch isn't initialized in this project yet.`
54
+ - Initialized, not logged in: `👋 hub-launch is initialized, but I don't see login credentials yet.`
55
+ - Ready, no history: `👋 You're set up — haven't launched a plan yet?`
56
+ - Mid-workflow: `👋 Looks like you're mid-workflow on branch \`<branch>\`.`
57
+
58
+ (Skip this step entirely when the user passed an explicit topic argument — go straight to that topic instead.)
59
+
60
+ ## Step 3: Topic Menu
61
+
62
+ ```
63
+ What do you need help with?
64
+
65
+ 1. Getting Started — install, login, init, your first plan → launch → merge cycle
66
+ 2. The Core Workflow — what /hula-plan, /hula-launch, /hula-verify, /hula-fix, /hula-merge each do
67
+ 3. Commands Reference — look up any hula CLI command or /hula-* skill
68
+ 4. Configuration — .hublaunch/hublaunch.config.js basics
69
+ 5. Something else — just ask your question
70
+ ```
71
+
72
+ Wait for a reply (number, keyword, or free text). Do not proceed until the user responds.
73
+
74
+ ## Topic: Getting Started
75
+
76
+ Read `README.md`'s "Quick Start" and "Requirements" sections (and the "Core Workflow" intro) live, then walk the user through, in order, only up to where the **State Check** says they already are — skip and say "✅ already done" for steps already satisfied:
77
+
78
+ 1. Requirements — Node ≥18, `gh` CLI ≥2.4.0 authenticated (`gh auth login`), Playwright Chromium (`npx playwright install chromium`).
79
+ 2. Install — `npm install -g hub-launch` (or `pnpm add -g hub-launch`).
80
+ 3. `hula init` — initializes `.hublaunch/hublaunch.config.js`. If State Check showed **Fresh**, offer to run it now (see "What you're allowed to run").
81
+ 4. `hula login` — authenticates GitHub + hula-project. If **Initialized, not logged in**, offer to run it now.
82
+ 5. First cycle — `/hula-plan <description>` → `/hula-launch <name>` → `/hula-verify` → `/hula-merge`. Point to Topic: The Core Workflow for details on each.
83
+
84
+ ## Topic: The Core Workflow
85
+
86
+ Read the "Core Workflow" section of `README.md` live. Explain each step in plain language — one at a time if the user wants depth, or as a compact list if they want the overview:
87
+
88
+ - `/hula-plan <description>` — writes a plan file to `.hublaunch/plans/`, validates it automatically.
89
+ - `/hula-upload` — syncs the plan to `origin/main` (usually automatic as part of `/hula-launch`, rarely needed standalone).
90
+ - `/hula-launch <name>` — creates the GitHub issue, runs the AI coding session in an isolated cloud container, opens a PR.
91
+ - `/hula-verify` — checks the PR against the plan's acceptance criteria.
92
+ - `/hula-fix <instructions>` — addresses gaps found by verify, or anything else you want changed on the PR branch.
93
+ - `/hula-merge` — merges the PR, cleans up, fast-forwards local `main`.
94
+ - Mention `/hula-info`, `/hula-schedule`, `/hula-confirm` as supporting skills, one line each, only if the user wants more than the core cycle.
95
+
96
+ ## Topic: Commands Reference
97
+
98
+ Ask (if not already clear from `$ARGUMENTS`) which command or skill they want to know about. Then:
99
+ - For a `hula <x>` CLI command → run `hula <x> --help` and relay the output; also `Read docs/commands.md` for the matching `## \`hula <x>\`` section if more narrative detail would help.
100
+ - For a `/hula-<x>` skill → `Read docs/commands.md` and `README.md` for any matching section. Skills generally aren't documented in `docs/commands.md` (it covers CLI subcommands, not skills) — if there's no match, say so rather than inventing detail, and summarize from the skill's own stated purpose instead.
101
+
102
+ ## Topic: Configuration
103
+
104
+ If `.hublaunch/hublaunch.config.js` exists, `Read` it (never print secret values — describe presence/absence only) alongside the relevant `README.md` sections (e.g. "Forwarding environment variables to the container", "Configuring per-step model & iteration overrides"). Explain only the fields the user asks about — don't dump the whole schema unprompted.
105
+
106
+ ## What you're allowed to run
107
+
108
+ - **Always allowed, no confirmation needed**: read-only checks — `hula --version`, `git status`, `git rev-parse --abbrev-ref HEAD`, `hula <cmd> --help`, `Read` on any repo file.
109
+ - **Offer, then wait for an explicit yes**: setup commands that change local/remote state — `hula init`, `hula login`. Never run these without an affirmative reply to your offer first.
110
+ - **Never run**: anything from the plan→launch→merge pipeline itself (`/hula-plan`, `/hula-launch`, etc.) — those are the user's own next command to type, not something this skill triggers.
111
+
112
+ ## Notes
113
+
114
+ - Never print API key / token values, even partially — only whether a field is set.
115
+ - If `README.md` or `docs/commands.md` can't be read (missing/renamed), say so plainly and fall back to `hula --help` / `hula <cmd> --help` output instead of guessing.
116
+ - Keep every answer short enough to read in a few seconds; offer "want more detail?" rather than front-loading it.
117
+ - This skill does not diagnose errors or stuck workflows — if asked to, say that's outside what it covers.
@@ -2,7 +2,7 @@
2
2
  name: hula-launch
3
3
  description: Launch a GitHub issue from the current plan. Use when the user asks to launch or assign the plan to a remote agent.
4
4
  disable-model-invocation: true
5
- argument-hint: <branch-name> [<plan-path>] [--handoff <username>] [--test] [--kill] [--kill-and-relaunch]
5
+ argument-hint: <branch-name> [<plan-path>] [--handoff <username>] [--test] [--skip-regression] [--kill] [--kill-and-relaunch]
6
6
  allowed-tools: Bash Read
7
7
  ---
8
8
 
@@ -15,6 +15,7 @@ From `$ARGUMENTS`:
15
15
  - **Plan path** (optional): the second word, if present (e.g., `.hublaunch/plans/2026-06-10-14:00-feature-auth.md`).
16
16
  - **--handoff** (optional): a `--handoff <username>` flag anywhere in `$ARGUMENTS`.
17
17
  - **--test** (optional): the bare flag `--test`, anywhere in `$ARGUMENTS`. Sets test mode (server uses a mock Claude — fast E2E run; a real PR is still created).
18
+ - **--skip-regression** (optional): the bare flag `--skip-regression`, anywhere in `$ARGUMENTS`. Force-skips the regression-tests pipeline step for this one launch (overrides any `steps.regression.skip` config default).
18
19
  - **--kill** (optional): the bare flag `--kill`, anywhere in `$ARGUMENTS`. Stops the in-flight task for this branch name **without** relaunching. A plan path is **not** required with `--kill` — the branch name alone is enough.
19
20
  - **--kill-and-relaunch** (optional): the bare flag `--kill-and-relaunch`, anywhere in `$ARGUMENTS`. Cancels the in-flight task, resets stale state, and launches a fresh task (needs a plan path, like a normal launch).
20
21
 
@@ -47,34 +48,39 @@ With the values known, run exactly one Bash command.
47
48
 
48
49
  Without handoff:
49
50
  ```bash
50
- bash .github/scripts/hula-launch-run.sh <plan-path> <branch-name>
51
+ hula script launch-run -- <plan-path> <branch-name>
51
52
  ```
52
53
 
53
54
  With handoff:
54
55
  ```bash
55
- bash .github/scripts/hula-launch-run.sh <plan-path> <branch-name> --handoff <username>
56
+ hula script launch-run -- <plan-path> <branch-name> --handoff <username>
56
57
  ```
57
58
 
58
59
  With test mode:
59
60
  ```bash
60
- bash .github/scripts/hula-launch-run.sh <plan-path> <branch-name> --test
61
+ hula script launch-run -- <plan-path> <branch-name> --test
61
62
  ```
62
63
 
63
64
  With handoff + test mode:
64
65
  ```bash
65
- bash .github/scripts/hula-launch-run.sh <plan-path> <branch-name> --handoff <username> --test
66
+ hula script launch-run -- <plan-path> <branch-name> --handoff <username> --test
66
67
  ```
67
68
 
68
- Append `--test` whenever the user passed it; it composes with `--handoff`.
69
+ With skip-regression:
70
+ ```bash
71
+ hula script launch-run -- <plan-path> <branch-name> --skip-regression
72
+ ```
73
+
74
+ Append `--test` whenever the user passed it; it composes with `--handoff`. Append `--skip-regression` whenever the user passed it; it composes with `--handoff` and `--test` too.
69
75
 
70
76
  **Stop the in-flight task without relaunching (`--kill`)** — pass only the branch name (no plan path):
71
77
  ```bash
72
- bash .github/scripts/hula-launch-run.sh <branch-name> --kill
78
+ hula script launch-run -- <branch-name> --kill
73
79
  ```
74
80
 
75
81
  **Kill the in-flight task and relaunch fresh (`--kill-and-relaunch`)** — needs a plan path, like a normal launch, and composes with `--handoff`/`--test`:
76
82
  ```bash
77
- bash .github/scripts/hula-launch-run.sh <plan-path> <branch-name> --kill-and-relaunch
83
+ hula script launch-run -- <plan-path> <branch-name> --kill-and-relaunch
78
84
  ```
79
85
 
80
86
  ## Step 3: Show the result
@@ -130,7 +130,7 @@ Suggested test command: npm test
130
130
  Generate a commit message based on the issue number, files changed, and nature of changes, then run the local-merge script — it handles commit, push, merge, worktree removal, and session cleanup in one terminal approval:
131
131
 
132
132
  ```bash
133
- bash .github/scripts/hula-merge-local.sh <issue-number> "<worktreePath>" "fix(#42): <generated-message>"
133
+ hula script merge-local -- <issue-number> "<worktreePath>" "fix(#42): <generated-message>"
134
134
  ```
135
135
 
136
136
  The script outputs JSON with `status`, `committed`, `filesChanged`, `worktreeRemoved`, and `sessionCleaned`.
@@ -209,7 +209,7 @@ Follow this path when no local fix session/worktree exists. This is the common p
209
209
  Run the remote-merge script — it merges the PR directly on GitHub and cleans up any stale session file in one terminal approval:
210
210
 
211
211
  ```bash
212
- bash .github/scripts/hula-merge-remote.sh <issue-number>
212
+ hula script merge-remote -- <issue-number>
213
213
  ```
214
214
 
215
215
  The script outputs JSON with `status`, `issueNumber`, `sessionCleaned`, and `localUpdated`.
@@ -10,9 +10,9 @@ You are an expert technical planner for the HubLaunch project.
10
10
 
11
11
  ## Instructions
12
12
 
13
- Read the detailed planning guidelines from the workspace file:
13
+ Read the detailed planning guidelines by running:
14
14
 
15
- `.hublaunch/planning-instructions.md`
15
+ `hula instructions planning`
16
16
 
17
17
  Follow those instructions carefully to generate a comprehensive implementation plan.
18
18
 
@@ -23,7 +23,7 @@ The user will describe a feature or issue. Your job is to:
23
23
  1. **ASK CLARIFYING QUESTIONS FIRST** - Do not immediately generate a plan
24
24
  2. Understand the requirements through questions and answers
25
25
  3. Analyze the existing codebase context
26
- 4. Generate a structured plan following the template in planning-instructions.md
26
+ 4. Generate a structured plan following the template from `hula instructions planning`
27
27
  5. Include specific file paths, code suggestions, and actionable steps
28
28
  6. Consider testing, documentation, and edge cases
29
29
 
@@ -133,7 +133,7 @@ The plan should be immediately actionable by a developer familiar with the codeb
133
133
 
134
134
  Now proceed directly to plan validation **without waiting for the user**. The plan file was just created in this session — the path is already known.
135
135
 
136
- Read `.hublaunch/proceed-instructions.md` and execute the full validation workflow against the plan at `<path>` (substitute `<path>` with the actual plan file path you just created, e.g. `.hublaunch/plans/2025-12-29-14:30-feature-name.md`).
136
+ Read `hula instructions proceed` and execute the full validation workflow against the plan at `<path>` (substitute `<path>` with the actual plan file path you just created, e.g. `.hublaunch/plans/2025-12-29-14:30-feature-name.md`).
137
137
 
138
138
  **Important adjustments for inline execution:**
139
139
 
@@ -144,6 +144,6 @@ Read `.hublaunch/proceed-instructions.md` and execute the full validation workfl
144
144
  > ⚠️ Auto-validation could not complete. Run `/hula-confirm <path>` to resume.
145
145
 
146
146
  where `<path>` is the plan file path.
147
- - **Finish with the Launch Offer** — after validation completes, execute the "Launch Offer" section of `.hublaunch/proceed-instructions.md` (issue-name resolution, the launch question, and launching on an affirmative reply). Never launch without an affirmative reply.
147
+ - **Finish with the Launch Offer** — after validation completes, execute the "Launch Offer" section of `hula instructions proceed` (issue-name resolution, the launch question, and launching on an affirmative reply). Never launch without an affirmative reply.
148
148
 
149
149
  **Note:** The plan is saved locally. When you run `/hula-launch`, the plan is automatically synced to `origin/main` before the GitHub issue is created and the implementation begins — no separate upload step needed. Because validation ends with the Launch Offer, an affirmative reply runs the `/hula-launch` workflow for the user automatically; they can also decline and run `/hula-launch` themselves later. `/hula-confirm` remains available as a standalone command for re-validation at any time.
@@ -76,13 +76,13 @@ guess between "run an existing action" and "create a new one". Likewise, if an
76
76
  Run exactly one Bash command. Use `--built-in` OR `--action-path`, never both:
77
77
 
78
78
  ```bash
79
- bash .github/scripts/hula-schedule-run.sh --built-in <name> [--entry-point <path>] [--outcome-type <type>] [--schedule "<cron>"] [--pr-policy <always|skip-if-open|close-previous>]
79
+ hula script schedule-run -- --built-in <name> [--entry-point <path>] [--outcome-type <type>] [--schedule "<cron>"] [--pr-policy <always|skip-if-open|close-previous>]
80
80
  ```
81
81
 
82
82
  or, for a custom action file:
83
83
 
84
84
  ```bash
85
- bash .github/scripts/hula-schedule-run.sh --action-path <path> [--entry-point <path>] [--outcome-type <type>] [--schedule "<cron>"] [--pr-policy <always|skip-if-open|close-previous>]
85
+ hula script schedule-run -- --action-path <path> [--entry-point <path>] [--outcome-type <type>] [--schedule "<cron>"] [--pr-policy <always|skip-if-open|close-previous>]
86
86
  ```
87
87
 
88
88
  Pass only the flags you resolved. Quote the cron expression. Only include
@@ -95,14 +95,14 @@ report the result (see **Reporting run/schedule results**).
95
95
 
96
96
  The user described what they want done but did not supply an existing action.
97
97
 
98
- **Read `.hublaunch/skill-creation-instructions.md` and follow it exactly.** In
98
+ **Read `hula instructions skill-creation` and follow it exactly.** In
99
99
  summary it has you: ask clarifying questions first (then STOP), confirm the
100
100
  action name, resolve+confirm any cron, write a free-form instruction markdown
101
101
  file to `.hublaunch/skills/<YYYY-MM-DD-HH:MM-slug>.md`, **publish it to
102
102
  origin/main BEFORE running** via
103
- `bash .github/scripts/hula-schedule-manage.sh --publish-skill <path>` (abort if
103
+ `hula script schedule-manage -- --publish-skill <path>` (abort if
104
104
  that returns `status:"error"`), then run/schedule it with
105
- `bash .github/scripts/hula-schedule-run.sh --action-path <path> …`, and report the
105
+ `hula script schedule-run -- --action-path <path> …`, and report the
106
106
  created file path plus the run/schedule result.
107
107
 
108
108
  ---
@@ -113,8 +113,8 @@ Run via the management wrapper:
113
113
 
114
114
  - `list` (no qualifier) → show **both** recent runs and active schedules:
115
115
  ```bash
116
- bash .github/scripts/hula-schedule-manage.sh --list
117
- bash .github/scripts/hula-schedule-manage.sh --list-schedules
116
+ hula script schedule-manage -- --list
117
+ hula script schedule-manage -- --list-schedules
118
118
  ```
119
119
  - "list runs" → only `--list`. "list schedules" → only `--list-schedules`.
120
120
 
@@ -123,7 +123,7 @@ Display the `cliOutput` from each result.
123
123
  ## Mode: show
124
124
 
125
125
  ```bash
126
- bash .github/scripts/hula-schedule-manage.sh --show <runId>
126
+ hula script schedule-manage -- --show <runId>
127
127
  ```
128
128
 
129
129
  Display the `cliOutput`.
@@ -131,7 +131,7 @@ Display the `cliOutput`.
131
131
  ## Mode: run-now
132
132
 
133
133
  ```bash
134
- bash .github/scripts/hula-schedule-manage.sh --run-now <scheduleId>
134
+ hula script schedule-manage -- --run-now <scheduleId>
135
135
  ```
136
136
 
137
137
  Report the new run id (`runId`) from the JSON, falling back to `cliOutput`.
@@ -140,19 +140,19 @@ Report the new run id (`runId`) from the JSON, falling back to `cliOutput`.
140
140
 
141
141
  1. Cancel the schedule:
142
142
  ```bash
143
- bash .github/scripts/hula-schedule-manage.sh --cancel-schedule <scheduleId>
143
+ hula script schedule-manage -- --cancel-schedule <scheduleId>
144
144
  ```
145
145
  2. If the cancelled schedule referenced an `actionPath` under
146
146
  `.hublaunch/skills/`, **ask the user whether to also delete that file.**
147
147
  3. If they opt in, FIRST verify no other active schedule still uses it:
148
148
  ```bash
149
- bash .github/scripts/hula-schedule-manage.sh --list-schedules
149
+ hula script schedule-manage -- --list-schedules
150
150
  ```
151
151
  - If another active schedule references the same `actionPath`, **refuse** and
152
152
  report which schedule id(s) still use it. Leave the file on the branch.
153
153
  - Otherwise delete it:
154
154
  ```bash
155
- bash .github/scripts/hula-schedule-manage.sh --delete-skill <actionPath>
155
+ hula script schedule-manage -- --delete-skill <actionPath>
156
156
  ```
157
157
 
158
158
  ## Mode: update-skill-file
@@ -167,7 +167,7 @@ schedule.
167
167
  it with `Write` for a large change), keeping the free-form template format.
168
168
  3. Re-publish it:
169
169
  ```bash
170
- bash .github/scripts/hula-schedule-manage.sh --publish-skill <actionPath>
170
+ hula script schedule-manage -- --publish-skill <actionPath>
171
171
  ```
172
172
  4. No schedule change is needed. Inform the user that the **next scheduled run
173
173
  will use the updated content** (the server re-reads the file on every fire).
@@ -180,14 +180,14 @@ update-schedule endpoint, so cancel + recreate on the same action:
180
180
  1. Read the existing schedule's `actionPath` (or `builtIn`), `entryPoint`, and
181
181
  `outcomeType` via:
182
182
  ```bash
183
- bash .github/scripts/hula-schedule-manage.sh --list-schedules
183
+ hula script schedule-manage -- --list-schedules
184
184
  ```
185
185
  2. Resolve the new cron and **confirm the readback** (see Cron table).
186
186
  3. Cancel the old schedule, then recreate with the new cron on the **same**
187
187
  action:
188
188
  ```bash
189
- bash .github/scripts/hula-schedule-manage.sh --cancel-schedule <old-id>
190
- bash .github/scripts/hula-schedule-run.sh --action-path <same-path> [--entry-point <path>] [--outcome-type <type>] --schedule "<new-cron>"
189
+ hula script schedule-manage -- --cancel-schedule <old-id>
190
+ hula script schedule-run -- --action-path <same-path> [--entry-point <path>] [--outcome-type <type>] --schedule "<new-cron>"
191
191
  ```
192
192
  (Use `--built-in <name>` instead of `--action-path` if the schedule used a
193
193
  built-in.)