deepspider 0.2.11 → 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.
Files changed (146) hide show
  1. package/README.md +71 -24
  2. package/bin/cli.js +45 -0
  3. package/package.json +10 -4
  4. package/src/agent/core/PanelBridge.js +133 -0
  5. package/src/agent/core/RetryManager.js +51 -0
  6. package/src/agent/core/StreamHandler.js +263 -0
  7. package/src/agent/core/index.js +7 -0
  8. package/src/agent/errors/ErrorClassifier.js +43 -0
  9. package/src/agent/errors/SpiderError.js +68 -0
  10. package/src/agent/errors/index.js +19 -0
  11. package/src/agent/run.js +67 -460
  12. package/src/agent/setup.js +14 -14
  13. package/src/agent/subagents/factory.js +60 -0
  14. package/src/agent/subagents/index.js +3 -0
  15. package/src/agent/tools/report.js +36 -4
  16. package/src/browser/client.js +47 -10
  17. package/src/cli/commands/config.js +94 -0
  18. package/src/cli/commands/help.js +34 -0
  19. package/src/cli/commands/update.js +78 -0
  20. package/src/cli/commands/version.js +9 -0
  21. package/src/cli/config.js +15 -0
  22. package/src/config/settings.js +102 -0
  23. package/.claude/agents/check.md +0 -122
  24. package/.claude/agents/debug.md +0 -106
  25. package/.claude/agents/dispatch.md +0 -214
  26. package/.claude/agents/implement.md +0 -96
  27. package/.claude/agents/plan.md +0 -396
  28. package/.claude/agents/research.md +0 -120
  29. package/.claude/commands/evolve/merge.md +0 -80
  30. package/.claude/commands/trellis/before-backend-dev.md +0 -13
  31. package/.claude/commands/trellis/before-frontend-dev.md +0 -13
  32. package/.claude/commands/trellis/break-loop.md +0 -107
  33. package/.claude/commands/trellis/check-backend.md +0 -13
  34. package/.claude/commands/trellis/check-cross-layer.md +0 -153
  35. package/.claude/commands/trellis/check-frontend.md +0 -13
  36. package/.claude/commands/trellis/create-command.md +0 -154
  37. package/.claude/commands/trellis/finish-work.md +0 -129
  38. package/.claude/commands/trellis/integrate-skill.md +0 -219
  39. package/.claude/commands/trellis/onboard.md +0 -358
  40. package/.claude/commands/trellis/parallel.md +0 -193
  41. package/.claude/commands/trellis/record-session.md +0 -62
  42. package/.claude/commands/trellis/start.md +0 -280
  43. package/.claude/commands/trellis/update-spec.md +0 -213
  44. package/.claude/hooks/inject-subagent-context.py +0 -758
  45. package/.claude/hooks/ralph-loop.py +0 -374
  46. package/.claude/hooks/session-start.py +0 -126
  47. package/.claude/settings.json +0 -41
  48. package/.claude/skills/deepagents-guide/SKILL.md +0 -428
  49. package/.cursor/commands/trellis-before-backend-dev.md +0 -13
  50. package/.cursor/commands/trellis-before-frontend-dev.md +0 -13
  51. package/.cursor/commands/trellis-break-loop.md +0 -107
  52. package/.cursor/commands/trellis-check-backend.md +0 -13
  53. package/.cursor/commands/trellis-check-cross-layer.md +0 -153
  54. package/.cursor/commands/trellis-check-frontend.md +0 -13
  55. package/.cursor/commands/trellis-create-command.md +0 -154
  56. package/.cursor/commands/trellis-finish-work.md +0 -129
  57. package/.cursor/commands/trellis-integrate-skill.md +0 -219
  58. package/.cursor/commands/trellis-onboard.md +0 -358
  59. package/.cursor/commands/trellis-record-session.md +0 -62
  60. package/.cursor/commands/trellis-start.md +0 -156
  61. package/.cursor/commands/trellis-update-spec.md +0 -213
  62. package/.github/workflows/publish.yml +0 -63
  63. package/.husky/pre-commit +0 -1
  64. package/.mcp.json +0 -8
  65. package/.trellis/.template-hashes.json +0 -65
  66. package/.trellis/.version +0 -1
  67. package/.trellis/scripts/add-session.sh +0 -384
  68. package/.trellis/scripts/common/developer.sh +0 -129
  69. package/.trellis/scripts/common/git-context.sh +0 -263
  70. package/.trellis/scripts/common/paths.sh +0 -208
  71. package/.trellis/scripts/common/phase.sh +0 -150
  72. package/.trellis/scripts/common/registry.sh +0 -247
  73. package/.trellis/scripts/common/task-queue.sh +0 -142
  74. package/.trellis/scripts/common/task-utils.sh +0 -151
  75. package/.trellis/scripts/common/worktree.sh +0 -128
  76. package/.trellis/scripts/create-bootstrap.sh +0 -299
  77. package/.trellis/scripts/get-context.sh +0 -7
  78. package/.trellis/scripts/get-developer.sh +0 -15
  79. package/.trellis/scripts/init-developer.sh +0 -34
  80. package/.trellis/scripts/multi-agent/cleanup.sh +0 -396
  81. package/.trellis/scripts/multi-agent/create-pr.sh +0 -241
  82. package/.trellis/scripts/multi-agent/plan.sh +0 -207
  83. package/.trellis/scripts/multi-agent/start.sh +0 -310
  84. package/.trellis/scripts/multi-agent/status.sh +0 -828
  85. package/.trellis/scripts/task.sh +0 -1118
  86. package/.trellis/spec/backend/ci-cd-guidelines.md +0 -73
  87. package/.trellis/spec/backend/deepagents-guide.md +0 -380
  88. package/.trellis/spec/backend/directory-structure.md +0 -126
  89. package/.trellis/spec/backend/examples/skills/deepagents-guide/README.md +0 -11
  90. package/.trellis/spec/backend/examples/skills/deepagents-guide/agent.js.template +0 -20
  91. package/.trellis/spec/backend/examples/skills/deepagents-guide/skills-config.js.template +0 -13
  92. package/.trellis/spec/backend/examples/skills/deepagents-guide/subagent.js.template +0 -19
  93. package/.trellis/spec/backend/hook-guidelines.md +0 -218
  94. package/.trellis/spec/backend/index.md +0 -37
  95. package/.trellis/spec/backend/quality-guidelines.md +0 -302
  96. package/.trellis/spec/backend/state-management.md +0 -76
  97. package/.trellis/spec/backend/tool-guidelines.md +0 -144
  98. package/.trellis/spec/backend/type-safety.md +0 -71
  99. package/.trellis/spec/guides/code-reuse-thinking-guide.md +0 -92
  100. package/.trellis/spec/guides/cross-layer-thinking-guide.md +0 -94
  101. package/.trellis/spec/guides/index.md +0 -79
  102. package/.trellis/tasks/archive/02-02-evolving-skills/prd.md +0 -61
  103. package/.trellis/tasks/archive/02-02-evolving-skills/task.json +0 -29
  104. package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/prd.md +0 -86
  105. package/.trellis/tasks/archive/2026-02/00-bootstrap-guidelines/task.json +0 -27
  106. package/.trellis/tasks/archive/2026-02/02-02-skills-system/check.jsonl +0 -3
  107. package/.trellis/tasks/archive/2026-02/02-02-skills-system/debug.jsonl +0 -2
  108. package/.trellis/tasks/archive/2026-02/02-02-skills-system/implement.jsonl +0 -5
  109. package/.trellis/tasks/archive/2026-02/02-02-skills-system/prd.md +0 -33
  110. package/.trellis/tasks/archive/2026-02/02-02-skills-system/task.json +0 -41
  111. package/.trellis/workflow.md +0 -407
  112. package/.trellis/workspace/index.md +0 -123
  113. package/.trellis/workspace/pony/index.md +0 -42
  114. package/.trellis/workspace/pony/journal-1.md +0 -125
  115. package/.trellis/worktree.yaml +0 -47
  116. package/AGENTS.md +0 -18
  117. package/CLAUDE.md +0 -315
  118. package/agents/deepspider.md +0 -142
  119. package/docs/DEBUG.md +0 -42
  120. package/docs/GUIDE.md +0 -334
  121. package/docs/PROMPT.md +0 -60
  122. package/docs/USAGE.md +0 -226
  123. package/eslint.config.js +0 -51
  124. package/test/analyze.test.js +0 -90
  125. package/test/envdump.test.js +0 -74
  126. package/test/flow.test.js +0 -90
  127. package/test/hooks.test.js +0 -138
  128. package/test/plugin.test.js +0 -35
  129. package/test/refactor-full.test.js +0 -30
  130. package/test/refactor.test.js +0 -21
  131. package/test/samples/obfuscated.js +0 -61
  132. package/test/samples/original.js +0 -66
  133. package/test/samples/v10_eval_chain.js +0 -52
  134. package/test/samples/v11_bytecode_vm.js +0 -81
  135. package/test/samples/v12_polymorphic.js +0 -69
  136. package/test/samples/v1_ob_basic.js +0 -98
  137. package/test/samples/v2_ob_advanced.js +0 -99
  138. package/test/samples/v3_jjencode.js +0 -77
  139. package/test/samples/v4_aaencode.js +0 -73
  140. package/test/samples/v5_control_flow.js +0 -86
  141. package/test/samples/v6_string_encryption.js +0 -71
  142. package/test/samples/v7_jsvmp.js +0 -83
  143. package/test/samples/v8_anti_debug.js +0 -79
  144. package/test/samples/v9_proxy_trap.js +0 -49
  145. package/test/samples.test.js +0 -96
  146. package/test/webcrack.test.js +0 -55
@@ -1,83 +0,0 @@
1
- /**
2
- * v7: 简化版JSVMP虚拟机保护
3
- * 技术: 将JS代码编译为自定义字节码,由内置VM执行
4
- * 特点: 极难逆向,需要先理解VM指令集
5
- */
6
-
7
- (function() {
8
- // 虚拟机寄存器
9
- var R = [0, 0, 0, 0, 0, 0, 0, 0];
10
- var STACK = [];
11
- var MEM = {};
12
- var PC = 0;
13
-
14
- // 操作码定义
15
- var OP = {
16
- PUSH: 0x01, POP: 0x02, LOAD: 0x03, STORE: 0x04,
17
- ADD: 0x10, SUB: 0x11, MUL: 0x12, XOR: 0x13, SHL: 0x14, AND: 0x15,
18
- CALL: 0x20, RET: 0x21, JMP: 0x30, JZ: 0x31,
19
- HALT: 0xFF
20
- };
21
-
22
- // 内置函数表
23
- var FUNCS = {
24
- 0: function() { return Math.floor(Date.now() / 1000); },
25
- 1: function(len) {
26
- var c = 'abcdef0123456789', r = '';
27
- for (var i = 0; i < len; i++) r += c.charAt(Math.floor(Math.random() * c.length));
28
- return r;
29
- },
30
- 2: function(s) { return btoa(s); },
31
- 3: function(o) { return JSON.stringify(o); }
32
- };
33
-
34
- // VM执行器
35
- var exec = function(code) {
36
- PC = 0;
37
- while (PC < code.length) {
38
- var op = code[PC++];
39
- switch (op) {
40
- case OP.PUSH: STACK.push(code[PC++]); break;
41
- case OP.POP: R[code[PC++]] = STACK.pop(); break;
42
- case OP.ADD: STACK.push(STACK.pop() + STACK.pop()); break;
43
- case OP.SHL: var a = STACK.pop(), b = STACK.pop(); STACK.push(b << a); break;
44
- case OP.SUB: var a = STACK.pop(), b = STACK.pop(); STACK.push(b - a); break;
45
- case OP.AND: STACK.push(STACK.pop() & STACK.pop()); break;
46
- case OP.CALL: var fn = code[PC++]; STACK.push(FUNCS[fn](STACK.pop())); break;
47
- case OP.HALT: return STACK.pop();
48
- }
49
- }
50
- };
51
-
52
- // 哈希函数(原生实现,VM调用)
53
- var hash = function(str) {
54
- var h = 0;
55
- for (var i = 0; i < str.length; i++) {
56
- h = ((h << 5) - h) + str.charCodeAt(i);
57
- h = h & h;
58
- }
59
- return Math.abs(h).toString(16);
60
- };
61
-
62
- // 常量
63
- var SECRET = 'deepspider_test_2024';
64
- var APPID = 'app_12345';
65
-
66
- // 主逻辑
67
- var ts = FUNCS[0]();
68
- var nonce = FUNCS[1](8);
69
- var signStr = APPID + ts + nonce + SECRET;
70
- var sign = hash(signStr);
71
- var data = { user: 'test', action: 'login' };
72
-
73
- var result = Object.assign({}, data, {
74
- sign: sign,
75
- timestamp: ts,
76
- nonce: nonce,
77
- app_id: APPID,
78
- encrypted: FUNCS[2](FUNCS[3](data))
79
- });
80
-
81
- console.log('Result:', result);
82
- return result;
83
- })();
@@ -1,79 +0,0 @@
1
- /**
2
- * v8: 反调试 + 环境检测 + 代码自校验
3
- * 技术: 检测调试器、控制台、代码篡改
4
- * 特点: 动态检测运行环境,防止调试分析
5
- */
6
-
7
- (function() {
8
- // 反调试检测
9
- var _antiDebug = function() {
10
- var start = Date.now();
11
- debugger;
12
- if (Date.now() - start > 100) {
13
- return true;
14
- }
15
- return false;
16
- };
17
-
18
- // 控制台检测
19
- var _consoleCheck = function() {
20
- var el = new Image();
21
- Object.defineProperty(el, 'id', {
22
- get: function() {
23
- throw new Error('Console opened');
24
- }
25
- });
26
- return false;
27
- };
28
-
29
- // 代码自校验
30
- var _selfCheck = function(fn) {
31
- var code = fn.toString();
32
- var h = 0;
33
- for (var i = 0; i < code.length; i++) {
34
- h = ((h << 5) - h) + code.charCodeAt(i);
35
- h = h & h;
36
- }
37
- return Math.abs(h).toString(16);
38
- };
39
-
40
- // 环境检测
41
- var _envCheck = function() {
42
- if (typeof window === 'undefined') return false;
43
- if (window.outerWidth - window.innerWidth > 160) return false;
44
- return true;
45
- };
46
-
47
- // 核心逻辑
48
- var SECRET = 'deepspider_test_2024';
49
- var APPID = 'app_12345';
50
-
51
- var hash = function(str) {
52
- var h = 0;
53
- for (var i = 0; i < str.length; i++) {
54
- h = ((h << 5) - h) + str.charCodeAt(i);
55
- h = h & h;
56
- }
57
- return Math.abs(h).toString(16);
58
- };
59
-
60
- var ts = function() { return Math.floor(Date.now() / 1000); };
61
-
62
- var rand = function(len) {
63
- var c = 'abcdef0123456789', r = '';
64
- for (var i = 0; i < len; i++) r += c.charAt(Math.floor(Math.random() * c.length));
65
- return r;
66
- };
67
-
68
- var t = ts(), n = rand(8);
69
- var signStr = APPID + t + n + SECRET;
70
- var data = { user: 'test', action: 'login' };
71
-
72
- var result = Object.assign({}, data, {
73
- sign: hash(signStr), timestamp: t, nonce: n, app_id: APPID,
74
- encrypted: btoa(JSON.stringify(data))
75
- });
76
-
77
- console.log('Result:', result);
78
- return result;
79
- })();
@@ -1,49 +0,0 @@
1
- /**
2
- * v9: Proxy代理陷阱混淆
3
- * 技术: 使用Proxy拦截属性访问,隐藏真实逻辑
4
- * 特点: 动态属性解析,静态分析困难
5
- */
6
-
7
- (function() {
8
- var _secret = 'deepspider_test_2024';
9
- var _appid = 'app_12345';
10
-
11
- // 混淆的函数映射
12
- var _funcs = {
13
- 'a': function(s) {
14
- var h = 0;
15
- for (var i = 0; i < s.length; i++) {
16
- h = ((h << 5) - h) + s.charCodeAt(i);
17
- h = h & h;
18
- }
19
- return Math.abs(h).toString(16);
20
- },
21
- 'b': function() { return Math.floor(Date.now() / 1000); },
22
- 'c': function(l) {
23
- var c = 'abcdef0123456789', r = '';
24
- for (var i = 0; i < l; i++) r += c.charAt(Math.floor(Math.random() * c.length));
25
- return r;
26
- }
27
- };
28
-
29
- // Proxy陷阱处理器
30
- var handler = {
31
- get: function(t, p) {
32
- if (p in _funcs) return _funcs[p];
33
- return t[p];
34
- }
35
- };
36
-
37
- var _ = new Proxy({}, handler);
38
- var t = _.b(), n = _.c(8);
39
- var s = _appid + t + n + _secret;
40
- var data = { user: 'test', action: 'login' };
41
-
42
- var result = Object.assign({}, data, {
43
- sign: _.a(s), timestamp: t, nonce: n,
44
- app_id: _appid, encrypted: btoa(JSON.stringify(data))
45
- });
46
-
47
- console.log('Result:', result);
48
- return result;
49
- })();
@@ -1,96 +0,0 @@
1
- /**
2
- * DeepSpider 综合测试 - 测试所有混淆样本
3
- */
4
-
5
- import { ASTAnalyzer } from '../src/analyzer/ASTAnalyzer.js';
6
- import { CallStackAnalyzer } from '../src/analyzer/CallStackAnalyzer.js';
7
- import { EncryptionAnalyzer } from '../src/analyzer/EncryptionAnalyzer.js';
8
- import { Deobfuscator } from '../src/analyzer/Deobfuscator.js';
9
- import fs from 'fs';
10
- import path from 'path';
11
- import { fileURLToPath } from 'url';
12
-
13
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
- const samplesDir = path.join(__dirname, 'samples');
15
-
16
- // 获取所有样本文件
17
- const sampleFiles = fs.readdirSync(samplesDir)
18
- .filter(f => f.endsWith('.js') && f.startsWith('v'))
19
- .sort();
20
-
21
- console.log('=== DeepSpider 综合测试 ===\n');
22
- console.log(`发现 ${sampleFiles.length} 个测试样本\n`);
23
-
24
- // 初始化分析器
25
- const deob = new Deobfuscator();
26
- const astAnalyzer = new ASTAnalyzer();
27
- const encAnalyzer = new EncryptionAnalyzer();
28
-
29
- // 导入沙箱工具
30
- import { sandboxExecute, sandboxReset } from '../src/agent/tools/sandbox.js';
31
-
32
- // 测试结果统计
33
- const results = {
34
- total: sampleFiles.length,
35
- detected: 0,
36
- executed: 0,
37
- failed: []
38
- };
39
-
40
- // 逐个测试样本
41
- for (const file of sampleFiles) {
42
- const filePath = path.join(samplesDir, file);
43
- const code = fs.readFileSync(filePath, 'utf-8');
44
-
45
- console.log(`\n【${file}】`);
46
- console.log('-'.repeat(40));
47
-
48
- // 1. 混淆器识别
49
- const obType = deob.detectObfuscator(code);
50
- const codeType = deob._detectType(code);
51
- console.log(`混淆器: ${obType} | 类型: ${codeType}`);
52
- if (obType !== 'unknown') results.detected++;
53
-
54
- // 2. 函数提取
55
- const funcs = astAnalyzer.extractFunctions(code);
56
- console.log(`函数数: ${funcs.length}`);
57
-
58
- // 3. 加密检测
59
- const crypto = encAnalyzer.analyze(code);
60
- if (crypto.detectedAlgorithms.length > 0) {
61
- console.log(`加密算法: ${crypto.detectedAlgorithms.map(a => a.name).join(', ')}`);
62
- }
63
-
64
- // 4. 沙箱执行
65
- const execResultStr = await sandboxExecute.invoke({ code, timeout: 3000 });
66
- const execResult = JSON.parse(execResultStr);
67
- if (execResult.success) {
68
- console.log(`执行: ✅ 成功`);
69
- results.executed++;
70
- } else {
71
- console.log(`执行: ❌ ${execResult.errorType || 'error'}`);
72
- if (execResult.missingEnv?.length > 0) {
73
- console.log(`缺失: ${execResult.missingEnv.slice(0, 3).join(', ')}...`);
74
- }
75
- results.failed.push({ file, error: execResult.error });
76
- }
77
-
78
- // 重置沙箱
79
- await sandboxReset.invoke({});
80
- }
81
-
82
- // 输出统计
83
- console.log('\n' + '='.repeat(50));
84
- console.log('【测试统计】');
85
- console.log(`总样本: ${results.total}`);
86
- console.log(`识别成功: ${results.detected}/${results.total}`);
87
- console.log(`执行成功: ${results.executed}/${results.total}`);
88
-
89
- if (results.failed.length > 0) {
90
- console.log('\n【失败详情】');
91
- results.failed.forEach(f => {
92
- console.log(` ${f.file}: ${f.error?.slice(0, 50)}...`);
93
- });
94
- }
95
-
96
- console.log('\n=== 测试完成 ===');
@@ -1,55 +0,0 @@
1
- /**
2
- * webcrack 集成测试
3
- */
4
-
5
- import { unpackBundle, analyzeBundle } from '../src/agent/tools/webcrack.js';
6
-
7
- // 模拟一个简单的 Webpack bundle
8
- const sampleBundle = `
9
- (function(modules) {
10
- var installedModules = {};
11
- function __webpack_require__(moduleId) {
12
- if(installedModules[moduleId]) return installedModules[moduleId].exports;
13
- var module = installedModules[moduleId] = { exports: {} };
14
- modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
15
- return module.exports;
16
- }
17
- return __webpack_require__(0);
18
- })([
19
- function(module, exports, __webpack_require__) {
20
- var utils = __webpack_require__(1);
21
- console.log(utils.hello());
22
- },
23
- function(module, exports) {
24
- module.exports = {
25
- hello: function() { return "Hello World"; }
26
- };
27
- }
28
- ]);
29
- `;
30
-
31
- async function test() {
32
- console.log('=== webcrack 集成测试 ===\n');
33
-
34
- // 测试 analyze_bundle
35
- console.log('1. 测试 analyze_bundle...');
36
- const analysisResult = await analyzeBundle.invoke({ code: sampleBundle });
37
- const analysis = JSON.parse(analysisResult);
38
- console.log(' Bundle 类型:', analysis.bundleType);
39
- console.log(' 模块数量:', analysis.moduleCount);
40
- console.log(' 成功:', analysis.success);
41
-
42
- // 测试 unpack_bundle
43
- console.log('\n2. 测试 unpack_bundle...');
44
- const unpackResult = await unpackBundle.invoke({ code: sampleBundle });
45
- const unpacked = JSON.parse(unpackResult);
46
- console.log(' 成功:', unpacked.success);
47
- console.log(' 模块数量:', unpacked.moduleCount);
48
- if (unpacked.code) {
49
- console.log(' 解包后代码长度:', unpacked.code.length);
50
- }
51
-
52
- console.log('\n=== 测试完成 ===');
53
- }
54
-
55
- test().catch(console.error);