opencode-rules-md 0.8.6 → 0.9.1

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 (47) hide show
  1. package/README.md +9 -9
  2. package/dist/src/cli/config.d.ts +1 -1
  3. package/dist/src/cli/config.js.map +1 -1
  4. package/dist/src/cli/install.d.ts.map +1 -1
  5. package/dist/src/cli/install.js.map +1 -1
  6. package/dist/src/cli/main.d.ts.map +1 -1
  7. package/dist/src/cli/main.js.map +1 -1
  8. package/dist/src/cli/registry.d.ts.map +1 -1
  9. package/dist/src/cli/spawn.js.map +1 -1
  10. package/dist/src/cli/status.d.ts.map +1 -1
  11. package/dist/src/cli/status.js.map +1 -1
  12. package/dist/src/cli/uninstall.d.ts +1 -1
  13. package/dist/src/cli/uninstall.d.ts.map +1 -1
  14. package/dist/src/cli/uninstall.js.map +1 -1
  15. package/dist/src/cli/update.d.ts +1 -1
  16. package/dist/src/cli/update.d.ts.map +1 -1
  17. package/dist/src/cli/update.js.map +1 -1
  18. package/dist/src/index.d.ts +2 -1
  19. package/dist/src/index.d.ts.map +1 -1
  20. package/dist/src/rule-discovery.d.ts.map +1 -1
  21. package/dist/src/rule-discovery.js +18 -10
  22. package/dist/src/rule-discovery.js.map +1 -1
  23. package/dist/src/rule-filter.d.ts +9 -0
  24. package/dist/src/rule-filter.d.ts.map +1 -1
  25. package/dist/src/rule-filter.js +48 -11
  26. package/dist/src/rule-filter.js.map +1 -1
  27. package/dist/src/rule-metadata.d.ts +2 -0
  28. package/dist/src/rule-metadata.d.ts.map +1 -1
  29. package/dist/src/rule-metadata.js +4 -0
  30. package/dist/src/rule-metadata.js.map +1 -1
  31. package/dist/src/runtime-context.d.ts +6 -0
  32. package/dist/src/runtime-context.d.ts.map +1 -1
  33. package/dist/src/runtime-context.js +16 -0
  34. package/dist/src/runtime-context.js.map +1 -1
  35. package/dist/src/runtime.d.ts.map +1 -1
  36. package/dist/src/session-store.d.ts.map +1 -1
  37. package/dist/src/session-store.js +1 -0
  38. package/dist/src/session-store.js.map +1 -1
  39. package/dist/tui/index.d.ts.map +1 -1
  40. package/dist/tui/index.js +13 -9
  41. package/dist/tui/index.js.map +4 -4
  42. package/package.json +14 -17
  43. package/src/rule-discovery.ts +22 -10
  44. package/src/rule-filter.ts +73 -12
  45. package/src/rule-metadata.ts +8 -0
  46. package/src/runtime-context.ts +16 -0
  47. package/src/session-store.ts +1 -0
@@ -71,6 +71,10 @@ export function parseRuleMetadata(content) {
71
71
  if (parsed.match === 'any' || parsed.match === 'all') {
72
72
  metadata.match = parsed.match;
73
73
  }
74
+ // Extract priority (finite numbers only; non-finite or absent becomes undefined, treated as 0 downstream)
75
+ if (typeof parsed.priority === 'number' && Number.isFinite(parsed.priority)) {
76
+ metadata.priority = parsed.priority;
77
+ }
74
78
  // Return metadata only if it has content
75
79
  return Object.keys(metadata).length > 0 ? metadata : undefined;
76
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rule-metadata.js","sourceRoot":"","sources":["../../src/rule-metadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-metadata.js","sourceRoot":"","sources":["../../src/rule-metadata.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,12 @@ export interface BuildFilterContextOptions {
17
17
  * If process.env.CI is not set (undefined), fall back to provider-specific detection.
18
18
  */
19
19
  export declare function detectCiEnvironment(): boolean;
20
+ /**
21
+ * Resolve the active token budget from the OPENCODE_RULES_MAX_TOKENS env var.
22
+ * Returns undefined when the env var is absent, empty, zero, negative, or non-finite.
23
+ * Positive finite numbers enable budget enforcement.
24
+ */
25
+ export declare function resolveMaxTokens(): number | undefined;
20
26
  /**
21
27
  * Build the filter context object used for rule matching.
22
28
  * Assembles runtime information from various sources.
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-context.d.ts","sourceRoot":"","sources":["../../src/runtime-context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAmB7C;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,yBAAyB,EAC/B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,iBAAiB,CAAC,CA+D5B"}
1
+ {"version":3,"file":"runtime-context.d.ts","sourceRoot":"","sources":["../../src/runtime-context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAmB7C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAKrD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,yBAAyB,EAC/B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,iBAAiB,CAAC,CAmE5B"}
@@ -47,6 +47,18 @@ export function detectCiEnvironment() {
47
47
  isTruthyEnvValue(env.BUILDKITE) ||
48
48
  isTruthyEnvValue(env.TEAMCITY_VERSION));
49
49
  }
50
+ /**
51
+ * Resolve the active token budget from the OPENCODE_RULES_MAX_TOKENS env var.
52
+ * Returns undefined when the env var is absent, empty, zero, negative, or non-finite.
53
+ * Positive finite numbers enable budget enforcement.
54
+ */
55
+ export function resolveMaxTokens() {
56
+ const raw = process.env.OPENCODE_RULES_MAX_TOKENS;
57
+ if (!raw)
58
+ return undefined;
59
+ const n = Number(raw);
60
+ return Number.isFinite(n) && n > 0 ? n : undefined;
61
+ }
50
62
  /**
51
63
  * Build the filter context object used for rule matching.
52
64
  * Assembles runtime information from various sources.
@@ -101,6 +113,10 @@ export async function buildFilterContext(opts, projectDirectory, debugLog) {
101
113
  if (gitBranch !== undefined) {
102
114
  context.gitBranch = gitBranch;
103
115
  }
116
+ const maxTokens = resolveMaxTokens();
117
+ if (maxTokens !== undefined) {
118
+ context.maxTokens = maxTokens;
119
+ }
104
120
  debugLog(`Filter context: model=${modelID ?? 'none'}, agent=${agentType ?? 'none'}, ` +
105
121
  `command=${command ?? 'none'}, branch=${gitBranch ?? 'none'}, ` +
106
122
  `os=${os}, ci=${ci}, projectTags=${projectTags?.join(',') ?? 'none'}`);
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-context.js","sourceRoot":"","sources":["../../src/runtime-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime-context.js","sourceRoot":"","sources":["../../src/runtime-context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAU1D,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAwBvD,UAAU,2BAA2B;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,GAAG,CAAe;gBAEd,IAAI,EAAE,2BAA2B;IAU7C,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;YAWxB,mBAAmB;YA2CnB,mBAAmB;YAiDnB,aAAa;YAOb,iBAAiB;YA+FjB,qBAAqB;YAoDrB,mBAAmB;CA6ClC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAU1D,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAwBvD,UAAU,2BAA2B;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,GAAG,CAAe;IAE1B,YAAY,IAAI,EAAE,2BAA2B,EAQ5C;IAED,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASrC;YAEa,mBAAmB;YA2CnB,mBAAmB;YAiDnB,aAAa;YAOb,iBAAiB;YA+FjB,qBAAqB;YAoDrB,mBAAmB;CA6ClC"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/session-store.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,mBAAmB;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAK;gBAEL,IAAI,GAAE,mBAAwB;IAI1C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3B,GAAG,IAAI,MAAM,EAAE;IAIf,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIhD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IASrD,KAAK,IAAI,IAAI;IAMb,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IA6BvE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOtD,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,SAAS,GACb,OAAO;IAqBV,OAAO,CAAC,kBAAkB;CAS3B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,YAAY,CAE3E"}
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/session-store.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,mBAAmB;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAK;IAEjB,YAAY,IAAI,GAAE,mBAAwB,EAEzC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE1B;IAED,GAAG,IAAI,MAAM,EAAE,CAEd;IAED,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE/C;IAED,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAOpD;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CA2BtE;IAED,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKrD;IAED,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,SAAS,GACb,OAAO,CAoBT;IAED,OAAO,CAAC,kBAAkB;CAS3B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,YAAY,CAE3E"}
@@ -71,6 +71,7 @@ export class SessionStore {
71
71
  }
72
72
  this.upsert(sessionID, s => {
73
73
  s.isCompacting = false;
74
+ s.rulesInjected = false;
74
75
  });
75
76
  return false;
76
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/session-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/session-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../tui/index.tsx"],"names":[],"mappings":"AACA,sCAAsC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;;;;;AAoBzD,wBAA2B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../tui/index.tsx"],"names":[],"mappings":"AACA,sCAAsC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/tui/index.js CHANGED
@@ -79,6 +79,9 @@ function parseRuleMetadata(content) {
79
79
  if (parsed.match === "any" || parsed.match === "all") {
80
80
  metadata.match = parsed.match;
81
81
  }
82
+ if (typeof parsed.priority === "number" && Number.isFinite(parsed.priority)) {
83
+ metadata.priority = parsed.priority;
84
+ }
82
85
  return Object.keys(metadata).length > 0 ? metadata : undefined;
83
86
  } catch (error) {
84
87
  const message = error instanceof Error ? error.message : String(error);
@@ -166,24 +169,25 @@ async function scanDirectoryRecursively(dir, baseDir) {
166
169
  return results;
167
170
  }
168
171
  async function discoverRuleFiles(projectDir) {
169
- const files = [];
172
+ const byRelativePath = new Map;
170
173
  const globalRulesDir = getGlobalRulesDir();
171
174
  if (globalRulesDir) {
172
175
  const globalRules = await scanDirectoryRecursively(globalRulesDir, globalRulesDir);
173
- for (const { filePath, relativePath } of globalRules) {
174
- debugLog(`Discovered global rule: ${relativePath} (${filePath})`);
175
- files.push({ filePath, relativePath });
176
+ for (const rule of globalRules) {
177
+ debugLog(`Discovered global rule: ${rule.relativePath} (${rule.filePath})`);
178
+ byRelativePath.set(rule.relativePath, rule);
176
179
  }
177
180
  }
178
181
  if (projectDir) {
179
182
  const projectRulesDir = path.join(projectDir, ".opencode", "rules");
180
183
  const projectRules = await scanDirectoryRecursively(projectRulesDir, projectRulesDir);
181
- for (const { filePath, relativePath } of projectRules) {
182
- debugLog(`Discovered project rule: ${relativePath} (${filePath})`);
183
- files.push({ filePath, relativePath });
184
+ for (const rule of projectRules) {
185
+ const shadowed = byRelativePath.has(rule.relativePath);
186
+ debugLog(`Discovered project rule: ${rule.relativePath} (${rule.filePath})` + (shadowed ? " [shadows global]" : ""));
187
+ byRelativePath.set(rule.relativePath, rule);
184
188
  }
185
189
  }
186
- return files;
190
+ return Array.from(byRelativePath.values());
187
191
  }
188
192
 
189
193
  // src/active-rules-state.ts
@@ -844,5 +848,5 @@ export {
844
848
  tui_default as default
845
849
  };
846
850
 
847
- //# debugId=ED0F9EF9A8B9A40664756E2164756E21
851
+ //# debugId=8A2B78FD948E5F6364756E2164756E21
848
852
  //# sourceMappingURL=index.js.map
@@ -4,13 +4,13 @@
4
4
  "sourcesContent": [
5
5
  "import { createComponent as _$createComponent } from \"@opentui/solid\";\n// tui/index.tsx\n/** @jsxImportSource @opentui/solid */\n\nimport { SidebarContent } from './slots/sidebar-content.js';\nconst id = 'opencode-rules-md';\nconst tui = async api => {\n api.slots.register({\n order: 350,\n slots: {\n sidebar_content: (ctx, props) => _$createComponent(SidebarContent, {\n get sessionId() {\n return props.session_id;\n },\n api: api,\n get theme() {\n return ctx.theme;\n }\n })\n }\n });\n};\nexport default {\n id,\n tui\n};",
6
6
  "import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { memo as _$memo } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n// tui/slots/sidebar-content.tsx\n/** @jsxImportSource @opentui/solid */\nimport { createSignal, createEffect, createMemo, onCleanup, Show, For } from 'solid-js';\nimport { loadSidebarRules } from '../data/rules.js';\nfunction RuleSection(props) {\n const activeCount = createMemo(() => props.rules.filter(r => r.isActive === true).length);\n const headerCount = createMemo(() => {\n if (props.hasEvaluationState) {\n return `(${activeCount()}/${props.rules.length})`;\n }\n return `(${props.rules.length})`;\n });\n const bulletColor = rule => {\n return rule.isActive === true ? props.theme.success : props.theme.textMuted;\n };\n return _$createComponent(Show, {\n get when() {\n return props.rules.length > 0;\n },\n get children() {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$2, \"onMouseDown\", () => props.onToggle());\n _$insert(_el$3, () => props.open ? '▼' : '▶');\n _$insert(_el$4, () => props.title, null);\n _$insert(_el$4, _$createComponent(Show, {\n get when() {\n return !props.open;\n },\n get children() {\n var _el$5 = _$createElement(\"span\"),\n _el$6 = _$createTextNode(` `);\n _$insertNode(_el$5, _el$6);\n _$insert(_el$5, headerCount, null);\n _$effect(_$p => _$setProp(_el$5, \"style\", {\n fg: props.theme.textMuted\n }, _$p));\n return _el$5;\n }\n }), null);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return props.open;\n },\n get children() {\n return _$createComponent(For, {\n get each() {\n return props.rules;\n },\n children: (rule, localIndex) => {\n const globalIndex = () => props.globalOffset + localIndex();\n return (() => {\n var _el$7 = _$createElement(\"box\"),\n _el$8 = _$createElement(\"box\"),\n _el$9 = _$createElement(\"text\"),\n _el$1 = _$createElement(\"text\");\n _$insertNode(_el$7, _el$8);\n _$setProp(_el$7, \"flexDirection\", \"column\");\n _$setProp(_el$7, \"onMouseDown\", () => props.onExpandToggle(globalIndex()));\n _$insertNode(_el$8, _el$9);\n _$insertNode(_el$8, _el$1);\n _$setProp(_el$8, \"flexDirection\", \"row\");\n _$setProp(_el$8, \"gap\", 1);\n _$insertNode(_el$9, _$createTextNode(`•`));\n _$insert(_el$1, () => rule.name);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.expandedIndex === globalIndex();\n },\n get children() {\n var _el$10 = _$createElement(\"box\"),\n _el$11 = _$createElement(\"text\");\n _$insertNode(_el$10, _el$11);\n _$setProp(_el$10, \"flexDirection\", \"column\");\n _$setProp(_el$10, \"paddingLeft\", 4);\n _$insert(_el$11, () => rule.path);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.globs?.length ?? 0) > 0;\n },\n get children() {\n var _el$12 = _$createElement(\"text\"),\n _el$13 = _$createTextNode(`Globs: `);\n _$insertNode(_el$12, _el$13);\n _$insert(_el$12, () => rule.metadata.globs.join(', '), null);\n _$effect(_$p => _$setProp(_el$12, \"fg\", props.theme.textMuted, _$p));\n return _el$12;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.keywords?.length ?? 0) > 0;\n },\n get children() {\n var _el$14 = _$createElement(\"text\"),\n _el$15 = _$createTextNode(`Keywords: `);\n _$insertNode(_el$14, _el$15);\n _$insert(_el$14, () => rule.metadata.keywords.join(', '), null);\n _$effect(_$p => _$setProp(_el$14, \"fg\", props.theme.textMuted, _$p));\n return _el$14;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.tools?.length ?? 0) > 0;\n },\n get children() {\n var _el$16 = _$createElement(\"text\"),\n _el$17 = _$createTextNode(`Tools: `);\n _$insertNode(_el$16, _el$17);\n _$insert(_el$16, () => rule.metadata.tools.join(', '), null);\n _$effect(_$p => _$setProp(_el$16, \"fg\", props.theme.textMuted, _$p));\n return _el$16;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.model?.length ?? 0) > 0;\n },\n get children() {\n var _el$18 = _$createElement(\"text\"),\n _el$19 = _$createTextNode(`Model: `);\n _$insertNode(_el$18, _el$19);\n _$insert(_el$18, () => rule.metadata.model.join(', '), null);\n _$effect(_$p => _$setProp(_el$18, \"fg\", props.theme.textMuted, _$p));\n return _el$18;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.agent?.length ?? 0) > 0;\n },\n get children() {\n var _el$20 = _$createElement(\"text\"),\n _el$21 = _$createTextNode(`Agent: `);\n _$insertNode(_el$20, _el$21);\n _$insert(_el$20, () => rule.metadata.agent.join(', '), null);\n _$effect(_$p => _$setProp(_el$20, \"fg\", props.theme.textMuted, _$p));\n return _el$20;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.command?.length ?? 0) > 0;\n },\n get children() {\n var _el$22 = _$createElement(\"text\"),\n _el$23 = _$createTextNode(`Command: `);\n _$insertNode(_el$22, _el$23);\n _$insert(_el$22, () => rule.metadata.command.join(', '), null);\n _$effect(_$p => _$setProp(_el$22, \"fg\", props.theme.textMuted, _$p));\n return _el$22;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.project?.length ?? 0) > 0;\n },\n get children() {\n var _el$24 = _$createElement(\"text\"),\n _el$25 = _$createTextNode(`Project: `);\n _$insertNode(_el$24, _el$25);\n _$insert(_el$24, () => rule.metadata.project.join(', '), null);\n _$effect(_$p => _$setProp(_el$24, \"fg\", props.theme.textMuted, _$p));\n return _el$24;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.branch?.length ?? 0) > 0;\n },\n get children() {\n var _el$26 = _$createElement(\"text\"),\n _el$27 = _$createTextNode(`Branch: `);\n _$insertNode(_el$26, _el$27);\n _$insert(_el$26, () => rule.metadata.branch.join(', '), null);\n _$effect(_$p => _$setProp(_el$26, \"fg\", props.theme.textMuted, _$p));\n return _el$26;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return (rule.metadata.os?.length ?? 0) > 0;\n },\n get children() {\n var _el$28 = _$createElement(\"text\"),\n _el$29 = _$createTextNode(`OS: `);\n _$insertNode(_el$28, _el$29);\n _$insert(_el$28, () => rule.metadata.os.join(', '), null);\n _$effect(_$p => _$setProp(_el$28, \"fg\", props.theme.textMuted, _$p));\n return _el$28;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return rule.metadata.ci !== undefined;\n },\n get children() {\n var _el$30 = _$createElement(\"text\"),\n _el$31 = _$createTextNode(`CI: `);\n _$insertNode(_el$30, _el$31);\n _$insert(_el$30, () => String(rule.metadata.ci), null);\n _$effect(_$p => _$setProp(_el$30, \"fg\", props.theme.textMuted, _$p));\n return _el$30;\n }\n }), null);\n _$insert(_el$10, _$createComponent(Show, {\n get when() {\n return rule.metadata.match;\n },\n get children() {\n var _el$32 = _$createElement(\"text\"),\n _el$33 = _$createTextNode(`Match: `);\n _$insertNode(_el$32, _el$33);\n _$insert(_el$32, () => rule.metadata.match, null);\n _$effect(_$p => _$setProp(_el$32, \"fg\", props.theme.textMuted, _$p));\n return _el$32;\n }\n }), null);\n _$effect(_$p => _$setProp(_el$11, \"fg\", props.theme.textMuted, _$p));\n return _el$10;\n }\n }), null);\n _$effect(_p$ => {\n var _v$3 = bulletColor(rule),\n _v$4 = props.theme.text;\n _v$3 !== _p$.e && (_p$.e = _$setProp(_el$9, \"fg\", _v$3, _p$.e));\n _v$4 !== _p$.t && (_p$.t = _$setProp(_el$1, \"fg\", _v$4, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$7;\n })();\n }\n });\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = props.theme.text,\n _v$2 = props.theme.text;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n }\n });\n}\nexport function SidebarContent(props) {\n const [rules, setRules] = createSignal([]);\n const [status, setStatus] = createSignal('loading');\n const [skippedCount, setSkippedCount] = createSignal(0);\n const [hasEvaluationState, setHasEvaluationState] = createSignal(false);\n const [expandedIndex, setExpandedIndex] = createSignal(null);\n const [lastDir, setLastDir] = createSignal(undefined);\n const [lastSessionId, setLastSessionId] = createSignal(undefined);\n const [projectOpen, setProjectOpen] = createSignal(false);\n const [globalOpen, setGlobalOpen] = createSignal(false);\n const [refreshCounter, setRefreshCounter] = createSignal(0);\n const theme = () => props.theme.current;\n const resolveProjectDir = () => {\n return props.api.state.path.directory ?? null;\n };\n\n // Monotonic counter to detect stale async results\n let requestId = 0;\n // Debounce timer for event-driven refresh\n let debounceTimer = null;\n\n // Initial load: triggered by session/directory change, resets all UI state\n const loadRulesInitial = async () => {\n const thisRequest = ++requestId;\n const dir = resolveProjectDir();\n const sessionId = props.sessionId;\n setLastDir(dir);\n setLastSessionId(sessionId);\n setStatus('loading');\n try {\n const result = await loadSidebarRules(dir, sessionId);\n // Discard if a newer request started\n if (requestId !== thisRequest) return;\n setRules(result.rules);\n setSkippedCount(result.skippedCount);\n setHasEvaluationState(result.hasEvaluationState);\n setStatus('loaded');\n } catch (err) {\n // Discard if a newer request started\n if (requestId !== thisRequest) return;\n console.error('[opencode-rules-md] Failed to load rules:', err);\n setStatus('error');\n }\n };\n\n // Refresh load: triggered by events, only updates rule data (no UI state reset)\n const loadRulesRefresh = async () => {\n // Skip refresh if initial load is still in flight\n if (status() === 'loading') return;\n const thisRequest = ++requestId;\n const dir = resolveProjectDir();\n const sessionId = props.sessionId;\n try {\n const result = await loadSidebarRules(dir, sessionId);\n // Discard if a newer request started\n if (requestId !== thisRequest) return;\n setRules(result.rules);\n setSkippedCount(result.skippedCount);\n setHasEvaluationState(result.hasEvaluationState);\n setStatus('loaded');\n } catch (err) {\n // Discard if a newer request started\n if (requestId !== thisRequest) return;\n console.error('[opencode-rules-md] Failed to refresh rules:', err);\n }\n };\n\n // Effect 1: Initial load on session/directory change\n createEffect(() => {\n const currentSessionId = props.sessionId;\n const currentDir = resolveProjectDir();\n\n // Check if session or directory changed\n if (currentSessionId !== lastSessionId() || currentDir !== lastDir()) {\n // Clear pending debounce from previous session\n if (debounceTimer !== null) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n // Reset UI state on session/directory change\n setExpandedIndex(null);\n setProjectOpen(false);\n setGlobalOpen(false);\n void loadRulesInitial();\n }\n });\n\n // Effect 2: Refresh on event-driven updates (refreshCounter changes)\n createEffect(() => {\n const counter = refreshCounter();\n if (counter > 0) {\n void loadRulesRefresh();\n }\n });\n\n // Subscribe to OpenCode events with debounce\n const triggerRefresh = event => {\n // Filter events to current sessionId before debouncing\n // OpenCode SDK events nest sessionID inside properties: { type, properties: { sessionID, ... } }\n const eventSessionID = event.properties.sessionID;\n if (typeof eventSessionID === 'string' && eventSessionID !== props.sessionId) {\n return;\n }\n if (debounceTimer !== null) {\n clearTimeout(debounceTimer);\n }\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n setRefreshCounter(c => c + 1);\n }, 150);\n };\n const unsubMessageUpdated = props.api.event.on('message.updated', triggerRefresh);\n const unsubSessionStatus = props.api.event.on('session.status', triggerRefresh);\n onCleanup(() => {\n if (debounceTimer !== null) {\n clearTimeout(debounceTimer);\n }\n unsubMessageUpdated();\n unsubSessionStatus();\n });\n const toggleExpand = index => {\n setExpandedIndex(prev => prev === index ? null : index);\n };\n const projectRules = createMemo(() => rules().filter(r => r.source === 'project'));\n const globalRules = createMemo(() => rules().filter(r => r.source === 'global'));\n return (() => {\n var _el$34 = _$createElement(\"box\"),\n _el$35 = _$createElement(\"text\"),\n _el$36 = _$createElement(\"b\");\n _$insertNode(_el$34, _el$35);\n _$insertNode(_el$35, _el$36);\n _$insertNode(_el$36, _$createTextNode(`Rules`));\n _$insert(_el$34, _$createComponent(Show, {\n get when() {\n return status() === 'loading';\n },\n get children() {\n var _el$38 = _$createElement(\"text\");\n _$insertNode(_el$38, _$createTextNode(`Loading...`));\n _$effect(_$p => _$setProp(_el$38, \"fg\", theme().textMuted, _$p));\n return _el$38;\n }\n }), null);\n _$insert(_el$34, _$createComponent(Show, {\n get when() {\n return status() === 'error';\n },\n get children() {\n var _el$40 = _$createElement(\"text\");\n _$insertNode(_el$40, _$createTextNode(`Failed to load rules`));\n _$effect(_$p => _$setProp(_el$40, \"fg\", theme().textMuted, _$p));\n return _el$40;\n }\n }), null);\n _$insert(_el$34, _$createComponent(Show, {\n get when() {\n return status() === 'loaded';\n },\n get children() {\n return [_$createComponent(Show, {\n get when() {\n return rules().length > 0;\n },\n get fallback() {\n return (() => {\n var _el$44 = _$createElement(\"text\");\n _$insertNode(_el$44, _$createTextNode(`No rules found`));\n _$effect(_$p => _$setProp(_el$44, \"fg\", theme().textMuted, _$p));\n return _el$44;\n })();\n },\n get children() {\n return [_$createComponent(RuleSection, {\n title: \"Project\",\n get rules() {\n return projectRules();\n },\n get theme() {\n return theme();\n },\n get open() {\n return projectOpen();\n },\n onToggle: () => setProjectOpen(x => !x),\n get expandedIndex() {\n return expandedIndex();\n },\n globalOffset: 0,\n onExpandToggle: toggleExpand,\n get hasEvaluationState() {\n return hasEvaluationState();\n }\n }), _$createComponent(RuleSection, {\n title: \"Global\",\n get rules() {\n return globalRules();\n },\n get theme() {\n return theme();\n },\n get open() {\n return globalOpen();\n },\n onToggle: () => setGlobalOpen(x => !x),\n get expandedIndex() {\n return expandedIndex();\n },\n get globalOffset() {\n return projectRules().length;\n },\n onExpandToggle: toggleExpand,\n get hasEvaluationState() {\n return hasEvaluationState();\n }\n })];\n }\n }), _$createComponent(Show, {\n get when() {\n return skippedCount() > 0;\n },\n get children() {\n var _el$42 = _$createElement(\"text\"),\n _el$43 = _$createTextNode(` rules skipped (unreadable)`);\n _$insertNode(_el$42, _el$43);\n _$insert(_el$42, skippedCount, _el$43);\n _$effect(_$p => _$setProp(_el$42, \"fg\", theme().textMuted, _$p));\n return _el$42;\n }\n })];\n }\n }), null);\n _$effect(_$p => _$setProp(_el$35, \"fg\", theme().text, _$p));\n return _el$34;\n })();\n}",
7
- "/**\n * Rule file discovery utilities\n */\n\nimport { stat, readFile, readdir } from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\nimport { createDebugLog } from './debug.js';\nimport {\n parseRuleMetadata,\n stripFrontmatter,\n type RuleMetadata,\n} from './rule-metadata.js';\n\nconst debugLog = createDebugLog();\n\n/**\n * Cached rule data for performance optimization\n */\ninterface CachedRule {\n /** Raw file content */\n content: string;\n /** Parsed metadata from frontmatter */\n metadata: RuleMetadata | undefined;\n /** Content with frontmatter stripped */\n strippedContent: string;\n /** File modification time for cache invalidation */\n mtime: number;\n}\n\n/**\n * Rule cache keyed by absolute file path\n */\nconst ruleCache = new Map<string, CachedRule>();\n\n/**\n * Clear the rule cache (useful for testing or manual invalidation)\n */\nexport function clearRuleCache(): void {\n ruleCache.clear();\n}\n\n/**\n * Get cached rule data, refreshing from disk if file has changed.\n * Uses mtime-based invalidation to detect file changes.\n *\n * @param filePath - Absolute path to the rule file\n * @returns Cached rule data or undefined if file cannot be read\n */\nexport async function getCachedRule(\n filePath: string\n): Promise<CachedRule | undefined> {\n try {\n const stats = await stat(filePath);\n const mtime = stats.mtimeMs;\n\n // Check if we have a valid cached entry\n const cached = ruleCache.get(filePath);\n if (cached && cached.mtime === mtime) {\n debugLog(`Cache hit: ${filePath}`);\n return cached;\n }\n\n // Read and cache the file\n debugLog(`Cache miss: ${filePath}`);\n const content = await readFile(filePath, 'utf-8');\n const metadata = parseRuleMetadata(content);\n const strippedContent = stripFrontmatter(content);\n\n const entry: CachedRule = {\n content,\n metadata,\n strippedContent,\n mtime,\n };\n\n ruleCache.set(filePath, entry);\n return entry;\n } catch (error) {\n // Remove stale cache entry if file no longer exists\n ruleCache.delete(filePath);\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to read rule file ${filePath}: ${message}`\n );\n return undefined;\n }\n}\n\n/**\n * Get the global rules directory path\n */\nfunction getGlobalRulesDir(): string | null {\n const opencodeConfigDir = process.env.OPENCODE_CONFIG_DIR;\n if (opencodeConfigDir) {\n return path.join(opencodeConfigDir, 'rules');\n }\n\n const xdgConfigHome = process.env.XDG_CONFIG_HOME;\n if (xdgConfigHome) {\n return path.join(xdgConfigHome, 'opencode', 'rules');\n }\n\n const homeDir = process.env.HOME || os.homedir();\n return path.join(homeDir, '.config', 'opencode', 'rules');\n}\n\n/**\n * Recursively scan a directory for markdown rule files\n * Skips hidden files and directories (starting with .)\n * @param dir - Directory to scan\n * @param baseDir - Base directory for relative path calculation\n * @returns Array of discovered file paths with their relative paths from baseDir\n */\nasync function scanDirectoryRecursively(\n dir: string,\n baseDir: string\n): Promise<Array<{ filePath: string; relativePath: string }>> {\n const results: Array<{ filePath: string; relativePath: string }> = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n // Skip hidden files and directories\n if (entry.name.startsWith('.')) {\n continue;\n }\n\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Recurse into subdirectory\n results.push(...(await scanDirectoryRecursively(fullPath, baseDir)));\n } else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdc')) {\n // Add markdown file\n const relativePath = path.relative(baseDir, fullPath);\n results.push({ filePath: fullPath, relativePath });\n }\n }\n } catch (error) {\n // Treat ENOENT as benign (directory doesn't exist or was deleted)\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return results;\n }\n // Log non-ENOENT directory read errors\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to read directory ${dir}: ${message}`\n );\n }\n\n return results;\n}\n\n/**\n * Discovered rule file with both absolute and relative paths\n */\nexport interface DiscoveredRule {\n /** Absolute path to the rule file */\n filePath: string;\n /** Relative path from the rules directory root (for unique headings) */\n relativePath: string;\n}\n\n/**\n * Discover markdown rule files from standard directories\n * Searches recursively in:\n * - $OPENCODE_CONFIG_DIR/rules/ (highest priority)\n * - $XDG_CONFIG_HOME/opencode/rules/ (or ~/.config/opencode/rules as fallback)\n * - .opencode/rules/ (in project directory if provided)\n * Finds all .md and .mdc files including nested subdirectories.\n */\nexport async function discoverRuleFiles(\n projectDir?: string\n): Promise<DiscoveredRule[]> {\n const files: DiscoveredRule[] = [];\n\n // Discover global rules (recursively)\n const globalRulesDir = getGlobalRulesDir();\n if (globalRulesDir) {\n const globalRules = await scanDirectoryRecursively(\n globalRulesDir,\n globalRulesDir\n );\n for (const { filePath, relativePath } of globalRules) {\n debugLog(`Discovered global rule: ${relativePath} (${filePath})`);\n files.push({ filePath, relativePath });\n }\n }\n\n // Discover project-local rules (recursively) if project directory is provided\n if (projectDir) {\n const projectRulesDir = path.join(projectDir, '.opencode', 'rules');\n const projectRules = await scanDirectoryRecursively(\n projectRulesDir,\n projectRulesDir\n );\n for (const { filePath, relativePath } of projectRules) {\n debugLog(`Discovered project rule: ${relativePath} (${filePath})`);\n files.push({ filePath, relativePath });\n }\n }\n\n return files;\n}\n",
7
+ "/**\n * Rule file discovery utilities\n */\n\nimport { stat, readFile, readdir } from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\nimport { createDebugLog } from './debug.js';\nimport {\n parseRuleMetadata,\n stripFrontmatter,\n type RuleMetadata,\n} from './rule-metadata.js';\n\nconst debugLog = createDebugLog();\n\n/**\n * Cached rule data for performance optimization\n */\ninterface CachedRule {\n /** Raw file content */\n content: string;\n /** Parsed metadata from frontmatter */\n metadata: RuleMetadata | undefined;\n /** Content with frontmatter stripped */\n strippedContent: string;\n /** File modification time for cache invalidation */\n mtime: number;\n}\n\n/**\n * Rule cache keyed by absolute file path\n */\nconst ruleCache = new Map<string, CachedRule>();\n\n/**\n * Clear the rule cache (useful for testing or manual invalidation)\n */\nexport function clearRuleCache(): void {\n ruleCache.clear();\n}\n\n/**\n * Get cached rule data, refreshing from disk if file has changed.\n * Uses mtime-based invalidation to detect file changes.\n *\n * @param filePath - Absolute path to the rule file\n * @returns Cached rule data or undefined if file cannot be read\n */\nexport async function getCachedRule(\n filePath: string\n): Promise<CachedRule | undefined> {\n try {\n const stats = await stat(filePath);\n const mtime = stats.mtimeMs;\n\n // Check if we have a valid cached entry\n const cached = ruleCache.get(filePath);\n if (cached && cached.mtime === mtime) {\n debugLog(`Cache hit: ${filePath}`);\n return cached;\n }\n\n // Read and cache the file\n debugLog(`Cache miss: ${filePath}`);\n const content = await readFile(filePath, 'utf-8');\n const metadata = parseRuleMetadata(content);\n const strippedContent = stripFrontmatter(content);\n\n const entry: CachedRule = {\n content,\n metadata,\n strippedContent,\n mtime,\n };\n\n ruleCache.set(filePath, entry);\n return entry;\n } catch (error) {\n // Remove stale cache entry if file no longer exists\n ruleCache.delete(filePath);\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to read rule file ${filePath}: ${message}`\n );\n return undefined;\n }\n}\n\n/**\n * Get the global rules directory path\n */\nfunction getGlobalRulesDir(): string | null {\n const opencodeConfigDir = process.env.OPENCODE_CONFIG_DIR;\n if (opencodeConfigDir) {\n return path.join(opencodeConfigDir, 'rules');\n }\n\n const xdgConfigHome = process.env.XDG_CONFIG_HOME;\n if (xdgConfigHome) {\n return path.join(xdgConfigHome, 'opencode', 'rules');\n }\n\n const homeDir = process.env.HOME || os.homedir();\n return path.join(homeDir, '.config', 'opencode', 'rules');\n}\n\n/**\n * Recursively scan a directory for markdown rule files\n * Skips hidden files and directories (starting with .)\n * @param dir - Directory to scan\n * @param baseDir - Base directory for relative path calculation\n * @returns Array of discovered file paths with their relative paths from baseDir\n */\nasync function scanDirectoryRecursively(\n dir: string,\n baseDir: string\n): Promise<Array<{ filePath: string; relativePath: string }>> {\n const results: Array<{ filePath: string; relativePath: string }> = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n // Skip hidden files and directories\n if (entry.name.startsWith('.')) {\n continue;\n }\n\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Recurse into subdirectory\n results.push(...(await scanDirectoryRecursively(fullPath, baseDir)));\n } else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdc')) {\n // Add markdown file\n const relativePath = path.relative(baseDir, fullPath);\n results.push({ filePath: fullPath, relativePath });\n }\n }\n } catch (error) {\n // Treat ENOENT as benign (directory doesn't exist or was deleted)\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return results;\n }\n // Log non-ENOENT directory read errors\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to read directory ${dir}: ${message}`\n );\n }\n\n return results;\n}\n\n/**\n * Discovered rule file with both absolute and relative paths\n */\nexport interface DiscoveredRule {\n /** Absolute path to the rule file */\n filePath: string;\n /** Relative path from the rules directory root (for unique headings) */\n relativePath: string;\n}\n\n/**\n * Discover markdown rule files from standard directories\n * Searches recursively in:\n * - $OPENCODE_CONFIG_DIR/rules/ (highest priority)\n * - $XDG_CONFIG_HOME/opencode/rules/ (or ~/.config/opencode/rules as fallback)\n * - .opencode/rules/ (in project directory if provided)\n * Finds all .md and .mdc files including nested subdirectories.\n */\nexport async function discoverRuleFiles(\n projectDir?: string\n): Promise<DiscoveredRule[]> {\n // Keyed by relativePath; later insertions shadow earlier ones.\n // Global rules are inserted first (lowest precedence); project-local rules\n // are inserted after and overwrite any global entry sharing the same key.\n const byRelativePath = new Map<string, DiscoveredRule>();\n\n // Discover global rules (recursively) — inserted first (lowest precedence).\n const globalRulesDir = getGlobalRulesDir();\n if (globalRulesDir) {\n const globalRules = await scanDirectoryRecursively(\n globalRulesDir,\n globalRulesDir\n );\n for (const rule of globalRules) {\n debugLog(\n `Discovered global rule: ${rule.relativePath} (${rule.filePath})`\n );\n byRelativePath.set(rule.relativePath, rule);\n }\n }\n\n // Discover project-local rules (recursively) shadow global duplicates.\n if (projectDir) {\n const projectRulesDir = path.join(projectDir, '.opencode', 'rules');\n const projectRules = await scanDirectoryRecursively(\n projectRulesDir,\n projectRulesDir\n );\n for (const rule of projectRules) {\n const shadowed = byRelativePath.has(rule.relativePath);\n debugLog(\n `Discovered project rule: ${rule.relativePath} (${rule.filePath})` +\n (shadowed ? ' [shadows global]' : '')\n );\n byRelativePath.set(rule.relativePath, rule);\n }\n }\n\n // Map preserves insertion order in JS, so global rules keep their relative\n // order and shadowed slots retain their original position but point at the\n // project file.\n return Array.from(byRelativePath.values());\n}\n",
8
8
  "export type DebugLog = (message: string) => void;\n\nexport function createDebugLog(prefix = '[opencode-rules-md]'): DebugLog {\n return (message: string): void => {\n if (process.env.OPENCODE_RULES_DEBUG) {\n console.debug(`${prefix} ${message}`);\n }\n };\n}\n",
9
- "/**\n * Rule metadata parsing and frontmatter extraction\n */\n\nconst { parse: parseYaml } = await import('yaml');\n\n/**\n * Metadata extracted from .mdc file frontmatter\n */\nexport interface RuleMetadata {\n globs?: string[];\n keywords?: string[];\n tools?: string[];\n model?: string[];\n agent?: string[];\n command?: string[];\n project?: string[];\n branch?: string[];\n os?: string[];\n ci?: boolean;\n match?: 'any' | 'all';\n}\n\n/**\n * Raw parsed YAML frontmatter structure\n */\ninterface ParsedFrontmatter {\n globs?: unknown;\n keywords?: unknown;\n tools?: unknown;\n model?: unknown;\n agent?: unknown;\n command?: unknown;\n project?: unknown;\n branch?: unknown;\n os?: unknown;\n ci?: unknown;\n match?: unknown;\n}\n\n/** Field names in ParsedFrontmatter that are string arrays */\ntype StringArrayField =\n | 'globs'\n | 'keywords'\n | 'tools'\n | 'model'\n | 'agent'\n | 'command'\n | 'project'\n | 'branch'\n | 'os';\n\n/**\n * Extract and normalize a string array from parsed frontmatter.\n * Filters non-strings, trims whitespace, and removes empty values.\n *\n * @param value - Raw value from parsed YAML (may be array or undefined)\n * @returns Normalized string array, or undefined if empty after filtering\n */\nfunction extractStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const result = value\n .filter((v): v is string => typeof v === 'string')\n .map(v => v.trim())\n .filter(v => v.length > 0);\n return result.length > 0 ? result : undefined;\n}\n\n/**\n * Parse YAML metadata from rule file content using the yaml package.\n * Extracts frontmatter (---) and returns metadata object.\n */\nexport function parseRuleMetadata(content: string): RuleMetadata | undefined {\n // Check if content starts with frontmatter\n if (!content.startsWith('---')) {\n return undefined;\n }\n\n // Find the closing --- marker\n const endIndex = content.indexOf('---', 3);\n if (endIndex === -1) {\n return undefined;\n }\n\n // Extract the YAML frontmatter\n const frontmatter = content.substring(3, endIndex).trim();\n if (!frontmatter) {\n return undefined;\n }\n\n try {\n // Parse YAML using the yaml package\n const parsed = parseYaml(frontmatter) as ParsedFrontmatter | null;\n if (!parsed || typeof parsed !== 'object') {\n return undefined;\n }\n\n const metadata: RuleMetadata = {};\n\n // Array fields to extract using shared helper\n const arrayFields: StringArrayField[] = [\n 'globs',\n 'keywords',\n 'tools',\n 'model',\n 'agent',\n 'command',\n 'project',\n 'branch',\n 'os',\n ];\n\n for (const field of arrayFields) {\n const extracted = extractStringArray(parsed[field]);\n if (extracted) {\n metadata[field] = extracted;\n }\n }\n\n // Extract ci boolean (only if strictly boolean)\n if (typeof parsed.ci === 'boolean') {\n metadata.ci = parsed.ci;\n }\n\n // Extract match (normalize to 'any' | 'all' only)\n if (parsed.match === 'any' || parsed.match === 'all') {\n metadata.match = parsed.match;\n }\n\n // Return metadata only if it has content\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n } catch (error) {\n // Log warning for YAML parsing errors\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to parse YAML frontmatter: ${message}`\n );\n return undefined;\n }\n}\n\n/**\n * Strip YAML frontmatter from rule content\n */\nexport function stripFrontmatter(content: string): string {\n // Check if content starts with frontmatter\n if (!content.startsWith('---')) {\n return content;\n }\n\n // Find the closing --- marker\n const endIndex = content.indexOf('---', 3);\n if (endIndex === -1) {\n return content;\n }\n\n // Return content after the closing marker, trimming leading newline\n return content.substring(endIndex + 3).trimStart();\n}\n",
9
+ "/**\n * Rule metadata parsing and frontmatter extraction\n */\n\nconst { parse: parseYaml } = await import('yaml');\n\n/**\n * Metadata extracted from .mdc file frontmatter\n */\nexport interface RuleMetadata {\n globs?: string[];\n keywords?: string[];\n tools?: string[];\n model?: string[];\n agent?: string[];\n command?: string[];\n project?: string[];\n branch?: string[];\n os?: string[];\n ci?: boolean;\n match?: 'any' | 'all';\n /** Higher priority is kept first when a token budget is enforced. Default 0. */\n priority?: number;\n}\n\n/**\n * Raw parsed YAML frontmatter structure\n */\ninterface ParsedFrontmatter {\n globs?: unknown;\n keywords?: unknown;\n tools?: unknown;\n model?: unknown;\n agent?: unknown;\n command?: unknown;\n project?: unknown;\n branch?: unknown;\n os?: unknown;\n ci?: unknown;\n match?: unknown;\n priority?: unknown;\n}\n\n/** Field names in ParsedFrontmatter that are string arrays */\ntype StringArrayField =\n | 'globs'\n | 'keywords'\n | 'tools'\n | 'model'\n | 'agent'\n | 'command'\n | 'project'\n | 'branch'\n | 'os';\n\n/**\n * Extract and normalize a string array from parsed frontmatter.\n * Filters non-strings, trims whitespace, and removes empty values.\n *\n * @param value - Raw value from parsed YAML (may be array or undefined)\n * @returns Normalized string array, or undefined if empty after filtering\n */\nfunction extractStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const result = value\n .filter((v): v is string => typeof v === 'string')\n .map(v => v.trim())\n .filter(v => v.length > 0);\n return result.length > 0 ? result : undefined;\n}\n\n/**\n * Parse YAML metadata from rule file content using the yaml package.\n * Extracts frontmatter (---) and returns metadata object.\n */\nexport function parseRuleMetadata(content: string): RuleMetadata | undefined {\n // Check if content starts with frontmatter\n if (!content.startsWith('---')) {\n return undefined;\n }\n\n // Find the closing --- marker\n const endIndex = content.indexOf('---', 3);\n if (endIndex === -1) {\n return undefined;\n }\n\n // Extract the YAML frontmatter\n const frontmatter = content.substring(3, endIndex).trim();\n if (!frontmatter) {\n return undefined;\n }\n\n try {\n // Parse YAML using the yaml package\n const parsed = parseYaml(frontmatter) as ParsedFrontmatter | null;\n if (!parsed || typeof parsed !== 'object') {\n return undefined;\n }\n\n const metadata: RuleMetadata = {};\n\n // Array fields to extract using shared helper\n const arrayFields: StringArrayField[] = [\n 'globs',\n 'keywords',\n 'tools',\n 'model',\n 'agent',\n 'command',\n 'project',\n 'branch',\n 'os',\n ];\n\n for (const field of arrayFields) {\n const extracted = extractStringArray(parsed[field]);\n if (extracted) {\n metadata[field] = extracted;\n }\n }\n\n // Extract ci boolean (only if strictly boolean)\n if (typeof parsed.ci === 'boolean') {\n metadata.ci = parsed.ci;\n }\n\n // Extract match (normalize to 'any' | 'all' only)\n if (parsed.match === 'any' || parsed.match === 'all') {\n metadata.match = parsed.match;\n }\n\n // Extract priority (finite numbers only; non-finite or absent becomes undefined, treated as 0 downstream)\n if (typeof parsed.priority === 'number' && Number.isFinite(parsed.priority)) {\n metadata.priority = parsed.priority;\n }\n\n // Return metadata only if it has content\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n } catch (error) {\n // Log warning for YAML parsing errors\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `[opencode-rules-md] Warning: Failed to parse YAML frontmatter: ${message}`\n );\n return undefined;\n }\n}\n\n/**\n * Strip YAML frontmatter from rule content\n */\nexport function stripFrontmatter(content: string): string {\n // Check if content starts with frontmatter\n if (!content.startsWith('---')) {\n return content;\n }\n\n // Find the closing --- marker\n const endIndex = content.indexOf('---', 3);\n if (endIndex === -1) {\n return content;\n }\n\n // Return content after the closing marker, trimming leading newline\n return content.substring(endIndex + 3).trimStart();\n}\n",
10
10
  "import * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as crypto from 'node:crypto';\nimport { createDebugLog } from './debug.js';\n\nconst debugLog = createDebugLog();\n\nexport interface ActiveRulesState {\n sessionId: string;\n matchedRulePaths: string[];\n evaluatedAt: number;\n}\n\n// Per-session write queue to serialize concurrent writes\nconst writeQueues = new Map<string, Promise<void>>();\n\n// Allows tests to override the state directory\nlet stateDirOverride: string | null = null;\n\n// Strict pattern for safe sessionId: alphanumeric, underscore, hyphen only\nconst SAFE_SESSION_ID_PATTERN = /^[A-Za-z0-9_-]+$/;\n\nfunction isValidSessionId(sessionId: string): boolean {\n return SAFE_SESSION_ID_PATTERN.test(sessionId);\n}\n\n/** @internal Test-only: override the state directory */\nexport function _setStateDirForTesting(dir: string | null): void {\n stateDirOverride = dir;\n}\n\nexport function resolveStateDir(): string {\n if (stateDirOverride !== null) {\n return stateDirOverride;\n }\n return path.join(os.homedir(), '.opencode', 'state', 'opencode-rules-md');\n}\n\nexport function getStateFilePath(sessionId: string): string {\n if (!isValidSessionId(sessionId)) {\n throw new Error(`Invalid sessionId: ${sessionId}`);\n }\n return path.join(resolveStateDir(), `${sessionId}.json`);\n}\n\nexport function writeActiveRulesState(\n sessionId: string,\n matchedPaths: string[]\n): void {\n if (!isValidSessionId(sessionId)) {\n debugLog(`Invalid sessionId rejected: ${sessionId}`);\n return;\n }\n\n const state: ActiveRulesState = {\n sessionId,\n matchedRulePaths: matchedPaths,\n evaluatedAt: Date.now(),\n };\n\n // Chain onto existing queue for this session, or start fresh\n const previousWrite = writeQueues.get(sessionId) ?? Promise.resolve();\n\n const currentWrite = previousWrite.then(async () => {\n await doAtomicWrite(sessionId, state);\n });\n\n writeQueues.set(sessionId, currentWrite);\n\n // Fire-and-forget: catch errors to prevent unhandled rejection\n currentWrite.catch(() => {\n // Errors already logged in doAtomicWrite\n });\n}\n\nasync function doAtomicWrite(\n sessionId: string,\n state: ActiveRulesState\n): Promise<void> {\n const stateDir = resolveStateDir();\n const finalPath = getStateFilePath(sessionId);\n const tempPath = path.join(\n stateDir,\n `.${sessionId}-${crypto.randomBytes(8).toString('hex')}.tmp`\n );\n\n try {\n // Ensure directory exists\n await fs.mkdir(stateDir, { recursive: true });\n\n // Write to temp file\n const content = JSON.stringify(state);\n await fs.writeFile(tempPath, content, 'utf-8');\n\n // Atomic rename\n await fs.rename(tempPath, finalPath);\n } catch (error) {\n debugLog(\n `Failed to write active rules state for session ${sessionId}: ${error}`\n );\n\n // Clean up temp file if it exists\n try {\n await fs.unlink(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\nexport async function readActiveRulesState(\n sessionId: string\n): Promise<ActiveRulesState | null> {\n if (!isValidSessionId(sessionId)) {\n debugLog(`Invalid sessionId rejected: ${sessionId}`);\n return null;\n }\n\n const filePath = getStateFilePath(sessionId);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(content);\n\n if (!isValidActiveRulesState(parsed)) {\n debugLog(`Invalid active rules state format for session ${sessionId}`);\n return null;\n }\n\n return parsed;\n } catch (error) {\n debugLog(\n `Failed to read active rules state for session ${sessionId}: ${error}`\n );\n return null;\n }\n}\n\nfunction isValidActiveRulesState(value: unknown): value is ActiveRulesState {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n if (typeof obj['sessionId'] !== 'string') {\n return false;\n }\n\n if (typeof obj['evaluatedAt'] !== 'number') {\n return false;\n }\n\n if (!Array.isArray(obj['matchedRulePaths'])) {\n return false;\n }\n\n for (const item of obj['matchedRulePaths']) {\n if (typeof item !== 'string') {\n return false;\n }\n }\n\n return true;\n}\n",
11
11
  "// tui/data/rules.ts\nimport { discoverRuleFiles, getCachedRule } from '../../src/rule-discovery.js';\nimport type { RuleMetadata } from '../../src/rule-metadata.js';\nimport { readActiveRulesState } from '../../src/active-rules-state.js';\nimport path from 'path';\n\n/** Represents a rule as displayed in the sidebar */\nexport interface SidebarRuleEntry {\n /** Display name (filename stem, disambiguated if needed) */\n name: string;\n /** Relative file path from the rules directory root */\n path: string;\n /** Whether this rule came from global or project-local rules dir */\n source: 'global' | 'project';\n /** Whether the rule has any conditional metadata */\n isConditional: boolean;\n /** Human-readable condition summary */\n conditionSummary: string;\n /** Full metadata for expanded view */\n metadata: RuleMetadata;\n /**\n * Active state of the rule.\n * - true: rule is active (matched by evaluation or unconditional without state file)\n * - false: rule is not active (not matched by evaluation)\n * - null: state not yet determined (conditional rule without state file)\n */\n isActive: boolean | null;\n}\n\nexport interface LoadSidebarRulesResult {\n rules: SidebarRuleEntry[];\n skippedCount: number;\n /** Whether active rules state was successfully read from disk */\n hasEvaluationState: boolean;\n}\n\n/**\n * Load all discovered rules formatted for sidebar display.\n * Reuses discoverRuleFiles/getCachedRule from the server plugin.\n *\n * @param projectDir - Project directory or null (global rules only)\n * @param sessionId - Optional session ID to read active rules state\n */\nexport async function loadSidebarRules(\n projectDir: string | null,\n sessionId?: string\n): Promise<LoadSidebarRulesResult> {\n // discoverRuleFiles accepts string | undefined, not null\n const discovered = await discoverRuleFiles(projectDir ?? undefined);\n\n // Read active rules state if sessionId provided\n const activeState = sessionId ? await readActiveRulesState(sessionId) : null;\n const hasEvaluationState = activeState !== null;\n const matchedPathsSet = hasEvaluationState\n ? new Set(activeState.matchedRulePaths)\n : null;\n\n const entries: SidebarRuleEntry[] = [];\n let skippedCount = 0;\n\n for (const rule of discovered) {\n const cached = await getCachedRule(rule.filePath);\n if (!cached) {\n // getCachedRule() already logs a warning for read failures,\n // so we only increment the counter here — no duplicate log.\n skippedCount++;\n continue;\n }\n\n const meta = cached.metadata;\n const source = ruleSource(rule.filePath, projectDir);\n const isConditional = hasConditions(meta);\n const conditionSummary = isConditional\n ? formatConditionSummary(meta!)\n : 'always active';\n\n // Determine isActive based on state file or fallback logic\n let isActive: boolean | null;\n if (matchedPathsSet !== null) {\n // With state file: check if this rule's absolute path is in matchedPaths\n isActive = matchedPathsSet.has(rule.filePath);\n } else {\n // Without state file: unconditional = true, conditional = null\n isActive = isConditional ? null : true;\n }\n\n entries.push({\n name: '', // placeholder — set in disambiguation pass\n path: rule.relativePath,\n source,\n isConditional,\n conditionSummary,\n metadata: meta ?? {},\n isActive,\n });\n }\n\n disambiguateNames(entries);\n\n // Sort: project first, then global. Active rules to top, then alpha by name.\n const activeOrder = (v: boolean | null): number =>\n v === true ? 0 : v === null ? 1 : 2;\n entries.sort((a, b) => {\n if (a.source !== b.source) return a.source === 'project' ? -1 : 1;\n const activeCmp = activeOrder(a.isActive) - activeOrder(b.isActive);\n if (activeCmp !== 0) return activeCmp;\n const nameCompare = a.name.localeCompare(b.name);\n if (nameCompare !== 0) return nameCompare;\n return a.path.localeCompare(b.path);\n });\n\n return { rules: entries, skippedCount, hasEvaluationState };\n}\n\n/**\n * Determine if a rule file is project-local or global.\n * Uses path.sep boundary check to avoid matching partial prefixes\n * (e.g., /project/.opencode/rules-extra/ should not match).\n */\nexport function ruleSource(\n filePath: string,\n projectDir: string | null\n): 'global' | 'project' {\n if (!projectDir) return 'global';\n const projectRulesPrefix =\n path.join(projectDir, '.opencode', 'rules') + path.sep;\n return filePath.startsWith(projectRulesPrefix) ? 'project' : 'global';\n}\n\n/**\n * Check if metadata has any conditional fields set.\n */\nexport function hasConditions(meta: RuleMetadata | undefined): boolean {\n if (!meta) return false;\n return !!(\n meta.globs ||\n meta.keywords ||\n meta.tools ||\n meta.model ||\n meta.agent ||\n meta.command ||\n meta.project ||\n meta.branch ||\n meta.os ||\n meta.ci !== undefined\n );\n}\n\n/**\n * Build a human-readable, comma-separated summary of active conditions.\n * E.g., \"globs: src/*.ts, keywords: auth, security\"\n */\nexport function formatConditionSummary(meta: RuleMetadata): string {\n const parts: string[] = [];\n\n const arrayFields: Array<[keyof RuleMetadata, string]> = [\n ['globs', 'globs'],\n ['keywords', 'keywords'],\n ['tools', 'tools'],\n ['model', 'model'],\n ['agent', 'agent'],\n ['command', 'command'],\n ['project', 'project'],\n ['branch', 'branch'],\n ['os', 'os'],\n ];\n\n for (const [field, label] of arrayFields) {\n const value = meta[field];\n if (Array.isArray(value) && value.length > 0) {\n parts.push(`${label}: ${(value as string[]).join(', ')}`);\n }\n }\n\n if (meta.ci !== undefined) {\n parts.push(`ci: ${String(meta.ci)}`);\n }\n\n if (meta.match) {\n parts.push(`match: ${meta.match}`);\n }\n\n return parts.join(', ');\n}\n\n/**\n * Three-pass name disambiguation.\n * Pass 1: Extract filename stem from each entry's path.\n * Pass 2: For duplicate stems, prefix with parent directory.\n * Pass 3: If still ambiguous (same parent or root-level), use full relative\n * path (including extension) as the display name.\n *\n * Mutates entries[].name in place.\n */\nexport function disambiguateNames(entries: SidebarRuleEntry[]): void {\n // Pass 1: assign stem names (filename without extension, using last dot)\n for (const entry of entries) {\n const basename = path.basename(entry.path);\n const dotIndex = basename.lastIndexOf('.');\n entry.name = dotIndex > 0 ? basename.substring(0, dotIndex) : basename;\n }\n\n // Pass 2: detect and resolve collisions with parent directory prefix\n const stemCounts = new Map<string, number>();\n for (const entry of entries) {\n stemCounts.set(entry.name, (stemCounts.get(entry.name) ?? 0) + 1);\n }\n\n for (const entry of entries) {\n if ((stemCounts.get(entry.name) ?? 0) <= 1) continue;\n\n const dir = path.dirname(entry.path);\n if (dir && dir !== '.') {\n const parent = path.basename(dir);\n entry.name = `${parent}/${entry.name}`;\n }\n }\n\n // Pass 3: if still ambiguous, use full relative path WITH extension\n const nameCounts = new Map<string, number>();\n for (const entry of entries) {\n nameCounts.set(entry.name, (nameCounts.get(entry.name) ?? 0) + 1);\n }\n\n for (const entry of entries) {\n if ((nameCounts.get(entry.name) ?? 0) > 1) {\n entry.name = entry.path;\n }\n }\n}\n"
12
12
  ],
13
- "mappings": "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",
14
- "debugId": "ED0F9EF9A8B9A40664756E2164756E21",
13
+ "mappings": "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",
14
+ "debugId": "8A2B78FD948E5F6364756E2164756E21",
15
15
  "names": []
16
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-rules-md",
3
- "version": "0.8.6",
3
+ "version": "0.9.1",
4
4
  "description": "OpenCode plugin that discovers and injects markdown rules into system prompts",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -75,26 +75,23 @@
75
75
  }
76
76
  },
77
77
  "devDependencies": {
78
- "@opencode-ai/plugin": "^1.3.9",
79
- "@opencode-ai/sdk": "^1.3.9",
80
- "@opentui/core": "^0.4.3",
81
- "@opentui/solid": "^0.4.3",
82
- "@types/minimatch": "^5.1.2",
83
- "@types/node": "^20.19.30",
84
- "@typescript-eslint/eslint-plugin": "^8.63.0",
85
- "@typescript-eslint/parser": "^8.63.0",
86
- "eslint": "^10.6.0",
87
- "prettier": "^3.8.1",
88
- "solid-js": "1.9.14",
89
- "typescript": "^5.9.3",
90
- "vitest": "^2.1.8"
78
+ "@opencode-ai/plugin": "^1.18.2",
79
+ "@opencode-ai/sdk": "^1.18.2",
80
+ "@types/minimatch": "^6.0.0",
81
+ "@types/node": "^26.1.1",
82
+ "@typescript-eslint/eslint-plugin": "^8.64.0",
83
+ "@typescript-eslint/parser": "^8.64.0",
84
+ "eslint": "^10.7.0",
85
+ "prettier": "^3.9.5",
86
+ "typescript": "^7.0.2",
87
+ "vitest": "^4.1.10"
91
88
  },
92
89
  "dependencies": {
93
90
  "@opentui/core": "^0.4.3",
94
91
  "@opentui/solid": "^0.4.3",
95
- "minimatch": "^9.0.5",
96
- "solid-js": "^1.9.12",
97
- "yaml": "^2.8.2"
92
+ "minimatch": "^10.2.5",
93
+ "solid-js": "^1.9.14",
94
+ "yaml": "^2.9.0"
98
95
  },
99
96
  "scripts": {
100
97
  "build": "tsc && bun scripts/build-tui.mjs && bun scripts/build-cli.mjs",
@@ -173,33 +173,45 @@ export interface DiscoveredRule {
173
173
  export async function discoverRuleFiles(
174
174
  projectDir?: string
175
175
  ): Promise<DiscoveredRule[]> {
176
- const files: DiscoveredRule[] = [];
176
+ // Keyed by relativePath; later insertions shadow earlier ones.
177
+ // Global rules are inserted first (lowest precedence); project-local rules
178
+ // are inserted after and overwrite any global entry sharing the same key.
179
+ const byRelativePath = new Map<string, DiscoveredRule>();
177
180
 
178
- // Discover global rules (recursively)
181
+ // Discover global rules (recursively) — inserted first (lowest precedence).
179
182
  const globalRulesDir = getGlobalRulesDir();
180
183
  if (globalRulesDir) {
181
184
  const globalRules = await scanDirectoryRecursively(
182
185
  globalRulesDir,
183
186
  globalRulesDir
184
187
  );
185
- for (const { filePath, relativePath } of globalRules) {
186
- debugLog(`Discovered global rule: ${relativePath} (${filePath})`);
187
- files.push({ filePath, relativePath });
188
+ for (const rule of globalRules) {
189
+ debugLog(
190
+ `Discovered global rule: ${rule.relativePath} (${rule.filePath})`
191
+ );
192
+ byRelativePath.set(rule.relativePath, rule);
188
193
  }
189
194
  }
190
195
 
191
- // Discover project-local rules (recursively) if project directory is provided
196
+ // Discover project-local rules (recursively) shadow global duplicates.
192
197
  if (projectDir) {
193
198
  const projectRulesDir = path.join(projectDir, '.opencode', 'rules');
194
199
  const projectRules = await scanDirectoryRecursively(
195
200
  projectRulesDir,
196
201
  projectRulesDir
197
202
  );
198
- for (const { filePath, relativePath } of projectRules) {
199
- debugLog(`Discovered project rule: ${relativePath} (${filePath})`);
200
- files.push({ filePath, relativePath });
203
+ for (const rule of projectRules) {
204
+ const shadowed = byRelativePath.has(rule.relativePath);
205
+ debugLog(
206
+ `Discovered project rule: ${rule.relativePath} (${rule.filePath})` +
207
+ (shadowed ? ' [shadows global]' : '')
208
+ );
209
+ byRelativePath.set(rule.relativePath, rule);
201
210
  }
202
211
  }
203
212
 
204
- return files;
213
+ // Map preserves insertion order in JS, so global rules keep their relative
214
+ // order and shadowed slots retain their original position but point at the
215
+ // project file.
216
+ return Array.from(byRelativePath.values());
205
217
  }