memorix 0.6.1 → 0.6.3

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.
@@ -611,6 +611,20 @@ function renderGraph(graph) {
611
611
  ctx.fillStyle = colors.edgeLabel;
612
612
  ctx.textAlign = 'center';
613
613
  ctx.fillText(edge.type, mx + ox, my + oy - 6);
614
+
615
+ // Flowing particle animation along active edges
616
+ const particleCount = 2;
617
+ for (let p = 0; p < particleCount; p++) {
618
+ const t = ((pulsePhase * 0.5 + p / particleCount) % 1);
619
+ // Quadratic bezier interpolation: source → control → target
620
+ const cx = mx + ox, cy = my + oy;
621
+ const px = (1 - t) * (1 - t) * edge.source.x + 2 * (1 - t) * t * cx + t * t * edge.target.x;
622
+ const py = (1 - t) * (1 - t) * edge.source.y + 2 * (1 - t) * t * cy + t * t * edge.target.y;
623
+ ctx.beginPath();
624
+ ctx.arc(px, py, 3, 0, Math.PI * 2);
625
+ ctx.fillStyle = (edge.source.color || '#00d4ff') + 'cc';
626
+ ctx.fill();
627
+ }
614
628
  }
615
629
  }
616
630
 
package/dist/index.js CHANGED
@@ -858,7 +858,7 @@ async function installAgentRules(agent, projectRoot) {
858
858
  rulesPath = path5.join(projectRoot, "AGENTS.md");
859
859
  break;
860
860
  case "kiro":
861
- rulesPath = path5.join(projectRoot, ".kiro", "rules", "memorix.md");
861
+ rulesPath = path5.join(projectRoot, ".kiro", "steering", "memorix.md");
862
862
  break;
863
863
  default:
864
864
  rulesPath = path5.join(projectRoot, ".agent", "rules", "memorix.md");
@@ -2520,6 +2520,12 @@ var KiroAdapter = class {
2520
2520
  return rules.map((rule, i) => {
2521
2521
  const fm = {};
2522
2522
  if (rule.description) fm.description = rule.description;
2523
+ if (rule.paths && rule.paths.length > 0) {
2524
+ fm.inclusion = "fileMatch";
2525
+ fm.fileMatchPattern = rule.paths.length === 1 ? rule.paths[0] : rule.paths;
2526
+ } else if (rule.alwaysApply) {
2527
+ fm.inclusion = "always";
2528
+ }
2523
2529
  const fileName = rule.id.replace(/^kiro:/, "").replace(/[^a-zA-Z0-9-_]/g, "-") || `rule-${i}`;
2524
2530
  const body = Object.keys(fm).length > 0 ? matter7.stringify(rule.content, fm) : rule.content;
2525
2531
  return {
@@ -2532,15 +2538,22 @@ var KiroAdapter = class {
2532
2538
  const { data, content: body } = matter7(content);
2533
2539
  const trimmed = body.trim();
2534
2540
  if (!trimmed) return [];
2535
- const trigger = data.trigger;
2536
- const alwaysApply = !trigger || trigger === "always";
2541
+ const inclusion = data.inclusion ?? "always";
2542
+ const alwaysApply = inclusion === "always" || inclusion === "auto";
2543
+ let paths;
2544
+ if (inclusion === "fileMatch" && data.fileMatchPattern) {
2545
+ paths = Array.isArray(data.fileMatchPattern) ? data.fileMatchPattern : [data.fileMatchPattern];
2546
+ }
2547
+ let scope = "project";
2548
+ if (alwaysApply) scope = "global";
2549
+ else if (paths && paths.length > 0) scope = "path-specific";
2537
2550
  return [{
2538
2551
  id: generateRuleId("kiro", filePath),
2539
2552
  content: trimmed,
2540
2553
  description: data.description,
2541
2554
  source: "kiro",
2542
- scope: alwaysApply ? "global" : "path-specific",
2543
- paths: data.globs,
2555
+ scope,
2556
+ paths,
2544
2557
  alwaysApply,
2545
2558
  priority: alwaysApply ? 10 : 5,
2546
2559
  hash: hashContent(trimmed)