@plumpslabs/kuma 2.4.8 → 2.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -5579,7 +5579,7 @@ async function addGotcha(entry) {
5579
5579
  try {
5580
5580
  const { addEdge: addEdge2 } = await Promise.resolve().then(() => (init_kumaGraph(), kumaGraph_exports));
5581
5581
  const stmt = db.prepare(`
5582
- SELECT id FROM nodes WHERE type = 'arch_flow'
5582
+ SELECT id FROM nodes WHERE type IN ('arch_flow', 'feature_domain')
5583
5583
  AND (metadata LIKE ? OR file_path = ?)
5584
5584
  LIMIT 5
5585
5585
  `);
@@ -6758,7 +6758,7 @@ async function getFlowFreshness(domain) {
6758
6758
  const { getDb: getDb2 } = await Promise.resolve().then(() => (init_kumaDb(), kumaDb_exports));
6759
6759
  const db = await getDb2();
6760
6760
  const stmt = db.prepare(
6761
- `SELECT metadata FROM nodes WHERE type = 'feature_domain' AND name = ? LIMIT 1`
6761
+ `SELECT metadata FROM nodes WHERE type IN ('feature_domain', 'arch_flow') AND name = ? LIMIT 1`
6762
6762
  );
6763
6763
  stmt.bind([domain]);
6764
6764
  const found = stmt.step();
@@ -6848,7 +6848,7 @@ async function getHopsForDomain(domain) {
6848
6848
  try {
6849
6849
  const { getDb: getDb2 } = await Promise.resolve().then(() => (init_kumaDb(), kumaDb_exports));
6850
6850
  const db = await getDb2();
6851
- const stmt = db.prepare(`SELECT metadata FROM nodes WHERE type = 'feature_domain' AND name = ? LIMIT 1`);
6851
+ const stmt = db.prepare(`SELECT metadata FROM nodes WHERE type IN ('feature_domain', 'arch_flow') AND name = ? LIMIT 1`);
6852
6852
  stmt.bind([domain]);
6853
6853
  if (stmt.step()) {
6854
6854
  const meta = JSON.parse(stmt.getAsObject().metadata || "{}");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plumpslabs/kuma",
3
- "version": "2.4.8",
3
+ "version": "2.4.9",
4
4
  "description": "Safety-first context & orchestration engine for AI coding agents. MCP server with mandatory research pipeline, knowledge graph, impact analysis, decision memory, and safety guard — works with any MCP client.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -166,7 +166,7 @@ async function getDashboardData() {
166
166
  `SELECT json_group_array(json_object('id',id,'file_path',file_path,'description',REPLACE(REPLACE(description,char(10),' '),char(13),''),'severity',severity,'workaround',REPLACE(REPLACE(COALESCE(workaround,''),char(10),' '),char(13),''),'added_by',COALESCE(added_by,'agent'),'status',COALESCE(status,'active'),'scope_package',COALESCE(scope_package,''),'verified_by',COALESCE(verified_by,''),'created_at',created_at,'updated_at',COALESCE(updated_at,created_at))) FROM (SELECT * FROM known_gotchas ORDER BY created_at DESC)`
167
167
  );
168
168
  const flows = jsonRows(
169
- `SELECT json_group_array(json_object('id',id,'name',name,'file_path',COALESCE(file_path,''),'metadata',COALESCE(metadata,'{}'),'updated_at',updated_at)) FROM (SELECT * FROM nodes WHERE type = 'arch_flow' ORDER BY updated_at DESC)`
169
+ `SELECT json_group_array(json_object('id',id,'name',name,'file_path',COALESCE(file_path,''),'metadata',COALESCE(metadata,'{}'),'updated_at',updated_at)) FROM (SELECT * FROM nodes WHERE type IN ('arch_flow', 'feature_domain') ORDER BY updated_at DESC)`
170
170
  );
171
171
  const decisions = jsonRows(
172
172
  `SELECT json_group_array(json_object('id',id,'name',name,'metadata',COALESCE(metadata,'{}'),'created_at',created_at)) FROM (SELECT * FROM nodes WHERE type = 'decision' ORDER BY created_at DESC)`
@@ -790,7 +790,13 @@ function renderFlows(flows) {
790
790
  </div>
791
791
  <div class="flow-hops-chain">
792
792
  ${hops.map(function(h, idx) {
793
- return `<span class="hop-node">${escapeHtml(h.to || h)}</span>${idx < hops.length - 1 ? '<span class="hop-arrow">→</span>' : ''}`;
793
+ var toLabel = typeof h === "object" ? (h.to || "") : String(h);
794
+ var fromLabel = (typeof h === "object" && h.from) ? h.from : "";
795
+ var rel = (typeof h === "object" && h.relation) ? ` <span style="opacity:0.6;font-size:10px">(${escapeHtml(h.relation)})</span>` : '';
796
+ var firstHopPrefix = (idx === 0 && fromLabel && fromLabel !== toLabel)
797
+ ? `<span class="hop-node">${escapeHtml(fromLabel)}</span><span class="hop-arrow">→</span>`
798
+ : '';
799
+ return `${firstHopPrefix}<span class="hop-node">${escapeHtml(toLabel)}${rel}</span>${idx < hops.length - 1 ? '<span class="hop-arrow">→</span>' : ''}`;
794
800
  }).join("")}
795
801
  </div>
796
802
  ${meta.gotchas && meta.gotchas.length ? `<div style="font-size:11px;color:var(--amber)">⚠️ Linked Gotchas: ${meta.gotchas.map(escapeHtml).join(", ")}</div>` : ''}
@@ -896,7 +902,8 @@ function initOrRefreshGraph() {
896
902
  var color = "#64748b";
897
903
  if (n.type === "file") color = "#06b6d4";
898
904
  else if (n.type === "gotcha") color = "#f59e0b";
899
- else if (n.type === "arch_flow") color = "#6366f1";
905
+ else if (n.type === "arch_flow" || n.type === "feature_domain") color = "#6366f1";
906
+ else if (n.type === "cross_service_link" || n.type === "workflow") color = "#818cf8";
900
907
  else if (n.type === "decision") color = "#10b981";
901
908
  return {
902
909
  id: n.id,
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://antigravity.google/schemas/v1/plugin.json",
3
3
  "name": "kuma",
4
- "version": "2.4.8",
4
+ "version": "2.4.9",
5
5
  "description": "Safety-first context & orchestration engine for AI coding agents. Shadow memory, gotcha lifecycle, blast radius impact analysis, and test verification.",
6
6
  "author": {
7
7
  "name": "plumpslabs",