0xkobold 0.1.0 → 0.3.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.
- package/HEARTBEAT.md +48 -32
- package/README.md +426 -157
- package/dist/package.json +5 -2
- package/dist/src/agent/bootstrap-loader.js +138 -0
- package/dist/src/agent/bootstrap-loader.js.map +1 -0
- package/dist/src/agent/context-pruning.js +279 -0
- package/dist/src/agent/context-pruning.js.map +1 -0
- package/dist/src/agent/dynamic-personality.js +211 -0
- package/dist/src/agent/dynamic-personality.js.map +1 -0
- package/dist/src/agent/embedded-runner.js +79 -0
- package/dist/src/agent/embedded-runner.js.map +1 -0
- package/dist/src/agent/index.js +16 -0
- package/dist/src/agent/index.js.map +1 -0
- package/dist/src/agent/system-prompt.js +84 -0
- package/dist/src/agent/system-prompt.js.map +1 -0
- package/dist/src/agent/task-router.js +194 -0
- package/dist/src/agent/task-router.js.map +1 -0
- package/dist/src/agent/tools/index.js +2 -0
- package/dist/src/agent/tools/index.js.map +1 -0
- package/dist/src/agent/tools/spawn-agent.js +200 -0
- package/dist/src/agent/tools/spawn-agent.js.map +1 -0
- package/dist/src/agent/types/definitions.js +317 -0
- package/dist/src/agent/types/definitions.js.map +1 -0
- package/dist/src/agent/types/index.js +2 -0
- package/dist/src/agent/types/index.js.map +1 -0
- package/dist/src/agent/user-profile.js +300 -0
- package/dist/src/agent/user-profile.js.map +1 -0
- package/dist/src/agents/task-router.js +194 -0
- package/dist/src/agents/task-router.js.map +1 -0
- package/dist/src/agents/tools/index.js +2 -0
- package/dist/src/agents/tools/index.js.map +1 -0
- package/dist/src/agents/tools/spawn-agent.js +200 -0
- package/dist/src/agents/tools/spawn-agent.js.map +1 -0
- package/dist/src/agents/types/definitions.js +317 -0
- package/dist/src/agents/types/definitions.js.map +1 -0
- package/dist/src/agents/types/index.js +2 -0
- package/dist/src/agents/types/index.js.map +1 -0
- package/dist/src/auth/device-auth.js +202 -0
- package/dist/src/auth/device-auth.js.map +1 -0
- package/dist/src/auth/index.js +3 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/channels/index.js +8 -0
- package/dist/src/channels/index.js.map +1 -0
- package/dist/src/channels/slack/webhook.js +128 -0
- package/dist/src/channels/slack/webhook.js.map +1 -0
- package/dist/src/channels/telegram/bot.js +223 -0
- package/dist/src/channels/telegram/bot.js.map +1 -0
- package/dist/src/channels/whatsapp/integration.js +325 -0
- package/dist/src/channels/whatsapp/integration.js.map +1 -0
- package/dist/src/cli/commands/check.js +69 -0
- package/dist/src/cli/commands/check.js.map +1 -0
- package/dist/src/cli/commands/embedded.js +36 -0
- package/dist/src/cli/commands/embedded.js.map +1 -0
- package/dist/src/cli/commands/gateway.js +127 -166
- package/dist/src/cli/commands/gateway.js.map +1 -1
- package/dist/src/cli/commands/migrate.js +24 -0
- package/dist/src/cli/commands/migrate.js.map +1 -0
- package/dist/src/cli/commands/tailscale.js +81 -0
- package/dist/src/cli/commands/tailscale.js.map +1 -0
- package/dist/src/cli/commands/telegram.js +111 -0
- package/dist/src/cli/commands/telegram.js.map +1 -0
- package/dist/src/cli/commands/tui.js +40 -22
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/commands/whatsapp.js +116 -0
- package/dist/src/cli/commands/whatsapp.js.map +1 -0
- package/dist/src/cli/program-fixed.js +1 -0
- package/dist/src/cli/program-fixed.js.map +1 -0
- package/dist/src/cli/program.js +30 -29
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/index.js +2 -9
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/manager.js +222 -0
- package/dist/src/config/manager.js.map +1 -0
- package/dist/src/documents/index.js +3 -0
- package/dist/src/documents/index.js.map +1 -0
- package/dist/src/documents/pdf.js +168 -0
- package/dist/src/documents/pdf.js.map +1 -0
- package/dist/src/extensions/core/agent-lifecycle-extension.js +323 -0
- package/dist/src/extensions/core/agent-lifecycle-extension.js.map +1 -0
- package/dist/src/extensions/core/agent-orchestrator-extension.js +642 -0
- package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -0
- package/dist/src/extensions/core/agent-workspace-extension.js +174 -0
- package/dist/src/extensions/core/agent-workspace-extension.js.map +1 -0
- package/dist/src/extensions/core/autonomous-executor-extension.js +145 -0
- package/dist/src/extensions/core/autonomous-executor-extension.js.map +1 -0
- package/dist/src/extensions/core/autonomous-subagent-extension.js +333 -0
- package/dist/src/extensions/core/autonomous-subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js +323 -0
- package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js +333 -0
- package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/deprecated/subagent-extension.js +647 -0
- package/dist/src/extensions/core/deprecated/subagent-extension.js.map +1 -0
- package/dist/src/extensions/core/mode-manager-extension.js +11 -0
- package/dist/src/extensions/core/mode-manager-extension.js.map +1 -1
- package/dist/src/extensions/core/persona-loader-extension.js +61 -129
- package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
- package/dist/src/extensions/core/websearch-enhanced-extension.js +705 -0
- package/dist/src/extensions/core/websearch-enhanced-extension.js.map +1 -0
- package/dist/src/extensions/core/websearch-v2-extension.js +303 -0
- package/dist/src/extensions/core/websearch-v2-extension.js.map +1 -0
- package/dist/src/gateway/client.js +318 -0
- package/dist/src/gateway/client.js.map +1 -0
- package/dist/src/gateway/discord-bot.js +185 -0
- package/dist/src/gateway/discord-bot.js.map +1 -0
- package/dist/src/gateway/index.js +10 -350
- package/dist/src/gateway/index.js.map +1 -1
- package/dist/src/gateway/server.js +325 -0
- package/dist/src/gateway/server.js.map +1 -0
- package/dist/src/gateway/websocket-server.js +142 -0
- package/dist/src/gateway/websocket-server.js.map +1 -0
- package/dist/src/heartbeat/checkin.js +185 -0
- package/dist/src/heartbeat/checkin.js.map +1 -0
- package/dist/src/heartbeat/index.js +5 -0
- package/dist/src/heartbeat/index.js.map +1 -0
- package/dist/src/heartbeat/notifications.js +216 -0
- package/dist/src/heartbeat/notifications.js.map +1 -0
- package/dist/src/heartbeat/scheduler.js +284 -0
- package/dist/src/heartbeat/scheduler.js.map +1 -0
- package/dist/src/index.js +21 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/infra/index.js +3 -0
- package/dist/src/infra/index.js.map +1 -0
- package/dist/src/infra/tailscale.js +163 -0
- package/dist/src/infra/tailscale.js.map +1 -0
- package/dist/src/media/audio.js +130 -0
- package/dist/src/media/audio.js.map +1 -0
- package/dist/src/media/index.js +4 -0
- package/dist/src/media/index.js.map +1 -0
- package/dist/src/media/vision.js +131 -0
- package/dist/src/media/vision.js.map +1 -0
- package/dist/src/migration/openclaw.js +498 -0
- package/dist/src/migration/openclaw.js.map +1 -0
- package/dist/src/mode/auto-detector.js +211 -0
- package/dist/src/mode/auto-detector.js.map +1 -0
- package/dist/src/mode/index.js +3 -0
- package/dist/src/mode/index.js.map +1 -0
- package/dist/src/mode/natural-switcher.js +123 -0
- package/dist/src/mode/natural-switcher.js.map +1 -0
- package/dist/src/sandbox/docker-runner.js +228 -0
- package/dist/src/sandbox/docker-runner.js.map +1 -0
- package/dist/src/sandbox/index.js +3 -0
- package/dist/src/sandbox/index.js.map +1 -0
- package/dist/src/skills/builtin/api-worker.js +88 -0
- package/dist/src/skills/builtin/api-worker.js.map +1 -0
- package/dist/src/skills/builtin/duplicate-detector.js +469 -0
- package/dist/src/skills/builtin/duplicate-detector.js.map +1 -0
- package/dist/src/skills/builtin/nextjs-worker.js +55 -0
- package/dist/src/skills/builtin/nextjs-worker.js.map +1 -0
- package/dist/src/skills/builtin/real-workers.js +166 -0
- package/dist/src/skills/builtin/real-workers.js.map +1 -0
- package/dist/src/skills/builtin/sql-worker.js +61 -0
- package/dist/src/skills/builtin/sql-worker.js.map +1 -0
- package/dist/src/skills/builtin/test-worker.js +79 -0
- package/dist/src/skills/builtin/test-worker.js.map +1 -0
- package/dist/src/skills/builtin/web-research.js +77 -0
- package/dist/src/skills/builtin/web-research.js.map +1 -0
- package/dist/src/skills/framework.js +250 -0
- package/dist/src/skills/framework.js.map +1 -0
- package/dist/src/skills/index.js +12 -10
- package/dist/src/skills/index.js.map +1 -1
- package/dist/src/streaming/block-streamer.js +172 -0
- package/dist/src/streaming/block-streamer.js.map +1 -0
- package/dist/src/streaming/index.js +2 -0
- package/dist/src/streaming/index.js.map +1 -0
- package/dist/src/workspace/index.js +2 -0
- package/dist/src/workspace/index.js.map +1 -0
- package/dist/src/workspace/manager.js +181 -0
- package/dist/src/workspace/manager.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Worker Skill - v0.2.0
|
|
3
|
+
*
|
|
4
|
+
* API design and implementation specialist.
|
|
5
|
+
*/
|
|
6
|
+
export const apiWorkerSkill = async (args, context) => {
|
|
7
|
+
const task = args.task;
|
|
8
|
+
const style = args.style;
|
|
9
|
+
console.log(`[API Worker] Task: ${task}`);
|
|
10
|
+
const mockOutput = `## API Design
|
|
11
|
+
|
|
12
|
+
### Task
|
|
13
|
+
${task}
|
|
14
|
+
|
|
15
|
+
### Design Decisions
|
|
16
|
+
- **Style:** ${style || "RESTful"}
|
|
17
|
+
- **Authentication:** JWT Bearer
|
|
18
|
+
- **Rate Limiting:** 100 req/min
|
|
19
|
+
- **Versioning:** URL path (/v1/)
|
|
20
|
+
|
|
21
|
+
### Endpoints
|
|
22
|
+
|
|
23
|
+
#### GET /api/resource
|
|
24
|
+
\`\`\`typescript
|
|
25
|
+
// List resources with pagination
|
|
26
|
+
interface ListRequest {
|
|
27
|
+
page?: number;
|
|
28
|
+
limit?: number;
|
|
29
|
+
sort?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface ListResponse {
|
|
33
|
+
data: Resource[];
|
|
34
|
+
meta: PaginationMeta;
|
|
35
|
+
}
|
|
36
|
+
\`\`\`
|
|
37
|
+
|
|
38
|
+
#### POST /api/resource
|
|
39
|
+
\`\`\`typescript
|
|
40
|
+
// Create new resource
|
|
41
|
+
interface CreateRequest {
|
|
42
|
+
name: string;
|
|
43
|
+
data: unknown;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface CreateResponse {
|
|
47
|
+
id: string;
|
|
48
|
+
created: boolean;
|
|
49
|
+
}
|
|
50
|
+
\`\`\`
|
|
51
|
+
|
|
52
|
+
### Error Handling
|
|
53
|
+
\`\`\`typescript
|
|
54
|
+
interface ApiError {
|
|
55
|
+
error: {
|
|
56
|
+
code: string;
|
|
57
|
+
message: string;
|
|
58
|
+
details?: Record<string, unknown>;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
\`\`\`
|
|
62
|
+
|
|
63
|
+
### Implementation
|
|
64
|
+
\`\`\`typescript
|
|
65
|
+
// src/app/api/resource/route.ts
|
|
66
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
67
|
+
|
|
68
|
+
export async function GET(request: NextRequest) {
|
|
69
|
+
const { searchParams } = new URL(request.url);
|
|
70
|
+
// Implementation...
|
|
71
|
+
return NextResponse.json({ data: [] });
|
|
72
|
+
}
|
|
73
|
+
\`\`\`
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
*Generated by API Worker Skill*
|
|
77
|
+
`;
|
|
78
|
+
return {
|
|
79
|
+
success: true,
|
|
80
|
+
output: mockOutput,
|
|
81
|
+
artifacts: [
|
|
82
|
+
"src/app/api/resource/route.ts",
|
|
83
|
+
"src/types/api.ts",
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
export default apiWorkerSkill;
|
|
88
|
+
//# sourceMappingURL=api-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-worker.js","sourceRoot":"","sources":["../../../../src/skills/builtin/api-worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,cAAc,GAAiB,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAClE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAA2B,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG;;;EAGnB,IAAI;;;eAGS,KAAK,IAAI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DhC,CAAC;IAEA,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE;YACT,+BAA+B;YAC/B,kBAAkB;SACnB;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Duplicate Detection Skill - v0.3.0
|
|
3
|
+
*
|
|
4
|
+
* Prevents duplicate implementations by scanning codebase
|
|
5
|
+
* before adding new features.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from "node:fs/promises";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
import { existsSync } from "node:fs";
|
|
10
|
+
const DEFAULT_CONFIG = {
|
|
11
|
+
similarityThreshold: 0.7,
|
|
12
|
+
maxResults: 5,
|
|
13
|
+
scanPaths: ["src", "lib", "dist"],
|
|
14
|
+
excludePatterns: ["node_modules", ".git", "test", "*.test.ts", "*.spec.ts"],
|
|
15
|
+
};
|
|
16
|
+
class DuplicateDetector {
|
|
17
|
+
config;
|
|
18
|
+
fileCache = new Map();
|
|
19
|
+
constructor(config = {}) {
|
|
20
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if implementation already exists
|
|
24
|
+
*/
|
|
25
|
+
async check(description, codeSnippet) {
|
|
26
|
+
console.log(`🔍 Checking for existing: ${description}`);
|
|
27
|
+
const matches = [];
|
|
28
|
+
// Search by description keywords
|
|
29
|
+
const keywordMatches = await this.findByKeywords(description);
|
|
30
|
+
matches.push(...keywordMatches);
|
|
31
|
+
// Search by code similarity
|
|
32
|
+
if (codeSnippet) {
|
|
33
|
+
const codeMatches = await this.findByCodeSimilarity(codeSnippet);
|
|
34
|
+
matches.push(...codeMatches);
|
|
35
|
+
}
|
|
36
|
+
// Sort by similarity and deduplicate
|
|
37
|
+
const uniqueMatches = this.deduplicateMatches(matches)
|
|
38
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
39
|
+
.slice(0, this.config.maxResults);
|
|
40
|
+
const maxSimilarity = uniqueMatches[0]?.similarity || 0;
|
|
41
|
+
const exists = maxSimilarity >= this.config.similarityThreshold;
|
|
42
|
+
return {
|
|
43
|
+
exists,
|
|
44
|
+
confidence: maxSimilarity,
|
|
45
|
+
matches: uniqueMatches,
|
|
46
|
+
suggestion: this.generateSuggestion(uniqueMatches, description),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check function implementation
|
|
51
|
+
*/
|
|
52
|
+
async checkFunction(functionName, signature, filePath) {
|
|
53
|
+
console.log(`🔍 Checking function: ${functionName}`);
|
|
54
|
+
// Search for existing function
|
|
55
|
+
const pattern = new RegExp(`export\\s+(?:async\\s+)?function\\s+${functionName}\\s*\\(`, "i");
|
|
56
|
+
const matches = await this.searchPattern(pattern, filePath);
|
|
57
|
+
// Also check by signature similarity
|
|
58
|
+
const signatureMatches = await this.findBySignature(signature);
|
|
59
|
+
const allMatches = [...matches, ...signatureMatches]
|
|
60
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
61
|
+
.slice(0, this.config.maxResults);
|
|
62
|
+
const maxSimilarity = allMatches[0]?.similarity || 0;
|
|
63
|
+
return {
|
|
64
|
+
exists: maxSimilarity >= this.config.similarityThreshold,
|
|
65
|
+
confidence: maxSimilarity,
|
|
66
|
+
matches: allMatches,
|
|
67
|
+
suggestion: this.generateSuggestion(allMatches, `function "${functionName}"`),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check class implementation
|
|
72
|
+
*/
|
|
73
|
+
async checkClass(className, methods) {
|
|
74
|
+
console.log(`🔍 Checking class: ${className}`);
|
|
75
|
+
// Search for existing class
|
|
76
|
+
const pattern = new RegExp(`class\\s+${className}\\s*[{(]`, "i");
|
|
77
|
+
const matches = await this.searchPattern(pattern);
|
|
78
|
+
// Check for similar classes by method signatures
|
|
79
|
+
let methodMatches = [];
|
|
80
|
+
if (methods && methods.length > 0) {
|
|
81
|
+
methodMatches = await this.findByMethodSignatures(methods);
|
|
82
|
+
}
|
|
83
|
+
const allMatches = [...matches, ...methodMatches]
|
|
84
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
85
|
+
.slice(0, this.config.maxResults);
|
|
86
|
+
const maxSimilarity = allMatches[0]?.similarity || 0;
|
|
87
|
+
return {
|
|
88
|
+
exists: maxSimilarity >= this.config.similarityThreshold,
|
|
89
|
+
confidence: maxSimilarity,
|
|
90
|
+
matches: allMatches,
|
|
91
|
+
suggestion: this.generateSuggestion(allMatches, `class "${className}"`),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check file existence by purpose
|
|
96
|
+
*/
|
|
97
|
+
async checkFile(purpose, extension = ".ts") {
|
|
98
|
+
console.log(`🔍 Checking file for: ${purpose}`);
|
|
99
|
+
// Generate likely filenames
|
|
100
|
+
const keywords = purpose.toLowerCase().split(/\s+/);
|
|
101
|
+
const candidates = [
|
|
102
|
+
...keywords,
|
|
103
|
+
keywords.join("-"),
|
|
104
|
+
keywords.join("_"),
|
|
105
|
+
];
|
|
106
|
+
const matches = [];
|
|
107
|
+
for (const scanPath of this.config.scanPaths) {
|
|
108
|
+
if (!existsSync(scanPath))
|
|
109
|
+
continue;
|
|
110
|
+
const files = await this.getFiles(scanPath, extension);
|
|
111
|
+
for (const file of files) {
|
|
112
|
+
const basename = path.basename(file, extension);
|
|
113
|
+
const similarity = this.calculateStringSimilarity(purpose.toLowerCase(), basename.toLowerCase().replace(/[-_]/g, " "));
|
|
114
|
+
if (similarity > 0.5) {
|
|
115
|
+
const content = await this.readFile(file);
|
|
116
|
+
matches.push({
|
|
117
|
+
file,
|
|
118
|
+
line: 1,
|
|
119
|
+
snippet: content.slice(0, 200),
|
|
120
|
+
similarity,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const sorted = matches
|
|
126
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
127
|
+
.slice(0, this.config.maxResults);
|
|
128
|
+
return {
|
|
129
|
+
exists: sorted.length > 0 && sorted[0].similarity >= this.config.similarityThreshold,
|
|
130
|
+
confidence: sorted[0]?.similarity || 0,
|
|
131
|
+
matches: sorted,
|
|
132
|
+
suggestion: this.generateSuggestion(sorted, `file for "${purpose}"`),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Private methods
|
|
136
|
+
async findByKeywords(keywords) {
|
|
137
|
+
const matches = [];
|
|
138
|
+
const terms = keywords.toLowerCase().split(/\s+/).filter(t => t.length > 3);
|
|
139
|
+
for (const scanPath of this.config.scanPaths) {
|
|
140
|
+
if (!existsSync(scanPath))
|
|
141
|
+
continue;
|
|
142
|
+
const files = await this.getFiles(scanPath, ".ts");
|
|
143
|
+
for (const file of files) {
|
|
144
|
+
const content = await this.readFile(file);
|
|
145
|
+
const lines = content.split("\n");
|
|
146
|
+
for (let i = 0; i < lines.length; i++) {
|
|
147
|
+
const line = lines[i].toLowerCase();
|
|
148
|
+
let matchCount = 0;
|
|
149
|
+
for (const term of terms) {
|
|
150
|
+
if (line.includes(term))
|
|
151
|
+
matchCount++;
|
|
152
|
+
}
|
|
153
|
+
const similarity = matchCount / terms.length;
|
|
154
|
+
if (similarity > 0.3) {
|
|
155
|
+
matches.push({
|
|
156
|
+
file,
|
|
157
|
+
line: i + 1,
|
|
158
|
+
snippet: lines[i].trim().slice(0, 100),
|
|
159
|
+
similarity,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return matches;
|
|
166
|
+
}
|
|
167
|
+
async findByCodeSimilarity(code) {
|
|
168
|
+
const matches = [];
|
|
169
|
+
const normalizedCode = this.normalizeCode(code);
|
|
170
|
+
for (const scanPath of this.config.scanPaths) {
|
|
171
|
+
if (!existsSync(scanPath))
|
|
172
|
+
continue;
|
|
173
|
+
const files = await this.getFiles(scanPath, ".ts");
|
|
174
|
+
for (const file of files) {
|
|
175
|
+
const content = await this.readFile(file);
|
|
176
|
+
const normalizedContent = this.normalizeCode(content);
|
|
177
|
+
const similarity = this.calculateCodeSimilarity(normalizedCode, normalizedContent);
|
|
178
|
+
if (similarity > 0.3) {
|
|
179
|
+
matches.push({
|
|
180
|
+
file,
|
|
181
|
+
line: 1,
|
|
182
|
+
snippet: content.slice(0, 200),
|
|
183
|
+
similarity,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return matches;
|
|
189
|
+
}
|
|
190
|
+
async findBySignature(signature) {
|
|
191
|
+
const matches = [];
|
|
192
|
+
// Parse the input signature
|
|
193
|
+
const parsedSig = this.parseSignature(signature);
|
|
194
|
+
const normalizedSignature = this.normalizeSignature(signature);
|
|
195
|
+
for (const scanPath of this.config.scanPaths) {
|
|
196
|
+
if (!existsSync(scanPath))
|
|
197
|
+
continue;
|
|
198
|
+
const files = await this.getFiles(scanPath, ".ts");
|
|
199
|
+
for (const file of files) {
|
|
200
|
+
const content = await this.readFile(file);
|
|
201
|
+
const signatures = this.extractSignatures(content);
|
|
202
|
+
for (const foundSig of signatures) {
|
|
203
|
+
// Calculate similarity using parsed signatures
|
|
204
|
+
const similarity = this.calculateSignatureSimilarity(parsedSig, foundSig);
|
|
205
|
+
if (similarity > 0.6) {
|
|
206
|
+
matches.push({
|
|
207
|
+
file,
|
|
208
|
+
line: foundSig.line,
|
|
209
|
+
snippet: foundSig.text,
|
|
210
|
+
similarity,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return matches;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Parse function signature
|
|
220
|
+
*/
|
|
221
|
+
parseSignature(signature) {
|
|
222
|
+
const match = signature.match(/\s*(\w+)\s*\(([^)]*)\)/);
|
|
223
|
+
if (match) {
|
|
224
|
+
return {
|
|
225
|
+
name: match[1],
|
|
226
|
+
params: match[2]
|
|
227
|
+
? match[2].split(",").map(p => p.trim()).filter(Boolean)
|
|
228
|
+
: [],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return { name: "", params: [] };
|
|
232
|
+
}
|
|
233
|
+
async findByMethodSignatures(methods) {
|
|
234
|
+
const matches = [];
|
|
235
|
+
for (const scanPath of this.config.scanPaths) {
|
|
236
|
+
if (!existsSync(scanPath))
|
|
237
|
+
continue;
|
|
238
|
+
const files = await this.getFiles(scanPath, ".ts");
|
|
239
|
+
for (const file of files) {
|
|
240
|
+
const content = await this.readFile(file);
|
|
241
|
+
const classMatches = [];
|
|
242
|
+
// Extract class definitions
|
|
243
|
+
const classRegex = /class\s+(\w+)\s*\{/g;
|
|
244
|
+
let match;
|
|
245
|
+
while ((match = classRegex.exec(content)) !== null) {
|
|
246
|
+
classMatches.push(match[1]);
|
|
247
|
+
}
|
|
248
|
+
// Check for method presence
|
|
249
|
+
const methodMatches = methods.filter(m => content.includes(m) || content.includes(this.camelToKebab(m)));
|
|
250
|
+
const similarity = methodMatches.length / methods.length;
|
|
251
|
+
if (similarity > 0.5) {
|
|
252
|
+
matches.push({
|
|
253
|
+
file,
|
|
254
|
+
line: 1,
|
|
255
|
+
snippet: `Classes: ${classMatches.join(", ")}`,
|
|
256
|
+
similarity,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return matches;
|
|
262
|
+
}
|
|
263
|
+
async searchPattern(pattern, specificPath) {
|
|
264
|
+
const matches = [];
|
|
265
|
+
const paths = specificPath ? [specificPath] : this.config.scanPaths;
|
|
266
|
+
for (const scanPath of paths) {
|
|
267
|
+
if (!existsSync(scanPath))
|
|
268
|
+
continue;
|
|
269
|
+
const files = await this.getFiles(scanPath, ".ts");
|
|
270
|
+
for (const file of files) {
|
|
271
|
+
const content = await this.readFile(file);
|
|
272
|
+
if (pattern.test(content)) {
|
|
273
|
+
const lines = content.split("\n");
|
|
274
|
+
for (let i = 0; i < lines.length; i++) {
|
|
275
|
+
if (pattern.test(lines[i])) {
|
|
276
|
+
matches.push({
|
|
277
|
+
file,
|
|
278
|
+
line: i + 1,
|
|
279
|
+
snippet: lines[i].trim(),
|
|
280
|
+
similarity: 0.9, // Direct pattern match
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return matches;
|
|
288
|
+
}
|
|
289
|
+
async getFiles(dir, extension) {
|
|
290
|
+
const files = [];
|
|
291
|
+
try {
|
|
292
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
293
|
+
for (const entry of entries) {
|
|
294
|
+
const fullPath = path.join(dir, entry.name);
|
|
295
|
+
if (entry.isDirectory()) {
|
|
296
|
+
if (this.shouldExclude(entry.name))
|
|
297
|
+
continue;
|
|
298
|
+
files.push(...(await this.getFiles(fullPath, extension)));
|
|
299
|
+
}
|
|
300
|
+
else if (entry.name.endsWith(extension)) {
|
|
301
|
+
files.push(fullPath);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
// Directory doesn't exist or no access
|
|
307
|
+
}
|
|
308
|
+
return files;
|
|
309
|
+
}
|
|
310
|
+
async readFile(filePath) {
|
|
311
|
+
if (this.fileCache.has(filePath)) {
|
|
312
|
+
return this.fileCache.get(filePath);
|
|
313
|
+
}
|
|
314
|
+
try {
|
|
315
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
316
|
+
this.fileCache.set(filePath, content);
|
|
317
|
+
return content;
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return "";
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
shouldExclude(name) {
|
|
324
|
+
return this.config.excludePatterns.some(pattern => {
|
|
325
|
+
if (pattern.includes("*")) {
|
|
326
|
+
const regex = new RegExp(pattern.replace("*", ".*"));
|
|
327
|
+
return regex.test(name);
|
|
328
|
+
}
|
|
329
|
+
return name === pattern;
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
normalizeCode(code) {
|
|
333
|
+
return code
|
|
334
|
+
.replace(/\s+/g, " ")
|
|
335
|
+
.replace(/\/\/.*$/gm, "")
|
|
336
|
+
.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
337
|
+
.replace(/\s*(\{|\}|\(|\)|;|,|:)\s*/g, "$1")
|
|
338
|
+
.toLowerCase()
|
|
339
|
+
.trim();
|
|
340
|
+
}
|
|
341
|
+
normalizeSignature(sig) {
|
|
342
|
+
return sig
|
|
343
|
+
.replace(/\s+/g, "")
|
|
344
|
+
.replace(/\w+\s*:\s*\w+/g, "_")
|
|
345
|
+
.toLowerCase();
|
|
346
|
+
}
|
|
347
|
+
calculateCodeSimilarity(a, b) {
|
|
348
|
+
// Simple substring-based similarity
|
|
349
|
+
if (a.length === 0 || b.length === 0)
|
|
350
|
+
return 0;
|
|
351
|
+
if (a === b)
|
|
352
|
+
return 1;
|
|
353
|
+
// Check for significant substring matches
|
|
354
|
+
const minLen = Math.min(a.length, b.length);
|
|
355
|
+
const maxLen = Math.max(a.length, b.length);
|
|
356
|
+
let longestMatch = 0;
|
|
357
|
+
for (let i = 0; i < a.length; i++) {
|
|
358
|
+
for (let j = minLen; j > longestMatch && i + j <= a.length; j--) {
|
|
359
|
+
const substr = a.slice(i, i + j);
|
|
360
|
+
if (b.includes(substr)) {
|
|
361
|
+
longestMatch = j;
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return longestMatch / maxLen;
|
|
367
|
+
}
|
|
368
|
+
calculateStringSimilarity(a, b) {
|
|
369
|
+
const longer = a.length > b.length ? a : b;
|
|
370
|
+
const shorter = a.length > b.length ? b : a;
|
|
371
|
+
if (longer.length === 0)
|
|
372
|
+
return 1;
|
|
373
|
+
const distance = this.levenshteinDistance(longer, shorter);
|
|
374
|
+
return (longer.length - distance) / longer.length;
|
|
375
|
+
}
|
|
376
|
+
calculateSignatureSimilarity(a, b) {
|
|
377
|
+
const nameSim = a.name === b.name ? 1 : 0;
|
|
378
|
+
const paramSim = this.jaccardSimilarity(new Set(a.params), new Set(b.params));
|
|
379
|
+
return (nameSim + paramSim) / 2;
|
|
380
|
+
}
|
|
381
|
+
jaccardSimilarity(a, b) {
|
|
382
|
+
const intersection = new Set([...a].filter(x => b.has(x)));
|
|
383
|
+
const union = new Set([...a, ...b]);
|
|
384
|
+
return intersection.size / union.size;
|
|
385
|
+
}
|
|
386
|
+
levenshteinDistance(a, b) {
|
|
387
|
+
const matrix = [];
|
|
388
|
+
for (let i = 0; i <= b.length; i++) {
|
|
389
|
+
matrix[i] = [i];
|
|
390
|
+
}
|
|
391
|
+
for (let j = 0; j <= a.length; j++) {
|
|
392
|
+
matrix[0][j] = j;
|
|
393
|
+
}
|
|
394
|
+
for (let i = 1; i <= b.length; i++) {
|
|
395
|
+
for (let j = 1; j <= a.length; j++) {
|
|
396
|
+
if (b.charAt(i - 1) === a.charAt(j - 1)) {
|
|
397
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
return matrix[b.length][a.length];
|
|
405
|
+
}
|
|
406
|
+
extractSignatures(content) {
|
|
407
|
+
const signatures = [];
|
|
408
|
+
const lines = content.split("\n");
|
|
409
|
+
const functionRegex = /(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(([^)]*)\)/;
|
|
410
|
+
lines.forEach((line, index) => {
|
|
411
|
+
const match = functionRegex.exec(line);
|
|
412
|
+
if (match) {
|
|
413
|
+
const params = match[2]
|
|
414
|
+
.split(",")
|
|
415
|
+
.map(p => p.trim().split(":")[0])
|
|
416
|
+
.filter(Boolean);
|
|
417
|
+
signatures.push({
|
|
418
|
+
name: match[1],
|
|
419
|
+
params,
|
|
420
|
+
line: index + 1,
|
|
421
|
+
text: line.trim(),
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
return signatures;
|
|
426
|
+
}
|
|
427
|
+
camelToKebab(str) {
|
|
428
|
+
return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);
|
|
429
|
+
}
|
|
430
|
+
deduplicateMatches(matches) {
|
|
431
|
+
const seen = new Set();
|
|
432
|
+
return matches.filter(match => {
|
|
433
|
+
const key = `${match.file}:${match.line}`;
|
|
434
|
+
if (seen.has(key))
|
|
435
|
+
return false;
|
|
436
|
+
seen.add(key);
|
|
437
|
+
return true;
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
generateSuggestion(matches, description) {
|
|
441
|
+
if (matches.length === 0) {
|
|
442
|
+
return `No existing implementation found for ${description}. Safe to proceed.`;
|
|
443
|
+
}
|
|
444
|
+
const topMatch = matches[0];
|
|
445
|
+
if (topMatch.similarity >= 0.9) {
|
|
446
|
+
return `⚠️ **HIGH SIMILARITY DETECTED** (${Math.round(topMatch.similarity * 100)}%)\n` +
|
|
447
|
+
`Existing implementation at ${topMatch.file}:${topMatch.line}\n` +
|
|
448
|
+
`Consider using existing code or extending it rather than duplicating.`;
|
|
449
|
+
}
|
|
450
|
+
if (matches.length === 1) {
|
|
451
|
+
return `⚡ Similar implementation found (${Math.round(topMatch.similarity * 100)}% match) at ${topMatch.file}\n` +
|
|
452
|
+
`Review before creating new implementation.`;
|
|
453
|
+
}
|
|
454
|
+
return `⚡ ${matches.length} similar implementations found:\n` +
|
|
455
|
+
matches.slice(0, 3).map(m => ` - ${m.file} (${Math.round(m.similarity * 100)}%)`).join("\n") +
|
|
456
|
+
`\nReview existing code before creating new implementation.`;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
// Export singleton
|
|
460
|
+
let detector = null;
|
|
461
|
+
export function getDuplicateDetector(config) {
|
|
462
|
+
if (!detector) {
|
|
463
|
+
detector = new DuplicateDetector(config);
|
|
464
|
+
}
|
|
465
|
+
return detector;
|
|
466
|
+
}
|
|
467
|
+
export { DuplicateDetector, DEFAULT_CONFIG };
|
|
468
|
+
export default DuplicateDetector;
|
|
469
|
+
//# sourceMappingURL=duplicate-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicate-detector.js","sourceRoot":"","sources":["../../../../src/skills/builtin/duplicate-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js Worker Skill - v0.2.0
|
|
3
|
+
*
|
|
4
|
+
* React/Next.js specialist for frontend tasks.
|
|
5
|
+
*/
|
|
6
|
+
export const nextjsWorkerSkill = async (args, context) => {
|
|
7
|
+
const task = args.task;
|
|
8
|
+
const componentType = args.componentType;
|
|
9
|
+
console.log(`[Next.js Worker] Task: ${task}`);
|
|
10
|
+
// This is a mock implementation - in reality would use LLM
|
|
11
|
+
const mockOutput = `## Next.js Component
|
|
12
|
+
|
|
13
|
+
### Task
|
|
14
|
+
${task}
|
|
15
|
+
|
|
16
|
+
### Generated Component
|
|
17
|
+
\`\`\`tsx
|
|
18
|
+
// Example Next.js component structure
|
|
19
|
+
export function GeneratedComponent() {
|
|
20
|
+
return (
|
|
21
|
+
<div>
|
|
22
|
+
<h1>Component for: ${task}</h1>
|
|
23
|
+
<p>Type: ${componentType || "auto-detected"}</p>
|
|
24
|
+
</div>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
\`\`\`
|
|
28
|
+
|
|
29
|
+
### Best Practices Applied
|
|
30
|
+
- ✅ Uses App Router patterns
|
|
31
|
+
- ✅ Server Components by default
|
|
32
|
+
- ✅ TypeScript interfaces
|
|
33
|
+
- ✅ Proper error boundaries
|
|
34
|
+
|
|
35
|
+
### Files Created
|
|
36
|
+
-
|
|
37
|
+
- src/components/GeneratedComponent.tsx
|
|
38
|
+
|
|
39
|
+
### Next Steps
|
|
40
|
+
1. Review the component
|
|
41
|
+
2. Add props interface
|
|
42
|
+
3. Write tests
|
|
43
|
+
4. Update usage
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
*Generated by Next.js Worker Skill*
|
|
47
|
+
`;
|
|
48
|
+
return {
|
|
49
|
+
success: true,
|
|
50
|
+
output: mockOutput,
|
|
51
|
+
artifacts: ["src/components/GeneratedComponent.tsx"],
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
export default nextjsWorkerSkill;
|
|
55
|
+
//# sourceMappingURL=nextjs-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-worker.js","sourceRoot":"","sources":["../../../../src/skills/builtin/nextjs-worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAiB,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAmC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IAE9C,2DAA2D;IAC3D,MAAM,UAAU,GAAG;;;EAGnB,IAAI;;;;;;;;2BAQqB,IAAI;iBACd,aAAa,IAAI,eAAe;;;;;;;;;;;;;;;;;;;;;;;;CAwBhD,CAAC;IAEA,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,CAAC,uCAAuC,CAAC;KACrD,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|