create-harness-vibe-coding 0.8.6 → 0.8.8

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.
Files changed (93) hide show
  1. package/README-CN.md +157 -105
  2. package/README.md +160 -244
  3. package/bin/create-harness-vibe-coding.js +2 -2
  4. package/docs/images/harness-architecture-light.png +0 -0
  5. package/docs/images/harness-architecture.drawio +164 -0
  6. package/package.json +46 -44
  7. package/src/generator.js +30 -11
  8. package/src/index.js +143 -14
  9. package/src/prompts.js +37 -37
  10. package/templates/common/.claude/agents/architect-manager.md +45 -45
  11. package/templates/common/.claude/agents/context-master.md +75 -75
  12. package/templates/common/.claude/agents/debugger.md +41 -41
  13. package/templates/common/.claude/agents/explore-manager.md +41 -41
  14. package/templates/common/.claude/agents/implement-manager.md +49 -49
  15. package/templates/common/.claude/agents/implementer.md +40 -40
  16. package/templates/common/.claude/agents/memory-master.md +64 -64
  17. package/templates/common/.claude/agents/planner.md +34 -34
  18. package/templates/common/.claude/agents/reflector.md +35 -0
  19. package/templates/common/.claude/agents/researcher.md +41 -41
  20. package/templates/common/.claude/agents/review-manager.md +56 -56
  21. package/templates/common/.claude/agents/verifier.md +34 -32
  22. package/templates/common/.claude/commands/wf-help.md +2 -3
  23. package/templates/common/.claude/rules/ecc/common.md +44 -44
  24. package/templates/common/.claude/skills/subagent-orchestrator/SKILL.md +10 -4
  25. package/templates/common/.claude/skills/wf/SKILL.md +7 -3
  26. package/templates/common/.claude/skills/wf-auto/SKILL.md +61 -107
  27. package/templates/common/.claude/skills/wf-auto-spark/SKILL.md +19 -17
  28. package/templates/common/.claude/skills/wf-max/SKILL.md +40 -21
  29. package/templates/common/.claude/skills/wf-readme/SKILL.md +49 -49
  30. package/templates/common/.claude/skills/wf-remove/SKILL.md +7 -7
  31. package/templates/common/.claude/skills/wf-update/SKILL.md +9 -4
  32. package/templates/common/.codex/config.toml +5 -0
  33. package/templates/common/.harness-version +78 -36
  34. package/templates/common/.opencode/agents/architect-manager.md +52 -0
  35. package/templates/common/.opencode/agents/architect.md +35 -0
  36. package/templates/common/.opencode/agents/context-master.md +81 -0
  37. package/templates/common/.opencode/agents/debugger.md +43 -0
  38. package/templates/common/.opencode/agents/docs-researcher.md +42 -0
  39. package/templates/common/.opencode/agents/explore-manager.md +49 -0
  40. package/templates/common/.opencode/agents/implement-manager.md +56 -0
  41. package/templates/common/.opencode/agents/implementer.md +42 -0
  42. package/templates/common/.opencode/agents/memory-master.md +70 -0
  43. package/templates/common/.opencode/agents/planner.md +38 -0
  44. package/templates/common/.opencode/agents/reflector.md +39 -0
  45. package/templates/common/.opencode/agents/researcher.md +42 -0
  46. package/templates/common/.opencode/agents/review-manager.md +63 -0
  47. package/templates/common/.opencode/agents/reviewer.md +37 -0
  48. package/templates/common/.opencode/agents/tdd-guide.md +83 -0
  49. package/templates/common/.opencode/agents/test-writer.md +54 -0
  50. package/templates/common/.opencode/agents/verifier.md +37 -0
  51. package/templates/common/.opencode/commands/wf-help.md +23 -0
  52. package/templates/common/AGENTS.md +26 -25
  53. package/templates/common/CLAUDE.md +86 -88
  54. package/templates/common/Harness/ACCEPTANCE_PROTOCOL.md +12 -4
  55. package/templates/common/Harness/PROGRESS.md +17 -17
  56. package/templates/common/Harness/README.md +26 -16
  57. package/templates/common/Harness/WF-AUTO-ANGLES.md +170 -0
  58. package/templates/common/Harness/WF-AUTO-SPARK.md +23 -6
  59. package/templates/common/Harness/WF-AUTO.md +508 -493
  60. package/templates/common/Harness/WF-MAX.md +284 -232
  61. package/templates/common/Harness/WF.md +47 -29
  62. package/templates/common/Harness/agent-workflow.md +108 -76
  63. package/templates/common/Harness/architecture.md +124 -124
  64. package/templates/common/Harness/context-loading.md +111 -111
  65. package/templates/common/Harness/dispatch.md +96 -95
  66. package/templates/common/Harness/extension.md +67 -67
  67. package/templates/common/Harness/lifecycle.md +20 -20
  68. package/templates/common/Harness/research/PRD.md +56 -56
  69. package/templates/common/Harness/research/README.md +169 -169
  70. package/templates/common/Harness/research/research-results.md +66 -66
  71. package/templates/common/Harness/subagents.md +192 -170
  72. package/templates/common/Harness/tasks/_template/ARTIFACTS.md +3 -3
  73. package/templates/common/Harness/tasks/_template/NOTES.md +3 -3
  74. package/templates/common/Harness/tasks/_template/PLAN.md +53 -60
  75. package/templates/common/Harness/tasks/_template/PROGRESS.md +26 -29
  76. package/templates/common/MEMORY.md +27 -30
  77. package/templates/common/README.md +36 -36
  78. package/templates/common/SETUP.md +1 -1
  79. package/templates/common/memory/agent-lessons-patterns.md +21 -21
  80. package/templates/common/memory/tool-usage-reflections.md +21 -21
  81. package/templates/common/memory/user-corrections-preferences.md +21 -21
  82. package/templates/common/opencode.json +19 -0
  83. package/templates/common/scripts/scan-clean.mjs +487 -448
  84. package/templates/common/scripts/validate-harness.mjs +245 -146
  85. package/templates/common/scripts/wf-remove.mjs +311 -293
  86. package/templates/common/scripts/wf-update-check.mjs +511 -311
  87. package/templates/optional/catalog.json +41 -33
  88. package/templates/optional/skills/browser-e2e/.claude/skills/wf-browser/SKILL.md +194 -194
  89. package/templates/optional/skills/browser-e2e/Harness/workflows/browser-e2e.md +105 -69
  90. package/templates/optional/skills/github-pr-review/Harness/workflows/github-pr-review.md +28 -28
  91. package/templates/optional/skills/python-backend/Harness/workflows/python-backend.md +34 -34
  92. package/templates/optional/skills/ts-react-frontend/Harness/workflows/ts-react-frontend.md +34 -34
  93. package/templates/optional/skills/ui-ux-review/Harness/workflows/ui-ux-review.md +26 -26
package/README.md CHANGED
@@ -1,272 +1,188 @@
1
- <p align="center">
2
- <img src="https://img.shields.io/npm/v/create-harness-vibe-coding?color=blue" alt="npm">
3
- <img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen" alt="node">
4
- <img src="https://img.shields.io/npm/l/create-harness-vibe-coding" alt="license">
5
- <img src="https://img.shields.io/github/stars/zingspark/create-harness-vibe-coding?style=social" alt="stars">
6
- </p>
7
-
8
- <h1 align="center">create-harness-vibe-coding</h1>
9
- <p align="center">
10
- <b>A harness for your AI agent. One scaffold. Zero drift.</b><br>
11
- </p>
12
-
13
- ## One Command. Done.
14
-
15
- ```bash
16
- npx create-harness-vibe-coding@latest my-project
17
- ```
18
-
19
- ## Your Agent Knows What to Do
20
-
21
- Already have a project? Paste this sentence. Your agent should use the script-first fast path: dry-run JSON first, read only files named in `agent.aiMergeRequired`, then run the structural validator.
22
-
23
- ```text
24
- Read and follow https://github.com/zingspark/create-harness-vibe-coding exactly to configure this project with create-harness-vibe-coding.
25
- ```
26
-
27
- That's it. Two paths into the harness — you type `npx`, or your agent reads the sentence.
28
-
29
- Chinese README: [README-CN.md](README-CN.md)
30
-
31
- ---
32
-
33
- ## What You Get
34
-
35
- | You get | So your agent |
36
- |---------|---------------|
37
- | `CLAUDE.md` + `Harness/README.md` | Starts with a router, not a novel |
38
- | `Harness/tasks/` + `Harness/PROGRESS.md` | Tracks work across sessions |
39
- | `/wf` / `$wf` workflow + heartbeat | Finishes long tasks without getting lost |
40
- | `/wf-update` / `$wf-update` | Pulls scaffold fixes from GitHub |
41
- | `subagent-orchestrator` | Runs parallel agents without collision |
42
- | `memory-master` + `context-master` | Learns from failures, compresses when full |
43
- | PRD + Research templates | Asks "what" and "why" before coding |
44
- | 16 built-in agents | Research, plan, architecture, TDD, build, review, debug, verify, memory/context, WF-MAX managers |
45
- | Architecture docs | Knows where boundaries live |
46
- | Context-loading protocol | Loads only the docs each agent needs |
47
- | `.claude/` + `.agents/skills/` | Claude Code and Codex skill adapters over the same Harness docs |
48
-
49
- ---
50
-
51
- ## Why This Exists
52
-
53
- Most AI coding projects fail before anyone writes a line of bad code. The agent jumps straight to implementation, drifts from intent, forgets yesterday's decisions, and bloats its context with the whole repo.
54
-
55
- | Without harness | With harness |
56
- |-----------------|--------------|
57
- | Idea → code. Hope. | Idea → Research → PRD → Architecture → Build → Verify |
58
- | Agent reads everything | Router loads the one doc it needs |
59
- | Subagent gets a vague "fix it" | Context pack: role, boundary, return format |
60
- | Drift invisible until demo | Validator flags missing pieces |
61
- | Long task stalls, context explodes | `/wf` heartbeat + recovery loop |
62
- | Scaffold rots | `/wf-update` or `$wf-update` pulls latest from GitHub |
63
-
64
- ---
65
-
66
- ## How It Works
67
-
68
- ```text
69
- npx create-harness-vibe-coding@latest my-project
70
-
71
- Agent reads Harness/SETUP.md
72
-
73
- Router loads only what the task needs
74
-
75
- PRD → Research → Architecture → first task capsule
76
-
77
- Build → Test → Review → Verify → Feedback
78
-
79
- /wf-update or $wf-update keeps the harness current
80
- ```
81
-
82
- ```mermaid
83
- graph TD
84
- A[ /wf Enter ] --> B[ Explore: 3+ parallel agents ]
85
- B --> C[ Second Plan ]
86
- C --> D[ Build: test → implement ]
87
- D --> E[ Dual-Gate Review ]
88
- E --> F{ Pass? }
89
- F -->| No | G[ Debug → Fix → Loop ]
90
- G --> E
91
- F -->| Yes | H[ Closeout: memory + context ]
92
- H --> I[ /wf-update or $wf-update ]
93
- ```
94
-
95
- ---
96
-
97
- ## Usage
98
-
99
- ### New project
100
-
101
- ```bash
102
- npx create-harness-vibe-coding@latest my-project
103
- cd my-project
104
- # Your agent reads Harness/SETUP.md. Done.
105
- ```
106
-
107
- ### Install or Upgrade Path
108
-
109
- Before writing, the agent must identify which path applies:
110
-
111
- | Project state | Required action |
112
- |---------------|-----------------|
113
- | Empty or new project | Run the scaffold, then follow `Harness/SETUP.md` for 0-1 bootstrap |
114
- | Existing project, no `Harness/` | Scan project facts first, run `--dry-run`, preserve existing files, merge only missing Harness guidance |
115
- | Legacy architecture or older project docs | Treat existing code/docs as source of truth, dry-run first, then use `Harness/SETUP.md` to fill facts from observed project reality |
116
- | Existing `Harness/` | Do not use `npx` as an updater; ask whether to run `/wf-update`, `$wf-update`, `node Harness/scripts/wf-update-check.mjs`, keep untouched, or remove/reinstall after approval |
117
-
118
- Root scan must include top-level files, `CLAUDE.md`, `AGENTS.md`, `.claude/`, `.agents/`, `.codex/`, `Harness/`, package files, CI files, app entry points, test/build commands, existing docs, and already-installed skills/plugins/rules. Use that scan before recommending optional capabilities so you do not suggest duplicates.
119
-
120
- ### Existing project — safe merge
1
+ <p align="center">
2
+ <img src="https://img.shields.io/npm/v/create-harness-vibe-coding?color=blue" alt="npm version">
3
+ <img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen" alt="Node.js >= 18">
4
+ <img src="https://img.shields.io/npm/l/create-harness-vibe-coding" alt="MIT license">
5
+ <img src="https://img.shields.io/github/stars/zingspark/create-harness-vibe-coding?style=social" alt="GitHub stars">
6
+ </p>
121
7
 
122
- ```bash
123
- # Machine-readable preview first. Always.
124
- npx create-harness-vibe-coding@latest my-app . -y --dry-run --json
8
+ <h1 align="center">create-harness-vibe-coding</h1>
9
+ <p align="center">
10
+ <b>An operating contract for reliable AI coding agents.</b><br>
11
+ <sub>Goals. Context. Loops. Evidence.</sub>
12
+ </p>
125
13
 
126
- # Add only what's missing. Never overwrite.
127
- npx create-harness-vibe-coding@latest my-app . -y --on-conflict skip --json
14
+ `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.
128
15
 
129
- # Install-complete structural gate.
130
- node Harness/scripts/validate-harness.mjs
16
+ 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.
17
+
18
+ ## The short version
19
+
20
+ Without a framework:
21
+
22
+ ```text
23
+ Idea → prompt → patch → demo → rediscover context → repair drift
131
24
  ```
132
25
 
133
- The JSON output is the agent's install report: `scan` replaces hand-written root probes, `plan.create` is script-owned, and `agent.aiMergeRequired` is the only list that needs semantic AI review. Do not read package source or templates unless `agent.aiMergeRequired` names a conflicting file.
134
-
135
- For existing projects, a passing non-strict validator is the install-complete gate. `--strict` is the bootstrap/release gate and may fail until PRD, research, and architecture placeholders have been resolved from real project facts.
136
-
137
- `npx` is an install and safe-merge entry, not an update engine for an already installed Harness. Once `Harness/` exists, use `/wf-update` in Claude Code, `$wf-update` in Codex, or `node Harness/scripts/wf-update-check.mjs`; root entry conflicts such as `CLAUDE.md`, `AGENTS.md`, `.claude/`, `.agents/`, `.codex/`, and local Harness docs need agent-mediated merge decisions.
138
-
139
- | Flag | Does |
140
- |------|------|
141
- | `-y` | Skip prompts |
142
- | `--dry-run` | Preview — no writes |
143
- | `--on-conflict skip` | Keep your files, add only new ones |
144
- | `--on-conflict backup` | Rename existing → write new |
145
- | `--on-conflict overwrite` | Replace (destructive) |
146
- | `--list-options` | Show optional workflows |
147
- | `--with <ids>` | Add workflow by id |
148
- | `--recommend <ids>` | Record recommendation-only external capabilities |
149
- | `--preset <name>` | Add `web-app` or `fullstack` preset |
150
-
151
- Without `-y`, interactive mode offers checkbox selection for optional workflows and external recommendations.
152
-
153
- ### Optional workflows
154
-
155
- ```bash
156
- npx create-harness-vibe-coding@latest my-app -y --with browser-e2e
157
- npx create-harness-vibe-coding@latest my-app -y --preset web-app
158
- npx create-harness-vibe-coding@latest my-app -y --recommend superpowers,codegraph
26
+ With Harness:
27
+
28
+ ```text
29
+ Idea → Research → PRD → Architecture → Acceptance Criteria
30
+ Build Test Review Verify Learn Update
159
31
  ```
160
-
161
- | Workflow | For |
162
- |----------|-----|
163
- | `browser-e2e` | Screenshots, traces, smoke tests |
164
- | `ui-ux-review` | Responsive, a11y, polish |
165
- | `ts-react-frontend` | TypeScript + React + Vite |
166
- | `python-backend` | FastAPI, pytest |
167
- | `github-pr-review` | PR diff review + CI evidence |
168
32
 
169
- External recommendations are recorded in `Harness/SETUP.md` but not installed automatically:
33
+ ## One-line install (recommended for existing repos)
170
34
 
171
- | Recommendation | For | Source |
172
- |----------------|-----|--------|
173
- | `superpowers` | Community skill registry and agent workflows | <https://github.com/obra/Superpowers> |
174
- | `caveman` | Terse, low-token agent behavior and memory compression | <https://github.com/JuliusBrussee/caveman> |
175
- | `agent-research` | Research-agent skills for literature, product, dependency, and ecosystem investigation | <https://github.com/lingzhi227/agent-research-skills> |
176
- | `codegraph` | Code graph or repository-map tooling | <https://github.com/colbymchenry/codegraph> |
35
+ Paste this into your agent:
177
36
 
178
- These are links for the user's agent to evaluate. The scaffold does not maintain third-party install steps; it only records selected recommendations after checking what is already installed.
37
+ > Please install the Harness framework by following https://github.com/zingspark/create-harness-vibe-coding/blob/main/README.md.
179
38
 
180
- ### Agent-link intake
39
+ ## Installation instructions (Agent instruction)
181
40
 
182
- When your agent reads the one-sentence prompt above, it should get the machine-readable install report before asking broad questions:
41
+ After reading this README, the agent selects the path that matches the project:
183
42
 
184
- ```bash
185
- npx create-harness-vibe-coding@latest my-app . -y --dry-run --json
43
+ | Project state | Agent action |
44
+ |---|---|
45
+ | New project | `npx create-harness-vibe-coding@latest my-project -y` |
46
+ | 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 |
48
+ | After install or update | `node Harness/scripts/validate-harness.mjs --strict` |
49
+
50
+ 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.
51
+
52
+ The user does not need to run commands manually. The agent handles installation, conflict handling, validation, and the handoff.
53
+
54
+ ## Which WF command should you use?
55
+
56
+ When in doubt, use `/wf-help`. It returns the full command table. Use `/wf` for complex work and `/wf-max` when the work can be safely parallelized.
57
+
58
+ | Command | Use it when | What it does | Example |
59
+ |---|---|---|---|
60
+ | `/wf <task>` | Multi-file, architectural, risky, migration, or repeatedly failing work | Research → plan → implement → test → review → verify → reflect | `/wf refactor the payment module and add tests` |
61
+ | `/wf-max <task>` | The task splits into independent work and needs maximum parallelism | Adds CEO → Manager → Worker roles and parallel waves to the full WF chain | `/wf-max upgrade frontend, backend, and docs in parallel` |
62
+ | `/wf-auto` | You want continuous self-directed optimization with adaptive probe selection | Runs repeated optimization cycles with plans, evidence, and feedback | `/wf-auto improve this project's stability` |
63
+ | `/wf-auto-spark` | You need external inspiration, competitive direction, or a long-term roadmap | Searches for sparks, anchors work to a North Star and milestones, and guards scope drift | `/wf-auto-spark explore product growth directions` |
64
+ | `/wf-review [focus]` | You need a second opinion, cross-model review, or a pre-release check | Runs an independent review and classifies findings by severity | `/wf-review focus on security and data loss` |
65
+ | `/wf-learn` | The same mistakes keep recurring or a completed task needs to become reusable knowledge | Consolidates context, memory, and project lessons | `/wf-learn summarize why this task needed rework` |
66
+ | `/wf-browser <task>` | Browser smoke tests, E2E, screenshots, forms, or UI verification | Uses a real browser and returns screenshots, traces, and evidence | `/wf-browser verify login and checkout` |
67
+ | `/wf-readme <task>` | README, install docs, architecture diagrams, or project docs need work | Preserves facts while improving structure, setup, and usage guidance | `/wf-readme improve the Chinese README` |
68
+ | `/wf-update` | Harness is already installed and needs an update | Compares versions, applies safe changes, and leaves semantic conflicts to the agent | `/wf-update` |
69
+ | `/wf-remove` | You need to uninstall Harness | Removes safe files, preserves user data, and asks before touching conflicts | `/wf-remove` |
70
+ | `/wf-help` | You do not know which command to use | Returns command usage without starting a workflow | `/wf-help` |
71
+
72
+ Claude Code uses `/wf-*`; Codex uses the matching `$wf-*`; OpenCode uses the registered command or Agent instruction. `/wf-auto` and `/wf-auto-spark` are continuous modes, so give the agent a clear goal, scope, and acceptance criteria before starting.
73
+
74
+ Common starting points: Web/API work starts with correctness, security, reliability, and verification; CLI/SDK work starts with contracts, compatibility, error UX, and docs; AI-agent work starts with context quality, tool safety, evaluation, and recovery; data jobs start with idempotency, failure recovery, and observability. See the full [WF-AUTO-ANGLES.md](Harness/WF-AUTO-ANGLES.md) selection protocol.
75
+
76
+ Chinese README: [README-CN.md](README-CN.md)
77
+
78
+ ## Why this matters: the measurable difference
79
+
80
+ Better prompts can improve one turn. A harness improves the conditions around every turn: what the agent may read, what it may change, how success is checked, and how the next session recovers.
81
+
82
+ | Dimension | Prompt-only / no Harness | With Harness | What to measure |
83
+ |---|---|---|---|
84
+ | Verified completion | “It looks finished” after a demo | Acceptance criteria, tests, validators, and review are part of the task boundary | Verified completion rate |
85
+ | Stability and safety | File ownership and conflict handling are ad hoc | Script-first plans classify create/skip/backup/overwrite/conflict before writes | Safety incidents and unauthorized overwrites |
86
+ | Rework rate | Drift is discovered late, so correction work is hidden in follow-up prompts | Task capsules, explicit boundaries, and closed-loop verification expose and reduce avoidable rework | `follow-up corrective runs ÷ completed tasks` |
87
+ | Human correction | People repeatedly restate context and rescue the agent | Humans focus on semantic conflicts and decisions; deterministic work stays in scripts | `humanInterventions` per task |
88
+ | Recovery after interruption | Rediscover the repository and decisions from scratch | `Harness/PROGRESS.md`, task capsules, and durable memory preserve the handoff | Recovery time and duplicated discovery |
89
+ | Cost | Lower setup cost, unpredictable downstream cost | More upfront structure, with token/time overhead recorded against the baseline | Duration, tokens, and cost overhead |
90
+
91
+ The honest status: this repository defines the comparison protocol, but it does not publish fabricated “50% fewer bugs” numbers. Run the same model, repo, prompt, budget, and verification in three modes—`bare-agent`, `harness-wf`, and `harness-wf-max`—before making a quantitative claim. See the [HarnessBench v0.1 scoring design](Harness/tasks/task-framework-metrics-and-entry-contract/PLAN.md#5-metrics-and-scoring).
92
+
93
+ ## Three human motivations, used ethically
94
+
95
+ README structure should meet people where decisions actually happen. Harness uses the three motivations below to make the trade-off explicit—not to manufacture urgency or hide uncertainty.
96
+
97
+ | Motivation | The reader is thinking | Harness answers with |
98
+ |---|---|---|
99
+ | **Loss aversion** | “I cannot afford lost files, silent drift, or another repair cycle.” | Safe-merge conflict policies, scoped write sets, validators, and review evidence |
100
+ | **Leverage** | “I want the same agent to finish more work with less repeated explanation.” | Router-based context loading, task capsules, parallel role dispatch, and durable memory |
101
+ | **Blind spot** | “A better prompt should be enough.” | A visible process: goal → constraints → tests → feedback, plus a benchmarkable baseline |
102
+
103
+ ## Architecture
104
+
105
+ <p align="center">
106
+ <a href="docs/images/harness-architecture-light.png">
107
+ <img src="docs/images/harness-architecture-light.png" alt="Light architecture diagram showing a developer request flowing through Goals and Constraints, Quality Context, and Decomposition and Feedback into an Execute, Verify, Learn, Update loop" width="100%">
108
+ </a>
109
+ <br>
110
+ <sub>
111
+ Light infographic · <a href="docs/images/harness-architecture.drawio">editable Drawio source</a>
112
+ </sub>
113
+ </p>
114
+
115
+ The architecture has three pillars:
116
+
117
+ 1. **Goals & Constraints** — PRD → research → architecture → acceptance criteria.
118
+ 2. **Quality Context** — a router, context-loading protocol, and durable memory keep attention on the right evidence.
119
+ 3. **Decomposition & Feedback** — `/wf` and `/wf-max` assign bounded work, then review, verify, learn, and update the next task.
120
+
121
+ ## What gets scaffolded
122
+
123
+ | Layer | Purpose |
124
+ |---|---|
125
+ | `CLAUDE.md`, `AGENTS.md` | Agent entry contract and registry |
126
+ | `Harness/README.md`, `Harness/MEMORY.md` | Task-based routing and resource index |
127
+ | `Harness/tasks/`, `Harness/PROGRESS.md` | Resumable task state across sessions |
128
+ | `.claude/`, `.agents/`, `.codex/`, `.opencode/` | Tool-specific discovery and configuration |
129
+ | `templates/common/`, `templates/optional/` | Declarative scaffold source and optional workflows |
130
+ | `Harness/scripts/validate-harness.mjs` | Structural and strict readiness checks |
131
+
132
+ The generated project starts with no business stack or generated application code. You choose the stack after bootstrap.
133
+
134
+ ## Existing project: safe merge first
135
+
136
+ Paste this to your agent:
137
+
138
+ ```text
139
+ Read and follow https://github.com/zingspark/create-harness-vibe-coding exactly to configure this project with create-harness-vibe-coding.
186
140
  ```
187
141
 
188
- Use `scan.markers` instead of manual top-level probes. Ask **at most 3 blocking questions** before touching files. Files in `plan.create` are handled by the script; only files in `agent.aiMergeRequired` need AI comparison and user-supervised merge decisions.
142
+ 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
+
144
+ If `Harness/` already exists, use `/wf-update`, `$wf-update`, or `node Harness/scripts/wf-update-check.mjs` instead of reinstalling blindly.
145
+
146
+ ## Optional workflows
189
147
 
190
- Fast path for an existing project with no installed `Harness/`:
148
+ Ask your agent to add the capability you need:
191
149
 
192
- 1. Run the dry-run JSON command.
193
- 2. Run the JSON `agent.safeMergeCommand` to create only missing files.
194
- 3. Patch only files listed in `agent.aiMergeRequired`; preserve project-owned content.
195
- 4. Run `node Harness/scripts/validate-harness.mjs`.
196
- 5. Stop and report install status. Defer `--strict` until bootstrap fills project-fact placeholders.
150
+ > Add `browser-e2e` and `ui-ux-review` to this Harness project, preserve existing files, run the strict validator, and report exactly what changed.
197
151
 
198
- Ask these only when they affect writes:
152
+ | Workflow | Use it for |
153
+ |---|---|
154
+ | `browser-e2e` | Screenshots, traces, and smoke tests |
155
+ | `ui-ux-review` | Responsive, accessibility, and polish review |
156
+ | `ts-react-frontend` | TypeScript, React, and Vite projects |
157
+ | `python-backend` | FastAPI and pytest projects |
158
+ | `github-pr-review` | PR diff review and CI evidence |
199
159
 
200
- - If `CLAUDE.md` or `AGENTS.md` already exists, should missing Harness guidance be merged, kept separate, or skipped?
201
- - If `Harness/` already exists, should the agent run update/dry-run, merge missing files, keep it untouched, or remove/reinstall after approval?
202
- - Which optional capabilities should be enabled, after excluding capabilities already installed: local workflows (`browser-e2e`, `ui-ux-review`, `ts-react-frontend`, `python-backend`, `github-pr-review`) and recommendation-only external links (`Superpowers`, `Caveman`, `agent research`, `code graph`)?
160
+ External recommendations are recorded in `Harness/SETUP.md`; they are not auto-installed.
203
161
 
204
- Harness docs always live in root `Harness/`; do not route Harness files through `docs/`. If a file already exists, the agent asks first. The default is always **preserve**.
205
-
206
- ### After scaffolding
207
-
208
- ```text
209
- "Read Harness/SETUP.md. Bootstrap this project."
210
- "Use /wf for this migration." # Claude Code
211
- "Use $wf for this migration." # Codex
212
- "/wf-update" or "$wf-update" # pull latest harness improvements
213
- ```
214
-
215
- ### Verify
162
+ ## Verify
216
163
 
217
164
  ```bash
218
- # In this package repo
165
+ # This package repository
219
166
  npm test
220
167
 
221
- # In an existing project immediately after safe-merge install
168
+ # Generated project after safe merge
222
169
  node Harness/scripts/validate-harness.mjs
223
170
 
224
- # In a generated project after bootstrap, or before release
171
+ # Generated project after bootstrap or before release
225
172
  node Harness/scripts/validate-harness.mjs --strict
226
173
  ```
227
-
228
- ---
229
-
230
- ## Inside
231
-
232
- ```
233
- my-project/
234
- ├── CLAUDE.md ← Agent entry
235
- ├── AGENTS.md ← Agent registry
236
- ├── .gitignore
237
- ├── Harness/
238
- │ ├── README.md ← Doc router
239
- │ ├── SETUP.md ← Bootstrap guide (delete after init)
240
- │ ├── MEMORY.md ← Resource index
241
- │ ├── PROGRESS.md ← Task tracker
242
- │ ├── WF.md / WF-MAX.md ← Workflow modes
243
- │ ├── tasks/ ← Per-task capsules
244
- │ ├── research/ ← PRD + research templates
245
- │ ├── memory/ ← Durable self-learning
246
- │ └── scripts/ ← Validator
247
- ├── .claude/
248
- │ ├── agents/ ← 16 built-in agents
249
- │ ├── skills/ ← Claude Code skill commands
250
- │ └── rules/ ← Universal coding rules
251
- ├── .agents/
252
- │ └── skills/ ← Codex repo skills
253
- ├── .codex/ ← Codex config
254
- └── tests/
255
- ```
256
174
 
257
- `Harness/` holds all harness docs. Tool-discovery folders stay at root: `.claude/` for Claude Code, `.agents/skills/` for Codex repo skills, and `.codex/` for Codex config. Runtime hooks are absent by default; only `/wf-auto` may opt into a bounded tick hook.
258
-
259
- ---
260
-
261
- ## Footprint
262
-
263
- | | |
264
- |---|---|
265
- | Runtime | None |
266
- | Dependencies | 2 (`@clack/prompts`, `picocolors`) |
267
- | Node | ≥ 18 |
268
- | Generated code | None until you pick a stack |
269
-
270
- ---
271
-
272
- MIT © [zingspark](https://github.com/zingspark)
175
+ ## Footprint
176
+
177
+ | | |
178
+ |---|---|
179
+ | Runtime | None |
180
+ | Dependencies | 2 (`@clack/prompts`, `picocolors`) |
181
+ | Node.js | ≥ 18 |
182
+ | Generated application code | None until you choose a stack |
183
+
184
+ ## Keywords and related concepts
185
+
186
+ AI coding agent framework · agentic workflow · context engineering · long-running coding tasks · task orchestration · durable memory · safe merge · conflict handling · acceptance criteria · Claude Code · Codex · OpenCode · Node.js CLI · developer productivity
187
+
188
+ MIT © [zingspark](https://github.com/zingspark)
@@ -1,2 +1,2 @@
1
- #!/usr/bin/env node
2
- import('../src/index.js');
1
+ #!/usr/bin/env node
2
+ import('../src/index.js');
@@ -0,0 +1,164 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <mxfile host="draw.io" version="26.0.0">
3
+ <diagram name="Harness Architecture" id="h-arch">
4
+ <mxGraphModel dx="1300" dy="960" grid="1" gridSize="10" guides="1" tooltips="1"
5
+ connect="1" arrows="1" fold="1" page="1" pageScale="1"
6
+ pageWidth="1300" pageHeight="960">
7
+ <root>
8
+ <mxCell id="0" />
9
+ <mxCell id="1" parent="0" />
10
+ <mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8f9fc;strokeColor=none;" vertex="1" parent="0" >
11
+ <mxGeometry x="0" y="0" width="1300" height="960" as="geometry" />
12
+ </mxCell>
13
+ <mxCell id="3" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#4f46e5;strokeColor=none;" vertex="1" parent="1" >
14
+ <mxGeometry x="0" y="0" width="1300" height="4" as="geometry" />
15
+ </mxCell>
16
+ <mxCell id="4" value="&lt;b&gt;Harness&lt;/b&gt; — The Agent Success Infrastructure" style="text;html=1;align=center;verticalAlign=middle;fontSize=22;fontStyle=1;fontColor=#1e1b4b;" vertex="1" parent="1" >
17
+ <mxGeometry x="200" y="18" width="900" height="38" as="geometry" />
18
+ </mxCell>
19
+ <mxCell id="5" value="Clear goals · Quality information · Closed-loop feedback = Agent success" style="text;html=1;align=center;verticalAlign=middle;fontSize=13;fontStyle=0;fontColor=#6b7280;" vertex="1" parent="1" >
20
+ <mxGeometry x="250" y="56" width="800" height="24" as="geometry" />
21
+ </mxCell>
22
+ <mxCell id="6" value="▾ Three Pillars ▾" style="text;html=1;align=center;verticalAlign=middle;fontSize=13;fontStyle=1;fontColor=#374151;" vertex="1" parent="1" >
23
+ <mxGeometry x="450" y="92" width="400" height="24" as="geometry" />
24
+ </mxCell>
25
+ <mxCell id="10" value="I. Goal &amp;amp; Constraints" style="swimlane;startSize=38;fillColor=#eef2ff;strokeColor=#6366f1;fontSize=14;fontStyle=1;whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
26
+ <mxGeometry x="40" y="130" width="390" height="440" as="geometry" />
27
+ </mxCell>
28
+ <mxCell id="11" value="&quot;Here's the goal, constraints, tests —&amp;#xa;now iterate until correct.&quot;&amp;#xa;— Andrej Karpathy" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#818cf8;fontSize=9;fontStyle=2;fontColor=#6b7280;verticalAlign=middle;align=center;" vertex="1" parent="10">
29
+ <mxGeometry x="15" y="48" width="360" height="42" as="geometry" />
30
+ </mxCell>
31
+ <mxCell id="12" value="PRD → Research → Architecture workflow" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e0e7ff;strokeColor=#818cf8;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="10">
32
+ <mxGeometry x="15" y="105" width="360" height="52" as="geometry" />
33
+ </mxCell>
34
+ <mxCell id="13" value="Task capsules — big goals into bounded units" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e0e7ff;strokeColor=#818cf8;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="10">
35
+ <mxGeometry x="15" y="170" width="360" height="52" as="geometry" />
36
+ </mxCell>
37
+ <mxCell id="14" value="16 role-bound agents — explicit writeSet each" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e0e7ff;strokeColor=#818cf8;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="10">
38
+ <mxGeometry x="15" y="235" width="360" height="52" as="geometry" />
39
+ </mxCell>
40
+ <mxCell id="15" value="Acceptance criteria — quantifiable boundaries" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e0e7ff;strokeColor=#818cf8;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="10">
41
+ <mxGeometry x="15" y="300" width="360" height="52" as="geometry" />
42
+ </mxCell>
43
+ <mxCell id="16" value="/wf-max: CEO → Manager → Worker dispatch" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e0e7ff;strokeColor=#818cf8;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="10">
44
+ <mxGeometry x="15" y="365" width="360" height="52" as="geometry" />
45
+ </mxCell>
46
+ <mxCell id="20" value="II. Context &amp;amp; Information" style="swimlane;startSize=38;fillColor=#ecfdf5;strokeColor=#10b981;fontSize=14;fontStyle=1;whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
47
+ <mxGeometry x="450" y="130" width="390" height="440" as="geometry" />
48
+ </mxCell>
49
+ <mxCell id="21" value="&quot;Context engineering — the art of providing&amp;#xa;all the context for the task.&quot;&amp;#xa;— Andrej Karpathy" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#34d399;fontSize=9;fontStyle=2;fontColor=#6b7280;verticalAlign=middle;align=center;" vertex="1" parent="20">
50
+ <mxGeometry x="15" y="48" width="360" height="42" as="geometry" />
51
+ </mxCell>
52
+ <mxCell id="22" value="Router — loads only what the task needs" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d1fae5;strokeColor=#34d399;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="20">
53
+ <mxGeometry x="15" y="105" width="360" height="52" as="geometry" />
54
+ </mxCell>
55
+ <mxCell id="23" value="Context-loading protocol — docs tailored per role" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d1fae5;strokeColor=#34d399;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="20">
56
+ <mxGeometry x="15" y="170" width="360" height="52" as="geometry" />
57
+ </mxCell>
58
+ <mxCell id="24" value="Memory Master — durable cross-session learning" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d1fae5;strokeColor=#34d399;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="20">
59
+ <mxGeometry x="15" y="235" width="360" height="52" as="geometry" />
60
+ </mxCell>
61
+ <mxCell id="25" value="Context Master — compress when context fills" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d1fae5;strokeColor=#34d399;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="20">
62
+ <mxGeometry x="15" y="300" width="360" height="52" as="geometry" />
63
+ </mxCell>
64
+ <mxCell id="26" value="16 agents load only their slice — on-demand" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d1fae5;strokeColor=#34d399;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="20">
65
+ <mxGeometry x="15" y="365" width="360" height="52" as="geometry" />
66
+ </mxCell>
67
+ <mxCell id="30" value="III. Decomposition &amp;amp; Feedback" style="swimlane;startSize=38;fillColor=#fffbeb;strokeColor=#f59e0b;fontSize=14;fontStyle=1;whiteSpace=wrap;html=1;rounded=1;" vertex="1" parent="1">
68
+ <mxGeometry x="860" y="130" width="390" height="440" as="geometry" />
69
+ </mxCell>
70
+ <mxCell id="31" value="&quot;You should be designing loops&amp;#xa;that prompt your agents.&quot;&amp;#xa;— Peter Steinberger" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#fbbf24;fontSize=9;fontStyle=2;fontColor=#6b7280;verticalAlign=middle;align=center;" vertex="1" parent="30">
71
+ <mxGeometry x="15" y="48" width="360" height="42" as="geometry" />
72
+ </mxCell>
73
+ <mxCell id="32" value="/wf heartbeat + recovery — never lost mid-task" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fef3c7;strokeColor=#fbbf24;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="30">
74
+ <mxGeometry x="15" y="105" width="360" height="52" as="geometry" />
75
+ </mxCell>
76
+ <mxCell id="33" value="/wf-max parallel — CEO/Manager/Worker" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fef3c7;strokeColor=#fbbf24;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="30">
77
+ <mxGeometry x="15" y="170" width="360" height="52" as="geometry" />
78
+ </mxCell>
79
+ <mxCell id="34" value="/wf-auto — perpetual adaptive optimization" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fef3c7;strokeColor=#fbbf24;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="30">
80
+ <mxGeometry x="15" y="235" width="360" height="52" as="geometry" />
81
+ </mxCell>
82
+ <mxCell id="35" value="verify gate — AC-linked evidence before accept" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fef3c7;strokeColor=#fbbf24;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="30">
83
+ <mxGeometry x="15" y="300" width="360" height="52" as="geometry" />
84
+ </mxCell>
85
+ <mxCell id="36" value="/wf-update — scaffold refresh from upstream" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fef3c7;strokeColor=#fbbf24;fontSize=11;verticalAlign=middle;align=center;" vertex="1" parent="30">
86
+ <mxGeometry x="15" y="365" width="360" height="52" as="geometry" />
87
+ </mxCell>
88
+ <mxCell id="40" value="▾ Execution Cycle ▾" style="text;html=1;align=center;verticalAlign=middle;fontSize=13;fontStyle=1;fontColor=#374151;" vertex="1" parent="1" >
89
+ <mxGeometry x="450" y="588" width="400" height="24" as="geometry" />
90
+ </mxCell>
91
+ <mxCell id="50" value="Execute" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#6366f1;fontSize=14;fontStyle=1;verticalAlign=middle;align=center;" vertex="1" parent="1" >
92
+ <mxGeometry x="68" y="625" width="220" height="72" as="geometry" />
93
+ </mxCell>
94
+ <mxCell id="51" value="Verify" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fffbeb;strokeColor=#f59e0b;fontSize=14;fontStyle=1;verticalAlign=middle;align=center;" vertex="1" parent="1" >
95
+ <mxGeometry x="356" y="625" width="220" height="72" as="geometry" />
96
+ </mxCell>
97
+ <mxCell id="52" value="Learn" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#10b981;fontSize=14;fontStyle=1;verticalAlign=middle;align=center;" vertex="1" parent="1" >
98
+ <mxGeometry x="644" y="625" width="220" height="72" as="geometry" />
99
+ </mxCell>
100
+ <mxCell id="53" value="Update" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f3ff;strokeColor=#8b5cf6;fontSize=14;fontStyle=1;verticalAlign=middle;align=center;" vertex="1" parent="1" >
101
+ <mxGeometry x="932" y="625" width="220" height="72" as="geometry" />
102
+ </mxCell>
103
+ <mxCell id="74" value="feedback loop · /wf-update" style="text;html=1;align=center;verticalAlign=middle;fontSize=10;fontStyle=0;fontColor=#8b5cf6;" vertex="1" parent="1" >
104
+ <mxGeometry x="860" y="609" width="200" height="18" as="geometry" />
105
+ </mxCell>
106
+ <mxCell id="80" value="One command. Zero drift. Agent success, life success." style="text;html=1;align=center;verticalAlign=middle;fontSize=12;fontStyle=0;fontColor=#374151;" vertex="1" parent="1" >
107
+ <mxGeometry x="350" y="880" width="600" height="24" as="geometry" />
108
+ </mxCell>
109
+ <mxCell id="81" value="MIT © zingspark · github.com/zingspark/create-harness-vibe-coding" style="text;html=1;align=center;verticalAlign=middle;fontSize=10;fontStyle=0;fontColor=#9ca3af;" vertex="1" parent="1" >
110
+ <mxGeometry x="400" y="910" width="500" height="18" as="geometry" />
111
+ </mxCell>
112
+ <mxCell id="82" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#4f46e5;strokeColor=none;opacity=30;" vertex="1" parent="1" >
113
+ <mxGeometry x="40" y="870" width="1220" height="2" as="geometry" />
114
+ </mxCell>
115
+ <mxCell id="60" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=1.5;" edge="1" parent="1" source="10" target="50">
116
+ <mxGeometry relative="1" as="geometry">
117
+ <Array as="points">
118
+ <mxPoint x="235" y="595" />
119
+ <mxPoint x="178" y="595" />
120
+ </Array>
121
+ </mxGeometry>
122
+ </mxCell>
123
+ <mxCell id="61" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=1.5;" edge="1" parent="1" source="20" target="51">
124
+ <mxGeometry relative="1" as="geometry">
125
+ <Array as="points">
126
+ <mxPoint x="645" y="595" />
127
+ <mxPoint x="466" y="595" />
128
+ </Array>
129
+ </mxGeometry>
130
+ </mxCell>
131
+ <mxCell id="62" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=1.5;" edge="1" parent="1" source="30" target="52">
132
+ <mxGeometry relative="1" as="geometry">
133
+ <Array as="points">
134
+ <mxPoint x="1055" y="595" />
135
+ <mxPoint x="754" y="595" />
136
+ </Array>
137
+ </mxGeometry>
138
+ </mxCell>
139
+ <mxCell id="70" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=1.5;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="50" target="51">
140
+ <mxGeometry relative="1" as="geometry">
141
+ </mxGeometry>
142
+ </mxCell>
143
+ <mxCell id="71" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=1.5;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="51" target="52">
144
+ <mxGeometry relative="1" as="geometry">
145
+ </mxGeometry>
146
+ </mxCell>
147
+ <mxCell id="72" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=1.5;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="52" target="53">
148
+ <mxGeometry relative="1" as="geometry">
149
+ </mxGeometry>
150
+ </mxCell>
151
+ <mxCell id="73" style="edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=1.5;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="53" target="10">
152
+ <mxGeometry relative="1" as="geometry">
153
+ <Array as="points">
154
+ <mxPoint x="1042" y="605" />
155
+ <mxPoint x="45" y="605" />
156
+ <mxPoint x="45" y="85" />
157
+ <mxPoint x="235" y="85" />
158
+ </Array>
159
+ </mxGeometry>
160
+ </mxCell>
161
+ </root>
162
+ </mxGraphModel>
163
+ </diagram>
164
+ </mxfile>