opencode-rules-md 0.8.5 → 0.9.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.
Files changed (62) hide show
  1. package/dist/cli.mjs +252 -261
  2. package/dist/src/cli/config.d.ts +11 -0
  3. package/dist/src/cli/config.d.ts.map +1 -1
  4. package/dist/src/cli/config.js +15 -0
  5. package/dist/src/cli/config.js.map +1 -1
  6. package/dist/src/cli/install.d.ts +35 -20
  7. package/dist/src/cli/install.d.ts.map +1 -1
  8. package/dist/src/cli/install.js +50 -131
  9. package/dist/src/cli/install.js.map +1 -1
  10. package/dist/src/cli/main.d.ts +5 -0
  11. package/dist/src/cli/main.d.ts.map +1 -1
  12. package/dist/src/cli/main.js +29 -26
  13. package/dist/src/cli/main.js.map +1 -1
  14. package/dist/src/cli/spawn.d.ts +29 -0
  15. package/dist/src/cli/spawn.d.ts.map +1 -0
  16. package/dist/src/cli/spawn.js +48 -0
  17. package/dist/src/cli/spawn.js.map +1 -0
  18. package/dist/src/cli/status.d.ts +15 -8
  19. package/dist/src/cli/status.d.ts.map +1 -1
  20. package/dist/src/cli/status.js +63 -31
  21. package/dist/src/cli/status.js.map +1 -1
  22. package/dist/src/cli/uninstall.d.ts +5 -2
  23. package/dist/src/cli/uninstall.d.ts.map +1 -1
  24. package/dist/src/cli/uninstall.js +78 -51
  25. package/dist/src/cli/uninstall.js.map +1 -1
  26. package/dist/src/cli/update.d.ts +50 -16
  27. package/dist/src/cli/update.d.ts.map +1 -1
  28. package/dist/src/cli/update.js +156 -124
  29. package/dist/src/cli/update.js.map +1 -1
  30. package/dist/src/rule-discovery.d.ts.map +1 -1
  31. package/dist/src/rule-discovery.js +18 -10
  32. package/dist/src/rule-discovery.js.map +1 -1
  33. package/dist/src/rule-filter.d.ts +9 -0
  34. package/dist/src/rule-filter.d.ts.map +1 -1
  35. package/dist/src/rule-filter.js +48 -11
  36. package/dist/src/rule-filter.js.map +1 -1
  37. package/dist/src/rule-metadata.d.ts +2 -0
  38. package/dist/src/rule-metadata.d.ts.map +1 -1
  39. package/dist/src/rule-metadata.js +4 -0
  40. package/dist/src/rule-metadata.js.map +1 -1
  41. package/dist/src/runtime-context.d.ts +6 -0
  42. package/dist/src/runtime-context.d.ts.map +1 -1
  43. package/dist/src/runtime-context.js +16 -0
  44. package/dist/src/runtime-context.js.map +1 -1
  45. package/dist/src/session-store.d.ts.map +1 -1
  46. package/dist/src/session-store.js +1 -0
  47. package/dist/src/session-store.js.map +1 -1
  48. package/dist/tui/index.js +13 -9
  49. package/dist/tui/index.js.map +4 -4
  50. package/package.json +1 -1
  51. package/src/cli/config.ts +19 -0
  52. package/src/cli/install.ts +66 -174
  53. package/src/cli/main.ts +34 -25
  54. package/src/cli/spawn.ts +76 -0
  55. package/src/cli/status.ts +83 -37
  56. package/src/cli/uninstall.ts +88 -57
  57. package/src/cli/update.ts +182 -148
  58. package/src/rule-discovery.ts +22 -10
  59. package/src/rule-filter.ts +73 -12
  60. package/src/rule-metadata.ts +8 -0
  61. package/src/runtime-context.ts +16 -0
  62. package/src/session-store.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/update.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC,eAAO,MAAM,UAAU,QAMtB,CAAC;AAIF,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,aAAa,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAQ7E;AAuBD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GACpB,IAAI,KAAK,EACT,KAAK,MAAM,CAAC,UAAU,EACtB,KAAK,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EACxB,QAAQ,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EAC3B,OAAM,aAAkB,KACvB,OAAO,CAAC,YAAY,CAqFtB,CAAC;AAIF;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAsC/D"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/update.ts"],"names":[],"mappings":"AAmBA,OAAO,EAIL,KAAK,KAAK,EAEX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAIjD,mEAAmE;AACnE,eAAO,MAAM,qBAAqB,6CAA8C,CAAC;AAEjF,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAExE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE/E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,EAAE,CAAC,EAAE,KAAK,GACT,MAAM,EAAE,CAoBV;AAED,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,kDAAkD;IAClD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,OAAO,mBAAmB,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,aAAa,CAAC;IAC5C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;CACrB;AAeD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI/D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAqC/D;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,GACpB,IAAI,KAAK,EACT,KAAK,MAAM,CAAC,UAAU,EACtB,KAAK,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EACxB,QAAQ,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EAC3B,OAAM,aAAkB,KACvB,OAAO,CAAC,YAAY,CAkEtB,CAAC"}
@@ -1,132 +1,100 @@
1
1
  // ---------------------------------------------------------------------------
2
2
  // src/cli/update.ts — `omd update` command implementation.
3
3
  //
4
- // Fetches latest from npm, compares to installed version, purges the
5
- // ~/.cache/opencode/node_modules/opencode-rules-md cache, and prints the
6
- // reinstall instruction when stale. No auto-reinstall.
4
+ // Like install, update is now a thin wrapper around OpenCode's own CLI.
5
+ // We compare the installed version (read from `data['plugin']` — singular —
6
+ // with a backward-compat fallback to the legacy `data['plugins']`) against
7
+ // the latest npm version. When stale we purge the on-disk cache under
8
+ // ~/.cache/opencode/packages/ (the actual location OpenCode uses) and
9
+ // invoke `opencode plugin opencode-rules-md --global --force` to refresh
10
+ // the registration.
11
+ //
12
+ // The cache purge matters because OpenCode caches the resolved package
13
+ // by specifier — once a cached copy exists, `--force` re-registers without
14
+ // re-fetching unless we first remove the stale entry.
7
15
  // ---------------------------------------------------------------------------
8
16
  import { homedir } from 'os';
9
17
  import { join } from 'path';
10
18
  import { fetchLatestVersion, isStale } from './registry.js';
11
- import { loadGlobalConfig, matchesPlugin, normalizePlugin } from './config.js';
12
- // ─── Constants ───────────────────────────────────────────────────────────────
13
- export const CACHE_PATH = join(homedir(), '.cache', 'opencode', 'node_modules', 'opencode-rules-md');
14
- // ─── Cache path helpers ───────────────────────────────────────────────────────
19
+ import { loadGlobalConfig, matchesPlugin, readInstalledPlugins, } from './config.js';
20
+ import { spawnOpencodePlugin } from './spawn.js';
21
+ const CONFIG_BASENAMES = ['opencode', 'tui'];
22
+ /** Package directory used by OpenCode to cache plugin installs. */
23
+ export const PACKAGES_DIR_BASENAME = ['.cache', 'opencode', 'packages'];
24
+ /** Exact cache directory name we look for (bare specifier, no version suffix). */
25
+ export const CACHE_DIR_BASENAME = 'opencode-rules-md';
15
26
  /**
16
- * Resolve the local cache directory, honoring a custom HOME environment.
17
- * Falls back to os.homedir() when HOME is not set, matching the
18
- * resolveConfigDir fallback strategy.
27
+ * Resolve the user's home directory, honoring a custom HOME env var.
28
+ * Used by both resolveCachePaths and the config loader.
19
29
  */
20
- export function resolveCachePath(env = process.env) {
21
- return join(env.HOME ?? homedir(), '.cache', 'opencode', 'node_modules', 'opencode-rules-md');
30
+ export function resolveHome(env = process.env) {
31
+ return env.HOME ?? homedir();
22
32
  }
23
33
  /**
24
- * Read the cached package.json version, if determinable.
25
- * Returns null when the cache is missing or unreadable.
34
+ * Return the absolute path of the OpenCode packages cache directory.
26
35
  */
27
- function readCacheVersion(fs, cachePath) {
28
- const pkgPath = join(cachePath, 'package.json');
29
- try {
30
- if (!fs.existsSync(pkgPath)) {
31
- return null;
32
- }
33
- const pkg = JSON.parse(fs.readFileSync(pkgPath));
34
- return typeof pkg.version === 'string' ? pkg.version : null;
35
- }
36
- catch {
37
- return null;
38
- }
36
+ export function resolvePackagesDir(env = process.env) {
37
+ return join(resolveHome(env), ...PACKAGES_DIR_BASENAME);
39
38
  }
40
- // ─── runUpdate ────────────────────────────────────────────────────────────────
41
- const CONFIG_BASENAMES = ['opencode', 'tui'];
42
39
  /**
43
- * Run the update command:
44
- * 1. Fetch latest version from npm (or use provided mock)
45
- * 2. Compare to installed version in config
46
- * 3. If stale: purge cache, print reinstall instruction
47
- * 4. If current: print "already current"
48
- * 5. If unreachable: noop
40
+ * Return the cache directories that match the opencode-rules-md prefix.
41
+ *
42
+ * Real-world layout under ~/.cache/opencode/packages/ looks like:
43
+ * opencode-rules-md/
44
+ * opencode-rules-md@latest/
45
+ * some-other-plugin/
46
+ *
47
+ * We glob-match anything starting with `opencode-rules-md` (exact or with
48
+ * an `@<version>` suffix). When an injected fs is provided we list the
49
+ * directory and filter; without one we return the two most common shapes
50
+ * so callers can pre-check existence cheaply.
49
51
  */
50
- export const runUpdate = async (fs, env, log, _error, opts = {}) => {
51
- // Use provided latestVersion for testing, otherwise fetch from npm
52
- const latest = opts.latestVersion !== undefined
53
- ? opts.latestVersion
54
- : await fetchLatestVersion();
55
- const cachePath = resolveCachePath(env);
56
- if (latest === null) {
57
- log('omd: could not determine latest version from npm registry');
58
- return {
59
- status: 'unreachable',
60
- cachePath,
61
- instruction: 'npx opencode-rules-md@latest install',
62
- };
63
- }
64
- // Determine installed version from config (check both configs)
65
- let installedVersion = null;
66
- for (const basename of CONFIG_BASENAMES) {
67
- const loaded = loadGlobalConfig(fs, env, basename);
68
- const plugins = normalizePlugin(loaded.data['plugins']);
69
- const match = plugins.find(p => matchesPlugin(p));
70
- if (match) {
71
- // Extract version from specifier (e.g. 'opencode-rules-md@2.0.0' -> '2.0.0')
72
- const atIndex = match.lastIndexOf('@');
73
- installedVersion = atIndex >= 0 ? match.slice(atIndex + 1) : null;
74
- break; // use first config that has it
75
- }
76
- }
77
- const instruction = `npx opencode-rules-md@latest install`;
78
- // Check staleness: only stale if installed version differs from latest
79
- if (installedVersion !== null && !isStale(installedVersion, latest)) {
80
- log(`omd: opencode-rules-md@${installedVersion} is already the latest`);
81
- return {
82
- status: 'current',
83
- cachePath,
84
- instruction,
85
- };
86
- }
87
- // Before purging, decide whether the cache is actually stale. When the cache
88
- // version is already equal to the latest resolved version, skip the purge
89
- // so we do not delete a valid cache. If the version cannot be determined,
90
- // fall back to purging to be safe.
91
- const cacheVersion = readCacheVersion(fs, cachePath);
92
- const shouldPurge = cacheVersion === null || cacheVersion !== latest;
93
- if (opts.dryRun) {
94
- log(`omd: update check (dry-run)`);
95
- log(` latest version: ${latest}`);
96
- log(` installed version: ${installedVersion ?? 'not installed'}`);
97
- log(` would purge: ${shouldPurge ? cachePath : '(nothing to purge)'}`);
98
- log(` would instruct: ${instruction}`);
99
- return {
100
- status: 'stale',
101
- cachePath,
102
- instruction,
103
- };
104
- }
105
- // Purge the cache directory using the injected fs (allows test faking)
106
- if (shouldPurge) {
52
+ export function resolveCachePaths(env = process.env, fs) {
53
+ const packagesDir = resolvePackagesDir(env);
54
+ if (fs && fs.existsSync(packagesDir)) {
107
55
  try {
108
- if (fs.existsSync(cachePath)) {
109
- // Recursively remove contents then the dir itself
110
- purgeDirectory(fs, cachePath);
111
- }
56
+ const entries = fs.readdirSync(packagesDir);
57
+ return entries
58
+ .filter((name) => name === CACHE_DIR_BASENAME || name.startsWith(`${CACHE_DIR_BASENAME}@`))
59
+ .map((name) => join(packagesDir, name));
112
60
  }
113
61
  catch {
114
- // best-effort — purge failure is non-fatal
62
+ return [];
115
63
  }
116
64
  }
117
- log(`omd: opencode-rules-md is stale (latest: ${latest})`);
118
- log(`omd: cache purged at ${cachePath}`);
119
- log(`omd: to reinstall, run:`);
120
- log(` ${instruction}`);
121
- return {
122
- status: 'stale',
123
- cachePath,
124
- instruction,
125
- };
126
- };
127
- // ─── purgeDirectory ────────────────────────────────────────────────────────────
65
+ // No fs injection return the conventional candidates. Callers that care
66
+ // about existence should still check with existsSync().
67
+ return [
68
+ join(packagesDir, CACHE_DIR_BASENAME),
69
+ join(packagesDir, `${CACHE_DIR_BASENAME}@latest`),
70
+ ];
71
+ }
128
72
  /**
129
- * Recursively delete a directory and all its contents using the given fs.
73
+ * Look up the installed specifier across both config files, returning the
74
+ * first one we find. Returns null when neither file registers the plugin.
75
+ */
76
+ function findInstalledSpecifier(loaded) {
77
+ for (const cfg of loaded) {
78
+ const plugins = readInstalledPlugins(cfg);
79
+ const match = plugins.find((p) => matchesPlugin(p));
80
+ if (match)
81
+ return match;
82
+ }
83
+ return null;
84
+ }
85
+ /**
86
+ * Extract the version portion of an `opencode-rules-md@<version>` specifier.
87
+ * Returns null when the specifier has no `@version` segment.
88
+ */
89
+ export function extractVersion(specifier) {
90
+ const at = specifier.lastIndexOf('@');
91
+ if (at < 0 || at === specifier.length - 1)
92
+ return null;
93
+ return specifier.slice(at + 1);
94
+ }
95
+ /**
96
+ * Recursively delete a directory and all its contents using the injected fs.
97
+ * Best-effort — a failed purge is not fatal; we want the update to keep going.
130
98
  */
131
99
  export function purgeDirectory(fs, dirPath) {
132
100
  let entries = [];
@@ -139,25 +107,25 @@ export function purgeDirectory(fs, dirPath) {
139
107
  for (const entry of entries) {
140
108
  const entryPath = join(dirPath, entry);
141
109
  try {
142
- if (fs.existsSync(entryPath)) {
143
- // Check if it's a directory by trying to read it
144
- try {
145
- const subEntries = fs.readdirSync(entryPath);
146
- if (subEntries.length === 0) {
147
- // Empty directory
148
- fs.rmdirSync(entryPath);
149
- }
150
- else {
151
- // Non-empty directory — recurse
152
- purgeDirectory(fs, entryPath);
153
- fs.rmdirSync(entryPath);
154
- }
110
+ if (!fs.existsSync(entryPath))
111
+ continue;
112
+ // Probe to differentiate empty dirs / non-empty dirs / files. The injected
113
+ // fs interface does not expose stat, so we try readdir first and fall back
114
+ // to unlink for leaves.
115
+ try {
116
+ const subEntries = fs.readdirSync(entryPath);
117
+ if (subEntries.length === 0) {
118
+ fs.rmdirSync(entryPath);
155
119
  }
156
- catch {
157
- // It's a file — unlink it
158
- fs.unlinkSync(entryPath);
120
+ else {
121
+ purgeDirectory(fs, entryPath);
122
+ fs.rmdirSync(entryPath);
159
123
  }
160
124
  }
125
+ catch {
126
+ // Not a directory (or unreadable) — best-effort unlink.
127
+ fs.unlinkSync(entryPath);
128
+ }
161
129
  }
162
130
  catch {
163
131
  // best-effort per entry
@@ -170,4 +138,68 @@ export function purgeDirectory(fs, dirPath) {
170
138
  // best-effort
171
139
  }
172
140
  }
141
+ /**
142
+ * Run the update command.
143
+ *
144
+ * 1. Resolve the latest published version from npm (or use the injected mock).
145
+ * 2. Read the installed version from the user's opencode config.
146
+ * 3. If unreachable, log and return.
147
+ * 4. If current, log and return.
148
+ * 5. Otherwise: purge stale cache directories, then spawn
149
+ * `opencode plugin opencode-rules-md --global --force`.
150
+ */
151
+ export const runUpdate = async (fs, env, log, _error, opts = {}) => {
152
+ // 1. Resolve latest.
153
+ const latest = opts.latestVersion !== undefined ? opts.latestVersion : await fetchLatestVersion();
154
+ const cachePaths = resolveCachePaths(env, fs);
155
+ const instruction = 'opencode plugin opencode-rules-md --global --force';
156
+ const spawnFn = opts.spawn ?? spawnOpencodePlugin;
157
+ // 2. Unreachable.
158
+ if (latest === null) {
159
+ log('omd: could not determine latest version from npm registry');
160
+ return { status: 'unreachable', cachePaths, instruction };
161
+ }
162
+ // 3. Installed version (read both configs).
163
+ const configs = CONFIG_BASENAMES.map((basename) => loadGlobalConfig(fs, env, basename));
164
+ const installedSpecifier = findInstalledSpecifier(configs);
165
+ const installedVersion = installedSpecifier ? extractVersion(installedSpecifier) : null;
166
+ // 4. Current.
167
+ if (installedVersion !== null && !isStale(installedVersion, latest)) {
168
+ log(`omd: opencode-rules-md@${installedVersion} is already the latest`);
169
+ return { status: 'current', cachePaths, instruction: '' };
170
+ }
171
+ // 5. Stale — describe plan.
172
+ if (opts.dryRun) {
173
+ log('omd: update check (dry-run)');
174
+ log(` latest version: ${latest}`);
175
+ log(` installed version: ${installedVersion ?? 'not installed'}`);
176
+ log(` would purge: ${cachePaths.join(', ') || '(none found)'}`);
177
+ log(` would instruct: ${instruction}`);
178
+ return { status: 'stale', cachePaths, instruction };
179
+ }
180
+ log(installedVersion === null
181
+ ? `omd: opencode-rules-md is not installed; registering latest (${latest})`
182
+ : `omd: opencode-rules-md is stale (installed ${installedVersion}, latest ${latest})`);
183
+ // Purge each matching cache directory. Best-effort per path.
184
+ for (const cachePath of cachePaths) {
185
+ try {
186
+ if (fs.existsSync(cachePath)) {
187
+ purgeDirectory(fs, cachePath);
188
+ log(`omd: purged cache ${cachePath}`);
189
+ }
190
+ }
191
+ catch {
192
+ // ignore individual purge failures
193
+ }
194
+ }
195
+ // Re-register via OpenCode's CLI. Failure here is fatal — surface it.
196
+ const result = await spawnFn(['opencode-rules-md', '--global', '--force'], {
197
+ env: process.env,
198
+ stdio: 'inherit',
199
+ });
200
+ if ((result.status ?? 0) !== 0) {
201
+ throw new Error(`opencode plugin opencode-rules-md --global --force exited with status ${String(result.status)}`);
202
+ }
203
+ return { status: 'stale', cachePaths, instruction: '' };
204
+ };
173
205
  //# sourceMappingURL=update.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/update.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rule-discovery.d.ts","sourceRoot":"","sources":["../../src/rule-discovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAI5B;;GAEG;AACH,UAAU,UAAU;IAClB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;CACf;AAOD;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAoCjC;AAmED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,EAAE,CAAC,CA8B3B"}
1
+ {"version":3,"file":"rule-discovery.d.ts","sourceRoot":"","sources":["../../src/rule-discovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAI5B;;GAEG;AACH,UAAU,UAAU;IAClB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;CACf;AAOD;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAoCjC;AAmED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,EAAE,CAAC,CA0C3B"}
@@ -119,25 +119,33 @@ async function scanDirectoryRecursively(dir, baseDir) {
119
119
  * Finds all .md and .mdc files including nested subdirectories.
120
120
  */
121
121
  export async function discoverRuleFiles(projectDir) {
122
- const files = [];
123
- // Discover global rules (recursively)
122
+ // Keyed by relativePath; later insertions shadow earlier ones.
123
+ // Global rules are inserted first (lowest precedence); project-local rules
124
+ // are inserted after and overwrite any global entry sharing the same key.
125
+ const byRelativePath = new Map();
126
+ // Discover global rules (recursively) — inserted first (lowest precedence).
124
127
  const globalRulesDir = getGlobalRulesDir();
125
128
  if (globalRulesDir) {
126
129
  const globalRules = await scanDirectoryRecursively(globalRulesDir, globalRulesDir);
127
- for (const { filePath, relativePath } of globalRules) {
128
- debugLog(`Discovered global rule: ${relativePath} (${filePath})`);
129
- files.push({ filePath, relativePath });
130
+ for (const rule of globalRules) {
131
+ debugLog(`Discovered global rule: ${rule.relativePath} (${rule.filePath})`);
132
+ byRelativePath.set(rule.relativePath, rule);
130
133
  }
131
134
  }
132
- // Discover project-local rules (recursively) if project directory is provided
135
+ // Discover project-local rules (recursively) shadow global duplicates.
133
136
  if (projectDir) {
134
137
  const projectRulesDir = path.join(projectDir, '.opencode', 'rules');
135
138
  const projectRules = await scanDirectoryRecursively(projectRulesDir, projectRulesDir);
136
- for (const { filePath, relativePath } of projectRules) {
137
- debugLog(`Discovered project rule: ${relativePath} (${filePath})`);
138
- files.push({ filePath, relativePath });
139
+ for (const rule of projectRules) {
140
+ const shadowed = byRelativePath.has(rule.relativePath);
141
+ debugLog(`Discovered project rule: ${rule.relativePath} (${rule.filePath})` +
142
+ (shadowed ? ' [shadows global]' : ''));
143
+ byRelativePath.set(rule.relativePath, rule);
139
144
  }
140
145
  }
141
- return files;
146
+ // Map preserves insertion order in JS, so global rules keep their relative
147
+ // order and shadowed slots retain their original position but point at the
148
+ // project file.
149
+ return Array.from(byRelativePath.values());
142
150
  }
143
151
  //# sourceMappingURL=rule-discovery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rule-discovery.js","sourceRoot":"","sources":["../../src/rule-discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-discovery.js","sourceRoot":"","sources":["../../src/rule-discovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GAEjB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;AAgBlC;;GAEG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,SAAS,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;QAE5B,wCAAwC;QACxC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACrC,QAAQ,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC;YACnC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,0BAA0B;QAC1B,QAAQ,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAElD,MAAM,KAAK,GAAe;YACxB,OAAO;YACP,QAAQ;YACR,eAAe;YACf,KAAK;SACN,CAAC;QAEF,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oDAAoD;QACpD,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CACV,yDAAyD,QAAQ,KAAK,OAAO,EAAE,CAChF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB;IACxB,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC1D,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAClD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,wBAAwB,CACrC,GAAW,EACX,OAAe;IAEf,MAAM,OAAO,GAAsD,EAAE,CAAC;IAEtE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,oCAAoC;YACpC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,4BAA4B;gBAC5B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;YACvE,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrE,oBAAoB;gBACpB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kEAAkE;QAClE,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzE,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,uCAAuC;QACvC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CACV,yDAAyD,GAAG,KAAK,OAAO,EAAE,CAC3E,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAYD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAmB;IAEnB,+DAA+D;IAC/D,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEzD,4EAA4E;IAC5E,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAChD,cAAc,EACd,cAAc,CACf,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,QAAQ,CACN,2BAA2B,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,QAAQ,GAAG,CAClE,CAAC;YACF,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG,MAAM,wBAAwB,CACjD,eAAe,EACf,eAAe,CAChB,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvD,QAAQ,CACN,4BAA4B,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,QAAQ,GAAG;gBAChE,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CACxC,CAAC;YACF,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,2EAA2E;IAC3E,gBAAgB;IAChB,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7C,CAAC"}
@@ -20,12 +20,19 @@ export declare function promptMatchesKeywords(prompt: string, keywords: string[]
20
20
  * @returns true if any required tool is available
21
21
  */
22
22
  export declare function toolsMatchAvailable(availableToolIDs: string[], requiredTools: string[]): boolean;
23
+ /**
24
+ * Rough token estimate using the chars/4 heuristic.
25
+ * No external dependency; accurate enough for budget decisions.
26
+ */
27
+ export declare function estimateTokens(text: string): number;
23
28
  /**
24
29
  * Result of reading and formatting rules
25
30
  */
26
31
  export interface FilterResult {
27
32
  formattedRules: string;
28
33
  matchedPaths: string[];
34
+ /** Estimated token count of formattedRules (0 when empty) */
35
+ tokenEstimate: number;
29
36
  }
30
37
  /**
31
38
  * Runtime filter context for conditional rule matching
@@ -51,6 +58,8 @@ export interface RuleFilterContext {
51
58
  os?: string;
52
59
  /** Whether running in CI environment */
53
60
  ci?: boolean;
61
+ /** Optional hard token cap; lowest-priority rules are dropped when exceeded. */
62
+ maxTokens?: number;
54
63
  }
55
64
  /**
56
65
  * Read and format rule files for system prompt injection
@@ -1 +1 @@
1
- {"version":3,"file":"rule-filter.d.ts","sourceRoot":"","sources":["../../src/rule-filter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAWzE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAWT;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAOT;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAqKvB"}
1
+ {"version":3,"file":"rule-filter.d.ts","sourceRoot":"","sources":["../../src/rule-filter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAWzE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAWT;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAOT;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAqNvB"}
@@ -46,6 +46,15 @@ export function toolsMatchAvailable(availableToolIDs, requiredTools) {
46
46
  const availableSet = new Set(availableToolIDs);
47
47
  return requiredTools.some(tool => availableSet.has(tool));
48
48
  }
49
+ /**
50
+ * Rough token estimate using the chars/4 heuristic.
51
+ * No external dependency; accurate enough for budget decisions.
52
+ */
53
+ export function estimateTokens(text) {
54
+ if (!text)
55
+ return 0;
56
+ return Math.ceil(text.length / 4);
57
+ }
49
58
  /**
50
59
  * Read and format rule files for system prompt injection
51
60
  * @param files - Array of discovered rule files with paths
@@ -53,13 +62,13 @@ export function toolsMatchAvailable(availableToolIDs, requiredTools) {
53
62
  */
54
63
  export async function readAndFormatRules(files, context = {}) {
55
64
  if (files.length === 0) {
56
- return { formattedRules: '', matchedPaths: [] };
65
+ return { formattedRules: '', matchedPaths: [], tokenEstimate: 0 };
57
66
  }
58
- const ruleContents = [];
59
- const matchedPaths = [];
60
67
  const availableToolSet = context.availableToolIDs && context.availableToolIDs.length > 0
61
68
  ? new Set(context.availableToolIDs)
62
69
  : undefined;
70
+ const entries = [];
71
+ let entryIndex = 0;
63
72
  for (const { filePath, relativePath } of files) {
64
73
  // Use cached rule data with mtime-based invalidation
65
74
  const cachedRule = await getCachedRule(filePath);
@@ -163,18 +172,46 @@ export async function readAndFormatRules(files, context = {}) {
163
172
  }
164
173
  debugLog(`Including conditional rule: ${relativePath} (match: ${mode}, checks: ${declaredChecks.join(', ')})`);
165
174
  }
166
- // Use cached stripped content for output
167
- // Use relativePath for unique headings instead of just filename
168
- ruleContents.push(`## ${relativePath}\n\n${strippedContent}`);
169
- matchedPaths.push(filePath);
175
+ // Extract priority (default 0 for selection; undefined in metadata means absent)
176
+ const priority = metadata?.priority ?? 0;
177
+ // Build formatted chunk for token counting
178
+ const formattedChunk = `## ${relativePath}\n\n${strippedContent}`;
179
+ const tokenCount = estimateTokens(formattedChunk);
180
+ entries.push({ filePath, relativePath, strippedContent, priority, tokenCount, index: entryIndex++ });
181
+ }
182
+ if (entries.length === 0) {
183
+ return { formattedRules: '', matchedPaths: [], tokenEstimate: 0 };
170
184
  }
171
- if (ruleContents.length === 0) {
172
- return { formattedRules: '', matchedPaths: [] };
185
+ // Determine which entries to include based on budget
186
+ const maxTokens = context.maxTokens;
187
+ const hasValidBudget = typeof maxTokens === 'number' && maxTokens > 0 && Number.isFinite(maxTokens);
188
+ let survivors;
189
+ if (!hasValidBudget) {
190
+ // No budget: use discovery order (existing behavior)
191
+ survivors = entries;
192
+ }
193
+ else {
194
+ // Valid budget: stable sort by priority desc, index asc
195
+ const sorted = [...entries].sort((a, b) => (b.priority - a.priority) || (a.index - b.index));
196
+ // Greedy selection: always keep first (≥1 survivor invariant), then add while within budget
197
+ survivors = [sorted[0]];
198
+ let runningTokens = sorted[0].tokenCount;
199
+ for (let i = 1; i < sorted.length; i++) {
200
+ if (runningTokens + sorted[i].tokenCount <= maxTokens) {
201
+ survivors.push(sorted[i]);
202
+ runningTokens += sorted[i].tokenCount;
203
+ }
204
+ }
173
205
  }
206
+ // Build output from survivors
207
+ const ruleContents = survivors.map(entry => `## ${entry.relativePath}\n\n${entry.strippedContent}`);
208
+ const matchedPaths = survivors.map(entry => entry.filePath);
209
+ const formattedRules = `# OpenCode Rules\n\nPlease follow the following rules:\n\n` +
210
+ ruleContents.join('\n\n---\n\n');
174
211
  return {
175
- formattedRules: `# OpenCode Rules\n\nPlease follow the following rules:\n\n` +
176
- ruleContents.join('\n\n---\n\n'),
212
+ formattedRules,
177
213
  matchedPaths,
214
+ tokenEstimate: estimateTokens(formattedRules),
178
215
  };
179
216
  }
180
217
  //# sourceMappingURL=rule-filter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rule-filter.js","sourceRoot":"","sources":["../../src/rule-filter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-filter.js","sourceRoot":"","sources":["../../src/rule-filter.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,8 @@ export interface RuleMetadata {
16
16
  os?: string[];
17
17
  ci?: boolean;
18
18
  match?: 'any' | 'all';
19
+ /** Higher priority is kept first when a token budget is enforced. Default 0. */
20
+ priority?: number;
19
21
  }
20
22
  /**
21
23
  * Parse YAML metadata from rule file content using the yaml package.
@@ -1 +1 @@
1
- {"version":3,"file":"rule-metadata.d.ts","sourceRoot":"","sources":["../../src/rule-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CACvB;AAiDD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAmE3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAcxD"}
1
+ {"version":3,"file":"rule-metadata.d.ts","sourceRoot":"","sources":["../../src/rule-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkDD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAwE3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAcxD"}