syntaur 0.55.0 → 0.56.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 (70) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/dashboard/dist/assets/{_basePickBy-DmVNJO8J.js → _basePickBy-BboQhTYn.js} +1 -1
  3. package/dashboard/dist/assets/{_baseUniq-BtWQDHxm.js → _baseUniq-C6ARYdEJ.js} +1 -1
  4. package/dashboard/dist/assets/{arc-BDZ8fFmA.js → arc-D76wUYJ-.js} +1 -1
  5. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-DmE3bMva.js → architectureDiagram-2XIMDMQ5-eoW8_dbN.js} +1 -1
  6. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-BUpzLbve.js → blockDiagram-WCTKOSBZ--XxaNbBK.js} +1 -1
  7. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-5lB7kxgt.js → c4Diagram-IC4MRINW-D2B-NJq6.js} +1 -1
  8. package/dashboard/dist/assets/channel-BPykMjmL.js +1 -0
  9. package/dashboard/dist/assets/{chunk-4BX2VUAB-DdRqNqOP.js → chunk-4BX2VUAB-CY34rkdT.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-55IACEB6-D_qI2OxO.js → chunk-55IACEB6-CLXE1Ejn.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-FMBD7UC4-BMtQHZt3.js → chunk-FMBD7UC4-D00VtmIk.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-JSJVCQXG-CeCGSMMb.js → chunk-JSJVCQXG-_EITJTaI.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-KX2RTZJC-Biv2a0MB.js → chunk-KX2RTZJC-DrqZI_kX.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-NQ4KR5QH-CbkEQT8f.js → chunk-NQ4KR5QH-DnYhUmZY.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-QZHKN3VN-BU54yyBK.js → chunk-QZHKN3VN-CqCcFoFI.js} +1 -1
  16. package/dashboard/dist/assets/{chunk-WL4C6EOR-ypzKdtzY.js → chunk-WL4C6EOR-Bwx5h46l.js} +1 -1
  17. package/dashboard/dist/assets/classDiagram-VBA2DB6C-z8L393gl.js +1 -0
  18. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-z8L393gl.js +1 -0
  19. package/dashboard/dist/assets/clone--rMJOGpf.js +1 -0
  20. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-Cfexs6Pq.js → cose-bilkent-S5V4N54A-QUZroYuH.js} +1 -1
  21. package/dashboard/dist/assets/{dagre-KLK3FWXG-BjdeaK5Z.js → dagre-KLK3FWXG-D8hYiZ7i.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-E7M64L7V-BVZRb5bD.js → diagram-E7M64L7V-Cl_n980P.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-IFDJBPK2-6fnO4hw1.js → diagram-IFDJBPK2-01DdmzmS.js} +1 -1
  24. package/dashboard/dist/assets/{diagram-P4PSJMXO-DX_fbvo0.js → diagram-P4PSJMXO-GcqkAPB2.js} +1 -1
  25. package/dashboard/dist/assets/{erDiagram-INFDFZHY-Dc-Ult_U.js → erDiagram-INFDFZHY-DQnXbhhn.js} +1 -1
  26. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-nrIBfe3g.js → flowDiagram-PKNHOUZH-DSmXtiZK.js} +1 -1
  27. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-7zt_k1Nl.js → ganttDiagram-A5KZAMGK-BLyt9LDp.js} +1 -1
  28. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-2yK7iOPo.js → gitGraphDiagram-K3NZZRJ6-FWlr0I_j.js} +1 -1
  29. package/dashboard/dist/assets/{graph-DD0OOYtL.js → graph-Czw8ZNXY.js} +1 -1
  30. package/dashboard/dist/assets/index-EntCfH3I.css +1 -0
  31. package/dashboard/dist/assets/index-zHNBGpC7.js +602 -0
  32. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-7nottSf8.js → infoDiagram-LFFYTUFH-CygGWMzd.js} +1 -1
  33. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-DHd9lm-i.js → ishikawaDiagram-PHBUUO56-39XaFufR.js} +1 -1
  34. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-BS86Ecdy.js → journeyDiagram-4ABVD52K-DCMzi84v.js} +1 -1
  35. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-B9uccuva.js → kanban-definition-K7BYSVSG-RSNF4GmM.js} +1 -1
  36. package/dashboard/dist/assets/{layout-Bq6MeguZ.js → layout-AOYFASCy.js} +1 -1
  37. package/dashboard/dist/assets/{linear-XkyDYAy6.js → linear-Bf-cRRMe.js} +1 -1
  38. package/dashboard/dist/assets/{mermaid.core-BH9rlHr4.js → mermaid.core-7QJzPWTu.js} +4 -4
  39. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-Cc-hDkvW.js → mindmap-definition-YRQLILUH-Ck4L1K7y.js} +1 -1
  40. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-BFIPTP1F.js → pieDiagram-SKSYHLDU-BHEH_9Yh.js} +1 -1
  41. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-yVL8WrSz.js → quadrantDiagram-337W2JSQ-DScQHhsU.js} +1 -1
  42. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-DxWjrQut.js → requirementDiagram-Z7DCOOCP-DLmxwUdt.js} +1 -1
  43. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-BPkz1Yl7.js → sankeyDiagram-WA2Y5GQK-B6OZtKmg.js} +1 -1
  44. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-DlgeS-S7.js → sequenceDiagram-2WXFIKYE-woFPqQIY.js} +1 -1
  45. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-DBpOK-Ql.js → stateDiagram-RAJIS63D-Db9HV_HG.js} +1 -1
  46. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-DZsj07hg.js +1 -0
  47. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-abDjZ0W-.js → timeline-definition-YZTLITO2-CGVOTXAD.js} +1 -1
  48. package/dashboard/dist/assets/{treemap-KZPCXAKY-bF6AoBlY.js → treemap-KZPCXAKY-CGmqtjaL.js} +1 -1
  49. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-lUeCE7KT.js → vennDiagram-LZ73GAT5-DAuyqqKn.js} +1 -1
  50. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-ByECFP6v.js → xychartDiagram-JWTSCODW--uOFgr6-.js} +1 -1
  51. package/dashboard/dist/index.html +2 -2
  52. package/dist/dashboard/server.js +290 -23
  53. package/dist/dashboard/server.js.map +1 -1
  54. package/dist/index.js +290 -23
  55. package/dist/index.js.map +1 -1
  56. package/dist/launch/index.d.ts +25 -0
  57. package/dist/launch/index.js +187 -1
  58. package/dist/launch/index.js.map +1 -1
  59. package/package.json +1 -1
  60. package/platforms/claude-code/.claude-plugin/plugin.json +1 -1
  61. package/platforms/codex/.codex-plugin/plugin.json +1 -1
  62. package/platforms/hermes/plugins/syntaur/__pycache__/__init__.cpython-312.pyc +0 -0
  63. package/platforms/hermes/plugins/syntaur/__pycache__/boundary.cpython-312.pyc +0 -0
  64. package/dashboard/dist/assets/channel-SCYGGwh4.js +0 -1
  65. package/dashboard/dist/assets/classDiagram-VBA2DB6C-DDovN08E.js +0 -1
  66. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-DDovN08E.js +0 -1
  67. package/dashboard/dist/assets/clone-DjHcKoH3.js +0 -1
  68. package/dashboard/dist/assets/index-BKfPPYKw.js +0 -602
  69. package/dashboard/dist/assets/index-C8THdvxD.css +0 -1
  70. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-CS61beS7.js +0 -1
@@ -180,6 +180,30 @@ interface DeriveConfig {
180
180
  headline: HeadlineProjection;
181
181
  }
182
182
 
183
+ /**
184
+ * Search-config schema — the shape behind the `search:` block in
185
+ * `~/.syntaur/config.md` and the command palette's customizable behavior.
186
+ *
187
+ * Browser-safe: no Node-only imports. Consumed by both the server
188
+ * (`src/dashboard/api-search-config.ts`, `src/utils/config.ts`) and the SPA
189
+ * (via the `@shared/search-schema` alias) so palette aliases, default scope, and
190
+ * external-ID indexing validate against ONE source of truth.
191
+ *
192
+ * See `claude-info/plans/2026-06-15-command-palette-ui-design.md`.
193
+ */
194
+ /** The five searchable entity kinds an alias prefix can target. */
195
+ type EntityKind = 'assignment' | 'project' | 'todo' | 'server' | 'playbook';
196
+ /** Default search scope: `all` (everything) or one entity kind. */
197
+ type DefaultScope = 'all' | EntityKind;
198
+ interface SearchConfig {
199
+ /** With no explicit type prefix, inject an implicit `kind:<scope>` gate. `all` = no gate. */
200
+ defaultScope: DefaultScope;
201
+ /** Prefix → entity kind. Replaces the hardcoded palette `TYPE_ALIASES`. */
202
+ aliases: Record<string, EntityKind>;
203
+ /** Fold external IDs into the index + enable `jira:`/`externalid:`/bare-ID matching. */
204
+ externalIds: boolean;
205
+ }
206
+
183
207
  interface WorkspaceVisibilityConfig {
184
208
  /** Names of workspaces hidden from the left nav. Absent = visible. */
185
209
  hidden: string[];
@@ -281,6 +305,7 @@ interface SyntaurConfig {
281
305
  theme: ThemeConfig | null;
282
306
  hotkeys: HotkeyBindingsConfig | null;
283
307
  terminal: TerminalChoice | null;
308
+ searchConfig: SearchConfig | null;
284
309
  workspaceVisibility: WorkspaceVisibilityConfig;
285
310
  }
286
311
 
@@ -2001,6 +2001,74 @@ var init_fact_registry = __esm({
2001
2001
  }
2002
2002
  });
2003
2003
 
2004
+ // src/utils/search-schema.ts
2005
+ function isEntityKind(value) {
2006
+ return typeof value === "string" && ENTITY_KINDS.includes(value);
2007
+ }
2008
+ function isDefaultScope(value) {
2009
+ return value === "all" || isEntityKind(value);
2010
+ }
2011
+ function normalizeSearchConfig(raw) {
2012
+ if (!raw || typeof raw !== "object") {
2013
+ return cloneDefaultSearchConfig();
2014
+ }
2015
+ const r = raw;
2016
+ const defaultScope = isDefaultScope(r["defaultScope"]) ? r["defaultScope"] : DEFAULT_SEARCH_CONFIG.defaultScope;
2017
+ const externalIds = typeof r["externalIds"] === "boolean" ? r["externalIds"] : DEFAULT_SEARCH_CONFIG.externalIds;
2018
+ let aliases;
2019
+ if (r["aliases"] && typeof r["aliases"] === "object") {
2020
+ aliases = {};
2021
+ for (const [key, value] of Object.entries(r["aliases"])) {
2022
+ if (ALIAS_KEY_RE.test(key) && key !== RESERVED_ALIAS && !SEARCH_FIELD_NAMES.includes(key) && isEntityKind(value)) {
2023
+ aliases[key] = value;
2024
+ }
2025
+ }
2026
+ } else {
2027
+ aliases = { ...DEFAULT_SEARCH_CONFIG.aliases };
2028
+ }
2029
+ return { defaultScope, aliases, externalIds };
2030
+ }
2031
+ function cloneDefaultSearchConfig() {
2032
+ return {
2033
+ defaultScope: DEFAULT_SEARCH_CONFIG.defaultScope,
2034
+ aliases: { ...DEFAULT_SEARCH_CONFIG.aliases },
2035
+ externalIds: DEFAULT_SEARCH_CONFIG.externalIds
2036
+ };
2037
+ }
2038
+ var ENTITY_KINDS, DEFAULT_SEARCH_CONFIG, SEARCH_FIELD_NAMES, RESERVED_ALIAS, ALIAS_KEY_RE;
2039
+ var init_search_schema = __esm({
2040
+ "src/utils/search-schema.ts"() {
2041
+ "use strict";
2042
+ ENTITY_KINDS = [
2043
+ "assignment",
2044
+ "project",
2045
+ "todo",
2046
+ "server",
2047
+ "playbook"
2048
+ ];
2049
+ DEFAULT_SEARCH_CONFIG = {
2050
+ defaultScope: "all",
2051
+ aliases: { a: "assignment", p: "project", t: "todo", s: "server", pb: "playbook" },
2052
+ externalIds: true
2053
+ };
2054
+ SEARCH_FIELD_NAMES = [
2055
+ "kind",
2056
+ "status",
2057
+ "tag",
2058
+ "tags",
2059
+ "assignee",
2060
+ "type",
2061
+ "project",
2062
+ "externalid",
2063
+ "jira",
2064
+ "title",
2065
+ "search"
2066
+ ];
2067
+ RESERVED_ALIAS = "all";
2068
+ ALIAS_KEY_RE = /^[a-z][a-z0-9]*$/;
2069
+ }
2070
+ });
2071
+
2004
2072
  // src/utils/workspace-visibility-schema.ts
2005
2073
  function normalizeHiddenList(input) {
2006
2074
  if (!Array.isArray(input)) return [];
@@ -2041,18 +2109,22 @@ __export(config_exports, {
2041
2109
  buildDefaultStatusConfig: () => buildDefaultStatusConfig,
2042
2110
  deleteAgentsConfig: () => deleteAgentsConfig,
2043
2111
  deleteHotkeyBindingsConfig: () => deleteHotkeyBindingsConfig,
2112
+ deleteSearchConfig: () => deleteSearchConfig,
2044
2113
  deleteStatusConfig: () => deleteStatusConfig,
2045
2114
  deleteTerminalConfig: () => deleteTerminalConfig,
2046
2115
  deleteThemeConfig: () => deleteThemeConfig,
2047
2116
  deleteWorkspaceVisibilityConfig: () => deleteWorkspaceVisibilityConfig,
2048
2117
  getAgents: () => getAgents,
2049
2118
  getAssignmentTypes: () => getAssignmentTypes,
2119
+ getSearchConfig: () => getSearchConfig,
2050
2120
  getTerminal: () => getTerminal,
2051
2121
  normalizeFactDeclarations: () => normalizeFactDeclarations,
2052
2122
  parseAgentCommand: () => parseAgentCommand,
2123
+ parseSearchConfig: () => parseSearchConfig,
2053
2124
  parseStatusConfig: () => parseStatusConfig,
2054
2125
  parseTerminalConfig: () => parseTerminalConfig,
2055
2126
  readConfig: () => readConfig,
2127
+ serializeSearchConfig: () => serializeSearchConfig,
2056
2128
  serializeStatusConfig: () => serializeStatusConfig,
2057
2129
  toTitleCase: () => toTitleCase,
2058
2130
  updateAgentsConfig: () => updateAgentsConfig,
@@ -2066,6 +2138,7 @@ __export(config_exports, {
2066
2138
  validateFactDeclarations: () => validateFactDeclarations,
2067
2139
  writeAgentsConfig: () => writeAgentsConfig,
2068
2140
  writeHotkeyBindingsConfig: () => writeHotkeyBindingsConfig,
2141
+ writeSearchConfig: () => writeSearchConfig,
2069
2142
  writeStatusConfig: () => writeStatusConfig,
2070
2143
  writeTerminalConfig: () => writeTerminalConfig,
2071
2144
  writeThemeConfig: () => writeThemeConfig,
@@ -2873,7 +2946,7 @@ function stripTopLevelBlock(fmBlock, key) {
2873
2946
  if (!blockStart) {
2874
2947
  return fmBlock.replace(/\n+$/, "");
2875
2948
  }
2876
- const startIdx = fmBlock.indexOf(blockStart[0]);
2949
+ const startIdx = blockStart.index ?? 0;
2877
2950
  const before = fmBlock.slice(0, startIdx);
2878
2951
  const after = fmBlock.slice(startIdx + blockStart[0].length);
2879
2952
  const remaining = after.split("\n");
@@ -3299,6 +3372,116 @@ ${cleanedFm}
3299
3372
  ---${afterFrontmatter}`;
3300
3373
  await writeFileForce(configPath, newContent);
3301
3374
  }
3375
+ function parseSearchConfig(content) {
3376
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
3377
+ if (!match) return null;
3378
+ const fmBlock = match[1];
3379
+ const blockStart = fmBlock.match(/^search:\s*$/m);
3380
+ if (!blockStart) return null;
3381
+ const startIdx = (blockStart.index ?? 0) + blockStart[0].length;
3382
+ const lines = fmBlock.slice(startIdx).split("\n");
3383
+ const unquote = (v) => {
3384
+ const t = v.trim();
3385
+ if (t.startsWith('"') && t.endsWith('"') || t.startsWith("'") && t.endsWith("'")) {
3386
+ return t.slice(1, -1);
3387
+ }
3388
+ return t;
3389
+ };
3390
+ const raw = {};
3391
+ let inAliases = false;
3392
+ for (const line of lines) {
3393
+ if (line.trim() === "") continue;
3394
+ const trimmed = line.trimStart();
3395
+ const indent = line.length - trimmed.length;
3396
+ if (indent === 0) break;
3397
+ if (indent <= 2) {
3398
+ inAliases = false;
3399
+ if (trimmed === "aliases:") {
3400
+ inAliases = true;
3401
+ raw.aliases = {};
3402
+ continue;
3403
+ }
3404
+ const ci = trimmed.indexOf(":");
3405
+ if (ci <= 0) continue;
3406
+ const key = trimmed.slice(0, ci).trim();
3407
+ const value = unquote(trimmed.slice(ci + 1).trim());
3408
+ if (key === "defaultScope") {
3409
+ raw.defaultScope = value;
3410
+ } else if (key === "externalIds") {
3411
+ const v = value.toLowerCase();
3412
+ if (v === "true") raw.externalIds = true;
3413
+ else if (v === "false") raw.externalIds = false;
3414
+ }
3415
+ } else if (inAliases) {
3416
+ const ci = trimmed.indexOf(":");
3417
+ if (ci <= 0) continue;
3418
+ raw.aliases ??= {};
3419
+ raw.aliases[trimmed.slice(0, ci).trim()] = unquote(trimmed.slice(ci + 1).trim());
3420
+ }
3421
+ }
3422
+ return normalizeSearchConfig(raw);
3423
+ }
3424
+ function serializeSearchConfig(search) {
3425
+ const cfg = normalizeSearchConfig(search);
3426
+ const lines = ["search:"];
3427
+ lines.push(` defaultScope: ${cfg.defaultScope}`);
3428
+ lines.push(" aliases:");
3429
+ for (const [prefix, kind] of Object.entries(cfg.aliases)) {
3430
+ lines.push(` ${prefix}: ${kind}`);
3431
+ }
3432
+ lines.push(` externalIds: ${cfg.externalIds ? "true" : "false"}`);
3433
+ return lines.join("\n");
3434
+ }
3435
+ async function writeSearchConfig(search) {
3436
+ const configPath = resolve6(syntaurRoot(), "config.md");
3437
+ const searchBlock = serializeSearchConfig(search);
3438
+ if (!await fileExists(configPath)) {
3439
+ const content = `---
3440
+ version: "2.0"
3441
+ defaultProjectDir: ~/projects
3442
+ ${searchBlock}
3443
+ ---
3444
+ `;
3445
+ await writeFileForce(configPath, content);
3446
+ return;
3447
+ }
3448
+ const existing = await readFile5(configPath, "utf-8");
3449
+ const fmMatch = existing.match(/^(---\n)([\s\S]*?)\n(---)/);
3450
+ if (!fmMatch) {
3451
+ const content = `---
3452
+ version: "2.0"
3453
+ ${searchBlock}
3454
+ ---
3455
+ ${existing}`;
3456
+ await writeFileForce(configPath, content);
3457
+ return;
3458
+ }
3459
+ const fmBlock = fmMatch[2];
3460
+ const afterFrontmatter = existing.slice(fmMatch[0].length);
3461
+ const cleanedFm = stripTopLevelBlock(fmBlock, "search");
3462
+ const newContent = `---
3463
+ ${cleanedFm}
3464
+ ${searchBlock}
3465
+ ---${afterFrontmatter}`;
3466
+ await writeFileForce(configPath, newContent);
3467
+ }
3468
+ async function deleteSearchConfig() {
3469
+ const configPath = resolve6(syntaurRoot(), "config.md");
3470
+ if (!await fileExists(configPath)) return;
3471
+ const existing = await readFile5(configPath, "utf-8");
3472
+ const fmMatch = existing.match(/^(---\n)([\s\S]*?)\n(---)/);
3473
+ if (!fmMatch) return;
3474
+ const fmBlock = fmMatch[2];
3475
+ const afterFrontmatter = existing.slice(fmMatch[0].length);
3476
+ const cleanedFm = stripTopLevelBlock(fmBlock, "search");
3477
+ const newContent = `---
3478
+ ${cleanedFm}
3479
+ ---${afterFrontmatter}`;
3480
+ await writeFileForce(configPath, newContent);
3481
+ }
3482
+ function getSearchConfig(config) {
3483
+ return config.searchConfig ?? DEFAULT_SEARCH_CONFIG;
3484
+ }
3302
3485
  async function updateIntegrationConfig(integrations) {
3303
3486
  const configPath = resolve6(syntaurRoot(), "config.md");
3304
3487
  const nextIntegrations = {
@@ -3470,6 +3653,7 @@ async function readConfig() {
3470
3653
  return null;
3471
3654
  }
3472
3655
  })(),
3656
+ searchConfig: parseSearchConfig(content),
3473
3657
  workspaceVisibility: parseWorkspaceVisibilityConfig(fmBlock)
3474
3658
  };
3475
3659
  }
@@ -3548,6 +3732,7 @@ var init_config2 = __esm({
3548
3732
  init_derive_config();
3549
3733
  init_fact_registry();
3550
3734
  init_terminal_schema();
3735
+ init_search_schema();
3551
3736
  init_workspace_visibility_schema();
3552
3737
  DEFAULT_ASSIGNMENT_TYPES = {
3553
3738
  definitions: [
@@ -3588,6 +3773,7 @@ var init_config2 = __esm({
3588
3773
  theme: null,
3589
3774
  hotkeys: null,
3590
3775
  terminal: null,
3776
+ searchConfig: null,
3591
3777
  workspaceVisibility: {
3592
3778
  hidden: []
3593
3779
  }