@harness-engineering/cli 1.7.0 → 1.8.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.
Files changed (187) 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/skills/claude-code/align-documentation/SKILL.md +13 -0
  4. package/dist/agents/skills/claude-code/cleanup-dead-code/SKILL.md +25 -1
  5. package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +5 -2
  6. package/dist/agents/skills/claude-code/detect-doc-drift/SKILL.md +12 -0
  7. package/dist/agents/skills/claude-code/enforce-architecture/SKILL.md +48 -1
  8. package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +5 -2
  9. package/dist/agents/skills/claude-code/harness-accessibility/SKILL.md +7 -0
  10. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +11 -3
  11. package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +81 -11
  12. package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +2 -0
  13. package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +487 -234
  14. package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +15 -2
  15. package/dist/agents/skills/claude-code/harness-codebase-cleanup/SKILL.md +226 -0
  16. package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +64 -0
  17. package/dist/agents/skills/claude-code/harness-dependency-health/SKILL.md +35 -6
  18. package/dist/agents/skills/claude-code/harness-docs-pipeline/SKILL.md +460 -0
  19. package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +69 -0
  20. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +73 -8
  21. package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
  22. package/dist/agents/skills/claude-code/harness-hotspot-detector/SKILL.md +32 -6
  23. package/dist/agents/skills/claude-code/harness-i18n/SKILL.md +484 -0
  24. package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +54 -0
  25. package/dist/agents/skills/claude-code/harness-i18n-process/SKILL.md +388 -0
  26. package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +43 -0
  27. package/dist/agents/skills/claude-code/harness-i18n-workflow/SKILL.md +512 -0
  28. package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +53 -0
  29. package/dist/agents/skills/claude-code/harness-impact-analysis/SKILL.md +35 -6
  30. package/dist/agents/skills/claude-code/harness-integrity/SKILL.md +17 -1
  31. package/dist/agents/skills/claude-code/harness-knowledge-mapper/SKILL.md +46 -5
  32. package/dist/agents/skills/claude-code/harness-perf/SKILL.md +37 -8
  33. package/dist/agents/skills/claude-code/harness-perf/skill.yaml +3 -0
  34. package/dist/agents/skills/claude-code/harness-perf-tdd/SKILL.md +17 -4
  35. package/dist/agents/skills/claude-code/harness-planning/SKILL.md +59 -5
  36. package/dist/agents/skills/claude-code/harness-planning/skill.yaml +2 -0
  37. package/dist/agents/skills/claude-code/harness-release-readiness/SKILL.md +16 -0
  38. package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +561 -0
  39. package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +43 -0
  40. package/dist/agents/skills/claude-code/harness-security-review/SKILL.md +36 -2
  41. package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +8 -6
  42. package/dist/agents/skills/claude-code/harness-soundness-review/SKILL.md +1267 -0
  43. package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +48 -0
  44. package/dist/agents/skills/claude-code/harness-test-advisor/SKILL.md +35 -6
  45. package/dist/agents/skills/claude-code/harness-verification/SKILL.md +66 -0
  46. package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
  47. package/dist/agents/skills/claude-code/harness-verify/SKILL.md +11 -0
  48. package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +15 -1
  49. package/dist/agents/skills/claude-code/validate-context-engineering/SKILL.md +12 -0
  50. package/dist/agents/skills/gemini-cli/add-harness-component/SKILL.md +192 -0
  51. package/dist/agents/skills/gemini-cli/add-harness-component/skill.yaml +32 -0
  52. package/dist/agents/skills/gemini-cli/align-documentation/SKILL.md +213 -0
  53. package/dist/agents/skills/gemini-cli/align-documentation/skill.yaml +31 -0
  54. package/dist/agents/skills/gemini-cli/check-mechanical-constraints/SKILL.md +191 -0
  55. package/dist/agents/skills/gemini-cli/check-mechanical-constraints/skill.yaml +32 -0
  56. package/dist/agents/skills/gemini-cli/cleanup-dead-code/SKILL.md +245 -0
  57. package/dist/agents/skills/gemini-cli/cleanup-dead-code/skill.yaml +33 -0
  58. package/dist/agents/skills/gemini-cli/detect-doc-drift/SKILL.md +179 -0
  59. package/dist/agents/skills/gemini-cli/detect-doc-drift/skill.yaml +30 -0
  60. package/dist/agents/skills/gemini-cli/enforce-architecture/SKILL.md +240 -0
  61. package/dist/agents/skills/gemini-cli/enforce-architecture/skill.yaml +34 -0
  62. package/dist/agents/skills/gemini-cli/harness-accessibility/SKILL.md +7 -0
  63. package/dist/agents/skills/gemini-cli/harness-architecture-advisor/SKILL.md +397 -0
  64. package/dist/agents/skills/gemini-cli/harness-architecture-advisor/skill.yaml +48 -0
  65. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +11 -3
  66. package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +317 -0
  67. package/dist/agents/skills/gemini-cli/harness-brainstorming/skill.yaml +49 -0
  68. package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +681 -0
  69. package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +45 -0
  70. package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/SKILL.md +226 -0
  71. package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +64 -0
  72. package/dist/agents/skills/gemini-cli/harness-debugging/SKILL.md +366 -0
  73. package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +47 -0
  74. package/dist/agents/skills/gemini-cli/harness-dependency-health/SKILL.md +35 -6
  75. package/dist/agents/skills/gemini-cli/harness-diagnostics/SKILL.md +318 -0
  76. package/dist/agents/skills/gemini-cli/harness-diagnostics/skill.yaml +50 -0
  77. package/dist/agents/skills/gemini-cli/harness-docs-pipeline/SKILL.md +460 -0
  78. package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +69 -0
  79. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +382 -0
  80. package/dist/agents/skills/gemini-cli/harness-execution/skill.yaml +51 -0
  81. package/dist/agents/skills/gemini-cli/harness-git-workflow/SKILL.md +268 -0
  82. package/dist/agents/skills/gemini-cli/harness-git-workflow/skill.yaml +31 -0
  83. package/dist/agents/skills/gemini-cli/harness-hotspot-detector/SKILL.md +32 -6
  84. package/dist/agents/skills/gemini-cli/harness-i18n/SKILL.md +484 -0
  85. package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +54 -0
  86. package/dist/agents/skills/gemini-cli/harness-i18n-process/SKILL.md +388 -0
  87. package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +43 -0
  88. package/dist/agents/skills/gemini-cli/harness-i18n-workflow/SKILL.md +512 -0
  89. package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +53 -0
  90. package/dist/agents/skills/gemini-cli/harness-impact-analysis/SKILL.md +35 -6
  91. package/dist/agents/skills/gemini-cli/harness-integrity/SKILL.md +167 -0
  92. package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +47 -0
  93. package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/SKILL.md +46 -5
  94. package/dist/agents/skills/gemini-cli/harness-onboarding/SKILL.md +288 -0
  95. package/dist/agents/skills/gemini-cli/harness-onboarding/skill.yaml +30 -0
  96. package/dist/agents/skills/gemini-cli/harness-parallel-agents/SKILL.md +171 -0
  97. package/dist/agents/skills/gemini-cli/harness-parallel-agents/skill.yaml +33 -0
  98. package/dist/agents/skills/gemini-cli/harness-perf/SKILL.md +37 -8
  99. package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +3 -0
  100. package/dist/agents/skills/gemini-cli/harness-perf-tdd/SKILL.md +17 -4
  101. package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +389 -0
  102. package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +49 -0
  103. package/dist/agents/skills/gemini-cli/harness-pre-commit-review/SKILL.md +262 -0
  104. package/dist/agents/skills/gemini-cli/harness-pre-commit-review/skill.yaml +33 -0
  105. package/dist/agents/skills/gemini-cli/harness-refactoring/SKILL.md +169 -0
  106. package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +33 -0
  107. package/dist/agents/skills/gemini-cli/harness-release-readiness/SKILL.md +16 -0
  108. package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +561 -0
  109. package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +43 -0
  110. package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +8 -6
  111. package/dist/agents/skills/gemini-cli/harness-skill-authoring/SKILL.md +292 -0
  112. package/dist/agents/skills/gemini-cli/harness-skill-authoring/skill.yaml +32 -0
  113. package/dist/agents/skills/gemini-cli/harness-soundness-review/SKILL.md +1267 -0
  114. package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +48 -0
  115. package/dist/agents/skills/gemini-cli/harness-state-management/SKILL.md +309 -0
  116. package/dist/agents/skills/gemini-cli/harness-state-management/skill.yaml +32 -0
  117. package/dist/agents/skills/gemini-cli/harness-tdd/SKILL.md +177 -0
  118. package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +48 -0
  119. package/dist/agents/skills/gemini-cli/harness-test-advisor/SKILL.md +35 -6
  120. package/dist/agents/skills/gemini-cli/harness-verification/SKILL.md +328 -0
  121. package/dist/agents/skills/gemini-cli/harness-verification/skill.yaml +42 -0
  122. package/dist/agents/skills/gemini-cli/harness-verify/SKILL.md +159 -0
  123. package/dist/agents/skills/gemini-cli/harness-verify/skill.yaml +40 -0
  124. package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +224 -0
  125. package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +31 -0
  126. package/dist/agents/skills/gemini-cli/validate-context-engineering/SKILL.md +150 -0
  127. package/dist/agents/skills/gemini-cli/validate-context-engineering/skill.yaml +31 -0
  128. package/dist/agents/skills/shared/i18n-knowledge/accessibility/intersection.yaml +142 -0
  129. package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/encoding.yaml +67 -0
  130. package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/formatting.yaml +106 -0
  131. package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/layout.yaml +80 -0
  132. package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/pluralization.yaml +80 -0
  133. package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/string-handling.yaml +106 -0
  134. package/dist/agents/skills/shared/i18n-knowledge/frameworks/android-resources.yaml +47 -0
  135. package/dist/agents/skills/shared/i18n-knowledge/frameworks/apple-strings.yaml +47 -0
  136. package/dist/agents/skills/shared/i18n-knowledge/frameworks/backend-patterns.yaml +50 -0
  137. package/dist/agents/skills/shared/i18n-knowledge/frameworks/flutter-intl.yaml +47 -0
  138. package/dist/agents/skills/shared/i18n-knowledge/frameworks/i18next.yaml +47 -0
  139. package/dist/agents/skills/shared/i18n-knowledge/frameworks/react-intl.yaml +47 -0
  140. package/dist/agents/skills/shared/i18n-knowledge/frameworks/vue-i18n.yaml +47 -0
  141. package/dist/agents/skills/shared/i18n-knowledge/industries/ecommerce.yaml +66 -0
  142. package/dist/agents/skills/shared/i18n-knowledge/industries/fintech.yaml +66 -0
  143. package/dist/agents/skills/shared/i18n-knowledge/industries/gaming.yaml +69 -0
  144. package/dist/agents/skills/shared/i18n-knowledge/industries/healthcare.yaml +66 -0
  145. package/dist/agents/skills/shared/i18n-knowledge/industries/legal.yaml +66 -0
  146. package/dist/agents/skills/shared/i18n-knowledge/locales/ar.yaml +41 -0
  147. package/dist/agents/skills/shared/i18n-knowledge/locales/de.yaml +35 -0
  148. package/dist/agents/skills/shared/i18n-knowledge/locales/en.yaml +32 -0
  149. package/dist/agents/skills/shared/i18n-knowledge/locales/es.yaml +35 -0
  150. package/dist/agents/skills/shared/i18n-knowledge/locales/fi.yaml +35 -0
  151. package/dist/agents/skills/shared/i18n-knowledge/locales/fr.yaml +35 -0
  152. package/dist/agents/skills/shared/i18n-knowledge/locales/he.yaml +41 -0
  153. package/dist/agents/skills/shared/i18n-knowledge/locales/hi.yaml +35 -0
  154. package/dist/agents/skills/shared/i18n-knowledge/locales/it.yaml +32 -0
  155. package/dist/agents/skills/shared/i18n-knowledge/locales/ja.yaml +38 -0
  156. package/dist/agents/skills/shared/i18n-knowledge/locales/ko.yaml +38 -0
  157. package/dist/agents/skills/shared/i18n-knowledge/locales/nl.yaml +32 -0
  158. package/dist/agents/skills/shared/i18n-knowledge/locales/pl.yaml +35 -0
  159. package/dist/agents/skills/shared/i18n-knowledge/locales/pt.yaml +32 -0
  160. package/dist/agents/skills/shared/i18n-knowledge/locales/ru.yaml +35 -0
  161. package/dist/agents/skills/shared/i18n-knowledge/locales/sv.yaml +32 -0
  162. package/dist/agents/skills/shared/i18n-knowledge/locales/th.yaml +35 -0
  163. package/dist/agents/skills/shared/i18n-knowledge/locales/tr.yaml +35 -0
  164. package/dist/agents/skills/shared/i18n-knowledge/locales/zh-Hans.yaml +38 -0
  165. package/dist/agents/skills/shared/i18n-knowledge/locales/zh-Hant.yaml +35 -0
  166. package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/i18next-mcp.yaml +56 -0
  167. package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/lingo-dev.yaml +56 -0
  168. package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/lokalise.yaml +60 -0
  169. package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/tolgee.yaml +60 -0
  170. package/dist/agents/skills/shared/i18n-knowledge/testing/locale-testing.yaml +107 -0
  171. package/dist/agents/skills/shared/i18n-knowledge/testing/pseudo-localization.yaml +86 -0
  172. package/dist/bin/harness.js +64 -4
  173. package/dist/{chunk-GA6GN5J2.js → chunk-E2RTDBMG.js} +2263 -41
  174. package/dist/{chunk-FFIX3QVG.js → chunk-KJANDVVC.js} +141 -49
  175. package/dist/{chunk-4WUGOJQ7.js → chunk-RT2LYQHF.js} +1 -1
  176. package/dist/{dist-C4J67MPP.js → dist-CCM3L3UE.js} +95 -1
  177. package/dist/{dist-N4D4QWFV.js → dist-K6KTTN3I.js} +4 -4
  178. package/dist/index.d.ts +187 -7
  179. package/dist/index.js +7 -3
  180. package/dist/validate-cross-check-ZGKFQY57.js +7 -0
  181. package/package.json +9 -9
  182. package/dist/agents/skills/node_modules/.bin/glob +0 -17
  183. package/dist/agents/skills/node_modules/.bin/vitest +0 -17
  184. package/dist/agents/skills/node_modules/.bin/yaml +0 -17
  185. package/dist/templates/advanced/docs/specs/.gitkeep +0 -0
  186. package/dist/templates/intermediate/docs/specs/.gitkeep +0 -0
  187. package/dist/validate-cross-check-WGXQ7K62.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-GA6GN5J2.js";
35
+ } from "./chunk-E2RTDBMG.js";
36
36
  import {
37
37
  CLIError,
38
38
  ExitCode,
@@ -84,7 +84,7 @@ var PhaseGateMappingSchema = z.object({
84
84
  var PhaseGatesConfigSchema = z.object({
85
85
  enabled: z.boolean().default(false),
86
86
  severity: z.enum(["error", "warning"]).default("error"),
87
- mappings: z.array(PhaseGateMappingSchema).default([{ implPattern: "src/**/*.ts", specPattern: "docs/specs/{feature}.md" }])
87
+ mappings: z.array(PhaseGateMappingSchema).default([{ implPattern: "src/**/*.ts", specPattern: "docs/changes/{feature}/proposal.md" }])
88
88
  });
89
89
  var SecurityConfigSchema = z.object({
90
90
  enabled: z.boolean().default(true),
@@ -103,6 +103,48 @@ var DesignConfigSchema = z.object({
103
103
  tokenPath: z.string().optional(),
104
104
  aestheticIntent: z.string().optional()
105
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
+ });
106
148
  var HarnessConfigSchema = z.object({
107
149
  version: z.literal(1),
108
150
  name: z.string().optional(),
@@ -122,7 +164,10 @@ var HarnessConfigSchema = z.object({
122
164
  version: z.number()
123
165
  }).optional(),
124
166
  phaseGates: PhaseGatesConfigSchema.optional(),
125
- design: DesignConfigSchema.optional()
167
+ design: DesignConfigSchema.optional(),
168
+ i18n: I18nConfigSchema.optional(),
169
+ review: ReviewConfigSchema.optional(),
170
+ updateCheckInterval: z.number().int().min(0).optional()
126
171
  });
127
172
 
128
173
  // src/config/loader.ts
@@ -314,7 +359,7 @@ function createValidateCommand() {
314
359
  process.exit(result.error.exitCode);
315
360
  }
316
361
  if (opts.crossCheck) {
317
- const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-WGXQ7K62.js");
362
+ const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-ZGKFQY57.js");
318
363
  const cwd = process.cwd();
319
364
  const specsDir = path2.join(cwd, "docs", "specs");
320
365
  const plansDir = path2.join(cwd, "docs", "plans");
@@ -680,7 +725,7 @@ function createPerfCommand() {
680
725
  perf.command("bench [glob]").description("Run benchmarks via vitest bench").action(async (glob2, _opts, cmd) => {
681
726
  const globalOpts = cmd.optsWithGlobals();
682
727
  const cwd = process.cwd();
683
- const { BenchmarkRunner } = await import("./dist-C4J67MPP.js");
728
+ const { BenchmarkRunner } = await import("./dist-CCM3L3UE.js");
684
729
  const runner = new BenchmarkRunner();
685
730
  const benchFiles = runner.discover(cwd, glob2);
686
731
  if (benchFiles.length === 0) {
@@ -749,7 +794,7 @@ Results (${result.results.length} benchmarks):`);
749
794
  baselines.command("update").description("Update baselines from latest benchmark run").action(async (_opts, cmd) => {
750
795
  const globalOpts = cmd.optsWithGlobals();
751
796
  const cwd = process.cwd();
752
- const { BenchmarkRunner } = await import("./dist-C4J67MPP.js");
797
+ const { BenchmarkRunner } = await import("./dist-CCM3L3UE.js");
753
798
  const runner = new BenchmarkRunner();
754
799
  const manager = new BaselineManager(cwd);
755
800
  logger.info("Running benchmarks to update baselines...");
@@ -777,7 +822,7 @@ Results (${result.results.length} benchmarks):`);
777
822
  perf.command("report").description("Full performance report with metrics, trends, and hotspots").action(async (_opts, cmd) => {
778
823
  const globalOpts = cmd.optsWithGlobals();
779
824
  const cwd = process.cwd();
780
- const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-C4J67MPP.js");
825
+ const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-CCM3L3UE.js");
781
826
  const analyzer = new EntropyAnalyzer2({
782
827
  rootDir: path6.resolve(cwd),
783
828
  analyze: { complexity: true, coupling: true }
@@ -1153,7 +1198,7 @@ var TemplateEngine = class {
1153
1198
  walk(fullPath);
1154
1199
  } else {
1155
1200
  files.push({
1156
- relativePath: path8.relative(dir, fullPath),
1201
+ relativePath: path8.relative(dir, fullPath).replace(/\\/g, "/"),
1157
1202
  absolutePath: fullPath,
1158
1203
  isHandlebars: entry.name.endsWith(".hbs"),
1159
1204
  sourceTemplate: sourceName
@@ -2293,34 +2338,54 @@ async function runAgentReview(options) {
2293
2338
  return Err(new CLIError(parsedDiffResult.error.message, ExitCode.ERROR));
2294
2339
  }
2295
2340
  const codeChanges = parsedDiffResult.value;
2296
- const review = await createSelfReview(codeChanges, {
2297
- rootDir: config.rootDir,
2298
- diffAnalysis: {
2299
- enabled: true,
2300
- checkTestCoverage: true
2301
- }
2302
- });
2303
- if (!review.ok) {
2304
- 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 {
2305
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
+ });
2306
2365
  return Ok({
2307
- passed: review.value.passed,
2308
- checklist: review.value.items.map((item) => ({
2309
- check: item.check,
2310
- passed: item.passed,
2311
- details: item.details
2312
- }))
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
2313
2373
  });
2314
2374
  }
2315
2375
  function createReviewCommand() {
2316
- 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) => {
2317
2377
  const globalOpts = cmd.optsWithGlobals();
2318
2378
  const mode = globalOpts.json ? OutputMode.JSON : globalOpts.quiet ? OutputMode.QUIET : OutputMode.TEXT;
2319
2379
  const result = await runAgentReview({
2320
2380
  configPath: globalOpts.config,
2321
2381
  json: globalOpts.json,
2322
2382
  verbose: globalOpts.verbose,
2323
- 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
2324
2389
  });
2325
2390
  if (!result.ok) {
2326
2391
  if (mode === OutputMode.JSON) {
@@ -2330,20 +2395,32 @@ function createReviewCommand() {
2330
2395
  }
2331
2396
  process.exit(result.error.exitCode);
2332
2397
  }
2398
+ const { pipelineResult } = result.value;
2333
2399
  if (mode === OutputMode.JSON) {
2334
- 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
+ );
2335
2414
  } else if (mode !== OutputMode.QUIET) {
2336
- console.log(result.value.passed ? "v Self-review passed" : "x Self-review found issues");
2337
- console.log("");
2338
- for (const item of result.value.checklist) {
2339
- const icon = item.passed ? "v" : "x";
2340
- console.log(` ${icon} ${item.check}`);
2341
- if (item.details && !item.passed) {
2342
- console.log(` ${item.details}`);
2343
- }
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");
2344
2419
  }
2345
2420
  }
2346
- 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
+ );
2347
2424
  });
2348
2425
  }
2349
2426
 
@@ -3763,7 +3840,7 @@ import { Command as Command31 } from "commander";
3763
3840
  import * as path31 from "path";
3764
3841
  import * as fs19 from "fs";
3765
3842
  function resolveSpecPath(implFile, implPattern, specPattern, cwd) {
3766
- const relImpl = path31.relative(cwd, implFile);
3843
+ const relImpl = path31.relative(cwd, implFile).replace(/\\/g, "/");
3767
3844
  const implBase = (implPattern.split("*")[0] ?? "").replace(/\/+$/, "");
3768
3845
  const afterBase = relImpl.startsWith(implBase + "/") ? relImpl.slice(implBase.length + 1) : relImpl;
3769
3846
  const segments = afterBase.split("/");
@@ -3797,8 +3874,8 @@ async function runCheckPhaseGate(options) {
3797
3874
  const expectedSpec = resolveSpecPath(implFile, mapping.implPattern, mapping.specPattern, cwd);
3798
3875
  if (!fs19.existsSync(expectedSpec)) {
3799
3876
  missingSpecs.push({
3800
- implFile: path31.relative(cwd, implFile),
3801
- expectedSpec: path31.relative(cwd, expectedSpec)
3877
+ implFile: path31.relative(cwd, implFile).replace(/\\/g, "/"),
3878
+ expectedSpec: path31.relative(cwd, expectedSpec).replace(/\\/g, "/")
3802
3879
  });
3803
3880
  }
3804
3881
  }
@@ -4523,7 +4600,7 @@ function createInitCommand2() {
4523
4600
  const dir = path35.dirname(targetPath);
4524
4601
  fs23.mkdirSync(dir, { recursive: true });
4525
4602
  fs23.writeFileSync(targetPath, content);
4526
- if (platform === "generic") {
4603
+ if (platform === "generic" && process.platform !== "win32") {
4527
4604
  fs23.chmodSync(targetPath, "755");
4528
4605
  }
4529
4606
  if (globalOpts.json) {
@@ -4554,10 +4631,12 @@ function detectPackageManager() {
4554
4631
  const argv1 = process.argv[1];
4555
4632
  if (!argv1) return "npm";
4556
4633
  const binPath = realpathSync(argv1);
4557
- if (binPath.includes("pnpm/global/") || binPath.includes("pnpm-global/")) {
4634
+ const normalizedBin = binPath.replace(/\\/g, "/");
4635
+ if (normalizedBin.includes("pnpm/global/") || // eslint-disable-line @harness-engineering/no-hardcoded-path-separator -- platform-safe
4636
+ normalizedBin.includes("pnpm-global/")) {
4558
4637
  return "pnpm";
4559
4638
  }
4560
- if (binPath.includes(".yarn/")) {
4639
+ if (normalizedBin.includes(".yarn/")) {
4561
4640
  return "yarn";
4562
4641
  }
4563
4642
  } catch {
@@ -4698,6 +4777,14 @@ var AGENT_DESCRIPTIONS = {
4698
4777
  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."
4699
4778
  };
4700
4779
  var DEFAULT_TOOLS = ["Bash", "Read", "Write", "Edit", "Glob", "Grep"];
4780
+ var GEMINI_TOOL_MAP = {
4781
+ Bash: "run_shell_command",
4782
+ Read: "read_file",
4783
+ Write: "write_file",
4784
+ Edit: "replace",
4785
+ Glob: "glob",
4786
+ Grep: "search_file_content"
4787
+ };
4701
4788
  function generateAgentDefinition(persona, skillContents) {
4702
4789
  const kebabName = toKebabCase(persona.name);
4703
4790
  const name = `harness-${kebabName}`;
@@ -4712,7 +4799,7 @@ function generateAgentDefinition(persona, skillContents) {
4712
4799
  return {
4713
4800
  name,
4714
4801
  description,
4715
- tools: DEFAULT_TOOLS,
4802
+ tools: [...DEFAULT_TOOLS],
4716
4803
  role: persona.role,
4717
4804
  skills: persona.skills,
4718
4805
  steps: persona.steps,
@@ -4770,6 +4857,9 @@ function renderClaudeCodeAgent(def) {
4770
4857
  }
4771
4858
 
4772
4859
  // src/agent-definitions/render-gemini-cli.ts
4860
+ function toGeminiToolName(tool) {
4861
+ return GEMINI_TOOL_MAP[tool] ?? tool;
4862
+ }
4773
4863
  function formatStep2(step, index) {
4774
4864
  if ("command" in step && step.command) {
4775
4865
  const cmd = step.command;
@@ -4791,7 +4881,7 @@ function renderGeminiAgent(def) {
4791
4881
  if (def.tools.length > 0) {
4792
4882
  lines.push("tools:");
4793
4883
  for (const tool of def.tools) {
4794
- lines.push(` - ${tool}`);
4884
+ lines.push(` - ${toGeminiToolName(tool)}`);
4795
4885
  }
4796
4886
  }
4797
4887
  lines.push("---");
@@ -4994,7 +5084,7 @@ function createGenerateCommand3() {
4994
5084
  import { Command as Command39 } from "commander";
4995
5085
  import * as path37 from "path";
4996
5086
  async function runScan(projectPath) {
4997
- const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-N4D4QWFV.js");
5087
+ const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-K6KTTN3I.js");
4998
5088
  const store = new GraphStore();
4999
5089
  const start = Date.now();
5000
5090
  await new CodeIngestor(store).ingest(projectPath);
@@ -5075,7 +5165,7 @@ async function runIngest(projectPath, source, opts) {
5075
5165
  SyncManager,
5076
5166
  JiraConnector,
5077
5167
  SlackConnector
5078
- } = await import("./dist-N4D4QWFV.js");
5168
+ } = await import("./dist-K6KTTN3I.js");
5079
5169
  const graphDir = path38.join(projectPath, ".harness", "graph");
5080
5170
  const store = new GraphStore();
5081
5171
  await store.load(graphDir);
@@ -5168,7 +5258,7 @@ function createIngestCommand() {
5168
5258
  import { Command as Command41 } from "commander";
5169
5259
  import * as path39 from "path";
5170
5260
  async function runQuery(projectPath, rootNodeId, opts) {
5171
- const { GraphStore, ContextQL } = await import("./dist-N4D4QWFV.js");
5261
+ const { GraphStore, ContextQL } = await import("./dist-K6KTTN3I.js");
5172
5262
  const store = new GraphStore();
5173
5263
  const graphDir = path39.join(projectPath, ".harness", "graph");
5174
5264
  const loaded = await store.load(graphDir);
@@ -5217,7 +5307,7 @@ import { Command as Command42 } from "commander";
5217
5307
  // src/commands/graph/status.ts
5218
5308
  import * as path40 from "path";
5219
5309
  async function runGraphStatus(projectPath) {
5220
- const { GraphStore } = await import("./dist-N4D4QWFV.js");
5310
+ const { GraphStore } = await import("./dist-K6KTTN3I.js");
5221
5311
  const graphDir = path40.join(projectPath, ".harness", "graph");
5222
5312
  const store = new GraphStore();
5223
5313
  const loaded = await store.load(graphDir);
@@ -5257,7 +5347,7 @@ async function runGraphStatus(projectPath) {
5257
5347
  // src/commands/graph/export.ts
5258
5348
  import * as path41 from "path";
5259
5349
  async function runGraphExport(projectPath, format) {
5260
- const { GraphStore } = await import("./dist-N4D4QWFV.js");
5350
+ const { GraphStore } = await import("./dist-K6KTTN3I.js");
5261
5351
  const graphDir = path41.join(projectPath, ".harness", "graph");
5262
5352
  const store = new GraphStore();
5263
5353
  const loaded = await store.load(graphDir);
@@ -5386,6 +5476,8 @@ export {
5386
5476
  runCheckPhaseGate,
5387
5477
  generateSlashCommands,
5388
5478
  AGENT_DESCRIPTIONS,
5479
+ DEFAULT_TOOLS,
5480
+ GEMINI_TOOL_MAP,
5389
5481
  generateAgentDefinition,
5390
5482
  renderClaudeCodeAgent,
5391
5483
  renderGeminiAgent,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Ok
3
- } from "./chunk-GA6GN5J2.js";
3
+ } from "./chunk-E2RTDBMG.js";
4
4
 
5
5
  // src/commands/validate-cross-check.ts
6
6
  import * as fs from "fs";