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.
- package/README.md +5 -5
- package/dist/{chunk-JGRHJWG5.js → chunk-L5AQUWUM.js} +871 -434
- package/dist/cli/index.cjs +1451 -715
- package/dist/cli/index.js +380 -77
- package/dist/index.cjs +1044 -627
- package/dist/index.js +1 -1
- package/package.json +1 -1
|
@@ -19,7 +19,9 @@ function formatError(error) {
|
|
|
19
19
|
import { consola } from "consola";
|
|
20
20
|
|
|
21
21
|
// src/utils/vitest.ts
|
|
22
|
-
|
|
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
|
-
|
|
287
|
-
|
|
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 {
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
7876
|
-
import { z as
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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/
|
|
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
|
|
9488
|
+
var JunieSkillFrontmatterSchema = z33.looseObject({
|
|
9432
9489
|
name: z33.string(),
|
|
9433
9490
|
description: z33.string()
|
|
9434
9491
|
});
|
|
9435
|
-
var
|
|
9492
|
+
var JunieSkill = class _JunieSkill extends ToolSkill {
|
|
9436
9493
|
constructor({
|
|
9437
9494
|
baseDir = process.cwd(),
|
|
9438
|
-
relativeDirPath = join69(".
|
|
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
|
|
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(".
|
|
9527
|
+
relativeDirPath: join69(".junie", "skills")
|
|
9470
9528
|
};
|
|
9471
9529
|
}
|
|
9472
9530
|
getFrontmatter() {
|
|
9473
|
-
const result =
|
|
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 =
|
|
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 =
|
|
9586
|
+
const settablePaths = _JunieSkill.getSettablePaths({ global });
|
|
9529
9587
|
const rulesyncFrontmatter = rulesyncSkill.getFrontmatter();
|
|
9530
|
-
const
|
|
9588
|
+
const junieFrontmatter = {
|
|
9531
9589
|
name: rulesyncFrontmatter.name,
|
|
9532
9590
|
description: rulesyncFrontmatter.description
|
|
9533
9591
|
};
|
|
9534
|
-
return new
|
|
9592
|
+
return new _JunieSkill({
|
|
9535
9593
|
baseDir: rulesyncSkill.getBaseDir(),
|
|
9536
9594
|
relativeDirPath: settablePaths.relativeDirPath,
|
|
9537
|
-
dirName:
|
|
9538
|
-
frontmatter:
|
|
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("
|
|
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:
|
|
9610
|
+
getSettablePaths: _JunieSkill.getSettablePaths
|
|
9553
9611
|
});
|
|
9554
|
-
const result =
|
|
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
|
|
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
|
-
|
|
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/
|
|
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
|
|
9664
|
+
var KiloSkillFrontmatterSchema = z34.looseObject({
|
|
9606
9665
|
name: z34.string(),
|
|
9607
9666
|
description: z34.string()
|
|
9608
9667
|
});
|
|
9609
|
-
var
|
|
9668
|
+
var KiloSkill = class _KiloSkill extends ToolSkill {
|
|
9610
9669
|
constructor({
|
|
9611
9670
|
baseDir = process.cwd(),
|
|
9612
|
-
relativeDirPath = join70(".
|
|
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(
|
|
9640
|
-
|
|
9641
|
-
|
|
9642
|
-
}
|
|
9698
|
+
static getSettablePaths({
|
|
9699
|
+
global: _global = false
|
|
9700
|
+
} = {}) {
|
|
9643
9701
|
return {
|
|
9644
|
-
relativeDirPath: join70(".
|
|
9702
|
+
relativeDirPath: join70(".kilocode", "skills")
|
|
9645
9703
|
};
|
|
9646
9704
|
}
|
|
9647
9705
|
getFrontmatter() {
|
|
9648
|
-
const result =
|
|
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 =
|
|
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 =
|
|
9762
|
+
const settablePaths = _KiloSkill.getSettablePaths({ global });
|
|
9704
9763
|
const rulesyncFrontmatter = rulesyncSkill.getFrontmatter();
|
|
9705
|
-
const
|
|
9764
|
+
const kiloFrontmatter = {
|
|
9706
9765
|
name: rulesyncFrontmatter.name,
|
|
9707
9766
|
description: rulesyncFrontmatter.description
|
|
9708
9767
|
};
|
|
9709
|
-
return new
|
|
9710
|
-
baseDir
|
|
9768
|
+
return new _KiloSkill({
|
|
9769
|
+
baseDir,
|
|
9711
9770
|
relativeDirPath: settablePaths.relativeDirPath,
|
|
9712
|
-
dirName:
|
|
9713
|
-
frontmatter:
|
|
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("
|
|
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:
|
|
9786
|
+
getSettablePaths: _KiloSkill.getSettablePaths
|
|
9728
9787
|
});
|
|
9729
|
-
const result =
|
|
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
|
|
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
|
-
|
|
9765
|
-
return new _KiroSkill({
|
|
9823
|
+
return new _KiloSkill({
|
|
9766
9824
|
baseDir,
|
|
9767
|
-
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/
|
|
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
|
|
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
|
|
9843
|
+
var KiroSkill = class _KiroSkill extends ToolSkill {
|
|
9787
9844
|
constructor({
|
|
9788
9845
|
baseDir = process.cwd(),
|
|
9789
|
-
relativeDirPath = join71(".
|
|
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(
|
|
9873
|
+
static getSettablePaths(options) {
|
|
9874
|
+
if (options?.global) {
|
|
9875
|
+
throw new Error("KiroSkill does not support global mode.");
|
|
9876
|
+
}
|
|
9817
9877
|
return {
|
|
9818
|
-
relativeDirPath:
|
|
9878
|
+
relativeDirPath: join71(".kiro", "skills")
|
|
9819
9879
|
};
|
|
9820
9880
|
}
|
|
9821
9881
|
getFrontmatter() {
|
|
9822
|
-
const result =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
-
|
|
9881
|
-
|
|
9882
|
-
baseDir: rulesyncSkill.getBaseDir(),
|
|
9944
|
+
return new _KiroSkill({
|
|
9945
|
+
baseDir,
|
|
9883
9946
|
relativeDirPath: settablePaths.relativeDirPath,
|
|
9884
9947
|
dirName: rulesyncSkill.getDirName(),
|
|
9885
|
-
frontmatter:
|
|
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("
|
|
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:
|
|
9962
|
+
getSettablePaths: _KiroSkill.getSettablePaths
|
|
9900
9963
|
});
|
|
9901
|
-
const result =
|
|
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
|
-
|
|
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
|
-
|
|
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/
|
|
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
|
|
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
|
|
10021
|
+
var OpenCodeSkill = class _OpenCodeSkill extends ToolSkill {
|
|
9946
10022
|
constructor({
|
|
9947
10023
|
baseDir = process.cwd(),
|
|
9948
|
-
relativeDirPath = join72(".
|
|
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(
|
|
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(".
|
|
10053
|
+
relativeDirPath: global ? join72(".config", "opencode", "skill") : join72(".opencode", "skill")
|
|
9981
10054
|
};
|
|
9982
10055
|
}
|
|
9983
10056
|
getFrontmatter() {
|
|
9984
|
-
const result =
|
|
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 (
|
|
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 =
|
|
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
|
|
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
|
-
|
|
10038
|
-
|
|
10116
|
+
const settablePaths = _OpenCodeSkill.getSettablePaths({ global });
|
|
10117
|
+
return new _OpenCodeSkill({
|
|
10118
|
+
baseDir,
|
|
10039
10119
|
relativeDirPath: settablePaths.relativeDirPath,
|
|
10040
10120
|
dirName: rulesyncSkill.getDirName(),
|
|
10041
|
-
frontmatter:
|
|
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("
|
|
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:
|
|
10135
|
+
getSettablePaths: _OpenCodeSkill.getSettablePaths
|
|
10056
10136
|
});
|
|
10057
|
-
const result =
|
|
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
|
|
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
|
-
|
|
10082
|
-
return new _ReplitSkill({
|
|
10161
|
+
return new _OpenCodeSkill({
|
|
10083
10162
|
baseDir,
|
|
10084
|
-
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/
|
|
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
|
|
10177
|
+
var ReplitSkillFrontmatterSchema = z37.looseObject({
|
|
10099
10178
|
name: z37.string(),
|
|
10100
10179
|
description: z37.string()
|
|
10101
10180
|
});
|
|
10102
|
-
var
|
|
10181
|
+
var ReplitSkill = class _ReplitSkill extends ToolSkill {
|
|
10103
10182
|
constructor({
|
|
10104
10183
|
baseDir = process.cwd(),
|
|
10105
|
-
relativeDirPath = join73(".
|
|
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
|
|
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(".
|
|
10216
|
+
relativeDirPath: join73(".agents", "skills")
|
|
10137
10217
|
};
|
|
10138
10218
|
}
|
|
10139
10219
|
getFrontmatter() {
|
|
10140
|
-
const result =
|
|
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 =
|
|
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 =
|
|
10268
|
+
const settablePaths = _ReplitSkill.getSettablePaths({ global });
|
|
10196
10269
|
const rulesyncFrontmatter = rulesyncSkill.getFrontmatter();
|
|
10197
|
-
const
|
|
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
|
|
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 =
|
|
10461
|
+
const skillDirPath = join74(loaded.baseDir, loaded.relativeDirPath, loaded.dirName);
|
|
10224
10462
|
throw new Error(
|
|
10225
|
-
`Invalid frontmatter in ${
|
|
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 =
|
|
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
|
|
10508
|
+
import { basename as basename4, join as join75 } from "path";
|
|
10271
10509
|
async function getLocalSkillDirNames(baseDir) {
|
|
10272
|
-
const skillsDir =
|
|
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(
|
|
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 =
|
|
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 =
|
|
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(
|
|
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 =
|
|
10544
|
-
const dirPaths = await findFilesByGlobs(
|
|
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 =
|
|
10562
|
-
const dirPaths = await findFilesByGlobs(
|
|
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
|
|
10871
|
+
import { join as join78 } from "path";
|
|
10625
10872
|
|
|
10626
10873
|
// src/features/subagents/simulated-subagent.ts
|
|
10627
|
-
import { basename as basename6, join as
|
|
10628
|
-
import { z as
|
|
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 =
|
|
10681
|
-
name:
|
|
10682
|
-
description:
|
|
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 ${
|
|
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 ${
|
|
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 =
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
11086
|
+
import { join as join80 } from "path";
|
|
10840
11087
|
var GeminiCliSubagent = class _GeminiCliSubagent extends SimulatedSubagent {
|
|
10841
11088
|
static getSettablePaths() {
|
|
10842
11089
|
return {
|
|
10843
|
-
relativeDirPath:
|
|
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
|
|
11113
|
+
import { join as join81 } from "path";
|
|
10867
11114
|
var RooSubagent = class _RooSubagent extends SimulatedSubagent {
|
|
10868
11115
|
static getSettablePaths() {
|
|
10869
11116
|
return {
|
|
10870
|
-
relativeDirPath:
|
|
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
|
|
10894
|
-
import { z as
|
|
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
|
|
10898
|
-
import { z as
|
|
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
|
|
10902
|
-
import { z as
|
|
10903
|
-
var RulesyncSubagentFrontmatterSchema =
|
|
10904
|
-
targets:
|
|
10905
|
-
name:
|
|
10906
|
-
description:
|
|
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 ${
|
|
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 ${
|
|
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 =
|
|
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 =
|
|
10976
|
-
name:
|
|
10977
|
-
description:
|
|
10978
|
-
model:
|
|
10979
|
-
tools:
|
|
10980
|
-
permissionMode:
|
|
10981
|
-
skills:
|
|
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 ${
|
|
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:
|
|
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 ${
|
|
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 =
|
|
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
|
|
11382
|
+
import { join as join84 } from "path";
|
|
11133
11383
|
import * as smolToml2 from "smol-toml";
|
|
11134
|
-
import { z as
|
|
11135
|
-
var CodexCliSubagentTomlSchema =
|
|
11136
|
-
name:
|
|
11137
|
-
description:
|
|
11138
|
-
developer_instructions:
|
|
11139
|
-
model:
|
|
11140
|
-
model_reasoning_effort:
|
|
11141
|
-
sandbox_mode:
|
|
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 ${
|
|
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:
|
|
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 ${
|
|
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 =
|
|
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
|
|
11296
|
-
import { z as
|
|
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 =
|
|
11299
|
-
name:
|
|
11300
|
-
description:
|
|
11301
|
-
tools:
|
|
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 ${
|
|
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:
|
|
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 ${
|
|
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 =
|
|
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
|
|
11462
|
-
import { z as
|
|
11463
|
-
var CursorSubagentFrontmatterSchema =
|
|
11464
|
-
name:
|
|
11465
|
-
description:
|
|
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 ${
|
|
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:
|
|
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 ${
|
|
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 =
|
|
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
|
|
11609
|
-
import { z as
|
|
11610
|
-
var KiroCliSubagentJsonSchema =
|
|
11611
|
-
name:
|
|
11612
|
-
description:
|
|
11613
|
-
prompt:
|
|
11614
|
-
tools:
|
|
11615
|
-
toolAliases:
|
|
11616
|
-
toolSettings:
|
|
11617
|
-
toolSchema:
|
|
11618
|
-
hooks:
|
|
11619
|
-
model:
|
|
11620
|
-
mcpServers:
|
|
11621
|
-
useLegacyMcpJson:
|
|
11622
|
-
resources:
|
|
11623
|
-
allowedTools:
|
|
11624
|
-
includeMcpJson:
|
|
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 ${
|
|
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:
|
|
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 ${
|
|
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 =
|
|
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
|
|
11779
|
-
import { z as
|
|
11780
|
-
var OpenCodeSubagentFrontmatterSchema =
|
|
11781
|
-
description:
|
|
11782
|
-
mode:
|
|
11783
|
-
name:
|
|
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 ${
|
|
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 ?
|
|
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 ${
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
|
12627
|
+
import { join as join93 } from "path";
|
|
12212
12628
|
|
|
12213
12629
|
// src/features/rules/tool-rule.ts
|
|
12214
|
-
import { join as
|
|
12630
|
+
import { join as join92 } from "path";
|
|
12215
12631
|
|
|
12216
12632
|
// src/features/rules/rulesync-rule.ts
|
|
12217
|
-
import { join as
|
|
12218
|
-
import { z as
|
|
12219
|
-
var RulesyncRuleFrontmatterSchema =
|
|
12220
|
-
root:
|
|
12221
|
-
localRoot:
|
|
12222
|
-
targets:
|
|
12223
|
-
description:
|
|
12224
|
-
globs:
|
|
12225
|
-
agentsmd:
|
|
12226
|
-
|
|
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:
|
|
12644
|
+
subprojectPath: z50.optional(z50.string())
|
|
12229
12645
|
})
|
|
12230
12646
|
),
|
|
12231
|
-
claudecode:
|
|
12232
|
-
|
|
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:
|
|
12651
|
+
paths: z50.optional(z50.array(z50.string()))
|
|
12236
12652
|
})
|
|
12237
12653
|
),
|
|
12238
|
-
cursor:
|
|
12239
|
-
|
|
12240
|
-
alwaysApply:
|
|
12241
|
-
description:
|
|
12242
|
-
globs:
|
|
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:
|
|
12246
|
-
|
|
12247
|
-
excludeAgent:
|
|
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:
|
|
12251
|
-
|
|
12252
|
-
trigger:
|
|
12253
|
-
globs:
|
|
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 ${
|
|
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 ${
|
|
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 =
|
|
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:
|
|
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 =
|
|
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 :
|
|
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" :
|
|
12500
|
-
const fileContent = await readFileContent(
|
|
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
|
|
12556
|
-
import { z as
|
|
12557
|
-
var AntigravityRuleFrontmatterSchema =
|
|
12558
|
-
trigger:
|
|
12559
|
-
|
|
12560
|
-
|
|
12561
|
-
|
|
12562
|
-
|
|
12563
|
-
|
|
12564
|
-
|
|
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:
|
|
12569
|
-
description:
|
|
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 ${
|
|
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 =
|
|
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
|
|
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 :
|
|
12939
|
-
const fileContent = await readFileContent(
|
|
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
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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 =
|
|
13096
|
-
const fileContent = await readFileContent(
|
|
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
|
|
13156
|
-
import { z as
|
|
13157
|
-
var ClaudecodeRuleFrontmatterSchema =
|
|
13158
|
-
paths:
|
|
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 ${
|
|
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
|
-
|
|
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 =
|
|
13242
|
-
const filePath =
|
|
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 ${
|
|
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
|
|
13374
|
-
import { z as
|
|
13375
|
-
var ClineRuleFrontmatterSchema =
|
|
13376
|
-
description:
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 =
|
|
13495
|
-
const fileContent = await readFileContent(
|
|
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
|
|
13555
|
-
import { z as
|
|
13556
|
-
var CopilotRuleFrontmatterSchema =
|
|
13557
|
-
description:
|
|
13558
|
-
applyTo:
|
|
13559
|
-
excludeAgent:
|
|
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 ${
|
|
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 =
|
|
13679
|
-
const filePath2 =
|
|
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 =
|
|
13695
|
-
const filePath =
|
|
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 ${
|
|
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
|
|
13762
|
-
import { z as
|
|
13763
|
-
var CursorRuleFrontmatterSchema =
|
|
13764
|
-
description:
|
|
13765
|
-
globs:
|
|
13766
|
-
alwaysApply:
|
|
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 ${
|
|
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 =
|
|
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 ${
|
|
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 ${
|
|
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
|
|
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 =
|
|
14007
|
-
const fileContent2 = await readFileContent(
|
|
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 =
|
|
14021
|
-
const fileContent = await readFileContent(
|
|
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
|
|
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
|
-
|
|
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 =
|
|
14130
|
-
const fileContent = await readFileContent(
|
|
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
|
|
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
|
-
|
|
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 =
|
|
14239
|
-
const fileContent = await readFileContent(
|
|
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
|
|
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" :
|
|
14318
|
-
const fileContent = await readFileContent(
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 =
|
|
14559
|
-
const fileContent = await readFileContent(
|
|
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
|
|
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" :
|
|
14638
|
-
const fileContent = await readFileContent(
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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 :
|
|
14889
|
-
const fileContent = await readFileContent(
|
|
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
|
|
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
|
-
|
|
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 =
|
|
15036
|
-
var formatRulePaths = (rules) => rules.map((r) =>
|
|
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 =
|
|
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 =
|
|
15525
|
-
const files = await findFilesByGlobs(
|
|
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
|
-
|
|
15541
|
-
|
|
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 (
|
|
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
|
-
|
|
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(
|
|
15979
|
+
`Multiple localRoot rules found for target '${this.toolTarget}': ${formatRulePaths(targetedLocalRootRules)}. Only one rule can have localRoot: true`
|
|
15552
15980
|
);
|
|
15553
15981
|
}
|
|
15554
|
-
if (
|
|
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(
|
|
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
|
|
15561
|
-
|
|
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
|
-
`${
|
|
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 (
|
|
15998
|
+
if (targetedLocalRootRules.length > 0) {
|
|
15567
15999
|
logger.warn(
|
|
15568
|
-
`${
|
|
16000
|
+
`${targetedLocalRootRules.length} localRoot rules found, but localRoot is not supported in global mode, ignoring them: ${formatRulePaths(targetedLocalRootRules)}`
|
|
15569
16001
|
);
|
|
15570
16002
|
}
|
|
15571
|
-
return
|
|
16003
|
+
return supportsGlobalNonRoot ? [...targetedRootRules, ...nonRootRules2] : targetedRootRules;
|
|
15572
16004
|
}
|
|
15573
|
-
|
|
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
|
-
|
|
16041
|
+
join115(
|
|
15607
16042
|
this.baseDir,
|
|
15608
16043
|
settablePaths.root.relativeDirPath ?? ".",
|
|
15609
16044
|
settablePaths.root.relativeFilePath
|
|
15610
16045
|
),
|
|
15611
16046
|
settablePaths.alternativeRoots,
|
|
15612
|
-
(alt) =>
|
|
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
|
-
|
|
16092
|
+
join115(this.baseDir, settablePaths.root.relativeDirPath ?? ".", "CLAUDE.local.md"),
|
|
15658
16093
|
settablePaths.alternativeRoots,
|
|
15659
|
-
(alt) =>
|
|
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 =
|
|
16115
|
+
const nonRootBaseDir = join115(this.baseDir, settablePaths.nonRoot.relativeDirPath);
|
|
15681
16116
|
const nonRootFilePaths = await findFilesByGlobs(
|
|
15682
|
-
|
|
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, \`${
|
|
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, \`${
|
|
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, \`${
|
|
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(
|
|
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,
|