@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.
- package/dist/agents/personas/documentation-maintainer.yaml +3 -1
- package/dist/agents/personas/performance-guardian.yaml +23 -0
- package/dist/agents/skills/claude-code/align-documentation/SKILL.md +13 -0
- package/dist/agents/skills/claude-code/cleanup-dead-code/SKILL.md +25 -1
- package/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +5 -2
- package/dist/agents/skills/claude-code/detect-doc-drift/SKILL.md +12 -0
- package/dist/agents/skills/claude-code/enforce-architecture/SKILL.md +48 -1
- package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +5 -2
- package/dist/agents/skills/claude-code/harness-accessibility/SKILL.md +7 -0
- package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +11 -3
- package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +81 -11
- package/dist/agents/skills/claude-code/harness-brainstorming/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +487 -234
- package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +15 -2
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/SKILL.md +226 -0
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +64 -0
- package/dist/agents/skills/claude-code/harness-dependency-health/SKILL.md +35 -6
- package/dist/agents/skills/claude-code/harness-docs-pipeline/SKILL.md +460 -0
- package/dist/agents/skills/claude-code/harness-docs-pipeline/skill.yaml +69 -0
- package/dist/agents/skills/claude-code/harness-execution/SKILL.md +73 -8
- package/dist/agents/skills/claude-code/harness-execution/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-hotspot-detector/SKILL.md +32 -6
- package/dist/agents/skills/claude-code/harness-i18n/SKILL.md +484 -0
- package/dist/agents/skills/claude-code/harness-i18n/skill.yaml +54 -0
- package/dist/agents/skills/claude-code/harness-i18n-process/SKILL.md +388 -0
- package/dist/agents/skills/claude-code/harness-i18n-process/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/harness-i18n-workflow/SKILL.md +512 -0
- package/dist/agents/skills/claude-code/harness-i18n-workflow/skill.yaml +53 -0
- package/dist/agents/skills/claude-code/harness-impact-analysis/SKILL.md +35 -6
- package/dist/agents/skills/claude-code/harness-integrity/SKILL.md +17 -1
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/SKILL.md +46 -5
- package/dist/agents/skills/claude-code/harness-perf/SKILL.md +37 -8
- package/dist/agents/skills/claude-code/harness-perf/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/harness-perf-tdd/SKILL.md +17 -4
- package/dist/agents/skills/claude-code/harness-planning/SKILL.md +59 -5
- package/dist/agents/skills/claude-code/harness-planning/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/harness-release-readiness/SKILL.md +16 -0
- package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +561 -0
- package/dist/agents/skills/claude-code/harness-roadmap/skill.yaml +43 -0
- package/dist/agents/skills/claude-code/harness-security-review/SKILL.md +36 -2
- package/dist/agents/skills/claude-code/harness-security-review/skill.yaml +8 -6
- package/dist/agents/skills/claude-code/harness-soundness-review/SKILL.md +1267 -0
- package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +48 -0
- package/dist/agents/skills/claude-code/harness-test-advisor/SKILL.md +35 -6
- package/dist/agents/skills/claude-code/harness-verification/SKILL.md +66 -0
- package/dist/agents/skills/claude-code/harness-verification/skill.yaml +1 -0
- package/dist/agents/skills/claude-code/harness-verify/SKILL.md +11 -0
- package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +15 -1
- package/dist/agents/skills/claude-code/validate-context-engineering/SKILL.md +12 -0
- package/dist/agents/skills/gemini-cli/add-harness-component/SKILL.md +192 -0
- package/dist/agents/skills/gemini-cli/add-harness-component/skill.yaml +32 -0
- package/dist/agents/skills/gemini-cli/align-documentation/SKILL.md +213 -0
- package/dist/agents/skills/gemini-cli/align-documentation/skill.yaml +31 -0
- package/dist/agents/skills/gemini-cli/check-mechanical-constraints/SKILL.md +191 -0
- package/dist/agents/skills/gemini-cli/check-mechanical-constraints/skill.yaml +32 -0
- package/dist/agents/skills/gemini-cli/cleanup-dead-code/SKILL.md +245 -0
- package/dist/agents/skills/gemini-cli/cleanup-dead-code/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/detect-doc-drift/SKILL.md +179 -0
- package/dist/agents/skills/gemini-cli/detect-doc-drift/skill.yaml +30 -0
- package/dist/agents/skills/gemini-cli/enforce-architecture/SKILL.md +240 -0
- package/dist/agents/skills/gemini-cli/enforce-architecture/skill.yaml +34 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/SKILL.md +7 -0
- package/dist/agents/skills/gemini-cli/harness-architecture-advisor/SKILL.md +397 -0
- package/dist/agents/skills/gemini-cli/harness-architecture-advisor/skill.yaml +48 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +11 -3
- package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +317 -0
- package/dist/agents/skills/gemini-cli/harness-brainstorming/skill.yaml +49 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +681 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +45 -0
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/SKILL.md +226 -0
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +64 -0
- package/dist/agents/skills/gemini-cli/harness-debugging/SKILL.md +366 -0
- package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +47 -0
- package/dist/agents/skills/gemini-cli/harness-dependency-health/SKILL.md +35 -6
- package/dist/agents/skills/gemini-cli/harness-diagnostics/SKILL.md +318 -0
- package/dist/agents/skills/gemini-cli/harness-diagnostics/skill.yaml +50 -0
- package/dist/agents/skills/gemini-cli/harness-docs-pipeline/SKILL.md +460 -0
- package/dist/agents/skills/gemini-cli/harness-docs-pipeline/skill.yaml +69 -0
- package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +382 -0
- package/dist/agents/skills/gemini-cli/harness-execution/skill.yaml +51 -0
- package/dist/agents/skills/gemini-cli/harness-git-workflow/SKILL.md +268 -0
- package/dist/agents/skills/gemini-cli/harness-git-workflow/skill.yaml +31 -0
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/SKILL.md +32 -6
- package/dist/agents/skills/gemini-cli/harness-i18n/SKILL.md +484 -0
- package/dist/agents/skills/gemini-cli/harness-i18n/skill.yaml +54 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-process/SKILL.md +388 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-process/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-workflow/SKILL.md +512 -0
- package/dist/agents/skills/gemini-cli/harness-i18n-workflow/skill.yaml +53 -0
- package/dist/agents/skills/gemini-cli/harness-impact-analysis/SKILL.md +35 -6
- package/dist/agents/skills/gemini-cli/harness-integrity/SKILL.md +167 -0
- package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +47 -0
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/SKILL.md +46 -5
- package/dist/agents/skills/gemini-cli/harness-onboarding/SKILL.md +288 -0
- package/dist/agents/skills/gemini-cli/harness-onboarding/skill.yaml +30 -0
- package/dist/agents/skills/gemini-cli/harness-parallel-agents/SKILL.md +171 -0
- package/dist/agents/skills/gemini-cli/harness-parallel-agents/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/harness-perf/SKILL.md +37 -8
- package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/harness-perf-tdd/SKILL.md +17 -4
- package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +389 -0
- package/dist/agents/skills/gemini-cli/harness-planning/skill.yaml +49 -0
- package/dist/agents/skills/gemini-cli/harness-pre-commit-review/SKILL.md +262 -0
- package/dist/agents/skills/gemini-cli/harness-pre-commit-review/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/harness-refactoring/SKILL.md +169 -0
- package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +33 -0
- package/dist/agents/skills/gemini-cli/harness-release-readiness/SKILL.md +16 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +561 -0
- package/dist/agents/skills/gemini-cli/harness-roadmap/skill.yaml +43 -0
- package/dist/agents/skills/gemini-cli/harness-security-review/skill.yaml +8 -6
- package/dist/agents/skills/gemini-cli/harness-skill-authoring/SKILL.md +292 -0
- package/dist/agents/skills/gemini-cli/harness-skill-authoring/skill.yaml +32 -0
- package/dist/agents/skills/gemini-cli/harness-soundness-review/SKILL.md +1267 -0
- package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +48 -0
- package/dist/agents/skills/gemini-cli/harness-state-management/SKILL.md +309 -0
- package/dist/agents/skills/gemini-cli/harness-state-management/skill.yaml +32 -0
- package/dist/agents/skills/gemini-cli/harness-tdd/SKILL.md +177 -0
- package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +48 -0
- package/dist/agents/skills/gemini-cli/harness-test-advisor/SKILL.md +35 -6
- package/dist/agents/skills/gemini-cli/harness-verification/SKILL.md +328 -0
- package/dist/agents/skills/gemini-cli/harness-verification/skill.yaml +42 -0
- package/dist/agents/skills/gemini-cli/harness-verify/SKILL.md +159 -0
- package/dist/agents/skills/gemini-cli/harness-verify/skill.yaml +40 -0
- package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +224 -0
- package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +31 -0
- package/dist/agents/skills/gemini-cli/validate-context-engineering/SKILL.md +150 -0
- package/dist/agents/skills/gemini-cli/validate-context-engineering/skill.yaml +31 -0
- package/dist/agents/skills/shared/i18n-knowledge/accessibility/intersection.yaml +142 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/encoding.yaml +67 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/formatting.yaml +106 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/layout.yaml +80 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/pluralization.yaml +80 -0
- package/dist/agents/skills/shared/i18n-knowledge/anti-patterns/string-handling.yaml +106 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/android-resources.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/apple-strings.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/backend-patterns.yaml +50 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/flutter-intl.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/i18next.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/react-intl.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/frameworks/vue-i18n.yaml +47 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/ecommerce.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/fintech.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/gaming.yaml +69 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/healthcare.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/industries/legal.yaml +66 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ar.yaml +41 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/de.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/en.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/es.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/fi.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/fr.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/he.yaml +41 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/hi.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/it.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ja.yaml +38 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ko.yaml +38 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/nl.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/pl.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/pt.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/ru.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/sv.yaml +32 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/th.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/tr.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/zh-Hans.yaml +38 -0
- package/dist/agents/skills/shared/i18n-knowledge/locales/zh-Hant.yaml +35 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/i18next-mcp.yaml +56 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/lingo-dev.yaml +56 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/lokalise.yaml +60 -0
- package/dist/agents/skills/shared/i18n-knowledge/mcp-interop/tolgee.yaml +60 -0
- package/dist/agents/skills/shared/i18n-knowledge/testing/locale-testing.yaml +107 -0
- package/dist/agents/skills/shared/i18n-knowledge/testing/pseudo-localization.yaml +86 -0
- package/dist/bin/harness.js +64 -4
- package/dist/{chunk-GA6GN5J2.js → chunk-E2RTDBMG.js} +2263 -41
- package/dist/{chunk-FFIX3QVG.js → chunk-KJANDVVC.js} +141 -49
- package/dist/{chunk-4WUGOJQ7.js → chunk-RT2LYQHF.js} +1 -1
- package/dist/{dist-C4J67MPP.js → dist-CCM3L3UE.js} +95 -1
- package/dist/{dist-N4D4QWFV.js → dist-K6KTTN3I.js} +4 -4
- package/dist/index.d.ts +187 -7
- package/dist/index.js +7 -3
- package/dist/validate-cross-check-ZGKFQY57.js +7 -0
- package/package.json +9 -9
- package/dist/agents/skills/node_modules/.bin/glob +0 -17
- package/dist/agents/skills/node_modules/.bin/vitest +0 -17
- package/dist/agents/skills/node_modules/.bin/yaml +0 -17
- package/dist/templates/advanced/docs/specs/.gitkeep +0 -0
- package/dist/templates/intermediate/docs/specs/.gitkeep +0 -0
- 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-
|
|
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/
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
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:
|
|
2308
|
-
checklist:
|
|
2309
|
-
check:
|
|
2310
|
-
passed:
|
|
2311
|
-
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
|
|
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(
|
|
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
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
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(
|
|
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
|
-
|
|
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 (
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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,
|