syntaur 0.47.0 → 0.48.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 (72) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/dashboard/dist/assets/{_basePickBy-DgR0_P-o.js → _basePickBy-Cie7FXcV.js} +1 -1
  3. package/dashboard/dist/assets/{_baseUniq-C8_Ych09.js → _baseUniq-C2af7-lW.js} +1 -1
  4. package/dashboard/dist/assets/{arc-yMHz4vGa.js → arc-BHKGjEv8.js} +1 -1
  5. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-ColWcH3P.js → architectureDiagram-2XIMDMQ5-CWqzcG1t.js} +1 -1
  6. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-Bo8Npvfq.js → blockDiagram-WCTKOSBZ-CHLC0M63.js} +1 -1
  7. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-B2ky8AT7.js → c4Diagram-IC4MRINW-Bx6GTZzJ.js} +1 -1
  8. package/dashboard/dist/assets/channel-CXlttLwe.js +1 -0
  9. package/dashboard/dist/assets/{chunk-4BX2VUAB-CyF6Z6dx.js → chunk-4BX2VUAB-7cTgwG6c.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-55IACEB6-BJOEnwNN.js → chunk-55IACEB6-DQmdA20e.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-FMBD7UC4-D3siQyQ4.js → chunk-FMBD7UC4-knmOnIKI.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-JSJVCQXG-DKGuxEMf.js → chunk-JSJVCQXG-CaiLHJFn.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-KX2RTZJC-CNIWWO2F.js → chunk-KX2RTZJC-Crp4zWuY.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-NQ4KR5QH-DXt05c7h.js → chunk-NQ4KR5QH-DDjtdNaK.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-QZHKN3VN-CM63uYnf.js → chunk-QZHKN3VN-Cbm1IieP.js} +1 -1
  16. package/dashboard/dist/assets/{chunk-WL4C6EOR-Dqvl_14m.js → chunk-WL4C6EOR-CdrRh6R4.js} +1 -1
  17. package/dashboard/dist/assets/classDiagram-VBA2DB6C-BJM0Dprk.js +1 -0
  18. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BJM0Dprk.js +1 -0
  19. package/dashboard/dist/assets/clone-BTq7ueDt.js +1 -0
  20. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-WBLtT1w9.js → cose-bilkent-S5V4N54A-DyNajnMF.js} +1 -1
  21. package/dashboard/dist/assets/{dagre-KLK3FWXG-DIdQdwa7.js → dagre-KLK3FWXG-CIBjpfqE.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-E7M64L7V-BEH6P_Sk.js → diagram-E7M64L7V-CDENlpZN.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-IFDJBPK2-BuhxBcSy.js → diagram-IFDJBPK2-CIGMJoFB.js} +1 -1
  24. package/dashboard/dist/assets/{diagram-P4PSJMXO-DPSNVVzN.js → diagram-P4PSJMXO-C27fj5wp.js} +1 -1
  25. package/dashboard/dist/assets/{erDiagram-INFDFZHY-DYJb_rF5.js → erDiagram-INFDFZHY-M2CywJym.js} +1 -1
  26. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-B9_8BI26.js → flowDiagram-PKNHOUZH-CTV6ROYf.js} +1 -1
  27. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-Bsg3QOhs.js → ganttDiagram-A5KZAMGK-CxH3f3e5.js} +1 -1
  28. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-Cf5G9x_K.js → gitGraphDiagram-K3NZZRJ6-CwhnVvHE.js} +1 -1
  29. package/dashboard/dist/assets/{graph-DyXfcrIH.js → graph-DGkI_ekZ.js} +1 -1
  30. package/dashboard/dist/assets/index-BxO2I5dN.css +1 -0
  31. package/dashboard/dist/assets/{index-C3kYxhbQ.js → index-CTdFARW9.js} +111 -111
  32. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-Bu1zlXs2.js → infoDiagram-LFFYTUFH-CuKReAi2.js} +1 -1
  33. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-fb8C-XRT.js → ishikawaDiagram-PHBUUO56-DyBMt5Mw.js} +1 -1
  34. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-smlBWs2O.js → journeyDiagram-4ABVD52K-CnwtbTNs.js} +1 -1
  35. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-Bz1AxFRE.js → kanban-definition-K7BYSVSG-5Sh1bC5j.js} +1 -1
  36. package/dashboard/dist/assets/{layout-VsTD3onG.js → layout-W2Vytcip.js} +1 -1
  37. package/dashboard/dist/assets/{linear-CE8xncGu.js → linear-UTm9E6c4.js} +1 -1
  38. package/dashboard/dist/assets/{mermaid.core-C0KQpDyW.js → mermaid.core-B0EB-dBk.js} +4 -4
  39. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-SRE5Immj.js → mindmap-definition-YRQLILUH-CH4L08eg.js} +1 -1
  40. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-CaZ_aCcD.js → pieDiagram-SKSYHLDU-CQ3PMl-w.js} +1 -1
  41. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-Dd6MIruu.js → quadrantDiagram-337W2JSQ-DbZgXUm5.js} +1 -1
  42. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-BBXvP53l.js → requirementDiagram-Z7DCOOCP-CxJWytQa.js} +1 -1
  43. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-DnS1SMIm.js → sankeyDiagram-WA2Y5GQK-3YeEasvh.js} +1 -1
  44. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-CLHJ1Uhx.js → sequenceDiagram-2WXFIKYE-F2EyvYsW.js} +1 -1
  45. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-B6vrAeYw.js → stateDiagram-RAJIS63D-DrmiemaD.js} +1 -1
  46. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-DfyvP5EF.js +1 -0
  47. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-BlHwGfnL.js → timeline-definition-YZTLITO2-CBee2YiE.js} +1 -1
  48. package/dashboard/dist/assets/{treemap-KZPCXAKY-D9kOGUYR.js → treemap-KZPCXAKY-BkPRIS3K.js} +1 -1
  49. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-BpQgeveT.js → vennDiagram-LZ73GAT5-CTsfwv8G.js} +1 -1
  50. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-DRch79fE.js → xychartDiagram-JWTSCODW-DUSo-c6w.js} +1 -1
  51. package/dashboard/dist/index.html +2 -2
  52. package/dist/dashboard/server.js +162 -68
  53. package/dist/dashboard/server.js.map +1 -1
  54. package/dist/index.js +162 -68
  55. package/dist/index.js.map +1 -1
  56. package/dist/launch/index.d.ts +25 -12
  57. package/dist/launch/index.js +60 -57
  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/claude-code/skills/manage-statuses/SKILL.md +7 -0
  62. package/platforms/codex/.codex-plugin/plugin.json +1 -1
  63. package/platforms/codex/skills/manage-statuses/SKILL.md +7 -0
  64. package/platforms/hermes/plugins/syntaur/__pycache__/__init__.cpython-312.pyc +0 -0
  65. package/platforms/hermes/plugins/syntaur/__pycache__/boundary.cpython-312.pyc +0 -0
  66. package/skills/manage-statuses/SKILL.md +7 -0
  67. package/dashboard/dist/assets/channel-CUTEvTdk.js +0 -1
  68. package/dashboard/dist/assets/classDiagram-VBA2DB6C-Bkoc7orC.js +0 -1
  69. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-Bkoc7orC.js +0 -1
  70. package/dashboard/dist/assets/clone-CltBg7cH.js +0 -1
  71. package/dashboard/dist/assets/index-DKr21dk8.css +0 -1
  72. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-BeqNZKbk.js +0 -1
@@ -112,6 +112,31 @@ interface AgentConfig {
112
112
  launchPrompt?: string;
113
113
  }
114
114
 
115
+ /**
116
+ * Browser-safe fact-vocabulary module.
117
+ *
118
+ * Extracted for the same reason as `saved-view-builder.ts`: both the dashboard
119
+ * (Vite/browser build, `@shared/*` alias) and Node-side modules need these
120
+ * definitions. The ONLY import here is from `./query/index.js` — no
121
+ * Node-coupled modules (no `config.ts`, no `fs`, no `path`).
122
+ *
123
+ * Consumers (`src/lifecycle/derive.ts`, `src/utils/config.ts`) re-export
124
+ * everything from here so no existing import path needs to change.
125
+ */
126
+
127
+ /**
128
+ * A custom-fact declaration EXACTLY as parsed from `statuses.facts` — loose
129
+ * parse (Locked Decisions): every field is a raw string so user input
130
+ * round-trips through serialization even when invalid. The strict
131
+ * {@link FactDeclaration} is derived from this via {@link normalizeFactDeclarations}
132
+ * (defined in `config.ts`, which imports this type).
133
+ */
134
+ interface RawFactDeclaration {
135
+ name: string;
136
+ type: string;
137
+ binds: string | null;
138
+ }
139
+
115
140
  interface WorkspaceVisibilityConfig {
116
141
  /** Names of workspaces hidden from the left nav. Absent = visible. */
117
142
  hidden: string[];
@@ -163,18 +188,6 @@ interface DeriveConfig {
163
188
  disposition: DispositionRule[];
164
189
  headline: HeadlineProjection;
165
190
  }
166
- /**
167
- * A custom-fact declaration EXACTLY as parsed from `statuses.facts` — loose
168
- * parse (Locked Decisions): every field is a raw string so user input
169
- * round-trips through serialization even when invalid. The strict
170
- * {@link FactDeclaration} is derived from this via {@link normalizeFactDeclarations}.
171
- */
172
- interface RawFactDeclaration {
173
- name: string;
174
- type: string;
175
- binds: string | null;
176
- }
177
-
178
191
  interface StatusConfig {
179
192
  statuses: StatusDefinition[];
180
193
  order: string[];
@@ -1686,6 +1686,53 @@ function factFieldNames(decl) {
1686
1686
  ].map((k) => k.toLowerCase()) : [exportNames.fact.toLowerCase()];
1687
1687
  return { storageKey: name, exports: exportNames, registryKeys };
1688
1688
  }
1689
+ function validateFactDeclarations(raw) {
1690
+ const problems = [];
1691
+ const owners = /* @__PURE__ */ new Map();
1692
+ for (const key of Object.keys(DERIVE_FIELDS)) owners.set(key, "built-in");
1693
+ for (const key of Object.keys(ASSIGNMENT_FIELDS)) owners.set(key, "built-in");
1694
+ for (const row of raw ?? []) {
1695
+ const name = (row?.name ?? "").trim();
1696
+ if (!/^[a-z][a-zA-Z0-9]*$/.test(name)) {
1697
+ problems.push(
1698
+ `fact "${row?.name ?? ""}": invalid name \u2014 must match /^[a-z][a-zA-Z0-9]*$/`
1699
+ );
1700
+ continue;
1701
+ }
1702
+ const type = (row.type ?? "").trim();
1703
+ if (type !== "bool" && type !== "number" && type !== "attestation") {
1704
+ problems.push(
1705
+ `fact "${name}": invalid type "${row.type ?? ""}" \u2014 expected bool, number, or attestation`
1706
+ );
1707
+ continue;
1708
+ }
1709
+ if (type === "attestation") {
1710
+ const binds = (row.binds ?? "none").toString().trim() || "none";
1711
+ if (binds !== "plan" && binds !== "commit" && binds !== "none") {
1712
+ problems.push(
1713
+ `fact "${name}": invalid binds "${row.binds}" \u2014 expected plan, commit, or none`
1714
+ );
1715
+ continue;
1716
+ }
1717
+ }
1718
+ const decl = type === "attestation" ? { name, type, binds: "none" } : { name, type };
1719
+ const keys = factFieldNames(decl).registryKeys;
1720
+ const collidingKey = keys.find((k) => owners.has(k));
1721
+ if (collidingKey !== void 0) {
1722
+ const owner = owners.get(collidingKey);
1723
+ if (owner === "built-in") {
1724
+ problems.push(`fact "${name}": exported field "${collidingKey}" collides with a built-in field`);
1725
+ } else if (owner === name) {
1726
+ problems.push(`fact "${name}": duplicate declaration (a fact named "${name}" is already declared)`);
1727
+ } else {
1728
+ problems.push(`fact "${name}": exported field "${collidingKey}" collides with fact "${owner}"`);
1729
+ }
1730
+ continue;
1731
+ }
1732
+ for (const key of keys) owners.set(key, name);
1733
+ }
1734
+ return problems;
1735
+ }
1689
1736
  function acceptFactDeclarations(declarations) {
1690
1737
  const taken = /* @__PURE__ */ new Set([
1691
1738
  ...Object.keys(DERIVE_FIELDS),
@@ -2194,7 +2241,6 @@ function parseStatusConfig(content) {
2194
2241
  continue;
2195
2242
  }
2196
2243
  }
2197
- if (statuses.length === 0) return null;
2198
2244
  const derive = phaseLadder.length > 0 || disposition.length > 0 || Object.keys(headline).length > 0 ? {
2199
2245
  phaseLadder: phaseLadder.length > 0 ? phaseLadder : DEFAULT_DERIVE_CONFIG.phaseLadder,
2200
2246
  disposition: disposition.length > 0 ? disposition : DEFAULT_DERIVE_CONFIG.disposition,
@@ -2205,6 +2251,7 @@ function parseStatusConfig(content) {
2205
2251
  active: "phase"
2206
2252
  }
2207
2253
  } : null;
2254
+ if (statuses.length === 0 && facts.length === 0 && derive === null) return null;
2208
2255
  return {
2209
2256
  statuses,
2210
2257
  order: order.length > 0 ? order : statuses.map((s) => s.id),
@@ -2330,53 +2377,6 @@ function validateDeriveConfig(derive, statusConfig, validateWhen = () => null) {
2330
2377
  }
2331
2378
  return problems;
2332
2379
  }
2333
- function validateFactDeclarations(raw) {
2334
- const problems = [];
2335
- const owners = /* @__PURE__ */ new Map();
2336
- for (const key of Object.keys(DERIVE_FIELDS)) owners.set(key, "built-in");
2337
- for (const key of Object.keys(ASSIGNMENT_FIELDS)) owners.set(key, "built-in");
2338
- for (const row of raw ?? []) {
2339
- const name = (row?.name ?? "").trim();
2340
- if (!/^[a-z][a-zA-Z0-9]*$/.test(name)) {
2341
- problems.push(
2342
- `fact "${row?.name ?? ""}": invalid name \u2014 must match /^[a-z][a-zA-Z0-9]*$/`
2343
- );
2344
- continue;
2345
- }
2346
- const type = (row.type ?? "").trim();
2347
- if (type !== "bool" && type !== "number" && type !== "attestation") {
2348
- problems.push(
2349
- `fact "${name}": invalid type "${row.type ?? ""}" \u2014 expected bool, number, or attestation`
2350
- );
2351
- continue;
2352
- }
2353
- if (type === "attestation") {
2354
- const binds = (row.binds ?? "none").toString().trim() || "none";
2355
- if (binds !== "plan" && binds !== "commit" && binds !== "none") {
2356
- problems.push(
2357
- `fact "${name}": invalid binds "${row.binds}" \u2014 expected plan, commit, or none`
2358
- );
2359
- continue;
2360
- }
2361
- }
2362
- const decl = type === "attestation" ? { name, type, binds: "none" } : { name, type };
2363
- const keys = factFieldNames(decl).registryKeys;
2364
- const collidingKey = keys.find((k) => owners.has(k));
2365
- if (collidingKey !== void 0) {
2366
- const owner = owners.get(collidingKey);
2367
- if (owner === "built-in") {
2368
- problems.push(`fact "${name}": exported field "${collidingKey}" collides with a built-in field`);
2369
- } else if (owner === name) {
2370
- problems.push(`fact "${name}": duplicate declaration (a fact named "${name}" is already declared)`);
2371
- } else {
2372
- problems.push(`fact "${name}": exported field "${collidingKey}" collides with fact "${owner}"`);
2373
- }
2374
- continue;
2375
- }
2376
- for (const key of keys) owners.set(key, name);
2377
- }
2378
- return problems;
2379
- }
2380
2380
  function serializeIntegrationConfig(integrations) {
2381
2381
  const lines = [];
2382
2382
  if (integrations.claudePluginDir) {
@@ -3456,7 +3456,6 @@ var init_config2 = __esm({
3456
3456
  init_agents_schema();
3457
3457
  init_slug();
3458
3458
  init_fact_registry();
3459
- init_query();
3460
3459
  init_terminal_schema();
3461
3460
  init_workspace_visibility_schema();
3462
3461
  DEFAULT_DERIVE_CONFIG = {
@@ -4775,24 +4774,28 @@ async function getStatusConfig() {
4775
4774
  if (_cachedConfig) return _cachedConfig;
4776
4775
  const config = await readConfig();
4777
4776
  if (config.statuses) {
4777
+ const sc = config.statuses;
4778
+ const defaults = sc.statuses.length === 0 ? buildDefaultStatusConfig() : null;
4779
+ const effectiveStatuses = defaults ? defaults.statuses : sc.statuses;
4780
+ const effectiveOrder = defaults ? defaults.order : sc.order;
4778
4781
  const terminalSet = new Set(
4779
- config.statuses.statuses.filter((s) => s.terminal).map((s) => s.id)
4782
+ effectiveStatuses.filter((s) => s.terminal).map((s) => s.id)
4780
4783
  );
4781
- const hasCustomTransitions = config.statuses.transitions.length > 0;
4782
- const effectiveTransitions = hasCustomTransitions ? config.statuses.transitions : Array.from(DEFAULT_TRANSITION_TABLE.entries()).map(([key, to]) => {
4784
+ const hasCustomTransitions = sc.transitions.length > 0;
4785
+ const effectiveTransitions = hasCustomTransitions ? sc.transitions : Array.from(DEFAULT_TRANSITION_TABLE.entries()).map(([key, to]) => {
4783
4786
  const [from, command] = key.split(":");
4784
4787
  return { from, command, to };
4785
4788
  });
4786
- const accepted = acceptFactDeclarations(normalizeFactDeclarations(config.statuses.facts ?? null));
4789
+ const accepted = acceptFactDeclarations(normalizeFactDeclarations(sc.facts ?? null));
4787
4790
  _cachedConfig = {
4788
4791
  custom: true,
4789
- statuses: config.statuses.statuses,
4790
- order: config.statuses.order,
4792
+ statuses: effectiveStatuses,
4793
+ order: effectiveOrder,
4791
4794
  transitions: effectiveTransitions,
4792
4795
  transitionTable: buildTransitionTable(effectiveTransitions),
4793
4796
  terminalStatuses: terminalSet.size > 0 ? terminalSet : /* @__PURE__ */ new Set(["completed", "failed"]),
4794
- derive: config.statuses.derive ?? null,
4795
- facts: config.statuses.facts ?? null,
4797
+ derive: sc.derive ?? null,
4798
+ facts: sc.facts ?? null,
4796
4799
  factDeclarations: accepted,
4797
4800
  deriveRegistry: buildDeriveRegistry(accepted),
4798
4801
  queryRegistry: buildQueryRegistry(accepted)