rulesync 16.37.0 → 16.38.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.
@@ -444,36 +444,36 @@ const isFeatureValueEnabled = (value) => {
444
444
  const parseCommaSeparatedList = (value) => value.split(",").map((s) => s.trim()).filter(Boolean);
445
445
  //#endregion
446
446
  //#region src/constants/rulesync-paths.ts
447
- const { join: join$350 } = node_path.posix;
447
+ const { join: join$351 } = node_path.posix;
448
448
  const RULESYNC_CONFIG_RELATIVE_FILE_PATH = "rulesync.jsonc";
449
449
  const RULESYNC_LOCAL_CONFIG_RELATIVE_FILE_PATH = "rulesync.local.jsonc";
450
450
  const RULESYNC_USER_CONFIG_DIR_NAME = "rulesync";
451
451
  const RULESYNC_XDG_CONFIG_HOME_DEFAULT_DIR_NAME = ".config";
452
452
  const RULESYNC_RELATIVE_DIR_PATH = ".rulesync";
453
453
  const RULES_FEATURE_SUBDIR = "rules";
454
- const CURATED_RULES_FEATURE_SUBDIR = join$350(RULES_FEATURE_SUBDIR, ".curated");
454
+ const CURATED_RULES_FEATURE_SUBDIR = join$351(RULES_FEATURE_SUBDIR, ".curated");
455
455
  const COMMANDS_FEATURE_SUBDIR = "commands";
456
456
  const SUBAGENTS_FEATURE_SUBDIR = "subagents";
457
457
  const CHECKS_FEATURE_SUBDIR = "checks";
458
458
  const SKILLS_FEATURE_SUBDIR = "skills";
459
- const CURATED_SKILLS_FEATURE_SUBDIR = join$350(SKILLS_FEATURE_SUBDIR, ".curated");
460
- const RULESYNC_RULES_RELATIVE_DIR_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, RULES_FEATURE_SUBDIR);
461
- const RULESYNC_CURATED_RULES_RELATIVE_DIR_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, CURATED_RULES_FEATURE_SUBDIR);
462
- const RULESYNC_COMMANDS_RELATIVE_DIR_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, COMMANDS_FEATURE_SUBDIR);
463
- const RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, SUBAGENTS_FEATURE_SUBDIR);
464
- const RULESYNC_CHECKS_RELATIVE_DIR_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, CHECKS_FEATURE_SUBDIR);
465
- const RULESYNC_MCP_RELATIVE_FILE_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, "mcp.jsonc");
466
- const RULESYNC_HOOKS_RELATIVE_FILE_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, "hooks.jsonc");
467
- const RULESYNC_PERMISSIONS_RELATIVE_FILE_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, "permissions.jsonc");
468
- join$350(RULESYNC_RELATIVE_DIR_PATH, "mcp.json");
469
- const RULESYNC_HOOKS_LEGACY_RELATIVE_FILE_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, "hooks.json");
470
- const RULESYNC_PERMISSIONS_LEGACY_RELATIVE_FILE_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, "permissions.json");
459
+ const CURATED_SKILLS_FEATURE_SUBDIR = join$351(SKILLS_FEATURE_SUBDIR, ".curated");
460
+ const RULESYNC_RULES_RELATIVE_DIR_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, RULES_FEATURE_SUBDIR);
461
+ const RULESYNC_CURATED_RULES_RELATIVE_DIR_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, CURATED_RULES_FEATURE_SUBDIR);
462
+ const RULESYNC_COMMANDS_RELATIVE_DIR_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, COMMANDS_FEATURE_SUBDIR);
463
+ const RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, SUBAGENTS_FEATURE_SUBDIR);
464
+ const RULESYNC_CHECKS_RELATIVE_DIR_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, CHECKS_FEATURE_SUBDIR);
465
+ const RULESYNC_MCP_RELATIVE_FILE_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, "mcp.jsonc");
466
+ const RULESYNC_HOOKS_RELATIVE_FILE_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, "hooks.jsonc");
467
+ const RULESYNC_PERMISSIONS_RELATIVE_FILE_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, "permissions.jsonc");
468
+ join$351(RULESYNC_RELATIVE_DIR_PATH, "mcp.json");
469
+ const RULESYNC_HOOKS_LEGACY_RELATIVE_FILE_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, "hooks.json");
470
+ const RULESYNC_PERMISSIONS_LEGACY_RELATIVE_FILE_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, "permissions.json");
471
471
  const RULESYNC_AIIGNORE_FILE_NAME = ".aiignore";
472
- const RULESYNC_AIIGNORE_RELATIVE_FILE_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, ".aiignore");
472
+ const RULESYNC_AIIGNORE_RELATIVE_FILE_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, ".aiignore");
473
473
  const RULESYNC_IGNORE_RELATIVE_FILE_PATH = ".rulesyncignore";
474
474
  const RULESYNC_OVERVIEW_FILE_NAME = "overview.md";
475
- const RULESYNC_SKILLS_RELATIVE_DIR_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, SKILLS_FEATURE_SUBDIR);
476
- const RULESYNC_CURATED_SKILLS_RELATIVE_DIR_PATH = join$350(RULESYNC_RELATIVE_DIR_PATH, CURATED_SKILLS_FEATURE_SUBDIR);
475
+ const RULESYNC_SKILLS_RELATIVE_DIR_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, SKILLS_FEATURE_SUBDIR);
476
+ const RULESYNC_CURATED_SKILLS_RELATIVE_DIR_PATH = join$351(RULESYNC_RELATIVE_DIR_PATH, CURATED_SKILLS_FEATURE_SUBDIR);
477
477
  const RULESYNC_SOURCES_LOCK_RELATIVE_FILE_PATH = "rulesync.lock";
478
478
  const RULESYNC_NPM_SOURCES_LOCK_RELATIVE_FILE_PATH = "rulesync-npm.lock.json";
479
479
  const RULESYNC_MCP_FILE_NAME = "mcp.jsonc";
@@ -616,6 +616,7 @@ const mcpProcessorToolTargetTuple = [
616
616
  "junie",
617
617
  "musecode",
618
618
  "opencode",
619
+ "pool",
619
620
  "qwencode",
620
621
  "reasonix",
621
622
  "roo",
@@ -3329,6 +3330,8 @@ const SHARED_USER_MANAGED_CONFIG_PATHS = [
3329
3330
  ".grok/config.toml",
3330
3331
  ".rovodev/config.yml",
3331
3332
  ".rovodev/mcp.json",
3333
+ ".poolside/settings.yaml",
3334
+ ".config/poolside/settings.yaml",
3332
3335
  ".tabnine/agent/settings.json",
3333
3336
  ".vibe/config.toml",
3334
3337
  ".zcode/config.json",
@@ -4378,7 +4381,7 @@ const PI_HOOK_EVENTS = [
4378
4381
  * adapter. Amp's `agent.start` / `agent.end` events describe the main agent
4379
4382
  * turn, not a subagent lifecycle, so they map to `beforeSubmitPrompt` / `stop`.
4380
4383
  *
4381
- * @see https://ampcode.com/manual/plugin-api
4384
+ * @see https://ampcode.com/docs/plugin-api
4382
4385
  */
4383
4386
  const AMP_HOOK_EVENTS = [
4384
4387
  "sessionStart",
@@ -6223,6 +6226,7 @@ const McpServerSchema = zod_mini.z.looseObject({
6223
6226
  crushOauthClientSecret: zod_mini.z.optional(zod_mini.z.string()),
6224
6227
  crushOauthCallbackPort: zod_mini.z.optional(zod_mini.z.int()),
6225
6228
  crushSessionless: zod_mini.z.optional(zod_mini.z.boolean()),
6229
+ poolAllow: zod_mini.z.optional(zod_mini.z.array(zod_mini.z.string())),
6226
6230
  headers: zod_mini.z.optional(zod_mini.z.record(zod_mini.z.string(), zod_mini.z.string())),
6227
6231
  /**
6228
6232
  * The canonical per-server tool allowlist.
@@ -6654,6 +6658,7 @@ var RulesyncMcp = class RulesyncMcp extends RulesyncFile {
6654
6658
  "crushOauthClientSecret",
6655
6659
  "crushOauthCallbackPort",
6656
6660
  "crushSessionless",
6661
+ "poolAllow",
6657
6662
  "oauth_client_id",
6658
6663
  "oauth_client_secret",
6659
6664
  "oauth_callback_port",
@@ -8341,7 +8346,7 @@ const PERMISSION_OVERRIDE_KEY_ALIASES = {
8341
8346
  * them; treating a segment that carries one as static could name a directory
8342
8347
  * that no matched file actually lives under.
8343
8348
  */
8344
- const GLOB_METACHARACTERS = /[*?[\]{}()!]/;
8349
+ const GLOB_METACHARACTERS$1 = /[*?[\]{}()!]/;
8345
8350
  /**
8346
8351
  * The directory every file matched by `glob` lives under, or `undefined` when
8347
8352
  * the pattern pins down no such directory.
@@ -8374,7 +8379,7 @@ function getGlobStaticPrefix(glob) {
8374
8379
  const lastIndex = segments.length - 1;
8375
8380
  const prefix = [];
8376
8381
  for (const [index, segment] of segments.entries()) {
8377
- if (segment === "" || GLOB_METACHARACTERS.test(segment)) break;
8382
+ if (segment === "" || GLOB_METACHARACTERS$1.test(segment)) break;
8378
8383
  if (segment === ".") continue;
8379
8384
  if (index === lastIndex) break;
8380
8385
  prefix.push(segment);
@@ -12949,6 +12954,8 @@ const KIMI_CODE_HOME_CONFIG_SHARED_FILE_KEY = "config.toml";
12949
12954
  const REASONIX_PROJECT_CONFIG_SHARED_FILE_KEY = "reasonix.toml";
12950
12955
  const REASONIX_GLOBAL_CONFIG_SHARED_FILE_KEY = ".reasonix/config.toml";
12951
12956
  const ROVODEV_CONFIG_SHARED_FILE_KEY = ".rovodev/config.yml";
12957
+ const POOL_PROJECT_SETTINGS_SHARED_FILE_KEY = ".poolside/settings.yaml";
12958
+ const POOL_GLOBAL_SETTINGS_SHARED_FILE_KEY = ".config/poolside/settings.yaml";
12952
12959
  /**
12953
12960
  * Build the `SHARED_CONFIG_OWNERSHIP` lookup key from a tool's settable paths.
12954
12961
  * Mirrors `sharedFileKey` in `src/lib/shared-file-derive.ts` (kept separate so
@@ -13030,6 +13037,20 @@ const KIMI_CODE_CONFIG_DECLARATION = {
13030
13037
  }
13031
13038
  };
13032
13039
  /**
13040
+ * Pool settings (`.poolside/settings.yaml` / `~/.config/poolside/settings.yaml`):
13041
+ * the user's primary Pool settings file, so an unparseable root fails closed
13042
+ * rather than being replaced with generated output. `mcp_servers` is owned as
13043
+ * a whole key because the MCP writer emits the complete server map.
13044
+ */
13045
+ const POOL_SETTINGS_DECLARATION = {
13046
+ format: "yaml",
13047
+ invalidRootPolicy: "error",
13048
+ features: { mcp: {
13049
+ kind: "replace-owned-keys",
13050
+ ownedKeys: ["mcp_servers"]
13051
+ } }
13052
+ };
13053
+ /**
13033
13054
  * ZCode's settings file, which also carries model/theme/permission keys
13034
13055
  * rulesync does not own. Both copies are the user's primary ZCode config, so
13035
13056
  * every writer refuses to read-modify-write a file it could not parse rather
@@ -13134,6 +13155,8 @@ const SHARED_CONFIG_OWNERSHIP = {
13134
13155
  [HERMES_CONFIG_SHARED_FILE_KEY]: HERMES_CONFIG_DECLARATION,
13135
13156
  [HERMES_WIN32_CONFIG_SHARED_FILE_KEY]: HERMES_CONFIG_DECLARATION,
13136
13157
  [HERMES_HOME_CONFIG_SHARED_FILE_KEY]: HERMES_CONFIG_DECLARATION,
13158
+ [POOL_PROJECT_SETTINGS_SHARED_FILE_KEY]: POOL_SETTINGS_DECLARATION,
13159
+ [POOL_GLOBAL_SETTINGS_SHARED_FILE_KEY]: POOL_SETTINGS_DECLARATION,
13137
13160
  [TAKT_CONFIG_SHARED_FILE_KEY]: {
13138
13161
  format: "yaml",
13139
13162
  invalidRootPolicy: "error",
@@ -37119,6 +37142,363 @@ var OpencodeMcp = class OpencodeMcp extends ToolMcp {
37119
37142
  }
37120
37143
  };
37121
37144
  //#endregion
37145
+ //#region src/constants/pool-paths.ts
37146
+ /**
37147
+ * Pool (Poolside's coding agent CLI) configuration-layout conventions.
37148
+ *
37149
+ * Pool reads `AGENTS.md` instruction files the same way the AGENTS.md standard
37150
+ * describes them: the personal `~/.config/poolside/AGENTS.md` (Pool itself
37151
+ * honours `XDG_CONFIG_HOME` upstream; rulesync writes only the XDG-default
37152
+ * path), the project-root `AGENTS.md`, and nested per-directory
37153
+ * `AGENTS.md` files from the repository root down through the working
37154
+ * directory, deeper files taking precedence. It skips ignored directories
37155
+ * (`.git/`, `node_modules/`, cache directories, repository ignore rules).
37156
+ *
37157
+ * Skills follow the Agent Skills format (`<name>/SKILL.md` bundles). Pool
37158
+ * scans `.poolside/skills/` (project) and `~/.config/poolside/skills/`
37159
+ * (global) plus the shared `.agents/skills/` / `~/.agents/skills/` roots and
37160
+ * the skill directories of other Agent Skills tools; rulesync writes only the
37161
+ * Pool-specific roots and leaves the shared ones to their own targets.
37162
+ *
37163
+ * @see https://docs.poolside.ai/agent-instructions
37164
+ * @see https://docs.poolside.ai/skills
37165
+ * @see https://github.com/poolsideai/pool
37166
+ */
37167
+ /** Project-scoped `.poolside/` directory at the project root. */
37168
+ const POOL_DIR = ".poolside";
37169
+ /** Global config directory for Pool, relative to the home directory. */
37170
+ const POOL_GLOBAL_DIR = (0, node_path.join)(".config", "poolside");
37171
+ /** Project skills root, relative to the project root. */
37172
+ const POOL_SKILLS_DIR_PATH = (0, node_path.join)(POOL_DIR, "skills");
37173
+ /** Global skills root, relative to the home directory. */
37174
+ const POOL_GLOBAL_SKILLS_DIR_PATH = (0, node_path.join)(POOL_GLOBAL_DIR, "skills");
37175
+ /**
37176
+ * Pool's settings file name. MCP servers live under the top-level
37177
+ * `mcp_servers` key of `.poolside/settings.yaml` (project, committed) and
37178
+ * `~/.config/poolside/settings.yaml` (global); the untracked
37179
+ * `.poolside/settings.local.yaml` overlay is left to the user.
37180
+ *
37181
+ * @see https://docs.poolside.ai/mcp-servers
37182
+ * @see https://docs.poolside.ai/settings-file-reference
37183
+ */
37184
+ const POOL_SETTINGS_FILE_NAME = "settings.yaml";
37185
+ /** Top-level key of Pool's settings file that holds the MCP server map. */
37186
+ const POOL_MCP_SERVERS_KEY = "mcp_servers";
37187
+ //#endregion
37188
+ //#region src/features/mcp/pool-mcp.ts
37189
+ /**
37190
+ * Single spelling of the settings.yaml codec/policy, matching the
37191
+ * `SHARED_CONFIG_OWNERSHIP` declaration for both scopes: fail closed on an
37192
+ * unparseable root rather than replacing the user's primary Pool settings with
37193
+ * generated output.
37194
+ */
37195
+ function parsePoolSettings(fileContent, filePath) {
37196
+ return parseSharedConfig({
37197
+ format: "yaml",
37198
+ fileContent,
37199
+ filePath,
37200
+ invalidRootPolicy: "error"
37201
+ });
37202
+ }
37203
+ /**
37204
+ * The remote transports Pool's `transport.type` accepts. `streamable-http` is
37205
+ * the canonical rulesync name for what Pool calls `http`; everything else is
37206
+ * left to the caller to reject.
37207
+ *
37208
+ * @see https://docs.poolside.ai/mcp-servers
37209
+ */
37210
+ function asPoolRemoteType(stated, url) {
37211
+ if (stated === "sse") return "sse";
37212
+ if (stated === "http" || stated === "streamable-http") return "http";
37213
+ if (stated === void 0) return /^wss?:\/\//i.test(url) ? void 0 : "http";
37214
+ }
37215
+ /**
37216
+ * Pool spells remote headers as a list of `"Name: value"` strings rather than
37217
+ * a map, so the canonical record is flattened at generate time and split back
37218
+ * at the first `:` on import. A list entry without a `:` names no header and
37219
+ * is dropped with a warning — silently losing what may be a mistyped auth
37220
+ * header would leave the canonical file short of one without a trace.
37221
+ */
37222
+ function headersRecordToPoolList(headers) {
37223
+ return Object.entries(headers).map(([name, value]) => `${name}: ${value}`);
37224
+ }
37225
+ function poolHeadersListToRecord(serverName, headers) {
37226
+ if (!isStringArray$2(headers)) return void 0;
37227
+ const result = {};
37228
+ for (const entry of headers) {
37229
+ const separator = entry.indexOf(":");
37230
+ const name = separator > 0 ? entry.slice(0, separator).trim() : "";
37231
+ if (name === "" || PROTOTYPE_POLLUTION_KEYS.has(name)) {
37232
+ warnWithFallback(void 0, `Ignored malformed header ${quoteValueForWarning(entry)} in Pool MCP server ${quoteValueForWarning(serverName)}: expected "Name: value"`);
37233
+ continue;
37234
+ }
37235
+ result[name] = entry.slice(separator + 1).trim();
37236
+ }
37237
+ return Object.keys(result).length > 0 ? result : void 0;
37238
+ }
37239
+ /**
37240
+ * Pool's `deny`/`enabled_tools` entries are glob patterns, while the canonical
37241
+ * `enabledTools`/`disabledTools` lists are literal tool names that the other
37242
+ * targets match verbatim. A pattern therefore imports as a name that matches
37243
+ * nothing elsewhere — a `deny` that quietly stops denying is the case worth
37244
+ * calling out — so it is copied as-is but warned about. `allow` is exempt: it
37245
+ * imports to the Pool-only `poolAllow`, where globs are exactly what Pool
37246
+ * expects and no other tool ever reads them.
37247
+ */
37248
+ const GLOB_METACHARACTERS = /[*?[]/;
37249
+ /** Patterns named in the glob warning before the rest collapse to `(+N more)`. */
37250
+ const MAX_LISTED_GLOB_PATTERNS = 10;
37251
+ function importPoolToolList({ serverName, poolKey, value, warnOnGlobs }) {
37252
+ if (!isStringArray$2(value)) {
37253
+ warnWithFallback(void 0, `Ignored malformed value for ${poolKey} in Pool MCP server ${quoteValueForWarning(serverName)}: expected a list of strings`);
37254
+ return;
37255
+ }
37256
+ if (!warnOnGlobs) return value;
37257
+ const patterns = value.filter((entry) => GLOB_METACHARACTERS.test(entry));
37258
+ if (patterns.length > 0) {
37259
+ const listed = patterns.slice(0, MAX_LISTED_GLOB_PATTERNS).map(quoteValueForWarning);
37260
+ const overflow = patterns.length - listed.length;
37261
+ const shown = overflow > 0 ? `${listed.join(", ")} (+${overflow} more)` : listed.join(", ");
37262
+ warnWithFallback(void 0, `${poolKey} in Pool MCP server ${quoteValueForWarning(serverName)} contains glob patterns (${shown}); other tools match the imported tool names literally`);
37263
+ }
37264
+ return value;
37265
+ }
37266
+ /**
37267
+ * Pool's `transport` block for a remote server, or `null` (after a warning)
37268
+ * when the server has no url or names a transport Pool cannot reach.
37269
+ */
37270
+ function toPoolTransport(name, config, logger) {
37271
+ const url = resolveRemoteMcpUrl(config);
37272
+ if (!url) return warnAndSkipMcpServer({
37273
+ toolName: "Pool",
37274
+ serverName: name,
37275
+ reason: "a remote transport without a url",
37276
+ logger
37277
+ });
37278
+ const stated = config.type ?? config.transport;
37279
+ const type = asPoolRemoteType(stated, url);
37280
+ if (type === void 0) return warnAndSkipMcpServer({
37281
+ toolName: "Pool",
37282
+ serverName: name,
37283
+ reason: stated === void 0 ? "a WebSocket url, which Pool's remote transports (http and sse) cannot reach" : `the "${stated}" transport, which Pool does not offer for remote servers (only http and sse)`,
37284
+ logger
37285
+ });
37286
+ const transport = {
37287
+ type,
37288
+ url
37289
+ };
37290
+ if (config.headers && Object.keys(config.headers).length > 0) transport.headers = headersRecordToPoolList(config.headers);
37291
+ return transport;
37292
+ }
37293
+ /**
37294
+ * The transport-specific part of a Pool server entry: a `transport` block for
37295
+ * remote servers, `command`/`args`/`cwd` for stdio ones. `null` (after a
37296
+ * warning) when the server cannot be written.
37297
+ */
37298
+ function toPoolTransportFields(name, config, logger) {
37299
+ if (isRemoteMcpServer(config)) {
37300
+ const transport = toPoolTransport(name, config, logger);
37301
+ return transport === null ? null : { transport };
37302
+ }
37303
+ const [command, ...args] = resolveLocalMcpCommand(config);
37304
+ if (!command) return warnAndSkipMcpServer({
37305
+ toolName: "Pool",
37306
+ serverName: name,
37307
+ reason: "a stdio transport without a command",
37308
+ logger
37309
+ });
37310
+ const fields = {
37311
+ command,
37312
+ args
37313
+ };
37314
+ if (config.cwd) fields.cwd = config.cwd;
37315
+ return fields;
37316
+ }
37317
+ /**
37318
+ * The fields shared by stdio and remote entries. Tool filters map onto Pool's
37319
+ * own switches — `enabledTools` becomes `enabled_tools` (the tools Pool
37320
+ * exposes at all) and `disabledTools` becomes `deny` (patterns agents may
37321
+ * never use); the Pool-only approval allowlist is authored as `poolAllow` and
37322
+ * written as `allow`. `disabled: true` is spelled the same on both sides.
37323
+ */
37324
+ function toPoolCommonFields(config) {
37325
+ const fields = {};
37326
+ if (config.env && Object.keys(config.env).length > 0) fields.env = config.env;
37327
+ if (config.enabledTools && config.enabledTools.length > 0) fields.enabled_tools = config.enabledTools;
37328
+ if (config.poolAllow && config.poolAllow.length > 0) fields.allow = config.poolAllow;
37329
+ if (config.disabledTools && config.disabledTools.length > 0) fields.deny = config.disabledTools;
37330
+ if (config.disabled === true) fields.disabled = true;
37331
+ return fields;
37332
+ }
37333
+ /**
37334
+ * Convert canonical rulesync servers to Pool's native `mcp_servers` shape:
37335
+ * stdio servers carry `command`/`args`/`cwd`/`env`, remote servers carry a
37336
+ * `transport` block (`type` of `http` or `sse`, `url`, optional `headers`
37337
+ * list) plus optional `env`; see `toPoolCommonFields` for the tool filters.
37338
+ *
37339
+ * @see https://docs.poolside.ai/mcp-servers
37340
+ */
37341
+ function convertToPoolFormat(mcpServers, logger) {
37342
+ const result = {};
37343
+ for (const [name, config] of Object.entries(mcpServers)) {
37344
+ if (PROTOTYPE_POLLUTION_KEYS.has(name)) continue;
37345
+ if (!isRecord$1(config)) continue;
37346
+ if (declaresNoTransport(config)) {
37347
+ warnAndSkipMcpServer({
37348
+ toolName: "Pool",
37349
+ serverName: name,
37350
+ reason: "no transport",
37351
+ logger
37352
+ });
37353
+ continue;
37354
+ }
37355
+ const transportFields = toPoolTransportFields(name, config, logger);
37356
+ if (transportFields === null) continue;
37357
+ result[name] = {
37358
+ ...transportFields,
37359
+ ...toPoolCommonFields(config)
37360
+ };
37361
+ }
37362
+ return result;
37363
+ }
37364
+ const POOL_TO_CANONICAL_TOOL_LIST_KEYS = {
37365
+ enabled_tools: "enabledTools",
37366
+ deny: "disabledTools",
37367
+ allow: "poolAllow"
37368
+ };
37369
+ /**
37370
+ * Convert Pool's native `mcp_servers` shape back to canonical rulesync
37371
+ * servers: the `transport` block is flattened to `type`/`url`/`headers`,
37372
+ * `enabled_tools` maps back to `enabledTools`, `deny` to `disabledTools` and
37373
+ * `allow` to the namespaced `poolAllow` (see `McpServerSchema`). Unknown keys
37374
+ * pass through untouched so an import keeps whatever a hand-authored entry
37375
+ * declared; generation back out is a whitelist, so only the keys
37376
+ * `convertToPoolFormat` writes are re-emitted.
37377
+ */
37378
+ function convertFromPoolFormat(poolServers) {
37379
+ const result = {};
37380
+ for (const [name, config] of Object.entries(poolServers)) {
37381
+ if (PROTOTYPE_POLLUTION_KEYS.has(name) || !isRecord$1(config)) continue;
37382
+ const converted = {};
37383
+ for (const [key, value] of Object.entries(config)) {
37384
+ if (PROTOTYPE_POLLUTION_KEYS.has(key)) continue;
37385
+ if (key === "transport") {
37386
+ if (!isRecord$1(value)) continue;
37387
+ if (typeof value.type === "string") converted.type = value.type;
37388
+ if (typeof value.url === "string") converted.url = value.url;
37389
+ const headers = poolHeadersListToRecord(name, value.headers);
37390
+ if (headers) converted.headers = headers;
37391
+ continue;
37392
+ }
37393
+ const canonicalKey = Object.hasOwn(POOL_TO_CANONICAL_TOOL_LIST_KEYS, key) ? POOL_TO_CANONICAL_TOOL_LIST_KEYS[key] : void 0;
37394
+ if (canonicalKey) {
37395
+ const list = importPoolToolList({
37396
+ serverName: name,
37397
+ poolKey: key,
37398
+ value,
37399
+ warnOnGlobs: canonicalKey !== "poolAllow"
37400
+ });
37401
+ if (list) converted[canonicalKey] = list;
37402
+ continue;
37403
+ }
37404
+ converted[key] = value;
37405
+ }
37406
+ result[name] = converted;
37407
+ }
37408
+ return result;
37409
+ }
37410
+ /**
37411
+ * Pool MCP servers.
37412
+ *
37413
+ * Pool reads MCP servers from the `mcp_servers` block of its settings file:
37414
+ * `<project>/.poolside/settings.yaml` at project scope (shared and committed)
37415
+ * and `~/.config/poolside/settings.yaml` at user scope. The untracked
37416
+ * `.poolside/settings.local.yaml` overlay, which Pool layers on top of both,
37417
+ * is left to the user. Every other top-level settings key is preserved and
37418
+ * the file is never deleted.
37419
+ *
37420
+ * @see https://docs.poolside.ai/mcp-servers
37421
+ * @see https://docs.poolside.ai/settings-file-reference
37422
+ */
37423
+ var PoolMcp = class PoolMcp extends ToolMcp {
37424
+ settings;
37425
+ constructor(params) {
37426
+ super(params);
37427
+ this.settings = parsePoolSettings(this.fileContent ?? "", (0, node_path.join)(this.relativeDirPath, this.relativeFilePath));
37428
+ }
37429
+ getSettings() {
37430
+ return this.settings;
37431
+ }
37432
+ isDeletable() {
37433
+ return false;
37434
+ }
37435
+ static getSettablePaths({ global = false } = {}) {
37436
+ return {
37437
+ relativeDirPath: global ? POOL_GLOBAL_DIR : POOL_DIR,
37438
+ relativeFilePath: POOL_SETTINGS_FILE_NAME
37439
+ };
37440
+ }
37441
+ static async fromFile({ outputRoot = process.cwd(), validate = true, global = false }) {
37442
+ const paths = this.getSettablePaths({ global });
37443
+ const fileContent = await readFileContentOrNull((0, node_path.join)(outputRoot, paths.relativeDirPath, paths.relativeFilePath)) ?? "";
37444
+ return new PoolMcp({
37445
+ outputRoot,
37446
+ relativeDirPath: paths.relativeDirPath,
37447
+ relativeFilePath: paths.relativeFilePath,
37448
+ fileContent,
37449
+ validate,
37450
+ global
37451
+ });
37452
+ }
37453
+ static async fromRulesyncMcp({ outputRoot = process.cwd(), rulesyncMcp, validate = true, global = false, logger }) {
37454
+ const paths = this.getSettablePaths({ global });
37455
+ const filePath = (0, node_path.join)(outputRoot, paths.relativeDirPath, paths.relativeFilePath);
37456
+ const existingContent = await readFileContentOrNull(filePath) ?? "";
37457
+ const converted = convertToPoolFormat(Object.fromEntries(Object.entries(rulesyncMcp.getMcpServers()).map(([serverName, serverConfig]) => {
37458
+ const rawServer = rulesyncMcp.getRawMcpServer(serverName);
37459
+ const poolAllow = isRecord$1(rawServer) ? rawServer.poolAllow : void 0;
37460
+ return [serverName, {
37461
+ ...serverConfig,
37462
+ ...isStringArray$2(poolAllow) && { poolAllow }
37463
+ }];
37464
+ })), logger);
37465
+ return new PoolMcp({
37466
+ outputRoot,
37467
+ relativeDirPath: paths.relativeDirPath,
37468
+ relativeFilePath: paths.relativeFilePath,
37469
+ fileContent: applySharedConfigPatch({
37470
+ fileKey: sharedConfigFileKey(paths),
37471
+ feature: "mcp",
37472
+ existingContent,
37473
+ patch: { [POOL_MCP_SERVERS_KEY]: converted },
37474
+ filePath
37475
+ }),
37476
+ validate,
37477
+ global
37478
+ });
37479
+ }
37480
+ toRulesyncMcp() {
37481
+ const converted = convertFromPoolFormat(isRecord$1(this.settings["mcp_servers"]) ? this.settings[POOL_MCP_SERVERS_KEY] : {});
37482
+ return this.toRulesyncMcpDefault({ fileContent: JSON.stringify({ mcpServers: converted }, null, 2) });
37483
+ }
37484
+ validate() {
37485
+ return {
37486
+ success: true,
37487
+ error: null
37488
+ };
37489
+ }
37490
+ static forDeletion({ outputRoot = process.cwd(), relativeDirPath, relativeFilePath, global = false }) {
37491
+ return new PoolMcp({
37492
+ outputRoot,
37493
+ relativeDirPath,
37494
+ relativeFilePath,
37495
+ fileContent: "",
37496
+ validate: false,
37497
+ global
37498
+ });
37499
+ }
37500
+ };
37501
+ //#endregion
37122
37502
  //#region src/features/mcp/qwencode-mcp.ts
37123
37503
  /**
37124
37504
  * Map rulesync's canonical per-server tool filters to Qwen Code's field names.
@@ -39566,6 +39946,15 @@ const toolMcpFactories = /* @__PURE__ */ new Map([
39566
39946
  supportsDisabledTools: true
39567
39947
  }
39568
39948
  }],
39949
+ ["pool", {
39950
+ class: PoolMcp,
39951
+ meta: {
39952
+ supportsProject: true,
39953
+ supportsGlobal: true,
39954
+ supportsEnabledTools: true,
39955
+ supportsDisabledTools: true
39956
+ }
39957
+ }],
39569
39958
  ["qwencode", {
39570
39959
  class: QwencodeMcp,
39571
39960
  meta: {
@@ -56787,7 +57176,7 @@ const AmpSkillFrontmatterSchema = zod_mini.z.looseObject({
56787
57176
  * Amp natively reads Agent Skills following the open standard: a directory with a
56788
57177
  * `SKILL.md` carrying `name`/`description` frontmatter, scoped to the project
56789
57178
  * (`.agents/skills/`) and user-wide (`~/.config/agents/skills/`).
56790
- * @see https://ampcode.com/manual
57179
+ * @see https://ampcode.com/docs/customize/skills
56791
57180
  */
56792
57181
  var AmpSkill = class AmpSkill extends ToolSkill {
56793
57182
  constructor({ outputRoot = process.cwd(), relativeDirPath = AMP_SKILLS_PROJECT_DIR, dirName, frontmatter, body, otherFiles = [], validate = true, global = false }) {
@@ -61756,37 +62145,6 @@ var PiSkill = class PiSkill extends ToolSkill {
61756
62145
  }
61757
62146
  };
61758
62147
  //#endregion
61759
- //#region src/constants/pool-paths.ts
61760
- /**
61761
- * Pool (Poolside's coding agent CLI) configuration-layout conventions.
61762
- *
61763
- * Pool reads `AGENTS.md` instruction files the same way the AGENTS.md standard
61764
- * describes them: the personal `~/.config/poolside/AGENTS.md` (Pool itself
61765
- * honours `XDG_CONFIG_HOME` upstream; rulesync writes only the XDG-default
61766
- * path), the project-root `AGENTS.md`, and nested per-directory
61767
- * `AGENTS.md` files from the repository root down through the working
61768
- * directory, deeper files taking precedence. It skips ignored directories
61769
- * (`.git/`, `node_modules/`, cache directories, repository ignore rules).
61770
- *
61771
- * Skills follow the Agent Skills format (`<name>/SKILL.md` bundles). Pool
61772
- * scans `.poolside/skills/` (project) and `~/.config/poolside/skills/`
61773
- * (global) plus the shared `.agents/skills/` / `~/.agents/skills/` roots and
61774
- * the skill directories of other Agent Skills tools; rulesync writes only the
61775
- * Pool-specific roots and leaves the shared ones to their own targets.
61776
- *
61777
- * @see https://docs.poolside.ai/agent-instructions
61778
- * @see https://docs.poolside.ai/skills
61779
- * @see https://github.com/poolsideai/pool
61780
- */
61781
- /** Project-scoped `.poolside/` directory at the project root. */
61782
- const POOL_DIR = ".poolside";
61783
- /** Global config directory for Pool, relative to the home directory. */
61784
- const POOL_GLOBAL_DIR = (0, node_path.join)(".config", "poolside");
61785
- /** Project skills root, relative to the project root. */
61786
- const POOL_SKILLS_DIR_PATH = (0, node_path.join)(POOL_DIR, "skills");
61787
- /** Global skills root, relative to the home directory. */
61788
- const POOL_GLOBAL_SKILLS_DIR_PATH = (0, node_path.join)(POOL_GLOBAL_DIR, "skills");
61789
- //#endregion
61790
62148
  //#region src/features/skills/pool-skill.ts
61791
62149
  const PoolSkillFrontmatterSchema = zod_mini.z.looseObject({
61792
62150
  name: zod_mini.z.string(),
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_import = require("./import-xo5me5dm.cjs");
2
+ const require_import = require("./import-DKBaTqsY.cjs");
3
3
  //#region src/index.ts
4
4
  async function generate(options = {}) {
5
5
  const { silent = true, verbose = false, ...rest } = options;
package/dist/index.d.cts CHANGED
@@ -14,7 +14,7 @@ declare const FeatureSchema: z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
14
14
  type Feature = z.infer<typeof FeatureSchema>;
15
15
  //#endregion
16
16
  //#region src/types/tool-target-tuples.d.ts
17
- declare const ALL_TOOL_TARGET_TUPLES: readonly [readonly ["agentsmd", "aiassistant", "amp", "antigravity-cli", "antigravity-ide", "antigravity-plugin", "augmentcode", "augmentcode-legacy", "bob", "claudecode", "claudecode-legacy", "cline", "codebuddy", "codexcli", "commandcode", "continue", "copilot", "copilotcli", "cortexcode", "crush", "cursor", "deepagents", "factorydroid", "goose", "grokcli", "hermesagent", "junie", "kilo", "kimi-code", "kiro", "kiro-cli", "kiro-ide", "musecode", "opencode", "pi", "pool", "qwencode", "reasonix", "replit", "roo", "rovodev", "tabnine", "takt", "vibe", "warp", "devin", "zcode", "zed", "zoocode", "dsh"], readonly ["aiassistant", "antigravity-cli", "augmentcode", "bob", "claudecode", "claudecode-legacy", "cline", "continue", "crush", "cursor", "hermesagent", "junie", "kilo", "kiro", "kiro-cli", "kiro-ide", "qwencode", "reasonix", "roo", "tabnine", "devin", "vibe", "warp", "zed", "zoocode"], readonly ["aiassistant", "amp", "antigravity-cli", "antigravity-ide", "antigravity-plugin", "augmentcode", "bob", "claudecode", "claudecode-plugin", "claudecode-legacy", "cline", "codexcli", "commandcode", "continue", "copilot", "copilotcli", "cortexcode", "crush", "cursor", "deepagents", "factorydroid", "goose", "grokcli", "hermesagent", "kimi-code", "kilo", "kiro", "kiro-cli", "kiro-ide", "junie", "musecode", "opencode", "qwencode", "reasonix", "roo", "rovodev", "tabnine", "takt", "vibe", "warp", "devin", "zcode", "zed", "zoocode"], readonly ["agentsmd", "antigravity-cli", "antigravity-ide", "augmentcode", "bob", "claudecode", "claudecode-plugin", "claudecode-legacy", "cline", "codexcli", "commandcode", "continue", "copilot", "cursor", "factorydroid", "goose", "grokcli", "hermesagent", "junie", "kilo", "kiro", "kiro-cli", "kiro-ide", "opencode", "pi", "qwencode", "reasonix", "roo", "zoocode", "rovodev", "tabnine", "takt", "devin", "warp", "zcode"], readonly ["kilo", "agentsmd", "antigravity-cli", "antigravity-ide", "antigravity-plugin", "augmentcode", "claudecode", "claudecode-plugin", "claudecode-legacy", "cline", "codexcli", "commandcode", "copilot", "copilotcli", "cortexcode", "cursor", "deepagents", "devin", "factorydroid", "goose", "grokcli", "hermesagent", "kimi-code", "junie", "kiro", "kiro-cli", "kiro-ide", "opencode", "qwencode", "reasonix", "roo", "zoocode", "rovodev", "tabnine", "takt", "vibe", "zcode"], readonly ["agentsmd", "agentsskills", "aiassistant", "amp", "antigravity-cli", "antigravity-ide", "antigravity-plugin", "augmentcode", "bob", "claudecode", "claudecode-plugin", "claudecode-legacy", "cline", "codexcli", "commandcode", "continue", "copilot", "copilotcli", "cortexcode", "crush", "cursor", "deepagents", "factorydroid", "goose", "grokcli", "hermesagent", "kimi-code", "junie", "kilo", "kiro", "kiro-cli", "kiro-ide", "musecode", "opencode", "pi", "pool", "qwencode", "reasonix", "replit", "roo", "rovodev", "tabnine", "takt", "vibe", "warp", "devin", "zcode", "zed", "zoocode", "dsh"], readonly ["amp", "cline", "antigravity-cli", "antigravity-ide", "antigravity-plugin", "kilo", "cursor", "claudecode", "claudecode-plugin", "codexcli", "commandcode", "continue", "copilot", "copilotcli", "cortexcode", "crush", "opencode", "pi", "factorydroid", "goose", "hermesagent", "kimi-code", "deepagents", "kiro", "kiro-cli", "kiro-ide", "devin", "augmentcode", "bob", "junie", "vibe", "qwencode", "reasonix", "tabnine", "grokcli", "zcode"], readonly ["amp", "antigravity-cli", "antigravity-ide", "augmentcode", "claudecode", "cline", "codexcli", "commandcode", "continue", "copilot", "copilotcli", "crush", "cursor", "deepagents", "devin", "factorydroid", "goose", "grokcli", "hermesagent", "kimi-code", "junie", "kilo", "kiro", "kiro-cli", "kiro-ide", "opencode", "pi", "qwencode", "reasonix", "roo", "rovodev", "tabnine", "takt", "vibe", "warp", "zed", "zoocode"], readonly ["amp", "augmentcode", "cursor", "factorydroid", "hermesagent", "rovodev", "takt"]];
17
+ declare const ALL_TOOL_TARGET_TUPLES: readonly [readonly ["agentsmd", "aiassistant", "amp", "antigravity-cli", "antigravity-ide", "antigravity-plugin", "augmentcode", "augmentcode-legacy", "bob", "claudecode", "claudecode-legacy", "cline", "codebuddy", "codexcli", "commandcode", "continue", "copilot", "copilotcli", "cortexcode", "crush", "cursor", "deepagents", "factorydroid", "goose", "grokcli", "hermesagent", "junie", "kilo", "kimi-code", "kiro", "kiro-cli", "kiro-ide", "musecode", "opencode", "pi", "pool", "qwencode", "reasonix", "replit", "roo", "rovodev", "tabnine", "takt", "vibe", "warp", "devin", "zcode", "zed", "zoocode", "dsh"], readonly ["aiassistant", "antigravity-cli", "augmentcode", "bob", "claudecode", "claudecode-legacy", "cline", "continue", "crush", "cursor", "hermesagent", "junie", "kilo", "kiro", "kiro-cli", "kiro-ide", "qwencode", "reasonix", "roo", "tabnine", "devin", "vibe", "warp", "zed", "zoocode"], readonly ["aiassistant", "amp", "antigravity-cli", "antigravity-ide", "antigravity-plugin", "augmentcode", "bob", "claudecode", "claudecode-plugin", "claudecode-legacy", "cline", "codexcli", "commandcode", "continue", "copilot", "copilotcli", "cortexcode", "crush", "cursor", "deepagents", "factorydroid", "goose", "grokcli", "hermesagent", "kimi-code", "kilo", "kiro", "kiro-cli", "kiro-ide", "junie", "musecode", "opencode", "pool", "qwencode", "reasonix", "roo", "rovodev", "tabnine", "takt", "vibe", "warp", "devin", "zcode", "zed", "zoocode"], readonly ["agentsmd", "antigravity-cli", "antigravity-ide", "augmentcode", "bob", "claudecode", "claudecode-plugin", "claudecode-legacy", "cline", "codexcli", "commandcode", "continue", "copilot", "cursor", "factorydroid", "goose", "grokcli", "hermesagent", "junie", "kilo", "kiro", "kiro-cli", "kiro-ide", "opencode", "pi", "qwencode", "reasonix", "roo", "zoocode", "rovodev", "tabnine", "takt", "devin", "warp", "zcode"], readonly ["kilo", "agentsmd", "antigravity-cli", "antigravity-ide", "antigravity-plugin", "augmentcode", "claudecode", "claudecode-plugin", "claudecode-legacy", "cline", "codexcli", "commandcode", "copilot", "copilotcli", "cortexcode", "cursor", "deepagents", "devin", "factorydroid", "goose", "grokcli", "hermesagent", "kimi-code", "junie", "kiro", "kiro-cli", "kiro-ide", "opencode", "qwencode", "reasonix", "roo", "zoocode", "rovodev", "tabnine", "takt", "vibe", "zcode"], readonly ["agentsmd", "agentsskills", "aiassistant", "amp", "antigravity-cli", "antigravity-ide", "antigravity-plugin", "augmentcode", "bob", "claudecode", "claudecode-plugin", "claudecode-legacy", "cline", "codexcli", "commandcode", "continue", "copilot", "copilotcli", "cortexcode", "crush", "cursor", "deepagents", "factorydroid", "goose", "grokcli", "hermesagent", "kimi-code", "junie", "kilo", "kiro", "kiro-cli", "kiro-ide", "musecode", "opencode", "pi", "pool", "qwencode", "reasonix", "replit", "roo", "rovodev", "tabnine", "takt", "vibe", "warp", "devin", "zcode", "zed", "zoocode", "dsh"], readonly ["amp", "cline", "antigravity-cli", "antigravity-ide", "antigravity-plugin", "kilo", "cursor", "claudecode", "claudecode-plugin", "codexcli", "commandcode", "continue", "copilot", "copilotcli", "cortexcode", "crush", "opencode", "pi", "factorydroid", "goose", "hermesagent", "kimi-code", "deepagents", "kiro", "kiro-cli", "kiro-ide", "devin", "augmentcode", "bob", "junie", "vibe", "qwencode", "reasonix", "tabnine", "grokcli", "zcode"], readonly ["amp", "antigravity-cli", "antigravity-ide", "augmentcode", "claudecode", "cline", "codexcli", "commandcode", "continue", "copilot", "copilotcli", "crush", "cursor", "deepagents", "devin", "factorydroid", "goose", "grokcli", "hermesagent", "kimi-code", "junie", "kilo", "kiro", "kiro-cli", "kiro-ide", "opencode", "pi", "qwencode", "reasonix", "roo", "rovodev", "tabnine", "takt", "vibe", "warp", "zed", "zoocode"], readonly ["amp", "augmentcode", "cursor", "factorydroid", "hermesagent", "rovodev", "takt"]];
18
18
  //#endregion
19
19
  //#region src/types/tool-targets.d.ts
20
20
  type AllToolTarget = (typeof ALL_TOOL_TARGET_TUPLES)[number][number];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types/features.ts","../src/types/tool-target-tuples.ts","../src/types/tool-targets.ts","../src/lib/convert.ts","../src/types/ai-dir.ts","../src/features/skills/rulesync-skill.ts","../src/lib/generate.ts","../src/lib/import.ts","../src/index.ts"],"mappings":";;qBAaa;cA+BP,eAAa,EAAA,uBAAA,EAAA;;;;;;;;;IAAoE,EAAA;KAE3E,UAAU,EAAE,aAAa;;;cCsTxB;;;KC1VR,wBAAwB;qBAEhB,4BAA4B,kBAAkB;cAM9C,kBAAgB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAEjB,aAAa,EAAE,aAAa;;;KCH5B;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;;KCWU;EAEN;EACA;;EAGA;EACA,OAAO;;KAqBD;EACV;EACA,YAAY;;;;;;;;EAQZ;;;;;;;EAOA;;KAmnBU;EACV;EACA;EACA;EACA;IACE;IACA;IACA,cAAc;;EAEhB,aAAa;EACb;;KAGU,qBAAqB,KAC/B;uBAIoB;;;;qBAID;;;;qBAKA;;;;qBAKA;;;;YAKT;IACR;IACA;IACA,cAAc;;;;;YAMN,YAAY;;;;qBAKH;EAEnB,cACE,YACA,iBACA,SACA,UACA,YACA,UACC;SAyBU,QAAQ,SAAS,qBAAqB,QAAQ;EAI3D;EAIA;EAIA;;;;;;;;;;;;;;;;;;;;;EAwBA;;;;;;;;;;;;;EAgBA;EAqBA;EAqBA;IAEM;IACA;IACA,cAAc;;EAMpB,iBAAiB;;;;EAOjB;EAIA;EAIA,YAAY,cAAc,cAAc,cAAc;;;;;;;;;;iBAajC;;iBAWN;;;;;;iBASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkCA;iBA8CM;;;;;iBA6GN;;;;;;;iBAsDM;;;;;;;;;;;;;;;;;;;;;;;;;;mBA+FE,kBACrB,oBACA,yBACA,iBACA,0BACC,QAAQ;WAwGF,YAAY;;;;cC70CjB,wCAAsC,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsX1C,EAAA,KAAA;KAMU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,yBAAyB;EACzB,WAAW;EACX;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,QAAQ;IACR;IACA;IACA;IACA;IACA;IACA;IACA,yBAAyB;IACzB,WAAW;;EAEb;IACE;IACA;IACA;;EAEF;IACE;IACA,WAAW;IACX;IACA;;EAEF;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;;IAEF;MACE;;IAEF;MACE,QAAQ;QACN;QACA;QACA;QACA;QACA;;;;EAIN;IACE;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA;;EAEF;IACE;IACA,yBAAyB;IACzB,WAAW;;EAEb;IACE;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA,yBAAyB;IACzB,WAAW;;EAEb;IACE;;EAEF;IACE;IACA;IACA,yBAAyB;IACzB,WAAW;;EAEb,MAAM;EACN,MAAM;EACN,QAAQ;EACR,MAAM;EACN;IACE;IACA;IACA;IACA;IACA;IACA,cAAc;IACd;;EAEF;IACE;IACA;IACA;IACA;IACA;IACA;IACA,QAAQ;IACR;IACA;;EAEF;IACE;IACA;IACA,yBAAyB;IACzB,WAAW;;EAEb;IACE;IACA;IACA;IACA;IACA;IACA,WAAW;;EAEb;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA;;EAEF;IACE;IACA,yBAAyB;IACzB,WAAW;IACX;;EAEF,cAAc;EACd;IACE;IACA,yBAAyB;IACzB,WAAW;IACX;IACA;;EAEF,cAAc;EACd,aAAa;EACb,WAAW;EACX,UAAU;EACV;IACE;IACA;;EAEF;IACE;IACA;IACA;IACA,yBAAyB;IACzB,WAAW;;EAEb;IACE;IACA;IACA,WAAW;;;KAKH,2BAA2B,EAAE,aAAa;KAO1C;EACV;EACA;EACA;EACA,aAAa;EACb;EACA,aAAa;EACb;EACA;;KAGU;EACV;;KAGU;EACV;EACA;EACA;EACA;;;;;;cAOW,sBAAsB;EACjC,cACE,YACA,iBACA,SACA,aACA,MACA,YACA,UACA,UACC;SAsBI,oBAAoB;EAU3B,kBAAkB;EAQlB;EAIA,YAAY;SAcC,UACX,YACA,iBACA,SACA,UACC,6BAA6B,QAAQ;;;;KCvqB9B;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ;EACR;;;;;;EAMA;;;;;EAKA,0BAA0B;;KA0ZhB;;;KCrbA;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;;KC/CG;EACH;EACA;EACA;EACA;;YAGU,kBAAkB;EAC5B,UAAU;EACV,WAAW;EACX;;;;;;;;;;;;;EAaA;;;;;;;;EAQA;EACA;EACA;EACA;EACA;EACA;EACA;;YAGU,gBAAgB;EAC1B,QAAQ;EACR,WAAW;;YAGD,iBAAiB;EAC3B,MAAM;EACN,IAAI;EACJ,WAAW;EACX;;wBAGoB,SAAS,UAAS,kBAAuB,QAAQ;wBAyBjD,eAAe,SAAS,gBAAgB,QAAQ;wBAehD,gBAAgB,SAAS,iBAAiB,QAAQ"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types/features.ts","../src/types/tool-target-tuples.ts","../src/types/tool-targets.ts","../src/lib/convert.ts","../src/types/ai-dir.ts","../src/features/skills/rulesync-skill.ts","../src/lib/generate.ts","../src/lib/import.ts","../src/index.ts"],"mappings":";;qBAaa;cA+BP,eAAa,EAAA,uBAAA,EAAA;;;;;;;;;IAAoE,EAAA;KAE3E,UAAU,EAAE,aAAa;;;cCuTxB;;;KC3VR,wBAAwB;qBAEhB,4BAA4B,kBAAkB;cAM9C,kBAAgB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAEjB,aAAa,EAAE,aAAa;;;KCH5B;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;;KCWU;EAEN;EACA;;EAGA;EACA,OAAO;;KAqBD;EACV;EACA,YAAY;;;;;;;;EAQZ;;;;;;;EAOA;;KAmnBU;EACV;EACA;EACA;EACA;IACE;IACA;IACA,cAAc;;EAEhB,aAAa;EACb;;KAGU,qBAAqB,KAC/B;uBAIoB;;;;qBAID;;;;qBAKA;;;;qBAKA;;;;YAKT;IACR;IACA;IACA,cAAc;;;;;YAMN,YAAY;;;;qBAKH;EAEnB,cACE,YACA,iBACA,SACA,UACA,YACA,UACC;SAyBU,QAAQ,SAAS,qBAAqB,QAAQ;EAI3D;EAIA;EAIA;;;;;;;;;;;;;;;;;;;;;EAwBA;;;;;;;;;;;;;EAgBA;EAqBA;EAqBA;IAEM;IACA;IACA,cAAc;;EAMpB,iBAAiB;;;;EAOjB;EAIA;EAIA,YAAY,cAAc,cAAc,cAAc;;;;;;;;;;iBAajC;;iBAWN;;;;;;iBASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkCA;iBA8CM;;;;;iBA6GN;;;;;;;iBAsDM;;;;;;;;;;;;;;;;;;;;;;;;;;mBA+FE,kBACrB,oBACA,yBACA,iBACA,0BACC,QAAQ;WAwGF,YAAY;;;;cC70CjB,wCAAsC,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsX1C,EAAA,KAAA;KAMU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,yBAAyB;EACzB,WAAW;EACX;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,QAAQ;IACR;IACA;IACA;IACA;IACA;IACA;IACA,yBAAyB;IACzB,WAAW;;EAEb;IACE;IACA;IACA;;EAEF;IACE;IACA,WAAW;IACX;IACA;;EAEF;IACE;IACA;MACE;MACA;MACA;MACA;MACA;MACA;;IAEF;MACE;;IAEF;MACE,QAAQ;QACN;QACA;QACA;QACA;QACA;;;;EAIN;IACE;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA;;EAEF;IACE;IACA,yBAAyB;IACzB,WAAW;;EAEb;IACE;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA,yBAAyB;IACzB,WAAW;;EAEb;IACE;;EAEF;IACE;IACA;IACA,yBAAyB;IACzB,WAAW;;EAEb,MAAM;EACN,MAAM;EACN,QAAQ;EACR,MAAM;EACN;IACE;IACA;IACA;IACA;IACA;IACA,cAAc;IACd;;EAEF;IACE;IACA;IACA;IACA;IACA;IACA;IACA,QAAQ;IACR;IACA;;EAEF;IACE;IACA;IACA,yBAAyB;IACzB,WAAW;;EAEb;IACE;IACA;IACA;IACA;IACA;IACA,WAAW;;EAEb;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEF;IACE;IACA;IACA;IACA;;EAEF;IACE;IACA,yBAAyB;IACzB,WAAW;IACX;;EAEF,cAAc;EACd;IACE;IACA,yBAAyB;IACzB,WAAW;IACX;IACA;;EAEF,cAAc;EACd,aAAa;EACb,WAAW;EACX,UAAU;EACV;IACE;IACA;;EAEF;IACE;IACA;IACA;IACA,yBAAyB;IACzB,WAAW;;EAEb;IACE;IACA;IACA,WAAW;;;KAKH,2BAA2B,EAAE,aAAa;KAO1C;EACV;EACA;EACA;EACA,aAAa;EACb;EACA,aAAa;EACb;EACA;;KAGU;EACV;;KAGU;EACV;EACA;EACA;EACA;;;;;;cAOW,sBAAsB;EACjC,cACE,YACA,iBACA,SACA,aACA,MACA,YACA,UACA,UACC;SAsBI,oBAAoB;EAU3B,kBAAkB;EAQlB;EAIA,YAAY;SAcC,UACX,YACA,iBACA,SACA,UACC,6BAA6B,QAAQ;;;;KCvqB9B;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,QAAQ;EACR;;;;;;EAMA;;;;;EAKA,0BAA0B;;KA0ZhB;;;KCrbA;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;;KC/CG;EACH;EACA;EACA;EACA;;YAGU,kBAAkB;EAC5B,UAAU;EACV,WAAW;EACX;;;;;;;;;;;;;EAaA;;;;;;;;EAQA;EACA;EACA;EACA;EACA;EACA;EACA;;YAGU,gBAAgB;EAC1B,QAAQ;EACR,WAAW;;YAGD,iBAAiB;EAC3B,MAAM;EACN,IAAI;EACJ,WAAW;EACX;;wBAGoB,SAAS,UAAS,kBAAuB,QAAQ;wBAyBjD,eAAe,SAAS,gBAAgB,QAAQ;wBAehD,gBAAgB,SAAS,iBAAiB,QAAQ"}