Skip to content

Commit afb4505

Browse files
joeylee12629-starjoey
andauthored
fix: remove all broken .md links, convert valid ones to /guide/ routes (#44)
Co-authored-by: joey <joey@joeydeMacBook-Air.local>
1 parent daf73ff commit afb4505

16 files changed

Lines changed: 4 additions & 52 deletions

guide/comparison.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,7 @@ result = exec("claude-code --print 'Review this PR'")
113113
- **Choosing based on hype** — Pick the harness that fits your workflow, not the one with the most GitHub stars.
114114
- **Ignoring memory** — If your tasks span sessions, a harness without persistent memory means re-explaining context every time.
115115
- **Assuming "open source" means "free"** — The harness is free; the model API calls are not. Budget for API costs.
116-
- **Locking into one harness** — File-based configurations (AGENTS.md, MEMORY.md) are portable. Proprietary memory is not. See [Memory Portability →](memory-portability.md).
117116

118117
## Further Reading
119118

120-
- [Scaling Dimensions →](scaling-dimensions.md) — How these harnesses scale across time, space, and interaction
121-
- [Glossary →](glossary.md) — Key terms used throughout this guide
119+
- [Glossary →](/guide/glossary) — Key terms used throughout this guide

guide/context-engineering.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ def estimate_tokens(text: str) -> int:
3737
"""Fast token estimation using tiktoken."""
3838
return len(encoder.encode(text))
3939

40-
4140
class ContextAssembler:
4241
"""Assemble context with priority-based token budgeting."""
4342

guide/error-handling.md

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,12 @@ Not all errors are equal. The recovery strategy depends on the error class:
2020
```python
2121
from enum import Enum
2222

23-
2423
class ErrorClass(Enum):
2524
TRANSIENT = "transient"
2625
PERMANENT = "permanent"
2726
MODEL = "model"
2827
RESOURCE = "resource"
2928

30-
3129
def classify_error(error: Exception, context: dict | None = None) -> ErrorClass:
3230
"""Classify an error to determine the recovery strategy."""
3331
error_type = type(error).__name__
@@ -73,15 +71,13 @@ from typing import TypeVar, Callable, Any
7371

7472
T = TypeVar("T")
7573

76-
7774
class RetryExhausted(Exception):
7875
"""All retry attempts failed."""
7976
def __init__(self, last_error: Exception, attempts: int):
8077
self.last_error = last_error
8178
self.attempts = attempts
8279
super().__init__(f"Failed after {attempts} attempts: {last_error}")
8380

84-
8581
def retry(
8682
max_attempts: int = 3,
8783
base_delay: float = 1.0,
@@ -111,7 +107,6 @@ def retry(
111107
return wrapper
112108
return decorator
113109

114-
115110
# Usage
116111
@retry(max_attempts=3, base_delay=2.0)
117112
def call_llm(messages: list, tools: list) -> dict:
@@ -192,7 +187,6 @@ class EscalationLevel(Enum):
192187
CONFIRM = "confirm" # Ask human before proceeding
193188
BLOCK = "block" # Stop and wait for human input
194189

195-
196190
def determine_escalation(
197191
error: Exception,
198192
error_class: ErrorClass,
@@ -218,7 +212,6 @@ def determine_escalation(
218212

219213
return EscalationLevel.AUTO
220214

221-
222215
def escalate(level: EscalationLevel, message: str) -> str | None:
223216
"""Execute the escalation action. Returns human response if blocking."""
224217
if level == EscalationLevel.AUTO:
@@ -244,7 +237,6 @@ import json
244237
import os
245238
from datetime import datetime
246239

247-
248240
class Checkpoint:
249241
"""Save and restore agent progress for long-running tasks."""
250242

@@ -280,7 +272,6 @@ class Checkpoint:
280272
if os.path.exists(path):
281273
os.unlink(path)
282274

283-
284275
# Usage in the agentic loop
285276
checkpoint = Checkpoint()
286277

guide/glossary.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,3 @@ A complete recording of an agent session: every message sent, every tool called,
7979

8080
---
8181

82-
*Back to [What is a Harness? →](what-is-harness.md)*

guide/harness-vs-framework.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,4 +240,4 @@ This is fine. The framework taught you what you need. The harness gives you cont
240240
- [LangChain Documentation](https://python.langchain.com/) — The most popular framework
241241
- [CrewAI Documentation](https://docs.crewai.com/) — Multi-agent orchestration
242242
- [AutoGen](https://microsoft.github.io/autogen/) — Microsoft's multi-agent framework
243-
- [Your First Harness](your-first-harness.md) — Build the raw version yourself
243+
- [Your First Harness](/guide/your-first-harness) — Build the raw version yourself

guide/sandbox.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import tempfile
4747
import json
4848
from pathlib import Path
4949

50-
5150
class DockerSandbox:
5251
"""Execute agent commands inside a restricted Docker container."""
5352

@@ -144,7 +143,6 @@ Each microVM boots in ~125ms with a minimal Linux kernel. The hypervisor boundar
144143
import json
145144
import socket
146145

147-
148146
class FirecrackerSandbox:
149147
"""Manage a Firecracker microVM for agent execution."""
150148

guide/skill-system.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ import json
108108
from pathlib import Path
109109
from dataclasses import dataclass, field
110110

111-
112111
@dataclass
113112
class Skill:
114113
name: str
@@ -117,7 +116,6 @@ class Skill:
117116
tools: list[dict] = field(default_factory=list) # Tool schemas
118117
handlers: dict = field(default_factory=dict) # name → callable
119118

120-
121119
class SkillRegistry:
122120
"""Registry with on-demand skill loading."""
123121

guide/sub-agent.md

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,19 @@ import tempfile
5050
from concurrent.futures import ThreadPoolExecutor, as_completed
5151
from dataclasses import dataclass
5252

53-
5453
@dataclass
5554
class SubTask:
5655
name: str
5756
instruction: str
5857
working_dir: str | None = None
5958

60-
6159
@dataclass
6260
class SubResult:
6361
name: str
6462
success: bool
6563
output: str
6664
artifacts: list[str] # Paths to files produced
6765

68-
6966
class SubAgentSpawner:
7067
"""Spawn and manage sub-agents as isolated processes."""
7168

@@ -156,7 +153,6 @@ import json
156153
import time
157154
from pathlib import Path
158155

159-
160156
class FileInbox:
161157
"""File-based message passing between agents."""
162158

@@ -234,7 +230,6 @@ When sub-agents need to modify code simultaneously, git worktrees prevent branch
234230
```python
235231
import subprocess
236232

237-
238233
def create_worktree(repo_path: str, branch_name: str) -> str:
239234
"""Create a git worktree for a sub-agent to work in."""
240235
worktree_path = f"/tmp/worktrees/{branch_name}"
@@ -245,7 +240,6 @@ def create_worktree(repo_path: str, branch_name: str) -> str:
245240
)
246241
return worktree_path
247242

248-
249243
def merge_worktrees(repo_path: str, branches: list[str], target: str = "main"):
250244
"""Merge all sub-agent branches back into the target branch."""
251245
subprocess.run(["git", "checkout", target], cwd=repo_path, check=True)
@@ -260,7 +254,6 @@ def merge_worktrees(repo_path: str, branches: list[str], target: str = "main"):
260254
print(f"Conflict merging {branch}: {result.stderr}")
261255
subprocess.run(["git", "merge", "--abort"], cwd=repo_path)
262256

263-
264257
def cleanup_worktrees(repo_path: str, branches: list[str]):
265258
"""Remove worktrees and branches after merge."""
266259
for branch in branches:

zh-guide/comparison.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,7 @@ result = exec("claude-code --print 'Review this PR'")
113113
- **跟风选择** —— 选适合你工作流的 Harness,不是 GitHub star 最多的。
114114
- **忽视 Memory** —— 如果你的任务跨 Session,没有持久 Memory 的 Harness 意味着每次都要重新解释 Context。
115115
- **认为"开源"等于"免费"** —— Harness 是免费的;模型 API 调用不是。做好 API 成本预算。
116-
- **绑死在一个 Harness 上** —— 基于文件的配置(AGENTS.md、MEMORY.md)是可移植的。闭源 Memory 不是。详见 [Memory 可移植性 →](memory-portability.md)
117116

118117
## 延伸阅读
119118

120-
- [扩展维度 →](scaling-dimensions.md) — 这些 Harness 如何在时间、空间和交互维度上扩展
121-
- [术语表 →](glossary.md) — 本指南使用的核心术语
119+
- [术语表 →](/guide/glossary) — 本指南使用的核心术语

zh-guide/context-engineering.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ def estimate_tokens(text: str) -> int:
3737
"""Fast token estimation using tiktoken."""
3838
return len(encoder.encode(text))
3939

40-
4140
class ContextAssembler:
4241
"""Assemble context with priority-based token budgeting."""
4342

0 commit comments

Comments
 (0)