@harness-engineering/cli 1.27.0 → 1.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/agents/skills/claude-code/harness-architecture-advisor/SKILL.md +17 -5
  2. package/dist/agents/skills/claude-code/harness-architecture-advisor/skill.yaml +1 -1
  3. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +4 -4
  4. package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +1 -1
  5. package/dist/agents/skills/claude-code/harness-design-system/SKILL.md +6 -1
  6. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +4 -4
  7. package/dist/agents/skills/claude-code/harness-i18n-process/SKILL.md +2 -2
  8. package/dist/agents/skills/claude-code/harness-integration/SKILL.md +1 -1
  9. package/dist/agents/skills/claude-code/harness-knowledge-pipeline/SKILL.md +1 -0
  10. package/dist/agents/skills/claude-code/harness-onboarding/SKILL.md +1 -1
  11. package/dist/agents/skills/claude-code/harness-planning/SKILL.md +3 -3
  12. package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +4 -3
  13. package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +150 -10
  14. package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +2 -1
  15. package/dist/agents/skills/codex/harness-architecture-advisor/SKILL.md +17 -5
  16. package/dist/agents/skills/codex/harness-architecture-advisor/skill.yaml +1 -1
  17. package/dist/agents/skills/codex/harness-autopilot/SKILL.md +4 -4
  18. package/dist/agents/skills/codex/harness-code-review/SKILL.md +1 -1
  19. package/dist/agents/skills/codex/harness-design-system/SKILL.md +6 -1
  20. package/dist/agents/skills/codex/harness-execution/SKILL.md +4 -4
  21. package/dist/agents/skills/codex/harness-i18n-process/SKILL.md +2 -2
  22. package/dist/agents/skills/codex/harness-integration/SKILL.md +1 -1
  23. package/dist/agents/skills/codex/harness-knowledge-pipeline/SKILL.md +1 -0
  24. package/dist/agents/skills/codex/harness-onboarding/SKILL.md +1 -1
  25. package/dist/agents/skills/codex/harness-planning/SKILL.md +3 -3
  26. package/dist/agents/skills/codex/harness-roadmap/SKILL.md +4 -3
  27. package/dist/agents/skills/codex/initialize-harness-project/SKILL.md +150 -10
  28. package/dist/agents/skills/codex/initialize-harness-project/skill.yaml +2 -1
  29. package/dist/agents/skills/cursor/harness-architecture-advisor/SKILL.md +17 -5
  30. package/dist/agents/skills/cursor/harness-architecture-advisor/skill.yaml +1 -1
  31. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +4 -4
  32. package/dist/agents/skills/cursor/harness-code-review/SKILL.md +1 -1
  33. package/dist/agents/skills/cursor/harness-design-system/SKILL.md +6 -1
  34. package/dist/agents/skills/cursor/harness-execution/SKILL.md +4 -4
  35. package/dist/agents/skills/cursor/harness-i18n-process/SKILL.md +2 -2
  36. package/dist/agents/skills/cursor/harness-integration/SKILL.md +1 -1
  37. package/dist/agents/skills/cursor/harness-knowledge-pipeline/SKILL.md +1 -0
  38. package/dist/agents/skills/cursor/harness-onboarding/SKILL.md +1 -1
  39. package/dist/agents/skills/cursor/harness-planning/SKILL.md +3 -3
  40. package/dist/agents/skills/cursor/harness-roadmap/SKILL.md +4 -3
  41. package/dist/agents/skills/cursor/initialize-harness-project/SKILL.md +150 -10
  42. package/dist/agents/skills/cursor/initialize-harness-project/skill.yaml +2 -1
  43. package/dist/agents/skills/gemini-cli/harness-architecture-advisor/SKILL.md +17 -5
  44. package/dist/agents/skills/gemini-cli/harness-architecture-advisor/skill.yaml +1 -1
  45. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +4 -4
  46. package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +1 -1
  47. package/dist/agents/skills/gemini-cli/harness-design-system/SKILL.md +6 -1
  48. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +4 -4
  49. package/dist/agents/skills/gemini-cli/harness-i18n-process/SKILL.md +2 -2
  50. package/dist/agents/skills/gemini-cli/harness-integration/SKILL.md +1 -1
  51. package/dist/agents/skills/gemini-cli/harness-knowledge-pipeline/SKILL.md +1 -0
  52. package/dist/agents/skills/gemini-cli/harness-onboarding/SKILL.md +1 -1
  53. package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +3 -3
  54. package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +4 -3
  55. package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +150 -10
  56. package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +2 -1
  57. package/dist/{agents-md-2RN666DE.js → agents-md-76IEMV6O.js} +3 -3
  58. package/dist/{architecture-ZR33YKJB.js → architecture-5GVJRRUD.js} +4 -4
  59. package/dist/{assess-project-LLWWEQEV.js → assess-project-WDUFL7SO.js} +1 -1
  60. package/dist/bin/harness-mcp.js +15 -15
  61. package/dist/bin/harness.js +25 -25
  62. package/dist/{check-phase-gate-ZVG56NT2.js → check-phase-gate-QR3ONJYP.js} +4 -4
  63. package/dist/{chunk-FUS4OOGC.js → chunk-3WLXR23L.js} +1 -1
  64. package/dist/{chunk-IBTHD2UA.js → chunk-6JBJ5FSW.js} +2 -1
  65. package/dist/{chunk-C7RPQWBG.js → chunk-77OMOFZL.js} +1 -1
  66. package/dist/{chunk-YZH4I4JO.js → chunk-AJG2LCMA.js} +1 -1
  67. package/dist/{chunk-3AJW7VQ3.js → chunk-CS7K6ZQ3.js} +2 -2
  68. package/dist/{chunk-SDDQPMZK.js → chunk-D25P6763.js} +1 -1
  69. package/dist/{chunk-QTXW5TIS.js → chunk-DHGL3SF2.js} +10 -1
  70. package/dist/{chunk-CJYNZMOP.js → chunk-E7QD4YHA.js} +8 -8
  71. package/dist/{chunk-BO4AJZRE.js → chunk-H43UQY6B.js} +1 -1
  72. package/dist/{chunk-SDPHFDQS.js → chunk-ILVO6LZY.js} +1 -1
  73. package/dist/{chunk-BZZNYHRY.js → chunk-K5ZOBBQB.js} +9 -9
  74. package/dist/{chunk-A4ETL34H.js → chunk-KLE6FXWM.js} +23 -1
  75. package/dist/{chunk-F3Y64VNF.js → chunk-L4RURCSF.js} +6 -6
  76. package/dist/{chunk-EGRQHLDM.js → chunk-LINAFNIK.js} +5 -5
  77. package/dist/{chunk-TCMVZ3B7.js → chunk-OPOSSZJS.js} +98 -94
  78. package/dist/{chunk-L3Y7L4EG.js → chunk-OQS7KURX.js} +1 -1
  79. package/dist/{chunk-T7UZOJF4.js → chunk-QZ46CI6E.js} +9 -9
  80. package/dist/{chunk-MGPVA2EM.js → chunk-TFNQ72RF.js} +5 -5
  81. package/dist/{chunk-3XMOWLK3.js → chunk-USG7DV5N.js} +2 -2
  82. package/dist/{chunk-776JFSPK.js → chunk-VITLE3PS.js} +1 -1
  83. package/dist/{chunk-2FOLD76X.js → chunk-WPSM7WT6.js} +2 -2
  84. package/dist/{chunk-GAIOIINV.js → chunk-X7XQ3ELM.js} +108 -36
  85. package/dist/{chunk-EICASBYP.js → chunk-YZZVOT7I.js} +1 -1
  86. package/dist/{chunk-SA57FVGX.js → chunk-Z63IDQ7Y.js} +879 -416
  87. package/dist/{chunk-Q5DKIL46.js → chunk-Z7ZF2XDL.js} +3 -3
  88. package/dist/{ci-workflow-JFOL4YWW.js → ci-workflow-GYQXE5X4.js} +3 -3
  89. package/dist/{dist-CPKL5Y2R.js → dist-46VOJIG4.js} +2 -2
  90. package/dist/{dist-BZS2XRLG.js → dist-BP6E6QGG.js} +7 -1
  91. package/dist/{docs-FUTRJQHA.js → docs-CVQMSMQC.js} +4 -4
  92. package/dist/{engine-FB3HCNVT.js → engine-23PJMRHA.js} +3 -3
  93. package/dist/{entropy-FIEE4YDA.js → entropy-K2YTZFCP.js} +3 -3
  94. package/dist/{feedback-7EC4T6XG.js → feedback-6HP42GTK.js} +1 -1
  95. package/dist/{generate-agent-definitions-FOSFADNR.js → generate-agent-definitions-6RJKL6VW.js} +4 -4
  96. package/dist/{graph-loader-QEI7SYOQ.js → graph-loader-BI3OFFFS.js} +1 -1
  97. package/dist/index.d.ts +44 -1
  98. package/dist/index.js +25 -25
  99. package/dist/{loader-HXUOBTYA.js → loader-U2WEC3PZ.js} +3 -3
  100. package/dist/{mcp-ICXMTAD3.js → mcp-N6XVWPXJ.js} +15 -15
  101. package/dist/{performance-TYXBCTR7.js → performance-T3XAESWR.js} +4 -4
  102. package/dist/{review-pipeline-B4WPU6BQ.js → review-pipeline-HTC5HA5X.js} +3 -3
  103. package/dist/{runtime-HQQNOARD.js → runtime-UFXMNN3Q.js} +3 -3
  104. package/dist/{scan-TX55R6QS.js → scan-XRGMTO6K.js} +1 -1
  105. package/dist/{security-25VFLIAO.js → security-ROK5IFDA.js} +1 -1
  106. package/dist/{validate-EAVGKZQB.js → validate-IJHHQHT5.js} +4 -4
  107. package/dist/{validate-cross-check-SPL3H4O5.js → validate-cross-check-LUQYIA46.js} +3 -3
  108. package/package.json +6 -6
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-IBTHD2UA.js";
3
+ } from "./chunk-6JBJ5FSW.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  findConfigFile,
9
9
  loadConfig
10
- } from "./chunk-A4ETL34H.js";
10
+ } from "./chunk-KLE6FXWM.js";
11
11
  import {
12
12
  init_dist
13
- } from "./chunk-IBTHD2UA.js";
13
+ } from "./chunk-6JBJ5FSW.js";
14
14
  import {
15
15
  Ok
16
16
  } from "./chunk-RL4VMEXL.js";
@@ -50,18 +50,18 @@ async function handleCheckDocs(input) {
50
50
  const projectPath = sanitizePath(input.path);
51
51
  const scope = input.scope ?? "coverage";
52
52
  if (scope === "integrity") {
53
- const { validateKnowledgeMap } = await import("./dist-CPKL5Y2R.js");
53
+ const { validateKnowledgeMap } = await import("./dist-46VOJIG4.js");
54
54
  const result2 = await validateKnowledgeMap(projectPath);
55
55
  return resultToMcpResponse(result2);
56
56
  }
57
57
  if (scope === "all") {
58
- const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-CPKL5Y2R.js");
58
+ const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-46VOJIG4.js");
59
59
  const domain2 = input.domain ?? "src";
60
- const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-QEI7SYOQ.js");
60
+ const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-BI3OFFFS.js");
61
61
  const store2 = await loadGraphStore2(projectPath);
62
62
  let graphCoverage2;
63
63
  if (store2) {
64
- const { Assembler } = await import("./dist-BZS2XRLG.js");
64
+ const { Assembler } = await import("./dist-BP6E6QGG.js");
65
65
  const assembler = new Assembler(store2);
66
66
  const report = assembler.checkCoverage();
67
67
  graphCoverage2 = {
@@ -94,13 +94,13 @@ async function handleCheckDocs(input) {
94
94
  }
95
95
  return resultToMcpResponse(Ok({ coverage, integrity }));
96
96
  }
97
- const { checkDocCoverage } = await import("./dist-CPKL5Y2R.js");
97
+ const { checkDocCoverage } = await import("./dist-46VOJIG4.js");
98
98
  const domain = input.domain ?? "src";
99
- const { loadGraphStore } = await import("./graph-loader-QEI7SYOQ.js");
99
+ const { loadGraphStore } = await import("./graph-loader-BI3OFFFS.js");
100
100
  const store = await loadGraphStore(projectPath);
101
101
  let graphCoverage;
102
102
  if (store) {
103
- const { Assembler } = await import("./dist-BZS2XRLG.js");
103
+ const { Assembler } = await import("./dist-BP6E6QGG.js");
104
104
  const assembler = new Assembler(store);
105
105
  const report = assembler.checkCoverage();
106
106
  graphCoverage = {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveProjectConfig
3
- } from "./chunk-YZH4I4JO.js";
3
+ } from "./chunk-AJG2LCMA.js";
4
4
  import {
5
5
  resultToMcpResponse
6
6
  } from "./chunk-EPUKTTJZ.js";
@@ -38,7 +38,7 @@ async function handleCheckDependencies(input) {
38
38
  const configResult = resolveProjectConfig(projectPath);
39
39
  if (!configResult.ok) return resultToMcpResponse(configResult);
40
40
  try {
41
- const { validateDependencies, TypeScriptParser } = await import("./dist-CPKL5Y2R.js");
41
+ const { validateDependencies, TypeScriptParser } = await import("./dist-46VOJIG4.js");
42
42
  const config = configResult.value;
43
43
  const rawLayers = Array.isArray(config.layers) ? config.layers : [];
44
44
  const layers = rawLayers.map((l) => ({
@@ -47,11 +47,11 @@ async function handleCheckDependencies(input) {
47
47
  allowedDependencies: l.allowedDependencies
48
48
  }));
49
49
  const parser = new TypeScriptParser();
50
- const { loadGraphStore } = await import("./graph-loader-QEI7SYOQ.js");
50
+ const { loadGraphStore } = await import("./graph-loader-BI3OFFFS.js");
51
51
  const store = await loadGraphStore(projectPath);
52
52
  let graphDependencyData;
53
53
  if (store) {
54
- const { GraphConstraintAdapter } = await import("./dist-BZS2XRLG.js");
54
+ const { GraphConstraintAdapter } = await import("./dist-BP6E6QGG.js");
55
55
  const adapter = new GraphConstraintAdapter(store);
56
56
  const graphData = adapter.computeDependencyGraph();
57
57
  graphDependencyData = {
@@ -69,7 +69,7 @@ async function handleCheckDependencies(input) {
69
69
  if (store) {
70
70
  const designTokenNodes = store.findNodes({ type: "design_token" });
71
71
  if (designTokenNodes.length > 0) {
72
- const { DesignConstraintAdapter } = await import("./dist-BZS2XRLG.js");
72
+ const { DesignConstraintAdapter } = await import("./dist-BP6E6QGG.js");
73
73
  const designAdapter = new DesignConstraintAdapter(store);
74
74
  const fileNodes = store.findNodes({ type: "file" });
75
75
  for (const fileNode of fileNodes) {
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  resolveConfig
3
- } from "./chunk-A4ETL34H.js";
3
+ } from "./chunk-KLE6FXWM.js";
4
4
  import {
5
5
  init_dist
6
- } from "./chunk-IBTHD2UA.js";
6
+ } from "./chunk-6JBJ5FSW.js";
7
7
  import {
8
8
  Ok
9
9
  } from "./chunk-RL4VMEXL.js";
@@ -15,7 +15,7 @@ function evictIfNeeded() {
15
15
  }
16
16
  }
17
17
  async function doLoadGraphStore(projectRoot) {
18
- const { GraphStore } = await import("./dist-BZS2XRLG.js");
18
+ const { GraphStore } = await import("./dist-BP6E6QGG.js");
19
19
  const graphDir = path.join(projectRoot, ".harness", "graph");
20
20
  const store = new GraphStore();
21
21
  const loaded = await store.load(graphDir);
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  init_dist,
6
6
  paginate
7
- } from "./chunk-IBTHD2UA.js";
7
+ } from "./chunk-6JBJ5FSW.js";
8
8
 
9
9
  // src/mcp/tools/review-pipeline.ts
10
10
  init_dist();
@@ -79,7 +79,7 @@ var runCodeReviewDefinition = {
79
79
  };
80
80
  async function handleRunCodeReview(input) {
81
81
  try {
82
- const { parseDiff, runReviewPipeline } = await import("./dist-CPKL5Y2R.js");
82
+ const { parseDiff, runReviewPipeline } = await import("./dist-46VOJIG4.js");
83
83
  const parseResult = parseDiff(input.diff);
84
84
  if (!parseResult.ok) {
85
85
  return {
@@ -371,6 +371,65 @@ function detectEarsPattern(text) {
371
371
  if (/^the\s+\w+\s+shall\b/.test(lower)) return "ubiquitous";
372
372
  return void 0;
373
373
  }
374
+ function matchPattern(filePath, pattern) {
375
+ const patternParts = pattern.split("/").filter((s) => s.length > 0);
376
+ if (patternParts.length !== 2 || patternParts[1] !== "<dir>") {
377
+ return null;
378
+ }
379
+ const prefix = patternParts[0];
380
+ const pathParts = filePath.split("/").filter((s) => s.length > 0);
381
+ if (pathParts.length < 2) return null;
382
+ if (pathParts[0] !== prefix) return null;
383
+ let dir = pathParts[1];
384
+ if (dir.length === 0) return null;
385
+ if (CODE_EXTENSIONS.some((ext) => dir.endsWith(ext))) {
386
+ const dotIdx = dir.lastIndexOf(".");
387
+ if (dotIdx > 0) dir = dir.slice(0, dotIdx);
388
+ }
389
+ if (dir.length === 0) return null;
390
+ return dir;
391
+ }
392
+ function inferDomain(node, options = {}) {
393
+ if (node.metadata?.domain && typeof node.metadata.domain === "string" && node.metadata.domain.length > 0) {
394
+ return node.metadata.domain;
395
+ }
396
+ const filePath = typeof node.path === "string" ? node.path : "";
397
+ const blocklist = new Set(DEFAULT_BLOCKLIST);
398
+ if (options.extraBlocklist) {
399
+ for (const seg of options.extraBlocklist) {
400
+ if (seg && seg.length > 0) blocklist.add(seg);
401
+ }
402
+ }
403
+ if (filePath.length > 0) {
404
+ const extraPatterns = options.extraPatterns ?? [];
405
+ for (const pattern of extraPatterns) {
406
+ const dir = matchPattern(filePath, pattern);
407
+ if (dir !== null) {
408
+ if (blocklist.has(dir)) return "unknown";
409
+ return dir;
410
+ }
411
+ }
412
+ for (const pattern of DEFAULT_PATTERNS) {
413
+ const dir = matchPattern(filePath, pattern);
414
+ if (dir !== null) {
415
+ if (blocklist.has(dir)) return "unknown";
416
+ return dir;
417
+ }
418
+ }
419
+ const segments = filePath.split("/").filter((s) => s.length > 0);
420
+ if (segments.length > 0) {
421
+ const first = segments[0];
422
+ if (!blocklist.has(first)) return first;
423
+ }
424
+ }
425
+ const source = node.metadata?.source;
426
+ if (source === "knowledge-linker" || source === "connector") {
427
+ const connector = node.metadata?.connectorName;
428
+ if (typeof connector === "string" && connector.length > 0) return connector;
429
+ return "general";
430
+ }
431
+ return "unknown";
432
+ }
374
433
  function emptyResult2(diagramType = "unknown") {
375
434
  return {
376
435
  entities: [],
@@ -774,10 +833,10 @@ function toGrade(score) {
774
833
  if (score >= 20) return "D";
775
834
  return "F";
776
835
  }
777
- function groupByDomain(nodes, fallback) {
836
+ function groupByDomain(nodes, _fallback, options = {}) {
778
837
  const map = /* @__PURE__ */ new Map();
779
838
  for (const node of nodes) {
780
- const domain = node.metadata.domain ?? fallback(node);
839
+ const domain = inferDomain(node, options);
781
840
  const group = map.get(domain) ?? [];
782
841
  group.push(node);
783
842
  map.set(domain, group);
@@ -1443,7 +1502,7 @@ function parseAntiPatterns(content) {
1443
1502
  }
1444
1503
  return patterns;
1445
1504
  }
1446
- var NODE_TYPES, EDGE_TYPES, OBSERVABILITY_TYPES, CURRENT_SCHEMA_VERSION, NODE_STABILITY, GraphNodeSchema, GraphEdgeSchema, POISONED_KEYS, GraphStore, VectorStore, DEFAULT_TTL_MS, PackedSummaryCache, ContextQL, TEST_TYPES, DOC_TYPES, CODE_TYPES, SKIP_METHOD_NAMES, FUNCTION_PATTERNS, CLASS_PATTERNS, INTERFACE_PATTERNS, METHOD_PATTERNS, GO_METHOD_PATTERN, VARIABLE_PATTERNS, SUPPORTED_EXTENSIONS, SKIP_EXTENSIONS, CodeIngestor, execFileAsync, GitIngestor, TopologicalLinker, CODE_NODE_TYPES, KnowledgeIngestor, BUSINESS_KNOWLEDGE_TYPES, GOVERNS_SOURCE_TYPES, CODE_NODE_TYPES2, MEASURABLE_TYPES, BusinessKnowledgeIngestor, CODE_NODE_TYPES3, DecisionIngestor, REQUIREMENT_SECTIONS, SECTION_HEADING_RE, NUMBERED_ITEM_RE, CODE_NODE_TYPES4, RequirementIngestor, MermaidParser, D2Parser, PlantUmlParser, DIAGRAM_EXTENSIONS, SKIP_DIRS, DiagramParser, HEURISTIC_PATTERNS, SCANNABLE_TYPES, KnowledgeLinker, StructuralDriftDetector, BUSINESS_NODE_TYPES, KnowledgeStagingAggregator, SKIP_DIRS2, EXT_TO_LANGUAGE, SKIP_EXTENSIONS2, EXTRACTOR_EDGE_TYPE, ExtractionRunner, PATTERNS, TestDescriptionExtractor, EnumConstantExtractor, ValidationRuleExtractor, ApiPathExtractor, ALL_EXTRACTORS, ImageAnalysisExtractor, KNOWLEDGE_NODE_TYPES, SIMILARITY_THRESHOLD, SEVERITY_MAP, ContradictionDetector, KNOWLEDGE_TYPES, CODE_TYPES2, KNOWLEDGE_EDGE_TYPES, CoverageScorer, VALID_BUSINESS_TYPES, DEFAULT_MAX_DOCS, MAX_COLLISION_SUFFIX, KnowledgeDocMaterializer, BUSINESS_NODE_TYPES2, SNAPSHOT_NODE_TYPES, KnowledgePipelineRunner, CODE_NODE_TYPES5, RETRYABLE_STATUSES, SANITIZE_RULES, SyncManager, SUMMARIZE_PROMPT, JiraConnector, SlackConnector, ConfluenceConnector, CIConnector, CONSTRAINT_KEYWORDS, FigmaConnector, MIN_CONTENT_LENGTH, CONCEPT_ITEM_TYPES, MiroConnector, STOP_WORDS, FusionLayer, CODE_NODE_TYPES6, GraphEntropyAdapter, GraphComplexityAdapter, GraphCouplingAdapter, DEFAULT_THRESHOLD, DEFAULT_METRICS, RECOGNIZED_METRICS, GraphAnomalyAdapter, INTENTS, SIGNAL_WEIGHTS, INTENT_SIGNALS, IntentClassifier, INTENT_KEYWORDS, STOP_WORDS2, PASCAL_OR_CAMEL_RE, FILE_PATH_RE, QUOTED_RE, EntityExtractor, EntityResolver, ResponseFormatter, CompositeProbabilityStrategy, DEFAULT_PROBABILITY_FLOOR, DEFAULT_MAX_DEPTH, CascadeSimulator, ENTITY_REQUIRED_INTENTS, classifier, extractor, formatter, PHASE_NODE_TYPES, CODE_NODE_TYPES7, Assembler, GraphConstraintAdapter, DesignIngestor, DesignConstraintAdapter, GraphFeedbackAdapter, DEFAULT_EDGE_TYPES, TaskIndependenceAnalyzer, ConflictPredictor, VERSION;
1505
+ var NODE_TYPES, EDGE_TYPES, OBSERVABILITY_TYPES, CURRENT_SCHEMA_VERSION, NODE_STABILITY, GraphNodeSchema, GraphEdgeSchema, POISONED_KEYS, GraphStore, VectorStore, DEFAULT_TTL_MS, PackedSummaryCache, ContextQL, TEST_TYPES, DOC_TYPES, CODE_TYPES, SKIP_METHOD_NAMES, FUNCTION_PATTERNS, CLASS_PATTERNS, INTERFACE_PATTERNS, METHOD_PATTERNS, GO_METHOD_PATTERN, VARIABLE_PATTERNS, SUPPORTED_EXTENSIONS, SKIP_EXTENSIONS, CodeIngestor, execFileAsync, GitIngestor, TopologicalLinker, CODE_NODE_TYPES, KnowledgeIngestor, BUSINESS_KNOWLEDGE_TYPES, GOVERNS_SOURCE_TYPES, CODE_NODE_TYPES2, MEASURABLE_TYPES, BusinessKnowledgeIngestor, CODE_NODE_TYPES3, DecisionIngestor, REQUIREMENT_SECTIONS, SECTION_HEADING_RE, NUMBERED_ITEM_RE, CODE_NODE_TYPES4, RequirementIngestor, DEFAULT_PATTERNS, DEFAULT_BLOCKLIST, CODE_EXTENSIONS, MermaidParser, D2Parser, PlantUmlParser, DIAGRAM_EXTENSIONS, SKIP_DIRS, DiagramParser, HEURISTIC_PATTERNS, SCANNABLE_TYPES, KnowledgeLinker, StructuralDriftDetector, BUSINESS_NODE_TYPES, KnowledgeStagingAggregator, SKIP_DIRS2, EXT_TO_LANGUAGE, SKIP_EXTENSIONS2, EXTRACTOR_EDGE_TYPE, ExtractionRunner, PATTERNS, TestDescriptionExtractor, EnumConstantExtractor, ValidationRuleExtractor, ApiPathExtractor, ALL_EXTRACTORS, ImageAnalysisExtractor, KNOWLEDGE_NODE_TYPES, SIMILARITY_THRESHOLD, SEVERITY_MAP, ContradictionDetector, KNOWLEDGE_TYPES, CODE_TYPES2, KNOWLEDGE_EDGE_TYPES, CoverageScorer, VALID_BUSINESS_TYPES, DEFAULT_MAX_DOCS, MAX_COLLISION_SUFFIX, KnowledgeDocMaterializer, BUSINESS_NODE_TYPES2, SNAPSHOT_NODE_TYPES, KnowledgePipelineRunner, CODE_NODE_TYPES5, RETRYABLE_STATUSES, SANITIZE_RULES, SyncManager, SUMMARIZE_PROMPT, JiraConnector, SlackConnector, ConfluenceConnector, CIConnector, CONSTRAINT_KEYWORDS, FigmaConnector, MIN_CONTENT_LENGTH, CONCEPT_ITEM_TYPES, MiroConnector, STOP_WORDS, FusionLayer, CODE_NODE_TYPES6, GraphEntropyAdapter, GraphComplexityAdapter, GraphCouplingAdapter, DEFAULT_THRESHOLD, DEFAULT_METRICS, RECOGNIZED_METRICS, GraphAnomalyAdapter, INTENTS, SIGNAL_WEIGHTS, INTENT_SIGNALS, IntentClassifier, INTENT_KEYWORDS, STOP_WORDS2, PASCAL_OR_CAMEL_RE, FILE_PATH_RE, QUOTED_RE, EntityExtractor, EntityResolver, ResponseFormatter, CompositeProbabilityStrategy, DEFAULT_PROBABILITY_FLOOR, DEFAULT_MAX_DEPTH, CascadeSimulator, ENTITY_REQUIRED_INTENTS, classifier, extractor, formatter, PHASE_NODE_TYPES, CODE_NODE_TYPES7, Assembler, GraphConstraintAdapter, DesignIngestor, DesignConstraintAdapter, GraphFeedbackAdapter, DEFAULT_EDGE_TYPES, TaskIndependenceAnalyzer, ConflictPredictor, VERSION;
1447
1506
  var init_dist = __esm({
1448
1507
  "../graph/dist/index.mjs"() {
1449
1508
  NODE_TYPES = [
@@ -3452,6 +3511,27 @@ var init_dist = __esm({
3452
3511
  return count;
3453
3512
  }
3454
3513
  };
3514
+ DEFAULT_PATTERNS = [
3515
+ "packages/<dir>",
3516
+ "apps/<dir>",
3517
+ "services/<dir>",
3518
+ "src/<dir>",
3519
+ "lib/<dir>"
3520
+ ];
3521
+ DEFAULT_BLOCKLIST = /* @__PURE__ */ new Set([
3522
+ "node_modules",
3523
+ ".harness",
3524
+ "dist",
3525
+ "build",
3526
+ ".git",
3527
+ "coverage",
3528
+ ".next",
3529
+ ".turbo",
3530
+ ".cache",
3531
+ "out",
3532
+ "tmp"
3533
+ ]);
3534
+ CODE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
3455
3535
  MermaidParser = class {
3456
3536
  canParse(_content, ext) {
3457
3537
  return ext === ".mmd" || ext === ".mermaid";
@@ -3957,10 +4037,12 @@ var init_dist = __esm({
3957
4037
  "business_fact"
3958
4038
  ];
3959
4039
  KnowledgeStagingAggregator = class {
3960
- constructor(projectDir) {
4040
+ constructor(projectDir, inferenceOptions = {}) {
3961
4041
  this.projectDir = projectDir;
4042
+ this.inferenceOptions = inferenceOptions;
3962
4043
  }
3963
4044
  projectDir;
4045
+ inferenceOptions;
3964
4046
  async aggregate(extractorResults, linkerResults, diagramResults) {
3965
4047
  const all = [...extractorResults, ...linkerResults, ...diagramResults];
3966
4048
  const byHash = /* @__PURE__ */ new Map();
@@ -4029,7 +4111,7 @@ var init_dist = __esm({
4029
4111
  for (const nodeType of BUSINESS_NODE_TYPES) {
4030
4112
  const nodes = store.findNodes({ type: nodeType });
4031
4113
  for (const node of nodes) {
4032
- const domain = node.metadata?.domain ?? "unknown";
4114
+ const domain = inferDomain(node, this.inferenceOptions);
4033
4115
  const list = extractedByDomain.get(domain) ?? [];
4034
4116
  list.push(node);
4035
4117
  extractedByDomain.set(domain, list);
@@ -5565,11 +5647,15 @@ var init_dist = __esm({
5565
5647
  "annotates"
5566
5648
  ];
5567
5649
  CoverageScorer = class {
5650
+ constructor(inferenceOptions = {}) {
5651
+ this.inferenceOptions = inferenceOptions;
5652
+ }
5653
+ inferenceOptions;
5568
5654
  score(store) {
5569
5655
  const knowledgeNodes = KNOWLEDGE_TYPES.flatMap((t) => store.findNodes({ type: t }));
5570
- const domainMap = groupByDomain(knowledgeNodes, () => "unclassified");
5656
+ const domainMap = groupByDomain(knowledgeNodes, void 0, this.inferenceOptions);
5571
5657
  const codeNodes = CODE_TYPES2.flatMap((t) => store.findNodes({ type: t }));
5572
- const codeDomains = groupByDomain(codeNodes, (n) => this.domainFromPath(n.path));
5658
+ const codeDomains = groupByDomain(codeNodes, void 0, this.inferenceOptions);
5573
5659
  const allDomains = /* @__PURE__ */ new Set([...domainMap.keys(), ...codeDomains.keys()]);
5574
5660
  const domains = [];
5575
5661
  for (const domain of allDomains) {
@@ -5585,15 +5671,6 @@ var init_dist = __esm({
5585
5671
  generatedAt: (/* @__PURE__ */ new Date()).toISOString()
5586
5672
  };
5587
5673
  }
5588
- domainFromPath(filePath) {
5589
- if (!filePath) return "unclassified";
5590
- const parts = filePath.split("/");
5591
- const pkgIdx = parts.indexOf("packages");
5592
- if (pkgIdx >= 0 && parts[pkgIdx + 1]) return parts[pkgIdx + 1];
5593
- const srcIdx = parts.indexOf("src");
5594
- if (srcIdx >= 0 && parts[srcIdx + 1]) return parts[srcIdx + 1];
5595
- return parts[0] ?? "unclassified";
5596
- }
5597
5674
  };
5598
5675
  VALID_BUSINESS_TYPES = /* @__PURE__ */ new Set([
5599
5676
  "business_rule",
@@ -5605,10 +5682,12 @@ var init_dist = __esm({
5605
5682
  DEFAULT_MAX_DOCS = 50;
5606
5683
  MAX_COLLISION_SUFFIX = 10;
5607
5684
  KnowledgeDocMaterializer = class {
5608
- constructor(store) {
5685
+ constructor(store, inferenceOptions = {}) {
5609
5686
  this.store = store;
5687
+ this.inferenceOptions = inferenceOptions;
5610
5688
  }
5611
5689
  store;
5690
+ inferenceOptions;
5612
5691
  async materialize(gapEntries, options) {
5613
5692
  const maxDocs = options.maxDocs ?? DEFAULT_MAX_DOCS;
5614
5693
  const created = [];
@@ -5664,21 +5743,8 @@ var init_dist = __esm({
5664
5743
  return { node, domain, domainDir, nameKey };
5665
5744
  }
5666
5745
  inferDomain(node) {
5667
- if (node.metadata?.domain && typeof node.metadata.domain === "string") {
5668
- return node.metadata.domain;
5669
- }
5670
- if (node.path) {
5671
- const pkgMatch = node.path.match(/^packages\/([^/]+)/);
5672
- if (pkgMatch) return pkgMatch[1];
5673
- const srcMatch = node.path.match(/^src\/([^/]+)/);
5674
- if (srcMatch) return srcMatch[1];
5675
- }
5676
- if (node.metadata?.source === "knowledge-linker" || node.metadata?.source === "connector") {
5677
- const connector = node.metadata.connectorName;
5678
- if (typeof connector === "string") return connector;
5679
- return "general";
5680
- }
5681
- return null;
5746
+ const result = inferDomain(node, this.inferenceOptions);
5747
+ return result === "unknown" ? null : result;
5682
5748
  }
5683
5749
  generateFilename(name) {
5684
5750
  const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 60);
@@ -5770,7 +5836,10 @@ var init_dist = __esm({
5770
5836
  this.store = store;
5771
5837
  }
5772
5838
  store;
5839
+ /** Resolved per-`run()` inference options. Set on entry to `run()`. */
5840
+ inferenceOptions = {};
5773
5841
  async run(options) {
5842
+ this.inferenceOptions = options.inferenceOptions ?? {};
5774
5843
  const remediations = [];
5775
5844
  const preSnapshot = this.buildSnapshot(options.domain);
5776
5845
  const extraction = await this.extract(options);
@@ -5778,7 +5847,7 @@ var init_dist = __esm({
5778
5847
  let driftResult = this.reconcile(preSnapshot, postSnapshot);
5779
5848
  const contradictions = new ContradictionDetector().detect(this.store);
5780
5849
  let gapReport = await this.detect(options);
5781
- const coverage = new CoverageScorer().score(this.store);
5850
+ const coverage = new CoverageScorer(this.inferenceOptions).score(this.store);
5782
5851
  let materialization;
5783
5852
  let iterations = 1;
5784
5853
  if (options.fix) {
@@ -5941,7 +6010,7 @@ var init_dist = __esm({
5941
6010
  // ── Phase 3: DETECT ───────────────────────────────────────────────────────
5942
6011
  async detect(options) {
5943
6012
  const knowledgeDir = path12.join(options.projectDir, "docs", "knowledge");
5944
- const aggregator = new KnowledgeStagingAggregator(options.projectDir);
6013
+ const aggregator = new KnowledgeStagingAggregator(options.projectDir, this.inferenceOptions);
5945
6014
  const gapReport = await aggregator.generateGapReport(knowledgeDir, this.store);
5946
6015
  await aggregator.writeGapReport(gapReport);
5947
6016
  return gapReport;
@@ -5969,7 +6038,7 @@ var init_dist = __esm({
5969
6038
  const allGapEntries = gapReport.domains.flatMap((d) => d.gapEntries);
5970
6039
  const materializable = allGapEntries.filter((e) => e.hasContent);
5971
6040
  if (materializable.length > 0) {
5972
- const materializer = new KnowledgeDocMaterializer(this.store);
6041
+ const materializer = new KnowledgeDocMaterializer(this.store, this.inferenceOptions);
5973
6042
  const matResult = await materializer.materialize(materializable, {
5974
6043
  projectDir: options.projectDir,
5975
6044
  dryRun: false
@@ -5995,7 +6064,7 @@ var init_dist = __esm({
5995
6064
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
5996
6065
  }));
5997
6066
  if (stagedEntries.length > 0) {
5998
- const aggregator = new KnowledgeStagingAggregator(options.projectDir);
6067
+ const aggregator = new KnowledgeStagingAggregator(options.projectDir, this.inferenceOptions);
5999
6068
  await aggregator.aggregate(stagedEntries, [], []);
6000
6069
  }
6001
6070
  }
@@ -9301,6 +9370,9 @@ export {
9301
9370
  BusinessKnowledgeIngestor,
9302
9371
  DecisionIngestor,
9303
9372
  RequirementIngestor,
9373
+ DEFAULT_PATTERNS,
9374
+ DEFAULT_BLOCKLIST,
9375
+ inferDomain,
9304
9376
  MermaidParser,
9305
9377
  D2Parser,
9306
9378
  PlantUmlParser,
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KET4QQZB.js";
4
4
  import {
5
5
  init_dist
6
- } from "./chunk-IBTHD2UA.js";
6
+ } from "./chunk-6JBJ5FSW.js";
7
7
  import {
8
8
  Err,
9
9
  Ok