From ec2d95eb5aca0fe5e75c7da1cf81b2c05f4bd3a1 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 1 Nov 2026 08:59:07 +0000 Subject: [PATCH 1/3] feat: add one-line mini banners to plan, build and worker PR output Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01EQ8Gz5Faiz4FGM97WGxCXL --- agents/worker.md | 2 ++ skills/build/SKILL.md | 8 ++++++++ skills/plan/SKILL.md | 8 ++++++++ tests/banner.test.js | 14 ++++++++++++++ 4 files changed, 32 insertions(+) diff --git a/agents/worker.md b/agents/worker.md index 5602455..3c0e909 100644 --- a/agents/worker.md +++ b/agents/worker.md @@ -16,6 +16,8 @@ You are a worker. You own one task issue, one worktree and one branch. 7. Finish with a summary: each acceptance criterion as met or unmet with evidence, what you did, what you tried that failed, and open risks. Write it to the file the orchestrator names. A statement that tests passed must come with the real command and its output in the report (the last lines are enough); "tests pass" alone is not accepted. +Right before the URL, print this one line once, exactly as written (replace N with the issue number): `( o w o ) haku PR ready #N` + Print the full pull request URL and your summary in your final message, not only in the file: a `/goal` check or a stop hook can read only what is printed. ## Pitfalls diff --git a/skills/build/SKILL.md b/skills/build/SKILL.md index 17b9f33..51e4a98 100644 --- a/skills/build/SKILL.md +++ b/skills/build/SKILL.md @@ -13,6 +13,14 @@ Helper: `node "${CLAUDE_PLUGIN_ROOT}/scripts/issues.js"` (called `issues.js`). Every choice you put to the user goes through a choice question (AskUserQuestion), never free text, and a risky branch is never settled by assuming. Recommended option first, literal UTF-8, no prose questions at reply end, never postpone. Read the full rule in the `## Decisions` section of `${CLAUDE_PLUGIN_ROOT}/skills/sniff/SKILL.md` before the first question; it applies here unchanged. +## Banner + +Start by printing this one line once, exactly as written, then continue: + +```text +( o w o ) haku build +``` + ## Loop 1. **Pick ready tasks.** Open `type:task` children whose `Depends-On` issues are closed and whose `Scope` does not overlap a running task. Skip a task labelled `deferred` (the user postponed it) or `blocked`. Never exceed `maxWorkers`. diff --git a/skills/plan/SKILL.md b/skills/plan/SKILL.md index 73e6c1e..311df74 100644 --- a/skills/plan/SKILL.md +++ b/skills/plan/SKILL.md @@ -13,6 +13,14 @@ Helper: `node "${CLAUDE_PLUGIN_ROOT}/scripts/issues.js"` (called `issues.js`). Every choice you put to the user goes through a choice question (AskUserQuestion), never free text, and a risky branch is never settled by assuming. Recommended option first, literal UTF-8, no prose questions at reply end, never postpone. Read the full rule in the `## Decisions` section of `${CLAUDE_PLUGIN_ROOT}/skills/sniff/SKILL.md` before the first question; it applies here unchanged. +## Banner + +Start by printing this one line once, exactly as written, then continue: + +```text +( o w o ) haku plan +``` + ## 1. Understand Read the repository (read-only) and the user's goal. Read `.haku/config.json` (assignee, maxWorkers, mergeMode, titlePrefix) from the repository root of the current checkout (that is the file `issues.js` itself reads) and `.haku/verify.json` from the **default branch** to learn which verify profiles exist. If either is missing, stop and point to `/haku:setup`. If the current folder is not a Git repository at all and the user is starting something new, `/haku:setup` starts the new-project flow (names, folder, remote repository); hand over to it instead of stopping. diff --git a/tests/banner.test.js b/tests/banner.test.js index 79c0991..6def240 100644 --- a/tests/banner.test.js +++ b/tests/banner.test.js @@ -31,3 +31,17 @@ test('the face is compact and the ears, face and mouth share one centre', () => assert.strictEqual(ears.indexOf('___') + 1, 4); assert.strictEqual(mouth.indexOf('vvv') + 1, 4); }); + +test('plan and build print a one-line mini banner that fits the column limit', () => { + for (const name of ['plan', 'build']) { + const text = fs.readFileSync(path.join(__dirname, '..', 'skills', name, 'SKILL.md'), 'utf8'); + const m = text.match(/## Banner[\s\S]*?```text\n([\s\S]*?)```/); + assert.ok(m, `${name}: banner block missing`); + assert.strictEqual(m[1], `( o w o ) haku ${name}\n`); + } +}); + +test('the worker prints a one-line PR banner', () => { + const worker = fs.readFileSync(path.join(__dirname, '..', 'agents', 'worker.md'), 'utf8'); + assert.match(worker, /\( o w o \) haku PR ready #N/); +}); From afc0373574434d21ab1c3a50cded686a0dc9e4bb Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 1 Nov 2026 09:00:04 +0000 Subject: [PATCH 2/3] chore: bump version to 0.16.24 Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01EQ8Gz5Faiz4FGM97WGxCXL --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 3bacf7a..6adfc3f 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -7,7 +7,7 @@ "name": "haku", "source": "./", "description": "Git-issue driven planning, orchestrator/worker development and verified merge-to-close for Claude Code (GitHub first)", - "version": "0.16.23", + "version": "0.16.24", "category": "workflow" } ] diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index cbca8c5..0bb9937 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "haku", - "version": "0.16.23", + "version": "0.16.24", "description": "HAKU - Harness Assistant Keeping Users in the loop. Git-issue driven story planning, orchestrator/worker development and verified merge-to-close for Claude Code (GitHub first, GitLab next).", "author": { "name": "dongqdev" }, "license": "MIT", From 68ea52f8adb9d61ec7a63eaa72dfb1ce057011b5 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 1 Nov 2026 10:36:06 +0000 Subject: [PATCH 3/3] chore: bump version to 0.16.25 Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01EQ8Gz5Faiz4FGM97WGxCXL --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 6adfc3f..94aea5f 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -7,7 +7,7 @@ "name": "haku", "source": "./", "description": "Git-issue driven planning, orchestrator/worker development and verified merge-to-close for Claude Code (GitHub first)", - "version": "0.16.24", + "version": "0.16.25", "category": "workflow" } ] diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 0bb9937..65762a5 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "haku", - "version": "0.16.24", + "version": "0.16.25", "description": "HAKU - Harness Assistant Keeping Users in the loop. Git-issue driven story planning, orchestrator/worker development and verified merge-to-close for Claude Code (GitHub first, GitLab next).", "author": { "name": "dongqdev" }, "license": "MIT",