devassist-agent 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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +467 -0
  3. package/bin/devassist.js +220 -0
  4. package/package.json +44 -0
  5. package/src/ai/adapter.js +464 -0
  6. package/src/ai/providers/claude.js +80 -0
  7. package/src/ai/providers/hunyuan.js +87 -0
  8. package/src/ai/providers/openai.js +74 -0
  9. package/src/ai/providers/qwen.js +81 -0
  10. package/src/cli/commands/ai.js +944 -0
  11. package/src/cli/commands/ask.js +79 -0
  12. package/src/cli/commands/backup.js +30 -0
  13. package/src/cli/commands/check.js +327 -0
  14. package/src/cli/commands/clean.js +130 -0
  15. package/src/cli/commands/comparison-report.js +326 -0
  16. package/src/cli/commands/convention.js +91 -0
  17. package/src/cli/commands/debt.js +49 -0
  18. package/src/cli/commands/deploy.js +88 -0
  19. package/src/cli/commands/diff.js +193 -0
  20. package/src/cli/commands/doctor.js +186 -0
  21. package/src/cli/commands/fix.js +195 -0
  22. package/src/cli/commands/init.js +431 -0
  23. package/src/cli/commands/inject.js +254 -0
  24. package/src/cli/commands/report.js +310 -0
  25. package/src/cli/commands/restore.js +78 -0
  26. package/src/cli/commands/schema.js +93 -0
  27. package/src/cli/commands/watch.js +212 -0
  28. package/src/cli/shared/code-context.js +51 -0
  29. package/src/cli/shared/config-loader.js +89 -0
  30. package/src/cli/shared/file-collector.js +116 -0
  31. package/src/cli/shared/inline-ignore.js +142 -0
  32. package/src/cli/shared/watch-list.js +281 -0
  33. package/src/core/event-bus.js +83 -0
  34. package/src/core/fsm.js +103 -0
  35. package/src/core/logger.js +54 -0
  36. package/src/core/rule-engine.js +117 -0
  37. package/src/index.js +64 -0
  38. package/src/modules/dev-time/arch-risk-assessor.js +250 -0
  39. package/src/modules/dev-time/code-quality-guard.js +1340 -0
  40. package/src/modules/dev-time/convention-store.js +201 -0
  41. package/src/modules/dev-time/impact-analyzer.js +292 -0
  42. package/src/modules/dev-time/pre-deploy-guard.js +284 -0
  43. package/src/modules/dev-time/schema-registry.js +284 -0
  44. package/src/modules/dev-time/tech-debt-tracker.js +225 -0
  45. package/src/modules/dev-time/version-manager.js +280 -0
  46. package/src/modules/runtime/channel-agent.js +404 -0
  47. package/src/modules/runtime/channel-middleware.js +316 -0
  48. package/src/modules/runtime/index.js +64 -0
  49. package/src/modules/runtime/infrastructure-guard.js +582 -0
  50. package/src/modules/runtime/notification-center.js +443 -0
  51. package/src/modules/runtime/schema-gatekeeper.js +664 -0
  52. package/src/modules/runtime/tool-registry.js +329 -0
  53. package/templates/ci/github-actions.yml +60 -0
  54. package/templates/ci/gitlab-ci.yml +30 -0
  55. package/templates/ci/pre-commit-hook.sh +18 -0
  56. package/templates/git-hooks/pre-commit +61 -0
  57. package/tests/run-all.js +434 -0
  58. package/tests/test-layer2.js +461 -0
  59. package/tests/test-new-rules.js +157 -0
@@ -0,0 +1,220 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * DevAssist CLI - entry point
4
+ *
5
+ * Commands:
6
+ * devassist init Initialize project (create .devassist/ config)
7
+ * devassist check Run all dev-time checks
8
+ * devassist deploy --check Pre-deployment validation
9
+ * devassist debt Show tech debt board
10
+ * devassist convention <add|list|remove> Manage conventions
11
+ * devassist schema <import|list> Manage schema registry
12
+ * devassist backup [label] Create incremental backup
13
+ * devassist restore <versionId> Restore from backup (non-destructive)
14
+ * devassist ask <question> Ask AI a question
15
+ * devassist ai --status|--setup|--test AI configuration and testing
16
+ * devassist inject [--format <fmt>] Generate convention file for AI agents
17
+ * devassist doctor Environment diagnostics
18
+ * devassist clean [--days <n>] Clean old reports/backups/history
19
+ * devassist fix [--all|--dry-run] Auto-fix common code issues
20
+ */
21
+
22
+ const path = require('path');
23
+ const fs = require('fs');
24
+
25
+ // Resolve project root: look for .devassist or package.json
26
+ function findProjectRoot() {
27
+ let dir = process.cwd();
28
+ for (let i = 0; i < 10; i++) {
29
+ if (fs.existsSync(path.join(dir, '.devassist')) || fs.existsSync(path.join(dir, 'package.json'))) {
30
+ return dir;
31
+ }
32
+ const parent = path.dirname(dir);
33
+ if (parent === dir) break;
34
+ dir = parent;
35
+ }
36
+ return process.cwd();
37
+ }
38
+
39
+ const args = process.argv.slice(2);
40
+ const command = args[0];
41
+ const projectRoot = findProjectRoot();
42
+
43
+ // Color helpers
44
+ const c = {
45
+ red: s => `\x1b[31m${s}\x1b[0m`,
46
+ green: s => `\x1b[32m${s}\x1b[0m`,
47
+ yellow: s => `\x1b[33m${s}\x1b[0m`,
48
+ blue: s => `\x1b[36m${s}\x1b[0m`,
49
+ cyan: s => `\x1b[36m${s}\x1b[0m`,
50
+ magenta: s => `\x1b[35m${s}\x1b[0m`,
51
+ gray: s => `\x1b[90m${s}\x1b[0m`,
52
+ bold: s => `\x1b[1m${s}\x1b[0m`,
53
+ };
54
+
55
+ const pkg = require('../package.json');
56
+ const VERSION = pkg.version;
57
+
58
+ function printHeader(title) {
59
+ console.log(`\n${c.bold(c.blue('DevAssist'))} ${c.gray('v' + VERSION)} — ${title}\n`);
60
+ }
61
+
62
+ function printFinding(f) {
63
+ const sev = f.severity === 'block' ? c.red('[阻断]') :
64
+ f.severity === 'warn' ? c.yellow('[警告]') :
65
+ c.gray('[提示]');
66
+ console.log(` ${sev} ${f.message}`);
67
+ if (f.file) console.log(` ${c.gray(f.file)}${f.line ? `:${f.line}` : ''}`);
68
+ if (f.suggestion) console.log(` ${c.gray('→ ' + f.suggestion)}`);
69
+
70
+ // N-engine: iterate aiAnalyses array
71
+ if (f.aiAnalyses && f.aiAnalyses.length > 0) {
72
+ const colors = [c.blue, c.magenta, c.green, c.cyan, c.yellow];
73
+ for (let i = 0; i < f.aiAnalyses.length; i++) {
74
+ const ea = f.aiAnalyses[i];
75
+ const colorFn = colors[i % colors.length];
76
+ if (ea.available && ea.analysis) {
77
+ const a = ea.analysis;
78
+ console.log(` ${colorFn(`AI[${ea.engineName}]:`)} ${a.rootCause || a.fix || '(无详情)'}`);
79
+ if (a.confidence !== undefined) console.log(` ${c.gray('置信度:' + (a.confidence * 100).toFixed(0) + '%')}`);
80
+ } else {
81
+ console.log(` ${c.gray(`AI[${ea.engineName}]:不可用`)}`);
82
+ }
83
+ }
84
+ } else if (f.aiAnalysis && !f.aiAnalysisUnavailable) {
85
+ // Backward compat: single engine legacy field
86
+ console.log(` ${c.blue('AI:')} ${f.aiAnalysis.rootCause || f.aiAnalysis.fix || '(无详情)'}`);
87
+ if (f.aiAnalysis.confidence) console.log(` ${c.gray('置信度:' + f.aiAnalysis.confidence)}`);
88
+ }
89
+ if (f.aiAnalysisUnavailable && (!f.aiAnalyses || f.aiAnalyses.length === 0)) {
90
+ console.log(` ${c.gray('(AI 分析不可用)')}`);
91
+ }
92
+ console.log();
93
+ }
94
+
95
+ function printStats(stats) {
96
+ console.log(c.gray(' ────────────────────────────────────────'));
97
+ console.log(` 规则: ${stats.passed} 通过,${stats.failed} 触发`);
98
+ console.log(` 发现: ${c.red(stats.blocks + ' 阻断')},${c.yellow(stats.warnings + ' 警告')},${stats.infos + ' 提示'}`);
99
+ console.log(c.gray(' ────────────────────────────────────────\n'));
100
+ }
101
+
102
+ // Resolve paths relative to this file
103
+ const cmdDir = path.join(__dirname, '..', 'src', 'cli', 'commands');
104
+
105
+ // Route to command handler
106
+ async function main() {
107
+ try {
108
+ switch (command) {
109
+ case 'init':
110
+ return require(path.join(cmdDir, 'init'))(projectRoot, args.slice(1), { printHeader, c });
111
+ case 'check':
112
+ return require(path.join(cmdDir, 'check'))(projectRoot, args.slice(1), { printHeader, printFinding, printStats, c });
113
+ case 'deploy':
114
+ return require(path.join(cmdDir, 'deploy'))(projectRoot, args.slice(1), { printHeader, printFinding, c });
115
+ case 'debt':
116
+ return require(path.join(cmdDir, 'debt'))(projectRoot, args.slice(1), { printHeader, c });
117
+ case 'convention':
118
+ return require(path.join(cmdDir, 'convention'))(projectRoot, args.slice(1), { printHeader, c });
119
+ case 'schema':
120
+ return require(path.join(cmdDir, 'schema'))(projectRoot, args.slice(1), { printHeader, c });
121
+ case 'backup':
122
+ return require(path.join(cmdDir, 'backup'))(projectRoot, args.slice(1), { printHeader, c });
123
+ case 'restore':
124
+ return require(path.join(cmdDir, 'restore'))(projectRoot, args.slice(1), { printHeader, printFinding, c });
125
+ case 'ask':
126
+ return require(path.join(cmdDir, 'ask'))(projectRoot, args.slice(1), { printHeader, c });
127
+ case 'ai':
128
+ return require(path.join(cmdDir, 'ai'))(projectRoot, args.slice(1), { printHeader, c });
129
+ case 'inject':
130
+ return require(path.join(cmdDir, 'inject'))(projectRoot, args.slice(1), { printHeader, c });
131
+ case 'doctor':
132
+ return require(path.join(cmdDir, 'doctor'))(projectRoot, args.slice(1), { printHeader, c });
133
+ case 'clean':
134
+ return require(path.join(cmdDir, 'clean'))(projectRoot, args.slice(1), { printHeader, c });
135
+ case 'fix':
136
+ return require(path.join(cmdDir, 'fix'))(projectRoot, args.slice(1), { printHeader, c });
137
+ case 'watch':
138
+ return require(path.join(cmdDir, 'watch'))(projectRoot, args.slice(1), { printHeader, printFinding, c });
139
+ case 'report':
140
+ return require(path.join(cmdDir, 'report'))(projectRoot, args.slice(1), { printHeader, printFinding, c });
141
+ case 'diff':
142
+ return require(path.join(cmdDir, 'diff'))(projectRoot, args.slice(1), { printHeader, printFinding, printStats, c });
143
+ case 'version':
144
+ case '--version':
145
+ case '-v':
146
+ console.log('DevAssist v' + VERSION);
147
+ return;
148
+ case 'help':
149
+ case '--help':
150
+ case '-h':
151
+ default:
152
+ printHelp();
153
+ }
154
+ } catch (err) {
155
+ console.error(`\n${c.red('错误:')} ${err.message}\n`);
156
+ if (process.env.DEVASSIST_DEBUG) {
157
+ console.error(err.stack);
158
+ }
159
+ process.exit(1);
160
+ }
161
+ }
162
+
163
+ function printHelp() {
164
+ printHeader('开发守护 CLI');
165
+ console.log(`${c.bold('用法:')} devassist <命令> [选项]\n`);
166
+ console.log(`${c.bold('命令:')}`);
167
+ console.log(` ${c.green('init')} 初始化项目——创建 .devassist/ 配置与基础代码`);
168
+ console.log(` ${c.green('check')} 运行全部开发时检查(代码质量 + 约定 + 模式 + 架构)`);
169
+ console.log(` ${c.green('watch')} 实时监控文件变更并运行检查`);
170
+ console.log(` ${c.green('diff')} ${c.gray('--staged|--base <分支>')} 仅检查变更文件(CI 模式)`);
171
+ console.log(` ${c.green('report')} ${c.gray('[--open]')} 生成 HTML 检查报告`);
172
+ console.log(` ${c.green('deploy')} ${c.gray('--check')} 部署前验证(端口 + 路由 + MIME + 清单)`);
173
+ console.log(` ${c.green('debt')} ${c.gray('--scan')} 查看技术债务看板(按优先级排序)`);
174
+ console.log(` ${c.green('convention')} ${c.gray('add|list|remove')} 管理项目约定`);
175
+ console.log(` ${c.green('schema')} ${c.gray('import|list')} 导入数据库 DDL 模式 / 列出已注册模式`);
176
+ console.log(` ${c.green('backup')} ${c.gray('[标签]')} 创建增量备份`);
177
+ console.log(` ${c.green('restore')} ${c.gray('<版本ID>')} 从备份恢复(非破坏性)`);
178
+ console.log(` ${c.green('ask')} ${c.gray('<问题>')} 向 AI 提问关于代码库的问题`);
179
+ console.log(` ${c.green('ai')} ${c.gray('--status|--setup|--add-engine|--compare|--watch-list')} AI 配置/多引擎/对比/待观察`);
180
+ console.log(` ${c.green('inject')} ${c.gray('[--format <fmt>]')} 生成约定文件供 AI Agent 读取`);
181
+ console.log(` ${c.green('doctor')} 环境诊断——检查 Node/Git/配置完整性`);
182
+ console.log(` ${c.green('clean')} ${c.gray('[--days <n>]')} 清理旧报告/备份/历史`);
183
+ console.log(` ${c.green('fix')} ${c.gray('[--all|--dry-run]')} 自动修复常见代码问题`);
184
+ console.log(`\n${c.bold('选项:')}`);
185
+ console.log(` ${c.gray('--port <n>')} 指定部署检查的端口`);
186
+ console.log(` ${c.gray('--ai')} 启用 AI 深度分析(需配置)`);
187
+ console.log(` ${c.gray('--compare')} 多引擎对比分析(所有引擎并行)`);
188
+ console.log(` ${c.gray('--json')} 输出 JSON 格式(用于 CI 集成)`);
189
+ console.log(` ${c.gray('--fail-on <级别>')} 在以下级别非零退出:block(默认)或 warn`);
190
+ console.log(` ${c.gray('--base-code')} 安装运行时基础设施(Layer 2)`);
191
+ console.log(` ${c.gray('--force')} 覆盖已有配置`);
192
+ console.log(` ${c.gray('-v, --version')} 显示版本`);
193
+ console.log(` ${c.gray('-h, --help')} 显示帮助\n`);
194
+ console.log(`${c.bold('示例:')}`);
195
+ console.log(` ${c.gray('$')} devassist init`);
196
+ console.log(` ${c.gray('$')} devassist check --ai`);
197
+ console.log(` ${c.gray('$')} devassist watch # 开发时实时监控`);
198
+ console.log(` ${c.gray('$')} devassist diff --staged # 提交前检查暂存文件`);
199
+ console.log(` ${c.gray('$')} devassist report --open # 生成并查看 HTML 报告`);
200
+ console.log(` ${c.gray('$')} devassist convention add --id naming-list --rule "使用 data.list 而非 data.items" --severity block`);
201
+ console.log(` ${c.gray('$')} devassist deploy --check --port 8080`);
202
+ console.log(` ${c.gray('$')} devassist schema import schema.sql`);
203
+ console.log(` ${c.gray('$')} devassist ask "为什么 API 返回 data.items 而不是 data.list?"`);
204
+ console.log(` ${c.gray('$')} devassist ai --setup --provider qwen --key sk-xxxx`);
205
+ console.log(` ${c.gray('$')} devassist ai --add-engine --provider hunyuan --key sk-xxxx`);
206
+ console.log(` ${c.gray('$')} devassist ai --add-engine --provider openai --key sk-xxxx # 三引擎`);
207
+ console.log(` ${c.gray('$')} devassist ai --list-engines # 查看所有引擎`);
208
+ console.log(` ${c.gray('$')} devassist ai --compare # 多引擎对比分析`);
209
+ console.log(` ${c.gray('$')} devassist check --ai --compare # 检查 + 多引擎对比`);
210
+ console.log(` ${c.gray('$')} devassist ai --watch-list # 查看待观察列表`);
211
+ console.log(` ${c.gray('$')} devassist ai --watch-list --resolve 0 # 标记为已修复`);
212
+ console.log(` ${c.gray('$')} devassist ai --watch-list --dismiss 0 # 标记为无问题`);
213
+ console.log(` ${c.gray('$')} devassist ai --test`);
214
+ console.log(` ${c.gray('$')} devassist inject --format cursor # 生成 .cursorrules 约定文件`);
215
+ console.log(` ${c.gray('$')} devassist doctor # 环境诊断`);
216
+ console.log(` ${c.gray('$')} devassist clean --days 30 # 清理30天前的旧文件`);
217
+ console.log(` ${c.gray('$')} devassist fix --all --dry-run # 预览自动修复\n`);
218
+ }
219
+
220
+ main();
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "devassist-agent",
3
+ "version": "1.0.0",
4
+ "description": "AI Agent 开发质量守护工具 — 30+规则检测代码缺陷/安全漏洞/性能反模式,多引擎AI根因分析,零外部依赖",
5
+ "main": "src/index.js",
6
+ "bin": {
7
+ "devassist": "bin/devassist.js"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "src/",
12
+ "templates/",
13
+ "tests/",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "scripts": {
18
+ "test": "node tests/run-all.js",
19
+ "test:layer2": "node tests/test-layer2.js",
20
+ "devassist": "node bin/devassist.js"
21
+ },
22
+ "keywords": [
23
+ "ai-agent",
24
+ "code-quality",
25
+ "code-review",
26
+ "lint",
27
+ "security",
28
+ "static-analysis",
29
+ "guardrails",
30
+ "convention",
31
+ "tech-debt",
32
+ "cli",
33
+ "zero-dependency",
34
+ "qwen",
35
+ "hunyuan",
36
+ "codeguard"
37
+ ],
38
+ "author": "",
39
+ "license": "MIT",
40
+ "engines": {
41
+ "node": ">=18.0.0"
42
+ },
43
+ "dependencies": {}
44
+ }