@sweny-ai/core 0.1.76 → 0.1.78

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 (123) hide show
  1. package/dist/browser.d.ts +11 -5
  2. package/dist/browser.js +11 -11
  3. package/dist/claude.d.ts +20 -0
  4. package/dist/claude.js +139 -9
  5. package/dist/cli/config.d.ts +22 -0
  6. package/dist/cli/config.js +56 -9
  7. package/dist/cli/main.d.ts +1 -1
  8. package/dist/cli/main.js +56 -57
  9. package/dist/cli/marketplace.js +35 -9
  10. package/dist/cli/publish.d.ts +10 -0
  11. package/dist/cli/publish.js +22 -14
  12. package/dist/executor.js +104 -43
  13. package/dist/loader.d.ts +40 -0
  14. package/dist/loader.js +73 -0
  15. package/dist/mcp-catalog.d.ts +47 -0
  16. package/dist/mcp-catalog.js +304 -0
  17. package/dist/mcp.d.ts +6 -9
  18. package/dist/mcp.js +24 -314
  19. package/dist/requires.d.ts +7 -0
  20. package/dist/requires.js +34 -0
  21. package/dist/retry.d.ts +23 -0
  22. package/dist/retry.js +72 -0
  23. package/dist/schema.d.ts +667 -80
  24. package/dist/schema.js +144 -5
  25. package/dist/skills/custom-loader.d.ts +40 -0
  26. package/dist/skills/custom-loader.js +107 -32
  27. package/dist/skills/index.d.ts +13 -1
  28. package/dist/skills/index.js +12 -3
  29. package/dist/studio.js +4 -1
  30. package/dist/templates.d.ts +29 -8
  31. package/dist/templates.js +30 -20
  32. package/dist/testing.d.ts +7 -0
  33. package/dist/testing.js +7 -0
  34. package/dist/types.d.ts +76 -0
  35. package/dist/verify.d.ts +1 -0
  36. package/dist/verify.js +43 -5
  37. package/package.json +8 -4
  38. package/dist/__tests__/cascade.test.d.ts +0 -11
  39. package/dist/__tests__/cascade.test.js +0 -449
  40. package/dist/__tests__/claude.test.d.ts +0 -1
  41. package/dist/__tests__/claude.test.js +0 -427
  42. package/dist/__tests__/custom-loader.test.d.ts +0 -1
  43. package/dist/__tests__/custom-loader.test.js +0 -116
  44. package/dist/__tests__/executor.test.d.ts +0 -1
  45. package/dist/__tests__/executor.test.js +0 -736
  46. package/dist/__tests__/integration/datadog.integration.test.d.ts +0 -1
  47. package/dist/__tests__/integration/datadog.integration.test.js +0 -23
  48. package/dist/__tests__/integration/e2e-workflow.integration.test.d.ts +0 -1
  49. package/dist/__tests__/integration/e2e-workflow.integration.test.js +0 -75
  50. package/dist/__tests__/integration/github.integration.test.d.ts +0 -1
  51. package/dist/__tests__/integration/github.integration.test.js +0 -37
  52. package/dist/__tests__/integration/harness.d.ts +0 -24
  53. package/dist/__tests__/integration/harness.js +0 -34
  54. package/dist/__tests__/integration/linear.integration.test.d.ts +0 -1
  55. package/dist/__tests__/integration/linear.integration.test.js +0 -15
  56. package/dist/__tests__/integration/sentry.integration.test.d.ts +0 -1
  57. package/dist/__tests__/integration/sentry.integration.test.js +0 -20
  58. package/dist/__tests__/integration/slack.integration.test.d.ts +0 -1
  59. package/dist/__tests__/integration/slack.integration.test.js +0 -22
  60. package/dist/__tests__/integration/sources.integration.test.d.ts +0 -1
  61. package/dist/__tests__/integration/sources.integration.test.js +0 -123
  62. package/dist/__tests__/publish.test.d.ts +0 -1
  63. package/dist/__tests__/publish.test.js +0 -180
  64. package/dist/__tests__/schema.test.d.ts +0 -1
  65. package/dist/__tests__/schema.test.js +0 -526
  66. package/dist/__tests__/skill-config-integration.test.d.ts +0 -1
  67. package/dist/__tests__/skill-config-integration.test.js +0 -204
  68. package/dist/__tests__/skills-index.test.d.ts +0 -1
  69. package/dist/__tests__/skills-index.test.js +0 -119
  70. package/dist/__tests__/skills.test.d.ts +0 -1
  71. package/dist/__tests__/skills.test.js +0 -565
  72. package/dist/__tests__/spec-conformance.test.d.ts +0 -18
  73. package/dist/__tests__/spec-conformance.test.js +0 -1074
  74. package/dist/__tests__/studio.test.d.ts +0 -1
  75. package/dist/__tests__/studio.test.js +0 -403
  76. package/dist/__tests__/templates.test.d.ts +0 -1
  77. package/dist/__tests__/templates.test.js +0 -49
  78. package/dist/__tests__/testing.test.d.ts +0 -1
  79. package/dist/__tests__/testing.test.js +0 -224
  80. package/dist/__tests__/verify.test.d.ts +0 -1
  81. package/dist/__tests__/verify.test.js +0 -517
  82. package/dist/__tests__/version-consistency.test.d.ts +0 -1
  83. package/dist/__tests__/version-consistency.test.js +0 -312
  84. package/dist/__tests__/workflow-builder.test.d.ts +0 -1
  85. package/dist/__tests__/workflow-builder.test.js +0 -110
  86. package/dist/__tests__/workflow-yaml.test.d.ts +0 -1
  87. package/dist/__tests__/workflow-yaml.test.js +0 -201
  88. package/dist/cli/__tests__/diagram.test.d.ts +0 -1
  89. package/dist/cli/__tests__/diagram.test.js +0 -225
  90. package/dist/cli/__tests__/report-cloud.test.d.ts +0 -1
  91. package/dist/cli/__tests__/report-cloud.test.js +0 -165
  92. package/dist/cli/__tests__/upgrade.test.d.ts +0 -1
  93. package/dist/cli/__tests__/upgrade.test.js +0 -317
  94. package/dist/cli/__tests__/version-check.test.d.ts +0 -1
  95. package/dist/cli/__tests__/version-check.test.js +0 -209
  96. package/dist/cli/config.test.d.ts +0 -1
  97. package/dist/cli/config.test.js +0 -200
  98. package/dist/cli/credentials.test.d.ts +0 -1
  99. package/dist/cli/credentials.test.js +0 -172
  100. package/dist/cli/e2e.test.d.ts +0 -1
  101. package/dist/cli/e2e.test.js +0 -690
  102. package/dist/cli/marketplace.test.d.ts +0 -1
  103. package/dist/cli/marketplace.test.js +0 -355
  104. package/dist/cli/new.test.d.ts +0 -1
  105. package/dist/cli/new.test.js +0 -1043
  106. package/dist/cli/output.test.d.ts +0 -1
  107. package/dist/cli/output.test.js +0 -180
  108. package/dist/cli/publish.test.d.ts +0 -1
  109. package/dist/cli/publish.test.js +0 -610
  110. package/dist/cli/renderer.test.d.ts +0 -1
  111. package/dist/cli/renderer.test.js +0 -302
  112. package/dist/executor.test.d.ts +0 -1
  113. package/dist/executor.test.js +0 -603
  114. package/dist/mcp.test.d.ts +0 -1
  115. package/dist/mcp.test.js +0 -735
  116. package/dist/mermaid.test.d.ts +0 -1
  117. package/dist/mermaid.test.js +0 -256
  118. package/dist/sources.test.d.ts +0 -1
  119. package/dist/sources.test.js +0 -265
  120. package/dist/sources.validation.test.d.ts +0 -12
  121. package/dist/sources.validation.test.js +0 -380
  122. package/dist/workflow-builder.test.d.ts +0 -1
  123. package/dist/workflow-builder.test.js +0 -117
@@ -1 +0,0 @@
1
- export {};
@@ -1,180 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { formatDagResultMarkdown } from "./output.js";
3
- import { triageWorkflow } from "../workflows/index.js";
4
- function success(data = {}) {
5
- return { status: "success", data, toolCalls: [] };
6
- }
7
- function failed(data = {}) {
8
- return { status: "failed", data, toolCalls: [] };
9
- }
10
- function minimalConfig(overrides = {}) {
11
- return {
12
- timeRange: "6h",
13
- serviceFilter: "permit-service",
14
- repository: "acme/app",
15
- observabilityProviders: ["betterstack"],
16
- issueTrackerProvider: "linear",
17
- dryRun: false,
18
- ...overrides,
19
- };
20
- }
21
- /** Build a minimal fake workflow for tests that don't need the full triage graph. */
22
- function fakeWorkflow() {
23
- return {
24
- id: "test",
25
- name: "Test Workflow",
26
- description: "Minimal fixture for output.test.ts — not a real DAG.",
27
- entry: "investigate",
28
- nodes: {
29
- investigate: { name: "Investigate", instruction: "noop", skills: [] },
30
- create_issue: { name: "Create Issue", instruction: "noop", skills: [] },
31
- create_pr: { name: "Open PR", instruction: "noop", skills: [] },
32
- },
33
- edges: [
34
- { from: "investigate", to: "create_issue" },
35
- { from: "create_issue", to: "create_pr" },
36
- ],
37
- };
38
- }
39
- function fakeTrace(steps) {
40
- return {
41
- steps: steps.map((s) => ({
42
- node: s.node,
43
- status: "success",
44
- iteration: s.iteration ?? 1,
45
- })),
46
- edges: [],
47
- sources: {},
48
- };
49
- }
50
- describe("formatDagResultMarkdown", () => {
51
- it("renders a success header with issue + PR when both exist", () => {
52
- const results = new Map([
53
- [
54
- "investigate",
55
- success({ novel_count: 1, highest_severity: "high", findings: [{ severity: "high", title: "500 on /parse" }] }),
56
- ],
57
- [
58
- "create_issue",
59
- success({
60
- issueIdentifier: "OFF-1234",
61
- issueTitle: "Parse failure",
62
- issueUrl: "https://linear.app/acme/issue/OFF-1234",
63
- }),
64
- ],
65
- ["create_pr", success({ prNumber: 42, prUrl: "https://github.com/acme/app/pull/42" })],
66
- ]);
67
- const md = formatDagResultMarkdown(results, 15_000, minimalConfig());
68
- expect(md).toContain("## ✅ SWEny Triage — PR opened");
69
- expect(md).toContain("| Duration | 15s |");
70
- expect(md).toContain("| Service filter | `permit-service` |");
71
- expect(md).toContain("| Highest severity | high |");
72
- expect(md).toContain("OFF-1234");
73
- expect(md).toContain("https://linear.app/acme/issue/OFF-1234");
74
- expect(md).toContain("#42");
75
- expect(md).toContain("https://github.com/acme/app/pull/42");
76
- expect(md).toContain("**Issue created:**");
77
- expect(md).toContain("**PR opened:**");
78
- });
79
- it("renders an issue-only result when no PR was opened", () => {
80
- const results = new Map([
81
- ["investigate", success({ novel_count: 1, highest_severity: "medium" })],
82
- [
83
- "create_issue",
84
- success({ issueIdentifier: "OFF-5", issueTitle: "Investigate warning", issueUrl: "https://linear.app/x/5" }),
85
- ],
86
- ]);
87
- const md = formatDagResultMarkdown(results, 5_000, minimalConfig());
88
- expect(md).toContain("## ✅ SWEny Triage — Issue created");
89
- expect(md).toContain("OFF-5");
90
- expect(md).not.toContain("**PR opened:**");
91
- });
92
- it("renders a clean no-incident result when novel_count is 0", () => {
93
- const results = new Map([["investigate", success({ novel_count: 0 })]]);
94
- const md = formatDagResultMarkdown(results, 3_000, minimalConfig());
95
- expect(md).toContain("## ✅ SWEny Triage — No new incidents");
96
- expect(md).toContain("| Novel findings | 0 |");
97
- });
98
- it("renders a findings table in dry-run mode", () => {
99
- const results = new Map([
100
- [
101
- "investigate",
102
- success({
103
- novel_count: 2,
104
- highest_severity: "high",
105
- findings: [
106
- { severity: "high", title: "OOM in worker", is_duplicate: false, fix_complexity: "medium" },
107
- { severity: "low", title: "Stale metric", is_duplicate: true, duplicate_of: "OFF-99" },
108
- ],
109
- }),
110
- ],
111
- ]);
112
- const md = formatDagResultMarkdown(results, 9_000, minimalConfig({ dryRun: true }));
113
- expect(md).toContain("## 🔍 SWEny Triage — Dry run complete");
114
- expect(md).toContain("| # | Severity | Title | Complexity | Status |");
115
- expect(md).toContain("| 1 | high | OOM in worker | medium | novel |");
116
- expect(md).toContain("| 2 | low | Stale metric | — | dup of OFF-99 |");
117
- expect(md).toContain("_Dry run mode — no side effects were taken._");
118
- expect(md).toContain("| Mode | dry run |");
119
- });
120
- it("renders a failure summary when a node failed", () => {
121
- const results = new Map([
122
- ["gather", success()],
123
- ["investigate", failed({ error: "Rate limited by Anthropic API" })],
124
- ]);
125
- const md = formatDagResultMarkdown(results, 2_000, minimalConfig());
126
- expect(md).toContain("## ❌ SWEny Triage Failed");
127
- expect(md).toContain("**Failed at:** `investigate`");
128
- expect(md).toContain("Rate limited by Anthropic API");
129
- });
130
- it("escapes pipe characters in finding titles so the table stays valid", () => {
131
- const results = new Map([
132
- [
133
- "investigate",
134
- success({
135
- novel_count: 1,
136
- findings: [{ severity: "high", title: "broken | pipe | title" }],
137
- }),
138
- ],
139
- ]);
140
- const md = formatDagResultMarkdown(results, 1_000, minimalConfig({ dryRun: true }));
141
- expect(md).toContain("broken \\| pipe \\| title");
142
- });
143
- it("embeds a mermaid workflow diagram when workflow is supplied", () => {
144
- const results = new Map([
145
- ["investigate", success({ novel_count: 0 })],
146
- ["create_issue", success({ issueIdentifier: "OFF-7", issueUrl: "https://linear.app/x/7" })],
147
- ]);
148
- const workflow = fakeWorkflow();
149
- const md = formatDagResultMarkdown(results, 4_000, minimalConfig(), { workflow });
150
- expect(md).toContain("```mermaid");
151
- expect(md).toContain("graph TB");
152
- expect(md).toContain("title: Test Workflow");
153
- // Status classes should be applied for nodes that ran successfully
154
- expect(md).toContain("class investigate,create_issue success");
155
- });
156
- it("renders the workflow path and iteration counts from the execution trace", () => {
157
- const results = new Map([
158
- ["investigate", success({ novel_count: 1 })],
159
- ["create_issue", success({ issueIdentifier: "OFF-8" })],
160
- ]);
161
- const workflow = fakeWorkflow();
162
- const trace = fakeTrace([
163
- { node: "investigate" },
164
- { node: "create_issue" },
165
- { node: "create_issue", iteration: 2 },
166
- ]);
167
- const md = formatDagResultMarkdown(results, 8_000, minimalConfig(), { workflow, trace });
168
- expect(md).toContain("**Workflow path:** `investigate` → `create_issue` → `create_issue ×2`");
169
- });
170
- it("accepts the real triageWorkflow without throwing", () => {
171
- // Regression guard: the real workflow must serialise cleanly through toMermaidBlock
172
- // so we do not ship a broken diagram to every downstream consumer.
173
- const results = new Map([["investigate", success({ novel_count: 0 })]]);
174
- const md = formatDagResultMarkdown(results, 1_000, minimalConfig(), {
175
- workflow: triageWorkflow,
176
- });
177
- expect(md).toContain("```mermaid");
178
- expect(md).toContain(`title: ${triageWorkflow.name}`);
179
- });
180
- });
@@ -1 +0,0 @@
1
- export {};