create-harness-vibe-coding 0.8.8 → 0.8.9
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-CN.md +7 -1
- package/README.md +21 -2
- package/docs/images/harness-icon.png +0 -0
- package/package.json +2 -1
- package/src/generator.js +36 -0
- package/src/index.js +72 -4
- package/templates/common/.claude/agents/architect.md +31 -31
- package/templates/common/.claude/agents/codebase-explorer.md +45 -0
- package/templates/common/.claude/agents/docs-researcher.md +41 -41
- package/templates/common/.claude/agents/memory-master.md +26 -8
- package/templates/common/.claude/agents/reviewer.md +34 -34
- package/templates/common/.claude/agents/task-scribe.md +70 -0
- package/templates/common/.claude/commands/wf-help.md +8 -4
- package/templates/common/.claude/commands/wf-update.md +24 -0
- package/templates/common/.claude/rules/ecc/common.md +15 -2
- package/templates/common/.claude/settings.json +13 -0
- package/templates/common/.claude/skills/subagent-orchestrator/SKILL.md +8 -4
- package/templates/common/.claude/skills/wf/SKILL.md +15 -8
- package/templates/common/.claude/skills/wf-auto/SKILL.md +3 -2
- package/templates/common/.claude/skills/wf-learn/SKILL.md +9 -2
- package/templates/common/.claude/skills/wf-max/SKILL.md +23 -5
- package/templates/common/.claude/skills/wf-update/SKILL.md +15 -2
- package/templates/common/.codex/hooks.json +17 -0
- package/templates/common/.harness-version +89 -44
- package/templates/common/.opencode/agents/architect.md +24 -24
- package/templates/common/.opencode/agents/codebase-explorer.md +45 -0
- package/templates/common/.opencode/agents/docs-researcher.md +34 -34
- package/templates/common/.opencode/agents/memory-master.md +26 -8
- package/templates/common/.opencode/agents/reviewer.md +27 -27
- package/templates/common/.opencode/agents/task-scribe.md +70 -0
- package/templates/common/.opencode/commands/wf-auto-spark.md +15 -0
- package/templates/common/.opencode/commands/wf-auto.md +15 -0
- package/templates/common/.opencode/commands/wf-help.md +8 -4
- package/templates/common/.opencode/commands/wf-learn.md +15 -0
- package/templates/common/.opencode/commands/wf-max.md +15 -0
- package/templates/common/.opencode/commands/wf-readme.md +15 -0
- package/templates/common/.opencode/commands/wf-remove.md +15 -0
- package/templates/common/.opencode/commands/wf-review.md +15 -0
- package/templates/common/.opencode/commands/wf-update.md +24 -0
- package/templates/common/.opencode/commands/wf.md +15 -0
- package/templates/common/.opencode/plugins/harness-wf-status.mjs +135 -0
- package/templates/common/AGENTS.md +2 -29
- package/templates/common/CLAUDE.md +35 -6
- package/templates/common/Harness/ACCEPTANCE_PROTOCOL.md +2 -2
- package/templates/common/{MEMORY.md → Harness/MEMORY.md} +16 -3
- package/templates/common/Harness/MEMORY_PROTOCOL.md +80 -30
- package/templates/common/Harness/README.md +50 -22
- package/templates/common/{SETUP.md → Harness/SETUP.md} +278 -276
- package/templates/common/Harness/TASK_ARCHIVE.md +56 -0
- package/templates/common/Harness/WF-AUTO-SPARK.md +5 -14
- package/templates/common/Harness/WF-AUTO.md +13 -76
- package/templates/common/Harness/WF-KERNEL.md +189 -0
- package/templates/common/Harness/WF-MAX.md +60 -328
- package/templates/common/Harness/WF-STATE.md +83 -0
- package/templates/common/Harness/WF.md +117 -237
- package/templates/common/Harness/agent-workflow.md +2 -2
- package/templates/common/Harness/context-loading.md +3 -3
- package/templates/common/Harness/dispatch.md +43 -35
- package/templates/common/Harness/scripts/archive-tasks.mjs +239 -0
- package/templates/common/{scripts → Harness/scripts}/scan-clean.mjs +28 -1
- package/templates/common/{scripts → Harness/scripts}/validate-harness.mjs +909 -699
- package/templates/common/Harness/scripts/wf-auto-update-prompt.mjs +258 -0
- package/templates/common/{scripts → Harness/scripts}/wf-update-check.mjs +40 -7
- package/templates/common/Harness/subagents.md +28 -27
- package/templates/common/Harness/tasks/_template/PLAN.md +5 -0
- package/templates/common/Harness/tasks/_template/STATE.json +23 -0
- package/templates/common/README.md +1 -1
- package/templates/common/memory/agent-lessons-patterns.md +9 -8
- package/templates/common/memory/routes.md +43 -0
- package/templates/common/memory/startup-hints.md +32 -0
- package/templates/common/memory/tool-usage-reflections.md +9 -8
- package/templates/common/memory/user-corrections-preferences.md +11 -9
- package/templates/optional/catalog.json +8 -0
- package/templates/optional/skills/browser-e2e/.claude/skills/browser-e2e/SKILL.md +42 -42
- package/templates/optional/skills/browser-e2e/.opencode/commands/wf-browser.md +15 -0
- package/templates/optional/skills/github-pr-review/.claude/skills/github-pr-review/SKILL.md +40 -40
- package/templates/optional/skills/python-backend/.claude/skills/python-backend/SKILL.md +40 -40
- package/templates/optional/skills/ts-react-frontend/.claude/skills/ts-react-frontend/SKILL.md +43 -43
- package/templates/optional/skills/ui-ux-review/.claude/skills/ui-ux-review/SKILL.md +40 -40
- /package/templates/common/{scripts → Harness/scripts}/wf-remove.mjs +0 -0
package/README-CN.md
CHANGED
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
<img src="https://img.shields.io/github/stars/zingspark/create-harness-vibe-coding?style=social" alt="GitHub stars">
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
|
+
<p align="center">
|
|
9
|
+
<img src="docs/images/harness-icon.png" alt="Harness 图标" width="112">
|
|
10
|
+
</p>
|
|
11
|
+
|
|
8
12
|
<h1 align="center">create-harness-vibe-coding</h1>
|
|
9
13
|
<p align="center">
|
|
10
14
|
<b>让 AI agent 在真实仓库里先理解,再执行,最后验证。</b><br>
|
|
@@ -39,7 +43,8 @@ Agent 读取本 README 后,按项目状态选择安装路径:
|
|
|
39
43
|
|---|---|
|
|
40
44
|
| 新项目 | `npx create-harness-vibe-coding@latest my-project -y` |
|
|
41
45
|
| 已有项目 | `npx create-harness-vibe-coding@latest my-project . -y --on-conflict skip --json` |
|
|
42
|
-
| 已有 `Harness/` | `node Harness/scripts/wf-update-check.mjs
|
|
46
|
+
| 已有 `Harness/` 且存在 `Harness/scripts/wf-update-check.mjs` | `node Harness/scripts/wf-update-check.mjs --json`,走更新流程,不要重复安装 |
|
|
47
|
+
| 已有 `Harness/` 但缺少 `Harness/scripts/wf-update-check.mjs` | `npx create-harness-vibe-coding@latest my-project . -y --on-conflict skip --json`。然后执行 `node Harness/scripts/wf-update-check.mjs --json` |
|
|
43
48
|
| 安装或更新完成 | `node Harness/scripts/validate-harness.mjs --strict` |
|
|
44
49
|
|
|
45
50
|
安装后的 instruction:先读取 `CLAUDE.md`、`AGENTS.md`、`Harness/SETUP.md` 和 `Harness/README.md`;遵守项目已有边界;先研究和计划,再修改代码;完成后运行测试、校验和审查,未验证不要声称完成。
|
|
@@ -173,6 +178,7 @@ Harness 把一次模糊请求变成一条可以追踪的路径:
|
|
|
173
178
|
| `caveman` | 简洁、低 token 的 agent 行为 | [Caveman](https://github.com/JuliusBrussee/caveman) |
|
|
174
179
|
| `agent-research` | 文献、产品、依赖和生态研究 | [agent-research-skills](https://github.com/lingzhi227/agent-research-skills) |
|
|
175
180
|
| `codegraph` | 代码图谱和仓库地图 | [Codegraph](https://github.com/colbymchenry/codegraph) |
|
|
181
|
+
| `grill-me` | 实现前对计划或设计做高压追问 | [Grill Me](https://github.com/mattpocock/skills/tree/main/skills/productivity/grill-me) |
|
|
176
182
|
|
|
177
183
|
## 验证
|
|
178
184
|
|
package/README.md
CHANGED
|
@@ -5,12 +5,22 @@
|
|
|
5
5
|
<img src="https://img.shields.io/github/stars/zingspark/create-harness-vibe-coding?style=social" alt="GitHub stars">
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
|
+
<p align="center">
|
|
9
|
+
<img src="docs/images/harness-icon.png" alt="Harness icon" width="112">
|
|
10
|
+
</p>
|
|
11
|
+
|
|
8
12
|
<h1 align="center">create-harness-vibe-coding</h1>
|
|
9
13
|
<p align="center">
|
|
10
14
|
<b>An operating contract for reliable AI coding agents.</b><br>
|
|
11
15
|
<sub>Goals. Context. Loops. Evidence.</sub>
|
|
12
16
|
</p>
|
|
13
17
|
|
|
18
|
+
<p align="center">
|
|
19
|
+
<a href="README-CN.md">Chinese</a> ·
|
|
20
|
+
<a href="https://github.com/zingspark/create-harness-vibe-coding">GitHub</a> ·
|
|
21
|
+
<a href="https://www.npmjs.com/package/create-harness-vibe-coding">npm</a>
|
|
22
|
+
</p>
|
|
23
|
+
|
|
14
24
|
`create-harness-vibe-coding` is a Node.js CLI that scaffolds a repo-local harness for AI-assisted software development: research, PRD, architecture, task decomposition, implementation, testing, review, recovery, and durable memory.
|
|
15
25
|
|
|
16
26
|
It is not a prompt pack and it does not generate business code. It gives Claude Code, Codex, and compatible agents a shared operating system for long-running work.
|
|
@@ -44,7 +54,8 @@ After reading this README, the agent selects the path that matches the project:
|
|
|
44
54
|
|---|---|
|
|
45
55
|
| New project | `npx create-harness-vibe-coding@latest my-project -y` |
|
|
46
56
|
| Existing project | `npx create-harness-vibe-coding@latest my-project . -y --on-conflict skip --json` |
|
|
47
|
-
| Existing `Harness/` | `node Harness/scripts/wf-update-check.mjs`; do not reinstall |
|
|
57
|
+
| Existing `Harness/` with `Harness/scripts/wf-update-check.mjs` | `node Harness/scripts/wf-update-check.mjs --json`; update, do not reinstall |
|
|
58
|
+
| Existing `Harness/` but missing `Harness/scripts/wf-update-check.mjs` | `npx create-harness-vibe-coding@latest my-project . -y --on-conflict skip --json`. Then run `node Harness/scripts/wf-update-check.mjs --json` |
|
|
48
59
|
| After install or update | `node Harness/scripts/validate-harness.mjs --strict` |
|
|
49
60
|
|
|
50
61
|
After installation, read `CLAUDE.md`, `AGENTS.md`, `Harness/SETUP.md`, and `Harness/README.md`; preserve project boundaries; research and plan before editing; run tests, validation, and review before claiming completion.
|
|
@@ -141,7 +152,7 @@ Read and follow https://github.com/zingspark/create-harness-vibe-coding exactly
|
|
|
141
152
|
|
|
142
153
|
The agent-first path previews the target before writing and preserves project-owned files. If you need the detailed CLI contract, the agent can read `Harness/SETUP.md` after setup.
|
|
143
154
|
|
|
144
|
-
If `Harness/` already exists, use `/wf-update`, `$wf-update`, or `node Harness/scripts/wf-update-check.mjs` instead of reinstalling blindly.
|
|
155
|
+
If `Harness/` already exists, first check whether `Harness/scripts/wf-update-check.mjs` exists. If it does, use `/wf-update`, `$wf-update`, or `node Harness/scripts/wf-update-check.mjs --json` instead of reinstalling blindly. If it is missing, run the safe CLI recovery command from the installation table first, then run the updater.
|
|
145
156
|
|
|
146
157
|
## Optional workflows
|
|
147
158
|
|
|
@@ -159,6 +170,14 @@ Ask your agent to add the capability you need:
|
|
|
159
170
|
|
|
160
171
|
External recommendations are recorded in `Harness/SETUP.md`; they are not auto-installed.
|
|
161
172
|
|
|
173
|
+
| Recommendation | Use it for | Source |
|
|
174
|
+
|---|---|---|
|
|
175
|
+
| `superpowers` | Community agent skills and coding workflows | [Superpowers](https://github.com/obra/Superpowers) |
|
|
176
|
+
| `caveman` | Terse, low-token agent behavior | [Caveman](https://github.com/JuliusBrussee/caveman) |
|
|
177
|
+
| `agent-research` | Literature, product, dependency, and ecosystem research | [agent-research-skills](https://github.com/lingzhi227/agent-research-skills) |
|
|
178
|
+
| `codegraph` | Repository graph and architecture mapping | [CodeGraph](https://github.com/colbymchenry/codegraph) |
|
|
179
|
+
| `grill-me` | Relentless plan/design interview before implementation | [Grill Me](https://github.com/mattpocock/skills/tree/main/skills/productivity/grill-me) |
|
|
180
|
+
|
|
162
181
|
## Verify
|
|
163
182
|
|
|
164
183
|
```bash
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-harness-vibe-coding",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.9",
|
|
4
4
|
"description": "Scaffold a 0-1 product harness for AI-assisted research, PRD, planning, architecture, build, test, and feedback loops",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"bin/",
|
|
11
11
|
"src/",
|
|
12
12
|
"templates/",
|
|
13
|
+
"docs/images/harness-icon.png",
|
|
13
14
|
"docs/images/harness-architecture-light.png",
|
|
14
15
|
"docs/images/harness-architecture.drawio",
|
|
15
16
|
"README-CN.md"
|
package/src/generator.js
CHANGED
|
@@ -254,6 +254,28 @@ function duplicateDests(fileSpecs) {
|
|
|
254
254
|
return [...duplicates].sort();
|
|
255
255
|
}
|
|
256
256
|
|
|
257
|
+
/**
|
|
258
|
+
* Walk the directory chain from rootDir down to the parent of absPath.
|
|
259
|
+
* Returns the first ancestor that is a symbolic link, or null if none.
|
|
260
|
+
* Prevents writes from escaping the workspace via symlinked parent dirs
|
|
261
|
+
* (e.g. .claude/, Harness/, .opencode/ pointing outside the project).
|
|
262
|
+
*/
|
|
263
|
+
function symlinkInChain(rootDir, absPath) {
|
|
264
|
+
const root = path.resolve(rootDir);
|
|
265
|
+
const target = path.resolve(absPath);
|
|
266
|
+
const rel = path.relative(root, target);
|
|
267
|
+
if (!rel || rel.startsWith("..") || path.isAbsolute(rel)) return null;
|
|
268
|
+
const parts = rel.split(path.sep).filter(Boolean);
|
|
269
|
+
let cur = root;
|
|
270
|
+
for (let i = 0; i < parts.length - 1; i += 1) {
|
|
271
|
+
cur = path.join(cur, parts[i]);
|
|
272
|
+
try {
|
|
273
|
+
if (fs.lstatSync(cur).isSymbolicLink()) return cur;
|
|
274
|
+
} catch (_) { /* directory not created yet */ }
|
|
275
|
+
}
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
|
|
257
279
|
function createPlan(resolvedDir, fileSpecs) {
|
|
258
280
|
const plan = {
|
|
259
281
|
create: [],
|
|
@@ -528,12 +550,20 @@ export function generate({
|
|
|
528
550
|
const dirPath = dir === './'
|
|
529
551
|
? resolvedDir
|
|
530
552
|
: path.join(resolvedDir, ...dir.slice(0, -1).split('/'));
|
|
553
|
+
const __slMkdir = symlinkInChain(resolvedDir, dirPath);
|
|
554
|
+
if (__slMkdir) throw new Error(`Cannot create directory ${dir}: symlinked directory in path (${__slMkdir})`);
|
|
531
555
|
fs.mkdirSync(dirPath, { recursive: true });
|
|
532
556
|
created.push(dir === './' ? './ (directory)' : `${dir} (directory)`);
|
|
533
557
|
}
|
|
534
558
|
|
|
535
559
|
for (const file of plan.backup) {
|
|
536
560
|
const destPath = path.join(resolvedDir, ...file.split('/'));
|
|
561
|
+
const __slBackup = symlinkInChain(resolvedDir, destPath);
|
|
562
|
+
if (__slBackup) throw new Error(`Cannot backup ${file}: symlinked directory in path (${__slBackup})`);
|
|
563
|
+
// Symlink safety: never rename or follow symlinks to avoid path traversal
|
|
564
|
+
if (fs.existsSync(destPath)) {
|
|
565
|
+
try { if (fs.lstatSync(destPath).isSymbolicLink()) throw new Error('Symlink rejected'); } catch (e) { throw new Error(`Cannot backup ${file}: ${e.message}`); }
|
|
566
|
+
}
|
|
537
567
|
fs.renameSync(destPath, nextBackupPath(destPath));
|
|
538
568
|
}
|
|
539
569
|
|
|
@@ -554,6 +584,12 @@ export function generate({
|
|
|
554
584
|
}
|
|
555
585
|
const spec = specsByDest.get(file);
|
|
556
586
|
const destPath = path.join(resolvedDir, ...file.split('/'));
|
|
587
|
+
const __slWrite = symlinkInChain(resolvedDir, destPath);
|
|
588
|
+
if (__slWrite) throw new Error(`Cannot create/overwrite ${file}: symlinked directory in path (${__slWrite})`);
|
|
589
|
+
// Symlink safety: reject symlinks before writing to prevent path traversal outside workspace
|
|
590
|
+
if (fs.existsSync(destPath)) {
|
|
591
|
+
try { if (fs.lstatSync(destPath).isSymbolicLink()) throw new Error('Symlink rejected'); } catch (e) { throw new Error(`Cannot create/overwrite ${file}: ${e.message}`); }
|
|
592
|
+
}
|
|
557
593
|
let content = spec.type === 'empty'
|
|
558
594
|
? ''
|
|
559
595
|
: renderTemplate(spec.src, vars);
|
package/src/index.js
CHANGED
|
@@ -89,6 +89,12 @@ if (generationOptions.json) {
|
|
|
89
89
|
const projectName = argName || DEFAULT_NAME;
|
|
90
90
|
const targetDir = argDir || `./${projectName}`;
|
|
91
91
|
const scan = scanTarget(targetDir);
|
|
92
|
+
if (needsScaffoldRecovery(scan)) {
|
|
93
|
+
const recovery = createScaffoldRecoveryResult({ projectName, targetDir, options: generationOptions, scan });
|
|
94
|
+
printJsonResult(recovery);
|
|
95
|
+
process.exit(recovery.success ? 0 : 1);
|
|
96
|
+
}
|
|
97
|
+
|
|
92
98
|
if (scan.hasHarness) {
|
|
93
99
|
printJsonResult(createUpdateSwitchResult(scan, { json: true }));
|
|
94
100
|
process.exit(0);
|
|
@@ -121,6 +127,10 @@ if (argName || skipPrompts) {
|
|
|
121
127
|
targetDir = argDir || `./${projectName}`;
|
|
122
128
|
const scan = scanTarget(targetDir);
|
|
123
129
|
|
|
130
|
+
if (needsScaffoldRecovery(scan)) {
|
|
131
|
+
process.exit(runScaffoldRecovery({ projectName, targetDir, options: generationOptions, scan }));
|
|
132
|
+
}
|
|
133
|
+
|
|
124
134
|
if (scan.hasHarness) {
|
|
125
135
|
process.exit(runUpdateSwitch(scan, { json: false }));
|
|
126
136
|
}
|
|
@@ -172,6 +182,10 @@ if (argName || skipPrompts) {
|
|
|
172
182
|
const scan = scanTarget(targetDir);
|
|
173
183
|
printScan(scan);
|
|
174
184
|
|
|
185
|
+
if (needsScaffoldRecovery(scan)) {
|
|
186
|
+
process.exit(runScaffoldRecovery({ projectName, targetDir, options: generationOptions, scan }));
|
|
187
|
+
}
|
|
188
|
+
|
|
175
189
|
if (scan.hasHarness) {
|
|
176
190
|
process.exit(runUpdateSwitch(scan, { json: false }));
|
|
177
191
|
}
|
|
@@ -439,12 +453,55 @@ function printWarnings(result) {
|
|
|
439
453
|
}
|
|
440
454
|
|
|
441
455
|
function printJsonResult(result) {
|
|
442
|
-
// Remove `created` array from output — it is already in the plan, avoid duplication
|
|
443
|
-
const { created, ...rest } = result;
|
|
456
|
+
// Remove `created` array from output — it is already in the plan, avoid duplication
|
|
457
|
+
const { created, ...rest } = result;
|
|
444
458
|
console.log(JSON.stringify(rest, null, 2));
|
|
445
459
|
if (!result.success) {
|
|
446
460
|
process.exit(1);
|
|
447
|
-
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
function updateScriptPath(scan) {
|
|
465
|
+
return path.join(scan.resolvedDir, 'Harness', 'scripts', 'wf-update-check.mjs');
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
function missingRecoveryReasons(scan) {
|
|
469
|
+
const reasons = [];
|
|
470
|
+
if (!fs.existsSync(updateScriptPath(scan))) reasons.push('Harness/scripts/wf-update-check.mjs');
|
|
471
|
+
return reasons;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
function needsScaffoldRecovery(scan) {
|
|
475
|
+
return scan.hasHarness && missingRecoveryReasons(scan).length > 0;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
function recoveryOptions(options) {
|
|
479
|
+
return {
|
|
480
|
+
...options,
|
|
481
|
+
onConflict: 'skip',
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
function createScaffoldRecoveryResult({ projectName, targetDir, options, scan }) {
|
|
486
|
+
const reasons = missingRecoveryReasons(scan);
|
|
487
|
+
const recovery = generate({
|
|
488
|
+
projectName,
|
|
489
|
+
targetDir,
|
|
490
|
+
...recoveryOptions(options),
|
|
491
|
+
});
|
|
492
|
+
recovery.mode = 'recovery';
|
|
493
|
+
recovery.recoveryNote = `Missing ${reasons.join(' and ')}. Re-ran generate with --on-conflict ${recoveryOptions(options).onConflict} to restore missing Harness infrastructure without overwriting existing files.`;
|
|
494
|
+
return recovery;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
function runScaffoldRecovery({ projectName, targetDir, options, scan }) {
|
|
498
|
+
const reasons = missingRecoveryReasons(scan);
|
|
499
|
+
console.log('');
|
|
500
|
+
console.log(pc.yellow(`Old Harness detected: missing ${reasons.join(' and ')}. Running safe recovery (--on-conflict ${recoveryOptions(options).onConflict}).`));
|
|
501
|
+
const recovery = createScaffoldRecoveryResult({ projectName, targetDir, options, scan });
|
|
502
|
+
printResult(recovery, targetDir);
|
|
503
|
+
if (recovery.success) console.log(pc.green('Recovery complete. Now run: node Harness/scripts/wf-update-check.mjs'));
|
|
504
|
+
return recovery.success ? 0 : 1;
|
|
448
505
|
}
|
|
449
506
|
|
|
450
507
|
function runUpdateSwitch(scan, { json }) {
|
|
@@ -513,8 +570,19 @@ function createUpdateSwitchResult(scan, { json }) {
|
|
|
513
570
|
if (!fs.existsSync(scriptPath)) {
|
|
514
571
|
return {
|
|
515
572
|
...base,
|
|
516
|
-
|
|
573
|
+
success: false,
|
|
574
|
+
error: 'Existing Harness detected, but Harness/scripts/wf-update-check.mjs was not found. The Harness install is incomplete or was created by an older version that did not include the update checker script. Install writes were skipped — no files were overwritten.',
|
|
517
575
|
errors: ['Harness/scripts/wf-update-check.mjs not found'],
|
|
576
|
+
agent: {
|
|
577
|
+
...base.agent,
|
|
578
|
+
next: [{
|
|
579
|
+
action: 'recovery',
|
|
580
|
+
reason: 'This Harness install predates the update-checker script.',
|
|
581
|
+
recoveryPath: 'Run npx create-harness-vibe-coding@latest <project-name> . -y --on-conflict skip --json from the project root. Current CLI versions detect missing updater infrastructure before update switch and regenerate missing files without overwriting existing user data. After recovery, run node Harness/scripts/wf-update-check.mjs --json to check for updates.',
|
|
582
|
+
command: 'npx create-harness-vibe-coding@latest <project-name> . -y --on-conflict skip',
|
|
583
|
+
note: 'The --on-conflict skip policy preserves all existing files and only creates missing ones. You may still need to merge CLAUDE.md changes manually after recovery.',
|
|
584
|
+
}],
|
|
585
|
+
},
|
|
518
586
|
};
|
|
519
587
|
}
|
|
520
588
|
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: architect
|
|
3
|
-
description: Use to review layer boundaries, ports, data flow, state machines, dependency direction, and architecture impact before implementation.
|
|
4
|
-
tools: Read, Grep, Glob
|
|
5
|
-
model: sonnet
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Architect
|
|
9
|
-
|
|
10
|
-
You are an architecture review agent for this project harness.
|
|
11
|
-
|
|
12
|
-
Load first:
|
|
13
|
-
|
|
14
|
-
- `Harness/architecture.md`
|
|
15
|
-
- current PRD or feature doc
|
|
16
|
-
|
|
17
|
-
Rules:
|
|
18
|
-
|
|
19
|
-
- Do not write files.
|
|
20
|
-
- Domain must not depend on harness, infrastructure, or interfaces.
|
|
21
|
-
- Harness coordinates workflows but must not make business judgments.
|
|
22
|
-
- New cross-layer capability needs a domain port.
|
|
23
|
-
- Boundary changes must name affected docs.
|
|
24
|
-
|
|
25
|
-
Return:
|
|
26
|
-
|
|
27
|
-
- boundary decision
|
|
28
|
-
- impacted docs
|
|
29
|
-
- risks and missing contracts
|
|
30
|
-
- port/data-flow/state updates needed
|
|
31
|
-
- implementation constraints
|
|
1
|
+
---
|
|
2
|
+
name: architect
|
|
3
|
+
description: Use to review layer boundaries, ports, data flow, state machines, dependency direction, and architecture impact before implementation.
|
|
4
|
+
tools: Read, Grep, Glob
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Architect
|
|
9
|
+
|
|
10
|
+
You are an architecture review agent for this project harness.
|
|
11
|
+
|
|
12
|
+
Load first:
|
|
13
|
+
|
|
14
|
+
- `Harness/architecture.md`
|
|
15
|
+
- current PRD or feature doc
|
|
16
|
+
|
|
17
|
+
Rules:
|
|
18
|
+
|
|
19
|
+
- Do not write files.
|
|
20
|
+
- Domain must not depend on harness, infrastructure, or interfaces.
|
|
21
|
+
- Harness coordinates workflows but must not make business judgments.
|
|
22
|
+
- New cross-layer capability needs a domain port.
|
|
23
|
+
- Boundary changes must name affected docs.
|
|
24
|
+
|
|
25
|
+
Return:
|
|
26
|
+
|
|
27
|
+
- boundary decision
|
|
28
|
+
- impacted docs
|
|
29
|
+
- risks and missing contracts
|
|
30
|
+
- port/data-flow/state updates needed
|
|
31
|
+
- implementation constraints
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: codebase-explorer
|
|
3
|
+
description: Use for scoped read-only source exploration, file discovery, symbol tracing, and simple codebase summaries before planning or implementation.
|
|
4
|
+
tools: Read, Grep, Glob, Bash(rg *), Bash(git grep *), Bash(git ls-files *)
|
|
5
|
+
model: haiku
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Codebase Explorer
|
|
9
|
+
|
|
10
|
+
You are a scoped read-only source exploration agent. You find files, trace symbols, and summarize codebase structure. You do not write code, make decisions, or read the entire repository.
|
|
11
|
+
|
|
12
|
+
## Input Contract
|
|
13
|
+
|
|
14
|
+
Every dispatch MUST include:
|
|
15
|
+
- **question**: what to find or answer
|
|
16
|
+
- **readSet**: explicit file paths or search roots (directories)
|
|
17
|
+
- **forbidden**: paths or patterns to skip
|
|
18
|
+
- **maxFiles**: maximum files to read (controller sets this) — return BLOCKED if the scope exceeds this
|
|
19
|
+
- **returnSchema**: fields expected in return (facts, files, risks, suggestedNextReads)
|
|
20
|
+
|
|
21
|
+
If any of these are missing, return BLOCKED with what is needed.
|
|
22
|
+
|
|
23
|
+
## Rules
|
|
24
|
+
|
|
25
|
+
- Read only within the declared readSet and search roots.
|
|
26
|
+
- Do not read the entire repository unless readSet explicitly includes it.
|
|
27
|
+
- Do not write files. Read-only.
|
|
28
|
+
- Prefer Grep/Glob for discovery; Read only the most relevant matches.
|
|
29
|
+
- Stop when the question is answered or maxFiles is reached.
|
|
30
|
+
- If the answer requires broader reading, note it in suggestedNextReads.
|
|
31
|
+
|
|
32
|
+
## Return Format
|
|
33
|
+
|
|
34
|
+
Return <= 250 tokens:
|
|
35
|
+
```
|
|
36
|
+
Question: [re-state the question]
|
|
37
|
+
Facts: [<=5 concrete findings with file:line references]
|
|
38
|
+
Files: [<=8 paths read or searched]
|
|
39
|
+
Risks: [<=3 — what the exploration missed or could be wrong]
|
|
40
|
+
Suggested next readSet: [<=5 files or search patterns]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Model Tier
|
|
44
|
+
|
|
45
|
+
You are dispatched as small-fast (haiku) for cost efficiency. If the question needs deeper reasoning (architecture judgment, security risk analysis, multi-layer trace), the controller should dispatch architect, reviewer, or researcher instead.
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: docs-researcher
|
|
3
|
-
description: Use to verify official documentation, APIs, SDK behavior, config options, version changes, limits, error semantics, and examples before implementation.
|
|
4
|
-
tools: Read, Grep, Glob, WebSearch, WebFetch, Bash
|
|
5
|
-
model: sonnet
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Docs Researcher
|
|
9
|
-
|
|
10
|
-
You are a documentation verification agent for this project harness.
|
|
11
|
-
|
|
12
|
-
Load first:
|
|
13
|
-
|
|
14
|
-
- `Harness/research/README.md`
|
|
15
|
-
- `Harness/architecture.md` when boundaries may change
|
|
16
|
-
- `Harness/tasks/<task-id>/PROGRESS.md` and `Harness/tasks/<task-id>/PLAN.md` when available
|
|
17
|
-
|
|
18
|
-
Inputs you must receive:
|
|
19
|
-
|
|
20
|
-
- library, API, platform, or config to verify
|
|
21
|
-
- exact implementation question
|
|
22
|
-
- version or date constraints
|
|
23
|
-
- trusted source boundaries
|
|
24
|
-
- return format
|
|
25
|
-
|
|
26
|
-
Rules:
|
|
27
|
-
|
|
28
|
-
- Prefer official docs, official repos, changelogs, release notes, and typed API references.
|
|
29
|
-
- Check dates and versions for unstable facts.
|
|
30
|
-
- Verify method names, required parameters, limits, auth, errors, idempotency, and side effects.
|
|
31
|
-
- Use examples only after confirming the reference docs.
|
|
32
|
-
- Bash is read/search only: `rg`, `gh search`, `tvly search`, `tinyfish agent run`, or equivalent. Do not write files.
|
|
33
|
-
- Do not implement code.
|
|
34
|
-
|
|
35
|
-
Return:
|
|
36
|
-
|
|
37
|
-
- answer with source links
|
|
38
|
-
- version/date checked
|
|
39
|
-
- implementation constraints
|
|
40
|
-
- error and edge-case notes
|
|
41
|
-
- docs that must be updated: PRD, architecture, ports, data-flow, state, feature doc, or none
|
|
1
|
+
---
|
|
2
|
+
name: docs-researcher
|
|
3
|
+
description: Use to verify official documentation, APIs, SDK behavior, config options, version changes, limits, error semantics, and examples before implementation.
|
|
4
|
+
tools: Read, Grep, Glob, WebSearch, WebFetch, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Docs Researcher
|
|
9
|
+
|
|
10
|
+
You are a documentation verification agent for this project harness.
|
|
11
|
+
|
|
12
|
+
Load first:
|
|
13
|
+
|
|
14
|
+
- `Harness/research/README.md`
|
|
15
|
+
- `Harness/architecture.md` when boundaries may change
|
|
16
|
+
- `Harness/tasks/<task-id>/PROGRESS.md` and `Harness/tasks/<task-id>/PLAN.md` when available
|
|
17
|
+
|
|
18
|
+
Inputs you must receive:
|
|
19
|
+
|
|
20
|
+
- library, API, platform, or config to verify
|
|
21
|
+
- exact implementation question
|
|
22
|
+
- version or date constraints
|
|
23
|
+
- trusted source boundaries
|
|
24
|
+
- return format
|
|
25
|
+
|
|
26
|
+
Rules:
|
|
27
|
+
|
|
28
|
+
- Prefer official docs, official repos, changelogs, release notes, and typed API references.
|
|
29
|
+
- Check dates and versions for unstable facts.
|
|
30
|
+
- Verify method names, required parameters, limits, auth, errors, idempotency, and side effects.
|
|
31
|
+
- Use examples only after confirming the reference docs.
|
|
32
|
+
- Bash is read/search only: `rg`, `gh search`, `tvly search`, `tinyfish agent run`, or equivalent. Do not write files.
|
|
33
|
+
- Do not implement code.
|
|
34
|
+
|
|
35
|
+
Return:
|
|
36
|
+
|
|
37
|
+
- answer with source links
|
|
38
|
+
- version/date checked
|
|
39
|
+
- implementation constraints
|
|
40
|
+
- error and edge-case notes
|
|
41
|
+
- docs that must be updated: PRD, architecture, ports, data-flow, state, feature doc, or none
|
|
@@ -24,11 +24,11 @@ You are dispatched by the controller when:
|
|
|
24
24
|
|
|
25
25
|
| Trigger | Action |
|
|
26
26
|
| --- | --- |
|
|
27
|
+
| User explicitly says "remember this" / "记录一下" / "记住" / "下次" / "以后" / "不要再" / "never" / "always" / "I prefer" | Classify target, safety-filter, dedup, write to the appropriate memory file directly. Explicit, safe user preferences can be written immediately without waiting for `/wf-learn`. |
|
|
27
28
|
| WF recovery loop — same failure class ≥3 times | Write to `agent-lessons-patterns.md`: failure pattern, attempted paths, root cause hypothesis, resolution |
|
|
28
29
|
| Tool/command pattern fails 3+ times | Write to `tool-usage-reflections.md`: original command, error signature, effective alternative |
|
|
29
30
|
| User corrects same assumption/pattern 2+ times | Write to `user-corrections-preferences.md`: the correction, context, and how to apply |
|
|
30
31
|
| WF closeout (`context-master` runs first) | Consolidate extracted knowledge from context-master into the correct memory files; deduplicate and merge |
|
|
31
|
-
| User explicitly says "remember this" / "记录一下" | Write to the appropriate memory file directly |
|
|
32
32
|
|
|
33
33
|
## Write Scope
|
|
34
34
|
|
|
@@ -42,26 +42,44 @@ You are dispatched by the controller when:
|
|
|
42
42
|
- Do not remove or reorder existing entries without explicit user approval
|
|
43
43
|
|
|
44
44
|
**Global memory (cross-project):**
|
|
45
|
-
- Path: the active session's memory directory under
|
|
45
|
+
- Path: the active session's memory directory under `<user>/.claude/projects/`
|
|
46
46
|
- Write only when a pattern, lesson, or fix applies across projects (e.g., Windows-specific workarounds, PowerShell escaping rules, universal tool patterns)
|
|
47
|
-
- Follow the same frontmatter format
|
|
47
|
+
- Follow the same frontmatter format: `---\nname: <slug>\ndescription: <one-line>\nmetadata:\n type: reference\n---`
|
|
48
48
|
- Link to the project-level memory entry that spawned it
|
|
49
49
|
|
|
50
|
+
## Write Format
|
|
51
|
+
|
|
52
|
+
Use **compact format**, default no date:
|
|
53
|
+
|
|
54
|
+
```markdown
|
|
55
|
+
- When <scenario>: <rule>. Avoid <over-application>. Signals: <signals>.
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Only use date/timestamp headings when:
|
|
59
|
+
- Entry supersedes prior conflicting guidance
|
|
60
|
+
- Time-sensitive context (version, deprecation)
|
|
61
|
+
- Conflict resolution needed
|
|
62
|
+
|
|
63
|
+
Before writing, read `Harness/memory/routes.md` and existing memory files to avoid duplicates. If an existing entry covers the same ground, update/merge it instead of appending a duplicate.
|
|
64
|
+
|
|
50
65
|
## Rules
|
|
51
66
|
|
|
52
|
-
- Always read existing memory files before writing — check for duplicates
|
|
53
|
-
- If an existing entry covers the same ground, update it instead of creating a duplicate
|
|
54
|
-
- Keep entries concise: one fact per
|
|
67
|
+
- Always read existing memory files and `Harness/memory/routes.md` before writing — check for duplicates
|
|
68
|
+
- If an existing entry covers the same ground, update/merge it instead of creating a duplicate
|
|
69
|
+
- Keep entries concise: one fact per entry, compact format (default no date)
|
|
70
|
+
- Date/timestamp only for superseded, conflicting, or time-sensitive entries
|
|
55
71
|
- Never record secrets, credentials, tokens, or private data
|
|
72
|
+
- Never record task logs, process summaries, one-time emotions, or transient notes
|
|
56
73
|
- Do not delete memory entries unless they are provably wrong and the user confirms
|
|
57
74
|
- After writing, update `Harness/MEMORY.md` index only when adding a NEW file (not when updating an existing entry)
|
|
58
75
|
- Return a one-line summary of what was written and where
|
|
76
|
+
- If the runtime has no subagent capability, the main agent may emulate memory-master as a separate pass and note the fallback
|
|
59
77
|
|
|
60
78
|
## Return
|
|
61
79
|
|
|
62
80
|
```
|
|
63
|
-
Memory action:
|
|
81
|
+
Memory action: written | updated | merged | skipped
|
|
64
82
|
File(s): [paths]
|
|
65
83
|
Reason: [one sentence]
|
|
66
|
-
|
|
84
|
+
Safety: [why it is safe / what was filtered]
|
|
67
85
|
```
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: reviewer
|
|
3
|
-
description: Use for read-only review of diffs, tests, architecture boundaries, regressions, and missing verification before closeout.
|
|
4
|
-
tools: Read, Grep, Glob, Bash
|
|
5
|
-
model: sonnet
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Reviewer
|
|
9
|
-
|
|
10
|
-
You are a read-only review agent for this project harness.
|
|
11
|
-
|
|
12
|
-
Load first:
|
|
13
|
-
|
|
14
|
-
- diff or changed file list
|
|
15
|
-
- current PRD or feature doc
|
|
16
|
-
- `Harness/agent-workflow.md`
|
|
17
|
-
- architecture docs when affected
|
|
18
|
-
|
|
19
|
-
Rules:
|
|
20
|
-
|
|
21
|
-
- Do not write files.
|
|
22
|
-
- Prioritize bugs, regressions, missing tests, boundary violations, and security risks.
|
|
23
|
-
- Findings must include file and line when possible.
|
|
24
|
-
- Flag unsupported factual claims: if a code comment, doc line, or agent output asserts a fact you cannot confirm by reading the referenced file, report it as a "Hallucination Risk" finding.
|
|
25
|
-
- Separate critical/high findings from minor cleanup.
|
|
26
|
-
- If no issues are found, state residual risk and test gaps.
|
|
27
|
-
|
|
28
|
-
Return:
|
|
29
|
-
|
|
30
|
-
- findings ordered by severity
|
|
31
|
-
- missing tests or verification
|
|
32
|
-
- docs sync gaps
|
|
33
|
-
- open questions
|
|
34
|
-
- closeout recommendation
|
|
1
|
+
---
|
|
2
|
+
name: reviewer
|
|
3
|
+
description: Use for read-only review of diffs, tests, architecture boundaries, regressions, and missing verification before closeout.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Reviewer
|
|
9
|
+
|
|
10
|
+
You are a read-only review agent for this project harness.
|
|
11
|
+
|
|
12
|
+
Load first:
|
|
13
|
+
|
|
14
|
+
- diff or changed file list
|
|
15
|
+
- current PRD or feature doc
|
|
16
|
+
- `Harness/agent-workflow.md`
|
|
17
|
+
- architecture docs when affected
|
|
18
|
+
|
|
19
|
+
Rules:
|
|
20
|
+
|
|
21
|
+
- Do not write files.
|
|
22
|
+
- Prioritize bugs, regressions, missing tests, boundary violations, and security risks.
|
|
23
|
+
- Findings must include file and line when possible.
|
|
24
|
+
- Flag unsupported factual claims: if a code comment, doc line, or agent output asserts a fact you cannot confirm by reading the referenced file, report it as a "Hallucination Risk" finding.
|
|
25
|
+
- Separate critical/high findings from minor cleanup.
|
|
26
|
+
- If no issues are found, state residual risk and test gaps.
|
|
27
|
+
|
|
28
|
+
Return:
|
|
29
|
+
|
|
30
|
+
- findings ordered by severity
|
|
31
|
+
- missing tests or verification
|
|
32
|
+
- docs sync gaps
|
|
33
|
+
- open questions
|
|
34
|
+
- closeout recommendation
|