@winspan/claude-forge 1.12.0 → 1.12.1

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 (40) hide show
  1. package/dist/claudemd/writer.d.ts +8 -1
  2. package/dist/claudemd/writer.d.ts.map +1 -1
  3. package/dist/claudemd/writer.js +44 -6
  4. package/dist/claudemd/writer.js.map +1 -1
  5. package/dist/cli/commands/project.d.ts +3 -0
  6. package/dist/cli/commands/project.d.ts.map +1 -0
  7. package/dist/cli/commands/project.js +73 -0
  8. package/dist/cli/commands/project.js.map +1 -0
  9. package/dist/cli/index.js +2 -0
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/cli/tui.d.ts.map +1 -1
  12. package/dist/cli/tui.js +23 -5
  13. package/dist/cli/tui.js.map +1 -1
  14. package/dist/resume/index.d.ts +1 -1
  15. package/dist/resume/index.d.ts.map +1 -1
  16. package/dist/resume/index.js +18 -37
  17. package/dist/resume/index.js.map +1 -1
  18. package/dist/storage/repositories/maintenance-repository.d.ts +9 -0
  19. package/dist/storage/repositories/maintenance-repository.d.ts.map +1 -1
  20. package/dist/storage/repositories/maintenance-repository.js +42 -0
  21. package/dist/storage/repositories/maintenance-repository.js.map +1 -1
  22. package/dist/storage/sqlite.d.ts.map +1 -1
  23. package/dist/storage/sqlite.js +13 -1
  24. package/dist/storage/sqlite.js.map +1 -1
  25. package/dist/web/routes/projects.d.ts.map +1 -1
  26. package/dist/web/routes/projects.js +15 -0
  27. package/dist/web/routes/projects.js.map +1 -1
  28. package/dist/web/server.d.ts.map +1 -1
  29. package/dist/web/server.js +0 -2
  30. package/dist/web/server.js.map +1 -1
  31. package/dist/web-static/assets/index-CJ2_xxI9.css +2 -0
  32. package/dist/web-static/assets/index-Cn8F6b1v.js +62 -0
  33. package/dist/web-static/index.html +2 -2
  34. package/package.json +1 -1
  35. package/dist/web/routes/skills.d.ts +0 -4
  36. package/dist/web/routes/skills.d.ts.map +0 -1
  37. package/dist/web/routes/skills.js +0 -170
  38. package/dist/web/routes/skills.js.map +0 -1
  39. package/dist/web-static/assets/index-DL5CluBr.js +0 -62
  40. package/dist/web-static/assets/index-vS8PPJOl.css +0 -2
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Claude Forge - 管理后台</title>
7
- <script type="module" crossorigin src="/assets/index-DL5CluBr.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-vS8PPJOl.css">
7
+ <script type="module" crossorigin src="/assets/index-Cn8F6b1v.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-CJ2_xxI9.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@winspan/claude-forge",
3
- "version": "1.12.0",
3
+ "version": "1.12.1",
4
4
  "description": "SDLC intelligent orchestration engine for Claude Code",
5
5
  "main": "dist/cli/index.js",
6
6
  "type": "module",
@@ -1,4 +0,0 @@
1
- import type { Express } from 'express';
2
- import type { SQLiteStorage } from '../../storage/sqlite.js';
3
- export declare function registerSkillRoutes(app: Express, storage: SQLiteStorage): void;
4
- //# sourceMappingURL=skills.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/web/routes/skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAoL9E"}
@@ -1,170 +0,0 @@
1
- import { SkillRegistry } from '../../skill-registry/registry.js';
2
- import { OrchestrationConfigManager } from '../../skill-registry/orchestration-config.js';
3
- import fs from 'fs';
4
- export function registerSkillRoutes(app, storage) {
5
- const db = storage.getDatabase();
6
- const registry = new SkillRegistry();
7
- const orchestrationConfig = new OrchestrationConfigManager();
8
- // 获取技能列表
9
- app.get('/api/skills', (req, res) => {
10
- try {
11
- const { source, sort = 'usage' } = req.query;
12
- let skills = registry.getAll();
13
- // 按来源过滤
14
- if (source && source !== 'all') {
15
- skills = skills.filter(s => s.source === source);
16
- }
17
- // 排序
18
- if (sort === 'usage') {
19
- skills.sort((a, b) => b.stats.callCount - a.stats.callCount);
20
- }
21
- else if (sort === 'rating') {
22
- const getRating = (s) => {
23
- const total = s.stats.userFeedback.positive + s.stats.userFeedback.negative;
24
- return total > 0 ? s.stats.userFeedback.positive / total : 0;
25
- };
26
- skills.sort((a, b) => getRating(b) - getRating(a));
27
- }
28
- else if (sort === 'name') {
29
- skills.sort((a, b) => a.name.localeCompare(b.name));
30
- }
31
- // 统计信息
32
- const stats = {
33
- total: skills.length,
34
- bySource: {
35
- official: skills.filter(s => s.source === 'official').length,
36
- local: skills.filter(s => s.source === 'local').length,
37
- remote: skills.filter(s => s.source === 'remote').length,
38
- generated: skills.filter(s => s.source === 'generated').length,
39
- user: skills.filter(s => s.source === 'user').length,
40
- },
41
- totalCalls: skills.reduce((sum, s) => sum + s.stats.callCount, 0),
42
- avgSuccessRate: skills.length > 0
43
- ? skills.reduce((sum, s) => sum + s.stats.successRate, 0) / skills.length
44
- : 0,
45
- };
46
- res.json({
47
- skills,
48
- stats,
49
- });
50
- }
51
- catch (err) {
52
- res.status(500).json({ error: String(err) });
53
- }
54
- });
55
- // 获取技能详情
56
- app.get('/api/skills/:name', (req, res) => {
57
- try {
58
- const name = Array.isArray(req.params.name) ? req.params.name[0] : req.params.name;
59
- const skill = registry.get(name);
60
- if (!skill) {
61
- return res.status(404).json({ error: '技能不存在' });
62
- }
63
- // 读取 SKILL.md 内容
64
- let content = '';
65
- try {
66
- content = fs.readFileSync(skill.path, 'utf-8');
67
- }
68
- catch (err) {
69
- content = '无法读取技能文件';
70
- }
71
- // 获取编排配置
72
- const config = orchestrationConfig.load();
73
- const mapping = config.mappings.find(m => m.skill === name);
74
- // 获取执行历史(最近 50 条)
75
- const executions = db.prepare(`
76
- SELECT * FROM pattern_executions
77
- WHERE pattern_id = ?
78
- ORDER BY created_at DESC
79
- LIMIT 50
80
- `).all(name);
81
- res.json({
82
- skill,
83
- content,
84
- orchestration: mapping || null,
85
- executions,
86
- });
87
- }
88
- catch (err) {
89
- res.status(500).json({ error: String(err) });
90
- }
91
- });
92
- // 获取技能使用统计
93
- app.get('/api/skills/:name/stats', (req, res) => {
94
- try {
95
- const name = Array.isArray(req.params.name) ? req.params.name[0] : req.params.name;
96
- // 按日期统计调用次数
97
- const dailyStats = db.prepare(`
98
- SELECT
99
- DATE(created_at) as date,
100
- COUNT(*) as count,
101
- SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as success_count
102
- FROM pattern_executions
103
- WHERE pattern_id = ?
104
- GROUP BY DATE(created_at)
105
- ORDER BY date DESC
106
- LIMIT 30
107
- `).all(name);
108
- // 按项目统计
109
- const projectStats = db.prepare(`
110
- SELECT
111
- project_path,
112
- COUNT(*) as count,
113
- AVG(duration_ms) as avg_duration
114
- FROM pattern_executions
115
- WHERE pattern_id = ?
116
- GROUP BY project_path
117
- ORDER BY count DESC
118
- LIMIT 10
119
- `).all(name);
120
- res.json({
121
- daily: dailyStats,
122
- byProject: projectStats,
123
- });
124
- }
125
- catch (err) {
126
- res.status(500).json({ error: String(err) });
127
- }
128
- });
129
- // 获取编排配置列表
130
- app.get('/api/skills/orchestration/mappings', (req, res) => {
131
- try {
132
- const config = orchestrationConfig.load();
133
- res.json(config.mappings);
134
- }
135
- catch (err) {
136
- res.status(500).json({ error: String(err) });
137
- }
138
- });
139
- // 更新技能编排关键词
140
- app.put('/api/skills/:name/orchestration', (req, res) => {
141
- try {
142
- const name = Array.isArray(req.params.name) ? req.params.name[0] : req.params.name;
143
- const { keywords } = req.body;
144
- if (!Array.isArray(keywords)) {
145
- return res.status(400).json({ error: 'keywords 必须是数组' });
146
- }
147
- orchestrationConfig.upsert({
148
- skill: name,
149
- keywords,
150
- });
151
- res.json({ success: true });
152
- }
153
- catch (err) {
154
- res.status(500).json({ error: String(err) });
155
- }
156
- });
157
- // 记录技能反馈
158
- app.post('/api/skills/:name/feedback', (req, res) => {
159
- try {
160
- const name = Array.isArray(req.params.name) ? req.params.name[0] : req.params.name;
161
- const { isPositive } = req.body;
162
- registry.recordFeedback(name, isPositive);
163
- res.json({ success: true });
164
- }
165
- catch (err) {
166
- res.status(500).json({ error: String(err) });
167
- }
168
- });
169
- }
170
- //# sourceMappingURL=skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/web/routes/skills.ts"],"names":[],"mappings":"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"}