rulesync 7.13.0 → 7.15.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.
@@ -19,7 +19,9 @@ function formatError(error) {
19
19
  import { consola } from "consola";
20
20
 
21
21
  // src/utils/vitest.ts
22
- var isEnvTest = process.env.NODE_ENV === "test";
22
+ function isEnvTest() {
23
+ return process.env.NODE_ENV === "test";
24
+ }
23
25
 
24
26
  // src/utils/logger.ts
25
27
  var Logger = class {
@@ -49,27 +51,27 @@ var Logger = class {
49
51
  return this._silent;
50
52
  }
51
53
  info(message, ...args) {
52
- if (isEnvTest || this._silent) return;
54
+ if (isEnvTest() || this._silent) return;
53
55
  this.console.info(message, ...args);
54
56
  }
55
57
  // Success (always shown unless silent)
56
58
  success(message, ...args) {
57
- if (isEnvTest || this._silent) return;
59
+ if (isEnvTest() || this._silent) return;
58
60
  this.console.success(message, ...args);
59
61
  }
60
62
  // Warning (always shown unless silent)
61
63
  warn(message, ...args) {
62
- if (isEnvTest || this._silent) return;
64
+ if (isEnvTest() || this._silent) return;
63
65
  this.console.warn(message, ...args);
64
66
  }
65
67
  // Error (always shown, even in silent mode)
66
68
  error(message, ...args) {
67
- if (isEnvTest) return;
69
+ if (isEnvTest()) return;
68
70
  this.console.error(message, ...args);
69
71
  }
70
72
  // Debug level (shown only in verbose mode)
71
73
  debug(message, ...args) {
72
- if (isEnvTest || this._silent) return;
74
+ if (isEnvTest() || this._silent) return;
73
75
  if (this._verbose) {
74
76
  this.console.info(message, ...args);
75
77
  }
@@ -159,7 +161,7 @@ var MAX_FILE_SIZE = 10 * 1024 * 1024;
159
161
  var FETCH_CONCURRENCY_LIMIT = 10;
160
162
 
161
163
  // src/utils/file.ts
162
- import { mkdir, mkdtemp, readdir, readFile, rm, stat, writeFile } from "fs/promises";
164
+ import { lstat, mkdir, mkdtemp, readdir, readFile, rm, stat, writeFile } from "fs/promises";
163
165
  import os from "os";
164
166
  import { dirname, join as join2, relative, resolve } from "path";
165
167
  import { kebabCase } from "es-toolkit";
@@ -240,6 +242,24 @@ async function fileExists(filepath) {
240
242
  return false;
241
243
  }
242
244
  }
245
+ async function getFileSize(filepath) {
246
+ try {
247
+ const stats = await stat(filepath);
248
+ return stats.size;
249
+ } catch (error) {
250
+ throw new Error(`Failed to get file size for "${filepath}": ${formatError(error)}`, {
251
+ cause: error
252
+ });
253
+ }
254
+ }
255
+ async function isSymlink(filepath) {
256
+ try {
257
+ const stats = await lstat(filepath);
258
+ return stats.isSymbolicLink();
259
+ } catch {
260
+ return false;
261
+ }
262
+ }
243
263
  async function listDirectoryFiles(dir) {
244
264
  try {
245
265
  return await readdir(dir);
@@ -283,8 +303,14 @@ async function removeFile(filepath) {
283
303
  }
284
304
  }
285
305
  function getHomeDirectory() {
286
- if (isEnvTest) {
287
- throw new Error("getHomeDirectory() must be mocked in test environment");
306
+ const homeDirFromEnv = process.env.HOME_DIR;
307
+ if (homeDirFromEnv) {
308
+ return homeDirFromEnv;
309
+ }
310
+ if (isEnvTest()) {
311
+ throw new Error(
312
+ "getHomeDirectory() must be mocked in test environment, or set HOME_DIR environment variable"
313
+ );
288
314
  }
289
315
  return os.homedir();
290
316
  }
@@ -314,10 +340,32 @@ async function removeTempDirectory(tempDir) {
314
340
  }
315
341
 
316
342
  // src/config/config.ts
317
- import { minLength, optional, z as z3 } from "zod/mini";
343
+ import { isAbsolute } from "path";
344
+ import { minLength, optional, refine, z as z3 } from "zod/mini";
345
+ function hasControlCharacters(value) {
346
+ for (let i = 0; i < value.length; i++) {
347
+ const code = value.charCodeAt(i);
348
+ if (code >= 0 && code <= 31 || code === 127) return true;
349
+ }
350
+ return false;
351
+ }
318
352
  var SourceEntrySchema = z3.object({
319
353
  source: z3.string().check(minLength(1, "source must be a non-empty string")),
320
- skills: optional(z3.array(z3.string()))
354
+ skills: optional(z3.array(z3.string())),
355
+ transport: optional(z3.enum(["github", "git"])),
356
+ ref: optional(
357
+ z3.string().check(
358
+ refine((v) => !v.startsWith("-"), 'ref must not start with "-"'),
359
+ refine((v) => !hasControlCharacters(v), "ref must not contain control characters")
360
+ )
361
+ ),
362
+ path: optional(
363
+ z3.string().check(
364
+ refine((v) => !v.includes(".."), 'path must not contain ".."'),
365
+ refine((v) => !isAbsolute(v), "path must not be absolute"),
366
+ refine((v) => !hasControlCharacters(v), "path must not contain control characters")
367
+ )
368
+ )
321
369
  });
322
370
  var ConfigParamsSchema = z3.object({
323
371
  baseDirs: z3.array(z3.string()),
@@ -606,7 +654,7 @@ function getBaseDirsInLightOfGlobal({
606
654
  }
607
655
 
608
656
  // src/lib/generate.ts
609
- import { join as join114 } from "path";
657
+ import { join as join116 } from "path";
610
658
  import { intersection } from "es-toolkit";
611
659
 
612
660
  // src/features/commands/commands-processor.ts
@@ -7402,9 +7450,9 @@ var McpProcessor = class extends FeatureProcessor {
7402
7450
  };
7403
7451
 
7404
7452
  // src/features/rules/rules-processor.ts
7405
- import { basename as basename10, dirname as dirname3, join as join113, relative as relative5 } from "path";
7453
+ import { basename as basename10, dirname as dirname3, join as join115, relative as relative5 } from "path";
7406
7454
  import { encode } from "@toon-format/toon";
7407
- import { z as z54 } from "zod/mini";
7455
+ import { z as z56 } from "zod/mini";
7408
7456
 
7409
7457
  // src/constants/general.ts
7410
7458
  var SKILL_FILE_NAME = "SKILL.md";
@@ -7711,6 +7759,7 @@ var SimulatedSkill = class extends ToolSkill {
7711
7759
  }
7712
7760
  }
7713
7761
  static fromRulesyncSkillDefault({
7762
+ baseDir = process.cwd(),
7714
7763
  rulesyncSkill,
7715
7764
  validate = true
7716
7765
  }) {
@@ -7720,7 +7769,7 @@ var SimulatedSkill = class extends ToolSkill {
7720
7769
  description: rulesyncFrontmatter.description
7721
7770
  };
7722
7771
  return {
7723
- baseDir: rulesyncSkill.getBaseDir(),
7772
+ baseDir,
7724
7773
  relativeDirPath: this.getSettablePaths().relativeDirPath,
7725
7774
  dirName: rulesyncSkill.getDirName(),
7726
7775
  frontmatter: simulatedFrontmatter,
@@ -7872,8 +7921,8 @@ var FactorydroidSkill = class _FactorydroidSkill extends SimulatedSkill {
7872
7921
  };
7873
7922
 
7874
7923
  // src/features/skills/skills-processor.ts
7875
- import { basename as basename5, join as join75 } from "path";
7876
- import { z as z38 } from "zod/mini";
7924
+ import { basename as basename5, join as join76 } from "path";
7925
+ import { z as z39 } from "zod/mini";
7877
7926
 
7878
7927
  // src/types/dir-feature-processor.ts
7879
7928
  import { join as join59 } from "path";
@@ -8206,6 +8255,7 @@ var AgentsSkillsSkill = class _AgentsSkillsSkill extends ToolSkill {
8206
8255
  });
8207
8256
  }
8208
8257
  static fromRulesyncSkill({
8258
+ baseDir = process.cwd(),
8209
8259
  rulesyncSkill,
8210
8260
  validate = true,
8211
8261
  global = false
@@ -8217,7 +8267,7 @@ var AgentsSkillsSkill = class _AgentsSkillsSkill extends ToolSkill {
8217
8267
  description: rulesyncFrontmatter.description
8218
8268
  };
8219
8269
  return new _AgentsSkillsSkill({
8220
- baseDir: rulesyncSkill.getBaseDir(),
8270
+ baseDir,
8221
8271
  relativeDirPath: settablePaths.relativeDirPath,
8222
8272
  dirName: rulesyncSkill.getDirName(),
8223
8273
  frontmatter: agentsSkillsFrontmatter,
@@ -8367,6 +8417,7 @@ var AntigravitySkill = class _AntigravitySkill extends ToolSkill {
8367
8417
  });
8368
8418
  }
8369
8419
  static fromRulesyncSkill({
8420
+ baseDir = process.cwd(),
8370
8421
  rulesyncSkill,
8371
8422
  validate = true,
8372
8423
  global = false
@@ -8378,7 +8429,7 @@ var AntigravitySkill = class _AntigravitySkill extends ToolSkill {
8378
8429
  };
8379
8430
  const settablePaths = _AntigravitySkill.getSettablePaths({ global });
8380
8431
  return new _AntigravitySkill({
8381
- baseDir: rulesyncSkill.getBaseDir(),
8432
+ baseDir,
8382
8433
  relativeDirPath: settablePaths.relativeDirPath,
8383
8434
  dirName: rulesyncSkill.getDirName(),
8384
8435
  frontmatter: antigravityFrontmatter,
@@ -8533,6 +8584,7 @@ var ClaudecodeSkill = class _ClaudecodeSkill extends ToolSkill {
8533
8584
  });
8534
8585
  }
8535
8586
  static fromRulesyncSkill({
8587
+ baseDir = process.cwd(),
8536
8588
  rulesyncSkill,
8537
8589
  validate = true,
8538
8590
  global = false
@@ -8553,7 +8605,7 @@ var ClaudecodeSkill = class _ClaudecodeSkill extends ToolSkill {
8553
8605
  };
8554
8606
  const settablePaths = _ClaudecodeSkill.getSettablePaths({ global });
8555
8607
  return new _ClaudecodeSkill({
8556
- baseDir: rulesyncSkill.getBaseDir(),
8608
+ baseDir,
8557
8609
  relativeDirPath: settablePaths.relativeDirPath,
8558
8610
  dirName: rulesyncSkill.getDirName(),
8559
8611
  frontmatter: claudecodeFrontmatter,
@@ -8703,6 +8755,7 @@ var ClineSkill = class _ClineSkill extends ToolSkill {
8703
8755
  });
8704
8756
  }
8705
8757
  static fromRulesyncSkill({
8758
+ baseDir = process.cwd(),
8706
8759
  rulesyncSkill,
8707
8760
  validate = true,
8708
8761
  global = false
@@ -8714,7 +8767,7 @@ var ClineSkill = class _ClineSkill extends ToolSkill {
8714
8767
  description: rulesyncFrontmatter.description
8715
8768
  };
8716
8769
  return new _ClineSkill({
8717
- baseDir: rulesyncSkill.getBaseDir(),
8770
+ baseDir,
8718
8771
  relativeDirPath: settablePaths.relativeDirPath,
8719
8772
  dirName: clineFrontmatter.name,
8720
8773
  frontmatter: clineFrontmatter,
@@ -8879,6 +8932,7 @@ var CodexCliSkill = class _CodexCliSkill extends ToolSkill {
8879
8932
  });
8880
8933
  }
8881
8934
  static fromRulesyncSkill({
8935
+ baseDir = process.cwd(),
8882
8936
  rulesyncSkill,
8883
8937
  validate = true,
8884
8938
  global = false
@@ -8895,7 +8949,7 @@ var CodexCliSkill = class _CodexCliSkill extends ToolSkill {
8895
8949
  }
8896
8950
  };
8897
8951
  return new _CodexCliSkill({
8898
- baseDir: rulesyncSkill.getBaseDir(),
8952
+ baseDir,
8899
8953
  relativeDirPath: settablePaths.relativeDirPath,
8900
8954
  dirName: rulesyncSkill.getDirName(),
8901
8955
  frontmatter: codexFrontmatter,
@@ -9046,6 +9100,7 @@ var CopilotSkill = class _CopilotSkill extends ToolSkill {
9046
9100
  });
9047
9101
  }
9048
9102
  static fromRulesyncSkill({
9103
+ baseDir = process.cwd(),
9049
9104
  rulesyncSkill,
9050
9105
  validate = true,
9051
9106
  global = false
@@ -9058,7 +9113,7 @@ var CopilotSkill = class _CopilotSkill extends ToolSkill {
9058
9113
  license: rulesyncFrontmatter.copilot?.license
9059
9114
  };
9060
9115
  return new _CopilotSkill({
9061
- baseDir: rulesyncSkill.getBaseDir(),
9116
+ baseDir,
9062
9117
  relativeDirPath: settablePaths.relativeDirPath,
9063
9118
  dirName: rulesyncSkill.getDirName(),
9064
9119
  frontmatter: copilotFrontmatter,
@@ -9201,6 +9256,7 @@ var CursorSkill = class _CursorSkill extends ToolSkill {
9201
9256
  });
9202
9257
  }
9203
9258
  static fromRulesyncSkill({
9259
+ baseDir = process.cwd(),
9204
9260
  rulesyncSkill,
9205
9261
  validate = true,
9206
9262
  global = false
@@ -9212,7 +9268,7 @@ var CursorSkill = class _CursorSkill extends ToolSkill {
9212
9268
  description: rulesyncFrontmatter.description
9213
9269
  };
9214
9270
  return new _CursorSkill({
9215
- baseDir: rulesyncSkill.getBaseDir(),
9271
+ baseDir,
9216
9272
  relativeDirPath: settablePaths.relativeDirPath,
9217
9273
  dirName: rulesyncSkill.getDirName(),
9218
9274
  frontmatter: cursorFrontmatter,
@@ -9357,6 +9413,7 @@ var GeminiCliSkill = class _GeminiCliSkill extends ToolSkill {
9357
9413
  });
9358
9414
  }
9359
9415
  static fromRulesyncSkill({
9416
+ baseDir = process.cwd(),
9360
9417
  rulesyncSkill,
9361
9418
  validate = true,
9362
9419
  global = false
@@ -9368,7 +9425,7 @@ var GeminiCliSkill = class _GeminiCliSkill extends ToolSkill {
9368
9425
  description: rulesyncFrontmatter.description
9369
9426
  };
9370
9427
  return new _GeminiCliSkill({
9371
- baseDir: rulesyncSkill.getBaseDir(),
9428
+ baseDir,
9372
9429
  relativeDirPath: settablePaths.relativeDirPath,
9373
9430
  dirName: rulesyncSkill.getDirName(),
9374
9431
  frontmatter: geminiCliFrontmatter,
@@ -9425,17 +9482,17 @@ var GeminiCliSkill = class _GeminiCliSkill extends ToolSkill {
9425
9482
  }
9426
9483
  };
9427
9484
 
9428
- // src/features/skills/kilo-skill.ts
9485
+ // src/features/skills/junie-skill.ts
9429
9486
  import { join as join69 } from "path";
9430
9487
  import { z as z33 } from "zod/mini";
9431
- var KiloSkillFrontmatterSchema = z33.looseObject({
9488
+ var JunieSkillFrontmatterSchema = z33.looseObject({
9432
9489
  name: z33.string(),
9433
9490
  description: z33.string()
9434
9491
  });
9435
- var KiloSkill = class _KiloSkill extends ToolSkill {
9492
+ var JunieSkill = class _JunieSkill extends ToolSkill {
9436
9493
  constructor({
9437
9494
  baseDir = process.cwd(),
9438
- relativeDirPath = join69(".kilocode", "skills"),
9495
+ relativeDirPath = join69(".junie", "skills"),
9439
9496
  dirName,
9440
9497
  frontmatter,
9441
9498
  body,
@@ -9462,15 +9519,16 @@ var KiloSkill = class _KiloSkill extends ToolSkill {
9462
9519
  }
9463
9520
  }
9464
9521
  }
9465
- static getSettablePaths({
9466
- global: _global = false
9467
- } = {}) {
9522
+ static getSettablePaths(options) {
9523
+ if (options?.global) {
9524
+ throw new Error("JunieSkill does not support global mode.");
9525
+ }
9468
9526
  return {
9469
- relativeDirPath: join69(".kilocode", "skills")
9527
+ relativeDirPath: join69(".junie", "skills")
9470
9528
  };
9471
9529
  }
9472
9530
  getFrontmatter() {
9473
- const result = KiloSkillFrontmatterSchema.parse(this.requireMainFileFrontmatter());
9531
+ const result = JunieSkillFrontmatterSchema.parse(this.requireMainFileFrontmatter());
9474
9532
  return result;
9475
9533
  }
9476
9534
  getBody() {
@@ -9483,7 +9541,7 @@ var KiloSkill = class _KiloSkill extends ToolSkill {
9483
9541
  error: new Error(`${this.getDirPath()}: ${SKILL_FILE_NAME} file does not exist`)
9484
9542
  };
9485
9543
  }
9486
- const result = KiloSkillFrontmatterSchema.safeParse(this.mainFile.frontmatter);
9544
+ const result = JunieSkillFrontmatterSchema.safeParse(this.mainFile.frontmatter);
9487
9545
  if (!result.success) {
9488
9546
  return {
9489
9547
  success: false,
@@ -9525,17 +9583,17 @@ var KiloSkill = class _KiloSkill extends ToolSkill {
9525
9583
  validate = true,
9526
9584
  global = false
9527
9585
  }) {
9528
- const settablePaths = _KiloSkill.getSettablePaths({ global });
9586
+ const settablePaths = _JunieSkill.getSettablePaths({ global });
9529
9587
  const rulesyncFrontmatter = rulesyncSkill.getFrontmatter();
9530
- const kiloFrontmatter = {
9588
+ const junieFrontmatter = {
9531
9589
  name: rulesyncFrontmatter.name,
9532
9590
  description: rulesyncFrontmatter.description
9533
9591
  };
9534
- return new _KiloSkill({
9592
+ return new _JunieSkill({
9535
9593
  baseDir: rulesyncSkill.getBaseDir(),
9536
9594
  relativeDirPath: settablePaths.relativeDirPath,
9537
- dirName: kiloFrontmatter.name,
9538
- frontmatter: kiloFrontmatter,
9595
+ dirName: junieFrontmatter.name,
9596
+ frontmatter: junieFrontmatter,
9539
9597
  body: rulesyncSkill.getBody(),
9540
9598
  otherFiles: rulesyncSkill.getOtherFiles(),
9541
9599
  validate,
@@ -9544,14 +9602,14 @@ var KiloSkill = class _KiloSkill extends ToolSkill {
9544
9602
  }
9545
9603
  static isTargetedByRulesyncSkill(rulesyncSkill) {
9546
9604
  const targets = rulesyncSkill.getFrontmatter().targets;
9547
- return targets.includes("*") || targets.includes("kilo");
9605
+ return targets.includes("*") || targets.includes("junie");
9548
9606
  }
9549
9607
  static async fromDir(params) {
9550
9608
  const loaded = await this.loadSkillDirContent({
9551
9609
  ...params,
9552
- getSettablePaths: _KiloSkill.getSettablePaths
9610
+ getSettablePaths: _JunieSkill.getSettablePaths
9553
9611
  });
9554
- const result = KiloSkillFrontmatterSchema.safeParse(loaded.frontmatter);
9612
+ const result = JunieSkillFrontmatterSchema.safeParse(loaded.frontmatter);
9555
9613
  if (!result.success) {
9556
9614
  const skillDirPath = join69(loaded.baseDir, loaded.relativeDirPath, loaded.dirName);
9557
9615
  throw new Error(
@@ -9569,7 +9627,7 @@ var KiloSkill = class _KiloSkill extends ToolSkill {
9569
9627
  `Frontmatter name (${result.data.name}) must match directory name (${loaded.dirName}) in ${skillFilePath}`
9570
9628
  );
9571
9629
  }
9572
- return new _KiloSkill({
9630
+ return new _JunieSkill({
9573
9631
  baseDir: loaded.baseDir,
9574
9632
  relativeDirPath: loaded.relativeDirPath,
9575
9633
  dirName: loaded.dirName,
@@ -9586,9 +9644,10 @@ var KiloSkill = class _KiloSkill extends ToolSkill {
9586
9644
  dirName,
9587
9645
  global = false
9588
9646
  }) {
9589
- return new _KiloSkill({
9647
+ const settablePaths = _JunieSkill.getSettablePaths({ global });
9648
+ return new _JunieSkill({
9590
9649
  baseDir,
9591
- relativeDirPath,
9650
+ relativeDirPath: relativeDirPath ?? settablePaths.relativeDirPath,
9592
9651
  dirName,
9593
9652
  frontmatter: { name: "", description: "" },
9594
9653
  body: "",
@@ -9599,17 +9658,17 @@ var KiloSkill = class _KiloSkill extends ToolSkill {
9599
9658
  }
9600
9659
  };
9601
9660
 
9602
- // src/features/skills/kiro-skill.ts
9661
+ // src/features/skills/kilo-skill.ts
9603
9662
  import { join as join70 } from "path";
9604
9663
  import { z as z34 } from "zod/mini";
9605
- var KiroSkillFrontmatterSchema = z34.looseObject({
9664
+ var KiloSkillFrontmatterSchema = z34.looseObject({
9606
9665
  name: z34.string(),
9607
9666
  description: z34.string()
9608
9667
  });
9609
- var KiroSkill = class _KiroSkill extends ToolSkill {
9668
+ var KiloSkill = class _KiloSkill extends ToolSkill {
9610
9669
  constructor({
9611
9670
  baseDir = process.cwd(),
9612
- relativeDirPath = join70(".kiro", "skills"),
9671
+ relativeDirPath = join70(".kilocode", "skills"),
9613
9672
  dirName,
9614
9673
  frontmatter,
9615
9674
  body,
@@ -9636,16 +9695,15 @@ var KiroSkill = class _KiroSkill extends ToolSkill {
9636
9695
  }
9637
9696
  }
9638
9697
  }
9639
- static getSettablePaths(options) {
9640
- if (options?.global) {
9641
- throw new Error("KiroSkill does not support global mode.");
9642
- }
9698
+ static getSettablePaths({
9699
+ global: _global = false
9700
+ } = {}) {
9643
9701
  return {
9644
- relativeDirPath: join70(".kiro", "skills")
9702
+ relativeDirPath: join70(".kilocode", "skills")
9645
9703
  };
9646
9704
  }
9647
9705
  getFrontmatter() {
9648
- const result = KiroSkillFrontmatterSchema.parse(this.requireMainFileFrontmatter());
9706
+ const result = KiloSkillFrontmatterSchema.parse(this.requireMainFileFrontmatter());
9649
9707
  return result;
9650
9708
  }
9651
9709
  getBody() {
@@ -9658,7 +9716,7 @@ var KiroSkill = class _KiroSkill extends ToolSkill {
9658
9716
  error: new Error(`${this.getDirPath()}: ${SKILL_FILE_NAME} file does not exist`)
9659
9717
  };
9660
9718
  }
9661
- const result = KiroSkillFrontmatterSchema.safeParse(this.mainFile.frontmatter);
9719
+ const result = KiloSkillFrontmatterSchema.safeParse(this.mainFile.frontmatter);
9662
9720
  if (!result.success) {
9663
9721
  return {
9664
9722
  success: false,
@@ -9696,21 +9754,22 @@ var KiroSkill = class _KiroSkill extends ToolSkill {
9696
9754
  });
9697
9755
  }
9698
9756
  static fromRulesyncSkill({
9757
+ baseDir = process.cwd(),
9699
9758
  rulesyncSkill,
9700
9759
  validate = true,
9701
9760
  global = false
9702
9761
  }) {
9703
- const settablePaths = _KiroSkill.getSettablePaths({ global });
9762
+ const settablePaths = _KiloSkill.getSettablePaths({ global });
9704
9763
  const rulesyncFrontmatter = rulesyncSkill.getFrontmatter();
9705
- const kiroFrontmatter = {
9764
+ const kiloFrontmatter = {
9706
9765
  name: rulesyncFrontmatter.name,
9707
9766
  description: rulesyncFrontmatter.description
9708
9767
  };
9709
- return new _KiroSkill({
9710
- baseDir: rulesyncSkill.getBaseDir(),
9768
+ return new _KiloSkill({
9769
+ baseDir,
9711
9770
  relativeDirPath: settablePaths.relativeDirPath,
9712
- dirName: rulesyncSkill.getDirName(),
9713
- frontmatter: kiroFrontmatter,
9771
+ dirName: kiloFrontmatter.name,
9772
+ frontmatter: kiloFrontmatter,
9714
9773
  body: rulesyncSkill.getBody(),
9715
9774
  otherFiles: rulesyncSkill.getOtherFiles(),
9716
9775
  validate,
@@ -9719,14 +9778,14 @@ var KiroSkill = class _KiroSkill extends ToolSkill {
9719
9778
  }
9720
9779
  static isTargetedByRulesyncSkill(rulesyncSkill) {
9721
9780
  const targets = rulesyncSkill.getFrontmatter().targets;
9722
- return targets.includes("*") || targets.includes("kiro");
9781
+ return targets.includes("*") || targets.includes("kilo");
9723
9782
  }
9724
9783
  static async fromDir(params) {
9725
9784
  const loaded = await this.loadSkillDirContent({
9726
9785
  ...params,
9727
- getSettablePaths: _KiroSkill.getSettablePaths
9786
+ getSettablePaths: _KiloSkill.getSettablePaths
9728
9787
  });
9729
- const result = KiroSkillFrontmatterSchema.safeParse(loaded.frontmatter);
9788
+ const result = KiloSkillFrontmatterSchema.safeParse(loaded.frontmatter);
9730
9789
  if (!result.success) {
9731
9790
  const skillDirPath = join70(loaded.baseDir, loaded.relativeDirPath, loaded.dirName);
9732
9791
  throw new Error(
@@ -9744,7 +9803,7 @@ var KiroSkill = class _KiroSkill extends ToolSkill {
9744
9803
  `Frontmatter name (${result.data.name}) must match directory name (${loaded.dirName}) in ${skillFilePath}`
9745
9804
  );
9746
9805
  }
9747
- return new _KiroSkill({
9806
+ return new _KiloSkill({
9748
9807
  baseDir: loaded.baseDir,
9749
9808
  relativeDirPath: loaded.relativeDirPath,
9750
9809
  dirName: loaded.dirName,
@@ -9761,10 +9820,9 @@ var KiroSkill = class _KiroSkill extends ToolSkill {
9761
9820
  dirName,
9762
9821
  global = false
9763
9822
  }) {
9764
- const settablePaths = _KiroSkill.getSettablePaths({ global });
9765
- return new _KiroSkill({
9823
+ return new _KiloSkill({
9766
9824
  baseDir,
9767
- relativeDirPath: relativeDirPath ?? settablePaths.relativeDirPath,
9825
+ relativeDirPath,
9768
9826
  dirName,
9769
9827
  frontmatter: { name: "", description: "" },
9770
9828
  body: "",
@@ -9775,18 +9833,17 @@ var KiroSkill = class _KiroSkill extends ToolSkill {
9775
9833
  }
9776
9834
  };
9777
9835
 
9778
- // src/features/skills/opencode-skill.ts
9836
+ // src/features/skills/kiro-skill.ts
9779
9837
  import { join as join71 } from "path";
9780
9838
  import { z as z35 } from "zod/mini";
9781
- var OpenCodeSkillFrontmatterSchema = z35.looseObject({
9839
+ var KiroSkillFrontmatterSchema = z35.looseObject({
9782
9840
  name: z35.string(),
9783
- description: z35.string(),
9784
- "allowed-tools": z35.optional(z35.array(z35.string()))
9841
+ description: z35.string()
9785
9842
  });
9786
- var OpenCodeSkill = class _OpenCodeSkill extends ToolSkill {
9843
+ var KiroSkill = class _KiroSkill extends ToolSkill {
9787
9844
  constructor({
9788
9845
  baseDir = process.cwd(),
9789
- relativeDirPath = join71(".opencode", "skill"),
9846
+ relativeDirPath = join71(".kiro", "skills"),
9790
9847
  dirName,
9791
9848
  frontmatter,
9792
9849
  body,
@@ -9813,26 +9870,29 @@ var OpenCodeSkill = class _OpenCodeSkill extends ToolSkill {
9813
9870
  }
9814
9871
  }
9815
9872
  }
9816
- static getSettablePaths({ global = false } = {}) {
9873
+ static getSettablePaths(options) {
9874
+ if (options?.global) {
9875
+ throw new Error("KiroSkill does not support global mode.");
9876
+ }
9817
9877
  return {
9818
- relativeDirPath: global ? join71(".config", "opencode", "skill") : join71(".opencode", "skill")
9878
+ relativeDirPath: join71(".kiro", "skills")
9819
9879
  };
9820
9880
  }
9821
9881
  getFrontmatter() {
9822
- const result = OpenCodeSkillFrontmatterSchema.parse(this.requireMainFileFrontmatter());
9882
+ const result = KiroSkillFrontmatterSchema.parse(this.requireMainFileFrontmatter());
9823
9883
  return result;
9824
9884
  }
9825
9885
  getBody() {
9826
9886
  return this.mainFile?.body ?? "";
9827
9887
  }
9828
9888
  validate() {
9829
- if (this.mainFile === void 0) {
9889
+ if (!this.mainFile) {
9830
9890
  return {
9831
9891
  success: false,
9832
9892
  error: new Error(`${this.getDirPath()}: ${SKILL_FILE_NAME} file does not exist`)
9833
9893
  };
9834
9894
  }
9835
- const result = OpenCodeSkillFrontmatterSchema.safeParse(this.mainFile.frontmatter);
9895
+ const result = KiroSkillFrontmatterSchema.safeParse(this.mainFile.frontmatter);
9836
9896
  if (!result.success) {
9837
9897
  return {
9838
9898
  success: false,
@@ -9841,6 +9901,14 @@ var OpenCodeSkill = class _OpenCodeSkill extends ToolSkill {
9841
9901
  )
9842
9902
  };
9843
9903
  }
9904
+ if (result.data.name !== this.getDirName()) {
9905
+ return {
9906
+ success: false,
9907
+ error: new Error(
9908
+ `${this.getDirPath()}: frontmatter name (${result.data.name}) must match directory name (${this.getDirName()})`
9909
+ )
9910
+ };
9911
+ }
9844
9912
  return { success: true, error: null };
9845
9913
  }
9846
9914
  toRulesyncSkill() {
@@ -9848,12 +9916,7 @@ var OpenCodeSkill = class _OpenCodeSkill extends ToolSkill {
9848
9916
  const rulesyncFrontmatter = {
9849
9917
  name: frontmatter.name,
9850
9918
  description: frontmatter.description,
9851
- targets: ["*"],
9852
- ...frontmatter["allowed-tools"] && {
9853
- opencode: {
9854
- "allowed-tools": frontmatter["allowed-tools"]
9855
- }
9856
- }
9919
+ targets: ["*"]
9857
9920
  };
9858
9921
  return new RulesyncSkill({
9859
9922
  baseDir: this.baseDir,
@@ -9867,22 +9930,22 @@ var OpenCodeSkill = class _OpenCodeSkill extends ToolSkill {
9867
9930
  });
9868
9931
  }
9869
9932
  static fromRulesyncSkill({
9933
+ baseDir = process.cwd(),
9870
9934
  rulesyncSkill,
9871
9935
  validate = true,
9872
9936
  global = false
9873
9937
  }) {
9938
+ const settablePaths = _KiroSkill.getSettablePaths({ global });
9874
9939
  const rulesyncFrontmatter = rulesyncSkill.getFrontmatter();
9875
- const opencodeFrontmatter = {
9940
+ const kiroFrontmatter = {
9876
9941
  name: rulesyncFrontmatter.name,
9877
- description: rulesyncFrontmatter.description,
9878
- "allowed-tools": rulesyncFrontmatter.opencode?.["allowed-tools"]
9942
+ description: rulesyncFrontmatter.description
9879
9943
  };
9880
- const settablePaths = _OpenCodeSkill.getSettablePaths({ global });
9881
- return new _OpenCodeSkill({
9882
- baseDir: rulesyncSkill.getBaseDir(),
9944
+ return new _KiroSkill({
9945
+ baseDir,
9883
9946
  relativeDirPath: settablePaths.relativeDirPath,
9884
9947
  dirName: rulesyncSkill.getDirName(),
9885
- frontmatter: opencodeFrontmatter,
9948
+ frontmatter: kiroFrontmatter,
9886
9949
  body: rulesyncSkill.getBody(),
9887
9950
  otherFiles: rulesyncSkill.getOtherFiles(),
9888
9951
  validate,
@@ -9891,21 +9954,32 @@ var OpenCodeSkill = class _OpenCodeSkill extends ToolSkill {
9891
9954
  }
9892
9955
  static isTargetedByRulesyncSkill(rulesyncSkill) {
9893
9956
  const targets = rulesyncSkill.getFrontmatter().targets;
9894
- return targets.includes("*") || targets.includes("opencode");
9957
+ return targets.includes("*") || targets.includes("kiro");
9895
9958
  }
9896
9959
  static async fromDir(params) {
9897
9960
  const loaded = await this.loadSkillDirContent({
9898
9961
  ...params,
9899
- getSettablePaths: _OpenCodeSkill.getSettablePaths
9962
+ getSettablePaths: _KiroSkill.getSettablePaths
9900
9963
  });
9901
- const result = OpenCodeSkillFrontmatterSchema.safeParse(loaded.frontmatter);
9964
+ const result = KiroSkillFrontmatterSchema.safeParse(loaded.frontmatter);
9902
9965
  if (!result.success) {
9903
9966
  const skillDirPath = join71(loaded.baseDir, loaded.relativeDirPath, loaded.dirName);
9904
9967
  throw new Error(
9905
9968
  `Invalid frontmatter in ${join71(skillDirPath, SKILL_FILE_NAME)}: ${formatError(result.error)}`
9906
9969
  );
9907
9970
  }
9908
- return new _OpenCodeSkill({
9971
+ if (result.data.name !== loaded.dirName) {
9972
+ const skillFilePath = join71(
9973
+ loaded.baseDir,
9974
+ loaded.relativeDirPath,
9975
+ loaded.dirName,
9976
+ SKILL_FILE_NAME
9977
+ );
9978
+ throw new Error(
9979
+ `Frontmatter name (${result.data.name}) must match directory name (${loaded.dirName}) in ${skillFilePath}`
9980
+ );
9981
+ }
9982
+ return new _KiroSkill({
9909
9983
  baseDir: loaded.baseDir,
9910
9984
  relativeDirPath: loaded.relativeDirPath,
9911
9985
  dirName: loaded.dirName,
@@ -9922,9 +9996,10 @@ var OpenCodeSkill = class _OpenCodeSkill extends ToolSkill {
9922
9996
  dirName,
9923
9997
  global = false
9924
9998
  }) {
9925
- return new _OpenCodeSkill({
9999
+ const settablePaths = _KiroSkill.getSettablePaths({ global });
10000
+ return new _KiroSkill({
9926
10001
  baseDir,
9927
- relativeDirPath,
10002
+ relativeDirPath: relativeDirPath ?? settablePaths.relativeDirPath,
9928
10003
  dirName,
9929
10004
  frontmatter: { name: "", description: "" },
9930
10005
  body: "",
@@ -9935,17 +10010,18 @@ var OpenCodeSkill = class _OpenCodeSkill extends ToolSkill {
9935
10010
  }
9936
10011
  };
9937
10012
 
9938
- // src/features/skills/replit-skill.ts
10013
+ // src/features/skills/opencode-skill.ts
9939
10014
  import { join as join72 } from "path";
9940
10015
  import { z as z36 } from "zod/mini";
9941
- var ReplitSkillFrontmatterSchema = z36.looseObject({
10016
+ var OpenCodeSkillFrontmatterSchema = z36.looseObject({
9942
10017
  name: z36.string(),
9943
- description: z36.string()
10018
+ description: z36.string(),
10019
+ "allowed-tools": z36.optional(z36.array(z36.string()))
9944
10020
  });
9945
- var ReplitSkill = class _ReplitSkill extends ToolSkill {
10021
+ var OpenCodeSkill = class _OpenCodeSkill extends ToolSkill {
9946
10022
  constructor({
9947
10023
  baseDir = process.cwd(),
9948
- relativeDirPath = join72(".agents", "skills"),
10024
+ relativeDirPath = join72(".opencode", "skill"),
9949
10025
  dirName,
9950
10026
  frontmatter,
9951
10027
  body,
@@ -9972,29 +10048,26 @@ var ReplitSkill = class _ReplitSkill extends ToolSkill {
9972
10048
  }
9973
10049
  }
9974
10050
  }
9975
- static getSettablePaths(options) {
9976
- if (options?.global) {
9977
- throw new Error("ReplitSkill does not support global mode.");
9978
- }
10051
+ static getSettablePaths({ global = false } = {}) {
9979
10052
  return {
9980
- relativeDirPath: join72(".agents", "skills")
10053
+ relativeDirPath: global ? join72(".config", "opencode", "skill") : join72(".opencode", "skill")
9981
10054
  };
9982
10055
  }
9983
10056
  getFrontmatter() {
9984
- const result = ReplitSkillFrontmatterSchema.parse(this.requireMainFileFrontmatter());
10057
+ const result = OpenCodeSkillFrontmatterSchema.parse(this.requireMainFileFrontmatter());
9985
10058
  return result;
9986
10059
  }
9987
10060
  getBody() {
9988
10061
  return this.mainFile?.body ?? "";
9989
10062
  }
9990
10063
  validate() {
9991
- if (!this.mainFile) {
10064
+ if (this.mainFile === void 0) {
9992
10065
  return {
9993
10066
  success: false,
9994
10067
  error: new Error(`${this.getDirPath()}: ${SKILL_FILE_NAME} file does not exist`)
9995
10068
  };
9996
10069
  }
9997
- const result = ReplitSkillFrontmatterSchema.safeParse(this.mainFile.frontmatter);
10070
+ const result = OpenCodeSkillFrontmatterSchema.safeParse(this.mainFile.frontmatter);
9998
10071
  if (!result.success) {
9999
10072
  return {
10000
10073
  success: false,
@@ -10010,7 +10083,12 @@ var ReplitSkill = class _ReplitSkill extends ToolSkill {
10010
10083
  const rulesyncFrontmatter = {
10011
10084
  name: frontmatter.name,
10012
10085
  description: frontmatter.description,
10013
- targets: ["*"]
10086
+ targets: ["*"],
10087
+ ...frontmatter["allowed-tools"] && {
10088
+ opencode: {
10089
+ "allowed-tools": frontmatter["allowed-tools"]
10090
+ }
10091
+ }
10014
10092
  };
10015
10093
  return new RulesyncSkill({
10016
10094
  baseDir: this.baseDir,
@@ -10024,21 +10102,23 @@ var ReplitSkill = class _ReplitSkill extends ToolSkill {
10024
10102
  });
10025
10103
  }
10026
10104
  static fromRulesyncSkill({
10105
+ baseDir = process.cwd(),
10027
10106
  rulesyncSkill,
10028
10107
  validate = true,
10029
10108
  global = false
10030
10109
  }) {
10031
- const settablePaths = _ReplitSkill.getSettablePaths({ global });
10032
10110
  const rulesyncFrontmatter = rulesyncSkill.getFrontmatter();
10033
- const replitFrontmatter = {
10111
+ const opencodeFrontmatter = {
10034
10112
  name: rulesyncFrontmatter.name,
10035
- description: rulesyncFrontmatter.description
10113
+ description: rulesyncFrontmatter.description,
10114
+ "allowed-tools": rulesyncFrontmatter.opencode?.["allowed-tools"]
10036
10115
  };
10037
- return new _ReplitSkill({
10038
- baseDir: rulesyncSkill.getBaseDir(),
10116
+ const settablePaths = _OpenCodeSkill.getSettablePaths({ global });
10117
+ return new _OpenCodeSkill({
10118
+ baseDir,
10039
10119
  relativeDirPath: settablePaths.relativeDirPath,
10040
10120
  dirName: rulesyncSkill.getDirName(),
10041
- frontmatter: replitFrontmatter,
10121
+ frontmatter: opencodeFrontmatter,
10042
10122
  body: rulesyncSkill.getBody(),
10043
10123
  otherFiles: rulesyncSkill.getOtherFiles(),
10044
10124
  validate,
@@ -10047,21 +10127,21 @@ var ReplitSkill = class _ReplitSkill extends ToolSkill {
10047
10127
  }
10048
10128
  static isTargetedByRulesyncSkill(rulesyncSkill) {
10049
10129
  const targets = rulesyncSkill.getFrontmatter().targets;
10050
- return targets.includes("*") || targets.includes("replit");
10130
+ return targets.includes("*") || targets.includes("opencode");
10051
10131
  }
10052
10132
  static async fromDir(params) {
10053
10133
  const loaded = await this.loadSkillDirContent({
10054
10134
  ...params,
10055
- getSettablePaths: _ReplitSkill.getSettablePaths
10135
+ getSettablePaths: _OpenCodeSkill.getSettablePaths
10056
10136
  });
10057
- const result = ReplitSkillFrontmatterSchema.safeParse(loaded.frontmatter);
10137
+ const result = OpenCodeSkillFrontmatterSchema.safeParse(loaded.frontmatter);
10058
10138
  if (!result.success) {
10059
10139
  const skillDirPath = join72(loaded.baseDir, loaded.relativeDirPath, loaded.dirName);
10060
10140
  throw new Error(
10061
10141
  `Invalid frontmatter in ${join72(skillDirPath, SKILL_FILE_NAME)}: ${formatError(result.error)}`
10062
10142
  );
10063
10143
  }
10064
- return new _ReplitSkill({
10144
+ return new _OpenCodeSkill({
10065
10145
  baseDir: loaded.baseDir,
10066
10146
  relativeDirPath: loaded.relativeDirPath,
10067
10147
  dirName: loaded.dirName,
@@ -10078,10 +10158,9 @@ var ReplitSkill = class _ReplitSkill extends ToolSkill {
10078
10158
  dirName,
10079
10159
  global = false
10080
10160
  }) {
10081
- const settablePaths = _ReplitSkill.getSettablePaths({ global });
10082
- return new _ReplitSkill({
10161
+ return new _OpenCodeSkill({
10083
10162
  baseDir,
10084
- relativeDirPath: relativeDirPath ?? settablePaths.relativeDirPath,
10163
+ relativeDirPath,
10085
10164
  dirName,
10086
10165
  frontmatter: { name: "", description: "" },
10087
10166
  body: "",
@@ -10092,17 +10171,17 @@ var ReplitSkill = class _ReplitSkill extends ToolSkill {
10092
10171
  }
10093
10172
  };
10094
10173
 
10095
- // src/features/skills/roo-skill.ts
10174
+ // src/features/skills/replit-skill.ts
10096
10175
  import { join as join73 } from "path";
10097
10176
  import { z as z37 } from "zod/mini";
10098
- var RooSkillFrontmatterSchema = z37.looseObject({
10177
+ var ReplitSkillFrontmatterSchema = z37.looseObject({
10099
10178
  name: z37.string(),
10100
10179
  description: z37.string()
10101
10180
  });
10102
- var RooSkill = class _RooSkill extends ToolSkill {
10181
+ var ReplitSkill = class _ReplitSkill extends ToolSkill {
10103
10182
  constructor({
10104
10183
  baseDir = process.cwd(),
10105
- relativeDirPath = join73(".roo", "skills"),
10184
+ relativeDirPath = join73(".agents", "skills"),
10106
10185
  dirName,
10107
10186
  frontmatter,
10108
10187
  body,
@@ -10129,15 +10208,16 @@ var RooSkill = class _RooSkill extends ToolSkill {
10129
10208
  }
10130
10209
  }
10131
10210
  }
10132
- static getSettablePaths({
10133
- global: _global = false
10134
- } = {}) {
10211
+ static getSettablePaths(options) {
10212
+ if (options?.global) {
10213
+ throw new Error("ReplitSkill does not support global mode.");
10214
+ }
10135
10215
  return {
10136
- relativeDirPath: join73(".roo", "skills")
10216
+ relativeDirPath: join73(".agents", "skills")
10137
10217
  };
10138
10218
  }
10139
10219
  getFrontmatter() {
10140
- const result = RooSkillFrontmatterSchema.parse(this.requireMainFileFrontmatter());
10220
+ const result = ReplitSkillFrontmatterSchema.parse(this.requireMainFileFrontmatter());
10141
10221
  return result;
10142
10222
  }
10143
10223
  getBody() {
@@ -10150,7 +10230,7 @@ var RooSkill = class _RooSkill extends ToolSkill {
10150
10230
  error: new Error(`${this.getDirPath()}: ${SKILL_FILE_NAME} file does not exist`)
10151
10231
  };
10152
10232
  }
10153
- const result = RooSkillFrontmatterSchema.safeParse(this.mainFile.frontmatter);
10233
+ const result = ReplitSkillFrontmatterSchema.safeParse(this.mainFile.frontmatter);
10154
10234
  if (!result.success) {
10155
10235
  return {
10156
10236
  success: false,
@@ -10159,14 +10239,6 @@ var RooSkill = class _RooSkill extends ToolSkill {
10159
10239
  )
10160
10240
  };
10161
10241
  }
10162
- if (result.data.name !== this.getDirName()) {
10163
- return {
10164
- success: false,
10165
- error: new Error(
10166
- `${this.getDirPath()}: frontmatter name (${result.data.name}) must match directory name (${this.getDirName()})`
10167
- )
10168
- };
10169
- }
10170
10242
  return { success: true, error: null };
10171
10243
  }
10172
10244
  toRulesyncSkill() {
@@ -10188,18 +10260,184 @@ var RooSkill = class _RooSkill extends ToolSkill {
10188
10260
  });
10189
10261
  }
10190
10262
  static fromRulesyncSkill({
10263
+ baseDir = process.cwd(),
10191
10264
  rulesyncSkill,
10192
10265
  validate = true,
10193
10266
  global = false
10194
10267
  }) {
10195
- const settablePaths = _RooSkill.getSettablePaths({ global });
10268
+ const settablePaths = _ReplitSkill.getSettablePaths({ global });
10196
10269
  const rulesyncFrontmatter = rulesyncSkill.getFrontmatter();
10197
- const rooFrontmatter = {
10270
+ const replitFrontmatter = {
10271
+ name: rulesyncFrontmatter.name,
10272
+ description: rulesyncFrontmatter.description
10273
+ };
10274
+ return new _ReplitSkill({
10275
+ baseDir,
10276
+ relativeDirPath: settablePaths.relativeDirPath,
10277
+ dirName: rulesyncSkill.getDirName(),
10278
+ frontmatter: replitFrontmatter,
10279
+ body: rulesyncSkill.getBody(),
10280
+ otherFiles: rulesyncSkill.getOtherFiles(),
10281
+ validate,
10282
+ global
10283
+ });
10284
+ }
10285
+ static isTargetedByRulesyncSkill(rulesyncSkill) {
10286
+ const targets = rulesyncSkill.getFrontmatter().targets;
10287
+ return targets.includes("*") || targets.includes("replit");
10288
+ }
10289
+ static async fromDir(params) {
10290
+ const loaded = await this.loadSkillDirContent({
10291
+ ...params,
10292
+ getSettablePaths: _ReplitSkill.getSettablePaths
10293
+ });
10294
+ const result = ReplitSkillFrontmatterSchema.safeParse(loaded.frontmatter);
10295
+ if (!result.success) {
10296
+ const skillDirPath = join73(loaded.baseDir, loaded.relativeDirPath, loaded.dirName);
10297
+ throw new Error(
10298
+ `Invalid frontmatter in ${join73(skillDirPath, SKILL_FILE_NAME)}: ${formatError(result.error)}`
10299
+ );
10300
+ }
10301
+ return new _ReplitSkill({
10302
+ baseDir: loaded.baseDir,
10303
+ relativeDirPath: loaded.relativeDirPath,
10304
+ dirName: loaded.dirName,
10305
+ frontmatter: result.data,
10306
+ body: loaded.body,
10307
+ otherFiles: loaded.otherFiles,
10308
+ validate: true,
10309
+ global: loaded.global
10310
+ });
10311
+ }
10312
+ static forDeletion({
10313
+ baseDir = process.cwd(),
10314
+ relativeDirPath,
10315
+ dirName,
10316
+ global = false
10317
+ }) {
10318
+ const settablePaths = _ReplitSkill.getSettablePaths({ global });
10319
+ return new _ReplitSkill({
10320
+ baseDir,
10321
+ relativeDirPath: relativeDirPath ?? settablePaths.relativeDirPath,
10322
+ dirName,
10323
+ frontmatter: { name: "", description: "" },
10324
+ body: "",
10325
+ otherFiles: [],
10326
+ validate: false,
10327
+ global
10328
+ });
10329
+ }
10330
+ };
10331
+
10332
+ // src/features/skills/roo-skill.ts
10333
+ import { join as join74 } from "path";
10334
+ import { z as z38 } from "zod/mini";
10335
+ var RooSkillFrontmatterSchema = z38.looseObject({
10336
+ name: z38.string(),
10337
+ description: z38.string()
10338
+ });
10339
+ var RooSkill = class _RooSkill extends ToolSkill {
10340
+ constructor({
10341
+ baseDir = process.cwd(),
10342
+ relativeDirPath = join74(".roo", "skills"),
10343
+ dirName,
10344
+ frontmatter,
10345
+ body,
10346
+ otherFiles = [],
10347
+ validate = true,
10348
+ global = false
10349
+ }) {
10350
+ super({
10351
+ baseDir,
10352
+ relativeDirPath,
10353
+ dirName,
10354
+ mainFile: {
10355
+ name: SKILL_FILE_NAME,
10356
+ body,
10357
+ frontmatter: { ...frontmatter }
10358
+ },
10359
+ otherFiles,
10360
+ global
10361
+ });
10362
+ if (validate) {
10363
+ const result = this.validate();
10364
+ if (!result.success) {
10365
+ throw result.error;
10366
+ }
10367
+ }
10368
+ }
10369
+ static getSettablePaths({
10370
+ global: _global = false
10371
+ } = {}) {
10372
+ return {
10373
+ relativeDirPath: join74(".roo", "skills")
10374
+ };
10375
+ }
10376
+ getFrontmatter() {
10377
+ const result = RooSkillFrontmatterSchema.parse(this.requireMainFileFrontmatter());
10378
+ return result;
10379
+ }
10380
+ getBody() {
10381
+ return this.mainFile?.body ?? "";
10382
+ }
10383
+ validate() {
10384
+ if (!this.mainFile) {
10385
+ return {
10386
+ success: false,
10387
+ error: new Error(`${this.getDirPath()}: ${SKILL_FILE_NAME} file does not exist`)
10388
+ };
10389
+ }
10390
+ const result = RooSkillFrontmatterSchema.safeParse(this.mainFile.frontmatter);
10391
+ if (!result.success) {
10392
+ return {
10393
+ success: false,
10394
+ error: new Error(
10395
+ `Invalid frontmatter in ${this.getDirPath()}: ${formatError(result.error)}`
10396
+ )
10397
+ };
10398
+ }
10399
+ if (result.data.name !== this.getDirName()) {
10400
+ return {
10401
+ success: false,
10402
+ error: new Error(
10403
+ `${this.getDirPath()}: frontmatter name (${result.data.name}) must match directory name (${this.getDirName()})`
10404
+ )
10405
+ };
10406
+ }
10407
+ return { success: true, error: null };
10408
+ }
10409
+ toRulesyncSkill() {
10410
+ const frontmatter = this.getFrontmatter();
10411
+ const rulesyncFrontmatter = {
10412
+ name: frontmatter.name,
10413
+ description: frontmatter.description,
10414
+ targets: ["*"]
10415
+ };
10416
+ return new RulesyncSkill({
10417
+ baseDir: this.baseDir,
10418
+ relativeDirPath: RULESYNC_SKILLS_RELATIVE_DIR_PATH,
10419
+ dirName: this.getDirName(),
10420
+ frontmatter: rulesyncFrontmatter,
10421
+ body: this.getBody(),
10422
+ otherFiles: this.getOtherFiles(),
10423
+ validate: true,
10424
+ global: this.global
10425
+ });
10426
+ }
10427
+ static fromRulesyncSkill({
10428
+ baseDir = process.cwd(),
10429
+ rulesyncSkill,
10430
+ validate = true,
10431
+ global = false
10432
+ }) {
10433
+ const settablePaths = _RooSkill.getSettablePaths({ global });
10434
+ const rulesyncFrontmatter = rulesyncSkill.getFrontmatter();
10435
+ const rooFrontmatter = {
10198
10436
  name: rulesyncFrontmatter.name,
10199
10437
  description: rulesyncFrontmatter.description
10200
10438
  };
10201
10439
  return new _RooSkill({
10202
- baseDir: rulesyncSkill.getBaseDir(),
10440
+ baseDir,
10203
10441
  relativeDirPath: settablePaths.relativeDirPath,
10204
10442
  dirName: rooFrontmatter.name,
10205
10443
  frontmatter: rooFrontmatter,
@@ -10220,13 +10458,13 @@ var RooSkill = class _RooSkill extends ToolSkill {
10220
10458
  });
10221
10459
  const result = RooSkillFrontmatterSchema.safeParse(loaded.frontmatter);
10222
10460
  if (!result.success) {
10223
- const skillDirPath = join73(loaded.baseDir, loaded.relativeDirPath, loaded.dirName);
10461
+ const skillDirPath = join74(loaded.baseDir, loaded.relativeDirPath, loaded.dirName);
10224
10462
  throw new Error(
10225
- `Invalid frontmatter in ${join73(skillDirPath, SKILL_FILE_NAME)}: ${formatError(result.error)}`
10463
+ `Invalid frontmatter in ${join74(skillDirPath, SKILL_FILE_NAME)}: ${formatError(result.error)}`
10226
10464
  );
10227
10465
  }
10228
10466
  if (result.data.name !== loaded.dirName) {
10229
- const skillFilePath = join73(
10467
+ const skillFilePath = join74(
10230
10468
  loaded.baseDir,
10231
10469
  loaded.relativeDirPath,
10232
10470
  loaded.dirName,
@@ -10267,14 +10505,14 @@ var RooSkill = class _RooSkill extends ToolSkill {
10267
10505
  };
10268
10506
 
10269
10507
  // src/features/skills/skills-utils.ts
10270
- import { basename as basename4, join as join74 } from "path";
10508
+ import { basename as basename4, join as join75 } from "path";
10271
10509
  async function getLocalSkillDirNames(baseDir) {
10272
- const skillsDir = join74(baseDir, RULESYNC_SKILLS_RELATIVE_DIR_PATH);
10510
+ const skillsDir = join75(baseDir, RULESYNC_SKILLS_RELATIVE_DIR_PATH);
10273
10511
  const names = /* @__PURE__ */ new Set();
10274
10512
  if (!await directoryExists(skillsDir)) {
10275
10513
  return names;
10276
10514
  }
10277
- const dirPaths = await findFilesByGlobs(join74(skillsDir, "*"), { type: "dir" });
10515
+ const dirPaths = await findFilesByGlobs(join75(skillsDir, "*"), { type: "dir" });
10278
10516
  for (const dirPath of dirPaths) {
10279
10517
  const name = basename4(dirPath);
10280
10518
  if (name === basename4(RULESYNC_CURATED_SKILLS_RELATIVE_DIR_PATH)) continue;
@@ -10296,13 +10534,14 @@ var skillsProcessorToolTargetTuple = [
10296
10534
  "cursor",
10297
10535
  "factorydroid",
10298
10536
  "geminicli",
10537
+ "junie",
10299
10538
  "kilo",
10300
10539
  "kiro",
10301
10540
  "opencode",
10302
10541
  "replit",
10303
10542
  "roo"
10304
10543
  ];
10305
- var SkillsProcessorToolTargetSchema = z38.enum(skillsProcessorToolTargetTuple);
10544
+ var SkillsProcessorToolTargetSchema = z39.enum(skillsProcessorToolTargetTuple);
10306
10545
  var toolSkillFactories = /* @__PURE__ */ new Map([
10307
10546
  [
10308
10547
  "agentsmd",
@@ -10381,6 +10620,13 @@ var toolSkillFactories = /* @__PURE__ */ new Map([
10381
10620
  meta: { supportsProject: true, supportsSimulated: false, supportsGlobal: true }
10382
10621
  }
10383
10622
  ],
10623
+ [
10624
+ "junie",
10625
+ {
10626
+ class: JunieSkill,
10627
+ meta: { supportsProject: true, supportsSimulated: false, supportsGlobal: false }
10628
+ }
10629
+ ],
10384
10630
  [
10385
10631
  "kilo",
10386
10632
  {
@@ -10471,6 +10717,7 @@ var SkillsProcessor = class extends DirFeatureProcessor {
10471
10717
  return null;
10472
10718
  }
10473
10719
  return factory.class.fromRulesyncSkill({
10720
+ baseDir: this.baseDir,
10474
10721
  rulesyncSkill,
10475
10722
  global: this.global
10476
10723
  });
@@ -10503,10 +10750,10 @@ var SkillsProcessor = class extends DirFeatureProcessor {
10503
10750
  )
10504
10751
  );
10505
10752
  const localSkillNames = new Set(localDirNames);
10506
- const curatedDirPath = join75(process.cwd(), RULESYNC_CURATED_SKILLS_RELATIVE_DIR_PATH);
10753
+ const curatedDirPath = join76(process.cwd(), RULESYNC_CURATED_SKILLS_RELATIVE_DIR_PATH);
10507
10754
  let curatedSkills = [];
10508
10755
  if (await directoryExists(curatedDirPath)) {
10509
- const curatedDirPaths = await findFilesByGlobs(join75(curatedDirPath, "*"), { type: "dir" });
10756
+ const curatedDirPaths = await findFilesByGlobs(join76(curatedDirPath, "*"), { type: "dir" });
10510
10757
  const curatedDirNames = curatedDirPaths.map((path3) => basename5(path3));
10511
10758
  const nonConflicting = curatedDirNames.filter((name) => {
10512
10759
  if (localSkillNames.has(name)) {
@@ -10540,8 +10787,8 @@ var SkillsProcessor = class extends DirFeatureProcessor {
10540
10787
  async loadToolDirs() {
10541
10788
  const factory = this.getFactory(this.toolTarget);
10542
10789
  const paths = factory.class.getSettablePaths({ global: this.global });
10543
- const skillsDirPath = join75(this.baseDir, paths.relativeDirPath);
10544
- const dirPaths = await findFilesByGlobs(join75(skillsDirPath, "*"), { type: "dir" });
10790
+ const skillsDirPath = join76(this.baseDir, paths.relativeDirPath);
10791
+ const dirPaths = await findFilesByGlobs(join76(skillsDirPath, "*"), { type: "dir" });
10545
10792
  const dirNames = dirPaths.map((path3) => basename5(path3));
10546
10793
  const toolSkills = await Promise.all(
10547
10794
  dirNames.map(
@@ -10558,8 +10805,8 @@ var SkillsProcessor = class extends DirFeatureProcessor {
10558
10805
  async loadToolDirsToDelete() {
10559
10806
  const factory = this.getFactory(this.toolTarget);
10560
10807
  const paths = factory.class.getSettablePaths({ global: this.global });
10561
- const skillsDirPath = join75(this.baseDir, paths.relativeDirPath);
10562
- const dirPaths = await findFilesByGlobs(join75(skillsDirPath, "*"), { type: "dir" });
10808
+ const skillsDirPath = join76(this.baseDir, paths.relativeDirPath);
10809
+ const dirPaths = await findFilesByGlobs(join76(skillsDirPath, "*"), { type: "dir" });
10563
10810
  const dirNames = dirPaths.map((path3) => basename5(path3));
10564
10811
  const toolSkills = dirNames.map(
10565
10812
  (dirName) => factory.class.forDeletion({
@@ -10621,11 +10868,11 @@ var SkillsProcessor = class extends DirFeatureProcessor {
10621
10868
  };
10622
10869
 
10623
10870
  // src/features/subagents/agentsmd-subagent.ts
10624
- import { join as join77 } from "path";
10871
+ import { join as join78 } from "path";
10625
10872
 
10626
10873
  // src/features/subagents/simulated-subagent.ts
10627
- import { basename as basename6, join as join76 } from "path";
10628
- import { z as z39 } from "zod/mini";
10874
+ import { basename as basename6, join as join77 } from "path";
10875
+ import { z as z40 } from "zod/mini";
10629
10876
 
10630
10877
  // src/features/subagents/tool-subagent.ts
10631
10878
  var ToolSubagent = class extends ToolFile {
@@ -10677,9 +10924,9 @@ var ToolSubagent = class extends ToolFile {
10677
10924
  };
10678
10925
 
10679
10926
  // src/features/subagents/simulated-subagent.ts
10680
- var SimulatedSubagentFrontmatterSchema = z39.object({
10681
- name: z39.string(),
10682
- description: z39.optional(z39.string())
10927
+ var SimulatedSubagentFrontmatterSchema = z40.object({
10928
+ name: z40.string(),
10929
+ description: z40.optional(z40.string())
10683
10930
  });
10684
10931
  var SimulatedSubagent = class extends ToolSubagent {
10685
10932
  frontmatter;
@@ -10689,7 +10936,7 @@ var SimulatedSubagent = class extends ToolSubagent {
10689
10936
  const result = SimulatedSubagentFrontmatterSchema.safeParse(frontmatter);
10690
10937
  if (!result.success) {
10691
10938
  throw new Error(
10692
- `Invalid frontmatter in ${join76(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
10939
+ `Invalid frontmatter in ${join77(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
10693
10940
  );
10694
10941
  }
10695
10942
  }
@@ -10740,7 +10987,7 @@ var SimulatedSubagent = class extends ToolSubagent {
10740
10987
  return {
10741
10988
  success: false,
10742
10989
  error: new Error(
10743
- `Invalid frontmatter in ${join76(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
10990
+ `Invalid frontmatter in ${join77(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
10744
10991
  )
10745
10992
  };
10746
10993
  }
@@ -10750,7 +10997,7 @@ var SimulatedSubagent = class extends ToolSubagent {
10750
10997
  relativeFilePath,
10751
10998
  validate = true
10752
10999
  }) {
10753
- const filePath = join76(baseDir, this.getSettablePaths().relativeDirPath, relativeFilePath);
11000
+ const filePath = join77(baseDir, this.getSettablePaths().relativeDirPath, relativeFilePath);
10754
11001
  const fileContent = await readFileContent(filePath);
10755
11002
  const { frontmatter, body: content } = parseFrontmatter(fileContent, filePath);
10756
11003
  const result = SimulatedSubagentFrontmatterSchema.safeParse(frontmatter);
@@ -10786,7 +11033,7 @@ var SimulatedSubagent = class extends ToolSubagent {
10786
11033
  var AgentsmdSubagent = class _AgentsmdSubagent extends SimulatedSubagent {
10787
11034
  static getSettablePaths() {
10788
11035
  return {
10789
- relativeDirPath: join77(".agents", "subagents")
11036
+ relativeDirPath: join78(".agents", "subagents")
10790
11037
  };
10791
11038
  }
10792
11039
  static async fromFile(params) {
@@ -10809,11 +11056,11 @@ var AgentsmdSubagent = class _AgentsmdSubagent extends SimulatedSubagent {
10809
11056
  };
10810
11057
 
10811
11058
  // src/features/subagents/factorydroid-subagent.ts
10812
- import { join as join78 } from "path";
11059
+ import { join as join79 } from "path";
10813
11060
  var FactorydroidSubagent = class _FactorydroidSubagent extends SimulatedSubagent {
10814
11061
  static getSettablePaths(_options) {
10815
11062
  return {
10816
- relativeDirPath: join78(".factory", "droids")
11063
+ relativeDirPath: join79(".factory", "droids")
10817
11064
  };
10818
11065
  }
10819
11066
  static async fromFile(params) {
@@ -10836,11 +11083,11 @@ var FactorydroidSubagent = class _FactorydroidSubagent extends SimulatedSubagent
10836
11083
  };
10837
11084
 
10838
11085
  // src/features/subagents/geminicli-subagent.ts
10839
- import { join as join79 } from "path";
11086
+ import { join as join80 } from "path";
10840
11087
  var GeminiCliSubagent = class _GeminiCliSubagent extends SimulatedSubagent {
10841
11088
  static getSettablePaths() {
10842
11089
  return {
10843
- relativeDirPath: join79(".gemini", "subagents")
11090
+ relativeDirPath: join80(".gemini", "subagents")
10844
11091
  };
10845
11092
  }
10846
11093
  static async fromFile(params) {
@@ -10863,11 +11110,11 @@ var GeminiCliSubagent = class _GeminiCliSubagent extends SimulatedSubagent {
10863
11110
  };
10864
11111
 
10865
11112
  // src/features/subagents/roo-subagent.ts
10866
- import { join as join80 } from "path";
11113
+ import { join as join81 } from "path";
10867
11114
  var RooSubagent = class _RooSubagent extends SimulatedSubagent {
10868
11115
  static getSettablePaths() {
10869
11116
  return {
10870
- relativeDirPath: join80(".roo", "subagents")
11117
+ relativeDirPath: join81(".roo", "subagents")
10871
11118
  };
10872
11119
  }
10873
11120
  static async fromFile(params) {
@@ -10890,20 +11137,20 @@ var RooSubagent = class _RooSubagent extends SimulatedSubagent {
10890
11137
  };
10891
11138
 
10892
11139
  // src/features/subagents/subagents-processor.ts
10893
- import { basename as basename9, join as join88 } from "path";
10894
- import { z as z47 } from "zod/mini";
11140
+ import { basename as basename9, join as join90 } from "path";
11141
+ import { z as z49 } from "zod/mini";
10895
11142
 
10896
11143
  // src/features/subagents/claudecode-subagent.ts
10897
- import { join as join82 } from "path";
10898
- import { z as z41 } from "zod/mini";
11144
+ import { join as join83 } from "path";
11145
+ import { z as z42 } from "zod/mini";
10899
11146
 
10900
11147
  // src/features/subagents/rulesync-subagent.ts
10901
- import { basename as basename7, join as join81 } from "path";
10902
- import { z as z40 } from "zod/mini";
10903
- var RulesyncSubagentFrontmatterSchema = z40.looseObject({
10904
- targets: z40._default(RulesyncTargetsSchema, ["*"]),
10905
- name: z40.string(),
10906
- description: z40.optional(z40.string())
11148
+ import { basename as basename7, join as join82 } from "path";
11149
+ import { z as z41 } from "zod/mini";
11150
+ var RulesyncSubagentFrontmatterSchema = z41.looseObject({
11151
+ targets: z41._default(RulesyncTargetsSchema, ["*"]),
11152
+ name: z41.string(),
11153
+ description: z41.optional(z41.string())
10907
11154
  });
10908
11155
  var RulesyncSubagent = class _RulesyncSubagent extends RulesyncFile {
10909
11156
  frontmatter;
@@ -10912,7 +11159,7 @@ var RulesyncSubagent = class _RulesyncSubagent extends RulesyncFile {
10912
11159
  const parseResult = RulesyncSubagentFrontmatterSchema.safeParse(frontmatter);
10913
11160
  if (!parseResult.success && rest.validate !== false) {
10914
11161
  throw new Error(
10915
- `Invalid frontmatter in ${join81(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(parseResult.error)}`
11162
+ `Invalid frontmatter in ${join82(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(parseResult.error)}`
10916
11163
  );
10917
11164
  }
10918
11165
  const parsedFrontmatter = parseResult.success ? { ...frontmatter, ...parseResult.data } : { ...frontmatter, targets: frontmatter?.targets ?? ["*"] };
@@ -10945,7 +11192,7 @@ var RulesyncSubagent = class _RulesyncSubagent extends RulesyncFile {
10945
11192
  return {
10946
11193
  success: false,
10947
11194
  error: new Error(
10948
- `Invalid frontmatter in ${join81(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
11195
+ `Invalid frontmatter in ${join82(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
10949
11196
  )
10950
11197
  };
10951
11198
  }
@@ -10953,7 +11200,7 @@ var RulesyncSubagent = class _RulesyncSubagent extends RulesyncFile {
10953
11200
  static async fromFile({
10954
11201
  relativeFilePath
10955
11202
  }) {
10956
- const filePath = join81(process.cwd(), RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH, relativeFilePath);
11203
+ const filePath = join82(process.cwd(), RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH, relativeFilePath);
10957
11204
  const fileContent = await readFileContent(filePath);
10958
11205
  const { frontmatter, body: content } = parseFrontmatter(fileContent, filePath);
10959
11206
  const result = RulesyncSubagentFrontmatterSchema.safeParse(frontmatter);
@@ -10972,13 +11219,13 @@ var RulesyncSubagent = class _RulesyncSubagent extends RulesyncFile {
10972
11219
  };
10973
11220
 
10974
11221
  // src/features/subagents/claudecode-subagent.ts
10975
- var ClaudecodeSubagentFrontmatterSchema = z41.looseObject({
10976
- name: z41.string(),
10977
- description: z41.optional(z41.string()),
10978
- model: z41.optional(z41.string()),
10979
- tools: z41.optional(z41.union([z41.string(), z41.array(z41.string())])),
10980
- permissionMode: z41.optional(z41.string()),
10981
- skills: z41.optional(z41.union([z41.string(), z41.array(z41.string())]))
11222
+ var ClaudecodeSubagentFrontmatterSchema = z42.looseObject({
11223
+ name: z42.string(),
11224
+ description: z42.optional(z42.string()),
11225
+ model: z42.optional(z42.string()),
11226
+ tools: z42.optional(z42.union([z42.string(), z42.array(z42.string())])),
11227
+ permissionMode: z42.optional(z42.string()),
11228
+ skills: z42.optional(z42.union([z42.string(), z42.array(z42.string())]))
10982
11229
  });
10983
11230
  var ClaudecodeSubagent = class _ClaudecodeSubagent extends ToolSubagent {
10984
11231
  frontmatter;
@@ -10988,7 +11235,7 @@ var ClaudecodeSubagent = class _ClaudecodeSubagent extends ToolSubagent {
10988
11235
  const result = ClaudecodeSubagentFrontmatterSchema.safeParse(frontmatter);
10989
11236
  if (!result.success) {
10990
11237
  throw new Error(
10991
- `Invalid frontmatter in ${join82(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
11238
+ `Invalid frontmatter in ${join83(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
10992
11239
  );
10993
11240
  }
10994
11241
  }
@@ -11000,7 +11247,7 @@ var ClaudecodeSubagent = class _ClaudecodeSubagent extends ToolSubagent {
11000
11247
  }
11001
11248
  static getSettablePaths(_options = {}) {
11002
11249
  return {
11003
- relativeDirPath: join82(".claude", "agents")
11250
+ relativeDirPath: join83(".claude", "agents")
11004
11251
  };
11005
11252
  }
11006
11253
  getFrontmatter() {
@@ -11039,7 +11286,10 @@ var ClaudecodeSubagent = class _ClaudecodeSubagent extends ToolSubagent {
11039
11286
  global = false
11040
11287
  }) {
11041
11288
  const rulesyncFrontmatter = rulesyncSubagent.getFrontmatter();
11042
- const claudecodeSection = rulesyncFrontmatter.claudecode ?? {};
11289
+ const claudecodeSection = this.filterToolSpecificSection(rulesyncFrontmatter.claudecode ?? {}, [
11290
+ "name",
11291
+ "description"
11292
+ ]);
11043
11293
  const rawClaudecodeFrontmatter = {
11044
11294
  name: rulesyncFrontmatter.name,
11045
11295
  description: rulesyncFrontmatter.description,
@@ -11076,7 +11326,7 @@ var ClaudecodeSubagent = class _ClaudecodeSubagent extends ToolSubagent {
11076
11326
  return {
11077
11327
  success: false,
11078
11328
  error: new Error(
11079
- `Invalid frontmatter in ${join82(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
11329
+ `Invalid frontmatter in ${join83(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
11080
11330
  )
11081
11331
  };
11082
11332
  }
@@ -11094,7 +11344,7 @@ var ClaudecodeSubagent = class _ClaudecodeSubagent extends ToolSubagent {
11094
11344
  global = false
11095
11345
  }) {
11096
11346
  const paths = this.getSettablePaths({ global });
11097
- const filePath = join82(baseDir, paths.relativeDirPath, relativeFilePath);
11347
+ const filePath = join83(baseDir, paths.relativeDirPath, relativeFilePath);
11098
11348
  const fileContent = await readFileContent(filePath);
11099
11349
  const { frontmatter, body: content } = parseFrontmatter(fileContent, filePath);
11100
11350
  const result = ClaudecodeSubagentFrontmatterSchema.safeParse(frontmatter);
@@ -11129,16 +11379,16 @@ var ClaudecodeSubagent = class _ClaudecodeSubagent extends ToolSubagent {
11129
11379
  };
11130
11380
 
11131
11381
  // src/features/subagents/codexcli-subagent.ts
11132
- import { join as join83 } from "path";
11382
+ import { join as join84 } from "path";
11133
11383
  import * as smolToml2 from "smol-toml";
11134
- import { z as z42 } from "zod/mini";
11135
- var CodexCliSubagentTomlSchema = z42.looseObject({
11136
- name: z42.string(),
11137
- description: z42.optional(z42.string()),
11138
- developer_instructions: z42.optional(z42.string()),
11139
- model: z42.optional(z42.string()),
11140
- model_reasoning_effort: z42.optional(z42.string()),
11141
- sandbox_mode: z42.optional(z42.string())
11384
+ import { z as z43 } from "zod/mini";
11385
+ var CodexCliSubagentTomlSchema = z43.looseObject({
11386
+ name: z43.string(),
11387
+ description: z43.optional(z43.string()),
11388
+ developer_instructions: z43.optional(z43.string()),
11389
+ model: z43.optional(z43.string()),
11390
+ model_reasoning_effort: z43.optional(z43.string()),
11391
+ sandbox_mode: z43.optional(z43.string())
11142
11392
  });
11143
11393
  var CodexCliSubagent = class _CodexCliSubagent extends ToolSubagent {
11144
11394
  body;
@@ -11149,7 +11399,7 @@ var CodexCliSubagent = class _CodexCliSubagent extends ToolSubagent {
11149
11399
  CodexCliSubagentTomlSchema.parse(parsed);
11150
11400
  } catch (error) {
11151
11401
  throw new Error(
11152
- `Invalid TOML in ${join83(rest.relativeDirPath, rest.relativeFilePath)}: ${error instanceof Error ? error.message : String(error)}`,
11402
+ `Invalid TOML in ${join84(rest.relativeDirPath, rest.relativeFilePath)}: ${error instanceof Error ? error.message : String(error)}`,
11153
11403
  { cause: error }
11154
11404
  );
11155
11405
  }
@@ -11161,7 +11411,7 @@ var CodexCliSubagent = class _CodexCliSubagent extends ToolSubagent {
11161
11411
  }
11162
11412
  static getSettablePaths(_options = {}) {
11163
11413
  return {
11164
- relativeDirPath: join83(".codex", "agents")
11414
+ relativeDirPath: join84(".codex", "agents")
11165
11415
  };
11166
11416
  }
11167
11417
  getBody() {
@@ -11173,7 +11423,7 @@ var CodexCliSubagent = class _CodexCliSubagent extends ToolSubagent {
11173
11423
  parsed = CodexCliSubagentTomlSchema.parse(smolToml2.parse(this.body));
11174
11424
  } catch (error) {
11175
11425
  throw new Error(
11176
- `Failed to parse TOML in ${join83(this.getRelativeDirPath(), this.getRelativeFilePath())}: ${error instanceof Error ? error.message : String(error)}`,
11426
+ `Failed to parse TOML in ${join84(this.getRelativeDirPath(), this.getRelativeFilePath())}: ${error instanceof Error ? error.message : String(error)}`,
11177
11427
  { cause: error }
11178
11428
  );
11179
11429
  }
@@ -11254,7 +11504,7 @@ var CodexCliSubagent = class _CodexCliSubagent extends ToolSubagent {
11254
11504
  global = false
11255
11505
  }) {
11256
11506
  const paths = this.getSettablePaths({ global });
11257
- const filePath = join83(baseDir, paths.relativeDirPath, relativeFilePath);
11507
+ const filePath = join84(baseDir, paths.relativeDirPath, relativeFilePath);
11258
11508
  const fileContent = await readFileContent(filePath);
11259
11509
  const subagent = new _CodexCliSubagent({
11260
11510
  baseDir,
@@ -11292,13 +11542,13 @@ var CodexCliSubagent = class _CodexCliSubagent extends ToolSubagent {
11292
11542
  };
11293
11543
 
11294
11544
  // src/features/subagents/copilot-subagent.ts
11295
- import { join as join84 } from "path";
11296
- import { z as z43 } from "zod/mini";
11545
+ import { join as join85 } from "path";
11546
+ import { z as z44 } from "zod/mini";
11297
11547
  var REQUIRED_TOOL = "agent/runSubagent";
11298
- var CopilotSubagentFrontmatterSchema = z43.looseObject({
11299
- name: z43.string(),
11300
- description: z43.optional(z43.string()),
11301
- tools: z43.optional(z43.union([z43.string(), z43.array(z43.string())]))
11548
+ var CopilotSubagentFrontmatterSchema = z44.looseObject({
11549
+ name: z44.string(),
11550
+ description: z44.optional(z44.string()),
11551
+ tools: z44.optional(z44.union([z44.string(), z44.array(z44.string())]))
11302
11552
  });
11303
11553
  var normalizeTools = (tools) => {
11304
11554
  if (!tools) {
@@ -11318,7 +11568,7 @@ var CopilotSubagent = class _CopilotSubagent extends ToolSubagent {
11318
11568
  const result = CopilotSubagentFrontmatterSchema.safeParse(frontmatter);
11319
11569
  if (!result.success) {
11320
11570
  throw new Error(
11321
- `Invalid frontmatter in ${join84(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
11571
+ `Invalid frontmatter in ${join85(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
11322
11572
  );
11323
11573
  }
11324
11574
  }
@@ -11330,7 +11580,7 @@ var CopilotSubagent = class _CopilotSubagent extends ToolSubagent {
11330
11580
  }
11331
11581
  static getSettablePaths(_options = {}) {
11332
11582
  return {
11333
- relativeDirPath: join84(".github", "agents")
11583
+ relativeDirPath: join85(".github", "agents")
11334
11584
  };
11335
11585
  }
11336
11586
  getFrontmatter() {
@@ -11404,7 +11654,7 @@ var CopilotSubagent = class _CopilotSubagent extends ToolSubagent {
11404
11654
  return {
11405
11655
  success: false,
11406
11656
  error: new Error(
11407
- `Invalid frontmatter in ${join84(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
11657
+ `Invalid frontmatter in ${join85(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
11408
11658
  )
11409
11659
  };
11410
11660
  }
@@ -11422,7 +11672,7 @@ var CopilotSubagent = class _CopilotSubagent extends ToolSubagent {
11422
11672
  global = false
11423
11673
  }) {
11424
11674
  const paths = this.getSettablePaths({ global });
11425
- const filePath = join84(baseDir, paths.relativeDirPath, relativeFilePath);
11675
+ const filePath = join85(baseDir, paths.relativeDirPath, relativeFilePath);
11426
11676
  const fileContent = await readFileContent(filePath);
11427
11677
  const { frontmatter, body: content } = parseFrontmatter(fileContent, filePath);
11428
11678
  const result = CopilotSubagentFrontmatterSchema.safeParse(frontmatter);
@@ -11458,11 +11708,11 @@ var CopilotSubagent = class _CopilotSubagent extends ToolSubagent {
11458
11708
  };
11459
11709
 
11460
11710
  // src/features/subagents/cursor-subagent.ts
11461
- import { join as join85 } from "path";
11462
- import { z as z44 } from "zod/mini";
11463
- var CursorSubagentFrontmatterSchema = z44.looseObject({
11464
- name: z44.string(),
11465
- description: z44.optional(z44.string())
11711
+ import { join as join86 } from "path";
11712
+ import { z as z45 } from "zod/mini";
11713
+ var CursorSubagentFrontmatterSchema = z45.looseObject({
11714
+ name: z45.string(),
11715
+ description: z45.optional(z45.string())
11466
11716
  });
11467
11717
  var CursorSubagent = class _CursorSubagent extends ToolSubagent {
11468
11718
  frontmatter;
@@ -11472,7 +11722,7 @@ var CursorSubagent = class _CursorSubagent extends ToolSubagent {
11472
11722
  const result = CursorSubagentFrontmatterSchema.safeParse(frontmatter);
11473
11723
  if (!result.success) {
11474
11724
  throw new Error(
11475
- `Invalid frontmatter in ${join85(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
11725
+ `Invalid frontmatter in ${join86(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
11476
11726
  );
11477
11727
  }
11478
11728
  }
@@ -11484,7 +11734,7 @@ var CursorSubagent = class _CursorSubagent extends ToolSubagent {
11484
11734
  }
11485
11735
  static getSettablePaths(_options = {}) {
11486
11736
  return {
11487
- relativeDirPath: join85(".cursor", "agents")
11737
+ relativeDirPath: join86(".cursor", "agents")
11488
11738
  };
11489
11739
  }
11490
11740
  getFrontmatter() {
@@ -11551,7 +11801,7 @@ var CursorSubagent = class _CursorSubagent extends ToolSubagent {
11551
11801
  return {
11552
11802
  success: false,
11553
11803
  error: new Error(
11554
- `Invalid frontmatter in ${join85(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
11804
+ `Invalid frontmatter in ${join86(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
11555
11805
  )
11556
11806
  };
11557
11807
  }
@@ -11569,7 +11819,7 @@ var CursorSubagent = class _CursorSubagent extends ToolSubagent {
11569
11819
  global = false
11570
11820
  }) {
11571
11821
  const paths = this.getSettablePaths({ global });
11572
- const filePath = join85(baseDir, paths.relativeDirPath, relativeFilePath);
11822
+ const filePath = join86(baseDir, paths.relativeDirPath, relativeFilePath);
11573
11823
  const fileContent = await readFileContent(filePath);
11574
11824
  const { frontmatter, body: content } = parseFrontmatter(fileContent, filePath);
11575
11825
  const result = CursorSubagentFrontmatterSchema.safeParse(frontmatter);
@@ -11604,24 +11854,182 @@ var CursorSubagent = class _CursorSubagent extends ToolSubagent {
11604
11854
  }
11605
11855
  };
11606
11856
 
11857
+ // src/features/subagents/junie-subagent.ts
11858
+ import { join as join87 } from "path";
11859
+ import { z as z46 } from "zod/mini";
11860
+ var JunieSubagentFrontmatterSchema = z46.looseObject({
11861
+ name: z46.optional(z46.string()),
11862
+ description: z46.string()
11863
+ });
11864
+ var JunieSubagent = class _JunieSubagent extends ToolSubagent {
11865
+ frontmatter;
11866
+ body;
11867
+ constructor({ frontmatter, body, ...rest }) {
11868
+ if (rest.validate !== false) {
11869
+ const result = JunieSubagentFrontmatterSchema.safeParse(frontmatter);
11870
+ if (!result.success) {
11871
+ throw new Error(
11872
+ `Invalid frontmatter in ${join87(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
11873
+ );
11874
+ }
11875
+ }
11876
+ super({
11877
+ ...rest
11878
+ });
11879
+ this.frontmatter = frontmatter;
11880
+ this.body = body;
11881
+ }
11882
+ static getSettablePaths(options = {}) {
11883
+ if (options?.global) {
11884
+ throw new Error("JunieSubagent does not support global mode.");
11885
+ }
11886
+ return {
11887
+ relativeDirPath: join87(".junie", "agents")
11888
+ };
11889
+ }
11890
+ getFrontmatter() {
11891
+ return this.frontmatter;
11892
+ }
11893
+ getBody() {
11894
+ return this.body;
11895
+ }
11896
+ toRulesyncSubagent() {
11897
+ const { name, description, ...restFields } = this.frontmatter;
11898
+ const junieSection = {
11899
+ ...restFields
11900
+ };
11901
+ const rulesyncFrontmatter = {
11902
+ targets: ["*"],
11903
+ name: name ?? this.getRelativeFilePath().replace(/\.md$/, ""),
11904
+ description,
11905
+ ...Object.keys(junieSection).length > 0 && { junie: junieSection }
11906
+ };
11907
+ return new RulesyncSubagent({
11908
+ baseDir: ".",
11909
+ frontmatter: rulesyncFrontmatter,
11910
+ body: this.body,
11911
+ relativeDirPath: RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH,
11912
+ relativeFilePath: this.getRelativeFilePath(),
11913
+ validate: true
11914
+ });
11915
+ }
11916
+ static fromRulesyncSubagent({
11917
+ baseDir = process.cwd(),
11918
+ rulesyncSubagent,
11919
+ validate = true,
11920
+ global = false
11921
+ }) {
11922
+ const rulesyncFrontmatter = rulesyncSubagent.getFrontmatter();
11923
+ const junieSection = this.filterToolSpecificSection(rulesyncFrontmatter.junie ?? {}, [
11924
+ "name",
11925
+ "description"
11926
+ ]);
11927
+ const rawJunieFrontmatter = {
11928
+ name: rulesyncFrontmatter.name,
11929
+ description: rulesyncFrontmatter.description,
11930
+ ...junieSection
11931
+ };
11932
+ const result = JunieSubagentFrontmatterSchema.safeParse(rawJunieFrontmatter);
11933
+ if (!result.success) {
11934
+ throw new Error(
11935
+ `Invalid junie subagent frontmatter in ${rulesyncSubagent.getRelativeFilePath()}: ${formatError(result.error)}`
11936
+ );
11937
+ }
11938
+ const junieFrontmatter = result.data;
11939
+ const body = rulesyncSubagent.getBody();
11940
+ const fileContent = stringifyFrontmatter(body, junieFrontmatter);
11941
+ const paths = this.getSettablePaths({ global });
11942
+ return new _JunieSubagent({
11943
+ baseDir,
11944
+ frontmatter: junieFrontmatter,
11945
+ body,
11946
+ relativeDirPath: paths.relativeDirPath,
11947
+ relativeFilePath: rulesyncSubagent.getRelativeFilePath(),
11948
+ fileContent,
11949
+ validate
11950
+ });
11951
+ }
11952
+ validate() {
11953
+ if (!this.frontmatter) {
11954
+ return { success: true, error: null };
11955
+ }
11956
+ const result = JunieSubagentFrontmatterSchema.safeParse(this.frontmatter);
11957
+ if (result.success) {
11958
+ return { success: true, error: null };
11959
+ } else {
11960
+ return {
11961
+ success: false,
11962
+ error: new Error(
11963
+ `Invalid frontmatter in ${join87(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
11964
+ )
11965
+ };
11966
+ }
11967
+ }
11968
+ static isTargetedByRulesyncSubagent(rulesyncSubagent) {
11969
+ return this.isTargetedByRulesyncSubagentDefault({
11970
+ rulesyncSubagent,
11971
+ toolTarget: "junie"
11972
+ });
11973
+ }
11974
+ static async fromFile({
11975
+ baseDir = process.cwd(),
11976
+ relativeFilePath,
11977
+ validate = true,
11978
+ global = false
11979
+ }) {
11980
+ const paths = this.getSettablePaths({ global });
11981
+ const filePath = join87(baseDir, paths.relativeDirPath, relativeFilePath);
11982
+ const fileContent = await readFileContent(filePath);
11983
+ const { frontmatter, body: content } = parseFrontmatter(fileContent, filePath);
11984
+ const result = JunieSubagentFrontmatterSchema.safeParse(frontmatter);
11985
+ if (!result.success) {
11986
+ throw new Error(`Invalid frontmatter in ${filePath}: ${formatError(result.error)}`);
11987
+ }
11988
+ return new _JunieSubagent({
11989
+ baseDir,
11990
+ relativeDirPath: paths.relativeDirPath,
11991
+ relativeFilePath,
11992
+ frontmatter: result.data,
11993
+ body: content.trim(),
11994
+ fileContent,
11995
+ validate
11996
+ });
11997
+ }
11998
+ static forDeletion({
11999
+ baseDir = process.cwd(),
12000
+ relativeDirPath,
12001
+ relativeFilePath
12002
+ }) {
12003
+ return new _JunieSubagent({
12004
+ baseDir,
12005
+ relativeDirPath,
12006
+ relativeFilePath,
12007
+ frontmatter: { name: "", description: "" },
12008
+ body: "",
12009
+ fileContent: "",
12010
+ validate: false
12011
+ });
12012
+ }
12013
+ };
12014
+
11607
12015
  // src/features/subagents/kiro-subagent.ts
11608
- import { join as join86 } from "path";
11609
- import { z as z45 } from "zod/mini";
11610
- var KiroCliSubagentJsonSchema = z45.looseObject({
11611
- name: z45.string(),
11612
- description: z45.optional(z45.nullable(z45.string())),
11613
- prompt: z45.optional(z45.nullable(z45.string())),
11614
- tools: z45.optional(z45.nullable(z45.array(z45.string()))),
11615
- toolAliases: z45.optional(z45.nullable(z45.record(z45.string(), z45.string()))),
11616
- toolSettings: z45.optional(z45.nullable(z45.unknown())),
11617
- toolSchema: z45.optional(z45.nullable(z45.unknown())),
11618
- hooks: z45.optional(z45.nullable(z45.record(z45.string(), z45.array(z45.unknown())))),
11619
- model: z45.optional(z45.nullable(z45.string())),
11620
- mcpServers: z45.optional(z45.nullable(z45.record(z45.string(), z45.unknown()))),
11621
- useLegacyMcpJson: z45.optional(z45.nullable(z45.boolean())),
11622
- resources: z45.optional(z45.nullable(z45.array(z45.string()))),
11623
- allowedTools: z45.optional(z45.nullable(z45.array(z45.string()))),
11624
- includeMcpJson: z45.optional(z45.nullable(z45.boolean()))
12016
+ import { join as join88 } from "path";
12017
+ import { z as z47 } from "zod/mini";
12018
+ var KiroCliSubagentJsonSchema = z47.looseObject({
12019
+ name: z47.string(),
12020
+ description: z47.optional(z47.nullable(z47.string())),
12021
+ prompt: z47.optional(z47.nullable(z47.string())),
12022
+ tools: z47.optional(z47.nullable(z47.array(z47.string()))),
12023
+ toolAliases: z47.optional(z47.nullable(z47.record(z47.string(), z47.string()))),
12024
+ toolSettings: z47.optional(z47.nullable(z47.unknown())),
12025
+ toolSchema: z47.optional(z47.nullable(z47.unknown())),
12026
+ hooks: z47.optional(z47.nullable(z47.record(z47.string(), z47.array(z47.unknown())))),
12027
+ model: z47.optional(z47.nullable(z47.string())),
12028
+ mcpServers: z47.optional(z47.nullable(z47.record(z47.string(), z47.unknown()))),
12029
+ useLegacyMcpJson: z47.optional(z47.nullable(z47.boolean())),
12030
+ resources: z47.optional(z47.nullable(z47.array(z47.string()))),
12031
+ allowedTools: z47.optional(z47.nullable(z47.array(z47.string()))),
12032
+ includeMcpJson: z47.optional(z47.nullable(z47.boolean()))
11625
12033
  });
11626
12034
  var KiroSubagent = class _KiroSubagent extends ToolSubagent {
11627
12035
  body;
@@ -11632,7 +12040,7 @@ var KiroSubagent = class _KiroSubagent extends ToolSubagent {
11632
12040
  KiroCliSubagentJsonSchema.parse(parsed);
11633
12041
  } catch (error) {
11634
12042
  throw new Error(
11635
- `Invalid JSON in ${join86(rest.relativeDirPath, rest.relativeFilePath)}: ${error instanceof Error ? error.message : String(error)}`,
12043
+ `Invalid JSON in ${join88(rest.relativeDirPath, rest.relativeFilePath)}: ${error instanceof Error ? error.message : String(error)}`,
11636
12044
  { cause: error }
11637
12045
  );
11638
12046
  }
@@ -11644,7 +12052,7 @@ var KiroSubagent = class _KiroSubagent extends ToolSubagent {
11644
12052
  }
11645
12053
  static getSettablePaths(_options = {}) {
11646
12054
  return {
11647
- relativeDirPath: join86(".kiro", "agents")
12055
+ relativeDirPath: join88(".kiro", "agents")
11648
12056
  };
11649
12057
  }
11650
12058
  getBody() {
@@ -11656,7 +12064,7 @@ var KiroSubagent = class _KiroSubagent extends ToolSubagent {
11656
12064
  parsed = JSON.parse(this.body);
11657
12065
  } catch (error) {
11658
12066
  throw new Error(
11659
- `Failed to parse JSON in ${join86(this.getRelativeDirPath(), this.getRelativeFilePath())}: ${error instanceof Error ? error.message : String(error)}`,
12067
+ `Failed to parse JSON in ${join88(this.getRelativeDirPath(), this.getRelativeFilePath())}: ${error instanceof Error ? error.message : String(error)}`,
11660
12068
  { cause: error }
11661
12069
  );
11662
12070
  }
@@ -11737,7 +12145,7 @@ var KiroSubagent = class _KiroSubagent extends ToolSubagent {
11737
12145
  global = false
11738
12146
  }) {
11739
12147
  const paths = this.getSettablePaths({ global });
11740
- const filePath = join86(baseDir, paths.relativeDirPath, relativeFilePath);
12148
+ const filePath = join88(baseDir, paths.relativeDirPath, relativeFilePath);
11741
12149
  const fileContent = await readFileContent(filePath);
11742
12150
  const subagent = new _KiroSubagent({
11743
12151
  baseDir,
@@ -11775,12 +12183,12 @@ var KiroSubagent = class _KiroSubagent extends ToolSubagent {
11775
12183
  };
11776
12184
 
11777
12185
  // src/features/subagents/opencode-subagent.ts
11778
- import { basename as basename8, join as join87 } from "path";
11779
- import { z as z46 } from "zod/mini";
11780
- var OpenCodeSubagentFrontmatterSchema = z46.looseObject({
11781
- description: z46.optional(z46.string()),
11782
- mode: z46._default(z46.string(), "subagent"),
11783
- name: z46.optional(z46.string())
12186
+ import { basename as basename8, join as join89 } from "path";
12187
+ import { z as z48 } from "zod/mini";
12188
+ var OpenCodeSubagentFrontmatterSchema = z48.looseObject({
12189
+ description: z48.optional(z48.string()),
12190
+ mode: z48._default(z48.string(), "subagent"),
12191
+ name: z48.optional(z48.string())
11784
12192
  });
11785
12193
  var OpenCodeSubagent = class _OpenCodeSubagent extends ToolSubagent {
11786
12194
  frontmatter;
@@ -11790,7 +12198,7 @@ var OpenCodeSubagent = class _OpenCodeSubagent extends ToolSubagent {
11790
12198
  const result = OpenCodeSubagentFrontmatterSchema.safeParse(frontmatter);
11791
12199
  if (!result.success) {
11792
12200
  throw new Error(
11793
- `Invalid frontmatter in ${join87(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
12201
+ `Invalid frontmatter in ${join89(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
11794
12202
  );
11795
12203
  }
11796
12204
  }
@@ -11804,7 +12212,7 @@ var OpenCodeSubagent = class _OpenCodeSubagent extends ToolSubagent {
11804
12212
  global = false
11805
12213
  } = {}) {
11806
12214
  return {
11807
- relativeDirPath: global ? join87(".config", "opencode", "agent") : join87(".opencode", "agent")
12215
+ relativeDirPath: global ? join89(".config", "opencode", "agent") : join89(".opencode", "agent")
11808
12216
  };
11809
12217
  }
11810
12218
  getFrontmatter() {
@@ -11870,7 +12278,7 @@ var OpenCodeSubagent = class _OpenCodeSubagent extends ToolSubagent {
11870
12278
  return {
11871
12279
  success: false,
11872
12280
  error: new Error(
11873
- `Invalid frontmatter in ${join87(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
12281
+ `Invalid frontmatter in ${join89(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
11874
12282
  )
11875
12283
  };
11876
12284
  }
@@ -11887,7 +12295,7 @@ var OpenCodeSubagent = class _OpenCodeSubagent extends ToolSubagent {
11887
12295
  global = false
11888
12296
  }) {
11889
12297
  const paths = this.getSettablePaths({ global });
11890
- const filePath = join87(baseDir, paths.relativeDirPath, relativeFilePath);
12298
+ const filePath = join89(baseDir, paths.relativeDirPath, relativeFilePath);
11891
12299
  const fileContent = await readFileContent(filePath);
11892
12300
  const { frontmatter, body: content } = parseFrontmatter(fileContent, filePath);
11893
12301
  const result = OpenCodeSubagentFrontmatterSchema.safeParse(frontmatter);
@@ -11932,11 +12340,12 @@ var subagentsProcessorToolTargetTuple = [
11932
12340
  "cursor",
11933
12341
  "factorydroid",
11934
12342
  "geminicli",
12343
+ "junie",
11935
12344
  "kiro",
11936
12345
  "opencode",
11937
12346
  "roo"
11938
12347
  ];
11939
- var SubagentsProcessorToolTargetSchema = z47.enum(subagentsProcessorToolTargetTuple);
12348
+ var SubagentsProcessorToolTargetSchema = z49.enum(subagentsProcessorToolTargetTuple);
11940
12349
  var toolSubagentFactories = /* @__PURE__ */ new Map([
11941
12350
  [
11942
12351
  "agentsmd",
@@ -11994,6 +12403,13 @@ var toolSubagentFactories = /* @__PURE__ */ new Map([
11994
12403
  meta: { supportsSimulated: true, supportsGlobal: false, filePattern: "*.md" }
11995
12404
  }
11996
12405
  ],
12406
+ [
12407
+ "junie",
12408
+ {
12409
+ class: JunieSubagent,
12410
+ meta: { supportsSimulated: false, supportsGlobal: false, filePattern: "*.md" }
12411
+ }
12412
+ ],
11997
12413
  [
11998
12414
  "kiro",
11999
12415
  {
@@ -12098,7 +12514,7 @@ var SubagentsProcessor = class extends FeatureProcessor {
12098
12514
  * Load and parse rulesync subagent files from .rulesync/subagents/ directory
12099
12515
  */
12100
12516
  async loadRulesyncFiles() {
12101
- const subagentsDir = join88(process.cwd(), RulesyncSubagent.getSettablePaths().relativeDirPath);
12517
+ const subagentsDir = join90(process.cwd(), RulesyncSubagent.getSettablePaths().relativeDirPath);
12102
12518
  const dirExists = await directoryExists(subagentsDir);
12103
12519
  if (!dirExists) {
12104
12520
  logger.debug(`Rulesync subagents directory not found: ${subagentsDir}`);
@@ -12113,7 +12529,7 @@ var SubagentsProcessor = class extends FeatureProcessor {
12113
12529
  logger.debug(`Found ${mdFiles.length} subagent files in ${subagentsDir}`);
12114
12530
  const rulesyncSubagents = [];
12115
12531
  for (const mdFile of mdFiles) {
12116
- const filepath = join88(subagentsDir, mdFile);
12532
+ const filepath = join90(subagentsDir, mdFile);
12117
12533
  try {
12118
12534
  const rulesyncSubagent = await RulesyncSubagent.fromFile({
12119
12535
  relativeFilePath: mdFile,
@@ -12143,7 +12559,7 @@ var SubagentsProcessor = class extends FeatureProcessor {
12143
12559
  const factory = this.getFactory(this.toolTarget);
12144
12560
  const paths = factory.class.getSettablePaths({ global: this.global });
12145
12561
  const subagentFilePaths = await findFilesByGlobs(
12146
- join88(this.baseDir, paths.relativeDirPath, factory.meta.filePattern)
12562
+ join90(this.baseDir, paths.relativeDirPath, factory.meta.filePattern)
12147
12563
  );
12148
12564
  if (forDeletion) {
12149
12565
  const toolSubagents2 = subagentFilePaths.map(
@@ -12208,49 +12624,49 @@ var SubagentsProcessor = class extends FeatureProcessor {
12208
12624
  };
12209
12625
 
12210
12626
  // src/features/rules/agentsmd-rule.ts
12211
- import { join as join91 } from "path";
12627
+ import { join as join93 } from "path";
12212
12628
 
12213
12629
  // src/features/rules/tool-rule.ts
12214
- import { join as join90 } from "path";
12630
+ import { join as join92 } from "path";
12215
12631
 
12216
12632
  // src/features/rules/rulesync-rule.ts
12217
- import { join as join89 } from "path";
12218
- import { z as z48 } from "zod/mini";
12219
- var RulesyncRuleFrontmatterSchema = z48.object({
12220
- root: z48.optional(z48.boolean()),
12221
- localRoot: z48.optional(z48.boolean()),
12222
- targets: z48._default(RulesyncTargetsSchema, ["*"]),
12223
- description: z48.optional(z48.string()),
12224
- globs: z48.optional(z48.array(z48.string())),
12225
- agentsmd: z48.optional(
12226
- z48.object({
12633
+ import { join as join91 } from "path";
12634
+ import { z as z50 } from "zod/mini";
12635
+ var RulesyncRuleFrontmatterSchema = z50.object({
12636
+ root: z50.optional(z50.boolean()),
12637
+ localRoot: z50.optional(z50.boolean()),
12638
+ targets: z50._default(RulesyncTargetsSchema, ["*"]),
12639
+ description: z50.optional(z50.string()),
12640
+ globs: z50.optional(z50.array(z50.string())),
12641
+ agentsmd: z50.optional(
12642
+ z50.object({
12227
12643
  // @example "path/to/subproject"
12228
- subprojectPath: z48.optional(z48.string())
12644
+ subprojectPath: z50.optional(z50.string())
12229
12645
  })
12230
12646
  ),
12231
- claudecode: z48.optional(
12232
- z48.object({
12647
+ claudecode: z50.optional(
12648
+ z50.object({
12233
12649
  // Glob patterns for conditional rules (takes precedence over globs)
12234
12650
  // @example ["src/**/*.ts", "tests/**/*.test.ts"]
12235
- paths: z48.optional(z48.array(z48.string()))
12651
+ paths: z50.optional(z50.array(z50.string()))
12236
12652
  })
12237
12653
  ),
12238
- cursor: z48.optional(
12239
- z48.object({
12240
- alwaysApply: z48.optional(z48.boolean()),
12241
- description: z48.optional(z48.string()),
12242
- globs: z48.optional(z48.array(z48.string()))
12654
+ cursor: z50.optional(
12655
+ z50.object({
12656
+ alwaysApply: z50.optional(z50.boolean()),
12657
+ description: z50.optional(z50.string()),
12658
+ globs: z50.optional(z50.array(z50.string()))
12243
12659
  })
12244
12660
  ),
12245
- copilot: z48.optional(
12246
- z48.object({
12247
- excludeAgent: z48.optional(z48.union([z48.literal("code-review"), z48.literal("coding-agent")]))
12661
+ copilot: z50.optional(
12662
+ z50.object({
12663
+ excludeAgent: z50.optional(z50.union([z50.literal("code-review"), z50.literal("coding-agent")]))
12248
12664
  })
12249
12665
  ),
12250
- antigravity: z48.optional(
12251
- z48.looseObject({
12252
- trigger: z48.optional(z48.string()),
12253
- globs: z48.optional(z48.array(z48.string()))
12666
+ antigravity: z50.optional(
12667
+ z50.looseObject({
12668
+ trigger: z50.optional(z50.string()),
12669
+ globs: z50.optional(z50.array(z50.string()))
12254
12670
  })
12255
12671
  )
12256
12672
  });
@@ -12261,7 +12677,7 @@ var RulesyncRule = class _RulesyncRule extends RulesyncFile {
12261
12677
  const parseResult = RulesyncRuleFrontmatterSchema.safeParse(frontmatter);
12262
12678
  if (!parseResult.success && rest.validate !== false) {
12263
12679
  throw new Error(
12264
- `Invalid frontmatter in ${join89(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(parseResult.error)}`
12680
+ `Invalid frontmatter in ${join91(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(parseResult.error)}`
12265
12681
  );
12266
12682
  }
12267
12683
  const parsedFrontmatter = parseResult.success ? parseResult.data : { ...frontmatter, targets: frontmatter.targets ?? ["*"] };
@@ -12296,7 +12712,7 @@ var RulesyncRule = class _RulesyncRule extends RulesyncFile {
12296
12712
  return {
12297
12713
  success: false,
12298
12714
  error: new Error(
12299
- `Invalid frontmatter in ${join89(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
12715
+ `Invalid frontmatter in ${join91(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
12300
12716
  )
12301
12717
  };
12302
12718
  }
@@ -12305,7 +12721,7 @@ var RulesyncRule = class _RulesyncRule extends RulesyncFile {
12305
12721
  relativeFilePath,
12306
12722
  validate = true
12307
12723
  }) {
12308
- const filePath = join89(
12724
+ const filePath = join91(
12309
12725
  process.cwd(),
12310
12726
  this.getSettablePaths().recommended.relativeDirPath,
12311
12727
  relativeFilePath
@@ -12407,7 +12823,7 @@ var ToolRule = class extends ToolFile {
12407
12823
  rulesyncRule,
12408
12824
  validate = true,
12409
12825
  rootPath = { relativeDirPath: ".", relativeFilePath: "AGENTS.md" },
12410
- nonRootPath = { relativeDirPath: join90(".agents", "memories") }
12826
+ nonRootPath = { relativeDirPath: join92(".agents", "memories") }
12411
12827
  }) {
12412
12828
  const params = this.buildToolRuleParamsDefault({
12413
12829
  baseDir,
@@ -12418,7 +12834,7 @@ var ToolRule = class extends ToolFile {
12418
12834
  });
12419
12835
  const rulesyncFrontmatter = rulesyncRule.getFrontmatter();
12420
12836
  if (!rulesyncFrontmatter.root && rulesyncFrontmatter.agentsmd?.subprojectPath) {
12421
- params.relativeDirPath = join90(rulesyncFrontmatter.agentsmd.subprojectPath);
12837
+ params.relativeDirPath = join92(rulesyncFrontmatter.agentsmd.subprojectPath);
12422
12838
  params.relativeFilePath = "AGENTS.md";
12423
12839
  }
12424
12840
  return params;
@@ -12467,7 +12883,7 @@ var ToolRule = class extends ToolFile {
12467
12883
  }
12468
12884
  };
12469
12885
  function buildToolPath(toolDir, subDir, excludeToolDir) {
12470
- return excludeToolDir ? subDir : join90(toolDir, subDir);
12886
+ return excludeToolDir ? subDir : join92(toolDir, subDir);
12471
12887
  }
12472
12888
 
12473
12889
  // src/features/rules/agentsmd-rule.ts
@@ -12496,8 +12912,8 @@ var AgentsMdRule = class _AgentsMdRule extends ToolRule {
12496
12912
  validate = true
12497
12913
  }) {
12498
12914
  const isRoot = relativeFilePath === "AGENTS.md";
12499
- const relativePath = isRoot ? "AGENTS.md" : join91(".agents", "memories", relativeFilePath);
12500
- const fileContent = await readFileContent(join91(baseDir, relativePath));
12915
+ const relativePath = isRoot ? "AGENTS.md" : join93(".agents", "memories", relativeFilePath);
12916
+ const fileContent = await readFileContent(join93(baseDir, relativePath));
12501
12917
  return new _AgentsMdRule({
12502
12918
  baseDir,
12503
12919
  relativeDirPath: isRoot ? this.getSettablePaths().root.relativeDirPath : this.getSettablePaths().nonRoot.relativeDirPath,
@@ -12552,21 +12968,21 @@ var AgentsMdRule = class _AgentsMdRule extends ToolRule {
12552
12968
  };
12553
12969
 
12554
12970
  // src/features/rules/antigravity-rule.ts
12555
- import { join as join92 } from "path";
12556
- import { z as z49 } from "zod/mini";
12557
- var AntigravityRuleFrontmatterSchema = z49.looseObject({
12558
- trigger: z49.optional(
12559
- z49.union([
12560
- z49.literal("always_on"),
12561
- z49.literal("glob"),
12562
- z49.literal("manual"),
12563
- z49.literal("model_decision"),
12564
- z49.string()
12971
+ import { join as join94 } from "path";
12972
+ import { z as z51 } from "zod/mini";
12973
+ var AntigravityRuleFrontmatterSchema = z51.looseObject({
12974
+ trigger: z51.optional(
12975
+ z51.union([
12976
+ z51.literal("always_on"),
12977
+ z51.literal("glob"),
12978
+ z51.literal("manual"),
12979
+ z51.literal("model_decision"),
12980
+ z51.string()
12565
12981
  // accepts any string for forward compatibility
12566
12982
  ])
12567
12983
  ),
12568
- globs: z49.optional(z49.string()),
12569
- description: z49.optional(z49.string())
12984
+ globs: z51.optional(z51.string()),
12985
+ description: z51.optional(z51.string())
12570
12986
  });
12571
12987
  function parseGlobsString(globs) {
12572
12988
  if (!globs) {
@@ -12711,7 +13127,7 @@ var AntigravityRule = class _AntigravityRule extends ToolRule {
12711
13127
  const result = AntigravityRuleFrontmatterSchema.safeParse(frontmatter);
12712
13128
  if (!result.success) {
12713
13129
  throw new Error(
12714
- `Invalid frontmatter in ${join92(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
13130
+ `Invalid frontmatter in ${join94(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
12715
13131
  );
12716
13132
  }
12717
13133
  }
@@ -12735,7 +13151,7 @@ var AntigravityRule = class _AntigravityRule extends ToolRule {
12735
13151
  relativeFilePath,
12736
13152
  validate = true
12737
13153
  }) {
12738
- const filePath = join92(
13154
+ const filePath = join94(
12739
13155
  baseDir,
12740
13156
  this.getSettablePaths().nonRoot.relativeDirPath,
12741
13157
  relativeFilePath
@@ -12875,7 +13291,7 @@ var AntigravityRule = class _AntigravityRule extends ToolRule {
12875
13291
  };
12876
13292
 
12877
13293
  // src/features/rules/augmentcode-legacy-rule.ts
12878
- import { join as join93 } from "path";
13294
+ import { join as join95 } from "path";
12879
13295
  var AugmentcodeLegacyRule = class _AugmentcodeLegacyRule extends ToolRule {
12880
13296
  toRulesyncRule() {
12881
13297
  const rulesyncFrontmatter = {
@@ -12935,8 +13351,8 @@ var AugmentcodeLegacyRule = class _AugmentcodeLegacyRule extends ToolRule {
12935
13351
  }) {
12936
13352
  const settablePaths = this.getSettablePaths();
12937
13353
  const isRoot = relativeFilePath === settablePaths.root.relativeFilePath;
12938
- const relativePath = isRoot ? settablePaths.root.relativeFilePath : join93(settablePaths.nonRoot.relativeDirPath, relativeFilePath);
12939
- const fileContent = await readFileContent(join93(baseDir, relativePath));
13354
+ const relativePath = isRoot ? settablePaths.root.relativeFilePath : join95(settablePaths.nonRoot.relativeDirPath, relativeFilePath);
13355
+ const fileContent = await readFileContent(join95(baseDir, relativePath));
12940
13356
  return new _AugmentcodeLegacyRule({
12941
13357
  baseDir,
12942
13358
  relativeDirPath: isRoot ? settablePaths.root.relativeDirPath : settablePaths.nonRoot.relativeDirPath,
@@ -12965,7 +13381,7 @@ var AugmentcodeLegacyRule = class _AugmentcodeLegacyRule extends ToolRule {
12965
13381
  };
12966
13382
 
12967
13383
  // src/features/rules/augmentcode-rule.ts
12968
- import { join as join94 } from "path";
13384
+ import { join as join96 } from "path";
12969
13385
  var AugmentcodeRule = class _AugmentcodeRule extends ToolRule {
12970
13386
  toRulesyncRule() {
12971
13387
  return this.toRulesyncRuleDefault();
@@ -12996,7 +13412,7 @@ var AugmentcodeRule = class _AugmentcodeRule extends ToolRule {
12996
13412
  relativeFilePath,
12997
13413
  validate = true
12998
13414
  }) {
12999
- const filePath = join94(
13415
+ const filePath = join96(
13000
13416
  baseDir,
13001
13417
  this.getSettablePaths().nonRoot.relativeDirPath,
13002
13418
  relativeFilePath
@@ -13036,7 +13452,7 @@ var AugmentcodeRule = class _AugmentcodeRule extends ToolRule {
13036
13452
  };
13037
13453
 
13038
13454
  // src/features/rules/claudecode-legacy-rule.ts
13039
- import { join as join95 } from "path";
13455
+ import { join as join97 } from "path";
13040
13456
  var ClaudecodeLegacyRule = class _ClaudecodeLegacyRule extends ToolRule {
13041
13457
  static getSettablePaths({
13042
13458
  global,
@@ -13078,7 +13494,7 @@ var ClaudecodeLegacyRule = class _ClaudecodeLegacyRule extends ToolRule {
13078
13494
  if (isRoot) {
13079
13495
  const rootDirPath = overrideDirPath ?? paths.root.relativeDirPath;
13080
13496
  const fileContent2 = await readFileContent(
13081
- join95(baseDir, rootDirPath, paths.root.relativeFilePath)
13497
+ join97(baseDir, rootDirPath, paths.root.relativeFilePath)
13082
13498
  );
13083
13499
  return new _ClaudecodeLegacyRule({
13084
13500
  baseDir,
@@ -13092,8 +13508,8 @@ var ClaudecodeLegacyRule = class _ClaudecodeLegacyRule extends ToolRule {
13092
13508
  if (!paths.nonRoot) {
13093
13509
  throw new Error(`nonRoot path is not set for ${relativeFilePath}`);
13094
13510
  }
13095
- const relativePath = join95(paths.nonRoot.relativeDirPath, relativeFilePath);
13096
- const fileContent = await readFileContent(join95(baseDir, relativePath));
13511
+ const relativePath = join97(paths.nonRoot.relativeDirPath, relativeFilePath);
13512
+ const fileContent = await readFileContent(join97(baseDir, relativePath));
13097
13513
  return new _ClaudecodeLegacyRule({
13098
13514
  baseDir,
13099
13515
  relativeDirPath: paths.nonRoot.relativeDirPath,
@@ -13152,10 +13568,10 @@ var ClaudecodeLegacyRule = class _ClaudecodeLegacyRule extends ToolRule {
13152
13568
  };
13153
13569
 
13154
13570
  // src/features/rules/claudecode-rule.ts
13155
- import { join as join96 } from "path";
13156
- import { z as z50 } from "zod/mini";
13157
- var ClaudecodeRuleFrontmatterSchema = z50.object({
13158
- paths: z50.optional(z50.array(z50.string()))
13571
+ import { join as join98 } from "path";
13572
+ import { z as z52 } from "zod/mini";
13573
+ var ClaudecodeRuleFrontmatterSchema = z52.object({
13574
+ paths: z52.optional(z52.array(z52.string()))
13159
13575
  });
13160
13576
  var ClaudecodeRule = class _ClaudecodeRule extends ToolRule {
13161
13577
  frontmatter;
@@ -13193,7 +13609,7 @@ var ClaudecodeRule = class _ClaudecodeRule extends ToolRule {
13193
13609
  const result = ClaudecodeRuleFrontmatterSchema.safeParse(frontmatter);
13194
13610
  if (!result.success) {
13195
13611
  throw new Error(
13196
- `Invalid frontmatter in ${join96(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
13612
+ `Invalid frontmatter in ${join98(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
13197
13613
  );
13198
13614
  }
13199
13615
  }
@@ -13223,7 +13639,7 @@ var ClaudecodeRule = class _ClaudecodeRule extends ToolRule {
13223
13639
  if (isRoot) {
13224
13640
  const rootDirPath = overrideDirPath ?? paths.root.relativeDirPath;
13225
13641
  const fileContent2 = await readFileContent(
13226
- join96(baseDir, rootDirPath, paths.root.relativeFilePath)
13642
+ join98(baseDir, rootDirPath, paths.root.relativeFilePath)
13227
13643
  );
13228
13644
  return new _ClaudecodeRule({
13229
13645
  baseDir,
@@ -13238,8 +13654,8 @@ var ClaudecodeRule = class _ClaudecodeRule extends ToolRule {
13238
13654
  if (!paths.nonRoot) {
13239
13655
  throw new Error(`nonRoot path is not set for ${relativeFilePath}`);
13240
13656
  }
13241
- const relativePath = join96(paths.nonRoot.relativeDirPath, relativeFilePath);
13242
- const filePath = join96(baseDir, relativePath);
13657
+ const relativePath = join98(paths.nonRoot.relativeDirPath, relativeFilePath);
13658
+ const filePath = join98(baseDir, relativePath);
13243
13659
  const fileContent = await readFileContent(filePath);
13244
13660
  const { frontmatter, body: content } = parseFrontmatter(fileContent, filePath);
13245
13661
  const result = ClaudecodeRuleFrontmatterSchema.safeParse(frontmatter);
@@ -13350,7 +13766,7 @@ var ClaudecodeRule = class _ClaudecodeRule extends ToolRule {
13350
13766
  return {
13351
13767
  success: false,
13352
13768
  error: new Error(
13353
- `Invalid frontmatter in ${join96(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
13769
+ `Invalid frontmatter in ${join98(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
13354
13770
  )
13355
13771
  };
13356
13772
  }
@@ -13370,10 +13786,10 @@ var ClaudecodeRule = class _ClaudecodeRule extends ToolRule {
13370
13786
  };
13371
13787
 
13372
13788
  // src/features/rules/cline-rule.ts
13373
- import { join as join97 } from "path";
13374
- import { z as z51 } from "zod/mini";
13375
- var ClineRuleFrontmatterSchema = z51.object({
13376
- description: z51.string()
13789
+ import { join as join99 } from "path";
13790
+ import { z as z53 } from "zod/mini";
13791
+ var ClineRuleFrontmatterSchema = z53.object({
13792
+ description: z53.string()
13377
13793
  });
13378
13794
  var ClineRule = class _ClineRule extends ToolRule {
13379
13795
  static getSettablePaths(_options = {}) {
@@ -13416,7 +13832,7 @@ var ClineRule = class _ClineRule extends ToolRule {
13416
13832
  validate = true
13417
13833
  }) {
13418
13834
  const fileContent = await readFileContent(
13419
- join97(baseDir, this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath)
13835
+ join99(baseDir, this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath)
13420
13836
  );
13421
13837
  return new _ClineRule({
13422
13838
  baseDir,
@@ -13442,7 +13858,7 @@ var ClineRule = class _ClineRule extends ToolRule {
13442
13858
  };
13443
13859
 
13444
13860
  // src/features/rules/codexcli-rule.ts
13445
- import { join as join98 } from "path";
13861
+ import { join as join100 } from "path";
13446
13862
  var CodexcliRule = class _CodexcliRule extends ToolRule {
13447
13863
  static getSettablePaths({
13448
13864
  global,
@@ -13477,7 +13893,7 @@ var CodexcliRule = class _CodexcliRule extends ToolRule {
13477
13893
  if (isRoot) {
13478
13894
  const relativePath2 = paths.root.relativeFilePath;
13479
13895
  const fileContent2 = await readFileContent(
13480
- join98(baseDir, paths.root.relativeDirPath, relativePath2)
13896
+ join100(baseDir, paths.root.relativeDirPath, relativePath2)
13481
13897
  );
13482
13898
  return new _CodexcliRule({
13483
13899
  baseDir,
@@ -13491,8 +13907,8 @@ var CodexcliRule = class _CodexcliRule extends ToolRule {
13491
13907
  if (!paths.nonRoot) {
13492
13908
  throw new Error(`nonRoot path is not set for ${relativeFilePath}`);
13493
13909
  }
13494
- const relativePath = join98(paths.nonRoot.relativeDirPath, relativeFilePath);
13495
- const fileContent = await readFileContent(join98(baseDir, relativePath));
13910
+ const relativePath = join100(paths.nonRoot.relativeDirPath, relativeFilePath);
13911
+ const fileContent = await readFileContent(join100(baseDir, relativePath));
13496
13912
  return new _CodexcliRule({
13497
13913
  baseDir,
13498
13914
  relativeDirPath: paths.nonRoot.relativeDirPath,
@@ -13551,12 +13967,12 @@ var CodexcliRule = class _CodexcliRule extends ToolRule {
13551
13967
  };
13552
13968
 
13553
13969
  // src/features/rules/copilot-rule.ts
13554
- import { join as join99 } from "path";
13555
- import { z as z52 } from "zod/mini";
13556
- var CopilotRuleFrontmatterSchema = z52.object({
13557
- description: z52.optional(z52.string()),
13558
- applyTo: z52.optional(z52.string()),
13559
- excludeAgent: z52.optional(z52.union([z52.literal("code-review"), z52.literal("coding-agent")]))
13970
+ import { join as join101 } from "path";
13971
+ import { z as z54 } from "zod/mini";
13972
+ var CopilotRuleFrontmatterSchema = z54.object({
13973
+ description: z54.optional(z54.string()),
13974
+ applyTo: z54.optional(z54.string()),
13975
+ excludeAgent: z54.optional(z54.union([z54.literal("code-review"), z54.literal("coding-agent")]))
13560
13976
  });
13561
13977
  var CopilotRule = class _CopilotRule extends ToolRule {
13562
13978
  frontmatter;
@@ -13567,6 +13983,9 @@ var CopilotRule = class _CopilotRule extends ToolRule {
13567
13983
  root: {
13568
13984
  relativeDirPath: buildToolPath(".copilot", ".", options.excludeToolDir),
13569
13985
  relativeFilePath: "copilot-instructions.md"
13986
+ },
13987
+ nonRoot: {
13988
+ relativeDirPath: buildToolPath(".copilot", "instructions", options.excludeToolDir)
13570
13989
  }
13571
13990
  };
13572
13991
  }
@@ -13585,7 +14004,7 @@ var CopilotRule = class _CopilotRule extends ToolRule {
13585
14004
  const result = CopilotRuleFrontmatterSchema.safeParse(frontmatter);
13586
14005
  if (!result.success) {
13587
14006
  throw new Error(
13588
- `Invalid frontmatter in ${join99(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
14007
+ `Invalid frontmatter in ${join101(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
13589
14008
  );
13590
14009
  }
13591
14010
  }
@@ -13675,8 +14094,8 @@ var CopilotRule = class _CopilotRule extends ToolRule {
13675
14094
  const paths = this.getSettablePaths({ global });
13676
14095
  const isRoot = relativeFilePath === paths.root.relativeFilePath;
13677
14096
  if (isRoot) {
13678
- const relativePath2 = join99(paths.root.relativeDirPath, paths.root.relativeFilePath);
13679
- const filePath2 = join99(baseDir, relativePath2);
14097
+ const relativePath2 = join101(paths.root.relativeDirPath, paths.root.relativeFilePath);
14098
+ const filePath2 = join101(baseDir, relativePath2);
13680
14099
  const fileContent2 = await readFileContent(filePath2);
13681
14100
  return new _CopilotRule({
13682
14101
  baseDir,
@@ -13691,8 +14110,8 @@ var CopilotRule = class _CopilotRule extends ToolRule {
13691
14110
  if (!paths.nonRoot) {
13692
14111
  throw new Error(`nonRoot path is not set for ${relativeFilePath}`);
13693
14112
  }
13694
- const relativePath = join99(paths.nonRoot.relativeDirPath, relativeFilePath);
13695
- const filePath = join99(baseDir, relativePath);
14113
+ const relativePath = join101(paths.nonRoot.relativeDirPath, relativeFilePath);
14114
+ const filePath = join101(baseDir, relativePath);
13696
14115
  const fileContent = await readFileContent(filePath);
13697
14116
  const { frontmatter, body: content } = parseFrontmatter(fileContent, filePath);
13698
14117
  const result = CopilotRuleFrontmatterSchema.safeParse(frontmatter);
@@ -13738,7 +14157,7 @@ var CopilotRule = class _CopilotRule extends ToolRule {
13738
14157
  return {
13739
14158
  success: false,
13740
14159
  error: new Error(
13741
- `Invalid frontmatter in ${join99(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
14160
+ `Invalid frontmatter in ${join101(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
13742
14161
  )
13743
14162
  };
13744
14163
  }
@@ -13758,12 +14177,12 @@ var CopilotRule = class _CopilotRule extends ToolRule {
13758
14177
  };
13759
14178
 
13760
14179
  // src/features/rules/cursor-rule.ts
13761
- import { join as join100 } from "path";
13762
- import { z as z53 } from "zod/mini";
13763
- var CursorRuleFrontmatterSchema = z53.object({
13764
- description: z53.optional(z53.string()),
13765
- globs: z53.optional(z53.string()),
13766
- alwaysApply: z53.optional(z53.boolean())
14180
+ import { join as join102 } from "path";
14181
+ import { z as z55 } from "zod/mini";
14182
+ var CursorRuleFrontmatterSchema = z55.object({
14183
+ description: z55.optional(z55.string()),
14184
+ globs: z55.optional(z55.string()),
14185
+ alwaysApply: z55.optional(z55.boolean())
13767
14186
  });
13768
14187
  var CursorRule = class _CursorRule extends ToolRule {
13769
14188
  frontmatter;
@@ -13780,7 +14199,7 @@ var CursorRule = class _CursorRule extends ToolRule {
13780
14199
  const result = CursorRuleFrontmatterSchema.safeParse(frontmatter);
13781
14200
  if (!result.success) {
13782
14201
  throw new Error(
13783
- `Invalid frontmatter in ${join100(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
14202
+ `Invalid frontmatter in ${join102(rest.relativeDirPath, rest.relativeFilePath)}: ${formatError(result.error)}`
13784
14203
  );
13785
14204
  }
13786
14205
  }
@@ -13896,7 +14315,7 @@ var CursorRule = class _CursorRule extends ToolRule {
13896
14315
  relativeFilePath,
13897
14316
  validate = true
13898
14317
  }) {
13899
- const filePath = join100(
14318
+ const filePath = join102(
13900
14319
  baseDir,
13901
14320
  this.getSettablePaths().nonRoot.relativeDirPath,
13902
14321
  relativeFilePath
@@ -13906,7 +14325,7 @@ var CursorRule = class _CursorRule extends ToolRule {
13906
14325
  const result = CursorRuleFrontmatterSchema.safeParse(frontmatter);
13907
14326
  if (!result.success) {
13908
14327
  throw new Error(
13909
- `Invalid frontmatter in ${join100(baseDir, relativeFilePath)}: ${formatError(result.error)}`
14328
+ `Invalid frontmatter in ${join102(baseDir, relativeFilePath)}: ${formatError(result.error)}`
13910
14329
  );
13911
14330
  }
13912
14331
  return new _CursorRule({
@@ -13943,7 +14362,7 @@ var CursorRule = class _CursorRule extends ToolRule {
13943
14362
  return {
13944
14363
  success: false,
13945
14364
  error: new Error(
13946
- `Invalid frontmatter in ${join100(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
14365
+ `Invalid frontmatter in ${join102(this.relativeDirPath, this.relativeFilePath)}: ${formatError(result.error)}`
13947
14366
  )
13948
14367
  };
13949
14368
  }
@@ -13963,7 +14382,7 @@ var CursorRule = class _CursorRule extends ToolRule {
13963
14382
  };
13964
14383
 
13965
14384
  // src/features/rules/factorydroid-rule.ts
13966
- import { join as join101 } from "path";
14385
+ import { join as join103 } from "path";
13967
14386
  var FactorydroidRule = class _FactorydroidRule extends ToolRule {
13968
14387
  constructor({ fileContent, root, ...rest }) {
13969
14388
  super({
@@ -14003,8 +14422,8 @@ var FactorydroidRule = class _FactorydroidRule extends ToolRule {
14003
14422
  const paths = this.getSettablePaths({ global });
14004
14423
  const isRoot = relativeFilePath === paths.root.relativeFilePath;
14005
14424
  if (isRoot) {
14006
- const relativePath2 = join101(paths.root.relativeDirPath, paths.root.relativeFilePath);
14007
- const fileContent2 = await readFileContent(join101(baseDir, relativePath2));
14425
+ const relativePath2 = join103(paths.root.relativeDirPath, paths.root.relativeFilePath);
14426
+ const fileContent2 = await readFileContent(join103(baseDir, relativePath2));
14008
14427
  return new _FactorydroidRule({
14009
14428
  baseDir,
14010
14429
  relativeDirPath: paths.root.relativeDirPath,
@@ -14017,8 +14436,8 @@ var FactorydroidRule = class _FactorydroidRule extends ToolRule {
14017
14436
  if (!paths.nonRoot) {
14018
14437
  throw new Error(`nonRoot path is not set for ${relativeFilePath}`);
14019
14438
  }
14020
- const relativePath = join101(paths.nonRoot.relativeDirPath, relativeFilePath);
14021
- const fileContent = await readFileContent(join101(baseDir, relativePath));
14439
+ const relativePath = join103(paths.nonRoot.relativeDirPath, relativeFilePath);
14440
+ const fileContent = await readFileContent(join103(baseDir, relativePath));
14022
14441
  return new _FactorydroidRule({
14023
14442
  baseDir,
14024
14443
  relativeDirPath: paths.nonRoot.relativeDirPath,
@@ -14077,7 +14496,7 @@ var FactorydroidRule = class _FactorydroidRule extends ToolRule {
14077
14496
  };
14078
14497
 
14079
14498
  // src/features/rules/geminicli-rule.ts
14080
- import { join as join102 } from "path";
14499
+ import { join as join104 } from "path";
14081
14500
  var GeminiCliRule = class _GeminiCliRule extends ToolRule {
14082
14501
  static getSettablePaths({
14083
14502
  global,
@@ -14112,7 +14531,7 @@ var GeminiCliRule = class _GeminiCliRule extends ToolRule {
14112
14531
  if (isRoot) {
14113
14532
  const relativePath2 = paths.root.relativeFilePath;
14114
14533
  const fileContent2 = await readFileContent(
14115
- join102(baseDir, paths.root.relativeDirPath, relativePath2)
14534
+ join104(baseDir, paths.root.relativeDirPath, relativePath2)
14116
14535
  );
14117
14536
  return new _GeminiCliRule({
14118
14537
  baseDir,
@@ -14126,8 +14545,8 @@ var GeminiCliRule = class _GeminiCliRule extends ToolRule {
14126
14545
  if (!paths.nonRoot) {
14127
14546
  throw new Error(`nonRoot path is not set for ${relativeFilePath}`);
14128
14547
  }
14129
- const relativePath = join102(paths.nonRoot.relativeDirPath, relativeFilePath);
14130
- const fileContent = await readFileContent(join102(baseDir, relativePath));
14548
+ const relativePath = join104(paths.nonRoot.relativeDirPath, relativeFilePath);
14549
+ const fileContent = await readFileContent(join104(baseDir, relativePath));
14131
14550
  return new _GeminiCliRule({
14132
14551
  baseDir,
14133
14552
  relativeDirPath: paths.nonRoot.relativeDirPath,
@@ -14186,7 +14605,7 @@ var GeminiCliRule = class _GeminiCliRule extends ToolRule {
14186
14605
  };
14187
14606
 
14188
14607
  // src/features/rules/goose-rule.ts
14189
- import { join as join103 } from "path";
14608
+ import { join as join105 } from "path";
14190
14609
  var GooseRule = class _GooseRule extends ToolRule {
14191
14610
  static getSettablePaths({
14192
14611
  global,
@@ -14221,7 +14640,7 @@ var GooseRule = class _GooseRule extends ToolRule {
14221
14640
  if (isRoot) {
14222
14641
  const relativePath2 = paths.root.relativeFilePath;
14223
14642
  const fileContent2 = await readFileContent(
14224
- join103(baseDir, paths.root.relativeDirPath, relativePath2)
14643
+ join105(baseDir, paths.root.relativeDirPath, relativePath2)
14225
14644
  );
14226
14645
  return new _GooseRule({
14227
14646
  baseDir,
@@ -14235,8 +14654,8 @@ var GooseRule = class _GooseRule extends ToolRule {
14235
14654
  if (!paths.nonRoot) {
14236
14655
  throw new Error(`nonRoot path is not set for ${relativeFilePath}`);
14237
14656
  }
14238
- const relativePath = join103(paths.nonRoot.relativeDirPath, relativeFilePath);
14239
- const fileContent = await readFileContent(join103(baseDir, relativePath));
14657
+ const relativePath = join105(paths.nonRoot.relativeDirPath, relativeFilePath);
14658
+ const fileContent = await readFileContent(join105(baseDir, relativePath));
14240
14659
  return new _GooseRule({
14241
14660
  baseDir,
14242
14661
  relativeDirPath: paths.nonRoot.relativeDirPath,
@@ -14295,7 +14714,7 @@ var GooseRule = class _GooseRule extends ToolRule {
14295
14714
  };
14296
14715
 
14297
14716
  // src/features/rules/junie-rule.ts
14298
- import { join as join104 } from "path";
14717
+ import { join as join106 } from "path";
14299
14718
  var JunieRule = class _JunieRule extends ToolRule {
14300
14719
  static getSettablePaths(_options = {}) {
14301
14720
  return {
@@ -14314,8 +14733,8 @@ var JunieRule = class _JunieRule extends ToolRule {
14314
14733
  validate = true
14315
14734
  }) {
14316
14735
  const isRoot = relativeFilePath === "guidelines.md";
14317
- const relativePath = isRoot ? "guidelines.md" : join104(".junie", "memories", relativeFilePath);
14318
- const fileContent = await readFileContent(join104(baseDir, relativePath));
14736
+ const relativePath = isRoot ? "guidelines.md" : join106(".junie", "memories", relativeFilePath);
14737
+ const fileContent = await readFileContent(join106(baseDir, relativePath));
14319
14738
  return new _JunieRule({
14320
14739
  baseDir,
14321
14740
  relativeDirPath: isRoot ? this.getSettablePaths().root.relativeDirPath : this.getSettablePaths().nonRoot.relativeDirPath,
@@ -14370,7 +14789,7 @@ var JunieRule = class _JunieRule extends ToolRule {
14370
14789
  };
14371
14790
 
14372
14791
  // src/features/rules/kilo-rule.ts
14373
- import { join as join105 } from "path";
14792
+ import { join as join107 } from "path";
14374
14793
  var KiloRule = class _KiloRule extends ToolRule {
14375
14794
  static getSettablePaths(_options = {}) {
14376
14795
  return {
@@ -14385,7 +14804,7 @@ var KiloRule = class _KiloRule extends ToolRule {
14385
14804
  validate = true
14386
14805
  }) {
14387
14806
  const fileContent = await readFileContent(
14388
- join105(baseDir, this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath)
14807
+ join107(baseDir, this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath)
14389
14808
  );
14390
14809
  return new _KiloRule({
14391
14810
  baseDir,
@@ -14437,7 +14856,7 @@ var KiloRule = class _KiloRule extends ToolRule {
14437
14856
  };
14438
14857
 
14439
14858
  // src/features/rules/kiro-rule.ts
14440
- import { join as join106 } from "path";
14859
+ import { join as join108 } from "path";
14441
14860
  var KiroRule = class _KiroRule extends ToolRule {
14442
14861
  static getSettablePaths(_options = {}) {
14443
14862
  return {
@@ -14452,7 +14871,7 @@ var KiroRule = class _KiroRule extends ToolRule {
14452
14871
  validate = true
14453
14872
  }) {
14454
14873
  const fileContent = await readFileContent(
14455
- join106(baseDir, this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath)
14874
+ join108(baseDir, this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath)
14456
14875
  );
14457
14876
  return new _KiroRule({
14458
14877
  baseDir,
@@ -14506,7 +14925,7 @@ var KiroRule = class _KiroRule extends ToolRule {
14506
14925
  };
14507
14926
 
14508
14927
  // src/features/rules/opencode-rule.ts
14509
- import { join as join107 } from "path";
14928
+ import { join as join109 } from "path";
14510
14929
  var OpenCodeRule = class _OpenCodeRule extends ToolRule {
14511
14930
  static getSettablePaths({
14512
14931
  global,
@@ -14541,7 +14960,7 @@ var OpenCodeRule = class _OpenCodeRule extends ToolRule {
14541
14960
  if (isRoot) {
14542
14961
  const relativePath2 = paths.root.relativeFilePath;
14543
14962
  const fileContent2 = await readFileContent(
14544
- join107(baseDir, paths.root.relativeDirPath, relativePath2)
14963
+ join109(baseDir, paths.root.relativeDirPath, relativePath2)
14545
14964
  );
14546
14965
  return new _OpenCodeRule({
14547
14966
  baseDir,
@@ -14555,8 +14974,8 @@ var OpenCodeRule = class _OpenCodeRule extends ToolRule {
14555
14974
  if (!paths.nonRoot) {
14556
14975
  throw new Error(`nonRoot path is not set for ${relativeFilePath}`);
14557
14976
  }
14558
- const relativePath = join107(paths.nonRoot.relativeDirPath, relativeFilePath);
14559
- const fileContent = await readFileContent(join107(baseDir, relativePath));
14977
+ const relativePath = join109(paths.nonRoot.relativeDirPath, relativeFilePath);
14978
+ const fileContent = await readFileContent(join109(baseDir, relativePath));
14560
14979
  return new _OpenCodeRule({
14561
14980
  baseDir,
14562
14981
  relativeDirPath: paths.nonRoot.relativeDirPath,
@@ -14615,7 +15034,7 @@ var OpenCodeRule = class _OpenCodeRule extends ToolRule {
14615
15034
  };
14616
15035
 
14617
15036
  // src/features/rules/qwencode-rule.ts
14618
- import { join as join108 } from "path";
15037
+ import { join as join110 } from "path";
14619
15038
  var QwencodeRule = class _QwencodeRule extends ToolRule {
14620
15039
  static getSettablePaths(_options = {}) {
14621
15040
  return {
@@ -14634,8 +15053,8 @@ var QwencodeRule = class _QwencodeRule extends ToolRule {
14634
15053
  validate = true
14635
15054
  }) {
14636
15055
  const isRoot = relativeFilePath === "QWEN.md";
14637
- const relativePath = isRoot ? "QWEN.md" : join108(".qwen", "memories", relativeFilePath);
14638
- const fileContent = await readFileContent(join108(baseDir, relativePath));
15056
+ const relativePath = isRoot ? "QWEN.md" : join110(".qwen", "memories", relativeFilePath);
15057
+ const fileContent = await readFileContent(join110(baseDir, relativePath));
14639
15058
  return new _QwencodeRule({
14640
15059
  baseDir,
14641
15060
  relativeDirPath: isRoot ? this.getSettablePaths().root.relativeDirPath : this.getSettablePaths().nonRoot.relativeDirPath,
@@ -14687,7 +15106,7 @@ var QwencodeRule = class _QwencodeRule extends ToolRule {
14687
15106
  };
14688
15107
 
14689
15108
  // src/features/rules/replit-rule.ts
14690
- import { join as join109 } from "path";
15109
+ import { join as join111 } from "path";
14691
15110
  var ReplitRule = class _ReplitRule extends ToolRule {
14692
15111
  static getSettablePaths(_options = {}) {
14693
15112
  return {
@@ -14709,7 +15128,7 @@ var ReplitRule = class _ReplitRule extends ToolRule {
14709
15128
  }
14710
15129
  const relativePath = paths.root.relativeFilePath;
14711
15130
  const fileContent = await readFileContent(
14712
- join109(baseDir, paths.root.relativeDirPath, relativePath)
15131
+ join111(baseDir, paths.root.relativeDirPath, relativePath)
14713
15132
  );
14714
15133
  return new _ReplitRule({
14715
15134
  baseDir,
@@ -14775,7 +15194,7 @@ var ReplitRule = class _ReplitRule extends ToolRule {
14775
15194
  };
14776
15195
 
14777
15196
  // src/features/rules/roo-rule.ts
14778
- import { join as join110 } from "path";
15197
+ import { join as join112 } from "path";
14779
15198
  var RooRule = class _RooRule extends ToolRule {
14780
15199
  static getSettablePaths(_options = {}) {
14781
15200
  return {
@@ -14790,7 +15209,7 @@ var RooRule = class _RooRule extends ToolRule {
14790
15209
  validate = true
14791
15210
  }) {
14792
15211
  const fileContent = await readFileContent(
14793
- join110(baseDir, this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath)
15212
+ join112(baseDir, this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath)
14794
15213
  );
14795
15214
  return new _RooRule({
14796
15215
  baseDir,
@@ -14859,7 +15278,7 @@ var RooRule = class _RooRule extends ToolRule {
14859
15278
  };
14860
15279
 
14861
15280
  // src/features/rules/warp-rule.ts
14862
- import { join as join111 } from "path";
15281
+ import { join as join113 } from "path";
14863
15282
  var WarpRule = class _WarpRule extends ToolRule {
14864
15283
  constructor({ fileContent, root, ...rest }) {
14865
15284
  super({
@@ -14885,8 +15304,8 @@ var WarpRule = class _WarpRule extends ToolRule {
14885
15304
  validate = true
14886
15305
  }) {
14887
15306
  const isRoot = relativeFilePath === this.getSettablePaths().root.relativeFilePath;
14888
- const relativePath = isRoot ? this.getSettablePaths().root.relativeFilePath : join111(this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath);
14889
- const fileContent = await readFileContent(join111(baseDir, relativePath));
15307
+ const relativePath = isRoot ? this.getSettablePaths().root.relativeFilePath : join113(this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath);
15308
+ const fileContent = await readFileContent(join113(baseDir, relativePath));
14890
15309
  return new _WarpRule({
14891
15310
  baseDir,
14892
15311
  relativeDirPath: isRoot ? this.getSettablePaths().root.relativeDirPath : ".warp",
@@ -14941,7 +15360,7 @@ var WarpRule = class _WarpRule extends ToolRule {
14941
15360
  };
14942
15361
 
14943
15362
  // src/features/rules/windsurf-rule.ts
14944
- import { join as join112 } from "path";
15363
+ import { join as join114 } from "path";
14945
15364
  var WindsurfRule = class _WindsurfRule extends ToolRule {
14946
15365
  static getSettablePaths(_options = {}) {
14947
15366
  return {
@@ -14956,7 +15375,7 @@ var WindsurfRule = class _WindsurfRule extends ToolRule {
14956
15375
  validate = true
14957
15376
  }) {
14958
15377
  const fileContent = await readFileContent(
14959
- join112(baseDir, this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath)
15378
+ join114(baseDir, this.getSettablePaths().nonRoot.relativeDirPath, relativeFilePath)
14960
15379
  );
14961
15380
  return new _WindsurfRule({
14962
15381
  baseDir,
@@ -15032,8 +15451,8 @@ var rulesProcessorToolTargets = [
15032
15451
  "warp",
15033
15452
  "windsurf"
15034
15453
  ];
15035
- var RulesProcessorToolTargetSchema = z54.enum(rulesProcessorToolTargets);
15036
- var formatRulePaths = (rules) => rules.map((r) => join113(r.getRelativeDirPath(), r.getRelativeFilePath())).join(", ");
15454
+ var RulesProcessorToolTargetSchema = z56.enum(rulesProcessorToolTargets);
15455
+ var formatRulePaths = (rules) => rules.map((r) => join115(r.getRelativeDirPath(), r.getRelativeFilePath())).join(", ");
15037
15456
  var toolRuleFactories = /* @__PURE__ */ new Map([
15038
15457
  [
15039
15458
  "agentsmd",
@@ -15408,7 +15827,7 @@ var RulesProcessor = class extends FeatureProcessor {
15408
15827
  }).relativeDirPath;
15409
15828
  return this.skills.filter((skill) => skillClass.isTargetedByRulesyncSkill(skill)).map((skill) => {
15410
15829
  const frontmatter = skill.getFrontmatter();
15411
- const relativePath = join113(toolRelativeDirPath, skill.getDirName(), SKILL_FILE_NAME);
15830
+ const relativePath = join115(toolRelativeDirPath, skill.getDirName(), SKILL_FILE_NAME);
15412
15831
  return {
15413
15832
  name: frontmatter.name,
15414
15833
  description: frontmatter.description,
@@ -15521,8 +15940,8 @@ var RulesProcessor = class extends FeatureProcessor {
15521
15940
  * Load and parse rulesync rule files from .rulesync/rules/ directory
15522
15941
  */
15523
15942
  async loadRulesyncFiles() {
15524
- const rulesyncBaseDir = join113(process.cwd(), RULESYNC_RULES_RELATIVE_DIR_PATH);
15525
- const files = await findFilesByGlobs(join113(rulesyncBaseDir, "**", "*.md"));
15943
+ const rulesyncBaseDir = join115(process.cwd(), RULESYNC_RULES_RELATIVE_DIR_PATH);
15944
+ const files = await findFilesByGlobs(join115(rulesyncBaseDir, "**", "*.md"));
15526
15945
  logger.debug(`Found ${files.length} rulesync files`);
15527
15946
  const rulesyncRules = await Promise.all(
15528
15947
  files.map((file) => {
@@ -15536,41 +15955,57 @@ var RulesProcessor = class extends FeatureProcessor {
15536
15955
  });
15537
15956
  })
15538
15957
  );
15958
+ const factory = this.getFactory(this.toolTarget);
15539
15959
  const rootRules = rulesyncRules.filter((rule) => rule.getFrontmatter().root);
15540
- if (rootRules.length > 1) {
15541
- throw new Error(`Multiple root rulesync rules found: ${formatRulePaths(rootRules)}`);
15960
+ const targetedRootRules = rootRules.filter(
15961
+ (rule) => factory.class.isTargetedByRulesyncRule(rule)
15962
+ );
15963
+ if (targetedRootRules.length > 1) {
15964
+ throw new Error(
15965
+ `Multiple root rulesync rules found for target '${this.toolTarget}': ${formatRulePaths(targetedRootRules)}`
15966
+ );
15542
15967
  }
15543
- if (rootRules.length === 0 && rulesyncRules.length > 0) {
15968
+ if (targetedRootRules.length === 0 && rulesyncRules.length > 0) {
15544
15969
  logger.warn(
15545
- `No root rulesync rule file found. Consider adding 'root: true' to one of your rule files in ${RULESYNC_RULES_RELATIVE_DIR_PATH}.`
15970
+ `No root rulesync rule file found for target '${this.toolTarget}'. Consider adding 'root: true' to one of your rule files in ${RULESYNC_RULES_RELATIVE_DIR_PATH}.`
15546
15971
  );
15547
15972
  }
15548
15973
  const localRootRules = rulesyncRules.filter((rule) => rule.getFrontmatter().localRoot);
15549
- if (localRootRules.length > 1) {
15974
+ const targetedLocalRootRules = localRootRules.filter(
15975
+ (rule) => factory.class.isTargetedByRulesyncRule(rule)
15976
+ );
15977
+ if (targetedLocalRootRules.length > 1) {
15550
15978
  throw new Error(
15551
- `Multiple localRoot rules found: ${formatRulePaths(localRootRules)}. Only one rule can have localRoot: true`
15979
+ `Multiple localRoot rules found for target '${this.toolTarget}': ${formatRulePaths(targetedLocalRootRules)}. Only one rule can have localRoot: true`
15552
15980
  );
15553
15981
  }
15554
- if (localRootRules.length > 0 && rootRules.length === 0) {
15982
+ if (targetedLocalRootRules.length > 0 && targetedRootRules.length === 0) {
15555
15983
  throw new Error(
15556
- `localRoot: true requires a root: true rule to exist (found in ${formatRulePaths(localRootRules)})`
15984
+ `localRoot: true requires a root: true rule to exist for target '${this.toolTarget}' (found in ${formatRulePaths(targetedLocalRootRules)})`
15557
15985
  );
15558
15986
  }
15559
15987
  if (this.global) {
15560
- const nonRootRules = rulesyncRules.filter((rule) => !rule.getFrontmatter().root);
15561
- if (nonRootRules.length > 0) {
15988
+ const globalPaths = factory.class.getSettablePaths({ global: true });
15989
+ const supportsGlobalNonRoot = "nonRoot" in globalPaths && globalPaths.nonRoot !== null;
15990
+ const nonRootRules2 = rulesyncRules.filter(
15991
+ (rule) => !rule.getFrontmatter().root && !rule.getFrontmatter().localRoot && factory.class.isTargetedByRulesyncRule(rule)
15992
+ );
15993
+ if (nonRootRules2.length > 0 && !supportsGlobalNonRoot) {
15562
15994
  logger.warn(
15563
- `${nonRootRules.length} non-root rulesync rules found, but it's in global mode, so ignoring them: ${formatRulePaths(nonRootRules)}`
15995
+ `${nonRootRules2.length} non-root rulesync rules found, but it's in global mode, so ignoring them: ${formatRulePaths(nonRootRules2)}`
15564
15996
  );
15565
15997
  }
15566
- if (localRootRules.length > 0) {
15998
+ if (targetedLocalRootRules.length > 0) {
15567
15999
  logger.warn(
15568
- `${localRootRules.length} localRoot rules found, but localRoot is not supported in global mode, ignoring them: ${formatRulePaths(localRootRules)}`
16000
+ `${targetedLocalRootRules.length} localRoot rules found, but localRoot is not supported in global mode, ignoring them: ${formatRulePaths(targetedLocalRootRules)}`
15569
16001
  );
15570
16002
  }
15571
- return rootRules;
16003
+ return supportsGlobalNonRoot ? [...targetedRootRules, ...nonRootRules2] : targetedRootRules;
15572
16004
  }
15573
- return rulesyncRules;
16005
+ const nonRootRules = rulesyncRules.filter(
16006
+ (rule) => !rule.getFrontmatter().root && factory.class.isTargetedByRulesyncRule(rule)
16007
+ );
16008
+ return [...targetedRootRules, ...nonRootRules];
15574
16009
  }
15575
16010
  /**
15576
16011
  * Implementation of abstract method from FeatureProcessor
@@ -15603,13 +16038,13 @@ var RulesProcessor = class extends FeatureProcessor {
15603
16038
  return [];
15604
16039
  }
15605
16040
  const uniqueRootFilePaths = await findFilesWithFallback(
15606
- join113(
16041
+ join115(
15607
16042
  this.baseDir,
15608
16043
  settablePaths.root.relativeDirPath ?? ".",
15609
16044
  settablePaths.root.relativeFilePath
15610
16045
  ),
15611
16046
  settablePaths.alternativeRoots,
15612
- (alt) => join113(this.baseDir, alt.relativeDirPath, alt.relativeFilePath)
16047
+ (alt) => join115(this.baseDir, alt.relativeDirPath, alt.relativeFilePath)
15613
16048
  );
15614
16049
  if (forDeletion) {
15615
16050
  return uniqueRootFilePaths.map((filePath) => {
@@ -15654,9 +16089,9 @@ var RulesProcessor = class extends FeatureProcessor {
15654
16089
  return [];
15655
16090
  }
15656
16091
  const uniqueLocalRootFilePaths = await findFilesWithFallback(
15657
- join113(this.baseDir, settablePaths.root.relativeDirPath ?? ".", "CLAUDE.local.md"),
16092
+ join115(this.baseDir, settablePaths.root.relativeDirPath ?? ".", "CLAUDE.local.md"),
15658
16093
  settablePaths.alternativeRoots,
15659
- (alt) => join113(this.baseDir, alt.relativeDirPath, "CLAUDE.local.md")
16094
+ (alt) => join115(this.baseDir, alt.relativeDirPath, "CLAUDE.local.md")
15660
16095
  );
15661
16096
  return uniqueLocalRootFilePaths.map((filePath) => {
15662
16097
  const relativeDirPath = resolveRelativeDirPath(filePath);
@@ -15677,9 +16112,9 @@ var RulesProcessor = class extends FeatureProcessor {
15677
16112
  if (!settablePaths.nonRoot) {
15678
16113
  return [];
15679
16114
  }
15680
- const nonRootBaseDir = join113(this.baseDir, settablePaths.nonRoot.relativeDirPath);
16115
+ const nonRootBaseDir = join115(this.baseDir, settablePaths.nonRoot.relativeDirPath);
15681
16116
  const nonRootFilePaths = await findFilesByGlobs(
15682
- join113(nonRootBaseDir, "**", `*.${factory.meta.extension}`)
16117
+ join115(nonRootBaseDir, "**", `*.${factory.meta.extension}`)
15683
16118
  );
15684
16119
  if (forDeletion) {
15685
16120
  return nonRootFilePaths.map((filePath) => {
@@ -15811,14 +16246,14 @@ s/<command> [arguments]
15811
16246
  This syntax employs a double slash (\`s/\`) to prevent conflicts with built-in slash commands.
15812
16247
  The \`s\` in \`s/\` stands for *simulate*. Because custom slash commands are not built-in, this syntax provides a pseudo way to invoke them.
15813
16248
 
15814
- When users call a custom slash command, you have to look for the markdown file, \`${join113(RULESYNC_COMMANDS_RELATIVE_DIR_PATH, "{command}.md")}\`, then execute the contents of that file as the block of operations.` : "";
16249
+ When users call a custom slash command, you have to look for the markdown file, \`${join115(RULESYNC_COMMANDS_RELATIVE_DIR_PATH, "{command}.md")}\`, then execute the contents of that file as the block of operations.` : "";
15815
16250
  const subagentsSection = subagents ? `## Simulated Subagents
15816
16251
 
15817
16252
  Simulated subagents are specialized AI assistants that can be invoked to handle specific types of tasks. In this case, it can be appear something like custom slash commands simply. Simulated subagents can be called by custom slash commands.
15818
16253
 
15819
- When users call a simulated subagent, it will look for the corresponding markdown file, \`${join113(RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH, "{subagent}.md")}\`, and execute its contents as the block of operations.
16254
+ When users call a simulated subagent, it will look for the corresponding markdown file, \`${join115(RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH, "{subagent}.md")}\`, and execute its contents as the block of operations.
15820
16255
 
15821
- For example, if the user instructs \`Call planner subagent to plan the refactoring\`, you have to look for the markdown file, \`${join113(RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH, "planner.md")}\`, and execute its contents as the block of operations.` : "";
16256
+ For example, if the user instructs \`Call planner subagent to plan the refactoring\`, you have to look for the markdown file, \`${join115(RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH, "planner.md")}\`, and execute its contents as the block of operations.` : "";
15822
16257
  const skillsSection = skills ? this.generateSkillsSection(skills) : "";
15823
16258
  const result = [
15824
16259
  overview,
@@ -15898,7 +16333,7 @@ function warnUnsupportedTargets(params) {
15898
16333
  }
15899
16334
  }
15900
16335
  async function checkRulesyncDirExists(params) {
15901
- return fileExists(join114(params.baseDir, RULESYNC_RELATIVE_DIR_PATH));
16336
+ return fileExists(join116(params.baseDir, RULESYNC_RELATIVE_DIR_PATH));
15902
16337
  }
15903
16338
  async function generate(params) {
15904
16339
  const { config } = params;
@@ -16466,6 +16901,8 @@ export {
16466
16901
  readFileContent,
16467
16902
  writeFileContent,
16468
16903
  fileExists,
16904
+ getFileSize,
16905
+ isSymlink,
16469
16906
  listDirectoryFiles,
16470
16907
  findFilesByGlobs,
16471
16908
  removeDirectory,