@harness-engineering/cli 2.5.0 → 2.6.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 (51) hide show
  1. package/dist/{agents-md-KAD3L2NO.js → agents-md-2JUQ4FE2.js} +4 -4
  2. package/dist/{analyzer-VY6DJVOU-NI56JRFK.js → analyzer-VY6DJVOU-4AHIJLNS.js} +2 -2
  3. package/dist/{architecture-OC7TFCFF.js → architecture-CXAVNB5X.js} +5 -5
  4. package/dist/{assess-project-ZGMRPTS3.js → assess-project-M626SSPN.js} +1 -1
  5. package/dist/bin/harness-mcp.js +15 -15
  6. package/dist/bin/harness.js +24 -24
  7. package/dist/{check-phase-gate-PD5MVEZT.js → check-phase-gate-XMU6LLUQ.js} +5 -5
  8. package/dist/{chunk-N6VWCISQ.js → chunk-24KCOJJG.js} +2 -2
  9. package/dist/{chunk-LT244Y6E.js → chunk-372MGNTI.js} +207 -76
  10. package/dist/{chunk-XIW24BJY.js → chunk-43M3RLFQ.js} +3 -3
  11. package/dist/{chunk-2RNGLYOG.js → chunk-5JNSFYZU.js} +2 -2
  12. package/dist/{chunk-XSI3RDH6.js → chunk-6AX6R3LM.js} +7 -7
  13. package/dist/{chunk-UCL3UZIC.js → chunk-CQOMVZDC.js} +1588 -925
  14. package/dist/{chunk-DOUS4ULX.js → chunk-GWE5LL3R.js} +6 -6
  15. package/dist/{chunk-7DOGGXQU.js → chunk-GWF2OILZ.js} +2 -2
  16. package/dist/{chunk-TCSNO7YW.js → chunk-HFOB2MPQ.js} +2 -2
  17. package/dist/{chunk-6SRKI77C.js → chunk-HMW3VKUF.js} +3 -3
  18. package/dist/{chunk-NOOPJD5R.js → chunk-I6K43QQS.js} +3 -3
  19. package/dist/{chunk-IGBQIXPS.js → chunk-JFZOWO7D.js} +2 -2
  20. package/dist/{chunk-57TS3UGN.js → chunk-K246XQ2L.js} +2 -2
  21. package/dist/{chunk-A3EBWI7U.js → chunk-L5BCZ5XS.js} +2 -2
  22. package/dist/{chunk-65MJPWFN.js → chunk-OA6SWTU4.js} +6 -6
  23. package/dist/{chunk-2LPUIBVH.js → chunk-OH3NXXUY.js} +121 -2
  24. package/dist/{chunk-4CWFVEVV.js → chunk-PFZEADQM.js} +1 -1
  25. package/dist/{chunk-JE5GQVCQ.js → chunk-Q6ZR2L6Q.js} +2 -2
  26. package/dist/{chunk-UF7BKRH4.js → chunk-QOKMDDBJ.js} +4 -4
  27. package/dist/{chunk-IWRYCUDO.js → chunk-SZEFU6XC.js} +1 -1
  28. package/dist/{chunk-HIZXUWWC.js → chunk-VTTNIZJL.js} +21 -2
  29. package/dist/{chunk-IXKGMPMT.js → chunk-VUCGB2KH.js} +4 -2
  30. package/dist/{chunk-ELMV6QU2.js → chunk-YP7I25SL.js} +2 -2
  31. package/dist/{chunk-KQ6TDRPS.js → chunk-YYRQCQPZ.js} +425 -173
  32. package/dist/{ci-workflow-WAG4TOV6.js → ci-workflow-3JNDZQYD.js} +4 -4
  33. package/dist/{dist-HVJUGPSY.js → dist-E3SAAHCM.js} +23 -1
  34. package/dist/{dist-TKHVYUWZ.js → dist-OHDQBTSO.js} +43 -3
  35. package/dist/{docs-4WPBYSCF.js → docs-5RYMDHN3.js} +5 -5
  36. package/dist/{engine-5BXDQT5T.js → engine-GKGT5ULT.js} +4 -4
  37. package/dist/{entropy-7FIUFACI.js → entropy-DQTAPSSE.js} +4 -4
  38. package/dist/{feedback-ER2HRTFD.js → feedback-WH6XPQJS.js} +1 -1
  39. package/dist/{generate-agent-definitions-5PV4O3BD.js → generate-agent-definitions-SZA4QIHN.js} +5 -5
  40. package/dist/index.d.ts +47 -0
  41. package/dist/index.js +24 -24
  42. package/dist/{loader-6RTEYN5Q.js → loader-BNKGM23C.js} +4 -4
  43. package/dist/{mcp-QWSDEYMN.js → mcp-YKKPWUMH.js} +15 -15
  44. package/dist/{performance-AZJAT35R.js → performance-54TMJOEU.js} +5 -5
  45. package/dist/{review-pipeline-4VF73V4V.js → review-pipeline-OTDDVPNY.js} +4 -4
  46. package/dist/{runtime-SAZGLILX.js → runtime-W5THSNAL.js} +4 -4
  47. package/dist/{security-ZWRABJNE.js → security-27HW7CYT.js} +1 -1
  48. package/dist/{tool-tiers-LTQNNAFU.js → tool-tiers-B7JC2XC3.js} +3 -1
  49. package/dist/{validate-AFJVI4OX.js → validate-QRVCD4GP.js} +5 -5
  50. package/dist/{validate-cross-check-7PO7CBVT.js → validate-cross-check-BUAGBAPO.js} +4 -4
  51. package/package.json +7 -7
@@ -7,13 +7,13 @@ import {
7
7
  import {
8
8
  findConfigFile,
9
9
  loadConfig
10
- } from "./chunk-HIZXUWWC.js";
10
+ } from "./chunk-VTTNIZJL.js";
11
11
  import {
12
12
  init_dist
13
- } from "./chunk-KQ6TDRPS.js";
13
+ } from "./chunk-YYRQCQPZ.js";
14
14
  import {
15
15
  Ok
16
- } from "./chunk-2LPUIBVH.js";
16
+ } from "./chunk-OH3NXXUY.js";
17
17
 
18
18
  // src/mcp/tools/docs.ts
19
19
  init_dist();
@@ -50,12 +50,12 @@ async function handleCheckDocs(input) {
50
50
  const projectPath = sanitizePath(input.path);
51
51
  const scope = input.scope ?? "coverage";
52
52
  if (scope === "integrity") {
53
- const { validateKnowledgeMap } = await import("./dist-TKHVYUWZ.js");
53
+ const { validateKnowledgeMap } = await import("./dist-OHDQBTSO.js");
54
54
  const result2 = await validateKnowledgeMap(projectPath);
55
55
  return resultToMcpResponse(result2);
56
56
  }
57
57
  if (scope === "all") {
58
- const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-TKHVYUWZ.js");
58
+ const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-OHDQBTSO.js");
59
59
  const domain2 = input.domain ?? "src";
60
60
  const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-EQBOIHFZ.js");
61
61
  const store2 = await loadGraphStore2(projectPath);
@@ -94,7 +94,7 @@ async function handleCheckDocs(input) {
94
94
  }
95
95
  return resultToMcpResponse(Ok({ coverage, integrity }));
96
96
  }
97
- const { checkDocCoverage } = await import("./dist-TKHVYUWZ.js");
97
+ const { checkDocCoverage } = await import("./dist-OHDQBTSO.js");
98
98
  const domain = input.domain ?? "src";
99
99
  const { loadGraphStore } = await import("./graph-loader-EQBOIHFZ.js");
100
100
  const store = await loadGraphStore(projectPath);
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-KQ6TDRPS.js";
3
+ } from "./chunk-YYRQCQPZ.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
7
- } from "./chunk-2LPUIBVH.js";
7
+ } from "./chunk-OH3NXXUY.js";
8
8
 
9
9
  // src/mcp/utils/config-resolver.ts
10
10
  init_dist();
@@ -27,7 +27,7 @@ var runSecurityScanDefinition = {
27
27
  };
28
28
  async function handleRunSecurityScan(input) {
29
29
  try {
30
- const core = await import("./dist-TKHVYUWZ.js");
30
+ const core = await import("./dist-OHDQBTSO.js");
31
31
  const projectRoot = sanitizePath(input.path);
32
32
  let configData = {};
33
33
  try {
@@ -114,7 +114,7 @@ var getSecurityTrendsDefinition = {
114
114
  };
115
115
  async function handleGetSecurityTrends(input) {
116
116
  try {
117
- const core = await import("./dist-TKHVYUWZ.js");
117
+ const core = await import("./dist-OHDQBTSO.js");
118
118
  const projectRoot = sanitizePath(input.path);
119
119
  const manager = new core.SecurityTimelineManager(projectRoot);
120
120
  const trendOptions = {};
@@ -33,7 +33,7 @@ var createSelfReviewDefinition = {
33
33
  };
34
34
  async function handleCreateSelfReview(input) {
35
35
  try {
36
- const { parseDiff, createSelfReview } = await import("./dist-TKHVYUWZ.js");
36
+ const { parseDiff, createSelfReview } = await import("./dist-OHDQBTSO.js");
37
37
  const parseResult = parseDiff(input.diff);
38
38
  if (!parseResult.ok) {
39
39
  return resultToMcpResponse(parseResult);
@@ -119,7 +119,7 @@ var analyzeDiffDefinition = {
119
119
  };
120
120
  async function handleAnalyzeDiff(input) {
121
121
  try {
122
- const { parseDiff, analyzeDiff } = await import("./dist-TKHVYUWZ.js");
122
+ const { parseDiff, analyzeDiff } = await import("./dist-OHDQBTSO.js");
123
123
  const parseResult = parseDiff(input.diff);
124
124
  if (!parseResult.ok) {
125
125
  return resultToMcpResponse(parseResult);
@@ -195,7 +195,7 @@ var requestPeerReviewDefinition = {
195
195
  };
196
196
  async function handleRequestPeerReview(input) {
197
197
  try {
198
- const { parseDiff, requestPeerReview } = await import("./dist-TKHVYUWZ.js");
198
+ const { parseDiff, requestPeerReview } = await import("./dist-OHDQBTSO.js");
199
199
  const parseResult = parseDiff(input.diff);
200
200
  if (!parseResult.ok) {
201
201
  return resultToMcpResponse(parseResult);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveProjectConfig
3
- } from "./chunk-7DOGGXQU.js";
3
+ } from "./chunk-GWF2OILZ.js";
4
4
  import {
5
5
  sanitizePath
6
6
  } from "./chunk-W6Y7ZW3Y.js";
@@ -49,7 +49,7 @@ async function handleValidateProject(input) {
49
49
  checks.config = "pass";
50
50
  const config = configResult.value;
51
51
  try {
52
- const core = await import("./dist-TKHVYUWZ.js");
52
+ const core = await import("./dist-OHDQBTSO.js");
53
53
  if (typeof core.validateFileStructure === "function" && Array.isArray(config.conventions)) {
54
54
  const conventions = config.conventions;
55
55
  const structureResult = await core.validateFileStructure(projectPath, conventions);
@@ -68,7 +68,7 @@ async function handleValidateProject(input) {
68
68
  } catch {
69
69
  }
70
70
  try {
71
- const core = await import("./dist-TKHVYUWZ.js");
71
+ const core = await import("./dist-OHDQBTSO.js");
72
72
  if (typeof core.validateAgentsMap === "function") {
73
73
  const agentsMapPath = path.join(projectPath, "AGENTS.md");
74
74
  const agentsResult = await core.validateAgentsMap(agentsMapPath);
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-KQ6TDRPS.js";
3
+ } from "./chunk-YYRQCQPZ.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
7
- } from "./chunk-2LPUIBVH.js";
7
+ } from "./chunk-OH3NXXUY.js";
8
8
 
9
9
  // src/persona/generators/agents-md.ts
10
10
  init_dist();
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-KQ6TDRPS.js";
3
+ } from "./chunk-YYRQCQPZ.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
7
- } from "./chunk-2LPUIBVH.js";
7
+ } from "./chunk-OH3NXXUY.js";
8
8
 
9
9
  // src/persona/loader.ts
10
10
  init_dist();
@@ -3,11 +3,11 @@ import {
3
3
  } from "./chunk-KET4QQZB.js";
4
4
  import {
5
5
  init_dist
6
- } from "./chunk-KQ6TDRPS.js";
6
+ } from "./chunk-YYRQCQPZ.js";
7
7
  import {
8
8
  Err,
9
9
  Ok
10
- } from "./chunk-2LPUIBVH.js";
10
+ } from "./chunk-OH3NXXUY.js";
11
11
 
12
12
  // src/persona/generators/runtime.ts
13
13
  init_dist();
@@ -72,7 +72,7 @@ async function handleAssessProject(input) {
72
72
  let validateResult = null;
73
73
  if (checksToRun.has("validate")) {
74
74
  try {
75
- const { handleValidateProject } = await import("./validate-AFJVI4OX.js");
75
+ const { handleValidateProject } = await import("./validate-QRVCD4GP.js");
76
76
  const result = await handleValidateProject({ path: projectPath });
77
77
  const out = parseToolResponse(result, "validate");
78
78
  if ("error" in out) {
@@ -101,7 +101,7 @@ async function handleAssessProject(input) {
101
101
  parallelChecks.push(
102
102
  (async () => {
103
103
  try {
104
- const { handleCheckDependencies } = await import("./architecture-OC7TFCFF.js");
104
+ const { handleCheckDependencies } = await import("./architecture-CXAVNB5X.js");
105
105
  const result = await handleCheckDependencies({ path: projectPath });
106
106
  const out = parseToolResponse(result, "deps");
107
107
  if ("error" in out) return out.error;
@@ -129,7 +129,7 @@ async function handleAssessProject(input) {
129
129
  parallelChecks.push(
130
130
  (async () => {
131
131
  try {
132
- const { handleCheckDocs } = await import("./docs-4WPBYSCF.js");
132
+ const { handleCheckDocs } = await import("./docs-5RYMDHN3.js");
133
133
  const result = await handleCheckDocs({ path: projectPath, scope: "coverage" });
134
134
  const out = parseToolResponse(result, "docs");
135
135
  if ("error" in out) return out.error;
@@ -157,7 +157,7 @@ async function handleAssessProject(input) {
157
157
  parallelChecks.push(
158
158
  (async () => {
159
159
  try {
160
- const { handleDetectEntropy } = await import("./entropy-7FIUFACI.js");
160
+ const { handleDetectEntropy } = await import("./entropy-DQTAPSSE.js");
161
161
  const result = await handleDetectEntropy({ path: projectPath, type: "all" });
162
162
  const out = parseToolResponse(result, "entropy");
163
163
  if ("error" in out) return out.error;
@@ -188,7 +188,7 @@ async function handleAssessProject(input) {
188
188
  parallelChecks.push(
189
189
  (async () => {
190
190
  try {
191
- const { handleRunSecurityScan } = await import("./security-ZWRABJNE.js");
191
+ const { handleRunSecurityScan } = await import("./security-27HW7CYT.js");
192
192
  const result = await handleRunSecurityScan({ path: projectPath });
193
193
  const out = parseToolResponse(result, "security");
194
194
  if ("error" in out) return out.error;
@@ -221,7 +221,7 @@ async function handleAssessProject(input) {
221
221
  parallelChecks.push(
222
222
  (async () => {
223
223
  try {
224
- const { handleCheckPerformance } = await import("./performance-AZJAT35R.js");
224
+ const { handleCheckPerformance } = await import("./performance-54TMJOEU.js");
225
225
  const result = await handleCheckPerformance({ path: projectPath });
226
226
  if ("isError" in result && result.isError) {
227
227
  const msg = result.content[0]?.text ?? "Performance check failed";
@@ -8,6 +8,7 @@ import { z as z2 } from "zod";
8
8
  import { z as z3 } from "zod";
9
9
  import { z as z4 } from "zod";
10
10
  import { z as z5 } from "zod";
11
+ import { z as z6 } from "zod";
11
12
  function Ok(value) {
12
13
  return { ok: true, value };
13
14
  }
@@ -20,7 +21,7 @@ function isOk(result) {
20
21
  function isErr(result) {
21
22
  return result.ok === false;
22
23
  }
23
- var STANDARD_COGNITIVE_MODES, DEFAULT_SKILL_CONTEXT_BUDGET, SESSION_SECTION_NAMES, TrajectoryMetadataSchema, PromptCacheStatsSchema, OTLPKeyValueSchema, OTLPSpanSchema, TokenScopeSchema, BridgeKindSchema, AuthTokenSchema, AuthTokenPublicSchema, AuthAuditEntrySchema, WebhookSubscriptionSchema, WebhookSubscriptionPublicSchema, GatewayEventSchema, WebhookDeliveryStatusSchema, WebhookDeliverySchema, INDEXED_FILE_KINDS, SessionSummarySchema, INSIGHTS_KEYS, SESSIONS_DEFAULTS, NotificationSinkKindSchema, NotificationSeveritySchema, NotificationActionSchema, NotificationEnvelopeSchema, NotificationSinkConfigSchema, NotificationsConfigSchema, NotificationDeliveryResultSchema;
24
+ var STANDARD_COGNITIVE_MODES, DEFAULT_SKILL_CONTEXT_BUDGET, SESSION_SECTION_NAMES, TrajectoryMetadataSchema, PromptCacheStatsSchema, OTLPKeyValueSchema, OTLPSpanSchema, TokenScopeSchema, BridgeKindSchema, AuthTokenSchema, AuthTokenPublicSchema, AuthAuditEntrySchema, WebhookSubscriptionSchema, WebhookSubscriptionPublicSchema, GatewayEventSchema, WebhookDeliveryStatusSchema, WebhookDeliverySchema, INDEXED_FILE_KINDS, SessionSummarySchema, INSIGHTS_KEYS, SESSIONS_DEFAULTS, NotificationSinkKindSchema, NotificationSeveritySchema, NotificationActionSchema, NotificationEnvelopeSchema, NotificationSinkConfigSchema, NotificationsConfigSchema, NotificationDeliveryResultSchema, SkillProvenanceSchema, ProposalKindSchema, ProposalStatusSchema, ProposalGateFindingSchema, ProposalGateSchema, ProposalDecisionSchema, ProposalContentSchema, ProposalSourceSchema, SkillProposalSchema, EmitSkillProposalInputSchema, EditProposalInputSchema;
24
25
  var init_dist = __esm({
25
26
  "../types/dist/index.mjs"() {
26
27
  STANDARD_COGNITIVE_MODES = [
@@ -102,7 +103,8 @@ var init_dist = __esm({
102
103
  "resolve-interaction",
103
104
  "subscribe-webhook",
104
105
  "modify-roadmap",
105
- "read-telemetry"
106
+ "read-telemetry",
107
+ "manage-proposals"
106
108
  ]);
107
109
  BridgeKindSchema = z2.enum(["slack", "discord", "github-app", "custom"]);
108
110
  AuthTokenSchema = z2.object({
@@ -224,6 +226,112 @@ var init_dist = __esm({
224
226
  httpStatus: z5.number().int().optional()
225
227
  })
226
228
  ]);
229
+ SkillProvenanceSchema = z6.enum(["community", "agent-proposed", "user-authored"]);
230
+ ProposalKindSchema = z6.enum(["new-skill", "refinement"]);
231
+ ProposalStatusSchema = z6.enum([
232
+ "open",
233
+ "gate-running",
234
+ "gate-failed",
235
+ "approved",
236
+ "rejected"
237
+ ]);
238
+ ProposalGateFindingSchema = z6.object({
239
+ severity: z6.enum(["error", "warning"]),
240
+ title: z6.string(),
241
+ detail: z6.string()
242
+ });
243
+ ProposalGateSchema = z6.object({
244
+ lastRunAt: z6.string().datetime().optional(),
245
+ findings: z6.array(ProposalGateFindingSchema).optional()
246
+ });
247
+ ProposalDecisionSchema = z6.object({
248
+ decidedAt: z6.string().datetime(),
249
+ decidedBy: z6.string(),
250
+ action: z6.enum(["approved", "rejected"]),
251
+ reason: z6.string().optional()
252
+ });
253
+ ProposalContentSchema = z6.object({
254
+ name: z6.string().regex(/^[a-z][a-z0-9-]*$/).max(64),
255
+ description: z6.string().min(20).max(280),
256
+ skillYaml: z6.string().optional(),
257
+ skillMd: z6.string().optional(),
258
+ diff: z6.string().optional()
259
+ }).strict();
260
+ ProposalSourceSchema = z6.object({
261
+ sessionId: z6.string().optional(),
262
+ taskId: z6.string().optional(),
263
+ justification: z6.string().min(20).max(2e3)
264
+ });
265
+ SkillProposalSchema = z6.object({
266
+ id: z6.string().min(1),
267
+ createdAt: z6.string().datetime(),
268
+ kind: ProposalKindSchema,
269
+ targetSkill: z6.string().optional(),
270
+ proposedBy: z6.string().min(1),
271
+ source: ProposalSourceSchema,
272
+ content: ProposalContentSchema,
273
+ status: ProposalStatusSchema,
274
+ gate: ProposalGateSchema.optional(),
275
+ decision: ProposalDecisionSchema.optional()
276
+ }).superRefine((val, ctx) => {
277
+ if (val.kind === "new-skill") {
278
+ if (!val.content.skillYaml || !val.content.skillMd) {
279
+ ctx.addIssue({
280
+ code: z6.ZodIssueCode.custom,
281
+ path: ["content"],
282
+ message: "new-skill proposals require skillYaml and skillMd"
283
+ });
284
+ }
285
+ if (val.targetSkill) {
286
+ ctx.addIssue({
287
+ code: z6.ZodIssueCode.custom,
288
+ path: ["targetSkill"],
289
+ message: "targetSkill is forbidden on new-skill proposals"
290
+ });
291
+ }
292
+ if (val.content.diff) {
293
+ ctx.addIssue({
294
+ code: z6.ZodIssueCode.custom,
295
+ path: ["content", "diff"],
296
+ message: "diff is forbidden on new-skill proposals"
297
+ });
298
+ }
299
+ } else if (val.kind === "refinement") {
300
+ if (!val.targetSkill) {
301
+ ctx.addIssue({
302
+ code: z6.ZodIssueCode.custom,
303
+ path: ["targetSkill"],
304
+ message: "refinement proposals require targetSkill"
305
+ });
306
+ }
307
+ if (!val.content.diff) {
308
+ ctx.addIssue({
309
+ code: z6.ZodIssueCode.custom,
310
+ path: ["content", "diff"],
311
+ message: "refinement proposals require a unified diff"
312
+ });
313
+ }
314
+ if (val.content.skillYaml || val.content.skillMd) {
315
+ ctx.addIssue({
316
+ code: z6.ZodIssueCode.custom,
317
+ path: ["content"],
318
+ message: "skillYaml/skillMd are forbidden on refinement proposals (use diff)"
319
+ });
320
+ }
321
+ }
322
+ });
323
+ EmitSkillProposalInputSchema = z6.object({
324
+ kind: ProposalKindSchema,
325
+ targetSkill: z6.string().optional(),
326
+ proposedBy: z6.string().min(1).max(120),
327
+ justification: z6.string().min(20).max(2e3),
328
+ sessionId: z6.string().optional(),
329
+ taskId: z6.string().optional(),
330
+ content: ProposalContentSchema
331
+ });
332
+ EditProposalInputSchema = z6.object({
333
+ content: ProposalContentSchema.partial()
334
+ });
227
335
  }
228
336
  });
229
337
 
@@ -260,5 +368,16 @@ export {
260
368
  NotificationSinkConfigSchema,
261
369
  NotificationsConfigSchema,
262
370
  NotificationDeliveryResultSchema,
371
+ SkillProvenanceSchema,
372
+ ProposalKindSchema,
373
+ ProposalStatusSchema,
374
+ ProposalGateFindingSchema,
375
+ ProposalGateSchema,
376
+ ProposalDecisionSchema,
377
+ ProposalContentSchema,
378
+ ProposalSourceSchema,
379
+ SkillProposalSchema,
380
+ EmitSkillProposalInputSchema,
381
+ EditProposalInputSchema,
263
382
  init_dist
264
383
  };
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  listPersonas,
6
6
  loadPersona
7
- } from "./chunk-57TS3UGN.js";
7
+ } from "./chunk-K246XQ2L.js";
8
8
  import {
9
9
  GENERATED_HEADER_AGENT,
10
10
  VALID_PLATFORMS,
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  init_dist,
6
6
  paginate
7
- } from "./chunk-KQ6TDRPS.js";
7
+ } from "./chunk-YYRQCQPZ.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-TKHVYUWZ.js");
82
+ const { parseDiff, runReviewPipeline } = await import("./dist-OHDQBTSO.js");
83
83
  const parseResult = parseDiff(input.diff);
84
84
  if (!parseResult.ok) {
85
85
  return {
@@ -6,10 +6,10 @@ import {
6
6
  } from "./chunk-W6Y7ZW3Y.js";
7
7
  import {
8
8
  init_dist
9
- } from "./chunk-KQ6TDRPS.js";
9
+ } from "./chunk-YYRQCQPZ.js";
10
10
  import {
11
11
  Ok
12
- } from "./chunk-2LPUIBVH.js";
12
+ } from "./chunk-OH3NXXUY.js";
13
13
 
14
14
  // src/mcp/tools/entropy.ts
15
15
  init_dist();
@@ -127,7 +127,7 @@ function buildSummaryResponse(report) {
127
127
  }
128
128
  async function handleDetectEntropy(input) {
129
129
  try {
130
- const { EntropyAnalyzer } = await import("./dist-TKHVYUWZ.js");
130
+ const { EntropyAnalyzer } = await import("./dist-OHDQBTSO.js");
131
131
  const typeFilter = input.type ?? "all";
132
132
  const analyzer = new EntropyAnalyzer({
133
133
  rootDir: sanitizePath(input.path),
@@ -146,7 +146,7 @@ async function handleDetectEntropy(input) {
146
146
  return resultToMcpResponse(result);
147
147
  }
148
148
  if (!result.ok) return resultToMcpResponse(result);
149
- const { createFixes, applyFixes, generateSuggestions } = await import("./dist-TKHVYUWZ.js");
149
+ const { createFixes, applyFixes, generateSuggestions } = await import("./dist-OHDQBTSO.js");
150
150
  const report = result.value;
151
151
  const deadCode = report.deadCode;
152
152
  const fixTypesConfig = input.fixTypes ? { fixTypes: input.fixTypes } : void 0;
@@ -2,7 +2,7 @@ import {
2
2
  Err,
3
3
  Ok,
4
4
  init_dist
5
- } from "./chunk-2LPUIBVH.js";
5
+ } from "./chunk-OH3NXXUY.js";
6
6
  import {
7
7
  DEFAULT_SKIP_DIRS,
8
8
  init_dist as init_dist2,
@@ -7,11 +7,11 @@ import {
7
7
  } from "./chunk-3WGJMBKH.js";
8
8
  import {
9
9
  init_dist as init_dist2
10
- } from "./chunk-KQ6TDRPS.js";
10
+ } from "./chunk-YYRQCQPZ.js";
11
11
  import {
12
12
  Err,
13
13
  Ok
14
- } from "./chunk-2LPUIBVH.js";
14
+ } from "./chunk-OH3NXXUY.js";
15
15
  import {
16
16
  init_dist,
17
17
  skipDirGlobs
@@ -361,6 +361,25 @@ var HarnessConfigSchema = z.object({
361
361
  graph: z.object({
362
362
  /** Per-connector configuration (keyed by connector name: jira, slack, ci, confluence, figma, miro) */
363
363
  connectors: z.record(z.string(), z.record(z.string(), z.unknown())).default({})
364
+ }).optional(),
365
+ /**
366
+ * Hermes Phase 2 — Disk-hygiene rules consumed by `harness cleanup-sessions --all`.
367
+ * Keys correspond to registered target names (sessions, cache, maintenance,
368
+ * dashboard-state, snapshots, analyzer-output); values override the default
369
+ * TTL in hours. Unknown keys are ignored (forward-compatible).
370
+ */
371
+ cleanup: z.object({
372
+ ttlHours: z.record(z.string(), z.number().positive()).optional()
373
+ }).optional(),
374
+ /**
375
+ * Hermes Phase 2 — Pre-launch OSV malware guard configuration.
376
+ * `enabled: false` disables the guard; `strict: true` reverses the default
377
+ * fail-open posture on OSV.dev network errors.
378
+ */
379
+ osvGuard: z.object({
380
+ enabled: z.boolean().default(true),
381
+ strict: z.boolean().default(false),
382
+ cacheTtlHours: z.number().positive().default(24)
364
383
  }).optional()
365
384
  });
366
385
 
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-KQ6TDRPS.js";
3
+ } from "./chunk-YYRQCQPZ.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
7
- } from "./chunk-2LPUIBVH.js";
7
+ } from "./chunk-OH3NXXUY.js";
8
8
 
9
9
  // src/templates/engine.ts
10
10
  init_dist();
@@ -93,6 +93,7 @@ var NON_JSON_PACKAGE_CONFIGS = /* @__PURE__ */ new Set([
93
93
  "build.gradle.kts"
94
94
  ]);
95
95
  var HARNESS_CONFIG_FILES = /* @__PURE__ */ new Set(["harness.config.json", "AGENTS.md", ".harness/.gitignore"]);
96
+ var IGNORED_TEMPLATE_FILES = /* @__PURE__ */ new Set([".DS_Store", "Thumbs.db", "desktop.ini"]);
96
97
  function isHarnessConfigFile(relativePath) {
97
98
  return HARNESS_CONFIG_FILES.has(relativePath);
98
99
  }
@@ -372,6 +373,7 @@ var TemplateEngine = class {
372
373
  const walk = (currentDir) => {
373
374
  const entries = fs.readdirSync(currentDir, { withFileTypes: true });
374
375
  for (const entry of entries) {
376
+ if (IGNORED_TEMPLATE_FILES.has(entry.name)) continue;
375
377
  const fullPath = path.join(currentDir, entry.name);
376
378
  if (entry.isDirectory()) {
377
379
  walk(fullPath);
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-KQ6TDRPS.js";
3
+ } from "./chunk-YYRQCQPZ.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
7
- } from "./chunk-2LPUIBVH.js";
7
+ } from "./chunk-OH3NXXUY.js";
8
8
 
9
9
  // src/persona/generators/ci-workflow.ts
10
10
  init_dist();