@wickdninja/sweny-engine 0.1.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 (78) hide show
  1. package/README.md +75 -0
  2. package/dist/index.d.ts +6 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +6 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/recipes/triage/index.d.ts +7 -0
  7. package/dist/recipes/triage/index.d.ts.map +1 -0
  8. package/dist/recipes/triage/index.js +30 -0
  9. package/dist/recipes/triage/index.js.map +1 -0
  10. package/dist/recipes/triage/prompts.d.ts +6 -0
  11. package/dist/recipes/triage/prompts.d.ts.map +1 -0
  12. package/dist/recipes/triage/prompts.js +279 -0
  13. package/dist/recipes/triage/prompts.js.map +1 -0
  14. package/dist/recipes/triage/results.d.ts +14 -0
  15. package/dist/recipes/triage/results.d.ts.map +1 -0
  16. package/dist/recipes/triage/results.js +14 -0
  17. package/dist/recipes/triage/results.js.map +1 -0
  18. package/dist/recipes/triage/service-map.d.ts +15 -0
  19. package/dist/recipes/triage/service-map.d.ts.map +1 -0
  20. package/dist/recipes/triage/service-map.js +56 -0
  21. package/dist/recipes/triage/service-map.js.map +1 -0
  22. package/dist/recipes/triage/steps/build-context.d.ts +5 -0
  23. package/dist/recipes/triage/steps/build-context.d.ts.map +1 -0
  24. package/dist/recipes/triage/steps/build-context.js +85 -0
  25. package/dist/recipes/triage/steps/build-context.js.map +1 -0
  26. package/dist/recipes/triage/steps/create-issue.d.ts +5 -0
  27. package/dist/recipes/triage/steps/create-issue.d.ts.map +1 -0
  28. package/dist/recipes/triage/steps/create-issue.js +85 -0
  29. package/dist/recipes/triage/steps/create-issue.js.map +1 -0
  30. package/dist/recipes/triage/steps/create-pr.d.ts +5 -0
  31. package/dist/recipes/triage/steps/create-pr.d.ts.map +1 -0
  32. package/dist/recipes/triage/steps/create-pr.js +97 -0
  33. package/dist/recipes/triage/steps/create-pr.js.map +1 -0
  34. package/dist/recipes/triage/steps/cross-repo-check.d.ts +5 -0
  35. package/dist/recipes/triage/steps/cross-repo-check.d.ts.map +1 -0
  36. package/dist/recipes/triage/steps/cross-repo-check.js +44 -0
  37. package/dist/recipes/triage/steps/cross-repo-check.js.map +1 -0
  38. package/dist/recipes/triage/steps/implement-fix.d.ts +5 -0
  39. package/dist/recipes/triage/steps/implement-fix.d.ts.map +1 -0
  40. package/dist/recipes/triage/steps/implement-fix.js +100 -0
  41. package/dist/recipes/triage/steps/implement-fix.js.map +1 -0
  42. package/dist/recipes/triage/steps/investigate.d.ts +5 -0
  43. package/dist/recipes/triage/steps/investigate.d.ts.map +1 -0
  44. package/dist/recipes/triage/steps/investigate.js +74 -0
  45. package/dist/recipes/triage/steps/investigate.js.map +1 -0
  46. package/dist/recipes/triage/steps/notify.d.ts +5 -0
  47. package/dist/recipes/triage/steps/notify.d.ts.map +1 -0
  48. package/dist/recipes/triage/steps/notify.js +66 -0
  49. package/dist/recipes/triage/steps/notify.js.map +1 -0
  50. package/dist/recipes/triage/steps/novelty-gate.d.ts +5 -0
  51. package/dist/recipes/triage/steps/novelty-gate.d.ts.map +1 -0
  52. package/dist/recipes/triage/steps/novelty-gate.js +60 -0
  53. package/dist/recipes/triage/steps/novelty-gate.js.map +1 -0
  54. package/dist/recipes/triage/steps/verify-access.d.ts +5 -0
  55. package/dist/recipes/triage/steps/verify-access.d.ts.map +1 -0
  56. package/dist/recipes/triage/steps/verify-access.js +11 -0
  57. package/dist/recipes/triage/steps/verify-access.js.map +1 -0
  58. package/dist/recipes/triage/test-helpers.d.ts +17 -0
  59. package/dist/recipes/triage/test-helpers.d.ts.map +1 -0
  60. package/dist/recipes/triage/test-helpers.js +41 -0
  61. package/dist/recipes/triage/test-helpers.js.map +1 -0
  62. package/dist/recipes/triage/types.d.ts +79 -0
  63. package/dist/recipes/triage/types.d.ts.map +1 -0
  64. package/dist/recipes/triage/types.js +2 -0
  65. package/dist/recipes/triage/types.js.map +1 -0
  66. package/dist/registry.d.ts +4 -0
  67. package/dist/registry.d.ts.map +1 -0
  68. package/dist/registry.js +19 -0
  69. package/dist/registry.js.map +1 -0
  70. package/dist/runner.d.ts +13 -0
  71. package/dist/runner.d.ts.map +1 -0
  72. package/dist/runner.js +98 -0
  73. package/dist/runner.js.map +1 -0
  74. package/dist/types.d.ts +77 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/dist/types.js +2 -0
  77. package/dist/types.js.map +1 -0
  78. package/package.json +39 -0
@@ -0,0 +1,60 @@
1
+ import { getStepData } from "../results.js";
2
+ /** Check investigation recommendation and decide whether to proceed with implementation. */
3
+ export async function noveltyGate(ctx) {
4
+ const issueTracker = ctx.providers.get("issueTracker");
5
+ const investigation = getStepData(ctx, "investigate");
6
+ // Dry run — skip the entire act phase
7
+ if (ctx.config.dryRun) {
8
+ ctx.logger.info("Dry run mode — skipping act phase");
9
+ ctx.skipPhase("act", "Dry run mode");
10
+ return {
11
+ status: "success",
12
+ data: { action: "dry-run", recommendation: investigation?.recommendation ?? "unknown" },
13
+ };
14
+ }
15
+ if (!investigation) {
16
+ ctx.skipPhase("act", "No investigation result");
17
+ return { status: "failed", reason: "No investigation result available" };
18
+ }
19
+ const recommendation = investigation.recommendation;
20
+ // SKIP — no novel issues
21
+ if (/skip/i.test(recommendation)) {
22
+ ctx.logger.info("Recommendation is SKIP — no novel issues found");
23
+ ctx.skipPhase("act", "Recommendation: skip");
24
+ return {
25
+ status: "success",
26
+ data: { action: "skip", recommendation },
27
+ };
28
+ }
29
+ // +1 EXISTING — add occurrence to existing issue
30
+ if (/\+1 existing/i.test(recommendation)) {
31
+ ctx.logger.info(`Recommendation is +1 EXISTING — adding occurrence to ${investigation.existingIssue}`);
32
+ if (investigation.existingIssue) {
33
+ try {
34
+ const existing = await issueTracker.getIssue(investigation.existingIssue);
35
+ const date = new Date().toISOString().split("T")[0];
36
+ await issueTracker.addComment(existing.id, `+1 detected on ${date}`);
37
+ ctx.logger.info(`Added +1 occurrence to ${investigation.existingIssue}`);
38
+ }
39
+ catch (err) {
40
+ ctx.logger.warn(`Failed to add occurrence: ${err}`);
41
+ }
42
+ }
43
+ ctx.skipPhase("act", `+1 existing ${investigation.existingIssue}`);
44
+ return {
45
+ status: "success",
46
+ data: {
47
+ action: "+1",
48
+ recommendation,
49
+ issueIdentifier: investigation.existingIssue,
50
+ },
51
+ };
52
+ }
53
+ // IMPLEMENT — proceed with fix
54
+ ctx.logger.info("Recommendation is IMPLEMENT — proceeding with fix");
55
+ return {
56
+ status: "success",
57
+ data: { action: "implement", recommendation },
58
+ };
59
+ }
60
+ //# sourceMappingURL=novelty-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"novelty-gate.js","sourceRoot":"","sources":["../../../../src/recipes/triage/steps/novelty-gate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAkC;IAClE,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAwB,cAAc,CAAC,CAAC;IAC9E,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAEtD,sCAAsC;IACtC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACrD,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QACrC,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,IAAI,SAAS,EAAE;SACxF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAChD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;IAC3E,CAAC;IAED,MAAM,cAAc,GAAG,aAAa,CAAC,cAAc,CAAC;IAEpD,yBAAyB;IACzB,IAAI,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAClE,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;QAC7C,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE;SACzC,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,IAAI,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,wDAAwD,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC;QAEvG,IAAI,aAAa,CAAC,aAAa,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;gBAC1E,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,MAAM,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,kBAAkB,IAAI,EAAE,CAAC,CAAC;gBACrE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC;YAC3E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,eAAe,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC;QACnE,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE;gBACJ,MAAM,EAAE,IAAI;gBACZ,cAAc;gBACd,eAAe,EAAE,aAAa,CAAC,aAAa;aAC7C;SACF,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACrE,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { StepResult, WorkflowContext } from "../../../types.js";
2
+ import type { TriageConfig } from "../types.js";
3
+ /** Verify that observability and issue tracker providers are reachable. */
4
+ export declare function verifyAccess(ctx: WorkflowContext<TriageConfig>): Promise<StepResult>;
5
+ //# sourceMappingURL=verify-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-access.d.ts","sourceRoot":"","sources":["../../../../src/recipes/triage/steps/verify-access.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,2EAA2E;AAC3E,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAU1F"}
@@ -0,0 +1,11 @@
1
+ /** Verify that observability and issue tracker providers are reachable. */
2
+ export async function verifyAccess(ctx) {
3
+ const observability = ctx.providers.get("observability");
4
+ await observability.verifyAccess();
5
+ ctx.logger.info("Observability provider access verified");
6
+ const issueTracker = ctx.providers.get("issueTracker");
7
+ await issueTracker.verifyAccess();
8
+ ctx.logger.info("Issue tracker access verified");
9
+ return { status: "success" };
10
+ }
11
+ //# sourceMappingURL=verify-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-access.js","sourceRoot":"","sources":["../../../../src/recipes/triage/steps/verify-access.ts"],"names":[],"mappings":"AAKA,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAkC;IACnE,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAwB,eAAe,CAAC,CAAC;IAChF,MAAM,aAAa,CAAC,YAAY,EAAE,CAAC;IACnC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAE1D,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAwB,cAAc,CAAC,CAAC;IAC9E,MAAM,YAAY,CAAC,YAAY,EAAE,CAAC;IAClC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAEjD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { WorkflowContext, StepResult } from "../../types.js";
2
+ import { createProviderRegistry } from "../../runner.js";
3
+ import type { TriageConfig } from "./types.js";
4
+ export declare const silentLogger: {
5
+ info: import("vitest").Mock<import("@vitest/spy").Procedure>;
6
+ debug: import("vitest").Mock<import("@vitest/spy").Procedure>;
7
+ warn: import("vitest").Mock<import("@vitest/spy").Procedure>;
8
+ error: import("vitest").Mock<import("@vitest/spy").Procedure>;
9
+ };
10
+ export declare const defaultConfig: TriageConfig;
11
+ /** Create a mock WorkflowContext with sensible defaults. Override anything via params. */
12
+ export declare function createCtx(overrides?: {
13
+ config?: Partial<TriageConfig>;
14
+ results?: Map<string, StepResult>;
15
+ providers?: ReturnType<typeof createProviderRegistry>;
16
+ }): WorkflowContext<TriageConfig>;
17
+ //# sourceMappingURL=test-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../../src/recipes/triage/test-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,eAAO,MAAM,YAAY;;;;;CAKxB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,YAoB3B,CAAC;AAEF,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;CACvD,GAAG,eAAe,CAAC,YAAY,CAAC,CAShC"}
@@ -0,0 +1,41 @@
1
+ import { vi } from "vitest";
2
+ import { createProviderRegistry } from "../../runner.js";
3
+ export const silentLogger = {
4
+ info: vi.fn(),
5
+ debug: vi.fn(),
6
+ warn: vi.fn(),
7
+ error: vi.fn(),
8
+ };
9
+ export const defaultConfig = {
10
+ timeRange: "1h",
11
+ severityFocus: "error",
12
+ serviceFilter: "api-*",
13
+ investigationDepth: "normal",
14
+ maxInvestigateTurns: 10,
15
+ maxImplementTurns: 20,
16
+ serviceMapPath: "",
17
+ projectId: "proj-1",
18
+ bugLabelId: "label-bug",
19
+ triageLabelId: "label-triage",
20
+ stateBacklog: "state-backlog",
21
+ stateInProgress: "state-progress",
22
+ statePeerReview: "state-review",
23
+ repository: "org/repo",
24
+ dryRun: false,
25
+ noveltyMode: false,
26
+ issueOverride: "",
27
+ additionalInstructions: "",
28
+ agentEnv: {},
29
+ };
30
+ /** Create a mock WorkflowContext with sensible defaults. Override anything via params. */
31
+ export function createCtx(overrides) {
32
+ return {
33
+ config: { ...defaultConfig, ...overrides?.config },
34
+ logger: silentLogger,
35
+ results: overrides?.results ?? new Map(),
36
+ providers: overrides?.providers ?? createProviderRegistry(),
37
+ skipPhase: vi.fn(),
38
+ isPhaseSkipped: vi.fn(() => false),
39
+ };
40
+ }
41
+ //# sourceMappingURL=test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/recipes/triage/test-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;IACd,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,SAAS,EAAE,IAAI;IACf,aAAa,EAAE,OAAO;IACtB,aAAa,EAAE,OAAO;IACtB,kBAAkB,EAAE,QAAQ;IAC5B,mBAAmB,EAAE,EAAE;IACvB,iBAAiB,EAAE,EAAE;IACrB,cAAc,EAAE,EAAE;IAClB,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,WAAW;IACvB,aAAa,EAAE,cAAc;IAC7B,YAAY,EAAE,eAAe;IAC7B,eAAe,EAAE,gBAAgB;IACjC,eAAe,EAAE,cAAc;IAC/B,UAAU,EAAE,UAAU;IACtB,MAAM,EAAE,KAAK;IACb,WAAW,EAAE,KAAK;IAClB,aAAa,EAAE,EAAE;IACjB,sBAAsB,EAAE,EAAE;IAC1B,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,0FAA0F;AAC1F,MAAM,UAAU,SAAS,CAAC,SAIzB;IACC,OAAO;QACL,MAAM,EAAE,EAAE,GAAG,aAAa,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE;QAClD,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,SAAS,EAAE,OAAO,IAAI,IAAI,GAAG,EAAE;QACxC,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,sBAAsB,EAAE;QAC3D,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;QAClB,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,79 @@
1
+ /** Configuration for the triage recipe. Provider-agnostic — no Linear/GitHub specifics. */
2
+ export interface TriageConfig {
3
+ timeRange: string;
4
+ severityFocus: string;
5
+ serviceFilter: string;
6
+ investigationDepth: string;
7
+ maxInvestigateTurns: number;
8
+ maxImplementTurns: number;
9
+ serviceMapPath: string;
10
+ projectId: string;
11
+ bugLabelId: string;
12
+ triageLabelId: string;
13
+ stateBacklog: string;
14
+ stateInProgress: string;
15
+ statePeerReview: string;
16
+ repository: string;
17
+ dryRun: boolean;
18
+ noveltyMode: boolean;
19
+ issueOverride: string;
20
+ additionalInstructions: string;
21
+ agentEnv: Record<string, string>;
22
+ }
23
+ /** Result of the investigation (learn) phase. */
24
+ export interface InvestigationResult {
25
+ issuesFound: boolean;
26
+ bestCandidate: boolean;
27
+ recommendation: string;
28
+ existingIssue: string;
29
+ targetRepo: string;
30
+ shouldImplement: boolean;
31
+ }
32
+ /** Result of the implementation (act) phase. */
33
+ export interface ImplementResult {
34
+ issueIdentifier: string;
35
+ issueUrl: string;
36
+ prUrl: string;
37
+ prNumber: number;
38
+ skipped: boolean;
39
+ skipReason?: string;
40
+ }
41
+ /** Data from build-context step. */
42
+ export interface BuildContextData {
43
+ knownIssuesContent: string;
44
+ }
45
+ /** Data from create-issue step. */
46
+ export interface IssueData {
47
+ issueId: string;
48
+ issueIdentifier: string;
49
+ issueTitle: string;
50
+ issueUrl: string;
51
+ issueBranchName?: string;
52
+ }
53
+ /** Data from implement-fix step. */
54
+ export interface ImplementFixData {
55
+ branchName: string;
56
+ hasCodeChanges: boolean;
57
+ }
58
+ /** Data from create-pr step. */
59
+ export interface PrData {
60
+ issueIdentifier: string;
61
+ issueUrl: string;
62
+ prUrl: string;
63
+ prNumber: number;
64
+ }
65
+ /** Data from cross-repo-check step. */
66
+ export interface CrossRepoData {
67
+ dispatched: boolean;
68
+ targetRepo?: string;
69
+ }
70
+ /** Maps triage step names to their typed data output. */
71
+ export interface TriageStepDataMap {
72
+ "build-context": BuildContextData;
73
+ investigate: InvestigationResult;
74
+ "create-issue": IssueData;
75
+ "cross-repo-check": CrossRepoData;
76
+ "implement-fix": ImplementFixData;
77
+ "create-pr": PrData;
78
+ }
79
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/recipes/triage/types.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,MAAM,WAAW,YAAY;IAE3B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IAGvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IAGxB,UAAU,EAAE,MAAM,CAAC;IAGnB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAG/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,iDAAiD;AACjD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,mCAAmC;AACnC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,gCAAgC;AAChC,MAAM,WAAW,MAAM;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,gBAAgB,CAAC;IAClC,WAAW,EAAE,mBAAmB,CAAC;IACjC,cAAc,EAAE,SAAS,CAAC;IAC1B,kBAAkB,EAAE,aAAa,CAAC;IAClC,eAAe,EAAE,gBAAgB,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/recipes/triage/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { ProviderRegistry } from "./types.js";
2
+ /** Create an empty provider registry. */
3
+ export declare function createProviderRegistry(): ProviderRegistry;
4
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,yCAAyC;AACzC,wBAAgB,sBAAsB,IAAI,gBAAgB,CAmBzD"}
@@ -0,0 +1,19 @@
1
+ /** Create an empty provider registry. */
2
+ export function createProviderRegistry() {
3
+ const store = new Map();
4
+ return {
5
+ get(key) {
6
+ if (!store.has(key)) {
7
+ throw new Error(`Provider "${key}" is not registered`);
8
+ }
9
+ return store.get(key);
10
+ },
11
+ has(key) {
12
+ return store.has(key);
13
+ },
14
+ set(key, provider) {
15
+ store.set(key, provider);
16
+ },
17
+ };
18
+ }
19
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAEA,yCAAyC;AACzC,MAAM,UAAU,sBAAsB;IACpC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEzC,OAAO;QACL,GAAG,CAAI,GAAW;YAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,qBAAqB,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAM,CAAC;QAC7B,CAAC;QAED,GAAG,CAAC,GAAW;YACb,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QAED,GAAG,CAAC,GAAW,EAAE,QAAiB;YAChC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { createProviderRegistry } from "./registry.js";
2
+ import type { ProviderRegistry, RunOptions, Workflow, WorkflowResult } from "./types.js";
3
+ /**
4
+ * Run a workflow end-to-end: learn → act → report.
5
+ *
6
+ * Steps execute in array order within their phase.
7
+ * If a learn step fails, the workflow is aborted (status: "failed").
8
+ * If an act or report step fails, remaining steps continue (status: "partial").
9
+ */
10
+ export declare function runWorkflow<TConfig>(workflow: Workflow<TConfig>, config: TConfig, providers: ProviderRegistry, options?: RunOptions): Promise<WorkflowResult>;
11
+ /** Re-export for convenience. */
12
+ export { createProviderRegistry };
13
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EAEV,QAAQ,EAGR,cAAc,EACf,MAAM,YAAY,CAAC;AAKpB;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,OAAO,EACvC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAC3B,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,gBAAgB,EAC3B,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,cAAc,CAAC,CAkGzB;AAED,iCAAiC;AACjC,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
package/dist/runner.js ADDED
@@ -0,0 +1,98 @@
1
+ import { consoleLogger } from "@swenyai/providers";
2
+ import { createProviderRegistry } from "./registry.js";
3
+ /** Phase execution order. */
4
+ const PHASE_ORDER = ["learn", "act", "report"];
5
+ /**
6
+ * Run a workflow end-to-end: learn → act → report.
7
+ *
8
+ * Steps execute in array order within their phase.
9
+ * If a learn step fails, the workflow is aborted (status: "failed").
10
+ * If an act or report step fails, remaining steps continue (status: "partial").
11
+ */
12
+ export async function runWorkflow(workflow, config, providers, options) {
13
+ const logger = options?.logger ?? consoleLogger;
14
+ const start = Date.now();
15
+ const skippedPhases = new Map();
16
+ const results = new Map();
17
+ const completedSteps = [];
18
+ const ctx = {
19
+ config,
20
+ logger,
21
+ results,
22
+ providers,
23
+ skipPhase(phase, reason) {
24
+ skippedPhases.set(phase, reason);
25
+ },
26
+ isPhaseSkipped(phase) {
27
+ return skippedPhases.has(phase);
28
+ },
29
+ };
30
+ // Group steps by phase
31
+ const stepsByPhase = new Map();
32
+ for (const phase of PHASE_ORDER) {
33
+ stepsByPhase.set(phase, workflow.steps.filter((s) => s.phase === phase));
34
+ }
35
+ let hasFailed = false;
36
+ let failedInLearn = false;
37
+ for (const phase of PHASE_ORDER) {
38
+ // If a learn step failed, abort entirely
39
+ if (failedInLearn)
40
+ break;
41
+ const steps = stepsByPhase.get(phase) ?? [];
42
+ for (const step of steps) {
43
+ // Check if this phase was skipped
44
+ if (skippedPhases.has(phase)) {
45
+ const result = {
46
+ status: "skipped",
47
+ reason: skippedPhases.get(phase),
48
+ };
49
+ results.set(step.name, result);
50
+ completedSteps.push({ name: step.name, phase, result });
51
+ continue;
52
+ }
53
+ // beforeStep hook — return false to skip
54
+ if (options?.beforeStep) {
55
+ const proceed = await options.beforeStep(step, ctx);
56
+ if (proceed === false) {
57
+ const result = { status: "skipped", reason: "Skipped by beforeStep hook" };
58
+ results.set(step.name, result);
59
+ completedSteps.push({ name: step.name, phase, result });
60
+ continue;
61
+ }
62
+ }
63
+ let result;
64
+ try {
65
+ logger.info(`[${workflow.name}] ${phase}/${step.name}: starting`);
66
+ result = await step.run(ctx);
67
+ logger.info(`[${workflow.name}] ${phase}/${step.name}: ${result.status}`);
68
+ }
69
+ catch (err) {
70
+ const message = err instanceof Error ? err.message : String(err);
71
+ logger.error(`[${workflow.name}] ${phase}/${step.name}: failed — ${message}`);
72
+ result = { status: "failed", reason: message };
73
+ hasFailed = true;
74
+ if (phase === "learn") {
75
+ failedInLearn = true;
76
+ }
77
+ }
78
+ results.set(step.name, result);
79
+ completedSteps.push({ name: step.name, phase, result });
80
+ // afterStep hook
81
+ if (options?.afterStep) {
82
+ await options.afterStep(step, result, ctx);
83
+ }
84
+ // Abort remaining steps if learn phase failed
85
+ if (failedInLearn)
86
+ break;
87
+ }
88
+ }
89
+ const status = failedInLearn ? "failed" : hasFailed ? "partial" : "completed";
90
+ return {
91
+ status,
92
+ steps: completedSteps,
93
+ duration: Date.now() - start,
94
+ };
95
+ }
96
+ /** Re-export for convenience. */
97
+ export { createProviderRegistry };
98
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { Logger } from "@swenyai/providers";
2
+ /** The three phases of every workflow. */
3
+ export type WorkflowPhase = "learn" | "act" | "report";
4
+ /** Result of executing a single step. */
5
+ export interface StepResult {
6
+ /** Whether the step succeeded, was skipped, or failed. */
7
+ status: "success" | "skipped" | "failed";
8
+ /** Arbitrary output data — downstream steps read this via context.results. */
9
+ data?: Record<string, unknown>;
10
+ /** Human-readable reason (especially useful for skipped/failed). */
11
+ reason?: string;
12
+ }
13
+ /** A single step in a workflow. */
14
+ export interface WorkflowStep<TConfig = unknown> {
15
+ /** Unique name within the workflow (used as key in context.results). */
16
+ name: string;
17
+ /** Which phase this step belongs to. */
18
+ phase: WorkflowPhase;
19
+ /** Execute the step. Return result. Throw to fail. */
20
+ run(ctx: WorkflowContext<TConfig>): Promise<StepResult>;
21
+ }
22
+ /** Mutable context threaded through all steps in a run. */
23
+ export interface WorkflowContext<TConfig = unknown> {
24
+ /** Recipe-specific configuration. */
25
+ config: TConfig;
26
+ /** Logger for structured output. */
27
+ logger: Logger;
28
+ /** Accumulated results from completed steps, keyed by step name. */
29
+ results: Map<string, StepResult>;
30
+ /** Bag of instantiated providers keyed by role. */
31
+ providers: ProviderRegistry;
32
+ /** Signal to short-circuit remaining steps in a phase. */
33
+ skipPhase(phase: WorkflowPhase, reason: string): void;
34
+ /** Check if a phase has been skipped. */
35
+ isPhaseSkipped(phase: WorkflowPhase): boolean;
36
+ }
37
+ /** Type-safe provider bag. */
38
+ export interface ProviderRegistry {
39
+ /** Get a provider by role key. Throws if not found. */
40
+ get<T>(key: string): T;
41
+ /** Check if a provider is registered under this key. */
42
+ has(key: string): boolean;
43
+ /** Register a provider under a role key. */
44
+ set(key: string, provider: unknown): void;
45
+ }
46
+ /** A complete workflow definition — an ordered list of steps grouped by phase. */
47
+ export interface Workflow<TConfig = unknown> {
48
+ /** Human-readable workflow name. */
49
+ name: string;
50
+ /** Optional description of what this workflow does. */
51
+ description?: string;
52
+ /** Ordered list of steps. Steps are executed in array order but grouped by phase. */
53
+ steps: WorkflowStep<TConfig>[];
54
+ }
55
+ /** Overall result of running a workflow. */
56
+ export interface WorkflowResult {
57
+ /** Completed = all steps done, failed = a learn step failed, partial = act/report failed. */
58
+ status: "completed" | "failed" | "partial";
59
+ /** Results for every step that was attempted. */
60
+ steps: Array<{
61
+ name: string;
62
+ phase: WorkflowPhase;
63
+ result: StepResult;
64
+ }>;
65
+ /** Total wall-clock milliseconds. */
66
+ duration: number;
67
+ }
68
+ /** Options for the workflow runner. */
69
+ export interface RunOptions {
70
+ /** Logger instance. Falls back to console. */
71
+ logger?: Logger;
72
+ /** Called before each step. Return false to skip the step. */
73
+ beforeStep?(step: WorkflowStep, ctx: WorkflowContext): Promise<boolean | void>;
74
+ /** Called after each step completes. */
75
+ afterStep?(step: WorkflowStep, result: StepResult, ctx: WorkflowContext): Promise<void>;
76
+ }
77
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,0CAA0C;AAC1C,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEvD,yCAAyC;AACzC,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzC,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,mCAAmC;AACnC,MAAM,WAAW,YAAY,CAAC,OAAO,GAAG,OAAO;IAC7C,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,EAAE,aAAa,CAAC;IACrB,sDAAsD;IACtD,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACzD;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe,CAAC,OAAO,GAAG,OAAO;IAChD,qCAAqC;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjC,mDAAmD;IACnD,SAAS,EAAE,gBAAgB,CAAC;IAC5B,0DAA0D;IAC1D,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,yCAAyC;IACzC,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;CAC/C;AAED,8BAA8B;AAC9B,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC;IACvB,wDAAwD;IACxD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,4CAA4C;IAC5C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3C;AAED,kFAAkF;AAClF,MAAM,WAAW,QAAQ,CAAC,OAAO,GAAG,OAAO;IACzC,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;CAChC;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,6FAA6F;IAC7F,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3C,iDAAiD;IACjD,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IACzE,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,uCAAuC;AACvC,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,UAAU,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC/E,wCAAwC;IACxC,SAAS,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzF"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@wickdninja/sweny-engine",
3
+ "version": "0.1.0",
4
+ "description": "Workflow engine for SWEny — Learn, Act, Report",
5
+ "type": "module",
6
+ "engines": {
7
+ "node": ">=22.0.0"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "LICENSE",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "prepack": "npm run build",
17
+ "typecheck": "tsc --noEmit",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest"
20
+ },
21
+ "exports": {
22
+ ".": "./dist/index.js"
23
+ },
24
+ "dependencies": {
25
+ "@swenyai/providers": "npm:@wickdninja/sweny-providers@^0.1.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^22",
29
+ "typescript": "^5.6",
30
+ "vitest": "^4"
31
+ },
32
+ "license": "MIT",
33
+ "homepage": "https://sweny.ai",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/swenyai/sweny.git",
37
+ "directory": "packages/engine"
38
+ }
39
+ }