@harness-engineering/cli 1.27.1 → 1.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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-6SAMHE7H.js} +3 -3
  58. package/dist/{architecture-ZR33YKJB.js → architecture-5YR52NSV.js} +4 -4
  59. package/dist/{assess-project-LLWWEQEV.js → assess-project-5X7TYQFM.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-PLV2VDOL.js} +4 -4
  63. package/dist/{chunk-2FOLD76X.js → chunk-2IBXUG6J.js} +2 -2
  64. package/dist/{chunk-MGPVA2EM.js → chunk-5ME3WG3G.js} +5 -5
  65. package/dist/{chunk-Q5DKIL46.js → chunk-6GXSJGSW.js} +3 -3
  66. package/dist/{chunk-C7RPQWBG.js → chunk-6L2BU4BP.js} +1 -1
  67. package/dist/{chunk-EHTUWULH.js → chunk-74YADB7T.js} +97 -93
  68. package/dist/{chunk-CJYNZMOP.js → chunk-7JQ7HLM4.js} +8 -8
  69. package/dist/{chunk-F3Y64VNF.js → chunk-BFBZK6BC.js} +6 -6
  70. package/dist/{chunk-YZH4I4JO.js → chunk-BYS3TQOO.js} +1 -1
  71. package/dist/{chunk-776JFSPK.js → chunk-DXGI7DL3.js} +1 -1
  72. package/dist/{chunk-T7UZOJF4.js → chunk-ELJ2MXMO.js} +9 -9
  73. package/dist/{chunk-BO4AJZRE.js → chunk-HT7HYYGT.js} +1 -1
  74. package/dist/{chunk-EGRQHLDM.js → chunk-JNKALGRM.js} +5 -5
  75. package/dist/{chunk-3AJW7VQ3.js → chunk-JZST2WZS.js} +2 -2
  76. package/dist/{chunk-A4ETL34H.js → chunk-KJD4J54I.js} +23 -1
  77. package/dist/{chunk-VCC47EXU.js → chunk-MTPHNOJW.js} +860 -412
  78. package/dist/{chunk-EICASBYP.js → chunk-PFM3BVVU.js} +1 -1
  79. package/dist/{chunk-3XMOWLK3.js → chunk-QDRBWVVY.js} +2 -2
  80. package/dist/{chunk-SDDQPMZK.js → chunk-R2CBBZA6.js} +1 -1
  81. package/dist/{chunk-IBTHD2UA.js → chunk-RFYF7TJS.js} +2 -1
  82. package/dist/{chunk-FUS4OOGC.js → chunk-RYDPFIJY.js} +1 -1
  83. package/dist/{chunk-GAIOIINV.js → chunk-S2WB4LE7.js} +113 -36
  84. package/dist/{chunk-BZZNYHRY.js → chunk-SITVRO7K.js} +9 -9
  85. package/dist/{chunk-SDPHFDQS.js → chunk-XHOGGZS7.js} +1 -1
  86. package/dist/{chunk-XKU37HGH.js → chunk-YJE23GRZ.js} +1 -1
  87. package/dist/{chunk-L3Y7L4EG.js → chunk-ZYLBIDLE.js} +1 -1
  88. package/dist/{ci-workflow-JFOL4YWW.js → ci-workflow-7T2XKB3P.js} +3 -3
  89. package/dist/{dist-BZS2XRLG.js → dist-42AYXCAK.js} +7 -1
  90. package/dist/{dist-CPKL5Y2R.js → dist-77VNTHWV.js} +2 -2
  91. package/dist/{docs-FUTRJQHA.js → docs-MSIJ6SDO.js} +4 -4
  92. package/dist/{engine-FB3HCNVT.js → engine-F4P5RBE4.js} +3 -3
  93. package/dist/{entropy-FIEE4YDA.js → entropy-GSUTIORR.js} +3 -3
  94. package/dist/{feedback-7EC4T6XG.js → feedback-NST6T4HI.js} +1 -1
  95. package/dist/{generate-agent-definitions-FOSFADNR.js → generate-agent-definitions-BOUGQIPA.js} +4 -4
  96. package/dist/{graph-loader-QEI7SYOQ.js → graph-loader-IAUPGLRV.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-6QTJC7IN.js} +3 -3
  100. package/dist/{mcp-NUG4BMKJ.js → mcp-QFBGTUX6.js} +15 -15
  101. package/dist/{performance-TYXBCTR7.js → performance-B2NAAIE5.js} +4 -4
  102. package/dist/{review-pipeline-B4WPU6BQ.js → review-pipeline-6EYMBS6B.js} +3 -3
  103. package/dist/{runtime-HQQNOARD.js → runtime-VFZK6BCZ.js} +3 -3
  104. package/dist/{scan-M4EGDAQ2.js → scan-DB6FNYGG.js} +1 -1
  105. package/dist/{security-25VFLIAO.js → security-HRNTYHPM.js} +1 -1
  106. package/dist/{validate-EAVGKZQB.js → validate-YEMAFWJE.js} +4 -4
  107. package/dist/{validate-cross-check-SPL3H4O5.js → validate-cross-check-DGHTJFVH.js} +3 -3
  108. package/package.json +6 -6
@@ -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-RFYF7TJS.js";
7
7
  import {
8
8
  Err,
9
9
  Ok
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  resolveConfig
3
- } from "./chunk-A4ETL34H.js";
3
+ } from "./chunk-KJD4J54I.js";
4
4
  import {
5
5
  init_dist
6
- } from "./chunk-IBTHD2UA.js";
6
+ } from "./chunk-RFYF7TJS.js";
7
7
  import {
8
8
  Ok
9
9
  } from "./chunk-RL4VMEXL.js";
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  listPersonas,
6
6
  loadPersona
7
- } from "./chunk-BO4AJZRE.js";
7
+ } from "./chunk-HT7HYYGT.js";
8
8
  import {
9
9
  GENERATED_HEADER_AGENT,
10
10
  VALID_PLATFORMS,
@@ -13,7 +13,7 @@ import {
13
13
  NODE_STABILITY,
14
14
  init_dist as init_dist2,
15
15
  queryTraceability
16
- } from "./chunk-GAIOIINV.js";
16
+ } from "./chunk-S2WB4LE7.js";
17
17
  import {
18
18
  __esm,
19
19
  __export
@@ -12645,6 +12645,7 @@ function inferStatus(feature, projectPath, allFeatures) {
12645
12645
  return !blocker || blocker.status !== "done";
12646
12646
  });
12647
12647
  if (blockerNotDone) return "blocked";
12648
+ if (feature.status === "blocked") return "planned";
12648
12649
  }
12649
12650
  if (feature.plans.length === 0) return null;
12650
12651
  const allTaskStatuses = [];
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-IBTHD2UA.js";
3
+ } from "./chunk-RFYF7TJS.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -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 = [
@@ -3047,6 +3106,7 @@ var init_dist = __esm({
3047
3106
  content: body.trim(),
3048
3107
  metadata: {
3049
3108
  domain,
3109
+ ...frontmatter.source && { source: frontmatter.source },
3050
3110
  ...frontmatter.tags && { tags: frontmatter.tags },
3051
3111
  ...frontmatter.related && { related: frontmatter.related }
3052
3112
  }
@@ -3452,6 +3512,27 @@ var init_dist = __esm({
3452
3512
  return count;
3453
3513
  }
3454
3514
  };
3515
+ DEFAULT_PATTERNS = [
3516
+ "packages/<dir>",
3517
+ "apps/<dir>",
3518
+ "services/<dir>",
3519
+ "src/<dir>",
3520
+ "lib/<dir>"
3521
+ ];
3522
+ DEFAULT_BLOCKLIST = /* @__PURE__ */ new Set([
3523
+ "node_modules",
3524
+ ".harness",
3525
+ "dist",
3526
+ "build",
3527
+ ".git",
3528
+ "coverage",
3529
+ ".next",
3530
+ ".turbo",
3531
+ ".cache",
3532
+ "out",
3533
+ "tmp"
3534
+ ]);
3535
+ CODE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
3455
3536
  MermaidParser = class {
3456
3537
  canParse(_content, ext) {
3457
3538
  return ext === ".mmd" || ext === ".mermaid";
@@ -3957,10 +4038,12 @@ var init_dist = __esm({
3957
4038
  "business_fact"
3958
4039
  ];
3959
4040
  KnowledgeStagingAggregator = class {
3960
- constructor(projectDir) {
4041
+ constructor(projectDir, inferenceOptions = {}) {
3961
4042
  this.projectDir = projectDir;
4043
+ this.inferenceOptions = inferenceOptions;
3962
4044
  }
3963
4045
  projectDir;
4046
+ inferenceOptions;
3964
4047
  async aggregate(extractorResults, linkerResults, diagramResults) {
3965
4048
  const all = [...extractorResults, ...linkerResults, ...diagramResults];
3966
4049
  const byHash = /* @__PURE__ */ new Map();
@@ -4029,7 +4112,7 @@ var init_dist = __esm({
4029
4112
  for (const nodeType of BUSINESS_NODE_TYPES) {
4030
4113
  const nodes = store.findNodes({ type: nodeType });
4031
4114
  for (const node of nodes) {
4032
- const domain = node.metadata?.domain ?? "unknown";
4115
+ const domain = inferDomain(node, this.inferenceOptions);
4033
4116
  const list = extractedByDomain.get(domain) ?? [];
4034
4117
  list.push(node);
4035
4118
  extractedByDomain.set(domain, list);
@@ -5565,11 +5648,15 @@ var init_dist = __esm({
5565
5648
  "annotates"
5566
5649
  ];
5567
5650
  CoverageScorer = class {
5651
+ constructor(inferenceOptions = {}) {
5652
+ this.inferenceOptions = inferenceOptions;
5653
+ }
5654
+ inferenceOptions;
5568
5655
  score(store) {
5569
5656
  const knowledgeNodes = KNOWLEDGE_TYPES.flatMap((t) => store.findNodes({ type: t }));
5570
- const domainMap = groupByDomain(knowledgeNodes, () => "unclassified");
5657
+ const domainMap = groupByDomain(knowledgeNodes, void 0, this.inferenceOptions);
5571
5658
  const codeNodes = CODE_TYPES2.flatMap((t) => store.findNodes({ type: t }));
5572
- const codeDomains = groupByDomain(codeNodes, (n) => this.domainFromPath(n.path));
5659
+ const codeDomains = groupByDomain(codeNodes, void 0, this.inferenceOptions);
5573
5660
  const allDomains = /* @__PURE__ */ new Set([...domainMap.keys(), ...codeDomains.keys()]);
5574
5661
  const domains = [];
5575
5662
  for (const domain of allDomains) {
@@ -5585,15 +5672,6 @@ var init_dist = __esm({
5585
5672
  generatedAt: (/* @__PURE__ */ new Date()).toISOString()
5586
5673
  };
5587
5674
  }
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
5675
  };
5598
5676
  VALID_BUSINESS_TYPES = /* @__PURE__ */ new Set([
5599
5677
  "business_rule",
@@ -5605,10 +5683,12 @@ var init_dist = __esm({
5605
5683
  DEFAULT_MAX_DOCS = 50;
5606
5684
  MAX_COLLISION_SUFFIX = 10;
5607
5685
  KnowledgeDocMaterializer = class {
5608
- constructor(store) {
5686
+ constructor(store, inferenceOptions = {}) {
5609
5687
  this.store = store;
5688
+ this.inferenceOptions = inferenceOptions;
5610
5689
  }
5611
5690
  store;
5691
+ inferenceOptions;
5612
5692
  async materialize(gapEntries, options) {
5613
5693
  const maxDocs = options.maxDocs ?? DEFAULT_MAX_DOCS;
5614
5694
  const created = [];
@@ -5664,21 +5744,8 @@ var init_dist = __esm({
5664
5744
  return { node, domain, domainDir, nameKey };
5665
5745
  }
5666
5746
  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;
5747
+ const result = inferDomain(node, this.inferenceOptions);
5748
+ return result === "unknown" ? null : result;
5682
5749
  }
5683
5750
  generateFilename(name) {
5684
5751
  const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 60);
@@ -5708,6 +5775,10 @@ var init_dist = __esm({
5708
5775
  const mappedType = this.mapNodeType(node);
5709
5776
  const sanitize = (s) => s.replace(/[\n\r]/g, " ").replace(/:/g, "-");
5710
5777
  const lines = ["---", `type: ${sanitize(mappedType)}`, `domain: ${sanitize(domain)}`];
5778
+ const source = node.metadata?.source;
5779
+ if (typeof source === "string" && source.length > 0) {
5780
+ lines.push(`source: ${sanitize(source)}`);
5781
+ }
5711
5782
  const tags = node.metadata?.tags;
5712
5783
  if (Array.isArray(tags) && tags.length > 0) {
5713
5784
  lines.push(`tags: [${tags.map((t) => sanitize(String(t))).join(", ")}]`);
@@ -5770,7 +5841,10 @@ var init_dist = __esm({
5770
5841
  this.store = store;
5771
5842
  }
5772
5843
  store;
5844
+ /** Resolved per-`run()` inference options. Set on entry to `run()`. */
5845
+ inferenceOptions = {};
5773
5846
  async run(options) {
5847
+ this.inferenceOptions = options.inferenceOptions ?? {};
5774
5848
  const remediations = [];
5775
5849
  const preSnapshot = this.buildSnapshot(options.domain);
5776
5850
  const extraction = await this.extract(options);
@@ -5778,7 +5852,7 @@ var init_dist = __esm({
5778
5852
  let driftResult = this.reconcile(preSnapshot, postSnapshot);
5779
5853
  const contradictions = new ContradictionDetector().detect(this.store);
5780
5854
  let gapReport = await this.detect(options);
5781
- const coverage = new CoverageScorer().score(this.store);
5855
+ const coverage = new CoverageScorer(this.inferenceOptions).score(this.store);
5782
5856
  let materialization;
5783
5857
  let iterations = 1;
5784
5858
  if (options.fix) {
@@ -5941,7 +6015,7 @@ var init_dist = __esm({
5941
6015
  // ── Phase 3: DETECT ───────────────────────────────────────────────────────
5942
6016
  async detect(options) {
5943
6017
  const knowledgeDir = path12.join(options.projectDir, "docs", "knowledge");
5944
- const aggregator = new KnowledgeStagingAggregator(options.projectDir);
6018
+ const aggregator = new KnowledgeStagingAggregator(options.projectDir, this.inferenceOptions);
5945
6019
  const gapReport = await aggregator.generateGapReport(knowledgeDir, this.store);
5946
6020
  await aggregator.writeGapReport(gapReport);
5947
6021
  return gapReport;
@@ -5969,7 +6043,7 @@ var init_dist = __esm({
5969
6043
  const allGapEntries = gapReport.domains.flatMap((d) => d.gapEntries);
5970
6044
  const materializable = allGapEntries.filter((e) => e.hasContent);
5971
6045
  if (materializable.length > 0) {
5972
- const materializer = new KnowledgeDocMaterializer(this.store);
6046
+ const materializer = new KnowledgeDocMaterializer(this.store, this.inferenceOptions);
5973
6047
  const matResult = await materializer.materialize(materializable, {
5974
6048
  projectDir: options.projectDir,
5975
6049
  dryRun: false
@@ -5995,7 +6069,7 @@ var init_dist = __esm({
5995
6069
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
5996
6070
  }));
5997
6071
  if (stagedEntries.length > 0) {
5998
- const aggregator = new KnowledgeStagingAggregator(options.projectDir);
6072
+ const aggregator = new KnowledgeStagingAggregator(options.projectDir, this.inferenceOptions);
5999
6073
  await aggregator.aggregate(stagedEntries, [], []);
6000
6074
  }
6001
6075
  }
@@ -9301,6 +9375,9 @@ export {
9301
9375
  BusinessKnowledgeIngestor,
9302
9376
  DecisionIngestor,
9303
9377
  RequirementIngestor,
9378
+ DEFAULT_PATTERNS,
9379
+ DEFAULT_BLOCKLIST,
9380
+ inferDomain,
9304
9381
  MermaidParser,
9305
9382
  D2Parser,
9306
9383
  PlantUmlParser,
@@ -33,7 +33,7 @@ var createSelfReviewDefinition = {
33
33
  };
34
34
  async function handleCreateSelfReview(input) {
35
35
  try {
36
- const { parseDiff, createSelfReview } = await import("./dist-CPKL5Y2R.js");
36
+ const { parseDiff, createSelfReview } = await import("./dist-77VNTHWV.js");
37
37
  const parseResult = parseDiff(input.diff);
38
38
  if (!parseResult.ok) {
39
39
  return resultToMcpResponse(parseResult);
@@ -53,11 +53,11 @@ async function handleCreateSelfReview(input) {
53
53
  ...input.maxFileCount !== void 0 ? { maxChangedFiles: input.maxFileCount } : {}
54
54
  }
55
55
  };
56
- const { loadGraphStore } = await import("./graph-loader-QEI7SYOQ.js");
56
+ const { loadGraphStore } = await import("./graph-loader-IAUPGLRV.js");
57
57
  const store = await loadGraphStore(projectPath);
58
58
  let graphData;
59
59
  if (store) {
60
- const { GraphFeedbackAdapter } = await import("./dist-BZS2XRLG.js");
60
+ const { GraphFeedbackAdapter } = await import("./dist-42AYXCAK.js");
61
61
  const adapter = new GraphFeedbackAdapter(store);
62
62
  const changedFiles = parseResult.value.files.map((f) => f.path);
63
63
  const impact = adapter.computeImpactData(changedFiles);
@@ -119,7 +119,7 @@ var analyzeDiffDefinition = {
119
119
  };
120
120
  async function handleAnalyzeDiff(input) {
121
121
  try {
122
- const { parseDiff, analyzeDiff } = await import("./dist-CPKL5Y2R.js");
122
+ const { parseDiff, analyzeDiff } = await import("./dist-77VNTHWV.js");
123
123
  const parseResult = parseDiff(input.diff);
124
124
  if (!parseResult.ok) {
125
125
  return resultToMcpResponse(parseResult);
@@ -139,10 +139,10 @@ async function handleAnalyzeDiff(input) {
139
139
  let graphImpactData;
140
140
  if (input.path) {
141
141
  try {
142
- const { loadGraphStore } = await import("./graph-loader-QEI7SYOQ.js");
142
+ const { loadGraphStore } = await import("./graph-loader-IAUPGLRV.js");
143
143
  const store = await loadGraphStore(sanitizePath(input.path));
144
144
  if (store) {
145
- const { GraphFeedbackAdapter } = await import("./dist-BZS2XRLG.js");
145
+ const { GraphFeedbackAdapter } = await import("./dist-42AYXCAK.js");
146
146
  const adapter = new GraphFeedbackAdapter(store);
147
147
  const changedFiles = parseResult.value.files.map((f) => f.path);
148
148
  const impact = adapter.computeImpactData(changedFiles);
@@ -195,7 +195,7 @@ var requestPeerReviewDefinition = {
195
195
  };
196
196
  async function handleRequestPeerReview(input) {
197
197
  try {
198
- const { parseDiff, requestPeerReview } = await import("./dist-CPKL5Y2R.js");
198
+ const { parseDiff, requestPeerReview } = await import("./dist-77VNTHWV.js");
199
199
  const parseResult = parseDiff(input.diff);
200
200
  if (!parseResult.ok) {
201
201
  return resultToMcpResponse(parseResult);
@@ -206,10 +206,10 @@ async function handleRequestPeerReview(input) {
206
206
  ...input.context ? { metadata: { context: input.context } } : {}
207
207
  };
208
208
  try {
209
- const { loadGraphStore } = await import("./graph-loader-QEI7SYOQ.js");
209
+ const { loadGraphStore } = await import("./graph-loader-IAUPGLRV.js");
210
210
  const store = await loadGraphStore(sanitizePath(input.path));
211
211
  if (store) {
212
- const { GraphFeedbackAdapter } = await import("./dist-BZS2XRLG.js");
212
+ const { GraphFeedbackAdapter } = await import("./dist-42AYXCAK.js");
213
213
  const adapter = new GraphFeedbackAdapter(store);
214
214
  const changedFiles = parseResult.value.files.map((f) => f.path);
215
215
  const impactData = adapter.computeImpactData(changedFiles);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-IBTHD2UA.js";
3
+ } from "./chunk-RFYF7TJS.js";
4
4
  import {
5
5
  Ok
6
6
  } from "./chunk-RL4VMEXL.js";
@@ -9,7 +9,7 @@ async function runScan(projectPath) {
9
9
  KnowledgeIngestor,
10
10
  GitIngestor,
11
11
  RequirementIngestor
12
- } = await import("./dist-BZS2XRLG.js");
12
+ } = await import("./dist-42AYXCAK.js");
13
13
  const store = new GraphStore();
14
14
  const start = Date.now();
15
15
  await new CodeIngestor(store).ingest(projectPath);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-IBTHD2UA.js";
3
+ } from "./chunk-RFYF7TJS.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  generateCIWorkflow
3
- } from "./chunk-FUS4OOGC.js";
4
- import "./chunk-IBTHD2UA.js";
3
+ } from "./chunk-RYDPFIJY.js";
4
+ import "./chunk-RFYF7TJS.js";
5
5
  import "./chunk-RL4VMEXL.js";
6
- import "./chunk-GAIOIINV.js";
6
+ import "./chunk-S2WB4LE7.js";
7
7
  import "./chunk-KFQGP6VL.js";
8
8
  export {
9
9
  generateCIWorkflow
@@ -14,6 +14,8 @@ import {
14
14
  ContradictionDetector,
15
15
  CoverageScorer,
16
16
  D2Parser,
17
+ DEFAULT_BLOCKLIST,
18
+ DEFAULT_PATTERNS,
17
19
  DecisionIngestor,
18
20
  DesignConstraintAdapter,
19
21
  DesignIngestor,
@@ -66,6 +68,7 @@ import {
66
68
  createExtractionRunner,
67
69
  detectLanguage,
68
70
  groupNodesByImpact,
71
+ inferDomain,
69
72
  init_dist,
70
73
  linkToCode,
71
74
  loadGraph,
@@ -73,7 +76,7 @@ import {
73
76
  project,
74
77
  queryTraceability,
75
78
  saveGraph
76
- } from "./chunk-GAIOIINV.js";
79
+ } from "./chunk-S2WB4LE7.js";
77
80
  import "./chunk-KFQGP6VL.js";
78
81
  init_dist();
79
82
  export {
@@ -92,6 +95,8 @@ export {
92
95
  ContradictionDetector,
93
96
  CoverageScorer,
94
97
  D2Parser,
98
+ DEFAULT_BLOCKLIST,
99
+ DEFAULT_PATTERNS,
95
100
  DecisionIngestor,
96
101
  DesignConstraintAdapter,
97
102
  DesignIngestor,
@@ -144,6 +149,7 @@ export {
144
149
  createExtractionRunner,
145
150
  detectLanguage,
146
151
  groupNodesByImpact,
152
+ inferDomain,
147
153
  linkToCode,
148
154
  loadGraph,
149
155
  normalizeIntent,
@@ -395,7 +395,7 @@ import {
395
395
  writeSessionSummary,
396
396
  writeTaint,
397
397
  xssRules
398
- } from "./chunk-IBTHD2UA.js";
398
+ } from "./chunk-RFYF7TJS.js";
399
399
  import {
400
400
  DEFAULT_SKILL_CONTEXT_BUDGET,
401
401
  Err,
@@ -405,7 +405,7 @@ import {
405
405
  isErr,
406
406
  isOk
407
407
  } from "./chunk-RL4VMEXL.js";
408
- import "./chunk-GAIOIINV.js";
408
+ import "./chunk-S2WB4LE7.js";
409
409
  import "./chunk-KFQGP6VL.js";
410
410
  init_dist();
411
411
  export {
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  checkDocsDefinition,
3
3
  handleCheckDocs
4
- } from "./chunk-T7UZOJF4.js";
4
+ } from "./chunk-ELJ2MXMO.js";
5
5
  import "./chunk-EPUKTTJZ.js";
6
6
  import "./chunk-W6Y7ZW3Y.js";
7
- import "./chunk-A4ETL34H.js";
8
- import "./chunk-IBTHD2UA.js";
7
+ import "./chunk-KJD4J54I.js";
8
+ import "./chunk-RFYF7TJS.js";
9
9
  import "./chunk-RL4VMEXL.js";
10
- import "./chunk-GAIOIINV.js";
10
+ import "./chunk-S2WB4LE7.js";
11
11
  import "./chunk-3WGJMBKH.js";
12
12
  import "./chunk-KFQGP6VL.js";
13
13
  export {
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  TemplateEngine
3
- } from "./chunk-L3Y7L4EG.js";
4
- import "./chunk-IBTHD2UA.js";
3
+ } from "./chunk-ZYLBIDLE.js";
4
+ import "./chunk-RFYF7TJS.js";
5
5
  import "./chunk-RL4VMEXL.js";
6
- import "./chunk-GAIOIINV.js";
6
+ import "./chunk-S2WB4LE7.js";
7
7
  import "./chunk-KFQGP6VL.js";
8
8
  export {
9
9
  TemplateEngine
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  detectEntropyDefinition,
3
3
  handleDetectEntropy
4
- } from "./chunk-EGRQHLDM.js";
4
+ } from "./chunk-JNKALGRM.js";
5
5
  import "./chunk-EPUKTTJZ.js";
6
6
  import "./chunk-W6Y7ZW3Y.js";
7
- import "./chunk-IBTHD2UA.js";
7
+ import "./chunk-RFYF7TJS.js";
8
8
  import "./chunk-RL4VMEXL.js";
9
- import "./chunk-GAIOIINV.js";
9
+ import "./chunk-S2WB4LE7.js";
10
10
  import "./chunk-KFQGP6VL.js";
11
11
  export {
12
12
  detectEntropyDefinition,
@@ -5,7 +5,7 @@ import {
5
5
  handleCreateSelfReview,
6
6
  handleRequestPeerReview,
7
7
  requestPeerReviewDefinition
8
- } from "./chunk-BZZNYHRY.js";
8
+ } from "./chunk-SITVRO7K.js";
9
9
  import "./chunk-EPUKTTJZ.js";
10
10
  import "./chunk-W6Y7ZW3Y.js";
11
11
  import "./chunk-KFQGP6VL.js";
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  createGenerateAgentDefinitionsCommand,
3
3
  generateAgentDefinitions
4
- } from "./chunk-SDDQPMZK.js";
4
+ } from "./chunk-R2CBBZA6.js";
5
5
  import "./chunk-KET4QQZB.js";
6
- import "./chunk-BO4AJZRE.js";
6
+ import "./chunk-HT7HYYGT.js";
7
7
  import "./chunk-3ISINLYT.js";
8
8
  import "./chunk-6B6UN6SG.js";
9
- import "./chunk-IBTHD2UA.js";
9
+ import "./chunk-RFYF7TJS.js";
10
10
  import "./chunk-RL4VMEXL.js";
11
- import "./chunk-GAIOIINV.js";
11
+ import "./chunk-S2WB4LE7.js";
12
12
  import "./chunk-3WGJMBKH.js";
13
13
  import "./chunk-KFQGP6VL.js";
14
14
  export {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  clearGraphStoreCache,
3
3
  loadGraphStore
4
- } from "./chunk-776JFSPK.js";
4
+ } from "./chunk-DXGI7DL3.js";
5
5
  import "./chunk-KFQGP6VL.js";
6
6
  export {
7
7
  clearGraphStoreCache,