claude-mcp-workflow 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 (66) hide show
  1. package/.claude-plugin/plugin.json +13 -0
  2. package/.mcp.json +9 -0
  3. package/LICENSE +21 -0
  4. package/README.md +260 -0
  5. package/build/dashboard.d.ts +4 -0
  6. package/build/dashboard.d.ts.map +1 -0
  7. package/build/dashboard.js +91 -0
  8. package/build/dashboard.js.map +1 -0
  9. package/build/engine.d.ts +55 -0
  10. package/build/engine.d.ts.map +1 -0
  11. package/build/engine.js +486 -0
  12. package/build/engine.js.map +1 -0
  13. package/build/index.d.ts +2 -0
  14. package/build/index.d.ts.map +1 -0
  15. package/build/index.js +60 -0
  16. package/build/index.js.map +1 -0
  17. package/build/loader.d.ts +29 -0
  18. package/build/loader.d.ts.map +1 -0
  19. package/build/loader.js +166 -0
  20. package/build/loader.js.map +1 -0
  21. package/build/modifier.d.ts +42 -0
  22. package/build/modifier.d.ts.map +1 -0
  23. package/build/modifier.js +96 -0
  24. package/build/modifier.js.map +1 -0
  25. package/build/storage.d.ts +12 -0
  26. package/build/storage.d.ts.map +1 -0
  27. package/build/storage.js +62 -0
  28. package/build/storage.js.map +1 -0
  29. package/build/tools.d.ts +7 -0
  30. package/build/tools.d.ts.map +1 -0
  31. package/build/tools.js +316 -0
  32. package/build/tools.js.map +1 -0
  33. package/build/types.d.ts +417 -0
  34. package/build/types.d.ts.map +1 -0
  35. package/build/types.js +82 -0
  36. package/build/types.js.map +1 -0
  37. package/dashboard/dagre.min.js +801 -0
  38. package/dashboard/index.html +652 -0
  39. package/hooks/hooks.json +24 -0
  40. package/hooks/workflow-cleanup.sh +51 -0
  41. package/hooks/workflow-start.sh +79 -0
  42. package/package.json +44 -0
  43. package/templates/bug-fix.yaml +283 -0
  44. package/templates/code-review.yaml +164 -0
  45. package/templates/coding.yaml +176 -0
  46. package/templates/debugging.yaml +162 -0
  47. package/templates/explore.yaml +90 -0
  48. package/templates/file-code.yaml +69 -0
  49. package/templates/file-review.yaml +164 -0
  50. package/templates/investigate.yaml +84 -0
  51. package/templates/master.yaml +202 -0
  52. package/templates/new-feature.yaml +41 -0
  53. package/templates/planning.yaml +85 -0
  54. package/templates/refactoring.yaml +56 -0
  55. package/templates/reflection.yaml +61 -0
  56. package/templates/skills/architecture/SKILL.md +55 -0
  57. package/templates/skills/coding-skill-selector/SKILL.md +25 -0
  58. package/templates/skills/lang-haxe/SKILL.md +257 -0
  59. package/templates/skills/lang-python/SKILL.md +16 -0
  60. package/templates/skills/math/SKILL.md +14 -0
  61. package/templates/skills/preferences/SKILL.md +25 -0
  62. package/templates/skills/task-delegation/SKILL.md +53 -0
  63. package/templates/skills/web-reading/SKILL.md +62 -0
  64. package/templates/subagent.yaml +67 -0
  65. package/templates/testing.yaml +120 -0
  66. package/templates/web-research.yaml +53 -0
@@ -0,0 +1,166 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import YAML from "yaml";
4
+ import { WorkflowDefinitionSchema } from "./types.js";
5
+ export class Loader {
6
+ _bundledDir;
7
+ _globalDir;
8
+ _projectDir;
9
+ _workflows = new Map();
10
+ _globalWatcher = null;
11
+ _projectWatcher = null;
12
+ constructor(bundledDir, globalDir, projectDir) {
13
+ this._bundledDir = bundledDir;
14
+ this._globalDir = globalDir;
15
+ this._projectDir = projectDir;
16
+ fs.mkdirSync(this._globalDir, { recursive: true });
17
+ if (this._projectDir)
18
+ fs.mkdirSync(this._projectDir, { recursive: true });
19
+ this._loadAll();
20
+ }
21
+ get(name) {
22
+ return this._workflows.get(name);
23
+ }
24
+ getAll() {
25
+ return new Map(this._workflows);
26
+ }
27
+ names() {
28
+ return Array.from(this._workflows.keys());
29
+ }
30
+ /** Directory where create saves new YAML files */
31
+ getWriteDir(scope) {
32
+ if (scope === "global")
33
+ return this._globalDir;
34
+ if (scope === "project") {
35
+ if (!this._projectDir)
36
+ throw new Error("No project directory available");
37
+ return this._projectDir;
38
+ }
39
+ // Default: project if available, else global
40
+ return this._projectDir ?? this._globalDir;
41
+ }
42
+ /** @deprecated Use getWriteDir() */
43
+ get writeDir() {
44
+ return this.getWriteDir();
45
+ }
46
+ startWatching() {
47
+ this._globalWatcher = this._watchDir(this._globalDir);
48
+ if (this._projectDir)
49
+ this._projectWatcher = this._watchDir(this._projectDir);
50
+ }
51
+ stopWatching() {
52
+ this._globalWatcher?.close();
53
+ this._globalWatcher = null;
54
+ this._projectWatcher?.close();
55
+ this._projectWatcher = null;
56
+ }
57
+ reload() {
58
+ this._loadAll();
59
+ }
60
+ /** Delete a workflow YAML file. */
61
+ delete(name, scope) {
62
+ const dirs = [];
63
+ if (scope !== "global" && this._projectDir)
64
+ dirs.push(this._projectDir);
65
+ if (scope !== "project")
66
+ dirs.push(this._globalDir);
67
+ for (const dir of dirs) {
68
+ const fp = this._findFile(dir, name);
69
+ if (fp) {
70
+ fs.unlinkSync(fp);
71
+ return fp;
72
+ }
73
+ }
74
+ const where = scope ?? "project or global";
75
+ throw new Error(`Workflow "${name}" not found in ${where} dir`);
76
+ }
77
+ _findFile(dir, name) {
78
+ for (const ext of [".yaml", ".yml"]) {
79
+ const fp = path.join(dir, name + ext);
80
+ if (fs.existsSync(fp))
81
+ return fp;
82
+ }
83
+ return null;
84
+ }
85
+ _watchDir(dir) {
86
+ try {
87
+ return fs.watch(dir, (_event, filename) => {
88
+ if (filename && (filename.endsWith(".yaml") || filename.endsWith(".yml")))
89
+ this._loadAll();
90
+ });
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ }
96
+ _loadAll() {
97
+ const next = new Map();
98
+ // Load bundled first (read-only defaults)
99
+ if (this._bundledDir)
100
+ this._loadDir(this._bundledDir, next);
101
+ // Global overrides bundled
102
+ this._loadDir(this._globalDir, next);
103
+ // Project overrides global
104
+ if (this._projectDir)
105
+ this._loadDir(this._projectDir, next);
106
+ this._workflows = next;
107
+ }
108
+ _loadDir(dir, target) {
109
+ if (!fs.existsSync(dir))
110
+ return;
111
+ const files = fs.readdirSync(dir)
112
+ .filter(f => f.endsWith(".yaml") || f.endsWith(".yml"));
113
+ for (const file of files) {
114
+ const fp = path.join(dir, file);
115
+ try {
116
+ const raw = fs.readFileSync(fp, "utf-8");
117
+ const parsed = YAML.parse(raw);
118
+ const validated = WorkflowDefinitionSchema.parse(parsed);
119
+ const errors = this._validate(validated);
120
+ if (errors.length > 0) {
121
+ console.error(`Validation errors in ${fp}: ${errors.join("; ")}`);
122
+ continue;
123
+ }
124
+ target.set(validated.name, validated);
125
+ }
126
+ catch (err) {
127
+ console.error(`Failed to load workflow ${fp}:`, err);
128
+ }
129
+ }
130
+ }
131
+ _validate(wf) {
132
+ const errors = [];
133
+ const stateNames = new Set(Object.keys(wf.states));
134
+ if (!stateNames.has(wf.initial))
135
+ errors.push(`initial state "${wf.initial}" does not exist`);
136
+ const hasTerminal = Object.values(wf.states).some(s => s.terminal);
137
+ if (!hasTerminal)
138
+ errors.push("no terminal state defined");
139
+ for (const [name, state] of Object.entries(wf.states)) {
140
+ if (state.transitions) {
141
+ for (const [tName, tgt] of Object.entries(state.transitions)) {
142
+ if (!stateNames.has(tgt))
143
+ errors.push(`state "${name}" transition "${tName}" → unknown state "${tgt}"`);
144
+ }
145
+ }
146
+ if (!state.prompt && !state.sub_workflow && !state.terminal)
147
+ errors.push(`state "${name}" has no prompt, sub_workflow, or terminal flag`);
148
+ if (state.sub_workflow && !state.on_complete)
149
+ errors.push(`state "${name}" has sub_workflow but no on_complete`);
150
+ // terminal + transitions is allowed: "soft terminal" — considered complete
151
+ // but can be re-entered via transitions (useful for top-level confirmation loops)
152
+ }
153
+ return errors;
154
+ }
155
+ validateReferences() {
156
+ const errors = [];
157
+ for (const [wfName, wf] of this._workflows) {
158
+ for (const [stateName, state] of Object.entries(wf.states)) {
159
+ if (state.sub_workflow && !this._workflows.has(state.sub_workflow))
160
+ errors.push(`${wfName}/${stateName}: sub_workflow "${state.sub_workflow}" not found`);
161
+ }
162
+ }
163
+ return errors;
164
+ }
165
+ }
166
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { StateDefinition } from "./types.js";
2
+ import type { Storage } from "./storage.js";
3
+ import type { Loader } from "./loader.js";
4
+ import type { Engine } from "./engine.js";
5
+ export interface ModifyInput {
6
+ readonly add_state?: {
7
+ readonly name: string;
8
+ readonly prompt?: string;
9
+ readonly transitions?: Record<string, string>;
10
+ readonly terminal?: boolean;
11
+ readonly outcome?: "complete" | "fail" | "needs_action";
12
+ readonly max_visits?: number;
13
+ readonly sub_workflow?: string;
14
+ readonly on_complete?: string;
15
+ readonly on_fail?: string;
16
+ };
17
+ readonly add_transition?: {
18
+ readonly from: string;
19
+ readonly name: string;
20
+ readonly to: string;
21
+ };
22
+ readonly remove_transition?: {
23
+ readonly from: string;
24
+ readonly name: string;
25
+ };
26
+ }
27
+ export declare class Modifier {
28
+ private readonly _storage;
29
+ private readonly _loader;
30
+ private _engine?;
31
+ constructor(storage: Storage, loader: Loader);
32
+ /** Late-bind engine to break circular dependency (Engine ↔ Modifier). */
33
+ setEngine(engine: Engine): void;
34
+ modify(sessionId: string, changes: ModifyInput): Promise<string[]>;
35
+ create(name: string, definition: {
36
+ readonly description?: string;
37
+ readonly initial: string;
38
+ readonly max_transitions?: number;
39
+ readonly states: Record<string, StateDefinition>;
40
+ }, scope?: "project" | "global"): Promise<string>;
41
+ }
42
+ //# sourceMappingURL=modifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modifier.d.ts","sourceRoot":"","sources":["../src/modifier.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,eAAe,EAAqB,MAAM,YAAY,CAAC;AAEnF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,cAAc,CAAC;QACxD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,cAAc,CAAC,EAAE;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,iBAAiB,CAAC,EAAE;QAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IAK5C,yEAAyE;IAClE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsDlE,MAAM,CACjB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE;QACV,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;KAClD,EACD,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAC3B,OAAO,CAAC,MAAM,CAAC;CAuCnB"}
@@ -0,0 +1,96 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import YAML from "yaml";
4
+ import { WorkflowDefinitionSchema } from "./types.js";
5
+ export class Modifier {
6
+ _storage;
7
+ _loader;
8
+ _engine;
9
+ constructor(storage, loader) {
10
+ this._storage = storage;
11
+ this._loader = loader;
12
+ }
13
+ /** Late-bind engine to break circular dependency (Engine ↔ Modifier). */
14
+ setEngine(engine) {
15
+ this._engine = engine;
16
+ }
17
+ async modify(sessionId, changes) {
18
+ const session = this._storage.read(sessionId);
19
+ if (!session)
20
+ throw new Error(`Session "${sessionId}" not found`);
21
+ if (session.stack.length === 0)
22
+ throw new Error("No active workflow to modify");
23
+ // When pending_pop is active, overlays target the parent frame's workflow
24
+ // (the child completed but couldn't pop because parent lacks on_complete/on_fail)
25
+ let frame = session.stack[session.active_frame];
26
+ if (session.pending_pop && session.active_frame > 0)
27
+ frame = session.stack[session.active_frame - 1];
28
+ const wfName = frame.workflow;
29
+ const messages = [];
30
+ const existing = session.overrides[wfName] ?? {};
31
+ const updated = { ...existing };
32
+ if (changes.add_state) {
33
+ const { name, ...stateDef } = changes.add_state;
34
+ const addStates = { ...(updated.add_states ?? {}), [name]: stateDef };
35
+ updated.add_states = addStates;
36
+ messages.push(`Added state "${name}"`);
37
+ }
38
+ if (changes.add_transition) {
39
+ const addTransitions = [...(updated.add_transitions ?? []), changes.add_transition];
40
+ updated.add_transitions = addTransitions;
41
+ messages.push(`Added transition "${changes.add_transition.from}" --${changes.add_transition.name}--> "${changes.add_transition.to}"`);
42
+ }
43
+ if (changes.remove_transition) {
44
+ const removeTransitions = [...(updated.remove_transitions ?? []), changes.remove_transition];
45
+ updated.remove_transitions = removeTransitions;
46
+ messages.push(`Removed transition "${changes.remove_transition.name}" from "${changes.remove_transition.from}"`);
47
+ }
48
+ const updatedSession = {
49
+ ...session,
50
+ overrides: { ...session.overrides, [wfName]: updated },
51
+ updated_at: new Date().toISOString(),
52
+ };
53
+ await this._storage.write(sessionId, updatedSession);
54
+ // If there's a pending pop, retry it now — the overlay may have added the missing on_complete/on_fail
55
+ if (this._engine && updatedSession.pending_pop) {
56
+ const result = await this._engine.retryPendingPop(sessionId);
57
+ if (result) {
58
+ messages.push(`Pending pop resolved → ${result.currentWorkflow} @ ${result.currentStateName}`);
59
+ }
60
+ }
61
+ return messages;
62
+ }
63
+ async create(name, definition, scope) {
64
+ const full = { name, ...definition };
65
+ // Validate
66
+ const validated = WorkflowDefinitionSchema.parse(full);
67
+ // Check states consistency
68
+ const stateNames = new Set(Object.keys(validated.states));
69
+ if (!stateNames.has(validated.initial)) {
70
+ throw new Error(`Initial state "${validated.initial}" not found in states`);
71
+ }
72
+ const hasTerminal = Object.values(validated.states).some(s => s.terminal);
73
+ if (!hasTerminal) {
74
+ throw new Error("Workflow must have at least one terminal state");
75
+ }
76
+ for (const [sn, state] of Object.entries(validated.states)) {
77
+ if (state.transitions) {
78
+ for (const [tn, target] of Object.entries(state.transitions)) {
79
+ if (!stateNames.has(target)) {
80
+ throw new Error(`State "${sn}" transition "${tn}" → unknown state "${target}"`);
81
+ }
82
+ }
83
+ }
84
+ }
85
+ // Write YAML
86
+ const writeDir = this._loader.getWriteDir(scope);
87
+ const yamlContent = YAML.stringify(full);
88
+ const filePath = path.join(writeDir, `${name}.yaml`);
89
+ fs.mkdirSync(writeDir, { recursive: true });
90
+ fs.writeFileSync(filePath, yamlContent);
91
+ // Reload to pick up the new workflow
92
+ this._loader.reload();
93
+ return filePath;
94
+ }
95
+ }
96
+ //# sourceMappingURL=modifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modifier.js","sourceRoot":"","sources":["../src/modifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { SessionState } from "./types.js";
2
+ export declare class Storage {
3
+ private readonly _stateDir;
4
+ constructor(stateDir: string);
5
+ private _filePath;
6
+ read(sessionId: string): SessionState | null;
7
+ write(sessionId: string, state: SessionState): Promise<void>;
8
+ list(): string[];
9
+ delete(sessionId: string): boolean;
10
+ readAll(): SessionState[];
11
+ }
12
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,QAAQ,EAAE,MAAM;IAK5B,OAAO,CAAC,SAAS;IAKV,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAOtC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBlE,IAAI,IAAI,MAAM,EAAE;IAOhB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAOlC,OAAO,IAAI,YAAY,EAAE;CAKjC"}
@@ -0,0 +1,62 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import lockfile from "proper-lockfile";
4
+ import { LOCK_STALE_MS } from "./types.js";
5
+ export class Storage {
6
+ _stateDir;
7
+ constructor(stateDir) {
8
+ this._stateDir = stateDir;
9
+ fs.mkdirSync(this._stateDir, { recursive: true });
10
+ }
11
+ _filePath(sessionId) {
12
+ const safe = sessionId.replace(/[^a-zA-Z0-9_-]/g, "_");
13
+ return path.join(this._stateDir, `${safe}.json`);
14
+ }
15
+ read(sessionId) {
16
+ const fp = this._filePath(sessionId);
17
+ if (!fs.existsSync(fp))
18
+ return null;
19
+ const raw = fs.readFileSync(fp, "utf-8");
20
+ return JSON.parse(raw);
21
+ }
22
+ async write(sessionId, state) {
23
+ const fp = this._filePath(sessionId);
24
+ const dir = path.dirname(fp);
25
+ fs.mkdirSync(dir, { recursive: true });
26
+ // Create file if it doesn't exist (lockfile needs it)
27
+ if (!fs.existsSync(fp)) {
28
+ fs.writeFileSync(fp, "{}");
29
+ }
30
+ let release;
31
+ try {
32
+ release = await lockfile.lock(fp, { stale: LOCK_STALE_MS });
33
+ const tmp = fp + ".tmp";
34
+ fs.writeFileSync(tmp, JSON.stringify(state, null, 2));
35
+ fs.renameSync(tmp, fp);
36
+ }
37
+ finally {
38
+ if (release)
39
+ await release();
40
+ }
41
+ }
42
+ list() {
43
+ if (!fs.existsSync(this._stateDir))
44
+ return [];
45
+ return fs.readdirSync(this._stateDir)
46
+ .filter(f => f.endsWith(".json"))
47
+ .map(f => f.replace(/\.json$/, ""));
48
+ }
49
+ delete(sessionId) {
50
+ const fp = this._filePath(sessionId);
51
+ if (!fs.existsSync(fp))
52
+ return false;
53
+ fs.unlinkSync(fp);
54
+ return true;
55
+ }
56
+ readAll() {
57
+ return this.list()
58
+ .map(id => this.read(id))
59
+ .filter((s) => s !== null);
60
+ }
61
+ }
62
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Engine } from "./engine.js";
3
+ import type { Modifier } from "./modifier.js";
4
+ import type { Loader } from "./loader.js";
5
+ import type { Storage } from "./storage.js";
6
+ export declare function registerTools(server: McpServer, engine: Engine, modifier: Modifier, loader: Loader, storage: Storage): void;
7
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AA2D5C,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GACf,IAAI,CA+RN"}