@harness-engineering/cli 2.8.0 → 3.0.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.
- package/dist/agents/skills/claude-code/harness-audit-harness-strength/SKILL.md +188 -0
- package/dist/agents/skills/claude-code/harness-audit-harness-strength/skill.yaml +54 -0
- package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +2 -0
- package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +28 -14
- package/dist/agents/skills/claude-code/harness-execution/SKILL.md +1 -1
- package/dist/agents/skills/claude-code/harness-git-workflow/SKILL.md +2 -0
- package/dist/agents/skills/claude-code/harness-ideate/SKILL.md +2 -0
- package/dist/agents/skills/claude-code/harness-knowledge-pipeline/SKILL.md +2 -0
- package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +62 -4
- package/dist/agents/skills/claude-code/harness-roadmap-pilot/SKILL.md +2 -0
- package/dist/agents/skills/claude-code/harness-test-advisor/SKILL.md +80 -2
- package/dist/agents/skills/claude-code/harness-test-advisor/skill.yaml +4 -1
- package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +27 -25
- package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/outcome-eval/SKILL.md +97 -0
- package/dist/agents/skills/claude-code/outcome-eval/skill.yaml +51 -0
- package/dist/agents/skills/codex/harness-audit-harness-strength/SKILL.md +188 -0
- package/dist/agents/skills/codex/harness-audit-harness-strength/skill.yaml +54 -0
- package/dist/agents/skills/codex/harness-autopilot/SKILL.md +2 -0
- package/dist/agents/skills/codex/harness-brainstorming/SKILL.md +28 -14
- package/dist/agents/skills/codex/harness-execution/SKILL.md +1 -1
- package/dist/agents/skills/codex/harness-git-workflow/SKILL.md +2 -0
- package/dist/agents/skills/codex/harness-ideate/SKILL.md +2 -0
- package/dist/agents/skills/codex/harness-knowledge-pipeline/SKILL.md +2 -0
- package/dist/agents/skills/codex/harness-roadmap/SKILL.md +62 -4
- package/dist/agents/skills/codex/harness-roadmap-pilot/SKILL.md +2 -0
- package/dist/agents/skills/codex/harness-test-advisor/SKILL.md +80 -2
- package/dist/agents/skills/codex/harness-test-advisor/skill.yaml +4 -1
- package/dist/agents/skills/codex/initialize-harness-project/SKILL.md +27 -25
- package/dist/agents/skills/codex/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/codex/outcome-eval/SKILL.md +97 -0
- package/dist/agents/skills/codex/outcome-eval/skill.yaml +51 -0
- package/dist/agents/skills/cursor/harness-audit-harness-strength/SKILL.md +188 -0
- package/dist/agents/skills/cursor/harness-audit-harness-strength/skill.yaml +54 -0
- package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +2 -0
- package/dist/agents/skills/cursor/harness-brainstorming/SKILL.md +28 -14
- package/dist/agents/skills/cursor/harness-execution/SKILL.md +1 -1
- package/dist/agents/skills/cursor/harness-git-workflow/SKILL.md +2 -0
- package/dist/agents/skills/cursor/harness-ideate/SKILL.md +2 -0
- package/dist/agents/skills/cursor/harness-knowledge-pipeline/SKILL.md +2 -0
- package/dist/agents/skills/cursor/harness-roadmap/SKILL.md +62 -4
- package/dist/agents/skills/cursor/harness-roadmap-pilot/SKILL.md +2 -0
- package/dist/agents/skills/cursor/harness-test-advisor/SKILL.md +80 -2
- package/dist/agents/skills/cursor/harness-test-advisor/skill.yaml +4 -1
- package/dist/agents/skills/cursor/initialize-harness-project/SKILL.md +27 -25
- package/dist/agents/skills/cursor/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/cursor/outcome-eval/SKILL.md +97 -0
- package/dist/agents/skills/cursor/outcome-eval/skill.yaml +51 -0
- package/dist/agents/skills/gemini-cli/harness-audit-harness-strength/SKILL.md +188 -0
- package/dist/agents/skills/gemini-cli/harness-audit-harness-strength/skill.yaml +54 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +2 -0
- package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +28 -14
- package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +1 -1
- package/dist/agents/skills/gemini-cli/harness-git-workflow/SKILL.md +2 -0
- package/dist/agents/skills/gemini-cli/harness-ideate/SKILL.md +2 -0
- package/dist/agents/skills/gemini-cli/harness-knowledge-pipeline/SKILL.md +2 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +62 -4
- package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/SKILL.md +2 -0
- package/dist/agents/skills/gemini-cli/harness-test-advisor/SKILL.md +80 -2
- package/dist/agents/skills/gemini-cli/harness-test-advisor/skill.yaml +4 -1
- package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +27 -25
- package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +1 -0
- package/dist/agents/skills/gemini-cli/outcome-eval/SKILL.md +97 -0
- package/dist/agents/skills/gemini-cli/outcome-eval/skill.yaml +51 -0
- package/dist/agents/skills/tests/harness-test-advisor.test.ts +94 -0
- package/dist/{agents-md-WMJO5HSM.js → agents-md-XOJE5ETA.js} +2 -2
- package/dist/{architecture-EVYVGPRZ.js → architecture-JEZPJ725.js} +3 -3
- package/dist/{assess-project-KZG563SO.js → assess-project-RHXOQNMM.js} +1 -1
- package/dist/bin/harness-mcp.js +13 -13
- package/dist/bin/harness.js +22 -22
- package/dist/{check-phase-gate-MK364VXS.js → check-phase-gate-GNDOMS35.js} +3 -3
- package/dist/{chunk-VBNJAKUH.js → chunk-3ISHDWO7.js} +1 -1
- package/dist/{chunk-UJFNIWC7.js → chunk-527G27VI.js} +2 -2
- package/dist/{chunk-5XL5QJ5B.js → chunk-6WQCLCBO.js} +1 -1
- package/dist/{chunk-UXPWSV3B.js → chunk-BYVT5LVO.js} +3 -3
- package/dist/{chunk-HRSE6IQD.js → chunk-DE5U6KOL.js} +1 -1
- package/dist/{chunk-B7KMTHN3.js → chunk-GGKRA7A7.js} +1 -1
- package/dist/{chunk-STESM73J.js → chunk-GSP2XIVS.js} +1 -1
- package/dist/{chunk-KBCPELBC.js → chunk-HEIMJJI4.js} +2 -2
- package/dist/{chunk-KI6PHH6Q.js → chunk-HWTUUQOW.js} +3 -3
- package/dist/{chunk-2SNRCAC3.js → chunk-KAJOS3BA.js} +2 -2
- package/dist/{chunk-C7J55C6E.js → chunk-MGUPSE6D.js} +5 -5
- package/dist/{chunk-GOHWCHCS.js → chunk-N24HCQA4.js} +2243 -776
- package/dist/{chunk-EEFRPEWT.js → chunk-NWLGL3IR.js} +1 -1
- package/dist/{chunk-UUO4K7NX.js → chunk-ONCPJGHY.js} +6 -6
- package/dist/{chunk-X4EFYVCZ.js → chunk-PC2R5RUJ.js} +1 -1
- package/dist/{chunk-7EQAZKJ5.js → chunk-QBC7DI4Q.js} +1 -1
- package/dist/{chunk-UBZQE3JN.js → chunk-UX3PQKVZ.js} +7 -2
- package/dist/{chunk-CAQPSFPT.js → chunk-WWEVS7RO.js} +453 -91
- package/dist/{chunk-4BDOSCNY.js → chunk-XFU6SB2Q.js} +1015 -648
- package/dist/{chunk-LADPYELQ.js → chunk-XX4OLNWQ.js} +2 -2
- package/dist/{chunk-FZ5MBXEG.js → chunk-YQSYCBAH.js} +6 -6
- package/dist/{chunk-ACOOG3UW.js → chunk-Z4AWEIBY.js} +3 -3
- package/dist/{ci-workflow-IW2H5DC4.js → ci-workflow-ORZ4F45F.js} +2 -2
- package/dist/{dist-JCFK263L.js → dist-LHINSVK4.js} +85 -1
- package/dist/{docs-7CP6VV42.js → docs-AU3DXFFO.js} +3 -3
- package/dist/{engine-MKJEBWU7.js → engine-6GPWOYQH.js} +2 -2
- package/dist/{entropy-6JOZJYG7.js → entropy-VLKDRMRT.js} +2 -2
- package/dist/{feedback-T65AEJEG.js → feedback-YXYY44ZC.js} +1 -1
- package/dist/{generate-agent-definitions-4VI4YTO2.js → generate-agent-definitions-XIHQPKG3.js} +3 -3
- package/dist/hooks/cost-tracker.js +29 -6
- package/dist/index.d.ts +8 -8
- package/dist/index.js +22 -22
- package/dist/{loader-AWTHHE3A.js → loader-YAN56MT3.js} +2 -2
- package/dist/{mcp-JBIBINO2.js → mcp-RK3SFVYB.js} +13 -13
- package/dist/{performance-NCOUDOMW.js → performance-64DPTLLQ.js} +3 -3
- package/dist/{review-pipeline-YIC6JPMY.js → review-pipeline-NENG6LW7.js} +2 -2
- package/dist/{runtime-5MHV4UEE.js → runtime-FFIIRT2T.js} +2 -2
- package/dist/{security-VZPJNIDP.js → security-3PIBN35B.js} +1 -1
- package/dist/templates/basic/harness.config.json.hbs +34 -0
- package/dist/templates/ci/README.md +86 -0
- package/dist/templates/ci/required-review.ruleset.json +20 -0
- package/dist/templates/ci/required-review.yml.hbs +57 -0
- package/dist/templates/ci/template.json +5 -0
- package/dist/templates/intermediate/harness.config.json.hbs +36 -0
- package/dist/templates/orchestrator/harness.orchestrator.md +9 -0
- package/dist/{tool-tiers-B7JC2XC3.js → tool-tiers-OKK5FE57.js} +2 -0
- package/dist/{validate-7BE4VTFI.js → validate-7IAF2ES3.js} +3 -3
- package/dist/{validate-cross-check-F7GEBRDH.js → validate-cross-check-QPSAOZKD.js} +2 -2
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -12,19 +12,19 @@ import {
|
|
|
12
12
|
runSnapshotCapture,
|
|
13
13
|
runUninstall,
|
|
14
14
|
runUninstallConstraints
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-XFU6SB2Q.js";
|
|
16
16
|
import {
|
|
17
17
|
generateRuntime
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-6WQCLCBO.js";
|
|
19
19
|
import {
|
|
20
20
|
generateAgentsMd
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-QBC7DI4Q.js";
|
|
22
22
|
import {
|
|
23
23
|
generateCIWorkflow
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-GSP2XIVS.js";
|
|
25
25
|
import {
|
|
26
26
|
runCrossCheck
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-3ISHDWO7.js";
|
|
28
28
|
import {
|
|
29
29
|
AGENT_DESCRIPTIONS,
|
|
30
30
|
DEFAULT_TOOLS,
|
|
@@ -33,14 +33,14 @@ import {
|
|
|
33
33
|
generateAgentDefinitions,
|
|
34
34
|
renderClaudeCodeAgent,
|
|
35
35
|
renderGeminiAgent
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-NWLGL3IR.js";
|
|
37
37
|
import "./chunk-KET4QQZB.js";
|
|
38
38
|
import {
|
|
39
39
|
runScan
|
|
40
40
|
} from "./chunk-2N4OENGE.js";
|
|
41
41
|
import {
|
|
42
42
|
TemplateEngine
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-UX3PQKVZ.js";
|
|
44
44
|
import "./chunk-CQ553GZO.js";
|
|
45
45
|
import {
|
|
46
46
|
generateSkillFiles
|
|
@@ -48,7 +48,7 @@ import {
|
|
|
48
48
|
import {
|
|
49
49
|
listPersonas,
|
|
50
50
|
loadPersona
|
|
51
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-PC2R5RUJ.js";
|
|
52
52
|
import {
|
|
53
53
|
detectTrigger,
|
|
54
54
|
runPersona
|
|
@@ -63,26 +63,26 @@ import {
|
|
|
63
63
|
OutputFormatter,
|
|
64
64
|
OutputMode,
|
|
65
65
|
runCheckPhaseGate
|
|
66
|
-
} from "./chunk-
|
|
66
|
+
} from "./chunk-KAJOS3BA.js";
|
|
67
67
|
import {
|
|
68
68
|
createHarnessServer,
|
|
69
69
|
generateSlashCommands,
|
|
70
70
|
getToolDefinitions,
|
|
71
71
|
startServer
|
|
72
|
-
} from "./chunk-
|
|
73
|
-
import "./chunk-
|
|
74
|
-
import "./chunk-
|
|
75
|
-
import "./chunk-
|
|
76
|
-
import "./chunk-
|
|
77
|
-
import "./chunk-
|
|
72
|
+
} from "./chunk-WWEVS7RO.js";
|
|
73
|
+
import "./chunk-HEIMJJI4.js";
|
|
74
|
+
import "./chunk-XX4OLNWQ.js";
|
|
75
|
+
import "./chunk-YQSYCBAH.js";
|
|
76
|
+
import "./chunk-Z4AWEIBY.js";
|
|
77
|
+
import "./chunk-ONCPJGHY.js";
|
|
78
78
|
import "./chunk-IOW3MW2K.js";
|
|
79
|
-
import "./chunk-
|
|
79
|
+
import "./chunk-BYVT5LVO.js";
|
|
80
80
|
import "./chunk-3ISINLYT.js";
|
|
81
81
|
import "./chunk-CLI4K2CH.js";
|
|
82
|
-
import "./chunk-
|
|
83
|
-
import "./chunk-
|
|
84
|
-
import "./chunk-
|
|
85
|
-
import "./chunk-
|
|
82
|
+
import "./chunk-HWTUUQOW.js";
|
|
83
|
+
import "./chunk-527G27VI.js";
|
|
84
|
+
import "./chunk-DE5U6KOL.js";
|
|
85
|
+
import "./chunk-MGUPSE6D.js";
|
|
86
86
|
import "./chunk-RC3OI5NK.js";
|
|
87
87
|
import "./chunk-W6Y7ZW3Y.js";
|
|
88
88
|
import "./chunk-27AJKSQY.js";
|
|
@@ -92,7 +92,7 @@ import {
|
|
|
92
92
|
findConfigFile,
|
|
93
93
|
loadConfig,
|
|
94
94
|
resolveConfig
|
|
95
|
-
} from "./chunk-
|
|
95
|
+
} from "./chunk-GGKRA7A7.js";
|
|
96
96
|
import "./chunk-ZCZD7FHU.js";
|
|
97
97
|
import {
|
|
98
98
|
logger
|
|
@@ -102,7 +102,7 @@ import {
|
|
|
102
102
|
ExitCode,
|
|
103
103
|
handleError
|
|
104
104
|
} from "./chunk-3WGJMBKH.js";
|
|
105
|
-
import "./chunk-
|
|
105
|
+
import "./chunk-N24HCQA4.js";
|
|
106
106
|
import "./chunk-BM3PWGXQ.js";
|
|
107
107
|
import "./chunk-N55WOGN3.js";
|
|
108
108
|
import "./chunk-BDGTZRZ6.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
listPersonas,
|
|
3
3
|
loadPersona
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-PC2R5RUJ.js";
|
|
5
|
+
import "./chunk-N24HCQA4.js";
|
|
6
6
|
import "./chunk-N55WOGN3.js";
|
|
7
7
|
import "./chunk-BDGTZRZ6.js";
|
|
8
8
|
import "./chunk-PP6ZRL5T.js";
|
|
@@ -2,22 +2,22 @@ import {
|
|
|
2
2
|
createHarnessServer,
|
|
3
3
|
getToolDefinitions,
|
|
4
4
|
startServer
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-WWEVS7RO.js";
|
|
6
|
+
import "./chunk-HEIMJJI4.js";
|
|
7
|
+
import "./chunk-XX4OLNWQ.js";
|
|
8
|
+
import "./chunk-YQSYCBAH.js";
|
|
9
|
+
import "./chunk-Z4AWEIBY.js";
|
|
10
|
+
import "./chunk-ONCPJGHY.js";
|
|
11
11
|
import "./chunk-IOW3MW2K.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-BYVT5LVO.js";
|
|
13
13
|
import "./chunk-3ISINLYT.js";
|
|
14
14
|
import "./chunk-CLI4K2CH.js";
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-HWTUUQOW.js";
|
|
16
|
+
import "./chunk-527G27VI.js";
|
|
17
17
|
import {
|
|
18
18
|
resolveProjectConfig
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import "./chunk-
|
|
19
|
+
} from "./chunk-DE5U6KOL.js";
|
|
20
|
+
import "./chunk-MGUPSE6D.js";
|
|
21
21
|
import {
|
|
22
22
|
resultToMcpResponse
|
|
23
23
|
} from "./chunk-RC3OI5NK.js";
|
|
@@ -25,11 +25,11 @@ import "./chunk-W6Y7ZW3Y.js";
|
|
|
25
25
|
import "./chunk-27AJKSQY.js";
|
|
26
26
|
import "./chunk-6B6UN6SG.js";
|
|
27
27
|
import "./chunk-HIK6OEUF.js";
|
|
28
|
-
import "./chunk-
|
|
28
|
+
import "./chunk-GGKRA7A7.js";
|
|
29
29
|
import "./chunk-ZCZD7FHU.js";
|
|
30
30
|
import "./chunk-EBJQ6N4M.js";
|
|
31
31
|
import "./chunk-3WGJMBKH.js";
|
|
32
|
-
import "./chunk-
|
|
32
|
+
import "./chunk-N24HCQA4.js";
|
|
33
33
|
import "./chunk-N55WOGN3.js";
|
|
34
34
|
import "./chunk-BDGTZRZ6.js";
|
|
35
35
|
import "./chunk-PP6ZRL5T.js";
|
|
@@ -7,13 +7,13 @@ import {
|
|
|
7
7
|
handleGetPerfBaselines,
|
|
8
8
|
handleUpdatePerfBaselines,
|
|
9
9
|
updatePerfBaselinesDefinition
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ONCPJGHY.js";
|
|
11
11
|
import "./chunk-RC3OI5NK.js";
|
|
12
12
|
import "./chunk-W6Y7ZW3Y.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-GGKRA7A7.js";
|
|
14
14
|
import "./chunk-ZCZD7FHU.js";
|
|
15
15
|
import "./chunk-3WGJMBKH.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-N24HCQA4.js";
|
|
17
17
|
import "./chunk-N55WOGN3.js";
|
|
18
18
|
import "./chunk-BDGTZRZ6.js";
|
|
19
19
|
import "./chunk-PP6ZRL5T.js";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
handleRunCodeReview,
|
|
3
3
|
runCodeReviewDefinition
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-XX4OLNWQ.js";
|
|
5
5
|
import "./chunk-W6Y7ZW3Y.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-N24HCQA4.js";
|
|
7
7
|
import "./chunk-N55WOGN3.js";
|
|
8
8
|
import "./chunk-BDGTZRZ6.js";
|
|
9
9
|
import "./chunk-PP6ZRL5T.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
generateRuntime
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-6WQCLCBO.js";
|
|
4
4
|
import "./chunk-KET4QQZB.js";
|
|
5
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-N24HCQA4.js";
|
|
6
6
|
import "./chunk-N55WOGN3.js";
|
|
7
7
|
import "./chunk-BDGTZRZ6.js";
|
|
8
8
|
import "./chunk-PP6ZRL5T.js";
|
|
@@ -7,8 +7,42 @@
|
|
|
7
7
|
{ "name": "services", "pattern": "src/services/**", "allowedDependencies": ["types", "domain"] },
|
|
8
8
|
{ "name": "api", "pattern": "src/api/**", "allowedDependencies": ["types", "domain", "services"] }
|
|
9
9
|
],
|
|
10
|
+
"architecture": {
|
|
11
|
+
"enabled": true,
|
|
12
|
+
"baselinePath": ".harness/arch/baselines.json",
|
|
13
|
+
"thresholds": {
|
|
14
|
+
"circular-deps": { "max": 0 },
|
|
15
|
+
"layer-violations": { "max": 0 },
|
|
16
|
+
"complexity": { "max": 20 },
|
|
17
|
+
"module-size": { "maxFiles": 50, "maxLoc": 5000 },
|
|
18
|
+
"dependency-depth": { "max": 8 }
|
|
19
|
+
}
|
|
20
|
+
},
|
|
10
21
|
"agentsMapPath": "./AGENTS.md",
|
|
11
22
|
"docsDir": "./docs",
|
|
23
|
+
"security": {
|
|
24
|
+
"enabled": true,
|
|
25
|
+
"strict": false,
|
|
26
|
+
"exclude": ["**/node_modules/**", "**/dist/**", "**/*.test.ts"]
|
|
27
|
+
},
|
|
28
|
+
"entropy": {
|
|
29
|
+
"excludePatterns": ["**/node_modules/**", "**/dist/**", "**/*.test.ts"],
|
|
30
|
+
"autoFix": false
|
|
31
|
+
},
|
|
32
|
+
"performance": {
|
|
33
|
+
"complexity": {
|
|
34
|
+
"enabled": true,
|
|
35
|
+
"thresholds": {
|
|
36
|
+
"cyclomaticComplexity": { "error": 20, "warn": 15 }
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"coupling": {
|
|
40
|
+
"enabled": true,
|
|
41
|
+
"thresholds": {
|
|
42
|
+
"fanOut": { "warn": 15 }
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
12
46
|
"template": {
|
|
13
47
|
"level": "basic",
|
|
14
48
|
"version": 1
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# `ci-required-review` — opt-in required-review gate
|
|
2
|
+
|
|
3
|
+
This template wires the built-in `harness review-ci` command into a GitHub
|
|
4
|
+
Actions check that branch protection can mark as **required**. It is an opt-in,
|
|
5
|
+
discoverable template (rendered by `harness init`); it is not part of any level
|
|
6
|
+
scaffold.
|
|
7
|
+
|
|
8
|
+
## What it renders
|
|
9
|
+
|
|
10
|
+
| File | Purpose |
|
|
11
|
+
| ------------------------------ | --------------------------------------------------------------------------------------- |
|
|
12
|
+
| `required-review.yml` | A `pull_request` workflow whose single job runs `harness review-ci` as the gate. |
|
|
13
|
+
| `required-review.ruleset.json` | A GitHub repository ruleset that marks the workflow's check as a required status check. |
|
|
14
|
+
|
|
15
|
+
### The binding contract
|
|
16
|
+
|
|
17
|
+
The workflow job's `name:` is the literal string **`required-review`**, and the
|
|
18
|
+
ruleset's `required_status_checks[].context` is the same literal
|
|
19
|
+
**`required-review`**. GitHub matches required checks by this name. **Do not
|
|
20
|
+
rename one without the other** — if they drift, the ruleset will require a check
|
|
21
|
+
that never reports and every PR will be blocked indefinitely.
|
|
22
|
+
|
|
23
|
+
## Template variables
|
|
24
|
+
|
|
25
|
+
`harness init` renders `required-review.yml.hbs` with three Handlebars variables.
|
|
26
|
+
The engine compiles in strict mode, so all three must be supplied:
|
|
27
|
+
|
|
28
|
+
| Variable | Default | Meaning |
|
|
29
|
+
| ------------ | ----------------- | ------------------------------------------------------- |
|
|
30
|
+
| `runner` | `claude` | Which review runner `review-ci` uses for the LLM tier. |
|
|
31
|
+
| `blockOn` | `request-changes` | The assessment level at which the gate fails the check. |
|
|
32
|
+
| `baseBranch` | _(required)_ | The PR base branch the workflow triggers on. |
|
|
33
|
+
|
|
34
|
+
> GitHub Actions `${{ ... }}` expressions in the template are emitted verbatim
|
|
35
|
+
> (escaped past Handlebars); only `runner`, `blockOn`, and `baseBranch` are
|
|
36
|
+
> substituted.
|
|
37
|
+
|
|
38
|
+
## Applying the ruleset (deferred — run once, by a repo admin)
|
|
39
|
+
|
|
40
|
+
The ruleset is **not** applied automatically by this template or by any CI.
|
|
41
|
+
After the workflow has run at least once on a PR (so the `required-review` check
|
|
42
|
+
is known to GitHub), a repository admin applies the ruleset with the GitHub CLI:
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
gh api repos/{owner}/{repo}/rulesets --input required-review.ruleset.json
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Replace `{owner}/{repo}` with your repository. The ruleset targets the default
|
|
49
|
+
branch (`~DEFAULT_BRANCH`), which is the portable choice across forks and renames.
|
|
50
|
+
`strict_required_status_checks_policy: true` requires branches to be up to date
|
|
51
|
+
before merging.
|
|
52
|
+
|
|
53
|
+
## Per-runner secrets
|
|
54
|
+
|
|
55
|
+
Set these as repository **Actions secrets**. The workflow exposes all of them as
|
|
56
|
+
environment variables; the runner you select reads the one it needs. The
|
|
57
|
+
heuristic floor of `review-ci` runs regardless and can block on its own; the LLM
|
|
58
|
+
tier is secret-gated and **degrades gracefully** (skips the LLM pass) when its
|
|
59
|
+
secret is absent.
|
|
60
|
+
|
|
61
|
+
| `runner` | Secret env var(s) |
|
|
62
|
+
| ------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
|
|
63
|
+
| `claude` | `ANTHROPIC_API_KEY` |
|
|
64
|
+
| `antigravity` (and the superseded `gemini`) | `GEMINI_API_KEY` _(unverified for CI — selecting antigravity without a working secret yields floor-only)_ |
|
|
65
|
+
| `codex` | `OPENAI_API_KEY` |
|
|
66
|
+
| `local` | `HARNESS_LOCAL_ENDPOINT`, `HARNESS_LOCAL_MODEL` — **no API key; secret-free and cost-free** |
|
|
67
|
+
|
|
68
|
+
The `local` runner points at your own OpenAI-compatible endpoint, so it needs no
|
|
69
|
+
API-key secret and incurs no per-call cost.
|
|
70
|
+
|
|
71
|
+
## Notes
|
|
72
|
+
|
|
73
|
+
- `--comment` (PR-review posting) is **not** rendered into the workflow today: it
|
|
74
|
+
is a non-functional stub in the published CLI (it logs a "not wired" warning and
|
|
75
|
+
posts nothing), and including it invited an over-broad `pull-requests: write`
|
|
76
|
+
permission. The flag still exists on the CLI for when PR posting lands; the
|
|
77
|
+
rendered run step will re-add `--comment` (and the workflow will re-add
|
|
78
|
+
`pull-requests: write`) once posting is actually implemented. The check gates on
|
|
79
|
+
the command's exit code, so the required check works without it.
|
|
80
|
+
- The rendered workflow diffs `origin/${{ github.base_ref }}...HEAD` (the PR's
|
|
81
|
+
real base, resolved at runtime), with `fetch-depth: 0` and an explicit
|
|
82
|
+
`git fetch origin ${{ github.base_ref }}` step so the base ref is reachable.
|
|
83
|
+
This avoids `review-ci`'s `origin/HEAD` fallback silently reviewing the wrong
|
|
84
|
+
(or empty) diff when the PR base is not `main`.
|
|
85
|
+
- The workflow pins `@harness-engineering/cli@2.8.0` for reproducibility; bump
|
|
86
|
+
the pin in the rendered workflow to adopt newer releases.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "required-review",
|
|
3
|
+
"target": "branch",
|
|
4
|
+
"enforcement": "active",
|
|
5
|
+
"conditions": {
|
|
6
|
+
"ref_name": {
|
|
7
|
+
"include": ["~DEFAULT_BRANCH"],
|
|
8
|
+
"exclude": []
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"rules": [
|
|
12
|
+
{
|
|
13
|
+
"type": "required_status_checks",
|
|
14
|
+
"parameters": {
|
|
15
|
+
"strict_required_status_checks_policy": true,
|
|
16
|
+
"required_status_checks": [{ "context": "required-review" }]
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Rendered by `harness init` (ci-required-review template).
|
|
2
|
+
# The job name below ("required-review") is the check name bound as REQUIRED
|
|
3
|
+
# by required-review.ruleset.json. Keep them identical.
|
|
4
|
+
#
|
|
5
|
+
# NOTE ON ESCAPING: GitHub Actions expressions ($\{{ ... }}) collide with the
|
|
6
|
+
# Handlebars template engine under its strict compile mode, which provides no
|
|
7
|
+
# raw/literal block helper. Each GH expression below therefore escapes the
|
|
8
|
+
# opening braces per-line (a backslash before the mustache: $\{{ ... }}) so
|
|
9
|
+
# Handlebars emits them verbatim (the rendered output is the literal
|
|
10
|
+
# dollar-double-brace form GitHub Actions evaluates at runtime). A future editor
|
|
11
|
+
# must NOT "fix" these by removing the backslash — that breaks the render.
|
|
12
|
+
# Only the runner and blockOn mustaches are real template vars (substituted);
|
|
13
|
+
# baseBranch is real too, but the diff range uses the RUNTIME github.base_ref.
|
|
14
|
+
name: Required Review
|
|
15
|
+
|
|
16
|
+
on:
|
|
17
|
+
pull_request:
|
|
18
|
+
branches: ['{{baseBranch}}']
|
|
19
|
+
|
|
20
|
+
# Least privilege: review-ci only reads the diff today. --comment PR posting is
|
|
21
|
+
# not yet wired, so no write scope is requested. Re-add `pull-requests: write`
|
|
22
|
+
# when --comment PR review posting is actually implemented and rendered.
|
|
23
|
+
permissions:
|
|
24
|
+
contents: read
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
required-review:
|
|
28
|
+
name: required-review
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
env:
|
|
31
|
+
# The heuristic floor runs regardless of runner. The LLM tier only
|
|
32
|
+
# activates when its secret is present, degrading gracefully otherwise.
|
|
33
|
+
ANTHROPIC_API_KEY: $\{{ secrets.ANTHROPIC_API_KEY }}
|
|
34
|
+
GEMINI_API_KEY: $\{{ secrets.GEMINI_API_KEY }}
|
|
35
|
+
OPENAI_API_KEY: $\{{ secrets.OPENAI_API_KEY }}
|
|
36
|
+
HARNESS_LOCAL_ENDPOINT: $\{{ secrets.HARNESS_LOCAL_ENDPOINT }}
|
|
37
|
+
HARNESS_LOCAL_MODEL: $\{{ secrets.HARNESS_LOCAL_MODEL }}
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/checkout@v4
|
|
40
|
+
with:
|
|
41
|
+
# Full history so the PR base branch is reachable for the diff range.
|
|
42
|
+
fetch-depth: 0
|
|
43
|
+
- name: Fetch PR base branch
|
|
44
|
+
# actions/checkout leaves origin/HEAD unresolved on pull_request events,
|
|
45
|
+
# which would make review-ci fall back to origin/main...HEAD (wrong/empty
|
|
46
|
+
# diff if the PR base is not main). Fetch the real base so the explicit
|
|
47
|
+
# origin/$\{{ github.base_ref }}...HEAD range below resolves.
|
|
48
|
+
run: git fetch origin $\{{ github.base_ref }}
|
|
49
|
+
- uses: actions/setup-node@v4
|
|
50
|
+
with:
|
|
51
|
+
node-version: '22'
|
|
52
|
+
- run: npm install -g @harness-engineering/cli@2.8.0
|
|
53
|
+
- name: Run required review gate
|
|
54
|
+
# Diff against the PR's real base (runtime github.base_ref), not the CLI's
|
|
55
|
+
# origin/HEAD fallback. The runner/block-on values are substituted; the GH
|
|
56
|
+
# expression is preserved verbatim (see escaping note at top of file).
|
|
57
|
+
run: harness review-ci --runner {{runner}} --block-on {{blockOn}} --diff "origin/$\{{ github.base_ref }}...HEAD"
|
|
@@ -13,8 +13,44 @@
|
|
|
13
13
|
"boundaries": {
|
|
14
14
|
"requireSchema": ["src/api/**"]
|
|
15
15
|
},
|
|
16
|
+
"architecture": {
|
|
17
|
+
"enabled": true,
|
|
18
|
+
"baselinePath": ".harness/arch/baselines.json",
|
|
19
|
+
"thresholds": {
|
|
20
|
+
"circular-deps": { "max": 0 },
|
|
21
|
+
"layer-violations": { "max": 0 },
|
|
22
|
+
"forbidden-imports": { "max": 0 },
|
|
23
|
+
"complexity": { "max": 15 },
|
|
24
|
+
"coupling": { "maxFanIn": 15, "maxFanOut": 12 },
|
|
25
|
+
"module-size": { "maxFiles": 40, "maxLoc": 4000 },
|
|
26
|
+
"dependency-depth": { "max": 8 }
|
|
27
|
+
}
|
|
28
|
+
},
|
|
16
29
|
"agentsMapPath": "./AGENTS.md",
|
|
17
30
|
"docsDir": "./docs",
|
|
31
|
+
"security": {
|
|
32
|
+
"enabled": true,
|
|
33
|
+
"strict": false,
|
|
34
|
+
"exclude": ["**/node_modules/**", "**/dist/**", "**/*.test.ts"]
|
|
35
|
+
},
|
|
36
|
+
"entropy": {
|
|
37
|
+
"excludePatterns": ["**/node_modules/**", "**/dist/**", "**/*.test.ts"],
|
|
38
|
+
"autoFix": false
|
|
39
|
+
},
|
|
40
|
+
"performance": {
|
|
41
|
+
"complexity": {
|
|
42
|
+
"enabled": true,
|
|
43
|
+
"thresholds": {
|
|
44
|
+
"cyclomaticComplexity": { "error": 15, "warn": 10 }
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"coupling": {
|
|
48
|
+
"enabled": true,
|
|
49
|
+
"thresholds": {
|
|
50
|
+
"fanOut": { "warn": 12 }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
},
|
|
18
54
|
"template": {
|
|
19
55
|
"level": "intermediate",
|
|
20
56
|
"version": 1
|
|
@@ -102,6 +102,14 @@ high-quality, architecturally sound delivery:
|
|
|
102
102
|
(b) the fix required more than one commit on the issue branch, or
|
|
103
103
|
(c) execution involved >1 attempt (`Attempt Number` above is greater than 1).
|
|
104
104
|
Otherwise skip silently. The triggers are mechanical — no judgment required.
|
|
105
|
+
6.5. **Outcome Eval:** Use `/harness:outcome-eval` to judge whether the
|
|
106
|
+
implementation satisfied its spec. It gathers the diff and test output,
|
|
107
|
+
resolves the spec's acceptance section, and emits a confidence-rated
|
|
108
|
+
`OutcomeVerdict`. **Verdict authority (derived in TypeScript, never from the
|
|
109
|
+
LLM): a high-confidence `NOT_SATISFIED` BLOCKS ship — halt here and fix the
|
|
110
|
+
implementation or spec before proceeding; every other verdict (all
|
|
111
|
+
`SATISFIED`, all `INCONCLUSIVE`, and medium/low `NOT_SATISFIED`) is advisory
|
|
112
|
+
— report it and continue.**
|
|
105
113
|
7. **Ship:** When the review is clean, you are pre-authorized to ship without asking:
|
|
106
114
|
- Create a topic branch if you are still on `main`/`master` (e.g. `feat/{{ issue.identifier }}`).
|
|
107
115
|
- Stage your changes and create a descriptive commit (Conventional Commits style).
|
|
@@ -125,5 +133,6 @@ high-quality, architecturally sound delivery:
|
|
|
125
133
|
`docs/solutions/<track>/<category>/`). The `.harness/learnings.md` file remains
|
|
126
134
|
for ephemeral session notes only and is not preserved as compounding knowledge.
|
|
127
135
|
- Step 7 (Ship) is part of the standard workflow. Do not pause to ask for commit authorization — completing the issue means the PR has been opened.
|
|
136
|
+
- Step 6.5 (Outcome Eval) is a gate: a high-confidence `NOT_SATISFIED` verdict blocks Ship. Do not proceed to step 7 until the verdict is non-blocking.
|
|
128
137
|
|
|
129
138
|
Attempt Number: {{ attempt }}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
handleValidateProject,
|
|
3
3
|
validateToolDefinition
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-HWTUUQOW.js";
|
|
5
|
+
import "./chunk-DE5U6KOL.js";
|
|
6
6
|
import "./chunk-W6Y7ZW3Y.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-N24HCQA4.js";
|
|
8
8
|
import "./chunk-N55WOGN3.js";
|
|
9
9
|
import "./chunk-BDGTZRZ6.js";
|
|
10
10
|
import "./chunk-PP6ZRL5T.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@harness-engineering/cli",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "CLI for Harness Engineering toolkit",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -39,15 +39,15 @@
|
|
|
39
39
|
"web-tree-sitter": "^0.24.7",
|
|
40
40
|
"yaml": "^2.8.3",
|
|
41
41
|
"zod": "^3.25.76",
|
|
42
|
-
"@harness-engineering/core": "0.
|
|
43
|
-
"@harness-engineering/dashboard": "0.
|
|
44
|
-
"@harness-engineering/graph": "0.11.
|
|
42
|
+
"@harness-engineering/core": "0.30.1",
|
|
43
|
+
"@harness-engineering/dashboard": "0.10.0",
|
|
44
|
+
"@harness-engineering/graph": "0.11.1",
|
|
45
45
|
"@harness-engineering/linter-gen": "0.1.7",
|
|
46
|
-
"@harness-engineering/orchestrator": "0.8.
|
|
47
|
-
"@harness-engineering/types": "0.16.
|
|
46
|
+
"@harness-engineering/orchestrator": "0.8.3",
|
|
47
|
+
"@harness-engineering/types": "0.16.1"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@harness-engineering/intelligence": "0.
|
|
50
|
+
"@harness-engineering/intelligence": "0.3.1"
|
|
51
51
|
},
|
|
52
52
|
"peerDependenciesMeta": {
|
|
53
53
|
"@harness-engineering/intelligence": {
|