@harness-engineering/cli 2.6.1 → 2.7.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 (156) hide show
  1. package/dist/agents/skills/claude-code/align-design-system/SKILL.md +174 -0
  2. package/dist/agents/skills/claude-code/align-design-system/skill.yaml +57 -0
  3. package/dist/agents/skills/claude-code/audit-brand-compliance/SKILL.md +189 -0
  4. package/dist/agents/skills/claude-code/audit-brand-compliance/skill.yaml +50 -0
  5. package/dist/agents/skills/claude-code/audit-component-anatomy/SKILL.md +181 -0
  6. package/dist/agents/skills/claude-code/audit-component-anatomy/skill.yaml +51 -0
  7. package/dist/agents/skills/claude-code/copy-craft/SKILL.md +192 -0
  8. package/dist/agents/skills/claude-code/copy-craft/skill.yaml +52 -0
  9. package/dist/agents/skills/claude-code/detect-design-drift/SKILL.md +139 -0
  10. package/dist/agents/skills/claude-code/detect-design-drift/skill.yaml +50 -0
  11. package/dist/agents/skills/claude-code/harness-accessibility/SKILL.md +10 -0
  12. package/dist/agents/skills/claude-code/harness-design-craft/SKILL.md +212 -0
  13. package/dist/agents/skills/claude-code/harness-design-craft/skill.yaml +57 -0
  14. package/dist/agents/skills/claude-code/harness-design-pipeline/SKILL.md +266 -0
  15. package/dist/agents/skills/claude-code/harness-design-pipeline/skill.yaml +70 -0
  16. package/dist/agents/skills/claude-code/knowledge-craft/SKILL.md +180 -0
  17. package/dist/agents/skills/claude-code/knowledge-craft/skill.yaml +49 -0
  18. package/dist/agents/skills/claude-code/naming-craft/SKILL.md +172 -0
  19. package/dist/agents/skills/claude-code/naming-craft/skill.yaml +51 -0
  20. package/dist/agents/skills/claude-code/security-craft/SKILL.md +205 -0
  21. package/dist/agents/skills/claude-code/security-craft/skill.yaml +58 -0
  22. package/dist/agents/skills/claude-code/spec-craft/SKILL.md +184 -0
  23. package/dist/agents/skills/claude-code/spec-craft/skill.yaml +55 -0
  24. package/dist/agents/skills/claude-code/test-craft/SKILL.md +212 -0
  25. package/dist/agents/skills/claude-code/test-craft/skill.yaml +58 -0
  26. package/dist/agents/skills/codex/align-design-system/SKILL.md +174 -0
  27. package/dist/agents/skills/codex/align-design-system/skill.yaml +57 -0
  28. package/dist/agents/skills/codex/audit-brand-compliance/SKILL.md +189 -0
  29. package/dist/agents/skills/codex/audit-brand-compliance/skill.yaml +50 -0
  30. package/dist/agents/skills/codex/audit-component-anatomy/SKILL.md +181 -0
  31. package/dist/agents/skills/codex/audit-component-anatomy/skill.yaml +51 -0
  32. package/dist/agents/skills/codex/copy-craft/SKILL.md +192 -0
  33. package/dist/agents/skills/codex/copy-craft/skill.yaml +52 -0
  34. package/dist/agents/skills/codex/detect-design-drift/SKILL.md +139 -0
  35. package/dist/agents/skills/codex/detect-design-drift/skill.yaml +50 -0
  36. package/dist/agents/skills/codex/harness-accessibility/SKILL.md +10 -0
  37. package/dist/agents/skills/codex/harness-design-craft/SKILL.md +212 -0
  38. package/dist/agents/skills/codex/harness-design-craft/skill.yaml +57 -0
  39. package/dist/agents/skills/codex/harness-design-pipeline/SKILL.md +266 -0
  40. package/dist/agents/skills/codex/harness-design-pipeline/skill.yaml +70 -0
  41. package/dist/agents/skills/codex/knowledge-craft/SKILL.md +180 -0
  42. package/dist/agents/skills/codex/knowledge-craft/skill.yaml +49 -0
  43. package/dist/agents/skills/codex/naming-craft/SKILL.md +172 -0
  44. package/dist/agents/skills/codex/naming-craft/skill.yaml +51 -0
  45. package/dist/agents/skills/codex/security-craft/SKILL.md +205 -0
  46. package/dist/agents/skills/codex/security-craft/skill.yaml +58 -0
  47. package/dist/agents/skills/codex/spec-craft/SKILL.md +184 -0
  48. package/dist/agents/skills/codex/spec-craft/skill.yaml +55 -0
  49. package/dist/agents/skills/codex/test-craft/SKILL.md +212 -0
  50. package/dist/agents/skills/codex/test-craft/skill.yaml +58 -0
  51. package/dist/agents/skills/cursor/align-design-system/SKILL.md +174 -0
  52. package/dist/agents/skills/cursor/align-design-system/skill.yaml +57 -0
  53. package/dist/agents/skills/cursor/audit-brand-compliance/SKILL.md +189 -0
  54. package/dist/agents/skills/cursor/audit-brand-compliance/skill.yaml +50 -0
  55. package/dist/agents/skills/cursor/audit-component-anatomy/SKILL.md +181 -0
  56. package/dist/agents/skills/cursor/audit-component-anatomy/skill.yaml +51 -0
  57. package/dist/agents/skills/cursor/copy-craft/SKILL.md +192 -0
  58. package/dist/agents/skills/cursor/copy-craft/skill.yaml +52 -0
  59. package/dist/agents/skills/cursor/detect-design-drift/SKILL.md +139 -0
  60. package/dist/agents/skills/cursor/detect-design-drift/skill.yaml +50 -0
  61. package/dist/agents/skills/cursor/harness-accessibility/SKILL.md +10 -0
  62. package/dist/agents/skills/cursor/harness-design-craft/SKILL.md +212 -0
  63. package/dist/agents/skills/cursor/harness-design-craft/skill.yaml +57 -0
  64. package/dist/agents/skills/cursor/harness-design-pipeline/SKILL.md +266 -0
  65. package/dist/agents/skills/cursor/harness-design-pipeline/skill.yaml +70 -0
  66. package/dist/agents/skills/cursor/knowledge-craft/SKILL.md +180 -0
  67. package/dist/agents/skills/cursor/knowledge-craft/skill.yaml +49 -0
  68. package/dist/agents/skills/cursor/naming-craft/SKILL.md +172 -0
  69. package/dist/agents/skills/cursor/naming-craft/skill.yaml +51 -0
  70. package/dist/agents/skills/cursor/security-craft/SKILL.md +205 -0
  71. package/dist/agents/skills/cursor/security-craft/skill.yaml +58 -0
  72. package/dist/agents/skills/cursor/spec-craft/SKILL.md +184 -0
  73. package/dist/agents/skills/cursor/spec-craft/skill.yaml +55 -0
  74. package/dist/agents/skills/cursor/test-craft/SKILL.md +212 -0
  75. package/dist/agents/skills/cursor/test-craft/skill.yaml +58 -0
  76. package/dist/agents/skills/gemini-cli/align-design-system/SKILL.md +174 -0
  77. package/dist/agents/skills/gemini-cli/align-design-system/skill.yaml +57 -0
  78. package/dist/agents/skills/gemini-cli/audit-brand-compliance/SKILL.md +189 -0
  79. package/dist/agents/skills/gemini-cli/audit-brand-compliance/skill.yaml +50 -0
  80. package/dist/agents/skills/gemini-cli/audit-component-anatomy/SKILL.md +181 -0
  81. package/dist/agents/skills/gemini-cli/audit-component-anatomy/skill.yaml +51 -0
  82. package/dist/agents/skills/gemini-cli/copy-craft/SKILL.md +192 -0
  83. package/dist/agents/skills/gemini-cli/copy-craft/skill.yaml +52 -0
  84. package/dist/agents/skills/gemini-cli/detect-design-drift/SKILL.md +139 -0
  85. package/dist/agents/skills/gemini-cli/detect-design-drift/skill.yaml +50 -0
  86. package/dist/agents/skills/gemini-cli/harness-accessibility/SKILL.md +10 -0
  87. package/dist/agents/skills/gemini-cli/harness-design-craft/SKILL.md +212 -0
  88. package/dist/agents/skills/gemini-cli/harness-design-craft/skill.yaml +57 -0
  89. package/dist/agents/skills/gemini-cli/harness-design-pipeline/SKILL.md +266 -0
  90. package/dist/agents/skills/gemini-cli/harness-design-pipeline/skill.yaml +70 -0
  91. package/dist/agents/skills/gemini-cli/knowledge-craft/SKILL.md +180 -0
  92. package/dist/agents/skills/gemini-cli/knowledge-craft/skill.yaml +49 -0
  93. package/dist/agents/skills/gemini-cli/naming-craft/SKILL.md +172 -0
  94. package/dist/agents/skills/gemini-cli/naming-craft/skill.yaml +51 -0
  95. package/dist/agents/skills/gemini-cli/security-craft/SKILL.md +205 -0
  96. package/dist/agents/skills/gemini-cli/security-craft/skill.yaml +58 -0
  97. package/dist/agents/skills/gemini-cli/spec-craft/SKILL.md +184 -0
  98. package/dist/agents/skills/gemini-cli/spec-craft/skill.yaml +55 -0
  99. package/dist/agents/skills/gemini-cli/test-craft/SKILL.md +212 -0
  100. package/dist/agents/skills/gemini-cli/test-craft/skill.yaml +58 -0
  101. package/dist/{agents-md-2JUQ4FE2.js → agents-md-267R2NUJ.js} +4 -4
  102. package/dist/{analyzer-VY6DJVOU-4AHIJLNS.js → analyzer-VY6DJVOU-WYKV3TTW.js} +2 -2
  103. package/dist/{architecture-CXAVNB5X.js → architecture-ZTEHGIHD.js} +6 -6
  104. package/dist/{assess-project-M626SSPN.js → assess-project-OKDW3YSK.js} +2 -1
  105. package/dist/bin/harness-mcp.js +17 -17
  106. package/dist/bin/harness.js +27 -27
  107. package/dist/{check-phase-gate-XMU6LLUQ.js → check-phase-gate-YJWFDW66.js} +5 -5
  108. package/dist/{chunk-372MGNTI.js → chunk-4EGPFB7V.js} +6185 -124
  109. package/dist/{chunk-HFOB2MPQ.js → chunk-67RP7MLR.js} +3 -3
  110. package/dist/{chunk-5JNSFYZU.js → chunk-6T5AYG5S.js} +6 -6
  111. package/dist/{chunk-5XLLIYYL.js → chunk-6UHDQP2N.js} +1 -1
  112. package/dist/{chunk-YP7I25SL.js → chunk-B3B64OPD.js} +1 -1
  113. package/dist/{chunk-VTTNIZJL.js → chunk-B4OLYXZ4.js} +93 -3
  114. package/dist/{chunk-6AX6R3LM.js → chunk-CXAHK5PJ.js} +9 -9
  115. package/dist/{chunk-BCFDGOMA.js → chunk-H2ZJOJ7A.js} +81 -1
  116. package/dist/{chunk-CQOMVZDC.js → chunk-HLPY3RHE.js} +1641 -292
  117. package/dist/{chunk-Q6ZR2L6Q.js → chunk-HMMSWRWR.js} +2 -2
  118. package/dist/{chunk-YYRQCQPZ.js → chunk-IY2TZLY5.js} +176 -107
  119. package/dist/{chunk-I6K43QQS.js → chunk-MQG7FHXX.js} +3 -3
  120. package/dist/{chunk-43M3RLFQ.js → chunk-OLTVDPA2.js} +2 -2
  121. package/dist/{chunk-JFZOWO7D.js → chunk-OQE6ME2Z.js} +1 -1
  122. package/dist/{chunk-GWE5LL3R.js → chunk-P7EO7USC.js} +10 -10
  123. package/dist/{chunk-24KCOJJG.js → chunk-PARV3G2F.js} +1 -1
  124. package/dist/{chunk-QOKMDDBJ.js → chunk-QUPC37UB.js} +6 -6
  125. package/dist/{chunk-EPUKTTJZ.js → chunk-RC3OI5NK.js} +5 -1
  126. package/dist/{chunk-L5BCZ5XS.js → chunk-S7GEONXL.js} +1 -1
  127. package/dist/{chunk-5FDBXUFW.js → chunk-TIH53QXY.js} +1 -1
  128. package/dist/{chunk-OA6SWTU4.js → chunk-TIZ3L6CU.js} +11 -8
  129. package/dist/{chunk-GWF2OILZ.js → chunk-VG6UK6G6.js} +1 -1
  130. package/dist/{chunk-SZEFU6XC.js → chunk-W3PDVZ4I.js} +1 -1
  131. package/dist/{chunk-VUCGB2KH.js → chunk-WOXR6I3R.js} +1 -1
  132. package/dist/{chunk-K246XQ2L.js → chunk-XTIPZUPR.js} +1 -1
  133. package/dist/{chunk-HMW3VKUF.js → chunk-Z2GUITAS.js} +10 -10
  134. package/dist/{chunk-PFZEADQM.js → chunk-ZKA3TGYS.js} +79 -2
  135. package/dist/{ci-workflow-3JNDZQYD.js → ci-workflow-YGTQTNVC.js} +4 -4
  136. package/dist/{dist-QPWXPCPL.js → dist-R3TOOPJ7.js} +1 -1
  137. package/dist/{dist-OHDQBTSO.js → dist-XIJWWQ5N.js} +3 -3
  138. package/dist/{docs-5RYMDHN3.js → docs-KCTLXK2G.js} +6 -6
  139. package/dist/{engine-GKGT5ULT.js → engine-J64WPH5K.js} +4 -4
  140. package/dist/{entropy-DQTAPSSE.js → entropy-M27JUL3V.js} +5 -5
  141. package/dist/{feedback-WH6XPQJS.js → feedback-W25QO3OL.js} +2 -2
  142. package/dist/{generate-agent-definitions-SZA4QIHN.js → generate-agent-definitions-RNMU5U5R.js} +5 -5
  143. package/dist/{glob-helper-XE2UGEOV.js → glob-helper-EX4YZKZO.js} +1 -1
  144. package/dist/{graph-loader-EQBOIHFZ.js → graph-loader-EIFEOUVI.js} +1 -1
  145. package/dist/index.d.ts +587 -6
  146. package/dist/index.js +27 -27
  147. package/dist/{loader-BNKGM23C.js → loader-HZKJ5ABV.js} +4 -4
  148. package/dist/{mcp-YKKPWUMH.js → mcp-NEAPIDTT.js} +17 -17
  149. package/dist/{performance-54TMJOEU.js → performance-3AVQUDRG.js} +6 -6
  150. package/dist/{review-pipeline-OTDDVPNY.js → review-pipeline-KA7SGUXJ.js} +4 -4
  151. package/dist/{runtime-W5THSNAL.js → runtime-IP6FVV5M.js} +4 -4
  152. package/dist/{scan-4PPP6ZXT.js → scan-LYKLM4EQ.js} +1 -1
  153. package/dist/{security-27HW7CYT.js → security-EAR4FJWI.js} +1 -1
  154. package/dist/{validate-QRVCD4GP.js → validate-EVH3UXIC.js} +5 -5
  155. package/dist/{validate-cross-check-BUAGBAPO.js → validate-cross-check-SNE3SQOB.js} +4 -4
  156. package/package.json +8 -7
@@ -27,7 +27,7 @@ var runSecurityScanDefinition = {
27
27
  };
28
28
  async function handleRunSecurityScan(input) {
29
29
  try {
30
- const core = await import("./dist-OHDQBTSO.js");
30
+ const core = await import("./dist-XIJWWQ5N.js");
31
31
  const projectRoot = sanitizePath(input.path);
32
32
  let configData = {};
33
33
  try {
@@ -50,7 +50,7 @@ async function handleRunSecurityScan(input) {
50
50
  if (input.files && input.files.length > 0) {
51
51
  filesToScan = input.files.map((f) => path.resolve(projectRoot, f));
52
52
  } else {
53
- const { globFiles } = await import("./glob-helper-XE2UGEOV.js");
53
+ const { globFiles } = await import("./glob-helper-EX4YZKZO.js");
54
54
  filesToScan = await globFiles(projectRoot, securityConfig.exclude);
55
55
  }
56
56
  const result = await scanner.scanFiles(filesToScan);
@@ -114,7 +114,7 @@ var getSecurityTrendsDefinition = {
114
114
  };
115
115
  async function handleGetSecurityTrends(input) {
116
116
  try {
117
- const core = await import("./dist-OHDQBTSO.js");
117
+ const core = await import("./dist-XIJWWQ5N.js");
118
118
  const projectRoot = sanitizePath(input.path);
119
119
  const manager = new core.SecurityTimelineManager(projectRoot);
120
120
  const trendOptions = {};
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  resolveProjectConfig
3
- } from "./chunk-GWF2OILZ.js";
3
+ } from "./chunk-VG6UK6G6.js";
4
4
  import {
5
5
  resultToMcpResponse
6
- } from "./chunk-EPUKTTJZ.js";
6
+ } from "./chunk-RC3OI5NK.js";
7
7
  import {
8
8
  sanitizePath
9
9
  } from "./chunk-W6Y7ZW3Y.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-OHDQBTSO.js");
41
+ const { validateDependencies, TypeScriptParser } = await import("./dist-XIJWWQ5N.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-EQBOIHFZ.js");
50
+ const { loadGraphStore } = await import("./graph-loader-EIFEOUVI.js");
51
51
  const store = await loadGraphStore(projectPath);
52
52
  let graphDependencyData;
53
53
  if (store) {
54
- const { GraphConstraintAdapter } = await import("./dist-QPWXPCPL.js");
54
+ const { GraphConstraintAdapter } = await import("./dist-R3TOOPJ7.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-QPWXPCPL.js");
72
+ const { DesignConstraintAdapter } = await import("./dist-R3TOOPJ7.js");
73
73
  const designAdapter = new DesignConstraintAdapter(store);
74
74
  const fileNodes = store.findNodes({ type: "file" });
75
75
  for (const fileNode of fileNodes) {
@@ -41,7 +41,7 @@ async function runScan(projectPath) {
41
41
  KnowledgeIngestor,
42
42
  GitIngestor,
43
43
  RequirementIngestor
44
- } = await import("./dist-QPWXPCPL.js");
44
+ } = await import("./dist-R3TOOPJ7.js");
45
45
  const store = new GraphStore();
46
46
  const start = Date.now();
47
47
  const ingestOptions = loadIngestOptions(projectPath);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-YYRQCQPZ.js";
3
+ } from "./chunk-IY2TZLY5.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-3WGJMBKH.js";
8
8
  import {
9
9
  init_dist as init_dist2
10
- } from "./chunk-YYRQCQPZ.js";
10
+ } from "./chunk-IY2TZLY5.js";
11
11
  import {
12
12
  Err,
13
13
  Ok
@@ -15,7 +15,7 @@ import {
15
15
  import {
16
16
  init_dist,
17
17
  skipDirGlobs
18
- } from "./chunk-BCFDGOMA.js";
18
+ } from "./chunk-H2ZJOJ7A.js";
19
19
  import {
20
20
  ArchConfigSchema
21
21
  } from "./chunk-QCLOIUMX.js";
@@ -99,6 +99,86 @@ var PerformanceConfigSchema = z.object({
99
99
  /** Size budget for bundles or directories */
100
100
  sizeBudget: z.record(z.unknown()).optional()
101
101
  }).passthrough();
102
+ var ComponentAnatomyAuditConfigSchema = z.object({
103
+ /** Gate for the entire audit AND the harness-accessibility deferral */
104
+ enabled: z.boolean().default(true),
105
+ /** "default" or a path to a project-supplied override catalog */
106
+ catalog: z.string().default("default"),
107
+ /** "all", "none", or an explicit list of pattern codes (e.g. ["ANAT-P001"]) */
108
+ patterns: z.union([z.literal("all"), z.literal("none"), z.array(z.string())]).default("all"),
109
+ /** Fast-mode controls (validate-time scope cap + pattern opt-in) */
110
+ fastMode: z.object({
111
+ /** Whether validate-time runs pattern queries (default false — patterns are full-mode only) */
112
+ patterns: z.boolean().default(false),
113
+ /** Cap to keep validate fast on large repos */
114
+ maxFiles: z.number().int().positive().default(500)
115
+ }).default({})
116
+ });
117
+ var DriftDetectionConfigSchema = z.object({
118
+ /** Gate for the entire drift verifier */
119
+ enabled: z.boolean().default(true),
120
+ /** Rule toggles — defaults align with v1 scope (T* + P*) */
121
+ rules: z.object({
122
+ /** Token bypass rules (DRIFT-T001-T004). Default: true. */
123
+ tokenBypass: z.boolean().default(true),
124
+ /** Primitive adoption rules (DRIFT-P001-P004). Default: true. */
125
+ primitiveAdoption: z.boolean().default(true)
126
+ }).default({}),
127
+ /** Fast-mode controls (validate-time scope cap) */
128
+ fastMode: z.object({
129
+ /** Cap to keep validate fast on large repos */
130
+ maxFiles: z.number().int().positive().default(500)
131
+ }).default({})
132
+ });
133
+ var BrandComplianceConfigSchema = z.object({
134
+ /** Gate for the entire brand verifier */
135
+ enabled: z.boolean().default(true),
136
+ /** Rule toggles — defaults align with v1 scope (BRAND-T* + BRAND-V001) */
137
+ rules: z.object({
138
+ /** Token-misuse rules (BRAND-T001 via $extensions.harness.brand.forbidden_contexts). Default: true. */
139
+ tokenMisuse: z.boolean().default(true),
140
+ /** Voice rule (BRAND-V001 forbidden phrases in JSX text + string attributes). Default: true. */
141
+ voice: z.boolean().default(true)
142
+ }).default({}),
143
+ /** Fast-mode controls (validate-time scope cap) */
144
+ fastMode: z.object({
145
+ maxFiles: z.number().int().positive().default(500)
146
+ }).default({})
147
+ });
148
+ var DesignAuditConfigSchema = z.object({
149
+ /** Component-anatomy audit (design-pipeline #2) */
150
+ componentAnatomy: ComponentAnatomyAuditConfigSchema.optional(),
151
+ /** Design-system drift detection (design-pipeline #1, detect half) */
152
+ driftDetection: DriftDetectionConfigSchema.optional(),
153
+ /** Brand-compliance audit (design-pipeline #3) */
154
+ brandCompliance: BrandComplianceConfigSchema.optional()
155
+ });
156
+ var DesignCraftConfigSchema = z.object({
157
+ /** Gate for the entire skill AND the harness-design overlap deferral */
158
+ enabled: z.boolean().default(true),
159
+ /** Default invocation mode — "fast" (code-only LLM) or "deep" (rendered + vision-LLM) */
160
+ mode: z.enum(["fast", "deep"]).default("fast"),
161
+ /** B' detect-and-offer behavior when preconditions missing */
162
+ autoCapture: z.enum(["prompt", "auto", "skip"]).default("prompt"),
163
+ /** LLM provider configuration */
164
+ llm: z.object({
165
+ provider: z.string().default("anthropic"),
166
+ model: z.string().default("claude-sonnet-4-6"),
167
+ visionModel: z.string().optional()
168
+ }).optional(),
169
+ /** Catalog scoping */
170
+ catalog: z.object({
171
+ path: z.string().default("default"),
172
+ rubrics: z.union([z.literal("all"), z.literal("none"), z.array(z.string())]).default("all"),
173
+ patterns: z.union([z.literal("all"), z.literal("none"), z.array(z.string())]).default("all"),
174
+ exemplars: z.union([z.literal("all"), z.literal("none"), z.array(z.string())]).default("all")
175
+ }).optional(),
176
+ /** Signal feedback loop (CRITIQUE recurrence → pattern proposal) */
177
+ signal: z.object({
178
+ /** N=5 by default — emit candidate pattern proposal after this many recurrences */
179
+ proposalThreshold: z.number().int().positive().default(5)
180
+ }).optional()
181
+ });
102
182
  var DesignConfigSchema = z.object({
103
183
  /**
104
184
  * Whether design-system tooling is enabled for this project. Set during init.
@@ -113,7 +193,17 @@ var DesignConfigSchema = z.object({
113
193
  /** Path to design tokens (e.g. JSON or CSS) */
114
194
  tokenPath: z.string().optional(),
115
195
  /** Brief description of the intended aesthetic direction */
116
- aestheticIntent: z.string().optional()
196
+ aestheticIntent: z.string().optional(),
197
+ /**
198
+ * Design-pipeline audit configuration (rule-based floor layer).
199
+ * Omit to use built-in defaults.
200
+ */
201
+ audit: DesignAuditConfigSchema.optional(),
202
+ /**
203
+ * Design-craft configuration (LLM-judgment ceiling layer, design-pipeline #6).
204
+ * Omit to use built-in defaults.
205
+ */
206
+ craft: DesignCraftConfigSchema.optional()
117
207
  }).superRefine((value, ctx) => {
118
208
  if (value.enabled === true && (!value.platforms || value.platforms.length === 0)) {
119
209
  ctx.addIssue({
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  resultToMcpResponse
3
- } from "./chunk-EPUKTTJZ.js";
3
+ } from "./chunk-RC3OI5NK.js";
4
4
  import {
5
5
  sanitizePath
6
6
  } from "./chunk-W6Y7ZW3Y.js";
7
7
  import {
8
8
  findConfigFile,
9
9
  loadConfig
10
- } from "./chunk-VTTNIZJL.js";
10
+ } from "./chunk-B4OLYXZ4.js";
11
11
  import {
12
12
  init_dist
13
- } from "./chunk-YYRQCQPZ.js";
13
+ } from "./chunk-IY2TZLY5.js";
14
14
  import {
15
15
  Ok
16
16
  } from "./chunk-OH3NXXUY.js";
@@ -35,7 +35,7 @@ var checkPerformanceDefinition = {
35
35
  };
36
36
  async function handleCheckPerformance(input) {
37
37
  try {
38
- const { EntropyAnalyzer } = await import("./dist-OHDQBTSO.js");
38
+ const { EntropyAnalyzer } = await import("./dist-XIJWWQ5N.js");
39
39
  const typeFilter = input.type ?? "all";
40
40
  const projectPath = sanitizePath(input.path);
41
41
  let entryPoints;
@@ -58,10 +58,10 @@ async function handleCheckPerformance(input) {
58
58
  });
59
59
  let graphOptions;
60
60
  try {
61
- const { loadGraphStore } = await import("./graph-loader-EQBOIHFZ.js");
61
+ const { loadGraphStore } = await import("./graph-loader-EIFEOUVI.js");
62
62
  const store = await loadGraphStore(projectPath);
63
63
  if (store) {
64
- const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-QPWXPCPL.js");
64
+ const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-R3TOOPJ7.js");
65
65
  const complexityAdapter = new GraphComplexityAdapter(store);
66
66
  const couplingAdapter = new GraphCouplingAdapter(store);
67
67
  graphOptions = {
@@ -98,7 +98,7 @@ var getPerfBaselinesDefinition = {
98
98
  };
99
99
  async function handleGetPerfBaselines(input) {
100
100
  try {
101
- const { BaselineManager } = await import("./dist-OHDQBTSO.js");
101
+ const { BaselineManager } = await import("./dist-XIJWWQ5N.js");
102
102
  const manager = new BaselineManager(sanitizePath(input.path));
103
103
  const baselines = manager.load();
104
104
  return resultToMcpResponse(
@@ -146,7 +146,7 @@ var updatePerfBaselinesDefinition = {
146
146
  };
147
147
  async function handleUpdatePerfBaselines(input) {
148
148
  try {
149
- const { BaselineManager } = await import("./dist-OHDQBTSO.js");
149
+ const { BaselineManager } = await import("./dist-XIJWWQ5N.js");
150
150
  const manager = new BaselineManager(sanitizePath(input.path));
151
151
  manager.save(input.results, input.commitHash);
152
152
  const updated = manager.load();
@@ -176,7 +176,7 @@ var getCriticalPathsDefinition = {
176
176
  };
177
177
  async function handleGetCriticalPaths(input) {
178
178
  try {
179
- const { CriticalPathResolver } = await import("./dist-OHDQBTSO.js");
179
+ const { CriticalPathResolver } = await import("./dist-XIJWWQ5N.js");
180
180
  const resolver = new CriticalPathResolver(sanitizePath(input.path));
181
181
  const result = await resolver.resolve();
182
182
  return resultToMcpResponse(Ok(result));
@@ -1643,7 +1643,7 @@ function parseAntiPatterns(content) {
1643
1643
  }
1644
1644
  return patterns;
1645
1645
  }
1646
- 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, DEFAULT_SKIP_DIRS, 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, DOCS_OWNED_BY_OTHER_INGESTORS, KnowledgeIngestor, BUG_TRACK_CATEGORIES, KNOWLEDGE_TRACK_CATEGORIES, ISO_DATE, SolutionBaseSchema, SolutionDocFrontmatterSchema, 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, DiagramParser, HEURISTIC_PATTERNS, SCANNABLE_TYPES, KnowledgeLinker, StructuralDriftDetector, BUSINESS_NODE_TYPES, KnowledgeStagingAggregator, 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;
1646
+ 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, DEFAULT_SKIP_DIRS, 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, DOCS_OWNED_BY_OTHER_INGESTORS, KnowledgeIngestor, BUG_TRACK_CATEGORIES, KNOWLEDGE_TRACK_CATEGORIES, ISO_DATE, SolutionBaseSchema, SolutionDocFrontmatterSchema, 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, DiagramParser, HEURISTIC_PATTERNS, SCANNABLE_TYPES, KnowledgeLinker, StructuralDriftDetector, BUSINESS_NODE_TYPES, KnowledgeStagingAggregator, 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, CODE_PREFIX_LABELS, DesignConstraintAdapter, GraphFeedbackAdapter, DEFAULT_EDGE_TYPES, TaskIndependenceAnalyzer, ConflictPredictor, VERSION;
1647
1647
  var init_dist = __esm({
1648
1648
  "../graph/dist/index.mjs"() {
1649
1649
  NODE_TYPES = [
@@ -9141,6 +9141,16 @@ ${replyLines.join("\n")}`;
9141
9141
  return { ...merged, durationMs: Date.now() - start };
9142
9142
  }
9143
9143
  };
9144
+ CODE_PREFIX_LABELS = {
9145
+ "ANAT-D": "Component anatomy (definition)",
9146
+ "ANAT-P": "Component anatomy (pattern presence)",
9147
+ "ANAT-U": "Component anatomy (usage)",
9148
+ "CRAFT-C": "Design craft (critique)",
9149
+ "CRAFT-P": "Design craft (polish)",
9150
+ "CRAFT-B": "Design craft (benchmark)",
9151
+ "DESIGN-": "Design constraint (legacy)",
9152
+ "A11Y-": "Accessibility"
9153
+ };
9144
9154
  DesignConstraintAdapter = class {
9145
9155
  constructor(store) {
9146
9156
  this.store = store;
@@ -9222,6 +9232,76 @@ ${replyLines.join("\n")}`;
9222
9232
  return "error";
9223
9233
  }
9224
9234
  }
9235
+ /**
9236
+ * Record externally-computed craft findings (audit-component-anatomy,
9237
+ * harness-design-craft, etc.) as graph state. Idempotent — re-running on
9238
+ * the same findings produces no duplicate nodes or edges thanks to
9239
+ * GraphStore's keyed merge semantics.
9240
+ *
9241
+ * Each finding becomes:
9242
+ * • a `design_constraint` node keyed by finding code (created lazily
9243
+ * if absent; metadata merged on re-record so the most recent message
9244
+ * / severity wins)
9245
+ * • a `violates_design` edge from the source file (id = file path) to
9246
+ * the constraint node, with per-finding metadata (line, severity,
9247
+ * message, evidence, runId)
9248
+ *
9249
+ * The file node is NOT created here — it's assumed to already exist in
9250
+ * the graph from a prior ingest. If it does not, the edge will still be
9251
+ * created (graph stores edges by key, not by referential integrity) and
9252
+ * a subsequent ingest will populate the file node.
9253
+ */
9254
+ recordFindings(findings) {
9255
+ let constraintsAdded = 0;
9256
+ let edgesAdded = 0;
9257
+ const seenConstraintIds = /* @__PURE__ */ new Set();
9258
+ for (const finding of findings) {
9259
+ const constraintId = `design_constraint:${finding.code}`;
9260
+ if (!seenConstraintIds.has(finding.code)) {
9261
+ const existing = this.store.getNode(constraintId);
9262
+ if (!existing) constraintsAdded += 1;
9263
+ this.store.addNode({
9264
+ id: constraintId,
9265
+ type: "design_constraint",
9266
+ name: finding.code,
9267
+ metadata: {
9268
+ code: finding.code,
9269
+ label: this.labelForCode(finding.code),
9270
+ mostRecentMessage: finding.message,
9271
+ mostRecentSeverity: finding.severity
9272
+ }
9273
+ });
9274
+ seenConstraintIds.add(finding.code);
9275
+ }
9276
+ const fileId = finding.file;
9277
+ const edgeMetadata = {
9278
+ message: finding.message,
9279
+ severity: finding.severity
9280
+ };
9281
+ if (finding.line !== void 0) edgeMetadata.line = finding.line;
9282
+ if (finding.evidence !== void 0) edgeMetadata.evidence = finding.evidence;
9283
+ if (finding.runId !== void 0) edgeMetadata.runId = finding.runId;
9284
+ const before = this.store.getEdges({
9285
+ from: fileId,
9286
+ to: constraintId,
9287
+ type: "violates_design"
9288
+ });
9289
+ this.store.addEdge({
9290
+ from: fileId,
9291
+ to: constraintId,
9292
+ type: "violates_design",
9293
+ metadata: edgeMetadata
9294
+ });
9295
+ if (before.length === 0) edgesAdded += 1;
9296
+ }
9297
+ return { constraintsAdded, edgesAdded };
9298
+ }
9299
+ labelForCode(code) {
9300
+ for (const prefix of Object.keys(CODE_PREFIX_LABELS)) {
9301
+ if (code.startsWith(prefix)) return CODE_PREFIX_LABELS[prefix];
9302
+ }
9303
+ return "Design constraint";
9304
+ }
9225
9305
  };
9226
9306
  GraphFeedbackAdapter = class {
9227
9307
  constructor(store) {