@harness-engineering/cli 4.0.0 → 4.0.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/skills/claude-code/product-advisor/SKILL.md +202 -0
- package/dist/agents/skills/claude-code/product-advisor/skill.yaml +74 -0
- package/dist/agents/skills/codex/product-advisor/SKILL.md +202 -0
- package/dist/agents/skills/codex/product-advisor/skill.yaml +74 -0
- package/dist/agents/skills/cursor/product-advisor/SKILL.md +202 -0
- package/dist/agents/skills/cursor/product-advisor/skill.yaml +74 -0
- package/dist/agents/skills/gemini-cli/product-advisor/SKILL.md +202 -0
- package/dist/agents/skills/gemini-cli/product-advisor/skill.yaml +74 -0
- package/dist/{agents-md-7OSNWU52.js → agents-md-VJLYEH2S.js} +4 -4
- package/dist/{analyzer-V633GUHY-MBCQWKDU.js → analyzer-V633GUHY-OV335HGM.js} +2 -2
- package/dist/{architecture-2XYGJGT3.js → architecture-YQH2NYXY.js} +5 -5
- package/dist/{assess-project-3KPP2D6M.js → assess-project-KOTAPAHD.js} +1 -1
- package/dist/bin/harness-mcp.js +16 -16
- package/dist/bin/harness.js +27 -27
- package/dist/{check-phase-gate-46U5AAXE.js → check-phase-gate-CHU2E3OU.js} +5 -5
- package/dist/{chunk-AK67S3O4.js → chunk-36GQREOE.js} +3 -3
- package/dist/{chunk-CLI4K2CH.js → chunk-4U5LDFCY.js} +1 -1
- package/dist/{chunk-VTUINXWR.js → chunk-4VXFZSYF.js} +1 -1
- package/dist/{chunk-HXMAIVV2.js → chunk-5RSXUAMN.js} +1 -1
- package/dist/{chunk-TTWNGOBT.js → chunk-6SCYTIF4.js} +6 -6
- package/dist/{chunk-N55WOGN3.js → chunk-6YFHUIGT.js} +1 -1
- package/dist/{chunk-WL3O2PKJ.js → chunk-7PJCK7UE.js} +8 -8
- package/dist/{chunk-PHX45JYN.js → chunk-7TIJXWG3.js} +2 -2
- package/dist/{chunk-SPE7P4GL.js → chunk-AAUY53CC.js} +1 -1
- package/dist/{chunk-VTU3QOJT.js → chunk-AX5KGRM6.js} +1 -1
- package/dist/{chunk-MYVTYFQD.js → chunk-E5EW5HVJ.js} +1 -1
- package/dist/{chunk-HMW3C5DP.js → chunk-EYMOPFSD.js} +2 -2
- package/dist/{chunk-6YXCZV33.js → chunk-GHBFNLV2.js} +278 -211
- package/dist/{chunk-363V6GPR.js → chunk-I3CGCZJF.js} +9 -9
- package/dist/{chunk-MSBJ445U.js → chunk-JPVOI7GP.js} +5 -5
- package/dist/{chunk-6NCREWWM.js → chunk-M7F2PPN3.js} +3 -3
- package/dist/{chunk-KLPX55TI.js → chunk-MMLQPHZ5.js} +210 -135
- package/dist/{chunk-BV45354Q.js → chunk-OQ6KOQEV.js} +9 -9
- package/dist/{chunk-ERILXQBP.js → chunk-RG3TNIUB.js} +610 -428
- package/dist/{chunk-GXCPDAS5.js → chunk-SDMV4QHM.js} +5 -5
- package/dist/{chunk-ZEYAOYJL.js → chunk-SEA2PFVI.js} +1 -1
- package/dist/{chunk-IYWT3JJW.js → chunk-T746REAE.js} +1 -1
- package/dist/{chunk-FZ4Q73HA.js → chunk-UWVMJEUJ.js} +1 -1
- package/dist/{chunk-PP6ZRL5T.js → chunk-WZJR6SOI.js} +536 -422
- package/dist/{chunk-XFHZ7GCI.js → chunk-XAVMTAUT.js} +2 -2
- package/dist/{chunk-S2RQPPL6.js → chunk-YANR2RL7.js} +1 -1
- package/dist/{chunk-2N4OENGE.js → chunk-YYFSFSB3.js} +1 -1
- package/dist/{ci-workflow-XJN4UO3Q.js → ci-workflow-HO4WKGNG.js} +4 -4
- package/dist/{dist-IPVFYGY2.js → dist-6D2F2J57.js} +3 -3
- package/dist/{dist-OWHMNL4W.js → dist-DWBTZXR5.js} +1 -1
- package/dist/{docs-RSFZTNPG.js → docs-FP47JONV.js} +5 -5
- package/dist/{engine-DJIHY4JT.js → engine-YUA6IYOG.js} +4 -4
- package/dist/{entropy-EAEKJKRM.js → entropy-DBW2INZU.js} +4 -4
- package/dist/{feedback-JT5X3DBC.js → feedback-BPHADTRQ.js} +1 -1
- package/dist/{generate-agent-definitions-CC6KED3E.js → generate-agent-definitions-KPVGBGDY.js} +5 -5
- package/dist/{glob-helper-GLZAURJC.js → glob-helper-VR6UCZZB.js} +1 -1
- package/dist/{graph-loader-HHXN5FLP.js → graph-loader-STFGYKZH.js} +1 -1
- package/dist/index.js +27 -27
- package/dist/{loader-UWNVTYBY.js → loader-QOJQ6NZM.js} +4 -4
- package/dist/{mcp-TCLNK7HG.js → mcp-ZPX6O767.js} +16 -16
- package/dist/{performance-R6O3N3UB.js → performance-FXYTGJGQ.js} +5 -5
- package/dist/{review-pipeline-MOOWXWSQ.js → review-pipeline-2TFQ5OAE.js} +4 -4
- package/dist/{runtime-RIWQUKBQ.js → runtime-XK6ZCHKE.js} +4 -4
- package/dist/{scan-P7YFKB77.js → scan-IYSVRPD2.js} +1 -1
- package/dist/{security-U76C54W6.js → security-4W2P5ZGI.js} +1 -1
- package/dist/{state-events-F44CUUZG.js → state-events-ECQAIZLU.js} +4 -4
- package/dist/{validate-IUAV7MOU.js → validate-64KTEGIE.js} +5 -5
- package/dist/{validate-cross-check-M2ZM6RFY.js → validate-cross-check-J5PVGICB.js} +4 -4
- package/package.json +1 -1
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import {
|
|
2
2
|
generateRuntime
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YANR2RL7.js";
|
|
4
4
|
import {
|
|
5
5
|
generateAgentsMd
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-T746REAE.js";
|
|
7
7
|
import {
|
|
8
8
|
generateCIWorkflow
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-AX5KGRM6.js";
|
|
10
10
|
import {
|
|
11
11
|
readHarnessState
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-AAUY53CC.js";
|
|
13
13
|
import {
|
|
14
14
|
runCrossCheck
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-4VXFZSYF.js";
|
|
16
16
|
import {
|
|
17
17
|
createGenerateAgentDefinitionsCommand,
|
|
18
18
|
generateAgentDefinitions
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-E5EW5HVJ.js";
|
|
20
20
|
import {
|
|
21
21
|
toKebabCase
|
|
22
22
|
} from "./chunk-KET4QQZB.js";
|
|
23
23
|
import {
|
|
24
24
|
createScanCommand,
|
|
25
25
|
loadIngestOptions
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-YYFSFSB3.js";
|
|
27
27
|
import {
|
|
28
28
|
TemplateEngine
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-UWVMJEUJ.js";
|
|
30
30
|
import {
|
|
31
31
|
generate,
|
|
32
32
|
validate
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
import {
|
|
38
38
|
listPersonas,
|
|
39
39
|
loadPersona
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-5RSXUAMN.js";
|
|
41
41
|
import {
|
|
42
42
|
runPersona
|
|
43
43
|
} from "./chunk-GISMXMVL.js";
|
|
@@ -51,7 +51,7 @@ import {
|
|
|
51
51
|
OutputFormatter,
|
|
52
52
|
OutputMode,
|
|
53
53
|
createCheckPhaseGateCommand
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-7TIJXWG3.js";
|
|
55
55
|
import {
|
|
56
56
|
appendFrameworkAgents,
|
|
57
57
|
captureHealthSnapshot,
|
|
@@ -79,13 +79,13 @@ import {
|
|
|
79
79
|
runSecurityCraft,
|
|
80
80
|
runSpecCraft,
|
|
81
81
|
runTestCraft
|
|
82
|
-
} from "./chunk-
|
|
82
|
+
} from "./chunk-RG3TNIUB.js";
|
|
83
83
|
import {
|
|
84
84
|
VALID_PLATFORMS
|
|
85
85
|
} from "./chunk-3ISINLYT.js";
|
|
86
86
|
import {
|
|
87
87
|
loadGraphStore
|
|
88
|
-
} from "./chunk-
|
|
88
|
+
} from "./chunk-4U5LDFCY.js";
|
|
89
89
|
import {
|
|
90
90
|
loadOrRebuildIndex
|
|
91
91
|
} from "./chunk-WBVCN35T.js";
|
|
@@ -108,7 +108,7 @@ import {
|
|
|
108
108
|
BranchingConfigSchema,
|
|
109
109
|
findConfigFile,
|
|
110
110
|
resolveConfig
|
|
111
|
-
} from "./chunk-
|
|
111
|
+
} from "./chunk-XAVMTAUT.js";
|
|
112
112
|
import {
|
|
113
113
|
logger
|
|
114
114
|
} from "./chunk-EBJQ6N4M.js";
|
|
@@ -224,7 +224,7 @@ import {
|
|
|
224
224
|
writeConfig,
|
|
225
225
|
writeLockfile,
|
|
226
226
|
writeRegeneratedRoadmap
|
|
227
|
-
} from "./chunk-
|
|
227
|
+
} from "./chunk-MMLQPHZ5.js";
|
|
228
228
|
import {
|
|
229
229
|
CLI_VERSION
|
|
230
230
|
} from "./chunk-BM3PWGXQ.js";
|
|
@@ -237,7 +237,7 @@ import {
|
|
|
237
237
|
detectDocDrift,
|
|
238
238
|
generateSuggestions,
|
|
239
239
|
validateDependencies
|
|
240
|
-
} from "./chunk-
|
|
240
|
+
} from "./chunk-6YFHUIGT.js";
|
|
241
241
|
import {
|
|
242
242
|
Err,
|
|
243
243
|
INDEXED_FILE_KINDS,
|
|
@@ -250,7 +250,7 @@ import {
|
|
|
250
250
|
DesignConstraintAdapter,
|
|
251
251
|
GraphStore,
|
|
252
252
|
init_dist as init_dist2
|
|
253
|
-
} from "./chunk-
|
|
253
|
+
} from "./chunk-WZJR6SOI.js";
|
|
254
254
|
import {
|
|
255
255
|
ArchConfigSchema,
|
|
256
256
|
TimelineManager
|
|
@@ -450,7 +450,7 @@ function registerSkillsCommand(adoption) {
|
|
|
450
450
|
const globalOpts = cmd.optsWithGlobals();
|
|
451
451
|
const limit = Math.max(parseInt(opts.limit, 10) || 20, 1);
|
|
452
452
|
const cwd = process.cwd();
|
|
453
|
-
const { readAdoptionRecords, aggregateBySkill } = await import("./dist-
|
|
453
|
+
const { readAdoptionRecords, aggregateBySkill } = await import("./dist-6D2F2J57.js");
|
|
454
454
|
const records = readAdoptionRecords(cwd);
|
|
455
455
|
if (records.length === 0) {
|
|
456
456
|
if (globalOpts.json) {
|
|
@@ -486,7 +486,7 @@ function registerRecentCommand(adoption) {
|
|
|
486
486
|
const globalOpts = cmd.optsWithGlobals();
|
|
487
487
|
const limit = Math.max(parseInt(opts.limit, 10) || 20, 1);
|
|
488
488
|
const cwd = process.cwd();
|
|
489
|
-
const { readAdoptionRecords } = await import("./dist-
|
|
489
|
+
const { readAdoptionRecords } = await import("./dist-6D2F2J57.js");
|
|
490
490
|
const records = readAdoptionRecords(cwd);
|
|
491
491
|
if (records.length === 0) {
|
|
492
492
|
if (globalOpts.json) {
|
|
@@ -564,7 +564,7 @@ function registerSkillCommand(adoption) {
|
|
|
564
564
|
adoption.command("skill <name>").description("Show detail for a specific skill").action(async (name, _opts, cmd) => {
|
|
565
565
|
const globalOpts = cmd.optsWithGlobals();
|
|
566
566
|
const cwd = process.cwd();
|
|
567
|
-
const { readAdoptionRecords, aggregateBySkill } = await import("./dist-
|
|
567
|
+
const { readAdoptionRecords, aggregateBySkill } = await import("./dist-6D2F2J57.js");
|
|
568
568
|
const records = readAdoptionRecords(cwd);
|
|
569
569
|
const skillRecords = records.filter((r) => r.skill === name);
|
|
570
570
|
if (skillRecords.length === 0) {
|
|
@@ -1995,10 +1995,24 @@ function createCheckHarnessStrengthCommand() {
|
|
|
1995
1995
|
init_dist3();
|
|
1996
1996
|
import { Command as Command15 } from "commander";
|
|
1997
1997
|
import * as path9 from "path";
|
|
1998
|
+
function resolveConfiguredEntryPoints(configPath) {
|
|
1999
|
+
const configResult = resolveConfig(configPath);
|
|
2000
|
+
if (!configResult.ok) return void 0;
|
|
2001
|
+
const config = configResult.value;
|
|
2002
|
+
const fromPerformance = config.performance?.entryPoints;
|
|
2003
|
+
if (Array.isArray(fromPerformance) && fromPerformance.length > 0) {
|
|
2004
|
+
return fromPerformance.filter((e) => typeof e === "string");
|
|
2005
|
+
}
|
|
2006
|
+
const fromEntropy = config.entropy?.entryPoints;
|
|
2007
|
+
if (Array.isArray(fromEntropy) && fromEntropy.length > 0) return fromEntropy;
|
|
2008
|
+
return void 0;
|
|
2009
|
+
}
|
|
1998
2010
|
async function runCheckPerf(cwd, options) {
|
|
1999
2011
|
const runAll2 = !options.structural && !options.size && !options.coupling;
|
|
2012
|
+
const entryPoints = resolveConfiguredEntryPoints(options.configPath);
|
|
2000
2013
|
const analyzer = new EntropyAnalyzer({
|
|
2001
2014
|
rootDir: path9.resolve(cwd),
|
|
2015
|
+
...entryPoints && { entryPoints },
|
|
2002
2016
|
analyze: {
|
|
2003
2017
|
complexity: runAll2 || !!options.structural,
|
|
2004
2018
|
coupling: runAll2 || !!options.coupling,
|
|
@@ -4331,8 +4345,7 @@ function promptYesNo(message) {
|
|
|
4331
4345
|
});
|
|
4332
4346
|
});
|
|
4333
4347
|
}
|
|
4334
|
-
function
|
|
4335
|
-
const cmd = new Command32("deliveries").description("Inspect and manage webhook delivery queue");
|
|
4348
|
+
function registerListCommand(cmd) {
|
|
4336
4349
|
cmd.command("list").description("List delivery queue entries (newest first; capped at 200 rows)").option("--status <status>", "Filter by status: pending|failed|delivered|dead").option("--subscription <id>", "Filter by subscription ID").action((opts) => {
|
|
4337
4350
|
const queue = getQueue();
|
|
4338
4351
|
try {
|
|
@@ -4345,6 +4358,8 @@ function createDeliveriesCommand() {
|
|
|
4345
4358
|
queue.close();
|
|
4346
4359
|
}
|
|
4347
4360
|
});
|
|
4361
|
+
}
|
|
4362
|
+
function registerRetryCommand(cmd) {
|
|
4348
4363
|
cmd.command("retry <id>").description("Re-enqueue a dead-lettered delivery by ID").action((id) => {
|
|
4349
4364
|
const queue = getQueue();
|
|
4350
4365
|
try {
|
|
@@ -4359,23 +4374,30 @@ function createDeliveriesCommand() {
|
|
|
4359
4374
|
queue.close();
|
|
4360
4375
|
}
|
|
4361
4376
|
});
|
|
4377
|
+
}
|
|
4378
|
+
function buildPurgeOptions(opts) {
|
|
4379
|
+
const purgeOpts = {};
|
|
4380
|
+
if (opts.deadOnly) purgeOpts.deadOnly = true;
|
|
4381
|
+
if (opts.olderThan !== void 0) purgeOpts.olderThanMs = Number(opts.olderThan);
|
|
4382
|
+
if (opts.all) purgeOpts.all = true;
|
|
4383
|
+
return purgeOpts;
|
|
4384
|
+
}
|
|
4385
|
+
function ttyPurgeConfirm(count) {
|
|
4386
|
+
if (count === 0) {
|
|
4387
|
+
console.log("No matching rows to delete.");
|
|
4388
|
+
return false;
|
|
4389
|
+
}
|
|
4390
|
+
return promptYesNo(`Delete ${count} row(s)? [y/N] `);
|
|
4391
|
+
}
|
|
4392
|
+
function registerPurgeCommand(cmd) {
|
|
4362
4393
|
cmd.command("purge").description("Delete delivery rows from the queue (requires at least one filter)").option("--dead-only", "Delete only dead-lettered rows").option("--older-than <ms>", "Delete delivered rows older than N milliseconds").option("--all", "Delete every row in the queue (use with caution)").action(async (opts) => {
|
|
4363
4394
|
const queue = getQueue();
|
|
4364
4395
|
try {
|
|
4365
|
-
const purgeOpts =
|
|
4366
|
-
if (opts.deadOnly) purgeOpts.deadOnly = true;
|
|
4367
|
-
if (opts.olderThan !== void 0) purgeOpts.olderThanMs = Number(opts.olderThan);
|
|
4368
|
-
if (opts.all) purgeOpts.all = true;
|
|
4396
|
+
const purgeOpts = buildPurgeOptions(opts);
|
|
4369
4397
|
const isTty = Boolean(process.stdout.isTTY);
|
|
4370
4398
|
const runOpts = {};
|
|
4371
4399
|
if (isTty) {
|
|
4372
|
-
runOpts.confirm =
|
|
4373
|
-
if (count === 0) {
|
|
4374
|
-
console.log("No matching rows to delete.");
|
|
4375
|
-
return false;
|
|
4376
|
-
}
|
|
4377
|
-
return promptYesNo(`Delete ${count} row(s)? [y/N] `);
|
|
4378
|
-
};
|
|
4400
|
+
runOpts.confirm = ttyPurgeConfirm;
|
|
4379
4401
|
}
|
|
4380
4402
|
const result = await runDeliveriesPurge(queue, purgeOpts, runOpts);
|
|
4381
4403
|
if (result === -1) {
|
|
@@ -4387,6 +4409,12 @@ function createDeliveriesCommand() {
|
|
|
4387
4409
|
queue.close();
|
|
4388
4410
|
}
|
|
4389
4411
|
});
|
|
4412
|
+
}
|
|
4413
|
+
function createDeliveriesCommand() {
|
|
4414
|
+
const cmd = new Command32("deliveries").description("Inspect and manage webhook delivery queue");
|
|
4415
|
+
registerListCommand(cmd);
|
|
4416
|
+
registerRetryCommand(cmd);
|
|
4417
|
+
registerPurgeCommand(cmd);
|
|
4390
4418
|
return cmd;
|
|
4391
4419
|
}
|
|
4392
4420
|
|
|
@@ -4483,7 +4511,7 @@ async function readConnectorSyncStatus(graphDir) {
|
|
|
4483
4511
|
return result;
|
|
4484
4512
|
}
|
|
4485
4513
|
async function runGraphStatus(projectPath) {
|
|
4486
|
-
const { GraphStore: GraphStore2, loadGraphMetadata } = await import("./dist-
|
|
4514
|
+
const { GraphStore: GraphStore2, loadGraphMetadata } = await import("./dist-DWBTZXR5.js");
|
|
4487
4515
|
const graphDir = path18.join(projectPath, ".harness", "graph");
|
|
4488
4516
|
const metaResult = await loadGraphMetadata(graphDir);
|
|
4489
4517
|
if (metaResult.status === "not_found") {
|
|
@@ -4535,7 +4563,7 @@ async function runGraphStatus(projectPath) {
|
|
|
4535
4563
|
// src/commands/graph/export.ts
|
|
4536
4564
|
import * as path19 from "path";
|
|
4537
4565
|
async function runGraphExport(projectPath, format) {
|
|
4538
|
-
const { GraphStore: GraphStore2 } = await import("./dist-
|
|
4566
|
+
const { GraphStore: GraphStore2 } = await import("./dist-DWBTZXR5.js");
|
|
4539
4567
|
const graphDir = path19.join(projectPath, ".harness", "graph");
|
|
4540
4568
|
const store = new GraphStore2();
|
|
4541
4569
|
const loaded = await store.load(graphDir);
|
|
@@ -4568,7 +4596,7 @@ async function runGraphExport(projectPath, format) {
|
|
|
4568
4596
|
import { Command as Command35 } from "commander";
|
|
4569
4597
|
import * as path20 from "path";
|
|
4570
4598
|
async function runQuery(projectPath, rootNodeId, opts) {
|
|
4571
|
-
const { GraphStore: GraphStore2, ContextQL } = await import("./dist-
|
|
4599
|
+
const { GraphStore: GraphStore2, ContextQL } = await import("./dist-DWBTZXR5.js");
|
|
4572
4600
|
const store = new GraphStore2();
|
|
4573
4601
|
const graphDir = path20.join(projectPath, ".harness", "graph");
|
|
4574
4602
|
const loaded = await store.load(graphDir);
|
|
@@ -4673,7 +4701,7 @@ async function runIngest(projectPath, source, opts) {
|
|
|
4673
4701
|
ConfluenceConnector,
|
|
4674
4702
|
FigmaConnector,
|
|
4675
4703
|
MiroConnector
|
|
4676
|
-
} = await import("./dist-
|
|
4704
|
+
} = await import("./dist-DWBTZXR5.js");
|
|
4677
4705
|
const graphDir = path21.join(projectPath, ".harness", "graph");
|
|
4678
4706
|
const store = new GraphStore2();
|
|
4679
4707
|
await store.load(graphDir);
|
|
@@ -4689,7 +4717,7 @@ async function runIngest(projectPath, source, opts) {
|
|
|
4689
4717
|
path21.join(projectPath, "docs", "changes")
|
|
4690
4718
|
);
|
|
4691
4719
|
const gitResult = await new GitIngestor(store).ingest(projectPath);
|
|
4692
|
-
const { createExtractionRunner } = await import("./dist-
|
|
4720
|
+
const { createExtractionRunner } = await import("./dist-DWBTZXR5.js");
|
|
4693
4721
|
const extractedDir = path21.join(projectPath, ".harness", "knowledge", "extracted");
|
|
4694
4722
|
const signalsResult = await createExtractionRunner().run(projectPath, store, extractedDir);
|
|
4695
4723
|
const syncManager = new SyncManager(store, graphDir);
|
|
@@ -4739,7 +4767,7 @@ async function runIngest(projectPath, source, opts) {
|
|
|
4739
4767
|
);
|
|
4740
4768
|
break;
|
|
4741
4769
|
case "business-signals": {
|
|
4742
|
-
const { createExtractionRunner } = await import("./dist-
|
|
4770
|
+
const { createExtractionRunner } = await import("./dist-DWBTZXR5.js");
|
|
4743
4771
|
const extractedDir = path21.join(projectPath, ".harness", "knowledge", "extracted");
|
|
4744
4772
|
result = await createExtractionRunner().run(projectPath, store, extractedDir);
|
|
4745
4773
|
break;
|
|
@@ -6131,7 +6159,7 @@ function createInsightsCommand() {
|
|
|
6131
6159
|
return new Command46("insights").description("Composite project report \u2014 health, entropy, decay, attention, impact.").option("--json", "Emit JSON to stdout instead of pretty text").option("--skip <list>", `Comma-separated keys to skip (${INSIGHTS_KEYS.join(",")})`).action(async (opts) => {
|
|
6132
6160
|
const cwd = process.cwd();
|
|
6133
6161
|
const skip = parseSkip2(opts.skip);
|
|
6134
|
-
const { composeInsights } = await import("./dist-
|
|
6162
|
+
const { composeInsights } = await import("./dist-6D2F2J57.js");
|
|
6135
6163
|
const report = await composeInsights(cwd, { skip });
|
|
6136
6164
|
if (opts.json) {
|
|
6137
6165
|
console.log(JSON.stringify(report, null, 2));
|
|
@@ -7323,6 +7351,166 @@ ${file}`);
|
|
|
7323
7351
|
import { Command as Command55 } from "commander";
|
|
7324
7352
|
import * as path41 from "path";
|
|
7325
7353
|
import chalk7 from "chalk";
|
|
7354
|
+
function resolveInferenceOptions(cfgKnowledge) {
|
|
7355
|
+
const patterns = cfgKnowledge?.domainPatterns;
|
|
7356
|
+
const blocklist = cfgKnowledge?.domainBlocklist;
|
|
7357
|
+
const hasPatterns = (patterns?.length ?? 0) > 0;
|
|
7358
|
+
const hasBlocklist = (blocklist?.length ?? 0) > 0;
|
|
7359
|
+
if (!hasPatterns && !hasBlocklist) {
|
|
7360
|
+
return void 0;
|
|
7361
|
+
}
|
|
7362
|
+
return {
|
|
7363
|
+
...hasPatterns ? { extraPatterns: patterns } : {},
|
|
7364
|
+
...hasBlocklist ? { extraBlocklist: blocklist } : {}
|
|
7365
|
+
};
|
|
7366
|
+
}
|
|
7367
|
+
function buildPipelineOptions(opts, projectDir, graphDir, inferenceOptions) {
|
|
7368
|
+
const pipelineOpts = {
|
|
7369
|
+
projectDir,
|
|
7370
|
+
fix: Boolean(opts.fix),
|
|
7371
|
+
ci: Boolean(opts.ci),
|
|
7372
|
+
...opts.domain ? { domain: opts.domain } : {},
|
|
7373
|
+
graphDir,
|
|
7374
|
+
analyzeImages: Boolean(opts.analyzeImages),
|
|
7375
|
+
...inferenceOptions ? { inferenceOptions } : {}
|
|
7376
|
+
};
|
|
7377
|
+
if (opts.imagePaths) {
|
|
7378
|
+
pipelineOpts.imagePaths = opts.imagePaths.split(",").map((p) => p.trim());
|
|
7379
|
+
}
|
|
7380
|
+
return pipelineOpts;
|
|
7381
|
+
}
|
|
7382
|
+
async function createAnalysisProvider() {
|
|
7383
|
+
try {
|
|
7384
|
+
const intelligence = await import("@harness-engineering/intelligence");
|
|
7385
|
+
const Provider = intelligence.AnthropicAnalysisProvider;
|
|
7386
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
7387
|
+
if (!apiKey) {
|
|
7388
|
+
logger.error("ANTHROPIC_API_KEY environment variable is required for --analyze-images");
|
|
7389
|
+
process.exit(1);
|
|
7390
|
+
}
|
|
7391
|
+
return new Provider({ apiKey });
|
|
7392
|
+
} catch {
|
|
7393
|
+
logger.error(
|
|
7394
|
+
"Image analysis requires @harness-engineering/intelligence with ANTHROPIC_API_KEY set."
|
|
7395
|
+
);
|
|
7396
|
+
process.exit(1);
|
|
7397
|
+
}
|
|
7398
|
+
}
|
|
7399
|
+
function printJsonResult(result) {
|
|
7400
|
+
console.log(
|
|
7401
|
+
JSON.stringify(
|
|
7402
|
+
{
|
|
7403
|
+
verdict: result.verdict,
|
|
7404
|
+
driftScore: result.driftScore,
|
|
7405
|
+
iterations: result.iterations,
|
|
7406
|
+
findings: result.findings,
|
|
7407
|
+
extraction: result.extraction,
|
|
7408
|
+
errors: result.errors,
|
|
7409
|
+
gaps: {
|
|
7410
|
+
domains: result.gaps.domains.length,
|
|
7411
|
+
totalEntries: result.gaps.totalEntries,
|
|
7412
|
+
totalExtracted: result.gaps.totalExtracted,
|
|
7413
|
+
totalGaps: result.gaps.totalGaps
|
|
7414
|
+
},
|
|
7415
|
+
remediations: result.remediations,
|
|
7416
|
+
contradictions: {
|
|
7417
|
+
count: result.contradictions.contradictions.length,
|
|
7418
|
+
sourcePairCounts: result.contradictions.sourcePairCounts
|
|
7419
|
+
},
|
|
7420
|
+
coverage: {
|
|
7421
|
+
overallScore: result.coverage.overallScore,
|
|
7422
|
+
overallGrade: result.coverage.overallGrade,
|
|
7423
|
+
domains: result.coverage.domains.length
|
|
7424
|
+
},
|
|
7425
|
+
...result.materialization ? {
|
|
7426
|
+
materialization: {
|
|
7427
|
+
created: result.materialization.created.length,
|
|
7428
|
+
skipped: result.materialization.skipped.length,
|
|
7429
|
+
files: result.materialization.created.map((d) => d.filePath)
|
|
7430
|
+
}
|
|
7431
|
+
} : {}
|
|
7432
|
+
},
|
|
7433
|
+
null,
|
|
7434
|
+
2
|
|
7435
|
+
)
|
|
7436
|
+
);
|
|
7437
|
+
}
|
|
7438
|
+
function printSummary(result) {
|
|
7439
|
+
const verdictColor = result.verdict === "pass" ? chalk7.green("PASS") : result.verdict === "warn" ? chalk7.yellow("WARN") : chalk7.red("FAIL");
|
|
7440
|
+
console.log("");
|
|
7441
|
+
console.log(`KNOWLEDGE PIPELINE -- Verdict: ${verdictColor}`);
|
|
7442
|
+
console.log("");
|
|
7443
|
+
console.log(` Drift Score: ${result.driftScore.toFixed(2)}`);
|
|
7444
|
+
console.log(
|
|
7445
|
+
` Findings: ${result.findings.new} new, ${result.findings.stale} stale, ${result.findings.drifted} drifted, ${result.findings.contradicting} contradicting`
|
|
7446
|
+
);
|
|
7447
|
+
console.log(
|
|
7448
|
+
` Extraction: ${result.extraction.codeSignals} code signals, ${result.extraction.diagrams} diagrams, ${result.extraction.linkerFacts} linker facts, ${result.extraction.businessKnowledge} business knowledge, ${result.extraction.decisions} decisions, ${result.extraction.images} images`
|
|
7449
|
+
);
|
|
7450
|
+
console.log(
|
|
7451
|
+
` Gaps: ${result.gaps.domains.length} domains \u2014 ${result.gaps.totalEntries} documented / ${result.gaps.totalExtracted} extracted / ${result.gaps.totalGaps} undocumented`
|
|
7452
|
+
);
|
|
7453
|
+
if (result.iterations > 1) {
|
|
7454
|
+
console.log(` Convergence: ${result.iterations} iterations`);
|
|
7455
|
+
}
|
|
7456
|
+
if (result.remediations.length > 0) {
|
|
7457
|
+
console.log(` Remediations: ${result.remediations.length} applied`);
|
|
7458
|
+
}
|
|
7459
|
+
}
|
|
7460
|
+
function printIngestionErrors(result) {
|
|
7461
|
+
if (result.errors.length === 0) {
|
|
7462
|
+
return;
|
|
7463
|
+
}
|
|
7464
|
+
console.warn("");
|
|
7465
|
+
console.warn(` ${result.errors.length} ingestion warning(s):`);
|
|
7466
|
+
for (const err of result.errors) {
|
|
7467
|
+
console.warn(` - ${err}`);
|
|
7468
|
+
}
|
|
7469
|
+
}
|
|
7470
|
+
function printMaterialization(result) {
|
|
7471
|
+
if (!result.materialization) {
|
|
7472
|
+
return;
|
|
7473
|
+
}
|
|
7474
|
+
const mat = result.materialization;
|
|
7475
|
+
console.log(
|
|
7476
|
+
` Materialization: ${mat.created.length} docs created, ${mat.skipped.length} skipped`
|
|
7477
|
+
);
|
|
7478
|
+
for (const doc of mat.created) {
|
|
7479
|
+
console.log(` ${chalk7.green("+")} ${doc.filePath}`);
|
|
7480
|
+
}
|
|
7481
|
+
}
|
|
7482
|
+
function printContradictions(result, opts) {
|
|
7483
|
+
if (!opts.checkContradictions && result.contradictions.contradictions.length === 0) {
|
|
7484
|
+
return;
|
|
7485
|
+
}
|
|
7486
|
+
console.log("");
|
|
7487
|
+
console.log(
|
|
7488
|
+
` Contradictions: ${result.contradictions.contradictions.length} detected across ${result.contradictions.totalChecked} knowledge nodes`
|
|
7489
|
+
);
|
|
7490
|
+
for (const c of result.contradictions.contradictions) {
|
|
7491
|
+
console.log(` ${chalk7.red("!")} ${c.description} [${c.conflictType}] (${c.severity})`);
|
|
7492
|
+
}
|
|
7493
|
+
}
|
|
7494
|
+
function printCoverage(result, opts) {
|
|
7495
|
+
if (!opts.coverage && result.coverage.domains.length === 0) {
|
|
7496
|
+
return;
|
|
7497
|
+
}
|
|
7498
|
+
console.log("");
|
|
7499
|
+
console.log(` Coverage: ${result.coverage.overallGrade} (${result.coverage.overallScore}/100)`);
|
|
7500
|
+
for (const d of result.coverage.domains) {
|
|
7501
|
+
console.log(
|
|
7502
|
+
` ${d.domain}: ${d.grade} (${d.score}/100) \u2014 ${d.knowledgeEntries} knowledge, ${d.linkedEntities}/${d.codeEntities} code linked`
|
|
7503
|
+
);
|
|
7504
|
+
}
|
|
7505
|
+
}
|
|
7506
|
+
function printHumanResult(result, opts) {
|
|
7507
|
+
printSummary(result);
|
|
7508
|
+
printIngestionErrors(result);
|
|
7509
|
+
printMaterialization(result);
|
|
7510
|
+
printContradictions(result, opts);
|
|
7511
|
+
printCoverage(result, opts);
|
|
7512
|
+
console.log("");
|
|
7513
|
+
}
|
|
7326
7514
|
function createKnowledgePipelineCommand() {
|
|
7327
7515
|
return new Command55("knowledge-pipeline").description("Run knowledge extraction, drift detection, and gap analysis").option("--fix", "Enable convergence-based auto-remediation (default: detect-only)").option("--ci", "Non-interactive mode \u2014 apply safe fixes only, report everything else").option("--domain <name>", "Limit pipeline to a specific knowledge domain").option("--drift-check", "Exit 1 if unresolved drift exists (CI gate mode)").option("--analyze-images", "Enable vision model analysis of image files").option("--image-paths <paths>", "Comma-separated image file paths for analysis").option("--coverage", "Display per-domain coverage report").option("--check-contradictions", "Display cross-source contradiction report").action(async (opts, cmd) => {
|
|
7328
7516
|
const globalOpts = cmd.optsWithGlobals();
|
|
@@ -7331,7 +7519,7 @@ function createKnowledgePipelineCommand() {
|
|
|
7331
7519
|
const graphDir = path41.join(projectDir, ".harness", "graph");
|
|
7332
7520
|
const fs50 = await import("fs/promises");
|
|
7333
7521
|
await fs50.mkdir(graphDir, { recursive: true });
|
|
7334
|
-
const { GraphStore: GraphStore2, KnowledgePipelineRunner } = await import("./dist-
|
|
7522
|
+
const { GraphStore: GraphStore2, KnowledgePipelineRunner } = await import("./dist-DWBTZXR5.js");
|
|
7335
7523
|
const store = new GraphStore2();
|
|
7336
7524
|
try {
|
|
7337
7525
|
await store.load(graphDir);
|
|
@@ -7339,145 +7527,19 @@ function createKnowledgePipelineCommand() {
|
|
|
7339
7527
|
}
|
|
7340
7528
|
const cfgResult = resolveConfig();
|
|
7341
7529
|
const cfgKnowledge = cfgResult.ok ? cfgResult.value.knowledge : void 0;
|
|
7342
|
-
const inferenceOptions =
|
|
7343
|
-
|
|
7344
|
-
...(cfgKnowledge.domainBlocklist?.length ?? 0) > 0 ? { extraBlocklist: cfgKnowledge.domainBlocklist } : {}
|
|
7345
|
-
} : void 0;
|
|
7346
|
-
const pipelineOpts = {
|
|
7347
|
-
projectDir,
|
|
7348
|
-
fix: Boolean(opts.fix),
|
|
7349
|
-
ci: Boolean(opts.ci),
|
|
7350
|
-
...opts.domain ? { domain: opts.domain } : {},
|
|
7351
|
-
graphDir,
|
|
7352
|
-
analyzeImages: Boolean(opts.analyzeImages),
|
|
7353
|
-
...inferenceOptions ? { inferenceOptions } : {}
|
|
7354
|
-
};
|
|
7355
|
-
if (opts.imagePaths) {
|
|
7356
|
-
pipelineOpts.imagePaths = opts.imagePaths.split(",").map((p) => p.trim());
|
|
7357
|
-
}
|
|
7530
|
+
const inferenceOptions = resolveInferenceOptions(cfgKnowledge);
|
|
7531
|
+
const pipelineOpts = buildPipelineOptions(opts, projectDir, graphDir, inferenceOptions);
|
|
7358
7532
|
if (opts.analyzeImages) {
|
|
7359
|
-
|
|
7360
|
-
const intelligence = await import("@harness-engineering/intelligence");
|
|
7361
|
-
const Provider = intelligence.AnthropicAnalysisProvider;
|
|
7362
|
-
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
7363
|
-
if (!apiKey) {
|
|
7364
|
-
logger.error(
|
|
7365
|
-
"ANTHROPIC_API_KEY environment variable is required for --analyze-images"
|
|
7366
|
-
);
|
|
7367
|
-
process.exit(1);
|
|
7368
|
-
}
|
|
7369
|
-
pipelineOpts.analysisProvider = new Provider({ apiKey });
|
|
7370
|
-
} catch {
|
|
7371
|
-
logger.error(
|
|
7372
|
-
"Image analysis requires @harness-engineering/intelligence with ANTHROPIC_API_KEY set."
|
|
7373
|
-
);
|
|
7374
|
-
process.exit(1);
|
|
7375
|
-
}
|
|
7533
|
+
pipelineOpts.analysisProvider = await createAnalysisProvider();
|
|
7376
7534
|
}
|
|
7377
7535
|
const runner = new KnowledgePipelineRunner(store);
|
|
7378
7536
|
const result = await runner.run(
|
|
7379
7537
|
pipelineOpts
|
|
7380
7538
|
);
|
|
7381
7539
|
if (globalOpts.json) {
|
|
7382
|
-
|
|
7383
|
-
JSON.stringify(
|
|
7384
|
-
{
|
|
7385
|
-
verdict: result.verdict,
|
|
7386
|
-
driftScore: result.driftScore,
|
|
7387
|
-
iterations: result.iterations,
|
|
7388
|
-
findings: result.findings,
|
|
7389
|
-
extraction: result.extraction,
|
|
7390
|
-
errors: result.errors,
|
|
7391
|
-
gaps: {
|
|
7392
|
-
domains: result.gaps.domains.length,
|
|
7393
|
-
totalEntries: result.gaps.totalEntries,
|
|
7394
|
-
totalExtracted: result.gaps.totalExtracted,
|
|
7395
|
-
totalGaps: result.gaps.totalGaps
|
|
7396
|
-
},
|
|
7397
|
-
remediations: result.remediations,
|
|
7398
|
-
contradictions: {
|
|
7399
|
-
count: result.contradictions.contradictions.length,
|
|
7400
|
-
sourcePairCounts: result.contradictions.sourcePairCounts
|
|
7401
|
-
},
|
|
7402
|
-
coverage: {
|
|
7403
|
-
overallScore: result.coverage.overallScore,
|
|
7404
|
-
overallGrade: result.coverage.overallGrade,
|
|
7405
|
-
domains: result.coverage.domains.length
|
|
7406
|
-
},
|
|
7407
|
-
...result.materialization ? {
|
|
7408
|
-
materialization: {
|
|
7409
|
-
created: result.materialization.created.length,
|
|
7410
|
-
skipped: result.materialization.skipped.length,
|
|
7411
|
-
files: result.materialization.created.map(
|
|
7412
|
-
(d) => d.filePath
|
|
7413
|
-
)
|
|
7414
|
-
}
|
|
7415
|
-
} : {}
|
|
7416
|
-
},
|
|
7417
|
-
null,
|
|
7418
|
-
2
|
|
7419
|
-
)
|
|
7420
|
-
);
|
|
7540
|
+
printJsonResult(result);
|
|
7421
7541
|
} else {
|
|
7422
|
-
|
|
7423
|
-
console.log("");
|
|
7424
|
-
console.log(`KNOWLEDGE PIPELINE -- Verdict: ${verdictColor}`);
|
|
7425
|
-
console.log("");
|
|
7426
|
-
console.log(` Drift Score: ${result.driftScore.toFixed(2)}`);
|
|
7427
|
-
console.log(
|
|
7428
|
-
` Findings: ${result.findings.new} new, ${result.findings.stale} stale, ${result.findings.drifted} drifted, ${result.findings.contradicting} contradicting`
|
|
7429
|
-
);
|
|
7430
|
-
console.log(
|
|
7431
|
-
` Extraction: ${result.extraction.codeSignals} code signals, ${result.extraction.diagrams} diagrams, ${result.extraction.linkerFacts} linker facts, ${result.extraction.businessKnowledge} business knowledge, ${result.extraction.decisions} decisions, ${result.extraction.images} images`
|
|
7432
|
-
);
|
|
7433
|
-
console.log(
|
|
7434
|
-
` Gaps: ${result.gaps.domains.length} domains \u2014 ${result.gaps.totalEntries} documented / ${result.gaps.totalExtracted} extracted / ${result.gaps.totalGaps} undocumented`
|
|
7435
|
-
);
|
|
7436
|
-
if (result.iterations > 1) {
|
|
7437
|
-
console.log(` Convergence: ${result.iterations} iterations`);
|
|
7438
|
-
}
|
|
7439
|
-
if (result.remediations.length > 0) {
|
|
7440
|
-
console.log(` Remediations: ${result.remediations.length} applied`);
|
|
7441
|
-
}
|
|
7442
|
-
if (result.errors.length > 0) {
|
|
7443
|
-
console.warn("");
|
|
7444
|
-
console.warn(` ${result.errors.length} ingestion warning(s):`);
|
|
7445
|
-
for (const err of result.errors) {
|
|
7446
|
-
console.warn(` - ${err}`);
|
|
7447
|
-
}
|
|
7448
|
-
}
|
|
7449
|
-
if (result.materialization) {
|
|
7450
|
-
const mat = result.materialization;
|
|
7451
|
-
console.log(
|
|
7452
|
-
` Materialization: ${mat.created.length} docs created, ${mat.skipped.length} skipped`
|
|
7453
|
-
);
|
|
7454
|
-
for (const doc of mat.created) {
|
|
7455
|
-
console.log(` ${chalk7.green("+")} ${doc.filePath}`);
|
|
7456
|
-
}
|
|
7457
|
-
}
|
|
7458
|
-
if (opts.checkContradictions || result.contradictions.contradictions.length > 0) {
|
|
7459
|
-
console.log("");
|
|
7460
|
-
console.log(
|
|
7461
|
-
` Contradictions: ${result.contradictions.contradictions.length} detected across ${result.contradictions.totalChecked} knowledge nodes`
|
|
7462
|
-
);
|
|
7463
|
-
for (const c of result.contradictions.contradictions) {
|
|
7464
|
-
console.log(
|
|
7465
|
-
` ${chalk7.red("!")} ${c.description} [${c.conflictType}] (${c.severity})`
|
|
7466
|
-
);
|
|
7467
|
-
}
|
|
7468
|
-
}
|
|
7469
|
-
if (opts.coverage || result.coverage.domains.length > 0) {
|
|
7470
|
-
console.log("");
|
|
7471
|
-
console.log(
|
|
7472
|
-
` Coverage: ${result.coverage.overallGrade} (${result.coverage.overallScore}/100)`
|
|
7473
|
-
);
|
|
7474
|
-
for (const d of result.coverage.domains) {
|
|
7475
|
-
console.log(
|
|
7476
|
-
` ${d.domain}: ${d.grade} (${d.score}/100) \u2014 ${d.knowledgeEntries} knowledge, ${d.linkedEntities}/${d.codeEntities} code linked`
|
|
7477
|
-
);
|
|
7478
|
-
}
|
|
7479
|
-
}
|
|
7480
|
-
console.log("");
|
|
7542
|
+
printHumanResult(result, opts);
|
|
7481
7543
|
}
|
|
7482
7544
|
const unresolvedDrift = result.findings.drifted + result.findings.stale + result.findings.contradicting;
|
|
7483
7545
|
if (opts.driftCheck && unresolvedDrift > 0) {
|
|
@@ -8208,7 +8270,7 @@ function createMcpCommand() {
|
|
|
8208
8270
|
parseBudget
|
|
8209
8271
|
).action(async (opts) => {
|
|
8210
8272
|
const [{ startServer: startServer2, getToolDefinitions: getToolDefinitions2 }, { selectTier }] = await Promise.all([
|
|
8211
|
-
import("./mcp-
|
|
8273
|
+
import("./mcp-ZPX6O767.js"),
|
|
8212
8274
|
import("./tool-tiers-OKK5FE57.js")
|
|
8213
8275
|
]);
|
|
8214
8276
|
if (opts.tools && opts.tools.length > 0) {
|
|
@@ -9283,7 +9345,7 @@ function registerBenchCommand(perf) {
|
|
|
9283
9345
|
perf.command("bench [glob]").description("Run benchmarks via vitest bench").action(async (glob2, _opts, cmd) => {
|
|
9284
9346
|
const globalOpts = cmd.optsWithGlobals();
|
|
9285
9347
|
const cwd = process.cwd();
|
|
9286
|
-
const { BenchmarkRunner } = await import("./dist-
|
|
9348
|
+
const { BenchmarkRunner } = await import("./dist-6D2F2J57.js");
|
|
9287
9349
|
const runner = new BenchmarkRunner();
|
|
9288
9350
|
const benchFiles = runner.discover(cwd, glob2);
|
|
9289
9351
|
if (benchFiles.length === 0) {
|
|
@@ -9347,7 +9409,7 @@ async function runBaselinesShow(globalOpts) {
|
|
|
9347
9409
|
}
|
|
9348
9410
|
async function runBaselinesUpdate(globalOpts) {
|
|
9349
9411
|
const cwd = process.cwd();
|
|
9350
|
-
const { BenchmarkRunner } = await import("./dist-
|
|
9412
|
+
const { BenchmarkRunner } = await import("./dist-6D2F2J57.js");
|
|
9351
9413
|
const runner = new BenchmarkRunner();
|
|
9352
9414
|
const manager = new BaselineManager(cwd);
|
|
9353
9415
|
logger.info("Running benchmarks to update baselines...");
|
|
@@ -9388,7 +9450,7 @@ function registerReportCommand(perf) {
|
|
|
9388
9450
|
perf.command("report").description("Full performance report with metrics, trends, and hotspots").action(async (_opts, cmd) => {
|
|
9389
9451
|
const globalOpts = cmd.optsWithGlobals();
|
|
9390
9452
|
const cwd = process.cwd();
|
|
9391
|
-
const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-
|
|
9453
|
+
const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-6D2F2J57.js");
|
|
9392
9454
|
const analyzer = new EntropyAnalyzer2({
|
|
9393
9455
|
rootDir: path50.resolve(cwd),
|
|
9394
9456
|
analyze: { complexity: true, coupling: true }
|
|
@@ -9917,7 +9979,7 @@ async function runPublishAnalyses(opts) {
|
|
|
9917
9979
|
const nameToExternalId = await buildNameToExternalIdMap(projectPath);
|
|
9918
9980
|
if (!nameToExternalId) return process.exit(1);
|
|
9919
9981
|
const { AnalysisArchive } = await import("@harness-engineering/orchestrator");
|
|
9920
|
-
const { GitHubIssuesSyncAdapter: GitHubIssuesSyncAdapter2 } = await import("./dist-
|
|
9982
|
+
const { GitHubIssuesSyncAdapter: GitHubIssuesSyncAdapter2 } = await import("./dist-6D2F2J57.js");
|
|
9921
9983
|
const archive = new AnalysisArchive(path52.join(projectPath, ".harness", "analyses"));
|
|
9922
9984
|
const analyses = await archive.list();
|
|
9923
9985
|
if (analyses.length === 0) {
|
|
@@ -11163,6 +11225,33 @@ function logSummary(result) {
|
|
|
11163
11225
|
`Reconciled ${markedDone.length} row(s) to done: ${markedDone.join(", ")} (already-done: ${alreadyDone.length}, unmatched: ${unmatched.length}).`
|
|
11164
11226
|
);
|
|
11165
11227
|
}
|
|
11228
|
+
function parseFromRefsFlag(raw) {
|
|
11229
|
+
const refs = raw.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
|
|
11230
|
+
if (refs.length === 0) {
|
|
11231
|
+
logger.error(
|
|
11232
|
+
`--from-refs was provided ("${raw}") but contained no valid references; expected a comma-separated list of owner/repo#number`
|
|
11233
|
+
);
|
|
11234
|
+
process.exit(ExitCode.ERROR);
|
|
11235
|
+
}
|
|
11236
|
+
return refs;
|
|
11237
|
+
}
|
|
11238
|
+
function parseFromIssuesFlag(raw) {
|
|
11239
|
+
const parsed = raw.split(",").map((s) => Number.parseInt(s.trim(), 10)).filter((n) => Number.isInteger(n));
|
|
11240
|
+
if (parsed.length === 0) {
|
|
11241
|
+
logger.error(
|
|
11242
|
+
`--from-issues was provided ("${raw}") but contained no valid issue numbers; expected a comma-separated list of integers`
|
|
11243
|
+
);
|
|
11244
|
+
process.exit(ExitCode.ERROR);
|
|
11245
|
+
}
|
|
11246
|
+
return parsed;
|
|
11247
|
+
}
|
|
11248
|
+
function buildReconcileOptions(options) {
|
|
11249
|
+
const opts = {};
|
|
11250
|
+
if (options.cwd) opts.cwd = options.cwd;
|
|
11251
|
+
if (options.fromRefs !== void 0) opts.fromRefs = parseFromRefsFlag(options.fromRefs);
|
|
11252
|
+
if (options.fromIssues !== void 0) opts.fromIssues = parseFromIssuesFlag(options.fromIssues);
|
|
11253
|
+
return opts;
|
|
11254
|
+
}
|
|
11166
11255
|
function createRoadmapReconcileCommand() {
|
|
11167
11256
|
return new Command86("reconcile").description(
|
|
11168
11257
|
"Flip roadmap rows whose linked GitHub issue is closed to done. Offline mode flips only issues closed as 'completed' (a 'not planned'/'wontfix' close is left untouched); the PR-merge auto-done workflow remains authoritative for cross-repo correctness."
|
|
@@ -11173,29 +11262,7 @@ function createRoadmapReconcileCommand() {
|
|
|
11173
11262
|
"--from-refs <refs>",
|
|
11174
11263
|
"comma-separated owner/repo#number closing-issue references (preferred; cross-repo safe; skips the network fetch)"
|
|
11175
11264
|
).action(async (options) => {
|
|
11176
|
-
const
|
|
11177
|
-
if (options.cwd) opts.cwd = options.cwd;
|
|
11178
|
-
if (options.fromRefs !== void 0) {
|
|
11179
|
-
const refs = options.fromRefs.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
|
|
11180
|
-
if (refs.length === 0) {
|
|
11181
|
-
logger.error(
|
|
11182
|
-
`--from-refs was provided ("${options.fromRefs}") but contained no valid references; expected a comma-separated list of owner/repo#number`
|
|
11183
|
-
);
|
|
11184
|
-
process.exit(ExitCode.ERROR);
|
|
11185
|
-
}
|
|
11186
|
-
opts.fromRefs = refs;
|
|
11187
|
-
}
|
|
11188
|
-
if (options.fromIssues !== void 0) {
|
|
11189
|
-
const parsed = options.fromIssues.split(",").map((s) => Number.parseInt(s.trim(), 10)).filter((n) => Number.isInteger(n));
|
|
11190
|
-
if (parsed.length === 0) {
|
|
11191
|
-
logger.error(
|
|
11192
|
-
`--from-issues was provided ("${options.fromIssues}") but contained no valid issue numbers; expected a comma-separated list of integers`
|
|
11193
|
-
);
|
|
11194
|
-
process.exit(ExitCode.ERROR);
|
|
11195
|
-
}
|
|
11196
|
-
opts.fromIssues = parsed;
|
|
11197
|
-
}
|
|
11198
|
-
const result = await runRoadmapReconcile(opts);
|
|
11265
|
+
const result = await runRoadmapReconcile(buildReconcileOptions(options));
|
|
11199
11266
|
if (!result.ok) {
|
|
11200
11267
|
logger.error(result.error.message);
|
|
11201
11268
|
process.exit(result.error.exitCode);
|
|
@@ -12013,7 +12080,7 @@ async function detectLegacyLayout(cwd) {
|
|
|
12013
12080
|
}
|
|
12014
12081
|
async function runInitialGraphScan(cwd) {
|
|
12015
12082
|
try {
|
|
12016
|
-
const { runScan: runScan2 } = await import("./scan-
|
|
12083
|
+
const { runScan: runScan2 } = await import("./scan-IYSVRPD2.js");
|
|
12017
12084
|
const result = await runScan2(cwd);
|
|
12018
12085
|
return {
|
|
12019
12086
|
status: "pass",
|
|
@@ -12409,7 +12476,7 @@ function resolvePhaseState(metadata, projectPath, phase) {
|
|
|
12409
12476
|
}
|
|
12410
12477
|
async function appendProjectState(content, metadata, projectPath, hasPathOpt) {
|
|
12411
12478
|
if (!metadata?.state.persistent || !hasPathOpt) return content;
|
|
12412
|
-
const { readHarnessState: readHarnessState2, isEmptyHarnessState } = await import("./state-events-
|
|
12479
|
+
const { readHarnessState: readHarnessState2, isEmptyHarnessState } = await import("./state-events-ECQAIZLU.js");
|
|
12413
12480
|
const stateResult = await readHarnessState2(projectPath);
|
|
12414
12481
|
if (!stateResult.ok || isEmptyHarnessState(stateResult.value)) return content;
|
|
12415
12482
|
const stateContent = JSON.stringify(stateResult.value, null, 2);
|
|
@@ -13208,7 +13275,7 @@ function registerTrendsCommand(parent) {
|
|
|
13208
13275
|
}
|
|
13209
13276
|
});
|
|
13210
13277
|
}
|
|
13211
|
-
function
|
|
13278
|
+
function registerListCommand2(parent) {
|
|
13212
13279
|
parent.command("list").description("List all captured architecture snapshots").action(async (_opts, cmd) => {
|
|
13213
13280
|
const globalOpts = cmd.optsWithGlobals();
|
|
13214
13281
|
const mode = globalOpts.json ? OutputMode.JSON : OutputMode.TEXT;
|
|
@@ -13224,7 +13291,7 @@ function createSnapshotCommand() {
|
|
|
13224
13291
|
const command = new Command105("snapshot").description("Architecture timeline snapshot commands");
|
|
13225
13292
|
registerCaptureCommand(command);
|
|
13226
13293
|
registerTrendsCommand(command);
|
|
13227
|
-
|
|
13294
|
+
registerListCommand2(command);
|
|
13228
13295
|
return command;
|
|
13229
13296
|
}
|
|
13230
13297
|
|
|
@@ -13696,7 +13763,7 @@ async function runSyncAnalyses(opts) {
|
|
|
13696
13763
|
return;
|
|
13697
13764
|
}
|
|
13698
13765
|
const { AnalysisArchive, loadPublishedIndex: loadPublishedIndex2, savePublishedIndex: savePublishedIndex2 } = await import("@harness-engineering/orchestrator");
|
|
13699
|
-
const { GitHubIssuesSyncAdapter: GitHubIssuesSyncAdapter2 } = await import("./dist-
|
|
13766
|
+
const { GitHubIssuesSyncAdapter: GitHubIssuesSyncAdapter2 } = await import("./dist-6D2F2J57.js");
|
|
13700
13767
|
const adapter = new GitHubIssuesSyncAdapter2({ token, config: trackerConfig });
|
|
13701
13768
|
const archive = new AnalysisArchive(path74.join(projectPath, ".harness", "analyses"));
|
|
13702
13769
|
const publishedIndex = loadPublishedIndex2(projectPath);
|
|
@@ -14339,7 +14406,7 @@ async function runTraceability(options) {
|
|
|
14339
14406
|
const projectPath = process.cwd();
|
|
14340
14407
|
const store = await loadGraphStore(projectPath);
|
|
14341
14408
|
if (!store) handleNoStore2(mode);
|
|
14342
|
-
const graphModule = await import("./dist-
|
|
14409
|
+
const graphModule = await import("./dist-DWBTZXR5.js");
|
|
14343
14410
|
const filterOptions = buildFilterOptions(options);
|
|
14344
14411
|
const results = graphModule.queryTraceability(store, filterOptions);
|
|
14345
14412
|
if (results.length === 0) handleEmptyResults(mode);
|
|
@@ -14904,7 +14971,7 @@ function createUpdateCommand() {
|
|
|
14904
14971
|
// src/commands/usage.ts
|
|
14905
14972
|
import { Command as Command125 } from "commander";
|
|
14906
14973
|
async function loadAndPriceRecords(cwd, includeClaudeSessions = false) {
|
|
14907
|
-
const { readCostRecords, loadPricingData, calculateCost, parseCCRecords } = await import("./dist-
|
|
14974
|
+
const { readCostRecords, loadPricingData, calculateCost, parseCCRecords } = await import("./dist-6D2F2J57.js");
|
|
14908
14975
|
const records = readCostRecords(cwd);
|
|
14909
14976
|
if (includeClaudeSessions) {
|
|
14910
14977
|
const ccRecords = parseCCRecords();
|
|
@@ -14997,7 +15064,7 @@ function registerDailyCommand(usage) {
|
|
|
14997
15064
|
else logger.info("No usage data found. Run some harness sessions first.");
|
|
14998
15065
|
return;
|
|
14999
15066
|
}
|
|
15000
|
-
const { aggregateByDay } = await import("./dist-
|
|
15067
|
+
const { aggregateByDay } = await import("./dist-6D2F2J57.js");
|
|
15001
15068
|
const limited = aggregateByDay(records).slice(0, days);
|
|
15002
15069
|
if (globalOpts.json) {
|
|
15003
15070
|
console.log(
|
|
@@ -15026,7 +15093,7 @@ function registerSessionsCommand(usage) {
|
|
|
15026
15093
|
}
|
|
15027
15094
|
return;
|
|
15028
15095
|
}
|
|
15029
|
-
const { aggregateBySession } = await import("./dist-
|
|
15096
|
+
const { aggregateBySession } = await import("./dist-6D2F2J57.js");
|
|
15030
15097
|
const sessionData = aggregateBySession(records);
|
|
15031
15098
|
const limited = sessionData.slice(0, limit);
|
|
15032
15099
|
if (globalOpts.json) {
|
|
@@ -15106,7 +15173,7 @@ function registerSessionCommand(usage) {
|
|
|
15106
15173
|
cwd,
|
|
15107
15174
|
globalOpts.includeClaudeSessions
|
|
15108
15175
|
);
|
|
15109
|
-
const { aggregateBySession } = await import("./dist-
|
|
15176
|
+
const { aggregateBySession } = await import("./dist-6D2F2J57.js");
|
|
15110
15177
|
const sessionData = aggregateBySession(records);
|
|
15111
15178
|
const match = sessionData.find((s) => s.sessionId === id);
|
|
15112
15179
|
if (!match) {
|
|
@@ -15141,7 +15208,7 @@ function registerLatestCommand(usage) {
|
|
|
15141
15208
|
}
|
|
15142
15209
|
return;
|
|
15143
15210
|
}
|
|
15144
|
-
const { aggregateBySession } = await import("./dist-
|
|
15211
|
+
const { aggregateBySession } = await import("./dist-6D2F2J57.js");
|
|
15145
15212
|
const sessionData = aggregateBySession(records);
|
|
15146
15213
|
const latest = sessionData[0];
|
|
15147
15214
|
if (!latest) {
|
|
@@ -15490,7 +15557,7 @@ function resolveValidateMode(globalOpts) {
|
|
|
15490
15557
|
return OutputMode.TEXT;
|
|
15491
15558
|
}
|
|
15492
15559
|
async function printCrossCheckWarnings(mode) {
|
|
15493
|
-
const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-
|
|
15560
|
+
const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-J5PVGICB.js");
|
|
15494
15561
|
const cwd = process.cwd();
|
|
15495
15562
|
const crossResult = await runCrossCheck2({
|
|
15496
15563
|
specsDir: path79.join(cwd, "docs", "specs"),
|