@mrciphersmith/keryx 0.2.134 → 0.2.136

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 (3) hide show
  1. package/dist/cli.js +57 -12
  2. package/dist/core.js +13 -1
  3. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -37876,7 +37876,8 @@ function createFlowService(deps) {
37876
37876
  });
37877
37877
  } catch {}
37878
37878
  }
37879
- return summaries;
37879
+ const shared = duplicateFlowIds(summaries.map((summary) => summary.id));
37880
+ return summaries.map((summary) => ({ ...summary, duplicateId: shared.has(summary.id) }));
37880
37881
  },
37881
37882
  async get({ cwd, id }) {
37882
37883
  return (await load(cwd, id)).flow;
@@ -39197,7 +39198,8 @@ function createMetaprojectAdapter(cwd, overrides = {}) {
39197
39198
  title: f.title,
39198
39199
  tasksDone: f.tasksDone,
39199
39200
  tasksTotal: f.tasksTotal,
39200
- dir: f.dir
39201
+ dir: f.dir,
39202
+ ...f.duplicateId !== undefined ? { duplicateId: f.duplicateId } : {}
39201
39203
  }))
39202
39204
  };
39203
39205
  } catch (cause) {
@@ -39702,8 +39704,14 @@ function formatFlowStatus(result) {
39702
39704
  if (result.flows.length === 0) {
39703
39705
  return { output: "No matching flows.", isError: false };
39704
39706
  }
39705
- const lines = result.flows.map((f) => ` - ${f.id}${f.slug !== undefined ? ` (${f.slug})` : ""} [${f.status}] ${f.title} ` + `(${f.tasksDone}/${f.tasksTotal} tasks)`);
39706
- return { output: [`Flows (${result.flows.length}):`, ...lines].join(`
39707
+ const lines = result.flows.map((f) => ` - ${f.id}${f.duplicateId === true ? " \u2717 duplicate id" : ""}` + `${f.slug !== undefined ? ` (${f.slug})` : ""} [${f.status}] ${f.title} ` + `(${f.tasksDone}/${f.tasksTotal} tasks)`);
39708
+ const output = [`Flows (${result.flows.length}):`, ...lines];
39709
+ const duplicated = result.flows.filter((f) => f.duplicateId === true);
39710
+ if (duplicated.length > 0) {
39711
+ const ids = [...new Set(duplicated.map((f) => f.id))].sort();
39712
+ output.push("", `${ids.length} duplicated id(s) \u2014 every bare-id command on these is refused as ambiguous, ` + "so the repair has to name the directory:", ...duplicated.map((f) => ` - ${f.id}: ${f.dir}`), 'Repair with: keryx flow renumber <dir> --to <free id> --reason "<why>"');
39713
+ }
39714
+ return { output: output.join(`
39707
39715
  `), isError: false };
39708
39716
  }
39709
39717
  function formatSymbol(result) {
@@ -51133,7 +51141,7 @@ import path47 from "path";
51133
51141
  // package.json
51134
51142
  var package_default = {
51135
51143
  name: "@mrciphersmith/keryx",
51136
- version: "0.2.134",
51144
+ version: "0.2.136",
51137
51145
  description: "Version-controlled project context for AI coding agents: code graph, architecture wiki, project memory, relevant tests, quality signals, and task flows.",
51138
51146
  private: false,
51139
51147
  publishConfig: {
@@ -95024,6 +95032,7 @@ async function createShellChrome(otui, renderer, opts) {
95024
95032
  flexDirection: "column",
95025
95033
  border: ["left"],
95026
95034
  borderColor: getTheme().highlight,
95035
+ backgroundColor: getTheme().panel,
95027
95036
  paddingLeft: SIDEBAR_PADDING_LEFT,
95028
95037
  paddingRight: SIDEBAR_PADDING_RIGHT,
95029
95038
  paddingTop: 1
@@ -95087,10 +95096,14 @@ async function createShellChrome(otui, renderer, opts) {
95087
95096
  flexShrink: 0,
95088
95097
  flexDirection: "row",
95089
95098
  justifyContent: "space-between",
95099
+ backgroundColor: getTheme().panel,
95090
95100
  paddingLeft: 1,
95091
95101
  paddingRight: 1
95092
95102
  });
95093
- const headerLeft = new otui.TextRenderable(r, { id: "header-left", content: otui.t`${otui.dim(opts.title)}` });
95103
+ const headerLeft = new otui.TextRenderable(r, {
95104
+ id: "header-left",
95105
+ content: otui.t`${otui.bold(`\u25C6 ${opts.title}`)}`
95106
+ });
95094
95107
  header.add(headerLeft);
95095
95108
  const headerRight = new otui.TextRenderable(r, { id: "header-right", content: "" });
95096
95109
  header.add(headerRight);
@@ -95207,7 +95220,8 @@ async function createShellChrome(otui, renderer, opts) {
95207
95220
  flexDirection: "column",
95208
95221
  borderStyle: "rounded",
95209
95222
  border: true,
95210
- borderColor: getTheme().border,
95223
+ borderColor: getTheme().highlight,
95224
+ backgroundColor: getTheme().panel,
95211
95225
  paddingLeft: 1,
95212
95226
  paddingRight: 1
95213
95227
  });
@@ -95290,6 +95304,7 @@ async function createShellChrome(otui, renderer, opts) {
95290
95304
  flexShrink: 0,
95291
95305
  flexDirection: "row",
95292
95306
  justifyContent: "space-between",
95307
+ backgroundColor: getTheme().panel,
95293
95308
  paddingLeft: 1,
95294
95309
  paddingRight: 1
95295
95310
  });
@@ -95519,11 +95534,15 @@ async function createShellChrome(otui, renderer, opts) {
95519
95534
  r.setBackgroundColor(theme.bg);
95520
95535
  } catch {}
95521
95536
  sidebar.borderColor = theme.highlight;
95537
+ sidebar.backgroundColor = theme.panel;
95538
+ header.backgroundColor = theme.panel;
95539
+ footer.backgroundColor = theme.panel;
95522
95540
  dock.backgroundColor = theme.panel;
95523
95541
  dock.borderColor = theme.border;
95524
95542
  queueDock.backgroundColor = theme.panel;
95525
95543
  queueDock.borderColor = theme.border;
95526
- composer.borderColor = theme.border;
95544
+ composer.borderColor = theme.highlight;
95545
+ composer.backgroundColor = theme.panel;
95527
95546
  menu.backgroundColor = theme.panel;
95528
95547
  menu.focusedBackgroundColor = theme.panel;
95529
95548
  menu.selectedBackgroundColor = theme.highlight;
@@ -97930,11 +97949,15 @@ function presentSessionInfo(openModal, otui, chrome, options) {
97930
97949
  } catch {}
97931
97950
  };
97932
97951
  let unsubscribeKey;
97952
+ const contextRows = Math.max(1, formatContextUsageText(snapshot.context).trimEnd().split(`
97953
+ `).length);
97954
+ const contentRows = Math.max(snapshot.sessionRows.length + snapshot.usageRows.length, contextRows, snapshot.workspaceLines.length, snapshot.flowLines.length);
97933
97955
  const handle = openModal(otui, chrome, {
97934
97956
  title: "/status",
97935
97957
  tabs: statusModalTabs(snapshot),
97936
97958
  initialTab: "status",
97937
97959
  footer: SESSION_INFO_FOOTER,
97960
+ contentRows,
97938
97961
  renderTab: (tabId, body, ctx) => {
97939
97962
  const renderer = options.renderer ?? chrome?.renderer;
97940
97963
  const width = ctx?.width;
@@ -98429,6 +98452,7 @@ function presentThemePicker(openModal, otui, chrome, options) {
98429
98452
  tabs: [{ id: "picker", label: "Theme" }],
98430
98453
  initialTab: "picker",
98431
98454
  footer: THEME_PICKER_FOOTER,
98455
+ contentRows: 22,
98432
98456
  renderTab: (_tabId, body) => {
98433
98457
  if (core === undefined || body === undefined || body === null) {
98434
98458
  return;
@@ -103964,11 +103988,12 @@ function sessionPickerOptions(sessions, leaseState = () => "free") {
103964
103988
  const updated = formatSessionDate(s.updatedAt);
103965
103989
  const short = shortSessionId(s.id);
103966
103990
  const title = s.title.length > 52 ? `${s.title.slice(0, 49)}\u2026` : s.title;
103967
- const label = withLeaseMarker(`${short} \xB7 ${title}`, leaseState(s.id));
103991
+ const label = withLeaseMarker(`${title} \xB7 ${short}`, leaseState(s.id));
103992
+ const messages = `${s.messageCount} ${s.messageCount === 1 ? "message" : "messages"}`;
103968
103993
  return {
103969
103994
  value: s.id,
103970
103995
  label,
103971
- description: `${s.projectPath} \xB7 created ${created} \xB7 updated ${updated}`,
103996
+ description: `updated ${updated} \xB7 created ${created} \xB7 ${messages}`,
103972
103997
  search: `${s.id} ${label} ${s.projectPath} ${s.title} ${created} ${updated}`.toLowerCase()
103973
103998
  };
103974
103999
  });
@@ -104017,7 +104042,7 @@ function pickSessionInTui(otui, rOrChrome, sessions, leaseState) {
104017
104042
  renderTab: (_tabId, body, ctx) => {
104018
104043
  const list = mountFilterList(otui, r, body, {
104019
104044
  ...listSpec,
104020
- idleHint: "type to filter by id, title, project, created, updated",
104045
+ idleHint: "type to filter \xB7 title, id, date",
104021
104046
  width: "100%",
104022
104047
  height: adaptiveSelectHeight(all.length, Math.max(1, ctx.height - 1), ROWS_PER_SESSION),
104023
104048
  onPick: (row) => {
@@ -104841,6 +104866,26 @@ async function launchTuiAgentShell(opts) {
104841
104866
  const mainWidth = chrome.main.width > 0 ? chrome.main.width : r.width - SIDEBAR_WIDTH;
104842
104867
  return renderCommandHelp("agent", undefined, Math.max(HELP_MIN_COLS, mainWidth - TRANSCRIPT_CHROME_COLS));
104843
104868
  };
104869
+ const openHelp = () => {
104870
+ const content = helpText().trimEnd();
104871
+ openModal(otui, chrome, {
104872
+ title: "/help",
104873
+ tabs: [{ id: "commands", label: "Commands" }],
104874
+ initialTab: "commands",
104875
+ footer: [
104876
+ { key: "\u2191/\u2193", label: "scroll" },
104877
+ { key: "esc", label: "close" }
104878
+ ],
104879
+ contentRows: Math.max(1, content.split(`
104880
+ `).length),
104881
+ renderTab: (_tabId, body) => {
104882
+ body.add(new otui.TextRenderable(r, {
104883
+ id: `help-${uid++}`,
104884
+ content
104885
+ }));
104886
+ }
104887
+ });
104888
+ };
104844
104889
  const sessionCwd = opts.session?.cwd ?? process.cwd();
104845
104890
  let permissionMode = opts.initialPermissionMode ?? getProjectPermissionMode(sessionCwd) ?? DEFAULT_PERMISSION_MODE;
104846
104891
  io.permissionMode = () => permissionMode;
@@ -106573,7 +106618,7 @@ Usage: /reasoning <${REASONING_EFFORT_LEVELS.join("|")}>
106573
106618
  })();
106574
106619
  return;
106575
106620
  }
106576
- io.onSystem?.(helpText());
106621
+ openHelp();
106577
106622
  return;
106578
106623
  }
106579
106624
  if (line.startsWith("/")) {
package/dist/core.js CHANGED
@@ -10949,6 +10949,17 @@ async function listFlowDirs(cwd) {
10949
10949
  function flowIdOf(dir) {
10950
10950
  return dir.slice(0, 3);
10951
10951
  }
10952
+ function duplicateFlowIds(ids) {
10953
+ const seen = new Set;
10954
+ const duplicates = new Set;
10955
+ for (const id of ids) {
10956
+ if (seen.has(id)) {
10957
+ duplicates.add(id);
10958
+ }
10959
+ seen.add(id);
10960
+ }
10961
+ return duplicates;
10962
+ }
10952
10963
  function groupFlowDirsById(dirs) {
10953
10964
  const groups = new Map;
10954
10965
  for (const dir of dirs) {
@@ -13404,7 +13415,8 @@ function createFlowService(deps) {
13404
13415
  });
13405
13416
  } catch {}
13406
13417
  }
13407
- return summaries;
13418
+ const shared = duplicateFlowIds(summaries.map((summary) => summary.id));
13419
+ return summaries.map((summary) => ({ ...summary, duplicateId: shared.has(summary.id) }));
13408
13420
  },
13409
13421
  async get({ cwd, id }) {
13410
13422
  return (await load(cwd, id)).flow;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrciphersmith/keryx",
3
- "version": "0.2.134",
3
+ "version": "0.2.136",
4
4
  "description": "Version-controlled project context for AI coding agents: code graph, architecture wiki, project memory, relevant tests, quality signals, and task flows.",
5
5
  "private": false,
6
6
  "publishConfig": {