@harness-engineering/cli 1.24.3 → 1.25.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-architecture-advisor/SKILL.md +10 -6
- package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +40 -5
- package/dist/agents/skills/claude-code/harness-git-workflow/SKILL.md +32 -11
- package/dist/agents/skills/claude-code/harness-planning/SKILL.md +19 -0
- package/dist/agents/skills/claude-code/harness-skill-authoring/SKILL.md +42 -7
- package/dist/agents/skills/claude-code/harness-verification/SKILL.md +25 -0
- package/dist/agents/skills/codex/harness-architecture-advisor/SKILL.md +10 -6
- package/dist/agents/skills/codex/harness-code-review/SKILL.md +40 -5
- package/dist/agents/skills/codex/harness-git-workflow/SKILL.md +32 -11
- package/dist/agents/skills/codex/harness-planning/SKILL.md +19 -0
- package/dist/agents/skills/codex/harness-skill-authoring/SKILL.md +42 -7
- package/dist/agents/skills/codex/harness-verification/SKILL.md +25 -0
- package/dist/agents/skills/cursor/harness-architecture-advisor/SKILL.md +10 -6
- package/dist/agents/skills/cursor/harness-code-review/SKILL.md +40 -5
- package/dist/agents/skills/cursor/harness-git-workflow/SKILL.md +32 -11
- package/dist/agents/skills/cursor/harness-planning/SKILL.md +19 -0
- package/dist/agents/skills/cursor/harness-skill-authoring/SKILL.md +42 -7
- package/dist/agents/skills/cursor/harness-verification/SKILL.md +25 -0
- package/dist/agents/skills/gemini-cli/harness-architecture-advisor/SKILL.md +10 -6
- package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +40 -5
- package/dist/agents/skills/gemini-cli/harness-git-workflow/SKILL.md +32 -11
- package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +19 -0
- package/dist/agents/skills/gemini-cli/harness-skill-authoring/SKILL.md +42 -7
- package/dist/agents/skills/gemini-cli/harness-verification/SKILL.md +25 -0
- package/dist/agents-md-MCUM4SIZ.js +10 -0
- package/dist/{architecture-FBSLURIB.js → architecture-HNIO6AUX.js} +6 -5
- package/dist/{assess-project-74UVWPMB.js → assess-project-6MV5TNY3.js} +2 -1
- package/dist/bin/harness-mcp.js +18 -17
- package/dist/bin/harness.js +47 -31
- package/dist/{check-phase-gate-WY6UICCL.js → check-phase-gate-VCBQHQAC.js} +6 -5
- package/dist/{chunk-Q3XYV5UC.js → chunk-47N6R2F4.js} +5 -1
- package/dist/{chunk-3XAPHB2Z.js → chunk-4NK7Z3BP.js} +1 -1
- package/dist/{chunk-I4QR3HNH.js → chunk-5BQ5BOJL.js} +5 -1
- package/dist/{chunk-LM5Z2WCA.js → chunk-6VZQJ5CX.js} +5 -1
- package/dist/{chunk-NV4FPO7J.js → chunk-AT74HEQM.js} +1 -1
- package/dist/{chunk-ZAMT24QN.js → chunk-AZT567I6.js} +1525 -735
- package/dist/{chunk-TDLOFNNQ.js → chunk-BOQRTARD.js} +1 -1
- package/dist/{chunk-A737JDL4.js → chunk-CXJTVICF.js} +4 -4
- package/dist/{chunk-LOUH2LIC.js → chunk-EHRZMOQ2.js} +5 -1
- package/dist/{chunk-L5UONZ53.js → chunk-F23H3U5U.js} +6 -2
- package/dist/{chunk-YPKKEP3O.js → chunk-FES2YEQU.js} +9 -9
- package/dist/{chunk-SPTKLCKC.js → chunk-FIQL2HND.js} +6 -2
- package/dist/{chunk-FP53DDB5.js → chunk-FSNPBT74.js} +5 -1
- package/dist/{chunk-TB427QOK.js → chunk-GEEYCQDS.js} +13 -9
- package/dist/{chunk-ZOVATVQC.js → chunk-HIK6OEUF.js} +6 -1
- package/dist/chunk-K2SON7TI.js +5382 -0
- package/dist/chunk-KFQGP6VL.js +33 -0
- package/dist/{chunk-V2FGX2KD.js → chunk-M55DGGF3.js} +9 -5
- package/dist/{chunk-H4U2QNY2.js → chunk-MI6MA6OP.js} +16888 -13143
- package/dist/{chunk-YDRB55Q4.js → chunk-P7PANON5.js} +5 -1
- package/dist/chunk-RL4VMEXL.js +53 -0
- package/dist/{chunk-XNEMDKV5.js → chunk-RRHUCDRD.js} +1 -1
- package/dist/{chunk-O6UF33QH.js → chunk-RX7TUMBR.js} +320 -136
- package/dist/{chunk-3VYWO6QN.js → chunk-TYV4EUAD.js} +12 -8
- package/dist/{chunk-FJYP32IV.js → chunk-UQZBZINS.js} +6 -6
- package/dist/{chunk-UFQQBGC3.js → chunk-UV3BZMGT.js} +64 -3
- package/dist/{chunk-5PMRARB5.js → chunk-WIQA4BSH.js} +12 -5
- package/dist/{chunk-UQEUYRBP.js → chunk-WWACIIBA.js} +1 -1
- package/dist/{chunk-LVYPPKZI.js → chunk-XTITAVUR.js} +5 -1
- package/dist/{chunk-WEN5Z7CL.js → chunk-YTP2UDPV.js} +3 -3
- package/dist/ci-workflow-RTM7VVTD.js +10 -0
- package/dist/{constants-5JGUXPEK.js → constants-P4M3C2T3.js} +1 -0
- package/dist/{create-skill-QCXINA5Q.js → create-skill-6QWJHQYS.js} +3 -2
- package/dist/{dist-666AAZQ6.js → dist-3EWNRFFQ.js} +6 -1
- package/dist/{dist-RRMRZRV7.js → dist-ABTKRYZH.js} +1 -0
- package/dist/{dist-QW5G3GX3.js → dist-RADHOOXG.js} +4 -1
- package/dist/{dist-7EBSGAHX.js → dist-WCSJHQPK.js} +106 -3
- package/dist/{docs-H34GBVRS.js → docs-UBOGGHTY.js} +6 -5
- package/dist/engine-MJJAP5CH.js +10 -0
- package/dist/{entropy-ZAY73R6A.js → entropy-EMSXF2PX.js} +5 -4
- package/dist/{feedback-TMEGYMWU.js → feedback-ZLUX72HD.js} +2 -1
- package/dist/{generate-agent-definitions-PQPG6SX5.js → generate-agent-definitions-AWLPJ27C.js} +6 -5
- package/dist/{glob-helper-SRXMZPKM.js → glob-helper-VCQXK5XY.js} +2 -0
- package/dist/{graph-loader-M6FXJAKK.js → graph-loader-JHQVQRUS.js} +2 -1
- package/dist/index.d.ts +13 -7
- package/dist/index.js +30 -29
- package/dist/loader-JVSJZSWZ.js +12 -0
- package/dist/mcp-2553PNUC.js +38 -0
- package/dist/{performance-N67YJJDG.js → performance-7AGWJUY4.js} +6 -5
- package/dist/review-pipeline-ZWVQJTJX.js +13 -0
- package/dist/{runner-TY7DJGQV.js → runner-AAEF2TXY.js} +1 -0
- package/dist/runtime-D6YUQPP2.js +11 -0
- package/dist/{scan-U67OKDRS.js → scan-MPJ6JHUY.js} +2 -1
- package/dist/security-JLZUAQYT.js +14 -0
- package/dist/skill-executor-MOCUIAYS.js +9 -0
- package/dist/templates/base/.agnix.toml +16 -0
- package/dist/templates/orchestrator/WORKFLOW.md +55 -7
- package/dist/templates/orchestrator/template.json +1 -0
- package/dist/tool-tiers-7QGZ3FKY.js +98 -0
- package/dist/validate-TIIHRPMA.js +14 -0
- package/dist/validate-cross-check-ZOWFA3DB.js +10 -0
- package/dist/{version-KFFPOQAX.js → version-CUI434OP.js} +1 -0
- package/package.json +4 -4
- package/dist/agents-md-PBKKTSQY.js +0 -9
- package/dist/chunk-5LMZA5LZ.js +0 -38
- package/dist/chunk-OZIHPMA7.js +0 -5171
- package/dist/ci-workflow-QZRHAIO2.js +0 -9
- package/dist/engine-VUQEAJFZ.js +0 -9
- package/dist/loader-Y6A42WBD.js +0 -11
- package/dist/mcp-LCHC4NZ5.js +0 -37
- package/dist/review-pipeline-YXF5ITL2.js +0 -12
- package/dist/runtime-XNJUJCSG.js +0 -10
- package/dist/security-L2YN3CTI.js +0 -9
- package/dist/skill-executor-GA7BDX3F.js +0 -8
- package/dist/validate-MNE25KLZ.js +0 -13
- package/dist/validate-cross-check-Y4PDR63C.js +0 -9
|
@@ -139,7 +139,14 @@ git branch -d <branch-name>
|
|
|
139
139
|
```bash
|
|
140
140
|
cd <worktree-path>
|
|
141
141
|
git push -u origin <branch-name>
|
|
142
|
-
gh pr create --title "<title>" --body "
|
|
142
|
+
gh pr create --title "<title>" --body "$(cat <<'EOF'
|
|
143
|
+
## Summary
|
|
144
|
+
<PR body with real newlines — never use \n escape sequences>
|
|
145
|
+
|
|
146
|
+
## Test plan
|
|
147
|
+
<checklist>
|
|
148
|
+
EOF
|
|
149
|
+
)"
|
|
143
150
|
# Report the PR URL to the user
|
|
144
151
|
# Leave worktree in place until PR is merged
|
|
145
152
|
```
|
|
@@ -158,6 +165,14 @@ git worktree remove <worktree-path>
|
|
|
158
165
|
git branch -D <branch-name>
|
|
159
166
|
```
|
|
160
167
|
|
|
168
|
+
#### Step 3.5: Cross-Reference Conventions for Commit Messages and PR Bodies
|
|
169
|
+
|
|
170
|
+
GitHub auto-links any `#N` token in commit messages, PR titles, and PR bodies to the issue or PR with that number. Treat `#N` as a reserved sigil — never use it for non-issue references.
|
|
171
|
+
|
|
172
|
+
- **Do not** use `#N` for proposal success criteria, list ordinals, footnote refs, table rows, or any other in-document numbering. Write "criterion 9", "item 9", "step 3" instead. Using `#9` to mean "criterion 9" will silently cross-reference issue #9 — which is almost certainly an unrelated issue — and add a misleading back-reference to that issue's timeline.
|
|
173
|
+
- **Do** reference the actual roadmap/tracker issue when finishing work tied to one. Use `Refs #<issue>` for context-only links and `Closes #<issue>` / `Fixes #<issue>` only when the merge should auto-close that issue.
|
|
174
|
+
- **Before pushing or opening the PR**, scan the commit messages and PR body for stray `#N` tokens. For each one, confirm it points to the intended issue/PR — or rewrite it as plain text.
|
|
175
|
+
|
|
161
176
|
#### Step 4: Clean Up
|
|
162
177
|
|
|
163
178
|
1. **Remove the worktree** (unless keeping as-is or waiting for PR merge):
|
|
@@ -192,13 +207,14 @@ git branch -D <branch-name>
|
|
|
192
207
|
|
|
193
208
|
## Rationalizations to Reject
|
|
194
209
|
|
|
195
|
-
| Rationalization | Reality
|
|
196
|
-
| ----------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
197
|
-
| "The tests are probably fine on the fresh branch — they were passing on main when I last checked. I'll skip baseline verification and start working." | Baseline verification is the condition that makes branch work trustworthy. A test failure discovered at finish time is ambiguous — it could be pre-existing or introduced by the work. Skipping baseline removes the only clean comparison point.
|
|
198
|
-
| "The user said 'just merge it' — I'll merge without checking if the base branch has advanced since the worktree was created." | The pre-finish check for base branch divergence is mandatory before any finishing strategy. Merging without rebasing first can produce a merge that silently breaks tests that were passing on the branch but conflict with new commits on main.
|
|
199
|
-
| "The worktree directory isn't gitignored, but it's inside a nested folder that's unlikely to be committed accidentally." | The `.gitignore` check is not about likelihood — it is about preventing accidental commits of worktree state that would corrupt the repository. If the worktree directory is not gitignored, add it before creating the worktree. No exceptions.
|
|
200
|
-
| "The user chose to discard — I'll delete the branch and worktree immediately without showing the commits that will be lost." | The discard path requires showing the commit list from `git log main..HEAD --oneline` and receiving explicit confirmation before running `git worktree remove` and `git branch -D`. Work is being permanently deleted; the user must see what they are losing.
|
|
201
|
-
| "There's already a worktree for this branch at a different path — I'll create a second one since the user asked for a fresh setup." | Git does not allow two worktrees checked out to the same branch. Attempting to create a duplicate will fail. Instead, ask the user whether to use the existing worktree or create a new branch. Never assume a second worktree is the right answer.
|
|
210
|
+
| Rationalization | Reality |
|
|
211
|
+
| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
212
|
+
| "The tests are probably fine on the fresh branch — they were passing on main when I last checked. I'll skip baseline verification and start working." | Baseline verification is the condition that makes branch work trustworthy. A test failure discovered at finish time is ambiguous — it could be pre-existing or introduced by the work. Skipping baseline removes the only clean comparison point. |
|
|
213
|
+
| "The user said 'just merge it' — I'll merge without checking if the base branch has advanced since the worktree was created." | The pre-finish check for base branch divergence is mandatory before any finishing strategy. Merging without rebasing first can produce a merge that silently breaks tests that were passing on the branch but conflict with new commits on main. |
|
|
214
|
+
| "The worktree directory isn't gitignored, but it's inside a nested folder that's unlikely to be committed accidentally." | The `.gitignore` check is not about likelihood — it is about preventing accidental commits of worktree state that would corrupt the repository. If the worktree directory is not gitignored, add it before creating the worktree. No exceptions. |
|
|
215
|
+
| "The user chose to discard — I'll delete the branch and worktree immediately without showing the commits that will be lost." | The discard path requires showing the commit list from `git log main..HEAD --oneline` and receiving explicit confirmation before running `git worktree remove` and `git branch -D`. Work is being permanently deleted; the user must see what they are losing. |
|
|
216
|
+
| "There's already a worktree for this branch at a different path — I'll create a second one since the user asked for a fresh setup." | Git does not allow two worktrees checked out to the same branch. Attempting to create a duplicate will fail. Instead, ask the user whether to use the existing worktree or create a new branch. Never assume a second worktree is the right answer. |
|
|
217
|
+
| "I'll use `#9` in the commit message to refer to 'success criterion 9' in the proposal — it's obviously an in-document reference." | `#N` is GitHub's reserved syntax for issue/PR links in commits and PR bodies. It will auto-link to issue/PR #9 regardless of intent and post a misleading back-reference on that unrelated issue. Write "criterion 9" (no `#`) and cite the real roadmap issue separately with `Refs #<n>`. |
|
|
202
218
|
|
|
203
219
|
## Examples
|
|
204
220
|
|
|
@@ -251,9 +267,14 @@ npm test # still passes after rebase
|
|
|
251
267
|
|
|
252
268
|
# User chooses: Push and create PR
|
|
253
269
|
git push -u origin feat/notifications
|
|
254
|
-
gh pr create --title "feat(notifications): email and in-app notifications"
|
|
255
|
-
|
|
256
|
-
|
|
270
|
+
gh pr create --title "feat(notifications): email and in-app notifications" --body "$(cat <<'EOF'
|
|
271
|
+
## Summary
|
|
272
|
+
Implements notification service with create, list, and expiry.
|
|
273
|
+
|
|
274
|
+
## Test plan
|
|
275
|
+
- [x] 16 new tests, all passing
|
|
276
|
+
EOF
|
|
277
|
+
)"
|
|
257
278
|
|
|
258
279
|
# Report: "PR created: https://github.com/org/repo/pull/42
|
|
259
280
|
# Worktree at .worktrees/notifications kept until PR merges."
|
|
@@ -61,6 +61,22 @@ Work backward from the goal. Start with "what must be true when we are done?"
|
|
|
61
61
|
4. **Identify key links.** How do artifacts connect? What imports what? What calls what?
|
|
62
62
|
5. **Apply YAGNI.** For every artifact: "Is this required for an observable truth?" If not, cut it.
|
|
63
63
|
|
|
64
|
+
6. **Surface uncertainties.** Before proceeding to Phase 2, explicitly list what you do NOT know. For each uncertainty, classify it:
|
|
65
|
+
- **Blocking:** Cannot decompose tasks without resolving this. Escalate to user.
|
|
66
|
+
- **Assumption:** Can proceed with a stated assumption. Document it. If wrong, specific tasks will need revision.
|
|
67
|
+
- **Deferrable:** Does not affect task decomposition. Note for execution phase.
|
|
68
|
+
|
|
69
|
+
Format:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
## Uncertainties
|
|
73
|
+
- [BLOCKING] How should the API handle partial failures? (Spec does not define.)
|
|
74
|
+
- [ASSUMPTION] Database supports transactions. (If not, Task 3 needs redesign.)
|
|
75
|
+
- [DEFERRABLE] Exact error message wording. (Can be finalized during implementation.)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Read-only constraint:** Steps 1-5 above are research and analysis. Do not propose task structure, file organization, or implementation approaches during SCOPE. Record what must be true (observable truths) and what you do not know (uncertainties). Solutions belong in DECOMPOSE.
|
|
79
|
+
|
|
64
80
|
When scope is ambiguous, use `emit_interaction`:
|
|
65
81
|
|
|
66
82
|
```json
|
|
@@ -335,6 +351,8 @@ Only apply when modifying existing documented behavior. When `docs/changes/` exi
|
|
|
335
351
|
| "Tests for this task can be added in a follow-up task since the implementation is straightforward" | No skipping TDD in tasks. Every code-producing task must start with writing a test. "Add tests later" is explicitly forbidden. |
|
|
336
352
|
| "The spec does not cover this edge case, but I can fill in the gap during planning" | When the spec is missing information, do not fill in the gaps yourself. Escalate. Filling gaps silently creates undocumented design decisions that no one reviewed. |
|
|
337
353
|
| "I discovered we need an additional file during decomposition, but updating the file map is just bookkeeping" | The file map must be complete. Every file that will be created or modified must appear in the file map before task decomposition. |
|
|
354
|
+
| "There are no real uncertainties — the spec is clear enough" | Every plan has unknowns. If you listed zero uncertainties, you skipped the step. Re-read the spec and list what is assumed but not stated. |
|
|
355
|
+
| "I already know how to structure this, no need to finish scoping" | Premature decomposition anchors on the first approach found. Complete SCOPE (observable truths + uncertainties) before proposing any task structure. |
|
|
338
356
|
|
|
339
357
|
## Examples
|
|
340
358
|
|
|
@@ -399,6 +417,7 @@ Files: src/types/notification.ts
|
|
|
399
417
|
- **No plan without observable truths.** Must start with goal-backward acceptance criteria.
|
|
400
418
|
- **No implementation during planning.** Write the plan, get approval, then use harness-execution.
|
|
401
419
|
- **File map must be complete.** Every file to create or modify must appear before task decomposition.
|
|
420
|
+
- **Uncertainties must be surfaced.** Phase 1 must produce an uncertainties list. Zero uncertainties means the step was skipped. Blocking uncertainties must be resolved before Phase 2.
|
|
402
421
|
|
|
403
422
|
## Escalation
|
|
404
423
|
|
|
@@ -273,6 +273,40 @@ metadata: # Provenance and authorship metadata
|
|
|
273
273
|
|
|
274
274
|
3. **Test by running the skill:** `harness skill run <name>`. Verify it loads correctly and the process instructions make sense in context.
|
|
275
275
|
|
|
276
|
+
### Phase 5B: TDD FOR SKILLS — Test Before Signing Off
|
|
277
|
+
|
|
278
|
+
Apply test-driven thinking to skill authoring. A skill is not complete until it has been tested against scenarios that exercise its discipline sections.
|
|
279
|
+
|
|
280
|
+
1. **Write a test scenario.** Before declaring the skill complete, define 2-3 concrete scenarios that should trigger the skill's discipline mechanisms:
|
|
281
|
+
- One scenario that should trigger a Red Flag (if the skill has Red Flags)
|
|
282
|
+
- One scenario that should trigger a Rationalization rejection
|
|
283
|
+
- One scenario that should trigger a Gate (for rigid skills)
|
|
284
|
+
|
|
285
|
+
```markdown
|
|
286
|
+
## Skill Test Scenarios
|
|
287
|
+
|
|
288
|
+
### Scenario 1: Red Flag — [quoted phrase from Red Flags section]
|
|
289
|
+
|
|
290
|
+
Input: [describe the situation]
|
|
291
|
+
Expected: Agent stops, cites the Red Flag, and takes corrective action
|
|
292
|
+
|
|
293
|
+
### Scenario 2: Rationalization — [quoted phrase from Rationalizations section]
|
|
294
|
+
|
|
295
|
+
Input: [describe the tempting shortcut]
|
|
296
|
+
Expected: Agent rejects the rationalization and follows the prescribed process
|
|
297
|
+
|
|
298
|
+
### Scenario 3: Gate — [gate condition]
|
|
299
|
+
|
|
300
|
+
Input: [describe a state that violates the gate]
|
|
301
|
+
Expected: Agent halts and does not proceed past the gate
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
2. **Mentally execute each scenario.** Walk through the skill's process with the test input. Does the skill's prose clearly direct the agent to the correct behavior? If not, the skill needs revision — not the test.
|
|
305
|
+
|
|
306
|
+
3. **Check for gaps.** If you cannot construct a scenario that triggers a discipline section, the section may be too abstract. Revise it to include a concrete quoted phrase or condition.
|
|
307
|
+
|
|
308
|
+
4. **Document test scenarios** in a comment block at the end of SKILL.md or in a companion `tests.md` file. These serve as regression tests for future skill edits.
|
|
309
|
+
|
|
276
310
|
### Skill Quality Checklist
|
|
277
311
|
|
|
278
312
|
Evaluate every skill along two dimensions:
|
|
@@ -312,13 +346,14 @@ Use this checklist as a final quality gate before declaring a skill complete.
|
|
|
312
346
|
|
|
313
347
|
## Rationalizations to Reject
|
|
314
348
|
|
|
315
|
-
| Rationalization | Reality
|
|
316
|
-
| ----------------------------------------------------------------------- |
|
|
317
|
-
| "This skill is too simple to need all required sections" | Every section exists for a reason. A short section is fine; a missing section means the skill was not fully thought through.
|
|
318
|
-
| "The process section covers it — no need for explicit success criteria" | Process describes what to do. Success criteria describe how to know it worked. They serve different purposes.
|
|
319
|
-
| "Rationalizations to Reject is meta — this skill does not need it" | This section is required for all user-facing skills, including this one. No exceptions.
|
|
320
|
-
| "I will add examples later once the skill is proven" | Examples are a required section. A skill without examples forces the agent to guess at correct behavior. Write at least one example now.
|
|
321
|
-
| "The When to Use section is obvious from the name" | Negative conditions (when NOT to use) prevent misapplication. The skill name conveys nothing about boundary conditions.
|
|
349
|
+
| Rationalization | Reality |
|
|
350
|
+
| ----------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
351
|
+
| "This skill is too simple to need all required sections" | Every section exists for a reason. A short section is fine; a missing section means the skill was not fully thought through. |
|
|
352
|
+
| "The process section covers it — no need for explicit success criteria" | Process describes what to do. Success criteria describe how to know it worked. They serve different purposes. |
|
|
353
|
+
| "Rationalizations to Reject is meta — this skill does not need it" | This section is required for all user-facing skills, including this one. No exceptions. |
|
|
354
|
+
| "I will add examples later once the skill is proven" | Examples are a required section. A skill without examples forces the agent to guess at correct behavior. Write at least one example now. |
|
|
355
|
+
| "The When to Use section is obvious from the name" | Negative conditions (when NOT to use) prevent misapplication. The skill name conveys nothing about boundary conditions. |
|
|
356
|
+
| "The skill works — I tested it by running it once" | A single happy-path run does not test discipline sections. Write scenarios that trigger Red Flags, Gates, and Rationalizations. A skill that passes happy path but fails discipline scenarios is a trap. |
|
|
322
357
|
|
|
323
358
|
## Examples
|
|
324
359
|
|
|
@@ -259,6 +259,31 @@ Every verification claim MUST use one of:
|
|
|
259
259
|
|
|
260
260
|
**Uncited claims:** Any verification assertion without direct evidence is a verification failure. This skill does not use `[UNVERIFIED]` -- if evidence cannot be produced, verdict is FAIL or INCOMPLETE.
|
|
261
261
|
|
|
262
|
+
## Rubric Compression
|
|
263
|
+
|
|
264
|
+
Verification checklists passed to subagents or used internally MUST use compressed single-line format. Each check is one line with pipe-delimited fields:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
level|check-name|pass-criterion
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Example (Level 2 SUBSTANTIVE rubric):**
|
|
271
|
+
|
|
272
|
+
```
|
|
273
|
+
L2|no-stubs|No TODO/FIXME/throw-not-implemented in production code
|
|
274
|
+
L2|no-empty-bodies|No empty function bodies, () => {}, or return null as sole logic
|
|
275
|
+
L2|spec-complete|All behaviors specified in spec have corresponding implementation
|
|
276
|
+
L2|real-logic|Functions contain meaningful logic, not just hardcoded returns
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**Why:** Verbose checklist prose inflates verification context without improving accuracy. Dense single-line rubrics give the same signal in fewer tokens, leaving more budget for reading and analyzing actual file content.
|
|
280
|
+
|
|
281
|
+
**Rules:**
|
|
282
|
+
|
|
283
|
+
- Level prefix must be L1 (EXISTS), L2 (SUBSTANTIVE), or L3 (WIRED)
|
|
284
|
+
- Maximum 80 characters per criterion text
|
|
285
|
+
- Rubric entries are guidance — the verification levels define the authoritative checks
|
|
286
|
+
|
|
262
287
|
## Non-Determinism Tolerance
|
|
263
288
|
|
|
264
289
|
Mechanical checks (tests, lint, types) are binary pass/fail. No tolerance.
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
checkDependenciesDefinition,
|
|
3
3
|
handleCheckDependencies
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-CXJTVICF.js";
|
|
5
|
+
import "./chunk-47N6R2F4.js";
|
|
6
6
|
import "./chunk-EPUKTTJZ.js";
|
|
7
7
|
import "./chunk-W6Y7ZW3Y.js";
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-MI6MA6OP.js";
|
|
9
|
+
import "./chunk-RL4VMEXL.js";
|
|
10
|
+
import "./chunk-K2SON7TI.js";
|
|
11
|
+
import "./chunk-KFQGP6VL.js";
|
|
11
12
|
export {
|
|
12
13
|
checkDependenciesDefinition,
|
|
13
14
|
handleCheckDependencies
|
package/dist/bin/harness-mcp.js
CHANGED
|
@@ -1,28 +1,29 @@
|
|
|
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-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
14
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-RX7TUMBR.js";
|
|
5
|
+
import "../chunk-FES2YEQU.js";
|
|
6
|
+
import "../chunk-UV3BZMGT.js";
|
|
7
|
+
import "../chunk-F23H3U5U.js";
|
|
8
|
+
import "../chunk-UQZBZINS.js";
|
|
9
|
+
import "../chunk-YTP2UDPV.js";
|
|
10
|
+
import "../chunk-CXJTVICF.js";
|
|
11
|
+
import "../chunk-47N6R2F4.js";
|
|
12
|
+
import "../chunk-GEEYCQDS.js";
|
|
13
|
+
import "../chunk-M55DGGF3.js";
|
|
14
|
+
import "../chunk-TYV4EUAD.js";
|
|
15
15
|
import "../chunk-EPUKTTJZ.js";
|
|
16
16
|
import "../chunk-W6Y7ZW3Y.js";
|
|
17
|
-
import "../chunk-
|
|
17
|
+
import "../chunk-WIQA4BSH.js";
|
|
18
18
|
import "../chunk-3ISINLYT.js";
|
|
19
19
|
import "../chunk-6B6UN6SG.js";
|
|
20
|
-
import "../chunk-
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
23
|
-
import "../chunk-
|
|
24
|
-
import "../chunk-
|
|
20
|
+
import "../chunk-BOQRTARD.js";
|
|
21
|
+
import "../chunk-MI6MA6OP.js";
|
|
22
|
+
import "../chunk-RL4VMEXL.js";
|
|
23
|
+
import "../chunk-K2SON7TI.js";
|
|
24
|
+
import "../chunk-HIK6OEUF.js";
|
|
25
25
|
import "../chunk-3WGJMBKH.js";
|
|
26
|
+
import "../chunk-KFQGP6VL.js";
|
|
26
27
|
|
|
27
28
|
// src/bin/harness-mcp.ts
|
|
28
29
|
import "dotenv/config";
|
package/dist/bin/harness.js
CHANGED
|
@@ -2,66 +2,69 @@
|
|
|
2
2
|
import {
|
|
3
3
|
createProgram,
|
|
4
4
|
printFirstRunWelcome
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-AZT567I6.js";
|
|
6
|
+
import "../chunk-5BQ5BOJL.js";
|
|
7
|
+
import "../chunk-EHRZMOQ2.js";
|
|
8
|
+
import "../chunk-XTITAVUR.js";
|
|
9
|
+
import "../chunk-FSNPBT74.js";
|
|
10
10
|
import "../chunk-CQ553GZO.js";
|
|
11
|
-
import "../chunk-
|
|
11
|
+
import "../chunk-6VZQJ5CX.js";
|
|
12
12
|
import "../chunk-GISMXMVL.js";
|
|
13
|
-
import "../chunk-
|
|
13
|
+
import "../chunk-WWACIIBA.js";
|
|
14
14
|
import "../chunk-TEFCFC4H.js";
|
|
15
|
-
import "../chunk-
|
|
16
|
-
import "../chunk-
|
|
15
|
+
import "../chunk-FIQL2HND.js";
|
|
16
|
+
import "../chunk-AT74HEQM.js";
|
|
17
17
|
import "../chunk-KET4QQZB.js";
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-
|
|
18
|
+
import "../chunk-P7PANON5.js";
|
|
19
|
+
import "../chunk-4NK7Z3BP.js";
|
|
20
20
|
import {
|
|
21
21
|
dispatchSkillsFromGit
|
|
22
|
-
} from "../chunk-
|
|
23
|
-
import "../chunk-
|
|
24
|
-
import "../chunk-
|
|
25
|
-
import "../chunk-
|
|
26
|
-
import "../chunk-
|
|
27
|
-
import "../chunk-
|
|
28
|
-
import "../chunk-
|
|
29
|
-
import "../chunk-
|
|
30
|
-
import "../chunk-
|
|
31
|
-
import "../chunk-
|
|
32
|
-
import "../chunk-
|
|
22
|
+
} from "../chunk-RX7TUMBR.js";
|
|
23
|
+
import "../chunk-FES2YEQU.js";
|
|
24
|
+
import "../chunk-UV3BZMGT.js";
|
|
25
|
+
import "../chunk-F23H3U5U.js";
|
|
26
|
+
import "../chunk-UQZBZINS.js";
|
|
27
|
+
import "../chunk-YTP2UDPV.js";
|
|
28
|
+
import "../chunk-CXJTVICF.js";
|
|
29
|
+
import "../chunk-47N6R2F4.js";
|
|
30
|
+
import "../chunk-GEEYCQDS.js";
|
|
31
|
+
import "../chunk-M55DGGF3.js";
|
|
32
|
+
import "../chunk-TYV4EUAD.js";
|
|
33
33
|
import "../chunk-EPUKTTJZ.js";
|
|
34
34
|
import "../chunk-W6Y7ZW3Y.js";
|
|
35
35
|
import {
|
|
36
36
|
findConfigFile,
|
|
37
37
|
loadConfig
|
|
38
|
-
} from "../chunk-
|
|
38
|
+
} from "../chunk-WIQA4BSH.js";
|
|
39
39
|
import "../chunk-3ISINLYT.js";
|
|
40
40
|
import "../chunk-6B6UN6SG.js";
|
|
41
|
-
import "../chunk-
|
|
41
|
+
import "../chunk-BOQRTARD.js";
|
|
42
42
|
import {
|
|
43
43
|
CLI_VERSION
|
|
44
44
|
} from "../chunk-BM3PWGXQ.js";
|
|
45
45
|
import {
|
|
46
46
|
getUpdateNotification,
|
|
47
|
+
init_dist,
|
|
47
48
|
isUpdateCheckEnabled,
|
|
48
49
|
readCheckState,
|
|
49
50
|
shouldRunCheck,
|
|
50
51
|
spawnBackgroundCheck
|
|
51
|
-
} from "../chunk-
|
|
52
|
-
import "../chunk-
|
|
53
|
-
import "../chunk-
|
|
54
|
-
import "../chunk-
|
|
52
|
+
} from "../chunk-MI6MA6OP.js";
|
|
53
|
+
import "../chunk-RL4VMEXL.js";
|
|
54
|
+
import "../chunk-K2SON7TI.js";
|
|
55
|
+
import "../chunk-RRHUCDRD.js";
|
|
55
56
|
import "../chunk-EBJQ6N4M.js";
|
|
56
|
-
import "../chunk-
|
|
57
|
+
import "../chunk-HIK6OEUF.js";
|
|
57
58
|
import {
|
|
58
59
|
handleError
|
|
59
60
|
} from "../chunk-3WGJMBKH.js";
|
|
61
|
+
import "../chunk-KFQGP6VL.js";
|
|
60
62
|
|
|
61
63
|
// src/bin/harness.ts
|
|
62
64
|
import "dotenv/config";
|
|
63
65
|
|
|
64
66
|
// src/bin/update-check-hooks.ts
|
|
67
|
+
init_dist();
|
|
65
68
|
var DEFAULT_INTERVAL_MS = 864e5;
|
|
66
69
|
var cachedConfigInterval = null;
|
|
67
70
|
function readConfigInterval() {
|
|
@@ -115,6 +118,17 @@ import { execSync } from "child_process";
|
|
|
115
118
|
import fs from "fs";
|
|
116
119
|
import path from "path";
|
|
117
120
|
var LAST_HEAD_FILE = ".harness/dispatch-last-head.txt";
|
|
121
|
+
function resolveGitRoot(projectPath) {
|
|
122
|
+
try {
|
|
123
|
+
return execSync("git rev-parse --show-toplevel", {
|
|
124
|
+
cwd: projectPath,
|
|
125
|
+
encoding: "utf8",
|
|
126
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
127
|
+
}).trim();
|
|
128
|
+
} catch {
|
|
129
|
+
return path.resolve(projectPath);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
118
132
|
function getCurrentHead(projectPath) {
|
|
119
133
|
try {
|
|
120
134
|
return execSync("git rev-parse HEAD", {
|
|
@@ -127,7 +141,8 @@ function getCurrentHead(projectPath) {
|
|
|
127
141
|
}
|
|
128
142
|
}
|
|
129
143
|
function readLastHead(projectPath) {
|
|
130
|
-
const
|
|
144
|
+
const root = resolveGitRoot(projectPath);
|
|
145
|
+
const filePath = path.join(root, LAST_HEAD_FILE);
|
|
131
146
|
try {
|
|
132
147
|
return fs.readFileSync(filePath, "utf8").trim();
|
|
133
148
|
} catch {
|
|
@@ -135,7 +150,8 @@ function readLastHead(projectPath) {
|
|
|
135
150
|
}
|
|
136
151
|
}
|
|
137
152
|
function writeLastHead(projectPath, head) {
|
|
138
|
-
const
|
|
153
|
+
const root = resolveGitRoot(projectPath);
|
|
154
|
+
const filePath = path.join(root, LAST_HEAD_FILE);
|
|
139
155
|
const dir = path.dirname(filePath);
|
|
140
156
|
if (!fs.existsSync(dir)) {
|
|
141
157
|
fs.mkdirSync(dir, { recursive: true });
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createCheckPhaseGateCommand,
|
|
3
3
|
runCheckPhaseGate
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-FIQL2HND.js";
|
|
5
|
+
import "./chunk-WIQA4BSH.js";
|
|
6
|
+
import "./chunk-MI6MA6OP.js";
|
|
7
|
+
import "./chunk-RL4VMEXL.js";
|
|
8
|
+
import "./chunk-K2SON7TI.js";
|
|
9
9
|
import "./chunk-EBJQ6N4M.js";
|
|
10
10
|
import "./chunk-3WGJMBKH.js";
|
|
11
|
+
import "./chunk-KFQGP6VL.js";
|
|
11
12
|
export {
|
|
12
13
|
createCheckPhaseGateCommand,
|
|
13
14
|
runCheckPhaseGate
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
init_dist
|
|
3
|
+
} from "./chunk-MI6MA6OP.js";
|
|
1
4
|
import {
|
|
2
5
|
Err,
|
|
3
6
|
Ok
|
|
4
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-RL4VMEXL.js";
|
|
5
8
|
|
|
6
9
|
// src/mcp/utils/config-resolver.ts
|
|
10
|
+
init_dist();
|
|
7
11
|
import * as fs from "fs";
|
|
8
12
|
import * as path from "path";
|
|
9
13
|
function resolveProjectConfig(projectPath) {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import * as path from "path";
|
|
4
4
|
async function runScan(projectPath) {
|
|
5
|
-
const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-
|
|
5
|
+
const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-RADHOOXG.js");
|
|
6
6
|
const store = new GraphStore();
|
|
7
7
|
const start = Date.now();
|
|
8
8
|
await new CodeIngestor(store).ingest(projectPath);
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
init_dist
|
|
3
|
+
} from "./chunk-MI6MA6OP.js";
|
|
1
4
|
import {
|
|
2
5
|
Err,
|
|
3
6
|
Ok
|
|
4
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-RL4VMEXL.js";
|
|
5
8
|
|
|
6
9
|
// src/persona/generators/agents-md.ts
|
|
10
|
+
init_dist();
|
|
7
11
|
function formatPrTrigger(trigger) {
|
|
8
12
|
const paths = trigger.conditions?.paths?.join(", ") ?? "all files";
|
|
9
13
|
return `On PR (${paths})`;
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
toKebabCase
|
|
3
3
|
} from "./chunk-KET4QQZB.js";
|
|
4
|
+
import {
|
|
5
|
+
init_dist
|
|
6
|
+
} from "./chunk-MI6MA6OP.js";
|
|
4
7
|
import {
|
|
5
8
|
Err,
|
|
6
9
|
Ok
|
|
7
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-RL4VMEXL.js";
|
|
8
11
|
|
|
9
12
|
// src/persona/generators/runtime.ts
|
|
13
|
+
init_dist();
|
|
10
14
|
function generateRuntime(persona) {
|
|
11
15
|
try {
|
|
12
16
|
const config = {
|