@harness-engineering/cli 2.6.1 → 2.7.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 (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 +244 -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 +244 -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 +244 -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 +244 -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-FKMKH6ZF.js} +4 -4
  102. package/dist/{analyzer-VY6DJVOU-4AHIJLNS.js → analyzer-H3AHBFSL-KPOPJYRB.js} +8 -8
  103. package/dist/{architecture-CXAVNB5X.js → architecture-LUR2I67H.js} +6 -6
  104. package/dist/{assess-project-M626SSPN.js → assess-project-OJWECOP2.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-HS5KYLRO.js} +5 -5
  108. package/dist/{chunk-5XLLIYYL.js → chunk-6UHDQP2N.js} +1 -1
  109. package/dist/{chunk-I6K43QQS.js → chunk-7AF6C5GE.js} +3 -3
  110. package/dist/{chunk-372MGNTI.js → chunk-7PLIWP7U.js} +6899 -133
  111. package/dist/{chunk-VUCGB2KH.js → chunk-B2VAYLYI.js} +1 -1
  112. package/dist/{chunk-HFOB2MPQ.js → chunk-CZPOPMMI.js} +3 -3
  113. package/dist/{chunk-43M3RLFQ.js → chunk-FC4JPM6W.js} +2 -2
  114. package/dist/{chunk-6AX6R3LM.js → chunk-FEKBXX2J.js} +9 -9
  115. package/dist/{chunk-VTTNIZJL.js → chunk-FXZI6NJ2.js} +131 -6
  116. package/dist/{chunk-5JNSFYZU.js → chunk-GGSNWH7P.js} +6 -6
  117. package/dist/{chunk-BCFDGOMA.js → chunk-H2ZJOJ7A.js} +81 -1
  118. package/dist/{chunk-PFZEADQM.js → chunk-INBTDBV2.js} +79 -2
  119. package/dist/{chunk-Q6ZR2L6Q.js → chunk-KN3EMDZ5.js} +2 -2
  120. package/dist/{chunk-JFZOWO7D.js → chunk-LECXPXS3.js} +1 -1
  121. package/dist/{chunk-CQOMVZDC.js → chunk-LGYXR2KZ.js} +2237 -604
  122. package/dist/{chunk-QOKMDDBJ.js → chunk-LYIPI2SJ.js} +6 -6
  123. package/dist/{chunk-L5BCZ5XS.js → chunk-N5NSSLMU.js} +1 -1
  124. package/dist/{chunk-GWE5LL3R.js → chunk-NIVWM7OW.js} +10 -10
  125. package/dist/{chunk-24KCOJJG.js → chunk-O2ASYKA6.js} +1 -1
  126. package/dist/{chunk-K246XQ2L.js → chunk-PTHX545Q.js} +1 -1
  127. package/dist/{chunk-EPUKTTJZ.js → chunk-RC3OI5NK.js} +5 -1
  128. package/dist/{chunk-YP7I25SL.js → chunk-RJ2WEES5.js} +1 -1
  129. package/dist/{chunk-5FDBXUFW.js → chunk-TIH53QXY.js} +1 -1
  130. package/dist/{chunk-OA6SWTU4.js → chunk-VI4IS55S.js} +11 -8
  131. package/dist/{chunk-GWF2OILZ.js → chunk-VSIRUZQP.js} +1 -1
  132. package/dist/{chunk-YYRQCQPZ.js → chunk-WZY5U6NS.js} +178 -109
  133. package/dist/{chunk-SZEFU6XC.js → chunk-Y4T6ENKQ.js} +9 -9
  134. package/dist/{chunk-HMW3VKUF.js → chunk-Z3TMCCZB.js} +10 -10
  135. package/dist/{ci-workflow-3JNDZQYD.js → ci-workflow-MDSTHJOY.js} +4 -4
  136. package/dist/{dist-OHDQBTSO.js → dist-72ID44UE.js} +3 -3
  137. package/dist/{dist-QPWXPCPL.js → dist-R3TOOPJ7.js} +1 -1
  138. package/dist/{docs-5RYMDHN3.js → docs-2RFOJ6XY.js} +6 -6
  139. package/dist/{engine-GKGT5ULT.js → engine-BSFKOGPN.js} +4 -4
  140. package/dist/{entropy-DQTAPSSE.js → entropy-3UX6644G.js} +5 -5
  141. package/dist/{feedback-WH6XPQJS.js → feedback-CVCFYND4.js} +2 -2
  142. package/dist/{generate-agent-definitions-SZA4QIHN.js → generate-agent-definitions-HZ3XENWO.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 +1012 -12
  146. package/dist/index.js +27 -27
  147. package/dist/{loader-BNKGM23C.js → loader-6RHWU5FH.js} +4 -4
  148. package/dist/{mcp-YKKPWUMH.js → mcp-OYR26JDI.js} +17 -17
  149. package/dist/{performance-54TMJOEU.js → performance-JJMIRXCH.js} +6 -6
  150. package/dist/{review-pipeline-OTDDVPNY.js → review-pipeline-BHQZIXWZ.js} +4 -4
  151. package/dist/{runtime-W5THSNAL.js → runtime-DALTAVTN.js} +4 -4
  152. package/dist/{scan-4PPP6ZXT.js → scan-LYKLM4EQ.js} +1 -1
  153. package/dist/{security-27HW7CYT.js → security-RMLMYFPB.js} +1 -1
  154. package/dist/{validate-QRVCD4GP.js → validate-R7DZRDFK.js} +5 -5
  155. package/dist/{validate-cross-check-BUAGBAPO.js → validate-cross-check-AUUZFNVL.js} +4 -4
  156. package/package.json +8 -7
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-YYRQCQPZ.js";
3
+ } from "./chunk-WZY5U6NS.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -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-72ID44UE.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-72ID44UE.js");
118
118
  const projectRoot = sanitizePath(input.path);
119
119
  const manager = new core.SecurityTimelineManager(projectRoot);
120
120
  const trendOptions = {};
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveConfig
3
- } from "./chunk-VTTNIZJL.js";
3
+ } from "./chunk-FXZI6NJ2.js";
4
4
  import {
5
5
  logger
6
6
  } from "./chunk-EBJQ6N4M.js";
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-3WGJMBKH.js";
10
10
  import {
11
11
  init_dist
12
- } from "./chunk-YYRQCQPZ.js";
12
+ } from "./chunk-WZY5U6NS.js";
13
13
  import {
14
14
  Ok
15
15
  } from "./chunk-OH3NXXUY.js";
@@ -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-FXZI6NJ2.js";
11
11
  import {
12
12
  init_dist
13
- } from "./chunk-YYRQCQPZ.js";
13
+ } from "./chunk-WZY5U6NS.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-72ID44UE.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-72ID44UE.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-72ID44UE.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-72ID44UE.js");
180
180
  const resolver = new CriticalPathResolver(sanitizePath(input.path));
181
181
  const result = await resolver.resolve();
182
182
  return resultToMcpResponse(Ok(result));
@@ -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-WZY5U6NS.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";
@@ -29,6 +29,7 @@ import * as path from "path";
29
29
  init_dist2();
30
30
  init_dist();
31
31
  import { z } from "zod";
32
+ import { BackendDefSchema, RoutingConfigSchema } from "@harness-engineering/orchestrator";
32
33
  var LayerSchema = z.object({
33
34
  /** Human-readable name of the layer */
34
35
  name: z.string(),
@@ -55,7 +56,21 @@ var AgentConfigSchema = z.object({
55
56
  /** Maximum execution time in milliseconds */
56
57
  timeout: z.number().default(3e5),
57
58
  /** Optional list of skill IDs pre-authorized for the agent */
58
- skills: z.array(z.string()).optional()
59
+ skills: z.array(z.string()).optional(),
60
+ /**
61
+ * Named backend definitions (Spec 2 — multi-backend routing).
62
+ *
63
+ * Each entry maps a backend name (chosen by the project) to a backend
64
+ * type plus its connection details (model, endpoint, apiKey, etc.).
65
+ * Referenced from `craft.llm.backend`, from orchestrator routing rules,
66
+ * and from any future subsystem that needs a configured LLM backend.
67
+ *
68
+ * Schema is re-exported from @harness-engineering/orchestrator so this
69
+ * file and the orchestrator runtime validate against the same source.
70
+ */
71
+ backends: z.record(z.string(), BackendDefSchema).optional(),
72
+ /** Routing rules for orchestrator agent dispatch. */
73
+ routing: RoutingConfigSchema.optional()
59
74
  });
60
75
  var EntropyConfigSchema = z.object({
61
76
  /** Explicit entry points for reachability analysis (overrides auto-detection) */
@@ -99,6 +114,86 @@ var PerformanceConfigSchema = z.object({
99
114
  /** Size budget for bundles or directories */
100
115
  sizeBudget: z.record(z.unknown()).optional()
101
116
  }).passthrough();
117
+ var ComponentAnatomyAuditConfigSchema = z.object({
118
+ /** Gate for the entire audit AND the harness-accessibility deferral */
119
+ enabled: z.boolean().default(true),
120
+ /** "default" or a path to a project-supplied override catalog */
121
+ catalog: z.string().default("default"),
122
+ /** "all", "none", or an explicit list of pattern codes (e.g. ["ANAT-P001"]) */
123
+ patterns: z.union([z.literal("all"), z.literal("none"), z.array(z.string())]).default("all"),
124
+ /** Fast-mode controls (validate-time scope cap + pattern opt-in) */
125
+ fastMode: z.object({
126
+ /** Whether validate-time runs pattern queries (default false — patterns are full-mode only) */
127
+ patterns: z.boolean().default(false),
128
+ /** Cap to keep validate fast on large repos */
129
+ maxFiles: z.number().int().positive().default(500)
130
+ }).default({})
131
+ });
132
+ var DriftDetectionConfigSchema = z.object({
133
+ /** Gate for the entire drift verifier */
134
+ enabled: z.boolean().default(true),
135
+ /** Rule toggles — defaults align with v1 scope (T* + P*) */
136
+ rules: z.object({
137
+ /** Token bypass rules (DRIFT-T001-T004). Default: true. */
138
+ tokenBypass: z.boolean().default(true),
139
+ /** Primitive adoption rules (DRIFT-P001-P004). Default: true. */
140
+ primitiveAdoption: z.boolean().default(true)
141
+ }).default({}),
142
+ /** Fast-mode controls (validate-time scope cap) */
143
+ fastMode: z.object({
144
+ /** Cap to keep validate fast on large repos */
145
+ maxFiles: z.number().int().positive().default(500)
146
+ }).default({})
147
+ });
148
+ var BrandComplianceConfigSchema = z.object({
149
+ /** Gate for the entire brand verifier */
150
+ enabled: z.boolean().default(true),
151
+ /** Rule toggles — defaults align with v1 scope (BRAND-T* + BRAND-V001) */
152
+ rules: z.object({
153
+ /** Token-misuse rules (BRAND-T001 via $extensions.harness.brand.forbidden_contexts). Default: true. */
154
+ tokenMisuse: z.boolean().default(true),
155
+ /** Voice rule (BRAND-V001 forbidden phrases in JSX text + string attributes). Default: true. */
156
+ voice: z.boolean().default(true)
157
+ }).default({}),
158
+ /** Fast-mode controls (validate-time scope cap) */
159
+ fastMode: z.object({
160
+ maxFiles: z.number().int().positive().default(500)
161
+ }).default({})
162
+ });
163
+ var DesignAuditConfigSchema = z.object({
164
+ /** Component-anatomy audit (design-pipeline #2) */
165
+ componentAnatomy: ComponentAnatomyAuditConfigSchema.optional(),
166
+ /** Design-system drift detection (design-pipeline #1, detect half) */
167
+ driftDetection: DriftDetectionConfigSchema.optional(),
168
+ /** Brand-compliance audit (design-pipeline #3) */
169
+ brandCompliance: BrandComplianceConfigSchema.optional()
170
+ });
171
+ var DesignCraftConfigSchema = z.object({
172
+ /** Gate for the entire skill AND the harness-design overlap deferral */
173
+ enabled: z.boolean().default(true),
174
+ /** Default invocation mode — "fast" (code-only LLM) or "deep" (rendered + vision-LLM) */
175
+ mode: z.enum(["fast", "deep"]).default("fast"),
176
+ /** B' detect-and-offer behavior when preconditions missing */
177
+ autoCapture: z.enum(["prompt", "auto", "skip"]).default("prompt"),
178
+ /** LLM provider configuration */
179
+ llm: z.object({
180
+ provider: z.string().default("anthropic"),
181
+ model: z.string().default("claude-sonnet-4-6"),
182
+ visionModel: z.string().optional()
183
+ }).optional(),
184
+ /** Catalog scoping */
185
+ catalog: z.object({
186
+ path: z.string().default("default"),
187
+ rubrics: z.union([z.literal("all"), z.literal("none"), z.array(z.string())]).default("all"),
188
+ patterns: z.union([z.literal("all"), z.literal("none"), z.array(z.string())]).default("all"),
189
+ exemplars: z.union([z.literal("all"), z.literal("none"), z.array(z.string())]).default("all")
190
+ }).optional(),
191
+ /** Signal feedback loop (CRITIQUE recurrence → pattern proposal) */
192
+ signal: z.object({
193
+ /** N=5 by default — emit candidate pattern proposal after this many recurrences */
194
+ proposalThreshold: z.number().int().positive().default(5)
195
+ }).optional()
196
+ });
102
197
  var DesignConfigSchema = z.object({
103
198
  /**
104
199
  * Whether design-system tooling is enabled for this project. Set during init.
@@ -113,7 +208,17 @@ var DesignConfigSchema = z.object({
113
208
  /** Path to design tokens (e.g. JSON or CSS) */
114
209
  tokenPath: z.string().optional(),
115
210
  /** Brief description of the intended aesthetic direction */
116
- aestheticIntent: z.string().optional()
211
+ aestheticIntent: z.string().optional(),
212
+ /**
213
+ * Design-pipeline audit configuration (rule-based floor layer).
214
+ * Omit to use built-in defaults.
215
+ */
216
+ audit: DesignAuditConfigSchema.optional(),
217
+ /**
218
+ * Design-craft configuration (LLM-judgment ceiling layer, design-pipeline #6).
219
+ * Omit to use built-in defaults.
220
+ */
221
+ craft: DesignCraftConfigSchema.optional()
117
222
  }).superRefine((value, ctx) => {
118
223
  if (value.enabled === true && (!value.platforms || value.platforms.length === 0)) {
119
224
  ctx.addIssue({
@@ -261,6 +366,24 @@ var ComplianceConfigSchema = z.object({
261
366
  /** Branch naming convention settings */
262
367
  branching: BranchingConfigSchema.default({})
263
368
  });
369
+ var CraftConfigSchema = z.object({
370
+ llm: z.object({
371
+ /**
372
+ * Name of an entry in `agent.backends` to route craft LLM calls
373
+ * through. Supported backend types: claude, anthropic, openai,
374
+ * local, pi, mock. (gemini is declared in agent.backends but is
375
+ * not yet wired through the craft adapter.)
376
+ */
377
+ backend: z.string().optional(),
378
+ /**
379
+ * Special-case mode that doesn't correspond to a backend def.
380
+ * - `in-session` — defer prompts to the calling chat session
381
+ * via the two-step MCP flow (collect → finalize).
382
+ * - `mock` — deterministic mock provider, for tests / smoke runs.
383
+ */
384
+ mode: z.enum(["in-session", "mock"]).optional()
385
+ }).optional()
386
+ });
264
387
  var HarnessConfigSchema = z.object({
265
388
  /** Configuration schema version */
266
389
  version: z.literal(1),
@@ -312,6 +435,8 @@ var HarnessConfigSchema = z.object({
312
435
  phaseGates: PhaseGatesConfigSchema.optional(),
313
436
  /** Design system consistency settings */
314
437
  design: DesignConfigSchema.optional(),
438
+ /** Shared configuration for craft-pipeline ceiling skills (LLM-judgment) */
439
+ craft: CraftConfigSchema.optional(),
315
440
  /** Internationalization (i18n) settings */
316
441
  i18n: I18nConfigSchema.optional(),
317
442
  /** Code review settings */
@@ -363,7 +488,7 @@ var HarnessConfigSchema = z.object({
363
488
  connectors: z.record(z.string(), z.record(z.string(), z.unknown())).default({})
364
489
  }).optional(),
365
490
  /**
366
- * Hermes Phase 2 — Disk-hygiene rules consumed by `harness cleanup-sessions --all`.
491
+ * Disk-hygiene rules consumed by `harness cleanup-sessions --all`.
367
492
  * Keys correspond to registered target names (sessions, cache, maintenance,
368
493
  * dashboard-state, snapshots, analyzer-output); values override the default
369
494
  * TTL in hours. Unknown keys are ignored (forward-compatible).
@@ -372,7 +497,7 @@ var HarnessConfigSchema = z.object({
372
497
  ttlHours: z.record(z.string(), z.number().positive()).optional()
373
498
  }).optional(),
374
499
  /**
375
- * Hermes Phase 2 — Pre-launch OSV malware guard configuration.
500
+ * Pre-launch OSV malware guard configuration.
376
501
  * `enabled: false` disables the guard; `strict: true` reverses the default
377
502
  * fail-open posture on OSV.dev network errors.
378
503
  */
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  resolveProjectConfig
3
- } from "./chunk-GWF2OILZ.js";
3
+ } from "./chunk-VSIRUZQP.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-72ID44UE.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) {
@@ -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) {
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  listPersonas,
6
6
  loadPersona
7
- } from "./chunk-K246XQ2L.js";
7
+ } from "./chunk-PTHX545Q.js";
8
8
  import {
9
9
  GENERATED_HEADER_AGENT,
10
10
  VALID_PLATFORMS,
@@ -223,6 +223,78 @@ function renderCursorAgent(def) {
223
223
  return lines.join("\n");
224
224
  }
225
225
 
226
+ // src/agent-definitions/render-codex.ts
227
+ function tomlBasicString(value) {
228
+ const escaped = value.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, " ").replace(/\r/g, "").replace(/\t/g, " ");
229
+ return `"${escaped}"`;
230
+ }
231
+ function tomlMultilineString(value) {
232
+ if (!value.includes("'''")) {
233
+ return `'''
234
+ ${value}
235
+ '''`;
236
+ }
237
+ const escaped = value.replace(/\\/g, "\\\\").replace(
238
+ /"{3,}/g,
239
+ (run) => run.split("").map((ch) => `\\${ch}`).join("")
240
+ );
241
+ return `"""
242
+ ${escaped}
243
+ """`;
244
+ }
245
+ function formatStep4(step, index) {
246
+ if ("command" in step && step.command) {
247
+ const cmd = step.command;
248
+ const when = step.when ?? "always";
249
+ return `${index + 1}. Run \`harness ${cmd}\` (${when})`;
250
+ }
251
+ if ("skill" in step && step.skill) {
252
+ const skill = step.skill;
253
+ const when = step.when ?? "always";
254
+ return `${index + 1}. Execute ${skill} skill (${when})`;
255
+ }
256
+ return `${index + 1}. Unknown step`;
257
+ }
258
+ function buildInstructionsBody(def) {
259
+ const sections = [];
260
+ sections.push("## Role");
261
+ sections.push("");
262
+ sections.push(def.role);
263
+ if (def.skills.length > 0) {
264
+ sections.push("");
265
+ sections.push("## Skills");
266
+ sections.push("");
267
+ for (const skill of def.skills) {
268
+ sections.push(`- ${skill}`);
269
+ }
270
+ }
271
+ if (def.steps.length > 0) {
272
+ sections.push("");
273
+ sections.push("## Steps");
274
+ sections.push("");
275
+ def.steps.forEach((step, i) => {
276
+ sections.push(formatStep4(step, i));
277
+ });
278
+ }
279
+ if (def.methodology) {
280
+ sections.push("");
281
+ sections.push("## Methodology");
282
+ sections.push("");
283
+ sections.push(def.methodology);
284
+ }
285
+ return sections.join("\n");
286
+ }
287
+ function renderCodexAgent(def) {
288
+ const lines = [];
289
+ lines.push(`# ${GENERATED_HEADER_AGENT}`);
290
+ lines.push("");
291
+ lines.push(`name = ${tomlBasicString(def.name)}`);
292
+ lines.push(`description = ${tomlBasicString(def.description)}`);
293
+ lines.push(`developer_instructions = ${tomlMultilineString(buildInstructionsBody(def))}`);
294
+ lines.push("");
295
+ return lines.join("\n");
296
+ }
297
+
226
298
  // src/commands/generate-agent-definitions.ts
227
299
  function resolveOutputDir(platform, opts) {
228
300
  if (opts.output) {
@@ -246,8 +318,13 @@ function loadSkillContent(skillName) {
246
318
  function getRenderer(platform) {
247
319
  if (platform === "claude-code") return renderClaudeCodeAgent;
248
320
  if (platform === "cursor") return renderCursorAgent;
321
+ if (platform === "codex") return renderCodexAgent;
249
322
  return renderGeminiAgent;
250
323
  }
324
+ function agentFilename(platform, name) {
325
+ if (platform === "codex") return `${name}.toml`;
326
+ return `${name}.md`;
327
+ }
251
328
  function generateAgentDefinitions(opts) {
252
329
  const personasDir = resolvePersonasDir();
253
330
  const personaList = listPersonas(personasDir);
@@ -268,7 +345,7 @@ function generateAgentDefinitions(opts) {
268
345
  const renderer = getRenderer(platform);
269
346
  const rendered = /* @__PURE__ */ new Map();
270
347
  for (const def of definitions) {
271
- const filename = `${def.name}.md`;
348
+ const filename = agentFilename(platform, def.name);
272
349
  rendered.set(filename, renderer(def));
273
350
  }
274
351
  const plan = computeSyncPlan(outputDir, rendered);
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  init_dist,
6
6
  paginate
7
- } from "./chunk-YYRQCQPZ.js";
7
+ } from "./chunk-WZY5U6NS.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-OHDQBTSO.js");
82
+ const { parseDiff, runReviewPipeline } = await import("./dist-72ID44UE.js");
83
83
  const parseResult = parseDiff(input.diff);
84
84
  if (!parseResult.ok) {
85
85
  return {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-YYRQCQPZ.js";
3
+ } from "./chunk-WZY5U6NS.js";
4
4
  import {
5
5
  Err,
6
6
  Ok