@sweny-ai/core 0.1.77 → 0.1.79
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.
- package/dist/browser.d.ts +11 -5
- package/dist/browser.js +11 -11
- package/dist/claude.d.ts +16 -0
- package/dist/claude.js +98 -9
- package/dist/cli/config.d.ts +22 -0
- package/dist/cli/config.js +56 -9
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.js +56 -57
- package/dist/cli/marketplace.js +35 -9
- package/dist/cli/publish.d.ts +10 -0
- package/dist/cli/publish.js +22 -14
- package/dist/loader.d.ts +40 -0
- package/dist/loader.js +73 -0
- package/dist/mcp-catalog.d.ts +47 -0
- package/dist/mcp-catalog.js +304 -0
- package/dist/mcp.d.ts +6 -9
- package/dist/mcp.js +24 -314
- package/dist/schema.d.ts +183 -151
- package/dist/schema.js +49 -7
- package/dist/skills/custom-loader.d.ts +40 -0
- package/dist/skills/custom-loader.js +107 -32
- package/dist/skills/index.d.ts +13 -1
- package/dist/skills/index.js +12 -3
- package/dist/studio.js +4 -1
- package/dist/templates.d.ts +29 -8
- package/dist/templates.js +30 -20
- package/dist/types.d.ts +12 -0
- package/dist/verify.js +96 -7
- package/package.json +8 -4
- package/dist/__tests__/cascade.test.d.ts +0 -11
- package/dist/__tests__/cascade.test.js +0 -452
- package/dist/__tests__/claude.test.d.ts +0 -1
- package/dist/__tests__/claude.test.js +0 -427
- package/dist/__tests__/custom-loader.test.d.ts +0 -1
- package/dist/__tests__/custom-loader.test.js +0 -116
- package/dist/__tests__/executor.test.d.ts +0 -1
- package/dist/__tests__/executor.test.js +0 -1635
- package/dist/__tests__/integration/datadog.integration.test.d.ts +0 -1
- package/dist/__tests__/integration/datadog.integration.test.js +0 -23
- package/dist/__tests__/integration/e2e-workflow.integration.test.d.ts +0 -1
- package/dist/__tests__/integration/e2e-workflow.integration.test.js +0 -75
- package/dist/__tests__/integration/github.integration.test.d.ts +0 -1
- package/dist/__tests__/integration/github.integration.test.js +0 -37
- package/dist/__tests__/integration/harness.d.ts +0 -24
- package/dist/__tests__/integration/harness.js +0 -34
- package/dist/__tests__/integration/linear.integration.test.d.ts +0 -1
- package/dist/__tests__/integration/linear.integration.test.js +0 -15
- package/dist/__tests__/integration/sentry.integration.test.d.ts +0 -1
- package/dist/__tests__/integration/sentry.integration.test.js +0 -20
- package/dist/__tests__/integration/slack.integration.test.d.ts +0 -1
- package/dist/__tests__/integration/slack.integration.test.js +0 -22
- package/dist/__tests__/integration/sources.integration.test.d.ts +0 -1
- package/dist/__tests__/integration/sources.integration.test.js +0 -123
- package/dist/__tests__/publish.test.d.ts +0 -1
- package/dist/__tests__/publish.test.js +0 -180
- package/dist/__tests__/requires.test.d.ts +0 -1
- package/dist/__tests__/requires.test.js +0 -82
- package/dist/__tests__/retry.test.d.ts +0 -1
- package/dist/__tests__/retry.test.js +0 -213
- package/dist/__tests__/schema.test.d.ts +0 -1
- package/dist/__tests__/schema.test.js +0 -600
- package/dist/__tests__/skill-config-integration.test.d.ts +0 -1
- package/dist/__tests__/skill-config-integration.test.js +0 -204
- package/dist/__tests__/skills-index.test.d.ts +0 -1
- package/dist/__tests__/skills-index.test.js +0 -119
- package/dist/__tests__/skills.test.d.ts +0 -1
- package/dist/__tests__/skills.test.js +0 -565
- package/dist/__tests__/spec-conformance.test.d.ts +0 -18
- package/dist/__tests__/spec-conformance.test.js +0 -1084
- package/dist/__tests__/studio.test.d.ts +0 -1
- package/dist/__tests__/studio.test.js +0 -403
- package/dist/__tests__/templates.test.d.ts +0 -1
- package/dist/__tests__/templates.test.js +0 -49
- package/dist/__tests__/testing.test.d.ts +0 -1
- package/dist/__tests__/testing.test.js +0 -242
- package/dist/__tests__/verify.test.d.ts +0 -1
- package/dist/__tests__/verify.test.js +0 -517
- package/dist/__tests__/version-consistency.test.d.ts +0 -1
- package/dist/__tests__/version-consistency.test.js +0 -312
- package/dist/__tests__/workflow-builder.test.d.ts +0 -1
- package/dist/__tests__/workflow-builder.test.js +0 -110
- package/dist/__tests__/workflow-yaml.test.d.ts +0 -1
- package/dist/__tests__/workflow-yaml.test.js +0 -201
- package/dist/cli/__tests__/diagram.test.d.ts +0 -1
- package/dist/cli/__tests__/diagram.test.js +0 -225
- package/dist/cli/__tests__/report-cloud.test.d.ts +0 -1
- package/dist/cli/__tests__/report-cloud.test.js +0 -165
- package/dist/cli/__tests__/upgrade.test.d.ts +0 -1
- package/dist/cli/__tests__/upgrade.test.js +0 -317
- package/dist/cli/__tests__/version-check.test.d.ts +0 -1
- package/dist/cli/__tests__/version-check.test.js +0 -209
- package/dist/cli/config.test.d.ts +0 -1
- package/dist/cli/config.test.js +0 -200
- package/dist/cli/credentials.test.d.ts +0 -1
- package/dist/cli/credentials.test.js +0 -172
- package/dist/cli/e2e.test.d.ts +0 -1
- package/dist/cli/e2e.test.js +0 -690
- package/dist/cli/marketplace.test.d.ts +0 -1
- package/dist/cli/marketplace.test.js +0 -355
- package/dist/cli/new.test.d.ts +0 -1
- package/dist/cli/new.test.js +0 -1043
- package/dist/cli/output.test.d.ts +0 -1
- package/dist/cli/output.test.js +0 -180
- package/dist/cli/publish.test.d.ts +0 -1
- package/dist/cli/publish.test.js +0 -610
- package/dist/cli/renderer.test.d.ts +0 -1
- package/dist/cli/renderer.test.js +0 -302
- package/dist/executor.test.d.ts +0 -1
- package/dist/executor.test.js +0 -618
- package/dist/mcp.test.d.ts +0 -1
- package/dist/mcp.test.js +0 -735
- package/dist/mermaid.test.d.ts +0 -1
- package/dist/mermaid.test.js +0 -256
- package/dist/sources.test.d.ts +0 -1
- package/dist/sources.test.js +0 -265
- package/dist/sources.validation.test.d.ts +0 -12
- package/dist/sources.validation.test.js +0 -380
- package/dist/workflow-builder.test.d.ts +0 -1
- package/dist/workflow-builder.test.js +0 -123
package/dist/templates.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Template loading for
|
|
2
|
+
* Template + rules/context loading for the CLI.
|
|
3
3
|
*
|
|
4
|
-
* Templates can come from:
|
|
4
|
+
* Templates and additional-context documents can come from:
|
|
5
5
|
* 1. Local file path (relative to repo root)
|
|
6
6
|
* 2. URL (fetched at runtime)
|
|
7
|
-
* 3. Built-in defaults
|
|
7
|
+
* 3. Built-in defaults / inline text
|
|
8
8
|
*
|
|
9
|
-
* Delegates to
|
|
10
|
-
*
|
|
9
|
+
* Delegates to source-resolver.ts for the actual fetch. Fix #16: both
|
|
10
|
+
* `loadTemplate` and `loadAdditionalContext` now honor `offline` and
|
|
11
|
+
* `fetchAuth` the same way the executor's per-node Sources do, so CLI-level
|
|
12
|
+
* rules/context stay consistent with everything the executor touches later.
|
|
11
13
|
*/
|
|
12
14
|
import * as path from "node:path";
|
|
13
15
|
import { classifySource } from "./sources.js";
|
|
@@ -50,39 +52,43 @@ export const DEFAULT_PR_TEMPLATE = `## Summary
|
|
|
50
52
|
## Related Issues
|
|
51
53
|
Fixes #
|
|
52
54
|
`;
|
|
53
|
-
|
|
54
|
-
function defaultCtx(cwd) {
|
|
55
|
+
function buildCtx(options) {
|
|
55
56
|
return {
|
|
56
|
-
cwd,
|
|
57
|
-
env: process.env,
|
|
58
|
-
authConfig: {},
|
|
59
|
-
offline: false,
|
|
57
|
+
cwd: options.cwd ?? process.cwd(),
|
|
58
|
+
env: options.env ?? process.env,
|
|
59
|
+
authConfig: options.fetchAuth ?? {},
|
|
60
|
+
offline: options.offline ?? false,
|
|
60
61
|
logger: consoleLogger,
|
|
61
62
|
};
|
|
62
63
|
}
|
|
63
64
|
/**
|
|
64
65
|
* Load a template from a file path or URL.
|
|
65
66
|
* Returns the default if source is empty or loading fails.
|
|
67
|
+
*
|
|
68
|
+
* Accepts the legacy `cwd?: string` signature for backward compat.
|
|
66
69
|
*/
|
|
67
|
-
export async function loadTemplate(source, fallback,
|
|
70
|
+
export async function loadTemplate(source, fallback, options = {}) {
|
|
68
71
|
if (!source || source.trim() === "")
|
|
69
72
|
return fallback;
|
|
73
|
+
const opts = typeof options === "string" ? { cwd: options } : options;
|
|
70
74
|
try {
|
|
71
|
-
const resolved = await resolveSource(source.trim(), "template",
|
|
75
|
+
const resolved = await resolveSource(source.trim(), "template", buildCtx(opts));
|
|
72
76
|
return resolved.content;
|
|
73
77
|
}
|
|
74
78
|
catch (err) {
|
|
75
|
-
|
|
79
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
80
|
+
console.warn(`[templates] Failed to load template: ${msg}, using default`);
|
|
76
81
|
return fallback;
|
|
77
82
|
}
|
|
78
83
|
}
|
|
79
84
|
/**
|
|
80
85
|
* Resolve issue and PR templates from config.
|
|
81
86
|
*/
|
|
82
|
-
export async function resolveTemplates(config,
|
|
87
|
+
export async function resolveTemplates(config, options = {}) {
|
|
88
|
+
const opts = typeof options === "string" ? { cwd: options } : options;
|
|
83
89
|
const [issueTemplate, prTemplate] = await Promise.all([
|
|
84
|
-
loadTemplate(config.issueTemplate, DEFAULT_ISSUE_TEMPLATE,
|
|
85
|
-
loadTemplate(config.prTemplate, DEFAULT_PR_TEMPLATE,
|
|
90
|
+
loadTemplate(config.issueTemplate, DEFAULT_ISSUE_TEMPLATE, opts),
|
|
91
|
+
loadTemplate(config.prTemplate, DEFAULT_PR_TEMPLATE, opts),
|
|
86
92
|
]);
|
|
87
93
|
return { issueTemplate, prTemplate };
|
|
88
94
|
}
|
|
@@ -91,12 +97,15 @@ export async function resolveTemplates(config, cwd) {
|
|
|
91
97
|
* Each source is resolved eagerly (including URLs) and wrapped with a header.
|
|
92
98
|
* Returns { resolved, urls } — resolved text for all sources; urls is kept
|
|
93
99
|
* for API compat but will be empty since URLs now resolve eagerly.
|
|
100
|
+
*
|
|
101
|
+
* Accepts the legacy `cwd?: string` signature for backward compat.
|
|
94
102
|
*/
|
|
95
|
-
export async function loadAdditionalContext(sources,
|
|
103
|
+
export async function loadAdditionalContext(sources, options = {}) {
|
|
96
104
|
if (sources.length === 0)
|
|
97
105
|
return { resolved: "", urls: [] };
|
|
106
|
+
const opts = typeof options === "string" ? { cwd: options } : options;
|
|
98
107
|
const parts = [];
|
|
99
|
-
const ctx =
|
|
108
|
+
const ctx = buildCtx(opts);
|
|
100
109
|
for (const source of sources) {
|
|
101
110
|
const trimmed = source.trim();
|
|
102
111
|
if (!trimmed)
|
|
@@ -114,7 +123,8 @@ export async function loadAdditionalContext(sources, cwd = process.cwd()) {
|
|
|
114
123
|
}
|
|
115
124
|
}
|
|
116
125
|
catch (err) {
|
|
117
|
-
|
|
126
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
127
|
+
console.warn(`[templates] Failed to load context source: ${msg}`);
|
|
118
128
|
}
|
|
119
129
|
}
|
|
120
130
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -201,6 +201,18 @@ export interface ToolCall {
|
|
|
201
201
|
tool: string;
|
|
202
202
|
input: unknown;
|
|
203
203
|
output?: unknown;
|
|
204
|
+
/**
|
|
205
|
+
* Authoritative outcome of the tool invocation.
|
|
206
|
+
*
|
|
207
|
+
* When present, this is the source of truth for `verify` checks — the
|
|
208
|
+
* output-shape heuristic is a legacy fallback only. Set by the Claude
|
|
209
|
+
* runtime on tool completion: "success" when the tool returned normally,
|
|
210
|
+
* "error" when it threw or the MCP server returned is_error=true.
|
|
211
|
+
*
|
|
212
|
+
* Absent status indicates a legacy or hand-constructed ToolCall — verify
|
|
213
|
+
* falls back to inspecting `output` for an `error` key.
|
|
214
|
+
*/
|
|
215
|
+
status?: "success" | "error";
|
|
204
216
|
}
|
|
205
217
|
export type ExecutionEvent = {
|
|
206
218
|
type: "workflow:start";
|
package/dist/verify.js
CHANGED
|
@@ -69,19 +69,35 @@ export function resolvePath(data, path) {
|
|
|
69
69
|
}
|
|
70
70
|
return { ok: true, mode: parsed.mode, values: current };
|
|
71
71
|
}
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
//
|
|
72
|
+
// Legacy output-shape heuristic: a tool call "succeeded" when its output
|
|
73
|
+
// does not carry a non-null `error` field. Kept as a fallback for ToolCall
|
|
74
|
+
// records that predate the explicit `status` field (hand-constructed in
|
|
75
|
+
// tests, older runtimes). The Claude runtime now sets `status` directly.
|
|
75
76
|
export function isErrorOutput(output) {
|
|
76
77
|
if (!output || typeof output !== "object")
|
|
77
78
|
return false;
|
|
78
79
|
const err = output.error;
|
|
79
80
|
return err !== undefined && err !== null && err !== false;
|
|
80
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* A tool call is considered successful when:
|
|
84
|
+
* - explicit `status === "success"`, OR
|
|
85
|
+
* - no explicit status AND output does not look like an error.
|
|
86
|
+
*
|
|
87
|
+
* `status` is authoritative. It's the only signal we have for external MCP
|
|
88
|
+
* tools whose structured output isn't exposed to the workflow runtime.
|
|
89
|
+
*/
|
|
90
|
+
function didSucceed(c) {
|
|
91
|
+
if (c.status === "error")
|
|
92
|
+
return false;
|
|
93
|
+
if (c.status === "success")
|
|
94
|
+
return true;
|
|
95
|
+
return !isErrorOutput(c.output);
|
|
96
|
+
}
|
|
81
97
|
function succeededTools(toolCalls) {
|
|
82
98
|
const names = new Set();
|
|
83
99
|
for (const c of toolCalls) {
|
|
84
|
-
if (
|
|
100
|
+
if (didSucceed(c))
|
|
85
101
|
names.add(c.tool);
|
|
86
102
|
}
|
|
87
103
|
return names;
|
|
@@ -89,22 +105,73 @@ function succeededTools(toolCalls) {
|
|
|
89
105
|
function calledList(toolCalls) {
|
|
90
106
|
return toolCalls.map((c) => c.tool).join(", ") || "none";
|
|
91
107
|
}
|
|
108
|
+
// Tool aliases: first-party SWEny skill tool names ↔ their MCP-server equivalents.
|
|
109
|
+
//
|
|
110
|
+
// When an external MCP server is wired for the same provider a skill covers
|
|
111
|
+
// (e.g. the Linear HTTP MCP server alongside the `linear` skill), both sets of
|
|
112
|
+
// tools are presented to the agent and the agent may pick either. The calls
|
|
113
|
+
// are functionally equivalent — same backend, same effect — but the names
|
|
114
|
+
// differ, so a verify rule that lists one will fail when the agent picked the
|
|
115
|
+
// other. These aliases let either call satisfy the rule.
|
|
116
|
+
//
|
|
117
|
+
// Only unambiguous MCP tool names are aliased. Names that collide across
|
|
118
|
+
// providers (e.g. `get_issue` exists on both Linear and GitHub MCP servers)
|
|
119
|
+
// are deliberately omitted so a call to one provider cannot spuriously
|
|
120
|
+
// satisfy a rule about the other.
|
|
121
|
+
const TOOL_ALIAS_GROUPS = [
|
|
122
|
+
// Linear (official remote MCP at mcp.linear.app — upsert naming)
|
|
123
|
+
["linear_search_issues", "list_issues"],
|
|
124
|
+
["linear_create_issue", "save_issue"],
|
|
125
|
+
["linear_update_issue", "save_issue"],
|
|
126
|
+
["linear_add_comment", "save_comment"],
|
|
127
|
+
["linear_list_teams", "list_teams"],
|
|
128
|
+
// GitHub (github.com/github/github-mcp-server)
|
|
129
|
+
["github_create_issue", "create_issue"],
|
|
130
|
+
["github_search_issues", "search_issues"],
|
|
131
|
+
["github_add_comment", "add_issue_comment"],
|
|
132
|
+
["github_create_pr", "create_pull_request"],
|
|
133
|
+
];
|
|
134
|
+
const TOOL_ALIASES = (() => {
|
|
135
|
+
const map = new Map();
|
|
136
|
+
for (const group of TOOL_ALIAS_GROUPS) {
|
|
137
|
+
for (const name of group) {
|
|
138
|
+
let set = map.get(name);
|
|
139
|
+
if (!set) {
|
|
140
|
+
set = new Set();
|
|
141
|
+
map.set(name, set);
|
|
142
|
+
}
|
|
143
|
+
for (const other of group)
|
|
144
|
+
set.add(other);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return map;
|
|
148
|
+
})();
|
|
149
|
+
function expandAliases(name) {
|
|
150
|
+
return TOOL_ALIASES.get(name) ?? new Set([name]);
|
|
151
|
+
}
|
|
152
|
+
function anyAliasIn(name, set) {
|
|
153
|
+
for (const alias of expandAliases(name)) {
|
|
154
|
+
if (set.has(alias))
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
92
159
|
export function checkAnyToolCalled(required, toolCalls) {
|
|
93
160
|
const succeeded = succeededTools(toolCalls);
|
|
94
|
-
if (required.some((t) =>
|
|
161
|
+
if (required.some((t) => anyAliasIn(t, succeeded)))
|
|
95
162
|
return null;
|
|
96
163
|
return `any_tool_called: required one of [${required.join(", ")}] to succeed, called: [${calledList(toolCalls)}]`;
|
|
97
164
|
}
|
|
98
165
|
export function checkAllToolsCalled(required, toolCalls) {
|
|
99
166
|
const succeeded = succeededTools(toolCalls);
|
|
100
|
-
const missing = required.filter((t) => !
|
|
167
|
+
const missing = required.filter((t) => !anyAliasIn(t, succeeded));
|
|
101
168
|
if (missing.length === 0)
|
|
102
169
|
return null;
|
|
103
170
|
return `all_tools_called: missing successful calls to [${missing.join(", ")}], called: [${calledList(toolCalls)}]`;
|
|
104
171
|
}
|
|
105
172
|
export function checkNoToolCalled(forbidden, toolCalls) {
|
|
106
173
|
const calledNames = new Set(toolCalls.map((c) => c.tool));
|
|
107
|
-
const violated = forbidden.filter((t) =>
|
|
174
|
+
const violated = forbidden.filter((t) => anyAliasIn(t, calledNames));
|
|
108
175
|
if (violated.length === 0)
|
|
109
176
|
return null;
|
|
110
177
|
return `no_tool_called: forbidden tools were invoked: [${violated.join(", ")}], called: [${calledList(toolCalls)}]`;
|
|
@@ -180,8 +247,30 @@ export function checkOutputRequired(paths, data) {
|
|
|
180
247
|
return null;
|
|
181
248
|
return `output_required: ${failures.join("; ")}`;
|
|
182
249
|
}
|
|
250
|
+
/**
|
|
251
|
+
* Cap on `verify.output_matches[].matches` source length.
|
|
252
|
+
*
|
|
253
|
+
* `matches` is user-supplied through workflow YAML, including marketplace
|
|
254
|
+
* workflows. A pathological pattern like `(a+)+$` causes exponential
|
|
255
|
+
* backtracking in V8's regex engine. Capping the source length is a cheap,
|
|
256
|
+
* useful defense — well-formed verify regexes are tens of characters at
|
|
257
|
+
* most. Patterns longer than this are almost always either generated junk
|
|
258
|
+
* or a deliberate ReDoS attempt; either way, refusing to compile is safer
|
|
259
|
+
* than executing them.
|
|
260
|
+
*
|
|
261
|
+
* Caveat: length alone does NOT prevent all ReDoS — a 12-char pattern like
|
|
262
|
+
* `(a+)+$` is still catastrophic against the right input. Future work:
|
|
263
|
+
* gate compilation through `safe-regex` or use the `re2` engine for
|
|
264
|
+
* marketplace inputs. The cap closes the obvious abuse surface without
|
|
265
|
+
* adding a runtime dep right now.
|
|
266
|
+
*/
|
|
267
|
+
const MAX_REGEX_SOURCE_LENGTH = 1000;
|
|
183
268
|
function compileMatch(m) {
|
|
184
269
|
if (m.matches !== undefined) {
|
|
270
|
+
if (m.matches.length > MAX_REGEX_SOURCE_LENGTH) {
|
|
271
|
+
throw new Error(`regex source exceeds ${MAX_REGEX_SOURCE_LENGTH} characters (got ${m.matches.length}); ` +
|
|
272
|
+
`tighten the pattern to avoid catastrophic-backtracking risk`);
|
|
273
|
+
}
|
|
185
274
|
// Throws synchronously if the regex source is invalid; surfaced as a
|
|
186
275
|
// verify failure rather than a crash because the executor catches.
|
|
187
276
|
return { match: m, regex: new RegExp(m.matches) };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sweny-ai/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.79",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"sweny": "./dist/cli/main.js"
|
|
@@ -46,10 +46,11 @@
|
|
|
46
46
|
"dist"
|
|
47
47
|
],
|
|
48
48
|
"scripts": {
|
|
49
|
-
"build": "rm -rf dist && tsc && cp src/workflows/*.yml dist/workflows/ && node scripts/build-workflow-browser.mjs",
|
|
49
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json && cp src/workflows/*.yml dist/workflows/ && node scripts/build-workflow-browser.mjs && node scripts/write-public-schema.mjs",
|
|
50
50
|
"typecheck": "tsc --noEmit",
|
|
51
|
-
"test": "vitest run --exclude 'src/__tests__/integration/**'",
|
|
52
|
-
"test:integration": "vitest run --config vitest.integration.config.ts"
|
|
51
|
+
"test": "vitest run --exclude 'src/__tests__/integration/**' --exclude 'dist/**'",
|
|
52
|
+
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
53
|
+
"check:schema-drift": "node scripts/write-public-schema.mjs && git diff --exit-code -- ../../spec/public/schemas/workflow.json"
|
|
53
54
|
},
|
|
54
55
|
"dependencies": {
|
|
55
56
|
"@anthropic-ai/claude-agent-sdk": "^0.2.114",
|
|
@@ -61,6 +62,9 @@
|
|
|
61
62
|
},
|
|
62
63
|
"devDependencies": {
|
|
63
64
|
"@anthropic-ai/claude-code": "^2.1.114",
|
|
65
|
+
"ajv": "^8.18.0",
|
|
66
|
+
"esbuild": "^0.28.0",
|
|
67
|
+
"prettier": "^3.8.3",
|
|
64
68
|
"vitest": "^4.1.4"
|
|
65
69
|
},
|
|
66
70
|
"publishConfig": {
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rules / Context Cascade + max_turns Tests
|
|
3
|
-
*
|
|
4
|
-
* Covers the spec sections:
|
|
5
|
-
* - Workflow > Rules & Context
|
|
6
|
-
* - Workflow > Runtime Input (rules/context)
|
|
7
|
-
* - Nodes > Max Turns Semantics
|
|
8
|
-
* - Nodes > Rules & Context (cascade + `only` flag)
|
|
9
|
-
* - Nodes > Input Augmentation (assembly order)
|
|
10
|
-
*/
|
|
11
|
-
export {};
|