create-harness-vibe-coding 0.8.16 → 0.8.18
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/CHANGELOG.md +18 -0
- package/README-CN.md +100 -127
- package/README.md +63 -42
- package/package.json +1 -1
- package/src/generator.js +628 -121
- package/src/index.js +174 -43
- package/src/prompts.js +18 -0
- package/templates/common/.claude/commands/wf-auto-spark.md +16 -0
- package/templates/common/.claude/commands/wf-auto.md +16 -0
- package/templates/{optional/skills/browser-e2e/.opencode → common/.claude}/commands/wf-browser.md +1 -1
- package/templates/common/.claude/commands/wf-command-create.md +58 -0
- package/templates/common/.claude/commands/wf-help.md +13 -6
- package/templates/common/.claude/commands/wf-learn.md +16 -0
- package/templates/common/.claude/commands/wf-max.md +20 -0
- package/templates/common/.claude/commands/wf-readme.md +16 -0
- package/templates/common/.claude/commands/wf-remove.md +16 -0
- package/templates/common/.claude/commands/wf-review.md +16 -0
- package/templates/common/.claude/commands/wf-task-archive.md +26 -0
- package/templates/common/.claude/commands/wf-task-list.md +24 -0
- package/templates/common/.claude/commands/wf-task-record.md +24 -0
- package/templates/common/.claude/commands/wf.md +16 -0
- package/templates/common/.claude/rules/ecc/common.md +1 -1
- package/templates/common/.claude/skills/wf-agents-docs/SKILL.md +15 -30
- package/templates/common/.claude/skills/wf-browser/SKILL.md +176 -0
- package/templates/common/.claude/skills/wf-command-create/SKILL.md +37 -0
- package/templates/common/.claude/skills/wf-help/SKILL.md +30 -0
- package/templates/common/.claude/skills/wf-max/SKILL.md +22 -8
- package/templates/common/.claude/skills/wf-review/SKILL.md +29 -2
- package/templates/common/.claude/skills/wf-task-archive/SKILL.md +28 -0
- package/templates/common/.claude/skills/wf-task-list/SKILL.md +28 -0
- package/templates/common/.claude/skills/wf-task-record/SKILL.md +28 -0
- package/templates/common/.codex/config.toml +3 -5
- package/templates/common/.harness-version +108 -41
- package/templates/common/.opencode/agents/architect-manager.md +7 -1
- package/templates/common/.opencode/agents/explore-manager.md +10 -1
- package/templates/common/.opencode/agents/implement-manager.md +5 -3
- package/templates/common/.opencode/agents/review-manager.md +5 -2
- package/templates/common/.opencode/commands/wf-browser.md +16 -0
- package/templates/common/.opencode/commands/wf-command-create.md +61 -0
- package/templates/common/.opencode/commands/wf-help.md +13 -6
- package/templates/common/.opencode/commands/wf-max.md +12 -7
- package/templates/common/.opencode/commands/wf-task-archive.md +29 -0
- package/templates/common/.opencode/commands/wf-task-list.md +27 -0
- package/templates/common/.opencode/commands/wf-task-record.md +27 -0
- package/templates/common/CLAUDE.md +9 -7
- package/templates/common/Harness/MEMORY.md +12 -3
- package/templates/common/Harness/README.md +23 -41
- package/templates/common/Harness/ownership.manifest.json +162 -14
- package/templates/common/Harness/scripts/archive-tasks.mjs +12 -220
- package/templates/common/Harness/scripts/scan-clean.mjs +3 -9
- package/templates/common/Harness/scripts/task-state.mjs +1279 -0
- package/templates/common/Harness/scripts/validate-harness.mjs +635 -65
- package/templates/common/Harness/scripts/wf-remove.mjs +37 -5
- package/templates/common/Harness/scripts/wf-update-check.mjs +3 -0
- package/templates/common/Harness/specs/guides/SETUP.md +10 -2
- package/templates/common/Harness/specs/protocols/MEMORY_PROTOCOL.md +15 -0
- package/templates/common/Harness/specs/protocols/TASK_ARCHIVE.md +49 -23
- package/templates/common/Harness/specs/runtime/command-surface.json +215 -0
- package/templates/common/Harness/specs/runtime/dispatch.md +2 -2
- package/templates/common/Harness/specs/runtime/subagents.md +15 -5
- package/templates/common/Harness/specs/workflows/WF-AUTO.md +6 -6
- package/templates/common/Harness/specs/workflows/WF-KERNEL.md +1 -1
- package/templates/common/Harness/specs/workflows/WF-MAX.md +35 -2
- package/templates/common/Harness/specs/workflows/WF-STATE.md +155 -36
- package/templates/common/Harness/tasks/_template/STATE.json +6 -0
- package/templates/common/opencode.json +1 -0
- package/templates/optional/catalog.json +2 -9
- package/templates/optional/skills/browser-e2e/.claude/skills/browser-e2e/SKILL.md +0 -42
- package/templates/optional/skills/browser-e2e/.claude/skills/wf-browser/SKILL.md +0 -201
- package/templates/optional/skills/browser-e2e/Harness/workflows/browser-e2e.md +0 -119
|
@@ -130,7 +130,6 @@ const BUILT_IN_AGENT_NAMES = [
|
|
|
130
130
|
];
|
|
131
131
|
|
|
132
132
|
const BUILT_IN_SKILL_NAMES = [
|
|
133
|
-
'browser-e2e',
|
|
134
133
|
'github-pr-review',
|
|
135
134
|
'python-backend',
|
|
136
135
|
'subagent-orchestrator',
|
|
@@ -142,11 +141,34 @@ const BUILT_IN_SKILL_NAMES = [
|
|
|
142
141
|
'wf-auto',
|
|
143
142
|
'wf-auto-spark',
|
|
144
143
|
'wf-browser',
|
|
144
|
+
'wf-command-create',
|
|
145
|
+
'wf-help',
|
|
145
146
|
'wf-learn',
|
|
146
147
|
'wf-max',
|
|
147
148
|
'wf-readme',
|
|
148
149
|
'wf-remove',
|
|
149
150
|
'wf-review',
|
|
151
|
+
'wf-task-archive',
|
|
152
|
+
'wf-task-list',
|
|
153
|
+
'wf-task-record',
|
|
154
|
+
'wf-update',
|
|
155
|
+
];
|
|
156
|
+
|
|
157
|
+
const BUILT_IN_COMMAND_NAMES = [
|
|
158
|
+
'wf',
|
|
159
|
+
'wf-auto',
|
|
160
|
+
'wf-auto-spark',
|
|
161
|
+
'wf-browser',
|
|
162
|
+
'wf-command-create',
|
|
163
|
+
'wf-help',
|
|
164
|
+
'wf-learn',
|
|
165
|
+
'wf-max',
|
|
166
|
+
'wf-readme',
|
|
167
|
+
'wf-remove',
|
|
168
|
+
'wf-review',
|
|
169
|
+
'wf-task-archive',
|
|
170
|
+
'wf-task-list',
|
|
171
|
+
'wf-task-record',
|
|
150
172
|
'wf-update',
|
|
151
173
|
];
|
|
152
174
|
|
|
@@ -159,8 +181,10 @@ const KNOWN_FRAMEWORK_FILES = new Set([
|
|
|
159
181
|
`.claude/skills/${name}/SKILL.md`,
|
|
160
182
|
`.agents/skills/${name}/SKILL.md`,
|
|
161
183
|
]),
|
|
162
|
-
|
|
163
|
-
|
|
184
|
+
...BUILT_IN_COMMAND_NAMES.flatMap(name => [
|
|
185
|
+
`.claude/commands/${name}.md`,
|
|
186
|
+
`.opencode/commands/${name}.md`,
|
|
187
|
+
]),
|
|
164
188
|
'.claude/rules/ecc/common.md',
|
|
165
189
|
'opencode.json',
|
|
166
190
|
]);
|
|
@@ -172,12 +196,13 @@ function isKnownFrameworkFile(file) {
|
|
|
172
196
|
/** Directories to clean up if empty after file removal. */
|
|
173
197
|
const CLEANUP_DIRS = [
|
|
174
198
|
'.claude/agents',
|
|
175
|
-
'.claude/skills/browser-e2e',
|
|
176
199
|
'.claude/skills/github-pr-review',
|
|
177
200
|
'.claude/skills/python-backend',
|
|
178
201
|
'.claude/skills/wf-auto',
|
|
179
202
|
'.claude/skills/wf-auto-spark',
|
|
180
203
|
'.claude/skills/wf-browser',
|
|
204
|
+
'.claude/skills/wf-command-create',
|
|
205
|
+
'.claude/skills/wf-help',
|
|
181
206
|
'.claude/skills/tdd',
|
|
182
207
|
'.claude/skills/ts-react-frontend',
|
|
183
208
|
'.claude/skills/ui-ux-review',
|
|
@@ -187,16 +212,20 @@ const CLEANUP_DIRS = [
|
|
|
187
212
|
'.claude/skills/wf-max',
|
|
188
213
|
'.claude/skills/wf-readme',
|
|
189
214
|
'.claude/skills/wf-review',
|
|
215
|
+
'.claude/skills/wf-task-archive',
|
|
216
|
+
'.claude/skills/wf-task-list',
|
|
217
|
+
'.claude/skills/wf-task-record',
|
|
190
218
|
'.claude/skills/wf-update',
|
|
191
219
|
'.claude/skills/wf-remove',
|
|
192
220
|
'.claude/skills/subagent-orchestrator',
|
|
193
221
|
'.claude/skills',
|
|
194
|
-
'.agents/skills/browser-e2e',
|
|
195
222
|
'.agents/skills/github-pr-review',
|
|
196
223
|
'.agents/skills/python-backend',
|
|
197
224
|
'.agents/skills/wf-auto',
|
|
198
225
|
'.agents/skills/wf-auto-spark',
|
|
199
226
|
'.agents/skills/wf-browser',
|
|
227
|
+
'.agents/skills/wf-command-create',
|
|
228
|
+
'.agents/skills/wf-help',
|
|
200
229
|
'.agents/skills/tdd',
|
|
201
230
|
'.agents/skills/ts-react-frontend',
|
|
202
231
|
'.agents/skills/ui-ux-review',
|
|
@@ -206,6 +235,9 @@ const CLEANUP_DIRS = [
|
|
|
206
235
|
'.agents/skills/wf-max',
|
|
207
236
|
'.agents/skills/wf-readme',
|
|
208
237
|
'.agents/skills/wf-review',
|
|
238
|
+
'.agents/skills/wf-task-archive',
|
|
239
|
+
'.agents/skills/wf-task-list',
|
|
240
|
+
'.agents/skills/wf-task-record',
|
|
209
241
|
'.agents/skills/wf-update',
|
|
210
242
|
'.agents/skills/wf-remove',
|
|
211
243
|
'.agents/skills/subagent-orchestrator',
|
|
@@ -149,8 +149,11 @@ function optionalSkillFromSource(source) {
|
|
|
149
149
|
return match ? match[1] : null;
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
+
const RETIRED_OPTION_IDS = new Set(['browser-e2e']);
|
|
153
|
+
|
|
152
154
|
function isInstalledOptionalFile(file, localVersion) {
|
|
153
155
|
const skillId = optionalSkillFromSource(localVersion?.sources?.[file]);
|
|
156
|
+
if (skillId && RETIRED_OPTION_IDS.has(skillId)) return false;
|
|
154
157
|
return Boolean(skillId && selectedOptionIds(localVersion).has(skillId));
|
|
155
158
|
}
|
|
156
159
|
|
|
@@ -55,6 +55,14 @@ Claude or Codex must follow this order during bootstrap. This sequence is broade
|
|
|
55
55
|
|
|
56
56
|
Before writing, identify the project state:
|
|
57
57
|
|
|
58
|
+
Choose the install scope before scaffold writes:
|
|
59
|
+
|
|
60
|
+
- `--install-scope project` (default): full Harness scaffold is project-local.
|
|
61
|
+
- `--install-scope global`: write shared runtime assets to the selected global Harness directory and copy Claude Code, Codex, and OpenCode command/skill surfaces to host-global directories while keeping `Harness/tasks/`, `Harness/PROGRESS.md`, project memory, research, architecture, and project settings under the target project.
|
|
62
|
+
- Use `--global-dir <dir>` when the global runtime location must be explicit.
|
|
63
|
+
- Use `--host-global-dir <dir>` only when the host-global copy base must be explicit; the installer creates `claude/`, `codex/`, and `opencode/` subdirectories under it.
|
|
64
|
+
- Project settings in `Harness/settings.json` override global settings defaults. Existing user-authored files at config, command, skill, or agent paths are preserved or surfaced for review unless they carry a Harness ownership marker.
|
|
65
|
+
|
|
58
66
|
| Project state | Required action |
|
|
59
67
|
| --- | --- |
|
|
60
68
|
| Empty or new project | Run the scaffold, then follow this file for 0-1 bootstrap |
|
|
@@ -152,7 +160,7 @@ The harness validator checks for specific structural invariants. When comparing
|
|
|
152
160
|
| `Harness/tasks/<id>/PROGRESS.md` | `## Current Goal`, `## Phase`, `## Heartbeat`, `## Loaded Context` headings |
|
|
153
161
|
| `Harness/tasks/<id>/PLAN.md` | `## Tasks`, `## Parallel Dispatch`, `## Subagent Synthesis`, `## Verification` headings |
|
|
154
162
|
| `Harness/specs/guides/SETUP.md` | Retained install/bootstrap guide for new projects, existing projects, legacy upgrades, and Harness update decisions. Keep "Install or Upgrade Path" present. |
|
|
155
|
-
| `
|
|
163
|
+
| `.claude/skills/wf-browser/SKILL.md` and `.agents/skills/wf-browser/SKILL.md` | Built-in browser workflow requires `data-testid`, `accessible labels/roles`, and `inputs, buttons, filters, rows, empty/error/loading states` guidance |
|
|
156
164
|
| `Harness/workflows/ts-react-frontend.md` (if installed as optional) | Same UI selector contract as above |
|
|
157
165
|
|
|
158
166
|
**Files that do NOT need manual merge when the path does not already exist (auto-created by harness):**
|
|
@@ -172,7 +180,7 @@ The generated file list is authoritative by path, not by stale count labels. Cur
|
|
|
172
180
|
Optional workflow examples:
|
|
173
181
|
|
|
174
182
|
```bash
|
|
175
|
-
npx create-harness-vibe-coding@latest my-app ./my-app -y --with
|
|
183
|
+
npx create-harness-vibe-coding@latest my-app ./my-app -y --with ts-react-frontend,ui-ux-review
|
|
176
184
|
npx create-harness-vibe-coding@latest my-app ./my-app -y --preset web-app
|
|
177
185
|
npx create-harness-vibe-coding@latest my-app ./my-app -y --recommend superpowers,codegraph
|
|
178
186
|
```
|
|
@@ -10,6 +10,21 @@ Memory is downstream of evidence. It records reusable patterns, not raw transcri
|
|
|
10
10
|
- **L2 = Startup Digest**: `Harness/memory/startup-hints.md`. Lightweight hints loaded at session start. Not a replacement for full router.
|
|
11
11
|
- **L3 = Detailed Durable Memory**: `Harness/memory/*.md` files. Loaded only when scenario matches via `routes.md`.
|
|
12
12
|
|
|
13
|
+
## Project/Global Memory Boundary
|
|
14
|
+
|
|
15
|
+
- `Harness/tasks/` and `Harness/PROGRESS.md` are always project-local, even when the Harness runtime is installed globally.
|
|
16
|
+
- Project memory lives in `Harness/memory/` and records repo-specific lessons, preferences, and tool patterns.
|
|
17
|
+
- Global memory may live under the selected global Harness directory for cross-project lessons and preferences.
|
|
18
|
+
- Global memory must never store project task state, secrets, raw transcripts, or private project facts.
|
|
19
|
+
|
|
20
|
+
## Project/Global Settings Boundary
|
|
21
|
+
|
|
22
|
+
- Project settings live in `Harness/settings.json` and override global settings.
|
|
23
|
+
- Global settings defaults live in the selected global Harness runtime under `Harness/settings.json`.
|
|
24
|
+
- Host-global settings are copied, not symlinked, into Claude Code, Codex, and OpenCode user config directories.
|
|
25
|
+
- Settings and memory must never store secrets; use external secret stores or environment variables.
|
|
26
|
+
- Existing user-authored config, command, skill, or agent files are user-owned unless they carry a Harness ownership marker.
|
|
27
|
+
|
|
13
28
|
## When To Write Memory
|
|
14
29
|
|
|
15
30
|
Write memory when any condition applies:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
# TASK_ARCHIVE
|
|
1
|
+
# TASK_ARCHIVE - Task Archive Mechanism
|
|
2
2
|
|
|
3
|
-
Purpose: keep `Harness/tasks/` lean by archiving completed/abandoned tasks while
|
|
3
|
+
Purpose: keep `Harness/tasks/` lean by archiving completed/abandoned tasks while
|
|
4
|
+
preserving all evidence.
|
|
4
5
|
|
|
5
6
|
## Archive Location
|
|
6
7
|
|
|
@@ -9,44 +10,68 @@ Archived tasks move to `Harness/tasks/_archive/YYYY/<task-id>/`.
|
|
|
9
10
|
|
|
10
11
|
## What Is Never Archived
|
|
11
12
|
|
|
12
|
-
- `Harness/tasks/_template/`
|
|
13
|
-
- `Harness/tasks/auto/`
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
13
|
+
- `Harness/tasks/_template/` - scaffold template, never moved.
|
|
14
|
+
- `Harness/tasks/auto/` - WF-AUTO permanent state capsule, never moved unless
|
|
15
|
+
explicitly allowed by WF-AUTO docs.
|
|
16
|
+
- `Harness/tasks/_archive/` - the archive directory itself.
|
|
17
|
+
- Active, blocked, in-progress, running, pending, or needs-user-decision tasks.
|
|
18
|
+
- Tasks whose STATE.json status is `active`, `blocked`, `in_progress`,
|
|
19
|
+
`running`, `pending`, or `needs-user-decision`.
|
|
17
20
|
|
|
18
21
|
## What May Be Archived
|
|
19
22
|
|
|
20
|
-
Tasks whose STATE.json or
|
|
23
|
+
Tasks whose STATE.json or reconciled phase is: `complete`, `verified`,
|
|
24
|
+
`archived`, `abandoned`, `obsolete`, `done`, `closed`, or `closeout`.
|
|
21
25
|
|
|
22
|
-
|
|
26
|
+
`Harness/scripts/task-state.mjs` reads STATE.json `status`/`phase` first, then
|
|
27
|
+
uses root/task PROGRESS phases only as reconciliation evidence. Missing or
|
|
28
|
+
invalid STATE.json is skipped until
|
|
29
|
+
`node Harness/scripts/task-state.mjs reconcile --apply` creates or repairs
|
|
30
|
+
machine state.
|
|
23
31
|
|
|
24
32
|
## Archive Process
|
|
25
33
|
|
|
26
|
-
1. Verify the task is not active/blocked.
|
|
34
|
+
1. Verify the task is not active/blocked/running/pending.
|
|
27
35
|
2. Ensure `Harness/tasks/_archive/YYYY/` exists.
|
|
28
|
-
3. Move `Harness/tasks/<task-id>/`
|
|
29
|
-
|
|
36
|
+
3. Move `Harness/tasks/<task-id>/` to
|
|
37
|
+
`Harness/tasks/_archive/YYYY/<task-id>/`.
|
|
38
|
+
4. Update the moved STATE.json: `status` to `archived`, `phase` to `archived`.
|
|
30
39
|
5. Update `Harness/tasks/_archive/INDEX.md`.
|
|
31
|
-
6.
|
|
40
|
+
6. Rewrite `Harness/PROGRESS.md` Task Index from the remaining non-archived
|
|
41
|
+
task capsules.
|
|
32
42
|
|
|
33
43
|
## Retention
|
|
34
44
|
|
|
35
45
|
- Archived tasks retain: PLAN, PROGRESS, STATE, ARTIFACTS, NOTES.
|
|
36
46
|
- Do NOT delete historical evidence.
|
|
37
|
-
- `Harness/PROGRESS.md` keeps the last 5 non-archived task entries in the Task
|
|
38
|
-
|
|
39
|
-
-
|
|
47
|
+
- `Harness/PROGRESS.md` keeps the last 5 non-archived task entries in the Task
|
|
48
|
+
Index.
|
|
49
|
+
- When outer task capsules exceed 5 completed/abandoned/obsolete tasks, remind
|
|
50
|
+
the user to run the task archive command. Do not auto-archive during unrelated
|
|
51
|
+
validation or closeout unless the user explicitly invokes archive apply mode.
|
|
52
|
+
- The validator (`Harness/scripts/validate-harness.mjs`) warns when
|
|
53
|
+
`Harness/tasks/` holds more than 5 outer task capsules (excluding `_archive`,
|
|
54
|
+
`_template`, `auto`) and fails in `--strict` mode.
|
|
40
55
|
|
|
41
56
|
## Script
|
|
42
57
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
58
|
+
User-facing command:
|
|
59
|
+
|
|
60
|
+
- Codex: `$wf-task-archive` or `/skills wf-task-archive`.
|
|
61
|
+
- Claude Code/OpenCode: `/wf-task-archive`.
|
|
62
|
+
|
|
63
|
+
Underlying implementation: `Harness/scripts/task-state.mjs archive`.
|
|
64
|
+
|
|
65
|
+
- Default: dry-run.
|
|
66
|
+
- `--apply` to execute.
|
|
67
|
+
- `--keep 5` to set the non-archived task threshold.
|
|
68
|
+
- `--task <task-id>` to archive a specific task.
|
|
69
|
+
- `--json` for machine-readable output.
|
|
70
|
+
- Run `node Harness/scripts/task-state.mjs archive --dry-run --json` before
|
|
71
|
+
applying a risky cleanup.
|
|
72
|
+
|
|
73
|
+
Compatibility entry: `Harness/scripts/archive-tasks.mjs` delegates to
|
|
74
|
+
`task-state.mjs archive` and accepts the same archive flags.
|
|
50
75
|
|
|
51
76
|
## Safety Rules
|
|
52
77
|
|
|
@@ -54,3 +79,4 @@ Use `Harness/scripts/archive-tasks.mjs`:
|
|
|
54
79
|
- Confirm target is within `Harness/tasks/` before any move.
|
|
55
80
|
- Do NOT recursively delete.
|
|
56
81
|
- Tasks with `needs-user-decision` status are never auto-archived.
|
|
82
|
+
- Missing or invalid STATE.json is never archived without reconciliation.
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"commands": [
|
|
4
|
+
{
|
|
5
|
+
"id": "wf-help",
|
|
6
|
+
"classification": "direct",
|
|
7
|
+
"aliases": ["/wf-help", "$wf-help", "/skills wf-help"],
|
|
8
|
+
"entersWf": false,
|
|
9
|
+
"taskCapsulePolicy": "none",
|
|
10
|
+
"surfaces": {
|
|
11
|
+
"claudeCommand": true,
|
|
12
|
+
"opencodeCommand": true,
|
|
13
|
+
"claudeSkill": true,
|
|
14
|
+
"codexSkill": true,
|
|
15
|
+
"helpRow": true
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "wf",
|
|
20
|
+
"classification": "workflow",
|
|
21
|
+
"aliases": ["/wf", "$wf", "/skills wf"],
|
|
22
|
+
"entersWf": true,
|
|
23
|
+
"taskCapsulePolicy": "required",
|
|
24
|
+
"surfaces": {
|
|
25
|
+
"claudeCommand": true,
|
|
26
|
+
"opencodeCommand": true,
|
|
27
|
+
"claudeSkill": true,
|
|
28
|
+
"codexSkill": true,
|
|
29
|
+
"helpRow": true
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "wf-max",
|
|
34
|
+
"classification": "workflow",
|
|
35
|
+
"aliases": ["/wf-max", "$wf-max", "/skills wf-max"],
|
|
36
|
+
"entersWf": true,
|
|
37
|
+
"taskCapsulePolicy": "required",
|
|
38
|
+
"surfaces": {
|
|
39
|
+
"claudeCommand": true,
|
|
40
|
+
"opencodeCommand": true,
|
|
41
|
+
"claudeSkill": true,
|
|
42
|
+
"codexSkill": true,
|
|
43
|
+
"helpRow": true
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "wf-auto",
|
|
48
|
+
"classification": "workflow",
|
|
49
|
+
"aliases": ["/wf-auto", "$wf-auto", "/skills wf-auto"],
|
|
50
|
+
"entersWf": true,
|
|
51
|
+
"taskCapsulePolicy": "auto-capsule-required",
|
|
52
|
+
"surfaces": {
|
|
53
|
+
"claudeCommand": true,
|
|
54
|
+
"opencodeCommand": true,
|
|
55
|
+
"claudeSkill": true,
|
|
56
|
+
"codexSkill": true,
|
|
57
|
+
"helpRow": true
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": "wf-auto-spark",
|
|
62
|
+
"classification": "workflow",
|
|
63
|
+
"aliases": ["/wf-auto-spark", "$wf-auto-spark", "/skills wf-auto-spark"],
|
|
64
|
+
"entersWf": true,
|
|
65
|
+
"taskCapsulePolicy": "auto-capsule-required",
|
|
66
|
+
"surfaces": {
|
|
67
|
+
"claudeCommand": true,
|
|
68
|
+
"opencodeCommand": true,
|
|
69
|
+
"claudeSkill": true,
|
|
70
|
+
"codexSkill": true,
|
|
71
|
+
"helpRow": true
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "wf-review",
|
|
76
|
+
"classification": "workflow",
|
|
77
|
+
"aliases": ["/wf-review", "$wf-review", "/skills wf-review"],
|
|
78
|
+
"entersWf": true,
|
|
79
|
+
"taskCapsulePolicy": "use-current-or-create-when-needed",
|
|
80
|
+
"surfaces": {
|
|
81
|
+
"claudeCommand": true,
|
|
82
|
+
"opencodeCommand": true,
|
|
83
|
+
"claudeSkill": true,
|
|
84
|
+
"codexSkill": true,
|
|
85
|
+
"helpRow": true
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "wf-learn",
|
|
90
|
+
"classification": "workflow",
|
|
91
|
+
"aliases": ["/wf-learn", "$wf-learn", "/skills wf-learn"],
|
|
92
|
+
"entersWf": true,
|
|
93
|
+
"taskCapsulePolicy": "use-current-or-create-when-needed",
|
|
94
|
+
"surfaces": {
|
|
95
|
+
"claudeCommand": true,
|
|
96
|
+
"opencodeCommand": true,
|
|
97
|
+
"claudeSkill": true,
|
|
98
|
+
"codexSkill": true,
|
|
99
|
+
"helpRow": true
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"id": "wf-browser",
|
|
104
|
+
"classification": "workflow",
|
|
105
|
+
"aliases": ["/wf-browser", "$wf-browser", "/skills wf-browser"],
|
|
106
|
+
"entersWf": true,
|
|
107
|
+
"taskCapsulePolicy": "required",
|
|
108
|
+
"surfaces": {
|
|
109
|
+
"claudeCommand": true,
|
|
110
|
+
"opencodeCommand": true,
|
|
111
|
+
"claudeSkill": true,
|
|
112
|
+
"codexSkill": true,
|
|
113
|
+
"helpRow": true
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"id": "wf-readme",
|
|
118
|
+
"classification": "workflow",
|
|
119
|
+
"aliases": ["/wf-readme", "$wf-readme", "/skills wf-readme"],
|
|
120
|
+
"entersWf": true,
|
|
121
|
+
"taskCapsulePolicy": "required",
|
|
122
|
+
"surfaces": {
|
|
123
|
+
"claudeCommand": true,
|
|
124
|
+
"opencodeCommand": true,
|
|
125
|
+
"claudeSkill": true,
|
|
126
|
+
"codexSkill": true,
|
|
127
|
+
"helpRow": true
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "wf-update",
|
|
132
|
+
"classification": "direct",
|
|
133
|
+
"aliases": ["/wf-update", "$wf-update", "/skills wf-update"],
|
|
134
|
+
"entersWf": false,
|
|
135
|
+
"taskCapsulePolicy": "none",
|
|
136
|
+
"surfaces": {
|
|
137
|
+
"claudeCommand": true,
|
|
138
|
+
"opencodeCommand": true,
|
|
139
|
+
"claudeSkill": true,
|
|
140
|
+
"codexSkill": true,
|
|
141
|
+
"helpRow": true
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id": "wf-remove",
|
|
146
|
+
"classification": "workflow",
|
|
147
|
+
"aliases": ["/wf-remove", "$wf-remove", "/skills wf-remove"],
|
|
148
|
+
"entersWf": true,
|
|
149
|
+
"taskCapsulePolicy": "required",
|
|
150
|
+
"surfaces": {
|
|
151
|
+
"claudeCommand": true,
|
|
152
|
+
"opencodeCommand": true,
|
|
153
|
+
"claudeSkill": true,
|
|
154
|
+
"codexSkill": true,
|
|
155
|
+
"helpRow": true
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "wf-task-record",
|
|
160
|
+
"classification": "direct",
|
|
161
|
+
"aliases": ["/wf-task-record", "$wf-task-record", "/skills wf-task-record"],
|
|
162
|
+
"entersWf": false,
|
|
163
|
+
"taskCapsulePolicy": "creates-or-updates",
|
|
164
|
+
"surfaces": {
|
|
165
|
+
"claudeCommand": true,
|
|
166
|
+
"opencodeCommand": true,
|
|
167
|
+
"claudeSkill": true,
|
|
168
|
+
"codexSkill": true,
|
|
169
|
+
"helpRow": true
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"id": "wf-task-list",
|
|
174
|
+
"classification": "direct",
|
|
175
|
+
"aliases": ["/wf-task-list", "$wf-task-list", "/skills wf-task-list"],
|
|
176
|
+
"entersWf": false,
|
|
177
|
+
"taskCapsulePolicy": "none",
|
|
178
|
+
"surfaces": {
|
|
179
|
+
"claudeCommand": true,
|
|
180
|
+
"opencodeCommand": true,
|
|
181
|
+
"claudeSkill": true,
|
|
182
|
+
"codexSkill": true,
|
|
183
|
+
"helpRow": true
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"id": "wf-task-archive",
|
|
188
|
+
"classification": "direct",
|
|
189
|
+
"aliases": ["/wf-task-archive", "$wf-task-archive", "/skills wf-task-archive"],
|
|
190
|
+
"entersWf": false,
|
|
191
|
+
"taskCapsulePolicy": "none",
|
|
192
|
+
"surfaces": {
|
|
193
|
+
"claudeCommand": true,
|
|
194
|
+
"opencodeCommand": true,
|
|
195
|
+
"claudeSkill": true,
|
|
196
|
+
"codexSkill": true,
|
|
197
|
+
"helpRow": true
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"id": "wf-command-create",
|
|
202
|
+
"classification": "direct",
|
|
203
|
+
"aliases": ["/wf-command-create", "$wf-command-create", "/skills wf-command-create"],
|
|
204
|
+
"entersWf": false,
|
|
205
|
+
"taskCapsulePolicy": "required",
|
|
206
|
+
"surfaces": {
|
|
207
|
+
"claudeCommand": true,
|
|
208
|
+
"opencodeCommand": true,
|
|
209
|
+
"claudeSkill": true,
|
|
210
|
+
"codexSkill": true,
|
|
211
|
+
"helpRow": true
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
}
|
|
@@ -13,7 +13,7 @@ Use when work needs parallel reading, independent review, cross-layer analysis,
|
|
|
13
13
|
- Important assumptions, decisions, blockers, evidence, and handoffs must be written to `Harness/tasks/<task-id>/PROGRESS.md` and `Harness/tasks/<task-id>/PLAN.md`, the current feature doc, `Harness/MEMORY.md`, or `Harness/memory/*` as appropriate.
|
|
14
14
|
- Resumable state is governed by [WF-STATE.md](../workflows/WF-STATE.md). On session start, the controller reads STATE.json before building a fresh dispatch table.
|
|
15
15
|
- PRD-derived Acceptance Criteria are the source of truth. Dispatch packets must carry the relevant AC IDs and contracts.
|
|
16
|
-
- Agent count: default (non-WF) <=3 active agents; `/wf` selects a tier dynamically per [WF-KERNEL.md](../workflows/WF-KERNEL.md) (Light/Standard/Full); `/wf-max` inherits the selected tier and adds maximum safe fan-out (WF-Max-Useful default; WF-Max-Strict explicit only), removing the Harness default cap through the span formula. Real concurrency is still bounded by runtime thread budget, config, billing, and local resources. Use current runtime subagents first, close completed agents, then peer-CLI overflow (`claude -p`, `codex exec`, or `opencode run --agent <role> --dir .`).
|
|
16
|
+
- Agent count: default (non-WF) <=3 active agents; `/wf` selects a tier dynamically per [WF-KERNEL.md](../workflows/WF-KERNEL.md) (Light/Standard/Full); `/wf-max` inherits the selected tier and adds maximum safe fan-out (WF-Max-Useful default; WF-Max-Strict explicit only), removing the Harness default cap through the span formula. WF-MAX must attempt native subagent fan-out and record `fanoutAttempted: true` before any solo fallback. Real concurrency is still bounded by runtime thread budget, config, billing, and local resources. Use current runtime subagents first, close completed agents, then peer-CLI overflow (`claude -p`, `codex exec`, or `opencode run --agent <role> --dir .`). Do not scaffold Codex scalar `[agents]` capacity fields into project `.codex/config.toml`; probe the installed runtime and manage Codex caps through the dispatch ledger unless the installed version accepts the config shape. Generated OpenCode config defaults to `subagent_depth = 2` for manager -> worker nesting. See [WF.md](../workflows/WF.md) and [WF-MAX.md](../workflows/WF-MAX.md).
|
|
17
17
|
- Read-only agents may run in parallel.
|
|
18
18
|
- Writing agents run serially unless write sets are disjoint.
|
|
19
19
|
- Use a worktree when two agents may touch overlapping files or long-running branches.
|
|
@@ -68,7 +68,7 @@ Objective: <one-sentence goal>
|
|
|
68
68
|
TaskType: ui-browser | api-backend | architecture-migration | docs-readme | dependency-sdk | bug-fix | refactor | chore
|
|
69
69
|
ModelTier: small-fast | standard | high-reasoning
|
|
70
70
|
AgentName: <the agent file name, e.g. task-scribe, codebase-explorer, implementer>
|
|
71
|
-
Skills: <which skills to activate, e.g. tdd, browser
|
|
71
|
+
Skills: <which skills to activate, e.g. tdd, wf-browser>
|
|
72
72
|
ECC: <which ECC rules to load, e.g. web/design-quality.md, python/fastapi.md>
|
|
73
73
|
PRD: <path or task PLAN section containing Mini PRD>
|
|
74
74
|
Acceptance IDs: <AC-001, AC-002, or "none" for non-behavioral work>
|
|
@@ -130,11 +130,15 @@ Max parallelism removes the Harness default cap, not the runtime's physical or
|
|
|
130
130
|
account cap. For WF-MAX, record the current runtime budget, use native
|
|
131
131
|
subagents first, close completed agents before declaring the pool exhausted,
|
|
132
132
|
then overflow to a peer CLI (`claude -p`, `codex exec`, or `opencode run --agent <role> --dir .`) with explicit
|
|
133
|
-
dispatch packets.
|
|
134
|
-
`
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
133
|
+
dispatch packets. WF-MAX must attempt native subagent fan-out and record
|
|
134
|
+
`fanoutAttempted: true` before any solo fallback. Do not scaffold Codex scalar
|
|
135
|
+
`[agents]` capacity fields into `.codex/config.toml`; codex-cli 0.144.x can
|
|
136
|
+
reject them during TUI `skills/list`. Probe the installed runtime first and
|
|
137
|
+
manage Codex WF-MAX caps through the dispatch ledger unless the installed
|
|
138
|
+
version accepts the config shape. Generated OpenCode config defaults to
|
|
139
|
+
`subagent_depth = 2` so manager subagents can invoke worker subagents; manager
|
|
140
|
+
agents also need `permission.task` allowlists. Do not rely on undocumented
|
|
141
|
+
fork/derive bypasses as stable capacity.
|
|
138
142
|
|
|
139
143
|
Default for explicit WF invocation: tier-based. WF-Light: planner + test-writer + implementer + verifier (bounded passes acceptable). WF-Standard: adds research/docs + one independent review lens. WF-Full: complete role chain, use bounded role passes as the recorded fallback when subagents are unavailable.
|
|
140
144
|
|
|
@@ -204,6 +208,12 @@ independent same-runtime subagent context; for broad WF-MAX review, dispatch
|
|
|
204
208
|
agents report suggestions only. The controller accepts, rejects, or escalates
|
|
205
209
|
each finding and owns the final decision.
|
|
206
210
|
|
|
211
|
+
### OpenCode Reviewer Caveat
|
|
212
|
+
|
|
213
|
+
`opencode run --agent reviewer`: current installed `.opencode/agents/reviewer.md`
|
|
214
|
+
is `mode: subagent`; OpenCode falls back to the default agent. Probe before
|
|
215
|
+
claiming primary-runner review. Prefer same-runtime reviewer subagent fallback.
|
|
216
|
+
|
|
207
217
|
## Subagent Status Handling
|
|
208
218
|
|
|
209
219
|
| Status | Controller Action |
|
|
@@ -296,11 +296,11 @@ Every cycle writes one entry to `Harness/tasks/auto/PROGRESS.md`:
|
|
|
296
296
|
|
|
297
297
|
IMMEDIATELY return to W0. No pause between cycles — the only breaks are the adaptive Intent Checkpoint and the A-GATE.
|
|
298
298
|
|
|
299
|
-
###
|
|
299
|
+
### Runtime Hook Boundaries
|
|
300
300
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
auto-optimization.
|
|
301
|
+
Execution-control hooks are disabled by default across the Harness scaffold.
|
|
302
|
+
Startup update-check hooks are not execution-control hooks. Only an explicitly
|
|
303
|
+
enabled `/wf-auto` tick hook may drive long-running auto-optimization.
|
|
304
304
|
|
|
305
305
|
Manual or benchmark-driven single-cycle `/wf-auto` runs use the same bounded
|
|
306
306
|
tick contract: they may stop because the caller explicitly requested one tick,
|
|
@@ -321,8 +321,8 @@ wf-auto hook event
|
|
|
321
321
|
|
|
322
322
|
Hard boundaries:
|
|
323
323
|
|
|
324
|
-
- no hook is installed or registered by default
|
|
325
|
-
- only `/wf-auto` may use a runtime hook
|
|
324
|
+
- no execution-control hook is installed or registered by default
|
|
325
|
+
- only `/wf-auto` may use a runtime hook to drive auto-optimization
|
|
326
326
|
- the hook must run one bounded tick, not an unbounded process
|
|
327
327
|
- the hook must respect `Harness/tasks/auto/STOP`, `state=paused`, user stop,
|
|
328
328
|
and the Adaptive Coverage Exhaustion Gate
|
|
@@ -131,7 +131,7 @@ ReturnSchema:
|
|
|
131
131
|
|
|
132
132
|
| Task Type | Primary Agents | Skills |
|
|
133
133
|
|---|---|---|
|
|
134
|
-
| UI/browser behavior | test-writer, implementer, verifier, reviewer |
|
|
134
|
+
| UI/browser behavior | test-writer, implementer, verifier, reviewer | wf-browser |
|
|
135
135
|
| API/backend | docs-researcher, test-writer, implementer, verifier, reviewer (security) | tdd |
|
|
136
136
|
| Architecture/migration | architect, codebase-explorer, planner, reviewer | — |
|
|
137
137
|
| Docs/README | wf-readme, reviewer, task-scribe | wf-readme |
|