@harness-engineering/cli 2.8.0 → 3.0.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.
Files changed (119) hide show
  1. package/dist/agents/skills/claude-code/harness-audit-harness-strength/SKILL.md +188 -0
  2. package/dist/agents/skills/claude-code/harness-audit-harness-strength/skill.yaml +54 -0
  3. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +2 -0
  4. package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +28 -14
  5. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +1 -1
  6. package/dist/agents/skills/claude-code/harness-git-workflow/SKILL.md +2 -0
  7. package/dist/agents/skills/claude-code/harness-ideate/SKILL.md +2 -0
  8. package/dist/agents/skills/claude-code/harness-knowledge-pipeline/SKILL.md +2 -0
  9. package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +62 -4
  10. package/dist/agents/skills/claude-code/harness-roadmap-pilot/SKILL.md +2 -0
  11. package/dist/agents/skills/claude-code/harness-test-advisor/SKILL.md +80 -2
  12. package/dist/agents/skills/claude-code/harness-test-advisor/skill.yaml +4 -1
  13. package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +27 -25
  14. package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +1 -0
  15. package/dist/agents/skills/claude-code/outcome-eval/SKILL.md +97 -0
  16. package/dist/agents/skills/claude-code/outcome-eval/skill.yaml +51 -0
  17. package/dist/agents/skills/codex/harness-audit-harness-strength/SKILL.md +188 -0
  18. package/dist/agents/skills/codex/harness-audit-harness-strength/skill.yaml +54 -0
  19. package/dist/agents/skills/codex/harness-autopilot/SKILL.md +2 -0
  20. package/dist/agents/skills/codex/harness-brainstorming/SKILL.md +28 -14
  21. package/dist/agents/skills/codex/harness-execution/SKILL.md +1 -1
  22. package/dist/agents/skills/codex/harness-git-workflow/SKILL.md +2 -0
  23. package/dist/agents/skills/codex/harness-ideate/SKILL.md +2 -0
  24. package/dist/agents/skills/codex/harness-knowledge-pipeline/SKILL.md +2 -0
  25. package/dist/agents/skills/codex/harness-roadmap/SKILL.md +62 -4
  26. package/dist/agents/skills/codex/harness-roadmap-pilot/SKILL.md +2 -0
  27. package/dist/agents/skills/codex/harness-test-advisor/SKILL.md +80 -2
  28. package/dist/agents/skills/codex/harness-test-advisor/skill.yaml +4 -1
  29. package/dist/agents/skills/codex/initialize-harness-project/SKILL.md +27 -25
  30. package/dist/agents/skills/codex/initialize-harness-project/skill.yaml +1 -0
  31. package/dist/agents/skills/codex/outcome-eval/SKILL.md +97 -0
  32. package/dist/agents/skills/codex/outcome-eval/skill.yaml +51 -0
  33. package/dist/agents/skills/cursor/harness-audit-harness-strength/SKILL.md +188 -0
  34. package/dist/agents/skills/cursor/harness-audit-harness-strength/skill.yaml +54 -0
  35. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +2 -0
  36. package/dist/agents/skills/cursor/harness-brainstorming/SKILL.md +28 -14
  37. package/dist/agents/skills/cursor/harness-execution/SKILL.md +1 -1
  38. package/dist/agents/skills/cursor/harness-git-workflow/SKILL.md +2 -0
  39. package/dist/agents/skills/cursor/harness-ideate/SKILL.md +2 -0
  40. package/dist/agents/skills/cursor/harness-knowledge-pipeline/SKILL.md +2 -0
  41. package/dist/agents/skills/cursor/harness-roadmap/SKILL.md +62 -4
  42. package/dist/agents/skills/cursor/harness-roadmap-pilot/SKILL.md +2 -0
  43. package/dist/agents/skills/cursor/harness-test-advisor/SKILL.md +80 -2
  44. package/dist/agents/skills/cursor/harness-test-advisor/skill.yaml +4 -1
  45. package/dist/agents/skills/cursor/initialize-harness-project/SKILL.md +27 -25
  46. package/dist/agents/skills/cursor/initialize-harness-project/skill.yaml +1 -0
  47. package/dist/agents/skills/cursor/outcome-eval/SKILL.md +97 -0
  48. package/dist/agents/skills/cursor/outcome-eval/skill.yaml +51 -0
  49. package/dist/agents/skills/gemini-cli/harness-audit-harness-strength/SKILL.md +188 -0
  50. package/dist/agents/skills/gemini-cli/harness-audit-harness-strength/skill.yaml +54 -0
  51. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +2 -0
  52. package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +28 -14
  53. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +1 -1
  54. package/dist/agents/skills/gemini-cli/harness-git-workflow/SKILL.md +2 -0
  55. package/dist/agents/skills/gemini-cli/harness-ideate/SKILL.md +2 -0
  56. package/dist/agents/skills/gemini-cli/harness-knowledge-pipeline/SKILL.md +2 -0
  57. package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +62 -4
  58. package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/SKILL.md +2 -0
  59. package/dist/agents/skills/gemini-cli/harness-test-advisor/SKILL.md +80 -2
  60. package/dist/agents/skills/gemini-cli/harness-test-advisor/skill.yaml +4 -1
  61. package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +27 -25
  62. package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +1 -0
  63. package/dist/agents/skills/gemini-cli/outcome-eval/SKILL.md +97 -0
  64. package/dist/agents/skills/gemini-cli/outcome-eval/skill.yaml +51 -0
  65. package/dist/agents/skills/tests/harness-test-advisor.test.ts +94 -0
  66. package/dist/{agents-md-WMJO5HSM.js → agents-md-XOJE5ETA.js} +2 -2
  67. package/dist/{architecture-EVYVGPRZ.js → architecture-JEZPJ725.js} +3 -3
  68. package/dist/{assess-project-KZG563SO.js → assess-project-RHXOQNMM.js} +1 -1
  69. package/dist/bin/harness-mcp.js +13 -13
  70. package/dist/bin/harness.js +22 -22
  71. package/dist/{check-phase-gate-MK364VXS.js → check-phase-gate-GNDOMS35.js} +3 -3
  72. package/dist/{chunk-VBNJAKUH.js → chunk-3ISHDWO7.js} +1 -1
  73. package/dist/{chunk-UJFNIWC7.js → chunk-527G27VI.js} +2 -2
  74. package/dist/{chunk-5XL5QJ5B.js → chunk-6WQCLCBO.js} +1 -1
  75. package/dist/{chunk-UXPWSV3B.js → chunk-BYVT5LVO.js} +3 -3
  76. package/dist/{chunk-HRSE6IQD.js → chunk-DE5U6KOL.js} +1 -1
  77. package/dist/{chunk-B7KMTHN3.js → chunk-GGKRA7A7.js} +1 -1
  78. package/dist/{chunk-STESM73J.js → chunk-GSP2XIVS.js} +1 -1
  79. package/dist/{chunk-KBCPELBC.js → chunk-HEIMJJI4.js} +2 -2
  80. package/dist/{chunk-KI6PHH6Q.js → chunk-HWTUUQOW.js} +3 -3
  81. package/dist/{chunk-2SNRCAC3.js → chunk-KAJOS3BA.js} +2 -2
  82. package/dist/{chunk-C7J55C6E.js → chunk-MGUPSE6D.js} +5 -5
  83. package/dist/{chunk-GOHWCHCS.js → chunk-N24HCQA4.js} +2243 -776
  84. package/dist/{chunk-EEFRPEWT.js → chunk-NWLGL3IR.js} +1 -1
  85. package/dist/{chunk-UUO4K7NX.js → chunk-ONCPJGHY.js} +6 -6
  86. package/dist/{chunk-X4EFYVCZ.js → chunk-PC2R5RUJ.js} +1 -1
  87. package/dist/{chunk-7EQAZKJ5.js → chunk-QBC7DI4Q.js} +1 -1
  88. package/dist/{chunk-UBZQE3JN.js → chunk-UX3PQKVZ.js} +7 -2
  89. package/dist/{chunk-CAQPSFPT.js → chunk-WWEVS7RO.js} +453 -91
  90. package/dist/{chunk-4BDOSCNY.js → chunk-XFU6SB2Q.js} +1015 -648
  91. package/dist/{chunk-LADPYELQ.js → chunk-XX4OLNWQ.js} +2 -2
  92. package/dist/{chunk-FZ5MBXEG.js → chunk-YQSYCBAH.js} +6 -6
  93. package/dist/{chunk-ACOOG3UW.js → chunk-Z4AWEIBY.js} +3 -3
  94. package/dist/{ci-workflow-IW2H5DC4.js → ci-workflow-ORZ4F45F.js} +2 -2
  95. package/dist/{dist-JCFK263L.js → dist-LHINSVK4.js} +85 -1
  96. package/dist/{docs-7CP6VV42.js → docs-AU3DXFFO.js} +3 -3
  97. package/dist/{engine-MKJEBWU7.js → engine-6GPWOYQH.js} +2 -2
  98. package/dist/{entropy-6JOZJYG7.js → entropy-VLKDRMRT.js} +2 -2
  99. package/dist/{feedback-T65AEJEG.js → feedback-YXYY44ZC.js} +1 -1
  100. package/dist/{generate-agent-definitions-4VI4YTO2.js → generate-agent-definitions-XIHQPKG3.js} +3 -3
  101. package/dist/hooks/cost-tracker.js +29 -6
  102. package/dist/index.js +22 -22
  103. package/dist/{loader-AWTHHE3A.js → loader-YAN56MT3.js} +2 -2
  104. package/dist/{mcp-JBIBINO2.js → mcp-RK3SFVYB.js} +13 -13
  105. package/dist/{performance-NCOUDOMW.js → performance-64DPTLLQ.js} +3 -3
  106. package/dist/{review-pipeline-YIC6JPMY.js → review-pipeline-NENG6LW7.js} +2 -2
  107. package/dist/{runtime-5MHV4UEE.js → runtime-FFIIRT2T.js} +2 -2
  108. package/dist/{security-VZPJNIDP.js → security-3PIBN35B.js} +1 -1
  109. package/dist/templates/basic/harness.config.json.hbs +34 -0
  110. package/dist/templates/ci/README.md +86 -0
  111. package/dist/templates/ci/required-review.ruleset.json +20 -0
  112. package/dist/templates/ci/required-review.yml.hbs +57 -0
  113. package/dist/templates/ci/template.json +5 -0
  114. package/dist/templates/intermediate/harness.config.json.hbs +36 -0
  115. package/dist/templates/orchestrator/harness.orchestrator.md +9 -0
  116. package/dist/{tool-tiers-B7JC2XC3.js → tool-tiers-OKK5FE57.js} +2 -0
  117. package/dist/{validate-7BE4VTFI.js → validate-7IAF2ES3.js} +3 -3
  118. package/dist/{validate-cross-check-F7GEBRDH.js → validate-cross-check-QPSAOZKD.js} +2 -2
  119. 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-4BDOSCNY.js";
15
+ } from "./chunk-XFU6SB2Q.js";
16
16
  import {
17
17
  generateRuntime
18
- } from "./chunk-5XL5QJ5B.js";
18
+ } from "./chunk-6WQCLCBO.js";
19
19
  import {
20
20
  generateAgentsMd
21
- } from "./chunk-7EQAZKJ5.js";
21
+ } from "./chunk-QBC7DI4Q.js";
22
22
  import {
23
23
  generateCIWorkflow
24
- } from "./chunk-STESM73J.js";
24
+ } from "./chunk-GSP2XIVS.js";
25
25
  import {
26
26
  runCrossCheck
27
- } from "./chunk-VBNJAKUH.js";
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-EEFRPEWT.js";
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-UBZQE3JN.js";
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-X4EFYVCZ.js";
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-2SNRCAC3.js";
66
+ } from "./chunk-KAJOS3BA.js";
67
67
  import {
68
68
  createHarnessServer,
69
69
  generateSlashCommands,
70
70
  getToolDefinitions,
71
71
  startServer
72
- } from "./chunk-CAQPSFPT.js";
73
- import "./chunk-KBCPELBC.js";
74
- import "./chunk-LADPYELQ.js";
75
- import "./chunk-FZ5MBXEG.js";
76
- import "./chunk-ACOOG3UW.js";
77
- import "./chunk-UUO4K7NX.js";
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-UXPWSV3B.js";
79
+ import "./chunk-BYVT5LVO.js";
80
80
  import "./chunk-3ISINLYT.js";
81
81
  import "./chunk-CLI4K2CH.js";
82
- import "./chunk-KI6PHH6Q.js";
83
- import "./chunk-UJFNIWC7.js";
84
- import "./chunk-HRSE6IQD.js";
85
- import "./chunk-C7J55C6E.js";
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-B7KMTHN3.js";
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-GOHWCHCS.js";
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-X4EFYVCZ.js";
5
- import "./chunk-GOHWCHCS.js";
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-CAQPSFPT.js";
6
- import "./chunk-KBCPELBC.js";
7
- import "./chunk-LADPYELQ.js";
8
- import "./chunk-FZ5MBXEG.js";
9
- import "./chunk-ACOOG3UW.js";
10
- import "./chunk-UUO4K7NX.js";
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-UXPWSV3B.js";
12
+ import "./chunk-BYVT5LVO.js";
13
13
  import "./chunk-3ISINLYT.js";
14
14
  import "./chunk-CLI4K2CH.js";
15
- import "./chunk-KI6PHH6Q.js";
16
- import "./chunk-UJFNIWC7.js";
15
+ import "./chunk-HWTUUQOW.js";
16
+ import "./chunk-527G27VI.js";
17
17
  import {
18
18
  resolveProjectConfig
19
- } from "./chunk-HRSE6IQD.js";
20
- import "./chunk-C7J55C6E.js";
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-B7KMTHN3.js";
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-GOHWCHCS.js";
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-UUO4K7NX.js";
10
+ } from "./chunk-ONCPJGHY.js";
11
11
  import "./chunk-RC3OI5NK.js";
12
12
  import "./chunk-W6Y7ZW3Y.js";
13
- import "./chunk-B7KMTHN3.js";
13
+ import "./chunk-GGKRA7A7.js";
14
14
  import "./chunk-ZCZD7FHU.js";
15
15
  import "./chunk-3WGJMBKH.js";
16
- import "./chunk-GOHWCHCS.js";
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-LADPYELQ.js";
4
+ } from "./chunk-XX4OLNWQ.js";
5
5
  import "./chunk-W6Y7ZW3Y.js";
6
- import "./chunk-GOHWCHCS.js";
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-5XL5QJ5B.js";
3
+ } from "./chunk-6WQCLCBO.js";
4
4
  import "./chunk-KET4QQZB.js";
5
- import "./chunk-GOHWCHCS.js";
5
+ import "./chunk-N24HCQA4.js";
6
6
  import "./chunk-N55WOGN3.js";
7
7
  import "./chunk-BDGTZRZ6.js";
8
8
  import "./chunk-PP6ZRL5T.js";
@@ -3,7 +3,7 @@ import {
3
3
  handleGetSecurityTrends,
4
4
  handleRunSecurityScan,
5
5
  runSecurityScanDefinition
6
- } from "./chunk-KBCPELBC.js";
6
+ } from "./chunk-HEIMJJI4.js";
7
7
  import "./chunk-W6Y7ZW3Y.js";
8
8
  import "./chunk-KFQGP6VL.js";
9
9
  export {
@@ -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"
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "ci-required-review",
3
+ "description": "Opt-in GitHub Actions required-review gate: renders a workflow that runs `harness review-ci` plus a matching branch-protection ruleset.",
4
+ "version": 1
5
+ }
@@ -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 }}
@@ -36,6 +36,8 @@ var STANDARD_EXTRA = [
36
36
  "check_phase_gate",
37
37
  "gather_context",
38
38
  "assess_project",
39
+ "canary_probe",
40
+ "canary_recommend_framework",
39
41
  "recommend_skills",
40
42
  "search_skills",
41
43
  "code_unfold",
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  handleValidateProject,
3
3
  validateToolDefinition
4
- } from "./chunk-KI6PHH6Q.js";
5
- import "./chunk-HRSE6IQD.js";
4
+ } from "./chunk-HWTUUQOW.js";
5
+ import "./chunk-DE5U6KOL.js";
6
6
  import "./chunk-W6Y7ZW3Y.js";
7
- import "./chunk-GOHWCHCS.js";
7
+ import "./chunk-N24HCQA4.js";
8
8
  import "./chunk-N55WOGN3.js";
9
9
  import "./chunk-BDGTZRZ6.js";
10
10
  import "./chunk-PP6ZRL5T.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  runCrossCheck
3
- } from "./chunk-VBNJAKUH.js";
4
- import "./chunk-GOHWCHCS.js";
3
+ } from "./chunk-3ISHDWO7.js";
4
+ import "./chunk-N24HCQA4.js";
5
5
  import "./chunk-N55WOGN3.js";
6
6
  import "./chunk-BDGTZRZ6.js";
7
7
  import "./chunk-PP6ZRL5T.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@harness-engineering/cli",
3
- "version": "2.8.0",
3
+ "version": "3.0.0",
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.29.0",
43
- "@harness-engineering/dashboard": "0.8.2",
44
42
  "@harness-engineering/graph": "0.11.0",
45
- "@harness-engineering/linter-gen": "0.1.7",
46
- "@harness-engineering/orchestrator": "0.8.1",
47
- "@harness-engineering/types": "0.16.0"
43
+ "@harness-engineering/core": "0.30.0",
44
+ "@harness-engineering/dashboard": "0.9.0",
45
+ "@harness-engineering/orchestrator": "0.8.2",
46
+ "@harness-engineering/types": "0.16.0",
47
+ "@harness-engineering/linter-gen": "0.1.7"
48
48
  },
49
49
  "peerDependencies": {
50
- "@harness-engineering/intelligence": "0.2.7"
50
+ "@harness-engineering/intelligence": "0.3.0"
51
51
  },
52
52
  "peerDependenciesMeta": {
53
53
  "@harness-engineering/intelligence": {