@winspan/claude-forge 1.12.0 → 1.12.2

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 (48) 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/claudemd.d.ts +4 -0
  26. package/dist/web/routes/claudemd.d.ts.map +1 -0
  27. package/dist/web/routes/claudemd.js +123 -0
  28. package/dist/web/routes/claudemd.js.map +1 -0
  29. package/dist/web/routes/convention.d.ts +4 -0
  30. package/dist/web/routes/convention.d.ts.map +1 -0
  31. package/dist/web/routes/convention.js +97 -0
  32. package/dist/web/routes/convention.js.map +1 -0
  33. package/dist/web/routes/projects.d.ts.map +1 -1
  34. package/dist/web/routes/projects.js +15 -0
  35. package/dist/web/routes/projects.js.map +1 -1
  36. package/dist/web/server.d.ts.map +1 -1
  37. package/dist/web/server.js +4 -2
  38. package/dist/web/server.js.map +1 -1
  39. package/dist/web-static/assets/index-CoOY33ih.css +2 -0
  40. package/dist/web-static/assets/index-DBHtfeHH.js +62 -0
  41. package/dist/web-static/index.html +2 -2
  42. package/package.json +1 -1
  43. package/dist/web/routes/skills.d.ts +0 -4
  44. package/dist/web/routes/skills.d.ts.map +0 -1
  45. package/dist/web/routes/skills.js +0 -170
  46. package/dist/web/routes/skills.js.map +0 -1
  47. package/dist/web-static/assets/index-DL5CluBr.js +0 -62
  48. 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-DBHtfeHH.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-CoOY33ih.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.2",
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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"}