@harness-engineering/cli 1.13.1 → 1.15.0
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/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +240 -39
- package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +6 -0
- package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +39 -0
- package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +44 -0
- package/dist/agents/skills/claude-code/harness-execution/SKILL.md +44 -0
- package/dist/agents/skills/claude-code/harness-planning/SKILL.md +39 -0
- package/dist/agents/skills/claude-code/harness-product-spec/SKILL.md +5 -5
- package/dist/agents/skills/claude-code/harness-release-readiness/SKILL.md +3 -3
- package/dist/agents/skills/claude-code/harness-verification/SKILL.md +35 -0
- package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +11 -3
- package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +240 -39
- package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +6 -0
- package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +39 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +44 -0
- package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +44 -0
- package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +39 -0
- package/dist/agents/skills/gemini-cli/harness-product-spec/SKILL.md +5 -5
- package/dist/agents/skills/gemini-cli/harness-release-readiness/SKILL.md +3 -3
- package/dist/agents/skills/gemini-cli/harness-verification/SKILL.md +35 -0
- package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +11 -3
- package/dist/agents/skills/package.json +1 -0
- package/dist/agents/skills/vitest.config.mts +5 -0
- package/dist/agents-md-ZGNIDWAF.js +8 -0
- package/dist/{architecture-2R5Z4ZAF.js → architecture-ZLIH5533.js} +4 -4
- package/dist/bin/harness-mcp.js +14 -14
- package/dist/bin/harness.js +27 -25
- package/dist/{check-phase-gate-2OFZ7OWW.js → check-phase-gate-ZOXVBDCN.js} +4 -4
- package/dist/{chunk-ND6PNADU.js → chunk-2BKLWLY6.js} +9 -9
- package/dist/{chunk-65FRIL4D.js → chunk-3ZZKVN62.js} +1 -1
- package/dist/{chunk-C2ERUR3L.js → chunk-7MJAPE3Z.js} +165 -49
- package/dist/{chunk-Z77YQRQT.js → chunk-B2HKP423.js} +16 -5
- package/dist/{chunk-QPEH2QPG.js → chunk-DBSOCI3G.js} +53 -54
- package/dist/{chunk-TKJZKICB.js → chunk-EDXIVMAP.js} +7 -7
- package/dist/{chunk-MHBMTPW7.js → chunk-ERS5EVUZ.js} +9 -0
- package/dist/{chunk-JSTQ3AWB.js → chunk-FIAPHX37.js} +1 -1
- package/dist/{chunk-IMFVFNJE.js → chunk-FTMXDOR6.js} +1 -1
- package/dist/{chunk-72GHBOL2.js → chunk-GZKSBLQL.js} +1 -1
- package/dist/{chunk-K6XAPGML.js → chunk-H7Y5CKTM.js} +1 -1
- package/dist/{chunk-SSKDAOX5.js → chunk-J4RAX7YB.js} +1164 -516
- package/dist/{chunk-UAX4I5ZE.js → chunk-LGYBN7Y6.js} +2 -2
- package/dist/{chunk-QY4T6YAZ.js → chunk-N25INEIX.js} +4 -4
- package/dist/{chunk-4ZMOCPYO.js → chunk-ND2ENWDM.js} +1 -1
- package/dist/{chunk-NERR4TAO.js → chunk-NNHDDXYT.js} +1250 -765
- package/dist/{chunk-NKDM3FMH.js → chunk-OD3S2NHN.js} +1 -1
- package/dist/{chunk-NOPU4RZ4.js → chunk-OFXQSFOW.js} +3 -3
- package/dist/{chunk-TS3XWPW5.js → chunk-RCWZBSK5.js} +1 -1
- package/dist/{chunk-VUCPTQ6G.js → chunk-SD3SQOZ2.js} +1 -1
- package/dist/{chunk-DZS7CJKL.js → chunk-VEPAJXBW.js} +45 -47
- package/dist/{chunk-IM32EEDM.js → chunk-YLXFKVJE.js} +9 -9
- package/dist/{chunk-Q6AB7W5Z.js → chunk-YQ6KC6TE.js} +1 -1
- package/dist/{chunk-PQ5YK4AY.js → chunk-Z2OOPXJO.js} +2740 -1221
- package/dist/ci-workflow-765LSHRD.js +8 -0
- package/dist/{dist-2B363XUH.js → dist-ALQDD67R.js} +64 -2
- package/dist/{dist-HXHWB7SV.js → dist-B26DFXMP.js} +571 -478
- package/dist/{dist-L7LAAQAS.js → dist-DZ63LLUD.js} +1 -1
- package/dist/{dist-D4RYGUZE.js → dist-USY2C5JL.js} +3 -1
- package/dist/{docs-FZOPM4GK.js → docs-NRMQCOJ6.js} +4 -4
- package/dist/engine-3RB7MXPP.js +8 -0
- package/dist/{entropy-LVHJMFGH.js → entropy-6AGX2ZUN.js} +3 -3
- package/dist/{feedback-IHLVLMRD.js → feedback-MY4QZIFD.js} +1 -1
- package/dist/{generate-agent-definitions-64S3CLEZ.js → generate-agent-definitions-ZAE726AU.js} +4 -4
- package/dist/{graph-loader-GJZ4FN4Y.js → graph-loader-2M2HXDQI.js} +1 -1
- package/dist/index.d.ts +156 -17
- package/dist/index.js +24 -24
- package/dist/loader-UUTVMQCC.js +10 -0
- package/dist/{mcp-JQUI7BVZ.js → mcp-VU5FMO52.js} +14 -14
- package/dist/{performance-ZTVSUANN.js → performance-2D7G6NMJ.js} +3 -3
- package/dist/{review-pipeline-76JHKGSV.js → review-pipeline-RAQ55ISU.js} +1 -1
- package/dist/runtime-BCK5RRZQ.js +9 -0
- package/dist/{security-FWQZF2IZ.js → security-2RPQEN62.js} +1 -1
- package/dist/templates/axum/Cargo.toml.hbs +8 -0
- package/dist/templates/axum/src/main.rs +12 -0
- package/dist/templates/axum/template.json +16 -0
- package/dist/templates/django/manage.py.hbs +19 -0
- package/dist/templates/django/requirements.txt.hbs +1 -0
- package/dist/templates/django/src/settings.py.hbs +44 -0
- package/dist/templates/django/src/urls.py +6 -0
- package/dist/templates/django/src/wsgi.py.hbs +9 -0
- package/dist/templates/django/template.json +21 -0
- package/dist/templates/express/package.json.hbs +15 -0
- package/dist/templates/express/src/app.ts +12 -0
- package/dist/templates/express/src/lib/.gitkeep +0 -0
- package/dist/templates/express/template.json +16 -0
- package/dist/templates/fastapi/requirements.txt.hbs +2 -0
- package/dist/templates/fastapi/src/main.py +8 -0
- package/dist/templates/fastapi/template.json +20 -0
- package/dist/templates/gin/go.mod.hbs +5 -0
- package/dist/templates/gin/main.go +15 -0
- package/dist/templates/gin/template.json +19 -0
- package/dist/templates/go-base/.golangci.yml +16 -0
- package/dist/templates/go-base/AGENTS.md.hbs +35 -0
- package/dist/templates/go-base/go.mod.hbs +3 -0
- package/dist/templates/go-base/harness.config.json.hbs +17 -0
- package/dist/templates/go-base/main.go +7 -0
- package/dist/templates/go-base/template.json +14 -0
- package/dist/templates/java-base/AGENTS.md.hbs +35 -0
- package/dist/templates/java-base/checkstyle.xml +20 -0
- package/dist/templates/java-base/harness.config.json.hbs +16 -0
- package/dist/templates/java-base/pom.xml.hbs +39 -0
- package/dist/templates/java-base/src/main/java/App.java.hbs +5 -0
- package/dist/templates/java-base/template.json +13 -0
- package/dist/templates/nestjs/nest-cli.json +5 -0
- package/dist/templates/nestjs/package.json.hbs +18 -0
- package/dist/templates/nestjs/src/app.module.ts +8 -0
- package/dist/templates/nestjs/src/lib/.gitkeep +0 -0
- package/dist/templates/nestjs/src/main.ts +11 -0
- package/dist/templates/nestjs/template.json +16 -0
- package/dist/templates/nextjs/template.json +15 -1
- package/dist/templates/python-base/.python-version +1 -0
- package/dist/templates/python-base/AGENTS.md.hbs +32 -0
- package/dist/templates/python-base/harness.config.json.hbs +16 -0
- package/dist/templates/python-base/pyproject.toml.hbs +18 -0
- package/dist/templates/python-base/ruff.toml +5 -0
- package/dist/templates/python-base/src/__init__.py +0 -0
- package/dist/templates/python-base/template.json +13 -0
- package/dist/templates/react-vite/index.html +12 -0
- package/dist/templates/react-vite/package.json.hbs +18 -0
- package/dist/templates/react-vite/src/App.tsx +7 -0
- package/dist/templates/react-vite/src/lib/.gitkeep +0 -0
- package/dist/templates/react-vite/src/main.tsx +9 -0
- package/dist/templates/react-vite/template.json +19 -0
- package/dist/templates/react-vite/vite.config.ts +6 -0
- package/dist/templates/rust-base/AGENTS.md.hbs +35 -0
- package/dist/templates/rust-base/Cargo.toml.hbs +6 -0
- package/dist/templates/rust-base/clippy.toml +2 -0
- package/dist/templates/rust-base/harness.config.json.hbs +17 -0
- package/dist/templates/rust-base/src/main.rs +3 -0
- package/dist/templates/rust-base/template.json +14 -0
- package/dist/templates/spring-boot/pom.xml.hbs +50 -0
- package/dist/templates/spring-boot/src/main/java/Application.java.hbs +19 -0
- package/dist/templates/spring-boot/template.json +15 -0
- package/dist/templates/vue/index.html +12 -0
- package/dist/templates/vue/package.json.hbs +16 -0
- package/dist/templates/vue/src/App.vue +7 -0
- package/dist/templates/vue/src/lib/.gitkeep +0 -0
- package/dist/templates/vue/src/main.ts +4 -0
- package/dist/templates/vue/template.json +19 -0
- package/dist/templates/vue/vite.config.ts +6 -0
- package/dist/{validate-GCHZJIL7.js → validate-KBYQAEWE.js} +4 -4
- package/dist/validate-cross-check-OABMREW4.js +8 -0
- package/package.json +7 -5
- package/dist/agents-md-XU3BHE22.js +0 -8
- package/dist/ci-workflow-EHV65NQB.js +0 -8
- package/dist/engine-OL4T6NZS.js +0 -8
- package/dist/loader-DPYFB6R6.js +0 -10
- package/dist/runtime-X7U6SC7K.js +0 -9
- package/dist/validate-cross-check-STFHYMAZ.js +0 -8
|
@@ -312,6 +312,45 @@ One sentence.
|
|
|
312
312
|
|
|
313
313
|
````
|
|
314
314
|
|
|
315
|
+
## Session State
|
|
316
|
+
|
|
317
|
+
This skill reads and writes to the following session sections via `manage_state`:
|
|
318
|
+
|
|
319
|
+
| Section | Read | Write | Purpose |
|
|
320
|
+
|---------|------|-------|---------|
|
|
321
|
+
| terminology | yes | no | Reads domain terms to use consistent language in plan |
|
|
322
|
+
| decisions | yes | yes | Reads brainstorming decisions; records planning-phase decisions |
|
|
323
|
+
| constraints | yes | yes | Reads existing constraints; adds constraints discovered during decomposition |
|
|
324
|
+
| risks | yes | yes | Reads existing risks; adds implementation risks identified during task design |
|
|
325
|
+
| openQuestions | yes | yes | Reads unresolved questions; adds new questions, resolves answered ones |
|
|
326
|
+
| evidence | yes | yes | Reads prior evidence from brainstorming; writes file:line citations for task specifications |
|
|
327
|
+
|
|
328
|
+
**When to write:** During Phase 1 (SCOPE) write newly discovered constraints and risks. During Phase 2 (DECOMPOSE) write decisions about task structure and sequencing. Mark resolved questions during Phase 4 (VALIDATE).
|
|
329
|
+
|
|
330
|
+
**When to read:** At the start of Phase 1 (SCOPE), read all sections via `gather_context` with `include: ["sessions"]` to inherit context from brainstorming. Use terminology for consistent naming in task descriptions.
|
|
331
|
+
|
|
332
|
+
## Evidence Requirements
|
|
333
|
+
|
|
334
|
+
When this skill makes claims about existing code structure, file locations, or implementation patterns in task specifications, it MUST cite evidence using one of:
|
|
335
|
+
|
|
336
|
+
1. **File reference:** `file:line` format (e.g., `src/services/index.ts:15` -- "barrel export exists, will add new export here")
|
|
337
|
+
2. **Code pattern reference:** `file:line` format with pattern description (e.g., `src/services/user-service.ts:1-30` -- "existing service follows constructor injection pattern, new service will match")
|
|
338
|
+
3. **Test output:** Include the command and its observed output when referencing current test state
|
|
339
|
+
4. **Session evidence:** Write to the `evidence` session section:
|
|
340
|
+
```json
|
|
341
|
+
manage_state({
|
|
342
|
+
action: "append_entry",
|
|
343
|
+
session: "<current-session>",
|
|
344
|
+
section: "evidence",
|
|
345
|
+
authorSkill: "harness-planning",
|
|
346
|
+
content: "src/services/index.ts:15 -- barrel export pattern confirmed for new service integration"
|
|
347
|
+
})
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
**When to cite:** During Phase 1 (SCOPE) when referencing existing files for observable truths. During Phase 2 (DECOMPOSE) when specifying exact file paths and code patterns in task instructions. When the file map references existing files for modification.
|
|
351
|
+
|
|
352
|
+
**Uncited claims:** Technical assertions about existing code without citations MUST be prefixed with `[UNVERIFIED]`. Example: `[UNVERIFIED] The service barrel exports all services`. Uncited claims are flagged during review (Wave 2.2).
|
|
353
|
+
|
|
315
354
|
## Harness Integration
|
|
316
355
|
|
|
317
356
|
- **`harness validate`** — Run during Phase 4 (before writing the plan) and included as a step in every task.
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
5. **Load project context.** Scan the project for existing specs, user stories, or PRDs to maintain consistency in format and terminology:
|
|
46
|
-
- Check `docs/
|
|
46
|
+
- Check `docs/changes/`, `docs/requirements/`, `docs/prd/` for existing documents
|
|
47
47
|
- Check `.github/ISSUE_TEMPLATE/` for the project's preferred issue format
|
|
48
48
|
- Identify domain terminology used in existing specs
|
|
49
49
|
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
REQ-003 -> US-004, US-005 (could-have)
|
|
134
134
|
```
|
|
135
135
|
|
|
136
|
-
5. **Write the PRD to file.** Save to the project's spec directory (detected in Phase 1 or defaulting to `docs/
|
|
136
|
+
5. **Write the PRD to file.** Save to the project's spec directory (detected in Phase 1 or defaulting to `docs/changes/`). Use a filename pattern: `YYYY-MM-DD-feature-name-prd.md`.
|
|
137
137
|
|
|
138
138
|
---
|
|
139
139
|
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
Coverage: all actors covered, all constraints addressed
|
|
172
172
|
Open questions: N remaining
|
|
173
173
|
|
|
174
|
-
Generated: docs/
|
|
174
|
+
Generated: docs/changes/2026-03-27-notifications-prd.md
|
|
175
175
|
```
|
|
176
176
|
|
|
177
177
|
---
|
|
@@ -227,7 +227,7 @@ Phase 2: CRAFT
|
|
|
227
227
|
And their other preferences remain unchanged.
|
|
228
228
|
|
|
229
229
|
Phase 3: GENERATE
|
|
230
|
-
Written: docs/
|
|
230
|
+
Written: docs/changes/2026-03-27-team-notifications-prd.md
|
|
231
231
|
Sections: problem statement, 4 user stories, 12 acceptance criteria, 8 BDD scenarios
|
|
232
232
|
Traceability: REQ-001 -> US-001, US-002 | REQ-002 -> US-003, US-004
|
|
233
233
|
|
|
@@ -260,7 +260,7 @@ Phase 2: CRAFT
|
|
|
260
260
|
return 400 and log a security warning.
|
|
261
261
|
|
|
262
262
|
Phase 3: GENERATE
|
|
263
|
-
Written: docs/
|
|
263
|
+
Written: docs/changes/2026-03-27-stripe-webhooks-prd.md
|
|
264
264
|
Technical constraints section includes: idempotency keys, signature verification,
|
|
265
265
|
5-second response SLA, Stripe retry behavior documentation
|
|
266
266
|
|
|
@@ -111,14 +111,14 @@ Run every check below. Record each as **pass**, **warn**, or **fail**:
|
|
|
111
111
|
| `test` script exists in root `package.json` | fail |
|
|
112
112
|
| `lint` script exists in root `package.json` | fail |
|
|
113
113
|
| `typecheck` or `tsc` script exists in root `package.json` | fail |
|
|
114
|
-
| `assess_project` passes (harness
|
|
114
|
+
| `assess_project` passes (full harness CI gate) | fail |
|
|
115
115
|
|
|
116
116
|
For the `assess_project` check, run it with all harness-specific checks including lint:
|
|
117
117
|
|
|
118
118
|
```json
|
|
119
119
|
assess_project({
|
|
120
120
|
path: "<project-root>",
|
|
121
|
-
checks: ["validate", "deps", "docs", "lint"],
|
|
121
|
+
checks: ["validate", "deps", "docs", "lint", "perf", "security", "entropy", "arch"],
|
|
122
122
|
mode: "detailed"
|
|
123
123
|
})
|
|
124
124
|
```
|
|
@@ -519,7 +519,7 @@ This framing is informational — it does not block anything. It gives the team
|
|
|
519
519
|
|
|
520
520
|
## Harness Integration
|
|
521
521
|
|
|
522
|
-
- **`assess_project`** — Used in AUDIT Phase 1 (CI/CD section) to run harness validation,
|
|
522
|
+
- **`assess_project`** — Used in AUDIT Phase 1 (CI/CD section) to run the full harness CI gate (validation, dependencies, docs, lint, performance/complexity, security, entropy, and architecture) in a single parallel call. Also run after auto-fixes in Phase 3 to verify project health. Automatically inherits new checks added to `assess_project`.
|
|
523
523
|
- **Sub-skill invocations** — Phase 2 dispatches `detect-doc-drift`, `cleanup-dead-code`, `enforce-architecture`, and `diagnostics` as parallel agents. Phase 3 delegates fixes to `align-documentation` and `cleanup-dead-code`.
|
|
524
524
|
- **State file** — `.harness/release-readiness.json` enables session resumption and progress tracking. This file is read at the start of each invocation and written at the end.
|
|
525
525
|
- **Report file** — `release-readiness-report.md` is written to the project root. It is a snapshot, not a tracked artifact — regenerate it on each run.
|
|
@@ -291,6 +291,41 @@ When verifying a bug fix, apply this extended protocol:
|
|
|
291
291
|
|
|
292
292
|
If step 4 passes (test does not fail without the fix), the test is not a valid regression test. It does not catch the bug. Rewrite it.
|
|
293
293
|
|
|
294
|
+
## Evidence Requirements
|
|
295
|
+
|
|
296
|
+
This skill is the primary evidence producer in the workflow. Every pass/fail assertion in the verification report MUST include concrete evidence. The words "should", "probably", and "seems to" are already forbidden by the Iron Law -- this section defines HOW to cite evidence.
|
|
297
|
+
|
|
298
|
+
Every verification claim MUST use one of:
|
|
299
|
+
|
|
300
|
+
1. **File reference:** `file:line` format with observed content (e.g., `src/services/user-service.ts:42` -- "create method validates email format before insert")
|
|
301
|
+
2. **Test output:** Include the actual test command and its complete output:
|
|
302
|
+
```
|
|
303
|
+
$ npx vitest run src/services/user-service.test.ts
|
|
304
|
+
PASS src/services/user-service.test.ts
|
|
305
|
+
UserService
|
|
306
|
+
create (4 tests)
|
|
307
|
+
list (3 tests)
|
|
308
|
+
expiry (2 tests)
|
|
309
|
+
Tests: 9 passed, 9 total
|
|
310
|
+
```
|
|
311
|
+
3. **Harness output:** Include full `harness validate` and `harness check-deps` output
|
|
312
|
+
4. **Anti-pattern scan output:** Include the actual grep/search command and results (or absence of results)
|
|
313
|
+
5. **Import chain evidence:** Include the actual import statements found when verifying WIRED level
|
|
314
|
+
6. **Session evidence:** Write to the `evidence` session section for each verification level:
|
|
315
|
+
```json
|
|
316
|
+
manage_state({
|
|
317
|
+
action: "append_entry",
|
|
318
|
+
session: "<current-session>",
|
|
319
|
+
section: "evidence",
|
|
320
|
+
authorSkill: "harness-verification",
|
|
321
|
+
content: "[EXISTS:PASS] src/services/user-service.ts (189 lines) -- verified via direct file read"
|
|
322
|
+
})
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**When to cite:** At every verification level. Level 1 (EXISTS) cites file reads. Level 2 (SUBSTANTIVE) cites specific line content. Level 3 (WIRED) cites import statements, test execution output, and harness check output. The verification report format already requires `[PASS]`/`[FAIL]` markers -- each marker must be accompanied by the evidence that produced it.
|
|
326
|
+
|
|
327
|
+
**Uncited claims:** ANY verification assertion without direct evidence is a verification failure, not merely an uncited claim. This skill does not use `[UNVERIFIED]` -- if evidence cannot be produced, the verdict is FAIL or INCOMPLETE.
|
|
328
|
+
|
|
294
329
|
## Harness Integration
|
|
295
330
|
|
|
296
331
|
- **`harness validate`** — Run in Level 3 WIRED check. Verifies project-wide health and constraint compliance.
|
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
|
|
21
21
|
2. **For new projects:** Gather project context — language, framework, test runner, build tool. Ask the human if any of these are undecided. Do not assume defaults.
|
|
22
22
|
|
|
23
|
+
2b. **For existing projects with detectable frameworks:** Run `harness init` without flags first. The command auto-detects frameworks (FastAPI, Django, Gin, Axum, Spring Boot, Next.js, React+Vite, Vue, Express, NestJS) by scanning project files. Present the detection result to the human and ask for confirmation before proceeding. If detection fails, ask the human to specify `--framework` manually.
|
|
24
|
+
|
|
23
25
|
3. **For existing projects:** Run `harness validate` to see what is already configured and what is missing. Read `AGENTS.md` if it exists. Identify the current adoption level:
|
|
24
26
|
- **Basic:** Has `AGENTS.md` and `harness.yaml` with project metadata. No layers, no skills, no dependency constraints.
|
|
25
27
|
- **Intermediate:** Has layers defined, dependency constraints between layers, at least one custom skill. `harness check-deps` runs and passes.
|
|
@@ -30,11 +32,17 @@
|
|
|
30
32
|
### Phase 2: SCAFFOLD — Generate Project Structure
|
|
31
33
|
|
|
32
34
|
1. **Run `harness init` with the appropriate flags:**
|
|
33
|
-
- New basic project: `harness init --level basic
|
|
34
|
-
-
|
|
35
|
+
- New basic JS/TS project: `harness init --level basic`
|
|
36
|
+
- With framework: `harness init --level basic --framework <framework>`
|
|
37
|
+
- Non-JS language: `harness init --language <python|go|rust|java>`
|
|
38
|
+
- Non-JS with framework: `harness init --framework <fastapi|django|gin|axum|spring-boot>`
|
|
39
|
+
- Existing project (auto-detect): `harness init` (no flags -- auto-detection runs)
|
|
35
40
|
- Migration to intermediate: `harness init --level intermediate --migrate`
|
|
36
41
|
- Migration to advanced: `harness init --level advanced --migrate`
|
|
37
42
|
|
|
43
|
+
**Supported frameworks:** nextjs, react-vite, vue, express, nestjs, fastapi, django, gin, axum, spring-boot
|
|
44
|
+
**Supported languages:** typescript, python, go, rust, java
|
|
45
|
+
|
|
38
46
|
2. **Review generated files.** `harness init` creates:
|
|
39
47
|
- `harness.yaml` — Project configuration (name, stack, adoption level)
|
|
40
48
|
- `.harness/` directory — State and learnings storage
|
|
@@ -93,7 +101,7 @@ This creates the `.harness/graph/` directory and populates it with the project's
|
|
|
93
101
|
|
|
94
102
|
## Harness Integration
|
|
95
103
|
|
|
96
|
-
- **`harness init --level <level> --framework <framework
|
|
104
|
+
- **`harness init --level <level> [--framework <framework>] [--language <language>]`** — Scaffold a new project. `--framework` infers language automatically. `--language` without `--framework` gives a bare language scaffold. Running without flags on an existing project directory triggers auto-detection.
|
|
97
105
|
- **`harness init --level <level> --migrate`** — Migrate an existing project to the next adoption level, preserving existing configuration.
|
|
98
106
|
- **`harness persona generate`** — Generate persona definitions based on project stack and team structure.
|
|
99
107
|
- **`harness validate`** — Verify the full project configuration is valid and complete.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
checkDependenciesDefinition,
|
|
3
3
|
handleCheckDependencies
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-N25INEIX.js";
|
|
5
|
+
import "./chunk-H7Y5CKTM.js";
|
|
6
6
|
import "./chunk-IDZNPTYD.js";
|
|
7
7
|
import "./chunk-W6Y7ZW3Y.js";
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-Z2OOPXJO.js";
|
|
9
|
+
import "./chunk-ERS5EVUZ.js";
|
|
10
10
|
export {
|
|
11
11
|
checkDependenciesDefinition,
|
|
12
12
|
handleCheckDependencies
|
package/dist/bin/harness-mcp.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
startServer
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-NNHDDXYT.js";
|
|
5
|
+
import "../chunk-VEPAJXBW.js";
|
|
6
|
+
import "../chunk-EDXIVMAP.js";
|
|
7
|
+
import "../chunk-YLXFKVJE.js";
|
|
8
|
+
import "../chunk-3ZZKVN62.js";
|
|
9
|
+
import "../chunk-ND2ENWDM.js";
|
|
10
10
|
import "../chunk-ZOAWBDWU.js";
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
14
|
-
import "../chunk-
|
|
15
|
-
import "../chunk-
|
|
16
|
-
import "../chunk-
|
|
11
|
+
import "../chunk-OFXQSFOW.js";
|
|
12
|
+
import "../chunk-FTMXDOR6.js";
|
|
13
|
+
import "../chunk-N25INEIX.js";
|
|
14
|
+
import "../chunk-H7Y5CKTM.js";
|
|
15
|
+
import "../chunk-2BKLWLY6.js";
|
|
16
|
+
import "../chunk-B2HKP423.js";
|
|
17
17
|
import "../chunk-IDZNPTYD.js";
|
|
18
18
|
import "../chunk-W6Y7ZW3Y.js";
|
|
19
19
|
import "../chunk-N5G5QMS3.js";
|
|
20
20
|
import "../chunk-3WGJMBKH.js";
|
|
21
21
|
import "../chunk-XYLGHKG6.js";
|
|
22
|
-
import "../chunk-
|
|
23
|
-
import "../chunk-
|
|
22
|
+
import "../chunk-Z2OOPXJO.js";
|
|
23
|
+
import "../chunk-ERS5EVUZ.js";
|
|
24
24
|
|
|
25
25
|
// src/bin/harness-mcp.ts
|
|
26
26
|
startServer().catch((error) => {
|
package/dist/bin/harness.js
CHANGED
|
@@ -1,36 +1,37 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
createProgram
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
3
|
+
createProgram,
|
|
4
|
+
printFirstRunWelcome
|
|
5
|
+
} from "../chunk-J4RAX7YB.js";
|
|
6
|
+
import "../chunk-SD3SQOZ2.js";
|
|
7
|
+
import "../chunk-LGYBN7Y6.js";
|
|
8
|
+
import "../chunk-RCWZBSK5.js";
|
|
9
|
+
import "../chunk-YQ6KC6TE.js";
|
|
9
10
|
import "../chunk-TRAPF4IX.js";
|
|
10
11
|
import "../chunk-AOZRDOIP.js";
|
|
11
12
|
import "../chunk-TEFCFC4H.js";
|
|
12
13
|
import "../chunk-YBJ262QL.js";
|
|
13
14
|
import "../chunk-EBJQ6N4M.js";
|
|
14
|
-
import "../chunk-
|
|
15
|
-
import "../chunk-
|
|
15
|
+
import "../chunk-DBSOCI3G.js";
|
|
16
|
+
import "../chunk-FIAPHX37.js";
|
|
16
17
|
import "../chunk-KET4QQZB.js";
|
|
17
|
-
import "../chunk-
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-
|
|
20
|
-
import "../chunk-
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
23
|
-
import "../chunk-
|
|
18
|
+
import "../chunk-OD3S2NHN.js";
|
|
19
|
+
import "../chunk-NNHDDXYT.js";
|
|
20
|
+
import "../chunk-VEPAJXBW.js";
|
|
21
|
+
import "../chunk-EDXIVMAP.js";
|
|
22
|
+
import "../chunk-YLXFKVJE.js";
|
|
23
|
+
import "../chunk-3ZZKVN62.js";
|
|
24
|
+
import "../chunk-ND2ENWDM.js";
|
|
24
25
|
import "../chunk-ZOAWBDWU.js";
|
|
25
|
-
import "../chunk-
|
|
26
|
-
import "../chunk-
|
|
27
|
-
import "../chunk-
|
|
28
|
-
import "../chunk-
|
|
29
|
-
import "../chunk-
|
|
26
|
+
import "../chunk-OFXQSFOW.js";
|
|
27
|
+
import "../chunk-FTMXDOR6.js";
|
|
28
|
+
import "../chunk-N25INEIX.js";
|
|
29
|
+
import "../chunk-H7Y5CKTM.js";
|
|
30
|
+
import "../chunk-2BKLWLY6.js";
|
|
30
31
|
import {
|
|
31
32
|
findConfigFile,
|
|
32
33
|
loadConfig
|
|
33
|
-
} from "../chunk-
|
|
34
|
+
} from "../chunk-B2HKP423.js";
|
|
34
35
|
import "../chunk-IDZNPTYD.js";
|
|
35
36
|
import "../chunk-W6Y7ZW3Y.js";
|
|
36
37
|
import "../chunk-N5G5QMS3.js";
|
|
@@ -41,16 +42,16 @@ import "../chunk-XYLGHKG6.js";
|
|
|
41
42
|
import {
|
|
42
43
|
CLI_VERSION
|
|
43
44
|
} from "../chunk-BM3PWGXQ.js";
|
|
44
|
-
import "../chunk-
|
|
45
|
-
import "../chunk-
|
|
45
|
+
import "../chunk-GZKSBLQL.js";
|
|
46
|
+
import "../chunk-7MJAPE3Z.js";
|
|
46
47
|
import {
|
|
47
48
|
getUpdateNotification,
|
|
48
49
|
isUpdateCheckEnabled,
|
|
49
50
|
readCheckState,
|
|
50
51
|
shouldRunCheck,
|
|
51
52
|
spawnBackgroundCheck
|
|
52
|
-
} from "../chunk-
|
|
53
|
-
import "../chunk-
|
|
53
|
+
} from "../chunk-Z2OOPXJO.js";
|
|
54
|
+
import "../chunk-ERS5EVUZ.js";
|
|
54
55
|
|
|
55
56
|
// src/bin/update-check-hooks.ts
|
|
56
57
|
var DEFAULT_INTERVAL_MS = 864e5;
|
|
@@ -103,6 +104,7 @@ ${message}
|
|
|
103
104
|
|
|
104
105
|
// src/bin/harness.ts
|
|
105
106
|
async function main() {
|
|
107
|
+
printFirstRunWelcome();
|
|
106
108
|
runUpdateCheckAtStartup();
|
|
107
109
|
const program = createProgram();
|
|
108
110
|
try {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createCheckPhaseGateCommand,
|
|
3
3
|
runCheckPhaseGate
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LGYBN7Y6.js";
|
|
5
5
|
import "./chunk-EBJQ6N4M.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-B2HKP423.js";
|
|
7
7
|
import "./chunk-3WGJMBKH.js";
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-Z2OOPXJO.js";
|
|
9
|
+
import "./chunk-ERS5EVUZ.js";
|
|
10
10
|
export {
|
|
11
11
|
createCheckPhaseGateCommand,
|
|
12
12
|
runCheckPhaseGate
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
findConfigFile,
|
|
3
3
|
loadConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-B2HKP423.js";
|
|
5
5
|
import {
|
|
6
6
|
resultToMcpResponse
|
|
7
7
|
} from "./chunk-IDZNPTYD.js";
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "./chunk-W6Y7ZW3Y.js";
|
|
11
11
|
import {
|
|
12
12
|
Ok
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-ERS5EVUZ.js";
|
|
14
14
|
|
|
15
15
|
// src/mcp/tools/docs.ts
|
|
16
16
|
import * as path from "path";
|
|
@@ -46,18 +46,18 @@ async function handleCheckDocs(input) {
|
|
|
46
46
|
const projectPath = sanitizePath(input.path);
|
|
47
47
|
const scope = input.scope ?? "coverage";
|
|
48
48
|
if (scope === "integrity") {
|
|
49
|
-
const { validateKnowledgeMap } = await import("./dist-
|
|
49
|
+
const { validateKnowledgeMap } = await import("./dist-ALQDD67R.js");
|
|
50
50
|
const result2 = await validateKnowledgeMap(projectPath);
|
|
51
51
|
return resultToMcpResponse(result2);
|
|
52
52
|
}
|
|
53
53
|
if (scope === "all") {
|
|
54
|
-
const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-
|
|
54
|
+
const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-ALQDD67R.js");
|
|
55
55
|
const domain2 = input.domain ?? "src";
|
|
56
|
-
const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-
|
|
56
|
+
const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-2M2HXDQI.js");
|
|
57
57
|
const store2 = await loadGraphStore2(projectPath);
|
|
58
58
|
let graphCoverage2;
|
|
59
59
|
if (store2) {
|
|
60
|
-
const { Assembler } = await import("./dist-
|
|
60
|
+
const { Assembler } = await import("./dist-B26DFXMP.js");
|
|
61
61
|
const assembler = new Assembler(store2);
|
|
62
62
|
const report = assembler.checkCoverage();
|
|
63
63
|
graphCoverage2 = {
|
|
@@ -90,13 +90,13 @@ async function handleCheckDocs(input) {
|
|
|
90
90
|
}
|
|
91
91
|
return resultToMcpResponse(Ok({ coverage, integrity }));
|
|
92
92
|
}
|
|
93
|
-
const { checkDocCoverage } = await import("./dist-
|
|
93
|
+
const { checkDocCoverage } = await import("./dist-ALQDD67R.js");
|
|
94
94
|
const domain = input.domain ?? "src";
|
|
95
|
-
const { loadGraphStore } = await import("./graph-loader-
|
|
95
|
+
const { loadGraphStore } = await import("./graph-loader-2M2HXDQI.js");
|
|
96
96
|
const store = await loadGraphStore(projectPath);
|
|
97
97
|
let graphCoverage;
|
|
98
98
|
if (store) {
|
|
99
|
-
const { Assembler } = await import("./dist-
|
|
99
|
+
const { Assembler } = await import("./dist-B26DFXMP.js");
|
|
100
100
|
const assembler = new Assembler(store);
|
|
101
101
|
const report = assembler.checkCoverage();
|
|
102
102
|
graphCoverage = {
|
|
@@ -26,7 +26,7 @@ var runSecurityScanDefinition = {
|
|
|
26
26
|
};
|
|
27
27
|
async function handleRunSecurityScan(input) {
|
|
28
28
|
try {
|
|
29
|
-
const core = await import("./dist-
|
|
29
|
+
const core = await import("./dist-ALQDD67R.js");
|
|
30
30
|
const projectRoot = sanitizePath(input.path);
|
|
31
31
|
let configData = {};
|
|
32
32
|
try {
|