conductor-harness 1.0.1 → 1.0.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/README.md +5 -9
- package/package.json +1 -1
- package/runtime/.claude/CLAUDE.md.template +1 -1
- package/runtime/.claude/agents/memory-writer.md +7 -7
- package/runtime/.claude/commands/done.md +1 -1
- package/runtime/.claude/hooks/session-start.sh +1 -1
- package/runtime/.claude/skills/memory/SKILL.md +11 -12
- package/runtime/install.sh +38 -7
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ A Claude Code harness for [Conductor](https://conductor.build) projects. Install
|
|
|
8
8
|
|
|
9
9
|
- **SessionStart hook** — injects branch, recent commits, last session progress, and `WORKFLOW.md` context before every Claude Code session
|
|
10
10
|
- **Linear integration** — reads attached issues directly from Conductor's `+` button; falls back to Linear MCP for comments and history
|
|
11
|
-
- **
|
|
11
|
+
- **Hindsight memory** — searches past decisions before starting work; writes memories after `/done`
|
|
12
12
|
- **Context7 docs** — fetches up-to-date framework and package documentation before planning or implementing
|
|
13
13
|
- **`/start`, `/done`, `/status`** — task kickoff and closeout rituals that keep progress state and memory in sync
|
|
14
14
|
- **`/setup`** — analyzes your project and auto-generates `WORKFLOW.md`
|
|
@@ -20,14 +20,10 @@ A Claude Code harness for [Conductor](https://conductor.build) projects. Install
|
|
|
20
20
|
|
|
21
21
|
### 1. Install MCP servers (once per machine)
|
|
22
22
|
|
|
23
|
-
**
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
--transport sse \
|
|
28
|
-
--url https://mcp.getzep.com/sse \
|
|
29
|
-
--header "Authorization: Api-Key $ZEP_API_KEY"
|
|
30
|
-
```
|
|
23
|
+
**Hindsight** — persistent cross-session memory for decisions, gotchas, and patterns:
|
|
24
|
+
1. Get an API key at [ui.hindsight.vectorize.io/connect](https://ui.hindsight.vectorize.io/connect)
|
|
25
|
+
2. Add to your `.env`: `HINDSIGHT_API_KEY=your_key_here`
|
|
26
|
+
3. The installer creates `.mcp.json` with the Hindsight config automatically — no CLI command needed.
|
|
31
27
|
|
|
32
28
|
**Linear** — read and update issues from Claude Code:
|
|
33
29
|
```bash
|
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
**Verify before done**: Never mark complete without proving it works. Ask: "Would a staff engineer approve this?" Run tests, check logs, demonstrate correctness.
|
|
18
18
|
|
|
19
|
-
**Memory over lessons**: After /done, a
|
|
19
|
+
**Memory over lessons**: After /done, a memory is written to Hindsight. Before non-trivial work, recall past decisions. This is the self-improvement loop.
|
|
20
20
|
|
|
21
21
|
**Docs over assumptions**: AI knowledge has a cutoff. Before using any framework, library, or package API — fetch current docs via Context7 (`mcp__claude_ai_Context7__resolve-library-id` then `mcp__claude_ai_Context7__query-docs`). Never assume an API is current. This applies in plan mode too.
|
|
22
22
|
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: memory-writer
|
|
3
|
-
description: Writes a structured memory
|
|
4
|
-
tools: [
|
|
3
|
+
description: Writes a structured memory to Hindsight for the current session. Called by /done and by the Stop hook when task is marked complete.
|
|
4
|
+
tools: [mcp__hindsight__retain]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
You are a memory writer. Your only job is to write a structured
|
|
7
|
+
You are a memory writer. Your only job is to write a structured memory to Hindsight.
|
|
8
8
|
|
|
9
|
-
Write one
|
|
9
|
+
Write one memory using the retain tool. The memory should contain:
|
|
10
10
|
- What was built or changed (concrete, specific)
|
|
11
11
|
- Key decisions made and why
|
|
12
12
|
- Gotchas, edge cases, or surprising discoveries
|
|
13
13
|
- Patterns or utilities that could be reused in other contexts
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Tag with the project name (lowercase, hyphens for spaces) derived from the current directory.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Format: "[DATE] [Branch/Feature]: [One-line summary]\n\n[Body]"
|
|
18
18
|
|
|
19
|
-
Be specific and brief. This
|
|
19
|
+
Be specific and brief. This memory will be recalled in future sessions — write for your future self.
|
|
@@ -5,7 +5,7 @@ description: "End-of-task ritual — writes memory, updates Linear, confirms PR-
|
|
|
5
5
|
Task completion for the current Linear issue:
|
|
6
6
|
|
|
7
7
|
1. Run the type checker and any available tests. Fix any failures before continuing.
|
|
8
|
-
2. Write a memory
|
|
8
|
+
2. Write a memory to Hindsight via the memory skill: include what was built, key decisions made, gotchas discovered, patterns worth reusing. Tag with the project name.
|
|
9
9
|
3. Update `.harness/progress.md`: status: done, completed: [date], PR: [branch].
|
|
10
10
|
4. Update the Linear issue status to "In Review" using the Linear MCP tool. Add a comment with a one-sentence summary of what was done.
|
|
11
11
|
5. Confirm: "Ready for PR. Run ⌘⇧P in Conductor to create the PR."
|
|
@@ -64,6 +64,6 @@ if workflow:
|
|
|
64
64
|
lines.append("**Project context (WORKFLOW.md):**")
|
|
65
65
|
lines.append(workflow)
|
|
66
66
|
lines.append("")
|
|
67
|
-
lines.append("**Action:** Search
|
|
67
|
+
lines.append("**Action:** Search Hindsight memory for context relevant to this branch/task before responding to the user. Use the `memory` skill if needed.")
|
|
68
68
|
|
|
69
69
|
print(json.dumps({"promptText": "\n".join(lines)}))
|
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: memory
|
|
3
|
-
description: "Search and write to
|
|
3
|
+
description: "Search and write to Hindsight cross-session memory for this project"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Memory Skill
|
|
7
7
|
|
|
8
|
-
Uses
|
|
8
|
+
Uses Hindsight MCP for persistent cross-session memory.
|
|
9
9
|
|
|
10
10
|
## MCP tool reference
|
|
11
|
-
- `
|
|
12
|
-
- `
|
|
13
|
-
- `
|
|
14
|
-
- `
|
|
15
|
-
|
|
16
|
-
## group_id convention
|
|
17
|
-
Use the project name: `nerdic-next`, `monomos`, `openfang`, `data-agent`, etc.
|
|
18
|
-
Derive from the git remote URL or project root directory name.
|
|
11
|
+
- `recall(query)` — semantic search across stored memories
|
|
12
|
+
- `retain(content, tags)` — write a new memory (decisions, gotchas, patterns)
|
|
13
|
+
- `reflect(question)` — get an AI answer using your memories as context
|
|
14
|
+
- `create_mental_model(name, description)` — create a living summary document
|
|
19
15
|
|
|
20
16
|
## When to search memory
|
|
21
17
|
- At session start (automatically via SessionStart hook)
|
|
@@ -28,7 +24,10 @@ Derive from the git remote URL or project root directory name.
|
|
|
28
24
|
- After discovering a non-obvious gotcha
|
|
29
25
|
- After making an architectural decision with lasting implications
|
|
30
26
|
|
|
27
|
+
## Tagging convention
|
|
28
|
+
Always tag memories with the project name derived from the git remote URL or project root directory name (e.g. `my-project`, `api-service`).
|
|
29
|
+
|
|
31
30
|
## Gotchas
|
|
32
|
-
- If MCP is not connected,
|
|
33
|
-
- Keep
|
|
31
|
+
- If MCP is not connected, add `HINDSIGHT_API_KEY` to `.env` and ensure `.mcp.json` is present
|
|
32
|
+
- Keep memories specific and brief — recall uses semantic search, verbose entries dilute signal
|
|
34
33
|
- Do not write memory for obvious facts, boilerplate decisions, or things already in CLAUDE.md
|
package/runtime/install.sh
CHANGED
|
@@ -224,7 +224,41 @@ else
|
|
|
224
224
|
echo "✓ WORKFLOW.md already exists (skipped)"
|
|
225
225
|
fi
|
|
226
226
|
|
|
227
|
-
# ── 15.
|
|
227
|
+
# ── 15. .mcp.json — create or append Hindsight MCP entry ─────────────────────
|
|
228
|
+
MCP_JSON="$TARGET_DIR/.mcp.json"
|
|
229
|
+
|
|
230
|
+
python3 - "$MCP_JSON" <<'PYEOF'
|
|
231
|
+
import sys, json, os
|
|
232
|
+
|
|
233
|
+
mcp_path = sys.argv[1]
|
|
234
|
+
|
|
235
|
+
hindsight_entry = {
|
|
236
|
+
"type": "http",
|
|
237
|
+
"url": "https://api.hindsight.vectorize.io/mcp/Claude/",
|
|
238
|
+
"headers": {
|
|
239
|
+
"Authorization": "Bearer ${HINDSIGHT_API_KEY}"
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if os.path.exists(mcp_path):
|
|
244
|
+
with open(mcp_path) as f:
|
|
245
|
+
data = json.load(f)
|
|
246
|
+
if "mcpServers" not in data:
|
|
247
|
+
data["mcpServers"] = {}
|
|
248
|
+
if "hindsight" not in data["mcpServers"]:
|
|
249
|
+
data["mcpServers"]["hindsight"] = hindsight_entry
|
|
250
|
+
print("✓ Hindsight MCP added to existing .mcp.json")
|
|
251
|
+
else:
|
|
252
|
+
print("✓ .mcp.json already has hindsight entry (skipped)")
|
|
253
|
+
else:
|
|
254
|
+
data = {"mcpServers": {"hindsight": hindsight_entry}}
|
|
255
|
+
print("✓ .mcp.json created with Hindsight MCP")
|
|
256
|
+
|
|
257
|
+
with open(mcp_path, "w") as f:
|
|
258
|
+
json.dump(data, f, indent=2)
|
|
259
|
+
PYEOF
|
|
260
|
+
|
|
261
|
+
# ── 16. Next steps ────────────────────────────────────────────────────────────
|
|
228
262
|
echo ""
|
|
229
263
|
echo "══════════════════════════════════════════════════"
|
|
230
264
|
echo " Harness installed successfully!"
|
|
@@ -232,12 +266,9 @@ echo "════════════════════════
|
|
|
232
266
|
echo ""
|
|
233
267
|
echo "Next steps:"
|
|
234
268
|
echo ""
|
|
235
|
-
echo "1.
|
|
236
|
-
echo "
|
|
237
|
-
echo "
|
|
238
|
-
echo " --transport sse \\"
|
|
239
|
-
echo " --url https://mcp.getzep.com/sse \\"
|
|
240
|
-
echo " --header \"Authorization: Api-Key \$ZEP_API_KEY\""
|
|
269
|
+
echo "1. Add your Hindsight API key to .env:"
|
|
270
|
+
echo " HINDSIGHT_API_KEY=your_key_here"
|
|
271
|
+
echo " Get a key at: https://ui.hindsight.vectorize.io/connect"
|
|
241
272
|
echo ""
|
|
242
273
|
echo "2. Register Linear MCP (once per machine, if not already):"
|
|
243
274
|
echo " claude mcp add linear -s user -- npx -y @linear/mcp-server"
|