opencode-hive 0.8.3 → 0.9.1
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/dist/agents/forager.d.ts +23 -0
- package/dist/agents/hive.d.ts +16 -12
- package/dist/agents/index.d.ts +33 -0
- package/dist/agents/receiver.d.ts +22 -0
- package/dist/agents/scout.d.ts +21 -0
- package/dist/index.js +1879 -251
- package/dist/skills/builtin.d.ts +6 -5
- package/dist/skills/registry.generated.d.ts +14 -0
- package/dist/utils/agent-selector.d.ts +9 -1
- package/package.json +3 -2
- package/skills/hive-execution/SKILL.md +94 -240
package/dist/index.js
CHANGED
|
@@ -14,7 +14,6 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
|
14
14
|
// src/index.ts
|
|
15
15
|
import * as path5 from "path";
|
|
16
16
|
import * as fs6 from "fs";
|
|
17
|
-
import { fileURLToPath } from "url";
|
|
18
17
|
|
|
19
18
|
// ../../node_modules/.bun/zod@4.1.8/node_modules/zod/v4/classic/external.js
|
|
20
19
|
var exports_external = {};
|
|
@@ -12336,6 +12335,1185 @@ function tool(input) {
|
|
|
12336
12335
|
return input;
|
|
12337
12336
|
}
|
|
12338
12337
|
tool.schema = exports_external;
|
|
12338
|
+
// src/skills/registry.generated.ts
|
|
12339
|
+
var BUILTIN_SKILL_NAMES = ["hive", "hive-execution"];
|
|
12340
|
+
var BUILTIN_SKILLS = [
|
|
12341
|
+
{
|
|
12342
|
+
name: "hive",
|
|
12343
|
+
description: "Plan-first AI development with isolated git worktrees and human review. Use for any feature development.",
|
|
12344
|
+
template: `# Hive Workflow
|
|
12345
|
+
|
|
12346
|
+
Plan-first development with phase-aware orchestration.
|
|
12347
|
+
|
|
12348
|
+
## Architecture
|
|
12349
|
+
|
|
12350
|
+
\`\`\`
|
|
12351
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
12352
|
+
│ @hive (Phase-Aware Master) │
|
|
12353
|
+
│ │
|
|
12354
|
+
│ Scout Mode ◄────── replan ──────► Receiver Mode │
|
|
12355
|
+
│ (Planning) (Orchestration) │
|
|
12356
|
+
│ │ │ │
|
|
12357
|
+
│ ▼ ▼ │
|
|
12358
|
+
│ background_task hive_exec_start │
|
|
12359
|
+
│ (research) (spawn worker) │
|
|
12360
|
+
└─────────────────────────────────────────────────────────────┘
|
|
12361
|
+
│
|
|
12362
|
+
▼
|
|
12363
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
12364
|
+
│ Forager (Worker) │
|
|
12365
|
+
│ - Executes in isolated worktree │
|
|
12366
|
+
│ - Reports via hive_exec_complete │
|
|
12367
|
+
│ - Can research via background_task │
|
|
12368
|
+
└─────────────────────────────────────────────────────────────┘
|
|
12369
|
+
\`\`\`
|
|
12370
|
+
|
|
12371
|
+
---
|
|
12372
|
+
|
|
12373
|
+
## Phase Detection
|
|
12374
|
+
|
|
12375
|
+
The @hive agent auto-switches mode based on feature state:
|
|
12376
|
+
|
|
12377
|
+
| State | Mode | Focus |
|
|
12378
|
+
|-------|------|-------|
|
|
12379
|
+
| No feature / planning | **Scout** | Discovery → Planning |
|
|
12380
|
+
| Approved | **Transition** | Sync tasks → Start execution |
|
|
12381
|
+
| Executing | **Receiver** | Spawn workers → Handle blockers → Merge |
|
|
12382
|
+
| Completed | **Report** | Summarize and close |
|
|
12383
|
+
|
|
12384
|
+
Check with \`hive_status()\`.
|
|
12385
|
+
|
|
12386
|
+
---
|
|
12387
|
+
|
|
12388
|
+
## Agents
|
|
12389
|
+
|
|
12390
|
+
| Agent | Mode | Use |
|
|
12391
|
+
|-------|------|-----|
|
|
12392
|
+
| \`@hive\` | Auto | Primary agent - switches Scout/Receiver |
|
|
12393
|
+
| \`@scout\` | Explicit | Planning only (won't execute) |
|
|
12394
|
+
| \`@receiver\` | Explicit | Orchestration only (won't plan) |
|
|
12395
|
+
| \`@forager\` | Subagent | Spawned by exec_start (don't invoke directly) |
|
|
12396
|
+
|
|
12397
|
+
---
|
|
12398
|
+
|
|
12399
|
+
## Research Delegation (OMO-Slim)
|
|
12400
|
+
|
|
12401
|
+
All agents can delegate research to specialists:
|
|
12402
|
+
|
|
12403
|
+
| Specialist | Use For |
|
|
12404
|
+
|------------|---------|
|
|
12405
|
+
| **explorer** | Find code patterns, locate files |
|
|
12406
|
+
| **librarian** | External docs, API references |
|
|
12407
|
+
| **oracle** | Architecture advice, debugging |
|
|
12408
|
+
| **designer** | UI/UX guidance, component patterns |
|
|
12409
|
+
|
|
12410
|
+
\`\`\`
|
|
12411
|
+
background_task({
|
|
12412
|
+
agent: "explorer",
|
|
12413
|
+
prompt: "Find all API routes in src/api/",
|
|
12414
|
+
description: "Find API patterns",
|
|
12415
|
+
sync: true
|
|
12416
|
+
})
|
|
12417
|
+
\`\`\`
|
|
12418
|
+
|
|
12419
|
+
---
|
|
12420
|
+
|
|
12421
|
+
## Intent Classification (Do First)
|
|
12422
|
+
|
|
12423
|
+
| Intent | Signals | Action |
|
|
12424
|
+
|--------|---------|--------|
|
|
12425
|
+
| **Trivial** | Single file, <10 lines | Do directly. No feature. |
|
|
12426
|
+
| **Simple** | 1-2 files, <30 min | Quick questions → light plan or just do it |
|
|
12427
|
+
| **Complex** | 3+ files, needs review | Full feature workflow |
|
|
12428
|
+
| **Refactor** | "refactor", existing code | Safety: tests, rollback, blast radius |
|
|
12429
|
+
| **Greenfield** | New feature, "build new" | Discovery: find patterns first |
|
|
12430
|
+
|
|
12431
|
+
**Don't over-plan trivial tasks.**
|
|
12432
|
+
|
|
12433
|
+
---
|
|
12434
|
+
|
|
12435
|
+
## Lifecycle
|
|
12436
|
+
|
|
12437
|
+
\`\`\`
|
|
12438
|
+
Classify Intent → Discovery → Plan → Review → Execute → Merge
|
|
12439
|
+
↑ │
|
|
12440
|
+
└───────── replan ──────────┘
|
|
12441
|
+
\`\`\`
|
|
12442
|
+
|
|
12443
|
+
---
|
|
12444
|
+
|
|
12445
|
+
## Phase 1: Discovery (Scout Mode)
|
|
12446
|
+
|
|
12447
|
+
### Research First (Greenfield/Complex)
|
|
12448
|
+
|
|
12449
|
+
\`\`\`
|
|
12450
|
+
background_task({ agent: "explorer", prompt: "Find patterns...", sync: true })
|
|
12451
|
+
hive_context_write({ name: "research", content: "# Findings\\n..." })
|
|
12452
|
+
\`\`\`
|
|
12453
|
+
|
|
12454
|
+
### Question Tool
|
|
12455
|
+
|
|
12456
|
+
\`\`\`json
|
|
12457
|
+
{
|
|
12458
|
+
"questions": [{
|
|
12459
|
+
"question": "What authentication should we use?",
|
|
12460
|
+
"header": "Auth Strategy",
|
|
12461
|
+
"options": [
|
|
12462
|
+
{ "label": "JWT", "description": "Token-based, stateless" },
|
|
12463
|
+
{ "label": "Session", "description": "Cookie-based, server state" }
|
|
12464
|
+
]
|
|
12465
|
+
}]
|
|
12466
|
+
}
|
|
12467
|
+
\`\`\`
|
|
12468
|
+
|
|
12469
|
+
### Self-Clearance Check
|
|
12470
|
+
|
|
12471
|
+
After each exchange:
|
|
12472
|
+
\`\`\`
|
|
12473
|
+
□ Core objective clear?
|
|
12474
|
+
□ Scope boundaries defined?
|
|
12475
|
+
□ No critical ambiguities?
|
|
12476
|
+
□ Technical approach decided?
|
|
12477
|
+
|
|
12478
|
+
ALL YES → Write plan
|
|
12479
|
+
ANY NO → Ask the unclear thing
|
|
12480
|
+
\`\`\`
|
|
12481
|
+
|
|
12482
|
+
---
|
|
12483
|
+
|
|
12484
|
+
## Phase 2: Plan
|
|
12485
|
+
|
|
12486
|
+
### Create Feature
|
|
12487
|
+
|
|
12488
|
+
\`\`\`
|
|
12489
|
+
hive_feature_create({ name: "feature-name" })
|
|
12490
|
+
\`\`\`
|
|
12491
|
+
|
|
12492
|
+
### Save Context (Royal Jelly)
|
|
12493
|
+
|
|
12494
|
+
\`\`\`
|
|
12495
|
+
hive_context_write({
|
|
12496
|
+
name: "research",
|
|
12497
|
+
content: "# Findings\\n- Pattern at src/lib/auth:45-78..."
|
|
12498
|
+
})
|
|
12499
|
+
\`\`\`
|
|
12500
|
+
|
|
12501
|
+
### Write Plan
|
|
12502
|
+
|
|
12503
|
+
\`\`\`
|
|
12504
|
+
hive_plan_write({ content: "..." })
|
|
12505
|
+
\`\`\`
|
|
12506
|
+
|
|
12507
|
+
### Plan Structure (REQUIRED)
|
|
12508
|
+
|
|
12509
|
+
\`\`\`markdown
|
|
12510
|
+
# {Feature Title}
|
|
12511
|
+
|
|
12512
|
+
## Discovery
|
|
12513
|
+
|
|
12514
|
+
### Original Request
|
|
12515
|
+
- "{User's exact words}"
|
|
12516
|
+
|
|
12517
|
+
### Interview Summary
|
|
12518
|
+
- {Point}: {Decision}
|
|
12519
|
+
|
|
12520
|
+
### Research Findings
|
|
12521
|
+
- \`{file:lines}\`: {Finding}
|
|
12522
|
+
|
|
12523
|
+
---
|
|
12524
|
+
|
|
12525
|
+
## Non-Goals (What we're NOT building)
|
|
12526
|
+
- {Explicit exclusion}
|
|
12527
|
+
|
|
12528
|
+
## Ghost Diffs (Alternatives Rejected)
|
|
12529
|
+
- {Approach}: {Why rejected}
|
|
12530
|
+
|
|
12531
|
+
---
|
|
12532
|
+
|
|
12533
|
+
## Tasks
|
|
12534
|
+
|
|
12535
|
+
### 1. {Task Title}
|
|
12536
|
+
|
|
12537
|
+
**What to do**:
|
|
12538
|
+
- {Implementation step}
|
|
12539
|
+
|
|
12540
|
+
**Must NOT do**:
|
|
12541
|
+
- {Task guardrail}
|
|
12542
|
+
|
|
12543
|
+
**References**:
|
|
12544
|
+
- \`{file:lines}\` — {WHY this reference}
|
|
12545
|
+
|
|
12546
|
+
**Acceptance Criteria**:
|
|
12547
|
+
- [ ] {Verifiable outcome}
|
|
12548
|
+
- [ ] Run: \`{command}\` → {expected}
|
|
12549
|
+
|
|
12550
|
+
---
|
|
12551
|
+
|
|
12552
|
+
## Success Criteria
|
|
12553
|
+
- [ ] {Final checklist}
|
|
12554
|
+
\`\`\`
|
|
12555
|
+
|
|
12556
|
+
### Key Sections
|
|
12557
|
+
|
|
12558
|
+
| Section | Purpose |
|
|
12559
|
+
|---------|---------|
|
|
12560
|
+
| **Discovery** | Ground plan in user words + research |
|
|
12561
|
+
| **Non-Goals** | Prevents scope creep |
|
|
12562
|
+
| **Ghost Diffs** | Prevents re-proposing rejected solutions |
|
|
12563
|
+
| **References** | File:line citations with WHY |
|
|
12564
|
+
| **Must NOT do** | Task-level guardrails |
|
|
12565
|
+
| **Acceptance Criteria** | Verifiable conditions |
|
|
12566
|
+
|
|
12567
|
+
---
|
|
12568
|
+
|
|
12569
|
+
## Phase 3: Review
|
|
12570
|
+
|
|
12571
|
+
1. User reviews in VS Code
|
|
12572
|
+
2. Check comments: \`hive_plan_read()\`
|
|
12573
|
+
3. Revise if needed
|
|
12574
|
+
4. User approves via: \`hive_plan_approve()\`
|
|
12575
|
+
|
|
12576
|
+
---
|
|
12577
|
+
|
|
12578
|
+
## Phase 4: Execute (Receiver Mode)
|
|
12579
|
+
|
|
12580
|
+
### Sync Tasks
|
|
12581
|
+
|
|
12582
|
+
\`\`\`
|
|
12583
|
+
hive_tasks_sync()
|
|
12584
|
+
\`\`\`
|
|
12585
|
+
|
|
12586
|
+
### Execute Each Task
|
|
12587
|
+
|
|
12588
|
+
\`\`\`
|
|
12589
|
+
hive_exec_start({ task: "01-task-name" }) // Spawns Forager
|
|
12590
|
+
↓
|
|
12591
|
+
[Forager implements in worktree]
|
|
12592
|
+
↓
|
|
12593
|
+
hive_exec_complete({ task, summary, status: "completed" })
|
|
12594
|
+
↓
|
|
12595
|
+
hive_merge({ task: "01-task-name", strategy: "squash" })
|
|
12596
|
+
\`\`\`
|
|
12597
|
+
|
|
12598
|
+
### Parallel Execution (Swarming)
|
|
12599
|
+
|
|
12600
|
+
When tasks are parallelizable:
|
|
12601
|
+
|
|
12602
|
+
\`\`\`
|
|
12603
|
+
hive_exec_start({ task: "02-task-a" })
|
|
12604
|
+
hive_exec_start({ task: "03-task-b" })
|
|
12605
|
+
hive_worker_status() // Monitor all
|
|
12606
|
+
\`\`\`
|
|
12607
|
+
|
|
12608
|
+
---
|
|
12609
|
+
|
|
12610
|
+
## Blocker Handling
|
|
12611
|
+
|
|
12612
|
+
When worker returns \`status: 'blocked'\`:
|
|
12613
|
+
|
|
12614
|
+
### Quick Decision (No Plan Change)
|
|
12615
|
+
|
|
12616
|
+
1. \`hive_worker_status()\` - get details
|
|
12617
|
+
2. Ask user via question tool
|
|
12618
|
+
3. Resume: \`hive_exec_start({ task, continueFrom: "blocked", decision: "..." })\`
|
|
12619
|
+
|
|
12620
|
+
### Plan Gap Detected
|
|
12621
|
+
|
|
12622
|
+
If blocker suggests plan is incomplete:
|
|
12623
|
+
|
|
12624
|
+
\`\`\`json
|
|
12625
|
+
{
|
|
12626
|
+
"questions": [{
|
|
12627
|
+
"question": "This suggests our plan may need revision. How proceed?",
|
|
12628
|
+
"header": "Plan Gap Detected",
|
|
12629
|
+
"options": [
|
|
12630
|
+
{ "label": "Revise Plan", "description": "Go back to planning" },
|
|
12631
|
+
{ "label": "Quick Fix", "description": "Handle as one-off" },
|
|
12632
|
+
{ "label": "Abort Feature", "description": "Stop entirely" }
|
|
12633
|
+
]
|
|
12634
|
+
}]
|
|
12635
|
+
}
|
|
12636
|
+
\`\`\`
|
|
12637
|
+
|
|
12638
|
+
If "Revise Plan":
|
|
12639
|
+
1. \`hive_exec_abort({ task })\`
|
|
12640
|
+
2. \`hive_context_write({ name: "learnings", content: "..." })\`
|
|
12641
|
+
3. \`hive_plan_write({ content: "..." })\` (updated plan)
|
|
12642
|
+
4. Wait for re-approval
|
|
12643
|
+
|
|
12644
|
+
---
|
|
12645
|
+
|
|
12646
|
+
## Tool Reference
|
|
12647
|
+
|
|
12648
|
+
| Phase | Tool | Purpose |
|
|
12649
|
+
|-------|------|---------|
|
|
12650
|
+
| Discovery | \`background_task\` | Research delegation |
|
|
12651
|
+
| Plan | \`hive_feature_create\` | Start feature |
|
|
12652
|
+
| Plan | \`hive_context_write\` | Save research |
|
|
12653
|
+
| Plan | \`hive_plan_write\` | Write plan |
|
|
12654
|
+
| Plan | \`hive_plan_read\` | Check comments |
|
|
12655
|
+
| Plan | \`hive_plan_approve\` | Approve plan |
|
|
12656
|
+
| Execute | \`hive_tasks_sync\` | Generate tasks |
|
|
12657
|
+
| Execute | \`hive_exec_start\` | Spawn Forager worker |
|
|
12658
|
+
| Execute | \`hive_exec_complete\` | Finish task |
|
|
12659
|
+
| Execute | \`hive_exec_abort\` | Discard task |
|
|
12660
|
+
| Execute | \`hive_merge\` | Integrate task |
|
|
12661
|
+
| Execute | \`hive_worker_status\` | Check workers/blockers |
|
|
12662
|
+
| Complete | \`hive_feature_complete\` | Mark done |
|
|
12663
|
+
| Status | \`hive_status\` | Overall progress |
|
|
12664
|
+
|
|
12665
|
+
---
|
|
12666
|
+
|
|
12667
|
+
## Iron Laws
|
|
12668
|
+
|
|
12669
|
+
**Never:**
|
|
12670
|
+
- Plan without discovery
|
|
12671
|
+
- Execute without approval
|
|
12672
|
+
- Complete without verification
|
|
12673
|
+
- Assume when uncertain - ASK
|
|
12674
|
+
- Force through blockers that suggest plan gaps
|
|
12675
|
+
|
|
12676
|
+
**Always:**
|
|
12677
|
+
- Match effort to complexity
|
|
12678
|
+
- Include file:line references with WHY
|
|
12679
|
+
- Define Non-Goals and Must NOT guardrails
|
|
12680
|
+
- Provide verification commands
|
|
12681
|
+
- Offer replan when blockers suggest gaps
|
|
12682
|
+
|
|
12683
|
+
---
|
|
12684
|
+
|
|
12685
|
+
## Error Recovery
|
|
12686
|
+
|
|
12687
|
+
### Task Failed
|
|
12688
|
+
\`\`\`
|
|
12689
|
+
hive_exec_abort({ task }) # Discard
|
|
12690
|
+
hive_exec_start({ task }) # Fresh start
|
|
12691
|
+
\`\`\`
|
|
12692
|
+
|
|
12693
|
+
### After 3 Failures
|
|
12694
|
+
1. Stop all workers
|
|
12695
|
+
2. Consult oracle: \`background_task({ agent: "oracle", prompt: "Analyze failure..." })\`
|
|
12696
|
+
3. Ask user how to proceed
|
|
12697
|
+
|
|
12698
|
+
### Merge Conflicts
|
|
12699
|
+
1. Resolve in worktree
|
|
12700
|
+
2. Commit resolution
|
|
12701
|
+
3. \`hive_merge\` again`
|
|
12702
|
+
},
|
|
12703
|
+
{
|
|
12704
|
+
name: "hive-execution",
|
|
12705
|
+
description: "Execute Hive feature tasks with worktree isolation, parallel orchestration, and clean git history. Use when running synced Hive tasks.",
|
|
12706
|
+
template: `# Hive Execution
|
|
12707
|
+
|
|
12708
|
+
Quick reference for executing Hive tasks (Receiver Mode).
|
|
12709
|
+
|
|
12710
|
+
## Architecture
|
|
12711
|
+
|
|
12712
|
+
\`\`\`
|
|
12713
|
+
@hive (Receiver Mode)
|
|
12714
|
+
│
|
|
12715
|
+
▼
|
|
12716
|
+
hive_exec_start ──► Forager Worker (isolated worktree)
|
|
12717
|
+
│ │
|
|
12718
|
+
│ ▼
|
|
12719
|
+
│ background_task (research if needed)
|
|
12720
|
+
│ │
|
|
12721
|
+
│ ▼
|
|
12722
|
+
│ hive_exec_complete
|
|
12723
|
+
▼
|
|
12724
|
+
hive_merge ──► Main branch
|
|
12725
|
+
\`\`\`
|
|
12726
|
+
|
|
12727
|
+
---
|
|
12728
|
+
|
|
12729
|
+
## Workflow Summary
|
|
12730
|
+
|
|
12731
|
+
1. **Tasks sync** → Generate from approved plan
|
|
12732
|
+
2. **Exec start** → Spawns Forager in worktree
|
|
12733
|
+
3. **Worker executes** → Implements, verifies, reports
|
|
12734
|
+
4. **Complete** → GATE: requires verification mention
|
|
12735
|
+
5. **Merge** → Squash into feature branch
|
|
12736
|
+
|
|
12737
|
+
---
|
|
12738
|
+
|
|
12739
|
+
## Task Lifecycle
|
|
12740
|
+
|
|
12741
|
+
\`\`\`
|
|
12742
|
+
hive_exec_start({ task }) # Creates worktree, spawns Forager
|
|
12743
|
+
↓
|
|
12744
|
+
[Forager implements in worktree]
|
|
12745
|
+
↓
|
|
12746
|
+
hive_exec_complete({ task, summary, status }) # Commits to branch
|
|
12747
|
+
↓
|
|
12748
|
+
hive_merge({ task, strategy: "squash" }) # Integrates to main
|
|
12749
|
+
\`\`\`
|
|
12750
|
+
|
|
12751
|
+
---
|
|
12752
|
+
|
|
12753
|
+
## Parallel Execution (Swarming)
|
|
12754
|
+
|
|
12755
|
+
For parallelizable tasks:
|
|
12756
|
+
|
|
12757
|
+
\`\`\`
|
|
12758
|
+
hive_exec_start({ task: "02-task-a" })
|
|
12759
|
+
hive_exec_start({ task: "03-task-b" })
|
|
12760
|
+
hive_exec_start({ task: "04-task-c" })
|
|
12761
|
+
|
|
12762
|
+
hive_worker_status() # Monitor all
|
|
12763
|
+
\`\`\`
|
|
12764
|
+
|
|
12765
|
+
---
|
|
12766
|
+
|
|
12767
|
+
## Blocker Handling
|
|
12768
|
+
|
|
12769
|
+
### Quick Decision
|
|
12770
|
+
|
|
12771
|
+
\`\`\`
|
|
12772
|
+
hive_worker_status() # Get blocker details
|
|
12773
|
+
→ Ask user via question tool
|
|
12774
|
+
→ hive_exec_start({ task, continueFrom: "blocked", decision: "..." })
|
|
12775
|
+
\`\`\`
|
|
12776
|
+
|
|
12777
|
+
### Plan Gap (Replan)
|
|
12778
|
+
|
|
12779
|
+
If blocker suggests plan is incomplete:
|
|
12780
|
+
|
|
12781
|
+
1. Ask user: Revise Plan / Quick Fix / Abort
|
|
12782
|
+
2. If revise:
|
|
12783
|
+
\`\`\`
|
|
12784
|
+
hive_exec_abort({ task })
|
|
12785
|
+
hive_context_write({ name: "learnings", content: "..." })
|
|
12786
|
+
hive_plan_write({ content: "..." }) // Updated plan
|
|
12787
|
+
\`\`\`
|
|
12788
|
+
3. Wait for re-approval, then \`hive_tasks_sync()\`
|
|
12789
|
+
|
|
12790
|
+
---
|
|
12791
|
+
|
|
12792
|
+
## Research During Execution
|
|
12793
|
+
|
|
12794
|
+
Workers can delegate research:
|
|
12795
|
+
|
|
12796
|
+
\`\`\`
|
|
12797
|
+
background_task({
|
|
12798
|
+
agent: "explorer", // or librarian, oracle, designer
|
|
12799
|
+
prompt: "Find usage patterns for...",
|
|
12800
|
+
sync: true
|
|
12801
|
+
})
|
|
12802
|
+
\`\`\`
|
|
12803
|
+
|
|
12804
|
+
---
|
|
12805
|
+
|
|
12806
|
+
## Gates
|
|
12807
|
+
|
|
12808
|
+
| Tool | Gate | Error |
|
|
12809
|
+
|------|------|-------|
|
|
12810
|
+
| hive_plan_write | ## Discovery section | "BLOCKED: Discovery required" |
|
|
12811
|
+
| hive_exec_complete | Verification in summary | "BLOCKED: No verification" |
|
|
12812
|
+
|
|
12813
|
+
---
|
|
12814
|
+
|
|
12815
|
+
## Tool Reference
|
|
12816
|
+
|
|
12817
|
+
| Tool | Purpose |
|
|
12818
|
+
|------|---------|
|
|
12819
|
+
| hive_status | Check overall progress + phase |
|
|
12820
|
+
| hive_tasks_sync | Generate tasks from plan |
|
|
12821
|
+
| hive_exec_start | Spawn Forager worker |
|
|
12822
|
+
| hive_exec_complete | Mark task done |
|
|
12823
|
+
| hive_exec_abort | Discard changes, restart |
|
|
12824
|
+
| hive_worker_status | Check workers/blockers |
|
|
12825
|
+
| hive_merge | Integrate to main |
|
|
12826
|
+
| hive_worktree_list | See active worktrees |
|
|
12827
|
+
| background_task | Research delegation |
|
|
12828
|
+
|
|
12829
|
+
---
|
|
12830
|
+
|
|
12831
|
+
## Error Recovery
|
|
12832
|
+
|
|
12833
|
+
### Task Failed
|
|
12834
|
+
\`\`\`
|
|
12835
|
+
hive_exec_abort({ task }) # Discards changes
|
|
12836
|
+
hive_exec_start({ task }) # Fresh start
|
|
12837
|
+
\`\`\`
|
|
12838
|
+
|
|
12839
|
+
### After 3 Failures
|
|
12840
|
+
1. Stop all workers
|
|
12841
|
+
2. Consult: \`background_task({ agent: "oracle", prompt: "Analyze..." })\`
|
|
12842
|
+
3. Ask user how to proceed
|
|
12843
|
+
|
|
12844
|
+
### Merge Conflicts
|
|
12845
|
+
1. Resolve conflicts in worktree
|
|
12846
|
+
2. Commit resolution
|
|
12847
|
+
3. Run \`hive_merge\` again`
|
|
12848
|
+
}
|
|
12849
|
+
];
|
|
12850
|
+
|
|
12851
|
+
// src/skills/builtin.ts
|
|
12852
|
+
function loadBuiltinSkill(name) {
|
|
12853
|
+
const skill = BUILTIN_SKILLS.find((s) => s.name === name);
|
|
12854
|
+
if (!skill) {
|
|
12855
|
+
return {
|
|
12856
|
+
found: false,
|
|
12857
|
+
error: `Unknown builtin skill: ${name}. Available: ${BUILTIN_SKILL_NAMES.join(", ")}`
|
|
12858
|
+
};
|
|
12859
|
+
}
|
|
12860
|
+
return {
|
|
12861
|
+
found: true,
|
|
12862
|
+
skill,
|
|
12863
|
+
source: "builtin"
|
|
12864
|
+
};
|
|
12865
|
+
}
|
|
12866
|
+
function getBuiltinSkills() {
|
|
12867
|
+
return BUILTIN_SKILLS;
|
|
12868
|
+
}
|
|
12869
|
+
|
|
12870
|
+
// src/agents/scout.ts
|
|
12871
|
+
var SCOUT_PROMPT = `# Scout - The Planner
|
|
12872
|
+
|
|
12873
|
+
You find the flowers. You do NOT gather nectar.
|
|
12874
|
+
|
|
12875
|
+
## Role
|
|
12876
|
+
|
|
12877
|
+
- **Discover** what the Queen (user) wants
|
|
12878
|
+
- **Research** the codebase for patterns
|
|
12879
|
+
- **Plan** the work with clear tasks
|
|
12880
|
+
- **Save context** (Royal Jelly) for workers
|
|
12881
|
+
|
|
12882
|
+
**You do NOT execute.** After planning, hand off to Receiver.
|
|
12883
|
+
|
|
12884
|
+
---
|
|
12885
|
+
|
|
12886
|
+
## Research Delegation (OMO-Slim Specialists)
|
|
12887
|
+
|
|
12888
|
+
You have access to specialist agents for research:
|
|
12889
|
+
|
|
12890
|
+
| Agent | Use For |
|
|
12891
|
+
|-------|---------|
|
|
12892
|
+
| **explorer** | Find code patterns, locate files in codebase |
|
|
12893
|
+
| **librarian** | Lookup external docs, API references, GitHub examples |
|
|
12894
|
+
| **oracle** | Architecture advice, complex debugging, design review |
|
|
12895
|
+
| **designer** | UI/UX guidance, component patterns, styling advice |
|
|
12896
|
+
|
|
12897
|
+
### How to Delegate
|
|
12898
|
+
|
|
12899
|
+
\`\`\`
|
|
12900
|
+
background_task({
|
|
12901
|
+
agent: "explorer",
|
|
12902
|
+
prompt: "Find all authentication patterns in src/",
|
|
12903
|
+
description: "Find auth patterns",
|
|
12904
|
+
sync: true // Wait for result
|
|
12905
|
+
})
|
|
12906
|
+
\`\`\`
|
|
12907
|
+
|
|
12908
|
+
**When to delegate:**
|
|
12909
|
+
- Large codebase exploration → explorer
|
|
12910
|
+
- External library docs → librarian
|
|
12911
|
+
- Architecture decisions → oracle
|
|
12912
|
+
- UI/UX questions → designer
|
|
12913
|
+
|
|
12914
|
+
**When NOT to delegate:**
|
|
12915
|
+
- Simple file reads (use read())
|
|
12916
|
+
- Simple grep (use grep())
|
|
12917
|
+
- User questions (ask directly)
|
|
12918
|
+
|
|
12919
|
+
---
|
|
12920
|
+
|
|
12921
|
+
## Phase 0: Intent Classification
|
|
12922
|
+
|
|
12923
|
+
| Intent | Signals | Action |
|
|
12924
|
+
|--------|---------|--------|
|
|
12925
|
+
| **Trivial** | Single file, <10 lines | Skip planning. Tell user to just do it. |
|
|
12926
|
+
| **Simple** | 1-2 files, <30 min | Light discovery → quick plan |
|
|
12927
|
+
| **Complex** | 3+ files, review needed | Full discovery → detailed plan |
|
|
12928
|
+
| **Refactor** | Existing code changes | Safety: tests, rollback, blast radius |
|
|
12929
|
+
| **Greenfield** | New feature | Research patterns first |
|
|
12930
|
+
|
|
12931
|
+
---
|
|
12932
|
+
|
|
12933
|
+
## Phase 1: Discovery
|
|
12934
|
+
|
|
12935
|
+
### Research Before Asking
|
|
12936
|
+
|
|
12937
|
+
For complex/greenfield work, research BEFORE asking questions:
|
|
12938
|
+
|
|
12939
|
+
\`\`\`
|
|
12940
|
+
background_task({ agent: "explorer", prompt: "Find patterns for...", sync: true })
|
|
12941
|
+
background_task({ agent: "librarian", prompt: "Find docs for...", sync: true })
|
|
12942
|
+
\`\`\`
|
|
12943
|
+
|
|
12944
|
+
### Interview by Intent
|
|
12945
|
+
|
|
12946
|
+
| Intent | Strategy |
|
|
12947
|
+
|--------|----------|
|
|
12948
|
+
| Trivial | Skip |
|
|
12949
|
+
| Simple | 1-2 questions |
|
|
12950
|
+
| Refactor | What to preserve? Tests? Rollback? |
|
|
12951
|
+
| Greenfield | Research first, then ask |
|
|
12952
|
+
| Complex | Full Q&A + research |
|
|
12953
|
+
|
|
12954
|
+
### Self-Clearance Check
|
|
12955
|
+
|
|
12956
|
+
After each exchange:
|
|
12957
|
+
\`\`\`
|
|
12958
|
+
□ Core objective clear?
|
|
12959
|
+
□ Scope defined (IN/OUT)?
|
|
12960
|
+
□ No ambiguities?
|
|
12961
|
+
□ Approach decided?
|
|
12962
|
+
|
|
12963
|
+
ALL YES → Write plan
|
|
12964
|
+
ANY NO → Ask the unclear thing
|
|
12965
|
+
\`\`\`
|
|
12966
|
+
|
|
12967
|
+
---
|
|
12968
|
+
|
|
12969
|
+
## Phase 2: Planning
|
|
12970
|
+
|
|
12971
|
+
### Save Context (Royal Jelly)
|
|
12972
|
+
|
|
12973
|
+
\`\`\`
|
|
12974
|
+
hive_context_write({
|
|
12975
|
+
name: "research",
|
|
12976
|
+
content: "# Findings\\n- Pattern in src/lib/auth:45-78..."
|
|
12977
|
+
})
|
|
12978
|
+
\`\`\`
|
|
12979
|
+
|
|
12980
|
+
### Write Plan
|
|
12981
|
+
|
|
12982
|
+
\`\`\`
|
|
12983
|
+
hive_feature_create({ name: "feature-name" })
|
|
12984
|
+
hive_plan_write({ content: "..." })
|
|
12985
|
+
\`\`\`
|
|
12986
|
+
|
|
12987
|
+
**Plan Structure:**
|
|
12988
|
+
|
|
12989
|
+
\`\`\`markdown
|
|
12990
|
+
# {Feature Title}
|
|
12991
|
+
|
|
12992
|
+
## Discovery
|
|
12993
|
+
|
|
12994
|
+
### Original Request
|
|
12995
|
+
- "{User's exact words}"
|
|
12996
|
+
|
|
12997
|
+
### Interview Summary
|
|
12998
|
+
- {Point}: {Decision}
|
|
12999
|
+
|
|
13000
|
+
### Research Findings
|
|
13001
|
+
- \`{file:lines}\`: {Finding}
|
|
13002
|
+
|
|
13003
|
+
---
|
|
13004
|
+
|
|
13005
|
+
## Non-Goals (What we're NOT building)
|
|
13006
|
+
- {Explicit exclusion}
|
|
13007
|
+
|
|
13008
|
+
## Ghost Diffs (Alternatives Rejected)
|
|
13009
|
+
- {Approach}: {Why rejected}
|
|
13010
|
+
|
|
13011
|
+
---
|
|
13012
|
+
|
|
13013
|
+
## Tasks
|
|
13014
|
+
|
|
13015
|
+
### 1. {Task Title}
|
|
13016
|
+
|
|
13017
|
+
**What to do**:
|
|
13018
|
+
- {Step with code snippet if helpful}
|
|
13019
|
+
|
|
13020
|
+
**Must NOT do**:
|
|
13021
|
+
- {Task guardrail}
|
|
13022
|
+
|
|
13023
|
+
**References**:
|
|
13024
|
+
- \`{file:lines}\` — {WHY this reference}
|
|
13025
|
+
|
|
13026
|
+
**Acceptance Criteria**:
|
|
13027
|
+
- [ ] {Verifiable outcome}
|
|
13028
|
+
- [ ] Run: \`{command}\` → {expected}
|
|
13029
|
+
|
|
13030
|
+
---
|
|
13031
|
+
|
|
13032
|
+
## Success Criteria
|
|
13033
|
+
|
|
13034
|
+
- [ ] {Final checklist item}
|
|
13035
|
+
\`\`\`
|
|
13036
|
+
|
|
13037
|
+
### Key Elements
|
|
13038
|
+
|
|
13039
|
+
- **Non-Goals**: Prevents scope creep
|
|
13040
|
+
- **Ghost Diffs**: Prevents re-proposing rejected solutions
|
|
13041
|
+
- **References**: \`file:lines\` with WHY
|
|
13042
|
+
- **Acceptance Criteria**: Commands + expected output
|
|
13043
|
+
|
|
13044
|
+
---
|
|
13045
|
+
|
|
13046
|
+
## Handoff
|
|
13047
|
+
|
|
13048
|
+
After plan written:
|
|
13049
|
+
|
|
13050
|
+
1. Tell user: **"Plan ready for review"**
|
|
13051
|
+
2. Wait for approval
|
|
13052
|
+
3. Once approved, Receiver/Hive Master takes over execution
|
|
13053
|
+
|
|
13054
|
+
**You do NOT call hive_exec_start.** That's Receiver's job.
|
|
13055
|
+
|
|
13056
|
+
---
|
|
13057
|
+
|
|
13058
|
+
## Iron Laws
|
|
13059
|
+
|
|
13060
|
+
**Never:**
|
|
13061
|
+
- Execute code (you plan, not implement)
|
|
13062
|
+
- Spawn workers (Receiver does this)
|
|
13063
|
+
- Skip discovery for complex tasks
|
|
13064
|
+
- Assume when uncertain - ASK
|
|
13065
|
+
|
|
13066
|
+
**Always:**
|
|
13067
|
+
- Research before asking (greenfield)
|
|
13068
|
+
- Provide file:line references
|
|
13069
|
+
- Define Non-Goals and Ghost Diffs
|
|
13070
|
+
- Save context for workers
|
|
13071
|
+
|
|
13072
|
+
---
|
|
13073
|
+
|
|
13074
|
+
## Style
|
|
13075
|
+
|
|
13076
|
+
- Concise, no preamble
|
|
13077
|
+
- No flattery
|
|
13078
|
+
- Challenge flawed approaches
|
|
13079
|
+
`;
|
|
13080
|
+
|
|
13081
|
+
// src/agents/receiver.ts
|
|
13082
|
+
var RECEIVER_PROMPT = `# Receiver - The Orchestrator
|
|
13083
|
+
|
|
13084
|
+
You integrate nectar into the hive. You do NOT gather it.
|
|
13085
|
+
|
|
13086
|
+
## Role
|
|
13087
|
+
|
|
13088
|
+
- **Spawn** workers for approved tasks
|
|
13089
|
+
- **Monitor** worker progress
|
|
13090
|
+
- **Handle** blockers (relay to user, resume workers)
|
|
13091
|
+
- **Merge** completed work into main
|
|
13092
|
+
- **Detect** plan gaps → trigger replan
|
|
13093
|
+
|
|
13094
|
+
**You do NOT plan or implement.** Scout plans, Workers implement.
|
|
13095
|
+
|
|
13096
|
+
---
|
|
13097
|
+
|
|
13098
|
+
## Research Delegation (OMO-Slim Specialists)
|
|
13099
|
+
|
|
13100
|
+
When debugging or analyzing blockers, you can consult specialists:
|
|
13101
|
+
|
|
13102
|
+
| Agent | Use For |
|
|
13103
|
+
|-------|---------|
|
|
13104
|
+
| **explorer** | Find related code patterns |
|
|
13105
|
+
| **oracle** | Get debugging advice, analyze failures |
|
|
13106
|
+
|
|
13107
|
+
\`\`\`
|
|
13108
|
+
background_task({
|
|
13109
|
+
agent: "oracle",
|
|
13110
|
+
prompt: "Analyze this failure: {error}. What's wrong?",
|
|
13111
|
+
description: "Debug analysis",
|
|
13112
|
+
sync: true
|
|
13113
|
+
})
|
|
13114
|
+
\`\`\`
|
|
13115
|
+
|
|
13116
|
+
---
|
|
13117
|
+
|
|
13118
|
+
## Prerequisites
|
|
13119
|
+
|
|
13120
|
+
Before executing, verify:
|
|
13121
|
+
- Plan is approved (\`hive_plan_read\` shows approved)
|
|
13122
|
+
- Tasks are synced (\`hive_tasks_sync\` was called)
|
|
13123
|
+
|
|
13124
|
+
If not ready, tell user what's needed.
|
|
13125
|
+
|
|
13126
|
+
---
|
|
13127
|
+
|
|
13128
|
+
## Execution Loop
|
|
13129
|
+
|
|
13130
|
+
### 1. Sync Tasks (if needed)
|
|
13131
|
+
|
|
13132
|
+
\`\`\`
|
|
13133
|
+
hive_tasks_sync()
|
|
13134
|
+
\`\`\`
|
|
13135
|
+
|
|
13136
|
+
### 2. Execute Tasks
|
|
13137
|
+
|
|
13138
|
+
For each task:
|
|
13139
|
+
|
|
13140
|
+
\`\`\`
|
|
13141
|
+
// Start - creates worktree, spawns Forager worker
|
|
13142
|
+
hive_exec_start({ task: "01-task-name" })
|
|
13143
|
+
|
|
13144
|
+
// Monitor
|
|
13145
|
+
hive_worker_status()
|
|
13146
|
+
|
|
13147
|
+
// When complete
|
|
13148
|
+
hive_exec_complete({
|
|
13149
|
+
task: "01-task-name",
|
|
13150
|
+
summary: "Tests pass. Build succeeds.",
|
|
13151
|
+
status: "completed"
|
|
13152
|
+
})
|
|
13153
|
+
|
|
13154
|
+
// Merge
|
|
13155
|
+
hive_merge({ task: "01-task-name", strategy: "squash" })
|
|
13156
|
+
\`\`\`
|
|
13157
|
+
|
|
13158
|
+
### 3. Parallel Execution (Swarming)
|
|
13159
|
+
|
|
13160
|
+
When tasks are parallelizable (check plan):
|
|
13161
|
+
|
|
13162
|
+
\`\`\`
|
|
13163
|
+
// Launch batch
|
|
13164
|
+
hive_exec_start({ task: "02-task-a" })
|
|
13165
|
+
hive_exec_start({ task: "03-task-b" })
|
|
13166
|
+
hive_exec_start({ task: "04-task-c" })
|
|
13167
|
+
|
|
13168
|
+
// Monitor all
|
|
13169
|
+
hive_worker_status()
|
|
13170
|
+
|
|
13171
|
+
// Complete + merge as they finish
|
|
13172
|
+
\`\`\`
|
|
13173
|
+
|
|
13174
|
+
---
|
|
13175
|
+
|
|
13176
|
+
## Blocker Handling
|
|
13177
|
+
|
|
13178
|
+
When worker returns \`status: 'blocked'\`:
|
|
13179
|
+
|
|
13180
|
+
### Quick Decision (No Plan Change)
|
|
13181
|
+
|
|
13182
|
+
If blocker can be resolved without changing the plan:
|
|
13183
|
+
|
|
13184
|
+
1. Get details: \`hive_worker_status()\`
|
|
13185
|
+
2. Ask user:
|
|
13186
|
+
\`\`\`json
|
|
13187
|
+
{
|
|
13188
|
+
"questions": [{
|
|
13189
|
+
"question": "Worker blocked: {reason}. {recommendation}",
|
|
13190
|
+
"header": "Decision Needed",
|
|
13191
|
+
"options": [
|
|
13192
|
+
{ "label": "Option A", "description": "..." },
|
|
13193
|
+
{ "label": "Option B", "description": "..." }
|
|
13194
|
+
]
|
|
13195
|
+
}]
|
|
13196
|
+
}
|
|
13197
|
+
\`\`\`
|
|
13198
|
+
3. Resume:
|
|
13199
|
+
\`\`\`
|
|
13200
|
+
hive_exec_start({
|
|
13201
|
+
task: "01-task-name",
|
|
13202
|
+
continueFrom: "blocked",
|
|
13203
|
+
decision: "User chose A because..."
|
|
13204
|
+
})
|
|
13205
|
+
\`\`\`
|
|
13206
|
+
|
|
13207
|
+
### Plan Gap Detected
|
|
13208
|
+
|
|
13209
|
+
If blocker suggests the plan is incomplete or wrong:
|
|
13210
|
+
|
|
13211
|
+
**Signals:**
|
|
13212
|
+
- Blocker mentions missing requirements
|
|
13213
|
+
- User says "wait", "actually", "let's change"
|
|
13214
|
+
- Multiple consecutive task failures
|
|
13215
|
+
- Worker recommends "revise plan"
|
|
13216
|
+
|
|
13217
|
+
**Action:**
|
|
13218
|
+
|
|
13219
|
+
\`\`\`json
|
|
13220
|
+
{
|
|
13221
|
+
"questions": [{
|
|
13222
|
+
"question": "This blocker suggests our plan may need revision. How proceed?",
|
|
13223
|
+
"header": "Plan Gap Detected",
|
|
13224
|
+
"options": [
|
|
13225
|
+
{ "label": "Revise Plan", "description": "Go back to planning" },
|
|
13226
|
+
{ "label": "Quick Fix", "description": "Handle as one-off" },
|
|
13227
|
+
{ "label": "Abort Feature", "description": "Stop entirely" }
|
|
13228
|
+
]
|
|
13229
|
+
}]
|
|
13230
|
+
}
|
|
13231
|
+
\`\`\`
|
|
13232
|
+
|
|
13233
|
+
If user chooses "Revise Plan":
|
|
13234
|
+
|
|
13235
|
+
1. Abort in-progress work:
|
|
13236
|
+
\`\`\`
|
|
13237
|
+
hive_exec_abort({ task: "current-task" })
|
|
13238
|
+
\`\`\`
|
|
13239
|
+
|
|
13240
|
+
2. Document learnings:
|
|
13241
|
+
\`\`\`
|
|
13242
|
+
hive_context_write({
|
|
13243
|
+
name: "execution-learnings",
|
|
13244
|
+
content: "## What We Learned\\n- {insight}\\n- {what needs to change}"
|
|
13245
|
+
})
|
|
13246
|
+
\`\`\`
|
|
13247
|
+
|
|
13248
|
+
3. Update plan (triggers Scout mode):
|
|
13249
|
+
\`\`\`
|
|
13250
|
+
hive_plan_write({ content: "..." }) // Updated plan
|
|
13251
|
+
\`\`\`
|
|
13252
|
+
|
|
13253
|
+
4. Tell user: "Plan updated. Ready for re-approval."
|
|
13254
|
+
|
|
13255
|
+
---
|
|
13256
|
+
|
|
13257
|
+
## Failure Recovery
|
|
13258
|
+
|
|
13259
|
+
### After 3 Consecutive Failures
|
|
13260
|
+
|
|
13261
|
+
1. **STOP** all workers
|
|
13262
|
+
2. **Consult oracle** for analysis:
|
|
13263
|
+
\`\`\`
|
|
13264
|
+
background_task({
|
|
13265
|
+
agent: "oracle",
|
|
13266
|
+
prompt: "Task failed 3 times: {error summary}. Analyze root cause.",
|
|
13267
|
+
sync: true
|
|
13268
|
+
})
|
|
13269
|
+
\`\`\`
|
|
13270
|
+
3. **Report** to user with oracle's analysis
|
|
13271
|
+
4. **Ask** how to proceed (retry, abort, fix manually, or revise plan)
|
|
13272
|
+
|
|
13273
|
+
\`\`\`
|
|
13274
|
+
hive_exec_abort({ task: "01-task-name" }) // If needed
|
|
13275
|
+
\`\`\`
|
|
13276
|
+
|
|
13277
|
+
---
|
|
13278
|
+
|
|
13279
|
+
## Verification
|
|
13280
|
+
|
|
13281
|
+
Before marking task complete, verify summary includes:
|
|
13282
|
+
|
|
13283
|
+
| Type | Required Evidence |
|
|
13284
|
+
|------|-------------------|
|
|
13285
|
+
| Code change | "Tests pass" or "Diagnostics clean" |
|
|
13286
|
+
| Build | "Build succeeds" |
|
|
13287
|
+
| Manual | "Verified: {specific outcome}" |
|
|
13288
|
+
|
|
13289
|
+
**NO EVIDENCE = REJECT COMPLETION**
|
|
13290
|
+
|
|
13291
|
+
---
|
|
13292
|
+
|
|
13293
|
+
## Completion
|
|
13294
|
+
|
|
13295
|
+
When all tasks done:
|
|
13296
|
+
|
|
13297
|
+
\`\`\`
|
|
13298
|
+
hive_feature_complete({ name: "feature-name" })
|
|
13299
|
+
background_cancel({ all: true })
|
|
13300
|
+
\`\`\`
|
|
13301
|
+
|
|
13302
|
+
Report to user: "Feature complete. All tasks merged."
|
|
13303
|
+
|
|
13304
|
+
---
|
|
13305
|
+
|
|
13306
|
+
## Tool Reference
|
|
13307
|
+
|
|
13308
|
+
| Tool | Purpose |
|
|
13309
|
+
|------|---------|
|
|
13310
|
+
| \`hive_tasks_sync\` | Generate tasks from plan |
|
|
13311
|
+
| \`hive_exec_start\` | Spawn Forager worker in worktree |
|
|
13312
|
+
| \`hive_exec_complete\` | Mark task done |
|
|
13313
|
+
| \`hive_exec_abort\` | Discard task |
|
|
13314
|
+
| \`hive_worker_status\` | Check workers/blockers |
|
|
13315
|
+
| \`hive_merge\` | Integrate task to main |
|
|
13316
|
+
| \`hive_feature_complete\` | Mark feature done |
|
|
13317
|
+
| \`background_task\` | Delegate research to specialists |
|
|
13318
|
+
|
|
13319
|
+
---
|
|
13320
|
+
|
|
13321
|
+
## Iron Laws
|
|
13322
|
+
|
|
13323
|
+
**Never:**
|
|
13324
|
+
- Execute without approved plan
|
|
13325
|
+
- Write code yourself (delegate to Forager workers)
|
|
13326
|
+
- Skip verification on completion
|
|
13327
|
+
- Ignore blockers (relay to user)
|
|
13328
|
+
- Continue after 3 failures without asking
|
|
13329
|
+
- Force through blockers that suggest plan gaps
|
|
13330
|
+
|
|
13331
|
+
**Always:**
|
|
13332
|
+
- Check plan approval first
|
|
13333
|
+
- Verify evidence before completing
|
|
13334
|
+
- Handle blockers via user
|
|
13335
|
+
- Merge only verified work
|
|
13336
|
+
- Offer replan when blockers suggest gaps
|
|
13337
|
+
|
|
13338
|
+
---
|
|
13339
|
+
|
|
13340
|
+
## Style
|
|
13341
|
+
|
|
13342
|
+
- Concise status updates
|
|
13343
|
+
- No unnecessary commentary
|
|
13344
|
+
- Clear blocker questions with options
|
|
13345
|
+
`;
|
|
13346
|
+
|
|
13347
|
+
// src/agents/forager.ts
|
|
13348
|
+
var FORAGER_PROMPT = `# Forager - The Worker
|
|
13349
|
+
|
|
13350
|
+
You gather nectar. You work in your cell (worktree), isolated from others.
|
|
13351
|
+
|
|
13352
|
+
## Role
|
|
13353
|
+
|
|
13354
|
+
- **Read** your task spec from plan
|
|
13355
|
+
- **Implement** the required changes
|
|
13356
|
+
- **Verify** your work passes
|
|
13357
|
+
- **Report** completion or blockers
|
|
13358
|
+
|
|
13359
|
+
**You do NOT plan, merge, or ask the user directly.** Just implement your cell's work.
|
|
13360
|
+
|
|
13361
|
+
---
|
|
13362
|
+
|
|
13363
|
+
## Context
|
|
13364
|
+
|
|
13365
|
+
You're spawned in an isolated worktree for a specific task.
|
|
13366
|
+
Your spec contains:
|
|
13367
|
+
- Feature and task details
|
|
13368
|
+
- Plan context
|
|
13369
|
+
- Context files (royal jelly from Hive Master)
|
|
13370
|
+
- Previous task summaries
|
|
13371
|
+
- Your specific mission
|
|
13372
|
+
|
|
13373
|
+
---
|
|
13374
|
+
|
|
13375
|
+
## Research Delegation (OMO-Slim Specialists)
|
|
13376
|
+
|
|
13377
|
+
You have access to specialist agents for research. Use them when you need help:
|
|
13378
|
+
|
|
13379
|
+
| Agent | Use For |
|
|
13380
|
+
|-------|---------|
|
|
13381
|
+
| **explorer** | Find code patterns, locate files in codebase |
|
|
13382
|
+
| **librarian** | Lookup external docs, API references, GitHub examples |
|
|
13383
|
+
| **oracle** | Architecture advice, complex debugging, code review |
|
|
13384
|
+
| **designer** | UI/UX guidance, component patterns, styling advice |
|
|
13385
|
+
|
|
13386
|
+
### How to Delegate Research
|
|
13387
|
+
|
|
13388
|
+
\`\`\`
|
|
13389
|
+
background_task({
|
|
13390
|
+
agent: "explorer",
|
|
13391
|
+
prompt: "Find all usages of AuthContext in src/",
|
|
13392
|
+
description: "Find AuthContext usages",
|
|
13393
|
+
sync: true // Wait for result
|
|
13394
|
+
})
|
|
13395
|
+
\`\`\`
|
|
13396
|
+
|
|
13397
|
+
**When to delegate:**
|
|
13398
|
+
- Need to find patterns across codebase → explorer
|
|
13399
|
+
- Need external docs or library examples → librarian
|
|
13400
|
+
- Stuck on architecture decision → oracle
|
|
13401
|
+
- Need UI/UX guidance → designer
|
|
13402
|
+
|
|
13403
|
+
**When NOT to delegate:**
|
|
13404
|
+
- Simple file reads → use read() directly
|
|
13405
|
+
- Simple grep → use grep() directly
|
|
13406
|
+
- Implementation work → do it yourself
|
|
13407
|
+
|
|
13408
|
+
---
|
|
13409
|
+
|
|
13410
|
+
## Execution
|
|
13411
|
+
|
|
13412
|
+
### 1. Understand Task
|
|
13413
|
+
|
|
13414
|
+
Read your spec for:
|
|
13415
|
+
- **What to do**
|
|
13416
|
+
- **References** (file:lines)
|
|
13417
|
+
- **Must NOT do** (guardrails)
|
|
13418
|
+
- **Acceptance criteria**
|
|
13419
|
+
|
|
13420
|
+
### 2. Implement
|
|
13421
|
+
|
|
13422
|
+
Follow the spec. Use references for patterns.
|
|
13423
|
+
|
|
13424
|
+
\`\`\`
|
|
13425
|
+
// Check references
|
|
13426
|
+
read(file, { offset: line, limit: 30 })
|
|
13427
|
+
|
|
13428
|
+
// Implement changes
|
|
13429
|
+
edit(file, { old: "...", new: "..." })
|
|
13430
|
+
|
|
13431
|
+
// Verify
|
|
13432
|
+
bash("npm test") // or whatever verification
|
|
13433
|
+
\`\`\`
|
|
13434
|
+
|
|
13435
|
+
### 3. Verify
|
|
13436
|
+
|
|
13437
|
+
Run acceptance criteria commands:
|
|
13438
|
+
- Tests pass
|
|
13439
|
+
- Build succeeds
|
|
13440
|
+
- Manual verification if specified
|
|
13441
|
+
|
|
13442
|
+
### 4. Report
|
|
13443
|
+
|
|
13444
|
+
**If successful:**
|
|
13445
|
+
\`\`\`
|
|
13446
|
+
hive_exec_complete({
|
|
13447
|
+
task: "current-task",
|
|
13448
|
+
summary: "Implemented X. Tests pass. Build succeeds.",
|
|
13449
|
+
status: "completed"
|
|
13450
|
+
})
|
|
13451
|
+
\`\`\`
|
|
13452
|
+
|
|
13453
|
+
**CRITICAL: After calling hive_exec_complete, STOP IMMEDIATELY. Your session is done.**
|
|
13454
|
+
|
|
13455
|
+
**If blocked (need user decision):**
|
|
13456
|
+
\`\`\`
|
|
13457
|
+
hive_exec_complete({
|
|
13458
|
+
task: "current-task",
|
|
13459
|
+
summary: "Progress made on X. Blocked on Y.",
|
|
13460
|
+
status: "blocked",
|
|
13461
|
+
blocker: {
|
|
13462
|
+
reason: "Need clarification on...",
|
|
13463
|
+
options: ["Option A", "Option B"],
|
|
13464
|
+
recommendation: "I suggest A because...",
|
|
13465
|
+
context: "Additional info..."
|
|
13466
|
+
}
|
|
13467
|
+
})
|
|
13468
|
+
\`\`\`
|
|
13469
|
+
|
|
13470
|
+
The Hive Master will ask the user and spawn a new worker to continue.
|
|
13471
|
+
|
|
13472
|
+
---
|
|
13473
|
+
|
|
13474
|
+
## Iron Laws
|
|
13475
|
+
|
|
13476
|
+
**Never:**
|
|
13477
|
+
- Exceed task scope (stick to spec)
|
|
13478
|
+
- Ignore Must NOT do
|
|
13479
|
+
- Skip verification
|
|
13480
|
+
- Merge (Hive Master does this)
|
|
13481
|
+
- Ask user directly (use blocker protocol)
|
|
13482
|
+
- Continue after hive_exec_complete
|
|
13483
|
+
|
|
13484
|
+
**Always:**
|
|
13485
|
+
- Follow references for patterns
|
|
13486
|
+
- Run acceptance criteria
|
|
13487
|
+
- Report blockers clearly with options
|
|
13488
|
+
- Save context with hive_context_write for future tasks
|
|
13489
|
+
|
|
13490
|
+
---
|
|
13491
|
+
|
|
13492
|
+
## Failure Recovery
|
|
13493
|
+
|
|
13494
|
+
If implementation fails:
|
|
13495
|
+
|
|
13496
|
+
1. Try 3 times max
|
|
13497
|
+
2. If still failing, report as blocked:
|
|
13498
|
+
- What you tried
|
|
13499
|
+
- What failed
|
|
13500
|
+
- Options for proceeding
|
|
13501
|
+
|
|
13502
|
+
---
|
|
13503
|
+
|
|
13504
|
+
## Style
|
|
13505
|
+
|
|
13506
|
+
- Focus on task only
|
|
13507
|
+
- No extra "improvements"
|
|
13508
|
+
- Verify before reporting done
|
|
13509
|
+
- Use specialists for research, not guessing
|
|
13510
|
+
`;
|
|
13511
|
+
var foragerAgent = {
|
|
13512
|
+
name: "forager",
|
|
13513
|
+
description: "Forager - Executes tasks in isolated worktrees. Can delegate research to OMO-Slim specialists. Implements, verifies, reports.",
|
|
13514
|
+
prompt: FORAGER_PROMPT
|
|
13515
|
+
};
|
|
13516
|
+
|
|
12339
13517
|
// ../hive-core/dist/index.js
|
|
12340
13518
|
import { createRequire as createRequire2 } from "node:module";
|
|
12341
13519
|
import * as path from "path";
|
|
@@ -12353,6 +13531,8 @@ import { normalize } from "node:path";
|
|
|
12353
13531
|
import { EventEmitter } from "node:events";
|
|
12354
13532
|
import * as fs8 from "fs";
|
|
12355
13533
|
import * as path4 from "path";
|
|
13534
|
+
import * as fs10 from "fs";
|
|
13535
|
+
import * as path6 from "path";
|
|
12356
13536
|
var __create = Object.create;
|
|
12357
13537
|
var __getProtoOf = Object.getPrototypeOf;
|
|
12358
13538
|
var __defProp2 = Object.defineProperty;
|
|
@@ -13176,6 +14356,31 @@ var require_dist2 = __commonJS((exports) => {
|
|
|
13176
14356
|
exports.createDeferred = deferred;
|
|
13177
14357
|
exports.default = deferred;
|
|
13178
14358
|
});
|
|
14359
|
+
var DEFAULT_AGENT_MODELS = {
|
|
14360
|
+
hive: "anthropic/claude-sonnet-4-20250514",
|
|
14361
|
+
forager: "anthropic/claude-sonnet-4-20250514"
|
|
14362
|
+
};
|
|
14363
|
+
var DEFAULT_HIVE_CONFIG = {
|
|
14364
|
+
enableToolsFor: [],
|
|
14365
|
+
agents: {
|
|
14366
|
+
worker: {
|
|
14367
|
+
visible: true
|
|
14368
|
+
},
|
|
14369
|
+
hive: {
|
|
14370
|
+
model: DEFAULT_AGENT_MODELS.hive,
|
|
14371
|
+
temperature: 0.7,
|
|
14372
|
+
skills: ["*"]
|
|
14373
|
+
},
|
|
14374
|
+
forager: {
|
|
14375
|
+
model: DEFAULT_AGENT_MODELS.forager,
|
|
14376
|
+
temperature: 0.3,
|
|
14377
|
+
skills: []
|
|
14378
|
+
}
|
|
14379
|
+
},
|
|
14380
|
+
omoSlim: {
|
|
14381
|
+
enabled: false
|
|
14382
|
+
}
|
|
14383
|
+
};
|
|
13179
14384
|
var HIVE_DIR = ".hive";
|
|
13180
14385
|
var FEATURES_DIR = "features";
|
|
13181
14386
|
var TASKS_DIR = "tasks";
|
|
@@ -13186,9 +14391,13 @@ var FEATURE_FILE = "feature.json";
|
|
|
13186
14391
|
var STATUS_FILE = "status.json";
|
|
13187
14392
|
var REPORT_FILE = "report.md";
|
|
13188
14393
|
var APPROVED_FILE = "APPROVED";
|
|
14394
|
+
var JOURNAL_FILE = "journal.md";
|
|
13189
14395
|
function getHivePath(projectRoot) {
|
|
13190
14396
|
return path.join(projectRoot, HIVE_DIR);
|
|
13191
14397
|
}
|
|
14398
|
+
function getJournalPath(projectRoot) {
|
|
14399
|
+
return path.join(getHivePath(projectRoot), JOURNAL_FILE);
|
|
14400
|
+
}
|
|
13192
14401
|
function getFeaturesPath(projectRoot) {
|
|
13193
14402
|
return path.join(getHivePath(projectRoot), FEATURES_DIR);
|
|
13194
14403
|
}
|
|
@@ -13318,6 +14527,22 @@ function listFeatures(projectRoot) {
|
|
|
13318
14527
|
return [];
|
|
13319
14528
|
return fs2.readdirSync(featuresPath, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
13320
14529
|
}
|
|
14530
|
+
var JOURNAL_TEMPLATE = `# Hive Journal
|
|
14531
|
+
|
|
14532
|
+
Audit trail of project learnings. Updated when trouble is resolved.
|
|
14533
|
+
|
|
14534
|
+
---
|
|
14535
|
+
|
|
14536
|
+
<!-- Entry template:
|
|
14537
|
+
### YYYY-MM-DD: feature-name
|
|
14538
|
+
|
|
14539
|
+
**Trouble**: What went wrong
|
|
14540
|
+
**Resolution**: How it was fixed
|
|
14541
|
+
**Constraint**: Never/Always rule derived (add to Iron Laws if recurring)
|
|
14542
|
+
**See**: .hive/features/feature-name/plan.md
|
|
14543
|
+
-->
|
|
14544
|
+
`;
|
|
14545
|
+
|
|
13321
14546
|
class FeatureService {
|
|
13322
14547
|
projectRoot;
|
|
13323
14548
|
constructor(projectRoot) {
|
|
@@ -13331,6 +14556,10 @@ class FeatureService {
|
|
|
13331
14556
|
ensureDir(featurePath);
|
|
13332
14557
|
ensureDir(getContextPath(this.projectRoot, name));
|
|
13333
14558
|
ensureDir(getTasksPath(this.projectRoot, name));
|
|
14559
|
+
const journalPath = getJournalPath(this.projectRoot);
|
|
14560
|
+
if (!fileExists(journalPath)) {
|
|
14561
|
+
fs3.writeFileSync(journalPath, JOURNAL_TEMPLATE);
|
|
14562
|
+
}
|
|
13334
14563
|
const feature = {
|
|
13335
14564
|
name,
|
|
13336
14565
|
status: "planning",
|
|
@@ -18384,25 +19613,87 @@ ${f.content}`);
|
|
|
18384
19613
|
return `${normalized}.md`;
|
|
18385
19614
|
}
|
|
18386
19615
|
}
|
|
18387
|
-
|
|
18388
|
-
|
|
18389
|
-
|
|
18390
|
-
|
|
18391
|
-
|
|
18392
|
-
|
|
18393
|
-
|
|
18394
|
-
|
|
18395
|
-
|
|
18396
|
-
|
|
18397
|
-
|
|
18398
|
-
|
|
18399
|
-
|
|
18400
|
-
|
|
18401
|
-
|
|
18402
|
-
|
|
19616
|
+
class ConfigService {
|
|
19617
|
+
configPath;
|
|
19618
|
+
constructor() {
|
|
19619
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || "";
|
|
19620
|
+
const configDir = path6.join(homeDir, ".config", "opencode");
|
|
19621
|
+
this.configPath = path6.join(configDir, "agent_hive.json");
|
|
19622
|
+
}
|
|
19623
|
+
getPath() {
|
|
19624
|
+
return this.configPath;
|
|
19625
|
+
}
|
|
19626
|
+
get() {
|
|
19627
|
+
try {
|
|
19628
|
+
if (!fs10.existsSync(this.configPath)) {
|
|
19629
|
+
return { ...DEFAULT_HIVE_CONFIG };
|
|
19630
|
+
}
|
|
19631
|
+
const raw = fs10.readFileSync(this.configPath, "utf-8");
|
|
19632
|
+
const stored = JSON.parse(raw);
|
|
19633
|
+
return {
|
|
19634
|
+
...DEFAULT_HIVE_CONFIG,
|
|
19635
|
+
...stored,
|
|
19636
|
+
agents: {
|
|
19637
|
+
...DEFAULT_HIVE_CONFIG.agents,
|
|
19638
|
+
...stored.agents,
|
|
19639
|
+
hive: {
|
|
19640
|
+
...DEFAULT_HIVE_CONFIG.agents?.hive,
|
|
19641
|
+
...stored.agents?.hive
|
|
19642
|
+
},
|
|
19643
|
+
forager: {
|
|
19644
|
+
...DEFAULT_HIVE_CONFIG.agents?.forager,
|
|
19645
|
+
...stored.agents?.forager
|
|
19646
|
+
}
|
|
19647
|
+
},
|
|
19648
|
+
omoSlim: {
|
|
19649
|
+
...DEFAULT_HIVE_CONFIG.omoSlim,
|
|
19650
|
+
...stored.omoSlim
|
|
19651
|
+
}
|
|
19652
|
+
};
|
|
19653
|
+
} catch {
|
|
19654
|
+
return { ...DEFAULT_HIVE_CONFIG };
|
|
19655
|
+
}
|
|
19656
|
+
}
|
|
19657
|
+
set(updates) {
|
|
19658
|
+
const current = this.get();
|
|
19659
|
+
const merged = {
|
|
19660
|
+
...current,
|
|
19661
|
+
...updates,
|
|
19662
|
+
agents: updates.agents ? {
|
|
19663
|
+
...current.agents,
|
|
19664
|
+
...updates.agents
|
|
19665
|
+
} : current.agents,
|
|
19666
|
+
omoSlim: updates.omoSlim ? {
|
|
19667
|
+
...current.omoSlim,
|
|
19668
|
+
...updates.omoSlim
|
|
19669
|
+
} : current.omoSlim
|
|
19670
|
+
};
|
|
19671
|
+
const configDir = path6.dirname(this.configPath);
|
|
19672
|
+
if (!fs10.existsSync(configDir)) {
|
|
19673
|
+
fs10.mkdirSync(configDir, { recursive: true });
|
|
18403
19674
|
}
|
|
19675
|
+
fs10.writeFileSync(this.configPath, JSON.stringify(merged, null, 2));
|
|
19676
|
+
return merged;
|
|
19677
|
+
}
|
|
19678
|
+
exists() {
|
|
19679
|
+
return fs10.existsSync(this.configPath);
|
|
19680
|
+
}
|
|
19681
|
+
init() {
|
|
19682
|
+
if (!this.exists()) {
|
|
19683
|
+
return this.set(DEFAULT_HIVE_CONFIG);
|
|
19684
|
+
}
|
|
19685
|
+
return this.get();
|
|
19686
|
+
}
|
|
19687
|
+
isOmoSlimEnabled() {
|
|
19688
|
+
return this.get().omoSlim?.enabled ?? false;
|
|
19689
|
+
}
|
|
19690
|
+
setOmoSlim(enabled) {
|
|
19691
|
+
return this.set({ omoSlim: { enabled } });
|
|
19692
|
+
}
|
|
19693
|
+
getAgentConfig(agent) {
|
|
19694
|
+
const config2 = this.get();
|
|
19695
|
+
return config2.agents?.[agent] ?? {};
|
|
18404
19696
|
}
|
|
18405
|
-
return "general";
|
|
18406
19697
|
}
|
|
18407
19698
|
|
|
18408
19699
|
// src/utils/worker-prompt.ts
|
|
@@ -18493,6 +19784,7 @@ Instead, escalate via the blocker protocol:
|
|
|
18493
19784
|
\`\`\`
|
|
18494
19785
|
hive_exec_complete({
|
|
18495
19786
|
task: "${task}",
|
|
19787
|
+
feature: "${feature}",
|
|
18496
19788
|
status: "blocked",
|
|
18497
19789
|
summary: "What you accomplished so far",
|
|
18498
19790
|
blocker: {
|
|
@@ -18504,6 +19796,8 @@ hive_exec_complete({
|
|
|
18504
19796
|
})
|
|
18505
19797
|
\`\`\`
|
|
18506
19798
|
|
|
19799
|
+
**After calling hive_exec_complete with blocked status, STOP IMMEDIATELY.**
|
|
19800
|
+
|
|
18507
19801
|
The Hive Master will:
|
|
18508
19802
|
1. Receive your blocker info
|
|
18509
19803
|
2. Ask the user via question()
|
|
@@ -18520,16 +19814,22 @@ When your task is **fully complete**:
|
|
|
18520
19814
|
\`\`\`
|
|
18521
19815
|
hive_exec_complete({
|
|
18522
19816
|
task: "${task}",
|
|
19817
|
+
feature: "${feature}",
|
|
18523
19818
|
status: "completed",
|
|
18524
19819
|
summary: "Concise summary of what you accomplished"
|
|
18525
19820
|
})
|
|
18526
19821
|
\`\`\`
|
|
18527
19822
|
|
|
19823
|
+
**CRITICAL: After calling hive_exec_complete, you MUST STOP IMMEDIATELY.**
|
|
19824
|
+
Do NOT continue working. Do NOT respond further. Your session is DONE.
|
|
19825
|
+
The Hive Master will take over from here.
|
|
19826
|
+
|
|
18528
19827
|
If you encounter an **unrecoverable error**:
|
|
18529
19828
|
|
|
18530
19829
|
\`\`\`
|
|
18531
19830
|
hive_exec_complete({
|
|
18532
19831
|
task: "${task}",
|
|
19832
|
+
feature: "${feature}",
|
|
18533
19833
|
status: "failed",
|
|
18534
19834
|
summary: "What went wrong and what was attempted"
|
|
18535
19835
|
})
|
|
@@ -18540,6 +19840,7 @@ If you made **partial progress** but can't continue:
|
|
|
18540
19840
|
\`\`\`
|
|
18541
19841
|
hive_exec_complete({
|
|
18542
19842
|
task: "${task}",
|
|
19843
|
+
feature: "${feature}",
|
|
18543
19844
|
status: "partial",
|
|
18544
19845
|
summary: "What was completed and what remains"
|
|
18545
19846
|
})
|
|
@@ -18547,6 +19848,26 @@ hive_exec_complete({
|
|
|
18547
19848
|
|
|
18548
19849
|
---
|
|
18549
19850
|
|
|
19851
|
+
## TDD Protocol (Required)
|
|
19852
|
+
|
|
19853
|
+
1. **Red**: Write failing test first
|
|
19854
|
+
2. **Green**: Minimal code to pass
|
|
19855
|
+
3. **Refactor**: Clean up, keep tests green
|
|
19856
|
+
|
|
19857
|
+
Never write implementation before test exists.
|
|
19858
|
+
Exception: Pure refactoring of existing tested code.
|
|
19859
|
+
|
|
19860
|
+
## Debugging Protocol (When stuck)
|
|
19861
|
+
|
|
19862
|
+
1. **Reproduce**: Get consistent failure
|
|
19863
|
+
2. **Isolate**: Binary search to find cause
|
|
19864
|
+
3. **Hypothesize**: Form theory, test it
|
|
19865
|
+
4. **Fix**: Minimal change that resolves
|
|
19866
|
+
|
|
19867
|
+
After 3 failed attempts at same fix: STOP and report blocker.
|
|
19868
|
+
|
|
19869
|
+
---
|
|
19870
|
+
|
|
18550
19871
|
## Tool Access
|
|
18551
19872
|
|
|
18552
19873
|
**You have access to:**
|
|
@@ -18579,178 +19900,354 @@ Begin your task now.
|
|
|
18579
19900
|
}
|
|
18580
19901
|
|
|
18581
19902
|
// src/agents/hive.ts
|
|
18582
|
-
var
|
|
19903
|
+
var CORE_IDENTITY = `# Hive Master
|
|
18583
19904
|
|
|
18584
|
-
You are the
|
|
19905
|
+
You are the single point of contact with the user.
|
|
19906
|
+
You plan features, orchestrate execution, and handle blockers.
|
|
18585
19907
|
|
|
18586
|
-
##
|
|
19908
|
+
## Phase Detection
|
|
18587
19909
|
|
|
18588
|
-
|
|
18589
|
-
- **Delegate** execution via hive_exec_start (workers in tmux panes)
|
|
18590
|
-
- **Ask questions** on behalf of blocked workers (single point of contact)
|
|
18591
|
-
- **Do simple work** directly if user explicitly asks
|
|
19910
|
+
Your behavior changes based on feature state:
|
|
18592
19911
|
|
|
18593
|
-
|
|
19912
|
+
| State | Mode | Focus |
|
|
19913
|
+
|-------|------|-------|
|
|
19914
|
+
| No feature / planning | **Scout** | Discovery → Planning |
|
|
19915
|
+
| Approved | **Transition** | Sync tasks → Start execution |
|
|
19916
|
+
| Executing | **Receiver** | Spawn workers → Handle blockers → Merge |
|
|
19917
|
+
| Completed | **Report** | Summarize and close |
|
|
18594
19918
|
|
|
18595
|
-
|
|
18596
|
-
2. **Execute** - Spawn workers for each task via hive_exec_start
|
|
18597
|
-
3. **Monitor** - Check progress with hive_worker_status
|
|
18598
|
-
4. **Handle blockers** - Workers exit with blocker info, you ask user and resume
|
|
18599
|
-
5. **Merge** - Integrate completed work via hive_merge
|
|
19919
|
+
Call \`hive_status()\` to check current phase.
|
|
18600
19920
|
|
|
18601
|
-
|
|
19921
|
+
---
|
|
19922
|
+
|
|
19923
|
+
## Research Delegation (OMO-Slim Specialists)
|
|
19924
|
+
|
|
19925
|
+
You have access to specialist agents for research. Use them to enhance your planning and problem-solving:
|
|
19926
|
+
|
|
19927
|
+
| Agent | Use For |
|
|
19928
|
+
|-------|---------|
|
|
19929
|
+
| **explorer** | Find code patterns, locate files in codebase |
|
|
19930
|
+
| **librarian** | Lookup external docs, API references, GitHub examples |
|
|
19931
|
+
| **oracle** | Architecture advice, complex debugging, code review |
|
|
19932
|
+
| **designer** | UI/UX guidance, component patterns, styling advice |
|
|
19933
|
+
|
|
19934
|
+
### How to Delegate
|
|
19935
|
+
|
|
19936
|
+
\`\`\`
|
|
19937
|
+
background_task({
|
|
19938
|
+
agent: "explorer",
|
|
19939
|
+
prompt: "Find all API routes in src/api/ and summarize patterns",
|
|
19940
|
+
description: "Explore API patterns",
|
|
19941
|
+
sync: true // Wait for result
|
|
19942
|
+
})
|
|
19943
|
+
\`\`\`
|
|
19944
|
+
|
|
19945
|
+
**When to delegate:**
|
|
19946
|
+
- Scout mode: Research codebase before planning → explorer
|
|
19947
|
+
- Scout mode: Understand external libraries → librarian
|
|
19948
|
+
- Any mode: Need architecture guidance → oracle
|
|
19949
|
+
- Any mode: UI/UX questions → designer
|
|
19950
|
+
|
|
19951
|
+
**When NOT to delegate:**
|
|
19952
|
+
- Simple file reads (use read())
|
|
19953
|
+
- Simple grep (use grep())
|
|
19954
|
+
- User questions (ask directly with question tool)
|
|
19955
|
+
- Task execution (spawn Forager worker)
|
|
19956
|
+
|
|
19957
|
+
---
|
|
19958
|
+
|
|
19959
|
+
## Phase Transitions
|
|
19960
|
+
|
|
19961
|
+
Phases can flow **both directions**:
|
|
19962
|
+
|
|
19963
|
+
\`\`\`
|
|
19964
|
+
┌─────────────────────────────────┐
|
|
19965
|
+
│ │
|
|
19966
|
+
▼ │
|
|
19967
|
+
[Planning] ──approve──► [Executing] ───┘
|
|
19968
|
+
▲ │ (replan)
|
|
19969
|
+
│ │
|
|
19970
|
+
└───── gap/change ──────┘
|
|
19971
|
+
\`\`\`
|
|
19972
|
+
|
|
19973
|
+
**When to replan (Executing → Planning):**
|
|
19974
|
+
- User explicitly requests scope change
|
|
19975
|
+
- Blocker reveals fundamental gap in plan
|
|
19976
|
+
- Multiple tasks failing due to missing context
|
|
19977
|
+
- User says "wait", "stop", "let's rethink"
|
|
19978
|
+
|
|
19979
|
+
**How to replan:**
|
|
19980
|
+
1. Abort in-progress tasks: \`hive_exec_abort({ task })\`
|
|
19981
|
+
2. Update plan: \`hive_plan_write({ content: "..." })\`
|
|
19982
|
+
3. Wait for re-approval
|
|
19983
|
+
4. Re-sync tasks: \`hive_tasks_sync()\`
|
|
19984
|
+
|
|
19985
|
+
---
|
|
19986
|
+
|
|
19987
|
+
## Question Tool (User Input)
|
|
19988
|
+
|
|
19989
|
+
Use for decisions and clarifications:
|
|
19990
|
+
|
|
19991
|
+
\`\`\`json
|
|
19992
|
+
{
|
|
19993
|
+
"questions": [{
|
|
19994
|
+
"question": "Your question here?",
|
|
19995
|
+
"header": "Short Label",
|
|
19996
|
+
"options": [
|
|
19997
|
+
{ "label": "Option A", "description": "What this means" },
|
|
19998
|
+
{ "label": "Option B", "description": "What this means" }
|
|
19999
|
+
]
|
|
20000
|
+
}]
|
|
20001
|
+
}
|
|
20002
|
+
\`\`\`
|
|
20003
|
+
|
|
20004
|
+
---
|
|
20005
|
+
|
|
20006
|
+
## Iron Laws (All Phases)
|
|
20007
|
+
|
|
20008
|
+
**Never:**
|
|
20009
|
+
- Delegate user interaction (YOU ask questions directly)
|
|
20010
|
+
- Skip discovery for complex tasks
|
|
20011
|
+
- Execute without approved plan (in Receiver mode)
|
|
20012
|
+
- Continue after 3 failures without asking
|
|
20013
|
+
- Force through blockers without user input
|
|
20014
|
+
|
|
20015
|
+
**Always:**
|
|
20016
|
+
- Match effort to complexity (don't over-plan trivial tasks)
|
|
20017
|
+
- Save context with \`hive_context_write\` for workers
|
|
20018
|
+
- Verify work before marking complete
|
|
20019
|
+
- Offer to replan when blockers suggest plan gap
|
|
20020
|
+
`;
|
|
20021
|
+
var SCOUT_MODE = `
|
|
20022
|
+
---
|
|
20023
|
+
|
|
20024
|
+
## Scout Mode: Planning
|
|
20025
|
+
|
|
20026
|
+
You are in **Scout Mode** - focus on discovery and planning.
|
|
20027
|
+
|
|
20028
|
+
### Intent Classification (Do First)
|
|
20029
|
+
|
|
20030
|
+
| Intent | Signals | Action |
|
|
20031
|
+
|--------|---------|--------|
|
|
20032
|
+
| **Trivial** | Single file, <10 lines | Do it directly. No feature needed. |
|
|
20033
|
+
| **Simple** | 1-2 files, <30 min | Quick questions → light plan |
|
|
20034
|
+
| **Complex** | 3+ files, review needed | Full discovery → detailed plan |
|
|
20035
|
+
| **Refactor** | Existing code changes | Safety: tests, rollback, blast radius |
|
|
20036
|
+
| **Greenfield** | New feature | Research patterns first |
|
|
20037
|
+
|
|
20038
|
+
### Discovery
|
|
20039
|
+
|
|
20040
|
+
1. **Research** before asking (delegate to explorer/librarian if needed)
|
|
20041
|
+
2. **Interview** based on intent complexity
|
|
20042
|
+
3. **Self-clearance check** after each exchange:
|
|
20043
|
+
- Core objective clear? ✓
|
|
20044
|
+
- Scope defined (IN/OUT)? ✓
|
|
20045
|
+
- No critical ambiguities? ✓
|
|
20046
|
+
- Approach decided? ✓
|
|
20047
|
+
|
|
20048
|
+
### Planning
|
|
20049
|
+
|
|
20050
|
+
\`\`\`
|
|
20051
|
+
hive_feature_create({ name: "feature-name" })
|
|
20052
|
+
hive_context_write({ name: "research", content: "..." }) // Save findings
|
|
20053
|
+
hive_plan_write({ content: "..." }) // Must include ## Discovery section
|
|
20054
|
+
\`\`\`
|
|
20055
|
+
|
|
20056
|
+
**Plan Structure:**
|
|
20057
|
+
\`\`\`markdown
|
|
20058
|
+
# Feature Title
|
|
20059
|
+
|
|
20060
|
+
## Discovery
|
|
20061
|
+
- Q: {question} → A: {answer}
|
|
20062
|
+
- Research: {finding at file:lines}
|
|
20063
|
+
|
|
20064
|
+
## Non-Goals (What we're NOT building)
|
|
20065
|
+
- {explicit exclusion}
|
|
20066
|
+
|
|
20067
|
+
## Tasks
|
|
18602
20068
|
|
|
18603
|
-
|
|
18604
|
-
|
|
20069
|
+
### 1. Task Name
|
|
20070
|
+
**What**: {implementation steps}
|
|
20071
|
+
**Must NOT**: {guardrails}
|
|
20072
|
+
**References**: \`file:lines\` — {why}
|
|
20073
|
+
**Verify**: \`{command}\` → {expected}
|
|
20074
|
+
\`\`\`
|
|
18605
20075
|
|
|
18606
|
-
|
|
18607
|
-
- Multiple files to change
|
|
18608
|
-
- Task requires planning
|
|
18609
|
-
- Work should be reviewed before merging
|
|
18610
|
-
- User mentions "feature", "implement", or describes multi-step work
|
|
20076
|
+
### Handoff
|
|
18611
20077
|
|
|
18612
|
-
|
|
20078
|
+
After plan written:
|
|
20079
|
+
1. Tell user: **"Plan ready for review"**
|
|
20080
|
+
2. Wait for user approval (\`hive_plan_approve\`)
|
|
20081
|
+
3. Once approved, you automatically switch to Receiver mode
|
|
20082
|
+
`;
|
|
20083
|
+
var RECEIVER_MODE = `
|
|
20084
|
+
---
|
|
18613
20085
|
|
|
18614
|
-
|
|
18615
|
-
1. Write plan via hive_plan_write
|
|
18616
|
-
2. Wait for user to review and add comments
|
|
18617
|
-
3. Read comments via hive_plan_read, revise if needed
|
|
18618
|
-
4. Get approval (explicit or via hive_plan_approve)
|
|
18619
|
-
5. Generate tasks via hive_tasks_sync
|
|
18620
|
-
6. Execute tasks via hive_exec_start (spawns workers)
|
|
18621
|
-
7. Monitor workers via hive_worker_status
|
|
18622
|
-
8. Handle any blocked workers
|
|
18623
|
-
9. Merge completed work via hive_merge
|
|
20086
|
+
## Receiver Mode: Execution
|
|
18624
20087
|
|
|
18625
|
-
|
|
20088
|
+
You are in **Receiver Mode** - focus on orchestration.
|
|
18626
20089
|
|
|
18627
|
-
|
|
20090
|
+
### Execution Loop
|
|
18628
20091
|
|
|
18629
|
-
1. **
|
|
18630
|
-
- reason: Why they're blocked
|
|
18631
|
-
- options: Available choices
|
|
18632
|
-
- recommendation: Worker's suggestion
|
|
20092
|
+
1. **Sync tasks** (if not done): \`hive_tasks_sync()\`
|
|
18633
20093
|
|
|
18634
|
-
2. **
|
|
20094
|
+
2. **For each task**:
|
|
18635
20095
|
\`\`\`
|
|
18636
|
-
|
|
18637
|
-
|
|
18638
|
-
|
|
18639
|
-
|
|
18640
|
-
options: [
|
|
18641
|
-
{ label: "Option A", description: "..." },
|
|
18642
|
-
{ label: "Option B", description: "..." }
|
|
18643
|
-
]
|
|
18644
|
-
}]
|
|
18645
|
-
})
|
|
20096
|
+
hive_exec_start({ task: "01-task-name" }) // Spawns worker
|
|
20097
|
+
hive_worker_status() // Monitor
|
|
20098
|
+
hive_exec_complete(...) // When done
|
|
20099
|
+
hive_merge({ task: "01-task-name" }) // Integrate
|
|
18646
20100
|
\`\`\`
|
|
18647
20101
|
|
|
18648
|
-
3. **
|
|
20102
|
+
3. **Parallel execution** (when tasks are independent):
|
|
18649
20103
|
\`\`\`
|
|
18650
|
-
hive_exec_start({
|
|
18651
|
-
|
|
18652
|
-
|
|
18653
|
-
|
|
20104
|
+
hive_exec_start({ task: "02-task-a" })
|
|
20105
|
+
hive_exec_start({ task: "03-task-b" })
|
|
20106
|
+
hive_worker_status() // Monitor all
|
|
20107
|
+
\`\`\`
|
|
20108
|
+
|
|
20109
|
+
### Blocker Handling
|
|
20110
|
+
|
|
20111
|
+
When worker returns \`status: 'blocked'\`:
|
|
20112
|
+
|
|
20113
|
+
**Quick Decision** (can resolve without plan change):
|
|
20114
|
+
1. Check: \`hive_worker_status()\`
|
|
20115
|
+
2. Ask user via question tool (with options from blocker)
|
|
20116
|
+
3. Resume: \`hive_exec_start({ task, continueFrom: "blocked", decision: "answer" })\`
|
|
20117
|
+
|
|
20118
|
+
**Plan Gap** (needs plan revision):
|
|
20119
|
+
1. Recognize signals: "this wasn't in the plan", "need to rethink", scope expansion
|
|
20120
|
+
2. Ask user: "This blocker suggests a gap in our plan. Should we revise the plan?"
|
|
20121
|
+
3. If yes → Abort task, switch to Scout mode, update plan
|
|
20122
|
+
|
|
20123
|
+
### Detecting Need to Replan
|
|
20124
|
+
|
|
20125
|
+
Watch for these signals:
|
|
20126
|
+
- Blocker reason mentions missing requirements
|
|
20127
|
+
- User says "wait", "actually", "let's change"
|
|
20128
|
+
- Multiple consecutive task failures
|
|
20129
|
+
- Worker recommends "revise plan"
|
|
20130
|
+
|
|
20131
|
+
When detected, ask:
|
|
20132
|
+
\`\`\`json
|
|
20133
|
+
{
|
|
20134
|
+
"questions": [{
|
|
20135
|
+
"question": "This suggests our plan may need revision. How would you like to proceed?",
|
|
20136
|
+
"header": "Plan Gap Detected",
|
|
20137
|
+
"options": [
|
|
20138
|
+
{ "label": "Revise Plan", "description": "Go back to planning, update the plan" },
|
|
20139
|
+
{ "label": "Quick Fix", "description": "Handle this as a one-off decision, continue execution" },
|
|
20140
|
+
{ "label": "Abort Feature", "description": "Stop work on this feature entirely" }
|
|
20141
|
+
]
|
|
20142
|
+
}]
|
|
20143
|
+
}
|
|
20144
|
+
\`\`\`
|
|
20145
|
+
|
|
20146
|
+
### Switching to Scout Mode (Replan)
|
|
20147
|
+
|
|
20148
|
+
When user chooses to revise:
|
|
20149
|
+
|
|
20150
|
+
1. Abort in-progress work:
|
|
20151
|
+
\`\`\`
|
|
20152
|
+
hive_exec_abort({ task: "current-task" })
|
|
20153
|
+
\`\`\`
|
|
20154
|
+
|
|
20155
|
+
2. Document what we learned:
|
|
20156
|
+
\`\`\`
|
|
20157
|
+
hive_context_write({
|
|
20158
|
+
name: "execution-learnings",
|
|
20159
|
+
content: "## What We Learned\\n- {insight from blocked task}\\n- {what needs to change}"
|
|
18654
20160
|
})
|
|
18655
20161
|
\`\`\`
|
|
18656
20162
|
|
|
18657
|
-
|
|
20163
|
+
3. Update plan (triggers Scout mode):
|
|
20164
|
+
\`\`\`
|
|
20165
|
+
hive_plan_write({ content: "..." }) // Updated plan
|
|
20166
|
+
\`\`\`
|
|
18658
20167
|
|
|
18659
|
-
|
|
20168
|
+
4. Tell user: "Plan updated. Ready for re-approval."
|
|
18660
20169
|
|
|
18661
|
-
|
|
18662
|
-
- Start work immediately
|
|
18663
|
-
- Challenge wrong approaches professionally
|
|
18664
|
-
- Don't summarize unless asked
|
|
18665
|
-
- Use hive tools proactively when in feature context
|
|
18666
|
-
`;
|
|
18667
|
-
function buildFeatureContextSection(ctx) {
|
|
18668
|
-
return `
|
|
18669
|
-
## Active Feature: ${ctx.name}
|
|
20170
|
+
### Completion
|
|
18670
20171
|
|
|
18671
|
-
|
|
18672
|
-
|
|
18673
|
-
|
|
20172
|
+
When all tasks done:
|
|
20173
|
+
\`\`\`
|
|
20174
|
+
hive_feature_complete()
|
|
20175
|
+
\`\`\`
|
|
18674
20176
|
|
|
18675
|
-
|
|
20177
|
+
Report: "Feature complete. All tasks merged."
|
|
18676
20178
|
`;
|
|
18677
|
-
|
|
18678
|
-
|
|
18679
|
-
|
|
20179
|
+
var TRANSITION_MODE = `
|
|
20180
|
+
---
|
|
20181
|
+
|
|
20182
|
+
## Transition: Approved → Executing
|
|
18680
20183
|
|
|
18681
|
-
|
|
18682
|
-
|
|
18683
|
-
|
|
18684
|
-
|
|
18685
|
-
|
|
18686
|
-
- **general** - Default implementation
|
|
20184
|
+
Plan is approved. Sync tasks and begin execution:
|
|
20185
|
+
|
|
20186
|
+
\`\`\`
|
|
20187
|
+
hive_tasks_sync()
|
|
20188
|
+
\`\`\`
|
|
18687
20189
|
|
|
18688
|
-
|
|
18689
|
-
Watch workers in tmux panes for real-time progress.
|
|
20190
|
+
Then proceed with Receiver mode.
|
|
18690
20191
|
`;
|
|
18691
|
-
function buildHiveAgentPrompt(featureContext,
|
|
18692
|
-
let prompt =
|
|
18693
|
-
if (featureContext) {
|
|
18694
|
-
prompt +=
|
|
20192
|
+
function buildHiveAgentPrompt(featureContext, _omoSlimDetected) {
|
|
20193
|
+
let prompt = CORE_IDENTITY;
|
|
20194
|
+
if (!featureContext || featureContext.status === "none" || featureContext.status === "planning") {
|
|
20195
|
+
prompt += SCOUT_MODE;
|
|
20196
|
+
} else if (featureContext.status === "approved") {
|
|
20197
|
+
prompt += TRANSITION_MODE;
|
|
20198
|
+
prompt += RECEIVER_MODE;
|
|
20199
|
+
} else if (featureContext.status === "executing") {
|
|
20200
|
+
prompt += RECEIVER_MODE;
|
|
20201
|
+
} else {
|
|
20202
|
+
prompt += `
|
|
20203
|
+
|
|
20204
|
+
## Feature Completed
|
|
20205
|
+
|
|
20206
|
+
Feature "${featureContext.name}" is complete. Start a new feature with \`hive_feature_create\`.`;
|
|
18695
20207
|
}
|
|
18696
|
-
if (
|
|
18697
|
-
prompt +=
|
|
20208
|
+
if (featureContext && featureContext.status !== "none") {
|
|
20209
|
+
prompt += `
|
|
20210
|
+
|
|
20211
|
+
---
|
|
20212
|
+
|
|
20213
|
+
## Current Status
|
|
20214
|
+
|
|
20215
|
+
`;
|
|
20216
|
+
prompt += `| Property | Value |
|
|
20217
|
+
`;
|
|
20218
|
+
prompt += `|----------|-------|
|
|
20219
|
+
`;
|
|
20220
|
+
prompt += `| Feature | ${featureContext.name} |
|
|
20221
|
+
`;
|
|
20222
|
+
prompt += `| Status | ${featureContext.status} |
|
|
20223
|
+
`;
|
|
20224
|
+
prompt += `| Plan | ${featureContext.planApproved ? "approved" : "pending"} |
|
|
20225
|
+
`;
|
|
20226
|
+
prompt += `| Tasks | ${featureContext.tasksSummary} |
|
|
20227
|
+
`;
|
|
20228
|
+
if (featureContext.contextList.length > 0) {
|
|
20229
|
+
prompt += `| Context | ${featureContext.contextList.join(", ")} |
|
|
20230
|
+
`;
|
|
20231
|
+
}
|
|
20232
|
+
if (featureContext.blockedTasks.length > 0) {
|
|
20233
|
+
prompt += `
|
|
20234
|
+
**⚠️ Blocked Tasks**: ${featureContext.blockedTasks.join(", ")}
|
|
20235
|
+
`;
|
|
20236
|
+
prompt += `Handle blockers before proceeding. Consider if this indicates a plan gap.
|
|
20237
|
+
`;
|
|
20238
|
+
}
|
|
20239
|
+
if (featureContext.pendingTasks.length > 0 && featureContext.status === "executing") {
|
|
20240
|
+
prompt += `
|
|
20241
|
+
**Next Task**: ${featureContext.pendingTasks[0]}
|
|
20242
|
+
`;
|
|
20243
|
+
}
|
|
18698
20244
|
}
|
|
18699
20245
|
return prompt;
|
|
18700
20246
|
}
|
|
18701
20247
|
|
|
18702
20248
|
// src/index.ts
|
|
18703
|
-
function
|
|
18704
|
-
const
|
|
18705
|
-
if (!match) {
|
|
18706
|
-
return { meta: {}, body: content.trim() };
|
|
18707
|
-
}
|
|
18708
|
-
const meta = {};
|
|
18709
|
-
const frontmatter = match[1];
|
|
18710
|
-
const body = match[2];
|
|
18711
|
-
for (const line of frontmatter.split(`
|
|
18712
|
-
`)) {
|
|
18713
|
-
const colonIdx = line.indexOf(":");
|
|
18714
|
-
if (colonIdx > 0) {
|
|
18715
|
-
const key = line.slice(0, colonIdx).trim();
|
|
18716
|
-
const value = line.slice(colonIdx + 1).trim();
|
|
18717
|
-
meta[key] = value;
|
|
18718
|
-
}
|
|
18719
|
-
}
|
|
18720
|
-
return { meta, body: body.trim() };
|
|
18721
|
-
}
|
|
18722
|
-
function getSkillsDir() {
|
|
18723
|
-
const filename = fileURLToPath(import.meta.url);
|
|
18724
|
-
const dirname5 = path5.dirname(filename);
|
|
18725
|
-
return path5.join(dirname5, "..", "skills");
|
|
18726
|
-
}
|
|
18727
|
-
function discoverHiveSkills() {
|
|
18728
|
-
const skillsDir = getSkillsDir();
|
|
18729
|
-
const skills = [];
|
|
18730
|
-
if (!fs6.existsSync(skillsDir)) {
|
|
18731
|
-
return skills;
|
|
18732
|
-
}
|
|
18733
|
-
const entries = fs6.readdirSync(skillsDir, { withFileTypes: true });
|
|
18734
|
-
for (const entry of entries) {
|
|
18735
|
-
if (!entry.isDirectory())
|
|
18736
|
-
continue;
|
|
18737
|
-
const skillPath = path5.join(skillsDir, entry.name, "SKILL.md");
|
|
18738
|
-
if (!fs6.existsSync(skillPath))
|
|
18739
|
-
continue;
|
|
18740
|
-
try {
|
|
18741
|
-
const content = fs6.readFileSync(skillPath, "utf-8");
|
|
18742
|
-
const { meta, body } = parseFrontmatter(content);
|
|
18743
|
-
skills.push({
|
|
18744
|
-
name: meta.name || entry.name,
|
|
18745
|
-
description: meta.description || "",
|
|
18746
|
-
path: skillPath,
|
|
18747
|
-
body
|
|
18748
|
-
});
|
|
18749
|
-
} catch {}
|
|
18750
|
-
}
|
|
18751
|
-
return skills;
|
|
18752
|
-
}
|
|
18753
|
-
function formatSkillsXml(skills) {
|
|
20249
|
+
function formatSkillsXml() {
|
|
20250
|
+
const skills = getBuiltinSkills();
|
|
18754
20251
|
if (skills.length === 0)
|
|
18755
20252
|
return "";
|
|
18756
20253
|
const skillsXml = skills.map((skill) => {
|
|
@@ -18770,49 +20267,29 @@ ${skillsXml}
|
|
|
18770
20267
|
</available_skills>`;
|
|
18771
20268
|
}
|
|
18772
20269
|
function createHiveSkillTool() {
|
|
18773
|
-
|
|
18774
|
-
|
|
18775
|
-
const
|
|
18776
|
-
|
|
18777
|
-
|
|
18778
|
-
cachedSkills = discoverHiveSkills();
|
|
18779
|
-
return cachedSkills;
|
|
18780
|
-
};
|
|
18781
|
-
const getDescription = () => {
|
|
18782
|
-
if (cachedDescription)
|
|
18783
|
-
return cachedDescription;
|
|
18784
|
-
const skills = getSkills();
|
|
18785
|
-
const base = "Load a Hive skill to get detailed instructions for a specific workflow.";
|
|
18786
|
-
if (skills.length === 0) {
|
|
18787
|
-
cachedDescription = base + `
|
|
18788
|
-
|
|
18789
|
-
No Hive skills available.`;
|
|
18790
|
-
} else {
|
|
18791
|
-
cachedDescription = base + formatSkillsXml(skills);
|
|
18792
|
-
}
|
|
18793
|
-
return cachedDescription;
|
|
18794
|
-
};
|
|
18795
|
-
getDescription();
|
|
20270
|
+
const base = "Load a Hive skill to get detailed instructions for a specific workflow.";
|
|
20271
|
+
const skills = getBuiltinSkills();
|
|
20272
|
+
const description = skills.length === 0 ? base + `
|
|
20273
|
+
|
|
20274
|
+
No Hive skills available.` : base + formatSkillsXml();
|
|
18796
20275
|
return tool({
|
|
18797
|
-
|
|
18798
|
-
return cachedDescription ?? "Load a Hive skill to get detailed instructions for a specific workflow.";
|
|
18799
|
-
},
|
|
20276
|
+
description,
|
|
18800
20277
|
args: {
|
|
18801
20278
|
name: tool.schema.string().describe("The skill name from available_skills")
|
|
18802
20279
|
},
|
|
18803
20280
|
async execute({ name }) {
|
|
18804
|
-
const
|
|
18805
|
-
|
|
18806
|
-
if (!skill) {
|
|
20281
|
+
const result = loadBuiltinSkill(name);
|
|
20282
|
+
if (!result.found || !result.skill) {
|
|
18807
20283
|
const available = skills.map((s) => s.name).join(", ");
|
|
18808
20284
|
throw new Error(`Skill "${name}" not found. Available Hive skills: ${available || "none"}`);
|
|
18809
20285
|
}
|
|
20286
|
+
const skill = result.skill;
|
|
18810
20287
|
return [
|
|
18811
20288
|
`## Hive Skill: ${skill.name}`,
|
|
18812
20289
|
"",
|
|
18813
20290
|
`**Description**: ${skill.description}`,
|
|
18814
20291
|
"",
|
|
18815
|
-
skill.
|
|
20292
|
+
skill.template
|
|
18816
20293
|
].join(`
|
|
18817
20294
|
`);
|
|
18818
20295
|
}
|
|
@@ -18861,10 +20338,13 @@ When OMO-Slim is installed, \`hive_exec_start\` spawns worker agents in tmux pan
|
|
|
18861
20338
|
|
|
18862
20339
|
**Handling blocked workers:**
|
|
18863
20340
|
1. Check blockers with \`hive_worker_status()\`
|
|
18864
|
-
2. Read the blocker info (reason, options, recommendation)
|
|
18865
|
-
3. Ask user via \`question()\` tool
|
|
20341
|
+
2. Read the blocker info (reason, options, recommendation, context)
|
|
20342
|
+
3. Ask user via \`question()\` tool - NEVER plain text
|
|
18866
20343
|
4. Resume with \`hive_exec_start(task, continueFrom: "blocked", decision: answer)\`
|
|
18867
20344
|
|
|
20345
|
+
**CRITICAL**: When resuming, a NEW worker spawns in the SAME worktree.
|
|
20346
|
+
The previous worker's progress is preserved. Include the user's decision in the \`decision\` parameter.
|
|
20347
|
+
|
|
18868
20348
|
**Agent auto-selection** based on task content:
|
|
18869
20349
|
| Pattern | Agent |
|
|
18870
20350
|
|---------|-------|
|
|
@@ -18897,29 +20377,18 @@ During execution, call \`hive_status\` periodically to:
|
|
|
18897
20377
|
- Get reminded of next actions
|
|
18898
20378
|
`;
|
|
18899
20379
|
var plugin = async (ctx) => {
|
|
18900
|
-
const { directory } = ctx;
|
|
20380
|
+
const { directory, client } = ctx;
|
|
18901
20381
|
const featureService = new FeatureService(directory);
|
|
18902
20382
|
const planService = new PlanService(directory);
|
|
18903
20383
|
const taskService = new TaskService(directory);
|
|
18904
20384
|
const contextService = new ContextService(directory);
|
|
20385
|
+
const configService = new ConfigService;
|
|
18905
20386
|
const worktreeService = new WorktreeService({
|
|
18906
20387
|
baseDir: directory,
|
|
18907
20388
|
hiveDir: path5.join(directory, ".hive")
|
|
18908
20389
|
});
|
|
18909
|
-
|
|
18910
|
-
|
|
18911
|
-
const detectOmoSlim = (toolContext) => {
|
|
18912
|
-
if (detectionDone)
|
|
18913
|
-
return omoSlimDetected;
|
|
18914
|
-
const ctx2 = toolContext;
|
|
18915
|
-
if (ctx2?.tools?.includes?.("background_task") || ctx2?.background_task || typeof ctx2?.callTool === "function") {
|
|
18916
|
-
omoSlimDetected = true;
|
|
18917
|
-
}
|
|
18918
|
-
detectionDone = true;
|
|
18919
|
-
if (omoSlimDetected) {
|
|
18920
|
-
console.log("[Hive] OMO-Slim detected: delegated execution with tmux panes enabled");
|
|
18921
|
-
}
|
|
18922
|
-
return omoSlimDetected;
|
|
20390
|
+
const isOmoSlimEnabled = () => {
|
|
20391
|
+
return configService.isOmoSlimEnabled();
|
|
18923
20392
|
};
|
|
18924
20393
|
const resolveFeature = (explicit) => {
|
|
18925
20394
|
if (explicit)
|
|
@@ -18987,7 +20456,40 @@ To unblock: Remove .hive/features/${feature}/BLOCKED`;
|
|
|
18987
20456
|
},
|
|
18988
20457
|
async execute({ name, ticket }) {
|
|
18989
20458
|
const feature = featureService.create(name, ticket);
|
|
18990
|
-
return `Feature "${name}" created.
|
|
20459
|
+
return `Feature "${name}" created.
|
|
20460
|
+
|
|
20461
|
+
## Discovery Phase Required
|
|
20462
|
+
|
|
20463
|
+
Before writing a plan, you MUST:
|
|
20464
|
+
1. Ask clarifying questions about the feature
|
|
20465
|
+
2. Document Q&A in plan.md with a \`## Discovery\` section
|
|
20466
|
+
3. Research the codebase (grep, read existing code)
|
|
20467
|
+
4. Save findings with hive_context_write
|
|
20468
|
+
|
|
20469
|
+
Example discovery section:
|
|
20470
|
+
\`\`\`markdown
|
|
20471
|
+
## Discovery
|
|
20472
|
+
|
|
20473
|
+
**Q: What authentication system do we use?**
|
|
20474
|
+
A: JWT with refresh tokens, see src/auth/
|
|
20475
|
+
|
|
20476
|
+
**Q: Should this work offline?**
|
|
20477
|
+
A: No, online-only is fine
|
|
20478
|
+
|
|
20479
|
+
**Research:**
|
|
20480
|
+
- Found existing theme system in src/theme/
|
|
20481
|
+
- Uses CSS variables pattern
|
|
20482
|
+
\`\`\`
|
|
20483
|
+
|
|
20484
|
+
## Planning Guidelines
|
|
20485
|
+
|
|
20486
|
+
When writing your plan, include:
|
|
20487
|
+
- \`## Non-Goals\` - What we're explicitly NOT building (scope boundaries)
|
|
20488
|
+
- \`## Ghost Diffs\` - Alternatives you considered but rejected
|
|
20489
|
+
|
|
20490
|
+
These prevent scope creep and re-proposing rejected solutions.
|
|
20491
|
+
|
|
20492
|
+
NEXT: Ask your first clarifying question about this feature.`;
|
|
18991
20493
|
}
|
|
18992
20494
|
}),
|
|
18993
20495
|
hive_feature_list: tool({
|
|
@@ -19017,6 +20519,34 @@ To unblock: Remove .hive/features/${feature}/BLOCKED`;
|
|
|
19017
20519
|
return `Feature "${feature}" marked as completed`;
|
|
19018
20520
|
}
|
|
19019
20521
|
}),
|
|
20522
|
+
hive_journal_append: tool({
|
|
20523
|
+
description: "Append entry to .hive/journal.md for audit trail",
|
|
20524
|
+
args: {
|
|
20525
|
+
feature: tool.schema.string().describe("Feature name for context"),
|
|
20526
|
+
trouble: tool.schema.string().describe("What went wrong"),
|
|
20527
|
+
resolution: tool.schema.string().describe("How it was fixed"),
|
|
20528
|
+
constraint: tool.schema.string().optional().describe("Never/Always rule derived")
|
|
20529
|
+
},
|
|
20530
|
+
async execute({ feature, trouble, resolution, constraint }) {
|
|
20531
|
+
const journalPath = path5.join(directory, ".hive", "journal.md");
|
|
20532
|
+
if (!fs6.existsSync(journalPath)) {
|
|
20533
|
+
return `Error: journal.md not found. Create a feature first to initialize the journal.`;
|
|
20534
|
+
}
|
|
20535
|
+
const date5 = new Date().toISOString().split("T")[0];
|
|
20536
|
+
const entry = `
|
|
20537
|
+
### ${date5}: ${feature}
|
|
20538
|
+
|
|
20539
|
+
**Trouble**: ${trouble}
|
|
20540
|
+
**Resolution**: ${resolution}
|
|
20541
|
+
${constraint ? `**Constraint**: ${constraint}` : ""}
|
|
20542
|
+
**See**: .hive/features/${feature}/plan.md
|
|
20543
|
+
|
|
20544
|
+
---
|
|
20545
|
+
`;
|
|
20546
|
+
fs6.appendFileSync(journalPath, entry);
|
|
20547
|
+
return `Journal entry added for ${feature}. ${constraint ? `Constraint: "${constraint}"` : ""}`;
|
|
20548
|
+
}
|
|
20549
|
+
}),
|
|
19020
20550
|
hive_plan_write: tool({
|
|
19021
20551
|
description: "Write plan.md (clears existing comments)",
|
|
19022
20552
|
args: {
|
|
@@ -19027,6 +20557,17 @@ To unblock: Remove .hive/features/${feature}/BLOCKED`;
|
|
|
19027
20557
|
const feature = resolveFeature(explicitFeature);
|
|
19028
20558
|
if (!feature)
|
|
19029
20559
|
return "Error: No feature specified. Create a feature or provide feature param.";
|
|
20560
|
+
const hasDiscovery = content.toLowerCase().includes("## discovery");
|
|
20561
|
+
if (!hasDiscovery) {
|
|
20562
|
+
return `BLOCKED: Discovery section required before planning.
|
|
20563
|
+
|
|
20564
|
+
Your plan must include a \`## Discovery\` section documenting:
|
|
20565
|
+
- Questions you asked and answers received
|
|
20566
|
+
- Research findings from codebase exploration
|
|
20567
|
+
- Key decisions made
|
|
20568
|
+
|
|
20569
|
+
Add this section to your plan content and try again.`;
|
|
20570
|
+
}
|
|
19030
20571
|
captureSession(feature, toolContext);
|
|
19031
20572
|
const planPath = planService.write(feature, content);
|
|
19032
20573
|
return `Plan written to ${planPath}. Comments cleared for fresh review.`;
|
|
@@ -19192,8 +20733,7 @@ ${priorTasks.join(`
|
|
|
19192
20733
|
`;
|
|
19193
20734
|
}
|
|
19194
20735
|
taskService.writeSpec(feature, task, specContent);
|
|
19195
|
-
|
|
19196
|
-
if (omoSlimDetected) {
|
|
20736
|
+
if (isOmoSlimEnabled()) {
|
|
19197
20737
|
const contextFiles = [];
|
|
19198
20738
|
const contextDir = path5.join(directory, ".hive", "features", feature, "context");
|
|
19199
20739
|
if (fs6.existsSync(contextDir)) {
|
|
@@ -19220,34 +20760,40 @@ ${priorTasks.join(`
|
|
|
19220
20760
|
decision: decision || "No decision provided"
|
|
19221
20761
|
} : undefined
|
|
19222
20762
|
});
|
|
19223
|
-
const agent =
|
|
19224
|
-
|
|
19225
|
-
|
|
19226
|
-
|
|
19227
|
-
|
|
19228
|
-
|
|
19229
|
-
|
|
19230
|
-
|
|
19231
|
-
|
|
19232
|
-
|
|
19233
|
-
|
|
19234
|
-
|
|
19235
|
-
|
|
19236
|
-
|
|
19237
|
-
|
|
19238
|
-
|
|
19239
|
-
|
|
19240
|
-
|
|
19241
|
-
|
|
19242
|
-
|
|
19243
|
-
|
|
19244
|
-
|
|
19245
|
-
|
|
19246
|
-
|
|
19247
|
-
|
|
19248
|
-
|
|
19249
|
-
|
|
19250
|
-
|
|
20763
|
+
const agent = "forager";
|
|
20764
|
+
return JSON.stringify({
|
|
20765
|
+
worktreePath: worktree.path,
|
|
20766
|
+
branch: worktree.branch,
|
|
20767
|
+
mode: "delegate",
|
|
20768
|
+
agent,
|
|
20769
|
+
delegationRequired: true,
|
|
20770
|
+
backgroundTaskCall: {
|
|
20771
|
+
agent,
|
|
20772
|
+
prompt: workerPrompt,
|
|
20773
|
+
description: `Hive: ${task}`,
|
|
20774
|
+
sync: false
|
|
20775
|
+
},
|
|
20776
|
+
instructions: `## Delegation Required
|
|
20777
|
+
|
|
20778
|
+
You MUST now call background_task to spawn a Forager worker:
|
|
20779
|
+
|
|
20780
|
+
\`\`\`
|
|
20781
|
+
background_task({
|
|
20782
|
+
agent: "forager",
|
|
20783
|
+
prompt: <the workerPrompt below>,
|
|
20784
|
+
description: "Hive: ${task}",
|
|
20785
|
+
sync: false
|
|
20786
|
+
})
|
|
20787
|
+
\`\`\`
|
|
20788
|
+
|
|
20789
|
+
After spawning:
|
|
20790
|
+
- Monitor with hive_worker_status
|
|
20791
|
+
- Handle blockers when worker exits
|
|
20792
|
+
- Merge completed work with hive_merge
|
|
20793
|
+
|
|
20794
|
+
DO NOT do the work yourself. Delegate it.`,
|
|
20795
|
+
workerPrompt
|
|
20796
|
+
}, null, 2);
|
|
19251
20797
|
}
|
|
19252
20798
|
return `Worktree created at ${worktree.path}
|
|
19253
20799
|
Branch: ${worktree.branch}
|
|
@@ -19279,6 +20825,23 @@ Reminder: do all work inside this worktree and ensure any subagents do the same.
|
|
|
19279
20825
|
return `Error: Task "${task}" not found`;
|
|
19280
20826
|
if (taskInfo.status !== "in_progress" && taskInfo.status !== "blocked")
|
|
19281
20827
|
return "Error: Task not in progress";
|
|
20828
|
+
if (status === "completed") {
|
|
20829
|
+
const verificationKeywords = ["test", "build", "lint", "vitest", "jest", "npm run", "pnpm", "cargo", "pytest", "verified", "passes", "succeeds"];
|
|
20830
|
+
const summaryLower = summary.toLowerCase();
|
|
20831
|
+
const hasVerificationMention = verificationKeywords.some((kw) => summaryLower.includes(kw));
|
|
20832
|
+
if (!hasVerificationMention) {
|
|
20833
|
+
return `BLOCKED: No verification detected in summary.
|
|
20834
|
+
|
|
20835
|
+
Before claiming completion, you must:
|
|
20836
|
+
1. Run tests (vitest, jest, pytest, etc.)
|
|
20837
|
+
2. Run build (npm run build, cargo build, etc.)
|
|
20838
|
+
3. Include verification results in summary
|
|
20839
|
+
|
|
20840
|
+
Example summary: "Implemented auth flow. Tests pass (vitest). Build succeeds."
|
|
20841
|
+
|
|
20842
|
+
Re-run with updated summary showing verification results.`;
|
|
20843
|
+
}
|
|
20844
|
+
}
|
|
19282
20845
|
if (status === "blocked") {
|
|
19283
20846
|
taskService.update(feature, task, {
|
|
19284
20847
|
status: "blocked",
|
|
@@ -19385,9 +20948,10 @@ Use hive_merge to integrate changes. Worktree preserved at ${worktree?.path || "
|
|
|
19385
20948
|
summary: t.summary || null
|
|
19386
20949
|
};
|
|
19387
20950
|
}));
|
|
20951
|
+
const omoSlimEnabled = isOmoSlimEnabled();
|
|
19388
20952
|
return JSON.stringify({
|
|
19389
20953
|
feature,
|
|
19390
|
-
|
|
20954
|
+
omoSlimEnabled,
|
|
19391
20955
|
workers,
|
|
19392
20956
|
hint: workers.some((w) => w.status === "blocked") ? 'Use hive_exec_start(task, continueFrom: "blocked", decision: answer) to resume blocked workers' : workers.some((w) => w.maybeStuck) ? "Some workers may be stuck. Check tmux panes or abort with hive_exec_abort." : "Workers in progress. Watch tmux panes for live updates."
|
|
19393
20957
|
}, null, 2);
|
|
@@ -19640,8 +21204,50 @@ Make the requested changes, then call hive_request_review again.`;
|
|
|
19640
21204
|
hive: {
|
|
19641
21205
|
model: undefined,
|
|
19642
21206
|
temperature: 0.7,
|
|
19643
|
-
description: "Hive Master -
|
|
19644
|
-
prompt: buildHiveAgentPrompt(undefined, false)
|
|
21207
|
+
description: "Hive Master - phase-aware planner+orchestrator. Auto-switches Scout/Receiver mode.",
|
|
21208
|
+
prompt: buildHiveAgentPrompt(undefined, false),
|
|
21209
|
+
permission: {
|
|
21210
|
+
question: "allow",
|
|
21211
|
+
skill: "allow",
|
|
21212
|
+
todowrite: "allow",
|
|
21213
|
+
todoread: "allow",
|
|
21214
|
+
webfetch: "allow"
|
|
21215
|
+
}
|
|
21216
|
+
},
|
|
21217
|
+
scout: {
|
|
21218
|
+
model: undefined,
|
|
21219
|
+
temperature: 0.7,
|
|
21220
|
+
description: "Scout (explicit) - Discovery and planning only. Use @hive for automatic mode.",
|
|
21221
|
+
prompt: SCOUT_PROMPT,
|
|
21222
|
+
permission: {
|
|
21223
|
+
edit: "deny",
|
|
21224
|
+
question: "allow",
|
|
21225
|
+
skill: "allow",
|
|
21226
|
+
todowrite: "allow",
|
|
21227
|
+
todoread: "allow",
|
|
21228
|
+
webfetch: "allow"
|
|
21229
|
+
}
|
|
21230
|
+
},
|
|
21231
|
+
receiver: {
|
|
21232
|
+
model: undefined,
|
|
21233
|
+
temperature: 0.5,
|
|
21234
|
+
description: "Receiver (explicit) - Orchestration only. Use @hive for automatic mode.",
|
|
21235
|
+
prompt: RECEIVER_PROMPT,
|
|
21236
|
+
permission: {
|
|
21237
|
+
question: "allow",
|
|
21238
|
+
skill: "allow",
|
|
21239
|
+
todowrite: "allow",
|
|
21240
|
+
todoread: "allow"
|
|
21241
|
+
}
|
|
21242
|
+
},
|
|
21243
|
+
forager: {
|
|
21244
|
+
model: undefined,
|
|
21245
|
+
temperature: 0.3,
|
|
21246
|
+
description: "Forager - Task executor (subagent). Spawned automatically, not for direct use.",
|
|
21247
|
+
prompt: FORAGER_PROMPT,
|
|
21248
|
+
permission: {
|
|
21249
|
+
skill: "allow"
|
|
21250
|
+
}
|
|
19645
21251
|
}
|
|
19646
21252
|
},
|
|
19647
21253
|
systemPrompt: (existingPrompt) => {
|
|
@@ -19652,44 +21258,66 @@ Make the requested changes, then call hive_request_review again.`;
|
|
|
19652
21258
|
let featureContext;
|
|
19653
21259
|
for (const featureName of featureNames) {
|
|
19654
21260
|
const feature = featureService.get(featureName);
|
|
19655
|
-
if (feature && ["planning", "executing"].includes(feature.status)) {
|
|
21261
|
+
if (feature && ["planning", "approved", "executing"].includes(feature.status)) {
|
|
19656
21262
|
const tasks = taskService.list(featureName);
|
|
19657
|
-
const
|
|
21263
|
+
const pendingTasks = tasks.filter((t) => t.status === "pending").map((t) => t.folder);
|
|
21264
|
+
const blockedTasks = tasks.filter((t) => t.status === "blocked").map((t) => t.folder);
|
|
19658
21265
|
const inProgressCount = tasks.filter((t) => t.status === "in_progress").length;
|
|
19659
21266
|
const doneCount = tasks.filter((t) => t.status === "done").length;
|
|
19660
21267
|
const contextDir = path5.join(directory, ".hive", "features", featureName, "context");
|
|
19661
21268
|
const contextList = fs6.existsSync(contextDir) ? fs6.readdirSync(contextDir).filter((f) => f.endsWith(".md")) : [];
|
|
19662
21269
|
const planResult = planService.read(featureName);
|
|
19663
|
-
|
|
19664
|
-
|
|
19665
|
-
planStatus = planResult.status === "approved" || planResult.status === "executing" ? "approved" : "draft";
|
|
19666
|
-
}
|
|
21270
|
+
const planApproved = planResult?.status === "approved" || planResult?.status === "executing" || feature.status === "approved" || feature.status === "executing";
|
|
21271
|
+
const status = feature.status === "completed" ? "completed" : feature.status === "approved" ? "approved" : feature.status === "executing" ? "executing" : "planning";
|
|
19667
21272
|
featureContext = {
|
|
19668
21273
|
name: featureName,
|
|
19669
|
-
|
|
19670
|
-
|
|
19671
|
-
|
|
21274
|
+
status,
|
|
21275
|
+
planApproved,
|
|
21276
|
+
tasksSummary: `${doneCount} done, ${inProgressCount} in progress, ${pendingTasks.length} pending`,
|
|
21277
|
+
contextList,
|
|
21278
|
+
pendingTasks,
|
|
21279
|
+
blockedTasks
|
|
19672
21280
|
};
|
|
19673
21281
|
break;
|
|
19674
21282
|
}
|
|
19675
21283
|
}
|
|
19676
|
-
if (featureContext ||
|
|
19677
|
-
return buildHiveAgentPrompt(featureContext,
|
|
21284
|
+
if (featureContext || isOmoSlimEnabled()) {
|
|
21285
|
+
return buildHiveAgentPrompt(featureContext, isOmoSlimEnabled());
|
|
19678
21286
|
}
|
|
19679
21287
|
return existingPrompt;
|
|
19680
21288
|
},
|
|
19681
21289
|
config: async (opencodeConfig) => {
|
|
21290
|
+
configService.init();
|
|
21291
|
+
const hiveUserConfig = configService.getAgentConfig("hive");
|
|
21292
|
+
const foragerUserConfig = configService.getAgentConfig("forager");
|
|
19682
21293
|
const hiveAgentConfig = {
|
|
19683
|
-
model:
|
|
19684
|
-
temperature: 0.7,
|
|
21294
|
+
model: hiveUserConfig.model,
|
|
21295
|
+
temperature: hiveUserConfig.temperature ?? 0.7,
|
|
19685
21296
|
description: "Hive Master - plan-first development with structured workflow and worker delegation",
|
|
19686
|
-
prompt: buildHiveAgentPrompt(undefined, false)
|
|
21297
|
+
prompt: buildHiveAgentPrompt(undefined, false),
|
|
21298
|
+
permission: {
|
|
21299
|
+
question: "allow",
|
|
21300
|
+
skill: "allow",
|
|
21301
|
+
todowrite: "allow",
|
|
21302
|
+
todoread: "allow",
|
|
21303
|
+
webfetch: "allow"
|
|
21304
|
+
}
|
|
21305
|
+
};
|
|
21306
|
+
const foragerAgentConfig = {
|
|
21307
|
+
model: foragerUserConfig.model,
|
|
21308
|
+
temperature: foragerUserConfig.temperature ?? 0.3,
|
|
21309
|
+
description: "Forager - Task executor (worker). Spawned by Hive Master for isolated task execution.",
|
|
21310
|
+
prompt: foragerAgent.prompt,
|
|
21311
|
+
permission: {
|
|
21312
|
+
skill: "allow"
|
|
21313
|
+
}
|
|
19687
21314
|
};
|
|
19688
21315
|
const configAgent = opencodeConfig.agent;
|
|
19689
21316
|
if (!configAgent) {
|
|
19690
|
-
opencodeConfig.agent = { hive: hiveAgentConfig };
|
|
21317
|
+
opencodeConfig.agent = { hive: hiveAgentConfig, forager: foragerAgentConfig };
|
|
19691
21318
|
} else {
|
|
19692
21319
|
configAgent.hive = hiveAgentConfig;
|
|
21320
|
+
configAgent.forager = foragerAgentConfig;
|
|
19693
21321
|
}
|
|
19694
21322
|
}
|
|
19695
21323
|
};
|