rulesync 43.6.2 → 43.7.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/dist/cli/index.cjs +3 -3
- package/dist/cli/index.js +3 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/{import-8kSEsosv.cjs → import-CfxyzbvB.cjs} +144 -48
- package/dist/{import-iLVVcze8.js → import-tr3jHcG2.js} +145 -49
- package/dist/{import-iLVVcze8.js.map → import-tr3jHcG2.js.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +12 -12
|
@@ -9723,11 +9723,9 @@ var RulesyncPermissions = class RulesyncPermissions extends RulesyncFile {
|
|
|
9723
9723
|
* `PERMISSION_OVERRIDE_KEY_ALIASES`) is replaced wholesale, and removed when
|
|
9724
9724
|
* the import does not produce one: only that tool's import ever writes it, so
|
|
9725
9725
|
* a setting removed from the tool's own config has to disappear here too.
|
|
9726
|
-
*
|
|
9727
|
-
*
|
|
9728
|
-
*
|
|
9729
|
-
* `permission` record inside the block merges per category. Every other
|
|
9730
|
-
* top-level key — `$schema` included — is kept unless the import names it.
|
|
9726
|
+
* Every other top-level key — `$schema` included — is kept unless the import
|
|
9727
|
+
* names it, in which case the imported value replaces it. No importer emits
|
|
9728
|
+
* another tool's override block, so those blocks are never touched here.
|
|
9731
9729
|
*/
|
|
9732
9730
|
static mergeImportedJson({ existing, imported, toolTarget }) {
|
|
9733
9731
|
const ownOverrideKey = PERMISSION_OVERRIDE_KEY_ALIASES[toolTarget] ?? toolTarget;
|
|
@@ -9739,14 +9737,7 @@ var RulesyncPermissions = class RulesyncPermissions extends RulesyncFile {
|
|
|
9739
9737
|
existing: current,
|
|
9740
9738
|
imported: value
|
|
9741
9739
|
});
|
|
9742
|
-
else
|
|
9743
|
-
const block = { ...current };
|
|
9744
|
-
for (const [field, fieldValue] of Object.entries(value)) block[field] = field === "permission" ? mergePermissionCategories({
|
|
9745
|
-
existing: block[field],
|
|
9746
|
-
imported: fieldValue
|
|
9747
|
-
}) : fieldValue;
|
|
9748
|
-
merged[key] = block;
|
|
9749
|
-
} else merged[key] = value;
|
|
9740
|
+
else merged[key] = value;
|
|
9750
9741
|
}
|
|
9751
9742
|
return merged;
|
|
9752
9743
|
}
|
|
@@ -29109,11 +29100,7 @@ var ZoocodeSkill = class extends RooSkill {
|
|
|
29109
29100
|
static toolTarget = "zoocode";
|
|
29110
29101
|
};
|
|
29111
29102
|
// src/features/skills/skills-processor.ts
|
|
29112
|
-
var skills_processor_exports = /* @__PURE__ */ __exportAll({
|
|
29113
|
-
SkillsProcessor: () => SkillsProcessor,
|
|
29114
|
-
SkillsProcessorToolTargetSchema: () => SkillsProcessorToolTargetSchema,
|
|
29115
|
-
toolSkillFactories: () => toolSkillFactories
|
|
29116
|
-
});
|
|
29103
|
+
var skills_processor_exports = /* @__PURE__ */ __exportAll({ toolSkillFactories: () => toolSkillFactories });
|
|
29117
29104
|
const SkillsProcessorToolTargetSchema = z.enum(skillsProcessorToolTargetTuple);
|
|
29118
29105
|
/**
|
|
29119
29106
|
* Factory Map mapping tool targets to their skill factories.
|
|
@@ -52407,6 +52394,29 @@ var AmpHooks = class AmpHooks extends ToolHooks {
|
|
|
52407
52394
|
});
|
|
52408
52395
|
}
|
|
52409
52396
|
};
|
|
52397
|
+
// src/features/hooks/hook-matcher-tool-names.ts
|
|
52398
|
+
const MATCHER_TOKEN_PATTERN = /\\.|\[(?:\\.|[^\]\\])*\]|(?<=^|[^\w\\]|\\\w)[A-Za-z_]\w*(?!\w)/gs;
|
|
52399
|
+
function isMatcherName(token) {
|
|
52400
|
+
return !token.startsWith("\\") && !token.startsWith("[");
|
|
52401
|
+
}
|
|
52402
|
+
/**
|
|
52403
|
+
* The distinct whole names in a matcher that start with a capital letter, for
|
|
52404
|
+
* adapters whose runtime tool names are all lowercase: after translation, such
|
|
52405
|
+
* a name has no runtime equivalent and can never match.
|
|
52406
|
+
*/
|
|
52407
|
+
function capitalizedMatcherNames(matcher) {
|
|
52408
|
+
const names = [...matcher.matchAll(MATCHER_TOKEN_PATTERN)].map(([token]) => token).filter((token) => isMatcherName(token) && /^[A-Z]/.test(token));
|
|
52409
|
+
return [...new Set(names)];
|
|
52410
|
+
}
|
|
52411
|
+
/**
|
|
52412
|
+
* Rewrites the whole tool names inside a hook `matcher` regex through `names`,
|
|
52413
|
+
* leaving escapes, character classes and unknown names as written. Used by
|
|
52414
|
+
* adapters whose runtime tool names differ from the canonical (Claude Code)
|
|
52415
|
+
* spelling.
|
|
52416
|
+
*/
|
|
52417
|
+
function replaceMatcherNames(matcher, names) {
|
|
52418
|
+
return matcher.replace(MATCHER_TOKEN_PATTERN, (token) => isMatcherName(token) && Object.hasOwn(names, token) ? names[token] ?? token : token);
|
|
52419
|
+
}
|
|
52410
52420
|
// src/utils/object.ts
|
|
52411
52421
|
/**
|
|
52412
52422
|
* Return a shallow copy of `obj` keeping only the entries whose value is
|
|
@@ -54327,6 +54337,48 @@ const ANTIGRAVITY_FLAT_HANDLER_EVENTS = new Set([...ANTIGRAVITY_NO_MATCHER_EVENT
|
|
|
54327
54337
|
record: CANONICAL_TO_ANTIGRAVITY_EVENT_NAMES,
|
|
54328
54338
|
key: event
|
|
54329
54339
|
}) ?? event));
|
|
54340
|
+
const CANONICAL_TO_ANTIGRAVITY_TOOL_NAMES = {
|
|
54341
|
+
Bash: "run_command",
|
|
54342
|
+
Read: "(?:read_file|view_file)",
|
|
54343
|
+
Write: "(?:write_file|write_to_file)",
|
|
54344
|
+
Edit: "(?:edit_file|replace_file_content)",
|
|
54345
|
+
WebSearch: "search_web"
|
|
54346
|
+
};
|
|
54347
|
+
const ANTIGRAVITY_TO_CANONICAL_TOOL_NAMES = {
|
|
54348
|
+
run_command: "Bash",
|
|
54349
|
+
read_file: "Read",
|
|
54350
|
+
view_file: "Read",
|
|
54351
|
+
write_file: "Write",
|
|
54352
|
+
write_to_file: "Write",
|
|
54353
|
+
edit_file: "Edit",
|
|
54354
|
+
replace_file_content: "Edit",
|
|
54355
|
+
search_web: "WebSearch"
|
|
54356
|
+
};
|
|
54357
|
+
const ANTIGRAVITY_GROUP_TO_CANONICAL_TOOL_NAMES = Object.entries(CANONICAL_TO_ANTIGRAVITY_TOOL_NAMES).filter(([, name]) => name.startsWith("(?:")).map(([canonical, group]) => [group, canonical]);
|
|
54358
|
+
const ANTIGRAVITY_DOCUMENTED_TOOL_CANDIDATES = {
|
|
54359
|
+
Grep: "grep_search",
|
|
54360
|
+
Glob: "find_by_name",
|
|
54361
|
+
WebFetch: "read_url_content",
|
|
54362
|
+
MultiEdit: "multi_replace_file_content"
|
|
54363
|
+
};
|
|
54364
|
+
function canonicalToAntigravityMatcher({ matcher, eventName, warn }) {
|
|
54365
|
+
const translated = replaceMatcherNames(matcher, CANONICAL_TO_ANTIGRAVITY_TOOL_NAMES);
|
|
54366
|
+
const unmatched = capitalizedMatcherNames(translated);
|
|
54367
|
+
if (unmatched.length > 0) {
|
|
54368
|
+
const candidates = unmatched.flatMap((name) => {
|
|
54369
|
+
const candidate = lookupOwn({
|
|
54370
|
+
record: ANTIGRAVITY_DOCUMENTED_TOOL_CANDIDATES,
|
|
54371
|
+
key: name
|
|
54372
|
+
});
|
|
54373
|
+
return candidate ? [`\`${candidate}\` for ${quoteValueForWarning(name)}`] : [];
|
|
54374
|
+
});
|
|
54375
|
+
warn(`Antigravity reports lowercase tool names in the hook payload (\`toolCall.name\`), and ${unmatched.map((name) => quoteValueForWarning(name)).join(", ")} in the "${eventName}" matcher ${quoteValueForWarning(matcher)} has no verified Antigravity equivalent, so it is written as-is and will likely never match. Use the tool name Antigravity reports instead` + (candidates.length > 0 ? ` (the Antigravity hooks docs list ${candidates.join(", ")}, unverified).` : "."));
|
|
54376
|
+
}
|
|
54377
|
+
return translated;
|
|
54378
|
+
}
|
|
54379
|
+
function antigravityToCanonicalMatcher(matcher) {
|
|
54380
|
+
return replaceMatcherNames(ANTIGRAVITY_GROUP_TO_CANONICAL_TOOL_NAMES.reduce((current, [group, canonical]) => current.split(group).join(canonical), matcher), ANTIGRAVITY_TO_CANONICAL_TOOL_NAMES);
|
|
54381
|
+
}
|
|
54330
54382
|
/**
|
|
54331
54383
|
* Antigravity uses a Claude-Code-like `hooks.json`. The `PreToolUse` /
|
|
54332
54384
|
* `PostToolUse` events use the matcher-based group shape, while `SessionStart`,
|
|
@@ -54340,7 +54392,11 @@ const ANTIGRAVITY_CONVERTER_CONFIG = {
|
|
|
54340
54392
|
toolToCanonicalEventNames: ANTIGRAVITY_TO_CANONICAL_EVENT_NAMES,
|
|
54341
54393
|
projectDirVar: "",
|
|
54342
54394
|
noMatcherEvents: ANTIGRAVITY_NO_MATCHER_EVENTS,
|
|
54343
|
-
supportedHookTypes: /* @__PURE__ */ new Set(["command"])
|
|
54395
|
+
supportedHookTypes: /* @__PURE__ */ new Set(["command"]),
|
|
54396
|
+
matcherTranslation: {
|
|
54397
|
+
toTool: canonicalToAntigravityMatcher,
|
|
54398
|
+
toCanonical: antigravityToCanonicalMatcher
|
|
54399
|
+
}
|
|
54344
54400
|
};
|
|
54345
54401
|
/**
|
|
54346
54402
|
* Turn the shared converter's matcher-group output into Antigravity's shape:
|
|
@@ -57373,20 +57429,6 @@ var CopilotcliHooks = class CopilotcliHooks extends ToolHooks {
|
|
|
57373
57429
|
}), null, 2) });
|
|
57374
57430
|
}
|
|
57375
57431
|
};
|
|
57376
|
-
// src/features/hooks/hook-matcher-tool-names.ts
|
|
57377
|
-
const MATCHER_TOKEN_PATTERN = /\\.|\[(?:\\.|[^\]\\])*\]|(?<=^|[^\w\\]|\\\w)[A-Za-z_]\w*(?!\w)/gs;
|
|
57378
|
-
function isMatcherName(token) {
|
|
57379
|
-
return !token.startsWith("\\") && !token.startsWith("[");
|
|
57380
|
-
}
|
|
57381
|
-
/**
|
|
57382
|
-
* Rewrites the whole tool names inside a hook `matcher` regex through `names`,
|
|
57383
|
-
* leaving escapes, character classes and unknown names as written. Used by
|
|
57384
|
-
* adapters whose runtime tool names differ from the canonical (Claude Code)
|
|
57385
|
-
* spelling.
|
|
57386
|
-
*/
|
|
57387
|
-
function replaceMatcherNames(matcher, names) {
|
|
57388
|
-
return matcher.replace(MATCHER_TOKEN_PATTERN, (token) => isMatcherName(token) && Object.hasOwn(names, token) ? names[token] ?? token : token);
|
|
57389
|
-
}
|
|
57390
57432
|
// src/features/hooks/cortexcode-hooks.ts
|
|
57391
57433
|
const CORTEXCODE_NO_MATCHER_EVENTS = /* @__PURE__ */ new Set(["beforeSubmitPrompt", "stop"]);
|
|
57392
57434
|
const CANONICAL_TO_CORTEXCODE_TOOL_NAMES = {
|
|
@@ -57400,8 +57442,8 @@ const CANONICAL_TO_CORTEXCODE_TOOL_NAMES = {
|
|
|
57400
57442
|
const CORTEXCODE_TO_CANONICAL_TOOL_NAMES = invertRecord(CANONICAL_TO_CORTEXCODE_TOOL_NAMES);
|
|
57401
57443
|
function canonicalToCortexcodeMatcher({ matcher, eventName, warn }) {
|
|
57402
57444
|
const translated = replaceMatcherNames(matcher, CANONICAL_TO_CORTEXCODE_TOOL_NAMES);
|
|
57403
|
-
const unmatched =
|
|
57404
|
-
if (unmatched.length > 0) warn(`Cortex Code matches hook matchers case-sensitively against lowercase runtime tool names, and ${
|
|
57445
|
+
const unmatched = capitalizedMatcherNames(translated);
|
|
57446
|
+
if (unmatched.length > 0) warn(`Cortex Code matches hook matchers case-sensitively against lowercase runtime tool names, and ${unmatched.map((name) => quoteValueForWarning(name)).join(", ")} in the "${eventName}" matcher ${quoteValueForWarning(matcher)} is not a tool Cortex Code documents a runtime ID for, so it is written as-is and will likely never match. Replace it with the lowercase name Cortex Code uses for that tool, if it has one.`);
|
|
57405
57447
|
return translated;
|
|
57406
57448
|
}
|
|
57407
57449
|
function cortexcodeToCanonicalMatcher(matcher) {
|
|
@@ -79837,6 +79879,39 @@ const MATCH_ALL_PATH_GLOBS = /* @__PURE__ */ new Set([
|
|
|
79837
79879
|
]);
|
|
79838
79880
|
const DIRECTORY_CONTENTS_SUFFIX = /\/\*\*(?:\/\*)?$/;
|
|
79839
79881
|
const HOME_OR_VARIABLE_PATH = /^~(?:\/|$)|^\$[A-Za-z_]|\$\{[A-Za-z_]/;
|
|
79882
|
+
const LEADING_HOME = /^~(?:\/|$)/;
|
|
79883
|
+
/**
|
|
79884
|
+
* The home directory as an Antigravity path: forward slashes, no trailing
|
|
79885
|
+
* slash. agy accepts `C:/Users/...` on Windows, so one spelling serves both.
|
|
79886
|
+
*/
|
|
79887
|
+
function toAntigravityHomePath(homeDirectory) {
|
|
79888
|
+
return homeDirectory.replaceAll("\\", "/").replace(/\/+$/, "");
|
|
79889
|
+
}
|
|
79890
|
+
/**
|
|
79891
|
+
* Rewrite a leading `~` or `~/` of a path target to the absolute home
|
|
79892
|
+
* directory. agy 1.5.1 matches `~` literally, so a `~/...` rule would never
|
|
79893
|
+
* apply (rulesync#3324). Only a file the user's own home holds, such as the
|
|
79894
|
+
* global Antigravity CLI settings, may carry a machine-specific path, so the
|
|
79895
|
+
* caller passes `homeDirectory` only then. `$HOME`, `${HOME}`, `%VAR%` and
|
|
79896
|
+
* `~user/` are left as written (the variable forms are still warned about).
|
|
79897
|
+
*/
|
|
79898
|
+
function expandLeadingHome(target, homeDirectory) {
|
|
79899
|
+
if (homeDirectory === void 0 || !LEADING_HOME.test(target)) return target;
|
|
79900
|
+
const home = toAntigravityHomePath(homeDirectory);
|
|
79901
|
+
return target === "~" ? home || "/" : `${home}${target.slice(1)}`;
|
|
79902
|
+
}
|
|
79903
|
+
/**
|
|
79904
|
+
* The reverse of {@link expandLeadingHome} on import: an absolute path in the
|
|
79905
|
+
* home directory goes back to `~/...`, so `.rulesync/permissions.jsonc` stays
|
|
79906
|
+
* the same on every machine.
|
|
79907
|
+
*/
|
|
79908
|
+
function collapseLeadingHome(target, homeDirectory) {
|
|
79909
|
+
if (homeDirectory === void 0) return target;
|
|
79910
|
+
const home = toAntigravityHomePath(homeDirectory);
|
|
79911
|
+
if (home.length === 0) return target;
|
|
79912
|
+
if (target === home) return "~";
|
|
79913
|
+
return target.startsWith(`${home}/`) ? `~${target.slice(home.length)}` : target;
|
|
79914
|
+
}
|
|
79840
79915
|
const HOSTNAME = /^[a-z0-9-]+(?:\.[a-z0-9-]+)*$/;
|
|
79841
79916
|
const DENY_HINTS = {
|
|
79842
79917
|
read_file: "deny a directory or file path instead",
|
|
@@ -79989,13 +80064,14 @@ function warnHomeOrVariablePath({ action, target, rule, decision, logger, toolLa
|
|
|
79989
80064
|
* nothing enforces it, and a widened one is warned about too, because it
|
|
79990
80065
|
* blocks more than it says.
|
|
79991
80066
|
*/
|
|
79992
|
-
function buildAntigravityPermissionEntry({ action: toolAction, category, pattern, decision, logger, toolLabel }) {
|
|
80067
|
+
function buildAntigravityPermissionEntry({ action: toolAction, category, pattern, decision, logger, toolLabel, homeDirectory }) {
|
|
79993
80068
|
const isMcp = category.startsWith(MCP_CATEGORY_PREFIX);
|
|
79994
80069
|
const action = isMcp ? "mcp" : toolAction;
|
|
79995
80070
|
const result = isMcp ? toMcpRuleTarget(category, pattern) : pattern === "*" ? { target: "*" } : toTarget(action, pattern);
|
|
79996
80071
|
const rule = `${category}: { "${pattern}": "${decision}" }`;
|
|
79997
80072
|
if ("skipReason" in result) {
|
|
79998
|
-
const
|
|
80073
|
+
const lead = decision !== "deny" ? void 0 : isMcp ? result.lead : toWidenedDenyTarget(action, pattern);
|
|
80074
|
+
const prefix = lead !== void 0 && PATH_ACTIONS.has(action) ? expandLeadingHome(lead, homeDirectory) : lead;
|
|
79999
80075
|
if (prefix !== void 0) {
|
|
80000
80076
|
const { entry, scope } = describeWidenedDeny({
|
|
80001
80077
|
action,
|
|
@@ -80021,22 +80097,23 @@ function buildAntigravityPermissionEntry({ action: toolAction, category, pattern
|
|
|
80021
80097
|
const consequence = decision === "deny" ? ", so the deny also overrides any allow or ask there" : "";
|
|
80022
80098
|
logger.warn(`${toolLabel} permissions: ${rule}: ${result.note}${consequence}.`);
|
|
80023
80099
|
}
|
|
80100
|
+
const target = PATH_ACTIONS.has(action) ? expandLeadingHome(result.target, homeDirectory) : result.target;
|
|
80024
80101
|
warnHomeOrVariablePath({
|
|
80025
80102
|
action,
|
|
80026
|
-
target
|
|
80103
|
+
target,
|
|
80027
80104
|
rule,
|
|
80028
80105
|
decision,
|
|
80029
80106
|
logger,
|
|
80030
80107
|
toolLabel
|
|
80031
80108
|
});
|
|
80032
|
-
return
|
|
80109
|
+
return target === "*" ? action : `${action}(${target})`;
|
|
80033
80110
|
}
|
|
80034
80111
|
/**
|
|
80035
80112
|
* Convert rulesync permissions config to Antigravity allow/ask/deny arrays,
|
|
80036
80113
|
* shared by the CLI and IDE generators; `toAction` maps a canonical category to
|
|
80037
80114
|
* the target's tool or action name.
|
|
80038
80115
|
*/
|
|
80039
|
-
function convertRulesyncToAntigravityPermissions({ config, toAction, toolLabel, logger }) {
|
|
80116
|
+
function convertRulesyncToAntigravityPermissions({ config, toAction, toolLabel, logger, homeDirectory }) {
|
|
80040
80117
|
const allow = [];
|
|
80041
80118
|
const ask = [];
|
|
80042
80119
|
const deny = [];
|
|
@@ -80049,7 +80126,8 @@ function convertRulesyncToAntigravityPermissions({ config, toAction, toolLabel,
|
|
|
80049
80126
|
pattern,
|
|
80050
80127
|
decision: permissionAction,
|
|
80051
80128
|
logger,
|
|
80052
|
-
toolLabel
|
|
80129
|
+
toolLabel,
|
|
80130
|
+
homeDirectory
|
|
80053
80131
|
});
|
|
80054
80132
|
if (entry === void 0) continue;
|
|
80055
80133
|
switch (permissionAction) {
|
|
@@ -80074,7 +80152,7 @@ function convertRulesyncToAntigravityPermissions({ config, toAction, toolLabel,
|
|
|
80074
80152
|
* shared by the CLI and IDE adapters; `toCategory` maps the target's tool or
|
|
80075
80153
|
* action name back to a canonical category.
|
|
80076
80154
|
*/
|
|
80077
|
-
function convertAntigravityToRulesyncPermissions({ allow, ask, deny, toCategory, toolLabel, logger }) {
|
|
80155
|
+
function convertAntigravityToRulesyncPermissions({ allow, ask, deny, toCategory, toolLabel, logger, homeDirectory }) {
|
|
80078
80156
|
const permission = {};
|
|
80079
80157
|
const processEntries = (entries, action) => {
|
|
80080
80158
|
for (const entry of entries) {
|
|
@@ -80086,7 +80164,7 @@ function convertAntigravityToRulesyncPermissions({ allow, ask, deny, toCategory,
|
|
|
80086
80164
|
decision: action,
|
|
80087
80165
|
logger,
|
|
80088
80166
|
toolLabel
|
|
80089
|
-
}) : target;
|
|
80167
|
+
}) : PATH_ACTIONS.has(toolName) ? collapseLeadingHome(target, homeDirectory) : target;
|
|
80090
80168
|
if (isPrototypePollutionKey(canonical) || isPrototypePollutionKey(pattern)) continue;
|
|
80091
80169
|
getOrCreateOwn({
|
|
80092
80170
|
record: permission,
|
|
@@ -80225,7 +80303,8 @@ var AntigravityCliPermissions = class AntigravityCliPermissions extends ToolPerm
|
|
|
80225
80303
|
config,
|
|
80226
80304
|
toAction: toAntigravityCliToolName,
|
|
80227
80305
|
toolLabel: "Antigravity CLI",
|
|
80228
|
-
logger
|
|
80306
|
+
logger,
|
|
80307
|
+
homeDirectory: outputRoot
|
|
80229
80308
|
});
|
|
80230
80309
|
const managedToolNames = new Set(Object.keys(config.permission).map((category) => toAntigravityCliToolName(category)));
|
|
80231
80310
|
const isManagedToolName = (toolName) => managedToolNames.has(toolName) || managedToolNames.has("mcp") && toolName.startsWith("mcp__");
|
|
@@ -80276,7 +80355,8 @@ var AntigravityCliPermissions = class AntigravityCliPermissions extends ToolPerm
|
|
|
80276
80355
|
deny: permissions.deny ?? [],
|
|
80277
80356
|
toCategory: toCanonicalToolName$9,
|
|
80278
80357
|
toolLabel: "Antigravity CLI",
|
|
80279
|
-
logger: moduleLogger$4
|
|
80358
|
+
logger: moduleLogger$4,
|
|
80359
|
+
homeDirectory: this.getOutputRoot()
|
|
80280
80360
|
});
|
|
80281
80361
|
const override = {};
|
|
80282
80362
|
const toolPermission = pickDocumentedValue({
|
|
@@ -90239,6 +90319,22 @@ function unmanagedMcpAllowlistEntries({ existing, previousPermission, nextPermis
|
|
|
90239
90319
|
return category === null || !Object.hasOwn(previousPermission, category) && !Object.hasOwn(nextPermission, category);
|
|
90240
90320
|
});
|
|
90241
90321
|
}
|
|
90322
|
+
/** Hermes's override key in the canonical document (`hermes`). */
|
|
90323
|
+
const HERMES_OVERRIDE_KEY = PERMISSION_OVERRIDE_KEY_ALIASES.hermesagent ?? "hermesagent";
|
|
90324
|
+
/**
|
|
90325
|
+
* The part of a canonical permissions document Hermes keeps as provenance: the
|
|
90326
|
+
* `$schema`, the canonical `permission` block, and Hermes's own override.
|
|
90327
|
+
*/
|
|
90328
|
+
function hermesProvenanceOf(permissions) {
|
|
90329
|
+
const source = permissions;
|
|
90330
|
+
const provenance = {};
|
|
90331
|
+
for (const key of [
|
|
90332
|
+
"$schema",
|
|
90333
|
+
"permission",
|
|
90334
|
+
HERMES_OVERRIDE_KEY
|
|
90335
|
+
]) if (source[key] !== void 0) provenance[key] = source[key];
|
|
90336
|
+
return provenance;
|
|
90337
|
+
}
|
|
90242
90338
|
/** The validated canonical `permission` block of a config's `permissions.rulesync` blob. */
|
|
90243
90339
|
function canonicalPermissionOf(config) {
|
|
90244
90340
|
const parsed = RulesyncPermissionsFileSchema.safeParse({ permission: provenancePermissionOf(config) });
|
|
@@ -90406,10 +90502,10 @@ var HermesagentPermissions = class HermesagentPermissions extends ToolPermission
|
|
|
90406
90502
|
patterns: websiteBlocklist.enabled === true && isStringArray(websiteBlocklist.domains) ? websiteBlocklist.domains : []
|
|
90407
90503
|
});
|
|
90408
90504
|
removeEmptyCategories(permission);
|
|
90409
|
-
const { permission: _permission, hermes: _hermes, ...otherProvenance } = provenance;
|
|
90410
90505
|
const hermes = buildHermesOverride(config, provenance);
|
|
90506
|
+
const { $schema } = provenance;
|
|
90411
90507
|
const imported = {
|
|
90412
|
-
|
|
90508
|
+
...$schema !== void 0 && { $schema },
|
|
90413
90509
|
permission,
|
|
90414
90510
|
...Object.keys(hermes).length > 0 && { hermes }
|
|
90415
90511
|
};
|
|
@@ -90467,7 +90563,7 @@ var HermesagentPermissions = class HermesagentPermissions extends ToolPermission
|
|
|
90467
90563
|
base: config,
|
|
90468
90564
|
patch: permissions.hermes
|
|
90469
90565
|
});
|
|
90470
|
-
config.permissions = { rulesync: permissions };
|
|
90566
|
+
config.permissions = { rulesync: hermesProvenanceOf(permissions) };
|
|
90471
90567
|
return new HermesagentPermissions({
|
|
90472
90568
|
outputRoot,
|
|
90473
90569
|
fileContent: stringifySharedConfig({
|
|
@@ -103997,4 +104093,4 @@ const CHECKS_IMPORT_STRATEGY = {
|
|
|
103997
104093
|
};
|
|
103998
104094
|
export { RulesyncMcp as $, RULESYNC_USER_CONFIG_DIR_NAME as $n, isRootDirPath as $t, CODEBUDDY_LOCAL_RULE_FILE_NAME as A, CURATED_RULES_FEATURE_SUBDIR as An, resetRunWarningState as At, CLAUDECODE_MEMORIES_DIR_NAME as B, RULESYNC_HOOKS_RELATIVE_FILE_PATH as Bn, assertTreeContainsNoSymlinks as Bt, LETTACODE_DIR as C, ALL_TOOL_TARGETS as Cn, findControlCharacter as Ct, COMMANDCODE_DIR as D, ALL_FEATURES as Dn, fallbackLogger as Dt, FACTORYDROID_SETTINGS_LOCAL_FILE_NAME as E, ToolTargetSchema as En, WarningCollectingLogger as Et, CODEXCLI_BASH_RULES_FILE_NAME as F, RULESYNC_COMMANDS_RELATIVE_DIR_PATH as Fn, PathOutsideRootError as Ft, getLocalSkillDirNames as G, RULESYNC_NPM_SOURCES_LOCK_RELATIVE_FILE_PATH as Gn, ensureDir as Gt, CLAUDECODE_SKILLS_DIR_PATH as H, RULESYNC_LOCAL_CONFIG_RELATIVE_FILE_PATH as Hn, checkPathTraversal as Ht, CODEXCLI_DIR as I, RULESYNC_CONFIG_RELATIVE_FILE_PATH as In, applyFileMode as It, RulesyncSkill as J, RULESYNC_RELATIVE_DIR_PATH as Jn, findFilesByGlobs as Jt, RulesyncSubagent as K, RULESYNC_PERMISSIONS_RELATIVE_FILE_PATH as Kn, fileExists as Kt, CLAUDECODE_AGENT_MEMORY_LOCAL_DIR_NAME as L, RULESYNC_CONFIG_SCHEMA_URL as Ln, assertDirectoryIfExists as Lt, AUGMENTCODE_SETTINGS_LOCAL_FILE_NAME as M, MAX_FILE_SIZE as Mn, CLIError as Mt, caseFoldIdentity as N, RULESYNC_AIIGNORE_RELATIVE_FILE_PATH as Nn, ErrorCodes as Nt, COMMANDCODE_SETTINGS_LOCAL_FILE_NAME as O, ALL_FEATURES_WITH_WILDCARD as On, warnOnConflictingFlags as Ot, groupSpellingsByCaseFoldedIdentity as P, RULESYNC_CHECKS_RELATIVE_DIR_PATH as Pn, parseJsonc as Pt, RulesyncPermissions as Q, RULESYNC_SUBAGENTS_RELATIVE_DIR_PATH as Qn, isFileSystemError as Qt, CLAUDECODE_DIR as R, RULESYNC_CURATED_RULES_RELATIVE_DIR_PATH as Rn, assertNoSymlinkBelowRoot as Rt, QWENCODE_LOCAL_RULE_FILE_NAME as S, mapWithConcurrency as Sn, getSourceTransport as St, FACTORYDROID_DIR as T, PACKAGING_TOOL_TARGETS as Tn, JsonLogger as Tt, findProjectInstructionBudgetFindings as U, RULESYNC_MCP_RELATIVE_FILE_PATH as Un, createTempDirectory as Ut, CLAUDECODE_SETTINGS_LOCAL_FILE_NAME as V, RULESYNC_IGNORE_RELATIVE_FILE_PATH as Vn, assertWritablePathInsideRoot as Vt, toInstructionBudgetFile as W, RULESYNC_MCP_SCHEMA_URL as Wn, directoryExists as Wt, RulesyncRule as X, RULESYNC_SKILLS_RELATIVE_DIR_PATH as Xn, getHomeDirectory as Xt, RulesyncSkillFrontmatterSchema as Y, RULESYNC_RULES_RELATIVE_DIR_PATH as Yn, getFileSizeAndExecutableBit as Yt, RulesyncRuleFrontmatterSchema as Z, RULESYNC_SOURCES_LOCK_RELATIVE_FILE_PATH as Zn, isFileNotFoundError as Zt, SkillsProcessor as _, runWithDirectoryRollback as _n, CONFLICTING_TARGET_PAIRS as _t, convertFromTool as a, pathEscapesRoot as an, hasEnclosingMarkOutsideKeycap as ar, RulesyncCommandFrontmatterSchema as at, REASONIX_LOCAL_RULE_FILE_NAME as b, writeFileBuffer as bn, SourceEntrySchema as bt, ELLIPSIS_WIDTH as c, readFileContentOrNull as cn, stripControlCharactersKeepingLineFeeds as cr, stringifyFrontmatter as ct, McpProcessor as d, removeFile as dn, SHARED_USER_MANAGED_CONFIG_PATHS as dt, isSymlink as en, RULESYNC_XDG_CONFIG_HOME_DEFAULT_DIR_NAME as er, RulesyncIgnore as et, IgnoreProcessor as f, removeFileStrict as fn, SKILL_FILE_NAME as ft, SubagentsProcessor as g, resolvedRelativePath as gn, resolveEffectiveInputRoots as gt, RulesProcessor as h, resolvePath as hn, parseConfigFileContent as ht, inspectInputRoots as i, normalizePosixDirPath as in, hasDeceptiveHiddenCharacters as ir, RulesyncCommand as it, AUGMENTCODE_DIR as j, FEATURE_SOURCE_TREE_ENTRIES as jn, withWarnOnceScope as jt, CODEBUDDY_DIR as k, DEPRECATED_FEATURE_REPLACEMENTS as kn, withFallbackLoggerTarget as kt, displayWidthOf as l, removeDirectory as ln, stripControlCharactersKeepingLineFeedsAndTabs as lr, loadYaml as lt, ChecksProcessor as m, removeTempDirectory as mn, mergeInputRootConfigs as mt, formatSourceLoadFailure as n, listFilePathsRecursively as nn, formatError as nr, getRulesyncSourceCandidates as nt, getProcessorRegistryEntry as o, posixRelativePathEscapesRoot as on, quoteForLog as or, RulesyncCheck as ot, HooksProcessor as p, removeFileWithoutFollowingSymlinks as pn, ConfigResolver as pt, RulesyncSubagentFrontmatterSchema as q, RULESYNC_PERMISSIONS_SCHEMA_URL as qn, fileExistsStrict as qt, generate as r, listSubdirectoryNames as rn, truncateText as rr, resolveRulesyncSourceWritePath as rt, parseCommaSeparatedList as s, readFileContent as sn, stripControlCharacters as sr, RulesyncCheckFrontmatterSchema as st, importFromTool as t, listDirectoryEntryNames as tn, formatMegabytes as tr, RulesyncHooks as tt, shortenToWidth as u, removeDirectoryStrict as un, stripHiddenCharacters as ur, isRecord as ut, CRUSH_LOCAL_RULE_FILE_NAME as v, splitPathSegments as vn, ConfigFileSchema as vt, LETTACODE_SETTINGS_LOCAL_FILE_NAME as w, ALL_TOOL_TARGETS_WITH_WILDCARD as wn, ConsoleLogger as wt, QWENCODE_DIR as x, writeFileContent as xn, assertTargetsFeaturesExclusive as xt, CommandsProcessor as y, toPosixPath as yn, GITIGNORE_DESTINATION_KEY as yt, CLAUDECODE_LOCAL_RULE_FILE_NAME as z, RULESYNC_CURATED_SKILLS_RELATIVE_DIR_PATH as zn, assertPathResolvesInsideRoot as zt };
|
|
103999
104095
|
|
|
104000
|
-
//# sourceMappingURL=import-
|
|
104096
|
+
//# sourceMappingURL=import-tr3jHcG2.js.map
|