developer-ai 1.0.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 (105) hide show
  1. package/README.md +241 -0
  2. package/bin/developer-ai.js +2 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +219 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/index.d.ts +7 -0
  8. package/dist/config/index.d.ts.map +1 -0
  9. package/dist/config/index.js +82 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/config/schema.d.ts +115 -0
  12. package/dist/config/schema.d.ts.map +1 -0
  13. package/dist/config/schema.js +29 -0
  14. package/dist/config/schema.js.map +1 -0
  15. package/dist/constants.d.ts +8 -0
  16. package/dist/constants.d.ts.map +1 -0
  17. package/dist/constants.js +8 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/core/agent.d.ts +38 -0
  20. package/dist/core/agent.d.ts.map +1 -0
  21. package/dist/core/agent.js +155 -0
  22. package/dist/core/agent.js.map +1 -0
  23. package/dist/core/system-prompt.d.ts +6 -0
  24. package/dist/core/system-prompt.d.ts.map +1 -0
  25. package/dist/core/system-prompt.js +44 -0
  26. package/dist/core/system-prompt.js.map +1 -0
  27. package/dist/core/types.d.ts +42 -0
  28. package/dist/core/types.d.ts.map +1 -0
  29. package/dist/core/types.js +6 -0
  30. package/dist/core/types.js.map +1 -0
  31. package/dist/index.d.ts +15 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +12 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/mcp/client.d.ts +13 -0
  36. package/dist/mcp/client.d.ts.map +1 -0
  37. package/dist/mcp/client.js +202 -0
  38. package/dist/mcp/client.js.map +1 -0
  39. package/dist/providers/ollama.d.ts +13 -0
  40. package/dist/providers/ollama.d.ts.map +1 -0
  41. package/dist/providers/ollama.js +60 -0
  42. package/dist/providers/ollama.js.map +1 -0
  43. package/dist/providers/openai.d.ts +9 -0
  44. package/dist/providers/openai.d.ts.map +1 -0
  45. package/dist/providers/openai.js +40 -0
  46. package/dist/providers/openai.js.map +1 -0
  47. package/dist/skills/loader.d.ts +25 -0
  48. package/dist/skills/loader.d.ts.map +1 -0
  49. package/dist/skills/loader.js +93 -0
  50. package/dist/skills/loader.js.map +1 -0
  51. package/dist/tests/tools.test.d.ts +2 -0
  52. package/dist/tests/tools.test.d.ts.map +1 -0
  53. package/dist/tests/tools.test.js +170 -0
  54. package/dist/tests/tools.test.js.map +1 -0
  55. package/dist/tools/index.d.ts +5 -0
  56. package/dist/tools/index.d.ts.map +1 -0
  57. package/dist/tools/index.js +19 -0
  58. package/dist/tools/index.js.map +1 -0
  59. package/dist/tools/list-files.d.ts +3 -0
  60. package/dist/tools/list-files.d.ts.map +1 -0
  61. package/dist/tools/list-files.js +60 -0
  62. package/dist/tools/list-files.js.map +1 -0
  63. package/dist/tools/read-file.d.ts +3 -0
  64. package/dist/tools/read-file.d.ts.map +1 -0
  65. package/dist/tools/read-file.js +46 -0
  66. package/dist/tools/read-file.js.map +1 -0
  67. package/dist/tools/registry.d.ts +24 -0
  68. package/dist/tools/registry.d.ts.map +1 -0
  69. package/dist/tools/registry.js +37 -0
  70. package/dist/tools/registry.js.map +1 -0
  71. package/dist/tools/run-command.d.ts +3 -0
  72. package/dist/tools/run-command.d.ts.map +1 -0
  73. package/dist/tools/run-command.js +114 -0
  74. package/dist/tools/run-command.js.map +1 -0
  75. package/dist/tools/search-text.d.ts +3 -0
  76. package/dist/tools/search-text.d.ts.map +1 -0
  77. package/dist/tools/search-text.js +103 -0
  78. package/dist/tools/search-text.js.map +1 -0
  79. package/dist/tools/utils.d.ts +6 -0
  80. package/dist/tools/utils.d.ts.map +1 -0
  81. package/dist/tools/utils.js +14 -0
  82. package/dist/tools/utils.js.map +1 -0
  83. package/dist/tools/web-search.d.ts +3 -0
  84. package/dist/tools/web-search.d.ts.map +1 -0
  85. package/dist/tools/web-search.js +80 -0
  86. package/dist/tools/web-search.js.map +1 -0
  87. package/dist/tools/write-file.d.ts +3 -0
  88. package/dist/tools/write-file.d.ts.map +1 -0
  89. package/dist/tools/write-file.js +66 -0
  90. package/dist/tools/write-file.js.map +1 -0
  91. package/package.json +54 -0
  92. package/skills/accessibility/SKILL.md +496 -0
  93. package/skills/api-design/SKILL.md +419 -0
  94. package/skills/code-review/SKILL.md +267 -0
  95. package/skills/debugging/SKILL.md +332 -0
  96. package/skills/documentation/SKILL.md +496 -0
  97. package/skills/error-handling/SKILL.md +504 -0
  98. package/skills/git-workflow/SKILL.md +448 -0
  99. package/skills/human-like-coding/SKILL.md +400 -0
  100. package/skills/performance-optimization/SKILL.md +412 -0
  101. package/skills/prompt-engineering/SKILL.md +362 -0
  102. package/skills/refactoring/SKILL.md +457 -0
  103. package/skills/security-audit/SKILL.md +453 -0
  104. package/skills/testing-strategy/SKILL.md +501 -0
  105. package/skills/webapp-testing/SKILL.md +309 -0
@@ -0,0 +1,202 @@
1
+ import { spawn } from 'node:child_process';
2
+ // ---- Single MCP server connection (JSON-RPC over stdio) ----
3
+ class McpConnection {
4
+ serverName;
5
+ command;
6
+ args;
7
+ env;
8
+ process = null;
9
+ nextId = 1;
10
+ pending = new Map();
11
+ buffer = '';
12
+ constructor(serverName, command, args, env) {
13
+ this.serverName = serverName;
14
+ this.command = command;
15
+ this.args = args;
16
+ this.env = env;
17
+ }
18
+ async connect() {
19
+ this.process = spawn(this.command, this.args, {
20
+ env: { ...process.env, ...this.env },
21
+ stdio: ['pipe', 'pipe', 'pipe'],
22
+ });
23
+ this.process.stdout?.setEncoding('utf-8');
24
+ this.process.stdout?.on('data', (chunk) => {
25
+ this.buffer += chunk;
26
+ this.drain();
27
+ });
28
+ this.process.on('error', (err) => {
29
+ console.error(`MCP "${this.serverName}" process error: ${err.message}`);
30
+ });
31
+ this.process.on('exit', (code) => {
32
+ // Reject any outstanding requests
33
+ for (const p of this.pending.values()) {
34
+ p.reject(new Error(`MCP "${this.serverName}" exited with code ${code}`));
35
+ }
36
+ this.pending.clear();
37
+ });
38
+ // Handshake
39
+ await this.request('initialize', {
40
+ protocolVersion: '2024-11-05',
41
+ capabilities: {},
42
+ clientInfo: { name: 'developer-ai', version: '1.0.0' },
43
+ });
44
+ this.notify('notifications/initialized', {});
45
+ }
46
+ /** List available tools on this server. */
47
+ async listTools() {
48
+ const result = (await this.request('tools/list', {}));
49
+ return (result.tools ?? []).map((t) => ({
50
+ name: t.name,
51
+ description: t.description ?? '',
52
+ inputSchema: t.inputSchema ?? { type: 'object', properties: {} },
53
+ serverName: this.serverName,
54
+ }));
55
+ }
56
+ /** Invoke a tool and return text output. */
57
+ async callTool(name, args) {
58
+ const result = (await this.request('tools/call', {
59
+ name,
60
+ arguments: args,
61
+ }));
62
+ if (Array.isArray(result.content)) {
63
+ return result.content
64
+ .map((c) => (c.type === 'text' ? (c.text ?? '') : JSON.stringify(c)))
65
+ .join('\n');
66
+ }
67
+ return JSON.stringify(result);
68
+ }
69
+ disconnect() {
70
+ this.process?.kill();
71
+ this.process = null;
72
+ }
73
+ // ---- internals ----
74
+ request(method, params) {
75
+ return new Promise((resolve, reject) => {
76
+ const id = this.nextId++;
77
+ this.pending.set(id, { resolve, reject });
78
+ const msg = { jsonrpc: '2.0', id, method };
79
+ if (params)
80
+ msg.params = params;
81
+ this.process?.stdin?.write(JSON.stringify(msg) + '\n');
82
+ // Timeout
83
+ setTimeout(() => {
84
+ if (this.pending.has(id)) {
85
+ this.pending.delete(id);
86
+ reject(new Error(`MCP request "${method}" timed out`));
87
+ }
88
+ }, 15_000);
89
+ });
90
+ }
91
+ notify(method, params) {
92
+ const msg = { jsonrpc: '2.0', method, params };
93
+ this.process?.stdin?.write(JSON.stringify(msg) + '\n');
94
+ }
95
+ drain() {
96
+ const lines = this.buffer.split('\n');
97
+ this.buffer = lines.pop() ?? '';
98
+ for (const line of lines) {
99
+ const trimmed = line.trim();
100
+ if (!trimmed)
101
+ continue;
102
+ try {
103
+ const msg = JSON.parse(trimmed);
104
+ if (msg.id !== undefined && msg.id !== null) {
105
+ const p = this.pending.get(msg.id);
106
+ if (p) {
107
+ this.pending.delete(msg.id);
108
+ if (msg.error) {
109
+ p.reject(new Error(msg.error.message));
110
+ }
111
+ else {
112
+ p.resolve(msg.result);
113
+ }
114
+ }
115
+ }
116
+ }
117
+ catch {
118
+ // Non-JSON lines are ignored (e.g. stderr leaking to stdout)
119
+ }
120
+ }
121
+ }
122
+ }
123
+ export class McpManager {
124
+ connections = new Map();
125
+ toolMap = new Map();
126
+ cachedDefs = [];
127
+ async initialize(config) {
128
+ const entries = Object.entries(config.servers);
129
+ if (entries.length === 0)
130
+ return;
131
+ for (const [name, server] of entries) {
132
+ try {
133
+ const conn = new McpConnection(name, server.command, server.args, server.env);
134
+ await conn.connect();
135
+ this.connections.set(name, conn);
136
+ const tools = await conn.listTools();
137
+ for (const tool of tools) {
138
+ const nsName = `mcp_${name}_${tool.name}`;
139
+ this.toolMap.set(nsName, {
140
+ serverName: name,
141
+ originalName: tool.name,
142
+ });
143
+ this.cachedDefs.push({
144
+ type: 'function',
145
+ function: {
146
+ name: nsName,
147
+ description: `[MCP:${name}] ${tool.description}`,
148
+ parameters: tool.inputSchema,
149
+ },
150
+ });
151
+ }
152
+ }
153
+ catch (err) {
154
+ console.error(`⚠ MCP server "${name}" failed to connect: ${err.message}`);
155
+ }
156
+ }
157
+ }
158
+ getToolDefinitions() {
159
+ return this.cachedDefs;
160
+ }
161
+ isMcpTool(name) {
162
+ return this.toolMap.has(name);
163
+ }
164
+ async callTool(namespacedName, args) {
165
+ const mapping = this.toolMap.get(namespacedName);
166
+ if (!mapping) {
167
+ return {
168
+ success: false,
169
+ output: '',
170
+ error: `Unknown MCP tool: ${namespacedName}`,
171
+ };
172
+ }
173
+ const conn = this.connections.get(mapping.serverName);
174
+ if (!conn) {
175
+ return {
176
+ success: false,
177
+ output: '',
178
+ error: `MCP server "${mapping.serverName}" not connected`,
179
+ };
180
+ }
181
+ try {
182
+ const output = await conn.callTool(mapping.originalName, args);
183
+ return { success: true, output };
184
+ }
185
+ catch (err) {
186
+ return {
187
+ success: false,
188
+ output: '',
189
+ error: `MCP tool error: ${err.message}`,
190
+ };
191
+ }
192
+ }
193
+ disconnect() {
194
+ for (const conn of this.connections.values()) {
195
+ conn.disconnect();
196
+ }
197
+ this.connections.clear();
198
+ this.toolMap.clear();
199
+ this.cachedDefs = [];
200
+ }
201
+ }
202
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { LLMProvider, Message, ToolDefinition, ProviderResponse } from '../core/types.js';
2
+ /**
3
+ * Ollama provider — communicates with a local Ollama instance via HTTP.
4
+ * Supports tool calling for models that implement it (llama3.1+, qwen2.5+, etc).
5
+ */
6
+ export declare class OllamaProvider implements LLMProvider {
7
+ readonly name = "ollama";
8
+ private baseUrl;
9
+ private model;
10
+ constructor(model?: string, baseUrl?: string);
11
+ generate(messages: Message[], tools: ToolDefinition[]): Promise<ProviderResponse>;
12
+ }
13
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,OAAO,EACP,cAAc,EACd,gBAAgB,EAEjB,MAAM,kBAAkB,CAAC;AAE1B;;;GAGG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,SAAa,EAAE,OAAO,SAA2B;IAK5D,QAAQ,CACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,cAAc,EAAE,GACtB,OAAO,CAAC,gBAAgB,CAAC;CAsD7B"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Ollama provider — communicates with a local Ollama instance via HTTP.
3
+ * Supports tool calling for models that implement it (llama3.1+, qwen2.5+, etc).
4
+ */
5
+ export class OllamaProvider {
6
+ name = 'ollama';
7
+ baseUrl;
8
+ model;
9
+ constructor(model = 'llama3.1', baseUrl = 'http://localhost:11434') {
10
+ this.baseUrl = baseUrl.replace(/\/+$/, '');
11
+ this.model = model;
12
+ }
13
+ async generate(messages, tools) {
14
+ const body = {
15
+ model: this.model,
16
+ messages: messages.map((m) => {
17
+ const msg = {
18
+ role: m.role,
19
+ content: m.content ?? '',
20
+ };
21
+ if (m.tool_calls)
22
+ msg['tool_calls'] = m.tool_calls;
23
+ if (m.tool_call_id)
24
+ msg['tool_call_id'] = m.tool_call_id;
25
+ return msg;
26
+ }),
27
+ stream: false,
28
+ };
29
+ if (tools.length > 0) {
30
+ body['tools'] = tools;
31
+ }
32
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
33
+ method: 'POST',
34
+ headers: { 'Content-Type': 'application/json' },
35
+ body: JSON.stringify(body),
36
+ });
37
+ if (!response.ok) {
38
+ const text = await response.text();
39
+ throw new Error(`Ollama API error (${response.status}): ${text}`);
40
+ }
41
+ const data = (await response.json());
42
+ const msg = data.message;
43
+ const toolCalls = (msg.tool_calls ?? []).map((tc, idx) => ({
44
+ id: `ollama_${Date.now()}_${idx}`,
45
+ type: 'function',
46
+ function: {
47
+ name: tc.function.name,
48
+ arguments: typeof tc.function.arguments === 'string'
49
+ ? tc.function.arguments
50
+ : JSON.stringify(tc.function.arguments),
51
+ },
52
+ }));
53
+ return {
54
+ content: msg.content || null,
55
+ toolCalls,
56
+ finishReason: data.done_reason ?? (toolCalls.length > 0 ? 'tool_calls' : 'stop'),
57
+ };
58
+ }
59
+ }
60
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,QAAQ,CAAC;IACjB,OAAO,CAAS;IAChB,KAAK,CAAS;IAEtB,YAAY,KAAK,GAAG,UAAU,EAAE,OAAO,GAAG,wBAAwB;QAChE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAmB,EACnB,KAAuB;QAEvB,MAAM,IAAI,GAA4B;YACpC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC3B,MAAM,GAAG,GAA4B;oBACnC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;iBACzB,CAAC;gBACF,IAAI,CAAC,CAAC,UAAU;oBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;gBACnD,IAAI,CAAC,CAAC,YAAY;oBAAE,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC;gBACzD,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;YACF,MAAM,EAAE,KAAK;SACd,CAAC;QAEF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QAEzB,MAAM,SAAS,GAAe,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CACtD,CAAC,EAAkB,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC;YACpC,EAAE,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE;YACjC,IAAI,EAAE,UAAmB;YACzB,QAAQ,EAAE;gBACR,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;gBACtB,SAAS,EACP,OAAO,EAAE,CAAC,QAAQ,CAAC,SAAS,KAAK,QAAQ;oBACvC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS;oBACvB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;aAC5C;SACF,CAAC,CACH,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;YAC5B,SAAS;YACT,YAAY,EACV,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;SACrE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { LLMProvider, Message, ToolDefinition, ProviderResponse } from '../core/types.js';
2
+ export declare class OpenAIProvider implements LLMProvider {
3
+ readonly name = "openai";
4
+ private client;
5
+ private model;
6
+ constructor(apiKey: string, model?: string);
7
+ generate(messages: Message[], tools: ToolDefinition[]): Promise<ProviderResponse>;
8
+ }
9
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,OAAO,EACP,cAAc,EACd,gBAAgB,EAEjB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,SAAW;IAKtC,QAAQ,CACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,cAAc,EAAE,GACtB,OAAO,CAAC,gBAAgB,CAAC;CAkC7B"}
@@ -0,0 +1,40 @@
1
+ import OpenAI from 'openai';
2
+ export class OpenAIProvider {
3
+ name = 'openai';
4
+ client;
5
+ model;
6
+ constructor(apiKey, model = 'gpt-4o') {
7
+ this.client = new OpenAI({ apiKey });
8
+ this.model = model;
9
+ }
10
+ async generate(messages, tools) {
11
+ const response = await this.client.chat.completions.create({
12
+ model: this.model,
13
+ messages: messages,
14
+ ...(tools.length > 0
15
+ ? {
16
+ tools: tools,
17
+ tool_choice: 'auto',
18
+ }
19
+ : {}),
20
+ });
21
+ const choice = response.choices[0];
22
+ if (!choice) {
23
+ throw new Error('No response from OpenAI — empty choices array.');
24
+ }
25
+ const toolCalls = (choice.message.tool_calls ?? []).map((tc) => ({
26
+ id: tc.id,
27
+ type: 'function',
28
+ function: {
29
+ name: tc.function.name,
30
+ arguments: tc.function.arguments,
31
+ },
32
+ }));
33
+ return {
34
+ content: choice.message.content,
35
+ toolCalls,
36
+ finishReason: choice.finish_reason ?? 'stop',
37
+ };
38
+ }
39
+ }
40
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAS5B,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,QAAQ,CAAC;IACjB,MAAM,CAAS;IACf,KAAK,CAAS;IAEtB,YAAY,MAAc,EAAE,KAAK,GAAG,QAAQ;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAmB,EACnB,KAAuB;QAEvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACzD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,QAA+C;YACzD,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAClB,CAAC,CAAC;oBACE,KAAK,EAAE,KAAoC;oBAC3C,WAAW,EAAE,MAAe;iBAC7B;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,SAAS,GAAe,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CACjE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACP,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,IAAI,EAAE,UAAmB;YACzB,QAAQ,EAAE;gBACR,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;gBACtB,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS;aACjC;SACF,CAAC,CACH,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;YAC/B,SAAS;YACT,YAAY,EAAE,MAAM,CAAC,aAAa,IAAI,MAAM;SAC7C,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ interface Skill {
2
+ name: string;
3
+ description: string;
4
+ content: string;
5
+ filePath: string;
6
+ }
7
+ /**
8
+ * Loads SKILL.md files and provides lightweight keyword-based matching
9
+ * to inject relevant skill context into agent prompts.
10
+ */
11
+ export declare class SkillsLoader {
12
+ private skillsDirs;
13
+ private skills;
14
+ private loaded;
15
+ constructor(skillsDirs: string[]);
16
+ load(): Promise<void>;
17
+ /**
18
+ * Find skills relevant to a query using lightweight keyword scoring.
19
+ * Deterministic — no LLM call.
20
+ */
21
+ findRelevant(query: string, maxResults?: number): Skill[];
22
+ getAll(): Skill[];
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAIA,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,YAAY;IAIX,OAAO,CAAC,UAAU;IAH9B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAS;gBAEH,UAAU,EAAE,MAAM,EAAE;IAElC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B3B;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,KAAK,EAAE;IAgCpD,MAAM,IAAI,KAAK,EAAE;CAGlB"}
@@ -0,0 +1,93 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { glob } from 'glob';
4
+ /**
5
+ * Loads SKILL.md files and provides lightweight keyword-based matching
6
+ * to inject relevant skill context into agent prompts.
7
+ */
8
+ export class SkillsLoader {
9
+ skillsDirs;
10
+ skills = [];
11
+ loaded = false;
12
+ constructor(skillsDirs) {
13
+ this.skillsDirs = skillsDirs;
14
+ }
15
+ async load() {
16
+ if (this.loaded)
17
+ return;
18
+ for (const dir of this.skillsDirs) {
19
+ if (!fs.existsSync(dir))
20
+ continue;
21
+ const files = await glob('**/SKILL.md', { cwd: dir });
22
+ for (const file of files) {
23
+ const fullPath = path.join(dir, file);
24
+ try {
25
+ const content = fs.readFileSync(fullPath, 'utf-8');
26
+ const parsed = parseFrontmatter(content);
27
+ this.skills.push({
28
+ name: parsed.name || path.basename(path.dirname(fullPath)),
29
+ description: parsed.description,
30
+ content: parsed.body,
31
+ filePath: fullPath,
32
+ });
33
+ }
34
+ catch {
35
+ // Skip unreadable skill files
36
+ }
37
+ }
38
+ }
39
+ this.loaded = true;
40
+ }
41
+ /**
42
+ * Find skills relevant to a query using lightweight keyword scoring.
43
+ * Deterministic — no LLM call.
44
+ */
45
+ findRelevant(query, maxResults = 3) {
46
+ if (this.skills.length === 0)
47
+ return [];
48
+ const queryWords = query
49
+ .toLowerCase()
50
+ .split(/\s+/)
51
+ .filter((w) => w.length > 2);
52
+ const scored = this.skills.map((skill) => {
53
+ const header = `${skill.name} ${skill.description}`.toLowerCase();
54
+ let score = 0;
55
+ for (const word of queryWords) {
56
+ if (header.includes(word))
57
+ score += 3;
58
+ if (skill.content.toLowerCase().includes(word))
59
+ score += 1;
60
+ }
61
+ // Boost exact name hits
62
+ if (queryWords.some((w) => skill.name.toLowerCase().includes(w))) {
63
+ score += 5;
64
+ }
65
+ return { skill, score };
66
+ });
67
+ return scored
68
+ .filter((s) => s.score > 0)
69
+ .sort((a, b) => b.score - a.score)
70
+ .slice(0, maxResults)
71
+ .map((s) => s.skill);
72
+ }
73
+ getAll() {
74
+ return [...this.skills];
75
+ }
76
+ }
77
+ // ---- Frontmatter parser ----
78
+ function parseFrontmatter(raw) {
79
+ const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
80
+ if (!match) {
81
+ return { name: '', description: '', body: raw };
82
+ }
83
+ const frontmatter = match[1] ?? '';
84
+ const body = match[2] ?? '';
85
+ const nameMatch = frontmatter.match(/^name:\s*(.+)$/m);
86
+ const descMatch = frontmatter.match(/^description:\s*(.+)$/m);
87
+ return {
88
+ name: nameMatch?.[1]?.trim() ?? '',
89
+ description: descMatch?.[1]?.trim() ?? '',
90
+ body,
91
+ };
92
+ }
93
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/tests/tools.test.ts"],"names":[],"mappings":""}