@harness-engineering/cli 1.6.2 → 1.8.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 (180) hide show
  1. package/dist/agents/personas/documentation-maintainer.yaml +3 -1
  2. package/dist/agents/personas/performance-guardian.yaml +23 -0
  3. package/dist/agents/personas/planner.yaml +27 -0
  4. package/dist/agents/personas/verifier.yaml +30 -0
  5. package/dist/agents/skills/claude-code/align-documentation/SKILL.md +13 -0
  6. package/dist/agents/skills/claude-code/cleanup-dead-code/SKILL.md +25 -1
  7. package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +5 -2
  8. package/dist/agents/skills/claude-code/detect-doc-drift/SKILL.md +12 -0
  9. package/dist/agents/skills/claude-code/enforce-architecture/SKILL.md +67 -1
  10. package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +5 -2
  11. package/dist/agents/skills/claude-code/harness-accessibility/SKILL.md +281 -0
  12. package/dist/agents/skills/claude-code/harness-accessibility/skill.yaml +51 -0
  13. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +119 -72
  14. package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +4 -2
  15. package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +76 -4
  16. package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +2 -0
  17. package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +487 -234
  18. package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +15 -2
  19. package/dist/agents/skills/claude-code/harness-codebase-cleanup/SKILL.md +226 -0
  20. package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +64 -0
  21. package/dist/agents/skills/claude-code/harness-dependency-health/SKILL.md +35 -6
  22. package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +1 -1
  23. package/dist/agents/skills/claude-code/harness-design/SKILL.md +265 -0
  24. package/dist/agents/skills/claude-code/harness-design/skill.yaml +53 -0
  25. package/dist/agents/skills/claude-code/harness-design-mobile/SKILL.md +336 -0
  26. package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +49 -0
  27. package/dist/agents/skills/claude-code/harness-design-system/SKILL.md +282 -0
  28. package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +50 -0
  29. package/dist/agents/skills/claude-code/harness-design-web/SKILL.md +360 -0
  30. package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +52 -0
  31. package/dist/agents/skills/claude-code/harness-docs-pipeline/SKILL.md +460 -0
  32. package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +69 -0
  33. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +73 -8
  34. package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
  35. package/dist/agents/skills/claude-code/harness-hotspot-detector/SKILL.md +32 -6
  36. package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +1 -1
  37. package/dist/agents/skills/claude-code/harness-i18n/SKILL.md +484 -0
  38. package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +54 -0
  39. package/dist/agents/skills/claude-code/harness-i18n-process/SKILL.md +388 -0
  40. package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +43 -0
  41. package/dist/agents/skills/claude-code/harness-i18n-workflow/SKILL.md +512 -0
  42. package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +53 -0
  43. package/dist/agents/skills/claude-code/harness-impact-analysis/SKILL.md +51 -6
  44. package/dist/agents/skills/claude-code/harness-integrity/SKILL.md +35 -1
  45. package/dist/agents/skills/claude-code/harness-knowledge-mapper/SKILL.md +46 -5
  46. package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -1
  47. package/dist/agents/skills/claude-code/harness-onboarding/SKILL.md +19 -1
  48. package/dist/agents/skills/claude-code/harness-perf/SKILL.md +37 -8
  49. package/dist/agents/skills/claude-code/harness-perf/skill.yaml +3 -0
  50. package/dist/agents/skills/claude-code/harness-perf-tdd/SKILL.md +17 -4
  51. package/dist/agents/skills/claude-code/harness-planning/SKILL.md +57 -3
  52. package/dist/agents/skills/claude-code/harness-planning/skill.yaml +2 -0
  53. package/dist/agents/skills/claude-code/harness-release-readiness/SKILL.md +29 -9
  54. package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +562 -0
  55. package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +43 -0
  56. package/dist/agents/skills/claude-code/harness-security-review/SKILL.md +36 -2
  57. package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +8 -6
  58. package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +1 -1
  59. package/dist/agents/skills/claude-code/harness-soundness-review/SKILL.md +1267 -0
  60. package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +48 -0
  61. package/dist/agents/skills/claude-code/harness-test-advisor/SKILL.md +35 -6
  62. package/dist/agents/skills/claude-code/harness-verification/SKILL.md +66 -0
  63. package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
  64. package/dist/agents/skills/claude-code/harness-verify/SKILL.md +37 -0
  65. package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +15 -1
  66. package/dist/agents/skills/claude-code/validate-context-engineering/SKILL.md +12 -0
  67. package/dist/agents/skills/gemini-cli/harness-accessibility/SKILL.md +281 -0
  68. package/dist/agents/skills/gemini-cli/harness-accessibility/skill.yaml +51 -0
  69. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +119 -72
  70. package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +4 -2
  71. package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/SKILL.md +226 -0
  72. package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +64 -0
  73. package/dist/agents/skills/gemini-cli/harness-dependency-health/SKILL.md +35 -6
  74. package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -1
  75. package/dist/agents/skills/gemini-cli/harness-design/SKILL.md +265 -0
  76. package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +53 -0
  77. package/dist/agents/skills/gemini-cli/harness-design-mobile/SKILL.md +336 -0
  78. package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +49 -0
  79. package/dist/agents/skills/gemini-cli/harness-design-system/SKILL.md +282 -0
  80. package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +50 -0
  81. package/dist/agents/skills/gemini-cli/harness-design-web/SKILL.md +360 -0
  82. package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +52 -0
  83. package/dist/agents/skills/gemini-cli/harness-docs-pipeline/SKILL.md +460 -0
  84. package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +69 -0
  85. package/dist/agents/skills/gemini-cli/harness-hotspot-detector/SKILL.md +32 -6
  86. package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -1
  87. package/dist/agents/skills/gemini-cli/harness-i18n/SKILL.md +484 -0
  88. package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +54 -0
  89. package/dist/agents/skills/gemini-cli/harness-i18n-process/SKILL.md +388 -0
  90. package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +43 -0
  91. package/dist/agents/skills/gemini-cli/harness-i18n-workflow/SKILL.md +512 -0
  92. package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +53 -0
  93. package/dist/agents/skills/gemini-cli/harness-impact-analysis/SKILL.md +51 -6
  94. package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/SKILL.md +46 -5
  95. package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -1
  96. package/dist/agents/skills/gemini-cli/harness-perf/SKILL.md +37 -8
  97. package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +3 -0
  98. package/dist/agents/skills/gemini-cli/harness-perf-tdd/SKILL.md +17 -4
  99. package/dist/agents/skills/gemini-cli/harness-release-readiness/SKILL.md +29 -9
  100. package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +562 -0
  101. package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +43 -0
  102. package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +8 -6
  103. package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +1 -1
  104. package/dist/agents/skills/gemini-cli/harness-soundness-review/SKILL.md +1267 -0
  105. package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +48 -0
  106. package/dist/agents/skills/gemini-cli/harness-test-advisor/SKILL.md +35 -6
  107. package/dist/agents/skills/node_modules/.bin/vitest +2 -2
  108. package/dist/agents/skills/shared/design-knowledge/anti-patterns/color.yaml +106 -0
  109. package/dist/agents/skills/shared/design-knowledge/anti-patterns/layout.yaml +109 -0
  110. package/dist/agents/skills/shared/design-knowledge/anti-patterns/motion.yaml +109 -0
  111. package/dist/agents/skills/shared/design-knowledge/anti-patterns/typography.yaml +112 -0
  112. package/dist/agents/skills/shared/design-knowledge/industries/creative.yaml +80 -0
  113. package/dist/agents/skills/shared/design-knowledge/industries/ecommerce.yaml +80 -0
  114. package/dist/agents/skills/shared/design-knowledge/industries/emerging-tech.yaml +83 -0
  115. package/dist/agents/skills/shared/design-knowledge/industries/fintech.yaml +80 -0
  116. package/dist/agents/skills/shared/design-knowledge/industries/healthcare.yaml +80 -0
  117. package/dist/agents/skills/shared/design-knowledge/industries/lifestyle.yaml +80 -0
  118. package/dist/agents/skills/shared/design-knowledge/industries/saas.yaml +80 -0
  119. package/dist/agents/skills/shared/design-knowledge/industries/services.yaml +80 -0
  120. package/dist/agents/skills/shared/design-knowledge/palettes/curated.yaml +234 -0
  121. package/dist/agents/skills/shared/design-knowledge/platform-rules/android.yaml +125 -0
  122. package/dist/agents/skills/shared/design-knowledge/platform-rules/flutter.yaml +144 -0
  123. package/dist/agents/skills/shared/design-knowledge/platform-rules/ios.yaml +106 -0
  124. package/dist/agents/skills/shared/design-knowledge/platform-rules/web.yaml +102 -0
  125. package/dist/agents/skills/shared/design-knowledge/typography/pairings.yaml +274 -0
  126. package/dist/agents/skills/shared/i18n-knowledge/accessibility/intersection.yaml +142 -0
  127. package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/encoding.yaml +67 -0
  128. package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/formatting.yaml +106 -0
  129. package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/layout.yaml +80 -0
  130. package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/pluralization.yaml +80 -0
  131. package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/string-handling.yaml +106 -0
  132. package/dist/agents/skills/shared/i18n-knowledge/frameworks/android-resources.yaml +47 -0
  133. package/dist/agents/skills/shared/i18n-knowledge/frameworks/apple-strings.yaml +47 -0
  134. package/dist/agents/skills/shared/i18n-knowledge/frameworks/backend-patterns.yaml +50 -0
  135. package/dist/agents/skills/shared/i18n-knowledge/frameworks/flutter-intl.yaml +47 -0
  136. package/dist/agents/skills/shared/i18n-knowledge/frameworks/i18next.yaml +47 -0
  137. package/dist/agents/skills/shared/i18n-knowledge/frameworks/react-intl.yaml +47 -0
  138. package/dist/agents/skills/shared/i18n-knowledge/frameworks/vue-i18n.yaml +47 -0
  139. package/dist/agents/skills/shared/i18n-knowledge/industries/ecommerce.yaml +66 -0
  140. package/dist/agents/skills/shared/i18n-knowledge/industries/fintech.yaml +66 -0
  141. package/dist/agents/skills/shared/i18n-knowledge/industries/gaming.yaml +69 -0
  142. package/dist/agents/skills/shared/i18n-knowledge/industries/healthcare.yaml +66 -0
  143. package/dist/agents/skills/shared/i18n-knowledge/industries/legal.yaml +66 -0
  144. package/dist/agents/skills/shared/i18n-knowledge/locales/ar.yaml +41 -0
  145. package/dist/agents/skills/shared/i18n-knowledge/locales/de.yaml +35 -0
  146. package/dist/agents/skills/shared/i18n-knowledge/locales/en.yaml +32 -0
  147. package/dist/agents/skills/shared/i18n-knowledge/locales/es.yaml +35 -0
  148. package/dist/agents/skills/shared/i18n-knowledge/locales/fi.yaml +35 -0
  149. package/dist/agents/skills/shared/i18n-knowledge/locales/fr.yaml +35 -0
  150. package/dist/agents/skills/shared/i18n-knowledge/locales/he.yaml +41 -0
  151. package/dist/agents/skills/shared/i18n-knowledge/locales/hi.yaml +35 -0
  152. package/dist/agents/skills/shared/i18n-knowledge/locales/it.yaml +32 -0
  153. package/dist/agents/skills/shared/i18n-knowledge/locales/ja.yaml +38 -0
  154. package/dist/agents/skills/shared/i18n-knowledge/locales/ko.yaml +38 -0
  155. package/dist/agents/skills/shared/i18n-knowledge/locales/nl.yaml +32 -0
  156. package/dist/agents/skills/shared/i18n-knowledge/locales/pl.yaml +35 -0
  157. package/dist/agents/skills/shared/i18n-knowledge/locales/pt.yaml +32 -0
  158. package/dist/agents/skills/shared/i18n-knowledge/locales/ru.yaml +35 -0
  159. package/dist/agents/skills/shared/i18n-knowledge/locales/sv.yaml +32 -0
  160. package/dist/agents/skills/shared/i18n-knowledge/locales/th.yaml +35 -0
  161. package/dist/agents/skills/shared/i18n-knowledge/locales/tr.yaml +35 -0
  162. package/dist/agents/skills/shared/i18n-knowledge/locales/zh-Hans.yaml +38 -0
  163. package/dist/agents/skills/shared/i18n-knowledge/locales/zh-Hant.yaml +35 -0
  164. package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/i18next-mcp.yaml +56 -0
  165. package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/lingo-dev.yaml +56 -0
  166. package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/lokalise.yaml +60 -0
  167. package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/tolgee.yaml +60 -0
  168. package/dist/agents/skills/shared/i18n-knowledge/testing/locale-testing.yaml +107 -0
  169. package/dist/agents/skills/shared/i18n-knowledge/testing/pseudo-localization.yaml +86 -0
  170. package/dist/bin/harness.js +64 -4
  171. package/dist/{chunk-UDWGSL3T.js → chunk-3JWCBVUZ.js} +3 -3
  172. package/dist/{chunk-IUFFBBYV.js → chunk-LNI4T7R6.js} +179 -61
  173. package/dist/{chunk-USEYPS7F.js → chunk-SJECMKSS.js} +2250 -40
  174. package/dist/{dist-4MYPT3OE.js → dist-BDO5GFEM.js} +295 -14
  175. package/dist/{dist-RBZXXJHG.js → dist-NT3GXHQZ.js} +95 -1
  176. package/dist/index.d.ts +266 -7
  177. package/dist/index.js +7 -3
  178. package/dist/validate-cross-check-2OPGCGGU.js +7 -0
  179. package/package.json +7 -7
  180. package/dist/validate-cross-check-CPEPNLOD.js +0 -7
@@ -13,7 +13,6 @@ import {
13
13
  buildSnapshot,
14
14
  checkDocCoverage,
15
15
  createFixes,
16
- createSelfReview,
17
16
  createStream,
18
17
  defineLayer,
19
18
  detectCircularDepsInFiles,
@@ -28,11 +27,12 @@ import {
28
27
  requestPeerReview,
29
28
  resolveStreamPath,
30
29
  runCIChecks,
30
+ runReviewPipeline,
31
31
  setActiveStream,
32
32
  validateAgentsMap,
33
33
  validateDependencies,
34
34
  validateKnowledgeMap
35
- } from "./chunk-USEYPS7F.js";
35
+ } from "./chunk-SJECMKSS.js";
36
36
  import {
37
37
  CLIError,
38
38
  ExitCode,
@@ -86,6 +86,65 @@ var PhaseGatesConfigSchema = z.object({
86
86
  severity: z.enum(["error", "warning"]).default("error"),
87
87
  mappings: z.array(PhaseGateMappingSchema).default([{ implPattern: "src/**/*.ts", specPattern: "docs/specs/{feature}.md" }])
88
88
  });
89
+ var SecurityConfigSchema = z.object({
90
+ enabled: z.boolean().default(true),
91
+ strict: z.boolean().default(false),
92
+ rules: z.record(z.string(), z.enum(["off", "error", "warning", "info"])).optional(),
93
+ exclude: z.array(z.string()).optional()
94
+ }).passthrough();
95
+ var PerformanceConfigSchema = z.object({
96
+ complexity: z.record(z.unknown()).optional(),
97
+ coupling: z.record(z.unknown()).optional(),
98
+ sizeBudget: z.record(z.unknown()).optional()
99
+ }).passthrough();
100
+ var DesignConfigSchema = z.object({
101
+ strictness: z.enum(["strict", "standard", "permissive"]).default("standard"),
102
+ platforms: z.array(z.enum(["web", "mobile"])).default([]),
103
+ tokenPath: z.string().optional(),
104
+ aestheticIntent: z.string().optional()
105
+ });
106
+ var I18nCoverageConfigSchema = z.object({
107
+ minimumPercent: z.number().min(0).max(100).default(100),
108
+ requirePlurals: z.boolean().default(true),
109
+ detectUntranslated: z.boolean().default(true)
110
+ });
111
+ var I18nMcpConfigSchema = z.object({
112
+ server: z.string(),
113
+ projectId: z.string().optional()
114
+ });
115
+ var I18nConfigSchema = z.object({
116
+ enabled: z.boolean().default(false),
117
+ strictness: z.enum(["strict", "standard", "permissive"]).default("standard"),
118
+ sourceLocale: z.string().default("en"),
119
+ targetLocales: z.array(z.string()).default([]),
120
+ framework: z.enum([
121
+ "auto",
122
+ "i18next",
123
+ "react-intl",
124
+ "vue-i18n",
125
+ "flutter-intl",
126
+ "apple",
127
+ "android",
128
+ "custom"
129
+ ]).default("auto"),
130
+ format: z.string().default("json"),
131
+ messageFormat: z.enum(["icu", "i18next", "custom"]).default("icu"),
132
+ keyConvention: z.enum(["dot-notation", "snake_case", "camelCase", "custom"]).default("dot-notation"),
133
+ translationPaths: z.record(z.string(), z.string()).optional(),
134
+ platforms: z.array(z.enum(["web", "mobile", "backend"])).default([]),
135
+ industry: z.string().optional(),
136
+ coverage: I18nCoverageConfigSchema.optional(),
137
+ pseudoLocale: z.string().optional(),
138
+ mcp: I18nMcpConfigSchema.optional()
139
+ });
140
+ var ModelTierConfigSchema = z.object({
141
+ fast: z.string().optional(),
142
+ standard: z.string().optional(),
143
+ strong: z.string().optional()
144
+ });
145
+ var ReviewConfigSchema = z.object({
146
+ model_tiers: ModelTierConfigSchema.optional()
147
+ });
89
148
  var HarnessConfigSchema = z.object({
90
149
  version: z.literal(1),
91
150
  name: z.string().optional(),
@@ -97,12 +156,18 @@ var HarnessConfigSchema = z.object({
97
156
  docsDir: z.string().default("./docs"),
98
157
  agent: AgentConfigSchema.optional(),
99
158
  entropy: EntropyConfigSchema.optional(),
159
+ security: SecurityConfigSchema.optional(),
160
+ performance: PerformanceConfigSchema.optional(),
100
161
  template: z.object({
101
162
  level: z.enum(["basic", "intermediate", "advanced"]),
102
163
  framework: z.string().optional(),
103
164
  version: z.number()
104
165
  }).optional(),
105
- phaseGates: PhaseGatesConfigSchema.optional()
166
+ phaseGates: PhaseGatesConfigSchema.optional(),
167
+ design: DesignConfigSchema.optional(),
168
+ i18n: I18nConfigSchema.optional(),
169
+ review: ReviewConfigSchema.optional(),
170
+ updateCheckInterval: z.number().int().min(0).optional()
106
171
  });
107
172
 
108
173
  // src/config/loader.ts
@@ -294,7 +359,7 @@ function createValidateCommand() {
294
359
  process.exit(result.error.exitCode);
295
360
  }
296
361
  if (opts.crossCheck) {
297
- const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-CPEPNLOD.js");
362
+ const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-2OPGCGGU.js");
298
363
  const cwd = process.cwd();
299
364
  const specsDir = path2.join(cwd, "docs", "specs");
300
365
  const plansDir = path2.join(cwd, "docs", "plans");
@@ -660,7 +725,7 @@ function createPerfCommand() {
660
725
  perf.command("bench [glob]").description("Run benchmarks via vitest bench").action(async (glob2, _opts, cmd) => {
661
726
  const globalOpts = cmd.optsWithGlobals();
662
727
  const cwd = process.cwd();
663
- const { BenchmarkRunner } = await import("./dist-RBZXXJHG.js");
728
+ const { BenchmarkRunner } = await import("./dist-NT3GXHQZ.js");
664
729
  const runner = new BenchmarkRunner();
665
730
  const benchFiles = runner.discover(cwd, glob2);
666
731
  if (benchFiles.length === 0) {
@@ -729,7 +794,7 @@ Results (${result.results.length} benchmarks):`);
729
794
  baselines.command("update").description("Update baselines from latest benchmark run").action(async (_opts, cmd) => {
730
795
  const globalOpts = cmd.optsWithGlobals();
731
796
  const cwd = process.cwd();
732
- const { BenchmarkRunner } = await import("./dist-RBZXXJHG.js");
797
+ const { BenchmarkRunner } = await import("./dist-NT3GXHQZ.js");
733
798
  const runner = new BenchmarkRunner();
734
799
  const manager = new BaselineManager(cwd);
735
800
  logger.info("Running benchmarks to update baselines...");
@@ -742,8 +807,8 @@ Results (${result.results.length} benchmarks):`);
742
807
  }
743
808
  let commitHash = "unknown";
744
809
  try {
745
- const { execSync: execSync5 } = await import("child_process");
746
- commitHash = execSync5("git rev-parse --short HEAD", { cwd, encoding: "utf-8" }).trim();
810
+ const { execSync: execSync3 } = await import("child_process");
811
+ commitHash = execSync3("git rev-parse --short HEAD", { cwd, encoding: "utf-8" }).trim();
747
812
  } catch {
748
813
  }
749
814
  manager.save(benchResult.results, commitHash);
@@ -757,7 +822,7 @@ Results (${result.results.length} benchmarks):`);
757
822
  perf.command("report").description("Full performance report with metrics, trends, and hotspots").action(async (_opts, cmd) => {
758
823
  const globalOpts = cmd.optsWithGlobals();
759
824
  const cwd = process.cwd();
760
- const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-RBZXXJHG.js");
825
+ const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-NT3GXHQZ.js");
761
826
  const analyzer = new EntropyAnalyzer2({
762
827
  rootDir: path6.resolve(cwd),
763
828
  analyze: { complexity: true, coupling: true }
@@ -1230,8 +1295,7 @@ import * as path10 from "path";
1230
1295
  import * as os from "os";
1231
1296
  import chalk2 from "chalk";
1232
1297
  var HARNESS_MCP_ENTRY = {
1233
- command: "npx",
1234
- args: ["@harness-engineering/mcp-server"]
1298
+ command: "harness-mcp"
1235
1299
  };
1236
1300
  function readJsonFile(filePath) {
1237
1301
  if (!fs4.existsSync(filePath)) return null;
@@ -2274,34 +2338,54 @@ async function runAgentReview(options) {
2274
2338
  return Err(new CLIError(parsedDiffResult.error.message, ExitCode.ERROR));
2275
2339
  }
2276
2340
  const codeChanges = parsedDiffResult.value;
2277
- const review = await createSelfReview(codeChanges, {
2278
- rootDir: config.rootDir,
2279
- diffAnalysis: {
2280
- enabled: true,
2281
- checkTestCoverage: true
2282
- }
2283
- });
2284
- if (!review.ok) {
2285
- return Err(new CLIError(review.error.message, ExitCode.ERROR));
2341
+ let commitMessage = "";
2342
+ try {
2343
+ commitMessage = execSync2("git log --oneline -1", { encoding: "utf-8" }).trim();
2344
+ } catch {
2286
2345
  }
2346
+ const diffInfo = {
2347
+ changedFiles: codeChanges.files.map((f) => f.path),
2348
+ newFiles: codeChanges.files.filter((f) => f.status === "added").map((f) => f.path),
2349
+ deletedFiles: codeChanges.files.filter((f) => f.status === "deleted").map((f) => f.path),
2350
+ totalDiffLines: diff.split("\n").length,
2351
+ fileDiffs: new Map(codeChanges.files.map((f) => [f.path, ""]))
2352
+ };
2353
+ const pipelineResult = await runReviewPipeline({
2354
+ projectRoot: config.rootDir,
2355
+ diff: diffInfo,
2356
+ commitMessage,
2357
+ flags: {
2358
+ comment: options.comment ?? false,
2359
+ ci: options.ci ?? false,
2360
+ deep: options.deep ?? false,
2361
+ noMechanical: options.noMechanical ?? false
2362
+ },
2363
+ config
2364
+ });
2287
2365
  return Ok({
2288
- passed: review.value.passed,
2289
- checklist: review.value.items.map((item) => ({
2290
- check: item.check,
2291
- passed: item.passed,
2292
- details: item.details
2293
- }))
2366
+ passed: pipelineResult.exitCode === 0,
2367
+ checklist: pipelineResult.findings.map((f) => ({
2368
+ check: `[${f.domain}] ${f.title}`,
2369
+ passed: f.severity === "suggestion",
2370
+ details: f.rationale
2371
+ })),
2372
+ pipelineResult
2294
2373
  });
2295
2374
  }
2296
2375
  function createReviewCommand() {
2297
- return new Command12("review").description("Run self-review on current changes").action(async (_opts, cmd) => {
2376
+ return new Command12("review").description("Run unified code review pipeline on current changes").option("--comment", "Post inline comments to GitHub PR").option("--ci", "Enable eligibility gate, non-interactive output").option("--deep", "Add threat modeling pass to security agent").option("--no-mechanical", "Skip mechanical checks").action(async (opts, cmd) => {
2298
2377
  const globalOpts = cmd.optsWithGlobals();
2299
2378
  const mode = globalOpts.json ? OutputMode.JSON : globalOpts.quiet ? OutputMode.QUIET : OutputMode.TEXT;
2300
2379
  const result = await runAgentReview({
2301
2380
  configPath: globalOpts.config,
2302
2381
  json: globalOpts.json,
2303
2382
  verbose: globalOpts.verbose,
2304
- quiet: globalOpts.quiet
2383
+ quiet: globalOpts.quiet,
2384
+ comment: opts.comment,
2385
+ ci: opts.ci,
2386
+ deep: opts.deep,
2387
+ noMechanical: opts.mechanical === false
2388
+ // Commander negation: --no-mechanical sets mechanical=false
2305
2389
  });
2306
2390
  if (!result.ok) {
2307
2391
  if (mode === OutputMode.JSON) {
@@ -2311,20 +2395,32 @@ function createReviewCommand() {
2311
2395
  }
2312
2396
  process.exit(result.error.exitCode);
2313
2397
  }
2398
+ const { pipelineResult } = result.value;
2314
2399
  if (mode === OutputMode.JSON) {
2315
- console.log(JSON.stringify(result.value, null, 2));
2400
+ console.log(
2401
+ JSON.stringify(
2402
+ {
2403
+ ...result.value,
2404
+ pipelineResult: pipelineResult ? {
2405
+ assessment: pipelineResult.assessment,
2406
+ findings: pipelineResult.findings,
2407
+ exitCode: pipelineResult.exitCode
2408
+ } : void 0
2409
+ },
2410
+ null,
2411
+ 2
2412
+ )
2413
+ );
2316
2414
  } else if (mode !== OutputMode.QUIET) {
2317
- console.log(result.value.passed ? "v Self-review passed" : "x Self-review found issues");
2318
- console.log("");
2319
- for (const item of result.value.checklist) {
2320
- const icon = item.passed ? "v" : "x";
2321
- console.log(` ${icon} ${item.check}`);
2322
- if (item.details && !item.passed) {
2323
- console.log(` ${item.details}`);
2324
- }
2415
+ if (pipelineResult) {
2416
+ console.log(pipelineResult.terminalOutput);
2417
+ } else {
2418
+ console.log(result.value.passed ? "v Self-review passed" : "x Self-review found issues");
2325
2419
  }
2326
2420
  }
2327
- process.exit(result.value.passed ? ExitCode.SUCCESS : ExitCode.VALIDATION_FAILED);
2421
+ process.exit(
2422
+ pipelineResult ? pipelineResult.exitCode : result.value.passed ? ExitCode.SUCCESS : ExitCode.VALIDATION_FAILED
2423
+ );
2328
2424
  });
2329
2425
  }
2330
2426
 
@@ -3211,7 +3307,7 @@ import * as path24 from "path";
3211
3307
  import { parse as parse5 } from "yaml";
3212
3308
 
3213
3309
  // src/skill/complexity.ts
3214
- import { execSync as execSync3 } from "child_process";
3310
+ import { execFileSync as execFileSync2 } from "child_process";
3215
3311
  function evaluateSignals(signals) {
3216
3312
  if (signals.fileCount >= 3) return "full";
3217
3313
  if (signals.newDir) return "full";
@@ -3223,17 +3319,17 @@ function evaluateSignals(signals) {
3223
3319
  }
3224
3320
  function detectComplexity(projectPath) {
3225
3321
  try {
3226
- const base = execSync3("git merge-base HEAD main", {
3322
+ const base = execFileSync2("git", ["merge-base", "HEAD", "main"], {
3227
3323
  cwd: projectPath,
3228
3324
  encoding: "utf-8",
3229
3325
  stdio: ["pipe", "pipe", "pipe"]
3230
3326
  }).trim();
3231
- const diffFiles = execSync3(`git diff --name-only ${base}`, {
3327
+ const diffFiles = execFileSync2("git", ["diff", "--name-only", base], {
3232
3328
  cwd: projectPath,
3233
3329
  encoding: "utf-8",
3234
3330
  stdio: ["pipe", "pipe", "pipe"]
3235
3331
  }).trim().split("\n").filter(Boolean);
3236
- const diffStat = execSync3(`git diff --stat ${base}`, {
3332
+ const diffStat = execFileSync2("git", ["diff", "--stat", base], {
3237
3333
  cwd: projectPath,
3238
3334
  encoding: "utf-8",
3239
3335
  stdio: ["pipe", "pipe", "pipe"]
@@ -4526,7 +4622,7 @@ function createCICommand() {
4526
4622
 
4527
4623
  // src/commands/update.ts
4528
4624
  import { Command as Command36 } from "commander";
4529
- import { execSync as execSync4 } from "child_process";
4625
+ import { execFileSync as execFileSync3 } from "child_process";
4530
4626
  import { realpathSync } from "fs";
4531
4627
  import readline3 from "readline";
4532
4628
  import chalk4 from "chalk";
@@ -4546,7 +4642,7 @@ function detectPackageManager() {
4546
4642
  return "npm";
4547
4643
  }
4548
4644
  function getLatestVersion(pkg = "@harness-engineering/cli") {
4549
- const output = execSync4(`npm view ${pkg} dist-tags.latest`, {
4645
+ const output = execFileSync3("npm", ["view", pkg, "dist-tags.latest"], {
4550
4646
  encoding: "utf-8",
4551
4647
  timeout: 15e3
4552
4648
  });
@@ -4554,7 +4650,7 @@ function getLatestVersion(pkg = "@harness-engineering/cli") {
4554
4650
  }
4555
4651
  function getInstalledVersion(pm) {
4556
4652
  try {
4557
- const output = execSync4(`${pm} list -g @harness-engineering/cli --json`, {
4653
+ const output = execFileSync3(pm, ["list", "-g", "@harness-engineering/cli", "--json"], {
4558
4654
  encoding: "utf-8",
4559
4655
  timeout: 15e3
4560
4656
  });
@@ -4567,7 +4663,7 @@ function getInstalledVersion(pm) {
4567
4663
  }
4568
4664
  function getInstalledPackages(pm) {
4569
4665
  try {
4570
- const output = execSync4(`${pm} list -g --json`, {
4666
+ const output = execFileSync3(pm, ["list", "-g", "--json"], {
4571
4667
  encoding: "utf-8",
4572
4668
  timeout: 15e3
4573
4669
  });
@@ -4622,19 +4718,19 @@ function createUpdateCommand() {
4622
4718
  if (globalOpts.verbose) {
4623
4719
  logger.info(`Installed packages: ${packages.join(", ")}`);
4624
4720
  }
4625
- const installArgs = packages.map((pkg) => {
4721
+ const installPkgs = packages.map((pkg) => {
4626
4722
  if (opts.version && pkg === "@harness-engineering/cli") {
4627
4723
  return `${pkg}@${opts.version}`;
4628
4724
  }
4629
4725
  return `${pkg}@latest`;
4630
- }).join(" ");
4631
- const installCmd = `${pm} install -g ${installArgs}`;
4726
+ });
4727
+ const installCmd = `${pm} install -g ${installPkgs.join(" ")}`;
4632
4728
  if (globalOpts.verbose) {
4633
4729
  logger.info(`Running: ${installCmd}`);
4634
4730
  }
4635
4731
  try {
4636
4732
  logger.info("Updating packages...");
4637
- execSync4(installCmd, { stdio: "inherit", timeout: 12e4 });
4733
+ execFileSync3(pm, ["install", "-g", ...installPkgs], { stdio: "inherit", timeout: 12e4 });
4638
4734
  console.log("");
4639
4735
  logger.success("Update complete");
4640
4736
  } catch {
@@ -4647,12 +4743,14 @@ function createUpdateCommand() {
4647
4743
  const regenAnswer = await prompt("Regenerate slash commands and agent definitions? (y/N) ");
4648
4744
  if (regenAnswer === "y" || regenAnswer === "yes") {
4649
4745
  const scopeAnswer = await prompt("Generate for (g)lobal or (l)ocal project? (g/l) ");
4650
- const globalFlag = scopeAnswer === "g" || scopeAnswer === "global" ? " --global" : "";
4746
+ const isGlobal = scopeAnswer === "g" || scopeAnswer === "global";
4651
4747
  try {
4652
- execSync4(`harness generate${globalFlag}`, { stdio: "inherit" });
4748
+ execFileSync3("harness", ["generate", ...isGlobal ? ["--global"] : []], {
4749
+ stdio: "inherit"
4750
+ });
4653
4751
  } catch {
4654
4752
  logger.warn("Generation failed. Run manually:");
4655
- console.log(` ${chalk4.cyan(`harness generate${globalFlag}`)}`);
4753
+ console.log(` ${chalk4.cyan(`harness generate${isGlobal ? " --global" : ""}`)}`);
4656
4754
  }
4657
4755
  }
4658
4756
  process.exit(ExitCode.SUCCESS);
@@ -4672,9 +4770,19 @@ var AGENT_DESCRIPTIONS = {
4672
4770
  "parallel-coordinator": "Dispatch independent tasks across isolated agents for parallel execution. Use when multiple independent tasks need to run concurrently, splitting work across agents, or coordinating parallel implementation.",
4673
4771
  "architecture-enforcer": "Validate architectural constraints and dependency rules. Use when checking layer boundaries, detecting circular dependencies, or verifying import direction compliance.",
4674
4772
  "documentation-maintainer": "Keep documentation in sync with source code. Use when detecting documentation drift, validating doc coverage, or aligning docs with code changes.",
4675
- "entropy-cleaner": "Detect and fix codebase entropy including drift, dead code, and pattern violations. Use when running cleanup, detecting dead code, or fixing pattern violations."
4773
+ "entropy-cleaner": "Detect and fix codebase entropy including drift, dead code, and pattern violations. Use when running cleanup, detecting dead code, or fixing pattern violations.",
4774
+ planner: "Create detailed implementation plans from specs with task breakdown, dependency ordering, and checkpoint placement. Use when planning a phase, breaking a spec into tasks, or creating an execution plan.",
4775
+ verifier: "Verify implementation completeness against spec and plan at three tiers (EXISTS, SUBSTANTIVE, WIRED). Use when checking if built code matches what was planned, validating phase completion, or auditing implementation quality."
4676
4776
  };
4677
4777
  var DEFAULT_TOOLS = ["Bash", "Read", "Write", "Edit", "Glob", "Grep"];
4778
+ var GEMINI_TOOL_MAP = {
4779
+ Bash: "run_shell_command",
4780
+ Read: "read_file",
4781
+ Write: "write_file",
4782
+ Edit: "replace",
4783
+ Glob: "glob",
4784
+ Grep: "search_file_content"
4785
+ };
4678
4786
  function generateAgentDefinition(persona, skillContents) {
4679
4787
  const kebabName = toKebabCase(persona.name);
4680
4788
  const name = `harness-${kebabName}`;
@@ -4689,7 +4797,7 @@ function generateAgentDefinition(persona, skillContents) {
4689
4797
  return {
4690
4798
  name,
4691
4799
  description,
4692
- tools: DEFAULT_TOOLS,
4800
+ tools: [...DEFAULT_TOOLS],
4693
4801
  role: persona.role,
4694
4802
  skills: persona.skills,
4695
4803
  steps: persona.steps,
@@ -4747,6 +4855,9 @@ function renderClaudeCodeAgent(def) {
4747
4855
  }
4748
4856
 
4749
4857
  // src/agent-definitions/render-gemini-cli.ts
4858
+ function toGeminiToolName(tool) {
4859
+ return GEMINI_TOOL_MAP[tool] ?? tool;
4860
+ }
4750
4861
  function formatStep2(step, index) {
4751
4862
  if ("command" in step && step.command) {
4752
4863
  const cmd = step.command;
@@ -4765,7 +4876,12 @@ function renderGeminiAgent(def) {
4765
4876
  lines.push(`name: ${def.name}`);
4766
4877
  lines.push(`description: >`);
4767
4878
  lines.push(` ${def.description}`);
4768
- lines.push(`tools: ${def.tools.join(", ")}`);
4879
+ if (def.tools.length > 0) {
4880
+ lines.push("tools:");
4881
+ for (const tool of def.tools) {
4882
+ lines.push(` - ${toGeminiToolName(tool)}`);
4883
+ }
4884
+ }
4769
4885
  lines.push("---");
4770
4886
  lines.push("");
4771
4887
  lines.push(GENERATED_HEADER_AGENT);
@@ -4966,7 +5082,7 @@ function createGenerateCommand3() {
4966
5082
  import { Command as Command39 } from "commander";
4967
5083
  import * as path37 from "path";
4968
5084
  async function runScan(projectPath) {
4969
- const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-4MYPT3OE.js");
5085
+ const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-BDO5GFEM.js");
4970
5086
  const store = new GraphStore();
4971
5087
  const start = Date.now();
4972
5088
  await new CodeIngestor(store).ingest(projectPath);
@@ -5047,7 +5163,7 @@ async function runIngest(projectPath, source, opts) {
5047
5163
  SyncManager,
5048
5164
  JiraConnector,
5049
5165
  SlackConnector
5050
- } = await import("./dist-4MYPT3OE.js");
5166
+ } = await import("./dist-BDO5GFEM.js");
5051
5167
  const graphDir = path38.join(projectPath, ".harness", "graph");
5052
5168
  const store = new GraphStore();
5053
5169
  await store.load(graphDir);
@@ -5140,7 +5256,7 @@ function createIngestCommand() {
5140
5256
  import { Command as Command41 } from "commander";
5141
5257
  import * as path39 from "path";
5142
5258
  async function runQuery(projectPath, rootNodeId, opts) {
5143
- const { GraphStore, ContextQL } = await import("./dist-4MYPT3OE.js");
5259
+ const { GraphStore, ContextQL } = await import("./dist-BDO5GFEM.js");
5144
5260
  const store = new GraphStore();
5145
5261
  const graphDir = path39.join(projectPath, ".harness", "graph");
5146
5262
  const loaded = await store.load(graphDir);
@@ -5189,7 +5305,7 @@ import { Command as Command42 } from "commander";
5189
5305
  // src/commands/graph/status.ts
5190
5306
  import * as path40 from "path";
5191
5307
  async function runGraphStatus(projectPath) {
5192
- const { GraphStore } = await import("./dist-4MYPT3OE.js");
5308
+ const { GraphStore } = await import("./dist-BDO5GFEM.js");
5193
5309
  const graphDir = path40.join(projectPath, ".harness", "graph");
5194
5310
  const store = new GraphStore();
5195
5311
  const loaded = await store.load(graphDir);
@@ -5229,7 +5345,7 @@ async function runGraphStatus(projectPath) {
5229
5345
  // src/commands/graph/export.ts
5230
5346
  import * as path41 from "path";
5231
5347
  async function runGraphExport(projectPath, format) {
5232
- const { GraphStore } = await import("./dist-4MYPT3OE.js");
5348
+ const { GraphStore } = await import("./dist-BDO5GFEM.js");
5233
5349
  const graphDir = path41.join(projectPath, ".harness", "graph");
5234
5350
  const store = new GraphStore();
5235
5351
  const loaded = await store.load(graphDir);
@@ -5358,6 +5474,8 @@ export {
5358
5474
  runCheckPhaseGate,
5359
5475
  generateSlashCommands,
5360
5476
  AGENT_DESCRIPTIONS,
5477
+ DEFAULT_TOOLS,
5478
+ GEMINI_TOOL_MAP,
5361
5479
  generateAgentDefinition,
5362
5480
  renderClaudeCodeAgent,
5363
5481
  renderGeminiAgent,