@harness-engineering/cli 1.27.1 → 1.28.1

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 (108) hide show
  1. package/dist/agents/skills/claude-code/harness-architecture-advisor/SKILL.md +17 -5
  2. package/dist/agents/skills/claude-code/harness-architecture-advisor/skill.yaml +1 -1
  3. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +4 -4
  4. package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +1 -1
  5. package/dist/agents/skills/claude-code/harness-design-system/SKILL.md +6 -1
  6. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +4 -4
  7. package/dist/agents/skills/claude-code/harness-i18n-process/SKILL.md +2 -2
  8. package/dist/agents/skills/claude-code/harness-integration/SKILL.md +1 -1
  9. package/dist/agents/skills/claude-code/harness-knowledge-pipeline/SKILL.md +1 -0
  10. package/dist/agents/skills/claude-code/harness-onboarding/SKILL.md +1 -1
  11. package/dist/agents/skills/claude-code/harness-planning/SKILL.md +3 -3
  12. package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +4 -3
  13. package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +150 -10
  14. package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +2 -1
  15. package/dist/agents/skills/codex/harness-architecture-advisor/SKILL.md +17 -5
  16. package/dist/agents/skills/codex/harness-architecture-advisor/skill.yaml +1 -1
  17. package/dist/agents/skills/codex/harness-autopilot/SKILL.md +4 -4
  18. package/dist/agents/skills/codex/harness-code-review/SKILL.md +1 -1
  19. package/dist/agents/skills/codex/harness-design-system/SKILL.md +6 -1
  20. package/dist/agents/skills/codex/harness-execution/SKILL.md +4 -4
  21. package/dist/agents/skills/codex/harness-i18n-process/SKILL.md +2 -2
  22. package/dist/agents/skills/codex/harness-integration/SKILL.md +1 -1
  23. package/dist/agents/skills/codex/harness-knowledge-pipeline/SKILL.md +1 -0
  24. package/dist/agents/skills/codex/harness-onboarding/SKILL.md +1 -1
  25. package/dist/agents/skills/codex/harness-planning/SKILL.md +3 -3
  26. package/dist/agents/skills/codex/harness-roadmap/SKILL.md +4 -3
  27. package/dist/agents/skills/codex/initialize-harness-project/SKILL.md +150 -10
  28. package/dist/agents/skills/codex/initialize-harness-project/skill.yaml +2 -1
  29. package/dist/agents/skills/cursor/harness-architecture-advisor/SKILL.md +17 -5
  30. package/dist/agents/skills/cursor/harness-architecture-advisor/skill.yaml +1 -1
  31. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +4 -4
  32. package/dist/agents/skills/cursor/harness-code-review/SKILL.md +1 -1
  33. package/dist/agents/skills/cursor/harness-design-system/SKILL.md +6 -1
  34. package/dist/agents/skills/cursor/harness-execution/SKILL.md +4 -4
  35. package/dist/agents/skills/cursor/harness-i18n-process/SKILL.md +2 -2
  36. package/dist/agents/skills/cursor/harness-integration/SKILL.md +1 -1
  37. package/dist/agents/skills/cursor/harness-knowledge-pipeline/SKILL.md +1 -0
  38. package/dist/agents/skills/cursor/harness-onboarding/SKILL.md +1 -1
  39. package/dist/agents/skills/cursor/harness-planning/SKILL.md +3 -3
  40. package/dist/agents/skills/cursor/harness-roadmap/SKILL.md +4 -3
  41. package/dist/agents/skills/cursor/initialize-harness-project/SKILL.md +150 -10
  42. package/dist/agents/skills/cursor/initialize-harness-project/skill.yaml +2 -1
  43. package/dist/agents/skills/gemini-cli/harness-architecture-advisor/SKILL.md +17 -5
  44. package/dist/agents/skills/gemini-cli/harness-architecture-advisor/skill.yaml +1 -1
  45. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +4 -4
  46. package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +1 -1
  47. package/dist/agents/skills/gemini-cli/harness-design-system/SKILL.md +6 -1
  48. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +4 -4
  49. package/dist/agents/skills/gemini-cli/harness-i18n-process/SKILL.md +2 -2
  50. package/dist/agents/skills/gemini-cli/harness-integration/SKILL.md +1 -1
  51. package/dist/agents/skills/gemini-cli/harness-knowledge-pipeline/SKILL.md +1 -0
  52. package/dist/agents/skills/gemini-cli/harness-onboarding/SKILL.md +1 -1
  53. package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +3 -3
  54. package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +4 -3
  55. package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +150 -10
  56. package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +2 -1
  57. package/dist/{agents-md-2RN666DE.js → agents-md-6SAMHE7H.js} +3 -3
  58. package/dist/{architecture-ZR33YKJB.js → architecture-5YR52NSV.js} +4 -4
  59. package/dist/{assess-project-LLWWEQEV.js → assess-project-5X7TYQFM.js} +1 -1
  60. package/dist/bin/harness-mcp.js +15 -15
  61. package/dist/bin/harness.js +25 -25
  62. package/dist/{check-phase-gate-ZVG56NT2.js → check-phase-gate-PLV2VDOL.js} +4 -4
  63. package/dist/{chunk-2FOLD76X.js → chunk-2IBXUG6J.js} +2 -2
  64. package/dist/{chunk-MGPVA2EM.js → chunk-5ME3WG3G.js} +5 -5
  65. package/dist/{chunk-Q5DKIL46.js → chunk-6GXSJGSW.js} +3 -3
  66. package/dist/{chunk-C7RPQWBG.js → chunk-6L2BU4BP.js} +1 -1
  67. package/dist/{chunk-EHTUWULH.js → chunk-74YADB7T.js} +97 -93
  68. package/dist/{chunk-CJYNZMOP.js → chunk-7JQ7HLM4.js} +8 -8
  69. package/dist/{chunk-F3Y64VNF.js → chunk-BFBZK6BC.js} +6 -6
  70. package/dist/{chunk-YZH4I4JO.js → chunk-BYS3TQOO.js} +1 -1
  71. package/dist/{chunk-776JFSPK.js → chunk-DXGI7DL3.js} +1 -1
  72. package/dist/{chunk-T7UZOJF4.js → chunk-ELJ2MXMO.js} +9 -9
  73. package/dist/{chunk-BO4AJZRE.js → chunk-HT7HYYGT.js} +1 -1
  74. package/dist/{chunk-EGRQHLDM.js → chunk-JNKALGRM.js} +5 -5
  75. package/dist/{chunk-3AJW7VQ3.js → chunk-JZST2WZS.js} +2 -2
  76. package/dist/{chunk-A4ETL34H.js → chunk-KJD4J54I.js} +23 -1
  77. package/dist/{chunk-VCC47EXU.js → chunk-MTPHNOJW.js} +860 -412
  78. package/dist/{chunk-EICASBYP.js → chunk-PFM3BVVU.js} +1 -1
  79. package/dist/{chunk-3XMOWLK3.js → chunk-QDRBWVVY.js} +2 -2
  80. package/dist/{chunk-SDDQPMZK.js → chunk-R2CBBZA6.js} +1 -1
  81. package/dist/{chunk-IBTHD2UA.js → chunk-RFYF7TJS.js} +2 -1
  82. package/dist/{chunk-FUS4OOGC.js → chunk-RYDPFIJY.js} +1 -1
  83. package/dist/{chunk-GAIOIINV.js → chunk-S2WB4LE7.js} +113 -36
  84. package/dist/{chunk-BZZNYHRY.js → chunk-SITVRO7K.js} +9 -9
  85. package/dist/{chunk-SDPHFDQS.js → chunk-XHOGGZS7.js} +1 -1
  86. package/dist/{chunk-XKU37HGH.js → chunk-YJE23GRZ.js} +1 -1
  87. package/dist/{chunk-L3Y7L4EG.js → chunk-ZYLBIDLE.js} +1 -1
  88. package/dist/{ci-workflow-JFOL4YWW.js → ci-workflow-7T2XKB3P.js} +3 -3
  89. package/dist/{dist-BZS2XRLG.js → dist-42AYXCAK.js} +7 -1
  90. package/dist/{dist-CPKL5Y2R.js → dist-77VNTHWV.js} +2 -2
  91. package/dist/{docs-FUTRJQHA.js → docs-MSIJ6SDO.js} +4 -4
  92. package/dist/{engine-FB3HCNVT.js → engine-F4P5RBE4.js} +3 -3
  93. package/dist/{entropy-FIEE4YDA.js → entropy-GSUTIORR.js} +3 -3
  94. package/dist/{feedback-7EC4T6XG.js → feedback-NST6T4HI.js} +1 -1
  95. package/dist/{generate-agent-definitions-FOSFADNR.js → generate-agent-definitions-BOUGQIPA.js} +4 -4
  96. package/dist/{graph-loader-QEI7SYOQ.js → graph-loader-IAUPGLRV.js} +1 -1
  97. package/dist/index.d.ts +44 -1
  98. package/dist/index.js +25 -25
  99. package/dist/{loader-HXUOBTYA.js → loader-6QTJC7IN.js} +3 -3
  100. package/dist/{mcp-NUG4BMKJ.js → mcp-QFBGTUX6.js} +15 -15
  101. package/dist/{performance-TYXBCTR7.js → performance-B2NAAIE5.js} +4 -4
  102. package/dist/{review-pipeline-B4WPU6BQ.js → review-pipeline-6EYMBS6B.js} +3 -3
  103. package/dist/{runtime-HQQNOARD.js → runtime-VFZK6BCZ.js} +3 -3
  104. package/dist/{scan-M4EGDAQ2.js → scan-DB6FNYGG.js} +1 -1
  105. package/dist/{security-25VFLIAO.js → security-HRNTYHPM.js} +1 -1
  106. package/dist/{validate-EAVGKZQB.js → validate-YEMAFWJE.js} +4 -4
  107. package/dist/{validate-cross-check-SPL3H4O5.js → validate-cross-check-DGHTJFVH.js} +3 -3
  108. package/package.json +6 -6
@@ -36,7 +36,7 @@
36
36
  - Config files like `playwright.config.*`, `cypress.config.*`, `wdio.conf.*`
37
37
  - No production runtime — build output consumed only by other test repos (shared library)
38
38
 
39
- **If a test suite:** complete Phase 2 (scaffolding) here, then dispatch to `initialize-test-suite-project` for Phase 3 configuration and Phase 4 verification, then return here for Phase 4 step 4+ (knowledge graph, roadmap nudge, final commit). The test-suite skill owns archetype selection, layer variants, tags, reporters, and the custom report.
39
+ **If a test suite:** complete Phase 2 (scaffolding) here, then dispatch to `initialize-test-suite-project` for Phase 3 configuration and Phase 4 verification, then return here for Phase 4 step 4+ (knowledge graph, roadmap question, final commit). The test-suite skill owns archetype selection, layer variants, tags, reporters, and the custom report.
40
40
 
41
41
  **If a product/service:** continue with the rest of this skill as written.
42
42
 
@@ -83,6 +83,48 @@
83
83
  - **No:** Set `i18n.enabled: false` in `harness.config.json`. The `harness-i18n-process` skill will still fire gentle prompts for unconfigured projects when features touch user-facing strings.
84
84
  - **Not sure yet:** Skip i18n configuration entirely. Do not set `i18n.enabled`. The project can enable i18n later by running `harness-i18n-workflow` directly.
85
85
 
86
+ 5b. **Configure design system (non-test-suite projects).** Ask: "Will this project have a UI requiring a design system?" Mirror the i18n step's three-way response shape. Use `emit_interaction`:
87
+
88
+ ```json
89
+ emit_interaction({
90
+ type: "question",
91
+ question: {
92
+ text: "Will this project have a UI requiring a design system?",
93
+ options: [
94
+ {
95
+ label: "Yes — capture design intent now",
96
+ pros: ["Records platforms in harness.config.json", "harness-design-system fires automatically on first design-touching feature"],
97
+ cons: ["One extra follow-up question (which platforms)"],
98
+ risk: "low",
99
+ effort: "low"
100
+ },
101
+ {
102
+ label: "No — this project has no UI",
103
+ pros: ["No future design nudges", "Permanent decline recorded"],
104
+ cons: ["Re-running init is required if a UI is added later"],
105
+ risk: "low",
106
+ effort: "low"
107
+ },
108
+ {
109
+ label: "Not sure yet",
110
+ pros: ["Decision deferred without commitment", "Can run harness-design-system later"],
111
+ cons: ["No design.enabled flag set; on_new_feature will prompt later"],
112
+ risk: "low",
113
+ effort: "low"
114
+ }
115
+ ],
116
+ recommendation: { optionIndex: 0, reason: "Most product/service projects benefit from a centralized design system", confidence: "medium" }
117
+ }
118
+ })
119
+ ```
120
+
121
+ Based on the answer:
122
+ - **Yes:** Ask a follow-up: "Which platforms? `web`, `mobile`, or both?" Write `design.enabled: true` and `design.platforms: [...]` (a non-empty array of `web` and/or `mobile`) to `harness.config.json`. Inform the user: "Design tokens will be generated when you start your first design-touching feature — `harness-design-system` fires automatically via `on_new_feature`."
123
+ - **No:** Write `design.enabled: false` to `harness.config.json`. Do not write `design.platforms`. The `on_new_feature` trigger respects this flag and will not fire `harness-design-system`.
124
+ - **Not sure yet:** Do not write `design.enabled` or `design.platforms`. The project can enable design later by running `harness-design-system` directly; `on_new_feature` will prompt gently when a feature touches user-facing UI.
125
+
126
+ **Skip this step entirely if Phase 1 step 5 classified the project as a test suite.** Test-suite projects will be dispatched at step 6 below to `initialize-test-suite-project` and have no UI to govern.
127
+
86
128
  6. **Test-suite projects only — dispatch to `initialize-test-suite-project`.** If Phase 1 step 5 classified this as a test suite, invoke `initialize-test-suite-project` now and let it own archetype selection, shared-library decision, layer variants (A self-contained vs B consumer), ESLint flat-config fix, tag taxonomy, reporter stack, custom report, and the "prove the guards fire" verification. Return here for Phase 4 step 4+ (knowledge graph, roadmap, commit). Product and service projects skip this step entirely.
87
129
 
88
130
  ### Phase 4: VALIDATE — Confirm Everything Works
@@ -108,7 +150,38 @@ harness scan [path]
108
150
 
109
151
  This creates the `.harness/graph/` directory and populates it with the project's dependency and relationship data. Subsequent graph queries (impact analysis, dependency health, test advisor) depend on this initial scan.
110
152
 
111
- 4. **Mention roadmap.** After validation passes, inform the user: "When you are ready to set up a project roadmap, run `/harness:roadmap --create`. This creates a unified `docs/roadmap.md` that tracks features, milestones, and status across your specs and plans." This is informational only — do not create the roadmap automatically.
153
+ 4. **Set up project roadmap.** Ask: "Set up a project roadmap now? `docs/roadmap.md` tracks features, milestones, and status across your specs and plans." Use `emit_interaction`:
154
+
155
+ ```json
156
+ emit_interaction({
157
+ type: "question",
158
+ question: {
159
+ text: "Set up a project roadmap now?",
160
+ options: [
161
+ {
162
+ label: "Yes — create docs/roadmap.md now",
163
+ pros: ["Roadmap visible from day one", "Future specs auto-discovered on next sync"],
164
+ cons: ["Adds one file to the initial commit"],
165
+ risk: "low",
166
+ effort: "low"
167
+ },
168
+ {
169
+ label: "No — skip for now",
170
+ pros: ["Smaller initial footprint"],
171
+ cons: ["Run `/harness:roadmap --create` later when ready"],
172
+ risk: "low",
173
+ effort: "low"
174
+ }
175
+ ],
176
+ recommendation: { optionIndex: 0, reason: "Validation has just passed — a tangible 'project works' signal is the right moment to introduce planning artifacts", confidence: "medium" }
177
+ }
178
+ })
179
+ ```
180
+
181
+ Based on the answer:
182
+ - **Yes:** Invoke `harness-roadmap` (skill) or run `/harness:roadmap --create` to create `docs/roadmap.md`. Verify the file exists. The `manage_roadmap` MCP tool is for managing entries in an existing roadmap, not for creating one.
183
+ - **If `design.enabled === true` in `harness.config.json`** (set by Phase 3 step 5b), call `manage_roadmap` with `action: add`, `feature: "Set up design system"`, `status: "planned"`, `milestone: "Current Work"`, `summary: "Run harness-design-system to define palette, typography, and generate W3C DTCG tokens. Deferred from project init — fires on first design-touching feature via on_new_feature."`. Skip silently if `manage_roadmap show` reports a duplicate `(feature, milestone)` pair. This closes the loop between deferred design intent and visible planning work.
184
+ - **No:** Skip silently. The user can still run `/harness:roadmap --create` later — that informational fallback remains valid.
112
185
 
113
186
  5. **Commit the initialization.** All generated and configured files in a single commit.
114
187
 
@@ -120,8 +193,10 @@ This creates the `.harness/graph/` directory and populates it with the project's
120
193
  - **`harness validate`** — Verify the full project configuration is valid and complete.
121
194
  - **`harness check-deps`** — Verify dependency constraints match the actual codebase (intermediate and above).
122
195
  - **`harness-i18n-workflow configure` + `harness-i18n-workflow scaffold`** — Invoked during Phase 3 if the project will support multiple languages. Sets up i18n configuration and translation file structure.
196
+ - **`harness-design-system` (deferred via `on_new_feature`)** — Phase 3 step 5b records `design.enabled` + `design.platforms` in `harness.config.json` but does NOT run the full design-system skill. Token generation defers to the first design-touching feature, where `harness-design-system` fires via `on_new_feature` and reads `design.enabled` to decide whether to proceed.
123
197
  - **`initialize-test-suite-project`** — Sub-skill. Invoked during Phase 3 step 6 when Phase 1 step 5 classified the project as a test suite. Owns archetype selection, shared-library vs in-repo decision, layer variants, tag taxonomy, reporter stack, custom report, and "prove the guards fire" verification.
124
- - **Roadmap nudge** — After successful initialization, inform the user about `/harness:roadmap --create` for setting up project-level feature tracking. Informational only; does not create the roadmap.
198
+ - **`harness-roadmap` skill** — Phase 4 step 4 invokes this skill (or `/harness:roadmap --create`) when the user opts in to creating `docs/roadmap.md`. The `manage_roadmap` MCP tool does not create roadmaps; it manages entries in an existing one.
199
+ - **`manage_roadmap` MCP tool** — Phase 4 step 4, when `design.enabled === true`, calls `manage_roadmap` with `action: add` to insert a `planned` "Set up design system" item under milestone `Current Work` with a summary describing the deferred work.
125
200
 
126
201
  ## Success Criteria
127
202
 
@@ -134,17 +209,21 @@ This creates the `.harness/graph/` directory and populates it with the project's
134
209
  - The adoption level matches what was agreed upon with the human
135
210
  - All generated files are committed in a single atomic commit
136
211
  - i18n configuration is set if the human chose to enable it during init
212
+ - For non-test-suite projects, the design-system question was asked and `harness.config.json` reflects the answer: `design.enabled: true` (with `design.platforms` populated) for yes, `design.enabled: false` for no, or absent for not-sure.
213
+ - The roadmap question was asked. If the user answered yes, `docs/roadmap.md` exists and was created via `harness-roadmap` (or the documented `/harness:roadmap --create` fallback).
214
+ - When `design.enabled === true` AND the user answered yes to the roadmap question, `docs/roadmap.md` contains a `planned` entry titled "Set up design system" under milestone `Current Work` with a summary describing the deferred work. The entry is absent in all other answer combinations.
137
215
  - For test suites: `initialize-test-suite-project` ran to completion and its Success Criteria are also met
138
216
 
139
217
  ## Rationalizations to Reject
140
218
 
141
- | Rationalization | Why It Is Wrong |
142
- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
143
- | "The generated AGENTS.md template looks fine -- no need to customize it" | Phase 3 says do not blindly accept generated content. Without project-specific descriptions, agents receive generic instructions. |
144
- | "We should start at the advanced level since we want full coverage" | The skill recommends basic for new projects. Each level builds on the previous. Jumping to advanced creates misconfigured rules. |
145
- | "I will skip the i18n question to keep setup fast" | Phase 3 requires asking about i18n and recording the decision. Skipping creates ambiguity about whether the omission was intentional. |
146
- | "Validation passed, so the project is ready" | Phase 4 includes harness check-deps for intermediate+ projects and knowledge graph initialization. Validation alone is not sufficient. |
147
- | "This is a test suite, we'll configure layers in this skill" | Phase 3 step 6 dispatches to `initialize-test-suite-project` for archetype selection, layer variants, and the rest. Do not inline test-suite-specific configuration here — the sub-skill owns it and carries the gotchas. |
219
+ | Rationalization | Why It Is Wrong |
220
+ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
221
+ | "The generated AGENTS.md template looks fine -- no need to customize it" | Phase 3 says do not blindly accept generated content. Without project-specific descriptions, agents receive generic instructions. |
222
+ | "We should start at the advanced level since we want full coverage" | The skill recommends basic for new projects. Each level builds on the previous. Jumping to advanced creates misconfigured rules. |
223
+ | "I will skip the i18n question to keep setup fast" | Phase 3 requires asking about i18n and recording the decision. Skipping creates ambiguity about whether the omission was intentional. |
224
+ | "I will skip the design-system question to keep setup fast" | Phase 3 step 5b requires asking about design and recording the answer in `design.enabled`. Skipping creates ambiguity about whether the omission was intentional and bypasses the linkage between init and the deferred `harness-design-system` invocation on `on_new_feature`. |
225
+ | "Validation passed, so the project is ready" | Phase 4 includes harness check-deps for intermediate+ projects and knowledge graph initialization. Validation alone is not sufficient. |
226
+ | "This is a test suite, we'll configure layers in this skill" | Phase 3 step 6 dispatches to `initialize-test-suite-project` for archetype selection, layer variants, and the rest. Do not inline test-suite-specific configuration here — the sub-skill owns it and carries the gotchas. |
148
227
 
149
228
  ## Examples
150
229
 
@@ -188,6 +267,67 @@ git add harness.config.json .harness/ AGENTS.md
188
267
  git commit -m "feat: initialize harness project at basic level"
189
268
  ```
190
269
 
270
+ ### Example: New TypeScript Web App with Design and Roadmap
271
+
272
+ **ASSESS:**
273
+
274
+ ```
275
+ Human: "I'm starting a new Next.js web app. Single-language, but it definitely needs a design system."
276
+ Check for .harness/ — not found. Recommend: basic level.
277
+ Phase 1 step 5 classification: not a test suite (Next.js app with src/, no playwright/cypress).
278
+ ```
279
+
280
+ **SCAFFOLD:**
281
+
282
+ ```bash
283
+ harness init --level basic --framework nextjs
284
+ ```
285
+
286
+ **CONFIGURE (Phase 3):**
287
+
288
+ ```
289
+ Step 5 (i18n): "Will this project support multiple languages?"
290
+ Human: "No, English only."
291
+ Result: i18n.enabled = false in harness.config.json.
292
+
293
+ Step 5b (design): "Will this project have a UI requiring a design system?"
294
+ Human: "Yes."
295
+ Follow-up: "Which platforms? web, mobile, or both?"
296
+ Human: "Web."
297
+ Result: design.enabled = true, design.platforms = ["web"] in harness.config.json.
298
+ Inform: "Design tokens will be generated when you start your first design-touching
299
+ feature — harness-design-system fires automatically via on_new_feature."
300
+
301
+ Step 6 (test-suite dispatch): skipped (not a test suite).
302
+ ```
303
+
304
+ **VALIDATE (Phase 4):**
305
+
306
+ ```
307
+ Step 1: harness validate — pass.
308
+ Step 3: harness check-deps — pass (basic level, no constraints yet).
309
+ Build initial knowledge graph: harness scan — graph populated.
310
+
311
+ Step 4 (roadmap): "Set up a project roadmap now?"
312
+ Human: "Yes."
313
+ Invoke harness-roadmap (or /harness:roadmap --create) — docs/roadmap.md created.
314
+ design.enabled === true detected → manage_roadmap action: add
315
+ feature: "Set up design system"
316
+ status: planned
317
+ milestone: Current Work
318
+ summary: "Run harness-design-system to define palette, typography, and generate W3C DTCG tokens..."
319
+ Result: docs/roadmap.md contains the planned design item.
320
+
321
+ Step 5: commit.
322
+ ```
323
+
324
+ ```bash
325
+ git add harness.config.json .harness/ AGENTS.md docs/roadmap.md
326
+ git commit -m "feat: initialize harness project with design and roadmap"
327
+ ```
328
+
329
+ **Final state:** `harness.config.json` has `design.enabled: true` + `design.platforms: ["web"]`; `docs/roadmap.md` lists "Set up design system" as a `planned` item under `Current Work`; on the first feature touching UI, `on_new_feature` fires `harness-design-system` which reads `design.enabled` and runs the full discover/define/generate/validate flow.
330
+
191
331
  ### Example: Migrating Existing Project from Basic to Intermediate
192
332
 
193
333
  **ASSESS:**
@@ -1,6 +1,6 @@
1
1
  name: initialize-harness-project
2
2
  version: "1.0.0"
3
- description: Scaffold a new harness-compliant project
3
+ description: Scaffold a new harness-compliant project, including design system and roadmap configuration
4
4
  stability: static
5
5
  cognitive_mode: constructive-architect
6
6
  triggers:
@@ -34,3 +34,4 @@ state:
34
34
  files: []
35
35
  depends_on:
36
36
  - initialize-test-suite-project
37
+ - harness-design-system
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  generateAgentsMd
3
- } from "./chunk-C7RPQWBG.js";
4
- import "./chunk-IBTHD2UA.js";
3
+ } from "./chunk-6L2BU4BP.js";
4
+ import "./chunk-RFYF7TJS.js";
5
5
  import "./chunk-RL4VMEXL.js";
6
- import "./chunk-GAIOIINV.js";
6
+ import "./chunk-S2WB4LE7.js";
7
7
  import "./chunk-KFQGP6VL.js";
8
8
  export {
9
9
  generateAgentsMd
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  checkDependenciesDefinition,
3
3
  handleCheckDependencies
4
- } from "./chunk-MGPVA2EM.js";
5
- import "./chunk-YZH4I4JO.js";
4
+ } from "./chunk-5ME3WG3G.js";
5
+ import "./chunk-BYS3TQOO.js";
6
6
  import "./chunk-EPUKTTJZ.js";
7
7
  import "./chunk-W6Y7ZW3Y.js";
8
- import "./chunk-IBTHD2UA.js";
8
+ import "./chunk-RFYF7TJS.js";
9
9
  import "./chunk-RL4VMEXL.js";
10
- import "./chunk-GAIOIINV.js";
10
+ import "./chunk-S2WB4LE7.js";
11
11
  import "./chunk-KFQGP6VL.js";
12
12
  export {
13
13
  checkDependenciesDefinition,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  assessProjectDefinition,
3
3
  handleAssessProject
4
- } from "./chunk-F3Y64VNF.js";
4
+ } from "./chunk-BFBZK6BC.js";
5
5
  import "./chunk-W6Y7ZW3Y.js";
6
6
  import "./chunk-KFQGP6VL.js";
7
7
  export {
@@ -1,28 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  startServer
4
- } from "../chunk-EHTUWULH.js";
5
- import "../chunk-2FOLD76X.js";
6
- import "../chunk-F3Y64VNF.js";
4
+ } from "../chunk-74YADB7T.js";
5
+ import "../chunk-2IBXUG6J.js";
6
+ import "../chunk-BFBZK6BC.js";
7
7
  import "../chunk-IOW3MW2K.js";
8
- import "../chunk-BZZNYHRY.js";
9
- import "../chunk-3AJW7VQ3.js";
10
- import "../chunk-776JFSPK.js";
11
- import "../chunk-Q5DKIL46.js";
12
- import "../chunk-MGPVA2EM.js";
13
- import "../chunk-YZH4I4JO.js";
14
- import "../chunk-T7UZOJF4.js";
15
- import "../chunk-EGRQHLDM.js";
16
- import "../chunk-CJYNZMOP.js";
8
+ import "../chunk-SITVRO7K.js";
9
+ import "../chunk-JZST2WZS.js";
10
+ import "../chunk-DXGI7DL3.js";
11
+ import "../chunk-6GXSJGSW.js";
12
+ import "../chunk-5ME3WG3G.js";
13
+ import "../chunk-BYS3TQOO.js";
14
+ import "../chunk-ELJ2MXMO.js";
15
+ import "../chunk-JNKALGRM.js";
16
+ import "../chunk-7JQ7HLM4.js";
17
17
  import "../chunk-EPUKTTJZ.js";
18
18
  import "../chunk-W6Y7ZW3Y.js";
19
19
  import "../chunk-27AJKSQY.js";
20
- import "../chunk-A4ETL34H.js";
20
+ import "../chunk-KJD4J54I.js";
21
21
  import "../chunk-3ISINLYT.js";
22
22
  import "../chunk-6B6UN6SG.js";
23
- import "../chunk-IBTHD2UA.js";
23
+ import "../chunk-RFYF7TJS.js";
24
24
  import "../chunk-RL4VMEXL.js";
25
- import "../chunk-GAIOIINV.js";
25
+ import "../chunk-S2WB4LE7.js";
26
26
  import "../chunk-HIK6OEUF.js";
27
27
  import "../chunk-EBJQ6N4M.js";
28
28
  import "../chunk-3WGJMBKH.js";
@@ -3,43 +3,43 @@ import {
3
3
  createProgram,
4
4
  installCommandTelemetry,
5
5
  printFirstRunWelcome
6
- } from "../chunk-VCC47EXU.js";
7
- import "../chunk-EICASBYP.js";
8
- import "../chunk-C7RPQWBG.js";
9
- import "../chunk-FUS4OOGC.js";
10
- import "../chunk-SDPHFDQS.js";
11
- import "../chunk-L3Y7L4EG.js";
6
+ } from "../chunk-MTPHNOJW.js";
7
+ import "../chunk-PFM3BVVU.js";
8
+ import "../chunk-6L2BU4BP.js";
9
+ import "../chunk-RYDPFIJY.js";
10
+ import "../chunk-XHOGGZS7.js";
11
+ import "../chunk-ZYLBIDLE.js";
12
12
  import "../chunk-CQ553GZO.js";
13
13
  import "../chunk-GISMXMVL.js";
14
14
  import "../chunk-WWACIIBA.js";
15
15
  import "../chunk-TEFCFC4H.js";
16
- import "../chunk-3XMOWLK3.js";
17
- import "../chunk-SDDQPMZK.js";
16
+ import "../chunk-QDRBWVVY.js";
17
+ import "../chunk-R2CBBZA6.js";
18
18
  import "../chunk-KET4QQZB.js";
19
- import "../chunk-BO4AJZRE.js";
20
- import "../chunk-XKU37HGH.js";
19
+ import "../chunk-HT7HYYGT.js";
20
+ import "../chunk-YJE23GRZ.js";
21
21
  import {
22
22
  dispatchSkillsFromGit
23
- } from "../chunk-EHTUWULH.js";
24
- import "../chunk-2FOLD76X.js";
25
- import "../chunk-F3Y64VNF.js";
23
+ } from "../chunk-74YADB7T.js";
24
+ import "../chunk-2IBXUG6J.js";
25
+ import "../chunk-BFBZK6BC.js";
26
26
  import "../chunk-IOW3MW2K.js";
27
- import "../chunk-BZZNYHRY.js";
28
- import "../chunk-3AJW7VQ3.js";
29
- import "../chunk-776JFSPK.js";
30
- import "../chunk-Q5DKIL46.js";
31
- import "../chunk-MGPVA2EM.js";
32
- import "../chunk-YZH4I4JO.js";
33
- import "../chunk-T7UZOJF4.js";
34
- import "../chunk-EGRQHLDM.js";
35
- import "../chunk-CJYNZMOP.js";
27
+ import "../chunk-SITVRO7K.js";
28
+ import "../chunk-JZST2WZS.js";
29
+ import "../chunk-DXGI7DL3.js";
30
+ import "../chunk-6GXSJGSW.js";
31
+ import "../chunk-5ME3WG3G.js";
32
+ import "../chunk-BYS3TQOO.js";
33
+ import "../chunk-ELJ2MXMO.js";
34
+ import "../chunk-JNKALGRM.js";
35
+ import "../chunk-7JQ7HLM4.js";
36
36
  import "../chunk-EPUKTTJZ.js";
37
37
  import "../chunk-W6Y7ZW3Y.js";
38
38
  import "../chunk-27AJKSQY.js";
39
39
  import {
40
40
  findConfigFile,
41
41
  loadConfig
42
- } from "../chunk-A4ETL34H.js";
42
+ } from "../chunk-KJD4J54I.js";
43
43
  import "../chunk-3ISINLYT.js";
44
44
  import "../chunk-6B6UN6SG.js";
45
45
  import {
@@ -52,9 +52,9 @@ import {
52
52
  readCheckState,
53
53
  shouldRunCheck,
54
54
  spawnBackgroundCheck
55
- } from "../chunk-IBTHD2UA.js";
55
+ } from "../chunk-RFYF7TJS.js";
56
56
  import "../chunk-RL4VMEXL.js";
57
- import "../chunk-GAIOIINV.js";
57
+ import "../chunk-S2WB4LE7.js";
58
58
  import "../chunk-ZP5E7YET.js";
59
59
  import "../chunk-HIK6OEUF.js";
60
60
  import "../chunk-EBJQ6N4M.js";
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createCheckPhaseGateCommand,
3
3
  runCheckPhaseGate
4
- } from "./chunk-3XMOWLK3.js";
5
- import "./chunk-A4ETL34H.js";
6
- import "./chunk-IBTHD2UA.js";
4
+ } from "./chunk-QDRBWVVY.js";
5
+ import "./chunk-KJD4J54I.js";
6
+ import "./chunk-RFYF7TJS.js";
7
7
  import "./chunk-RL4VMEXL.js";
8
- import "./chunk-GAIOIINV.js";
8
+ import "./chunk-S2WB4LE7.js";
9
9
  import "./chunk-EBJQ6N4M.js";
10
10
  import "./chunk-3WGJMBKH.js";
11
11
  import "./chunk-KFQGP6VL.js";
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  init_dist,
6
6
  paginate
7
- } from "./chunk-IBTHD2UA.js";
7
+ } from "./chunk-RFYF7TJS.js";
8
8
 
9
9
  // src/mcp/tools/review-pipeline.ts
10
10
  init_dist();
@@ -79,7 +79,7 @@ var runCodeReviewDefinition = {
79
79
  };
80
80
  async function handleRunCodeReview(input) {
81
81
  try {
82
- const { parseDiff, runReviewPipeline } = await import("./dist-CPKL5Y2R.js");
82
+ const { parseDiff, runReviewPipeline } = await import("./dist-77VNTHWV.js");
83
83
  const parseResult = parseDiff(input.diff);
84
84
  if (!parseResult.ok) {
85
85
  return {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveProjectConfig
3
- } from "./chunk-YZH4I4JO.js";
3
+ } from "./chunk-BYS3TQOO.js";
4
4
  import {
5
5
  resultToMcpResponse
6
6
  } from "./chunk-EPUKTTJZ.js";
@@ -38,7 +38,7 @@ async function handleCheckDependencies(input) {
38
38
  const configResult = resolveProjectConfig(projectPath);
39
39
  if (!configResult.ok) return resultToMcpResponse(configResult);
40
40
  try {
41
- const { validateDependencies, TypeScriptParser } = await import("./dist-CPKL5Y2R.js");
41
+ const { validateDependencies, TypeScriptParser } = await import("./dist-77VNTHWV.js");
42
42
  const config = configResult.value;
43
43
  const rawLayers = Array.isArray(config.layers) ? config.layers : [];
44
44
  const layers = rawLayers.map((l) => ({
@@ -47,11 +47,11 @@ async function handleCheckDependencies(input) {
47
47
  allowedDependencies: l.allowedDependencies
48
48
  }));
49
49
  const parser = new TypeScriptParser();
50
- const { loadGraphStore } = await import("./graph-loader-QEI7SYOQ.js");
50
+ const { loadGraphStore } = await import("./graph-loader-IAUPGLRV.js");
51
51
  const store = await loadGraphStore(projectPath);
52
52
  let graphDependencyData;
53
53
  if (store) {
54
- const { GraphConstraintAdapter } = await import("./dist-BZS2XRLG.js");
54
+ const { GraphConstraintAdapter } = await import("./dist-42AYXCAK.js");
55
55
  const adapter = new GraphConstraintAdapter(store);
56
56
  const graphData = adapter.computeDependencyGraph();
57
57
  graphDependencyData = {
@@ -69,7 +69,7 @@ async function handleCheckDependencies(input) {
69
69
  if (store) {
70
70
  const designTokenNodes = store.findNodes({ type: "design_token" });
71
71
  if (designTokenNodes.length > 0) {
72
- const { DesignConstraintAdapter } = await import("./dist-BZS2XRLG.js");
72
+ const { DesignConstraintAdapter } = await import("./dist-42AYXCAK.js");
73
73
  const designAdapter = new DesignConstraintAdapter(store);
74
74
  const fileNodes = store.findNodes({ type: "file" });
75
75
  for (const fileNode of fileNodes) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveProjectConfig
3
- } from "./chunk-YZH4I4JO.js";
3
+ } from "./chunk-BYS3TQOO.js";
4
4
  import {
5
5
  sanitizePath
6
6
  } from "./chunk-W6Y7ZW3Y.js";
@@ -49,7 +49,7 @@ async function handleValidateProject(input) {
49
49
  checks.config = "pass";
50
50
  const config = configResult.value;
51
51
  try {
52
- const core = await import("./dist-CPKL5Y2R.js");
52
+ const core = await import("./dist-77VNTHWV.js");
53
53
  if (typeof core.validateFileStructure === "function" && Array.isArray(config.conventions)) {
54
54
  const conventions = config.conventions;
55
55
  const structureResult = await core.validateFileStructure(projectPath, conventions);
@@ -68,7 +68,7 @@ async function handleValidateProject(input) {
68
68
  } catch {
69
69
  }
70
70
  try {
71
- const core = await import("./dist-CPKL5Y2R.js");
71
+ const core = await import("./dist-77VNTHWV.js");
72
72
  if (typeof core.validateAgentsMap === "function") {
73
73
  const agentsMapPath = path.join(projectPath, "AGENTS.md");
74
74
  const agentsResult = await core.validateAgentsMap(agentsMapPath);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-IBTHD2UA.js";
3
+ } from "./chunk-RFYF7TJS.js";
4
4
  import {
5
5
  Err,
6
6
  Ok