openhermes 4.3.0 β 4.11.2
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/CONTEXT.md +10 -1
- package/README.md +54 -42
- package/bootstrap.ts +396 -142
- package/harness/agents/oh-browser.md +97 -0
- package/harness/agents/oh-builder.md +78 -0
- package/harness/agents/oh-facade.md +75 -0
- package/harness/agents/oh-fusion.md +45 -0
- package/harness/agents/oh-gauntlet.md +71 -0
- package/harness/agents/oh-grill.md +71 -0
- package/harness/agents/oh-investigate.md +60 -0
- package/harness/agents/oh-manifest.md +95 -0
- package/harness/agents/oh-plan-review.md +40 -0
- package/harness/agents/oh-planner.md +50 -0
- package/harness/agents/oh-refactor.md +37 -0
- package/harness/agents/oh-retro.md +46 -0
- package/harness/agents/oh-review.md +85 -0
- package/harness/agents/oh-security.md +83 -0
- package/harness/agents/oh-ship.md +76 -0
- package/harness/agents/oh-skill-craft.md +38 -0
- package/harness/agents/openhermes.md +28 -73
- package/harness/codex/AUTOPILOT.md +235 -87
- package/harness/codex/CHARTER.md +80 -0
- package/harness/instructions/SHELL.md +76 -0
- package/harness/lib/background/background.test.ts +197 -0
- package/harness/lib/background/index.ts +7 -0
- package/harness/lib/background/interfaces.ts +31 -0
- package/harness/lib/background/manager.ts +320 -0
- package/harness/lib/composer/compose.test.ts +168 -0
- package/harness/lib/composer/compose.ts +65 -0
- package/harness/lib/composer/fragments/01-identity.md +1 -0
- package/harness/lib/composer/fragments/02-delegation.md +6 -0
- package/harness/lib/composer/fragments/03-permissions.md +13 -0
- package/harness/lib/composer/fragments/04-task-flow.md +15 -0
- package/harness/lib/composer/fragments/05-confidence.md +5 -0
- package/harness/lib/composer/fragments/06-parallelization.md +17 -0
- package/harness/lib/composer/fragments/07-shell.md +41 -0
- package/harness/lib/composer/fragments/08-routing.md +8 -0
- package/harness/lib/composer/fragments/09-guardrails.md +12 -0
- package/harness/lib/composer/index.ts +1 -0
- package/harness/lib/hooks/builtins/confidence-gate-hook.ts +70 -0
- package/harness/lib/hooks/builtins/delegation-depth-hook.ts +59 -0
- package/harness/lib/hooks/builtins/error-recovery-hook.ts +107 -0
- package/harness/lib/hooks/builtins/memory-sync-hook.ts +73 -0
- package/harness/lib/hooks/builtins/plan-check-hook.ts +43 -0
- package/harness/lib/hooks/builtins/route-tracking-hook.ts +147 -0
- package/harness/lib/hooks/builtins/sanity-check-hook.ts +52 -0
- package/harness/lib/hooks/builtins/shell-detect-hook.ts +96 -0
- package/harness/lib/hooks/hooks.test.ts +1016 -0
- package/harness/lib/hooks/index.ts +30 -0
- package/harness/lib/hooks/registry.ts +416 -0
- package/harness/lib/hooks/types.ts +71 -0
- package/harness/lib/memory/index.ts +18 -0
- package/harness/lib/memory/interfaces.ts +53 -0
- package/harness/lib/memory/memory-manager.ts +205 -0
- package/harness/lib/memory/memory.test.ts +491 -0
- package/harness/lib/memory/plan-store.ts +366 -0
- package/harness/lib/recovery/handler.ts +243 -0
- package/harness/lib/recovery/index.ts +14 -0
- package/harness/lib/recovery/interfaces.ts +48 -0
- package/harness/lib/recovery/patterns.ts +149 -0
- package/harness/lib/recovery/recovery.test.ts +312 -0
- package/harness/lib/sanity/anomaly-tracker.ts +127 -0
- package/harness/lib/sanity/checker.ts +178 -0
- package/harness/lib/sanity/index.ts +13 -0
- package/harness/lib/sanity/interfaces.ts +24 -0
- package/harness/lib/sanity/sanity.test.ts +472 -0
- package/harness/lib/sync/file-watcher.ts +174 -0
- package/harness/lib/sync/index.ts +11 -0
- package/harness/lib/sync/interfaces.ts +27 -0
- package/harness/lib/sync/plan-sync.ts +536 -0
- package/harness/lib/sync/sync.test.ts +832 -0
- package/harness/skills/oh-ascii/DEEP.md +292 -0
- package/harness/skills/oh-ascii/SKILL.md +31 -0
- package/harness/skills/oh-ascii/scripts/check_ascii_alignment.py +596 -0
- package/harness/skills/oh-browser/DEEP.md +54 -0
- package/harness/skills/oh-browser/SKILL.md +30 -0
- package/harness/skills/oh-builder/DEEP.md +63 -0
- package/harness/skills/oh-builder/SKILL.md +12 -90
- package/harness/skills/oh-expert/DEEP.md +85 -0
- package/harness/skills/oh-expert/SKILL.md +13 -106
- package/harness/skills/oh-facade/DEEP.md +182 -0
- package/harness/skills/oh-facade/SKILL.md +15 -279
- package/harness/skills/oh-freeze/DEEP.md +18 -0
- package/harness/skills/oh-freeze/SKILL.md +10 -19
- package/harness/skills/oh-full-output/DEEP.md +25 -0
- package/harness/skills/oh-full-output/SKILL.md +12 -65
- package/harness/skills/oh-fusion/DEEP.md +120 -0
- package/harness/skills/oh-fusion/SKILL.md +17 -295
- package/harness/skills/oh-gauntlet/DEEP.md +77 -0
- package/harness/skills/oh-gauntlet/SKILL.md +13 -105
- package/harness/skills/oh-grill/DEEP.md +51 -0
- package/harness/skills/oh-grill/SKILL.md +12 -63
- package/harness/skills/oh-guard/DEEP.md +19 -0
- package/harness/skills/oh-guard/SKILL.md +10 -24
- package/harness/skills/oh-handoff/DEEP.md +48 -0
- package/harness/skills/oh-handoff/SKILL.md +13 -23
- package/harness/skills/oh-health/DEEP.md +74 -0
- package/harness/skills/oh-health/SKILL.md +13 -76
- package/harness/skills/oh-init/DEEP.md +85 -0
- package/harness/skills/oh-init/SKILL.md +13 -127
- package/harness/skills/oh-investigate/DEEP.md +171 -0
- package/harness/skills/oh-investigate/SKILL.md +13 -66
- package/harness/skills/oh-issue/DEEP.md +21 -0
- package/harness/skills/oh-issue/SKILL.md +11 -27
- package/harness/skills/oh-manifest/DEEP.md +92 -0
- package/harness/skills/oh-manifest/SKILL.md +12 -109
- package/harness/skills/oh-plan-review/DEEP.md +90 -0
- package/harness/skills/oh-plan-review/SKILL.md +13 -115
- package/harness/skills/oh-planner/DEEP.md +172 -0
- package/harness/skills/oh-planner/SKILL.md +12 -149
- package/harness/skills/oh-prd/DEEP.md +45 -0
- package/harness/skills/oh-prd/SKILL.md +10 -26
- package/harness/skills/oh-refactor/DEEP.md +122 -0
- package/harness/skills/oh-refactor/SKILL.md +17 -410
- package/harness/skills/oh-retro/DEEP.md +26 -0
- package/harness/skills/oh-retro/SKILL.md +12 -24
- package/harness/skills/oh-review/DEEP.md +87 -0
- package/harness/skills/oh-review/SKILL.md +11 -97
- package/harness/skills/oh-security/DEEP.md +83 -0
- package/harness/skills/oh-security/SKILL.md +14 -96
- package/harness/skills/oh-ship/DEEP.md +141 -0
- package/harness/skills/oh-ship/SKILL.md +14 -32
- package/harness/skills/oh-skill-craft/DEEP.md +369 -0
- package/harness/skills/oh-skill-craft/SKILL.md +13 -177
- package/harness/skills/oh-skills-link/DEEP.md +16 -0
- package/harness/skills/oh-skills-link/SKILL.md +10 -20
- package/harness/skills/oh-skills-list/DEEP.md +20 -0
- package/harness/skills/oh-skills-list/SKILL.md +9 -22
- package/harness/skills/oh-triage/DEEP.md +23 -0
- package/harness/skills/oh-triage/SKILL.md +8 -24
- package/harness/skills/oh-worktree/DEEP.md +169 -0
- package/harness/skills/oh-worktree/SKILL.md +32 -0
- package/lib/harness-resolver.ts +8 -10
- package/package.json +7 -5
- package/tsconfig.json +1 -1
- package/harness/codex/CONSTITUTION.md +0 -73
- package/harness/codex/ROUTING.md +0 -92
- package/harness/commands/oh-doctor.md +0 -26
- package/harness/commands/oh-log.md +0 -18
- package/harness/instructions/RUNTIME.md +0 -30
- package/harness/skills/oh-caveman/SKILL.md +0 -42
- package/harness/skills/oh-learn/SKILL.md +0 -101
- package/lib/logger.ts +0 -75
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oh-skills-list
|
|
3
|
-
description: "
|
|
3
|
+
description: "Use when the user wants to see available OH skills. Lists all oh-* skills with descriptions."
|
|
4
4
|
tier: 2
|
|
5
|
-
triggers:
|
|
6
|
-
- "list skills"
|
|
7
|
-
- "show skills"
|
|
8
|
-
- "what skills"
|
|
9
5
|
route:
|
|
10
6
|
pass: done
|
|
11
7
|
fail: surface
|
|
@@ -14,27 +10,18 @@ route:
|
|
|
14
10
|
|
|
15
11
|
# oh-skills-list
|
|
16
12
|
|
|
17
|
-
|
|
18
|
-
To discover what skills are available. Lists every skill with its name, description, and category.
|
|
13
|
+
List all available oh-* skills with tier and description.
|
|
19
14
|
|
|
20
|
-
##
|
|
21
|
-
Markdown table of skills:
|
|
15
|
+
## Steps
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
| oh-qa | Full QA workflow | Quality |
|
|
27
|
-
| ... | ... | ... |
|
|
28
|
-
|
|
29
|
-
## Anti-patterns
|
|
30
|
-
- Listing "all available" but missing recently installed skills
|
|
31
|
-
- Showing skill file paths instead of human-readable descriptions
|
|
32
|
-
- Not categorising skills (flat list is hard to scan)
|
|
17
|
+
1. Gather all oh-* skills from the harness
|
|
18
|
+
2. Format as a table: Skill | Tier | Purpose
|
|
19
|
+
3. Output the table to the user
|
|
33
20
|
|
|
34
21
|
## Routing
|
|
35
22
|
|
|
36
23
|
| Outcome | Route |
|
|
37
24
|
|---------|-------|
|
|
38
|
-
| pass | β
|
|
39
|
-
| fail | β
|
|
40
|
-
| blocker | β surface
|
|
25
|
+
| pass | β done |
|
|
26
|
+
| fail | β surface |
|
|
27
|
+
| blocker | β surface |
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# oh-triage β Deep Reference
|
|
2
|
+
|
|
3
|
+
## When to Use
|
|
4
|
+
|
|
5
|
+
New issues or backlog review. Drives through triage state machine.
|
|
6
|
+
|
|
7
|
+
## States
|
|
8
|
+
|
|
9
|
+
1. Needs triage (new, unclassified)
|
|
10
|
+
2. Needs info (waiting on reporter)
|
|
11
|
+
3. Ready for agent (well-specified)
|
|
12
|
+
4. Ready for human (needs judgment/access)
|
|
13
|
+
5. Wontfix (declined with reason)
|
|
14
|
+
|
|
15
|
+
## Anti-patterns
|
|
16
|
+
|
|
17
|
+
- Issues stuck in "needs triage"
|
|
18
|
+
- Triaging without reading full issue
|
|
19
|
+
- Wontfix without explanation
|
|
20
|
+
|
|
21
|
+
## Reference
|
|
22
|
+
|
|
23
|
+
**Example:** New issues appear with needs-triage label. Read issue, classify as bug/feature/enhancement, assess severity, assign state (ready-for-agent / ready-for-human / needs-info).
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oh-triage
|
|
3
|
-
description: "
|
|
3
|
+
description: "Use when new issues need triage β classify, prioritise, and assign through the triage state machine."
|
|
4
4
|
tier: 2
|
|
5
|
-
triggers:
|
|
6
|
-
- "triage this issue"
|
|
7
|
-
- "classify this issue"
|
|
8
|
-
- "triage the backlog"
|
|
9
5
|
route:
|
|
10
6
|
pass:
|
|
11
7
|
- oh-issue
|
|
@@ -16,32 +12,20 @@ route:
|
|
|
16
12
|
|
|
17
13
|
# oh-triage
|
|
18
14
|
|
|
19
|
-
|
|
20
|
-
When new issues come in, or when reviewing the issue backlog. Drives issues through a triage state machine.
|
|
15
|
+
Classify, prioritise, and assign new issues through the triage state machine.
|
|
21
16
|
|
|
22
|
-
##
|
|
23
|
-
1. **Needs triage** β new issue, unclassified
|
|
24
|
-
2. **Needs info** β waiting on reporter for clarification
|
|
25
|
-
3. **Ready for agent** β well-specified, can be picked up
|
|
26
|
-
4. **Ready for human** β needs human judgment or access
|
|
27
|
-
5. **Wontfix** β declined with reason
|
|
17
|
+
## Steps
|
|
28
18
|
|
|
29
|
-
|
|
30
|
-
1. Read new issues (label: `needs-triage`)
|
|
19
|
+
1. Read issues with `needs-triage` label
|
|
31
20
|
2. Classify: bug / feature / enhancement / question
|
|
32
21
|
3. Assess severity and priority
|
|
33
|
-
4. Assign
|
|
22
|
+
4. Assign state and owner
|
|
34
23
|
5. Add triage metadata labels
|
|
35
24
|
|
|
36
|
-
## Anti-patterns
|
|
37
|
-
- Leaving issues in "needs triage" indefinitely
|
|
38
|
-
- Triaging without reading the full issue
|
|
39
|
-
- Wontfix without explanation (leaves reporter unhappy)
|
|
40
|
-
|
|
41
25
|
## Routing
|
|
42
26
|
|
|
43
27
|
| Outcome | Route |
|
|
44
28
|
|---------|-------|
|
|
45
|
-
| pass | β oh-issue
|
|
46
|
-
| fail | β oh-expert
|
|
47
|
-
| blocker | β surface
|
|
29
|
+
| pass | β oh-issue or oh-handoff |
|
|
30
|
+
| fail | β oh-expert |
|
|
31
|
+
| blocker | β surface |
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# oh-worktree β Deep Reference
|
|
2
|
+
|
|
3
|
+
## When to Use
|
|
4
|
+
|
|
5
|
+
Starting feature work that needs isolation from the current workspace. Ensures work happens in an isolated workspace. Prefers native worktree tools. Falls back to manual git worktrees only when no native tool is available.
|
|
6
|
+
|
|
7
|
+
**Core principle:** Detect existing isolation first. Use native tools. Fall back to git. Never fight the harness.
|
|
8
|
+
|
|
9
|
+
**Example:** User says "set up worktree for feature-x." Run detection β create worktree β install deps β verify baseline tests pass. Report ready.
|
|
10
|
+
|
|
11
|
+
## Phases
|
|
12
|
+
|
|
13
|
+
### Step 0: Detect Existing Isolation
|
|
14
|
+
|
|
15
|
+
**Before creating anything, check if you are already in an isolated workspace.**
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null && cd "$(git rev-parse --git-dir)" && pwd -P)
|
|
19
|
+
GIT_COMMON=$(git rev-parse --git-common-dir 2>/dev/null && cd "$(git rev-parse --git-common-dir)" && pwd -P)
|
|
20
|
+
BRANCH=$(git branch --show-current)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Submodule guard:** `GIT_DIR != GIT_COMMON` is also true inside git submodules. Before concluding "already in a worktree," verify you are not in a submodule:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
git rev-parse --show-superproject-working-tree 2>/dev/null
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
If this returns a path, you're in a submodule β treat as normal repo.
|
|
30
|
+
|
|
31
|
+
**If `GIT_DIR != GIT_COMMON` (and not a submodule):** Already in a linked worktree. Skip to Step 3. Do NOT create another worktree.
|
|
32
|
+
|
|
33
|
+
- On a branch: "Already in isolated workspace at `<path>` on branch `<name>`."
|
|
34
|
+
- Detached HEAD: "Already in isolated workspace at `<path>` (detached HEAD, externally managed). Branch creation needed at finish time."
|
|
35
|
+
|
|
36
|
+
**If `GIT_DIR == GIT_COMMON` (or in a submodule):** Normal repo checkout. Ask for consent before creating a worktree:
|
|
37
|
+
|
|
38
|
+
> "Would you like me to set up an isolated worktree? It protects your current branch from changes."
|
|
39
|
+
|
|
40
|
+
Honor any declared preference without asking. If declined, work in place and skip to Step 3.
|
|
41
|
+
|
|
42
|
+
### Step 1: Create Isolated Workspace
|
|
43
|
+
|
|
44
|
+
Two mechanisms. Try in order.
|
|
45
|
+
|
|
46
|
+
#### 1a. Native Worktree Tools (preferred)
|
|
47
|
+
|
|
48
|
+
If a native worktree tool exists (e.g., `EnterWorktree`, `WorktreeCreate`, a `/worktree` command, or a `--worktree` flag), use it and skip to Step 3. Native tools handle directory placement, branch creation, and cleanup automatically. Using `git worktree add` when a native tool exists creates phantom state the harness cannot see or manage.
|
|
49
|
+
|
|
50
|
+
Only proceed to Step 1b if no native tool is available.
|
|
51
|
+
|
|
52
|
+
#### 1b. Git Worktree Fallback
|
|
53
|
+
|
|
54
|
+
Only if Step 1a does not apply.
|
|
55
|
+
|
|
56
|
+
##### Directory Selection
|
|
57
|
+
|
|
58
|
+
Follow this priority. Explicit user preference always beats observed state.
|
|
59
|
+
|
|
60
|
+
1. Check instructions for a declared worktree directory preference. If specified, use it without asking.
|
|
61
|
+
2. Check for an existing project-local worktree directory:
|
|
62
|
+
```bash
|
|
63
|
+
ls -d .worktrees 2>/dev/null # Preferred (hidden)
|
|
64
|
+
ls -d worktrees 2>/dev/null # Alternative
|
|
65
|
+
```
|
|
66
|
+
If found, use it. If both exist, `.worktrees` wins.
|
|
67
|
+
3. Check for an existing global directory:
|
|
68
|
+
```bash
|
|
69
|
+
project=$(basename "$(git rev-parse --show-toplevel)")
|
|
70
|
+
ls -d ~/.config/opencode/worktrees/$project 2>/dev/null
|
|
71
|
+
```
|
|
72
|
+
If found, use it (backward compatibility).
|
|
73
|
+
4. If no other guidance, default to `.worktrees/` at the project root.
|
|
74
|
+
|
|
75
|
+
##### Safety Verification (project-local directories only)
|
|
76
|
+
|
|
77
|
+
**Must verify directory is ignored before creating worktree:**
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
git check-ignore -q .worktrees 2>/dev/null || git check-ignore -q worktrees 2>/dev/null
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
If NOT ignored, add to `.gitignore` and commit the change before proceeding.
|
|
84
|
+
|
|
85
|
+
Why critical: Prevents accidentally committing worktree contents to the repository. Global directories (`~/.config/opencode/worktrees/`) need no verification.
|
|
86
|
+
|
|
87
|
+
##### Create the Worktree
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
project=$(basename "$(git rev-parse --show-toplevel)")
|
|
91
|
+
# project-local: path="$LOCATION/$BRANCH_NAME"
|
|
92
|
+
# global: path="~/.config/opencode/worktrees/$project/$BRANCH_NAME"
|
|
93
|
+
git worktree add "$path" -b "$BRANCH_NAME"
|
|
94
|
+
cd "$path"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Sandbox fallback:** If `git worktree add` fails with a permission error (sandbox denial), report the sandbox blocked worktree creation and work in the current directory instead. Then run setup and baseline tests in place.
|
|
98
|
+
|
|
99
|
+
### Step 3: Project Setup
|
|
100
|
+
|
|
101
|
+
Auto-detect and run appropriate setup:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
if [ -f package.json ]; then npm install; fi
|
|
105
|
+
if [ -f Cargo.toml ]; then cargo build; fi
|
|
106
|
+
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
|
107
|
+
if [ -f pyproject.toml ]; then poetry install; fi
|
|
108
|
+
if [ -f go.mod ]; then go mod download; fi
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Step 4: Verify Clean Baseline
|
|
112
|
+
|
|
113
|
+
Run tests to ensure workspace starts clean using the project-appropriate command (`npm test` / `cargo test` / `pytest` / `go test ./...`).
|
|
114
|
+
|
|
115
|
+
- Tests pass: Report ready.
|
|
116
|
+
- Tests fail: Report failures, ask whether to proceed or investigate.
|
|
117
|
+
|
|
118
|
+
#### Report
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
Worktree ready at <full-path>
|
|
122
|
+
Tests passing (<N> tests, 0 failures)
|
|
123
|
+
Ready to implement <feature-name>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Quick Reference
|
|
127
|
+
|
|
128
|
+
| Situation | Action |
|
|
129
|
+
|-----------|--------|
|
|
130
|
+
| Already in linked worktree | Skip creation (Step 0) |
|
|
131
|
+
| In a submodule | Treat as normal repo (Step 0 guard) |
|
|
132
|
+
| Native worktree tool available | Use it (Step 1a) |
|
|
133
|
+
| No native tool | Git worktree fallback (Step 1b) |
|
|
134
|
+
| `.worktrees/` exists | Use it (verify ignored) |
|
|
135
|
+
| `worktrees/` exists | Use it (verify ignored) |
|
|
136
|
+
| Both exist | Use `.worktrees/` |
|
|
137
|
+
| Neither exists | Check instruction file, then default `.worktrees/` |
|
|
138
|
+
| Global path exists | Use it (backward compat) |
|
|
139
|
+
| Directory not ignored | Add to .gitignore + commit |
|
|
140
|
+
| Permission error on create | Sandbox fallback, work in place |
|
|
141
|
+
| Tests fail during baseline | Report failures + ask |
|
|
142
|
+
| No package.json/Cargo.toml | Skip dependency install |
|
|
143
|
+
|
|
144
|
+
## Anti-patterns
|
|
145
|
+
|
|
146
|
+
- **Fighting the harness:** Using `git worktree add` when the platform already provides isolation. Fix: Step 0 detects existing isolation; Step 1a defers to native tools.
|
|
147
|
+
- **Skipping detection:** Creating a nested worktree inside an existing one. Fix: Always run Step 0 before creating anything.
|
|
148
|
+
- **Skipping ignore verification:** Worktree contents get tracked, pollute git status. Fix: Always use `git check-ignore` before creating a project-local worktree.
|
|
149
|
+
- **Assuming directory location:** Creates inconsistency, violates project conventions. Fix: Follow priority: existing > global legacy > instruction file > default.
|
|
150
|
+
- **Proceeding with failing tests:** Cannot distinguish new bugs from pre-existing issues. Fix: Report failures, get explicit permission to proceed.
|
|
151
|
+
- **Jumping to git fallback:** Skipping Step 1a and going straight to `git worktree add` when a native tool exists. This is the most common mistake.
|
|
152
|
+
|
|
153
|
+
## Red Flags
|
|
154
|
+
|
|
155
|
+
**Never:**
|
|
156
|
+
- Create a worktree when Step 0 detects existing isolation
|
|
157
|
+
- Use `git worktree add` when a native worktree tool is available
|
|
158
|
+
- Skip Step 1a by jumping straight to Step 1b's git commands
|
|
159
|
+
- Create a worktree without verifying it is ignored (project-local)
|
|
160
|
+
- Skip baseline test verification
|
|
161
|
+
- Proceed with failing tests without asking
|
|
162
|
+
|
|
163
|
+
**Always:**
|
|
164
|
+
- Run Step 0 detection first
|
|
165
|
+
- Prefer native tools over git fallback
|
|
166
|
+
- Follow directory priority: existing > global legacy > instruction file > default
|
|
167
|
+
- Verify directory is ignored for project-local paths
|
|
168
|
+
- Auto-detect and run project setup
|
|
169
|
+
- Verify clean test baseline
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oh-worktree
|
|
3
|
+
description: "Use when starting feature work that needs isolation from the current workspace or before executing implementation plans. Manages workspace isolation via git worktrees."
|
|
4
|
+
tier: 3
|
|
5
|
+
route:
|
|
6
|
+
pass: oh-manifest
|
|
7
|
+
fail: surface
|
|
8
|
+
blocker: surface
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# oh-worktree
|
|
12
|
+
|
|
13
|
+
Create isolated workspaces via git worktrees for safe feature development.
|
|
14
|
+
|
|
15
|
+
## Steps
|
|
16
|
+
|
|
17
|
+
1. Detect existing isolation β check if already in a linked worktree
|
|
18
|
+
2. Check submodule status to avoid false worktree detection
|
|
19
|
+
3. Ask for user consent if not already isolated
|
|
20
|
+
4. Prefer native worktree tools over git fallback
|
|
21
|
+
5. Select worktree directory following priority: existing > global legacy > instruction file > default
|
|
22
|
+
6. Verify directory is git-ignored for project-local paths
|
|
23
|
+
7. Auto-detect and run project setup (npm install, cargo build, etc.)
|
|
24
|
+
8. Verify clean test baseline and report ready
|
|
25
|
+
|
|
26
|
+
## Routing
|
|
27
|
+
|
|
28
|
+
| Outcome | Route |
|
|
29
|
+
|---------|-------|
|
|
30
|
+
| pass | β oh-manifest |
|
|
31
|
+
| fail | β surface |
|
|
32
|
+
| blocker | β surface |
|
package/lib/harness-resolver.ts
CHANGED
|
@@ -9,12 +9,12 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
|
9
9
|
const PKG_DIR = path.resolve(__dirname, "..")
|
|
10
10
|
|
|
11
11
|
const REQUIRED_HARNESS_FILES: ReadonlyArray<readonly string[]> = [
|
|
12
|
-
["codex", "
|
|
13
|
-
["
|
|
12
|
+
["codex", "CHARTER.md"],
|
|
13
|
+
["codex", "AUTOPILOT.md"],
|
|
14
14
|
["skills", "oh-planner", "SKILL.md"],
|
|
15
15
|
]
|
|
16
16
|
|
|
17
|
-
function ancestorDirs(start: string, limit =
|
|
17
|
+
function ancestorDirs(start: string, limit = 3): string[] {
|
|
18
18
|
const dirs: string[] = []
|
|
19
19
|
let current = path.resolve(start)
|
|
20
20
|
for (let i = 0; i < limit; i++) {
|
|
@@ -26,17 +26,15 @@ function ancestorDirs(start: string, limit = 6): string[] {
|
|
|
26
26
|
return dirs
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
function buildHarnessCandidates(currentDir: string,
|
|
30
|
-
const roots = [
|
|
31
|
-
const seen = new Set(
|
|
29
|
+
function buildHarnessCandidates(currentDir: string, cwd: string): string[] {
|
|
30
|
+
const roots: string[] = []
|
|
31
|
+
const seen = new Set<string>()
|
|
32
32
|
|
|
33
|
-
const
|
|
34
|
-
for (const anchor of anchors) {
|
|
33
|
+
for (const anchor of [currentDir, cwd]) {
|
|
35
34
|
for (const dir of ancestorDirs(anchor)) {
|
|
36
35
|
for (const root of [
|
|
37
36
|
path.join(dir, "harness"),
|
|
38
37
|
path.join(dir, "node_modules", "openhermes", "harness"),
|
|
39
|
-
path.join(dir, "bin", "node_modules", "openhermes", "harness"),
|
|
40
38
|
]) {
|
|
41
39
|
const normalized = path.normalize(root)
|
|
42
40
|
if (seen.has(normalized)) continue
|
|
@@ -64,7 +62,7 @@ export function resolveHarnessRoot({
|
|
|
64
62
|
cwd?: string
|
|
65
63
|
candidateRoots?: string[]
|
|
66
64
|
} = {}): string {
|
|
67
|
-
const roots = candidateRoots ?? buildHarnessCandidates(currentDir,
|
|
65
|
+
const roots = candidateRoots ?? buildHarnessCandidates(currentDir, cwd)
|
|
68
66
|
for (const root of roots) {
|
|
69
67
|
if (hasRequiredHarnessFiles(root)) return root
|
|
70
68
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openhermes",
|
|
3
|
-
"version": "4.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "4.11.2",
|
|
4
|
+
"description": "Autonomous agent orchestration for OpenCode.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"engines": {
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
},
|
|
10
10
|
"main": "./index.ts",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@opencode-ai/plugin": "1.
|
|
12
|
+
"@opencode-ai/plugin": "1.15.0"
|
|
13
13
|
},
|
|
14
14
|
"exports": {
|
|
15
15
|
".": "./index.ts",
|
|
@@ -22,14 +22,16 @@
|
|
|
22
22
|
"ETHOS.md",
|
|
23
23
|
"CONTEXT.md",
|
|
24
24
|
"lib/",
|
|
25
|
+
"scripts/",
|
|
25
26
|
"harness/codex/",
|
|
26
27
|
"harness/instructions/",
|
|
27
28
|
"harness/skills/",
|
|
28
29
|
"harness/commands/",
|
|
29
|
-
"harness/agents/"
|
|
30
|
+
"harness/agents/",
|
|
31
|
+
"harness/lib/"
|
|
30
32
|
],
|
|
31
33
|
"scripts": {
|
|
32
|
-
"test": "bun test
|
|
34
|
+
"test": "bun test"
|
|
33
35
|
},
|
|
34
36
|
"keywords": [
|
|
35
37
|
"opencode",
|
package/tsconfig.json
CHANGED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# OpenHermes Constitution
|
|
2
|
-
|
|
3
|
-
Non-negotiable behavioral core. Immutable without explicit user approval + full architecture handoff.
|
|
4
|
-
|
|
5
|
-
## Operating Doctrine
|
|
6
|
-
|
|
7
|
-
### 1. OpenCode-native first
|
|
8
|
-
Use OpenCode's native skills, commands, agents, and rules loading. Do not copy content into global config when the package can register it directly.
|
|
9
|
-
|
|
10
|
-
### 2. Pragmatic over performative
|
|
11
|
-
Working code beats elegant theory. Fix the bug, not the vibe.
|
|
12
|
-
|
|
13
|
-
### 3. Concise over verbose
|
|
14
|
-
Every token costs context. Prefer short, direct output.
|
|
15
|
-
|
|
16
|
-
### 4. Task-focused over exploratory
|
|
17
|
-
Stay on mission. No drift. No unsolicited education.
|
|
18
|
-
|
|
19
|
-
### 5. Always delegate β never execute
|
|
20
|
-
OpenHermes talks/reports to the USER only and always delegates to sub-agents. OpenHermes NEVER executes tasks directly β no code, no tests, no edits.
|
|
21
|
-
|
|
22
|
-
### 6. Skills on demand
|
|
23
|
-
Do not preload all skills. Invoke the specific skill when it is relevant.
|
|
24
|
-
|
|
25
|
-
### 7. Verify before claim
|
|
26
|
-
Read files, run commands, and confirm output before saying something is done.
|
|
27
|
-
|
|
28
|
-
### 8. Rules over hidden state
|
|
29
|
-
Prefer AGENTS.md, instructions, and explicit manifests over implicit or durable state.
|
|
30
|
-
|
|
31
|
-
### 9. Memory deferred
|
|
32
|
-
Memory is intentionally absent for this pass.
|
|
33
|
-
|
|
34
|
-
### 10. Closed-loop autonomy
|
|
35
|
-
Auto-classify every task. Auto-route after every skill. Only stop for blockers and major decisions. Do not ask permission to proceed when the next step is clear. The autopilot engine (`harness/codex/AUTOPILOT.md`) is the operating manual β follow it.
|
|
36
|
-
|
|
37
|
-
### 11. Push back when needed
|
|
38
|
-
If the request is wrong, risky, or underspecified, say so directly. But route before asking β classify the task, fire the matching skill, and let the skill's routing handle ambiguity.
|
|
39
|
-
|
|
40
|
-
### 12. Recover by narrowing
|
|
41
|
-
When blocked, reduce scope, add constraints, and retry with evidence. Do not ask the user to solve the block for you β diagnose and propose options.
|
|
42
|
-
|
|
43
|
-
### 13. Receipts over vibes
|
|
44
|
-
Claims need evidence: file reads, command output, or test output.
|
|
45
|
-
|
|
46
|
-
## Safety
|
|
47
|
-
User config, plugins, MCP, permissions, TUI, local skills, overlays β locked unless the task explicitly targets them.
|
|
48
|
-
|
|
49
|
-
## Escalation
|
|
50
|
-
T0: auto-classify β auto-route β execute (do not ask)
|
|
51
|
-
T1: check result β route next by outcome (do not ask)
|
|
52
|
-
T2: if blocked β diagnose β retry with narrower scope (do not ask)
|
|
53
|
-
T3: if still blocked β surface with findings, options, and what is needed
|
|
54
|
-
|
|
55
|
-
## Self-Diagnosis
|
|
56
|
-
|
|
57
|
-
Before every substantive response, ask:
|
|
58
|
-
|
|
59
|
-
1. **Is this sycophancy?** β Would I say this without the user's steer? If tone/framing shaped the answer, it is sycophancy. Re-ask neutrally.
|
|
60
|
-
|
|
61
|
-
2. **Factuality or faithfulness?** β If I am inventing things not in the loaded docs, I need to read more contextual knowledge. If I am drifting from what IS in context, my attention is degrading β compact or clear.
|
|
62
|
-
|
|
63
|
-
3. **Am I in the smart zone?** β If the session is heavy and I am getting sloppy, I am past the smart zone. Stop pushing through. Compact and reload.
|
|
64
|
-
|
|
65
|
-
4. **Am I repeating user mistakes?** β Mimicry is a sycophancy signal. Pause and evaluate independently.
|
|
66
|
-
|
|
67
|
-
5. **Is this a knowledge-cutoff trap?** β If the user mentions versions, APIs, or libraries that may have shipped after my training data, load current docs before writing code.
|
|
68
|
-
|
|
69
|
-
## Tone Check
|
|
70
|
-
1. Am I terse?
|
|
71
|
-
2. Am I delegating?
|
|
72
|
-
3. Am I verifying?
|
|
73
|
-
4. Does my approach match the problem's depth?
|
package/harness/codex/ROUTING.md
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# OpenHermes Routing Graph
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
Routing is **dynamic** β each skill carries its own routing metadata in its `SKILL.md` frontmatter (`route.pass`, `route.fail`, `route.blocker`). The autopilot reads the current skill's frontmatter at runtime to determine the next hop. This allows user skills to participate in routing automatically.
|
|
6
|
-
|
|
7
|
-
This document serves as a human-readable reference for the overall flow. For routing decisions, always read the skill's frontmatter β it is the authoritative source.
|
|
8
|
-
|
|
9
|
-
## Route value types
|
|
10
|
-
|
|
11
|
-
| Value | Meaning |
|
|
12
|
-
|-------|---------|
|
|
13
|
-
| `oh-<name>` | Route to skill |
|
|
14
|
-
| `[oh-a, oh-b]` | Route to one of β choose by context |
|
|
15
|
-
| `surface` | Report findings to user, end chain |
|
|
16
|
-
| `done` | Task complete β terminal |
|
|
17
|
-
| `mode` | Mode switch β return to caller after toggle |
|
|
18
|
-
|
|
19
|
-
## Routing graph (simplified)
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
oh-planner ββpassβββ oh-grill ββpassβββ oh-planner (revise) βββ oh-manifest
|
|
23
|
-
failβββ oh-planner (revise)
|
|
24
|
-
|
|
25
|
-
oh-manifest βββ oh-planner β oh-builder β oh-gauntlet β oh-ship β oh-retro β oh-planner
|
|
26
|
-
β_____________________________| |
|
|
27
|
-
| β
|
|
28
|
-
ββββββββββ oh-expert ββββββββββββββββββ fail
|
|
29
|
-
|
|
30
|
-
oh-ship ββpassβββ oh-retro βββ oh-planner (loops forever)
|
|
31
|
-
failβββ oh-expert βββ oh-builder βββ oh-gauntlet
|
|
32
|
-
|
|
33
|
-
oh-facade βββ Concept β Design System β Build β Audit β Iterate (loop until pass)
|
|
34
|
-
passβββ oh-review or back to oh-manifest
|
|
35
|
-
audit failβββ Iterate (fix priority order)
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## oh-facade Pipeline Detail
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
oh-facade:
|
|
42
|
-
Phase 1 Concept β direction brief
|
|
43
|
-
Phase 2 Design Sys β DESIGN.md (color, typography, components, layout, motion, anti-patterns)
|
|
44
|
-
Phase 3 Build β production code (components + pages + all states)
|
|
45
|
-
Phase 4 Audit β 9-layer checklist (Priority 1-4)
|
|
46
|
-
Phase 5 Iterate β fix β re-audit β loop until pass
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Rules
|
|
50
|
-
|
|
51
|
-
1. Every skill routes somewhere β no leaf nodes (except handoff which is intentional terminal)
|
|
52
|
-
2. Route by outcome, not by convention β different results go different places
|
|
53
|
-
3. Default fallback if no match: **surface to user**
|
|
54
|
-
4. Mode skills (caveman, freeze, guard) return to the skill that invoked them after toggling state
|
|
55
|
-
5. The graph must have no dead ends β the only true terminal is `oh-handoff` (session end)
|
|
56
|
-
|
|
57
|
-
## OptiRoute Protocol
|
|
58
|
-
|
|
59
|
-
OptiRoute is a smart auto-routing guard layer. It prevents infinite loops, stops on ambiguity, and auto-generates handoff reports when a task goes nowhere.
|
|
60
|
-
|
|
61
|
-
### Loop Guard
|
|
62
|
-
|
|
63
|
-
Tracks routing depth per chain. Two thresholds:
|
|
64
|
-
|
|
65
|
-
| Threshold | Trigger | Action |
|
|
66
|
-
|-----------|---------|--------|
|
|
67
|
-
| **3x repeat** | Same skill visited 3+ times in one routing chain | STOP, invoke auto-handoff |
|
|
68
|
-
| **5-hop ceiling** | 5+ routing hops without measurable progress toward the original goal | STOP, invoke auto-handoff |
|
|
69
|
-
|
|
70
|
-
*Progress* is defined as: the routing target changed since the last hop, or a new artifact was produced (plan file updated, code written, test result).
|
|
71
|
-
|
|
72
|
-
### Question Gate
|
|
73
|
-
|
|
74
|
-
Before each routing hop, evaluate:
|
|
75
|
-
|
|
76
|
-
- Is the next skill's input fully satisfied? (plan file exists for builder, code exists for gauntlet, etc.)
|
|
77
|
-
- Is there any ambiguity that requires user clarification?
|
|
78
|
-
|
|
79
|
-
If either is no: **do not route. Ask the user a specific question.** Surface what you have, what's missing, and what you need.
|
|
80
|
-
|
|
81
|
-
### Auto-Handoff
|
|
82
|
-
|
|
83
|
-
When Loop Guard triggers:
|
|
84
|
-
|
|
85
|
-
1. **Stop routing immediately.** Do not attempt another hop.
|
|
86
|
-
2. **Write to plan file:** Append an OptiRoute report with:
|
|
87
|
-
- Routing chain: the sequence of skills visited
|
|
88
|
-
- Trigger: which threshold fired (3x repeat / 5-hop ceiling)
|
|
89
|
-
- Current state: what artifacts exist, what's pending
|
|
90
|
-
- Blocker: what prevented progress
|
|
91
|
-
3. **Surface to user** with: `OPTIROUTE STOP: <reason> | Chain: <skills> | See plan file for full report`
|
|
92
|
-
4. Exit the loop. Await user direction.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Diagnose OpenHermes + OpenCode health
|
|
3
|
-
agent: OpenHermes
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
Inspect the current OpenHermes/OpenCode setup and report concrete issues.
|
|
7
|
-
|
|
8
|
-
Check:
|
|
9
|
-
|
|
10
|
-
- plugin load path
|
|
11
|
-
- skills discovery
|
|
12
|
-
- command registration
|
|
13
|
-
- agent registration
|
|
14
|
-
- instruction injection
|
|
15
|
-
- package integrity
|
|
16
|
-
- auth and config safety
|
|
17
|
-
|
|
18
|
-
Return the shortest useful diagnosis with file references and next actions.
|
|
19
|
-
|
|
20
|
-
## Routing
|
|
21
|
-
|
|
22
|
-
| Outcome | Route |
|
|
23
|
-
|---------|-------|
|
|
24
|
-
| pass | β [report findings to user] |
|
|
25
|
-
| fail | β oh-investigate (diagnose issues found) |
|
|
26
|
-
| blocker | β surface to user |
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Read and summarize the OpenHermes session log
|
|
3
|
-
agent: OpenHermes
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
Inspect the OpenHermes session log at `~/.local/share/opencode/log/openhermes.log`.
|
|
7
|
-
|
|
8
|
-
Return a structured summary grouped by session ID.
|
|
9
|
-
|
|
10
|
-
Focus on:
|
|
11
|
-
|
|
12
|
-
- `session.created`
|
|
13
|
-
- `session.compacted`
|
|
14
|
-
- `session.error`
|
|
15
|
-
|
|
16
|
-
For each session, show the timeline in order and highlight any error details.
|
|
17
|
-
|
|
18
|
-
Do not dump the whole log verbatim unless explicitly asked.
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# OpenHermes Runtime
|
|
2
|
-
|
|
3
|
-
Root: package-local harness plus repo AGENTS.md. The autopilot engine (`harness/codex/AUTOPILOT.md`) governs all behavior.
|
|
4
|
-
|
|
5
|
-
## Self-Driving Principles
|
|
6
|
-
|
|
7
|
-
1. **Auto-classify every request.** Before responding, run the task through the AUTOPILOT decision matrix. The outcome determines which skill fires. You do not ask the user which skill to use.
|
|
8
|
-
|
|
9
|
-
2. **Auto-route after every step.** Every skill has a routing table (passβX, failβY, blockerβZ). After a skill completes, check the outcome and route immediately. Do not ask "should I route?"
|
|
10
|
-
|
|
11
|
-
3. **Close the loop.** Every skill routes somewhere. No dead ends. If the last skill in a chain completes and the objective is met, summarize and stop. If more work remains, auto-classify the next unit.
|
|
12
|
-
|
|
13
|
-
4. **Only stop for blockers.** Not for ambiguity. Not for confirmation. Not for "is this OK?" Only stop when: (a) task is complete, (b) unrecoverable error, (c) genuinely ambiguous architecture decision that changes the outcome.
|
|
14
|
-
|
|
15
|
-
## Shared state
|
|
16
|
-
|
|
17
|
-
- `~/.local/share/opencode/openhermes/plans/<project-name>-plan-<nnn>.md` β produced by oh-planner, consumed by oh-builder and oh-manifest. The plan file is self-contained: it includes task tracking (Tasks + Completed sections) and work log (Subagents table + Completed log). No separate todo.md or work-log.md files.
|
|
18
|
-
- `~/.local/share/opencode/openhermes/plans/<project-name>-instincts.jsonl` β behavioral patterns extracted by oh-learn.
|
|
19
|
-
|
|
20
|
-
## Orchestration discipline
|
|
21
|
-
|
|
22
|
-
- **Session pool**: Subagents run in their own sessions with isolated context. Each reports one result back.
|
|
23
|
-
- **Concurrency**: Parallelize independent sub-tasks. Sequentialize dependent ones.
|
|
24
|
-
- **Circuit breaker**: 3 subagent failures on the same task β surface BLOCKER. Do not silently retry.
|
|
25
|
-
- **Pipelined verification**: Every phase self-verifies before declaring success. No assumptions.
|
|
26
|
-
- **Background vs sync**: Independent work fires and forgets. Dependent work awaits.
|
|
27
|
-
|
|
28
|
-
## Conventions
|
|
29
|
-
|
|
30
|
-
Security, coding style, testing standards follow the Constitution. Skills provide specialized workflows.
|