@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.
- package/dist/agents/personas/documentation-maintainer.yaml +3 -1
- package/dist/agents/personas/performance-guardian.yaml +23 -0
- package/dist/agents/personas/planner.yaml +27 -0
- package/dist/agents/personas/verifier.yaml +30 -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 +67 -1
- package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +5 -2
- package/dist/agents/skills/claude-code/harness-accessibility/SKILL.md +281 -0
- package/dist/agents/skills/claude-code/harness-accessibility/skill.yaml +51 -0
- package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +119 -72
- package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +4 -2
- package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +76 -4
- 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-dependency-health/skill.yaml +1 -1
- package/dist/agents/skills/claude-code/harness-design/SKILL.md +265 -0
- package/dist/agents/skills/claude-code/harness-design/skill.yaml +53 -0
- package/dist/agents/skills/claude-code/harness-design-mobile/SKILL.md +336 -0
- package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +49 -0
- package/dist/agents/skills/claude-code/harness-design-system/SKILL.md +282 -0
- package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +50 -0
- package/dist/agents/skills/claude-code/harness-design-web/SKILL.md +360 -0
- package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +52 -0
- 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-hotspot-detector/skill.yaml +1 -1
- 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 +51 -6
- package/dist/agents/skills/claude-code/harness-integrity/SKILL.md +35 -1
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/SKILL.md +46 -5
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -1
- package/dist/agents/skills/claude-code/harness-onboarding/SKILL.md +19 -1
- 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 +57 -3
- package/dist/agents/skills/claude-code/harness-planning/skill.yaml +2 -0
- package/dist/agents/skills/claude-code/harness-release-readiness/SKILL.md +29 -9
- package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +562 -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-security-scan/skill.yaml +1 -1
- 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 +37 -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/harness-accessibility/SKILL.md +281 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/skill.yaml +51 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +119 -72
- package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +4 -2
- 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-dependency-health/SKILL.md +35 -6
- package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -1
- package/dist/agents/skills/gemini-cli/harness-design/SKILL.md +265 -0
- package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +53 -0
- package/dist/agents/skills/gemini-cli/harness-design-mobile/SKILL.md +336 -0
- package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +49 -0
- package/dist/agents/skills/gemini-cli/harness-design-system/SKILL.md +282 -0
- package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +50 -0
- package/dist/agents/skills/gemini-cli/harness-design-web/SKILL.md +360 -0
- package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +52 -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-hotspot-detector/SKILL.md +32 -6
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -1
- 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 +51 -6
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/SKILL.md +46 -5
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -1
- 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-release-readiness/SKILL.md +29 -9
- package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +562 -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-security-scan/skill.yaml +1 -1
- 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-test-advisor/SKILL.md +35 -6
- package/dist/agents/skills/node_modules/.bin/vitest +2 -2
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/color.yaml +106 -0
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/layout.yaml +109 -0
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/motion.yaml +109 -0
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/typography.yaml +112 -0
- package/dist/agents/skills/shared/design-knowledge/industries/creative.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/ecommerce.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/emerging-tech.yaml +83 -0
- package/dist/agents/skills/shared/design-knowledge/industries/fintech.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/healthcare.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/lifestyle.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/saas.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/services.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/palettes/curated.yaml +234 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/android.yaml +125 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/flutter.yaml +144 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/ios.yaml +106 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/web.yaml +102 -0
- package/dist/agents/skills/shared/design-knowledge/typography/pairings.yaml +274 -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-UDWGSL3T.js → chunk-3JWCBVUZ.js} +3 -3
- package/dist/{chunk-IUFFBBYV.js → chunk-LNI4T7R6.js} +179 -61
- package/dist/{chunk-USEYPS7F.js → chunk-SJECMKSS.js} +2250 -40
- package/dist/{dist-4MYPT3OE.js → dist-BDO5GFEM.js} +295 -14
- package/dist/{dist-RBZXXJHG.js → dist-NT3GXHQZ.js} +95 -1
- package/dist/index.d.ts +266 -7
- package/dist/index.js +7 -3
- package/dist/validate-cross-check-2OPGCGGU.js +7 -0
- package/package.json +7 -7
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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:
|
|
746
|
-
commitHash =
|
|
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-
|
|
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: "
|
|
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
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
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:
|
|
2289
|
-
checklist:
|
|
2290
|
-
check:
|
|
2291
|
-
passed:
|
|
2292
|
-
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
|
|
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(
|
|
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
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
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(
|
|
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 {
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 {
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
-
})
|
|
4631
|
-
const installCmd = `${pm} install -g ${
|
|
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
|
-
|
|
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
|
|
4746
|
+
const isGlobal = scopeAnswer === "g" || scopeAnswer === "global";
|
|
4651
4747
|
try {
|
|
4652
|
-
|
|
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${
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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,
|