@signhify/agents 0.0.0-stage → 0.3.2

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 (46) hide show
  1. package/README.md +20 -2
  2. package/dist/__tests__/orchestrator.test.d.ts +2 -0
  3. package/dist/__tests__/orchestrator.test.d.ts.map +1 -0
  4. package/dist/__tests__/orchestrator.test.js +353 -0
  5. package/dist/__tests__/orchestrator.test.js.map +1 -0
  6. package/dist/__tests__/planner.test.d.ts +2 -0
  7. package/dist/__tests__/planner.test.d.ts.map +1 -0
  8. package/dist/__tests__/planner.test.js +29 -0
  9. package/dist/__tests__/planner.test.js.map +1 -0
  10. package/dist/browser-use.d.ts +8 -0
  11. package/dist/browser-use.d.ts.map +1 -0
  12. package/dist/browser-use.js +34 -0
  13. package/dist/browser-use.js.map +1 -0
  14. package/dist/editor.d.ts +8 -0
  15. package/dist/editor.d.ts.map +1 -0
  16. package/dist/editor.js +134 -0
  17. package/dist/editor.js.map +1 -0
  18. package/dist/file-picker.d.ts +8 -0
  19. package/dist/file-picker.d.ts.map +1 -0
  20. package/dist/file-picker.js +64 -0
  21. package/dist/file-picker.js.map +1 -0
  22. package/dist/index.d.ts +8 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +7 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/llm.d.ts +14 -0
  27. package/dist/llm.d.ts.map +1 -0
  28. package/dist/llm.js +34 -0
  29. package/dist/llm.js.map +1 -0
  30. package/dist/orchestrator.d.ts +18 -0
  31. package/dist/orchestrator.d.ts.map +1 -0
  32. package/dist/orchestrator.js +254 -0
  33. package/dist/orchestrator.js.map +1 -0
  34. package/dist/planner.d.ts +26 -0
  35. package/dist/planner.d.ts.map +1 -0
  36. package/dist/planner.js +119 -0
  37. package/dist/planner.js.map +1 -0
  38. package/dist/reviewer.d.ts +10 -0
  39. package/dist/reviewer.d.ts.map +1 -0
  40. package/dist/reviewer.js +164 -0
  41. package/dist/reviewer.js.map +1 -0
  42. package/dist/types.d.ts +56 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +2 -0
  45. package/dist/types.js.map +1 -0
  46. package/package.json +36 -4
@@ -0,0 +1,119 @@
1
+ import { shouldUseAdapter, completeWithAdapter } from './llm.js';
2
+ const SUBAGENT_ROLES = ['file-picker', 'editor', 'reviewer', 'browser-use'];
3
+ /**
4
+ * Parse a model plan out of its reply: a JSON array under a [plan] or ```json
5
+ * fence, or anywhere in the text. Returns null when nothing usable is there —
6
+ * the caller then falls back to the template roadmap.
7
+ */
8
+ export function parsePlanSteps(text) {
9
+ if (!text.trim())
10
+ return null;
11
+ const match = text.match(/\[[\s\S]*\]/);
12
+ if (!match)
13
+ return null;
14
+ try {
15
+ const parsed = JSON.parse(match[0]);
16
+ if (!Array.isArray(parsed) || parsed.length === 0)
17
+ return null;
18
+ const steps = [];
19
+ for (const item of parsed) {
20
+ if (item === null || typeof item !== 'object')
21
+ return null;
22
+ const step = item;
23
+ if (typeof step.id !== 'string' || typeof step.title !== 'string' || !step.title.trim())
24
+ return null;
25
+ if (!SUBAGENT_ROLES.includes(step.subagent))
26
+ return null;
27
+ steps.push({ id: step.id, title: step.title, subagent: step.subagent });
28
+ }
29
+ return steps;
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * TaskNode[] mirroring the plan: first step is the root, the rest become its
37
+ * children — this is the `T1 → T1.n` tree the sidebar and TaskManager read.
38
+ */
39
+ export function buildTaskNodes(steps) {
40
+ if (steps.length === 0)
41
+ return [];
42
+ const root = steps[0];
43
+ return steps.map((step, i) => ({
44
+ id: step.id,
45
+ title: step.title,
46
+ status: 'pending',
47
+ ...(i > 0 ? { parentId: root.id } : {}),
48
+ }));
49
+ }
50
+ export class PlannerSubagent {
51
+ role = 'planner';
52
+ name = '@Planner';
53
+ description = 'Formulates hierarchical task roadmaps and assigns specialized subagents';
54
+ async run(task, _cwd, ctx) {
55
+ if (ctx?.signal?.aborted) {
56
+ return { success: false, output: '', error: 'Subagent cancelled by user' };
57
+ }
58
+ const objective = task.objective;
59
+ let steps;
60
+ if (shouldUseAdapter(ctx)) {
61
+ const system = 'You are @Planner, a coding-task planner. Reply with ONLY a JSON array ' +
62
+ '(no prose) of 2-5 steps shaped [{"id":"T1","title":"...","subagent":"file-picker|editor|reviewer"}]. ' +
63
+ 'The first step scopes the work (subagent file-picker); later steps implement and verify.';
64
+ try {
65
+ const reply = await completeWithAdapter(ctx, system, `Objective: "${objective}". Existing context notes: ${JSON.stringify(task.context ?? {})}`);
66
+ const parsed = parsePlanSteps(reply);
67
+ if (parsed) {
68
+ steps = parsed;
69
+ }
70
+ else {
71
+ steps = this.templateSteps(objective);
72
+ }
73
+ }
74
+ catch (error) {
75
+ if (ctx?.signal?.aborted)
76
+ throw error;
77
+ steps = this.templateSteps(objective);
78
+ }
79
+ }
80
+ else {
81
+ steps = this.templateSteps(objective);
82
+ }
83
+ const tasks = buildTaskNodes(steps);
84
+ // Persist the task tree when a store is wired (tasks table, T1 → T1.n).
85
+ for (const t of tasks) {
86
+ ctx?.memory?.saveTask({ id: t.id, parentId: t.parentId, title: t.title, status: t.status });
87
+ }
88
+ const planSummary = [
89
+ `### Roadmap Generated by @Planner for: "${objective}"`,
90
+ ...steps.map(s => `- **[${s.id}]** ${s.title} -> Assigned to \`@${s.subagent}\``),
91
+ ctx?.memory ? `\nPersisted ${tasks.length} task node(s) to the task tree.` : '',
92
+ ].join('\n');
93
+ return {
94
+ success: true,
95
+ output: planSummary,
96
+ metadata: { steps, tasks },
97
+ };
98
+ }
99
+ templateSteps(objective) {
100
+ return [
101
+ {
102
+ id: 'T1',
103
+ title: `Scope and inspect files related to: ${objective.slice(0, 50)}`,
104
+ subagent: 'file-picker',
105
+ },
106
+ {
107
+ id: 'T1.1',
108
+ title: `Implement changes for: ${objective.slice(0, 50)}`,
109
+ subagent: 'editor',
110
+ },
111
+ {
112
+ id: 'T1.2',
113
+ title: `Verify changes, run tests and validate stop condition`,
114
+ subagent: 'reviewer',
115
+ },
116
+ ];
117
+ }
118
+ }
119
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Subagent, SubagentTask, SubagentResult, SubagentContext, ReviewVerdict } from './types.js';
2
+ export declare function parseReviewVerdict(text: string): ReviewVerdict | null;
3
+ export declare class ReviewerSubagent implements Subagent {
4
+ readonly role = "reviewer";
5
+ readonly name = "@Reviewer";
6
+ readonly description = "Executes verification suites, inspects diffs, and validates goal stop conditions";
7
+ run(task: SubagentTask, _cwd: string, ctx?: SubagentContext): Promise<SubagentResult>;
8
+ private defaultVerdict;
9
+ }
10
+ //# sourceMappingURL=reviewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGpG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA8BrE;AAED,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,sFAAsF;IAEpG,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAmH3F,OAAO,CAAC,cAAc;CAiBvB"}
@@ -0,0 +1,164 @@
1
+ import { shouldUseAdapter, completeWithAdapter } from './llm.js';
2
+ export function parseReviewVerdict(text) {
3
+ if (!text || !text.trim())
4
+ return null;
5
+ const trimmed = text.trim();
6
+ try {
7
+ const parsed = JSON.parse(trimmed);
8
+ if (typeof parsed?.met === 'boolean') {
9
+ return {
10
+ met: parsed.met,
11
+ reason: typeof parsed.reason === 'string' ? parsed.reason : '',
12
+ remainingSteps: Array.isArray(parsed.remainingSteps) ? parsed.remainingSteps.map(String) : [],
13
+ };
14
+ }
15
+ }
16
+ catch {
17
+ // not raw JSON
18
+ }
19
+ const match = trimmed.match(/\{[\s\S]*?\}/);
20
+ if (!match)
21
+ return null;
22
+ try {
23
+ const parsed = JSON.parse(match[0]);
24
+ if (typeof parsed?.met === 'boolean') {
25
+ return {
26
+ met: parsed.met,
27
+ reason: typeof parsed.reason === 'string' ? parsed.reason : '',
28
+ remainingSteps: Array.isArray(parsed.remainingSteps) ? parsed.remainingSteps.map(String) : [],
29
+ };
30
+ }
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ return null;
36
+ }
37
+ export class ReviewerSubagent {
38
+ role = 'reviewer';
39
+ name = '@Reviewer';
40
+ description = 'Executes verification suites, inspects diffs, and validates goal stop conditions';
41
+ async run(task, _cwd, ctx) {
42
+ if (ctx?.signal?.aborted) {
43
+ return { success: false, output: '', error: 'Subagent cancelled by user' };
44
+ }
45
+ const testCommand = task.context?.testCommand === false
46
+ ? undefined
47
+ : (typeof task.context?.testCommand === 'string' ? task.context.testCommand : 'npm test -- --run');
48
+ const instructions = (typeof task.context?.instructions === 'string' && task.context.instructions) ||
49
+ task.objective ||
50
+ 'Verify implementation against requirements';
51
+ const diff = (typeof task.context?.diff === 'string' && task.context.diff) || '';
52
+ if (testCommand && !ctx?.invokeTool) {
53
+ return { success: false, output: '', error: 'Reviewer commands require the host shell-exec permission pipeline.' };
54
+ }
55
+ let execution = { exitCode: 0, stdout: '', stderr: '' };
56
+ let testError;
57
+ if (testCommand && ctx?.invokeTool) {
58
+ try {
59
+ const result = await ctx.invokeTool('shell-exec', { command: testCommand, timeoutMs: 30_000 });
60
+ if (ctx?.signal?.aborted) {
61
+ return { success: false, output: '', error: 'Subagent cancelled by user' };
62
+ }
63
+ if (result.isError) {
64
+ execution = { exitCode: 1, stderr: result.content };
65
+ testError = result.content;
66
+ }
67
+ else {
68
+ try {
69
+ execution = JSON.parse(result.content);
70
+ }
71
+ catch {
72
+ execution = { exitCode: 0, stdout: result.content };
73
+ }
74
+ if (execution.exitCode !== 0) {
75
+ testError = (execution.stderr || execution.stdout || `Command exited with code ${execution.exitCode ?? 'unknown'}`).slice(0, 500);
76
+ }
77
+ }
78
+ }
79
+ catch (err) {
80
+ if (ctx?.signal?.aborted) {
81
+ return { success: false, output: '', error: 'Subagent cancelled by user' };
82
+ }
83
+ const errorOutput = err instanceof Error ? err.message : String(err);
84
+ execution = { exitCode: 1, stderr: errorOutput };
85
+ testError = errorOutput;
86
+ }
87
+ }
88
+ let verdict;
89
+ // Check if a structured verdict was explicitly provided in task context (e.g. testing)
90
+ if (task.context?.verdict && typeof task.context.verdict === 'object') {
91
+ const v = task.context.verdict;
92
+ verdict = {
93
+ met: v.met ?? false,
94
+ reason: v.reason ?? '',
95
+ remainingSteps: Array.isArray(v.remainingSteps) ? v.remainingSteps.map(String) : [],
96
+ exitCode: execution.exitCode,
97
+ };
98
+ }
99
+ else if (shouldUseAdapter(ctx)) {
100
+ const system = 'You are @Reviewer, a verification and code review subagent. Evaluate the changes and test results against the task instructions. ' +
101
+ 'Respond with ONLY a JSON object: { "met": boolean, "reason": string, "remainingSteps": string[] }. No markdown fences, no preamble.';
102
+ const user = [
103
+ `Instructions: ${instructions}`,
104
+ testCommand ? `Test Command: ${testCommand}` : '',
105
+ `Test Exit Code: ${execution.exitCode ?? 0}`,
106
+ execution.stdout ? `Test Stdout: ${execution.stdout.slice(0, 500)}` : '',
107
+ execution.stderr ? `Test Stderr: ${execution.stderr.slice(0, 500)}` : '',
108
+ diff ? `Changes/Diff:\n${diff}` : '',
109
+ ].filter(Boolean).join('\n');
110
+ try {
111
+ const reply = await completeWithAdapter(ctx, system, user);
112
+ if (ctx?.signal?.aborted) {
113
+ return { success: false, output: '', error: 'Subagent cancelled by user' };
114
+ }
115
+ const parsedVerdict = parseReviewVerdict(reply);
116
+ if (parsedVerdict) {
117
+ verdict = { ...parsedVerdict, exitCode: execution.exitCode };
118
+ }
119
+ else {
120
+ verdict = this.defaultVerdict(execution, testError);
121
+ }
122
+ }
123
+ catch (error) {
124
+ if (ctx?.signal?.aborted)
125
+ throw error;
126
+ verdict = this.defaultVerdict(execution, testError);
127
+ }
128
+ }
129
+ else {
130
+ verdict = this.defaultVerdict(execution, testError);
131
+ }
132
+ const stdout = execution.stdout ?? '';
133
+ const stderr = execution.stderr ?? '';
134
+ const statusText = verdict.met ? 'verified: command completed successfully.' : `check failed:\n${verdict.reason}`;
135
+ return {
136
+ success: verdict.met,
137
+ output: `@Reviewer ${statusText}${verdict.remainingSteps.length > 0 ? `\nRemaining steps:\n${verdict.remainingSteps.map((s) => `- ${s}`).join('\n')}` : ''}${stdout && verdict.met ? `\n\n${stdout.slice(0, 500)}` : ''}`,
138
+ metadata: {
139
+ verdict,
140
+ exitCode: execution.exitCode,
141
+ stdout: stdout.slice(0, 500),
142
+ stderr: stderr.slice(0, 500),
143
+ },
144
+ ...(verdict.met ? {} : { error: verdict.reason }),
145
+ };
146
+ }
147
+ defaultVerdict(execution, testError) {
148
+ if (testError || (execution.exitCode !== undefined && execution.exitCode !== 0)) {
149
+ return {
150
+ met: false,
151
+ reason: testError || `Command exited with code ${execution.exitCode ?? 'unknown'}`,
152
+ remainingSteps: ['Fix failing tests and review issues.'],
153
+ exitCode: execution.exitCode,
154
+ };
155
+ }
156
+ return {
157
+ met: true,
158
+ reason: 'Verification completed successfully against instructions.',
159
+ remainingSteps: [],
160
+ exitCode: execution.exitCode ?? 0,
161
+ };
162
+ }
163
+ }
164
+ //# sourceMappingURL=reviewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export type SubagentRole = 'file-picker' | 'planner' | 'editor' | 'reviewer' | 'browser-use';
2
+ export interface SubagentTask {
3
+ id: string;
4
+ role: SubagentRole;
5
+ objective: string;
6
+ context?: Record<string, unknown>;
7
+ dependsOn?: string[];
8
+ parentId?: string | null;
9
+ }
10
+ export interface ReviewVerdict {
11
+ met: boolean;
12
+ reason: string;
13
+ remainingSteps: string[];
14
+ exitCode?: number;
15
+ }
16
+ export interface SubagentResult {
17
+ success: boolean;
18
+ output: string;
19
+ artifacts?: string[];
20
+ error?: string;
21
+ metadata?: Record<string, unknown>;
22
+ }
23
+ /** Persistence seam for planner task trees; satisfied by MemoryStore.saveTask. */
24
+ export interface TaskPersister {
25
+ saveTask(task: {
26
+ id: string;
27
+ parentId?: string | null;
28
+ title: string;
29
+ status?: 'pending' | 'in_progress' | 'blocked' | 'done';
30
+ progressLog?: string;
31
+ }): void;
32
+ }
33
+ /** Runtime handed to every subagent by the orchestrator. */
34
+ export interface SubagentContext {
35
+ adapter?: import('@signhify/providers').ModelProviderAdapter;
36
+ model?: string;
37
+ signal?: AbortSignal;
38
+ memory?: TaskPersister;
39
+ invokeTool?: (name: 'file-io' | 'shell-exec', args: Record<string, unknown>) => Promise<{
40
+ content: string;
41
+ isError?: boolean;
42
+ }>;
43
+ onProgress?: (event: SubagentProgressEvent) => void;
44
+ }
45
+ export interface SubagentProgressEvent {
46
+ type: 'status' | 'log' | 'diff' | 'error' | 'done';
47
+ message: string;
48
+ data?: unknown;
49
+ }
50
+ export interface Subagent {
51
+ readonly role: SubagentRole;
52
+ readonly name: string;
53
+ readonly description: string;
54
+ run(task: SubagentTask, cwd: string, ctx?: SubagentContext): Promise<SubagentResult>;
55
+ }
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,aAAa,GACb,SAAS,GACT,QAAQ,GACR,UAAU,GACV,aAAa,CAAC;AAElB,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;QACxD,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,IAAI,CAAC;CACV;AAED,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,qBAAqB,EAAE,oBAAoB,CAAC;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAChI,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACtF"}
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 CHANGED
@@ -1,6 +1,38 @@
1
1
  {
2
2
  "name": "@signhify/agents",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.3.2",
4
+ "description": "Specialized subagents for Signhify CLI (@FilePicker, @Planner, @Editor, @Reviewer, @BrowserUse)",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -b",
20
+ "dev": "tsc -b --watch",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "vitest run",
23
+ "clean": "node -e \"const {rmSync,existsSync}=require('fs');['dist','*.tsbuildinfo'].forEach(p=>{if(existsSync(p))rmSync(p,{recursive:true,force:true})})\""
24
+ },
25
+ "dependencies": {
26
+ "@signhify/core": "^0.3.2",
27
+ "@signhify/providers": "^0.3.2"
28
+ },
29
+ "devDependencies": {
30
+ "@signhify/memory": "^0.2.0",
31
+ "@types/node": "^20.11.0",
32
+ "typescript": "^5.5.0",
33
+ "vitest": "^2.0.0"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ }
38
+ }