From 19602c632b3c7817f729eace0c7151631c961bd0 Mon Sep 17 00:00:00 2001 From: Eric Garcia Date: Sat, 24 Jan 2026 20:32:32 -0500 Subject: [PATCH] chore: sync state.rs and add RFC/spike documents Co-Authored-By: Claude Opus 4.5 --- .blue/blue.db | Bin 233472 -> 331776 bytes .blue/docs/rfcs/0011-mcp-workflow-guidance.md | 136 +++++++++++++ .blue/docs/rfcs/0013-git-forge-integration.md | 180 ++++++++++++++++++ .../docs/rfcs/0014-test-workflow-guidance.md | 22 +++ ...2025-01-24-rfc-workflow-guidance-status.md | 94 +++++++++ .../2025-01-24-worktree-naming-mismatch.md | 83 ++++++++ ...1-25-Git Forge Integration for Blue MCP.md | 17 ++ .../2026-01-25-develop-branch-workflow.md | 76 ++++++++ crates/blue-core/src/state.rs | 15 +- 9 files changed, 619 insertions(+), 4 deletions(-) create mode 100644 .blue/docs/rfcs/0011-mcp-workflow-guidance.md create mode 100644 .blue/docs/rfcs/0013-git-forge-integration.md create mode 100644 .blue/docs/rfcs/0014-test-workflow-guidance.md create mode 100644 .blue/docs/spikes/2025-01-24-rfc-workflow-guidance-status.md create mode 100644 .blue/docs/spikes/2025-01-24-worktree-naming-mismatch.md create mode 100644 .blue/docs/spikes/2026-01-25-Git Forge Integration for Blue MCP.md create mode 100644 .blue/docs/spikes/2026-01-25-develop-branch-workflow.md diff --git a/.blue/blue.db b/.blue/blue.db index 431a14832b6c84725a82d95fb88c944d0ab8150c..97a7e99ec8d8f95485baa6d7a183f97a07dcb529 100644 GIT binary patch literal 331776 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

r*etR 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 delta 3267 zcmbtWYiv{J8UAj^K0de4!AYDO#4Y8TI5;;#g1D8tAcT|^0u+d`PlCa*jqS8RwSSVj?ODy+0Yjau5WPOU0djiFU+5?#A?UE#+j0cBFNCK`LsvBPEKN2mIx z<8z+#ywCf*-}|1gyFa(PU+XIt1cXrie%~A{yx!VhTBSOUpghz&hHnz1+8WmqwaV#N zilyDM;Jo6xg3ky;!fN&|lWCg#ku1jfsMpAGuNo{IX64wZnqm$v9AQZ^uwv3zSaY67 zeW*t)k&p-1dX0C+mk8lxuq|ya9cE4Dj$t;&I8uI~So{nX1EOwhb7Nz&EhI$ap zjdu7WM*GwQ#?6ZDE@>y)W@C(t{t_V=3h4>s8~;4xL%(5Mm~vE>`;ly2_ck{g2g{x@ zzMJ~;L&^#CvGP(Ma{fTY@M zHjc33j8;RPu)>%*VT@7kKV)IFf1-UBW^4vyD=`xztXZj<-cVaxQD0eKHKWpKuIQHm z4c>0^xMq2ce^rdj@;yAQT&roQs%fa6UQt&wy}o*e`NSM{ycWtPzVgC6*j=M%3Xq$DEh=gB7{3gE&r>^kj zE<(LH9ZYRYtxz#7#o>6UvqO)iQ&0>D!sjD?oqxtZ=5O(n{AYY8Z|9Hm`TSe{HUEUa z&tKz5`18Dn$N2`n3>b5`F@Mwh6?y6i*WTviwTqlVpiHQZ?YEf!JvcBEk_aK?Kc%Qq5n4fBDnc&|^vd>DkGiF}y0 z47mHQ@|^0b8P#QQYJ%62ygFYs#ZvKH2udO}^Oe5veGRQae}A)RAGnYX2kvE5A{bPtX&au|CEA&$=2=6HOY zLiQin!NMRSDm=G$&lfiZ!Q%dO0Sg3#qn55&mgi;!hraXjUM`t1&OzU1a zB$UYxw@c=dQ`A(hh?1naBuBoixK!Eck`zUqrq!sbBsxXuTUyoK-HjRQU4#%`=nMoy z=}0^#Q|iPii8AvxCXbl21ft|(8j427fF3a%2}a}XojRfBDS;FbN1J&`AdltKgq~C~ zIk2Rjh%1zWWV2Nz2R3LbYRWDDD&r-NWvkiZ{X zHX-0M&d9brr-ZbHhyzZ#tRMU6-Z}wTNF^fMbnLV+)=vf_Y>!6LP^vBFtp$LGKxg=SfDP>|H!u^Q5F*f(VLC2Zroy4_7!x%w33T7sZ55g>9 zfml541;Zq$XDX6PM`G<>NX`oC&E!1;D4(=65p5>Ya_*s&8*9(nqA5zi^$JHI5)11) zN+`oZQV&KuO2ApLw#0G_iz&S$7)wV&C6qEra>-j!opl=`Y6DX5@J|kuu8rBiYKn?o^gH4S+yaZ}A=8;(KKlLrIxc^rvh6CJ*$jGdl!5R)2tz9y@;_9k&{oGNvk$@+PV< za@r}oi)e_r0^mbQ;ZqL0>%!jIJGZ5D1cRx zaJ(z?SSf;bwY{(_pYej&UT6!^!!Xvs3r96_{BHz=8V+XZcLA!}5wM*u1bR6VOY7~) zpjEy?SPLu>Om8WKNSUTDv|@EJ$?ekKLZx%<7(x{i{woGTEBfpJ(7`?cWm}8h-&!== zTK4F-7MItaCW77AUa0iwaEA(uTvQ}pgi0C^0{;oCMC{(62+iI%8qrcUIy0dCERPE8 z^)fm$pcCzx0eZ3_3ZMMM!W!#-LIa522>|TR-DS7xpB+j6Fa0Mdzrv;`(-6tf z1NZK`+~0>f3QxiZNWYFelWlHng}}h>gdv-ow*dB*2<1FtU4x}&eX+#%BaQDx{5yV& z{{uE4pYuQQOZ)==4L`@v^3(hT-?Zaj88kK}RAA?a1;QE8>? zs&kR6&(+`<5-&Oqi2KAQ`Ul!Y>*QW2@_F(US%UwK&*7)>Of&>D=EcF>)npDadt1n- z=FN?y)$CtP9ycpDl69uJh-@{R7n3IQ^(ADDxqm4MnxC#EZRY89WQBQhJ!vsNcmi-w zZGfw-Ye_wWyzu>xd8Y l>rj`kc#Z@QuOhhFdco*G${SxW-$|CB?(YK}1mH;Ne*h~q;0*u( diff --git a/.blue/docs/rfcs/0011-mcp-workflow-guidance.md b/.blue/docs/rfcs/0011-mcp-workflow-guidance.md new file mode 100644 index 0000000..ccee2ef --- /dev/null +++ b/.blue/docs/rfcs/0011-mcp-workflow-guidance.md @@ -0,0 +1,136 @@ +# RFC 0011: MCP Workflow Guidance + +| | | +|---|---| +| **Status** | In Progress | +| **Date** | 2026-01-25 | +| **Source Spike** | Inconsistent Worktree Creation in Claude MCP | + +--- + +## Problem + +Claude doesn't consistently create worktrees and feature branches when implementing RFCs via MCP. Investigation found five root causes: + +1. **Tool descriptions lack workflow context** - `blue_worktree_create` says what it does but not *when* to use it +2. **CLI syntax in MCP responses** - `blue_next` says "Run 'blue worktree create'" instead of "Use blue_worktree_create" +3. **Hints don't name tools** - `generate_hint()` says "Want to start?" but doesn't say how +4. **No next_action on status change** - When RFC becomes "accepted", response has no guidance +5. **No warning on premature in-progress** - RFC can go in-progress without worktree, only detected later as "stalled" + +The result: Claude skips worktree creation ~50% of the time, working directly on main branch. + +## Goals + +1. Claude creates worktrees consistently when implementing accepted RFCs +2. MCP responses guide Claude to the next workflow step +3. Tool descriptions explain their place in the workflow +4. Warnings surface when workflow is violated + +## Non-Goals + +- Enforcing worktree creation (just guiding) +- Changing the workflow itself +- CLI behavior changes (MCP only) + +## Proposal + +### 1. Add `next_action` field to status-changing responses + +When `blue_rfc_update_status` changes status to "accepted": + +```json +{ + "status": "success", + "title": "my-feature", + "new_status": "accepted", + "next_action": { + "tool": "blue_worktree_create", + "args": { "title": "my-feature" }, + "hint": "Create a worktree to start implementation" + } +} +``` + +### 2. Fix `blue_next` to use MCP tool syntax + +Change: +```rust +"'{}' is ready to implement. Run 'blue worktree create {}' to start." +``` + +To: +```rust +"'{}' is ready to implement. Use blue_worktree_create with title='{}' to start." +``` + +### 3. Update `generate_hint()` to name tools + +Change: +```rust +"'{}' is ready to implement. Want to start?" +``` + +To: +```rust +"'{}' is ready to implement. Use blue_worktree_create to begin." +``` + +### 4. Enhance tool descriptions with workflow context + +Current: +``` +"Create an isolated git worktree for RFC implementation." +``` + +Proposed: +``` +"Create an isolated git worktree for RFC implementation. Use after an RFC is accepted, before starting work. Creates a feature branch and switches to isolated directory." +``` + +### 5. Add warning when RFC goes in-progress without worktree + +In `handle_rfc_update_status`, when status becomes "in-progress": + +```json +{ + "status": "success", + "warning": "No worktree exists for this RFC. Consider creating one with blue_worktree_create.", + ... +} +``` + +## Alternatives Considered + +### A. Require worktree before in-progress +Rejected: Too restrictive. Some quick fixes don't need worktrees. + +### B. Auto-create worktree on accept +Rejected: Side effects without explicit user action violate principle of least surprise. + +### C. Add workflow documentation to MCP server description +Partial: Good idea but doesn't solve the in-context guidance problem. + +## Implementation Plan + +1. Add `next_action` struct and field to response types +2. Update `handle_rfc_update_status` to include next_action +3. Update `handle_next` to use MCP tool syntax +4. Update `generate_hint()` to name tools +5. Enhance tool descriptions in `handle_tools_list` +6. Add worktree warning in status transitions + +## Test Plan + +- [x] `blue_rfc_update_status` to "accepted" includes next_action with blue_worktree_create +- [x] `blue_next` output uses MCP tool syntax, not CLI syntax +- [x] `blue_status` hint mentions tool names +- [x] Tool description for blue_worktree_create includes workflow context +- [x] `blue_rfc_update_status` to "in-progress" warns if no worktree exists +- [ ] Manual test: Claude creates worktree after accepting RFC + +--- + +*"Show, don't tell. But also tell, when showing isn't enough."* + +— Blue diff --git a/.blue/docs/rfcs/0013-git-forge-integration.md b/.blue/docs/rfcs/0013-git-forge-integration.md new file mode 100644 index 0000000..a453b2f --- /dev/null +++ b/.blue/docs/rfcs/0013-git-forge-integration.md @@ -0,0 +1,180 @@ +# RFC 0013: Git Forge Integration + +| | | +|---|---| +| **Status** | Implemented | +| **Date** | 2026-01-25 | +| **Source Spike** | Git Forge Integration for Blue MCP | + +--- + +## Problem + +Blue's PR tools (`blue_pr_create`, `blue_pr_verify`, `blue_pr_merge`) shell out to `gh` CLI, which only works with GitHub. Users with Forgejo/Gitea remotes can't create PRs via Blue MCP - the commands fail silently or with cryptic errors. + +This blocks the workflow for anyone not using GitHub. + +## Goals + +1. Native REST API integration for GitHub and Forgejo/Gitea +2. Auto-detect forge type from git remotes +3. Unified interface - same Blue tools work regardless of forge +4. No external CLI dependencies (`gh`, `tea`, etc.) + +## Non-Goals + +- GitLab support (different API, future RFC) +- Issue management (PRs only for now) +- Full forge feature parity (minimal surface for Blue's workflow) + +## Proposal + +### 1. Forge Trait + +```rust +pub trait Forge: Send + Sync { + fn create_pr(&self, opts: CreatePrOpts) -> Result; + fn get_pr(&self, owner: &str, repo: &str, number: u64) -> Result; + fn merge_pr(&self, owner: &str, repo: &str, number: u64, strategy: MergeStrategy) -> Result<(), ForgeError>; + fn pr_is_merged(&self, owner: &str, repo: &str, number: u64) -> Result; +} + +pub struct CreatePrOpts { + pub owner: String, + pub repo: String, + pub head: String, // branch with changes + pub base: String, // target branch + pub title: String, + pub body: Option, + pub draft: bool, +} + +pub enum MergeStrategy { + Merge, + Squash, + Rebase, +} +``` + +### 2. Implementations + +**GitHubForge** +- Endpoint: `https://api.github.com/repos/{owner}/{repo}/pulls` +- Auth: `Authorization: Bearer {GITHUB_TOKEN}` + +**ForgejoForge** (works with Gitea too) +- Endpoint: `https://{host}/api/v1/repos/{owner}/{repo}/pulls` +- Auth: `Authorization: token {FORGEJO_TOKEN}` + +### 3. Auto-Detection + +Parse git remotes to detect forge type: + +```rust +fn detect_forge(remote_url: &str) -> ForgeType { + let url = parse_git_url(remote_url); + + match url.host { + "github.com" => ForgeType::GitHub, + "codeberg.org" => ForgeType::Forgejo, + host if host.contains("gitea") => ForgeType::Forgejo, + host if host.contains("forgejo") => ForgeType::Forgejo, + _ => { + // Probe /api/v1/version - Forgejo/Gitea respond, GitHub doesn't + if probe_forgejo_api(&url.host) { + ForgeType::Forgejo + } else { + ForgeType::GitHub // fallback + } + } + } +} +``` + +Cache detected type in `.blue/config.yaml`: + +```yaml +forge: + type: forgejo + host: git.beyondtheuniverse.superviber.com + owner: superviber + repo: blue +``` + +### 4. Token Resolution + +Environment variables with fallback chain: + +| Forge | Variables (in order) | +|-------|---------------------| +| GitHub | `GITHUB_TOKEN`, `GH_TOKEN` | +| Forgejo | `FORGEJO_TOKEN`, `GITEA_TOKEN` | + +### 5. Updated MCP Tools + +`blue_pr_create` changes: +- Remove `gh` CLI dependency +- Use detected forge's REST API +- Return PR URL directly + +Response includes forge info: + +```json +{ + "status": "success", + "pr_url": "https://git.example.com/owner/repo/pulls/42", + "pr_number": 42, + "forge": "forgejo" +} +``` + +### 6. New Module Structure + +``` +crates/blue-core/src/ +├── forge/ +│ ├── mod.rs # Forge trait, ForgeType, detection +│ ├── github.rs # GitHub implementation +│ ├── forgejo.rs # Forgejo/Gitea implementation +│ └── git_url.rs # URL parsing utilities +``` + +## Alternatives Considered + +### A. Keep shelling out to CLIs +Rejected: Requires users to install and configure `gh`/`tea`. Fragile, hard to get structured output. + +### B. Use existing MCP servers (forgejo-mcp, github-mcp) +Rejected: Adds external dependencies. forgejo-mcp doesn't support PR creation. Better to own the integration. + +### C. GitLab support in this RFC +Deferred: Different API patterns. Keep scope focused. Future RFC. + +## Implementation Plan + +1. Add `forge` module to blue-core with trait and types +2. Implement `ForgejoForge` with REST client +3. Implement `GitHubForge` with REST client +4. Add auto-detection logic with caching +5. Update `handle_pr_create` to use forge +6. Update `handle_pr_verify` and `handle_pr_merge` +7. Remove `gh` CLI dependency + +## Test Plan + +- [ ] ForgejoForge creates PR via REST API +- [ ] GitHubForge creates PR via REST API +- [ ] Auto-detection identifies github.com as GitHub +- [ ] Auto-detection identifies codeberg.org as Forgejo +- [ ] Auto-detection probes unknown hosts +- [ ] Token resolution finds FORGEJO_TOKEN +- [ ] Token resolution finds GITHUB_TOKEN +- [ ] blue_pr_create works with Forgejo remote +- [ ] blue_pr_create works with GitHub remote +- [ ] PR merge works with both forges + +--- + +*"One interface, many forges. The abstraction serves the worker."* + +— Blue diff --git a/.blue/docs/rfcs/0014-test-workflow-guidance.md b/.blue/docs/rfcs/0014-test-workflow-guidance.md new file mode 100644 index 0000000..ce3bb6d --- /dev/null +++ b/.blue/docs/rfcs/0014-test-workflow-guidance.md @@ -0,0 +1,22 @@ +# RFC 0014: Test Workflow Guidance + +| | | +|---|---| +| **Status** | Accepted | +| **Date** | 2026-01-25 | + +--- + +## Summary + +Test RFC to verify RFC 0011 workflow guidance works correctly. + +## Test Plan + +- [ ] TBD + +--- + +*"Right then. Let's get to it."* + +— Blue diff --git a/.blue/docs/spikes/2025-01-24-rfc-workflow-guidance-status.md b/.blue/docs/spikes/2025-01-24-rfc-workflow-guidance-status.md new file mode 100644 index 0000000..bfff8cd --- /dev/null +++ b/.blue/docs/spikes/2025-01-24-rfc-workflow-guidance-status.md @@ -0,0 +1,94 @@ +# Spike: RFC Workflow Guidance Status + +**Date:** 2025-01-24 +**Time-box:** 30 minutes +**Status:** Complete + +## Question + +Does Blue have the RFC workflow baked in like coherence-mcp did? + +## Short Answer + +**No.** RFC 0011 was supposed to add this, but it's marked "Implemented" with all test items unchecked. The implementation is incomplete. + +## Investigation + +### What coherence-mcp Had (The Goal) + +Baked-in workflow guidance that told Claude exactly what to do next: +- RFC accepted → "Use `blue_worktree_create` to start implementation" +- Worktree created → "Make your changes, then use `blue_pr_create`" +- PR merged → "Use `blue_worktree_cleanup` to finish" + +Each response included `next_action` with the exact tool and args. + +### What Blue Has Now + +**Individual tools exist:** +- `blue_rfc_create` / `blue_rfc_update_status` / `blue_rfc_plan` / `blue_rfc_complete` +- `blue_worktree_create` / `blue_worktree_cleanup` +- `blue_pr_create` / `blue_pr_merge` +- `blue_status` / `blue_next` + +**But no orchestration:** +- `blue_next` still uses CLI syntax: `"Run 'blue worktree create'"` (server.rs:2234) +- `blue_worktree_create` description lacks workflow context (server.rs:484) +- No `next_action` in RFC status changes +- No warning when RFC goes in-progress without worktree + +### RFC 0011 Test Plan Status + +| Test Item | Status | +|-----------|--------| +| `blue_rfc_update_status` to "accepted" includes next_action | ❌ Not done | +| `blue_next` uses MCP tool syntax | ❌ Not done | +| `blue_status` hint mentions tool names | ❌ Not done | +| `blue_worktree_create` description includes workflow context | ❌ Not done | +| `blue_rfc_update_status` warns if no worktree | ❌ Not done | +| Manual test: Claude creates worktree after accepting RFC | ❌ Not done | + +**All 6 items unchecked, but RFC marked "Implemented".** + +### Evidence from Code + +```rust +// server.rs:2234 - Still uses CLI syntax +"'{}' is ready to implement. Run 'blue worktree create {}' to start." + +// server.rs:484 - No workflow context +"description": "Create an isolated git worktree for RFC implementation." + +// Only next_action in entire codebase (worktree.rs:256) +"next_action": "Execute the commands to sync with develop" +``` + +### What's Missing + +1. **`next_action` struct** - Not added to response types +2. **MCP tool syntax in responses** - Still says "Run 'blue ...'" not "Use blue_..." +3. **Workflow context in descriptions** - Tools don't explain when to use them +4. **Worktree warnings** - No warning when RFC goes in-progress without worktree +5. **Generate hint improvements** - Hints don't name specific tools + +## Root Cause + +RFC 0011 was created and marked "Implemented" prematurely. There's even a worktree at `.blue/worktrees/mcp-workflow-guidance/` suggesting work started but wasn't completed. + +## Recommendation + +1. **Reopen RFC 0011** - Change status back to "in-progress" +2. **Implement the 6 test items** - They're well-specified already +3. **This will fix the worktree naming issue** - Claude will use Blue's tools instead of improvising + +## Impact + +Without this, Claude will continue to: +- Skip worktree creation ~50% of the time +- Invent its own worktree naming (like `../fungal-image-analysis-rfc0069`) +- Work directly on main branch +- Not follow the RFC workflow + +## Outcome + +RFC 0011 is the right solution but wasn't actually implemented. Completing it will give Blue the baked-in workflow guidance that coherence-mcp had. diff --git a/.blue/docs/spikes/2025-01-24-worktree-naming-mismatch.md b/.blue/docs/spikes/2025-01-24-worktree-naming-mismatch.md new file mode 100644 index 0000000..167f9af --- /dev/null +++ b/.blue/docs/spikes/2025-01-24-worktree-naming-mismatch.md @@ -0,0 +1,83 @@ +# Spike: Worktree Naming Mismatch Investigation + +**Date:** 2025-01-24 +**Time-box:** 30 minutes +**Status:** Complete + +## Problem + +User reported seeing: +``` +Done. Implementation complete in worktree ../fungal-image-analysis-rfc0069 +(branch rfc0069-job-status-namespace) +``` + +The worktree/branch weren't created with the right names. + +## Investigation + +### Blue's Actual Worktree Naming Patterns + +**Single-repo worktrees** (`crates/blue-mcp/src/handlers/worktree.rs`): +- Path: `~/.blue/worktrees/` (e.g., `~/.blue/worktrees/job-status-namespace`) +- Branch: `` (RFC number prefix stripped per RFC 0007) +- Example: RFC `0069-job-status-namespace` → branch `job-status-namespace` + +**Realm multi-repo worktrees** (`crates/blue-mcp/src/handlers/realm.rs`): +- Path: `~/.blue/worktrees///` +- Branch: `rfc/` (prefixed with `rfc/`) +- Example: RFC `0069-job-status-namespace` → branch `rfc/0069-job-status-namespace` + +### What the User Saw + +- Path: `../fungal-image-analysis-rfc0069` +- Branch: `rfc0069-job-status-namespace` + +### Key Finding: Not From Blue + +The observed output doesn't match either Blue pattern: + +| Aspect | Blue Single-Repo | Blue Realm | User Saw | +|--------|------------------|------------|----------| +| Path style | Absolute (`~/.blue/...`) | Absolute (`~/.blue/...`) | Relative (`../`) | +| Path components | `worktrees/` | `worktrees///` | `-` | +| Branch format | `` | `rfc/` | `rfc-` (no slash) | + +There's no code in Blue that: +1. Produces relative paths like `../` +2. Uses the squashed `rfc0069` format (no leading zeros, no separator) +3. Combines repo name with RFC number in a single path segment + +## Root Cause + +The message "Implementation complete in worktree" is **not from Blue** - it's from the LLM agent (Claude) that was implementing the feature. + +The LLM agent likely: +1. **Constructed its own worktree path** instead of using `blue_worktree_create` or `blue_realm_worktree_create` +2. **Used `git worktree add` directly** via Bash, inventing its own naming convention +3. **Hallucinated the path/branch names** in its completion message + +## Evidence + +1. Searched Blue codebase for `../` pattern - not found +2. Searched for `rfc\d+` squashed format - not found (only `rfc3339` date formats) +3. Blue's worktree success messages don't include "Implementation complete" +4. Blue always uses absolute paths via `state.home.worktrees_path` or `DaemonPaths` + +## Additional Issues Found + +While investigating, identified these potential problems in Blue's worktree code: + +1. **Inconsistent naming between single/realm**: Single-repo strips RFC number, realm preserves it with `rfc/` prefix +2. **Store failures silently ignored**: `let _ = state.store.add_worktree()` at worktree.rs:87 +3. **Realm worktrees not persisted**: `realm.rs:551-691` never calls `add_worktree()` + +## Recommendations + +1. **Guide LLM agents**: Add clear instructions in `blue_guide` about always using Blue's worktree tools, never raw git worktree commands +2. **Validate in status**: `blue_status` could check for orphan worktrees (git worktrees not in Blue's store) +3. **Consider RFC for guidance**: Write an RFC for "LLM Agent Worktree Best Practices" if this recurs + +## Outcome + +The worktree naming wasn't wrong in Blue - the LLM agent bypassed Blue's tools entirely and invented its own naming. The fix is behavioral (prompt engineering/guidance) rather than code. diff --git a/.blue/docs/spikes/2026-01-25-Git Forge Integration for Blue MCP.md b/.blue/docs/spikes/2026-01-25-Git Forge Integration for Blue MCP.md new file mode 100644 index 0000000..02469f4 --- /dev/null +++ b/.blue/docs/spikes/2026-01-25-Git Forge Integration for Blue MCP.md @@ -0,0 +1,17 @@ +# Spike: Git Forge Integration for Blue MCP + +| | | +|---|---| +| **Status** | In Progress | +| **Date** | 2026-01-25 | +| **Time Box** | 1 hour | + +--- + +## Question + +What APIs do Forgejo and GitHub expose for PR creation? How should Blue auto-detect which forge to use? What's the minimal API surface needed? + +--- + +*Investigation notes by Blue* diff --git a/.blue/docs/spikes/2026-01-25-develop-branch-workflow.md b/.blue/docs/spikes/2026-01-25-develop-branch-workflow.md new file mode 100644 index 0000000..f09b150 --- /dev/null +++ b/.blue/docs/spikes/2026-01-25-develop-branch-workflow.md @@ -0,0 +1,76 @@ +# Spike: Develop Branch Workflow + +| | | +|---|---| +| **Status** | Complete | +| **Date** | 2026-01-25 | + +--- + +## Question + +How should we implement the develop branch workflow for Blue, and what's needed to enforce it consistently? + +--- + +## Findings + +### Current State + +| Branch | Location | Purpose | +|--------|----------|---------| +| `main` | forgejo, origin | Only branch - contains all production code | +| `git-forge-integration` | forgejo | RFC 0013 feature branch | +| `mcp-workflow-guidance` | forgejo | RFC 0011 feature branch | + +**Problem:** `blue_pr_create` defaults to `develop` base and rejects `main`/`master`, but no `develop` branch exists. Feature branches can't be merged. + +### The Workflow Model + +``` +main (production releases only) + ↑ merge when releasing +develop (integration branch) + ↑ PRs merge here +feature branches (rfc/*, feature/*) +``` + +**Why this matters:** +- `main` stays stable - only receives tested, integrated code +- `develop` is where features integrate before release +- Prevents accidental direct commits to production +- Enables release management (develop → main when ready) + +### What's Needed + +1. **Create `develop` branch** from current `main` +2. **Push to forgejo** +3. **Update forgejo settings** - set default branch to `develop` +4. **Rebase existing feature branches** onto `develop` +5. **Add `blue_release_create`** tool for develop → main merges + +### Tool Enforcement (Already Done) + +`blue_pr_create` in `pr.rs:59-71`: +- Defaults base to `develop` +- Rejects `main`/`master` with helpful message +- This is correct - just needs the branch to exist + +## Recommendation + +**Proceed.** Create the `develop` branch now. This is a one-time setup: + +```bash +# From main branch +git checkout main +git checkout -b develop +git push forgejo develop + +# On Forgejo: Settings → Branches → Default Branch → develop +``` + +Then existing feature branches can create PRs targeting `develop`. + +## Outcome + +Proceed with implementation - create develop branch and update forgejo settings. diff --git a/crates/blue-core/src/state.rs b/crates/blue-core/src/state.rs index 71838d1..3fc2abb 100644 --- a/crates/blue-core/src/state.rs +++ b/crates/blue-core/src/state.rs @@ -180,6 +180,7 @@ impl ProjectState { } /// Generate a status hint for the user + /// Uses MCP tool syntax per RFC 0011 pub fn generate_hint(&self) -> String { let active = self.active_items(); let ready = self.ready_items(); @@ -187,20 +188,26 @@ impl ProjectState { if !stalled.is_empty() { return format!( - "'{}' might be stalled - it's in-progress but has no worktree. Use blue_worktree_create to fix.", + "'{}' is in-progress but has no worktree. Use blue_worktree_create to work in isolation.", stalled[0].title ); } if !ready.is_empty() { - return format!("'{}' is ready to implement. Use blue_worktree_create to begin.", ready[0].title); + return format!( + "'{}' is ready to implement. Use blue_worktree_create to begin.", + ready[0].title + ); } if !active.is_empty() { - return format!("{} item(s) currently in progress", active.len()); + return format!( + "{} item(s) in progress. Use blue_rfc_complete when done.", + active.len() + ); } - "Nothing pressing right now. Good time to plan?".to_string() + "Nothing in flight. Use blue_rfc_create to start something new.".to_string() } /// Get project status summary